From 4acaa9d9ba0eeb7fa599ba5042f369d3494817e0 Mon Sep 17 00:00:00 2001 From: Patrascu Vlad Date: Thu, 25 May 2023 10:25:17 +0300 Subject: [PATCH] Example | Remove vendor bundle for ruby --- .../vendor/bundle/ruby/2.7.0/bin/fuzzy_match | 27 - .../vendor/bundle/ruby/2.7.0/bin/httpclient | 27 - example/vendor/bundle/ruby/2.7.0/bin/pod | 27 - .../vendor/bundle/ruby/2.7.0/bin/sandbox-pod | 27 - .../vendor/bundle/ruby/2.7.0/bin/xcodeproj | 27 - .../ruby/2.7.0/cache/CFPropertyList-3.0.6.gem | Bin 18432 -> 0 bytes .../2.7.0/cache/activesupport-7.0.4.3.gem | Bin 224256 -> 0 bytes .../ruby/2.7.0/cache/addressable-2.8.4.gem | Bin 105984 -> 0 bytes .../ruby/2.7.0/cache/algoliasearch-1.27.5.gem | Bin 224768 -> 0 bytes .../bundle/ruby/2.7.0/cache/atomos-0.1.3.gem | Bin 10240 -> 0 bytes .../bundle/ruby/2.7.0/cache/claide-1.1.0.gem | Bin 28160 -> 0 bytes .../ruby/2.7.0/cache/cocoapods-1.12.1.gem | Bin 296448 -> 0 bytes .../2.7.0/cache/cocoapods-core-1.12.1.gem | Bin 103936 -> 0 bytes .../cache/cocoapods-deintegrate-1.0.5.gem | Bin 7680 -> 0 bytes .../cache/cocoapods-downloader-1.6.3.gem | Bin 13312 -> 0 bytes .../2.7.0/cache/cocoapods-plugins-1.0.0.gem | Bin 23552 -> 0 bytes .../2.7.0/cache/cocoapods-search-1.0.1.gem | Bin 15872 -> 0 bytes .../2.7.0/cache/cocoapods-trunk-1.6.0.gem | Bin 24576 -> 0 bytes .../ruby/2.7.0/cache/cocoapods-try-1.2.0.gem | Bin 16896 -> 0 bytes .../ruby/2.7.0/cache/colored2-3.1.2.gem | Bin 10240 -> 0 bytes .../2.7.0/cache/concurrent-ruby-1.2.2.gem | Bin 357888 -> 0 bytes .../bundle/ruby/2.7.0/cache/escape-0.0.4.gem | Bin 9730 -> 0 bytes .../bundle/ruby/2.7.0/cache/ethon-0.16.0.gem | Bin 60416 -> 0 bytes .../bundle/ruby/2.7.0/cache/ffi-1.15.5.gem | Bin 909824 -> 0 bytes .../ruby/2.7.0/cache/fourflusher-2.3.1.gem | Bin 12288 -> 0 bytes .../ruby/2.7.0/cache/fuzzy_match-2.0.4.gem | Bin 112640 -> 0 bytes .../ruby/2.7.0/cache/gh_inspector-1.1.3.gem | Bin 12800 -> 0 bytes .../ruby/2.7.0/cache/httpclient-2.8.3.gem | Bin 385536 -> 0 bytes .../bundle/ruby/2.7.0/cache/i18n-1.13.0.gem | Bin 45568 -> 0 bytes .../bundle/ruby/2.7.0/cache/json-2.6.3.gem | Bin 67072 -> 0 bytes .../ruby/2.7.0/cache/minitest-5.18.0.gem | Bin 95232 -> 0 bytes .../ruby/2.7.0/cache/molinillo-0.8.0.gem | Bin 29696 -> 0 bytes .../bundle/ruby/2.7.0/cache/nanaimo-0.3.0.gem | Bin 19456 -> 0 bytes .../bundle/ruby/2.7.0/cache/nap-1.1.0.gem | Bin 156160 -> 0 bytes .../bundle/ruby/2.7.0/cache/netrc-0.11.0.gem | Bin 10752 -> 0 bytes .../ruby/2.7.0/cache/public_suffix-4.0.7.gem | Bin 113664 -> 0 bytes .../bundle/ruby/2.7.0/cache/rexml-3.2.5.gem | Bin 93184 -> 0 bytes .../ruby/2.7.0/cache/ruby-macho-2.5.1.gem | Bin 34304 -> 0 bytes .../ruby/2.7.0/cache/typhoeus-1.4.0.gem | Bin 56832 -> 0 bytes .../bundle/ruby/2.7.0/cache/tzinfo-2.0.6.gem | Bin 79360 -> 0 bytes .../ruby/2.7.0/cache/xcodeproj-1.22.0.gem | Bin 82432 -> 0 bytes .../2.7.0/ffi-1.15.5/ffi_c.bundle | Bin 211065 -> 0 bytes .../2.7.0/ffi-1.15.5/gem.build_complete | 0 .../2.7.0/ffi-1.15.5/gem_make.out | 43 - .../arm64-darwin-22/2.7.0/ffi-1.15.5/mkmf.log | 230 - .../2.7.0/json-2.6.3/gem.build_complete | 0 .../2.7.0/json-2.6.3/gem_make.out | 13 - .../json-2.6.3/json/ext/generator.bundle | Bin 63885 -> 0 bytes .../2.7.0/json-2.6.3/json/ext/parser.bundle | Bin 41338 -> 0 bytes .../arm64-darwin-22/2.7.0/json-2.6.3/mkmf.log | 118 - .../2.7.0/gems/CFPropertyList-3.0.6/LICENSE | 19 - .../2.7.0/gems/CFPropertyList-3.0.6/README.md | 79 - .../gems/CFPropertyList-3.0.6/README.rdoc | 43 - .../2.7.0/gems/CFPropertyList-3.0.6/THANKS | 7 - .../gems/activesupport-7.0.4.3/CHANGELOG.md | 474 - .../gems/activesupport-7.0.4.3/MIT-LICENSE | 20 - .../gems/activesupport-7.0.4.3/README.rdoc | 40 - .../2.7.0/gems/addressable-2.8.4/CHANGELOG.md | 282 - .../ruby/2.7.0/gems/addressable-2.8.4/Gemfile | 30 - .../2.7.0/gems/addressable-2.8.4/LICENSE.txt | 202 - .../2.7.0/gems/addressable-2.8.4/README.md | 121 - .../2.7.0/gems/addressable-2.8.4/Rakefile | 35 - .../addressable-2.8.4/addressable.gemspec | 28 - .../gems/addressable-2.8.4/data/unicode.data | Bin 115740 -> 0 bytes .../spec/addressable/idna_spec.rb | 302 - .../spec/addressable/net_http_compat_spec.rb | 29 - .../spec/addressable/security_spec.rb | 58 - .../spec/addressable/template_spec.rb | 1264 -- .../spec/addressable/uri_spec.rb | 6801 -------- .../addressable-2.8.4/spec/spec_helper.rb | 33 - .../gems/addressable-2.8.4/tasks/clobber.rake | 4 - .../gems/addressable-2.8.4/tasks/gem.rake | 95 - .../gems/addressable-2.8.4/tasks/git.rake | 47 - .../gems/addressable-2.8.4/tasks/metrics.rake | 24 - .../gems/addressable-2.8.4/tasks/profile.rake | 72 - .../gems/addressable-2.8.4/tasks/rspec.rake | 23 - .../gems/addressable-2.8.4/tasks/yard.rake | 29 - .../2.7.0/gems/algoliasearch-1.27.5/.rspec | 2 - .../gems/algoliasearch-1.27.5/.travis.yml | 33 - .../gems/algoliasearch-1.27.5/CHANGELOG.md | 454 - .../2.7.0/gems/algoliasearch-1.27.5/Gemfile | 28 - .../gems/algoliasearch-1.27.5/Gemfile.lock | 99 - .../2.7.0/gems/algoliasearch-1.27.5/LICENSE | 21 - .../2.7.0/gems/algoliasearch-1.27.5/README.md | 61 - .../2.7.0/gems/algoliasearch-1.27.5/Rakefile | 111 - .../algoliasearch.gemspec | 86 - .../gems/algoliasearch-1.27.5/contacts.json | 7504 --------- .../resources/ca-bundle.crt | 3908 ----- .../spec/account_client_spec.rb | 89 - .../algoliasearch-1.27.5/spec/client_spec.rb | 1426 -- .../algoliasearch-1.27.5/spec/mock_spec.rb | 31 - .../algoliasearch-1.27.5/spec/spec_helper.rb | 69 - .../algoliasearch-1.27.5/spec/stub_spec.rb | 51 - .../ruby/2.7.0/gems/atomos-0.1.3/.gitignore | 11 - .../ruby/2.7.0/gems/atomos-0.1.3/.rspec | 3 - .../ruby/2.7.0/gems/atomos-0.1.3/.rubocop.yml | 2 - .../2.7.0/gems/atomos-0.1.3/.rubocop_todo.yml | 32 - .../ruby/2.7.0/gems/atomos-0.1.3/.travis.yml | 5 - .../gems/atomos-0.1.3/CODE_OF_CONDUCT.md | 74 - .../ruby/2.7.0/gems/atomos-0.1.3/Gemfile | 8 - .../ruby/2.7.0/gems/atomos-0.1.3/Gemfile.lock | 51 - .../ruby/2.7.0/gems/atomos-0.1.3/LICENSE.txt | 21 - .../ruby/2.7.0/gems/atomos-0.1.3/README.md | 43 - .../ruby/2.7.0/gems/atomos-0.1.3/Rakefile | 11 - .../ruby/2.7.0/gems/atomos-0.1.3/VERSION | 1 - .../2.7.0/gems/atomos-0.1.3/atomos.gemspec | 26 - .../ruby/2.7.0/gems/atomos-0.1.3/bin/console | 15 - .../ruby/2.7.0/gems/atomos-0.1.3/bin/rake | 29 - .../ruby/2.7.0/gems/atomos-0.1.3/bin/rspec | 29 - .../ruby/2.7.0/gems/atomos-0.1.3/bin/rubocop | 29 - .../ruby/2.7.0/gems/atomos-0.1.3/bin/setup | 8 - .../claide-1.1.0/.github/workflows/ci.yml | 45 - .../ruby/2.7.0/gems/claide-1.1.0/.gitignore | 17 - .../bundle/ruby/2.7.0/gems/claide-1.1.0/.kick | 30 - .../ruby/2.7.0/gems/claide-1.1.0/.rubocop.yml | 6 - .../gems/claide-1.1.0/.rubocop_cocoapods.yml | 151 - .../2.7.0/gems/claide-1.1.0/.rubocop_todo.yml | 70 - .../ruby/2.7.0/gems/claide-1.1.0/.yardopts | 1 - .../ruby/2.7.0/gems/claide-1.1.0/CHANGELOG.md | 265 - .../ruby/2.7.0/gems/claide-1.1.0/Gemfile | 22 - .../ruby/2.7.0/gems/claide-1.1.0/Gemfile.lock | 79 - .../ruby/2.7.0/gems/claide-1.1.0/LICENSE | 21 - .../ruby/2.7.0/gems/claide-1.1.0/README.md | 115 - .../ruby/2.7.0/gems/claide-1.1.0/Rakefile | 57 - .../2.7.0/gems/claide-1.1.0/claide.gemspec | 23 - .../2.7.0/gems/cocoapods-1.12.1/CHANGELOG.md | 7920 --------- .../ruby/2.7.0/gems/cocoapods-1.12.1/LICENSE | 33 - .../2.7.0/gems/cocoapods-1.12.1/README.md | 81 - .../ruby/2.7.0/gems/cocoapods-1.12.1/bin/pod | 56 - .../gems/cocoapods-1.12.1/bin/sandbox-pod | 168 - .../2.7.0/gems/cocoapods-core-1.12.1/LICENSE | 20 - .../gems/cocoapods-core-1.12.1/README.md | 42 - .../gems/cocoapods-deintegrate-1.0.5/LICENSE | 23 - .../cocoapods-deintegrate-1.0.5/README.md | 56 - .../gems/cocoapods-downloader-1.6.3/LICENSE | 21 - .../README.markdown | 81 - .../gems/cocoapods-plugins-1.0.0/.gitignore | 40 - .../gems/cocoapods-plugins-1.0.0/.rubocop.yml | 4 - .../.rubocop_cocoapods.yml | 116 - .../gems/cocoapods-plugins-1.0.0/.travis.yml | 24 - .../gems/cocoapods-plugins-1.0.0/CHANGELOG.md | 102 - .../gems/cocoapods-plugins-1.0.0/Gemfile | 18 - .../gems/cocoapods-plugins-1.0.0/Gemfile.lock | 134 - .../gems/cocoapods-plugins-1.0.0/LICENSE | 21 - .../gems/cocoapods-plugins-1.0.0/README.md | 44 - .../gems/cocoapods-plugins-1.0.0/Rakefile | 88 - .../cocoapods-plugins.gemspec | 31 - .../gems/cocoapods-plugins-1.0.0/plugins.json | 245 - .../spec/command/gem_helper_spec.rb | 40 - .../spec/command/gem_index_cache_spec.rb | 37 - .../spec/command/plugins/create_spec.rb | 89 - .../spec/command/plugins/installed_spec.rb | 140 - .../spec/command/plugins/list_spec.rb | 29 - .../spec/command/plugins/publish_spec.rb | 132 - .../spec/command/plugins/search_spec.rb | 55 - .../spec/command/plugins_helper_spec.rb | 33 - .../spec/command/plugins_spec.rb | 20 - .../spec/fixtures/cocoapods-foo1.gemspec | 10 - .../spec/fixtures/cocoapods-foo2.gemspec | 9 - .../spec/fixtures/plugins.json | 22 - .../spec/fixtures/unprefixed.gemspec | 10 - .../spec/spec_helper.rb | 122 - .../.github/workflows/Specs.yml | 42 - .../gems/cocoapods-search-1.0.1/.gitignore | 39 - .../gems/cocoapods-search-1.0.1/CHANGELOG.md | 83 - .../2.7.0/gems/cocoapods-search-1.0.1/Gemfile | 13 - .../gems/cocoapods-search-1.0.1/Gemfile.lock | 126 - .../gems/cocoapods-search-1.0.1/LICENSE.txt | 21 - .../gems/cocoapods-search-1.0.1/README.md | 106 - .../gems/cocoapods-search-1.0.1/Rakefile | 13 - .../cocoapods-search.gemspec | 25 - .../spec/command/search_spec.rb | 148 - .../test_repo/BananaLib/1.0/BananaLib.podspec | 21 - .../test_repo/JSONKit/1.4/JSONKit.podspec | 11 - .../JSONKit/999.999.999/JSONKit.podspec | 12 - .../0.1.0/OrangeFramework.podspec | 16 - .../1.0/Pod+With+Plus+Signs.podspec | 17 - .../test_repo/Realm/0.94/Realm.podspec | 18 - .../test_repo/monkey/1.0.2/monkey.podspec | 11 - .../spec/spec_helper.rb | 85 - .../spec/spec_helper/command.rb | 27 - .../spec/spec_helper/fixture.rb | 32 - .../spec/spec_helper/pre_flight.rb | 36 - .../spec/spec_helper/temporary_repos.rb | 90 - .../spec/spec_helper/user_interface.rb | 36 - .../.github/workflows/ci.yml | 64 - .../gems/cocoapods-trunk-1.6.0/.gitignore | 17 - .../2.7.0/gems/cocoapods-trunk-1.6.0/.kick | 29 - .../gems/cocoapods-trunk-1.6.0/.rubocop.yml | 3 - .../.rubocop_cocoapods.yml | 138 - .../cocoapods-trunk-1.6.0/.rubocop_todo.yml | 33 - .../gems/cocoapods-trunk-1.6.0/CHANGELOG.md | 378 - .../2.7.0/gems/cocoapods-trunk-1.6.0/Gemfile | 25 - .../gems/cocoapods-trunk-1.6.0/Gemfile.lock | 190 - .../gems/cocoapods-trunk-1.6.0/LICENSE.txt | 22 - .../gems/cocoapods-trunk-1.6.0/README.md | 35 - .../2.7.0/gems/cocoapods-trunk-1.6.0/Rakefile | 68 - .../cocoapods-trunk.gemspec | 26 - .../spec/command/trunk/addowner_spec.rb | 52 - .../spec/command/trunk/delete_spec.rb | 69 - .../spec/command/trunk/deprecate_spec.rb | 58 - .../spec/command/trunk/info_spec.rb | 36 - .../spec/command/trunk/me_spec.rb | 17 - .../spec/command/trunk/push_spec.rb | 332 - .../spec/command/trunk/register_spec.rb | 31 - .../spec/command/trunk/remove_owner_spec.rb | 51 - .../spec/command/trunk_spec.rb | 23 - .../spec/fixtures/BananaLib.podspec | 25 - .../cocoapods-trunk-1.6.0/spec/spec_helper.rb | 97 - .../2.7.0/gems/cocoapods-try-1.2.0/.gitignore | 17 - .../gems/cocoapods-try-1.2.0/.rubocop.yml | 3 - .../.rubocop_cocoapods.yml | 129 - .../cocoapods-try-1.2.0/.rubocop_todo.yml | 72 - .../gems/cocoapods-try-1.2.0/.travis.yml | 34 - .../gems/cocoapods-try-1.2.0/CHANGELOG.md | 204 - .../2.7.0/gems/cocoapods-try-1.2.0/Gemfile | 16 - .../gems/cocoapods-try-1.2.0/Gemfile.lock | 148 - .../2.7.0/gems/cocoapods-try-1.2.0/LICENSE | 22 - .../2.7.0/gems/cocoapods-try-1.2.0/README.md | 17 - .../2.7.0/gems/cocoapods-try-1.2.0/Rakefile | 54 - .../cocoapods-try-1.2.0/cocoapods-try.gemspec | 21 - .../spec/command/try_settings_spec.rb | 105 - .../spec/command/try_spec.rb | 245 - .../cocoapods-try-1.2.0/spec/spec_helper.rb | 49 - .../ruby/2.7.0/gems/colored2-3.1.2/LICENSE | 23 - .../ruby/2.7.0/gems/colored2-3.1.2/README.md | 93 - .../ruby/2.7.0/gems/colored2-3.1.2/Rakefile | 13 - .../spec/colored2/numbers_spec.rb | 26 - .../spec/colored2/object_spec.rb | 24 - .../spec/colored2/strings_spec.rb | 77 - .../gems/colored2-3.1.2/spec/colored2_spec.rb | 23 - .../gems/colored2-3.1.2/spec/spec_helper.rb | 5 - .../gems/concurrent-ruby-1.2.2/CHANGELOG.md | 561 - .../2.7.0/gems/concurrent-ruby-1.2.2/Gemfile | 36 - .../gems/concurrent-ruby-1.2.2/LICENSE.txt | 21 - .../gems/concurrent-ruby-1.2.2/README.md | 405 - .../2.7.0/gems/concurrent-ruby-1.2.2/Rakefile | 319 - .../ConcurrentRubyService.java | 17 - .../ext/AtomicReferenceLibrary.java | 175 - .../ext/JRubyMapBackendLibrary.java | 248 - .../ext/JavaAtomicBooleanLibrary.java | 93 - .../ext/JavaAtomicFixnumLibrary.java | 113 - .../ext/JavaSemaphoreLibrary.java | 189 - .../ext/SynchronizationLibrary.java | 292 - .../ext/jsr166e/ConcurrentHashMap.java | 31 - .../ext/jsr166e/ConcurrentHashMapV8.java | 3863 ----- .../ext/jsr166e/LongAdder.java | 203 - .../ext/jsr166e/Striped64.java | 342 - .../jsr166e/nounsafe/ConcurrentHashMapV8.java | 3800 ----- .../ext/jsr166e/nounsafe/LongAdder.java | 204 - .../ext/jsr166e/nounsafe/Striped64.java | 291 - .../ext/jsr166y/ThreadLocalRandom.java | 199 - .../ruby/2.7.0/gems/escape-0.0.4/Readme | 21 - .../doc_include/template/qualitysmith.rb | 631 - .../ethon-0.16.0/.github/workflows/ruby.yml | 41 - .../ruby/2.7.0/gems/ethon-0.16.0/.gitignore | 8 - .../ruby/2.7.0/gems/ethon-0.16.0/.rspec | 3 - .../ruby/2.7.0/gems/ethon-0.16.0/CHANGELOG.md | 375 - .../ruby/2.7.0/gems/ethon-0.16.0/Gemfile | 43 - .../ruby/2.7.0/gems/ethon-0.16.0/Guardfile | 10 - .../ruby/2.7.0/gems/ethon-0.16.0/LICENSE | 20 - .../ruby/2.7.0/gems/ethon-0.16.0/README.md | 118 - .../ruby/2.7.0/gems/ethon-0.16.0/Rakefile | 40 - .../2.7.0/gems/ethon-0.16.0/ethon.gemspec | 26 - .../gems/ethon-0.16.0/profile/benchmarks.rb | 104 - .../gems/ethon-0.16.0/profile/memory_leaks.rb | 114 - .../ethon-0.16.0/profile/perf_spec_helper.rb | 37 - .../profile/support/memory_test_helpers.rb | 76 - .../profile/support/os_memory_leak_tracker.rb | 48 - .../support/ruby_object_leak_tracker.rb | 49 - .../gems/ethon-0.16.0/spec/ethon/curl_spec.rb | 38 - .../spec/ethon/easy/callbacks_spec.rb | 81 - .../spec/ethon/easy/debug_info_spec.rb | 54 - .../spec/ethon/easy/features_spec.rb | 24 - .../ethon-0.16.0/spec/ethon/easy/form_spec.rb | 104 - .../spec/ethon/easy/header_spec.rb | 79 - .../spec/ethon/easy/http/custom_spec.rb | 177 - .../spec/ethon/easy/http/delete_spec.rb | 21 - .../spec/ethon/easy/http/get_spec.rb | 126 - .../spec/ethon/easy/http/head_spec.rb | 80 - .../spec/ethon/easy/http/options_spec.rb | 51 - .../spec/ethon/easy/http/patch_spec.rb | 51 - .../spec/ethon/easy/http/post_spec.rb | 317 - .../spec/ethon/easy/http/put_spec.rb | 168 - .../ethon-0.16.0/spec/ethon/easy/http_spec.rb | 64 - .../spec/ethon/easy/informations_spec.rb | 126 - .../spec/ethon/easy/mirror_spec.rb | 47 - .../spec/ethon/easy/operations_spec.rb | 271 - .../spec/ethon/easy/options_spec.rb | 193 - .../spec/ethon/easy/queryable_spec.rb | 235 - .../ethon/easy/response_callbacks_spec.rb | 152 - .../ethon-0.16.0/spec/ethon/easy/util_spec.rb | 28 - .../gems/ethon-0.16.0/spec/ethon/easy_spec.rb | 203 - .../gems/ethon-0.16.0/spec/ethon/libc_spec.rb | 14 - .../ethon-0.16.0/spec/ethon/loggable_spec.rb | 22 - .../spec/ethon/multi/operations_spec.rb | 298 - .../spec/ethon/multi/options_spec.rb | 182 - .../spec/ethon/multi/stack_spec.rb | 80 - .../ethon-0.16.0/spec/ethon/multi_spec.rb | 152 - .../gems/ethon-0.16.0/spec/spec_helper.rb | 28 - .../spec/support/localhost_server.rb | 95 - .../gems/ethon-0.16.0/spec/support/server.rb | 115 - .../ruby/2.7.0/gems/ffi-1.15.5/CHANGELOG.md | 338 - .../bundle/ruby/2.7.0/gems/ffi-1.15.5/COPYING | 49 - .../bundle/ruby/2.7.0/gems/ffi-1.15.5/Gemfile | 14 - .../bundle/ruby/2.7.0/gems/ffi-1.15.5/LICENSE | 24 - .../ruby/2.7.0/gems/ffi-1.15.5/LICENSE.SPECS | 22 - .../ruby/2.7.0/gems/ffi-1.15.5/README.md | 136 - .../ruby/2.7.0/gems/ffi-1.15.5/Rakefile | 191 - .../ffi-1.15.5/ext/ffi_c/.sitearchdir.time | 0 .../ffi-1.15.5/ext/ffi_c/AbstractMemory.c | 1104 -- .../ffi-1.15.5/ext/ffi_c/AbstractMemory.h | 175 - .../ffi-1.15.5/ext/ffi_c/AbstractMemory.o | Bin 278440 -> 0 bytes .../gems/ffi-1.15.5/ext/ffi_c/ArrayType.c | 162 - .../gems/ffi-1.15.5/ext/ffi_c/ArrayType.h | 59 - .../gems/ffi-1.15.5/ext/ffi_c/ArrayType.o | Bin 11400 -> 0 bytes .../2.7.0/gems/ffi-1.15.5/ext/ffi_c/Buffer.c | 360 - .../2.7.0/gems/ffi-1.15.5/ext/ffi_c/Buffer.o | Bin 28512 -> 0 bytes .../2.7.0/gems/ffi-1.15.5/ext/ffi_c/Call.c | 487 - .../2.7.0/gems/ffi-1.15.5/ext/ffi_c/Call.h | 107 - .../2.7.0/gems/ffi-1.15.5/ext/ffi_c/Call.o | Bin 33872 -> 0 bytes .../gems/ffi-1.15.5/ext/ffi_c/ClosurePool.c | 333 - .../gems/ffi-1.15.5/ext/ffi_c/ClosurePool.h | 59 - .../gems/ffi-1.15.5/ext/ffi_c/ClosurePool.o | Bin 10280 -> 0 bytes .../ffi-1.15.5/ext/ffi_c/DynamicLibrary.c | 334 - .../ffi-1.15.5/ext/ffi_c/DynamicLibrary.h | 98 - .../ffi-1.15.5/ext/ffi_c/DynamicLibrary.o | Bin 18784 -> 0 bytes .../gems/ffi-1.15.5/ext/ffi_c/Function.c | 917 - .../gems/ffi-1.15.5/ext/ffi_c/Function.h | 83 - .../gems/ffi-1.15.5/ext/ffi_c/Function.o | Bin 56352 -> 0 bytes .../gems/ffi-1.15.5/ext/ffi_c/FunctionInfo.c | 266 - .../gems/ffi-1.15.5/ext/ffi_c/FunctionInfo.o | Bin 23408 -> 0 bytes .../gems/ffi-1.15.5/ext/ffi_c/LastError.c | 225 - .../gems/ffi-1.15.5/ext/ffi_c/LastError.h | 47 - .../gems/ffi-1.15.5/ext/ffi_c/LastError.o | Bin 7776 -> 0 bytes .../gems/ffi-1.15.5/ext/ffi_c/LongDouble.c | 65 - .../gems/ffi-1.15.5/ext/ffi_c/LongDouble.h | 47 - .../gems/ffi-1.15.5/ext/ffi_c/LongDouble.o | Bin 10736 -> 0 bytes .../2.7.0/gems/ffi-1.15.5/ext/ffi_c/Makefile | 267 - .../gems/ffi-1.15.5/ext/ffi_c/MappedType.c | 168 - .../gems/ffi-1.15.5/ext/ffi_c/MappedType.h | 59 - .../gems/ffi-1.15.5/ext/ffi_c/MappedType.o | Bin 14168 -> 0 bytes .../gems/ffi-1.15.5/ext/ffi_c/MemoryPointer.c | 192 - .../gems/ffi-1.15.5/ext/ffi_c/MemoryPointer.h | 49 - .../gems/ffi-1.15.5/ext/ffi_c/MemoryPointer.o | Bin 17680 -> 0 bytes .../gems/ffi-1.15.5/ext/ffi_c/MethodHandle.c | 348 - .../gems/ffi-1.15.5/ext/ffi_c/MethodHandle.h | 56 - .../gems/ffi-1.15.5/ext/ffi_c/MethodHandle.o | Bin 11848 -> 0 bytes .../gems/ffi-1.15.5/ext/ffi_c/Platform.c | 78 - .../gems/ffi-1.15.5/ext/ffi_c/Platform.h | 45 - .../gems/ffi-1.15.5/ext/ffi_c/Platform.o | Bin 6240 -> 0 bytes .../2.7.0/gems/ffi-1.15.5/ext/ffi_c/Pointer.c | 507 - .../2.7.0/gems/ffi-1.15.5/ext/ffi_c/Pointer.h | 59 - .../2.7.0/gems/ffi-1.15.5/ext/ffi_c/Pointer.o | Bin 36128 -> 0 bytes .../2.7.0/gems/ffi-1.15.5/ext/ffi_c/Struct.c | 822 - .../2.7.0/gems/ffi-1.15.5/ext/ffi_c/Struct.h | 112 - .../2.7.0/gems/ffi-1.15.5/ext/ffi_c/Struct.o | Bin 62288 -> 0 bytes .../gems/ffi-1.15.5/ext/ffi_c/StructByValue.c | 145 - .../gems/ffi-1.15.5/ext/ffi_c/StructByValue.h | 55 - .../gems/ffi-1.15.5/ext/ffi_c/StructByValue.o | Bin 13640 -> 0 bytes .../gems/ffi-1.15.5/ext/ffi_c/StructLayout.c | 700 - .../gems/ffi-1.15.5/ext/ffi_c/StructLayout.o | Bin 45224 -> 0 bytes .../2.7.0/gems/ffi-1.15.5/ext/ffi_c/Thread.c | 129 - .../2.7.0/gems/ffi-1.15.5/ext/ffi_c/Thread.h | 76 - .../2.7.0/gems/ffi-1.15.5/ext/ffi_c/Thread.o | Bin 5656 -> 0 bytes .../2.7.0/gems/ffi-1.15.5/ext/ffi_c/Type.c | 379 - .../2.7.0/gems/ffi-1.15.5/ext/ffi_c/Type.h | 61 - .../2.7.0/gems/ffi-1.15.5/ext/ffi_c/Type.o | Bin 50336 -> 0 bytes .../2.7.0/gems/ffi-1.15.5/ext/ffi_c/Types.c | 138 - .../2.7.0/gems/ffi-1.15.5/ext/ffi_c/Types.h | 88 - .../2.7.0/gems/ffi-1.15.5/ext/ffi_c/Types.o | Bin 13944 -> 0 bytes .../gems/ffi-1.15.5/ext/ffi_c/Variadic.c | 303 - .../gems/ffi-1.15.5/ext/ffi_c/Variadic.o | Bin 26920 -> 0 bytes .../2.7.0/gems/ffi-1.15.5/ext/ffi_c/compat.h | 82 - .../2.7.0/gems/ffi-1.15.5/ext/ffi_c/extconf.h | 8 - .../gems/ffi-1.15.5/ext/ffi_c/extconf.rb | 98 - .../2.7.0/gems/ffi-1.15.5/ext/ffi_c/ffi.c | 93 - .../2.7.0/gems/ffi-1.15.5/ext/ffi_c/ffi.o | Bin 5624 -> 0 bytes .../gems/ffi-1.15.5/ext/ffi_c/ffi_c.bundle | Bin 211065 -> 0 bytes .../gems/ffi-1.15.5/ext/ffi_c/libffi.bsd.mk | 40 - .../ffi-1.15.5/ext/ffi_c/libffi.darwin.mk | 105 - .../gems/ffi-1.15.5/ext/ffi_c/libffi.gnu.mk | 32 - .../2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi.mk | 18 - .../gems/ffi-1.15.5/ext/ffi_c/libffi.vc.mk | 26 - .../gems/ffi-1.15.5/ext/ffi_c/libffi.vc64.mk | 26 - .../ffi-1.15.5/ext/ffi_c/libffi/.appveyor.yml | 66 - .../ext/ffi_c/libffi/.gitattributes | 4 - .../ffi_c/libffi/.github/issue_template.md | 10 - .../ffi-1.15.5/ext/ffi_c/libffi/.gitignore | 38 - .../ffi-1.15.5/ext/ffi_c/libffi/.travis.yml | 83 - .../ext/ffi_c/libffi/.travis/ar-lib | 270 - .../ext/ffi_c/libffi/.travis/bfin-sim.exp | 58 - .../.travis/build-cross-in-container.sh | 14 - .../libffi/.travis/build-in-container.sh | 12 - .../ext/ffi_c/libffi/.travis/build.sh | 142 - .../ext/ffi_c/libffi/.travis/compile | 351 - .../ext/ffi_c/libffi/.travis/install.sh | 71 - .../ext/ffi_c/libffi/.travis/m32r-sim.exp | 58 - .../ext/ffi_c/libffi/.travis/moxie-sim.exp | 60 - .../ext/ffi_c/libffi/.travis/or1k-sim.exp | 58 - .../ffi_c/libffi/.travis/powerpc-eabisim.exp | 58 - .../ext/ffi_c/libffi/.travis/site.exp | 27 - .../ext/ffi_c/libffi/.travis/wine-sim.exp | 55 - .../ffi-1.15.5/ext/ffi_c/libffi/ChangeLog.old | 7407 -------- .../gems/ffi-1.15.5/ext/ffi_c/libffi/LICENSE | 21 - .../ext/ffi_c/libffi/LICENSE-BUILDTOOLS | 353 - .../ffi-1.15.5/ext/ffi_c/libffi/Makefile.am | 150 - .../ffi-1.15.5/ext/ffi_c/libffi/README.md | 486 - .../ffi-1.15.5/ext/ffi_c/libffi/acinclude.m4 | 479 - .../ffi-1.15.5/ext/ffi_c/libffi/autogen.sh | 2 - .../ffi-1.15.5/ext/ffi_c/libffi/config.guess | 1687 -- .../ffi-1.15.5/ext/ffi_c/libffi/config.sub | 1851 -- .../ffi-1.15.5/ext/ffi_c/libffi/configure.ac | 415 - .../ext/ffi_c/libffi/configure.host | 318 - .../ext/ffi_c/libffi/doc/Makefile.am | 3 - .../ext/ffi_c/libffi/doc/libffi.texi | 997 -- .../ext/ffi_c/libffi/doc/version.texi | 4 - .../generate-darwin-source-and-headers.py | 201 - .../ext/ffi_c/libffi/include/Makefile.am | 9 - .../ext/ffi_c/libffi/include/ffi.h.in | 523 - .../ext/ffi_c/libffi/include/ffi_cfi.h | 55 - .../ext/ffi_c/libffi/include/ffi_common.h | 153 - .../ffi-1.15.5/ext/ffi_c/libffi/libffi.map.in | 76 - .../ffi-1.15.5/ext/ffi_c/libffi/libffi.pc.in | 11 - .../libffi/libffi.xcodeproj/project.pbxproj | 997 -- .../ext/ffi_c/libffi/libtool-version | 29 - .../ffi-1.15.5/ext/ffi_c/libffi/m4/asmcfi.m4 | 13 - .../ext/ffi_c/libffi/m4/ax_append_flag.m4 | 50 - .../ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 | 194 - .../ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 | 122 - .../ffi_c/libffi/m4/ax_check_compile_flag.m4 | 53 - .../ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 | 88 - .../ext/ffi_c/libffi/m4/ax_configure_args.m4 | 49 - .../ext/ffi_c/libffi/m4/ax_enable_builddir.m4 | 302 - .../ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 | 267 - .../ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4 | 89 - .../ext/ffi_c/libffi/m4/ax_require_defined.m4 | 37 - .../ext/ffi_c/libffi/make_sunver.pl | 333 - .../ext/ffi_c/libffi/man/Makefile.am | 8 - .../ffi-1.15.5/ext/ffi_c/libffi/man/ffi.3 | 41 - .../ext/ffi_c/libffi/man/ffi_call.3 | 103 - .../ext/ffi_c/libffi/man/ffi_prep_cif.3 | 68 - .../ext/ffi_c/libffi/man/ffi_prep_cif_var.3 | 73 - .../msvc_build/aarch64/Ffi_staticLib.sln | 33 - .../msvc_build/aarch64/Ffi_staticLib.vcxproj | 130 - .../aarch64/Ffi_staticLib.vcxproj.filters | 57 - .../aarch64/Ffi_staticLib.vcxproj.user | 4 - .../msvc_build/aarch64/aarch64_include/ffi.h | 511 - .../gems/ffi-1.15.5/ext/ffi_c/libffi/msvcc.sh | 353 - .../ext/ffi_c/libffi/src/aarch64/ffi.c | 1025 -- .../ext/ffi_c/libffi/src/aarch64/ffitarget.h | 97 - .../ext/ffi_c/libffi/src/aarch64/internal.h | 68 - .../ext/ffi_c/libffi/src/aarch64/sysv.S | 451 - .../ffi_c/libffi/src/aarch64/win64_armasm.S | 506 - .../ext/ffi_c/libffi/src/alpha/ffi.c | 521 - .../ext/ffi_c/libffi/src/alpha/ffitarget.h | 57 - .../ext/ffi_c/libffi/src/alpha/internal.h | 23 - .../ext/ffi_c/libffi/src/alpha/osf.S | 282 - .../ext/ffi_c/libffi/src/arc/arcompact.S | 135 - .../ffi-1.15.5/ext/ffi_c/libffi/src/arc/ffi.c | 266 - .../ext/ffi_c/libffi/src/arc/ffitarget.h | 53 - .../ffi-1.15.5/ext/ffi_c/libffi/src/arm/ffi.c | 876 - .../ext/ffi_c/libffi/src/arm/ffitarget.h | 89 - .../ext/ffi_c/libffi/src/arm/internal.h | 7 - .../ext/ffi_c/libffi/src/arm/sysv.S | 385 - .../ffi_c/libffi/src/arm/sysv_msvc_arm32.S | 311 - .../ext/ffi_c/libffi/src/avr32/ffi.c | 423 - .../ext/ffi_c/libffi/src/avr32/ffitarget.h | 55 - .../ext/ffi_c/libffi/src/avr32/sysv.S | 208 - .../ext/ffi_c/libffi/src/bfin/ffi.c | 196 - .../ext/ffi_c/libffi/src/bfin/ffitarget.h | 43 - .../ext/ffi_c/libffi/src/bfin/sysv.S | 179 - .../ext/ffi_c/libffi/src/closures.c | 1021 -- .../ext/ffi_c/libffi/src/cris/ffi.c | 386 - .../ext/ffi_c/libffi/src/cris/ffitarget.h | 56 - .../ext/ffi_c/libffi/src/cris/sysv.S | 215 - .../ext/ffi_c/libffi/src/csky/ffi.c | 395 - .../ext/ffi_c/libffi/src/csky/ffitarget.h | 63 - .../ext/ffi_c/libffi/src/csky/sysv.S | 371 - .../ffi-1.15.5/ext/ffi_c/libffi/src/debug.c | 64 - .../ext/ffi_c/libffi/src/dlmalloc.c | 5166 ------ .../ext/ffi_c/libffi/src/frv/eabi.S | 128 - .../ffi-1.15.5/ext/ffi_c/libffi/src/frv/ffi.c | 292 - .../ext/ffi_c/libffi/src/frv/ffitarget.h | 62 - .../ext/ffi_c/libffi/src/ia64/ffi.c | 604 - .../ext/ffi_c/libffi/src/ia64/ffitarget.h | 56 - .../ext/ffi_c/libffi/src/ia64/ia64_flags.h | 40 - .../ext/ffi_c/libffi/src/ia64/unix.S | 567 - .../ext/ffi_c/libffi/src/java_raw_api.c | 374 - .../ffi-1.15.5/ext/ffi_c/libffi/src/kvx/asm.h | 5 - .../ffi-1.15.5/ext/ffi_c/libffi/src/kvx/ffi.c | 273 - .../ext/ffi_c/libffi/src/kvx/ffitarget.h | 75 - .../ext/ffi_c/libffi/src/kvx/sysv.S | 127 - .../ext/ffi_c/libffi/src/m32r/ffi.c | 232 - .../ext/ffi_c/libffi/src/m32r/ffitarget.h | 53 - .../ext/ffi_c/libffi/src/m32r/sysv.S | 121 - .../ext/ffi_c/libffi/src/m68k/ffi.c | 362 - .../ext/ffi_c/libffi/src/m68k/ffitarget.h | 54 - .../ext/ffi_c/libffi/src/m68k/sysv.S | 357 - .../ext/ffi_c/libffi/src/m88k/ffi.c | 400 - .../ext/ffi_c/libffi/src/m88k/ffitarget.h | 49 - .../ext/ffi_c/libffi/src/m88k/obsd.S | 209 - .../ext/ffi_c/libffi/src/metag/ffi.c | 330 - .../ext/ffi_c/libffi/src/metag/ffitarget.h | 53 - .../ext/ffi_c/libffi/src/metag/sysv.S | 311 - .../ext/ffi_c/libffi/src/microblaze/ffi.c | 321 - .../ffi_c/libffi/src/microblaze/ffitarget.h | 53 - .../ext/ffi_c/libffi/src/microblaze/sysv.S | 302 - .../ext/ffi_c/libffi/src/mips/ffi.c | 1134 -- .../ext/ffi_c/libffi/src/mips/ffitarget.h | 244 - .../ext/ffi_c/libffi/src/mips/n32.S | 663 - .../ext/ffi_c/libffi/src/mips/o32.S | 504 - .../ext/ffi_c/libffi/src/moxie/eabi.S | 101 - .../ext/ffi_c/libffi/src/moxie/ffi.c | 285 - .../ext/ffi_c/libffi/src/moxie/ffitarget.h | 52 - .../ext/ffi_c/libffi/src/nios2/ffi.c | 304 - .../ext/ffi_c/libffi/src/nios2/ffitarget.h | 52 - .../ext/ffi_c/libffi/src/nios2/sysv.S | 136 - .../ext/ffi_c/libffi/src/or1k/ffi.c | 328 - .../ext/ffi_c/libffi/src/or1k/ffitarget.h | 58 - .../ext/ffi_c/libffi/src/or1k/sysv.S | 107 - .../ffi-1.15.5/ext/ffi_c/libffi/src/pa/ffi.c | 674 - .../ext/ffi_c/libffi/src/pa/ffitarget.h | 80 - .../ext/ffi_c/libffi/src/pa/hpux32.S | 370 - .../ext/ffi_c/libffi/src/pa/linux.S | 380 - .../ext/ffi_c/libffi/src/powerpc/aix.S | 566 - .../ffi_c/libffi/src/powerpc/aix_closure.S | 694 - .../ext/ffi_c/libffi/src/powerpc/asm.h | 125 - .../ext/ffi_c/libffi/src/powerpc/darwin.S | 378 - .../ffi_c/libffi/src/powerpc/darwin_closure.S | 571 - .../ext/ffi_c/libffi/src/powerpc/ffi.c | 175 - .../ext/ffi_c/libffi/src/powerpc/ffi_darwin.c | 1452 -- .../ffi_c/libffi/src/powerpc/ffi_linux64.c | 1153 -- .../ffi_c/libffi/src/powerpc/ffi_powerpc.h | 105 - .../ext/ffi_c/libffi/src/powerpc/ffi_sysv.c | 923 - .../ext/ffi_c/libffi/src/powerpc/ffitarget.h | 204 - .../ext/ffi_c/libffi/src/powerpc/linux64.S | 291 - .../libffi/src/powerpc/linux64_closure.S | 564 - .../ffi_c/libffi/src/powerpc/ppc_closure.S | 397 - .../ext/ffi_c/libffi/src/powerpc/sysv.S | 173 - .../ext/ffi_c/libffi/src/prep_cif.c | 263 - .../ffi-1.15.5/ext/ffi_c/libffi/src/raw_api.c | 267 - .../ext/ffi_c/libffi/src/riscv/ffi.c | 481 - .../ext/ffi_c/libffi/src/riscv/ffitarget.h | 69 - .../ext/ffi_c/libffi/src/riscv/sysv.S | 293 - .../ext/ffi_c/libffi/src/s390/ffi.c | 756 - .../ext/ffi_c/libffi/src/s390/ffitarget.h | 70 - .../ext/ffi_c/libffi/src/s390/internal.h | 11 - .../ext/ffi_c/libffi/src/s390/sysv.S | 325 - .../ffi-1.15.5/ext/ffi_c/libffi/src/sh/ffi.c | 717 - .../ext/ffi_c/libffi/src/sh/ffitarget.h | 54 - .../ffi-1.15.5/ext/ffi_c/libffi/src/sh/sysv.S | 850 - .../ext/ffi_c/libffi/src/sh64/ffi.c | 469 - .../ext/ffi_c/libffi/src/sh64/ffitarget.h | 58 - .../ext/ffi_c/libffi/src/sh64/sysv.S | 539 - .../ext/ffi_c/libffi/src/sparc/ffi.c | 468 - .../ext/ffi_c/libffi/src/sparc/ffi64.c | 608 - .../ext/ffi_c/libffi/src/sparc/ffitarget.h | 81 - .../ext/ffi_c/libffi/src/sparc/internal.h | 26 - .../ext/ffi_c/libffi/src/sparc/v8.S | 443 - .../ext/ffi_c/libffi/src/sparc/v9.S | 440 - .../ext/ffi_c/libffi/src/tile/ffi.c | 355 - .../ext/ffi_c/libffi/src/tile/ffitarget.h | 65 - .../ext/ffi_c/libffi/src/tile/tile.S | 360 - .../ffi-1.15.5/ext/ffi_c/libffi/src/types.c | 108 - .../ext/ffi_c/libffi/src/vax/elfbsd.S | 195 - .../ffi-1.15.5/ext/ffi_c/libffi/src/vax/ffi.c | 276 - .../ext/ffi_c/libffi/src/vax/ffitarget.h | 49 - .../ext/ffi_c/libffi/src/x86/asmnames.h | 30 - .../ffi-1.15.5/ext/ffi_c/libffi/src/x86/ffi.c | 770 - .../ext/ffi_c/libffi/src/x86/ffi64.c | 895 - .../ext/ffi_c/libffi/src/x86/ffitarget.h | 160 - .../ext/ffi_c/libffi/src/x86/ffiw64.c | 318 - .../ext/ffi_c/libffi/src/x86/internal.h | 29 - .../ext/ffi_c/libffi/src/x86/internal64.h | 22 - .../ext/ffi_c/libffi/src/x86/sysv.S | 1138 -- .../ext/ffi_c/libffi/src/x86/sysv_intel.S | 995 -- .../ext/ffi_c/libffi/src/x86/unix64.S | 621 - .../ext/ffi_c/libffi/src/x86/win64.S | 241 - .../ext/ffi_c/libffi/src/x86/win64_intel.S | 238 - .../ext/ffi_c/libffi/src/xtensa/ffi.c | 298 - .../ext/ffi_c/libffi/src/xtensa/ffitarget.h | 53 - .../ext/ffi_c/libffi/src/xtensa/sysv.S | 258 - .../ffi-1.15.5/ext/ffi_c/libffi/stamp-h.in | 1 - .../ext/ffi_c/libffi/testsuite/Makefile.am | 122 - .../ffi_c/libffi/testsuite/config/default.exp | 1 - .../libffi/testsuite/libffi.bhaible/Makefile | 28 - .../libffi/testsuite/libffi.bhaible/README | 78 - .../libffi/testsuite/libffi.bhaible/alignof.h | 50 - .../testsuite/libffi.bhaible/bhaible.exp | 63 - .../testsuite/libffi.bhaible/test-call.c | 1745 -- .../testsuite/libffi.bhaible/test-callback.c | 2885 ---- .../testsuite/libffi.bhaible/testcases.c | 743 - .../testsuite/libffi.call/align_mixed.c | 46 - .../testsuite/libffi.call/align_stdcall.c | 46 - .../libffi/testsuite/libffi.call/call.exp | 54 - .../testsuite/libffi.call/err_bad_typedef.c | 26 - .../libffi/testsuite/libffi.call/ffitest.h | 138 - .../libffi/testsuite/libffi.call/float.c | 59 - .../libffi/testsuite/libffi.call/float1.c | 60 - .../libffi/testsuite/libffi.call/float2.c | 61 - .../libffi/testsuite/libffi.call/float3.c | 74 - .../libffi/testsuite/libffi.call/float4.c | 62 - .../libffi/testsuite/libffi.call/float_va.c | 107 - .../ffi_c/libffi/testsuite/libffi.call/many.c | 59 - .../libffi/testsuite/libffi.call/many2.c | 57 - .../testsuite/libffi.call/many_double.c | 70 - .../libffi/testsuite/libffi.call/many_mixed.c | 78 - .../libffi/testsuite/libffi.call/negint.c | 52 - .../libffi/testsuite/libffi.call/offsets.c | 46 - .../libffi/testsuite/libffi.call/pr1172638.c | 127 - .../libffi/testsuite/libffi.call/promotion.c | 59 - .../libffi/testsuite/libffi.call/pyobjc-tc.c | 114 - .../libffi/testsuite/libffi.call/return_dbl.c | 36 - .../testsuite/libffi.call/return_dbl1.c | 43 - .../testsuite/libffi.call/return_dbl2.c | 42 - .../libffi/testsuite/libffi.call/return_fl.c | 35 - .../libffi/testsuite/libffi.call/return_fl1.c | 36 - .../libffi/testsuite/libffi.call/return_fl2.c | 49 - .../libffi/testsuite/libffi.call/return_fl3.c | 42 - .../libffi/testsuite/libffi.call/return_ldl.c | 34 - .../libffi/testsuite/libffi.call/return_ll.c | 41 - .../libffi/testsuite/libffi.call/return_ll1.c | 43 - .../libffi/testsuite/libffi.call/return_sc.c | 36 - .../libffi/testsuite/libffi.call/return_sl.c | 38 - .../libffi/testsuite/libffi.call/return_uc.c | 38 - .../libffi/testsuite/libffi.call/return_ul.c | 38 - .../libffi/testsuite/libffi.call/strlen.c | 44 - .../libffi/testsuite/libffi.call/strlen2.c | 49 - .../libffi/testsuite/libffi.call/strlen3.c | 49 - .../libffi/testsuite/libffi.call/strlen4.c | 55 - .../libffi/testsuite/libffi.call/struct1.c | 67 - .../libffi/testsuite/libffi.call/struct10.c | 57 - .../libffi/testsuite/libffi.call/struct2.c | 67 - .../libffi/testsuite/libffi.call/struct3.c | 60 - .../libffi/testsuite/libffi.call/struct4.c | 64 - .../libffi/testsuite/libffi.call/struct5.c | 66 - .../libffi/testsuite/libffi.call/struct6.c | 64 - .../libffi/testsuite/libffi.call/struct7.c | 74 - .../libffi/testsuite/libffi.call/struct8.c | 81 - .../libffi/testsuite/libffi.call/struct9.c | 68 - .../testsuite/libffi.call/uninitialized.c | 61 - .../ffi_c/libffi/testsuite/libffi.call/va_1.c | 196 - .../libffi/testsuite/libffi.call/va_struct1.c | 121 - .../libffi/testsuite/libffi.call/va_struct2.c | 123 - .../libffi/testsuite/libffi.call/va_struct3.c | 125 - .../testsuite/libffi.closures/closure.exp | 67 - .../testsuite/libffi.closures/closure_fn0.c | 89 - .../testsuite/libffi.closures/closure_fn1.c | 81 - .../testsuite/libffi.closures/closure_fn2.c | 81 - .../testsuite/libffi.closures/closure_fn3.c | 82 - .../testsuite/libffi.closures/closure_fn4.c | 89 - .../testsuite/libffi.closures/closure_fn5.c | 92 - .../testsuite/libffi.closures/closure_fn6.c | 90 - .../libffi.closures/closure_loc_fn0.c | 95 - .../libffi.closures/closure_simple.c | 55 - .../testsuite/libffi.closures/cls_12byte.c | 94 - .../testsuite/libffi.closures/cls_16byte.c | 95 - .../testsuite/libffi.closures/cls_18byte.c | 96 - .../testsuite/libffi.closures/cls_19byte.c | 102 - .../testsuite/libffi.closures/cls_1_1byte.c | 89 - .../testsuite/libffi.closures/cls_20byte.c | 91 - .../testsuite/libffi.closures/cls_20byte1.c | 93 - .../testsuite/libffi.closures/cls_24byte.c | 113 - .../testsuite/libffi.closures/cls_2byte.c | 90 - .../testsuite/libffi.closures/cls_3_1byte.c | 95 - .../testsuite/libffi.closures/cls_3byte1.c | 90 - .../testsuite/libffi.closures/cls_3byte2.c | 90 - .../testsuite/libffi.closures/cls_3float.c | 95 - .../testsuite/libffi.closures/cls_4_1byte.c | 98 - .../testsuite/libffi.closures/cls_4byte.c | 90 - .../testsuite/libffi.closures/cls_5_1_byte.c | 109 - .../testsuite/libffi.closures/cls_5byte.c | 98 - .../testsuite/libffi.closures/cls_64byte.c | 124 - .../testsuite/libffi.closures/cls_6_1_byte.c | 113 - .../testsuite/libffi.closures/cls_6byte.c | 99 - .../testsuite/libffi.closures/cls_7_1_byte.c | 117 - .../testsuite/libffi.closures/cls_7byte.c | 97 - .../testsuite/libffi.closures/cls_8byte.c | 88 - .../testsuite/libffi.closures/cls_9byte1.c | 90 - .../testsuite/libffi.closures/cls_9byte2.c | 91 - .../libffi.closures/cls_align_double.c | 93 - .../libffi.closures/cls_align_float.c | 91 - .../libffi.closures/cls_align_longdouble.c | 92 - .../cls_align_longdouble_split.c | 132 - .../cls_align_longdouble_split2.c | 115 - .../libffi.closures/cls_align_pointer.c | 95 - .../libffi.closures/cls_align_sint16.c | 91 - .../libffi.closures/cls_align_sint32.c | 91 - .../libffi.closures/cls_align_sint64.c | 92 - .../libffi.closures/cls_align_uint16.c | 91 - .../libffi.closures/cls_align_uint32.c | 91 - .../libffi.closures/cls_align_uint64.c | 93 - .../libffi.closures/cls_dbls_struct.c | 66 - .../testsuite/libffi.closures/cls_double.c | 43 - .../testsuite/libffi.closures/cls_double_va.c | 61 - .../testsuite/libffi.closures/cls_float.c | 42 - .../libffi.closures/cls_longdouble.c | 105 - .../libffi.closures/cls_longdouble_va.c | 61 - .../libffi.closures/cls_many_mixed_args.c | 70 - .../cls_many_mixed_float_double.c | 55 - .../libffi.closures/cls_multi_schar.c | 74 - .../libffi.closures/cls_multi_sshort.c | 74 - .../libffi.closures/cls_multi_sshortchar.c | 86 - .../libffi.closures/cls_multi_uchar.c | 91 - .../libffi.closures/cls_multi_ushort.c | 74 - .../libffi.closures/cls_multi_ushortchar.c | 86 - .../testsuite/libffi.closures/cls_pointer.c | 74 - .../libffi.closures/cls_pointer_stack.c | 142 - .../testsuite/libffi.closures/cls_schar.c | 44 - .../testsuite/libffi.closures/cls_sint.c | 42 - .../testsuite/libffi.closures/cls_sshort.c | 42 - .../libffi.closures/cls_struct_va1.c | 114 - .../testsuite/libffi.closures/cls_uchar.c | 42 - .../testsuite/libffi.closures/cls_uchar_va.c | 44 - .../testsuite/libffi.closures/cls_uint.c | 43 - .../testsuite/libffi.closures/cls_uint_va.c | 45 - .../testsuite/libffi.closures/cls_ulong_va.c | 45 - .../testsuite/libffi.closures/cls_ulonglong.c | 47 - .../testsuite/libffi.closures/cls_ushort.c | 43 - .../testsuite/libffi.closures/cls_ushort_va.c | 44 - .../testsuite/libffi.closures/err_bad_abi.c | 36 - .../testsuite/libffi.closures/ffitest.h | 138 - .../testsuite/libffi.closures/huge_struct.c | 343 - .../testsuite/libffi.closures/nested_struct.c | 152 - .../libffi.closures/nested_struct1.c | 161 - .../libffi.closures/nested_struct10.c | 134 - .../libffi.closures/nested_struct11.c | 121 - .../libffi.closures/nested_struct2.c | 110 - .../libffi.closures/nested_struct3.c | 111 - .../libffi.closures/nested_struct4.c | 111 - .../libffi.closures/nested_struct5.c | 112 - .../libffi.closures/nested_struct6.c | 131 - .../libffi.closures/nested_struct7.c | 111 - .../libffi.closures/nested_struct8.c | 131 - .../libffi.closures/nested_struct9.c | 131 - .../testsuite/libffi.closures/problem1.c | 90 - .../testsuite/libffi.closures/stret_large.c | 145 - .../testsuite/libffi.closures/stret_large2.c | 148 - .../testsuite/libffi.closures/stret_medium.c | 124 - .../testsuite/libffi.closures/stret_medium2.c | 125 - .../testsuite/libffi.closures/testclosure.c | 70 - .../testsuite/libffi.closures/unwindtest.cc | 117 - .../libffi.closures/unwindtest_ffi_call.cc | 54 - .../libffi.complex/cls_align_complex.inc | 91 - .../libffi.complex/cls_align_complex_double.c | 10 - .../libffi.complex/cls_align_complex_float.c | 10 - .../cls_align_complex_longdouble.c | 10 - .../testsuite/libffi.complex/cls_complex.inc | 42 - .../libffi.complex/cls_complex_double.c | 10 - .../libffi.complex/cls_complex_float.c | 10 - .../libffi.complex/cls_complex_longdouble.c | 10 - .../libffi.complex/cls_complex_struct.inc | 71 - .../cls_complex_struct_double.c | 10 - .../libffi.complex/cls_complex_struct_float.c | 10 - .../cls_complex_struct_longdouble.c | 10 - .../libffi.complex/cls_complex_va.inc | 80 - .../libffi.complex/cls_complex_va_double.c | 10 - .../libffi.complex/cls_complex_va_float.c | 16 - .../cls_complex_va_longdouble.c | 10 - .../testsuite/libffi.complex/complex.exp | 36 - .../testsuite/libffi.complex/complex.inc | 51 - .../libffi.complex/complex_defs_double.inc | 7 - .../libffi.complex/complex_defs_float.inc | 7 - .../complex_defs_longdouble.inc | 7 - .../testsuite/libffi.complex/complex_double.c | 10 - .../testsuite/libffi.complex/complex_float.c | 10 - .../testsuite/libffi.complex/complex_int.c | 86 - .../libffi.complex/complex_longdouble.c | 10 - .../libffi/testsuite/libffi.complex/ffitest.h | 1 - .../testsuite/libffi.complex/many_complex.inc | 78 - .../libffi.complex/many_complex_double.c | 10 - .../libffi.complex/many_complex_float.c | 10 - .../libffi.complex/many_complex_longdouble.c | 10 - .../libffi.complex/return_complex.inc | 37 - .../libffi.complex/return_complex1.inc | 41 - .../libffi.complex/return_complex1_double.c | 10 - .../libffi.complex/return_complex1_float.c | 10 - .../return_complex1_longdouble.c | 10 - .../libffi.complex/return_complex2.inc | 44 - .../libffi.complex/return_complex2_double.c | 10 - .../libffi.complex/return_complex2_float.c | 10 - .../return_complex2_longdouble.c | 10 - .../libffi.complex/return_complex_double.c | 10 - .../libffi.complex/return_complex_float.c | 10 - .../return_complex_longdouble.c | 10 - .../libffi/testsuite/libffi.go/aa-direct.c | 34 - .../libffi/testsuite/libffi.go/closure1.c | 28 - .../libffi/testsuite/libffi.go/ffitest.h | 1 - .../ffi_c/libffi/testsuite/libffi.go/go.exp | 36 - .../libffi/testsuite/libffi.go/static-chain.h | 19 - .../2.7.0/gems/ffi-1.15.5/ext/ffi_c/rbffi.h | 55 - .../gems/ffi-1.15.5/ext/ffi_c/rbffi_endian.h | 59 - .../ruby/2.7.0/gems/ffi-1.15.5/ffi.gemspec | 42 - .../gems/ffi-1.15.5/rakelib/ffi_gem_helper.rb | 65 - .../2.7.0/gems/ffi-1.15.5/samples/getlogin.rb | 8 - .../2.7.0/gems/ffi-1.15.5/samples/getpid.rb | 8 - .../gems/ffi-1.15.5/samples/gettimeofday.rb | 18 - .../2.7.0/gems/ffi-1.15.5/samples/hello.rb | 8 - .../2.7.0/gems/ffi-1.15.5/samples/inotify.rb | 60 - .../ruby/2.7.0/gems/ffi-1.15.5/samples/pty.rb | 75 - .../2.7.0/gems/ffi-1.15.5/samples/qsort.rb | 20 - .../2.7.0/gems/fourflusher-2.3.1/.gitignore | 8 - .../2.7.0/gems/fourflusher-2.3.1/.rubocop.yml | 30 - .../2.7.0/gems/fourflusher-2.3.1/.travis.yml | 8 - .../2.7.0/gems/fourflusher-2.3.1/CHANGELOG.md | 142 - .../ruby/2.7.0/gems/fourflusher-2.3.1/Gemfile | 3 - .../2.7.0/gems/fourflusher-2.3.1/Gemfile.lock | 47 - .../2.7.0/gems/fourflusher-2.3.1/LICENSE.txt | 21 - .../2.7.0/gems/fourflusher-2.3.1/README.md | 33 - .../2.7.0/gems/fourflusher-2.3.1/Rakefile | 9 - .../2.7.0/gems/fourflusher-2.3.1/bin/console | 14 - .../2.7.0/gems/fourflusher-2.3.1/bin/setup | 8 - .../fourflusher-2.3.1/fourflusher.gemspec | 27 - .../2.7.0/gems/fuzzy_match-2.0.4/.gitignore | 24 - .../ruby/2.7.0/gems/fuzzy_match-2.0.4/.rspec | 2 - .../2.7.0/gems/fuzzy_match-2.0.4/CHANGELOG | 93 - .../ruby/2.7.0/gems/fuzzy_match-2.0.4/Gemfile | 11 - .../ruby/2.7.0/gems/fuzzy_match-2.0.4/LICENSE | 20 - .../gems/fuzzy_match-2.0.4/README.markdown | 191 - .../2.7.0/gems/fuzzy_match-2.0.4/Rakefile | 5 - .../fuzzy_match-2.0.4/THANKS-WILLIAM-JAMES.rb | 37 - .../benchmark/before-with-free.txt | 283 - .../benchmark/before-without-last-result.txt | 257 - .../fuzzy_match-2.0.4/benchmark/before.txt | 304 - .../fuzzy_match-2.0.4/benchmark/memory.rb | 53 - .../gems/fuzzy_match-2.0.4/bin/fuzzy_match | 106 - .../fuzzy_match-2.0.4/fuzzy_match.gemspec | 34 - .../groupings-screenshot.png | Bin 18097 -> 0 bytes .../gems/fuzzy_match-2.0.4/highlevel.graffle | Bin 3932 -> 0 bytes .../gems/fuzzy_match-2.0.4/highlevel.png | Bin 61213 -> 0 bytes .../fuzzy_match-2.0.4/spec/amatch_spec.rb | 17 - .../gems/fuzzy_match-2.0.4/spec/cache_spec.rb | 132 - .../2.7.0/gems/fuzzy_match-2.0.4/spec/foo.rb | 9 - .../spec/fuzzy_match_spec.rb | 367 - .../fuzzy_match-2.0.4/spec/grouping_spec.rb | 60 - .../fuzzy_match-2.0.4/spec/identity_spec.rb | 29 - .../fuzzy_match-2.0.4/spec/record_spec.rb | 25 - .../fuzzy_match-2.0.4/spec/spec_helper.rb | 21 - .../2.7.0/gems/gh_inspector-1.1.3/.gitignore | 10 - .../ruby/2.7.0/gems/gh_inspector-1.1.3/.rspec | 2 - .../gems/gh_inspector-1.1.3/.rubocop.yml | 134 - .../2.7.0/gems/gh_inspector-1.1.3/.travis.yml | 9 - .../gems/gh_inspector-1.1.3/CHANGELOG.md | 26 - .../2.7.0/gems/gh_inspector-1.1.3/Gemfile | 4 - .../2.7.0/gems/gh_inspector-1.1.3/LICENSE | 21 - .../2.7.0/gems/gh_inspector-1.1.3/README.md | 102 - .../2.7.0/gems/gh_inspector-1.1.3/Rakefile | 62 - .../2.7.0/gems/gh_inspector-1.1.3/bin/console | 10 - .../2.7.0/gems/gh_inspector-1.1.3/bin/setup | 8 - .../gh_inspector-1.1.3/gh_inspector.gemspec | 27 - .../2.7.0/gems/httpclient-2.8.3/README.md | 85 - .../gems/httpclient-2.8.3/bin/httpclient | 77 - .../gems/httpclient-2.8.3/bin/jsonclient | 85 - .../gems/httpclient-2.8.3/sample/async.rb | 8 - .../gems/httpclient-2.8.3/sample/auth.rb | 11 - .../gems/httpclient-2.8.3/sample/cookie.rb | 18 - .../2.7.0/gems/httpclient-2.8.3/sample/dav.rb | 103 - .../gems/httpclient-2.8.3/sample/howto.rb | 49 - .../httpclient-2.8.3/sample/jsonclient.rb | 67 - .../httpclient-2.8.3/sample/oauth_buzz.rb | 57 - .../sample/oauth_friendfeed.rb | 59 - .../httpclient-2.8.3/sample/oauth_twitter.rb | 61 - .../httpclient-2.8.3/sample/ssl/0cert.pem | 22 - .../gems/httpclient-2.8.3/sample/ssl/0key.pem | 30 - .../httpclient-2.8.3/sample/ssl/1000cert.pem | 19 - .../httpclient-2.8.3/sample/ssl/1000key.pem | 18 - .../sample/ssl/htdocs/index.html | 10 - .../httpclient-2.8.3/sample/ssl/ssl_client.rb | 22 - .../sample/ssl/webrick_httpsd.rb | 29 - .../gems/httpclient-2.8.3/sample/stream.rb | 21 - .../gems/httpclient-2.8.3/sample/thread.rb | 27 - .../gems/httpclient-2.8.3/sample/wcat.rb | 21 - .../gems/httpclient-2.8.3/test/ca-chain.pem | 44 - .../2.7.0/gems/httpclient-2.8.3/test/ca.cert | 23 - .../httpclient-2.8.3/test/client-pass.key | 18 - .../gems/httpclient-2.8.3/test/client.cert | 19 - .../gems/httpclient-2.8.3/test/client.key | 15 - .../gems/httpclient-2.8.3/test/helper.rb | 131 - .../2.7.0/gems/httpclient-2.8.3/test/htdigest | 1 - .../2.7.0/gems/httpclient-2.8.3/test/htpasswd | 2 - .../test/jruby_ssl_socket/test_pemutils.rb | 32 - .../gems/httpclient-2.8.3/test/runner.rb | 2 - .../gems/httpclient-2.8.3/test/server.cert | 19 - .../gems/httpclient-2.8.3/test/server.key | 15 - .../gems/httpclient-2.8.3/test/sslsvr.rb | 65 - .../gems/httpclient-2.8.3/test/subca.cert | 21 - .../gems/httpclient-2.8.3/test/test_auth.rb | 492 - .../gems/httpclient-2.8.3/test/test_cookie.rb | 309 - .../httpclient-2.8.3/test/test_hexdump.rb | 14 - .../test/test_http-access2.rb | 508 - .../httpclient-2.8.3/test/test_httpclient.rb | 2145 --- .../test/test_include_client.rb | 52 - .../httpclient-2.8.3/test/test_jsonclient.rb | 80 - .../gems/httpclient-2.8.3/test/test_ssl.rb | 559 - .../test/test_webagent-cookie.rb | 465 - .../ruby/2.7.0/gems/i18n-1.13.0/MIT-LICENSE | 20 - .../ruby/2.7.0/gems/i18n-1.13.0/README.md | 123 - .../ruby/2.7.0/gems/json-2.6.3/CHANGES.md | 457 - .../bundle/ruby/2.7.0/gems/json-2.6.3/LICENSE | 56 - .../ruby/2.7.0/gems/json-2.6.3/README.md | 425 - .../bundle/ruby/2.7.0/gems/json-2.6.3/VERSION | 1 - .../2.7.0/gems/json-2.6.3/ext/json/Makefile | 202 - .../json-2.6.3/ext/json/ext/fbuffer/fbuffer.h | 187 - .../generator/.sitearchdir.-.json.-.ext.time | 0 .../ext/json/ext/generator/Makefile | 268 - .../json-2.6.3/ext/json/ext/generator/depend | 1 - .../ext/json/ext/generator/extconf.rb | 4 - .../ext/json/ext/generator/generator.bundle | Bin 63885 -> 0 bytes .../ext/json/ext/generator/generator.c | 1608 -- .../ext/json/ext/generator/generator.h | 174 - .../ext/json/ext/generator/generator.o | Bin 155968 -> 0 bytes .../ext/parser/.sitearchdir.-.json.-.ext.time | 0 .../json-2.6.3/ext/json/ext/parser/Makefile | 268 - .../json-2.6.3/ext/json/ext/parser/depend | 1 - .../json-2.6.3/ext/json/ext/parser/extconf.rb | 32 - .../ext/json/ext/parser/parser.bundle | Bin 41338 -> 0 bytes .../json-2.6.3/ext/json/ext/parser/parser.c | 3347 ---- .../json-2.6.3/ext/json/ext/parser/parser.h | 96 - .../json-2.6.3/ext/json/ext/parser/parser.o | Bin 81344 -> 0 bytes .../json-2.6.3/ext/json/ext/parser/parser.rl | 986 -- .../2.7.0/gems/json-2.6.3/ext/json/extconf.rb | 3 - .../ruby/2.7.0/gems/json-2.6.3/json.gemspec | 67 - .../ruby/2.7.0/gems/minitest-5.18.0/.autotest | 34 - .../2.7.0/gems/minitest-5.18.0/History.rdoc | 1504 -- .../2.7.0/gems/minitest-5.18.0/Manifest.txt | 29 - .../2.7.0/gems/minitest-5.18.0/README.rdoc | 831 - .../ruby/2.7.0/gems/minitest-5.18.0/Rakefile | 75 - .../gems/minitest-5.18.0/design_rationale.rb | 52 - .../test/minitest/metametameta.rb | 136 - .../test/minitest/test_minitest_assertions.rb | 1701 -- .../test/minitest/test_minitest_benchmark.rb | 137 - .../test/minitest/test_minitest_mock.rb | 1146 -- .../test/minitest/test_minitest_reporter.rb | 312 - .../test/minitest/test_minitest_spec.rb | 1146 -- .../test/minitest/test_minitest_test.rb | 1272 -- .../test/minitest/test_minitest_test_task.rb | 46 - .../gems/molinillo-0.8.0/ARCHITECTURE.md | 102 - .../2.7.0/gems/molinillo-0.8.0/CHANGELOG.md | 480 - .../ruby/2.7.0/gems/molinillo-0.8.0/LICENSE | 9 - .../ruby/2.7.0/gems/molinillo-0.8.0/README.md | 44 - .../ruby/2.7.0/gems/nanaimo-0.3.0/.gitignore | 8 - .../ruby/2.7.0/gems/nanaimo-0.3.0/.rspec | 2 - .../2.7.0/gems/nanaimo-0.3.0/.rubocop.yml | 14 - .../gems/nanaimo-0.3.0/.rubocop_todo.yml | 104 - .../ruby/2.7.0/gems/nanaimo-0.3.0/.travis.yml | 18 - .../2.7.0/gems/nanaimo-0.3.0/CHANGELOG.md | 168 - .../gems/nanaimo-0.3.0/CODE_OF_CONDUCT.md | 49 - .../ruby/2.7.0/gems/nanaimo-0.3.0/Gemfile | 12 - .../2.7.0/gems/nanaimo-0.3.0/Gemfile.lock | 51 - .../ruby/2.7.0/gems/nanaimo-0.3.0/LICENSE.txt | 21 - .../ruby/2.7.0/gems/nanaimo-0.3.0/README.md | 55 - .../ruby/2.7.0/gems/nanaimo-0.3.0/Rakefile | 80 - .../ruby/2.7.0/gems/nanaimo-0.3.0/bin/console | 15 - .../ruby/2.7.0/gems/nanaimo-0.3.0/bin/setup | 8 - .../2.7.0/gems/nanaimo-0.3.0/nanaimo.gemspec | 26 - .../bundle/ruby/2.7.0/gems/nap-1.1.0/LICENSE | 18 - .../ruby/2.7.0/gems/nap-1.1.0/README.md | 80 - .../2.7.0/gems/nap-1.1.0/support/cacert.pem | 3988 ----- .../ruby/2.7.0/gems/netrc-0.11.0/LICENSE.md | 20 - .../ruby/2.7.0/gems/netrc-0.11.0/Readme.md | 53 - .../2.7.0/gems/netrc-0.11.0/changelog.txt | 93 - .../gems/netrc-0.11.0/data/default_only.netrc | 4 - .../2.7.0/gems/netrc-0.11.0/data/login.netrc | 3 - .../gems/netrc-0.11.0/data/newlineless.netrc | 4 - .../gems/netrc-0.11.0/data/password.netrc | 3 - .../gems/netrc-0.11.0/data/permissive.netrc | 4 - .../2.7.0/gems/netrc-0.11.0/data/sample.netrc | 4 - .../gems/netrc-0.11.0/data/sample_multi.netrc | 8 - .../data/sample_multi_with_default.netrc | 12 - .../data/sample_with_default.netrc | 8 - .../2.7.0/gems/netrc-0.11.0/test/test_lex.rb | 58 - .../gems/netrc-0.11.0/test/test_netrc.rb | 273 - .../gems/netrc-0.11.0/test/test_parse.rb | 34 - .../public_suffix-4.0.7/.github/FUNDING.yml | 12 - .../.github/dependabot.yml | 8 - .../.github/workflows/release.yml | 16 - .../.github/workflows/tests.yml | 28 - .../2.7.0/gems/public_suffix-4.0.7/.gitignore | 8 - .../gems/public_suffix-4.0.7/.rubocop.yml | 36 - .../.rubocop_opinionated.yml | 163 - .../2.7.0/gems/public_suffix-4.0.7/.yardopts | 1 - .../gems/public_suffix-4.0.7/2.0-Upgrade.md | 52 - .../gems/public_suffix-4.0.7/CHANGELOG.md | 417 - .../2.7.0/gems/public_suffix-4.0.7/Gemfile | 14 - .../gems/public_suffix-4.0.7/LICENSE.txt | 22 - .../2.7.0/gems/public_suffix-4.0.7/README.md | 217 - .../2.7.0/gems/public_suffix-4.0.7/Rakefile | 52 - .../gems/public_suffix-4.0.7/SECURITY.md | 104 - .../gems/public_suffix-4.0.7/bin/console | 15 - .../gems/public_suffix-4.0.7/data/list.txt | 14035 ---------------- .../public_suffix-4.0.7/public_suffix.gemspec | 29 - .../gems/public_suffix-4.0.7/test/.empty | 2 - .../test/acceptance_test.rb | 131 - .../test/benchmarks/bm_find.rb | 66 - .../test/benchmarks/bm_find_all.rb | 102 - .../test/benchmarks/bm_names.rb | 91 - .../test/benchmarks/bm_select.rb | 26 - .../test/benchmarks/bm_select_incremental.rb | 25 - .../test/benchmarks/bm_valid.rb | 101 - .../test/profilers/domain_profiler.rb | 12 - .../test/profilers/find_profiler.rb | 12 - .../test/profilers/find_profiler_jp.rb | 12 - .../test/profilers/initialization_profiler.rb | 11 - .../test/profilers/list_profsize.rb | 11 - .../test/profilers/object_binsize.rb | 57 - .../gems/public_suffix-4.0.7/test/psl_test.rb | 52 - .../public_suffix-4.0.7/test/test_helper.rb | 10 - .../gems/public_suffix-4.0.7/test/tests.txt | 98 - .../test/unit/domain_test.rb | 106 - .../test/unit/errors_test.rb | 25 - .../test/unit/list_test.rb | 241 - .../test/unit/public_suffix_test.rb | 188 - .../test/unit/rule_test.rb | 222 - .../ruby/2.7.0/gems/rexml-3.2.5/LICENSE.txt | 22 - .../ruby/2.7.0/gems/rexml-3.2.5/NEWS.md | 178 - .../ruby/2.7.0/gems/rexml-3.2.5/README.md | 48 - .../gems/rexml-3.2.5/doc/rexml/context.rdoc | 143 - .../doc/rexml/tasks/rdoc/child.rdoc | 87 - .../doc/rexml/tasks/rdoc/document.rdoc | 276 - .../doc/rexml/tasks/rdoc/element.rdoc | 602 - .../doc/rexml/tasks/rdoc/node.rdoc | 97 - .../doc/rexml/tasks/rdoc/parent.rdoc | 267 - .../doc/rexml/tasks/tocs/child_toc.rdoc | 12 - .../doc/rexml/tasks/tocs/document_toc.rdoc | 30 - .../doc/rexml/tasks/tocs/element_toc.rdoc | 55 - .../doc/rexml/tasks/tocs/master_toc.rdoc | 135 - .../doc/rexml/tasks/tocs/node_toc.rdoc | 16 - .../doc/rexml/tasks/tocs/parent_toc.rdoc | 25 - .../2.7.0/gems/ruby-macho-2.5.1/.yardopts | 1 - .../ruby/2.7.0/gems/ruby-macho-2.5.1/LICENSE | 21 - .../2.7.0/gems/ruby-macho-2.5.1/README.md | 69 - .../ruby/2.7.0/gems/typhoeus-1.4.0/.gitignore | 8 - .../ruby/2.7.0/gems/typhoeus-1.4.0/.rspec | 4 - .../2.7.0/gems/typhoeus-1.4.0/.travis.yml | 26 - .../2.7.0/gems/typhoeus-1.4.0/CHANGELOG.md | 406 - .../2.7.0/gems/typhoeus-1.4.0/CONTRIBUTING.md | 20 - .../ruby/2.7.0/gems/typhoeus-1.4.0/Gemfile | 32 - .../ruby/2.7.0/gems/typhoeus-1.4.0/Guardfile | 9 - .../ruby/2.7.0/gems/typhoeus-1.4.0/LICENSE | 22 - .../ruby/2.7.0/gems/typhoeus-1.4.0/README.md | 584 - .../ruby/2.7.0/gems/typhoeus-1.4.0/Rakefile | 38 - .../ruby/2.7.0/gems/typhoeus-1.4.0/UPGRADE.md | 55 - .../2.7.0/gems/typhoeus-1.4.0/perf/profile.rb | 14 - .../gems/typhoeus-1.4.0/perf/vs_nethttp.rb | 64 - .../middleware/params_decoder/helper_spec.rb | 156 - .../middleware/params_decoder_spec.rb | 31 - .../gems/typhoeus-1.4.0/spec/spec_helper.rb | 29 - .../spec/support/localhost_server.rb | 94 - .../spec/support/memory_cache.rb | 15 - .../typhoeus-1.4.0/spec/support/server.rb | 116 - .../spec/typhoeus/adapters/faraday_spec.rb | 339 - .../spec/typhoeus/cache/dalli_spec.rb | 41 - .../spec/typhoeus/cache/redis_spec.rb | 41 - .../spec/typhoeus/config_spec.rb | 15 - .../spec/typhoeus/easy_factory_spec.rb | 143 - .../spec/typhoeus/errors/no_stub_spec.rb | 13 - .../spec/typhoeus/expectation_spec.rb | 280 - .../spec/typhoeus/hydra/addable_spec.rb | 22 - .../spec/typhoeus/hydra/before_spec.rb | 98 - .../typhoeus/hydra/block_connection_spec.rb | 18 - .../spec/typhoeus/hydra/cacheable_spec.rb | 88 - .../spec/typhoeus/hydra/memoizable_spec.rb | 53 - .../spec/typhoeus/hydra/queueable_spec.rb | 98 - .../spec/typhoeus/hydra/runnable_spec.rb | 137 - .../spec/typhoeus/hydra/stubbable_spec.rb | 48 - .../spec/typhoeus/hydra_spec.rb | 22 - .../typhoeus-1.4.0/spec/typhoeus/pool_spec.rb | 137 - .../spec/typhoeus/request/actions_spec.rb | 19 - .../spec/typhoeus/request/before_spec.rb | 93 - .../typhoeus/request/block_connection_spec.rb | 75 - .../spec/typhoeus/request/cacheable_spec.rb | 94 - .../spec/typhoeus/request/callbacks_spec.rb | 91 - .../spec/typhoeus/request/marshal_spec.rb | 60 - .../spec/typhoeus/request/memoizable_spec.rb | 34 - .../spec/typhoeus/request/operations_spec.rb | 101 - .../typhoeus/request/responseable_spec.rb | 13 - .../spec/typhoeus/request/stubbable_spec.rb | 45 - .../spec/typhoeus/request_spec.rb | 232 - .../spec/typhoeus/response/header_spec.rb | 147 - .../typhoeus/response/informations_spec.rb | 283 - .../spec/typhoeus/response/status_spec.rb | 256 - .../spec/typhoeus/response_spec.rb | 100 - .../gems/typhoeus-1.4.0/spec/typhoeus_spec.rb | 105 - .../gems/typhoeus-1.4.0/typhoeus.gemspec | 25 - .../ruby/2.7.0/gems/tzinfo-2.0.6/.yardopts | 9 - .../ruby/2.7.0/gems/tzinfo-2.0.6/CHANGES.md | 1026 -- .../ruby/2.7.0/gems/tzinfo-2.0.6/LICENSE | 19 - .../ruby/2.7.0/gems/tzinfo-2.0.6/README.md | 406 - .../ruby/2.7.0/gems/xcodeproj-1.22.0/LICENSE | 19 - .../2.7.0/gems/xcodeproj-1.22.0/README.md | 95 - .../2.7.0/gems/xcodeproj-1.22.0/bin/xcodeproj | 10 - .../CFPropertyList-3.0.6.gemspec | 40 - .../activesupport-7.0.4.3.gemspec | 39 - .../specifications/addressable-2.8.4.gemspec | 37 - .../algoliasearch-1.27.5.gemspec | 42 - .../2.7.0/specifications/atomos-0.1.3.gemspec | 37 - .../2.7.0/specifications/claide-1.1.0.gemspec | 20 - .../specifications/cocoapods-1.12.1.gemspec | 71 - .../cocoapods-core-1.12.1.gemspec | 49 - .../cocoapods-deintegrate-1.0.5.gemspec | 20 - .../cocoapods-downloader-1.6.3.gemspec | 20 - .../cocoapods-plugins-1.0.0.gemspec | 34 - .../cocoapods-search-1.0.1.gemspec | 32 - .../cocoapods-trunk-1.6.0.gemspec | 36 - .../cocoapods-try-1.2.0.gemspec | 30 - .../specifications/colored2-3.1.2.gemspec | 35 - .../concurrent-ruby-1.2.2.gemspec | 24 - .../2.7.0/specifications/escape-0.0.4.gemspec | 22 - .../2.7.0/specifications/ethon-0.16.0.gemspec | 30 - .../2.7.0/specifications/ffi-1.15.5.gemspec | 42 - .../specifications/fourflusher-2.3.1.gemspec | 36 - .../specifications/fuzzy_match-2.0.4.gemspec | 51 - .../specifications/gh_inspector-1.1.3.gemspec | 40 - .../specifications/httpclient-2.8.3.gemspec | 21 - .../2.7.0/specifications/i18n-1.13.0.gemspec | 32 - .../2.7.0/specifications/json-2.6.3.gemspec | Bin 1720 -> 0 bytes .../specifications/minitest-5.18.0.gemspec | 38 - .../specifications/molinillo-0.8.0.gemspec | 30 - .../specifications/nanaimo-0.3.0.gemspec | 34 - .../2.7.0/specifications/nap-1.1.0.gemspec | 35 - .../2.7.0/specifications/netrc-0.11.0.gemspec | 30 - .../public_suffix-4.0.7.gemspec | 24 - .../2.7.0/specifications/rexml-3.2.5.gemspec | 38 - .../specifications/ruby-macho-2.5.1.gemspec | 21 - .../specifications/typhoeus-1.4.0.gemspec | 30 - .../2.7.0/specifications/tzinfo-2.0.6.gemspec | 36 - .../specifications/xcodeproj-1.22.0.gemspec | 43 - 1128 files changed, 214737 deletions(-) delete mode 100755 example/vendor/bundle/ruby/2.7.0/bin/fuzzy_match delete mode 100755 example/vendor/bundle/ruby/2.7.0/bin/httpclient delete mode 100755 example/vendor/bundle/ruby/2.7.0/bin/pod delete mode 100755 example/vendor/bundle/ruby/2.7.0/bin/sandbox-pod delete mode 100755 example/vendor/bundle/ruby/2.7.0/bin/xcodeproj delete mode 100644 example/vendor/bundle/ruby/2.7.0/cache/CFPropertyList-3.0.6.gem delete mode 100644 example/vendor/bundle/ruby/2.7.0/cache/activesupport-7.0.4.3.gem delete mode 100644 example/vendor/bundle/ruby/2.7.0/cache/addressable-2.8.4.gem delete mode 100644 example/vendor/bundle/ruby/2.7.0/cache/algoliasearch-1.27.5.gem delete mode 100644 example/vendor/bundle/ruby/2.7.0/cache/atomos-0.1.3.gem delete mode 100644 example/vendor/bundle/ruby/2.7.0/cache/claide-1.1.0.gem delete mode 100644 example/vendor/bundle/ruby/2.7.0/cache/cocoapods-1.12.1.gem delete mode 100644 example/vendor/bundle/ruby/2.7.0/cache/cocoapods-core-1.12.1.gem delete mode 100644 example/vendor/bundle/ruby/2.7.0/cache/cocoapods-deintegrate-1.0.5.gem delete mode 100644 example/vendor/bundle/ruby/2.7.0/cache/cocoapods-downloader-1.6.3.gem delete mode 100644 example/vendor/bundle/ruby/2.7.0/cache/cocoapods-plugins-1.0.0.gem delete mode 100644 example/vendor/bundle/ruby/2.7.0/cache/cocoapods-search-1.0.1.gem delete mode 100644 example/vendor/bundle/ruby/2.7.0/cache/cocoapods-trunk-1.6.0.gem delete mode 100644 example/vendor/bundle/ruby/2.7.0/cache/cocoapods-try-1.2.0.gem delete mode 100644 example/vendor/bundle/ruby/2.7.0/cache/colored2-3.1.2.gem delete mode 100644 example/vendor/bundle/ruby/2.7.0/cache/concurrent-ruby-1.2.2.gem delete mode 100644 example/vendor/bundle/ruby/2.7.0/cache/escape-0.0.4.gem delete mode 100644 example/vendor/bundle/ruby/2.7.0/cache/ethon-0.16.0.gem delete mode 100644 example/vendor/bundle/ruby/2.7.0/cache/ffi-1.15.5.gem delete mode 100644 example/vendor/bundle/ruby/2.7.0/cache/fourflusher-2.3.1.gem delete mode 100644 example/vendor/bundle/ruby/2.7.0/cache/fuzzy_match-2.0.4.gem delete mode 100644 example/vendor/bundle/ruby/2.7.0/cache/gh_inspector-1.1.3.gem delete mode 100644 example/vendor/bundle/ruby/2.7.0/cache/httpclient-2.8.3.gem delete mode 100644 example/vendor/bundle/ruby/2.7.0/cache/i18n-1.13.0.gem delete mode 100644 example/vendor/bundle/ruby/2.7.0/cache/json-2.6.3.gem delete mode 100644 example/vendor/bundle/ruby/2.7.0/cache/minitest-5.18.0.gem delete mode 100644 example/vendor/bundle/ruby/2.7.0/cache/molinillo-0.8.0.gem delete mode 100644 example/vendor/bundle/ruby/2.7.0/cache/nanaimo-0.3.0.gem delete mode 100644 example/vendor/bundle/ruby/2.7.0/cache/nap-1.1.0.gem delete mode 100644 example/vendor/bundle/ruby/2.7.0/cache/netrc-0.11.0.gem delete mode 100644 example/vendor/bundle/ruby/2.7.0/cache/public_suffix-4.0.7.gem delete mode 100644 example/vendor/bundle/ruby/2.7.0/cache/rexml-3.2.5.gem delete mode 100644 example/vendor/bundle/ruby/2.7.0/cache/ruby-macho-2.5.1.gem delete mode 100644 example/vendor/bundle/ruby/2.7.0/cache/typhoeus-1.4.0.gem delete mode 100644 example/vendor/bundle/ruby/2.7.0/cache/tzinfo-2.0.6.gem delete mode 100644 example/vendor/bundle/ruby/2.7.0/cache/xcodeproj-1.22.0.gem delete mode 100755 example/vendor/bundle/ruby/2.7.0/extensions/arm64-darwin-22/2.7.0/ffi-1.15.5/ffi_c.bundle delete mode 100644 example/vendor/bundle/ruby/2.7.0/extensions/arm64-darwin-22/2.7.0/ffi-1.15.5/gem.build_complete delete mode 100644 example/vendor/bundle/ruby/2.7.0/extensions/arm64-darwin-22/2.7.0/ffi-1.15.5/gem_make.out delete mode 100644 example/vendor/bundle/ruby/2.7.0/extensions/arm64-darwin-22/2.7.0/ffi-1.15.5/mkmf.log delete mode 100644 example/vendor/bundle/ruby/2.7.0/extensions/arm64-darwin-22/2.7.0/json-2.6.3/gem.build_complete delete mode 100644 example/vendor/bundle/ruby/2.7.0/extensions/arm64-darwin-22/2.7.0/json-2.6.3/gem_make.out delete mode 100755 example/vendor/bundle/ruby/2.7.0/extensions/arm64-darwin-22/2.7.0/json-2.6.3/json/ext/generator.bundle delete mode 100755 example/vendor/bundle/ruby/2.7.0/extensions/arm64-darwin-22/2.7.0/json-2.6.3/json/ext/parser.bundle delete mode 100644 example/vendor/bundle/ruby/2.7.0/extensions/arm64-darwin-22/2.7.0/json-2.6.3/mkmf.log delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/CFPropertyList-3.0.6/LICENSE delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/CFPropertyList-3.0.6/README.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/CFPropertyList-3.0.6/README.rdoc delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/CFPropertyList-3.0.6/THANKS delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.4.3/CHANGELOG.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.4.3/MIT-LICENSE delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.4.3/README.rdoc delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/CHANGELOG.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/Gemfile delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/LICENSE.txt delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/README.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/Rakefile delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/addressable.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/data/unicode.data delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/spec/addressable/idna_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/spec/addressable/net_http_compat_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/spec/addressable/security_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/spec/addressable/template_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/spec/addressable/uri_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/spec/spec_helper.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/tasks/clobber.rake delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/tasks/gem.rake delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/tasks/git.rake delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/tasks/metrics.rake delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/tasks/profile.rake delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/tasks/rspec.rake delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/tasks/yard.rake delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/.rspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/.travis.yml delete mode 100755 example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/CHANGELOG.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/Gemfile delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/Gemfile.lock delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/LICENSE delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/README.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/Rakefile delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/algoliasearch.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/contacts.json delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/resources/ca-bundle.crt delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/spec/account_client_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/spec/client_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/spec/mock_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/spec/spec_helper.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/spec/stub_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/.gitignore delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/.rspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/.rubocop.yml delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/.rubocop_todo.yml delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/.travis.yml delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/CODE_OF_CONDUCT.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/Gemfile delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/Gemfile.lock delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/LICENSE.txt delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/README.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/Rakefile delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/VERSION delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/atomos.gemspec delete mode 100755 example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/bin/console delete mode 100755 example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/bin/rake delete mode 100755 example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/bin/rspec delete mode 100755 example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/bin/rubocop delete mode 100755 example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/bin/setup delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/.github/workflows/ci.yml delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/.gitignore delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/.kick delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/.rubocop.yml delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/.rubocop_cocoapods.yml delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/.rubocop_todo.yml delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/.yardopts delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/CHANGELOG.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/Gemfile delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/Gemfile.lock delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/LICENSE delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/README.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/Rakefile delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/claide.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-1.12.1/CHANGELOG.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-1.12.1/LICENSE delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-1.12.1/README.md delete mode 100755 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-1.12.1/bin/pod delete mode 100755 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-1.12.1/bin/sandbox-pod delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-core-1.12.1/LICENSE delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-core-1.12.1/README.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-deintegrate-1.0.5/LICENSE delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-deintegrate-1.0.5/README.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-downloader-1.6.3/LICENSE delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-downloader-1.6.3/README.markdown delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/.gitignore delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/.rubocop.yml delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/.rubocop_cocoapods.yml delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/.travis.yml delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/CHANGELOG.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/Gemfile delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/Gemfile.lock delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/LICENSE delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/README.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/Rakefile delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/cocoapods-plugins.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/plugins.json delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/command/gem_helper_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/command/gem_index_cache_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/command/plugins/create_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/command/plugins/installed_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/command/plugins/list_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/command/plugins/publish_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/command/plugins/search_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/command/plugins_helper_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/command/plugins_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/fixtures/cocoapods-foo1.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/fixtures/cocoapods-foo2.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/fixtures/plugins.json delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/fixtures/unprefixed.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/spec_helper.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/.github/workflows/Specs.yml delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/.gitignore delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/CHANGELOG.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/Gemfile delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/Gemfile.lock delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/LICENSE.txt delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/README.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/Rakefile delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/cocoapods-search.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/command/search_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/fixtures/spec-repos/test_repo/BananaLib/1.0/BananaLib.podspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/fixtures/spec-repos/test_repo/JSONKit/1.4/JSONKit.podspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/fixtures/spec-repos/test_repo/JSONKit/999.999.999/JSONKit.podspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/fixtures/spec-repos/test_repo/OrangeFramework/0.1.0/OrangeFramework.podspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/fixtures/spec-repos/test_repo/Pod+With+Plus+Signs/1.0/Pod+With+Plus+Signs.podspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/fixtures/spec-repos/test_repo/Realm/0.94/Realm.podspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/fixtures/spec-repos/test_repo/monkey/1.0.2/monkey.podspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/spec_helper.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/spec_helper/command.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/spec_helper/fixture.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/spec_helper/pre_flight.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/spec_helper/temporary_repos.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/spec_helper/user_interface.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/.github/workflows/ci.yml delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/.gitignore delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/.kick delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/.rubocop.yml delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/.rubocop_cocoapods.yml delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/.rubocop_todo.yml delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/CHANGELOG.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/Gemfile delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/Gemfile.lock delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/LICENSE.txt delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/README.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/Rakefile delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/cocoapods-trunk.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/command/trunk/addowner_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/command/trunk/delete_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/command/trunk/deprecate_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/command/trunk/info_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/command/trunk/me_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/command/trunk/push_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/command/trunk/register_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/command/trunk/remove_owner_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/command/trunk_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/fixtures/BananaLib.podspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/spec_helper.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/.gitignore delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/.rubocop.yml delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/.rubocop_cocoapods.yml delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/.rubocop_todo.yml delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/.travis.yml delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/CHANGELOG.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/Gemfile delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/Gemfile.lock delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/LICENSE delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/README.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/Rakefile delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/cocoapods-try.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/spec/command/try_settings_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/spec/command/try_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/spec/spec_helper.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/colored2-3.1.2/LICENSE delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/colored2-3.1.2/README.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/colored2-3.1.2/Rakefile delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/colored2-3.1.2/spec/colored2/numbers_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/colored2-3.1.2/spec/colored2/object_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/colored2-3.1.2/spec/colored2/strings_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/colored2-3.1.2/spec/colored2_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/colored2-3.1.2/spec/spec_helper.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/CHANGELOG.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/Gemfile delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/LICENSE.txt delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/README.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/Rakefile delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/ConcurrentRubyService.java delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/AtomicReferenceLibrary.java delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/JRubyMapBackendLibrary.java delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/JavaAtomicBooleanLibrary.java delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/JavaAtomicFixnumLibrary.java delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/JavaSemaphoreLibrary.java delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/SynchronizationLibrary.java delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/ConcurrentHashMap.java delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/ConcurrentHashMapV8.java delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/LongAdder.java delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/Striped64.java delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/nounsafe/ConcurrentHashMapV8.java delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/nounsafe/LongAdder.java delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/nounsafe/Striped64.java delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166y/ThreadLocalRandom.java delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/escape-0.0.4/Readme delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/escape-0.0.4/doc_include/template/qualitysmith.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/.github/workflows/ruby.yml delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/.gitignore delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/.rspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/CHANGELOG.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/Gemfile delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/Guardfile delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/LICENSE delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/README.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/Rakefile delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/ethon.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/profile/benchmarks.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/profile/memory_leaks.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/profile/perf_spec_helper.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/profile/support/memory_test_helpers.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/profile/support/os_memory_leak_tracker.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/profile/support/ruby_object_leak_tracker.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/curl_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/callbacks_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/debug_info_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/features_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/form_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/header_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/http/custom_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/http/delete_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/http/get_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/http/head_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/http/options_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/http/patch_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/http/post_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/http/put_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/http_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/informations_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/mirror_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/operations_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/options_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/queryable_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/response_callbacks_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/util_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/libc_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/loggable_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/multi/operations_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/multi/options_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/multi/stack_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/multi_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/spec_helper.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/support/localhost_server.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/support/server.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/CHANGELOG.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/COPYING delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/Gemfile delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/LICENSE delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/LICENSE.SPECS delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/README.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/Rakefile delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/.sitearchdir.time delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/AbstractMemory.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/AbstractMemory.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/AbstractMemory.o delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/ArrayType.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/ArrayType.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/ArrayType.o delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Buffer.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Buffer.o delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Call.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Call.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Call.o delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/ClosurePool.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/ClosurePool.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/ClosurePool.o delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/DynamicLibrary.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/DynamicLibrary.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/DynamicLibrary.o delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Function.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Function.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Function.o delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/FunctionInfo.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/FunctionInfo.o delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/LastError.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/LastError.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/LastError.o delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/LongDouble.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/LongDouble.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/LongDouble.o delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Makefile delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/MappedType.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/MappedType.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/MappedType.o delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/MemoryPointer.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/MemoryPointer.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/MemoryPointer.o delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/MethodHandle.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/MethodHandle.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/MethodHandle.o delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Platform.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Platform.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Platform.o delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Pointer.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Pointer.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Pointer.o delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Struct.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Struct.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Struct.o delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/StructByValue.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/StructByValue.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/StructByValue.o delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/StructLayout.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/StructLayout.o delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Thread.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Thread.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Thread.o delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Type.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Type.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Type.o delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Types.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Types.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Types.o delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Variadic.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Variadic.o delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/compat.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/extconf.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/extconf.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/ffi.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/ffi.o delete mode 100755 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/ffi_c.bundle delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi.bsd.mk delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi.darwin.mk delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi.gnu.mk delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi.mk delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi.vc.mk delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi.vc64.mk delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.appveyor.yml delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.gitattributes delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.github/issue_template.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.gitignore delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis.yml delete mode 100755 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis/ar-lib delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis/bfin-sim.exp delete mode 100755 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis/build-cross-in-container.sh delete mode 100755 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis/build-in-container.sh delete mode 100755 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis/build.sh delete mode 100755 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis/compile delete mode 100755 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis/install.sh delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis/m32r-sim.exp delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis/moxie-sim.exp delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis/or1k-sim.exp delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis/powerpc-eabisim.exp delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis/site.exp delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis/wine-sim.exp delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/ChangeLog.old delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/LICENSE delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/LICENSE-BUILDTOOLS delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/Makefile.am delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/README.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/acinclude.m4 delete mode 100755 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/autogen.sh delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/config.guess delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/config.sub delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/configure.ac delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/configure.host delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/doc/Makefile.am delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/doc/libffi.texi delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/doc/version.texi delete mode 100755 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/generate-darwin-source-and-headers.py delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/include/Makefile.am delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/include/ffi.h.in delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/include/ffi_cfi.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/include/ffi_common.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/libffi.map.in delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/libffi.pc.in delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/libtool-version delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/asmcfi.m4 delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/ax_append_flag.m4 delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/ax_check_compile_flag.m4 delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/ax_configure_args.m4 delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4 delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/ax_require_defined.m4 delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/make_sunver.pl delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/man/Makefile.am delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/man/ffi.3 delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/man/ffi_call.3 delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/man/ffi_prep_cif.3 delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/man/ffi_prep_cif_var.3 delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.sln delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.filters delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.user delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/ffi.h delete mode 100755 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/msvcc.sh delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/aarch64/ffi.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/aarch64/ffitarget.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/aarch64/internal.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/aarch64/sysv.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/aarch64/win64_armasm.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/alpha/ffi.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/alpha/ffitarget.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/alpha/internal.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/alpha/osf.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/arc/arcompact.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/arc/ffi.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/arc/ffitarget.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/arm/ffi.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/arm/ffitarget.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/arm/internal.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/arm/sysv.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/arm/sysv_msvc_arm32.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/avr32/ffi.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/avr32/ffitarget.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/avr32/sysv.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/bfin/ffi.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/bfin/ffitarget.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/bfin/sysv.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/closures.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/cris/ffi.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/cris/ffitarget.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/cris/sysv.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/csky/ffi.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/csky/ffitarget.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/csky/sysv.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/debug.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/dlmalloc.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/frv/eabi.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/frv/ffi.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/frv/ffitarget.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/ia64/ffi.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/ia64/ffitarget.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/ia64/ia64_flags.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/ia64/unix.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/java_raw_api.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/kvx/asm.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/kvx/ffi.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/kvx/ffitarget.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/kvx/sysv.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/m32r/ffi.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/m32r/ffitarget.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/m32r/sysv.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/m68k/ffi.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/m68k/ffitarget.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/m68k/sysv.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/m88k/ffi.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/m88k/ffitarget.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/m88k/obsd.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/metag/ffi.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/metag/ffitarget.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/metag/sysv.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/microblaze/ffi.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/microblaze/ffitarget.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/microblaze/sysv.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/mips/ffi.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/mips/ffitarget.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/mips/n32.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/mips/o32.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/moxie/eabi.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/moxie/ffi.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/moxie/ffitarget.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/nios2/ffi.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/nios2/ffitarget.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/nios2/sysv.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/or1k/ffi.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/or1k/ffitarget.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/or1k/sysv.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/pa/ffi.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/pa/ffitarget.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/pa/hpux32.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/pa/linux.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/aix.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/aix_closure.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/asm.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/darwin.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/darwin_closure.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/ffi.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/ffi_sysv.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/ffitarget.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/linux64.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/linux64_closure.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/ppc_closure.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/sysv.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/prep_cif.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/raw_api.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/riscv/ffi.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/riscv/ffitarget.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/riscv/sysv.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/s390/ffi.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/s390/ffitarget.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/s390/internal.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/s390/sysv.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sh/ffi.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sh/ffitarget.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sh/sysv.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sh64/ffi.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sh64/ffitarget.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sh64/sysv.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sparc/ffi.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sparc/ffi64.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sparc/ffitarget.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sparc/internal.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sparc/v8.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sparc/v9.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/tile/ffi.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/tile/ffitarget.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/tile/tile.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/types.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/vax/elfbsd.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/vax/ffi.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/vax/ffitarget.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/asmnames.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/ffi.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/ffi64.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/ffitarget.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/ffiw64.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/internal.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/internal64.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/sysv.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/sysv_intel.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/unix64.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/win64.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/win64_intel.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/xtensa/ffi.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/xtensa/ffitarget.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/xtensa/sysv.S delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/stamp-h.in delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/Makefile.am delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/config/default.exp delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.bhaible/Makefile delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.bhaible/README delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.bhaible/alignof.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.bhaible/bhaible.exp delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-callback.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.bhaible/testcases.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/align_mixed.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/align_stdcall.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/call.exp delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/float.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/float1.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/float2.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/float3.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/float4.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/many.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/many2.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/many_double.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/many_mixed.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/negint.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/offsets.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/pr1172638.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/promotion.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/pyobjc-tc.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl1.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl2.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_fl.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_fl1.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_fl2.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_fl3.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_ll.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/struct10.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/uninitialized.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/closure.exp delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn0.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn1.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn2.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn3.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn4.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn5.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn6.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/closure_loc_fn0.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/closure_simple.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_12byte.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_16byte.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_18byte.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_19byte.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_1_1byte.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_20byte.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_20byte1.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_24byte.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_2byte.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3_1byte.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3byte1.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3byte2.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3float.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_4_1byte.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_4byte.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_5_1_byte.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_5byte.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_64byte.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_6_1_byte.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_6byte.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_7_1_byte.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_7byte.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_8byte.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_9byte1.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_9byte2.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_double.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_float.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble_split.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble_split2.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_pointer.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint16.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint32.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint64.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint16.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint32.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint64.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_dbls_struct.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_double.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_double_va.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_float.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_longdouble.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_longdouble_va.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_many_mixed_args.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_many_mixed_float_double.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_schar.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_sshort.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_sshortchar.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_uchar.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_ushort.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_ushortchar.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_pointer.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_pointer_stack.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_schar.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_sint.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_sshort.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_struct_va1.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uchar.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uchar_va.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint_va.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulong_va.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulonglong.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ushort.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ushort_va.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/err_bad_abi.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/ffitest.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/huge_struct.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct1.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct10.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct11.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct2.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct3.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct4.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct5.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct6.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct7.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct8.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct9.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/problem1.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/stret_large.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/stret_large2.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/stret_medium.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/stret_medium2.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/testclosure.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/unwindtest.cc delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/unwindtest_ffi_call.cc delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex.inc delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_double.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_float.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_longdouble.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex.inc delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_double.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_float.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_longdouble.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct.inc delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_double.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_float.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_longdouble.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va.inc delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_double.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_float.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_longdouble.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/complex.exp delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/complex.inc delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_double.inc delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_float.inc delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_longdouble.inc delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/complex_double.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/complex_float.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/complex_int.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/complex_longdouble.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/ffitest.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex.inc delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_double.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_float.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_longdouble.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex.inc delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1.inc delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_double.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_float.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_longdouble.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2.inc delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_double.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_float.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_longdouble.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_double.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_float.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_longdouble.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.go/aa-direct.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.go/closure1.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.go/ffitest.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.go/go.exp delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.go/static-chain.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/rbffi.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/rbffi_endian.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ffi.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/rakelib/ffi_gem_helper.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/samples/getlogin.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/samples/getpid.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/samples/gettimeofday.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/samples/hello.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/samples/inotify.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/samples/pty.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/samples/qsort.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/.gitignore delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/.rubocop.yml delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/.travis.yml delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/CHANGELOG.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/Gemfile delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/Gemfile.lock delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/LICENSE.txt delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/README.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/Rakefile delete mode 100755 example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/bin/console delete mode 100755 example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/bin/setup delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/fourflusher.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/.gitignore delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/.rspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/CHANGELOG delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/Gemfile delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/LICENSE delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/README.markdown delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/Rakefile delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/THANKS-WILLIAM-JAMES.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/benchmark/before-with-free.txt delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/benchmark/before-without-last-result.txt delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/benchmark/before.txt delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/benchmark/memory.rb delete mode 100755 example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/bin/fuzzy_match delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/fuzzy_match.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/groupings-screenshot.png delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/highlevel.graffle delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/highlevel.png delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/spec/amatch_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/spec/cache_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/spec/foo.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/spec/fuzzy_match_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/spec/grouping_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/spec/identity_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/spec/record_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/spec/spec_helper.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/.gitignore delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/.rspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/.rubocop.yml delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/.travis.yml delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/CHANGELOG.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/Gemfile delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/LICENSE delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/README.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/Rakefile delete mode 100755 example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/bin/console delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/bin/setup delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/gh_inspector.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/README.md delete mode 100755 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/bin/httpclient delete mode 100755 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/bin/jsonclient delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/async.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/auth.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/cookie.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/dav.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/howto.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/jsonclient.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/oauth_buzz.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/oauth_friendfeed.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/oauth_twitter.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/ssl/0cert.pem delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/ssl/0key.pem delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/ssl/1000cert.pem delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/ssl/1000key.pem delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/ssl/htdocs/index.html delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/ssl/ssl_client.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/ssl/webrick_httpsd.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/stream.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/thread.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/wcat.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/ca-chain.pem delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/ca.cert delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/client-pass.key delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/client.cert delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/client.key delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/helper.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/htdigest delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/htpasswd delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/jruby_ssl_socket/test_pemutils.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/runner.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/server.cert delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/server.key delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/sslsvr.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/subca.cert delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/test_auth.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/test_cookie.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/test_hexdump.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/test_http-access2.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/test_httpclient.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/test_include_client.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/test_jsonclient.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/test_ssl.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/test_webagent-cookie.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/i18n-1.13.0/MIT-LICENSE delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/i18n-1.13.0/README.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/CHANGES.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/LICENSE delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/README.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/VERSION delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/Makefile delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/fbuffer/fbuffer.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/generator/.sitearchdir.-.json.-.ext.time delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/generator/Makefile delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/generator/depend delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/generator/extconf.rb delete mode 100755 example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/generator/generator.bundle delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/generator/generator.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/generator/generator.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/generator/generator.o delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/parser/.sitearchdir.-.json.-.ext.time delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/parser/Makefile delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/parser/depend delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/parser/extconf.rb delete mode 100755 example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/parser/parser.bundle delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/parser/parser.c delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/parser/parser.h delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/parser/parser.o delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/parser/parser.rl delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/extconf.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/json.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/.autotest delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/History.rdoc delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/Manifest.txt delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/README.rdoc delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/Rakefile delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/design_rationale.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/test/minitest/metametameta.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/test/minitest/test_minitest_assertions.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/test/minitest/test_minitest_benchmark.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/test/minitest/test_minitest_mock.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/test/minitest/test_minitest_reporter.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/test/minitest/test_minitest_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/test/minitest/test_minitest_test.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/test/minitest/test_minitest_test_task.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/molinillo-0.8.0/ARCHITECTURE.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/molinillo-0.8.0/CHANGELOG.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/molinillo-0.8.0/LICENSE delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/molinillo-0.8.0/README.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/.gitignore delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/.rspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/.rubocop.yml delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/.rubocop_todo.yml delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/.travis.yml delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/CHANGELOG.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/CODE_OF_CONDUCT.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/Gemfile delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/Gemfile.lock delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/LICENSE.txt delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/README.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/Rakefile delete mode 100755 example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/bin/console delete mode 100755 example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/bin/setup delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/nanaimo.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/nap-1.1.0/LICENSE delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/nap-1.1.0/README.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/nap-1.1.0/support/cacert.pem delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/LICENSE.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/Readme.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/changelog.txt delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/data/default_only.netrc delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/data/login.netrc delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/data/newlineless.netrc delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/data/password.netrc delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/data/permissive.netrc delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/data/sample.netrc delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/data/sample_multi.netrc delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/data/sample_multi_with_default.netrc delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/data/sample_with_default.netrc delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/test/test_lex.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/test/test_netrc.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/test/test_parse.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/.github/FUNDING.yml delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/.github/dependabot.yml delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/.github/workflows/release.yml delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/.github/workflows/tests.yml delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/.gitignore delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/.rubocop.yml delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/.rubocop_opinionated.yml delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/.yardopts delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/2.0-Upgrade.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/CHANGELOG.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/Gemfile delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/LICENSE.txt delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/README.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/Rakefile delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/SECURITY.md delete mode 100755 example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/bin/console delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/data/list.txt delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/public_suffix.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/.empty delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/acceptance_test.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/benchmarks/bm_find.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/benchmarks/bm_find_all.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/benchmarks/bm_names.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/benchmarks/bm_select.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/benchmarks/bm_select_incremental.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/benchmarks/bm_valid.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/profilers/domain_profiler.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/profilers/find_profiler.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/profilers/find_profiler_jp.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/profilers/initialization_profiler.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/profilers/list_profsize.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/profilers/object_binsize.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/psl_test.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/test_helper.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/tests.txt delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/unit/domain_test.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/unit/errors_test.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/unit/list_test.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/unit/public_suffix_test.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/unit/rule_test.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/LICENSE.txt delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/NEWS.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/README.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/context.rdoc delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/child.rdoc delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/document.rdoc delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/element.rdoc delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/node.rdoc delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/parent.rdoc delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/child_toc.rdoc delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/document_toc.rdoc delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/element_toc.rdoc delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/master_toc.rdoc delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/node_toc.rdoc delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/parent_toc.rdoc delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ruby-macho-2.5.1/.yardopts delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ruby-macho-2.5.1/LICENSE delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/ruby-macho-2.5.1/README.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/.gitignore delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/.rspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/.travis.yml delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/CHANGELOG.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/CONTRIBUTING.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/Gemfile delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/Guardfile delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/LICENSE delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/README.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/Rakefile delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/UPGRADE.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/perf/profile.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/perf/vs_nethttp.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/rack/typhoeus/middleware/params_decoder/helper_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/rack/typhoeus/middleware/params_decoder_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/spec_helper.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/support/localhost_server.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/support/memory_cache.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/support/server.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/adapters/faraday_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/cache/dalli_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/cache/redis_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/config_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/easy_factory_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/errors/no_stub_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/expectation_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/addable_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/before_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/block_connection_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/cacheable_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/memoizable_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/queueable_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/runnable_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/stubbable_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/pool_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request/actions_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request/before_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request/block_connection_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request/cacheable_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request/callbacks_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request/marshal_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request/memoizable_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request/operations_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request/responseable_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request/stubbable_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/response/header_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/response/informations_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/response/status_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/response_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus_spec.rb delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/typhoeus.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/tzinfo-2.0.6/.yardopts delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/tzinfo-2.0.6/CHANGES.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/tzinfo-2.0.6/LICENSE delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/tzinfo-2.0.6/README.md delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/xcodeproj-1.22.0/LICENSE delete mode 100644 example/vendor/bundle/ruby/2.7.0/gems/xcodeproj-1.22.0/README.md delete mode 100755 example/vendor/bundle/ruby/2.7.0/gems/xcodeproj-1.22.0/bin/xcodeproj delete mode 100644 example/vendor/bundle/ruby/2.7.0/specifications/CFPropertyList-3.0.6.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/specifications/activesupport-7.0.4.3.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/specifications/addressable-2.8.4.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/specifications/algoliasearch-1.27.5.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/specifications/atomos-0.1.3.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/specifications/claide-1.1.0.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/specifications/cocoapods-1.12.1.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/specifications/cocoapods-core-1.12.1.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/specifications/cocoapods-deintegrate-1.0.5.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/specifications/cocoapods-downloader-1.6.3.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/specifications/cocoapods-plugins-1.0.0.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/specifications/cocoapods-search-1.0.1.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/specifications/cocoapods-trunk-1.6.0.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/specifications/cocoapods-try-1.2.0.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/specifications/colored2-3.1.2.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/specifications/concurrent-ruby-1.2.2.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/specifications/escape-0.0.4.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/specifications/ethon-0.16.0.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/specifications/ffi-1.15.5.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/specifications/fourflusher-2.3.1.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/specifications/fuzzy_match-2.0.4.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/specifications/gh_inspector-1.1.3.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/specifications/httpclient-2.8.3.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/specifications/i18n-1.13.0.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/specifications/json-2.6.3.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/specifications/minitest-5.18.0.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/specifications/molinillo-0.8.0.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/specifications/nanaimo-0.3.0.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/specifications/nap-1.1.0.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/specifications/netrc-0.11.0.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/specifications/public_suffix-4.0.7.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/specifications/rexml-3.2.5.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/specifications/ruby-macho-2.5.1.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/specifications/typhoeus-1.4.0.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/specifications/tzinfo-2.0.6.gemspec delete mode 100644 example/vendor/bundle/ruby/2.7.0/specifications/xcodeproj-1.22.0.gemspec diff --git a/example/vendor/bundle/ruby/2.7.0/bin/fuzzy_match b/example/vendor/bundle/ruby/2.7.0/bin/fuzzy_match deleted file mode 100755 index c340ac1..0000000 --- a/example/vendor/bundle/ruby/2.7.0/bin/fuzzy_match +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env ruby -# -# This file was generated by RubyGems. -# -# The application 'fuzzy_match' is installed as part of a gem, and -# this file is here to facilitate running it. -# - -require 'rubygems' - -version = ">= 0.a" - -str = ARGV.first -if str - str = str.b[/\A_(.*)_\z/, 1] - if str and Gem::Version.correct?(str) - version = str - ARGV.shift - end -end - -if Gem.respond_to?(:activate_bin_path) -load Gem.activate_bin_path('fuzzy_match', 'fuzzy_match', version) -else -gem "fuzzy_match", version -load Gem.bin_path("fuzzy_match", "fuzzy_match", version) -end diff --git a/example/vendor/bundle/ruby/2.7.0/bin/httpclient b/example/vendor/bundle/ruby/2.7.0/bin/httpclient deleted file mode 100755 index a37f4dd..0000000 --- a/example/vendor/bundle/ruby/2.7.0/bin/httpclient +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env ruby -# -# This file was generated by RubyGems. -# -# The application 'httpclient' is installed as part of a gem, and -# this file is here to facilitate running it. -# - -require 'rubygems' - -version = ">= 0.a" - -str = ARGV.first -if str - str = str.b[/\A_(.*)_\z/, 1] - if str and Gem::Version.correct?(str) - version = str - ARGV.shift - end -end - -if Gem.respond_to?(:activate_bin_path) -load Gem.activate_bin_path('httpclient', 'httpclient', version) -else -gem "httpclient", version -load Gem.bin_path("httpclient", "httpclient", version) -end diff --git a/example/vendor/bundle/ruby/2.7.0/bin/pod b/example/vendor/bundle/ruby/2.7.0/bin/pod deleted file mode 100755 index a713675..0000000 --- a/example/vendor/bundle/ruby/2.7.0/bin/pod +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env ruby -# -# This file was generated by RubyGems. -# -# The application 'cocoapods' is installed as part of a gem, and -# this file is here to facilitate running it. -# - -require 'rubygems' - -version = ">= 0.a" - -str = ARGV.first -if str - str = str.b[/\A_(.*)_\z/, 1] - if str and Gem::Version.correct?(str) - version = str - ARGV.shift - end -end - -if Gem.respond_to?(:activate_bin_path) -load Gem.activate_bin_path('cocoapods', 'pod', version) -else -gem "cocoapods", version -load Gem.bin_path("cocoapods", "pod", version) -end diff --git a/example/vendor/bundle/ruby/2.7.0/bin/sandbox-pod b/example/vendor/bundle/ruby/2.7.0/bin/sandbox-pod deleted file mode 100755 index fe7a92e..0000000 --- a/example/vendor/bundle/ruby/2.7.0/bin/sandbox-pod +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env ruby -# -# This file was generated by RubyGems. -# -# The application 'cocoapods' is installed as part of a gem, and -# this file is here to facilitate running it. -# - -require 'rubygems' - -version = ">= 0.a" - -str = ARGV.first -if str - str = str.b[/\A_(.*)_\z/, 1] - if str and Gem::Version.correct?(str) - version = str - ARGV.shift - end -end - -if Gem.respond_to?(:activate_bin_path) -load Gem.activate_bin_path('cocoapods', 'sandbox-pod', version) -else -gem "cocoapods", version -load Gem.bin_path("cocoapods", "sandbox-pod", version) -end diff --git a/example/vendor/bundle/ruby/2.7.0/bin/xcodeproj b/example/vendor/bundle/ruby/2.7.0/bin/xcodeproj deleted file mode 100755 index 8358e7d..0000000 --- a/example/vendor/bundle/ruby/2.7.0/bin/xcodeproj +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env ruby -# -# This file was generated by RubyGems. -# -# The application 'xcodeproj' is installed as part of a gem, and -# this file is here to facilitate running it. -# - -require 'rubygems' - -version = ">= 0.a" - -str = ARGV.first -if str - str = str.b[/\A_(.*)_\z/, 1] - if str and Gem::Version.correct?(str) - version = str - ARGV.shift - end -end - -if Gem.respond_to?(:activate_bin_path) -load Gem.activate_bin_path('xcodeproj', 'xcodeproj', version) -else -gem "xcodeproj", version -load Gem.bin_path("xcodeproj", "xcodeproj", version) -end diff --git a/example/vendor/bundle/ruby/2.7.0/cache/CFPropertyList-3.0.6.gem b/example/vendor/bundle/ruby/2.7.0/cache/CFPropertyList-3.0.6.gem deleted file mode 100644 index e377604a8ab1a0cde3260588bddd503f1996ae2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18432 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

E%Qz99S0=_&igeV~P=ort9-o~XQ%LkjCQ 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

  • gK$)t;5=;PMb=87Xs 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 diff --git a/example/vendor/bundle/ruby/2.7.0/cache/addressable-2.8.4.gem b/example/vendor/bundle/ruby/2.7.0/cache/addressable-2.8.4.gem deleted file mode 100644 index 2a26d0b3f764db5abab277e5d041925399df6364..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105984 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 b?1I%?Q}#a{yj1^z9}fI*;D-bMBnSQlNAQV? diff --git a/example/vendor/bundle/ruby/2.7.0/cache/algoliasearch-1.27.5.gem b/example/vendor/bundle/ruby/2.7.0/cache/algoliasearch-1.27.5.gem deleted file mode 100644 index 4e068e89d43fce5759e0d8625dcd1454e9c911ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 224768 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%0Aw{Y9NT1lXZBm{5fH(M;G&CBNWSp^)qE9(I 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�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 g$mR diff --git a/example/vendor/bundle/ruby/2.7.0/cache/atomos-0.1.3.gem b/example/vendor/bundle/ruby/2.7.0/cache/atomos-0.1.3.gem deleted file mode 100644 index c12e2f045f8ac20475b0cbeb5a20676c89d78170..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10240 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 diff --git a/example/vendor/bundle/ruby/2.7.0/cache/claide-1.1.0.gem b/example/vendor/bundle/ruby/2.7.0/cache/claide-1.1.0.gem deleted file mode 100644 index 6b0fb2d28f319e5b8d8c1d8e837d35cb1e4682bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28160 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 J@c&bR{{?y3$B_U4 diff --git a/example/vendor/bundle/ruby/2.7.0/cache/cocoapods-1.12.1.gem b/example/vendor/bundle/ruby/2.7.0/cache/cocoapods-1.12.1.gem deleted file mode 100644 index 7e00fd16cad596459b72ce34b3188e2ae26df0b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 296448 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⩔L+rifNtq2izk4IJ@{E(k=ZOijg8X<@Vt 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%0Dbe|9ukFXBRfu?cjbpI>+~A}Hzqs3l-X-Ac{7ZC zrL~q=PQ^{=E@Yl3ssY6teZ5`v+yTs#cwyg;lY;H#u&@W|S-gil5I;E%S~NMSiz#)8 zh2iXl>Zh6XU{^L_(!a-u3C=!05bZ{TIB(7U;P3OrV1X&l#8-V zNc6N$xK6bO-}GhM-9nr@+nI&{#<)+{4^2>AzHAynZD2a&f$2ZP=sd+JqF5X}eWi*G zQFkOkMzC5$`=u|2To&a6nZ+QVV9Zs(7;W>@gbhlkY%Q(wXNuoXIEqb?Wp@>MD)Z04 zbH;f&in^WDUPdzc@N6!~NMDKs$(gT2R5%S{RZMblJUEF1>d-x4X>@n`zRO}PbA{A7 zs4fjE8R@v;7U}Nru&@%pLIgTAaCXn494JUvz@*3hQ&UP_P5v4b88N`-nJn+Mlk@^H z(m9k)vvrp;8H$o7RYC zIAot+93H-zb2k3_!QN}h=d1Si(U2;5IveuSmi(^zbebyNLNNmD+DCPcBlM4OONV9b zDZ{Aec&OR`5@SJcRr_m*IW8LjxvWyj(Z@G!?Q+Rw!>RII5u#BG89^!J5;I*?xFJ>h zf>5+nM}b)ZpyOop7GV0@G%vyle2E@-VysLqA~)Odmqg4RrywbvFfU3nlU3bRdK88k z4?n98(FaZ=r84!Sm)dxsiHx0LO0m{92h$?Ps%`0I(6X#ZjH;4gYkuHd!0ZMl$W_6r zmMG{#I?RBD$fi`WY_Tg6pB(J<8lQ?bLAqBlF2v@1`s+w z+EHOrc~Vje6526Q`>D091iuSPG3c{!t^O?v;rH*9U#vnGO($(CIn6^3G18|+>)Hat z>SzGR%3_6WwU(gRHYA#yX%0p02A6Feqh|ona_x2;0P1qhOD}b$$g9}}Uf}8-)}(zN zVaFA&8{bsN2X6_2Yc~%PS_+OM(r!qHTw%P%$k!+L_l#z)yFkXlA;MHIp(VCeM>6$? ztGCg0ay&OEU;8cl@JqCoz_Az($MJ=LX{y~p#sW!V%xO?iwWNYJx@5R%%_A?e5P?u9 zWyyn5<>+OKlyHb5>3E&mmTRHjWh4rkBdo}lP!W=_15Tj$$YQ8aTd44Y;vDh0-8~IR z7ZmcsSiyAsMQ0KG-0js3(v2o;Je3+B_N=0@zG3Y1gQhj|j78qn z`2H-hQlA~4c@1jwK9Q^Q$vD6Gw&S@<5uxJB!>Z&CGq+5tIn`Hp?Na`U36g-}@RMn+ z%H{5IwQDOGohRzZ!?#s^1uvP51bwY}!rW!U3hKa|kn`&o`D4wJ817kBsi{M^@e_UP zqo4iq-8&TAVHvgu0}5d6XUPOO-BWUFkm?l~t}{@E-XzyvG23nnsn%9i(9ruGZ8GpQ z%6dtGf|5~xa6_&JCJhv5sA2{p9-k*!Iwl|8^C(MDN06(4J?@uOx0)Yeqb7@4n!fTF zMpuhK<|ZA$Oq++f1cYs2m+v{78}qX*Anl`A)*W-^P2I%9AxEB$P`W-#&n?-qFk+q} z7(;xDM2ND>F#r?PNvG3%G+RoxV;DLNgOS=^#G_IAYnqJ)2lN3MMj2du9rsUDu}U8a z`f9cIuw^$!m0^=^{O7-&e5 z+^4jYRD2smnU7in5SbP&0)O&ptH60F^|ZC2w-Ryn#K)GJ+=0Yiflu6is@F9i2S_`6vJ{<_HR#*AS%>TR@E2emv3gCOOx)ug4J5Lh2ylPfj z`sM(O(+-T?ZTI3KYMwA?0&5mG;ZZaM)Ynf)o`Q#Cpy&)xqI5c>^SR#5V~i9XM?qh; z9F|doYsk*S-j9)CY|h8myM<$553C_`C-9Z|Jf&SL7fh^C!r~H*|BnsS7s=6?CT%GhPYBZ2CGa4IzYt`S_pVl1B zfcmnd6aR6AmZ|>&E8H zh=T*#NY^lemJ(QNl^U1Y5v!zRStYl?v1FQoCYTzFxfi^;%)U^cpGW6*Xe2^vlI$Ij zP*|ylt4rjL2Mwu{`!(*N8co#sh~r{37VDj0pk-8avh$DC(fQLm{L^)3$2!7mPVQ@{ zANQsiX#llpB`~pyrm1X-ct6CHH-wH&Pc2!cezcU8Dj=m7_anUXC?d5==P9V#uXa%J zsI5fmZ;DHK>3fHs6na+iEbF12pxzLR8`iUVD!i&}2S7E)X<-{Qy%d+|tRu&2O7E0u zZXz3%AFS?={A8mO%zj-|8tO_bv~YcH)V%`l%a}5)ChE`75*#2QXYoj1=#>53Bs*}{ zWNtzj$#7d;Rb^oE#zKd-a7qXH@8->I?Z)&9TIB7UH_Kmr4;->e>E5*oqZ|+;$w%d8 zCSb=nijWq!6&?absc`pF$O_N;y2IFKIyhW-7;YwoJLPh~dUxcI=UDv}H?hn8QxXN_ zsqG%Cw@6X0IkqzElLe%0dCC@~NOK9&oJ3bVXx+lkWsaJS&RYTO|2i2~*hb<8R=Sy1 za!Lw>`^v6d%7!3gq6t%sH-kyzS()-f`iD@;4RXR%2{6ctkz+nk%5#Nvij+G_SC>MO zEU(oYS{u6Wk!a$OUG@-UpLEI{j>+|O{!feyVo6vzi#e(xqQwZu*GZK^r%ZX=nB>_J zuR>pYiyEZ?#=!>G)NFuBL1V{UkJ8zheMNCDQyCenWAj>$f3G6pP9AQ?f$rVb9X9F# zx7rll&5hQ5{taC6pW(qnOf*1u!TH{S6UW!RtzKPV^yA(^(DhZS4?M87FA*`MFw`T4 zqyZyF+1dI1t{Dm)7_in4rn_>DN$7^Mz5n#ZL3armbSc?WZDCVM#c@Kat8P2Z-#hDq zIaa%Y-po?Ai*xuyuN~z#>9%RD)bq-Pv!Un8pC!~upVf~|=ztLIE42gapO zFa<`TAa=-)j62JjN4a?udcAqmqqR(VAdIVWDeFvov;kQ;H)mG6Q{1yXJDPDB5z^* z&H&&_=?cZ#4K|pOs$iljLOS$OrCbYuMsiV}r~M?7AtIVeO0c>%T-`Q7)m?(hSyg`) z_~_~@-(2*IjM|q6vUt>Ek<*QEb51=%%j8_F2yk&mFBlQ>z$L-XA~q>^D2?dZ{%;J@N9DXhG=~e7N4wnqBhsvHSGBu6@Tv!*u?;xz70eh@`Q=Az9FZ8Ylch`b@85j{~G?4Y1^9|aEr?FSu z1R=2JICg?=+^VrP+LsG4HU7IzkZ%~ra=o*p9nUqqwGbNZa-EPIcxt%kfT!kMx?C{C z=q`<-f(3&lkgTIB83)`VqpG)IlEL*6+PBRB<<=3 zE3H8-f&c<_lCyFyb8rRPp8H&ZQEl43 zXNr}jq^waNX3s7#%-LYEZ(4$D)sqOEq)as{v`}o+IXtb=Om*4Gafds4S!$2B#2q*`aDX0( zl8NHWP=jm3vh*y!Bw_dx2fbn?>J>>`7CO}0y>#q8>I<{3d^wx`ugZtA%Jj~kQEo~* zE{l!&bT`Jv5tF4?asyNW+r1l@`rLX z)Kp?HU_;WK#qTL(V;PfDQ`wSit3YIhM=JA_jO~!EHDs9QiIW9=g0aLll<1z9)R{-7 z#T@mjSxKNK8cAy(bB=Xaq%&<)7H2c=#7)lZS)`qO;kAr)FvU+8}~PsW4zeWU4=);ap`2P7QpHpw`C zKS*UZFM8EzO2-xH>WX(gt)3`mlQ=g+52s^Jtp0zTU=>s3YXkyl6d;P0INy1V^Lpn=PDVstBJxrwUZi&Knlo*YK;APlGBPf|fc}|RB5}hn z@;~OE1D7;<+Y<6m!1bUH3cf1cY8~Qoxed8v6}h?QD3(wmQ9l4%l5*J+@_4<{cG z5Plt%4xFY~EybczvVEkW)N|v7c zz|2OmhWVl*DaK5j2#n@*IvR7ILI63q6IAI^z8ZvVGF~VgT~bGTI?NWCtg07>2c4aq zs8d`B)hZ2xkWKN7JL}q0u!vy7JL}2A$Dl_ z2)+sWIPN(x(|B}dllIk1gF`4AYM*+hke?8JIC~yIn#MvbX$@nzv*1sAxr0#o0#&%7 zcAJC_ZI~i9+ogY;G=@CT(9mvn>a#`qrqhGWnFqsowXeUHn-<}&x|zPHn6IYQ-#;#2 z{b4qHok~+_-Ez;Mkio1bcQNf4qQjLXE}zI`tQvv%qZoU|zGKYwx5HEClhtWupo*RR zgrZI~;rp#wZlU{Z=rWqdTnWG+-njfJ_Ju6lF{q|9Ha`c{r}DSHGTIdlhL;9_3`s<5 z2nTOD>xO!X@`P;+U2n#-iz$G?V$N@n+u^O?Bt!dfj=I$@%Hy(nquI=X>TEE0qAM(h znTh@cWsN~4ZV3+w?mi|@3r^Q0F%gKz9A|e?j!cE|EPHRpy?8IkY%BW~9BhGOp{cHz z9$(&T)@}-SG22P^6ZFk+oBEJ_If9Gjs5pKNUR+S@+FNP1(QOCUMO`ea<&v=iKwhcp z*B@bv9-(_*^{X-d3W!oYSObs7?1I5YX#ln6ty0$}#tXoH*%eW@@i?BG`i7cmF`!^u zqks~QeOj-pL($Bk=EtB=a2`H{EAdd2w4~w_lK=gUNeNTWVv1ME8eG5_Di{Ktr`b(T zafZ?;`LE4ouq^7=Iu{8({vjI)Cr-VQ{{Z?7{rOQvodi-)?|@|+K4L#cyl&(7nHvBR zbj642^uc@Ys?(7qF$Ygql|FwT+>-RUu54y@(E0w+qtWA^_y6t3$D^nJ_CFtuzJJsi zDw^q7>htegKN3^^ebd9l*6$W)iM7&vlvu&oNs4`aYo6?)I)0NZ`GzFliX$^lte3$? z;9zbhJ?lH8quX<3(M}s$YT(Q90ug$0|H6Oae}9PlOsbWZ#Kq#G&od?;N~DHse0oBEp6XTC4x zhKK~rIVb`1Yti8|EIN?V_UHuL#*s%M+q?_$B&gk%t^=AzYP2q6VAM!lYF~R=z+~(OC#f2%dMN1==DZ zp#@?M2Py;WccUYpgHBQZ@DOZDTuBkOI0o2$wG^PueU$7W z+atbS{lMFY{{<@fLn(U)y?y^p1!6;toJ{h8CsD0y7g$7vIDZ(5IeQc>@4&1V&45^5Z3DT@{>uyB&7IKTCB>y zvY6cPY$gsH4p_he3L4Ny7qvS23q?(PjROi#)Jx-jw>CkG84f2(IlRmxH0J@$1}~ae zM~jxXy`;=F1pgQWj?2ImW5Er`qtz7WB08JWlICexb&rf~p4rQ9XwWusZzLm@qlRFp zoI21hWyE3Ud#Omgj!htomB^!p)zt&{S^ZD}9o%HnF zb5Sxr8DmqzO+(2gwL=oQC593fb1%e5MQGO-kU$VJ*9;s8N=l#(3%m+C8(Hip{T=)BD-PFio9WWHZrhnW($n}F-Q0S7mW99j7Gzifod{0iceU%pn`& zq0ZZhs_fU(*~Rn*B+1&_jiYELu`9qQ_9E;KDNWsIcckI)vLl4SmO{TMkmwC*@@Q88;)E=CKf!c5gSr z$J4Lbl#05a{aj59NM@K=Q1a-IbRcr>tUP{=hrt3&3U~h&D|}r+K(CSn+Kk{x9|qHk z;uM989@Jx|PZ~SICD>%l$+V2RH0-&9u;g|{JACy>^q@W!IW&}4kIVI$QSM$?`M~dz z0L5!VMCpaTfS$EHU3NRU#h~i+;AR!o;%ea#Z%h+| zJnxC~_>XuM;PkNQ}Yx+59R>bQbd zb07^=3yc=bx^Y~|UhJGSVADk}9sk(G>hoJfl6}Z6T-Tp5adLM_Pk=^J7NF5Lo+& z9jO)>z*4H%d`+UWI{Ca6rM#$`yS)NmvTF~iL!@>qb&wzcI1ufqgFLM!hc=^Nh&Uez zzKCS>_f@$-S1Jm9RTmZ1q!20-FM!V-=nB8W{tQ-9p;11-F-|d{POT$h@-znL2pT|$ zCeaTVrL^7d_Ah{S?5Z?I?fPd*c3ab$6ULp26peAnevz@wFDDc!&@=6rjy^W45pzqx-41>FqUW}SZ zLdpGX+;Q|xhqy_nOnX=$gVaHGY~9+3%W`ksYW>Wk(Pm?ozC^5_337C}lF7`u!7kC- zn>D%ae)&D(2<^>ugFOU6BiJ9G8~43Yd*NP6uu|K2>@vZ6vlBlULMV=^w3yn%n5-61TGunIl3Hw~+lfvEHg*>8G1*{AKq zpHo^CZ8(?IXY+BS=M^woH^I%@ivyjS4uF^c3Iuyc9Jd4sHMag(lM6D}$B0ah4@phNn_mNbd7!T259>}?w0vBDP- zHH1e%w-hoDT`@L0+W2K8B>Zq-hjPd!WY9nKIIPCcLeJG6GOa+Qy_rU?4Y;RaMaU`y zsYEX1e)4A3t>2n?G%=C&%!EdTR^V#2YzVCN-e4hvrHM>4 zm`7S`C`R9F;p?q|c!xIxFfPHX;5hF7ng&#DH-1qiKAHbml?ww&XJ$@| zdCk5&-uB$}lpiljh{sJ2rI*+0R;^(TMn{+FF7AdSn(grPEkVjd4S8Vl<-pC399wI+ z9oV*OC(Nc+VB6q;4mu44Php6O7m)Q7j1C-)RBJ{>TYZB~bRMgF8^w^0`Oz3xWk(5* zR*zpCLB3y99M(o}rx9{dGn0TBF!NtODp5W?KABmr%}7bp6*LADjp8tAGseF~t)u{r z4q_&HhyXMf`~^re<+QHA-Ae676)uJitZl<1)~Yz8Bx)hAq(`6(v>Gu=K^2mi-yYM2 zh1=l{A0^7$^(1LoLv-eYQdmj`x$Qk;71aqTf*Td`ZUBLX4WexX-2plgZrJW_WJ>6S zXv=KG)MQ~FT-KF;@!#*!7(e+W>soFa_&D~b;d_dZ4pfXRxnlY~DDF`qDh zq+?uuzK8ug2hrpn>m-;ZQT9H63!_yg8*F;p?eg*Yr zbhvYpm5IuY>jQZK6 zpDo^t?r6m(JrgOu5cfh_B)^q@*=Z&Hm22lD6+(e&Z7C{D#g>sqK>fPIAk9FDEwY|BHQ_FbU2bcr+ysL!(nui&}T;*Yxbi{g>Z8 zeg4zv+sEJS|MKI@7XW;o4XPQY*zJ6g{}I60XZ2hB^TGZ6OZa>FMt}cjOi4JnfOs_h z(dX);>?%K5l;y8w3~)-vgAM&)xOP7FPHRCa;Kt>AGP^uykbIzT$Hy|u04HBgSp>OC zXMKn}ocm#J=-jPnR*U>096XhmkzKr!6z=#p8hY#p5jSBW{dQ$pcs=Ks$OQEsm*=8} zUJtL1emnB4Gttu$>o4d;ig&t0AnSmx4y1#U5_|4RyM_Q-pE^BP*HhmA#_GY(^X-({(5A&!A37Lo{ zcF-ve&Wqz&00?jZtcN&`<};4H44qKwOMx`y7t3NgE*4|M(SLChbQ5=x{gwo?&Fqz+ z{m%KS#*Ac#FdTIW9KwL`UmP|527^27Q|Ox>;h`5p&yT;@WbVcEF0+bD%-v3lc$GQ@ zrdp`&Z1TymEJ-`#^zQtS06-}G#_3``ZARd&CV*&pNw{5ZBz3vGC6V51q|!JAG5p&@ z1IKjOG{jBV>K6Aw^7O!Rhri7f&TIGcM!9^~_yI{zl)f0a0U^~m zrI?fSPQrcJmO21B{pNv8Z`O=PrljVSvFo9y_#Hs_(TSG$?vpp}x;;mHQ<1=2`-+-W zIzIm3Wm=|t>Ejf7Rw%_DV0?M@a+cL-@H@H0#{ahe(~s$>WwMYN9Uq!gJnGb{KU<>= zUAOSC!-DiFiNysl3^ab?xup1AJy(ittZl~8XjnE)C0vW;Y&^?!{%6RZr*3L>Zl++^ zEYt`Sq|ol@z#z>+qbr@lIMsx&EQQk#C{MyzeG ziuWdJQA1jtti`ECO&-D-EiOV#IURlSNp??g4-X@foKVb_54XLjp1kv^R-lzi8m{;e zQVi{2*we2@CzRRu^j&c=4dAJs>$BQB#1U)s(WUSTSa(gW$&mJvahsLSf~EwDu^3pl ztWf`=x;CNCN0;F{5OFr}aam17eK^jm#B^BgPfn8431RjEf|s4d*hJzYx2*3oZjo)^*9$gsf#g zrc`MD6ToCd!^f>+B75q%yjOp`SC0cajRV*u^^f6A?pO9iP&In&L?tA=j(`g@1LGlG zu=O49eXyx{opq$IuMU$qVR~rBXF*puutR1o>lNTNv_62Y7pW15i>yyI%$aE)xXji& z*`(2K3FQ`bvDw1a$(vLinN>ZMDvo=if}Rx08VG*ieQkCf{(7IeWiYqw)eY964i}a+0sl&2u6Qn9Dq<%rdG)=32+T!8bj^EhAU#|+)^x3cMmU-@H>f26TC2pP#LqA ztn#jyJjcZVCadI|n_(=r=jQ^i0vx^B5OOYjju8qa6x$Z%Kv4m#Ek4_+zWP;(1e1~p zs>Q@&sSHA3u0efPg6TtT12$7l=d0xi*tpgYtd{ZvML!p#a{5MX(V|u&&uB6`#V^XY zWegU=uT z$1hKwKmHb5RvW;!!(ZoU^KIAqC#vjDnOIHY1Z)f9ef`(0nsx!mwU@dm1tLyLu`XeA zkk^SzDQE+p?QoIsZ$^5w@3Yvankcd>$9v^B>(!1g_|o7z99KXi}lfcF&J+TC_RgY*!9xJVG;{p zHWE}j95x+nESw$u6l1~(Q*%9=m@2p)$&_U;xjgZs9|PulEb`k#SkXYWR2rk z;xa#6uxDodu>ih9z5Oi#Y`E(-O(N|H)b!mTH6U50t4SiAT`x5Z7W@QX;HTWBG3dvw zgR9WbVpzVMpn~=Nptr_iMq01%;&`Tg-__MS2R_(7?^GW*z;@lmCs z&u8OTuW`O+Y=H=kA>H)TqyIu(1;?S0jngDeqYc>&gp@Zlm?SVZ9p&ZTYd5s+vgd(n z*0XL~u5LvNsUN(S2LbLO3|+~9>Yt>>PvA(P$JVY`O2PekBnYjl1m?u0T1!l}xprY(2!T~ z*1=MIr9NW7RO|Uh7Ux!hQ8${etaO6_spNEHSg>~x6(vuAeWt+3d%*_!^H~>C#hd=H zVO56fw^20syuYDNn`@w{%jjj$P(c9gUz_R6D11`rA`gzRYGXw-aO=irPeUhE8f2z6 z-d~i3*)<>YNs3DIurqCT#l_|`p5CTninGfG*LZRhH*e^!r%772+5?Tgq3IMIb7z`X zX_14x($a;+#u8|SCjudIBp~P6)iw{Fp9)u~G9%Ux;nm}7GBA(~tQ~ORxzqmpJC8Mx z#&_<()GpK@%iLNs@Bf5DS|l_fQr+~~yJ1*p8yavafi(>nm2hs4J7Y6nltn$8MiqU~96GUs zsc41(EY7XwnDWSl04M1r%8>6kdush7A<`B7C{D|12_UU%2FL1M`MR8LE6H`cJUxwt z;v7xN^Td$}vP1_KfLKJ1@sEfd8{9&3bc}J3N4tWbz^?5ZRQe-S+3B*OMV*$_H{g<< z4_fPT_b)8I)}02%-Q+rCX72mu#PJy)AO&qpXGI?0XK^`(#ma-UgQGgrl_^l!O3(5nSp zfuoq)6IEBF3bk!Zc8Y3VIj7^UF=_Q6e2(1CqphiK@zkqE)SvI+?Bx&yH8P%LY%iduVY%O|uBemi{yIJH1)_RKV`lkwiEn0+N-j9m zetFELzC61!&2Kh5I&{t1YB^deiM7<-+2-<7MTFhXe=Ax3@y~xb==|{Xr^oUYH`f*> zl#xnECNQGEs|AwmXOUh!)BxY3(ho7z-^;~BC%fokW_wg)04srPB(@Uk$1VM|ailR{ zK%TB_GCKm|0Yw|#G;6x(d}@aFuAl#xy4$Zh-u9?w4DII7e3$pp3uH2_ne<2|kzE!q zbPx9zX8_ne;oCTIsH?R{@Q@Nk3sih*+Q!4U*Ce{ z*JhgBl>@0{I?USVvo{r%%?1SjYpcc#4s`=>b7Hwn=FkOw?~!}X82hfbTS2vLoVRb5T8UHGWC zaqRT>Q7cOvQaJ*r9QPr-<@IPo>(B{dsmO-@Tz6B}GHh7ng=eZH+dSy8RpVO8S=3V9 zd_7o%1mwXQkOMemb~raWULW9m1xZH0`__)~0&D^ZK#)9wO~L&)IdhZ?snx^E24x0k z#eC&P0DC`56}MF9$`|u_vbg$Amk!3_4qh$v{|-69=!HPtTwiT^HY;#I5yyrC@Tj4eW>bW>I0uh!2Nk6*o$A;^@)X#{J9p7s!A-M;pFY9nKxID8$ZniH zUmablo2kx@72^kBn_|8s^R+g>xRf^*vlZK7!6vQ)LZA2v{Lf5v%HmVL)iQZKTS4YA z6c^y#FM?Lk+zmp;hPz;4kZv+GOw%EanXlH@lsoq?s`zX%7~q}DzQ@!1_tgy28qDTk zxSlQGHhKE&1vx@!Bi`%xs@2o-?L5cA+3V~IV_mb(`wp=bc3o4+p^jNUMO~Qs03do{ zQU|1`u0$w*T_wbb~_dr3|%em_l9ali`9|Z>-m5b-6a6&sv+(? zQk1nUrpur0L-ek=sSQNg%DyYmpkUC3)Ot~dF&#X``5{{|Chf5~2B2pK<*c6>f3Kgb z$&fZ;BQ#Ue2AO@+A;d$PGic(Na2-8g^=KMa1oO!_#27J|UCCp;t&w z-33{yT^3ykvmv@fsxNazwDZ|?JX+57GDJmNF1X=MHF7`&>APVP)KmLjCk!~^c1|rH zIqHxL_qs)t-N85&k!Sa{C6#sc3MSr+&SCF9#XiVY-g74bt6hQv+NUi;8 zhC;mQM9$7U#%t|(d$T5Q6y8QbrYW-ys;XGGyjJ@M4o(m3*u?h-_lNLpxK^>NjAPRCIo-9~@?qb9Bqra@ z)33$*?~h;Hzwf{QzWnl!fBgOZ_c4Ant!JGm5$sT2;n||Iv993hsd|4XKD@T1dU;Kj zXCrmHgNxnzmd}f6aoVO_xl}L6WuYEP-lGq#)*+TTNc^^5Eq?#n^O9TY_G0w zBb0iLqL#N%VkJnE^BDoligEUxP>GG%@xoP!mNRwhASCXxd;Dnh^Zrkd zL8+$SeDJILoIAC-$1$z>hI92agFjjn)8jK|_A*(kIW{l7AqnY!1UU}WyNz(-h^@d6q_#3f1c4uIy{sJ8XvVp0v;mgFv70x{D zhP3hsTD}Fp=4p8WzV5keTvcU35PoRV>Qbkgv;K7M)rW4a3?k3G?`2Wnfh3$S&J=?Q!Y1U;#@)s+jy zwzp5q<@RbZIqYXgt0nE7_39MJ8P8g%TeG5Gfr;DnT_yohmV$kKG zXb$_(fGXJTqC`Xqs8c)p(xDnx{xvlE4M_S+HHfDtvL)?!n7vRWa<*K~>%q>B>h5fH z1XACQJ@V`~oIt(v`B$HR;qQ&=&rpW?6>Wq^Ztp#7uqsNOQ}ob zvqh!q<*JpQ@G8EizYk&E@N>^06$uv{Npsaz2Pn9zm%P>{c$}&!Z@q((S36K{^O~=8 zPFl;$`5N+t61q{<*Iu@lbzp4SAnRZRMt!OF>AWL*Q%4jMgpo1`6%qYx;5;GNV4h5u z>dmznnoQocBQ7M1Vv4BVs5=FIQ>z*m(iTkqV1k67>iCbM?(;FdTzPqd0N>p;V9!!2wJe zq-hH-t)>686_*yAuQg3uKWg5-cL&EQQZeiKqI^@$R<%(k)IwsRh;F09JhEu})pR37 ztOu_pbBOVZA^2#+!-@a(vl0ye#bk1sS+q6T(D&8yht&~z;G7h2WTxOze!=3)%`h-| z(-_qT{`nwO?LfT*3o}wnW*DyhAi{R(yLxqm-xK!*w)g_0#RRw{FB$Sn@wLZnajAkD zxbN*4YRsP@=0=pz)kWyESO(&p1fGHCy4nYC#Y0jvfvnJ~@MW{BPT-%P8eu2bK{CZD zNW@g7mt-qVL)RzFN{P{<2IDg&xPWFh+8%^$ql>*fpLmxHhfH)l=08^D;?k%)YbHK_ zK#t>O7KffqT5+D~32;a>(7e2<_?FdDhw2}jXza)4FVjN5!Vq8IUZK$Qc;Ij~Hv=y~ zh(A#W%p;4=r#qeO)65Zvl8vjkqe(eERU8}@KK-oosf~0BV_JH-+VRzK*#+Qha8ZD% z^+^l=UWQbE{WX0oC1Z?b$B!+W-4pfPRB{jsd|EXq11_i^P7<9W8}VOr?@y%TI-$Pz zw%Ep%d0JNoNshu1o($K!=&sIj*^DKTi4lu(f*YG@k4U|lF3fG~h6IQ=i+b>DGZCJW z*}6qAbcqgaqAV>y*R2I-GW3a!71Jb#n172KRL> z4Lbpx-pphG!VSTdpj9Iwume6c7{>))b&THHP)&R^xu_(fwweTQUwLo%L18g%tt?=; zK41%>%p2aapzS!TPR~Hup>}aHyHLM18lRZQoxJzGG(`UHn^B32L{AFRaU@t()WFmE zd6v;i>soA;5qSac`{>oBdo(d|R9If%!TX-_8={0^DsXgAB+WPPnVI$Nl27SPjQJQg z1pso9*Su{g-0x=(hS|Mc^}2H+jFfvaVU031c^aVlc;&6>Msrx;KCD>zc23Dr zjM>YHu3i$2O?6k8egT-ds1+$6&sHE3+6-o;kIM|T^!lnwkSI$#Upho*IO27MQHO~K zt1;UkJ68uB#@g_*;hbn_1t!PHC}|fld^2t0f$>9vTBne|MZ{QJKs#u@G3HO2N(x;d zY}>2fOWk2hFUDI=G?J4H1$QGk-8D;KjTkefX^bNZ%l6C;7y=SgXfGhg79elhqS!j$ zls_da=!R__39PK|FUix?ZD;m}agK24I)Ymj_oJUNz<4v17G-_^fpeW6LTRyeHz}k< zA*P0;Y}5&oy=->3-s#1<>KV?Wl@U~4tFFQUC(d*Fb{2=1-O*BXGr-LbdvJlN`cjv&|Q;tN9#6 z%|ik*h>32fuUD6ZalDUQF+4`y#I;-a>=Fp97UAe{1vk9o4bF(ZbDB6WI5;qQES&=~ z$zw%g@Wu>~2~G$pV25Tfq2tcd##~14pus@ZM~Q;PE33oPTXz;zuiw~i>!v5H(KkT3 z4G;S29X|dHXbc~$_GVb~qJL2q3njFD+$X)7`%ruCazTP+%d{RgfEzUiT`&V8^LCmk zZiBR&DWr8bs9aX$5jk^$6rp9;84xLKV)yT$o#}mC z6-RZFVYk{@&3Pj`4u;<=PD$l#6lmyU1~wY|NZXCPH?V~vr3*7(`o^Cc^BluT5X)g- zI2wH!j=H?R43ZF53kP?i=ms)US|BaS_^kj!z4jvfpTAqaRTq-l0C?(ZsGDMXiTU5~ z1@)fr_4RuO=F9$8A2>%P8Wv=_1nwVuFv$hhYX}p?s_WP7+6%Up?`fbpu0*LR4L5;5 z!nLD61-j1Ei8)_$3Aiyx$(Xm0Ju0S@_Am5APc(1cx=vO~yjZFY98rs2R~I@MjdkfX zP7}pEblgBh_|NnsGYFb95P8L`snT%r3jFoffvKLv~tPgy`Wmn&wWgkQ=3MIM;;MT zf*MjMwa$g|%YFBmY9gmy_HxmA_4V$jzGk!_Y%iW5*&s^7Otfl&ON~Y}45i0Tle8#- zv~ZyLsgg>&eD8WbBWGeI_hB?Jd?*2ht;lliM5HL&@`Y4(VkzA(;bW|R{k2kbkN(WU zcb;y$>vJvOj6}?sDga4dox`;3I&2ViT|o@$K#zMTW*5#@jnzRPg_nXae8Ma*M=>eG z`n*vQT!zj@00i+JeESo8X(Z(u@VKU9*;;iXrFpu3uvcFOk6kocr2S<+E|wohqQ$QC zwgWKOBs-p9AR2f2$b4t3*ad^BGby2Fbf*I|#PL}%JuSzhq_IR$u(@k>EyC)IS|e6C zr7jzfAFF^73ahCZ067SuzvP}pzbM~~)Z_2m0q3hy{1YRjVrS3<){pfXNP+pWTCqiw zTNx6Pi$SoDeT+Q7H|Y}mDou*6E>{abdiwnFNc#{nXQO3t3TT0EoUX*_Sp^sUr8bnO z*r=+7>Gn!=1;$sY4(3d`9~wZ9%IWrRbP&M5CZ!c_0u z&FbXR5&|X*zb9$Dat8F=E&86Mjtv>@GCHqM zDayfCJ+G$K`RaUR9fC)eDj8Xx7jNUG5*nKI&2L;YNMdvA-TFqavh9qQOO5(!bE7GS zBK`n<8JIJie9F(pCMS8e@K;$^129g&vj@(gcO-hRro5pJv2J&S5D?m&5R$j&^Tlkw zs4zfGoniebLAq__E#aq^{LpF@z?*nS7sT#2_7|b8y1LRTCm7SQmu%3xK$u3#Q_$k{ zKpld%U#$Z%PZ9OT@@1Ncu_Vk_s4oiZG3?NT9b|+6D@K$ki-$~h$ahz%ujyAa5))*m zHN?3bilbHgVUzzKtkB=~fBF%Pc@Vw$PB(YuEpTK3E{pStFH6B^Mu^fa<-DjPJD!hC z4NNAd`#~qC`#@y(qk1#eiASRogF)ClT@=TV+G=w7Apt&UwR(GcDiuwUKA;zk^(0+?ka6(Sh!sXfJSn&;J?PhFv z!%luMNWKhPz6z7?L6a0l+{g(j?xA&a+s#ar1hbO}7q?zi)`*ClO_D`Qu89h$p&}wC zXhBVgp@Be`5yh2Q!OOP8$212$&Gz=m$u?ju_40)p_{(>kOLJYngTYmelv1?DKCvdC;MtZ`QXi z**&C5snY7yL6EhQlW}n)wA%C}lm0yrkFopT84vEz-*=*H+20r<4Ax1`RDve#{b&T&)WwAH^=`z_~ReH`a;J4et!RpKYsOl{O?D{e~N@{ zK7y;Zwgwmn%YUqmJxC>FIyPoavM%E#O}1g(maq_OwA6*_--g@X&+q3CtWZX&0T&ee zR7~LBGY=p2Ts+0ty%K>OnR#eIHWOsj=0zDgw9rKNHHC*Lh_nPlu4HskGG+yw1qu-n zqY0l)K#o?EhCq?dP0U4)QtvE=)K91xjUxpoKpN_)Ehd-0l7D31 z#zl>Et|pPGm&PMaU3f_72}7GVBGT3EQI(!oyh33PkAP7MjlewshY9+**l1FXX-R{+ zMK^iB?d!BAk`KiT(%&%**a&IJEh&~fnh1pHe=;&57Y1um=xwyj?G>rP3C~II!UTEH zaegOp3v}LzBwh}((Ax+|t@t=&ijR-QBQ$F>acPSggv^e;y?|78>d{gz96rmILsnph zBlRGLLdQ{O+*s1RA6~wErn#yB7XqLKj4#wT4&*@=+PG_hSYMMHqyRA>w7j$7JLWKl zCI2fOikMTU2Loten5b`;4#z3TFT-?Mnv4g7Z(sa47`%A;%kxK%DKoh+x!b#n^{lfy zj*4aXQz+cCUiC7!&}=du+4`{oU9&y2G`h)M)&UR4G(7?_>;tKS_tVwIe0#=H;2FQ|KQtr$1LCGO!Wj*aI$#(7>KOt%T0<@@`(e~7vc@yNS zT$4L`r%~%yhq>YbbPM3eZfNSOSJQNhooAC0LdsEVb-ZK|qA2y87ZrIVFKR9IWu0VG z>cz4s7MIr4iV36qd`|YZRW)?w>t*rOEGQ5_jp*rV?5kL8gL=KY%mJvu(7Ob>39~yU zRaJpDkS_W;lDAB)xSmh}+VMg5RrQ zcpYxUNV4e#8@v*FG^D3 zg_<+FGxv7Tq|ys+8h!$3=;$&k`tu9KDQVv=u)(EiUg1t_)<@#Drc+-Ow_%^wiIJIl z2w7C59ZtRUZoK0yo*KA{BCmrrbwZX?e!$5)m!t;m5~Yg7E@oBolTX(8BD(#FxPC{E zmby(aFq%?tNDCx8lhVB}Tw#Vw zQDGXznqi#)vQ3+(qZeF-NoDbU;!VxBq(<9h=1whOOlR@tIR1n@2d(Z$W&$-rv9W|& z<9&+#dFD?SlqIdD+6nZ{dwYO{oz!;I&))DH%H({YlW536^FT8%O^lJ+VRv zXWM@aqUWs*Kx^zjU*7-fbKm~+r!RlUfBj9^e}M1o8%oeHsUQtH3T&@EgC`9em+~QI<8(VbiJulL4^AWwb zTuA_)w5P{}0st^atu-oLqfx1^dYj1n^yF*`abY-kXx7(U;nAzH2~UTDI+(*DVi#E% zKB}>vOhyc;D6?av{7X8-fMCoKm%PoGY-}3Fqv0E|)qoiITntQikU14tt;BoKs~jsy zztmueqy`MGZsuflnVqX!bjb{d8X&mTK%(?`Ma!nT0cVTQEU;ujt*Q>*`inQH5=Iv= z&^F_sNP3|$sWC(wn=fX^5IIM_?&qluViC&}vkXrBR_Vx`HO=NZS5N%ly-Y&Ssvp$a z1Zu@bK@9xufm^rh)z_+5Ng<+&i{hV+y>W~Jf>&=c096Jtvwj~8b?6R``l=^z=4Es2 zFA+VzF7Uk1YxdTsh9@bNLa-Tltd-fUQCVmGBws!z&DplBHJohO?pD5Dio*4A`*A7M z#6Lxa?M7^Ypl1v&v1K3 zJBeyT+6EU;AiiyJoU{R_;rS&8mAQLh6ui5_25oz`uxHaS+DJJMOi>3q*sedpuf6tq zo)#ip5Ltf1&k7M=o z5pSb}(_oB^G0|1~a5^U;W5kM!!&b7^k0K$(c)DOMzQTHtcwd;c!1!5373$Jf{Pk3? zU6c4NA`an?EAxDoi|c#2N+xQ0(xg1XaS$Rd)(MCt}V$*AaA_ivRJBknR-4*{Q<s%21$Z%I!`2+Qg8t!WKE2+WJ-{*;~gRgXD#H_Vc1zAnSSE&)!JxBf5W0{XyHW z)1}_HQg2%DCR>+3yF6$7n__`kmLna5Isp#Y!SHwM`R_k>XaD!|bl$=XU|sy@=YRC_ zzkdGt{m;Mn-Twa@ivKK}S!Q9p8^McR-{28z{|`t$&o%Y53bBNI@zC8rK_sOrV#E2E z)ckOQ>BmMStcovN=xiQoLm|J+Kft46ALP~ACC>p6XPuf70QQQ>1QN$;F%g1k)h8g( zNJ}-wpP_*oa$Q`~m7Klc$@$cEmljo@EoR3MhPS3aq6oBgOfQ>5@$&2mNcYF366Bg%Q?qC@R!n)Ui0~ zxN3r(dDvUJJ7QLD{_-e}G$L5ICrfx`M>2dygDZIgckFjpFd;m{MoHi){!v-sp05aH z8tDH$%dIP}KbKNxWczdYB?221DJm_$Mp?pK)LW(r5f27nPUN*I$}(k+tj59-!yc$s z&j{%op79qJT<;43cN2E5X{$k~_G6>fEB;bso-pk<+RJd~4JE$RuyTqf<_I{za;Op; zYxXPC{r%SBW3?MmHHO!4b9NoNmp-h|h?iGq7*Th)<|H>>8xj&;@;)ia=FQbNXc zT(1d@%#e_`wrNN+9{vC}q;WQ0E$9YCb45ZOaGhgIWAP)&2ZJAJjK~60wQ~5!|4d6V zj@i)%@4aLt%<@K8*$5D${M4kt6UO6_4#?D6!5s4L8v9o zV_JChs6_1~=psrh;ZvPuA8mT7o0ZL7dAGgk=Q^WK+bX3l6v91kE$W2N<V$+K^bl|pb`siNy?wqr*qm4??%=T8(Pp5pk?jGzn*P zuK<80{GDmDFdAjM{Khlr!bg{^E$*b-V@1%YgUh2&L5mTKW&QXAwq~X4k672_W8NP_ zV1m6Ty!>e(yTsE%+LElTrW}`YeEc3p6V(vAip(FD3`a3Lu@lZ7R~XcHNF3`B9GngZ zdUA*B`qScx51S#ogx5UU+ca4>taYSq>x-6XJs|Ev^%A@1de{*CRuO-b`q_ZRa6-)_Gf znSMj|ABy$61NhH1_Mb2Ae;&qve*VRmzuSL4#*f7i)6e#Lb#hX@?QCo`8;0nEpNK@l zH-Suk>|#Z^zk2Pb@ClwHre0O9SI73{Sq=-A@KC`+E;@8q{?HQ4izy*;pnr z%*V3}^_-~7?5c6D8W3z?19@q-F4UE0w9r1}o)qLZ_w`hD%2KgRgt;f#CjjmnTZo~W9W#b&O_?+monuYH$A1v)Iu0A+gLHN+Jck+4QV0kq#CmJ`bx7fvWhXUQjD(Om3abnjzC&*RiG== z1X3ka7#7GDMo&0Y3)042-E`r621R@bwYyavbrn=KtW&5>XOxJ@4!1tPM#z5Cc&D@J zwoSnGfkr=?0^pzNBs~|M&QsknE+yEtDcNP3`l+bFXaNeS1}pD5mhvOEx(Ap~<>g{E zeQkLB%jduR{O_aZkDomq{k;Fv<6+N_`9s#>uEzv1X{(+d9dgihk`6aJox6JJ=^#%K z>7&`c{BCM7(&^3a&`Vt&b)j9=j zpM(+MQ3qpxHBMI3V{%5>^I0xN`5B>z)qyO8_?H(1&5GnL63#_dQ^!&H`O3`sTh27R z>hes+!v`7H8)NMM4~_cek)$*z9THf3qDy|g(B3xUM4qf4+uxMfYC@12!)nuMXG0hK zHtjTL#pZ4P_4awOZ<`rAe6{(RvhO|wIT{rG@+Lviw}~;vf+O_(rWDB_?oe7{^d2{I z43u~eiL>FCtDTC8JI#Tnq60L;kNhNlF3Iayg!+(EJjMi5Kn^s5qAau!@sGFPdG7S^ zB~xP7?>(G{a1oqIE%@$zkhzj@H@k_M9t16r5>v;0^<=QGzBQBU8}e zMk&pW_6+8Ac|R?uH6vvm-)&2N_V2?t-VeUw;LDZ;15;zFS74RUXE9fID@`XkHfd zjL#SKJ}TZoNIMILMum6{{)0;TF2VC((KZF@M$(;X;V!Hk8cu`sh8WCa5 zFbn$FDK?875wtIt>REZ-Pd5I7HC5HzIe}RQ>KtQQQCc!l^%b*@6qK=<9$}bR1p-zFB({6NDhvhRFsW=I(mLCG1f-7}#$hnv-mwOQtYdIWv9+sCp34j`VTVHAxi;>I zpK!O6eLI_$_c|>?aN&%Ke!BSIo?P@8!=Xg=ng`(C$t4kK2sI!ENQicsAW;=?1*DDu zu~WB?G46x}iUHt?^B{^TB<;?gk`1P`m>pnu=m?I4!Svhi;wQgp6$l}R~>u!nI^^@oWqTurB|^e z%P8PW$iB(gsg5tGm(>6JU6j++xy7@Z0bKD?J|6w;jA~p)fsAVVIe-#FPj2)Zr9zn! z?3(M@Z%rZwC?q+u_pEK`ZF^Uc-WsV@Ec(y03)r04dec%P*JO+BZDG^;qDJUm*VgT| zyg~RMy{4-pxI#G}hhalVA4q{Lp5&jOSHmH96Kmw$ihRFUccKyyN9xVFgj+D=S2wv5 z45yFo=raP*&Q*7>)zM;=%s1mg@s8;ojYN^{vMn;S|KQMqhgMj#M@G(5blHPJB0*3X zL40OQ3JUBu8Eo*8-*A6EjETDVPCP14tEq=t%vTG8pFA%m+9&O322mU`RiED^m!|*c zi>E*5>ZsIZH|z!+!2IVqzcbaUvHF|S)nu~SgF_~D3!!vD%@aoq3Oe0kM0p&YMs-5J z2jGWKzkNC|Mwbh1Z=tl=lt=Ci{*#%gq_aw0D{6?B{=x#z3{G?~cm^|F zJVwX+8%@ujRU2?-X;1^Is-@j5L9T(|io9?rM0LyMo*1qVia68)R8!tqjKJ5u2@*6J zC;r_`9+7ZCXY+E}?Ob$vc#l^zeuY=F9Fwzkqm6?b9*kjaXqdxpIG(8boR3gLF+WM{ zc##dF&(~Hi4KDe)xayp(F`h5Ti?Rq-EFDqphaSO5^c|@rvx237PO4+sJYr$O=wmZG zE+!14Q7tQ^U*t}64L+OBB}s;WnRFeX=*MP(Z31P3%?e2aj&>h(I-Ek#;H5r;H#Dft zHnQl?1vu@gV$y{ZA{^JcizHf9YvC$kh_GtD*VH`}fcU(8wU~5zF>Wtj^xyv6uI-4R z$)F$GHIYyc_G`JC-2>!JJP2Iuf2AR9*?3P!jau#;pM#I^$e#vucrq0!wrnvLleE_ZgzWXdVU#n zW!?e>-^qqCB&NEas<=mTKs0r$O%tKvE`WhezjveI1pcyd5CB&|sJ}2z8y_D`TTj=t zL+EdSIa!zMFn~ne=d6$RtoCfCh*9e=wv;?@1%#*MYIS$1b8x6WIczaKRV+HYU!MPX zJ{_211Brhf?P)%pk>Nxdv=WMy0*Mps%Q`N@m2wXc{RNM|C1)w7Zmj3VTUl;FO z!Gpoh@H4OQm7pPH22Iu-kfT7U%SY+H>49+P7AWyHK*)uLSz2>!ep;`Nx;w9OHHClK z>1Q1!!Qn@0R0cCfz@q+}M_ zO{u)qd}3R)zgX6nJ1-E(L49n8EmUJ$*=7OdHa~O++YdIIW(^Mf-`l2dGIJsc_3>$$ ztN*ke9jmsD18o{5%A1X2^9BbM)Y#e$229rR5g3MmVJWxZ2b^1J-m-rKdWF*@<|&R7 zJiSODR@`qnGJ%2su~wWPjSG6@sjmnfz>z7eLP>=mmSeTM-^9RsiWqi z{v5^|rsja7i`Y$un+L1G?+bjhs}(nVWa}NdsO5iO&6Z_%39o+&y#Pu<`QYlR66Tqo zfFRXFo(B>#YG|)|z_HjFi#~pM`SRHdI^p1`1}UV_KcPCWCdIo_d_~OyC?Rt4h9FhzuT6Lv_xn(AUc;z^Cb9X&fwX5B|f$IEyU7x+j z4c>cyP;CEtfBVm)?crw+y9e8^F7n}Lz22bvYUkBXZ?Btwy4UOC^{@VTwX^sB)s`wW zR>elc&-Qx%;%)u@cwA|0*lW(8Mn38rhM=hqPO^5DJ1*u+z-Vi~B95yLQ+~HPs}LqM zC>E2;tU6cYsv+Q~ue0%*q_d0iO*LE9cx37|Ppn6v>x5hfV{ofHuckV{+g>DUO$OQ4 zJCK1l<40FJ@f>mOUiU$sGc3`HbB3cuS-h5d04KtSYB$~d=GHst;c9#9U3C?I?4=}q zBjOo8fb+sj5}Cvy%rSOVMp%gL3wS8qT`2~k8toyOI~nz4QI@~*A^r{x^3m}>OuXE! z0YIAZKkk3|;EOMP{Esgl{Eq+eQGOtj6O*?LzO7D6;H{l8{<3pE{!?eeTF8oHik(=^ z0VQq+j1|_mx;i;27v*%RO+D#aKwhKrEmhx%)ocelqA4?m1)}(Jb-p?uS(^4RjAY^B zZTrFqwYO|nR$VMgWY=EOb-Xof%S58Ol)rHZ6C3yCq)q)11{fuF!l~br%c5I2=%^B% zVVeq{e4^#OznGN54*m zct#znW3&o&seAclXV?R4%)Ra>110TOVjgh<@|sH((+zh&5i_8)t=$0x*AZw;T+sv( zB{@oG@ci$>e*(gU4|Dj>UbdJ0ZU3hqe?VC59JmdumJPU_2$m4)_u~DkHGpsZuJ)15 zydW+!7=W$yuj)iRaR*`_&jaj`sH@3dHIXJ@vabS6`#Ro|aVo|(Q}oE%T*HDgL6y*G ziojf(YdDo@(x)_N+#^jbdU_xGI*WCbMx%~@t0M_v>^<9EvT&s1IHAA;K|LReQ*g3| z{D32YChVi{(frT?TAgIgvlTxF!;NbhvSGyKSan0U?O^cJw|~md%C~gq+JPp_+up!T zBqja*K4m(mKJ$7~9hdjI_xl-@PxRqOz(zhctCb(ml(fF=9t7*Fn2U~%jBih3gS$!; zJ1v(X%arci>(8Msul6#1kA1zH$?n$k)_hT-i*bIW-C*8j@87)7-h^#sSNT%!P9!@- ziwwf9ceAD)GyQg;jP@;ep)mq1CKRMtajjc()bVNooRUFgIzZ|aZcG%J-=Ud!5Lgxl zj=2-rA;mq2VsIuG9P}VErPu?NV}1nGbyQ95zNw@6eR(eL^q_*4XY0{9s%h_~iR}G* zp{HaWeG};@EkwooF5Y6_Nf{~K_t&w$ld@A{-T<`D#`61H{r{NvzW~L(J^bgI_y3ol zNAN!%e0l%(_y0%5|4cpADVr+(Ggri*p6Iqp6W#1U{&on2>9j0At|x7aQr?fYr5CfA zdJn6&cXhN{mew7$Zd)HRxV9`xZp2cDu|>YCGX7#QdsB@Or}5htKVtML#=9Ot;(Nqu z+Bbj{I{gGBxG%6Zbzm2eig>oDPOB*e9HQ%?x!<93kfPVHYEWJm>e)pjv#Ub7d>S`G z{vFT8B>+S&W~uMqkRa0F@=y+HZGP^LK44vL3>R#8q3()pIt z>jb%L4e$`YNxcj>JuxTMxYL^?P$;qd9#L8X5`| zt)jVRv{YxHloHA9V3~^yXql&4lu9S;BpA*Uby!Zz1q}rKM91`QCUhVIEURjk058%u z>ie*QZ9kDGMo$&9I_MF(Hk%xq1TLv`YYI`?z2=;7h%etTEAmzpF)LhPsGdctr@AZV z^PBfJh3d)PJPn{;SA4kkjj0EJ52tLfs`}yh2GVFvFOe6^VmdAs>{MEApmtRlomIeFS-5Qsu}bL@7Z(U$fP2t z-yp@f|80&Sq|;;diY^uv`B|3BY@qk7kCX5#MII9y5ugX+X-GJPU`(+`emWeJdBxp! z`fV#&PLj>|30dUs1tZfDoV+!I3vQNo9b@wYXLP-wE6axv47#e@v9yMs5{E!hPoZ9U zs2z?K+UrNF-e9;9p4hY%(Nic#8rXk08baQC?lZ&TOdvS{lkZyLa9=WRU8;uaOm?@sW)Tr-84x{WI^}tPLQrWhx z19MIn^KN#Oujx-u+oKH3?S!kH*yr!6x6{=*aY(l+{)RGLKiD|j)lQh}R(C7zeDsu| z34EIU>5skaKkY&EYzIN@N(on}<~gq|)}Vzm_44+4%X_Sre7dat*|IE!E-=Fx zFBZiGQ}bn=j$0X%1o2)_&o^Xj>Ufc?OQ{Y;;j5nU94aTZZZ_&Z#7!NYpJ&@B@3gqT zo0oB19<5H*`}Q;sBw`qYL4AB%1m11XB3#h~q{2 z620NXG-fJM4YdQ-5Z!y50P<-m6}3 z@74d_F^yVOantrjley-}6#Y64A;{h}gm*^(WNv!zutP<;v7uib<{q?W=cS`KuOkn! zS!|5#zB8MX7pK1Yy-aAJb?OBCP(L%>njAbZFR?fD29qWPTkLb2+2X(%28aF;MjNM&efxZ^;fMMzg3)#CSo(ROPl>1M&cmZ}S~NLP_6t z_a$0n!5}LUW;jQ+h0`3BFQV2wCKhA;+*y5Z_VmrD=@H9{bcWpebo}Q(1NLk+hHFt> zGK+3d_YCz+;N037_O4l%I_$}H5s(5~*~>*St>OIE9MzqUR5gW+2IQxmedc=lOanSS z!XfB}YON~iTbQWI!j+@c1ITb1{T_6vWa?BmL@`If+dMpr^P}o?g}%pUiky#^aGXrY z=3EJ4$1W|yb#!NdTTCa8QVg9dA>Lr2D`^_VNhNI^sqO%itAMa?bw(;;XTES^ht_;< zJX#6&jGq$^dKnG^li;2__#e}J3A;4`&V%rt>2=E{6sgCzV&yEIf-c$6J!K;HlHa*@;clm+0 z*Y2XuDGR%4v&V8LkjPz$FFnxeTYJgYi(j5Sd;0w4<8MbVo;`jvdil3!k6+jmVG|g= zDXIwtVFPRy^cFmK>^G7}fSLwXF@XxlD~CF+sKV4{;~HqgS+K{NVy>LPC$rxL{wMQbk4un3? zdM$vowi<@*<_4(ZS*Z_QY=F*WgsP7U2QUjJN?9FKw76y#mBqR=C@Gyqu1u; zd2(oRW%4qTAdJT4G|awW&|=I)@j??{I|PIXb@c9F+^Fxp>97qUr$-%<`dthfU@8@n z0bzI9DeT>RCO%Q8XOt%Yo6KxcDxO~}c{t3FchjlZCP&tAVczZYdAX3mu%1Z??w$3P zCnW>x&-&S?)M^g7$h!K|o`{{bxla7&t*EIajb78+%2>N1_#K(P^3=pj_2I&#TGOyN zx-pP=0dkWY5xAM#)Q$`NOzdBj6Ut-~k^i-%s!K>Sy4g?gcyfLtyz8JbnVRWZqqP?V zs!sq#^Sr8S)l|@l^-u-q*W+@|H5*4I)gS9TE%KH@u%Dp4L$N@I7MLidS$j^Y12DCk zut0|Twb~G;&EnE|HXHBg57koxmuPGEo2+9#ODWePZX#<)3^fpO(b5h_OuZkhJ=nPy zE66lJ8lzE?nbdy5tLj7&9*VD^eHNdhp#Wlcg~FKGcuAcsTeA6wd1V*b-UxiOxYQOB zvI?plJluLGn!h^q^l4HPN2lPBf@XCE^LhsOO~s~66bZ%&=bJG_4S^Jok-LfB58Q<6 z>Q{g%c#!AY4~D+U+aUbgh8QkFUY}Jb%e39SCWsl6_{sJN>nWNC5Q7#wuQv5woj2Sw z4E@bSCkw;9p_kanzlIZh5j*alUK2MovgOs(0%C!I!lPnoK&NpL^jU z)O#2nz&0nZ*TQ@vV50jOmtb)Sbgo%b2;erl`n0XrH2{O7&XF*|~-RSTA zi``(^E(nSpCc2sw7&?B=QQToXXm?QDeRodHlw4*|fK0E9 zTEe@s-fj8Ica<63@7W2Ol}+Y&MA3aMm8nn&>Ep07!EY)@E90d92Y-B*PTfAiXi?FZazq_}pj~^Z4zuTmZt0 zXbPNbs;L?&rjdp0Rh;YJ^z6mwPM6EtQx~HN;}YsNIv0H^o^DTppnj{Fw8X*)A0htr z$DHzQZ=!_kGWPhS^q6fgcCm`)K`vKvjSHbk>E2>dqeXg3Qf*|1$;Yw_ION%@F-y|2 z1SJDAn-FoTH9e_LSBoZNFM8p-Wf`)@Bc>YGvpT!g$z{rthH{gVpY+pOj3m;o_#Qp* z5U#&Cg_Lc}b&hP@dXQcll*E?F!*Mxcg(>L{AJiVpc-@!dwTH-_>D_Gm8^!t19Fpzf z(=Zzti^yH{s2HYH)!V)ghUV!YYPhbz$=a9kWKjq^w#6-EL%Jhd7Uuu~HoK|L4_Iz; zO3k!kbQNA3xt8bmx{`_oI9u|p6qcW`CoEdx)pcBL+wPr?FE9KfTnq4 z{n2Ad7<*+1%p+ZRD5`oVTXya&!~x4T#yH2I?2RQvZWjP>Ft<|#1aUJQy0^>8Nk2<+ zDseL1;eSbxU=U)j{SgoiGwO~QmP;x7!;*nf*XRC}5(sy4_Zu4Bm2n}*w1}hm86cL$ zhbD>`IY(5BoGej*URd_h6yLcUl6~qfNc>ZEAczHk0u&owjv$TYi1t&>t;?I}$tDg4 z<=gUjrO$a?k&=wy8Q}X|HMQ4`6zU~22>4(M$!;XYt@&w8THyT*is@y`Ryo|lnNxzT zkB9&wQCHKrJg4lW2HQVMDr(kLaAXUn$T(7z$mHEsixJi8o;)v8^a|g3x_}6QLMhQ@ z){e@s$$mC)mX6(TxN5U`p2Sl2lAp}o-6aNOS zkB5Bf1%q-ZAoH#7GtQxTnMoQFT6mUwlsGB_;e9aRz>c^@sU4CghDNsxX2)eOqKy!o zIPpfBDWXD%v@Bcq!t|^L%o?)xJ`V0=(m(^U1&EkhX4V6^_6X@HRL9yZpro70>=LkX zMub};M$XhB(Z)V)xV6nZ@fr>a#$H^CC+@-P+kW@nZG-`s*z4MFBX4l;_B2D#H>T~0 z)LPovRT4(rBO%kNFzoaymZPChE&)2`!K7M)r`qeOlKQ;eb<_2qXyJ-5-&<65*iA4c za1;Gv&wkv0`Q6j!KfN$sb)FiEKGK>FROiUON)QHl->p}C=vo>E$4Y_DQErW*(8yq7 zjtDawyww!ba~_d3=-i#iOBaVI zi!#YjRsgZrz113fA{cEJ8%s_2KC_DIj}@iG50-J08Lr<5;IzcQT785zXOq_Dw4y^=L z=W%UCQW((TlLX#Eqg4(5Kmq6_q~#;6xqgY182(%6K!Z4Ydowd`_ZuQHtAni3SF?V` zh-phbuKC1V7v7U<&0~q;uCOp(7j(#2#!|02`W|tCMiAsMo*mO)uCh8?^O<@vE@$eg zE=or9`O;&=pJsR&IyJt>f<)1wpNX!yG$my-vx^!Hy!z1!;Vb=H#PKnSf0r2UL9$~V zp3Yhm8HGg>aE~rzq_5S{C2#;vQ}8F#6XJks#wFi7JUlfN9i-eXC@<+k%L#~BD7mRm zjz!K0G6K{J4%?5nT)Pvfxe=XdLWfA6!fUc7ctJoi z=-OnW1)`qo@J=j9>?x(Dbxv_c8R7M1U$Qg9MC_at`7HJIUZw(aJX8$J<%u)ZdJSp} z*DuwBQ8inK1GeFAO-!Qi<}ko_ycghO&??!v2=8+5CRhFR!Rq8wp#G#S6Eo#|B%2wv z4$vZP z7BA1QPmLc(t@vFRv|G6pcO-rb1*Nr`70)FKw3&DjHUf zVMW8j=YY@F^?K^{QZ1QZ^KuHosol;mFTdOV9~~r3`<)Qls9?Ool!K%+h@gj1P(@-E zufvE~M)HvR8><(g4|4%sXy6yFK@wy8?JXb+%ml0WL+|TsK$D8qVzc;B4I&KVLhT59 zaTEb?j}NHq?2|T)xo5>?IYu4mqCd}wu8liqT?c|sgKaqnecUc}9^uqsw5Qh^JnJ}>tHtbX5j;%1LB zo%_n{ChA&wzIe?okPy6#PBDM?pJz7lHmB@iO)2w4&3MzP$zbs-j; z2Drv>5oE4u9+D1!&`U&^$KJ%GWQ>~&<(eiZqiLea)t#Du4}YHM3Sus3X`!55xV6 ziD7mFxHw~1C%+Lmv0L1T-uyO;i^ydHEhU9v+X81cwg?{TQ`>dmh$X3|h$CFyW;Jw+ zyM6+W)SCE;%7L!u{P#@*A`MUq5#levC&hzSf1=g6Va5%8>3cAaP zm58WT_R-Vlk4Jxb{QSj}r$4jjW{ho{AiP8K-mP6a89NPCC>Q}mVQvPYelqUQ`pAey zfKY|Y*=pf0cOUxUL-#HNnYU!)E>$R6iISpv0@Z)4rN<~nmE~aw+QeYnG&GmP<_{$} zV|$hPcy!Ym9m>Rbqh*04%sEF-CZ!|+!Um74Snn<&kiJG`@7{ZUW}3H6%A`QLaf#G4 zG~iq2Q8>Lc4JiiDM~VFH99T!a;zuIu@{K; zu*w#zBSq=+!MLh1*7XIb1Qj*x!0vCDHMLa{;T^>qOp)d_QcfdnBs%)Bnl5*qW8(71 zCdz&zGpWq&M_`gKK9s%-tReuK63sao5$rAiGZ5(|9tV_%P;)=KcC-!@Zk6SKOZ&!&kb|v zL=*N#wDA_;%Z3 zG*-WwOD#ao-pe z6-F@hv9_NzP^7;>Xp2bm+7;=g_q?>k1drGztCmobGgGb})3|X^(s3rt$mmTT6(Oj< zV?Z5|P{@R*dLX~Gm}9Fsd3kOK)X8@ohukC@@`R&|JWRO>8QmDpsRvp)Gu(kI!`Dq} z)>`@bx5=QRpC&$Xf)b8&Q&&vWmPq9J2;W@5B(<}-Jak5#mTVKrvh64`qXtdn_2|kJxYA$AxGAwMKxT;Xn9^si*SxZr zEi91$%w?_7PFl_{fbK$F@O@&GqEJNnn-g$?8jV+U4KduUMW1Uso|gpK!mi2)!()d0 zH5t0xPKO(u4Lp|BobrR}wMQBuW;qK85E;+;98%uV(c6FisLcS4vSL&$47-uJ zJ$Qk=zE>ffnZWCTtOo{d??j!*@?y4l&Eiv5>Vo|L{-6K1<{=8vt3nAdHu${7q+DMg zZG@kGdQldyCzqdodfmZ7z0u7^Oi(IS`4N`XcC~(d97j^qe@>*0&>Jen;lvdN7Ez;NWhQKzLe`mbgYxsebgL7?_&9#P^X-dcD{^{qfcnh`C{5 z;pvW6uvvikUhKM%p^RyAo4fDC^P9RvZ?L>4(s>+&vXsWdfVQ$m9OHZ+;br%?o z?q*uQJz zZ`3au7H`}y*1l%H=038$S;K7-y)F{n=G(RXM&6QMBYgC;XPQx``OOv5Eaor`A8Hc_`&uf|b5D zyY?nOorSN^V-V@emX`+!y6AOVe@MyWmawDp$s9%R6p_yU+m+YodB_9?B28oPldK5f z95u%%@UUjX!t0d5*>jVSj5J8v(4w{g+>gg-@SBn0Pfh+3*&-N^D0Q9sfP5}(b9Hf2 zPA=(nkBynwV>FRw5imkLbJ~t+ErlOsyE)vjNYT!eOi2Kbk7ujtlFz8` z*@taI-Xcf?aSPK6o|~xs<>fW(FY?*aCvl>mxzNkRTE)&ljLhvQd)HGS*?PmoX@b2P zv31sVKd9FWs=%kYUf~F^O(YGpsA-MzaL!}}2ttu%l6dY7q=>0DiRc_PD!OvnB}2k$ zB9S0~VkAtq>6Gx&7Ha`2NWI*)N8HT8z*@zKR-?VU+47!?Ws9!wo^k_{G7Fa?E6l|h zA^KE3^1U5d`yFOKxrgLqeL40vf?N`ukOV22+=HVvN5ghX#rNEz9p zZOC(<`JK2Mi2J1=?qb?Z+t(#hLra!u{73<$*8oz?Rn+1Gb;`B-y$ya6uo)x*=O7`o zzX^V1Sih}<oNJKg{aK#V~K9vm)v(MCLwoT547AE1#+KvSDT;?wZ?n>7!JiakU{cJWF z<9^5lEwqO&R7&roDcoxZ-w;`(_*?X^i(+0=8ub;Tc@!GSj|c$$8{nY?{=BuZSi*74 z&StaM+;s>2U9*$b0y*9Bs$R~{t6vKfjAFVtDo?;07JOn+I9YPvS7^t$aH;Z(%4Jg* zCq+ZMJ%xxvQqS4_AT=Vo@dC8L%b9cY1(#&}CeAa+?#v#D_%Ov=khd-tAhi5jjSPf` zHXL#j3PbFV7R#J%!&KA~omPshMjY(MJ;j{|gPAdK4e*tvcdl1Yw*qQ` zNGtGhyn)!+<9BNEN^QZ85t6{lv>ObJYbqR41do=*w!hJCvhT>*G@V`y^dC__s(u#r z&QTv*cOZ8GQ)gF+A$hb+@_;_-$Ps$*j#djHK9fKOHanmy2APTI5APa_-Lw(T05tPi z)=~fWnHXnEV3&?a+Ti^R*#TTUe{sPZA6C)L{Y*r(0q5MLFM&km4O&Be>wzSQl_1oF z0wWPXhn)q;HF#7ilG67eUF^ZBrmM5dZhA!|i?NOnF<$C;5A+~3Q(xY(>r;nZH(fg^ z7Q8t!CAQw#19Y_+^{MATebRM`VMQWSw;?kH`KrKF+dc}0o`@}UyyAv-JW+({kVhzb z^sSZihwDAhU={5m#a+(2;YBWQA0Gkszh>36yZLIm8KA}n2RQ~Adwix&?Aj0rzFp2q zhVg5=WdXcm<1QI(eA{huecKHi-)P68PCuB~Gd^~)bJnw`?PmEIZQ3leZ>{cf3v}Jn zrdw;YcgUh(IO3S1(GB3Xa_JcG%||*kjn?|5O|_)wtCs^Mc>`Q|ViKvMOqGJMOzfes z&$r&k=HyF84rO09h}3tGs_CO9Y`W95P1jG}blntAsRXAyol~p~&Dc)?-G_PnT*C=MbJNP>&r>tI457L$U9M*-}4o)|@@)&OdawO(tbeEeO@A z_pI2z$J2VX;87~lLBu@XW3F8bCsKh>=9DMblu(RT@FQ<{WKNAc7V$Id2HM9kQACoD zN|ax-;*ygZY&i01<=?Q37X3h}A<=t*1-{D$;o`To7Dlveh zkpKneCM}*;u`CtRovkfTH{~00qg`)Gl)tMUrlw~7?M}+&@mbe?*N;uQr}?=z`3TF7 zhv5D)#WXMxQZrh35V;7a1V`ne-bMKG`UE03INqT%<3IV?Zg--6f65PjoFxHA&f#tL z`p%yH5`*f)4As;a{sG8ef~TC%Wnt&MG?V{gMZO( zft`&TRK89nYgwN!W^XTBW6f-5KRIJ>LUNKn7C1?YxMe40+&!mvqD=SEnn+6|f4 z&<&Y-h_Ny$-xO1qDQ`SGUY#2R{p_@ymWyI(b@MjAghtMDXEr}oLi6efm>Bp^!(+$> zwS9o>Q~RD%j>aNJcnXGU2rkT8OgKCd?S#JeWI=d*bwsmrB$6EjLo=Msu$Br-5Zp`6jiEy z-IfImB-c(0h9_}|)Vhej0ibzx6baWh;HGX@^__YE5z^NEX)7am#bNhsxttGnc1~B2 zXexJmJzJdas7vb{Y#WLM&OxlH^RwmoWD9io1h0#2^fLW*^N>SC97ro>Q(T=wTiMB^ zd}}a#a6vBBT2=LVp8cc_E+ii{>!u-vvSK`&GbjG7?0`_8$cFm{%(^_Vz)rZF<`>oL zYF>`30w)W9?L4w|M^JYZNov2Pj~$?sFU@kRvX@z10aW?G%gl;S_JkgfPNAq%QGdJ_ z5T|530ad&C+08o7LD(p0IXYo+a|lfFKjshe`;l^!>bRWNr75QbYLrKnl-&8Z7vFZY z)GMl-&CZqVbXuCGVbN+J6Uza1mb2;Qc{P~;3tcnNVx^eTqILu5yi}F5pQv^RN5YzW zczUi5E_4zdTfI`$rk2}`ZU6Zr+>-AfeXF>ZMZe)=%Ft&68DRDF1(sI-{I5JRR?QdK zVyQXf2(PgQz$rWGsj)0D@~ZQOwkA3o7GUV_dH(LKe|{AiqzibXC3taJFU#{soLG4+ zBUc)te7azytFFjpshMRtzANgzF8Q{m-_8{+;`zsBXO#v}bK`2kv0<<#57G6ymg|j(H3;KZZmGr@y zSO7|RM-}d&4N-d+DrfBc6y+gmw%nXdRMYGWGQjDYA;UKAK8R3^@8t6^E}k<1K-`dF z2K$Oxn6LC{}r;(tAc<>#X)UQf+0*-(=J( zQ0?O%fB%0FW$=%`|Bof2VH!wM`fH_oxiGE!&1>K^**uVvxue@-M>@#}1VKO?4kt{` ze@X>s+3JFv&E1C-z8X9O^QO1DI*zBStJ*8+?DUb*C}jX#mg4gprzL6^tC zE0mJqK9j_ZvG_n8Fx7eUj0+`hX3%eHpv-;9DObtx+Ki8#4%isZ2e33J*|llcS9sBj z1}@X5+$=noN46${y&AeRj3ZPZn!O6I0=Ne_9_fM-aK$%!;S_izyG7PqkaBB8=(^Qx z7R5>I%;rh@)^&CHG>nasDA`dD9)yl2DvPYp+&dbXaT>B^!ScCQBCj5Uy&hJP30M*> z=RXmHrat30+L&ukYgDHKmgrxR4cQri)glo+nJsS=ry^@K=od!8-xwr09Oxru zlFBq1q0=?Pa1f7Ki%~Sz+Ub^%p9i3x(a@w^%QOwwl%JU1X8&Us0CsH1(i>Cuo4pLLQm=x~b zrf20kFvnc7Q_aSC8&-2`=Q&*RT8gUH(XU~J-Th#vW~Q9VMm_UW1^%seMj4A(XrZ$u zbl76Q*zg|v-+o_-Pv@1ju{n0OK2?A;m%IkEAB zp6d6$Fu90&SPNt9QABX$WX5m6S(V5gt!CaU3Gxl(j$yl8UGqqI5(*Y`^B-Tr#Xk{M zEb8e1@)XMYQJS@^A^h`Tq-67?WL!p`ZVu0@n1+JkpP>IeTkj?ah4 ziCT=lW~0{1SM;~I>rB}&tEU_`VvsIdkTM>T0b6Om9m@o9DEliDs<1=k#=Gq9Y;Ery zZFhd!{^bbdUF1SdZynUNphyp|rfvT$3BzAQ$M)vnH|qRD-ewkP6ssZJI;{6pc|tRQ z%T#Ps@&wQAzSreL@mIU(0*ha_;A_)R;F!sD1!f3nbu~`d#v;|>G&~1uxF}GJ8Vj}$ zdiriBB|Fy*{AgJ zl+FNEc~Dq+dNu7fz3!;b{tNRmVrMb<6L#I|JIsEd)TZn!j?K8PGDahe^^D@ck#HFH z&oM2R28%TQbLq< zRSOi0CGn>f(-}m?_mGUpTSir+1Z9c>#@5~!xu@A4y_z|2g3KLW=FE4%m9$s>) zYzzS=M+}({b9-sUE1yU~3t1Pzia~#?TnG-gH($TomSjyELk9Owls0~`H6cWF+0j~( z7Mrw3YyNkS2oZnOue3-6H)n}>r*cdcghdW-zS-`vtI2sdjL$df@?(`b-+H^b_v7~N z{*Rw*+9f(wW?rIGb@Ciq-yd#Ck^M$)O7xgP z)d4ubFmd3N9nif&6N}x9B8WFhXQ$+ckP4|@?dkROV$5GZi--L%Ax9dFe}THp5JZ@H zXK>E76@`u1T5`Zch$|R3J#o)S2f>r?zNZgsO;NTXgWX;J9fW2J6btY-_XZLRk5jGk zgr>_;PPIwMraim}3;8+stmZb5AKAR~MZ+My0FsgOD?9t&AihM~jJJPuB(#I62Ub+S z=q8Ks$~>WTgRJp|T%ii3GT|nr8v-$`s8BTZ-lsHbc$=c+MRxewMUBi%lFIHsKt?Bn zI37Qe-Z`yf`elv*E?=zN=!3jlHnxH|wyF&KXm%=ewOHT=%C#1&CubzHDJ3vISoJ7G;V?`!xl!ZN|nLAJw85w z3#bT*L%)#G1U2=2I*~XV#kmFddSSKjevKwgZ+iY~(>wk33Hx;QE9r29r0QTfBNI#5 z4=?=7kevZjb`eE#6==26{>RqO;TC(;IePt5C)z*igkzs!P+M@6IJ6nxdpu7OEE(fM zJVb(;nnMP*N_!F+?dKe4$=*cFppR$aleIs7_v|cOTMNEhTRVID>`Cve|EzZwJn8@G z*`H4P&w|ru{Xc#0m^kOHP8oDFcixA98L7Jvd^=bC{r%xig_mH@N>f^J zp8tj{2&A(kSsW;4LP^;B2>KrNxI*`I?tA=C#s$ay63GZ2|KrT;-|+v%vuwUpWtPo1NUrhdPlfi9Rf!LkrettlI3oi$ri_uQj@g%yVb=Qg*&m-h z`BUrN4+lwn4syZU_pe)P{v^kPe2#9>Lvx{yo8{CyAJ``d)@xT{uWA4;>K&WDFKUwK zV6>`-D!x7CoP5w)hoK67$tJ&K>)figci_X^v-xF4A?tj~>^6+q+SWM39u*x-9S zqu><{sNpljkM1e%pWQIH;7PMjhr#$G0TMNgFohz%{5tOG3#j7P1&-IO+oEuy3P*=M zJ^5xLb|vpow0os9J_9+&rivBc`P9Nh<;{61SIzV{AMJ?DI6QD49Cq=8o41~VeuSqe zMA1*s0%gWCa=CJuP-rwTo%tY2EjJI!&aNC5;Bt=M{Y^$0!*EKTqwJ0j(q=HerhAM6 zY6Ue3d=dnSx!U0+N*e{VLm^X?GsBLj%8hKIZ#@DDvP+n3l!|&BiV2*v{v#tqB98SB0G$n+r*BH4x*|Y>68-jO1)+mb82-tdmuZM z7#>csS+GwdfW`KsMTM{%liBGtrPrVsS3fzeJrHarDsH`dU4B%dcTC@V6nV9@_3j#~ zGapTYUf6$&)|3|i!_FtawYu6`^#=>V#28ltF#a+>bZt<@?&~-aIrch{*jY?hek7UA zimZvASI7ev)>GAWH|l4@z-d9%9uPk>jb5BgPLYLgvG~m6< zORI#npaf@)1?mtbvoL>gl)@4Qon4uG4q2q?yU)lovXC{#V)tvXQp$=cP45i^0^;Xf z*J~~ph#E?Z1rLfK>#(0sPO4_SGF!?F?s$!`00Mmt4%083K3^wZ*F)mBT(|#QU*U z_S~31ZPdb<#tQcbW?)aq!S3eqoBhLga5_ z&jaNYbrvP5R&OYitbt>ZRif2-v_cm~M`0L%XSX4lTpBXM?hB}Dp|YiraN(SVPI&hl zbr_DyiA$xTvTMJg51X3t`NL{EqBJIy;Hr&+UM%B(w7tq}an>Zs)p+)PqY6>!zZ<=~ z7Y3p7ihU?Up)Fge;JR##4gMg8ON|JTfY(2p>U&3Kv}w=91#KeKTs5o5&p zy(_@K44ON|*hVe~;~Yd2{yI*sA&k2AxGf&x+Q1ofHtMS#b1zfU@*QOnW-Qm;AJ@tC zLw3w3c#g2+c*1y4&HJDcz1+Fd0{Tf3RA+?5AB?=KP9=ezjEQGyvP3cr4^{iZ$bF;- zc+&J!y4P@g5hd}MrVFHSvuq+-t+AmdM*i=U93N0%lUd)Qa8a49K+4)2Uwc|!IZ&_T zX^M*0nAhHNB?WWl1ao;}yw>o?og@ECkYn%tR++XOA^2#T(%6kRgk3tesC z#Q*OXU5aPswnx-1%j(K1dv2`pS(v#b9#UQ}J&BNrcRUTLd==yi1OL<>xryj;+Y%VV zz*~c4Mu-Oth*2Ewf!OQ5*bvVcdZ$Rws7>xZXTPs?eeZ}3k+G8Dbp~LURLUbvbkl_& zn)rvkh9BS$ly4J?XKyw+Pl7%MW_O>k=GjFe`xEq!K3UiL=sca;*!CRJMv4-2u!3}( zlw=cLmjD&Tlpj2mJI7SdzUw}DfDVnnM5+0lJ5vaWG@@XE<1SnK~Zy-j9{p|q7y)S3CJ5{Kv7(_ zR?{Bx=2X%?ovWEUJ>3BYq~Dv%>?i zA&a^_IV73jfKqdY(^^?wm&}0JG|W+;MO9Qac1R}{eo8J%@|gh8XSbMJYIV!)Zh9pr zDDT97rJ80Ye7z7VlewoMNjn{TpTa^oF{^r!aiUL_+PV{PeXP6w;%l+pDfjs=wWO!N0 zf%Sf@?(IUBG-cbB8|Q{$_<>LFotObEx~rAGGWyQwhx8%T+TQK0QK6}%`3Z3HcFs;# zoz5sBNrIzbNNloz_5kn z_z51X1HJW@84Tm6yY8}ghfElJD963<&Zul=l3HfT3{V}YD4B_o232q@G#cB6bs`X>>jo zMdV^s({XgzBEF9LsH_J=z`Fj7t)lGsuKRL%UL~Zo*{T}w8+G;BWt;seynck`$-PMs zB~%lqFBL4xo39Jw^bt%qFD3won@X=PUhQ7GDGA>}-VAgxPESP9Y1$Ob5fzP~7no6^ zn=m(hnT%ux=HFD6KQmZisZ(=^YJ__J9tkuOW%?**7-mL-*C-lMId@>#24$9od}QO; z3(wBNo(o__0-(BxU zry1wy+Phymf8IQ##z*__w%NDc_uDn2Sz-Df3L;b3entg&S5k}PvP@QcaZuuEUPPQkw#qBhdH8fKJf_4PF ziJ8AJ#2w-cxEF%%k;=%^NIsF%u}pj9zi*(OA zQy98q=#OpIDb>qr@!6LyjI6t8su#5)Y|qfzKLDT_x*&yVYcuK99s=Nrgt!VTG6Fr3 z>;rxn)!HRKTTL$~1$4O|7r!_VRS3m~gEEZdGzx#mmMd}IvT$|ya$!oWj;iXLTLU2D z?p38$zyk4S>Kxptuc|M_!9OV$veDjEsh6Ro>_7hgKdG>EK}aJ?Dd3W?Z{BlAhPYr1 zk69uI=vJsw7o%EjAPm@l&Vpq6E2vA6T!q?nfh^?;t~=n1Pp29R`U(}0rvg}bW_SfD z%w73$KLK4`hQY_qLc}!}RjsZt>e!7qiy)OwSiSN9{tRuSJHDVbZ$Wp#askh6fCug?C*WO zL7_$aymQqf&DDlkyxt7#yvFfcx);jr+v!Y_=z?8TIvtD%;p{_zMPYQoD6TA$RKsBZ z`0e&#XZQ7+-OV45=)U`CxPSV$ty=m0mKPYnv>qZiEDqeU`k;Ec&{R({)dc`BOEnj{ z4`+w*@J=amWr2;)v9!FRA>83{letzH3OR)5=n(H%TU`x7+yH`f189%n#_{+O*OK)^ zN-xdFk)1{JfYB0slNt+dIpnT5Pfip29@^=^Em-q=VT2o`C7B=w8F0EPxjdIlvh z?#mzE~4-<8z(!NowE5w;!Vy1GUZ{E`2@;ffb$W%LC2)e!OOcw z=1|(e(D}q{jw5nU0vM_9{i6Knc_JK0@W{ZNbREp5+pcTyimI}w*Ng{UwM5-WS(4oX z*vM{qBz59oDv_Ze5E?Pgot#fQS5O=edjohImyMvTXc;4vVHWsJVRU~c<@7{a)kd`bk(5@uweC?f-wjJ{qa+t{J2JpBGl7DaC1fBnIW+GpyfsXanN zE|nZsAMUF$Lo{t5Rj2J>fnpwzE5G96Z9E2 z362u%RoN|8FuF~LV9`K@c~{yLv}?am+$-y**@fCBW`YK3l{ET66~77_BG4rARqk0o ztPC8Sy;e$UhjU5wWVjzzW#(W^u4EGr#vJakd#PlJSBoYCCUUiS2!4wi`IFwD_Hdo# z8eGIK*9{kKoa&s7F33GQiIfyLQ3eer`9*1PI&>YY29|;>9BKJ-S%rRencv>=DcA-j zj_p(|70qS`ZWhAws#LcvE?M(J_9&k@ZV1Y&Kvo7YeTRhyScb=leOu=<*^d&Cz?l@& zq+M_srC~O}SA&3qTkM?FCJB|wgCq=}Jic#@Yd%-#tXvYut|2gQ0TVf08+G=dywz2y zczC2|?6G?o5BcPI_ql~Hjp^RgkHL}oGzo)`#_b3h!h)6Hw8d5Pj3%N=nFyjJXR5^r zNXy9n;aOdE- zbMSWaXuET`{h#l54!2*c%6b%`u})dZ?7RZTyZZ;nJNtW^yXxI^5Dtf6?1pL{(RebO zl7|NS7SE>oSM{(18fL2n|E-eC`8s5x?1bZs&P9-(D`u-T6R0M&h3+^ebrJ6SOasEUv++9PUS?v(m_7&M*3 zxg$^gs~-HNr~uayo<9xdyAM1am~lBHtleX8H!A?c!2Ac>2X>EzDVxcf?<)NHqHP}h z?o7@Bybl~4f~NB|3IaeUa8od`P9C9khn@asT+y*{F+Ke|` zuZF&zjs=oIZc2lP72e=5CnezODqOJH*~^bpHq*eo*evCAS8D7ie)?*&O;wq38R++0~%@eb&%b#K*WT!t(NTv|Zx>upicpU7Z9>DWkn z$-VhGf)MWK6qmg2s*z&>#2#D}vr#Xn73=*x8goeqQabdy7W7`ui|p!B^j2PfDBq%^ zJ9~+bZsgTTlETQHX(qv`!Vywexbs(Un<*<={%Y$A;V0pFcr_^$HBsRvGf)u5@5j;A zBfJa@$X9}w=I+N+{M3L719}n}A*+h)tL&Zw**j?Y2qs%*CYZC^7lv~|b#l-eLQ+YF z!T8*8=VKjrZ&sWB>Rs1gkOGTHP;8b6ebak0wwo@(;q`)Dy(}Si@IsKaas2FB-K^cU zN*1dE7ANdl(Vhnr=rMKMv404GM&Y8zS`M#iLDY*WWa(mWA0oa@Pmynm{=w(AmbKnJ z`D^g#*LJtD;NWg1&HuV97#xpjVRs{T`x<)P38s>hU;oQVMffsc&D#-U1eX=kaWd|d znJ~6&=hK1jy%SCJ1K~2xfRZPIU%G2K%VpdG{s_(Y{fOd&tJky_On8x)G1Tp58!&jJ z2z0KVwn-Lrow!^4HVhq+QUa2x17jB{YqdBLel}{apZv$s{@zc~v|V@9`21Tu7>Bz<;@nKZAH9e;X_}RfExT+kSV|KLN7E|19%&^)kZnx-97IeEqMZ z_UbbK+3MQS{ASP`-Q_ed!E{-d!Q7bUz_P~hDMdA-059D=L>XTCmS>4DqKWQXK-~yf z(*mzB6+JFN?Nh;RdNtr2or+zSxC-kX=IFyKPF$vH9oG&Q`wka+4?Bac=5=2{=QZ6< z%IL-MV~KmXA^f`1+JPdI{N%WbcrKfMszC?cC5k%$l>!p7>!8U=yg$R$)F?h;_oWtvpw*l?)oxx6`KS_L?el2|@`blQ2jG_a?6~Wk4e5;fZU)bZHkx0S8Gw~kPUzlzuSNsIcT0P zd6>3d(tCqU5ZVRF0nCVEfeV?N3m7imwqu3)wwO4v`Ll(vvfMzo-3z|p;s)Ti)G6T! z_w+N$5|Ob>>G{Ij)B!%XdW=DG6*sB_{%^ZeDL%&Dso7s2Zl@ybFFW-&-l_BLQTG40 z$`wwt%L1l6-7piH#{AyRXLKB^(c(v1dg$Nu*ql<~FO<8e5jo~Vp5T5zQZftX2g+iu zn`EWl6EGYO@5^qoJHcc(_V*7wlc?Cl1xO9d%W#whU#0)V#q( z5DmdwL2PnaOj_pIPT7W4OEy{bo(eI^ju`}cd?UZL-d)QtYM_f!XwTa*UgAM%%?WW*x>Ie5C?D-=4D^qi|(Ei_& zn1QOW^ia_2g%hpr5*T35>F^fg5@j$TIJuggWrdafz0T|Hcbj{!JBQmx z`|l68wvReno5$Nf?jQc5dEz)A;0szL;0T4sSHeyHIn^i(-^WYQnc%7i2Gl7 z?vXWG03yMV99j57-l?c`LUmPTj40riTLD6?uU^BE^gdn3l3=`!(8y_lIZh_RWJA~f zK8E03)fXc)2qHz{wL>AQ9d?k9gL8T)Lw-ii2)VC2)g_l8gCLtdp>wXZO4=}gCs)zuhuo07<4g&6qk0Gv8 z7`Ln;EiWC^T|5r?#PW@Yb7HjQ%zFXfJ>Nn4u55yAW!5OR6&Q|L&wW8}qq)02(fV!@ zB2I!kY=rf2+W9J%&G_;S~F zvF)75Fc)if%1imDv!k;@mn%bdApF}4hE;z)*;EXz!zFMgnc6=s;?6G1$B7zn6pv?~ zRYoQZlK<@tK&TBdGJ?YDURzcOC_>)U;*j zU2aw^&dU&sN3!ttLcu%D6gO^qmmviE#N%^zY=H9_KRA>d4EoiOWZ4fd!eKlKMGE71 zGF38`91)%zV0a-fEh}aXipED&0ca+D(bR5{tLqm;4yN`jicAty4-$Y+HE*I!kyz6a z539+ESU)(jDbWSKqcC;iqWtSsaW*v$s0$`*D2jL?I7T_ftKi7AYHGLOoL&6dV{IUw z93q(f5MR;Z$v*!%3NKsiZ%aymtySc@3p(uDo7TbpJp+l8LM+2%y~U?@dY7(8N_VwBnLE;TL>^w;t8iwlVudqW%$)`BO#^-0=;4K#?AtcXg>N1f$M7dOCp6iL2_>8_D zau;!R=`hl2GxCj*V4#f3q+}*P;6>%=GV>RRJM-_w^+55XSkBwH$M*Ko>z{m{X8m5U zG5n#nGh)|G!ObA+D5NZ5-)rp!)JbK+>%t;yk)V1%x1SRB;4R1?xP?xbF^#YHuwQaG zee$Ql>od@#?r2lQovR=92Ew|>Se#xhMs~RnS65rJF$yLNdz%@sbF5ZwNf()?5O&YU zph(T9LZh4C+yRY;jbm^STFUkBxd|#UUyepptE*#-EWu!h5#ypFdX$P(ic9@GxnzF0 z7Rs@vrhy{psU2}3EVsgdehLw!*V!Vl6nmjB;=(DU)HDGZ?z}tLKRn*tJI0W^`@^)2 zV5|PUOiw24Jc}&$Yw-%0)gHU7I5Hxb`Cc^m|19j4=NB0Tla0FioM&+2iA$iQQilG8 zZ^I=yFE|y+f#D~pta~mBoGXb`moQ_9bqTZTd88gJpOg+L2c5-IO1arU5B)1ZTD4c@ zG=O!$z;5L|n7f&L-S2g(;M`q7sYQM*6r(yUNo=R$qB`DAoR9Gelu7AZpsPc?XFtm=|BGd zKVF^JAPgjL6zdQv=BWJdoLDOfMc|%O+Fao+l`MAdFuMS~h@-_!R&a%n$9hF6tvTJJ zvp5R}HPAgmmMq7;U~>qi$Q}@_{c`MEs*Hy@3`f(0 zXnYz6Nq^oE%Ph-A{02}&*G9uRYSC}k$mbl5MON-Kq^fUu`$mGq>@t)#1nOU8aB6b7 zLsbWDN-d*#d(}u;%saOUV+@{o=4&zqSnx;SGZ2n}hIPya0cxrt!Zb=#(r8A!(jU7) z%Swb=-}$xX6=%a0P)d1yxGwS#3`LfA!8*k0@U3DebbV|iR+js;tYt>pSTB-;1K;Uyt$;p~fihP-rrEyrjq=KvG&Q5|&) zmgn`%vh^HfYyT8H4&G5hwOX}z>>5+WtuuwA@W1ZWG)7~hhQo@jVTDG_RpF}bh3F~$ zP%FarXX$e6f{MAb=B7xZNwet_-Zb0R9BBE#p_D8KUZ>P`U!M-+-bYm_R&>1~ial^P z!-if5QLO2?-+Ltwz~|2e5F4nY{ww!pOr@U_R?j47TlKr zW(TiK_z5xF@Ng9O2U7zuS*ld`E=+=>^6|oJncI>zYnV^A;8G;}FSd4>Jv-WBqPUJU z?}|#EE_DhUc1M9m4BCZNJtvb6RDsPe?fEmm90raxmvB5@!xlinyd<+RHoq77lw7XW zI%h`1)*J7Nx%X^LzRcv-vI>z44!TP1NRI0K*X4GVN|5&@5P@EW+{&W-u$myAXgM%u zsEJWcA-i;>&dXz-pCp#LS7-s*biogzLzP};q_IrfMcHi!A@H`mgHP4@!b>c+_6+DeR}7jA z+$rI!E6A&4D?|)1ZKFMHfoUhf|3nxRY1itCP-zVrd>s%@FysiBdUUMhvKL^9L z+Fg}0>V!gGhL8tY03*#H0K9*G!5sf1bi9IcM~dQ|`c|iiA$&oFs?~c7t}&oG!vw-Z zD3GP=Hqk>KWe?4@o?LIJ9G3E}z~1y5`Mu@#e~rUZXYbpnxeRJ^UppnZx-7>4{ni%0 zf}&mZ!7idYU5*{6%R+RCU~Ii)5sAVJ|CAIerH_9;xdW(EfRw}uGE|nhShGr`xh~)- z`Vo!*#RSVcusd`RY&8b~aXS)yY}EOu4rZ}+yT_;uw-PmSpUq3mgc?ssx~>+)w*$?l z$_|sYX{mc96gfn*pX%FiJ1E{9{K~|TpK(ufx)yfV$MHDqVtEv9xx}%+uR`;r`ZL1w zWQj;kzc2kGNPkah4GaLhbW|{`E(UGtK3F3tkg3J=g5%bV^&xDqr_!mw_ui*q>FF7X z4k<`uHWpsXS+j%4oiQ7OwL(*YHrX}Ph}{r=&o~bx6u}5Tj^oQQhHH>7Xw!Bsg%~~7 zaHxARQC}j44tz^6a!wOwV2Q#Z2F6K4B$ez;LThPqO_{Q?ECvn8Y>gL??iALLeKre4 zMZi5}3Xc@+&{}>GG6IX?@IiR>5PK#w?3p=XjJ}fS{5&*g9xm`!>8}MV8(I4r4HtRk zcIE|^N@z^teZTWyFmVr-C+6lZUqUO${-Tz!EeI4ZXl1Fn#k@HAmMR1jxZpULSWbB- zdyqLbSSp2h+XA>zcu-D4-h01IMsF-e{OCYvXSw3s$=ghRk1ixwr;1zfX~$|&Up=&z z@e09uIyv51b-oI50>at@?0yuT52oH_Kq*}b3+0gQL_~MP#KN@uMQUxb=V{A-A}i^2gEs3na~`>R(^0|DHS&UDu!a+AS;HJXK$5b%kh4G zm4wq-GWJdcxiKWKuG=E<*VVO_mN5;<$uA#Akoj1TayJ=3HF0j8HEOu73uRNpX6P>q z%~70Q<<1d%_L=91^;kYftdV1mf?*UulI32UBACikH@#Spyrvfg^aT$;^W;I7<+BH^ z79z1ra1~#0s_@-{+2YSX^MvtU%jb+Y)Td4Th5y3;|KR?|M6Z?%*m~4s?7w9kPOW}A zY^nIFhAefRBm&;GFX^y%8O@18yT{t5g2$&+VKpZ&pm z{D;r*Zxb!F&FDSb<5gU9MpOe5N?;+@^C9j_N+}<#Ry40JvYT&1M z5q3EDXff1=n1@e%f}4(%BG6$KB<51z3x$F1e{poMy`}kINQYj~gfz(?z&1!2JVXfj zb{u&o&{6Lm9(EGSg1D|1StW%YKn5){Xuh;-DP_4}lCl`{)oocsl zkQCRQ%^#_2hVd(UG&~Ywtn*cIA@bC;;FP>dLnFvP_bsEg5&26&at#`t_KKBKgIBwT zV@B8-MC7TOzB(YWUjPcP1`YQdzDfc}0YEw-d8PMeV+hJUALE)7ECNbxa{0Ii6K~(p zZbq-T7SALJ_Pgy)B0HnRL3PXDq~YD*Rmuu#M^MT=p8|q1pk#vvwYVYA1P3V1Z0H81 z8ZP-dK!1C-IAQ3T42 z?Q(#U4dh&nqoL;_3$%Tye_2q_prN(M2W5J;I6xT<8bzSkEv6$lmYWzBj+A%EQnevj%JP|;HdRh2~X{EVIIAFN;e@( z0x*1;OGo%aMpM*6Lm%&V@)+|p?xb4J%X!jLcjX57@?CfNVKIZ+w&&+s)z<9E0TVXW zaePiw=A$fihv&rxM~?&{_Ki>QvaHm@-!+d4*3kUn<=u@bz9bY^T@@P$hqWx(cf#xIc_I87_Lcc$o_>);WsH^kFM|*`vwRwAm93;V1B4S1$ z>WeaptlZ!P-Fe6)FxQ$e!Dyk8`cwp|GQJ3bi}oCyMm(Fc8H;wA$Y4z!mQgMcUIJXw z($$u8kiX(Q30r2tWe!t3jWIe*<3J7+0rLrux<{Bf;ww06s#HUfmMs->!s8ZHnTOIe z?nM|jh9VW*H5^^{!UU^4;yWl@Yk@;*bHQa2FKCU@i33Q^Iis6Eo14>&gszm|&Gaw= ze=`@t@tEC}sP@@36AVf;gNt1}hsRnFHqjKDPE01Bp{WTk=PfNbuDxsIx#59+O0J9G zE`D7)b%sP$IEQI8ikO&649s}#4)f##(M9`5r9Enb*S-4#opWi2nt0~yP`Zc9(C9&E z2S{j1n?%JQ#wHjxk&BnW-18+CPBey**f=cm7^=8pymVbmN|~c`P?`eAQ684tp0tou zeN2u(ygbCko$96Y_V@`=cOAF+!3P;}4*az;c5VgS=Do$rtLhdq@*jgzC^KU7Q*_o$@w2s$|G?KSG zyir}#A&#S=u6$(2oqYK9*9FW*IWvghB~RDW=x`XXUDwUk&X;w~jQz51$924Xd+V8^ zkETITSzF{RxEs!)YOuBZX$X7V<4%i}Xb0_u$S6C8N}S!y`3-)fx`F|&2f&`O)V#@t z8H#5p;Bd7#lYOI5Imj6o9g;d2VwyY|KY`+K(kTFNGQ;=iENBb%-UVY{ui5SkDU z&)hdO1<4&Sk1`gbH*tE1F!@6!jGeKI`Y2kg2?g1e?ulGjYxi86dyeNr= z{4S@clu@O~^CWhmMp#H!c_x2;(`Z6MEAaRnUhsW8;>pLzE5TI0aD@r${~}W11^?2N zSd|DDBASQ4S#62bk2)1vo+z@mh8PQKM99x5nyMsYnBIxKbpvc$QRN*fsLP1se=Sk4 zCKpi}okqiGdM)a7=BZPv5e1#mjHKi#i2jKAE+`s{01MB}o%`VlKmZO0KYbDEe=qWX z9}LYxLpr|;Xo>v4#vWSo|F=)qo_vx2f6wy2bjQ97k}(|A7)1xp8d9t439`}k2=YFV zFIm6Vs7>+!gQI)vS3R=M@dtLEL7mhPg0DOq&A3HRbO^1wH*MS%>C+xzb z>({>U+b{gz&Htr-6ayLNJ^@Pj|94N;9^3k#$7@f&@c-X4{|C9%urGR4e%ob1%!C+-rT@B_>j%*MFTSMbSl1e1ltZ9zsxBk%?Pv;^4tpoZYH86 zNTn|R5~?sYa$6yEi2Zn5qfWK@j>3dop&K~KG59~-R+HR z3?ZUsb*#Ct*5?$4s<}#q7SU(~JnW zNQTvLXy27fr!wyAuc+aG)iiff8epr$Wy>4crmR&O^!1D+Qb@O1@dCuApw^MZ^nuV~ ztX_l(lyB=8c{4U}k(L~GSRSz=akIRsWjk~{+~7HP?Ubli+Dv3nTih7yl%joVwK z;p1y|ecl~7F;M^3rPeYbpud6(R-Vb-;8xDY#Tb}@Ahr+0mpkP@;r;J#X*^ym?7M3G zH+TS8_rJBZweP>&|9)@xzyCPe-!rY6OSE>TiHJM!I+G+C*&uFsqV!a( zDH?XPSHPEG`NMeG66#^JETQzfQcI+jpQAO!(R!zXRy1xy<2egoaw9j|EF%&a$f z!UOS=vCtx(wI+M4HI~ddQcutpsAC6f!$!?1s3EV7MjI=t)aX@AOr}%$K=dhoDCkl) zDe6&7Q>I7xK=dfrH@`>Og!iZ?tcbwHLKQ$-^Ph!itOHk~EB&fsN8={)#dn0SWp`WNW%h$P(i4Dcw3 z&|2f22EC7@RS}5^=}K;O`dlAd%JAlW(u|Yh>?73b8bgJPM{x6vFuxf`lzm})G=(cM z+NQ|kWvnS&%muuR&ZZsSU3L|Xr?8a9FUSeR3Yt&G(eS0YHyk4J5_gl}!DyjK;bAE# zMdfF5n81}X`8SPiWhuw)0p7*8*qt_pS;4g-pK@+XbLDhd$~vVx&dU|E@2YB7?Je|8 z02>+%l+IcBPZR52ZY(d0MR6Xur{THgBEk#sGm|;h?AX0%gY(vSm<*F;_@4I=FkpA3~1&-smOj__i8IQ0OhXce;9ul zuiS(_*Dq?p?BIw_VBJ?N`fxugQeHC|vLR7{_OIB;rNkl?pqW6$ULlE^WJ1Th7K`GR zO!$r~=@O$>QL^wKm_{W9H3ga&8_`s$zm=ANS84Gwd6M~)hMlxN6`C(gPSVmbqeBk$ z+|27ZFEw-KM}dHL;%9`lywgq>Eb?B;iUOMalJ}B!k_#DgrSJq{r^dJbV{NMZ?3A$n zzRD?*mLs zyTlAYHX8bzm~2Pxiwc8v(P%C;iam-k+!B9WAnOhS0zGDX$6l4L&CFY_p~bIah+dB4 zh@Pj`K}IiJV<`tU-+s&r3J-QY{GyusqW=T^ACFeOj|Q+<|M&FSlkaW+kF}@YefLHG z_c{Jafw=+^w3ysD8%}FWbG;OdgW>hBP^NaNlCqI}OLp;Pc2^C1AFUXDGTf7^A>8n| z2V!bUaFo!cAEwbcq<;asGZjaUz4IB9EE#xSNdP3&p?AhzRss|kAi)R+WSvHkUIH(h zV0z<@D(C_bVE%p#bAXiVl%!h6i3UsqTbkboh4lwB>MCR;y*hMn6Fns@yG@W?jHG5L z6iqU7mtXI@6x)7@0sG{>aHm%~*DPg_O{WkEfVAX#K;)AyEfqVQG(CZ@3e`X@SDZlj z`(Vix3T@`s5{A$Gk><>%!!Jd2+t6=$`U5{oJHgBPk?VlAU0AF!$hdy?_?4&>02ADa z#^~F$loNO?UJ^4!>42Ts+V@`_C5QY2fa?g}^bo=8uW{Mc0WqP={2i~R9pM+V;mJE} zCHtUUV%ROIV>1MO%sv%(H-|`6cRa7rH4{qlYE6uT{Bcxt-wG$eJ1@picRxRkbA`+= z6G)`h_b}5-u5|#YY)Q+}g8j1zA-q#qIGeDvDdMoh4n~Suq1`w};cL+EWFjRqZ5W*< zy-qgulLw)Z)P)*MXAs994b^#=poJaPkSNC^Yfqyzk4pJyeYRR1WZ3L_$X={9z2)P~ zY|2DkV@Qez1bElAy_%PMn5Kd|5e?%2%BPT$#H6^p<%UzEE-*6mwV&3!^3^L!9RZ~5 zSuAieI~_(Yj!jXuL?bWSSWpLblyvF|n~_W@vTLLi(aDeAPz1;!fQN;c3tnL6#=A{! zy~HP5!-ltxO=XTsw<#?LPjMvAgQ<8&;VPk2!B)f}+z)scxk}B-e3|`M(}5tewZ?p>-j96OfNoOIHBVEgb8^kG z5bQdbo0;uc%InK>gmQS!a0j4X+0CQUgn*`U$6~mP;6X&g(TDLq;M5fDtrYEwpTJWJ%N0xCDzW zyv{2i@?Oh&Z?1JV4xRW~6NP&I4BX3~Win(~k za+h4AeMuX|xp0gZ8yi=TEcxB`By`^#6sclrI8O8N;)n2{M-L(J>X zuoVJ^r zOi6d$$Qi#jbW*3-83z?|ST}>URGFmbn1%{h2KfjC4l)O<@@iqdS&~xC4pQT{vo9$Y z!)tUHl~(Zrr2X#l4N?%qPo^s_q{B~VBM2n5eS5d~6TE!u{kTI})Nar~O7Lbwwzz7} z3hrcVD!6(Lg7NuB#76>dif)~_fTSf};~#Q|Z(s5q!!esw*oZ&q@JoIAXoEx4A2lT3bp^NB$g zK(_qL9eIt@k3Zd)WE@^ig%qR(8)_5L!T{4s@J0Z`%RP;f+`OW&i!5x3~Fj+k3lxxLt#-PQPux+uYgZKi-vI z5vX@D-TW)1p`%$2$KGtx$025Ep@x2JJV)KUSMW;H$vrqLPbY6*zc8lrf>N7iYT!6# zM7Wo-8QD}`w5dEPD^OLXfsuu_GZ$0R-l=N>FF!0s=#T?9@ey)@zn%n-e(khR9zXgM zepvmtR#ZH84ZffVZb&xwp-l)iBl9?->uvq%PhQlAf(>U86C)pJ)|hlP3XrxI}9Y%hYZTMz98A> z#v}gg{U-%Ui(M?O6P4Z2#zph8D3J`}Q8)?CtFu1wLVcjeeBn)kvp?w_fa-XIhz49{ z8%(E@^;T>9FPrZUcDL`!W=-@drc8WCy|8^cW~eFWXuQv?oh6J7WA>NI^QK;@tB=Oy zsGmE$mdZ6LBSqFxk7}i++{R0;sZ*4W{SCQ`~;GT<@;jFz9#PM&>@8 z9S}G_P6h4{fOtHLrgGJ~S-dAncotn{k@n`oTAG4u&4--nUOZwfbe;))81hDw(;UQ& z?dw{K86F-wJi(%XN=?q4#Mtlfsjc%1XsEl&=N>n_JKeU#eam2TPDVQ1io|IXuK@F5jkdqoEjlS<$+Waqs<+|73kK>YZ)83oZNc_JYJ55l0|nh#SB z5U8|5w*CZb{u)isub1i!$HriU&^ zFd)F76jz(ym13l(N}d<0x+8X()w1Un{t>oNMtp<2v{a<}#v$7UYt>29L1tqu za`P2gc+sgixQLTZd^X1=*!8+~AGTb+Hf+yg>5^9OH_EQ2uI^wlxUyB{kjoIQmTx#3 zd-yJpJQGL5;n@T6MHvcMc>?7db&XqTWpBmfG;3gfeYCs2t_o)#Zyy~~;cS&4Ak8S; zT%gs)oMs&69E+gh9l572R!YPZl*vNVyRIx$Df;rW6`_x0{b2PrFD3`JypdAy%!c$IMj(jSH8T{pi7uq)@G|+>GxU=9P{uyF>yvJNL>V ze{6g0YkY^E#j`OZjbGv!O;va`VWLX}1rhsUZ-^#cJtrY1ssQ6V!v}kLC}9S5N}b7o z9ii24k;Yp(ht}?pdK>*RiS>(_Afi3?u@bTF$fhdVcX)gJ^T=ico4dQ6qpic8gX7M@ z+s&ix&QIIF9A#ZzGXS%)wOdrs$4Nd}3J|a6z=jVrknI90M%H0}G=M9N`G`FP25;!V zPmoyKcik+vVEkfJ_~xi89|?k}G8+aS{&Kz~z;kvg-vB=IRwqUWhui=8e&>)eVCac0 zPi7&>(BXo-=n`by_|ieh1WaRg#Wb-ga`(O1+7wJ4AE`B0+ke^KdVjpLzt=g~Kia_$ zxFnJ%nf-)UVQ+?B0+Tq6Fxss#_xy-!j|AokVBD!8GdxGPd{*?CtxmC(={0Y9s!{BH z*d7~eKO6<)eh2C)p%`14`8nRzmD~g2nIt(Oe!ndx7B>3V+wV5_Ub9_wwEzBaYx}6P zwRyb#$HL~MkC4zB&2!)Tv3hP>pi(u`FJ0i4jiZ7 zAe_UTOU>&J!7|It@UE(h1>9BhCEZ>1Cp;yXna7|4V+3SS1B0Ku9?xK7l>g%HflREB zG9?xN6Zs!9T0+oG6x|k6IIUmS*N4Gu+#7U)eS*O;0ip+FZeb0a1%E+P)etGadX|u^rwl+6b!R74 z@rV3VonCwqCc$|~c%Nu#OWNAOa$+`aFNXUmg?cLV4WL!ghFIp|FdRm|!f4CzHd{Xw z;wIFpn4iv~VZUSSEJZJ_hYw9Iu0Fc{LwoL!;>C>2ce|^Xsc2;WgIN;Qma3>TO>HRG zKeqn5a`XOhhuuxj+0E$g-*lxO=zkb=1`JwIp0aaO-$~s;D<3XzW<_grB&>}X2K%Kc z-fP$}bW0Y!>i6Q&d<)^2$h_{Ca)x4>r7kZoO6{&2?d& zfmF;o>+l`N>^zl14^03?Cqe#y z@9pvNLDK~Z{q9*WAvQVku#!x8##l0Fo65D;i<^ylQ84U`!hRGm!W+(EKr&yned9EH zO}gG{P1$~fIC93FDm%{DT}aitY%}+RGhufR4-<8i8!4~sG-+trSq2#s0_`LE2$v5Vlqpi1_dp~aP?*CXiO|l1R zZWBLzy2;|Hb1)HSb03qLw2iD0}$N8dd6vES*Q7Qm2`TYv{g)nUc zhEOPHJLyQk7C^o_j>nIJ;e_!P*lSTwxoJbz2Y$K4LfXYbsxkWkYZzeGBR553s(_=}=_9nbi~I^AlwU6fs!{@|sD7D9fC+*scK{dvskkcU zWE!1DVw5q2}-S~*aZnJe~{wA zmZY1}lb=}yLaC;drRk&5ZYUqwdNL zgK^h|&i$f@kP37vu>vHUUQWqP?vU2+h@=>WL~&x~o^vdXa#56pMdKbRE_zzE;-=Mc zqYMaol2&}(DE&!c2OFyNcWRN67&!jLDyWX?%8l$xHir1Vjv`?uRZDYJ3@ts!@NAWZ zjwlL3$Syf2z%*vGutn0D<527~X}C8XUgvSqQaNd!#9juBm(H5eR{EGzlWN7g2EB?j zE~h+?i%k=9g7U1m23*-%WON+D599h;BeRgX9hu4b*m&~#)7T^Za+}HX!5=8hz?eQA zFeV2oEJ5?9DyN^rEhqz2A#38QX}i!OE*cqHuvV?%$VTGOa=robJm5nGE!Z2KUZp#6 zUUrjZ)CfiwBwKJtc*I1c7{P=r;J~Y<;I5I)>6gvwSC;3mY-3WuxKO})4k5!OixgZY zsJJlD-@jkhxxEj!9245I>*-}bbxvpFJ~T((kX+zC8>G2uV|3SQ?}B}dfvL*iLG_cS z>@&_K7(hqcH+%$sFdU)|b#!ZO(UAy#GxVo4ksCI=jF#Ol1ZdE*J)4!N5naJ8KkqvV zx?rMp)(5UesMeW8&f|%2eVS@9nwiyb8Y{&LVZMIWBs=>}*YrDK>C4z;^1Lz%G>RQc z@^7k2jSS}nT$J$k#x5igsORgzaVFr{PJTahjB3@+2nLl@%joQ_!$~iQz(vPR@k-l~ z7FQ)bJJ!##5~ac@0CYf$zq$%@OTAY<{tf9uC8jf0#G={ati73xr`aP-d(kjS=}fzz z12Yr6BNy2m`ATInGM=bZb;-omI^-j>IIo@?(c+_>)1)C#l?loj0XK&L(Q}QAn3#G9zM6E1m4xTZQ@a(w5ztIgZC63V$EL@WC_CQx#aa zn&7V$(%~5yzS#*ROCwNJWmXJY7J&@Z7u%<>Cmj3N2Y-e5lB(FS+ub?_c=C`@*p}0> zpoFq%uSheN&WVt>HH_XPo2uNZL$^{&`?Z2{3f^_8r8Fp{p2}nSh3CZm=Cs-d(Fu7D zhiwySoB`!!BVvFJ;%Y)*CwX>vp@;7BT;Ud@;BQRW%q+b3wY}Ju5|iyR^{U^CXXB~= zYna3@t1qqyvtu$prZf}F=~_F-1xU4_vq0@jw(rrRu%5Fy9V63e*-zPY7exjkhqXr! zEM?714z4iTux9f_d;2U(Qg$}o-g+l(tJnfrhKzN2q_5Z`tq)h71`fd$2U)Tz!v-eJbw1=<0qE?&y#20KmFqW^Ev+A&y(lS za``ap*_o|0E~1xxxE`IxLvn9H;euU%IIZa~Se6m#83L~?xgej2%Ar%Ms+V4P06qUf zY{64vj&7AGhIQ6*hNfX43Sr)(PfjBc1X=_w0YSyUokP}j_Y#aVbQ@iD-DSP+^zXsih0D=*@~k22rQ>E0IeB+J0#q4 z5KT|Rmz~WRuxXy{uXvI@3q|(8gsBT!cEL{8SXD&LV$U9%Xt?Jcnh6swxCFKHt>YQb zqyzrq3tkFX!lBB)=tRS*<}yePNHQ`}lys~{I?~u&yh#F4uud9t$#XuPMI^t1pz?ml zi)YixEO*1enq$5nrXV%myR?DZkp(IC>vI<==;^)tq#K%Tw_rA*RBagh= zU3*yw=vpD9tcY%dPO4s7)y8xCW*S7BS7XRbam|x-Zlm`*UN?*$;hOJIw%?;yk8L`orFsY8KFOFzfVs7Se{jERya(Q&XZGcna0y(sySLo z!Li~q?Mx{#FzHovGG3`!O~ahb7$6WDbt+O@jjuOyJ$!LSWu?u3&M6gF!-tqu4(ndi z>M)}gRSo7-q3Q*TotL*s3Veh4dMa;KwTgI%=d7%^qt~m_;E9bZ{ZpeUHtF|ObQWJj zfDvRUDAmP)6+(i$hvG9y5CE0exRRyn4Bnwo&|PE=Ov0-uohmvmBUnug%b`{wmTMAa zy-ORf+w{7ETDpzj?cU&YU0npsM)0e60xD?>Cw5|~k!3Mzk#jilZQ0Nk4ylzC3Z+y? zzw0tJJao&0&KzBdedp2!LK_d05-&C-s(K)kGcrA8DuhC3N_1kc$OB*gOq0PxEO$7@ z7d6vwrvE{^x@OMdvPn9JDyUfhv-aKh&usnAcTb*u_eKBnyV3vfMz4={Rm5@q7 z`*f9lms8-aGR#)_1%yIPT!$B3us8sA=0VD?Cb;Wh;%@f)KmPvzAlSr!o&MwR|C49n zhZ6U;2Eleir?PbI@{38Off_@U19FV@p@wLUjzD@Zy=8WD#m{7pXsz7H$+%ng)*Vxm zH*nC4H9Z=B)3d^}D6555gx)BsZX>I=ELswyXngt7{F&m)2pg?77tAr+mbva9)Y7zv zW*wVe35d718y@cpPyP(rGQO?QCC`9|8NaiL6gcg?%E{5aV#L^`#p0eZV@L3!${VjI zEzS^l-dq};YXdQn@)>uWmM$le7)SAi14k`G_u@zzQLW|^T$yaGSF6zm?S(8EnC%!f z`2E?$fCS7x^w#`m{^KU1&&~zV7J6VxpACZqT_xD}NJ|jTmC)E`XwW%M4!byw38a8% zb%~LGm+byCOHi%EIv8FC*K{TX79RtrG~*CxwR z*r)KulpQ_1dpMUMt`mUAE$ZMbe;r zyzy?0UvCXQVLWPhcciqmtkgw2UPUq^TZEjDv@5ni>^uNzK~RItcFeA_Gd}l~_J)*T z9h>-7<{|D74IRJ7uH3qpvzX1yn>usM8z*?cv_*t*n>i_n>bP`0E=C`!o+@%O;A(7LgN$JxT#+3Jjr?0Yv;bKy=pcRP4YAZv?%(K z&X*}0Rw+x_Fr14&E@>qt+&7BLN@@@lZsKZ7NXxf$pUhP;s&M8S~ zc6p+|(Y7@6Il_T<-)A@Y^YE*>4x}+x#F6JvEI6jjHHaIvfG?27@8)Dxy0mO(hs!;l zt?Y6|5@IG3-FyN(C1T4LQ{ic`fQo6|=Id1EG|LY!=M9RwR;kk36&dNKlaY!-T#z>m z&f#*I+2oB8#0X7gQZX!@I?*$+$x2`0)iiI!yp2&qklu1I4pFnKZI`pdp9`sZo%D(? zB>20`rZB-|`Hw=(EX>2El^tzUbQtS^Z4}kPb>7?w<76G?q>Z%_^&hDIYzGwR{kW%% zjX!t6D!OUh+-KK98b?kKvOa40ok}zaX}pZD?&UHzc1U*y}>y$bg27u?*sAf##~xq&lT%o})jPvQ+Pt zwx4QlOy9{WzEbskZhCvskfw!AG1dwoTF{sv8?va=Mir;>$Up~BCdOnM*A_r|l7yh@ z!xDvX6`B)a{(6VMuIH=b038!=y<|*2|1FPh?S6{%j_8lKGwuVAglJ@p?PM_6)m95* z{>mr?*38i^X9_V3r2{xlu?6Ufvm=)_v6bq#P(HQVR#;a#-k&x9Ls&$}fLkH&7V#j_ zqLAujt9$6Z0W(|<^mvQMp~TZM_imkK`6%=XhSf%7)I6ML($$<#VB@4Z&S8WPb#-eR z!&Jb}j^P3Xh?|etjsJSCWqWCy0TO}RTkk9P7)||DWuDQSrBimaaeEKwurTq9THB^$ zSXH^3Btoc8K z9%Pp3a20h6D51lyZ7mddS|r|+Nnoj3&QL};E$+%2CRKBWt}toXF2xt3w-sf0Amt<5 z=mT~LW9~t49?R&7rSP}H&PNdUNYzihGTxDJ!?i7__3tpns)`7po9kQbm! zVz4w5Ygt*!N|bTZCpJtu77^)iN{I(2WKKucjd=!{v`JZ_xF?!+6Esb>XUf8X^)#j1 z7-n}Aaq(QCpNkuW?$hk>6zd>4sXHhBa*3G`X_iid-ba{yoJ$KqOb>a4S4+J^zU1L_ zsW4K)I;CwJzv26*2VZ3G3y1-CbQjrya6!2)$wfA7(w1CT1~sj^87U~mP~@9h%JqiR ztk`CkB@>~6GRE7aziqoliUHd>9nR5MQ557KCSC_WZgshT#ls&AyZkHFmJE*kyR)9P z+mD(D2gMU_7+!=!YXfKk9lr!-MhrQ3d0kAtdUuZ5>jd-0A+)3@6om0SD3f0J4B^bSUQ*;FWw+F2YNSB>ff>WUnLTFg3O6+ME`#UO(U_0A>35%s_cc#RDi&M6?@1HE7jyxH~B02&Ta(tjE2q` z0WfY%6563$|Mi=@hQY|m#C@A_mly2D6R?DrU0OGD+T~VY+}Nn2en;bc;qXkQ9>RzG z>(^iF?lK}!fm-k&1;gD;vAO!!>y(R6ws$;qBWQ$aF0VXaxlss`*QX&|)U>q?s7`mb zCq3mw?ZxtvJx6B5GEZ>S^f2>AwrCLdm9YX+1@D0iQ#^vi{YXFk+33{k2h)IOe#&wK z?n0A!z(xgB2!!V^^%@rru1@05-kxmPbL#uGaYN#9LnTzh7>`pKtwd zm)qW*@v61is55+{pcQUtY+5_qKG<(r$hFw}_HRCD1K3-&{K7|M)<@=^onF@lWUFK3 zVb^>Z9cK^YlCxeYciJc%#Z9knNluMhBh~CE<{Qo@RxbhP^DOJ-d}89uTeLrWoj*yvZ`n$@C^v#~f9%mH?uWkdlY{|}J|&$JR*2wp zNo`eW2+2eL?wWTWhq!^o>%K(l{cn!{Gt~H>BLCCcw~sUSpC`}0`;!0ZcWeKdr~I3) z@0T%y;+O;hpVJl5;qNK(Vv^pZFQ<4y$eXds}= z$bv^(Y#46tcpzxnX>ksxZ7JrXl3dwB#AfK1rY2x7J9B6wbbyRmj8?$Hnq!aF*>pHH zPx=t6n1|C(Yk}7B=M`?jAh)9oXD*YySIMSR5)BAL^s5BJG2f_ z$4{M=<48mW4|ppJOMwJQ0Pd zQOpS_;kRwiydB#CB~nkY=6}cbU(;LjpL!>B|3$+<+j~U6VY+kpg??Tx^z-w`EX)-G zILoPFA7dN{%R7}!y+bvmMQ#|mjvN}J4RgJmz_5i>Sc59nG76X>AB9(BpU_@^g$9pqoWU9KF!#z$PM35y`ru*2mSMVd$OS-Yzz@O_9M7d9#q>Q{hyF-k;i#O#+eV?40FzvFh%t z!5Fnk)C%%!F}Z~w1}?`>&B-e`jb|j$`&L)r=Ad;a*w{E4mhAC)w)paiDpRV zwUzU{0jFkueYa0|Cjhf)$}TpkbHa9*BzG?I&;A%q-_B0i(tK2Ts_>>*V|aw02XF#Mm6PSyPp!fm+ns4oF|@H(%^OQ+DYL5}u{` zzQI2g>VG_Wx@O1!eEal^{pa)Ne_ZkQAm`sC02P}!QIQH#au7$+Oj=if8Lub{5GR{$ z%uD{vRk|BuX(4M`uU}KUVKM-Cp3Y}?e5eZ~IK^pR{ z**0*{QO)K-l=H(Rd8mHwW3KdHg14p7V9arZEZI8v6-F{dkDyp2X3U7;>BN^0eo;dE`Z%joyF^^*Htz~BFm$i$s z8*7>{k)Z=5+_V&km_!qwbjIi<+`+i4%z1_P6DZX4VSMrx6yecY-1#5I%SNjaxcOr2 zt5NxVo&DNS@E}MPG0S0YzHG2$8BRvRZlXXi&Y-go$#ooaz`B#~Nd?>R)*C9#ngHdK zZS@XrVhTVmI*uk{YO#8bdhVx_VKlAR)@zNEwKjAUfr&g9vI4VYfKF{z@8hppSsute z#M{(>Tx;0KIHuxHfJpCnk^h;dyv9@&9WEUL;(On6Rr31@%d(;qKOIYHa$u z#`=f;H;tB?fAIHk_SrR}H(;B1$!(%Bl5GLeTD>Z`ck3V0RU+mk%^YM8@vp4ahrfRK zwUwI)Oz)ED=dtfU`nHYQY08yUpj7g_lbrLS{YB~YJJA13liB#A45vB0e;+0KpT|$v zGWlN~f4BBU|MMHw|2T&A=TVl=y{*@KN6H&*#oHf0>PP8EPjkLgj+@7a@ArP{K(JV6 zZ}Z(Yhy+MYHUBIL!(T&jZ8{7`z?v9r0`UHD*M1+YrR;SuX{PI~R<92^COMt@adO@= zVZuS6tfa5lM-)>{fJ=6S!xvWL*#8%7E*?bhTXFwCefq6c|7Y#{@1H#Tvj2Zu{VzEJ z11W@ko)}GPeEC~{#>ae5TdyK7Aw%Qg?DYD_aKvNJZ4I)ztEz$kkc%GEL=XZBg1DT6 zCErU2(Ill@_T3AJd;Pvkk?;SG`~CEepB2_LZr zA(-i<6Rd&bwtwz>f+>+54KmZWB<|X$C{1T!+WPiSe>6aV&gd*24&zHOT#I?49GH_x zI9bafcQ2m!-}~QoeJu@l%0V$c26|@A36t11=uQdbRPSuvz~hlxGIX!%q8^9Vv@6>{ z!b{Ra3xhzHyMlH-aHmaWOUB8E2&=ok&M@!tmC>Nm?-~-Ej@YkD;#%rXEk<KfRjfzV9jGvUCVcU9luhtp;jS}H7+(vrc82H+If;~yhrqT; zrAA^2Y625K16ha4fB!n0X2W+?EqA>iqSJwrkZ9op1nYw@@rVQ!!G%z^_S z3r^z;WO$sE#_^Pmgcn0$olX={@JHzY7|^L&A+AhA-W6!0PSCSw%IF6QH-OGop zAN+E-^W)oN@9qBX>uvVq58DjW%^!BRsmr}z6dTyx+g^7b9TIccq~EuymPeO^fnK7j$p#x9PYDjVA|Q6 z`v{D^zqd`$U`b#U5|Ug&))Yqf{%Bj__Ii7Bm%%&&Ao_Cq|FXA%T=`!=J@0uJD69YZ zEEE5`_JlqDBL9Dee=8tu{u+)u*=A$ToIfkY&h$$2dO zu$KwI&Y5=^)>xC%5KfC>8~`H^&OoJb9gK!pPfnD=7TK>b>D3tDhZj61>r&%yJg_SU zNjw|(u}&P`Q$VcrpzGDA>(e$3P|FTcd+5i9h#q$<>)?i2Z z*;$AcFExN(JOS%(oXE=-<7pwv$gl<~?P6dCl8ilYX;G1z+V<0uZ?oxob;34*k~xsFQbOZ z`AI)PGuLHXjc?T@T4csH2T|kEMx&gEY8((G(((7v9tJpKmwrh<`0iGDc7S*4j`Z`Yam%)qx7!B? zJA1p`z3m^#@Oo4{Y0cj-z`JNmes|9u`~W-wJiA@#dlzA=(xm3+O)}?kN+lsNEDLMc z8Am5FYM_kjp3*sYUNEP{qwV<{XPS3tl<-HOsu$@X!5C8ql7(**adOWW+}OSD8|n~G zN!z<)goCB%I2dn_{g~i2z|5p4iFeBsm6IeBB-V|XbMhd3lk}Y-wVT-X_;hN1{~yP( zL=X2e;XJ4kq6`c;*D8du!;7jo$6Sm~9~h8yo?L5g8KojwRvU9OOFn&=0){tXhY9Aq z=B(40_8%k=$)^BZbwBl0AQCr~(I~Lu#uW&8{YG0n+87r>Nk`cofnX!mjP90`3Gvzp zvQE~J6#fUa^QE=R!=UZXRn5%?P!xgR120#pSMyQRZzaJvHs^vDl#~q^gzJ&OspTeP z9}bUq$gR17~IH4maz4^Z5+yUPtz?fIb4zLyw%tQ&`XV| ztd*kNg77F;(8dOJIW7aM24#S4d0X1`;2MkXLKBjOakIUM? zv}MqK&da84o~K{&%h=0f$yu~3Xnk8XUJZw$t95DO;rtCkkzABEFwu$XfN6cUj0_dA zGQeGYwnD!xS+9=rqgF+s4gt*Vt*XYrXDiY1{gg#VUgZOC6?kh3R#20V3XCgnlEm1; z_m=#VTjNDrSH1=GptcAv3`GHXSF7y$>v6U7)qKZuV1bE~3K$GltuMGB7Gjt6FXWmE z9KODVzg-30K6*t&tCSZh&7idlWDZHR4?3m}yflo@c(-B%#V%$&8d@jOBCXbsr(K3*5JpK9;Zg*vn^GeW2l>AfiTCpo>o50^EfKf2;Bl z8CNnd2ZpolJ%WLcqw`E|;NQWv;wQmw;zzuRVOQbe>lQXwu{m)tlL~f{f)a|-YUp7m zr`M6oS%OqbsSaPuEA1@W6;4V|w2)Rf5LHM<;^oa-FNQL51PI0e*zU!zJ3ehmrb0GW61{-#7a-6l3r}AaBTVHE?2m zDGC=uA8+|6r*ZX5IeU5G;$(gBI{CAu3@1gG4oCT*`LrO!eFe?|+a`ODHwI-Ro;d*J zT{5YNz0T)wG0&1=w~wNJ2xO4G?-tj+cU|G8G0Gm(5meoQLvLG->qjCD7(d40cp=54 zR;#ziTnL4sux~`F31dL9keE71NUWM_nS$g9^MLb-Wm(5^sXms1WdB z!^2La0>h|5=%=%0$5Tl9ebsb<0jYXczidw_6X-fG#;I0VVTJY4wPxImJ`pgM^~n&M zX-S1E4d{-J1ZO|os=7uLOV3Z+m^@r#r-QuN-iE-}lgTygY6kQDxwIQU#~ft643s)l z3=nHe3E`V?7R~wlIlj2iMCD#8c_37BK{jInSg}b~47flT?B8A`Tc8{D;rZGM9x9d- zJnaui2)iljz&&1b&5|x7BWTBKvzn6764Xmk^DAF{{l(KYh4)0fVos)~?4L0mi3+i~ z(Nw4vryE8>azVeZt;v(~xAeLaox|alrn}?ITh)5=b{_<53NFVVfuJ8pF}jNAd11Q{ z&y<>9t>Ns~yq)vD{Wbiu8dKqWMhSwbhS~56nRZeRa(E{)eohUKxv;QI@V@C6(|_8A z>F5-;5~OIfI=uSpn>PN8f2~k)R~Y_U(=eRIU#<=})#iq+CKJFT8H)b~fT!c+L}Vtm z3{(=HGO3aCElOWFU*&!}FL$YLNx`;Znz9o?*Gc+qMBsWK{fAKLs!2HH-kj!_*?YL{ zWXs3%Y)>a1>Po)YJVoPMS6w%TH!*&fjr!euu*FM8h^6CB_$T(na3}YrOYqGpKREYs zo^wuS?BpgoF_H=<*-19cKp3QZnGgG73zKeWN8_CG^ntIyF5%1F%UKrfdi$@w6MuC4 z|LW4x%9o}1|K-(B_TT?l`!8E1QQMl@kQLTPMX?u+yALFqKm0F(f^f`E#`!zM z44zg~vy10So^JEHw3baXNgHsIo+XzV9E{d-yc8#Zen5174(FAAhx5QkNe-Ngc5d-? zWYKQ7snF0TS6D%PoKhJ?`Kkr1t<-MAx1yLtYX-z}j9}@<75XtgVN9&XGNTpx_48OQ z#b3Jz?mC~Ut7J5>HTp1zMup>pRI_IWhPT+021r66Cj>SCn|X_5u^hkGcX}cZA{Ca! zB>|IW*P>K`qE6Qo=Dk);iFv0u(hXV>tO(BVy_)qiq-xqiu z7@LwZlyhrVEx$)<b|JilX1-$@6M zg5&Yx$fZrQvGrfgJb}!e3ho>bYd&GfUK%(IL+17nIHbNIgRn4r0IFZGWfy(TVL1%# zx|pQrJnN)~;nd=R$!tteCYST5@Iv`Wknbq;5W-o}&t8Yu)DzDM`@SOyT2;iyx31FR zu+6?XOk&%>0|HT+B-cQfdql6%q4<$=y_Q`^da;tDmWym@)+M-~0__-T9ax_$_Kk9t z4saJ#K9a*J!470AFC5=ex_QAsD6!)i7{K+P!d>Fol1nXXUa!b7jVUpFfO@Q}afbS2 zT{JZrL$k3<*^5c$;UU(yKA4I8NO&bDVx)P1;G~y^7{f%!Q*`0R+1W+IB!TQW=Zf^6 zm`yhwhZA5YCcGVTahdcd7pN#1XXMW?5x-v$R?vrGAD=O-NUKXF?oSe6_KDB1Z<_VH zBD2WFv^ZlkE_r+NXZZzx#4Z%ELm4*Ij-Cz{jeu#KqOZlW4zjQ`=!x2g`vjXn_9K&j z@Fc+l791SJ4TjFYOZy#CT2d?7IKOQyz@;z-0iI5B%p25GE#f`K2}u13KJ<}abes5) zA^ODQaqqn=9#u?np7@<2p(QjEX@u|@Rws&>r_R7oSA4+GU_V$cT0YVyDweV3s2SEiHP?@Q> zwSb*dDpZo{T`cd@UP^iNIsFG>f*k(!wsmo9?A4Ju+E3lp+lZGvI>o@026d zoz$NDw$`7{1ck93qkPmErKglDi>S~kab<>MmjzqCUA0mS!U8Tk{yd76V|CWOH8asT zPyUsU8;(8t3itZOhkPbx7}NW78cM&V?5 z{{9;`0U;5E(d9EcuUqCd8^3K&MNJImsAExX#wjnYFi$WSQ5uU%tI|9-YMeN#*&Mzj} zIi-(|N@(~7r~EIZFyu&R`f&CvPF{CKelerdVokM{BSwVGkU&-Ql6ZkyE0Htrd_2au zXD-e#n4)YHNQQ{(3QaB(i5 zK~L5-Z4X(Qh(j1q#v1@fRY#J-Bj+f!Vubt9#&H-e4j0@h?T1tf)l-8L^`npDZ-8kk z3PJLmo8GQw_r2rDs4!e@i^wjXV^Wl`KForD#K1iwbYP_UaKZtuynnB!JEC^f0w9V-tVxHud`a903m`n!) zQC(t+LY1($Bh}ji=7(Q$bQ&e`U$8%+tSvAsiR_M=D_kWjfk&!AV*2~+9HY0qBQ7>l zfY-v9n23hC#%)M|0QK=c4rmf|L-+(26s9CKVPq&D81pFZz4cQ|;(1Xjj$yPML;*~) zh`IP9X^fazMZC}-+-Pq6I2*z3`ybs3Zhuv)&*i?E7Se`(q81=_crBh97*A_pJT)+$ z8W>-=EgJe&F3n?3oc8RCDeM^RDD3Mn?T~%L3HutSR)s*CbgYj}u^mRSm?%uEM?zzE z$)=T2k+HywXD6Ovy+qjLdE^=!ftcD11*Mz|q9Rt$t@VdK4?>Bk*vwMr>*Iyi*5*-+ zKPH`DwmbhgUWlHwI`}*M0v~mt1%GdTkDf$Z&A@!Tz5D#zH+wrTy5(^ekG46ssT9q$ zg{jYeS)38iB<2UdYQ4!e@I%Ruz<0%XrbUka^rFiDf$Zv@qg|zMgX4+9)6vmRS~73e zIUuqxDNuZ1`a`D_x2`;Tx7Y1poo{J(i%Yb2x z2cAKziOFG>zidXFsbo{N{24`V|CMrogc_MB2JBCtxV=`(y^y(9ZZ8xL?hSa#_$!j( zIK&Dc7_?HJrN9j%m8S1c(gA7#$zC&dzo`s^N{5AsPr_PELHLuYT;e&AhEY)^7pZ5@ zkk#108WR4x979K)b1)_0(w?G$2NMA?F3vc}p^nm_tX_TsuNkiYCSF#TEe&rD^5CKQ zIV+^r@VsMm7CSOJ{_j73^~zWhJ;QQ8_b!{`Kll*$ukR8aAQI?cWL~ZlYv2LqxQOe^ z-IB&84XUO+wk9aoAVTODobR;JX|x;YjTf6Fp3jQ(^xP&Tui11d;+nV?F1cI6x{@gu z-Xc>R79TUzz&bZymYWq6bghk~r0r{~r+9@i=;tYF{k&`c*2&t`B13Y-M%%W6zS1>5 ziC3h1+Y7?5_`*0{y=;ovEhjp5>KWO6;fOW)eMZw5Mc1n{^q4mvX=ljdR>zm&#V@?N zTa|E#PMkWf)thR0ZbqlW&hjzM)&3e6(_XK#i#bh*PcsbFo@&I6Xs)VaTAj1$4^{#u zV_Nz%lAqiZ@iP)Kx|TKz!wB}RG;hLRFo{6MIy()Pg1vMBKT_#RoXn+Z&~R`}qtn21 z;bH?HH+x^SpIg_x#rOM;o5#M|W&DqEK^7;`612wr`uvSu>s^Ik>1JJ!!wb9%ggbJq zOs)co**1HRA`4K))V}nHQA17nfTQZbN;xfKO~6O`DQ&$NHY49JF0OXB*N)Ztg{WD? zYvfvc(*k&7-Cfskm08|1KY{ZbW@%mZ^&4-oYJBq_=5G%;k7^GZCPqx2hl+VKn; z4xiGYt)S`;_hi>eKYp(hyPj~{ETxv3RC_Un9_*Rp{FBIA9nW%57e1sMmta$dJoDV4 zWDlKTH`Jp?EsKg@)#9NDFpE(s19AxL!~ESR_>eYAA)MtaT^qM_KpxUOajrv=S>_ zwdEKU90@Y6^rL=s)owoOIO}#QL~CvKIS`u5)MbVIjeDm1;scvi;p4YIwjc4mz3(Y( z#?5H%gKCv}{Q0c+lR4?rYQN~NnMO&B^nyG%bz|RQD0P^hIQad#Srfb9sC>Exj$35A z79n#LD4>K2AB2T_x(mOvQffT~indhQdL3HZ{4H1>w#3!kHEKl))LdvsHNBU#hYQ3R zEI6qJI?HXfL=nQvBCcz>*5`H#cHYo-Xkc2XQ-O9!?HY*V>E5F>R@*?w&M!D+AUo5t zqgswKw=TWhWL8K&x~S52DTQaQqL^g|?^v4DWsam-wUo9|)pUuXBkEZv9qM`JoS<%S zoyYE%(my<40D$5N9Y};|3xdBMSAI>27`ceVnH(nRv85re$tMw&&Cm}wbXl4+NkXWq z7-k0|c(zQ%8Au*us`6rIcbHK`%u?H#lK#w!>{v?KVdF_+(rSU>8O2;c_ppjbhmM-u zB*F}~ef(JMVnv6nM;}%6<0I-el722I>=$;#W_VUCOeacDpM)?ZB%hGStUYbrYUNm& z5{3t4-qIhsN55Q?2Oa0wxX60%)bzsKGtDeLuG&ggl1Ra(=43?^idvR5a>}Q zf0`SMxy#boyoyBzJcCaiMEFHEB_Y#xHeyXin|#bIOJ*y+u_OLmiD|<}(#R48EU~r7 ziqczTFpd`%vxs6}F~Fs;0WORGJnAoewuqcafn}Sy2F#jrFs3u8e@cb^ss4i-|MRf| ze;$_q@r%{fFM|B%sRaiOA9od4LpJ&6d0kY=V@jrzneF{tZ6qfYg5thVv zSl{S%71k37!)xCFvd6d=Qg)LvffqXWt5l$66B2_)U39;{X6hL1r{|bEyyti|yExRu zsU^p;pA=_NOobuV*l(~yr)GI3K#E5DVB58{w~iL9h5e{=6dx}{%^I_OL(K9=u2uf%i0tn3 zHzD-9t;TP+zdvF7dr-+&7q4vpppAf+9>(>bvUQ%)7}&G}F zwP?wikcqvHvXE^k9EUY$!T;FVd&AkLTFs?qR9n0^squO!rrCr7CGhR(rzg`>jL|4> zDd{3jmR;WrArsrM8&xtx*a>}u&b*GMfZtb4QpHSGmNW zD$k$3RRGb+}6TR~t%&DFfdp|iYQb3%Kh@@{-(dP*M3urV9 zgvBSG&mz|TWXiO<7JWguslGUz!J}g7{+00Zp{f=+U3SL3csZ)R&=ip2RCPiHQ98;< zzg^Y-6$W6Y48vep&9*&>IA>ppZ`JT|b%pAWijn)0UxNA*oN)RHnz zh}QNH>rd94)}<4rQw;e9J+Qvo|B1&i?to)a4wtq{; z|Ax)q-1rz5X7j%fHC9FQZ^6s@N5RYb#y!R^$@!IwW}=+uI*fA!N#Q3m?oU*AZJb{? z#$=;DAkS7imjXTC(6P28H7w2}C)L65!p`ziun(UMY!4N7{#XN?O%xn3I(p9G=j;xx zE!-IO*JZObJ69BOR&Ak#&e?Uw(u&Dyr0xK z6^M?XoN?WPxH|g*=UNcB?Xa}Tyh-Pju(`J1Pp64*PzIYm^l;8o=u}God$v7YC0*3fCffk!&S>>w}s`N2BP%`Ee z$eW4{)Nuvq7<(*^jQ;NA$)GS=RV~L~#qXt=B$L3^on?}pMt7BLN?2NtQ_A!?0U~8( zK!z(^+X{O!t73ms zilufUT+1KYy4A=UeG7+?Z2X))5pDmJj)RT>ok2%iX%0}iXmw~JRr}ZHC;3pS+_h<( z<8TI6qo^ZwSe&MFTt5VXJf?eu`MZlQ&a(v6WXF?pLRkrFSERQuFVz#b8GUG464pVR zhcl?yiqLNPAs7pwNnIZtxW)P392Zzhu&|-sin@Toe2n_sE(myZhHARN$!Z*pDk^+A zqjhm@+`k>{beqURS4ao!_iZvc!%TU{ z3h7z*BAJ|3!ENcw8c{p6Qk=;E#vKbOwxN(T5o}t2ZkZ;?Ez=%yr4wxHIyk3?(&Y0l zw45Dj+eL7sm&LOw_29O*a&pm|dZjIyDNKqk;ipTe+^XtoeI;JmBhcpl+*jkadtTH{ zHmWO!SqB*lW8n>?c|8npm0T1YZo({;sU)dX{1)e(&Blk;^hGsYE~gy$lC3qq z_8)V)5PGX(Bi*C-5?KJ8nA5Og_uU=;xJLD$^aQCgeAOy4OvPGhn>vb$M99;iGi2IK zoU~8qa);zfl9N&nUbf`f;&1b$^ckhG13Du&Kp6iPga*PvM6GO z^U*e7PivU*gTwgvX7vtTEdJqn*|6H!`hNxF%gAdk7e-i32517)>{m94@8$E{h-IH= zG?0a9`Qv#pAM5mY6b2@0_pf31?2-)9~q~a4(zW!9Qsga|6+s(s?ZYGk&rdq1hn`I+0_&+rBu<29r9- zy0Ttzs~QSJC#i}apb`BTS_mtWC`ykVtqFxSVCSkLU~9Tnb*k2KD%I$~93_>No>oUS zBEB_ujoJ5xb2-%Anu5hJ^+vcq^l;Y#oB{SB;+ytD8q5@uvO;s$edhwAEL0TJ^R!>S zrS!azwKdOmX?UZ-H@b*G4N;cm%4&&Pg+%SbY;sc0$V*oprr=h{M$xXH6&J(gnoM~( zQoA%AQY~L)IsvTHgR>@*FS|UcGw2)3#Ao)t`P5AxfIpqM(F1ixY+BV@`2hKk>EO*B z(Ls`uLo!IH_lY1SX`pdv@EDuazmQnC3+I7Q=uB(c3GH21P!rf1PN)JREFho~dH_XA zFbhHm3W$`YBLa%_5~NB9p(SBaK}0FC2?|oAmnDFJ5L!S46@ehVNLEm3A%apRBw6m< z2WRd++?hMGGdpwrUjB2=H|L-4|IXW)f6gH{Lq%sG<2r}N<>JEj=b&Tp$(4KaTx)dq z!X6$!vt*F?RFT1?;iQg5%3Ox^^kFOcFA`54>?(*@Y;om<3b}f-dariPPQOL4l%zfq zAt|y1PnAVca;RW#!^1d{$G=)Z3i zUVhcLJ+pUZ^HWc&`5TkWo+b9`2i@$>#hj76Q!KwiW%vy9F2Tb&M}l2#z;&?DK6Kkj zR8)nXXoDkOn$tE3s0NFT4c#6ey*gFBZ07XEkYS|Fp*5Ps&T(tvmMxI9`y`hTMCEq8 z2wd^ln(@Tt4a)JEAulqhXUKa%aBC)x@c7Obg4m&ruhi$Ed|e+sktx}U3~3) z^LPnG24%U)GlIY?8_!=1O5I3{u{3yA_+sUd^9!nf=?JzxKQ=*8RXSo{OwT{vFW(4A zDMwJY!w`?))l)kpukF3(qL1%wsY9Ybv{z+vB^<(%I>i*I{_2tzBKnfo7{Zm$>{BwI zcYsFSCLw5DzQy8eAkCw9E>F8-!;k8l@%gblkZgi5sC`o`7=}8pKgdk4yVlqPz7+ze zMmzx;4Ie&v!QJrK%KLt<&S7Oo4TK=?qgu^Cr4uBJk70a@cm0Y1GqvuOFRAKU{;@|S zQVw1KvVhgctL++fEMKd-OdR6tzbuBlkviS#C20p*w9nC&%+x`4l70n)P0l*8gg<6K zFGw$tNbnOib-nX#bh24SB^AGfKdSnPaK={_`K1XpFVcGR7%;6UB*}Ojt5B<{-#(DM zR$s_vEq?zEMVE-t_(oJyZBV?LDhAjQs>3P8gfv+K6FFg}>qP1baxRq5^-nhfLHSoxyTxsQ81{{awg8Lwk=5q zu~9O4zqfBfF}R;>Ov5a$mIflBpd)o6uZah3PZKp2T6`>ScF~SQhLA?GVNdTf)fjuP zDo*AabqBVqK?;}`(ijk$so6mvnl#UY2@^*+$gI}=`ua5Xz3^;aHZw8Cu(ii7gkhIG zxNw3ME5YVrT>IHkxxWx&MNhD$l66`V*r-0rjTEbLS5l+TmT)#VBP2)QCo40_XBQd zwnyw*!NJ`o9j>O32_oFo$ ztL|^8PR2U{J7tPd`K-9Tjb#eE<{X?!VZSf@H~!zXeJ}3&&VTesCgl(yoo(R5!Rb2$OO-l*h-)a$1|s2{63Uqq zyzovrJ|yhpi|kirXi8$_UE2z`b~2gF++~@!7*M6t+?oBEl>O}u%1dw3;&d(H!sF6z zt|tThbWZ1|n!F9MX-n3pGP>(EHD~ETq-b{+%03f60o0{GX#W!Lk|mK|KD!awHKl4= z(0}_iFhX%a{0>iHW=G7aVH{j1E1S!M!-Uv%rc6LVc8QSNkT^rs4gh#dr_&FS~P^jyw6*U2|9EZ;{lcrK)6sQ#4NE(dl53Q_WXoyh;OFC|+jxcud)Kmrg<%mBoSP ZQ=*On|IugoL);GsemL;Mf&ayUKLLe}JhcD- diff --git a/example/vendor/bundle/ruby/2.7.0/cache/cocoapods-deintegrate-1.0.5.gem b/example/vendor/bundle/ruby/2.7.0/cache/cocoapods-deintegrate-1.0.5.gem deleted file mode 100644 index 7dd920fe91ace396dd4207f8fc2d15b8aca86acc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7680 zcmeHLXHXN`wgy3@H|ZcH^lIo;dPk&12t``xgc>?ZHS{LEqoE0S5YUK#bm>Ts96(y= z0i;TYTH~(otC1JVz7~;(ky#o+{R0L}tF#&p~ zE-4xLH~Wyd7hw_vsy91$SFHXxnoPTy-fS98@NQi)57kwaQD zWYJ41!2_19J;Sso7k&TvHTkUnPMGz{=e+KAS^o+32&R1zqLbfQ6CNO7rXqvl)czaqx6g#% zFviDXf3Thxex`ykd`&8zOoU?SC9+1$Uk-4>w)Z0JjjN*UoqyndAX}I~vfK>+BV^2)vjWKDf8QdT{O{*#~VS?LSJB)RLBP)ZZr9D0XG$ zqYxS;%^4<3inu74Azv{hqkA~R+`|$oIUe6bdIw5hE~=fsG)PWo%@8pfv^2*v@S5|* z)^ob8Gzs~WiIh$t`H`Iv-C;5<#M?h zpQZDTyp=S3<{xw)oMwrbb~Mais73#-fmp18Hx64yiR8oE5}%0a0E8jTOdi}NCMleWVdgh=?O53j=HPB9r}59 z?e(*%2P0h4b>pXkqx9FbUqJO(dZwfc=arn_UJ+an5_I2;hG=bfSi3(T4fPMIO0_w@ z-y1>GZR&N!bm2UPX^km4wyvyoc}t+?ArW;$d3>Z|HZA8r7P|XgLu>CrtaJbLHY5VW zP{HT-?G6S=SMJ^)SW)QSeM0gS`e3r<;>`cv$gxkVL-DIII#P@7`h~X54>7=x4CEJ_ zWG#DqtziaxMP&8#yH?xDk9TNWZtXfhjTlcfZ4_*Fd-C!`?UhZ7QqY5`l6Hpf#IVNF z}d^F-R;+tKpCaXseFWa|%zEmm-__ z+|`H0L{rvV=YP<*$5_ zLxB-`p(L|Yzzzbi>~i5(6AH6Y?%(dc2Wd}HZw>dYVP;95fzMfg)2bHZVzr2K=_GvG zo%FT+R_bz>;N&}SZ{^Nj^mp{WObR%ScJ1)c*KHqu_~6s>tF>0RtR-5POIzyqNFmj+ z+tTYUD4-vaZwEK^Ae|LJQJJwpzbmd#SJj9cWeInNt}jRJ^r^nUGt<5AC)5E~I);;i z8CHS0OzSP)8ZjHKoQ#jhbhgS)xt`g|@C}$LrRjdQcA+42xJ|?;C6{Dqa#!H_fpSnt zzf3?1o?)b`OKEWpypz!kHbvspme@Z^HeJkNZG3O^shNXLEUgZel>W1BUOsjL6NG}% zcN4*ZmXcgs^=s~7{54>M6Cv9ZaVjeL*O{Ta^9)(52o5dRdRG~(SdLryGe`C{sd6u) znCHky=!%=FWHG+(6jTGw&GC=#A7>@^aZ}p>Do(l{FNkBl9?;vjKcnP}4su%(N2{$5 z;zFy&j&z+rbvxmz^iO3L)7RZ)_YPS*-#a5VpNOOEwbRQ?K;Hx@AJI-yeWiRIo4fw` zd((*ID{x@SX0RRp_@|UDWe}}GZ!dmq57_VumBDPs(-xk$sj>xOn^jb!{8DvSz2Cj+ zfVezg@vc8{wz5|l6UM`z3cn^J8c(1ctvh%;wLh<-U)2_z->@n=n4OIClch+N zMOK&2kIF?R>^&*+qcaK{1-aSf_Lh&?#k6vOMgg1(h_|jMfN-DDmaW*SskTaLzl5KJ z6v>E8Xs0sM8dOe&iLoy@by_1<=j)$cZJ$r;ejCXXHwlgtx{)kYEr-dwn7^12?$uwk zjxQ=O3A#E9(_%(KZuPtJCdNJ2O{>L!Q=$4*Wm`@Yl$B{!61lBHJk59ih*o?zPrm?? zoAKm1ypXZ2se^XFMy;cYz5cmAqYxQ1=@dCU)`t|u5j-eo%FuHnX=fLpY;j^~J>;RC z`ThZ#SXB5PZHjUR_8IGJ%1IV0|U^6hYnjH)Z##Trz`I=LJu#0k>k8AEOU5 zGGtJ%7ZRF+Y2DZCo@-bM__A4x`Q=&?@!e+6Uk7#e;E2xh_Na3QO-=F;A4#6;eL7gX8@JH4UAbD?B?Ht%+`V&z3MicMwKYPrT@O|N;oaWq60 zXYIWXS69E?*tSpw$T5EyLFQa98)UF9Bms?BuHG?ujZ`b$AefK_sMWA_&bo@-*4fiL zAC|&Uo~NPC7qEC)jz-Rvdn(D3wTFe@%}x(5OE1~#^=+qUUQ(}rtKk?K ztj_s3piz7ZrH+)XC3bKQ-scZF(1~hjcx2=*c~P~t-YR} zetF*NFq6ILbn|9nyyEa`)3%Wqs74V45$LY574BUkC4w-Prn!ThiY$ngSU7C^hGi)A z6qxrEIZ_iC+5iX1WVn>t0#52y+AwR(tH}E~4X!I!LmI9_{D=S!j8L9j0f<=kNbmUp z5LlnY!Kh}#^7*$O_hOTn^DRDldzoU7GG&WL=&RIbBZvU%^pnGMgcQE- zR1ZRoXuQ?$j#mD@>_1HDV?;@SJ9Z^&!$U`oz%`0ETF0hGP`A$oS+^3mY+wqd_ zJwfwkDn>J92mGKSOMF;#?*J5#Ynr%5x0Kss;uQ^dCFT@&r5V}+O$QY7`GVDx$IYxO z3qGogJKc#jCR^J`5*!+zkw-P04~o|EX7Vl_pP~D|t264073$ccNW>$zBm=mf5w;VxR}hPB=@0>}8!Xqx8?8 z3PKxRU=wzEV+#ZD->Z^mDY}XSq3MmPUq78$BD@k1%8MJlOZ~e=YMW_)vi8+=mn$)l zh(Z%8bNXd$1HbXh?SRx=fLniZN>D}<7dokT1%yfM6>!sYSbNs02=Fn3Q|T2aiG z`uv`U31xDbzUT=~CA79q>ejcx>F0TBn-D@F>8PvCfnE>G%*nlEUt;=p1p$$P;H`n3 z;g-;$^g>?HQ1;5LffLkmB3-+sSk0vlqcg*KOU_UxZ%@|{GhIlrnT2MF3v_Jjk))$OoT*xXTx)6wfX?B(W}ci;_-*X+t17o-?U2sZjK5fbJY2sox! z!se;lybJ583U4{bzVyDCQ;-X*lgBn)9+mtc5_wCQWt`C9r775Qv^`L-{gOR5|Y3_#s3nL z(o(jP9$1wmFs-YAu z-<0*WXAKLN)4ZdF#!%V!p05BeyqU?mzPxnBdmi-W4yy6-K z_E_bI@e;Nyt*IcjTz^fx3>$9oX^6kU9LBIe4Wlq8XUq&kfU&e19+I;F@^iDxcwUWg}^Taej)Jx H9f7|A=!%7{ diff --git a/example/vendor/bundle/ruby/2.7.0/cache/cocoapods-downloader-1.6.3.gem b/example/vendor/bundle/ruby/2.7.0/cache/cocoapods-downloader-1.6.3.gem deleted file mode 100644 index 7f1602669b10a01b76ca885793efe2e45ad2c053..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13312 zcmeHtRcxibmSw1tRG7KKoK%t%W@e@eGc#09n3*}LFf%hVGcz+YbJBm$JlxhDX{M#t z?dgYqOO`)-+n=|Wtz}zU*2X}6BYmJgov9nhzseZ?GG=CGkblqrvVYD2fWPVh%#4fx zRsetn@RuLJ#0+2qA!PVh1@s^P>*xT~|NU1;&Su8OR{zoQPv8G9|NoxbKPLB2-T$W+ z3BsX4#8Jfzz`#3{w`}Jaki4FB^&e}C^3}s#sv!(kVN(02>xuCBDO=f>`p5bFF8E=0 zy^qrC3s8UEiK0+FZXDg2ZaF6zV|yRISui;)s3s`1i;(mS1uIr01Qe$mW5B`CWdNsJ zIE@5r@~-$&{PLZ_80yZ1$bDyIDqg z1q+(=?SIS^)?F3hOX_l|SI#3aMNuBMrIj7L1(QWyCM7L3jjj85OFPS8RFtmNK7VoRHw%4|aPAfuKz3o|BL(oV!;1@{LctrX8S+*pNR$VH~;@<*YLm6?jQVr&a>vUCK~5@ zs9K*NA;3vWIokAnDeR|IeMMbuKFP?)KBWc>L@MbZVK*qhM148O8}3{4R;_ofZtXA6 zp~wV!`*igiQjE~c%F4>WlBJ=ob6b=5`rGBxd%5%C5&@sb^9JYF{+Eqaxvj^NYje$v z>-q`zY4_dapug-9SMBG9>hpNqd?;w*7@(lX&uwh<&i^gmqcQJ<`%!E!VSWR0MePbG z4*O*lqk}XtGD-WH^@T8^1jA<)y~=zqcK>3w`|Num8lPpc^0?c#+69F45=O`|-USaJ z`b@voCHGk+ilp$0dsYyC4~Q_AhH_vG%U~$biH9?klwc;kTn-hhmzWJ<-$|D?Pv`eH zi{bP-4kp<}!el5Bm;l1*#hE4RZ~_8H@$KVCe|ti0Bh&vjMa3zU4f}xq@FCC7jG|KK z!T70yTaFsdDFA;x$fzz%_W{J4P(+y{jr7FSXAUK3?HL!sGqT^7^Oyl=HQkr600I8# zhDMqqPZ7@K>+ec{x8%fy@M5$3yHI- zZ~_yVBy7#LqV;&}qx`1K0mBZe#8Z|_iOnUz52=g<_xjL>!yDHZTI0SPsej4^nj#7~ zqvw;xef8cT8G@ph^IG9NjomQ(?E<{MyOgyJF1Pv7ceOzNV*IrK(6fdL#uC-|DCb26 zML)9mS+&3A{N$XP|J2l%w|N8LU@yJsy!?Ze6TECjEU zhm)KAQs9XT#L3(F>j3$F)_rb`uO>&;MbwS25ApZAo24ycTd8%&xASNuzFJSa=d+p1 zvL%YYV%?NQ#P2)?HPNJhbZe)_%H0g{l1qq4UgtE=;Ljr`d3 z?aMmr9RGZep%L*>E^6BpRn!%joBCPnzHS*;k+)$;Iy{!=&o+S*hpK_cKsasFHIzeG zB4Hw$4fE;czODo^B5P}jsMm9UZd!2MexjVYJJguvVuzCbtICsLty{OciNqj z#q&iV=-+ntW$Cdvj3Dif#DO1a+3+(?I))7DlhA3G0}ljnBg}yh{@#r@XqVm(L@Bri zpA?5egfT-*djTHY4~!#n|AvFwrsXJ$o&%-=*Q~u6YvXI=!0Br~ih2CqIWGnkRORDptCL3POZ z%6VcG7vYNXqE9zg48dWcKL$vw6gJt;?%>6#C`)|c(4J4U`s@mMx33g1jUbWam(}Pv zFMRhR&1N^3UGDYR@ygq9FQdH+5IdsY^5-&*^s%82K)(~y=g8peR5UhVG0Wh8`_Av~k>H~8x%BsJD5_oB@CqH@uoZl@mcx5O{3Ju>T?5D=f5Ht%Wc zM*3S$?@U6!G6n0z&dy9)-cwIZq&J)iEk!rJnhvm};V<{Wvkc^)$OBl>S)$6z^ zmXGY~V_XK;j+-nZghB+TkTDO5*@z4Ff3ioA)lZlv7@n~Q?zngF4l3N!ffB7c56OcW zio7fb`jez?N4)SuC5Kaqe|FQw5+_aKy%5{_BE~=x;!r>s+q#Kp$6R%+T_MU+YbCP? z_9OaR=Zy{=9R$XAH||Md4IkOVJwN#lbuU{ea@-vwErjI!ygr8AKYedvf=-U>&18`{ zfBt?Urtb}nvqn4kzyWbO9pop*?+OZ2{<#aT8e>+4Gf=Gt5%-*vqe`>Oc=whrwzRVb z@kn_cEr{7VjPI*~g>&Fww2{L5yW>Xenf{ahMfr+4(zUA@g5O#I!TE%=`Meq=0nKSS zgBrhe|6XAWhm|8&NKLZ1de=g72!T3EY1(^E9Iv98Ia~EH%~G~mS+EjB)ZT!Jv`OFF zw-p^+GZ+;oq?{A+1^k_KVSdS@dS_O&<-wA5J=dt zodnVD!)kQG{UO4v{_kd0pAZZENfGq1b4M*TV187^r&PBJsC|%==+(}QX^e?j$M9`f zuW5GL_=g~k&t&6y-(blM;OI$vMYGL88D+L_Qr2eXl*&GECd9>CT6vuKU3sB8oi|C3 zx}&eBT!531E(r5nNkg<%_){(v5#y{J`g39Bq@m=yC3>uJ@#)b#1eAE`;YUf$9C=8` zVbvfPp?mmv4zy3rkv+?xAwl>^OnF+}k7A4bCPa+l{gCs9#OJ7w85mC#A3piI)EKKb z+hr%-(F8{iT|?2Vi&ytuRW~hxW;ODh0s}?fJquK47z+YeEyfMJ9eyORu9Ma{aQwG5 z&k9%FE1_}{Pl0!v_WU76S*1>D1EVY+fna6t$`NaFcNIE)JF{BrFjH9`b!^N|rZra( z6Qd@m>SSAw%NcY+Xhz$DWh?yB>UFh=rNqTyMe4)MUi%+}8oeCcxkQmE+MXb$j$Rw( z*nTB+r!{}%X84iZWY251z6!rJu-tMNp3owUoLEv|>k>>+_){*wo8#`Rr|;|pGseLt zQbJYA> zIadHpPMI?>73(b^R5F@s;_CAq$bn=}cIb zHF)ZXO@B+K3%*q)IhukEfeX=O3ks`E2t~9S$D?o}A!0Mq#5cGTI@u-6!0W^>X5pKOQIecQ1!{;Jj5h3i-@pt%b~r&J1q( zn#j-V2&)tOwA6|-Q9#{+J%OAJjueI;@sJ{yI3$F;u*X@E0)dG#sx0D`k72OawRB`= zNrr3X4C$g5=_-;5Eedt3sb+(p6P0O|#3lfvexyZ&AXp(;YQ_Wu3g=4c`;N3=I{a(k z%*v*f25l3Mni^Gw6jCWvQ23A8F*eIx^enN1KK=pV=mZ_&SE}Z`5aW1N+v+2o3|Cz#@#7 z35L(|%qs0MU%ySbQ#&^Yn<|W0QU574Wfg*-0IQi@1(uX=CDA4jjS6w(#lzr8p@ql8 z2wPdYG(o~_ND)c@ffRKl ztu%P!XzW7gvwhdpMp-ImmP9)4Xp#;Ew!XMiS)-W}$fUq3vF>D4a2_BPGjuvRN0 zqnX+j)1yh1JCY39Ll&YGnuxqM?a^3*1gfIjwIl+$g|wy4mD)U+z%GY;jDO@%^;kEtFXMxjA&$} zA8}^ox(28UlHu*xn%8@4Y~~FO^m(lw-wBD4?d0>ZX~L@aaW6wo!+E=+==;#Q&1&rS z$|P+T{shmtvRCWzY}qR314WL!KvXAK#EU#SmSx zjurng!C`pa!F9ay(Sw|t69wwDeyevW$$PBfcv)YxrT zyi30#S(`k%)m6Ce(Svq>lP5|-fV~=Fda9J6g<#-G2AEpR83zj8)A)<#Ot4?f(ES0< z=-NNSpN=E+hbH!6N093j3msocJgq zQ@{6G;RmM>J3)zwH1++IW4QIGvZe@@ytDyq#a>iBhO<7j1-xE2QS}IQ&IX(DXQ!@+3}!iD|+Ey{Hij^36I8DP;C| z(_ht^EZLPT!Yf3McaiVLg_Z*c+=*Pwl)*55zNU=|OmNL0C}JcXAbMhA@;a{95E}_- z1A1*R^ogjn3J_UB1(ZqhUtPicd?a!tJz+xoEcSe08~#Kjv5Z%OImABaM2BjBx@+vd zj=I9ak*q1hNsLKO)$Q#59(OHD4SGm#d$>>DR_H0n_g6I4m)o;j^l04xQVGb)ah?k^TS z#xog*4No2>>_}?3vjYtiXK_Yha)&lCE?~KxZG(zUA>l2(V1KL72$RT8SmFWNhM1@E z=4F=Z+yH9rc!4wGo!8flYqHNi@_a^d1*c>1yC%`t5+Egomq{Kb(YzZo2VIW`M`}_8 zzQ&m)fF-&jV&t;1wpx<^t=M#dkEuKUW7Ao z8MZSe5yosH(Nt1ij@e=T3fcIsNB|K>R|J((U!4_k8bq%NplKHdRPBy&CnqcfAXBJt z{4jT{-jP;d5}$t~t-fg!-fEOPTT#J{nqBe6tz%J%p{oyFz3DP9??ZzAeRh-yer)kB zSO_N%ZMbgVhX~Hp2lgj!Jsf%rqaQwNl+{i*qk{b@66;=7GMv{)OyUW3;7-3Xl{c3~Gyo;)_out16ihBRLoapHO_&D`l(5Zm7bGMc_u5=BRlb8Oy%KC)NZbaMks?}`l8NMLS!DFYYA2<9xB5{~h`w1FFV?lJ)Y8S{=3 zP$ImdZ*?ITu12kst6XNsiruZcNtkAOEeUbzfZS2sV;K0299T)80oW*}PoU5eE{?(K zuqt1<~eFog057dhK`Xz=zP=?xX^`v_0)YIHaS>AOMdyqcoA*&m z%<`%}x0^bi9c|9sT=sM>5Kax3vienM<3_e>E1W?lTO_Ha+V|$@Jvu5`Fsrvsk|A2S zl2fIihe-q^a%+E7dbH!fNZf=4$8d}b zyO>}FRy;97Iv&C7W8b%8U~Wrwi-yFLF_Hkdx?NTUe_%VLCo~Rw>+S%eRgR{-!sI-vSNSct72rH>?-VJz>IoN}R=(d=@W2#D`=# z@XEN6R;NHkiJg0EkkL&S;Ivy47qP-onK!XGox_oab%-+^ z$AX_=I^3dwwt5l(jg_ZhLP8SXTQ(LDg3h}49=a`|e1VVq)mD|VS#aHtB zwFo!J*yWeob8&pr7oRK8^y^FIy=zuJ^30c;<>%r;<5uNl)m7nSaX(tS8mvYv;2CB* z<%D#yr(|B%$)la7=WZ`TpP_6Bw@GpxjUdaQaY}vC%`AcXopqBwHwlPg}vsp3QbVa zbZ!d3Yio4U-Jo9)lDF^*YLYT`vRRsQx`6c$+BZp(vmg<%KP9#(h7PgG(1u#Zaj8zV zU0REpKl$?qBtfDvx{K2%=IY46RxsC)zidf^NAI?V&pxz>^hRE~I%B84HjjPe?VLZo znQp$m73NyLUwMBf)vB;O{Nit^@0|;f&5mpJ_W$Y+ufr+K(pr|hKFyE%SoYFearroM zccbY30)5+(>yrIM)Ol>v8UJc&`+8bi`C98`*hvZH(fX-pV&|yz2Ph7Z>O?yIL8p_q zBjwY_?0RWD(!XTqQhkQQ9gDFb~ZXT(E93B6RpZ!4;;zK!ZuG3^!PxN$yXke z*ArWoQyHSnuAv%`uD8`7gljC6O_xW4`w4tdk4&G;0l}K*C%lQs)iQ~@uMaRVeoT<7 z84bx3iqh>DHMGp&>B4nbcD1TQeeX_8K8DNR0r7!1fm=>q@u4=aW-{Yfi4|@ zu?{NeS>@v9NwTK-1|37)y^4OjSHfB7SV6m5v@_3I5D7Mw^Eh#8ifVFpe)IOMaaUY- z^bV~$E0R6?a622SdyCvsOuyY)b!;T%-JWOjvaHf3m_hDHUHwYl36ZQeUteE_GvLXB z9m&jenk1cLeKh&&uyEk2q9JNDGHout5rBPWv7XRjr0z=qgbi z9cY4j2p;cR;j)#5P=Fl<>yUpgtzX5}1fcXP!cs@LUVb^5eqV_epG(qhHutIBj<-;Z;v}_kPJ)rfwb;f(xPcYQ1`9{(@S6lBG-yy@95L^#HryY zGjG)YuB}}TUAahm6YERxRf;Mf>N%Z0kxn{h%8*`x<$BkD0N#!j?#uk)zP@pjkq|Yu z7qb#F6CAaAH^J~ET4Ej7<0au(5G)Y1;h-`7BAAXPFbN>LKfKF)Bebu33M7R@Xz9dF zX{@7yrDD8fV+H##+nt1|CD}YqgolR66tPa}Y<-cN{fy3u=M-4#)D3wrYtq2aDBMG| z_>)f6HM~|NvG>-c<+s^ztWw5~hYtb0mbMT|}8^EVF_%O0UcHB3t_Bj0TcM z^e=c&ynaVG=3qX+bvL^&y6UK;x=DSy)?tsysugLa?m&cKV>Mb?``UTenF)Pi;V`uC zR0`REAg>Kc+9(!H9B+#BF4(cYcnFBfMxn7qbswHXtMk;gsYxJGT@wLo3l~KHn*#qp ztVlm3MMjuBR*f;tnA}D+>#0~x%u__$L^2tP;cCpNdXT2syzEccFpUY?`MPgbgmSar zl0vepjm2Sh%afW~tBrMdhSW={B2?9CqXtY6gi*tEX^slQR1efr_2XL*b>WpD!oP!; zT5F~_I*57^nhfBzhhcddqXX)U=hM-HXU1jkyMk)=>8g)tR=;MH?ta~RFL6b~Jn`|l zx;TF=sZM_V)P~T~zcSS59%>H)v#leO8$q`Gm{pDKw2gKb`>0Uu_=x8XWA7ljzdz}= zJGi7_LrT`Durx9nju~iR;M-4R#ySYE-#;wiMi~hjv=}Ix#?T1nss`}I2 z9T1T9gGk1(iENMcg()H`Yi|kuth~IhNG=q4iLL-SMK~a3aCdZY{H1Jk``(Z?h3}aV z#%f8Tm@8!wHo$rrEBFIW&Hg81ctNf~!1?kyO?c^ooAob@s0mb^QG!Ft2qgluW&>v3 zbfcZ!g80+Ts&4EXse^W{U4I>hCICVzgQg}Ptyfi0FLUCq)`>I-h+&2H9x?qP^}1S_ zcd0{Z+*cXR5Z@P)8phYlbC18)`_OCNL)+U|SH-hj#^swiQT8a`8wZ{G59=3^^jckF zZXkE7HSpM_KcS_^N|^uH=0%rWe4ZP9C~s}ZYLjlUmRhlndKWcQwUNpqycC;W<0T`H zeJBq-Zs91)TX6pn%uX7inV~^a#Q8oom^XASQjAT;2yr#n%!<#&3+gha!(MkSoDq2S zVLsxZ#$IddImQR8$LR9epHLy+S#v~DH7ISy2m#t!-n0> zX%zACD$rMoE~`?=W}0SMjmi8N?2y@*I!>PW(65OKe_zXz)-TLvE0G~*?&|a%Ej>{} zwVc15Ge;8G&51|AZhCs{ZP@Zmh@lSnEOvV^*4~jlkNSYccqRG6xOvS;N=v0-^jw#8 zbF)NMdsewDVqiYAHg5AR{%Jtoi{Q|e(=ECRE?~vj8}e%EpiHbTNp1pm`&~rR;bsz! z1LfkQ1V{d+H{u*bYVHGjz7yo7-01P9vB1=E1PRBuj6WgcpkG!EKkrHUA>?KY^v&zx zQ#$K>rJ~PvQ}1bBEEK0Xl|SMGEFnWZM&&2Vq4>bNmd66IA_I}*GCb2Gr<5o>ZnA`s zpT3t?`t#%C-sk^@3L9 zz2^@YC8{AqK1pZe0OSKGQ;uoky{Q#NsS!?C0cP)^+`el&Ce8h`Zr+vgQ=Fz0Jpbx* zLR~=1}CcYG^eJe zy`TgfdoFT_<*yDg(D;s&*bh6}vp|EShDV`H1Ih__0&~~?juEy$BfVl^15DE{s837Q zk@0K9Y#Cp!>L8c{al6=yL!ITZa#Kr22=}knC{Ol;%@e@Wt__I5<4fK)2-Uw6j#r%Q z*5ii~>*(rO>09$>M{vn0IM-R|K=JEXu-T(2IG^|h*})R|&Y;a>Sq9gRA-YqIWN?{0 zO=1B5TJC#!Z|f3Cu6ygaXd3UlP_0C0Izrnr=cOeEeo7ev>4r1reGW92nr$JNziKQ9#1vZwW>t-z0AL`Rd;P--~ZV@-SugcxZm zYZnJAYQ?iKMIN72PjuYYW!)~G{Y-0~tGfT}Lhzb8`r`Ha>*4iL`nXkI@gyY*{-dp+ zho7q>Nz?X8_B9wvjKc2P+G@QQ4>tTZFV8C*J_NTy2#G}=SJ3yI;5y^znptXL(xbA> zm4vqKJ4(oaAm1=kZl~Y!-MWFZ=;k%d9;JkBE5?^^tuiZX|1rqTEDrtR;PNLT0V8uM zbV;=5U8VzphV>z>0PKp|!>1}e_LmiF_4!8@;v&J}9$zN#a+j~O;u-N{_C*d6B-Y7~ z4yR#n`a8-qT^`ftz^-6i`1K!OqN$q)e6vCY0HiJhDa5qexvrw?mb^oO7lAH5F+FJq zfs#{RgVbA~*?0f0Lge9$K)`;jge_)H4Ri`~X5dvPJ8_d`KH!bQ{7Kl@)7Lxr{TICOkD)=?ho*u%*q5++d-51?q$qa`wv^#0a=M| zEjod`I<8UIje1I<4DT$6A=XD>kAx& zHRR$1r0~C@xcQ&e*U-$^(9*%t+JVkh-`eV5qXPSPY3%<+|I5J4!t_u2UuG7zzxBWW zEgR(@`Y+=cE=34_=x=vC116%DH@JG^+(#cl&M}@=kChudoO!$2b_>BqbdXZsS@m#T(*^X7XGkAYs$Ix4IJ3{o?Ij6qB_aJPkI}B zXFaHz?C$(}>cKu4P?oY-`?R>ry}z-4xFwwRfXjZz_A!W9^WuS;<(r~NR#>w;#0%9d zy6NsQ0iZn23(R**jg99?Kp0HIA1->E7JsuN(7y$gBcaM^j)i&Sh`T<5_3*T=#0^H)_*@qx;HbydIfWiOa_~7R>>`hV1(N z5QE{-;2hMH5ev@Dcp!i%7w(3aO5gt5{sC07-a7gs=zq&<{5{Cu2>gw}-w6EoA@FZ8 CpQ51v diff --git a/example/vendor/bundle/ruby/2.7.0/cache/cocoapods-plugins-1.0.0.gem b/example/vendor/bundle/ruby/2.7.0/cache/cocoapods-plugins-1.0.0.gem deleted file mode 100644 index df8cba9934c9e8123828d0edceec2bbcf04b3ca8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23552 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 RPw|fe|0wW}0{@>1{1?#qelh?6 diff --git a/example/vendor/bundle/ruby/2.7.0/cache/cocoapods-try-1.2.0.gem b/example/vendor/bundle/ruby/2.7.0/cache/cocoapods-try-1.2.0.gem deleted file mode 100644 index 535e4eb8c7d519519cd36ffcd91cafc1ae662fc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16896 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 diff --git a/example/vendor/bundle/ruby/2.7.0/cache/concurrent-ruby-1.2.2.gem b/example/vendor/bundle/ruby/2.7.0/cache/concurrent-ruby-1.2.2.gem deleted file mode 100644 index 8caccaff922259e43703b1d4487120f81a93f010..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 357888 zcmeFXQ;aT55U@G6ZQHhO+qP}nHqLnFjL+Ei%saMi+xzYA#cuw+*sE2tbX*tVrAuE24Z4n zWn*UsB4YZ#%Ax=Lx$drR#xDQ4$Q1F&p+_J`TRpawf^WM_ZesQEb`^b^p!K|bry}0f8y!WIhw5S0)cBa?;|-Y z7HB5W1>WIn5@uy+a&iu?<)QD{Sw<{zxz}iVfpxgi%J%CcY|~g|I;PtTM&59l=Q0{n zT+sFs1xw;|O0x*$6UQVM@1OMj+}Iv}Q%hzHzkJh#;aNnz5X#L#huG?CR}Tr*E@aIA z9ES=kAyua_F=xuLVP}fV!8WI2k9eEn!h0#(syiRn*;NHwIA3!~Fq>2H{p6HG_>aZ+ z6|uz9E>RC8`e&3&%>2Vr7hDaQG(jtbc8_f+c@v30V0=md^aLSVAp}9&z*+j5tSsrE zZIdCZrNvT)e#jQ75&xO{TO~iJhCaaGFuI^t6A%1~QHr~8U0W_@8IzpHi-T8n`M8Lv zc`BX0|9pJf^jQD+IJ~3V&HL&0@qF<0unPO?BHQ=shF1dFp{bbVXX1u;R7bHNK&c@AJbDCF)`jV&3iBZjmTY(J_h_gRKKk4-&_S-GXw{o@NS zERvy7_j)EGbS&H;@Zh_y23mA-rp^vHBaXKIu^T%YJ7CQ@NvnETqpad1W~zQDK!;;EV#JC(OJewEW z@-|b6Z9eLA67XUJ1~uZteHV6-U*EdAOs52fwdh0E$)*@;7z~ojPB8MWF}AhtB~&pX zKSQ5TI%~ar;a`Trw)y%G2v)I6tMu7-5v^B&KZyTK1&vb1;jod_UMi^a+7&R7gW1He zBN?pF7Lz4UKH$}>gp$((+(BCz)p)-|ll-QWpjuLmZD-Iy>c5Dm)Sm7*jmaH1?)kD1Lx8*3aM^nyxoK-`rG?*{QekRc7H zpczh>_1@COBztRNJ90`;>y^X@%;%#e%R(@>N9;}=DWN@WjB7mHkyHV(5}qjtlnu?s z&IpHGGvPWB$e~bl!NRs>Lu5g|8YXRtQB8|b=YgQ-E( z=!rATH~oHxVgi>~3Os$GT4B>F(b>Ttfj3M)lvBRI6z}8SV7-bHhbO*pggN5e6a)%_g@(XjGv+C+L5`ea~{S67ZF z+qH+8On-@&otUcSbCm$cA1P#_2u31B`#H4r`|h;AgSI|z3{qJ1Smv7f0heDNUEU!7 zf9sF>|1H1%7xw#)fc~H2KV}vVCJvVW1OKu9hlKw>|NY-^mHs#WyXyJYz?E)gT>EV; zAb|yNOEsr~*qLHFXyU`ImE(j$IxSy|drMPOgKJA=^JG&qsb4qU95Lsc*OW-JXkNC*L=kj{PL`c<$H{_U`a<`CKPJ27ZYAuB@!Ca1aXq zEarUCetAC5m&`m1)(QqZxw)Fg{~G89Hvf1%DgrhN1HuCr$(~JeCZEG^6Hl7EuKk^z zf60C`GV}AT@ji`ps^@pde#T!>b~|)DIk(^|dhge~k6-iRTjC|-b?ld`7z4kbOCla= z-p;)4-`(VP$pOQ%D1m#W$&1_3gS~ETEzc{tZki|+ymyg1ZfPDA&P%tQ$Hptwk=nLg zo1ww12q|Pxv-u8JzpHFf{+8xgPhVbTmvAL(=e>i8p_RAsy{{%0`F;K`?nB%;r2|}V z>x?tj?^mL$(IS?oUK?G`XTOPGY$H(T;kQrSKjc3Fhvb-ma7+XV0l_|ZWZUK_Nr0z8 zmhSLLME}KF#k?t_T%y0@ohV+Zfc!fOQZ5CH&_TTaXx_MmOYj}?}Qsmw8;hsFqH;wSm+)NmRwKrBB3!W zYK1`di-hp*7Xi4mj4xgo-=^@AB98o+=j?WQ3+uYmbt9+t`J`BZ14kaHpnK=-L6k@8 z$xS$C{=ORz7}yOhL4xv(Ea*nN)tMf0T(Nbr zWyPrXf|G(3o?OyvD`7n4lQbh1@E^^9yggS&caAN|3)GE5)4(|9vsfaya%tKZNrH@x zM2GCoz9)8IJ>uU#a2u1e9PgXg$mzC7H-GL5`LK5 zZ;OfW%eSgepJ2aT?`eQL#IVg(;f+3^@ITSt+g(v4l+wY!o3}66O_0st&6TsxRs7Wf&4kwi`S5oE<6pQ=o~8~>-zMYfo(i!Tb7 zxV*yh!|1~?XEam~M_*>(UtU4EFQw=1dp1xIh2ye7Q72q2w}cEIRC&`6$0UdysNwK- z5FOUw4F!k6fYqwL=Y=KiyMwh)ZOc?MG0fj}i;tfK z6hf5W8?uAxOVY*GTviL~Sa&aA)XD0JKX&4%kw(74f^|Jy!*mzB-u@dO*H4yB4emIe zfl*b9!o{lBZ9&XW@>gwW+9p@l`k_p~I+^mP8=hxZ@uWUU5?^uUaXliW1ZStwuB^|~ zL~d`Lhg5M3RB#{obahjy&maDQBK@S55~z8G8!^dx`6i|2xP+8)HqV53U zlzGu_-a-LCX-j_SuXbgDL_^+ZN`R*-Mb{;(;$f3~u`n;@fK`7r35gh%R7IYJ)Z7Sl zd|qv|q8ZYX6W&! zKL^m_J%wKZG_??m(z!-hAE4|d?0K2&M0<<%_kFVjhgJbSy$r6+*`%qoqhVnH6l7|X z9#tN}9PPgZg)mdl-?o>wCN+ns4VC?Z9a01G1GaC1V3@0Wy#@BrYGuD+8NBYyzQs~DJufg*K@qlwK3Qb)44t( z?ZYpU5h78Nz$!d?I@bg6#zT0svj>*~o@aSWUmt}fm{{%Ho~#NtG-wNHra!^arIf=^ z-N?w+I?B=tz%IxO?jgowm*hs#-5W)cLt)BmCWDA!S%CyB=2%^XEjJ2Sg5NPth``LQ%2&yj)||)ov5s_AO4K{ zstOg9FQ_TmSxyu`+^|YER0qzVVm`$KX&&mGzLI?6iw+R{Q6;B$+SEgNO6!D3iS0VB zoWy>}h8ieGcz1#Zj#^Zg2qD8I&+gsLhk5F_29^eavp)*8}( zRpu2!$fAu4cwT!WG?KLVtoJm8rpky{U5O4U-4Hli=6E0-aA&Q;OOTaai&Kfo)cM^O z%*p|?Rv2OPbPEV_qCU7-6QcP5$)#-pD9W|JO>$(hz>U*xviWCTGHCMg2+}bPX-b7g z!Q`VPNVLXcYrJA2R}=ypGZV2xdnG8yg|(>qUWIQtn^$H2oMB?Ol+eQ=MrU4R^Ko;D zA416wz!Po$I=AsT8*0dAIwx5I7%I%fAE)_EG{WsQ5q{ki{AaalD0F00{q-kDkWEoAzn z?2m`v?+HeSd_CrWePSWF0sjue{R7z!mS^pyN{M7tBYv(VbQ1proR3HRNVNc5OKWR; zyu=>%IbLev{*Hm=j{)j-A>9h7!>`Yq*h`SU#HOz2&fNH*NoXgUIVlEY8*TY`C}^PN zjDe#QYPb`k@d7ZqfJL5;YU-z;i01nvMS1XjlO*Otnx}%O>niSKW8M8C!np76K?Zjl z%7^LZhJGopYW4O>D}I)^s!%~KQZ$`Qgbv#R+_lOEVO)GBVh5Tk2v4%?alhlAI zPGwx5AknkhfC;p4;>N$YLevfrrI!$({*pD$534DnU#Lg)CmLgEF+O)l4~J?s-h@C0 zyG>pwcTBN&$?~8kuH={Gt9`g#a2j|`z_R2|p^}E98l_lT;2Zt?t;0QcV>ho4cj zlAev~SA5E`$dkq)u75fJBDl4`?cF9-=j)bRng_3@iqc(Bvu;{~izUM0yf^iQbu~;P z$e89{1!|k$4n&}kF;(PAD&$c|nb!&4<>UCW_=YAc^RCv!$`)dm$gHZI#l6Al;ahxs zQ|gmioY3f+QDy&ra@=y=D7T)4FZL*U<(RF>SB`4cUJ~aaV2^qf3CZ|IudRV0)8}wQ z-*H2S{@1vG5sV*s56gj#_hYYu;JCrW($W~Zl#So-xerm2~GQq zUN9$!<7Y`|!W0K9XiGy|IhivECIT6K0+eJYbBT+?{?cS26AU(b#O%m}odgte>PslT zpYZsQ?111+k-Q^Kd}9l~qC`KWBivyntj<)!=qRAU6asbSEB2?6j$GpmQ}m! zR~a8THEcdu_aSsoVh??8_?DrpM&JP=Qj@jEP}rYA3?hF6Q1xy-hohI*Gc82tp6=SywXx*4z2| zu(ix4^F~R_l=gy@I~S8!oEK`pWFyBC12wOo+Pa88~HuoZ1<+$Bz`GbN2O5gR414}Fb<;wC7%GlDL1Pi zRb8M51soyrAOJ=~k62MMPb)Ad_au?bnN(ODXap{&y>2R0SP@o2mWA{m#YiV5mwn#RECG*x@BY;e1zIn zLj)V~6@aNS)-g(Y!eF_|hG;K;Hf z*qb54Gkm)78h=6yLT*niU0)ipk&L>-yOoQg#Mfy}-=btvxKR_2nc{Nq5qte*kDb9D zcg8B?N_5@xhZ;)F`Gm=xtU|5=4W+-^iiyw+zzIhoTXTwLQKbq5)J%ZpTxl2V_>CBB;}R+|#UPW)sqxV}aO8s(P!j3=id z-3bjK7BEZ8&=}U*i$n@U2cgzR?HVzY*Z%j$hrQghm{{)i59DlF8YSw(0g&~O*N8Ah z=P}5@fxM0)I~P;~;-C1Zg7Dw8GHP62L`HhJJhM`-O9mvzmWpnQOb%dbFYib84Z}2_ z4$N4tVSKppofx9DX)hGiD_b8@C`1>Cq}c05s=hnKY+C8h>X<+ito@<||31axnh#rr zQA5eTPp>`8!UaVx8ZZy}pD4iy!;|S$@P1ElApzE{#>`ffad{_KXk`mqbS5UFPDH)) zn!xYMRN^vN&~kndu>9krjohfTF7Z2L70?Asj7mHMmTQ!Sfk1g)m(+bck4DK0NpEo{ zjV5$e+{UgPeNR@{Z+rnw0ph4P67~RFZno+)-ro{P?2u$CC}=C0n^B8KElr&ro<(dE zkw%sh-B`WJLmFDFyT>)xIu9Afi2~s-uk(s3$9r3zLj5fAfs9Uo`T@==Bk#`4L9=cm zw$p36%WaApIBrI@1s3jldc1;I<>SnMBYp?R)jAf)0Xa?NakAPP(U@2bwLV^2-8Vlx znf@9B=S&_;0ogwmYWiWw5Vnb@3L(E+i^f*E*`;Gf8T%&O3Fe@(IbKG;!XdD3@7Yg> zX8*lW!2JIC{m;~E#b;#wHVaAr+$&TBO5oPx`o?P*@_yDk__cPUsnz!IC{*L5q}PagwqQIbg}Ceaeu(tB!GLB0^04g!W|)kAc5s%#QEDUeSD|a(#q=b-eaUCJ{3QV|`+e~v zchEYGE#%E2T#yq9s(o?#{-(qN93U>L6EHX-Ea&GMj}H|`yV$aLqM z%+MKCdu}h zUHnTgrDU;6|AyZR(^3-49V^&E3z#ZMMvQaJ5`=p#E4nUmTS231t9MY55`7vrED_tZ z3CSS-;SCkqKm%hOy*GPg?@~`%4D22!L@qWI+5}Q%k>i_D1&8JEmYh+#Cs-cd%3VNl z1BaAFPh7xA@hY8kuDKaVD##c&nYMl5smP3&V%S^|1=#Us#D`NNAmsmq?@|T2@Z`s7 z6=GnQx95o5cDqFXA@UX)R1C@-om*=G&~r5&^Oy&^>4OKcv)@}=oMxgGH{Wv5B}{HE zquC2-WezWOlLf%DR3o5J;Dm{3fTHKQrbPai&OtWqn|ct)e-k2f6Zqh=LEb9*!%Ezx zC3XAqwCerRa}og0?Qnfb7a+v!SX5NdT8gz_76s>m(u7D=tW zXPs5w!Wk86YPPE7F)IST{Qj`_*Sy$;fJGjfmk|O>dixeMFwV8C zNeE0biU1XqLtF7ctkM=6LduNAmIu~SlsyUpc-OE&8ieN zbyh2Jmb`DSnO;}G)9rL=^|V7p&>gN^E(zpnb3k!YHBU5mE)|tXMPssJoJ_N#C7!PL zp6<_SXWs+!fL$KPM1(|zM1)sQ9DQIR4Eo>%1M5S)GzhL9{kPriRNTS5MqD3bu=MI3 zBNrxkR>RUHaPwf4@|n-EL|7Gg45>~-zo8e_F+y^dH-fQQvW{gIq|TXzCaau-Dvr9W zK5xV@N;P{qj8;}0=yu)iMt(-+`@F`~aZ8hNJ8nti6StO~fwT#Ty3Gm)`F}nJBvoM| z-Zan%l6mA&_d&g5jSAaWaE%8sp~YXL-f|u@Q0o;m3NV{`Hi>7z&aVSV@ebE*B+Pe` zov6bMZx>jxO4w3*XvhUzcg8m;hBZvvsnHeGSw`_N2Qm-vVEryBDN-Vf7Kv6`McQ=v zIrKK1=VC=V%`WDRQWo@?0iSr_3mT}@LlYz;9&cqP_KrHUT zl?`x+!X8tc4=p)Z6W~>^^Lc@a;HA)w#>Xlp#Hou`DI*6)t}WdLQCgp^u&Pr)GNB1- z=Ftre)vnHDqQ<2!j+|sswu;OS;tCG9<(7p{2Gyw z3lwjR)Act*&$!VS&fN)5Q0gxC$pty27g^MFl{8b-=8sp{teBxgepvHw#(B(N7=yV>?bJbndWeGN3IH*Feq|@k^d6WSb z7!qY(pjfe2NjM2dI8nL%FPzChs=)H&_fRy!j&v3MCgA*yQ&IW?lIvzJpcmnh14}LR zxdX8+*8f$eoKn_X;egeRzqOx0B4^E4^Mdj+AQ=*Efj{f4VcS@&HKZFIdvXgfzFx-; ztzl3+27wmnX$s~iT@a(8P}0bp*4Hw;a#X3d<9&bT! zPjgLw@j&8ynmb`w$okz4_A#JI=ruL-`*!##reh$6Lby<_aB)m=SiCLFONoLP0F!GW z$UISUMW%u{sUnhshVKPzBF*(LEjDRZE@M1Y5H33cPeF1|eh$Yc>*u*1m7sNkqPWi)vqGNU?-c#v*!!jur;tiw=EcU&R63>NGc zu?dhY-6+JR^8)+(Tm&hjMeTeqPNG>t7mWErqetKxMTb#-dzf?wV%s|ii}AX{OqSBN zPZTs1!f>D*cwsu!@mkTF?=q;LMJ;jsSV)u%VU2}UIX2*MUe*~;pxEbfRj+@-vaEFy zqvZ*hg_MK>lmmsi!ytK&-dLqv*BMG=d^Wq-R{O~@F=F;PcP_$0 ze-1_YC3eBNJ#_O~Rb%Qb9MBHhKi`*z&Z?gJ-=3hq+bol-n)*%F{O?XA$-!_(!8e`Vq)n#Pm|(g!&>a1Dg^6r4rwEq~#N z_z9n8Vx4VQwFAGNCOUs=jKeHBPX3y1aMXd2pS6r3XXHcK8nUoFrIZ+GIV2nK$$w+y zYw<8CIjH}MD4>i>oTM!(v(#N>859(iX_mYoGET*h!h*s_=)wXDV;HA@2!a2=9_!(6 zba1C(eM&gqK4ya$`*hLp5!f|8RHYBlE)z@>IS?q_kR;F#FTacSw%bQfr#dgzM+}Vles5hY5!-7gR3Am`A`{0B(bSS$us>I zDJJ=S^}!JRMkY5AF8I6VMA`{KN8PSfjt}sXii?kv&^Hb5FxC>SEmy%Xj!g`r7c+!p z+K5c$v}ZQU@7TQm#(2v%jp4+HLQ^=}T<=y;o+R>hM?O zUG>-_jB59sh2Rv7l|MpuzL=ci>b=UO)8V*c5ZFCGex{8SV^9Q#X{Q->Cj&(oQS*F< zwxu(gfK0o9JrwPDZyIl<&FZCL+1&7@zt>DtH~CN9+?Zi>tgz_c4)Wo^7$vPDXYF;HAt6|63KtGOw(Q|C(>4 zIrh0?x*v74N(4?vZd@D&Y=D6Q($NNN5Q43aF*Aw4N(Nr}@>T7FX#R5`m>8$`$G9al2M)jd8mZ?FDda$HgPsYqD16g;F>fp)P zv4>tf7#(B-^r$(@vtlB2a3VGk!Kw*XK}u7HN_F#5!vjuP*tXgN>nM`h;3j+)fN5n8 zm%ro+E{&q}_P7*Cl&)4DwLoYGf4>ZA@id(B1m`i^mj3?D1yT1@bCeHmd>^6vY_EVs z-3~Vru%LdE8!u8J!qC;Y(*K}`K7Kh|>F=|7E>46${vlruLoo6yiB8U9njOs<%;`_G zqk|J73Yl}+86_mQsoWlnpUyk`LJ9)~n_nfgZ{{TA%u&jzAZ#j>qy+prUF0U}_7Ig7 zQX;3=kguS+Vg`Y$fg8e0prR_>D~v%Lsb%VNr4%=9B)q1hls!2njDOQq=*91!axw?{ zN%Z{_otq3^|3JV`J#kGJl!cT29D(Z96h3PMm@-0ro6P0#NPNS#lNfKQf+!!zY#Hus zfygFQw&XPn%Ow@)x!{6l{$M0W#8EXVtLovtsjhS1RkWUtD~8z_|MQjfF4IGL4tcJi_4KE3S?68i#NeB70V5}#nHDv% zzIEW4j&E^8-z;v zI0aVt)3QzgocmLcs*GnqF&J9U|S~j8?|b zSWthVYm|VG-BmK`;D$SjZM9`v(`;p0)Ls_F@;veaY2D~V(fk}h_B!i#9+Oe%wtb}t zaYv4Zp4g;6p-!TpQVBs}WccwzRtT-ozoK6ALJl_83n{F#QfKFS0YIAepBVZ5DE!rA zxhDVSI%`ZO7zIU;2+PZQFVJ>-5}A+^8Iv}IU{*K~^YwnBJ;Wi?LG>%WMsgjRw&)T& zndL_|Cc6c1>-VZIC92!t%%+j&T&aoE1vuyuLq}uC97qsPYcU`zNS3(#SA1rA`sDmp zX6P2>qsEJuz%sKp-N~{q{&h*{3*pm*TgV+iT&uQ}W<@EW;P4@xb9;W;Zf|S(dCLxH zJoY*yz=yL^`zo@)6qQDx4AcFWw$!von_pTwPk)xC;{l3#WVItqk?oFOYhLXZ>H!5? ztvM;;Ns$>x*kL;g!rU8dbBsJDRpPN`0Ui7l!EsdevXRO$VUwjO%k7{eycPqTwNerR zjzc@g>1oG$V!7MJ+!hZ@vQ1He4ptkl*U%x2d~g!FDLW^Q ziv4WDIVg@p0>?|&8945vx9c(`-zcT4xZ8<&v}(%np96Wsnr%bz4tYw|tvt#w6-kLu zUe_^!vntSzVk%4vqbGWB(U+8s?!P&{er#pSUzr^R!V9@^cbin!mA$im-Qiq~GoRC=< zyj$qQ0mV#*?iz=LUu#L*1jq0kz^lYn?%KqT5`eNSw=Qg1(ljTi=h7g@shzT7im*kg zlIberdNIZnOFQMwj~riomLi_vME7hwAyvjgg@G)#ekr>aR%J}Rd`%mjkG?`g)7w(^ zr+Ha_U*24ESd+B3dW0Z5F}zZcxX|wM#w58FJww-Xi5;Q&Mv4oH0q6eDvEm0`DE2N; zp=@fV)?0xxK5Z~~QJK&A$XZ1VeI-s&$j~sWkrqLy{d|mJF42egYH~hoAe(S+dmNTj zT3-}_%-_a_%cP?S5{z{7xMD;!~gqSH7GVvZNa*t{5o`r%7Ke(2z zvc5a=T(gpf;Xq%1rze-sKdv7TH|c<`k`mAaDMIj{Gbo2KhbNhA+wM=lGY8#h10vEVRL{wU~(7=ar_FMT~r?kITyyiA^p# z3#7)YVU3>Yv!|CzBn`@mBvmfEb^L-N^Bbj8|LLZ#h5pJrlO=c`qny%+{E-U>K^!oR z!D`=5uSwcjq=_9DmG0D4JDwKAu$EIEZZ~x#mu(qV^P4MnE)pq7fpuZUZu;z&V!Fa3 zIWl*CJjpz{a_fbL>lK`K3)a6UBLFgZ+F016w| zhdxZ=ZC%N#k3;y=0+p%Sm8i`@(VV)KBDw(XCZTF;SNgm!$3$5bvpcCMv_NP6Y5}Gn zen#~-&Q7uyKiR(!qc`7D@MenXDjqq)7(DMmp_;)|A4 zrHI0;jVPYXewBaRGwrke1;dwW|1R1wY!=or>3C|nj_Ha*x)N?jtG)3Q4!MTmqTGL7 zPL3vz%^HWLw>Z2S6ei0e7FE$6>>2n&_Pb3i#ZrMzOY^#j^owtPVkND(I(hKu1(`Js z?E09nhhC7Tz4C!EHsky%y*NP|%KB#r|N4=he|DR5s&9+kEIs#qWIgTS4)e2M3okrU z83)d>*{6h0txUr&vubWU%D6ipY-Q3{`N2@8m9HdW{99RQK^(RA$m!*eK zAZ_iFytK!DRYXNLM0^gxXp&NAlt9p<`cpBKA zgFV5$d}bKSNt=62iyy14L$|k^V_o3&yM;e*mcPE&iOD3lu?ft5KZ_fqAE_1LABwoS zxQV}&zfZPbvc=RSkeYwL8fjZ{6rk>6oQA)tVFr1A*`Z9J?4K1*mwyHfDi*DHXy4hW zNpN&NB2!c}aAIH1r_a(@kJkAgZ)-kvu-u(o2fX*M@B;!{UA&gO+x$N)jz#6WP7Sy^ zC)xmvg?aR+n7tPb$2IM=fC?S>!C@KWrF07h?~zyEG0IQLNcroB>aPe(oi``P*JlIE zfqKF6wzvxyn~qM8YDaF}LoOnyys>$=13P%XmnP?$O`^ZtbmX=Dp^D#iU$2~i4^mJ2 zkpKt2&raZ;ioRa&;J&SjWqVyQBgR@pw-RZ;l7hO9%gd(<=iezY+hNLo9UEeu*8kX~ z#(UU5aTy7+4Ej#asr@z%LU4Msiv`bo?}ruDFD18HnZPZx#rlDZ6fT1MVpl{Dy#1o5 ziaV?Ch3v=EIay2{>yAzkEhyVOX26W9Swk%wLW?>H<^PFiahBG>l^;rbOY_aK%-Hsa z6X~>5*s;(J`O-(TD?^$OL!X+aOKHv4A^L`T-fRYa$0&{gkcpRHE_>1uSC-xppyVHD zHv49{|77e)mJG86o;ax0A0S42@_u?Y^fh^U{W~ouT-;6gbrhgp4)l9CL;U%*{R%Bc zcU>>>>D%`^9lMWj>iUOIA}w{)th0f`j3hDAWc^eMh1?_ZJcM>`@4TE;ouns(YxVF=vXw!^Goz`l zqKG*~#N(s--^(ht`S8aq2?P5Xbmbi)+=i)LYvA=Ev-#PvYCf%Vw^yG}z;0;S_G6lp-R5Vzvpo50tt`UK(mMZAy1S9M!pI$vu&6fdY>b zM#YZ6-W6-eO09$dq(jzbRza?^oeXdf0V7s(sc%>*6J$Xytb%*spzlJ=EEF0gG)nrf zNZT7ZGP!dj-8yIj!_GDeO9bYlcL3{vC%AKP0+(sRL%m0ap+DJYG=YLyV8vx`?AE!L z0gW{HTjTg_LO#FY>S?CH)#d5pDf0S|-|~0Z+tcsq`{!n-uBq8yq%SiEfcRPAn6OjG zvvlC~dG~Y+n5VV;yt@VLz94$$0(O4AJi9$z4)E|-Uv_(W*LF)RKO=b|Z#`cT4S5;Q zyM{_sPmKzla(VdqU6}q{*aY5!<@ap!?s$s|wi(_KUKRfIX#2JV`a}sB;^Xsf0=ljb z7r*mgAvebWU9V%e2?{S(Z~7N6PQQ1{%<=zTJ#O!o%9PKun_l_9ofQ6SB*inT+<5WL z`DQ*jy~6AH{Jj6U5vNc_2Li)0x(c7FF`Tp83u5Sm(cIWo-6dNSi zT2VB)26#0^N@6+Y{`>-{r4zIuC{fD_<#mqltKOd?zf*h4oBX>2L4vw@1bjAYfb*V4 zkUd3q@o%IVfm%{Gk!?bDZxvtUA^|r$FTl_4A&HG*+iTyVFmK;qskW+y4R4RNU%wNh zsn78#KYhI~kiWm`7lOJl<)mfffLwt`47=wT5Dq~fy3+7W=1rhJ*Gg8j>ZR3?7%TTi_rc+L7^57Pi zRMcFkROnrX3VQBT84HV%q?WHWu4(ChYg|_s%edJr*lR#XU9*LG4Je z2msaDh=Cl7P)2Y`;E*F-;j&9aE%2kW!VA*p05hl$(1sxwlrBw3Mm~>dx4dqm4ng-q^d)&}B3zf96oDPy(;*ZH zCE{gdt@T0%`F3-CN}AbFrN49I&-2IOSfU)|-Bn;6uAvRwN39tT!J?6mD{*M!Wf-ly zg;v?B1j>>j^l?7fO`jG^tH7;JI3`F($BAJU!^tDQuhiI}tNp~f?V>`O37W3gnoo1< zOY+Zbe%PrjRIC7^A>BQSBpGOIw5zs#uHOHMl@CWrcu8?^tGq!d2i zp2tD2ih9(stcdRd7{vRUcLGR1Kf+2ud*0;5Mb#+cI_yj8DiTha4l;PBVIHXR$OQPV zVoE_V7xL_T%k2^p&Qa4KHTxiP@ClEglLeI8&Zs*~@5A4|mp*rcp`xGkM~KXQexL&s z_FEfEkDdVrg2hRvp+0l?ZStk__mbHTqmS#r9;lSSz~-60pTWS8^q+9vaza)KhxY1f z0LOy9to*(7T;CBJc1n^f&%R04;&4Zps@nMw9|SV7zES=V8K5e^QzRr8lPzdVeeN^Ox#vAjP+-Z=S;r4GB#X<#jeRWC% zah@oK*Gz6DXA-4ep6#OWu}+~^9Nx^=28hP^>_1-I5XhGdr+9l57=`)z!o-A7$JDV$ z%#H1c%cMD1F<$8pR$k8?CpNPO?Vgyhv}SEMnka$SY%)Uq<8pyyR|8%8sN$GT;N}>; zg&QJR)Kj^C`YU3h>t19SC|I#?zPYF?Xub|QX|09i5;JwW$QGO1;S_?z2OenbO{#X3 zEgzeQ-yEy=s_b7m9_JD~j4c}kEGrxP^eHX*pv7J~C~amdM?4e(W+yToTfQ2;jTBWK z?MccU2>BiU2;C&pvdDE5EfJ%BzCGu9VyjTfHZb=YWyHi8C$c~llNgrdaGv?gLsl&o zp_+_C!`=sJCARv1!(S2CNZazq3es8S7#-wt2XqZIAzLGiESR6qwJXzVhjZ)w1=+k6 z+PR=MSJh6$#I__T2x6$*OC?q?Q*1vN*g*>}w^8zwL6{Q$eofZvqfejbiksMnLM5q~ zgzF_!o$A#h+nvFIByE`t)?v4j>jG;JRW=H>UL4zB6%MWtC`G)S`RY|xqQuu>^ zkT7!ZECVvsoVj>v4y~!)^_{!)2XsM*3NQbBmy=Pjg_Ang+*ZD)l#!(jpUSAQ(gJ_! z%l6tb%Qy7ewzrUAxoyY*Bty|OUk>E%3BhR;8T`mq)w%k6>qDlcg8^^k>)F{LkKj%nJHB5%XR*xvY68$=9lMA^*(VJl@fsMG$I4ngqnKKHu$TEqv4!nvO zThMJS+v!q1j|7f=Kv7BsV?t6Vj#4a|Ig&{H$EAb4y6KqQ+|?nSd_o%;F>TaHsOGhk z{wvXgli@HXT@jTwz(@MwIYim7Hcy2ri`?ytm^C+jAL2`HLf({pvVLW@IE#yER1{;> zmHzPZDlc?B2LqE!zla%<-OVS36_LsY-Q>E8lxxpN7G>*{p_a!n zOju;}72*KF*bXu@Ne0|vo0-Mc{$4alxlaCkIqLyUOq5?b-X>-@8%a4qIy`gN?ID3N zY~~^i`e-WvYcnH%)sI86c7lx}eAbgLH&(ialDQ4*DeiV+>vWu^DJWeny(>kO?$0_v zpPqs06vb=LE60ySY`&N7G&*_69U*PS%0WIV+>Ts%O>(%B)VSm^&cdyALt8exjFxD8 zBvAm4%0+*Jh&#w;|2(WU+JT~DtLg8I3bg8+Hih-gCjT^;yyyG3ic05I8X@Gokn)#p z#&Q@*^%Q&_7dj;4%WTJF9K&v2C3T>}_sc`vBlwp2;4QhU3{E=nBQ zKatL5#cQs!HH6QgG>=fv9sFx!7lf+do8&>oHCABO{u0m5#gb!T7sADOO(l@}?5F4ky%5m=#(p1}2Q0gCv_pEbK3rn4 zIIe29z*`>cZ&7P<=Uu_D#6yMOEdMJpuM?cyHzesif zT7%LE$EWm?=0uPg@eb3?_W9#;TabnRy|dYir!k4OP)F7~FlLHx5|kS#=P+->7@RV^ z7f&GKyw4Hc%Iv!Tn8-KbQzN@xgR}TLRjd>u^}m4m*cC>Ps&NP{9&-SHYj0~vI+ePR zRjY>2co?69H5L3y&Wo?3^2yJ6alblaUaD0h{6%4xn;WMkH8!muq>vz|zYy8Dq(A zdAjM7A9tI`2bCLaconTM3(3+n0VK@gg19vkSzVU}acgziRSfkUxmG*!>@3iHd3)jY zqwFq)2M*C-{O|e7^qG3|8AM)UItXCdAQuEUI3ujz_u`H@q!62sQNcD*v648u)W?6_ zjZL*BeSwQi0K@SBB4DmnO9aOFUlA;_W=-w`sn0()QBo=B9zZY!7gYjVVD@g~=F@xD z7T7N>=i#agGxCkfg53U_Swp~4VQMTuBm~hc<&2LVHrUYuQ@SMO1*8}lFLDG{(C+iu zowa22g}`K6G)}d2a?vfm?fBub6Y{Ck%+XKA#)h^;)(FL4d`$;`9RM6EbduLsRE>DH z+biC^&D5NM>A%KvM7yVYA5~KPs9x#AC^vrKZhESB!L!w_&@CCN3zc|t94ZyW2Rvk0mHkP%WC)A_vXi-9o38yS4% zBR=^LOqJhBXNGUCCrSE*_EfTZn>W4Xwa9FVx+y$2^>9WkdN&!}re`2ZU8stxc8(yL z8q#5lzv^Wzgf;+m|5J)Y=+-hh{(4bz70umy;5-F@>1<34tBgjY%9!Pa=DQC*3%^1@ zL=-(Uq80D;T4YiX8WWr+2g#Iw5g8>&@AH9dQZ6G2Oa_l8E9PVd`JcbbHD+p~UNe6? zmO$pklr>G$GWiQj`ixj@Sbq9N90WK$&3t=hB;=3|%YI)23#09SjaO*=kGCj|cXHF! zt(FTImoPxojRS6eUITf@G&oF*Lkt(J4{!`g2L_k_Cje1EuD|Y!2N_8ODcxm@%|{(c zNu!|SaCmDlViur^DmK}S#mQ$C#YGSvLgpk9xW|Q7lyyIl>t&hGOv;ku8uZXHLm-rbA<3SEMdN5i<}PW0Z}H|2nn+E z2K-h;kRx-rtgViZ;u{EwpC=WLx*|LyPNq<(O!bgsW#VsvDs<)BVJs5Gm<6y5kwJlT zh;#hP4S$SOew;2J3@wdnoKn7586VHroH-QaMzjtB>7`0RD}`6B5G~Xn(9uR#O1aUf z)`MTdzu`=_h?8`)_%Stkx!5}cAh}6%#^Wo5K-bDKPfWar@YK56E{l9q4G5!(>KbT`q|FO zyNv$%p^Hmi6Qt^A0?1dsa{Y7?(@)3TOlzof_sSFpBU*u+Aw;h^#xinVN6wi}f13@M zM$_01GPMKlHX5obq>0uN7h86zM*LQarXy)Ck!mlCc(N#Z4wSl8yK%QY*ZXGIv3{7% zvwJj!`!Eu*wpXN<9B{$d2lJ_eGPX;7TN;Rgh!)EvcPHO=fB+vwp#g^KhQ4?x{VmsJ z)vR=-tXuX;bB3+02R&)J+x(GJn%hva$A;<;Tt`z_uS^eI0WryH&N7Nmrpbjf^v0-! zgE)Ov5JD=Na4te|JLNx$CgpDgqu5@Qq%d>YVdu__;*B;Ax1#N>KT>$q|=XCliynemN`ns)pmq znAE^MiSb9gWHw8kt5N4FRIzozP<)1}_-YCkOIW+sAf7bQ8XG8Roc?!*yGHa zs4}OXpi*r&FH-R>K?(KXAmtlU+2GoM)?5dUsruJ|E^Zm%>SBs;GAM}+gJ>!oxp==S zyE6dwkZ){aDN69uD)3)51NiAGOx(WL)}>3HwAa_$8&BKU7dPBr(ozMtT0zn>^W^Kr zD!OA3(a2agTBImO%~w;}-{c2VfvMx*k_3bJ!W-+%?@v%HW$js8k0YbP32u)!2`W0| zI~W%@+jkcOOPf+G2e`7cFg5n;d#y7I9`)Lkx%A6~ryP*e(*2z^YrJQJ$ zWOdLq5*D{XIJ&wY$BA;RYTs75W}!oNu&ITA9M0ftJEG*3=DRF{mSWyhb(6~rXjgCO>YCS3!8XJeS3#* z@JcsQzFOCAOCkQkGNgW&r(>)Vp4`8TE|ntdo#QTp3Ek8^7++O{Y^@LGrQ+Ul3=DUz zvtm=Zi(#DD8AKm&*A{P%!+t>F-s;evS5=~OeTT^J2U*P(+DPd_B}X@Ra9kk{$CAn} zfh!o7L)2}h4R>8E{nwD*1F7~-Eh3MNjJ(z#VsA1bsA$K|!z{SitJ2HWb_}F27xu!W z!&ld7aYqi;FYy!NMD~PYniC3rgH9RWce2hd67y!g1*sl{kCt33QuoLGK|V1#7hO8u zCulvA++4^bMb8f8>W*Xv{(5a~Eqi8NS>m4GgAc1~lyc8Q`Pof204+x_=;a~-UsRJM zgmNixt5)lFyMU-kLTY8*T*1r26=mJb3d6U#7xfU-UgqJ`9gv%)PFjLCRaDsI8d%vqab*irFWOCCQ5!{(+c*AkY|h< zt1MLV04SG*yc{W=$oab@NmXSaC4=ePflQCZ%rEz~5@UC0+7YZS&8{Qyyd9J@_T%~i z|7UA!ckku<*9{nP5KvpgEq-z0UHP5_)Dt@-o-r1L-h2uPDY-zhHeRDj$644j znK**f27^MrHIi?b3#ydN78qtEq&4|9%Sg;Rz?7up-ZUJre8sa-rG_~}0Z&z3N8_DA z(x3c-PVG(8JEpqIZJBh-@-Rq=M9(h*4&KcNgNaVKTLl;!Z|(pc2G5SOC$})bzH!=! zn$>FWqEuN%>^SROi3SzZM5H$GuS^a_&_ceq$)n0u3KbQxqwjkl0RavYS4C##V(p9+ zDV3`r_7{uVDL-;u^7Zy zqk!Bku|@}#DD3P^borP*AhvwG$8p&YCE2`)o$RI#eb}==fzoIZ4s%+uDN<=%?pWro z)eihrA}D-E#O=PxhETmbC^#*NRlIW5qC9?y^YxJM*m*?&m825_~2R1NGpyOG5E$TH|e^b6=opE4{Zi3GH@S`XY_3+XCT#_WLvDEyMiN!%VG z>Z?t3pv|M1s@LuEaEeCb=Jq90Hy9QQ%A_k}b2)`XmZ{3d>gB)2@^w){r>l>t6pT|( znXI`Zg*GO62amlO_b6+#L@H84gj4S(O?da0(9`6=PswB|k`V z*H#t1$_Y>|m(&|0xoKV7rW(c?b1nfE?}&0XA=zz`r~%|WCwwE4$sS@BMBJWao8qav z%S0*hZ6`h?@+lMc?CZPQ3AyzWITG5P0M2 ztV==kUvSNSlt>WCdP02gls1 zuAcb_?;#!0#A_-g@)@g@+bR!qP8ZWP2VK&ef104+pa7NY*+(kj3^7f%MAgog_Ci8O z&N_uY|JVQgzmrnx#(Wl(@&LM`;j{Jiwao@d9e%ic?bT6fFx9PAm0r1=4{4P%ARzgN ziK(r~&Rsi0e(qdm&0ErQBT=R}s-5zXXGq~^sj$Z$F`tp)ZmT=$JEnlgPly z0|x)BNsW(*Q-0|JK=bqeZam)HSS#lLefsptANhZOjekmb><}Rl-_D|Sd}<4QIlov> z?arf1+RhuIsOQAkR%$ia8#>^js6+n(vhCKEPMszKBLz4gzAa>QAXs$?R9x>RQ%6=l=n6@d+6uiUVSVoV z|M(B*E6b`Dg&kH_zOB_jRkpTpEyEa2IIjqC!Me4QjxuD~o7jNg(FRz5Uo)tMuZtr!6kN#cr|GHV254kbw(e>_QVtWM);=q0L1R>MMw?7tO9M3w1V zDL>LTC_9QCF_U>G&kQNbQ`}!Zf!5p4s=vxnD*4D}l{5K4b!QeYG`(5RYPFq%z3oF+ zCI7{q-w``OU)|M}<^o@CEZA<9F`n3M&!;1v;|0u!OHU;C1yi()KY-t3I+=7B`q3zgE!@oh zwOWYB;=?lIeH23l9gsQ^stdy9HjNwxxs)l2Ua4AF_|(AYvZH2a;Jbhw^AQ zsG|a#VSHl8F&%_~i8@teArnMoh#)~WBa|ypXmdV_dIX}SS}wngTLLlx1{pLMPn_>qi)m62etewdismAvVU@Puzk9>yMi?e=$%hm{yD>V7VkyR znnHwxPCywR0H=!o`051%K($eWhr!6Se4!fD%=Xb#npr_i^L1{6WFv@rc+*j;c7vwI zS*o*rVPg1!m|oJK`py9|p0|yT>Z(&N zf2!-O-ts{jq$93aTd+;u_8G}pBc8dlqR?u=FHjNY0-ph%RzGt;RztKTrWaom$uim5 zZ94K=B}$g+z@HIu$#F~|pQ&?O z=7xCP8C$&2u(?Xxgk{oQY0S`gm~`8fbV(Y3r+cM>YFjfAcF7(G8*> ziyZPtW$XU2?XLdVXp7+0`G+-DAI`{sTeqI@-KUk(^@^1o(k(o_$&=b!lbHD0a$G7r8VTHp8(Q>%(Z4I7?r%bd(gVAne zvu@T3oFibuTG&3T(P{;IY~*Jl^hgWF~amvg>ZQC!|)=X7wj zEFkrdROpbL*Ey%vh!Eu?JLkX_k1Jz^1uyHM&WH}O8qYhhh2u)HC>=bb+!)nizAnHr z)*MwJZ;4n)ClDEmZJbS3C7SBi90&C1fRmM)2rxSGhy}NYh%l<*ySdgUr@Ke*PhHvKQxi}owjCW##R0elf{%Llv!Wy+|IZ9St<0`S@iHBUEj*obz2g*lz3(1Ociow5S zYn#eC>h;qpSH+uU7p1NcU4xQ(#7^P2AR>ZDbmrLG-@+)koVvz^mSin)>cu?4>bO;Z0%y>t7g zaWz@bz{oq&bwV7?j2yApjig4SBJO&0 z9a2kFI$V zhEz2<{MveFN>J%!1Go^(<`mlqg>MN@^QbW2-@@LDAmw4NsvRNh1hKKQ^s%HrU;=di zPA~)ZlU&Vll;pbMn^5!Sa_{ac3>s>CxcegeLAbneFK64KpWSOusB<3cj_$AdV4m0M zLO!bb;Gf(5?T)s4&UQ6#gDb6+O?~eY;n8C|;VbRD^i^+VP(i!DQAobBKK> z$X?v{T?86^iTK~O^~Y77`Xm1L*Z3EVIoD1UpSv8a<6_I7*Gi9L$OmJe z<5S(2UJ~>VaH|jDB zJ#I;ps&n2rNj#t?+u*{!BtBbHp>8yp1Rd!|W49R7hNz)J{Q@&{kU3(X-+Ggmr1TQmT(nDZ&axIF4?opD{gYnY z_=5DG?}Ful&VGyPLvcG}m{0%LA3u3gr2kJJZLI%6|9_2tI+S|GK`W4T&bS!+LzG%{ zUmW?<=?QUpQh=q(Nk8)AzD}Bs&O*eIB0a)|H^Hq&=JeC^3+KCi7w_?Z|4DiSu`oy7 z#-&H?yckkV&ulqFKl;TMJ$RDLXKZ1kX+)Ci*qhuUdSp0h1?STP=Y{Uh75ASssxM^{ z(~`x`4Du;3?~LF<$@QrE;a2Z)N3_0_$qZ)cOHDKGxt|KQ)Eg)u|NiCQkM~~f9q%3P z>~*#e4vu!VPmhkRIiv*9J0XEKN`>Dpttgl*m zLIT=tR0c!{rz|h2^Et@s9N3Hcl%*R~adqs3LUCu7UJGPkCj1d`NzzfFdEH)|LRRbe zb2@z#Rw&?YhDDbn@8_S35K=M|#>=lP6SL&I=LKMWdj46fefB$B?z08f%m4k)j45zH z%!{RbM}+Sa56APxk~#nlo4hCx35m*oDQQiJ3|p(rW^d}E+CVU5I-70H_PLtPD4bg7 z{o%>>tG(ydjYknjG^?(UhC@1=&uhiDdBBzl1y}3lVQ7P8*f-ILXq5Z@d8wh=GHO|M zzRK+jv%?5Hlq(4)STTmF3#4=L8W6q5GH?XP{s{nQEqj ze0|O0<}~%^ZWxRTuuEpg@l8--oHFXs)_zUt+C=lKkJ&2R6pC@z%{`yDSFbkqWK zkFLGRElVx*un0!!goNKqA?HN^WgmGF?-+N~lRPx?u@6J1o*Pd*?*vm-`CMr}Rn&{* zB2`ONvdSU)Lgjo520p0~9AT}}Ha9ux7qUZ1a0ZF@$tb!;QSInF=vUBYbqW}KA`7ay z)D6@MkeadmpJp##@rg69PYa`nN2xfh;2y)HBAQp0y zq~#BXq*U1+SZHe^^Rjd0Y3{S@3$C&bYgrYF*dr6$77TkKq^Hb}fsFTnyYAQqdBt3; z{nlTUr|@Ye(=FkTmRBoIdmdeXXGb18jm*;Q&EG1%TD7$Ho$V9nn)CW4(|+Gq7fIpU zYB8A~s7%~Rxf4?p1uijN*o8B$W~E4VP4$Em7{=p3rS4hw|7+@vlKbMB9{PpN#wu~` ztGaGGgXqmdBU&P%P*z?QluwbuCPQuL1%(C7pg43AUcmrebsRpGXKhVRuakcEeB3Cg z+cQ@$tIyb1xldgIcb*N*Te=2XC?lJcy4;VIP8UD`G`;{FFpDg`yPgp8#&eQ)DP-S7 zp?BOMks@(|^_=K$;(KYSPi>oFTu+ir8@LNCQd619i}V(#LFPc&AeZ=(QHm)TSjz)r z4d~3r!Ps?O)!%}kKBZ$+4e5E*Pwhjco-V4Wt)S7${;ZqY&+Cm}KGpurRO!!ob#{i5 zNgDx6n*7A9|D1KKzAS!Yx5qp(-SW?W7F}q{Z{_b7qBy!l+ztuW^`%00FsJ?b&#d%0 zLuze(TcH)E7ry=3kZn@DIY?wF6bvuauG9;IHJl+jt%uVQ)SN%hQzuO)Xsp}T{`{$A zN4nK&@XVME3f6>Q=IffzzL>IkbcK2t1OL|%edb6#&#DAQTYG6JGEp#D-a$wC^!xTR z-o^h{?R5QI|KG-=_06@S|8L_D|KIP-|CjlURv*?GHp|8TQxdOlZu)NK`gr3d7leNI z|ML513x69%!U-x@tGVq<)L!}L@#@{lQ_FzXj}><*kMKQGICDxq_ucXS_uHp?nfLHe z{CiAj3pH4BzP|7Forowi+;s5W*{-`R>uuS4S51v(dG9{ocUOBL$DP%MmA_Z|sB+y& zTjjgkiAM0f(~Ruyge&vT5ck%CPrmmmM_?X;vz&l0w|D-wceq<}vE|0gd*>GWWS;*l zo0jE3V;N#0S5j#Lx44iVzBH3tHvQ{K; z*|UBwiQnJWDx5xu>)qXZwf+9!w6lM>f4aYY(An93x4pA}`ga2F`sVYhuZDEmvhNO# zws$+Pws&Ml*4(F0hRpMl|L4$`_KWh>6T;rKt9H%|$KX+hcVqOs1S7{Tk`V zrAA4ln){|cS1qT4?MBn{6>UO*hiE#{HEfhqfz5|p%!_y&tdeqJJ8<14U52xkx3UDu zjt8ps^5(=RKoIU^4%W0W!}-Mlp|)+rwu*?ywqCFp=6$!$x3IZyd_FenN6R6`_f%)bHBp=>}>&+mkCn}Q9{_9sC< zSt2O^;~!2AUZok&*oZv374`wb3+BXNs8>L+dOtrEI7yKWFKo`3YsxUARJfc!(_>C7 zNaPg7&1QIw2{H=NXt(IcVKAzHsp;jdEILC&Y0hbcDVuL}yU$$0eb~6nOazh>%E~^uO-fKv(m(Gy;DU4Pj0MQ^{71wGY_pR;!aKq_% zgLuu$dg)G;qIIING=KsRu#*YDNS|wLAXo!;7U)IRI?j3V>p83r+FXh#@Rz zGUeq|1qG?)FEaPpWE=^zf?>z&p&s)cXP6HcOgR0fp7j23Te_^Ayoo51kCa65tut$X zq~Sd|6+Cs*)VG!?D&h=$l$Rw)$YVC#N$KPYH2`Z@qvh9Msd%}srr{j@CXWkc*GIMO zVKN!r)aM>4Gh1GTdjkiRE+wG}ccWUu`qcRREl{PuAAS#JVx!rScWUT4Tk$U zg4_2)EhINzD?}EEr-l{Os|v(?zL1(hpMQIsqG7N0!b>{zO=mJ+0Llq#VzK(0f5S>c zg$OE9QM3`o7p2IwJJJdouRd42t|SubXrn>^COt#2=7zUQ)zs>qbWYhY>xTTJ$?u*uWq8B$~`QB6D^JiKqFb{ECyekGM>J0eW_IFS4bVr?=?d z`VRG(zh=nPMxK_lN?ZiVJqJSh4S~iCNn?i0fIzl7c>i9Q#y2_MpEHX3cukvz>GR(w zJ{ziRdODX6^GDczP^*UZn>j(fG0#SSN4Vg*Br|c6g{04a&$ zjw+#PfXv|EK_T3QEafO{ zR|@e0SKC|{KpJPUMVKlOGNxH*%x`>it_@B~;RrDo9 zUwu1&RzV^#QHHZ$adI5fwczZO_3m!dtC}Ay9+EAxamUSlv2Y2KVM+2&lN(hSFh z2;Z`)i=Ya^()7FH)ptElUMfO2XEh{&yXyAxtRULT;H0_Xo>do+|1b{x)9C-XWW%>! z0KFyuE4^GV>i>^7|G5A8JIw!jZ*B7+3eO)dovWbVeJlz8JK76wyS_Th0FXQ6|2ygb zvhaJT|M$`VWw3ue^$8*(q@UpbTRqWgnfsZA8hHCyXf>-;BC`irxGo5sx+ zn$w2ypuYCIPse!c5@N$KP9uJB_0WpZ0!n`7DqT#$P-vB{>&|NQg377P>a%rIo+1>} z612a7Ci=@#5cXr{Mo6SLy)BKNX?=g_n=VMXdwsW^xc_W##eL4hJMc%T$1JiE&!69K z!QNn?mdgF#X}tsAS}$tN-LhiS{{H)8y138&+<(5mj~!~=b&E>5PZvpZs>~V-XFSY5 zlk(X2GOzGz^OGn+Qig0a%P>|0H$IQCN-uW|&oLo7&!1PBQy4coCd5@=#4FPL=Xc1w zS%os484F{!5*!w^xXCT{A}(yl=UnHUOQhFD zIB>?(Bz1ZylBXo>#veAiKkR>V?SI9>V2hLmyv6>vx$)>}(f+r#{`e33-#@qg&tS^$ z!S45asPXhW$re{O_Z83dzo22yEb)t5^~^~BN+vzCsL!?M+52!uW1jhRK}+6uQd?Ai zlw{dnce^AU`YbgE-InF|@+{GGI3%oIJ}?vcl3w=~3Ej30y83&O>g!cD*2GIHJDEr9E$ zqi|sU0;u8k7d&TN>s{u*&$N6!PcpQOpympOpRL}STh>RTP|v{xkOcl92f%)*Kz69Yrob*5TqO=#eF6eYd)AXNigDUN07Wk{}XqgtI>|SR1OX@FT4V9l( zs&}XK&3lqj+>^bXqr=_mLLk2$0?k8}*e9?ickzg3VAtQSFJ`6JhHF&`;!91s61f*# z$sN%1ORU+PblTl%e?f^t+Ro*}&GH8-H|N49xd1Sk$8m0G8+eCNc<7&d8h&QTrdpe1 z>As%~T~&YT7J<{EL!U{}in3OoFBH!-=Rp*QL6E#AV1&3?T(!;x%7NZ7rxncLywuT6 zr6s)b0A%Y}*m00&JQnd;1VJp(^oTQwu zc;dz07)5}7d;bp7gEzjom&YvF`HQn;oIQag&Rn`bm`kMZ;bD$Ms`WBJ8wFrF-@I_v z{>ApkbHXTWg$le6vRyWt{|)!*UvH~Iy*AZygkb9*o z3!2R`#b2}C+Kou$@fX-H-C2Ia@;&}$&h1&pN)iCyZ=Hg2tKk|S4Gv@#BlAu4+oBmljK<4%;YS_P?13xRT_GRw|73!4U zA?jn~h3BNe4N;ZMAJ>s_W6tR-?s@9QFr8f1$Fp_P1GqTK@jF(zLk%)aoL&Ribph zN^L#cKvfLYQH5(uRe~~0(v=r)%nBypLbj!E4a?0r<`(WN0xf@iv<68)m-+1iI0 zVYlPzl0OUFz^(|Mt=!M`s-D|z)CDS3dMb&EGk|yJkeH*F-|g+3{^p@DDqLv67?_1t zw*B(t^muy*l|pv@w*B&8uk$-u>vk_mW3Nv-8VLwQH@?8yIne2Mw{VsP?z!qO5ipnJ z*`s=z1GS}av;r)m6sG@^zh-%PA>!d1mg8PawaHtU+v z|JmJC5`?nG_7fZ)XFYWc_HI9OQh=FGss4+K8h7Hscxue zb~~y0Y-kl{=qy#7rizJIw9>P_g-ARAczN(ylhV_;jS|`asZLb|IKcOtkjhzTkr_3KOhF#5d>xivsJh1_rtatJOXph^ z*^a0GDrafW)+uw*rIgLQGubVhtc`+@$a0@n%VsAxN$QW?XqvhN;xHYB^(B;996|zi zmYlyhx$esrP^%Q1t~trJ&upS;Bw!;f{fo1-wUzIbO`}2Lkjjxzqor!UeGw?g_gjKU zDd3v-$p&E40(mx$?rauCFK=r(<+ko4hqNS`qIg=erGK?BzC)NCqhRSEacFAJbwI;R z>Fk9!8I4G!Jb5&9hO8?%iSO%P9OoiUC&^a3eNLZFd${G+W-g`vw>OGg=_T{|!PZ zGXJ&nt-*k?5S)@&Fu!iL-O@JZQ-^wbs;s(p`3I_WwntdyjQw#$I$+Nu>hH%e!b^es z@89ZIG%bJRTzC`O#H7{phdMN!Frse{2h~fDIE03uxQwd#hfbd>v~uy>p6`dMj5ne6 z6vvuJm-%XkKPK#j_DEhzq-c^lY25?|h8y zOWMmFbvin7IyyA#v~v?pRc)E+Cgaoy^b$&ko1U}p1<}}O(x6HsMTj|?$vXd(EK)uKN`+& z5mxxa3H|m^u-pf)0Q2Evpxo(lV7c0=f4|c?3C_=NdS3sMsX>@Ol}&x_@UnW8&p}*M zH?`n-X)vf7ZY7#z;kIE}w!96u%^Iqb5`2N_e8!1LzVM0IFPw;z-|dN*-=Z=uAa`hx z8MMzeD?8p`5I_PUK#@K&f$HWD{6QsqKJoo8q}t3_jMi|T ztheZYzJ35oGJi8aReK()?x-58PjO{z@gGKS+VhjCXM+j+c>}lyWu(zD3zsC`jFsFY>PIyU7=%ja+*H&?A~Cvibtoh(8Z3Ve$iY zx`0l4_QCPu^U{)Sw6OS-dQ!dxfIi%jAD)xY`;AlS)-72V^P!bi4^3x%u7V@6r23AX z^P=Flub$Hy!c)J(v$M4ix=3r~JWaQ{vC5r(8off8XT2QHTJ1j99sRXB*mVJz@a;K{ z1CELLn0V8Pin(5DES|DTPf9St4YI2`GoVnMnQ`{@Z}jBE`eSvqGP;*uAu0%=@}^SY-wzOhF9FAWPN^_>OB40Z^Mwm< zyR`yiOqfB^A*oDb&)B;WBOKdF1|-VCoCf21RWFF}PlMr&m~^f=CrUyX1%)w!LDLJl z`K(^zeV5RSNlT{9NgrSpFLhscS;+QiwBTA65s+?^cdF&x zDxv1L5o1QaKk1l5ON#5wmoNwLF#Gl>^DD>awb#B+j3Qp(USKuhts=MnN54N!eeR3& z=~FMcM6yLEi@_y&29tQrutoOndZ0-OKi|?XWS;75np!qSzddW{&Z5G=S!~w zCkh|)eJu0Dpj7?N&h^DO-5f?&ko3Ut{(tt~yt{4l${+vVuLAL$UrQzwy(D!~({`#j z_C)oPjOC~^-#Ifm5DAK?NPq*7lGRl2{dYh2-eZGX>Hm8F z{(~>7`5%9}|FQqehmij<)H|uhX%sgQJIRlcH6@A!g=o9X#Fd$d1zOG8I*qj}4IDL`FaN9~1%`|!HEt>QE*UnCbzAmG-p$j_3V z-&sEJ)zntNk2ee`!5lPZ(F?yI6nzA${VXGSlJM~8$&)C-?}x73xC8a5gvqWtZM}QF zzu=>48~aV?A@-TZqk937c!C3SUw@P;J~;k=^wmZQU?czk;=z~q?$-GKmtTDOk^lb^ zKX*R86@420tw>iy93#@tzs=Vt(aR*3*a%X#Q*pLM(;{CWjO{onN^r=(KK&v3>*1R{ z0tpQ9>>Ux>RrK#gzFu-Tl2&z@z!HTxG)3u24!_|50dvVaBA#i6=(!b!&^VznGW1E+ zA~0O!SviDvQC^mJ?;vac&b{GXV#>srZy`{SgRIKvm?z9Lp77rA%Rfh?7nU5uc57!z zr+eb+6{|}pM%OEcZ{oB}>M53+*LtCOq-@oELuZ~Z-doY=nw+;^6!Aql+DR;|efl(? zBQdnOmN33qew6c+H~!g1G9!S8_(AysvB%(`m>NYaat0sr(EV76$oOJ#N(NM zOV8o`pZ~%!t#0ID^j&_Qu+0rIoe@I8X`2WW&zA}!943yp#f7qmVC#W9ApgNh9z9AH zPqKXV=nnl0VJc4Nk=oY=7z7j%Hhs3z2M==qy4(sMslLS|j0Q^S6<)L)1gR_1?r+|=92E#|oCvTb#uP3*QE$f0vw!G}q|1)|9u9yizT9`v>aD>ldw*dOu2n-l;bb?B7kg%g; zlIrQ+`CMtrFrZvkL02d53L_^d>v3TzPDgQIJk1Na*_dT_Xf#S6uw7ZmM1=2QKZ>4X zAtxsV%2WAUWLzg|C@5`Cdw)K^^iP|$5yERn<$Q`mcPd9Kr%$Q@NffM)7jjPkoT&sK z!|}yROA6`}9j1$P9v5_c7{TxWCSs9C_Df^8OiXD3oy_bPru{^z2LARaC!G&Zy3C;z z#q9qpQ%FX5P=po}@-4`!tGJW61u%Xl7d46@c3q)`cy|jkA_C?pSn76Lutg(1A(@JI zki!!#IRO_YXxnB4&=z9$VA5dU(7gcr7b(-Jcx5)>fxo+UoYK0q6u5?G&=~2K5?^*=$$dz5`-*GfIA0+pX8X;gC^xi*owGN zWv@(xqVMs^ISE<~h)o}w?O5zD;;c+DDnmtS(FC*y6{RN0|E+NxKu(fWQ@R5VY%HRr zq;nN`Sgwm@UM48TB;*pq;0-0Td<;cC_sHbinUZ|$b#jr#3q2HK!*qUhn>Z0=Cwy!< z2x7+AGbWKLEtLQcli>hZt<;=d)Dsfu>Bd$9+qj96mp0`jsce-S*k{&V&T|b$6)9e& z2)f|@Kqw3IDI*`y1O*A%7$TWYxjz|kYPx0IG!CZ#qou9DzIIHP&q*?LtxJ5_3wXIg za2(woe)%VkpQbgAk->*cEkRTHAnEt?AM|`5QV5Pj?`J{e2xD-RAn-IUIK7TDGIXIJ zS30|(Pdvf-iv9x5FyVV+YJJA+Xdv&KJt6H!6cySOcrZI%I0ll_;{ZjIB%e+Vp>-6c z^pV(XLPiIXC4wy=d$dq9wdI zR5Okzka0XYUup9YW@RNCXA3@!MG~|8$FNSyd%lo!(>3YojCE7jI=e z&yp=fGF+OknYj4U?aE4V1OI4B5q$J0=XP_P)AgytLq}qbxc-vh49uAC)Vr1$xS7Hx z%ZMzc^O@4xU+1etXon<}fyxL$;ngSa==OlkN-n&+1++e;UwZvZhPp`N$sxPu0;p)T z3G`>lhqD2vkrFY7BpzAZH@X7pl9vFDzbDpQA4d&FDT5=-n}s9xWE(orzh%k!i$u(x zmq5Du=cq1uNu&-nY0~7pag}P(_7mmla4bEStvpG!y70ZxN5!C!cYdV-Q!GM8zf{2oUp0Q$D5KCj_4xF|Z zE3aBG`60d`91HA@SSK;kRX^gub?-D#({Z1OD513M$_U)Hp$#uHjqUMOycHzdK*%J} zf>1qRgquu+|8rj&VG0Un4ZC|JiO&POk|(^clBAD|e9d$t=1fU527f!OI!#WIBujvR z7wk~Iet+n76CPdqT-)khyj>D405Rq-Bcs`}R-$cMX%XU}!E2ETjXa{7haMMg(TLRi zw~=)(Eds+c zIfd}pa9^cWe^I$}K2HMm&?T}u>6qZ-^sglP{gCJLe-rMDUkP%02xch*G0hNmVWt|e zAW#W@Zv*B)`}y|tG|VJC;-v@|Wzt|DFcP;O0hD7= zN_gf3ODyO(2}N4S!m5NFUxY&Kh?$B(6pX@@M*vw|nq@}g&vI0FTP#pQO@T=X4%-vT z8Ol$Iuzx~GUR;QlVuVYYEMXypLDBAiAchv+#WY_RhE^cmpXDI2F^T0z`2`VG`kDoP z`uCZrZ*o*U`i}RYO~#$`mA<{hVjgR5vU1$?3`x*MxzZK#+~!V5oy@(v1-bEX$WZJ) zD=G4kj0--XMkn)y^Nd{zLK7%_lSo1=%f3dH1RDxhDLlA;A zaxBo57f@Dga-Eq4%EtHV!4NQ9`E86%;Jn>?ekg64FCb2q8xE*v}i)Kx)JYR ztl|vX^xv~sg!p)@o6@yHc7^-{grnd0MBCUSQtqhDdj5p}ou^OCP!FRYMBuR2lvrhm zOu$)hb0~&WQ5{yo0|j|Y`zCLag_oug*jy#~{VL;FiIQg=KDtBeGE2o0OVYuy!Z#*Z z)4;cbV`IQE8E+y6bI^g{yR6IwGK6ayMdfKKa)OG}EI;tPLOWtJGE9fimg>utD!vb+ z{qcA$S>@r$G3{_rW?Nw}eJ~3fqwJx}V#`n%2u|Cu9b+6fS5=$sjWjYq(!ykSZNPUr2U|H8++_WcKu4?K;Y+2Psbg8E<9@c0vdN zV+D6Jm8AkA+2kcg9ti&|#GTJ_qB6i}(6O>gs6s{+aMFjJ4g3)RT|lD0mJpUEwU!N?*BR(-DOQfuctLdKB$1?2(Mg3G zV+5SX<5P2#aUbNBb{-eCFv7hr+B_g%0_z6KB+FB#MY3#oo?K<1Fw?$^woRqU2!eP{ahEV8`TQ zBjsjg?a?Hs(McT$O!Jp)`ULq7&rH=T7EzOoErFH22=xUt(iWITrE^m3N^{j*4GnAV zp`ue7PPr^-d*FqnQKG<_b*VweN?pbzBMQ10F-#-@LjMlg48a5SP6ucG zOYc~|sc>6t#dtWQ_!#*CASUdxl0y^IqfK1M*i2*e9A<-9maB;r+lBgK$}sdoG4UhC zVKV1>5b!O!fEkb02}ktQWmSO!?NjPxG0G{$qQ!^nE?L7lcLlX3AjI^7qKC-hZkw~1 zSI=7Am}j4Ohxmh0$Or=o1eeS~YJvf!9eJ!k8e6fRE5PbvHSBwRuVM1zDB(CUWU0$ zBg(K|(wDwnvxXz8u^3Q7GaJ|cAT536>E==xNNsw;8=cb6H5eHtf?yl5gOn;3TbBUf z@2}s!_-e=|yhgiaszvP7hhZ#}aWo?l^zrSV|1!zPZ}NO~d1pAhvr5J@?5wUO%bc{}s(rc^1wmYw zJT{2@c&x#e6o|%(+1wYZ&%Lkv|`|AGZfBy2N z23d2^7k*&BVEYoo5nDLbR6L|_4vGBgpN4r5WU|ygG4D@O*o|0-Cm6$1OhA#`ZpKA5 z24%wfdOU|uzziW_5zHh+F!kqU8a{?!wbZU>8qu?~_1%aN=7p!|SZkZ8p&AGTKj=b4 zDW4vhA*@YI)1d7E8R&Nj9fU3D6u=znxJ+0hvls;IF|RrVMc!zA+(TjZYh;-}jJ{Jj z1{|fQJ1G-(DEDFcWAdU72r~#jvtCpzwlmZsVzVvOCTAQs)@r*xgI{#nw88m&4d#zs zK!h6j_n`Gq6KFu|lqq3uL4a-Btg4CB8w&+2k|q1p*aJCF+4KMp^?b^X4@_)^Ku7_I z&nXQ|hssnoLagar*-?^l@SQlKS<|+FXU0&ESr+|0Pnr2c-!Ov>qa!u(SR+ljx?m@; zK&%+;n0l5Rhe)|Aj;`fgp02L+Kyih zH1v;{+A(RCwziY#iy4i#82Wh_`o$6jFnn(a5>U%l_9i z_`_&v9}$YfJ>9~AAzGX!oI`xLUWf_5w-_>5dcf4{4`d3hxZ>7Jr{JAQkVtL^bjjp| zu?1uWcwZjLss3!>+TeCg87&IOFwz$ZHuGXq z)?k_d`0pMDM&3C!tW=uBPDq%X4H_ov``a}gQ&C)hB){{E^f&*jpP6^Lae}Vd4RYyz zRW^r}*qp4&gdQB+9r<6lrP_^aZ5Nyk&cuG$KO-F-rDh?71xv})8NERBd zWY|r(D4fe@v<*J-%2d2jcStL4CnRg5YckDRM*PLfURl3!g4GZJMH2*dKSYW$qZ-?< zKY*GwXq2Y=cfUNkws3*vx9>SgZD3e5b%AI2Ddt%T^U2%$Ptw1#9-XJfHM z*dO?#_{K(mOXtLALq|F7jO`C>vzu1O@Lh*ua?{m$gAR; zHh1@GPxY1|av*YpOyHv*KKYBc##2Qc6bJ4>J zlW^zs1%Z4yFb%@Pjry-jeP5Xc+oL5|Njx>)>?;^XV6ZwQQ6QUOBiKQy!MLQ3CQA($ zl+sReH}P?i+kQHsV4qw$Gsd|KSHbgejLr9|_RbhV>O!%hM{B!E=8r_az&~nlWg*vAdqElZP`B}cWS*HC$amD|%Cuvk{SG`H{Au)b|B%tZ3yrcd4`TY!*x$G)I2wp)y>?-- zS3H?`!71#ID-z>1J7@JB*F)D-reh1=y-M@Ue&CJeyTUOr3P)3BOk2tfA)&@YbrPSt-%po+HdI&WH%cIm=UWm!N@@ zNg@6Sj}OA6lxmQ>pU!RWkI{3W6b{SeCB|;6CR|hkI?9JuTe*8T+M|sC>fLAe=rdHt zbtECW=RUK+b1cioCd&zRCmE(RwbH#RQ%t08BECP53kJW;3WWi_&wh%cu0HS$D=raDxUplE%((svX}MFJaKa ztsTG-1PL+7MCvm6Qge5hEX7OQ9B*9Z0xKaRcwWj~Kw)M({oPI}mlg=)pKSYN_=B*_nU|Kja5Se&#Mg$5Oj}X5}EM-!` z7@r1_W1+I^9Y=0bDCADf%?P}bWWEw7*|DDuW_$`jQ52P4aROyE8U~nIh@^w=+__B% ztvcIE$$N^$I<2Y8mh!O8l7M$C!EVeFEQE4(6ffmfo$ofrSNV%}xT0YXB*1(Si0d{z z%1V+dMH&f)M*1O7iN0q6-?5Uambgi>;dy$Rl3JL?T;B$N-O)FH^55)h`o0z1;K@!_ zVoqa&LUecdC)W2Rqjg}S(5i>Tfa)!Ci5ZxRhB>0yKkJ?Uv3I znF|n3ql1%7lqd7%Aj}Ka2pR6Fm`?-Ug%zVy$$g{edwaB>K0AKTd-UrdI_*byjCvN& zd#8QT6GI)!Wzbd4O?MyS-@C&HcOU%e^SdZkB%j~Y&p*HW`F;B4bMyIq{rv8ifBNd) z1NZso=JR{^AAC-Ona{s4pWnUrr!W8fr~BsfKiSXa3-kE{_xas>pWn0NeCd6D_wJv+ zFrR-FeD3B&OwGfHBXiksbdOcW1kqE(vMkJ*$6p#gDYh$ybYnSV8Q?rOwjosmah*my zxm7Vp0&z?#_dU9v9{idAX1?vKJmz6tQd6P#C1}U#M}eSLjUrnjaxHakQN$pF0H7h} z8Ou^&)?6upgTOeddrco8c3;+!x%w#1e5TsJ4WMLt^g4PH_3k}-^!eRB3n^Upfn!Ww z{do9RQtT&*)t#N43I{n^FOEUOW_ihaB8LEY9&}Ef1nD!$p`ou`SR?B&5~n%#4+$15 zPA7JFo3K^fSxHX7BgJEIo^!|=r^YzvI15Q?AuX4>-P|JVoJ--01Z&twF7+&Pfb4{6x#$nEV@4{J`@o zR9F%;sbu2GzLx%pR2Xyo7z`y@;;Ca^a;AOvDM#pWCUT@1fNzT=`6lJmM66o<^{}ER zZ2jfJ1c5}*i(MeDL}D$3qE7aXIm{TZmatSKnwF(=iD3nVTU{cLzVFTRljwEd*opKh zba;}@>(W@n&|(MY5D}doz?s*vo>h^YaPArCu$ajW@1PTUZ5$qQnszUQ7Z1MZ+pwQv zow27>t(j^kpxp?t@s3Jesk_%?$@wI(kKnWzlSu^5Z*rou1`P&s^5h z!=G%6>x&-bWgMu%|2CYyw>{&4giVRG$gxnRy%|;eX`E`1R^(xtOD^`NA#r=7)sp$S zsU-sbyo@2)DDJ>~nG{Iq;Bp>Doi%kgdRe}ZMi~PYBmg}iENt@ugnrKzF^~auG7mVFN%f-H-Nr{xSLg)cOolF=i>Nk&;rgC)l(&`J3NJ=iSc~mW>V(7|O(5K` z#mn9pIf(-Ru=``pVVt6@JS(FdADks#Y#aSGFbPOz0cz5~4Qu@ZXAwP@q_jYj3`ioE zcPTY8)N|SL9L5eHN?ejk=(7!`x#0RlF?XUNy34W5s9$2_I-bZBHqNJ0t~~WOcciA_ zEAdQ|By=IVn5}Gt5PsCF=ltZj6iSTR22QLL98gd#5~)1o48p`9_+->Bd7fu~TxoJB z1B|^KBg#ru6_#@8wD-#N9c@Mk_ChQSW5Q~VMHb~(E2SwzmBcmiD#+5<)~VJU@s-m; zPvYWODnoK)g;+ox#muEpoi&qYLP{XtBpivW&TB~&i6=He+w-+s|Fp?@N++dyD!j;b z&kt*W=f|bf9t=bZcre`**Iw$1>FSYL?_0Aakq8~Y!ZW4ZW^>@}z6r|I(L!MMP6bi` z5z-;uniJKujCN>A9hm$%hjI0F#kV=?`uPB@TibYdVxOA)r9z^hddH8V+b zqVFr0KrR(aUe0s^Tht_|Cv?0PiEA3YeY5}i@cFYhKYjD#bNq97@c*8PzUhOO3*O-L zUJvKc$ez}}7Pqw7LF^W84Ps&n5FropRF+g+0vc1nPcU;VVr1`nd~lYyqjXG|$(80h zaS0fa^3o=pcK@2wArC;7^q#z-@@uxjIShV@b)!rQcuM* z11OKNCsINd~YR~;p0VF+vQ0-v0hpuYtr4!kJ2&J>7DMEu$w&050jpyA; z5{;8Yv{m0Z&~l;hmgk&@i4H>CK%TFb1?;>6l4_hT zlOT9q>yhN?q_l=KPm`6G9MMcw=yPU2uB9220<-mFY?2ZSeRMP?>%>oaP>2+{EncnQ zq%*OTXq==mFcM8DG}Bq2;c6+O8Yr7w zQz___2FW{GRlpTpGS?{QSC7Mj_0tr7G?^+^CZWH^Gfwy;VTXMeQ-(_i*SWFl0veRy zc_C(|uVzx-{Odl*RM z(=>tVGl3ZorF&RmOiM2SQ?fbBAh6C_z?r-(VndDCTwNO1rL0A(;@HZY)-uf%VnHMx zJ&qoHA$ka>fC@VM^?fyBLeiC+VB8dNg-s%5tW@MNkZ)p(N?BtNO;W?bS6)fZ{T~j* z+v(Gd&9w^kj2i0|a)1tp^p+;aDayItAVd#LJimD8sh&iu&zPU*Yg+3>>yokR*i;j; z6s=3pqZSdWbq=B0YFal-yQa)!$q0W_20lsX+<>c@^C0r}ZyzQnSm13vSn<)ay$dEWQ&vQnk?490XPhu1 zg}GJ;CN|VxLv^FQ$`6v8)ZSM4!o3s*#lT+#2cQv(!gDf#9U4_C`LfQABh@3>(#`?~ z>=+uG#TlazbuUc4O%9>u+B1{nou|;MiIJm1d@DzQul!=^;hBVExYRIL(5o6x_4$4J zEeNO*B_z=*Kn_(oqEI8NhGAMoQ+6kWhFAOldGPATS3f=7|6%{>!Q1~rU+L)4qv-Ry zqsH^rzB(;nNyq(4bCNxik9A3@4rk5Zq^zhpoMUXNYw5U!Z=XHi|MBJ9U<(gM-Jpd_ zlKZ#T*E`3xS=r?^2e`6PF5efBs0VI`t8F^ypZ4Fp+5az5q91b;FcQ9pw#o=;Z(nUb zbiYE;9CSvbXFvtSUh|`1?y(DLG||pm>c6%S(_OFN``1r@eDmhn>!<(q)5~W^&t7i2 z3$LJZbsMIgrdy35a1evN(R=u&u!9xotIPe~ND1Y@YcLlXZlhk7(k}dmX+ay)2n3 z&w*JhLPXg3?8WPGlVejFQLTRr>RhZaBWl2QS#v*;^%n&Z#Nw&4WHRQV*5z8WTTlX9 zYTt9PI?p*Ln%MacpFR8O?RRgU9e(%y%Wp#(VU4V6%n-(E%*kt2?5Z)w67?o#5bxAE zBsdEc(Khl7^D{p|==1I?4R+w1(n`Qz#XeIukN5KXr!QncjQ52<9x1hVR#Ij|R1CJc zrmNp)|FAU0F7l;90%GVz*6`)>d6yPv)}czejBeLj^R9?e)aQxm8T z>L->kuKeCAvOO1}q?^1Z+*OT0Ls&SfsSB(}R1*_isKY;m25B^3AaM;*6H*G6+LYR3 zmo!tMFs{9V4XFoI{rCSw+VrVu`9`VtTM9H3U2jAKH=*2zwJ(@a8>Vcs{fO+Ltip6} zh{Wog!4{UDC4pLOU9M8w*FS92z5wP*+nz$rvgS3b;d5m?P|&i0%Q8n%X2@4){B~?r zxa;erO3sEh-PPZoKLdMy0#i-MjCdXmN6(EP*E&PD-GaS#(`54LYHqIJj+EMMc~fe$ zAJG%sy)u$=zN40>B@^2{EumsLb-Y^_AVT-=d4^h!}nU!_rqvi@fxkX#+adH?*x<&*?? zE#T|B3MGru;0YWbWfFutv4z)~t1cvOxG<`kR$l}KVfAiLpB!+_SWo-YKy^gPcpe`2HT1SA>eN;6VQR}uX>JbFL59n80)`heXpQ_E>Rb!RonKn$>Djtlyz=g-vFbYbyy`!gd|LCUShB`UDI;C z%YoHa(?nn-qj0-e@xo>eGo|z^7TOqVcJWAYC2+m9WH@+fV8xz#3M1Q@SUjKfr~G9C zi(cCdJ`z8qCyogOhKNWMNn}ajvWl&O?;5XY(z7_|oTL7nylRTe`@Gop@bK%?vQrua zj9aJ$InZ7aQSPv1JgaJhH#J5eg0VQD84TVkv|ou7lC_z7`PBK-lzI=e&w|F5_-+kj z|HlGd{VsmjwrODQZ?g^0L@PP=JPNj|U0re)izI`igT;WO<7!6sD}is+^as?*rGbDT|BO=)_#lAeH^aWeuo2l94^;>$Bgi? zF4%l?dCRYmqH%{zMv|55HYZ^0Rb8kNFcb#heUBGQp$uoJBNlFM6UjQrh+fe$2R!5V z91S**(avm-^M)0_4T5gVC2ST7Xf|(30)E-WIu@`J7C*z2QkQ}lK8;EU*CbZ>O4tpLs8QUYs4CP}A8JA_>qMc!i570lqO^~w69 zLNlu+@jvYs48j60o_4#5EVH&{pI`bTYpItCuqu z__JLis2KSDQB?GMD8Vt4WMw-t#!dl;hfac=l9d+Gbt90dt?0DPA&V$GT zD~+t8o!+AjQwZj<0h-EFn5=7_LD;82NWb25aA2HCuNhs_^=e%twl~hOvG|K8q4V(gd0iMoj6e=nsF0(&)+K=&tMu^rJs0i1o4YyVXPS z4@c&Hvf(Kv=+XZ^rvE*9graHs2W;A(kNmI1GWCwA<1C%7S_i|lg}sEmJ>5Q*(E1L3 z}!H0&?unohAZ$_4=c&&t6JQcGQDAt3Yk;Wa3qWO8On=(~DIU zlD~TBb*7_sTFb4ge+xL+I)Npyir8u&zd$58#~MXvrC~sxg4ul~>_HfH1mEzJ%SNH; zP9!Bsyr4gJ1PZX*=Ngs4N>vjTO7f9AFGJKjQ}Y#5hWuDOeSx-{-;m@ z9)0~JI;AH$;hmL&`h#vc^q>l);vr$vwS3ijC%sb$g5OGz#Dw4I-Nul&`;|pmTyO}` z2>;S-8F8b}U|8uT)p2fxzirTwZ7$e$HCgml@qIDxHSe}NMnuUn9wJ+Gv7&X^?;+u% z$&(Z*^>fQ2v@$E}Z_Jaar=Qr5i}YmH^f{c>rV6SQonnh~#*NZgehTTPl8&r2&z29<8qFGNyGrgGxqWv|fX)*>ur5;_|#d{^Swsa2ac*!-p%u3a=Qcs=qs&_&hm4*^xg^@tR!6qBCZH?#+Xc{5-4UOE_ zkKR7<{T((X?yZg6lg&y^W7CBJ0iKIo8;K0LVUWqM$R=|sSS6`9e9PRXS-Sa2HN#Zg zT`VDJXP%W+Q@ElH(J>~P#8~Oq*D(}Z8N|~lkL^ylwNc?!F_7g|tA_H{Bw7SXR9b&3 zvc@NpbEdUJH4O>J?o3U9O2Pi-y94oWfKOc{-mIiS}biT=PqYL)ZAjG^JUg zDT!~a^V&Ef*2SujrVa+_Bm@moAV70rIi$|^f~%=Q((S=+@LW2@WP2Xe;EcJ1Y3d@s zG&#L*`fwRcmb6|0e=!P}Hk?o;UBqj$_xH)^o`)jUS`Q})F~)M3m*>ezK1?R-JCpex zEgKm0OnCFnQ^J5D3P9SZdx=%h@`q3ppF)Su2GPqTg)1OeTg0363~^Pr4>b0YnV*Y~ z+@GK11*zSO@^;jF`tnV`mD+?ktH{Y_NK9<($b=-4bjjWUX%%9~jU=p!TiGiDC)N!Y z-4D&&5HmK^h5^j6q}9y04nfa!TFTV;s*NPMRE(GE(YGO-0U^^`z&dbgiZ&fc5v76I zw4-;zUQM5z|5zvMWOC?~jKWWXh>g8ODY83=c(TX!@iYnTdEQiQiqTzqliG5J13xZF zlU&d21Y&$RPT+@WN~TvcJl`j4i>O?b&b8^5vthYpP&H*~2~kbQqD3mL zmYjAkk2;3uj^NA@iFd0#lU?2SQit?JrB0ADnJLSVLRyX=y_*qCui%1YuoQsgS2ee* z7vxwdft|)>7-77K-*M`QmpWt1q(CxVpUjr)l_5y`|8eN*slOKc?)KX=g38hX0iZ|v#f6g3l|;H30CH^P1{WltfOY#z^e|P0IaWZXOF3 zMlrs!c95dHP|{>r9Q#fbnSmsidyRG@(lYJpzCX{BLd_h_wvPsl*R*Oa)=8Vj=sm`@ z#H%XBrX9aY5SG1Z$89^{RvV-0qk0^bFB&(|vN){7UBw|YjSb7QO&-RhQPTzB!g^z| zD=0KDI5gWFb)kFrMvVhC-28YDjp_OR#_{fLR`xqw(AIO1BM3esuJ`k$u^)fZwD#aw zu#wLI#*KG3hS||Smx`b6Ih-9N<^?FLv`A9ea!m7*MEjo8r<>4gX{`25*Xbw`H0U8~ z27_q197M&u`ObR9+&xOa6+@^OeLG3>z0Ey6y=C0xl1FpT4UKu=@y4M+IO)ausMapM zT=E(*&a!zB`$XF~ZEx9AXrMG^$c7Cs-8PF+2ODH}fOvxi-3Ua;HDeC~5c8tt;^u{Y zl75-XnQQ@wdC?Id=2r!X`DTF7i`xVd=5FV^frL4S`df25yn;oAwcUo@Cn@R!_H2b8d7*RStd2(>*#!5Nb>)Ouq+cr>%&$b%T3O-s~~6Uyl3H*U{bR zVKjE8!=W`?(ze{k8$5M52Od_Yh9*ECY3RvnjiN9{*^DXyyn~&)8xnSDX^$R>TiPN=N;opH7P^*1$ zSQL}hu7|`u&USRbZu78is%2Sk==-4I*YMB;&VvU*E)OnQU>va#|OARZObfZI0@{tpy*vfHJ})ns5-M$wSnu zk^EnE9|>?~d!84=Rd=lEi@g3};i3y)=dw3(1NVn%dBEB4A4P{Y|)#u@co&(AZbR-!|V@k9LdG=`em z64&q%pC-emIAkZGJko%yR@+94WovtEQ8NRC(Ay#|T*~pzHx3%uL+o2HrgbM6zXC#GDMhU<9pNFLQ2La_*R@#>9 zx*F21yqQ>w7S+ugtU+}<>qKdur!bo%ID9fG)iXV8>X&F#IeIRc+<-#XbP~-9S=%XW zQOAO3uc4Z`6|*smP;pK&DdS25G)gylT`0 zcUJF>7M&Hl)eNjA;CJCme36VE@oE)Is2z&;O7Z^@ajSS~ zf`edbZ#RvI7VgFp{HAMBscx&*>!w&x$)Y9XJvn*E5y- zsG?tbzGAJ!k9c#fSc>>XuA8h`j@6uOSUp`2+h~DGgr=a~>SD<~yj*Cx$&ca4@*q3h zb&Am_=JGsVN+7*d0+xRCnKWWg^TO*@tO3y4#t*7}xgJZVysaF&OtVZ3yV8Wn_8jtu zu=y6QK?B!Z<;I;{BwK@#hv?pATGE~e%dqRV*+)oD-kMk}wJ@wS-|iu|-)Nx)`)Gg3 zCRVAaCW%S)4ofX&7lE%O%h(Mn1ApBnojYyh-KwrR)b%79thq>pnU23~RR-{_(FK;A zR@IDo(&=VVqnvKj&b8R~gr`& zm2_18vD6@C%~5Mn(ro-s*~|*cP2oc=M)xf`Rk`GiZ(_`1m+=<2>~~>~_Ap8nKQ{8N za=9T`ZmWLljk4i{+BqR_(L3FugAHj}Y`m|_TdkUVvtM10*{q@5wuZ7p09|Phb-rb^ z<$U9AbTl{NvRe#ZxhV#ZF=Z2QxLCUKYC)N0Q~0-~rhLkqgpkH5!T~(m$(Aw*x>Xx# z7xKYElt1!@$S#gw-1LNZ0qrpyB4Kp_+;GRsZ70?kj9^FbVQ92%ZyV!%+t}ijfo$uD zTVsGX4d4izqciR>>i2Y6gO5*^s@F(K`Fz@cLvnMj&&8TygQ>@y<=>2}@ znQjJ&x?NTS)#-Zv?o8BaVgwmJS6yROGu?_L4y*cCxY}a3tG(=K(c9giw>yaKLTS6L z{avfs?R{C~S!cdjERt1`j=QtP`EQRS8jr}0vBY+-fx|b9AS@=Z?`$-Z z)=U%Nx|4*1k{TTxb!$blWv6EN5HW0<<)V48j`oSI1@@krrkc_kQ=0E;C6Dbj_YRi@ z7ZO5ePn4TUrH9iTO=||OG4C`l#+==-jPBcq?%Jj|-}ub|rKmD0ym0HAy?nZdW`XD$ z!7WF*Aap*}x>C1%pV}GfR7s2VOs0{BN$lU#ZnGFCI!E-S^pSA=*6182$uR2ebNQ6h z4AFzhyBIZyv;>UK{G29F27Gvh|7Bgl1RJ7qId?xePfZH8D_W(v!4m!@67xVb?#lG?fDfl^QrG8(2zh z6+TvT4jtQm$s#58-KQ)wln?IBxSH_2ulmvd+CT1lgx9p`n0epd?f3n3j8RL~#5Y3h zaLZg&2^GH7QO*8g?(p^$;OE+wat&@<6)}1qr}I)`gLy2io$j)`rD{}=3T8UlxKc&j z3kgSAx^B(Qhvzw^b;iHZg0%`zz2-GqlKSN<{o`d`&MVa9GP-LQF5W2e`h91fJgzqh zCD~AMb6Bnyy?*p4l13leMycQAFGu+zKVTLcsW8?shsm#$j1BhN@|o(1ZbLt1q@K4k zh&W9L|AY+(SZp!msT>kj&TO(j>dsNPP%ZueZY9qU zNdql%saiu?e%J%U1t^3F0<=9k)$k)1tJh4cXqRAZo&kf$=vtWo_68ag?s^=1BKYf> zXWC=8gPW=4@6ge1F56TM$qCn7@#kFLY7GXfbEgKB<^rVox-gZX3XT!GV|b6!iH9}* z#+g;p3yH7xY=9dvB@v}MGH2B@zd!Q|v)X1mQFJiX>|gE5BVAvG+DU-aCYDtpGP<;0 zJ(`sk}9ULJ85oKVJZBTCJLXgV_8t)??ekfx`j#wHTZI?@O%y=jGS0dJZJ z(S{g=2H&7Vhbhix+JPX+)2IA&D=}*Klp1DjY0tC;>rG6PmJ!{iXPd`O*Qt#UuZG$I zr8T#AbJB5RyM^gCvw^>p?Zzb+A%Vw-^|Y?la6^`Js8sJ@*D%SD9Dp~hHGyiIgK*xn z@5x^@2LEnT8PED%Eh`rPmS;QIm6oP;RVR;n^~XU@cgvpuQzg1{+0g=c`Af$(cgTDv zpweQEyJfxO{4IQM3xU&<-fZwQdO$px^!Dz(?2q0@bBm2pETME#rBj#fgfx&VK2f=1 zs$sES#3ym0=2k$mqxQ3bq_u{51SLgmGi}a;PO2hoWo6rX_wa(A=fxXtddsbFs#AkD z+CITF@;HVf4{f2bN6vH@v{h1y+37H+L(@HHIs+Gt{%O|VwDcV~MrUr(&Ifkq0p00; zrR2uIgmAMoGTKJeLe*!x$7)0QiEcitCXuLgpyx{ z2??-dR`KlqrcD9Z*$pEyx{LQuvhK5XYKyeNctW6^{X%SZ3ybMCh$3*(1sy%>!Q-xX zvSoptT|8Sv1P;0Msj{WWAkP~yYic@@PG_TzozFl`!8iTxSeI94^qpjsPVz}N*`!n9 zoy&IJUg%FnySK`{vG$!wt##KmC4HxbPdt|rp$q5s+ZGDxYDE&mA}^#%%$z&>PBgI# zr5j=t{--nNF5`ax2JXyo9GB@BwfWa$?ywkptwp&A4X^Eo^{Q`e3DLbFECA|f%Cuc1 zE_$Gif$fv``AHbllf@Dq5-p#BewQ#Rx!f>%_;dR(siA150KY`V^hA$+F~rs4F|8;j zwLeq~9a!e9^$+Iph4-~NMmyS{hEk{>51Thfn1KHnL?v2#up4fI2FPlMt@b8Chf8h~ zBvy^{1P$G#bES4bry=g3w9uRnR9dl1R~2`zpGH5-(bHs!UdZwq_o{W>JWCPR677s^ zp=0QcL2n;S_m4Rl5J`cw0U2izFP9MXVE2KzDSb#W`qa2CXp?p%#vsiq?AzAt(tPC< z&c!0x!>wW~x+-1td0wn$9CYok3(&ba9NkX`T zX9t|*NEourk%)-)Er}_QSK5Bq-Y|vM>Sh1fbe)OsmNO;m>lTly#T)bZ9+#7|3zA}T zdcxjR(pOt9!y9{%z{?h+x*#E*zj?of$%-3x$k5UdiWlMyuigQ>2X}KJV1Nw7s}-(| z&klEpRw~>LJju}6L-D#?#$$g593K;zdHfHwk+J|O?KWfqa>@b))&4z)`68Lb>N-O( z06>mp0Z=clGZS;OW6VKP0sX?x`{P8Q$&6CwID0y~zO^i}>7Y1ir}~0{rS? znIx*$+gy9An< ze^yHMRm$_-i0RWA9lO~*t+{dZn=;eM`G2ydBpaU81L>p~Hpr~M5nJ8P7O`K?!qpA6 z8EH3|4zRKrMLs`!>SWb86ney_8YYcz^J`;1@v;0#MSKERDeX=yCMmi~d$Z zdH;ruNWP6KFj09}5Zw#c)z0cRgqyVJN>(TBs56=8e-pYBf&SU=Nq_pN3H|G6LN}%d zeN49i*{DmU6KNmDlQg>~v6+)fW%qc6T5lv) z-q$|YdwV9lm5qw=#j!CU-`cKRoNV@*cT_00Hfy-5qHyIH(#nNwU;OUU_jdL7efS}p zc}B=$wyW;l*WX2jZ^!8t`Y&NWyD0cOa;^8sleTozy0Y%RqyBzlI{bC@_#4#auM}I- zL3ivH%CLjNeqE*g#uWD(QQmJrfxoefcpo<5YbffSmGx^W?7J|44?^18O_A>?(O*M^ z{NU95s&l@Js{b^6r}u(L!A_B2{PTRBJ^DH-*XZ%~Vi0}(Bw9?bob7Sez-O;(LD-Z5 z^1)jVqyjPi=Mim|y?ml_8l)o0OP1RSJinqeekT&omqk>b2e@fMztv{@FK3l9vFF?e z?nBH|>Zk&|j|8QyjNq)RgWdta24c`bhBdd;EgZX}MNjUw!H^eklZJo0!33Z1Np_OU z&OVyper*%nN1NJ5o7%sSO>GyR`_ZWOTQ#bk{VptOHz3qpO}Ob|(u?Oi8TD?=uy;eo zy~~d#z~8V5@TNq}--6xGm>62HzSS(a#Wc8?yVp|G&f;C{gvLI&rO$a6^C6GJwnNL? zQDW_2`hz5}45Dw+s*O;8J;JXhjp*pT7!D`Nd=-a=!}n=V{NN*zf~)E866f~oS|T^g zf*qu~MqX_KuDWvUE>=nNV<7L|=smF)ouJh+_tC2P`?PBQ4osD{G*TCf<_TYwa1V+{O?qfp=({J7Q)v%>T?ySPj)+<t-Bp*@%0VD*HJVA zlCo2(oY~smy)K6C9qVI#z&7q(rTdQ=Y@M0FFOgzaDWvo<-)xI1twOq!vyMqtXYr2x ztCIIbv3H?UR^8aSjMCLhC|#v|(oUt5u2web!!L-`QE>PqkgM38bX{$%>FTa&1>I3l z_z)r?FF&|s$KP}E;;)}==u87mYxS*>QqP~C{k6@KQb*?ojFPV~kY|!SLTqzrfIRxG z8z6s|DUmHWw}oJD%)Z|d#Xg#Ser>al+-5ImeRdW-bRqyV)n(N*A=p=^EG8$FSBf;-b*M|JtVY2FNs;vmB*Bn4319=T5dMs(+Q>d0Nl8c@* zK(zJoVj1Pke@~k3^|#V?Ipp?8-OeI-Hv`ko_MxtJqK!4vwr5Oku^HWj?P#;L;)YB} z=I67|7y*Bg43I0@l5W7JbS2wTmCSVP1lQd()y+h8JyVq@j_uI=?Pe`l*RUl8_N49t z`VKh=S1D+=GXiy&?6(+`I@nse+g!TM8MZBXKb>GYDOQ_JG&_);Zb@cU>8wdEYf?Z+ zkZB*UbK+gs=+Z;jTBmoQ1{%n>l!VtMATW8xv4T!H)5Z-Av?u;xz#IYrFCR|*UUldY~Q%Ho#U#e zp6>RKX6r#$!rPJU?ZWgZtZe}p>2p1>+p54T`(0Py75EK zrj}>M?#ZoQYKjRZHKPuBnw5yv{?e^}2MKilb$IF23Aw=YEo&ac`tDg-v-JFXM5#y0E>d4wEGME*_tv&Dgie9Q~07QJIXR&xiLL+pU){ zLygte1Sy2)JftZJVtOo=RO40PF&IOYc4wSL|0GHrJ$dq^<t)d+;N#cPz33tSA_D$u|3432{rKvqr~5zbKRtN+U--8A89kgupP7|j)^5YzC39{^84u)jQA%{O(kSBr{g$MBBSnOnquQjXn5xj`B+SkD&I z%3+xkmt)v^WJP^Gof@vZoxu_`yhxMz1O)TWooJqyt0)a2xFA+GivGT)Z^~t*JCYT4 ze|&wo|NPky8J}^H>}Qk1^LTlXk?=W7%Yj+Q_tR;a01n54Xz$(?T&11%UlpeTrZ|r$ z0wVO=!|2;*&-Z_P`PM?hXp7}Z5YP!3|DFBM1{*xiJ|o2FDa?0PAhvN^Jx5&axQo$m zV`^E=NDatq!vxd9F-0r5JSrFHWXEmt@>LYi0ZFbsv}x^FMv%>H8%Z7j@2rYAE2kh$ z$7xm$BO-g+4KN>%*ULB?Uue_9*gk7Vp~({lx;PWFu=W$Am6>&DtDECw9HT9yS(a_4 z7jtX6lM|q_wQq02TeiJd+2;n-%?8`CcZ0Uk%j7Y&Rsw%(q^s$*5b22s-bL)Q;fdvX z(c@3W;Xw~KjBz7~+>FGYu~(1a=eC#-#&B`x}X{R+d$iM7%}IeU#iTWkD8YO2&#djoO?5qz14WbMzr8D zKQm+VFyP6RwjNFBR0sE_^!bVhL-2EB$SQkzswnulMdEkdWo)_2xY?C-V@z_p1xR-U zJmPI^Q$Kd%Z@cig4az_V&2lrp+fAhi1JuM3oHGlrJt@B+MR&zNJQVi z(9%j`4Ly97pCz_I@;G0n+Gkg~MWA;yI$opUGZ91E4|)iF$a4Q<8iVzyuFh_O59M;6u8gn52lH()4m-f@ z^(4{jq*8p+!H?gS0Cq}=c&wU#)dl^}4G!oXpsFEu56la92$5l)vyo?(GEXi?5YsN$ z)KYHiIJz60b%!xtTNSpZn}p)-aP>Qk0p14C&A@!wrDQeBBr2I2$%TN++N2XBy+M*v z;k3DVwUcj&r$gj@`)2?3;qzy2e){Ie=lJLF;Qu}QpHZt+^hj{X7bBl+2zn;b?C+52 z`0@YV+whFOxT#}9%ou{jrHH02ltn*h9uKe9YIkrMA`^4)9 z*jhAvhd>&;KD#%PJ7r6`#QUNR;4$R6jyqs&#DGs!0U*^#_N+#7tJ#Tv)}UCewhDoD zGWH4TSHq+M^qjvJ{8!q*Z0|HEwI%nTox$#VkTxO zh7>lAY1o5yNT=6j91%K;TKSmETeljukfyT$*b^?LS&QXGk=)tReTZ$wR#E1fa-&j* zzoGKDw`WKFpKUa)tz^HR%V?_&`4GGc9^fo57V(_d%V>^^j%G>Bu8oT*0nPEb?UIzo za%6_lYhx8zjLl*R*<{0DTd?Jop($cuYLH5}SJj?zoJtH1KWn0_#SP3Vw}=KJBjllW zU97Wj_-z~1MNe1E90>Gzv*r}F0k-^Dk#LsQ3L&_dw57{vi);Ywh(BIxkW#(a!7+c^ zv=9rd7)lo11YdSL$8`vE+gOe|Ww4mRYJ`H%K!f8j~naTR~XJ#9o!F+Sr zp6}9uja$l-a9rtXI8BR^kT`Kj>_-~bVRYtGlg%J%LpKMJ4Fzog&=5Ww(EhW}<_*^E zd6zi%PJ;1gpUoP^pY1mOWreB|f1YKMyv5N^@p*i~kXd5a*3lo3q&fRedSQU1_5Xzn zpJ$C#NJIKFxA)sjr0a*81<1_zJg{U&YI4l8MzpRGhj1*F^5&}+A+MP#WR?DlvmH)o z*5!m|yPnXj!wJngp3to6gl0ROkfn-QD^+YN9zRdwVi+B+l4Z%zxjva$=MKcmMSjLc z1p}U+iVtXO7>6w>j|qY(j#^?QG?Ch+It6$1usSVFlG{2xT7%hN&)EBc6uqg(KLeujx?wWbj+JyFF6#6pTD(BQ2B4NXihaxshcF(G;dPH*Xtl`vJkhwuoV^Brw^YJn$?V$IEg(=g8ZYeNk#&u4Xx63f3e*#UK;yq=#DMJrEhp^N(~ zk=IHR;RYPMVcv|&j21e}R}#BJl0wwG4GesdT-@$sSTn{M)~8?6TIoxYBx3RWNQ0PO zI!uOxD9;dA8Izb9uc9TAH|R;bC7q6B&{!;M*`5TU&}LM5GHhqb!h!!7g9LAS&=g_AO)oG0-quCOF}o*-CyS>(&4SY2QMSZG-=*2BZ8MCUQ;Xp9r@T+_)g zdYhv-DR_gun;}cq$v`8Y_)c^$X^EAaA%ugVr3xJa{hP0efS%8iEWBzuLJkq1oIwt( z!pMON;|^TQXhL$G313Z0-ZL0f{qJrC0iAh}uSF(y*$B`Iz0#tATq|BX4UE;?8#&@WQD z%Q9ccKn|3}nIX~3F$r#stVk7% zUMcoS&JMk15hWEcoyHC)=$w{$S*F+#X@WUklA!34{$+Io#A8Z_9mNYy>~kdMIL}W{ zlVpjPV2;z{N&(K(X*yod*#HiI)&fo_wzR~HbW++)oaIEh0mlOOSby{kmcKF|c;wts z1iFAS&%D4yqbD!dtLk09W@o~j07&i$YBr-qBEf!p#}|7XH7WC88|=Ne31#2q=kS{i z*f2CRk?lZ$Vk_L}Li@T&=^li)lW{X9XU z2_5{(Loj^z8FME@krOflSIRt6+re~QxXchFet^=M*AY;kVCOW#VNytz8t3I5uU8)3=4=Szvb5C1 z(N-lhlL?U(uJ_IS5B0z6DL@US!AqW#q!6{Z%iXAqmK2X(42}kGo_Ip5*qxpdRTa2~ zl=~`P9(_fRauM)&S@CpTLv}TK*Lw^N>DAF;gGFE<3D?{YNA|8I7TFH6g@*{UoZpLN_dUWFe@*(XxPP z&8?p(0dKIqntY@F?93)B8H7XdA3JL+T^sFo%v4ihwvzbTs1|y|;c$mxE?-0Z!fI&Y zP2MyB#1_PA^uN74wHr5lzlSOz*Ef|mY$puG5A zzv?Fpfz3@rilIo%rP8`WbKaF2MOrJ61r5VX4Qo^pVH@i3a?EmrWv=^wQpf<0XdK_3Z3MCB%T%F}eYOeXCy>dA)sysG~s zUbKI8#*<_v?D^fw>A!6eW1En-HGrNGT8N}rkw&h(4_hHs1Y#i&lzpC)5LRwT_Kq~w zX>0AWtQDK;1Ysdm(NDmQ%v7Cl+Mm?Nkgb@#)i7-H%mlpJz3WN zdy^2LwyfF-RF3o$x2c*9Zl}p!10naHlg&-|(1SDCEd#OH64ay?)5^p@UX znA%Hkz!TlG-c;fks=Z(qnY>HJ{^Oi`P>tuT*9ZDRM)8#J?IwLAqQ|)VL6j_(s|(z& z*eswlOp<8~<5FD-iF)@Q^ef>IvV;cq9$YUAf9kQ&;E$JicCtU2knGMt(Zgf7slVxAn$&0vc>}ze~nSioRBH!q6E9!Qz-yrgD3Y%JZ9JPu;H40SQL^Zf?%nDquHuUED5jE1cYdwkTbf48X=T({T z*4zc^?Q<@veQY%BEf^7^Z5b~Td;)_pJKJ1Q5D@QXm|gHw^nKTh=lby0cKD*&fo@lv zZ`gf%A*D*G`o&Gs4VF?SHjw<&jU`p0o_dKYU~n0D8pBB@Nmc?<%&YS}o;;7otGu}E zcO)oH_&jVNGuAF$r8b?(%)ktxfx-d##LD63fNQU^Vz()N$9vM$n$TnDL(jH^sKj?^ zIWwfXovgnnvKKWhm`%#rGN4J^y zyIoAv5z=u;Q$zSG;q|t_t18+L zv`BZju&O}yNza3fC(+&E-D#g~EppmQjRK}EO2+Ru)cx!r zQidWVz@*Pb(0)1T@aMnG)9f@lOjegf+_`ee@dbU?0L9jQT;vOn@UJeGY*td5`;BO; z!?$mKe0I65yb)>5O(>*p&POkvL@yFF(K$+!^G7cRI`$L1D_;cqqcshjH^0`yH_bL? z`$)fzm;R3WALOb2%c+*{0Z_Imqc;IN)#0xQNszOkOz!quAn)zr%GIHj_P z+dH9wh?4$vwEvP0k>06&*f56kLJ)~(8VS0fu~s8l>o|vr^){Fu8<3)r$3WI!eM}-MtjD zD394_Xw;q1J=;3#G+OmEA1$B2NR3BKOkLApu^S64CB{&dxYg53iF%a%=!a*Q5~j@o zgyun7h4vFU?OzT&(8zRV!3E<>w?mC2X!|@ZIr2)suPlR4WJpN)mO)LSn`U329ymg) zc|p3JVZRDp%7U8e<{S1?yB^HBE!=9IvCBA_-0mB=Jc7~Q*!9^x7>eB(y)jm#TX}yU zc#ryqIsZFNiMdAa4K)3V{%p_Z!2Ig~smdalQJ<)M6HFAWTo0gWa;JLL)*#FG=kbV6 z!-5B%UveZqSkIrq%lg#-jA#G8_*T~9f!lz-_gDBH!0#wBzR+gy^FY)Vxgi1@T<1g6 zJ*c5XHECvL{m^pRA~PsHK&2}|)qx5G@q>{Inr^szB{1-iT}sXNi3FIoEWo^P&$Mwp zoCPpRBsxe$dM`V|{OH_5HZPSzj?Bkg+w9U&$D4(5PQa?y zW$~Z>E13}>mk7L%MlGe|t35e)Doja+(d&GbJPbrN$Tu2Fk4Snzt_^JW!tj-1h{+Le zgZq?o?uf$jmk#Hwi{^COR5GD$^8fQ0B9?{nj1vo4*d}*30PiCWa^+;nHfY}Icx*~q zcuZG=JK4z&kSG0S752`WNS6$GP53htjOsz794ac`BVN=N25I=3qYwM_g70S%hiKyq z{3M@R^aT?~+0;M(sUWE$)LBD>h40I6Z;|0uL{u!&^L~LCgo%gWAJ4e;j9nVmhLhez zu3nPDFupKU0JsX-f)>Q-MIfV$kX%`(0dJg&=<~QJpj7l*Izd9nnA;%{t;#r|DW0=i zB6kwB=#~MVT?*w&-XVjA7Bx@i9JZfi<=UCAnf!6h_*HtG^0@5qk)#40`0w#qJY28R z`4BoPuhfbEB4TO=ADdd;29`w%Su4jW6!}Ebv6Q%)_y05F{K$7ngzY+b&}d_N4%V=+%E5^f{4vE=*DlW&(R)=G&z$S zL1>O~dg+;;z&b0}Vj-J7pQ^n`9v$DG*+pKYCmi#&S@XevJXDi1W-m!tJ|SH`PGg_# z*JX$5qh3IVf7neb&=S>3^R;uWg=08H{}S1qE#T?dE}*F+H?pFNdE;DNq|J*BAly}t zTCP{U7e;A1+oCO5{&Dl#`wwdtf;Dw^Cu{E&?y+{5gX&c_TB2HRv#PrPYBzZ>-9Lt= z{-NBcT~CLbeJX82ka6Xd3$f-}XOBBI$n#8PQWoilUbb}Uy{S!JBRFMz~qH>iN(tps*+r)1;G6?r>F1 zQ7K~J?ClF$A?KqRZD<_!{#=DIk+QJH(j~n*u@85!&gQ5gz^qCoJmDoN&A^FY zxno^L@>LfJO81w(*>bi&Y=lmjk)Tswy;>o8P&b@4+ zVwGI~(dDB%*hB?%62>Y6oa}O7dQloTB-|IPT*GGRm<|G9HKK3TxGdDmBUou^`(X~- z#-O`R=F>>&7|91cOL6+TPQv63Wqb`;BgI8ll*NY>05v9f3)Db`-XtF%-hSF;3RxkUM}4WGU(a#9KK?z)Um zRPOQXCveFIb(^a-5T#(WaK9IYCe~|Lh{7iKCySix>=YbOUn$jLp}7go1jQKrL&A>5 z5Y|ZYnR7vX>L}Y0UIth4~Yw=(pg;O$&=v3dKbx>>s%ya)$Ud2^hw; z*JJ$==g)Ca{2n1mqu5cEG3ruCkXC8ou|-$8nxIkHdxI^vX^O^#mT;AVSkUaoP*X0d zBP)KuR!msGE=o8P6;li=XSU82On`JXnan!LGE}+Xd68^XUF;jQty*~Nq-{Sd3Iw1A zl7+p0^k+l?kJ@2m3T7yc5V%Nat@C8MBF<%l1TB>9Cbm^Dir+Qz8<6U2m=0*OH4z}( z!xkB@y5k#{_MSEohUyx(2qxA!#avIEP6H=#*Z_UL0l^4)MRZUZ0-2p>s(ImW-e$<2x{_s6B_8RJ4g|%Z3UCjnQ!{#P}*I~`I)&DM; zbNvpl#GWnMUXLsP;N@f+w){<6W6bjFQH4j>wz7pw*SG$@__S~lnEeM0t8BN?+#D96p=oPNGc*-iM%e7;v^)lM}|&>RQBlRsBGYH|AolzE9|r97bovdbl))4 zdu;$X;up}F6Ev2~JeycGuy4He0$9VKO0q`1F&9NUTnz{`<0>6bZ8pNDkaqJDBYwse zvPC3Q9R00F_gp6wL@DSmoPc9%n6ac^tzx!gEYJH0@UI=qAleiMd;^EHC7ie(uiTIx z&~U7}+%5S6*EwGo4P%2kOU`cGe#Wv|OHA|m zENyq7Fs#fEghLqs+@LF|U{iKTJQG3D#C5X}=v8egk}2ZN&EPzih-qi(IN9T5piTM9 zm>Mf?I-Q_m0Ethh_1YA*M@mvt@Q!}q z0^!0cMO+~w3yt3<;t(C;wbz5RNRru{!QF)Y{~JAd$rqsO3BTH(qg<0!EuAVl&e!PT zA^jq}_@Z>GJs!}`f&5fe9L8%+uB zg?C)Kdy%CF1f%u{2!=dYCm3e|!8l`rp~vyqg{76@@n45jSl03D)9lF3q8Ul0sVw7$ z;qnxwdraXef1$n?6izV9v_vC~{p^v0uyNVtz)(kKGuZs1Qm~9 z(s_nnI*fx)q_0j@PFcaJvANUGdCQHK4GX0CBO`hdV9XwmX(%XW7AC|gxfYeVB59<5ni40 zrmZuzzsly(mS)AG3X4y+Lr;r<*m?vzj?;)RXb5C>Ad-vwXaR3Nb%lUfw44ING25oxZ3A zm5FJyOrWx^oY+m`Hd?x(yQGeDdl22ejC#=MV_*2<#*3KXSqR91>oB8bN)5V-fo@9b zP=2meFEh=7kIM8Ub31rU8weis%nY72G4Nm4>CM&~Yosso(kho<0vxyrfR|yvS*P;} zy5St_yTQjksFue=33BTF@#jBoL>%r?)ER5I|NLmw)b_}0B-2zEqrNikD#M5Rb#%LD zT$KIWByOJeH@*1B$A8@T{aO3KXALj5oWSEvZL_$M)W$Uq{@Ay_N7eOSw$l`Eh)Wv6 zLDZ&z)3`{=<~mqvI#(Aq^AVs9s*i84nPeg~{F+*|<_~o`QHI0~wllPD3ITx0gMmXTiyT(u_J;$+Q8hb}g2KSsdfD!Wo!jBdHvm3TzQa*C7Sh{Ds` zUPP(64w+Z)p`C!(mON5)Mv*D6n$mJ0Cewz7A~v7&a=*tIV7|3?X*WPm1D7Lqf~RxxG~OOjpM@iiurUPZRWY4`bXx_q{aGq1AJ)sMDDI9khZ|=yTlw>-}AgQSU`RI^EvBPPVG+2|CFI9qTTyge`S*!u9dxsDdv?PpTe|>take z$W7u*!+HEFShLy8QvsJ<5a*~Faq3D)AciY62VJiDi!Q?XuBg=ob&mQ`hbEgx?-O6^BiGQl z_JEAA5x?B7%?g8Hu|c#AJ1c<}X*uL@vZ&U>n7DrGlBbd-L?^Hwmg5t=(FhdVabITcXkO7l`+46}8eNC;TdkU3s4s4NgROfwFjB5hZOaF) z2(n=kQNa=97;4~+B-Nt6pg(ESWt6WAap?Tf#*t=|=)6c*Y#}T1^~ubO4e@%M_<>wr z?|_nPyq+TlAuf*7RS^?uK~(85I^<@I=SeilT~dZ=1~*1xX_2B{ZV``9qqw{va$n>b zB3v~{MRR9R*Q!XyL0j`rquVAP_O>ZPYH~xQu?pe@IIM)%cAi)eF_9BCxQ*UQV8)vf z3#RuI6XiW=$jMu-CDy_pqDb~^1)u&f`kUD>AMH5Kf?x+O8$R@2zte{8rGch~u-E3m z@ErohTmym{F|#yooz$C+H>YA%x)rptqI$3FLl)}Ne~9(-P@`+M_sa(DK_uJW1es0{ zozx34OXkS05w5jXUyci%mInu}5hguo%$j1cJxwr78LTTP-rU40WxB)U1Wd8UBkd;P zp>>zIEYdT?Q3mW*y5{ii` zP*roxTnw^bZMkXY!y8`c2449#Ud6sAm~)DRU-TtjO$tQlN6t-Fa}=vxeh|9Qgm}Y= z9E8?2_!QyxOBU%$gXXfl=2zS;t4x7{CrukIy2UW}E~Q(3 zsqHDsFS3OB;H=HbrowrO3|s7-TI!U?$(9L=z}fZY1JZK_LFRe#_HA60HZPh;MEdK84b?I)%k#5Nz*xy`pH?`PJJ64uTKh!)5}uD?sDI$1mhG**|y5j3@(R3b6>F#1uZ}Z9G-5wc-#?mTaRxUOx&32zy?Xv_6VI#Jx1u2z0MzC?4&B04 z>aXjZ%?~7L{1BIO*#w!_wQjV3)s-^aZW}!I$bE&zo&bSS;^my8-thZX zQiL-sG)49z1dSeUU6*~@rBkvY8Fn%>ayKkh*1{^US_4r)?B5b8ar=5d`u(GDStuQX zN>S%ClrKTvoaCUQBG4NP@S#pd!is&muv9HHTN>D>#~M|dynOL zYM~x9b@@0}oemz?yB!3NgK?L>HFQwdss2}#h*$0yyFHdZH|k5rB@?QHbVw+H({zQG zKvU-|XdkEF(qp{d^2$al-eDx9PplgU>N7kFdi;jRKsXU=#{kXK5b)Xe8-PoA-S^}1 zWp!VeB&$2KIZ?KZti%48aq&L!sN9{p$uV`=FEb|EHyV<&bJrh`-mNY>$2+BVth!n1 zk86&DmU#Ux;jZxBxZA?NUaxQ7gY~-s4bm1s&u01Qw`&svFIus|@;|=pwhaUI@%1Sc z*R<%kCyy`NcV@sJU4Jlfw-W#q~LGczdtBaw} zT@#KA^g5RE@RRReNTRMUf}vylfi$u%97s7{Ote6Y%hpbjBZ$3la?1E1E@Fliz+X>R z^S;>Tfb`D*CU6p!@RuFCRULmV^Z>Oi9p+$u>;{JXOk=!(wnr6Dmsxpfx8^jXzi({G z!PKb^h=4H#Rma(q9plQAO!RTINY9~bkij|oYy!g&%0qD171FohxL9U6O?5IT9UAqQ zM}bMM95p`QR7*7N@Q#aHmfD6}uNzW=JkoR-y&z2HTZdfE8|2eG4=>qDTc*I2;Qowm zjT&fxJ4BT?-N*N8aawHh{Rf|gp)i;yXdv*JV$p18*%#mKA0F=i{oT>Q|32-vg=xK7 zm9J(mUoygKzAw^X;dM9a=g z3T^Y6nqf6!GUfGK41NjPV=D{QY`fWXz1H-ER-4KvVsqVw|1}On%)!=c{$9N%Z_~)_ zhstKeMqYm-xS2$l#c+~lm#=2Md=Mo4E(W3e$N2W`pG-PmuhopKqEFPG{RO(dU++48 z|L926>5i=vhrfp(`>|U#9lK*WalKHCUr1+5T)!~5?~jv$SNi0ETZGBUPyj`Sv>2_H z9oWV51F=3qcW~R0%dSU(U}%d1-5La$%M5O-L9lFK9=S5oec}p#YOc^b?ssAgxJ)5# zS&o){H1vA+E|>5H<@Cj0wz&d&SVm20jQNLSNo`T4zi#=wqPw1mj@ngvp&OK9Q?(J!imDZSSSe7-pb~7`lK689i_c-l7s|t0657iU z#uOQBBpRjQ!Ceh1AE;nj>kGL4z8CN~8+)<(B?|UeUX(s3e!2>ts#5rjeXbf;T~b20 z3b(t7IP0%l!y648aVk5JKYW-T15`ETi6Ul)D&yvx33Q*s@U0v zV4~j630Jf$plDO~>u4Db(;9P+;a3H2u?C6dC(Z*4bJ2p>bIjXb?1pMWafP5Txa#|$ zmNoRYF(p}bz@E17A$#S!2|2uE)OtFT~^<~dap;KlDpSy!<{tZ zMoY}~<5c}7p-&R&$10Hu4t7VGl+TV!^B(Z$3O>o& zBlcZ;1UF+XvJ>ug$x_Dket%n!0$IH3dXIR@C2Vk$_^LAaOEFv*SE=)T(gZa!2=b2{ zZ6p`BJr&mdAm}7#?2xp9Mskl}dfn^xUl`cMu0D*4Q2*2I`0?M4s!GE3uE#1r>vC6m zu+ge_<@(FgLgb1(NzjC2WuR|sb_%f{+vM#@e(qdc@usXf_I206mec)exA*8erX8}h z*lXTqa>4y+@~M6@e_YG_v4i4QIE#X1gaA?Tgww#h?ww+l43}{+8Okf1U_IJu_Xjy> z2kRbolCsx5y#ILrsI7a9k=Z}`?%>(6MAFK)ZmE#Mszg`M^yWFj-oSb0X;%*%#j_z1 z;N|F%uZASzx$ih@0s& zuLGqQb5gEv?zC%WBoz6KNd`QQUNNc8pr|~2kW8bCqe-}k+=s6~Rxc-WU?&;}q($%H zXuGK21m)0!em@W3{{#vE0?KZ`wWV9rundFpG6N#Su`yU#kfrBQF3F3xtj?G&VP<#t zf^EtXIf?RNvRaOjES__Xg8z;3w16RWD1KBqo1nuStzu3bM;43aJY%dhayOq6meM8s ze{ve0L{>=##uTCY1JEET7_g)Zsv{uH>QfM$BMJ%LFej+7nR*KF5$4kTJUwkGcj6A# zRg&D3T;(~|F|@X}er{EGQe|1Zr&trtQ3QuKE-wuM6?F>of zlsR6V`EZ)PhS|jn*z0LCa6QtL)6m)s>!E2@4_%UAD+}XaRED)m@C3H}U zCdI8mK@7!~(zx;hC!77>}CK0;CVB zz#Nv?#JnuC`#U=mL_dqqB96r?hG~AX!!Pr@JO2O?X=iV^3&H~?uYx|KYORl{LtvJB z!~awmrNgZ)5qmJYZ&)GhArSUZ2z#^z@(;qM5=&l{@xpp~7?$ZWo(%WtA3Or?<1R{F z?K?Z9uJ&aO4i9t}lK8#|UL_HRZz0$%sPfPTXH}yCt4x7QbMdN}l)pg0#$pO~#8uid zg&I+Ny23(_ASV8Ra@;Bd=@kp}arr83$i_0veezwSPKlNBrr1n40lAc*jX_QoL}64f zfD+8O&^mR3H`4Sn31OLNAOvzeT}`4bHZh?w4)-N^;dTsTyFygq0V?1i5H6?;mx__Z zm;W6nK^B&)zTC-D44d}|x+>AWo-W5sR%*=DwLMH;Fi9y->zsD z8Hh3wVd&t5WXy&bu1Gk>7M80;8KW32OC<{pBCrIPVzEs@U}Ruj6xOpc}V=7a$zN%HxfWuYkfEZG$9EQ&p(Xf;6g@8iY{T?>AWPFu+_}8H?Ek-bl_>De%4qLTf2NxIe5AV7;L)gFHkEg!)G zKG=bOF?JFbk2Z}+kyjs=UJi{)g}HJnoHMxGae5VuqX|k$TciUqpA;Zly%1FOZMj0M z-zl4Li&RH?!n?E80y^Z$DO(%Gy;&2)K?{$<*P{D@OQR*G4x8Rcr<+n(^cStXj8;Lq z`D;Na<9owz=&x`E3zF;GfH~ zR)wwp0-MM$-w@e5I;Yj`EMY8%Gr@AWu)|t|+rh=iR}PUdI#CTr={uyApes{2u+-Eg zHtcl?TJWE;Fdi@GbXr*T5&acK8LIWdxTh(ieLD4Z%D_m|X-`ko;4Vaq1!lMwBSEwv zr_y(F0)qKuM2`gFsES)jrjrm&HWPTDFs>a+j0p?0^z<;v3$JH5i@2oyCcE(}(btaG zva6EddUG^6F^^S)BxS7MAL22sTj0aODa40~kfDM+?gtNoy(YserWL}YKlTV~u^)UM z%zs*2kM6UcJCkq-E5VgfIO2T3wAJ_5PE<78yBNUI5A0>>QlUg&pnO>o-@*bav>u^I4?9AUHmZ=dsq>k#WK^<}T?8D~`5nn2oTc5M_Sma3~C?j(pK8o>A{#e?ux&9L8fh;lCRZd{{ zTDhxbGes6y4y0AK#DhWCfCQO{z`YE0)#)*che{Y&kOvPnAPP|=ZHVB5^hLweh4pTe zg>EC7%}{!Px41@Z9*LOYAww9+V-{UVFw>=Vd0?nZDKintz99dB93I12o0Cn6fD~cO zB)zgx7>A>pAuMVZag$Vw!J<)^`noh0m{~KEz{1#Nwaz=aH)+{>yPen)oM>JfOK@jp z!>&}IvK`XVRge8a*4|yT!dsTm+HXKUsTxj%(Ik`oyJjlj-^mYE#S3?rX)kI z1O^8-yjA!s$; zgUtYUP7Z6Ec^!U(4^}|UKUx;l1en{xg!DzIv(oIDc7q7*%DBu`demHsK5|aX(6{%U z-`=#Kz4U>CvPm+hORKXqQXl%J)T>PnzM;`zx~#Cnc0!UERIGkd!Y4CeYslflJWtOp z&l>1T%b1utBO@10f$BuUN!d73#)P@{aMft3?#-2!qh#3U@id|fuk&!Zeh&S=dC2tj z4Gfy`0T@i8mms0K;*Lipu9{|cz8%_SHW*J7TikX zzskL9O1NqBv(k6*zFma>h!>aJCfs1EN)^q-=7Q>^tKdwH?mS@QEkRbAqSgr zGeQ4TU7_j=<5~+Q;bd<6b&zICcCoUlm-2np6|Nh}fAMTm70@xgRe8jTr923PG<%cr3p=N5ZV4Rc2x;Hq3&9CFY$*97 zL6hsf%J2(gg^4*9BVfNq8Np|b7!FtOwWn*-(! zx5sJFyM@B-t-j+3)~mz_?o%_tfkPIdqRJ5iHCX|m3o6MD{77TzV_V(bOb4Is=b0spNqDFky4v6Yo{(W3GG+12$IE|9Gjl=%oKnecq=?>&FfYQBMH~kI zljcYBcm`aaGP)?7Wd?g|FvDhf#3QR+^0jT4Fi4Yd{sEJKvDH(Qj~prsm?1%Kgw^X% zRxJ1=fuu)wo6zw&HZevOo68!&3j=Gb;mdQb&y9TP@}2Mw-05PB5gyL~nd z+y++;vj%CoGNc1&n%f&lNij7@Eo-p*VuEzdzKXM$sR)nhDvzjMCt89|$OnkU$;PzB z=MK_^5s{3CqrA+-X+r)wwIg_);LI`IP`82p1bmA9fLQo_u^0y5!KH;yVd;o0E+b}} z0j|0@40HqOxQOyImtp4mMmIyj$RGA=VqJ&OBaa@?VFl`a4 zg=3=jV*#7F5Ro;n4`V<>nFW;qv-aQjppZT+x#q`xJ zHY;*;6(%@YAAGr|F`NN!!!gGcbJ3`HhW3I)%wMbqS`x>)v#KN4ey!2~KgFiKAWu#N zg@`|}x0=d-Iw)WxcABpxQybE1P`WP}A`L)*{Y8CCZHX_;saE+O0z$8-xs{)9` zi$;=xR(>oy?HzYfO5g)UOh;W^ff52D(I4IdWfDb6LMfVNU^~v+3}47(!UaZO8yytk z2^Lt?ONH@>wMy9mLXoK_NO*6Q!J4&&wR7MwT8eC`QMk4N;r~sWeJiF)TYSXIpd-N? zi%w(jR1a=dT#h_Kpku?<5W*V%Lz6H!uH6DHk;-h+s2C4D0oRroLSez}qDV(EWUN!k zYf?z-NYS;-!YetqcJT!55tp7&jV`upteFKg((5{AQ;8n?Rzn6sZ?Ac{6e%VnwhPp% zpfKcR$S4G}{7Cy8wB9X2ds&ohPngfdIx9uDs2u>PaPeWW45Mdpj`|51#z>UL?C@9ugZP-$?HgTcy&3xk8fym%!^nH2iJS^T= zk@kc)gUX$<=a52*rWczY?87W!E+*uj6{>-q`!LW)-tDdun@S?!d{Rk3FyLua^WJBFrQ=i64-*D43gt2NWT5Gwge5?OyIBfX>JaJ&fGV z9YWdU^}P7;XH;~ShIZDGj;{%<=9P~+J#IFr8NRh0%GK4iiGM6EI}ElS#kP5WR6K`g z&|lwSb2TWVXu{QztQ{N6ECZVRCV)0nJ@#EN>(mSCKajtdeqYJS8d>d4TNo|axI9`wW=wtwdn%z~p2YN;ZsjKJkvd{qh`mYZjhSEe zn}5_aRFmE1pN$`A>-PfhG}g4WPiiC9$d9%8Uf7xi`qfOXfycRKM!GS|W#RLwQM_^0 zrDi61L!D5}-;HBfegca81QhuRDDo3f*M+a;W#a zm#bxz$CHL{Il0;MWu$m{-{7EB7gz%ae6!kKcTH6qTM&O@#{2m$(>Z9dc8D=kG|B6Y+fYG{GGX z8@gLlFUIr6%k*e9nLlN;ytW4|@II>-@9>*2O9gPAq#^cn<{P|y7*RCdB%)nwe-YhQ z#c*F7=>NTnR?+lG15{$S?eM53+m>U!If}_dC(qDPrTd#)B0J)IBG9V~&YJpy(J3_$ zqy0E3JqiiQ%4JQ*SZ`S1LW^)|A_GvFhKBT>GDalfO?aqH6$T=huEh#77=#ZI=Tu;m zZm^!pRum6C!)6MCg=yK!55S=D022>kny85Btf7LF(Y{bInaIrsW`XPnr>Tn)gh|Ws zB9Lsb!Ioq?=#VPsVXQ19yCTu?oI@s+fG~hY%#>fSet8~VavXS;Q^Y$*?{SE^TY(LJ z!A-v8SAkM#%t!`wE!CC<+t2b8)Xk-&sbE+F-UM-3n577CDL}o&=oZSnpzo{TshB7L zt6(E=9{Luq$GeMDmH~k@eAS2lC-BUIQ>`g;?h8(^qtJhhbH%jVMVRqqs!3nIhO-r- zu6$v`ka7;gReu;98q!xqp9HjNwI~Y}>w>{OTNH~iVf-!JOAJq1Aap42XniOuwVk4G zp_!O4Vd0yo90t7?7*;{)u!{v{dDS!6IF*FWgjfS<9EBi1gj<47HOGvoq}b*V4ITxj z!NR*Nf+U!3Dba*|i;OAGMJm@~%Xy^ug9+^sP^@7;2%h0UPEK-6H-RifaaxjVf`l{UtO`n}Gi3*l7-@HLNrz2cJ;cNU z>$Xu~gQk|4bf$6UN}85{?M61|g!Q3L36Tu{LSG=Ey;2kwiCY@6iB6o1Vka^KV2s7f z8pp5;rfqR{WNXbdXh(Cf*vuA7B}WJg%xKdbS4**w<4ayQiofMkjHyy&w5H^*FsHQh znD|s!s!3SnZ?+v*X;o+rTsvpzD!m%WU$hj(Q}ll`M>hz-R@L0AO0t!}_@ycym5wbY zyQz}J6xwl;GGIgvAQB^utz1iDLM9W^bFhm@Pe-4A9SurUQRrhLG4|mUlb<&ogaP9T0WIUEBGQ{L^%MG{g#lvVg zAQ)sGIDt}6F_tG$S&N(*h(nuk40xF;+NZ0VqNgaLEv+QP_6G_{&jM=3QhlHvY-uD# zx~VNNM*_6QkneM#O~kv%2zs4!7<`Hp) ztu#DYLdaESm&#A3OXDO(gvu!>s2J|fiCbim{zs&UHxh)kG!xOyI?in1dLrqmS9Z*^ zjwKxi`-v{&PFFtv;-Kk=(`U4${wCDOaFG>s!7>VyLOAqfRiIS;4=VyxXFT%I2tR~G z&Pz8XathZa*?k=@87CSsRy`gru|62Czw9SxpG?%j7e2{Xvq3&k7Yyw2{-Q_+3|E6; z%w;@|G5?-V56WV2I;5~fBGf5H z8QDM}c*igkGl#@ti~CL`Vjzv5BOS)=FJCNYM8dtWnI2C=f!rn0`S%f)_{CAe2Gu`D zz`rYCb?_yYO7^yL%8#;&-sc(yd~?xC2`&vSE}X4_(gg@HpHtbT9yUJNgB1aBt}xfn z;_2jO1cdi$D=rc8&d5IaM?THOVQ&b`~{jFr(D}8`xlxJfG z_B=k-Z(F+Fmb ze%d`*4b=&?c*Vj+5qazbO5&C!K;?KLU>$;ugm=xDKFhL23{R5LfjB6fGb32yfCRU^ z2JtL1ye-s@Yy@Ree2DWfAqyghfU_gU>JouDgqVckkUfE*o2D%6pTHr{FIh`b!sQ&1 zIZz0Z`~{i+fDJ7)i&?tL6|ca=3X+4^#>AE%xi5gJ!q+75!@o}x0k6TO>cMw32Z?4; zGC-lyG*l@GL2>IH6Y??wD)9)ZZ?z|!p{Dm1*^Lcuda9WIK!3#T;yoZnr)o)h{E7}V zkb;5zw#riDHRS4UhT*DGC6uAh^oTbph6%(dZsd3~n%dN3nuLIk@#7|um)a=Y&-BTO zE~3eb@huc*A)$IwCK%g^V$4d2(Cm%mHsJuLQ5JF5qg=(*8?sY8&HS-Yp@J4ur`$Sr z*4-t=Z<3QpF#0XfZq8wy}*U zGMd}07LVxPMf^xLbsu4i=tfi4lyIVe-iVxKH-~IERR|CK2CZA6-=s;B@ZxKM%vGE* zW1$m~M9G!GAMC)m)KGDV47_q*B2ENZ9O>K8u`=M81T0z`L{sPU&LcAkZtj>yL2(+h zoFL-#mO+#u-Vv&n(R7H~Qhk`55_~_{pG;Ous;%Iz99NOhR7Q`hVoG{oa04T?Df6Nt zvY@wgZD9s2pO3^iWp`RSi5WTUG1r(CQ{-u`m}vtAg|Ngj*vh|3KkB8U1G*7I7hWzSFq;4!@{Fxnpeun>=ja zLPn%14>#t_Ee#u}i>|1IO60HZe3e0}FbsW(2v(N4u^=Y1E&Hm+ zQDC@rsgdUp313=l~}MT(Tt4rJs8;h%)K^Lc9W0^*WQd1MBigZ!uSM1TqF z!VP!=pD+M8i9re=097HS3K;1__eQ{r@KV6p?zCBi22}7!U`ny_g2>1P8ZOP1P@{~1 z3kvt;rR0UhRZdyok|KYCE=g2&S?@0)IX#{L|6!Vz^Nun*5|bPaeJm~NWc3Bd!v}}Y zjpfTKwW2>zsors6*qoSX!*Za-Ij+NpJH;!gZeU54F*W?qDs8^;aMLZ5$t=Yy5XHSj zbA%!u1x2Fg20Qv9CEQ9Bw6_#0gm^a4q$m`q&#Wt$x&kQ{3HXAkjwim$Im&Q7#>>^x z{^rI0|Gay<|NPBUOMf`x%ZgNJ_x?5Fi~=H}om8yYnt7p|1sYLf#SxeaY>?6TYE(oF zA83aG6A5`MF10-x$TEzkz+v$BbVbTDTU3}4t!i7L zeaAd(vaOCU729GdXoUI;@s>WZUk;0LIpTw3?J;vd)oaI|ecXIdbk<4+DAqkN(p!>)9r zycr08s6;|kmesjqgw>){Pz1&VcZ&jjZt8X!$`_cMR$tS`@ zR~~m$h6rx9SEfA;h(IS7lo38eZtu8PY-EHkPzX=MlEYC zHmcxzNi|kQV{J1VV>H6aw{&xc7ZRHu-;GA;Pr{}6?wnv7wu2NR7HgLP(%;{{{r(%L zUTLjRZz#cuwq-I5<{*MTy!Go}r|IM{P0OpD;c%ynCUcxwv2(IQAI*-byjtu~YSeIE zE*G~*-2WTsuz?9OD}rY^j1>v!!A|&SSgoG=RYUbug;w$4`$z1{0i_8?N_KX|o7qyP zz)|hD-nwr&#`k({R-bA4`$6#bk;#`b65jl6%XN?BVfPsr@B0VGD&LJ_?rrZU&=5N9(2LAaaFspd_B2@<#mJ}8ei66SHgq^ zQ@dZOw196RcrhFziRj7fvO;NYSHe=(HVs6t{Gdw~rEGp=@LR+tR!x^t)US^io)+kj z-Bn{L%&kulo*s>asShZo5!Bl~;>&(jgeP$JzY{qIZ)Zl|>m%ohn)wphhn09lg&*|tel zW2rY}4wy$7`P9e*xroX1fFA0_j2s`>v6HO?6heSDt1)p|fqdudC`u^!jvdjYX=}o> zae_;f2Yyatu2WS+y0KyKR!ltFNK=%Ti%3(fRUcA&d0C!;4cz8vXPIbyC-dl$`eVJz zi5x|b0z~u}4t3hs&JHgU!S>ErxcCN1+uTchnS#)vI2Tv9`LIEs@_#;u~xV8NHMBD zqo+KoCh_t@uub|=uvcqbj|r1|aT!MPVouq=MUAF`fPc15U|_A2XQTrf+7yJz`M}dz z-=1zjR6WFWUeK-ScX|>2rhnx#^)98A%a~0gSLRo%cDCX=y-J4`9qf+mFU(N&#HENB zt_`k<{=$AuX9v?HXz2-2U<4mL!gS#R|9%+k_3gJX`_t;hp*>g+Y=#JKp!@9ihd2i7 zoDg0K?J~SF4~v(uG>9-@C_xvSQT&ICR3K|r*Nr8gK~%j)$5OJx)m`?wW@5tb_3PAmG1tVUmomO?9HjsC&$xVj5Y-yKho#) z!1~Oj%V`;;nnLSH9eCN3Xn?q%7Zh@|xa2!T37@77bMIRvSP7Lpb>o0p>ZRM86qv=O z-HfjCsw6~fL>Q_=cs0c8bS#z>iM3m?jg9t{2!-5nl*7!({y;XnS+xz@b?DTfwHnnR zf*3MqH{jghWeSWRNTjp??vSkcT@qrQ0(Ouw22P$`<{XxXr#n&1Qxr3lQdjt;mwMj6}y#kH)#gl`F_mFIAR! zDaV%_yk`QUolQaKxMk5);bgI`al9lbavl8el47SY52`SQzY-PJtxV6NxC~5zt!XqP zC7qQQvS|h!JEzwM6m*2B)^>U{Bf?o42u`&`DJnCJ#3z#RX{oCkp(KJz2{*0U+)pg~ zKV_0k+2^HNb*s3uOLcVt6o$L3j}&>afVNcyLJIR-$nB|`pbQqcMX~Ft6<)pwaYj2p z490y|os?F6$WnT#EdJYsYsiE<35${pJ*r~av34s^e3mIl&$o}AKdP6G)Oil8Ce4Uq z>qsvnUmP-S4a7aGFMTguNbXb-PNiH+k!oA^jNA|cerqXdAaQQ1b7#z<9Akw96Hh~< zn`tEwIVQQUb;j#B!Z@^rl-a@Bi7BlqXCY*Hc)m~$NT=}AwglZ%eK}4o<2B$&VmxfJ z1TxX)qC{90iV8MX%U%gk_jWql#$b1@1ts}ET1zLJvOc^(MRX3waiT2erNn)(3s2`v zn7T=em}>CRX)Ms=r%Lj%uZO+{j>_?#M!bLftqqwiNmEGN78zzEOZ$8_D&z=*|yZ&s?e5QlvNR|zCO|LL!Ur=fT!Q!jj z#Z*xB;rsJ2C-O_QQ0ScZ1>x@B-PH?Cu{7Aie-zew>kCjH(Q2UBO!@rOdkg{X2ENH) zbQvS0TecFhA+FRTQj03Guh>O}mT@t3r8zUkhYy1nuiifWwqGx+sRW5022Exw%5$S& zX5rs`H34Q`374t}Oi?_RI*5lA%G1K)J(h?-MnPOwN1MQtDs9!&wWDf(xlXxM4lr_Z zQ}z@N%!(4Gv&qSs+yE@^4ow*Io$`3RQtW`T!2Ic=IQ4-seWJs2ATlBWH}y4N{!6 zMJJBW&NQb+16LP(tkR3^lw+xlhI67o8x|lL+@CNAR4cbkj&C%*rIOy9L?*1YiXsS= z#S9V4>A7|4bSew^zp##MB6{^t*VMq5;5Mcr3sEkb6ui~f~va}1LmfD4(L)IIEC-b@Rex9 zR85hfY?f1Bu?vAusUC?cnTnS?)!QSVxJ+^y^hf}+5(YKh>IMu$;1Gj^r7o2(wJ?iG zQas1a(KJo*J1J)?slvKo!B8Wtgi;xi@797`PHqidkSQ+>6aczf<6l;k-8%th#_aSv zI5+Y9GWZ;e`JBbx%9&Jc7nn>qJp%@X8ILG_gIG$ef=+zwM2@-2uC*MgN}=FARXfA< z3X*xrPO`C`4W@hwctk-pL}cN`pcW0o^BurPpZ;{5^5*9WAK} zI8T%e&*M{sWQ;>X=E1*q&*Mb{*vZIpCX=G3cc86b)zRwx00~MXlQKc%W zR1#(_T@JHqQK1(7O)v?mVzx<{wIo2*nAUD#O{LDoFgQ3#Sb0)!4&1z8iIAb{Ql_8< zkq#+Fr=0r+&-b=rK7Dfhp7-F_L2%j+c9eP+E_$bZ))QSF%4E=0%}u-a@!#Fyz1@3X z-Q7i)CH{O*KEJzr_YQn>SABj*KHvTNt8e!1na}U4&-d=!y9MsXVNta__kI4E_qYu=mZ&0UWP^@hJYQMqljqq0Lr`$Wv%k)gmTZ253`wE-5sz( zFO|cCS5wag&c(ei`#S7L)$tW;rq~H!HcV_Zqe4b%_BF~Vp9JkAxLS0QK?5!)l<$iL z>?LN2WNR`T_JrSP{=K`a_q~v72Eimu-UO3B9_zj`)8N!O6Tw)0%oYbdKB6%pO9HpS8+#X=Q&XGHCXcB(;I zfpyYMaOsar zHXo$WSA>Xx8Biw+r-g8;tOA9RQX-X9&zjvW{OC!!xHYg$h9;g1xHbmE^)2TpS5MRk zFG^Qf6&j$~DF}~jK!cYZDmh7t-BY+aTWz8|XJwS)gOkXLZG*oCDgj9iKuj8p2QOSh z=|kt7l;&uX4of6>mqH>#Etf6zq3i&x#Bqr?E12ez@QHBWiSJS@GgapnxlR|2#Ew!z z+a3l#m?c%^=;6*(NkW&bi)myd4B#S+&nI6mBedGze*;k(Cgp5Z@72mkw&^-Y_! zOz;M!_gZHTn!xd|*e$JQ5SoE&gBY6vSjd}Exx9)?Kw>KB3A!Bf5VLptP9=N2l;#p9 zb|tw^1OdacoJK5+tpiIlLm4xb^hu;~RhiRN4Hlj*M^0a$dL%!%=vZ`KLDHbjElmzIUX%@IMbF0a zZbgyANn*5B-#E}x=J5K?Id|Eg_|_C{syJ9yv}@xtb8g5+s`K%34s>7EAbbd7d${;kaqGfIa zPW7!FuwYtr^uG@aQe$2bZYoaB!|+klfTM!khVp)8*_H2{Q!+Vm!r1@~31&MmiutNU zIH_$3{6?5blGn97&pwG%^GtK;YMn2dRu}y_8ezS)tR*@K;|9{S%yP8zGD(VYx`>?M zb-^P^<7uG{X_h9-FBzs8i_mAxeuSmzK!Iue7@eddgg;s7A^v*OURB zVkdb=Pz4O=lG;XIzj_=Nm39)~N0q6fWfJ&nGN*(;5O&CSF(bM(be$@@E>eRqJS)UZ z0qY*i2GZN4qo>B2O7Rxj+#2g8MywyM#w-G=5>6~vr>>(&`$rxMiG!e%fN!XfJ%uAn zLVQmA#TC7Ks&ueu=hBc!ofit+N=F&7U#Aj&p}>+bAm{hSdg6iuMgPUY4eSCtU_5M zFJ2)9=uk*+p>mvpl<)>o^uUf6m-j8z6L|F*-RJ2F#yS;TGEyCVn2-f)U3@%h5ut)} zh^nomb(6HKU?#mSI?Ro*bWm!i#U@MuFRrAq6p>tF-Ek;nFae))3X%?5X5(N&@f08< z{2&+jlnd-w5fn20TSw6e4)B&NEc_(2gOoS(Gt~qVA=_ z+oTZMM9S`23aywJDJsOaayaLeUM#G0#^D$yHOv5dRpY7d-htnofGSo(qN!aZUPly4 zWYw^(-E<3Hy?pZK@bKx&Cx3tU{OQ}L&)fFG0#vR}k@vB43m>Yim)y%)@V%s5$ zH^~ReVuL!_)Pe|rrwYfJ_ov5F+_xn&sMx17VFW_h+_RC zQYWy&1h@g&W!3%!+F#^E5VNOBv&oQ}S`{nFZb1la#=fUub?S2gJhAg0K7IP`_`AcW zN8i1A{;kU+w2@Ve8GNxSbMi_QyK0OvN4>Eb#9DO<2~HeEw23{V`I(-8<8$$i1Upbp zX(iyVVxKAe?LB|>2aOVgKOx;N^cwLle6pGErPPj1(oBWJnDPobq~2E}=>d}3qd@9U z`KF{4eY?zn2Z-H!G|V8hwL!J#>C9&dVo5|U4pqw`U>kITma+IOa+GB4fMuj#d+Aj% z12kUhVijVfRj+A%pK$V!pBA1wm+lw28fin77msWVyS9cZ%x$QXU+wAHJ&+&BG2FOU z6ZIp(>8bMSYS-wx_18o|N#gAN9qDS#1iahuCL^`Kg(n_-KY05nU~u12!_%CXZJy@9 zv8Jb=3iz*iUcmty@*upw7Ug*uyhLNBIE2)L(R5_|<<(^o#gBUY@h5nW{w$u>jupQ23C`1CM|&gIvhuN0*eA64pe1$D}E}Th+6}L zrIf=2Jx-3lNn0WaKvPdec#kwo?Aini^7|IJ+(1$R1uRLD(XJJw8cztLgAm ztQyXpOL7V<*nZh-zg!rO154HOUCjG`psk7qRRNbD6N_V$_}nOLjnfn~Z8C@-cOS%n zhdq&h&+JOX)*u8tZa%aMoc^BzA(tviXRdk>C&t?zqyck27$3;(8h7d!2$z zjMj!f)B)S%FJh!7yfjywE@9=A<=f(RMEK+(V>pr<75?PERFu+7oel`H3>Vl@QN<{4 z0xMy`6c3@uzKf(N-&x6X*|VM-M9tq`$=tedsQc{tox( zp}Ru*JGwL<${LvxK#7zqSG1c<;m%G$@R#7;m%;sDZ?x3}n{$+LI1o!M@l5HoXpKf_x=__JQ%pg7lI>Q~nF@*; z7#KB*_EwrLYn+L_dlhUIi4N*vik5;4=2$q+6{BE6xGZrHufEsTL=Q>~DF$4D5zREv zlsH2<4M#^CkuDKk#HE9~!@`2bOcq}kh1={Ba@nE;C>XcpEQ?Xs~}rk~@5H|eYF zmatn9;qX3(^h~2t*O3g3*#P~D9GVrC0{v@R0F^-Kk5++0GRUb89X{DV;vfKIohpl& zNx*J{Y7_Pc(iVjeOPCi$0$(N*iGE6S*sZ!N6=#+_#7(hh#^%)fM=Tk$rX+jPm~_4{f$8S9zo>`V760HI~R@r(<@O2AyLL z>`u^P|7UUJ~GwesOZSwdhT$b%24*c5@! z(buS16C?As$Sm%m;Z~rvdU*K0{{7drO`sV4Yp0Iz(DnMGwa;F0e0k7AsVYaD@n~uxTSfhj{mI745#qmk zShr1D?KGCH>wk-Mu(kuucI9A;t^X3E;wf$_I4jh(WGSKDM?&6^QAhH1Ke^g+e{0d} zbTZU>)sA&7cK#3>SMN4^23RprE)tD8SkV;p_b41tmReI-&jO5OTg71 z=kdwh_c?lN6$~h&E|HNnp-N#SGp|?{U~F04fD(RTP?o%>n%zVP7*uClJruHZd0D!qjkhqR*JrZXdu&7OoHH~d)tJ>;Mm1k+C9g`Q*;xqbZj!d?iXYTv3572OMcPXftT)+JIJrsuF-*(Z_uK;P{bk;@3H0$2xG0C(EF|stf@} zI4)DEq%ow5IV!;*nJyTyiE~eAm#I!Mm$PFyznJ|!bgf8fno>)=1nC00(GxtVS8 zmm%s%+=!)|jP*>Ywoh)Q@$>Miu$eS94wt|zA^~6uw7~=}$60MrRYksuSyL6Ek(0x9 zcfbxlWDyQsA#VVAE?!LYND2}}rurk%p{abKsw+SFlvap_|KDZ@1?p&Nx6^Dq)|K`*hbKhEj9cYML(LAni{LQj9$v!dK$% z#dJ*jNh$_H_rwdSI%UiuCL2<$B7&hQ`A9HG;nkefZ6y+i=q3U>Gfd*5+*awueJgiH zR+NEqjP*sX3`UYN_tC{1Xu3py7m+0sB)uxhO+6>cKp5;SEZh*=Wq3ik6ISks#tA`e z+ttZDTa}6-?f>_Y*&D}iooa|?wnXJ2a%MSb3il5uNG1{uWoj;1Y#Od1LeTAD%JLy5 zZHgy~jr8n88!?&!(KH7$^$boqX9Q8jEvNWolG;|KOy`Oga*GKy*;yi*jE<-d$~n~_ z!bmu|U)bltHv{2$?7u!h#4XhZ;j1|r9V#@KS5e%mi3Si`>OhTQ7a{yHVJoa<5=J21 zsHn*uZ&4GYZYrO=kG7Bb1W@es$(H7vy#B5 zx~A>8_zno{sp4CUO9a(d_D(}+jCX(4-WD3G*p5fqL5%o1k#)cv) z_2^!mCs8iCv0q{KXvxa^n6IMIR(cW+j}E#L!O%dFkd<3`NuUE?G_?d6)&a&V{ZX+3c_ilo=DtlcjE}v&;HwQ7#IkLiw zIEO36Zk~f^-!uBO?|5a(*z4O)!--IX9+GA-2(oMtb}AHCaOti@YO2EUrrsi*|yLjccO_wYQ7S zNJ6bc{jG&=vYjLr9Z2G@N1()Dbl49e)%h%Xw^oTnbKU9--_v^uTuJ?|TVR`=G1%F5 zxdvCZ)eL$DdKk6MulM2gtkHq(E2V<6o$j!gawLf$aB|`Hz9}e5m`C4>~&?S!2s4O=oXT2abJba7yNF9$1Uz1TnB2FyGBg_K9VSg za)qcUO4(u`H<FR;Ha()|I6DwP0&5M(I_ec3!X(Pbd*@#TK8WsvjmU6 z?UtUSKQzlZItZP)IZIbI1Hx^{`)jTm4~cc26Pmc=WTgsEQg8)NkGMRp>RLaV%+p+_ zm1#bJ&lh~s){dX)$tOxo17@3CD7%m=2O) zT<+wCSD`e@Z9`=ml?6(^Y2iOo+^?-=C6h)q2i)F7a11!Vk6U)p_r7{-NF zlF940ro1Nds;FGCTNFZmOArsN*d#bf(BUA6qx%Th!U?eAK4Ribwk^5THfzb8?TzSolgrrN}*g(h}K9jKQ|R|PfOfse*`4`4(u<3&&L ze%#HMt0h*|878ac9iX?KJjj6B<#8$@na(xPEKvQBBO*Cxz*_uKM}R;1?gcIcI{5@- zCmkCfpJnkTOCvHpbi!CIvBytREiEuEc*Jgl5xK;BRETYtJj&#`ZVPS_@`eT}x1}nX zR`<=hrbczO-BH8IRz@l11ZZcOQ!9an%J{*4dT2vTZIP*Xh@VD7Um&ZIP##DWPor(4 z!LqeJAjN+HqR`tQE?n{QE?OIP>><1T(FV~%4e=RQ&59SCNeS7}X@o3Z;)-c0F(T=) z@wDP5jNX4h-WDpfv;HE*oI zpwgzaE{GLOA{J~BvCmQmS7XP0cYQ7HpQ>GLs$Tgy;7m(U{_ii;_fi(yxt*+=X%Ng@ z)1t9rH=2RP1bpGXL>o!RBP`31L+uc~meKD=a9f3$3JyX`d$Vc$A{)Se4eW8&PJpu^ zhG5o5XP@K;jgjBlynL~VQCi!bJ#SqMF^c4&$0KUpMi=&3>|G#*Txe^&_0>g2t+j-2 z!^`w`R(-vRX*ITje^&#$-?~+H?A)KA*rb>G?;ad~d=sm*U zg^Jct=5;sE^srGEo9?^2*z6aC_dj6fz}2RiCf!fx;?u!=kAulp=dR~cNafSP{9O(v zbHR_|Twb+@hfuJZS7yoWkxsp(#B^Y^#<*QUp z)^leVdfYnu2=iRm=BP4$gO=u-J>>cu$<)`6_A@fEGNc$MCe=#}HJDwPzA}=rJt_lz z-6WkGZRDb?YYufi2^#aG45;qt%SL4Yzg4AwP#fp z_VLZ~PSF5yK#spb1&w+T6pKcsp;zF*ib{N#wq*QjF$*`7kQ2a+BLCTV&)}W;6_@Bam z6%=jZLk&jvH9A$1(Zt&>X12>%gUk9|E=Ro>g@_-mcUO_M1k0_}Z>?5ZR;c+Vq$ygf zn|H7wWqIp1?yRZ)uqU@GiBD*MlvF!5VM`aWIN=;O0Y z^jgjh7qjJ{i@9>$;Hp->4z@TnfG%2WaC8a(_FI!)*miYXbko>2LI-d(Vi*%!5}7VK zSqVXg4vdkj-5P<x{;Xgy(!VO*tR~dJqPxRRugGFEqt10!v1$*4_xqiDx|u`NZL>UFr|bHgH4&$Y5@cvy zWsFtLbnPKAr>cLAt<5*v+N+Khz0D1Jo0HfkoVMH8FB;8mAIc(6I`idn8I^fF>3%IP z{&+W{@`&8nmDuc+{8zmZy;oZI8_|1p{PAx@|Eg?oBjz8TZNA@)NG$F{T!`&Q=#O|G z+DEMa;U%4q?>g+rWztfPHmEx_IrRaKH}Lvr<5LGoCSxp$Q11SEu|EfH=e<|0N5tlBa#m1$>b zKB4S}EV!c|+SOHG9^2LN7@rprUa0oVb~@X}YI#_qfNE|Mws1NVT&XSFr*?)oRa|2{ z;cmEM5c&6{+$y#coMZGQ7cDRa$6y_%(J<)k6MV{Pg3*J~MTi(g0s$jEKckXd1hp;& zQ|+o{(PTw+5zgT|1q@A?K30`ahQmsAX&FL3vmlnZN~EfajqpS?zd}}d8sbRbrDiIHjO`~*%Q10b9K?Y|Lg6+U?v5bgQuN`B4rOGO_yUiU_O$)VG zOD;*eT&79GmXL>23d=GKUWoXUy1Xkw3{CR1D0r)SSgMlXXt<1(#wQ{ZnjS%)$;$HN z66Ju@L_{S?Ph6`E$7O2hngXhYLJk~MFmMnyuwZNzT2{3V9qV54AUXEk<}7o>obAmC zf_Cqle(-<#k2@CQ6}LKkWxn6-_w96yQ3Gn?Au~JNWdc<~gfDSalYf{>oIOGEGj%%& z&RL@(2G7EHQE+T9wIwjzCcB$aqnuPQRW`*y6;b&gT*|_fEA}s*<&>5le}DlC3Q#xr zWUSL^Lt5HPPWL;FS`yA+|4j(FR}Aji=*k$;T&tZ45~G~hVX<1mLl1%;CQ|jKc1_>s zMMqF0JB${mSGjK8%qAOj7pK^7%5tiwzYXm~l6p4JAfV(O{KrMKCt*fa>@YnKXwcLc zA;}E_P((P^oG#D)sQW!bn7g>;QiO+4q8PPp{dE%@s3Pi8&X}|5s1eCjEWU@$_R^RT zNGt>Ruc++#a@Xk8k_(j%@hPp|6P$bBJ*4^NecrKlBITW2Ah?%-^d5P$<)T55jnp`! zQ`n!g5sfFBk0hjKhfCYY3B}5qT$K%x`s%b)AtRTvsi@EAz@awGp6f+(dPZlK5KXjZ zmqe%Z2AxgoAj&c52V5?X&?gPANZ^a}qJZph1Qe%Spozd20x)f*B?f zyv5TzKfJXqn-3#vmVkAh0uj>ay)p^(u6PsndKA0DC*3mdG{=5ByH(5of#q(8eX54^ zxMQyPgRZt3gURZ*o9FNofN8qQ6_Qj=F=jjJ?h=l2zji-TW)|1~q3u2!;EpIrMMhVq ztbCFe&MaV8U0@~%4rY=)ER|@uY%23b4zOyw@+#~|hSsZR$?4xFXPfgWc@@Odw^WA3 z)e$yfUw)P~8>z}ov$7AuD>xznzyzJawwrC3r}->_DjsHqR&1eVp1|AIE?cby=4*6(Vs(Wf#y z+rV0tsftRS{PfiyLpj~;iA+qDn9;1GUGeJoj+pL{PY*;T5RjYY(&PGT`d$}UCoA1< zMpSx4IGy&k_n!AhAEM4eYi!JVIi||Hu9}&vBY}J-639#faIM%9~YIv5->xFXK z3Joy`UZU$(Q^s{v6@e=wTUT0!2J|e=52>OoRcfhrjr>v<;f0nbA({+O1M!w{nGKy< zK*B{kE#_>fio49_c((?>sqy=UzQHZh`37me8#ccey59*EaF2ls7ALu7w2slas?&Pk zSPRfaH}9BFxbAQ8_F751qdUuYF-4V&DZ0kR6m4=bMgNqGiHRlAYHRm5b+W<64j-20 zO=dxqbnmrO)t(lE43Kv6J6*kNuAOd;$N`SJ97oIc@UZKitQlZuXVMz6fr2}2uBg+USh1W}a9jvQKo@I>%Mv7pWtww6ng!Lpok|KBf<%N^VgS~hif7xEBB%z$ zI4t4`RsmQ|s4QS;)x#vX8yef|RoT~8hhT4rwgT~JB~s%MH+mptbM=#V=t(r&N6QR- zF#^by+JLtYX8U7GJH+%u zm;kr446_UcJ+u&^xXHycvGtj9lE5T&OLT%Hf3dGCj&qrpQ*>kI(KhZXPDMr~gFa95 za!%ph_PCHbS7oHfrYa(kA8;k*YV5(Yr$-kCu?FT89hpXOcJSE&rBlKQ$x=*t#6mHV z0^%!lwP>rETu_0@6E|BW>?Nk0%=)<5cdO5hdVHIJ>-2yawoX>q>WZsQ^JZ9WFC+Bl zg@|Ja2hX0oT`Z-f(jeS4m!6`5Sj~&aLC?YLoJ$zU2Eww$ZKJirJ;b6dR4Y45u!e}7 z>mmy$b`Q9G#AFuXKd@kxCP*&q!2{q`W-6#w3OY)c(KHk%9flns$$>0@+=~!xLaNY< zeSlN|zfhRKIAUs2tx%Es87x?u3&tb4_i?;=c)qCAv~O^+;Q8ue!vwC^Ye)I&X0#-H zKw2gTcDy(V43Q*9e;QD^ys@+&%f0c!arQ>pKJt}!ZEa6|%IJEu_+~of2aQ6wbG-B|Bhrzus`)gU{of|ed+4d~QoMoMZ zV9y;_^JUi(#L}QwY5ldMex;uO!|GXZAkO|=y4EMH>0d`{x-p&UldAIv2w>15l(REB zZ(U?t_i)x^*_k(dQWY{i8+Acy;qqtHiQnOglR2p%(}yKu)qx0lN9uHMZ>x}7GF66` zV`Y}!TCa$lwEN;aDj#c$O-$mVT zKIaX00tXXqVhq^uCi{T*)S7Bw*Vgkl)b(#n-+y17{|5E`YelSd&@;OQNNk|ozpsLS zV@m#wDEc>`?BCc%dDM7oc|tz&1tK*!N^f3#cnNl59gAb7+ zwf1^A>+1M71kl0^I>@$am%0UiceMWT-g=CF;W{b#j~k@$8Lea|dF||zx$a{$*L||T zeX_s(3)$Z`xraX);QpuvxU)Zn_3Z`(o$CoaUCe*sVj~0KjTr%N$Pjq-$z1pcHW%KM z*!jn>5h}w&!?|xXA+9kaw%_lyG`X{I6Pu#4C9bLJ-o?~N?U0>O-|h$~cQAX+Ni>7t zaa^@0%CB$nSCz{2_JbH1r_rJeT_fY~ZF~F!L^wGc*54$m?w@P5Y?l!`NPFHpTm^D< zy~(>+Fx8Ku$Gy=9x^|?4Ml0SY3+SKI0{SN~Yib~;F4oTtg#C^j@|w~q;Z8Njp_udE z2`r*3id6&S>%Hw0X4Pk#txmQXY)00VTeeuz-qRA?kr%(e@%Vid5Qn8~l&+_yw!PQI zD83<@*GFs*-&E%RlttIUaCejFPn)N?RbZb!<-DyiyH(hEbk;G^>nz-`u2=MdxcDZ# zORFFogFam!@aZ~WPa6R}T@U2xDBN5E(?WW} z4Sf-25B|crnDz`o;&{za9lhm{$7T%~ zzsKbW`)j#7FLHAXaA(21n=$G}Y)M^hO0CFm>vJ~O*q3g`&eU$%xFK_s`ni3Zj^*!? zadJ(&(+$|4u4RX+GM|q1@Vc9^x|y@y&#YyMX&aQlyIE`3d)S>E+f#SJeS@5b>j1EA ze1N)3{A&zP9qcmQ?K9o_bPKh7nA$g;6t2z9IUBH|Zi#MHInF1+`IHq9d79hnocz}{ zfv&@pH&2;s@d9nm&#uqQI-2P{R;kU>=QcD*-Kb&eCJaMkw=6ylWLL5OY;CfHt`!MXaQAh#au62*zVSLGqs&ufoKUN! zEj__@fW#77xQK7fW89 z#Aj3?s)*74JPEUK5|@{{BG*wA1>c2}Q!KXjZM48DQG=j}Cc)j|9dCL10u5FZu}Yy7 zLVX@Vmq0N+5=*L4Fz8*Fpn7fAI0=3OP8>XX^r+#}JKj&f^nUt{zukK^n6+LKJizn# zmtZfrkADFJf3g2R2QS{dc=u%g_5PECu>jupB@e|O*PD;{bY*PymB5FSWR#cZ0}ve?b>PHRdE~17}wzulMwuNKlt|P zv;8;Ek2R%?*4V4~fU*$Myl1^Omlf?q0>`N*C#AF6vF?tR?Zu6rbTKNnCco8;;7Er} z=SP*ljIoSf8Wc;c0!SqW(=rGbNLQw`wknHR1Srwz5}eckzEkF5Qp}K{jpL*k2EZ(( zl43fUtgvG`+{s}5`EJo$dI>+Kt)Y0vYi!W>qRSY7q3&XQwz^-7)v`yQvYQ1S z_O$U{huweBEihNR;P-Wk)CIz)7iwr4a#)gC}CgQ>~`tUt!I|C0|(er$L}fqXH}1;{m{a z#u3%61jQUC2c52R=&`?!&@J~A-AeFFRbZf{rePrE)X0$6-G5PUd3RWeC)DO`)iyPQ z_j;x1iSHoQ$-GKZ9sMPIT3dr@$B(zIUYo4s6 zr+K}2cZ*`y!i>~zwDT*U4rjBYQ5We1<+Eered|s)@49J}y~gKL+g?Xr$$@IL0Y3!B z`r}W*cr}AwRM?}5FPNu`DT{?%>-a1#;&Q}H7X+4gQ7z*}kDtd;wx6?csR{ z>RsN}6s;l;j9h=aBPa4X%#B-(N_P{`{K4Z?F28lYPP^31WYH7-;U z6z5Tt)lyI}K0x9H>KbU(f4@E*1ji~jwG85o-hh!VXDs4;4@<+Jh4F&K#pd{}n$v$a zKtk=e#W(>uBtAcH1H9s|wXhh}QexN(;BBaKgfwy(v=AO@8pwFI8g29^wS)AVvbwgP zr%v-fxz_B7C#z^pJ&JbR8PD?|z$M+@(IbZKYMJ4QwobbX#ZeJ$7v71oOw*%X1NBaj zK2It}>6;WTy2p3u;2ag%;TI#}`wxuD-7&!9pOc@oSpY|oE#gx7cWg3W7pt)W-M*hx z`#$L-pLK{w=*j>)rF=XT3q#dy{#%RFd;_ZTL?+_pg?or1!y+XU(>$g-xfr47cS(kx zVqFE;&FHKbG$ z)_XsVS_b%|{UAnbHr%@K)z6MJT%3nla2}U)ZH66JJO$SguI$;PqOFBm^5fSRun}y1 zgWw-MK0P;(J9$beM>Auo#WBir9cMt=h$5e$LO`OCY-^2V%O7}f=25K5wL)N>jeUl= z-)OFysX!Z>Pxm`6NzMlPU>w1?BQlz!^DK20p9*d1?Yn)ufwsKDWsdMSs$-I3Kw+ae zjBV5oVfDJS!$N0XgVMR$+VW~4zO_KIhqDwX4OSdE_2AvNGq({ff=`b(P2M zZQbfm>v&pIsRLP;(OR4J5#CkkwNBD}87^qNbj)$1gLxE^W92f4kmuO9Z3fC?F;dOQ zwvmd=#%;E)wAn?-_N?#9^+t<X29CIuYJ!@jf*`ZB}I13CcIi#-6ov)I| z^u7*HgQqLT4-8p4Tv1})02kt+9L;%L1Bx)wb(zWI3v_tzh(69F+^P=zFs5&P1JNXm zP4S?8RHvsiuG5{FMmFk{wWAuVu@71UY0flNBTHJJ+GCX^lGRa*dCN1{;{t8pyReKC z52%Zdn=Oa4I4|I6N9JhTk(71Ho!dO7op5z%>LAdet{$>=sn){`Zr@&btm}&|vHhKd z=-apFp7!UPwSQINwQ!fu6Ha5J=&tZQyd-)paMn5`!C_Pj^4av<08s6lbO*jjyojzY zS6b-(^|S8!q9)D}r+pr1=EImJi^O}_Yb?WUOC-WY*&q=5c|}sGhB@D0h2~vWXujzR z%{#2nyyFVZeJeEIV1+cVOd5Hm51xM!h50ZzDx<6*>Rg@7wQ~tY&}Di?1_(u-U$75q zZNP~J?Z*zBc#~R+C~7Uy35@B?c2W@ViIb11jQ_i%jUeU zIu9C>3)!bo^&ix^+pIb5@b>L^^a-`8H7wgXs%uVaS7@Z6i>HK?*b~1L#+)pGPZwk# z+YCEtJ-D{|+1~D$YVbZVMY33(2F7WAogS^x>_5+3{1HP1)g!@?%F--L^KzAdUK&qm zK~@ALtT@g?w1EPdtWTqOnoPp1SS=`;xYRE)rf4}&F;Za#qE=Xt)iQ(&o1hy; zK($4xS}CHOf`L%U9RptknJp{|YK1MmG0Y<@)0_f^g7Io`3S6!@tp#B2mn_*8AnXk& zBt*R#6bTG;o|YVC1kyv$yM-t4`{?pkADdNeoZrLEk_at}hpQ5thlo8giL7;vr^DblMetX= z8}!}`Nd}Jw5~D?XB6Eog9Jy+OZxAeG1B(FvrYm5e=kq9Ww;Gm^!rrH6C>vI3?mKRp{d8QG_ph9 z0sIArhdV`6)9MZr3=j}S|KobXCoqIEU~>j;>Hwpb;LmN|;w+5uH0qdr1JtvElMFP0 zjrRK0#Xq*E!u~lT5_N2W{khg!^wo0f50lDMY`FVK0kx z$qgA&W)}&^V25N;<8%gGXtJoo8q?sS=>Rtxh6aTA>igh4*R9xR;bax&A&?a)jll~! zJ)FG+ujzvlGnvjpb0%P&vb6aB?7ew=)K->1K7aEnggsAFWy%F63F)?h#4PE!!;%LG zJ@e(q*m9L@D^y7pNoC^(zxUr+?;>5P$_q()2A%}$D(SB0o_p5MDN~#g=!`kO#G&0K z{7WhbGLHjT>?od6ilb#Q`+5HUeUi-ZB{b*Ba-~Sl2M6hBJ|P1-dda5f+9I1wJWa=? znZ$7poEzzw=^n=)JweN1nGYOxZaD&MK$&Mw2&HP&vw2nD>*wU6m;eFsKA}QR$0Fen z!u9>rb&BugesCHT6JS#7e#}qM8#f>m(vimJ;{n)DV2r#_;{j7FdZ7;HK!gc#e?u~Q zo;c8OAMO*g&9GSbqlW2m$RD(Rl3?--EPUl0F#PT&-A)(_4~H4gN|{GuWjL4@HroZ0 zS&-A|>zEdh2}jf)0>j2`1ciROG~)FpH*iR~3Gk zg3ME~wGAj5C4Z5ohx0yoy&dHpG{<7%tkFP&LBp51RF_u2AB z?L18(`qqPvFnNz8)z93O!~uZ8;m)QUYHyh9PzjMuWyp~p z65}FI6bMqPI|N7L)Bbl4qNY=|W58RTR26X8Owkx;=LCF$Cf$zPAJnd`QKjNWC`I7D zwa~&=!U~LtrwSd{5`TkAqthHN_|VT(48%-SLqmi7rVWzlS(I-LM4JeK*QJ2CC3qc1EmK6#9 zA_*dT*Xq?NPFlFzy7EyRCU2Sao5<=8f#SD`I8ptTd=n+%@`iAWCB)4FN}L>ndXI-m#n< zM4|9@ZVyTOALxbjZV=zFK2SM9dmXIuj0=~w1lRH{0>pCD(l!!I7JUcwvKjT9yCvGM z;hN9EBsUXB?!D+T*p7iWZRR{A``<9t?KqfMf zKRci<9>$YbXs>8s{^%dzdPDWDzhsQBUR%BMw%KdSg4o3xD^Od~>vmENd)~P^dzKf; z6Uq3;PPHR54mUTcxnE^cy^K#@Cgprm^<U>^o!jCD&)tw_k$>z&Z<+~UABLq+A&TJVl-4W)tIQaakpO!!r&nU zL;-JmNl+B;hlHFw&9lSp@ffs+*3gmevBp_Q(=wJB#fvbQMR>qLsU3%KAh1C+Ik1v# z&A7l*$ER656+;p0tt}W6GMGmKN5zI!KllZqCGuignm`rfn_!Tv2GB(cLQkBXHsCFy z@9F%OdU&^s!#O@+&aWEibcGZo%Q04($)h1gLSdHOTUOY;`FatD2WX%3m!pBN)Zjpk zNz_9MN2Koc8cla2YBX5ic@Z}1-Q8?X&cWSq#=H#Go9ApQ|44Q81t-Ekwq-m`@DnsX zljF|9q#*MS)9jRK>e;tx8y}ffo1A*?WhM)9 zv6zO;!=uxu$#F9Ia){1xh`68n64G1HOgbeq{rNT~w1lu6jO{>c!%k}JIF5B8VZ_zt z<(jm#{+;$i&5mh*+HqlBLyZG}p>w?`h^v0=2LgTW53DXwUGF)R@gTZAynWCo`%6>M z!jBvCym$YS5?D~EYmS;xNlFT6!I;Vlg%LU#2mw=zarT?L-)L@2ETN@CnL=`YY;bJULqg>I7PI=m?3+^xjVoqMs5h zV)Q0WPVW6QkhU?S>4d-V^haYFI0?Vj!*9a&X!A(Fc`n@<_5YNs`oB)K{0xM$KpDLX z+Nn2xK~nnoeVQF5MOr=1M`xi~t3fC&pP^;a4U>6;d z0$MiHX$S+`9ZeIQn$fABB8KDbfSQeXc*12d2JjFX0#3U7X8S2DBD~Z1FwlneOaO~* zPeW34aUYaS^<@ctVJCM~9_8~1qT!O$&CSq;dk0?=Ca{X@a%NC-gG>O0ASXZ#W459x zZj@2gt0UO(5&XZ8@jqf$$2xT-OX?NLR(>ojuWv%pn6Zg$-J;pS#Wu%dNwH}tf?@0# zM(iFqqCLjj6*j`nig-B9q+n|zL3T`Y=(6l&_l@NY(Gii1Jn#s|b|Hdt=;^)`k=2NdA#*n9_0U>@s>Q&*KjR2Wo{xNZe8wT)6pW}3!YHIl%lrP>z#)xHdgimBes|N< z76*Wzq$Ndh$@jHk(25MeUzn58v&_VLE{U4;;Vb7W-u#e+CWf4RZ`L$89?B>fCmcz{BE6Gop?{=rW}9ciA-D8n zLSH+x-0^B@ttKGq@xf}XzX$KCQ;zS5ZD(Nh?K0;d{x9hwz`P{9`=Hg5EAE<=v#Ua! zWEefqt7Ov?)lj~XuzZZlN6Ixp@=i#XYs{Vj?A83%3l_lG#`CQ9m(%bxHx)|N@OwK`hT<=$C?>NM|xXDY> zpLVd-3_GP@Q~n+!P7NGM;A@Ih>^C9sk2z-1#22^;LyhPQVvaniPoIP&MT9yIL|C}K z{Pq$e4rZgAB3bXBFa}}lobNAd+`7g#rK@A5yV%uJP#8w1$_4POqHF;JqEsbhqjVq% z3&M>lEa4+6r|x_bF=4Gu3^kbE*s~k+D^waTGNJ@5ZjHN6bV`&p;t=NZqFwZ84M?hDVNO*jgq|gJUiRJd{Dv}3sG);3r)3_O~0*?xH z-yUiqPkidoH`J*4|9*YkL-=)a>OX4L13w*QO~ScnAud+K4cI!ncMB&`Bb|g!l@cep z9Ee|(>V`!31!X&+H5-;`$0Jr1ee1?$=3WlNN=s8^blBDg>}@hRh=h-Ue9$u-r!NDA z#~8`N{A$(+JD^u7zZB^Nhm0BST&giVl;{ zSSGYx?3-rxrTz)4O-#D6E^A78`iIC_2bkhcN%Hm)V=ys}EBL9XI3b=K#XKKMprRAR zW2T&19yG8NV=tjm8m^FwSprTuNBNKqAHFSePzmtec^Myy+~Z;~5d4F<&BYpsurg9w zz==X*>$L^7FhBvxG$+iSf&%Jmupfq+L&uDd7#)9~vEyLi)NrDjbwRCJ&h`dh##_ma z--owYQatG%lSZCF`W8&QKBJs+}_IPltx@uUOU?+EH`6> zGL=!zA)NTPzb~UKFPs=jq#>g$Eu7TkDqlwF6i$AiJpY)QbTYWa^28Okk-y?0L+K7r zC=42em(q=zkj6JZ^TpmcdKbCcaSqFx4crTx${b$iYHp1F|K#P|+`|i9&*s=(?pFTU z$;sAh`C;0)nEA&ywL7{ol?AtSbLyY#p5|Kw&HjVHDBEo`S9cXtCC#vjjZ6~ylB0cK zXZ?#^;g`CbyKm<1d%1oqx82EKF5)j2@gH~*hfWQeAb&!lepMlCAE_L0goeYRp;}Jq z=kKFwd06|}u^3oO0dr5MVbej-bRdoMF-4$?_xgNv>Ic_fhYxiD&uYB7eI@6iuoP7{kSY$ee5UMM9Ej3>$Z z*Ug)3NiCgR9owFnnK}9`^2_EDHi+vBoE%mb35p@UwE}kU%>tpwm4|{Rhd+VI;){s% zMMM%2=|b#vniPjVbA6+H!soJYu8zxk4)@=Q?LNbK_FSOz<(ckFqI##K07d*Fb>={g z zgn|eM{hbqV42Bs=`gIhubH?&~jsXA0vJ9fGIN&Q-qy^!`&3NTNdO%=VWw;CS1unC` zHX6nRb(WOfxOk0uw1%1Hlkpp7IB$&1v4B77EAD4jT)EQR3x9E?kAWG%<<|KBc05{x z68^wgG;f>b{_EsTdgXP5qxlzHGmvZ4D419)rMM{1C-#65j#CWzFqfsNG~|bsxq)y9 z1AsedAr(x@4v1$gC~90c34so3OOYI4yty_`ZLyekoQ{%pN(So6U&gL+#G%#k5CcGb zdf&vRXgpGan!?XDw;8^?ZVf*0+a{3}JS(Xcwbm%9LiYc%o8T<{zy`wkC`E)2k@?1N zjX1;__EI;3%Pnzl*5IyT|Euui8Et@!$Ny@3f^bbnwX~|}D4%0R5UxGp#22LpQZE8) zqRco>U#bBp@|_&=GX_!VDyV)Zy;qviE%nLcU6fabxYgrQq+G#4I zZkmd0&bWxHT2;?}ihZ~(wPeu1Cf_hNBQ5fA#u?EoSWS*fAxRCbYQ;QaErn>s#(H#Y zt7dLtj; zr_eG!vCSdq6E@WW0j6ivne)Y_EWGp*lMc1uPh0PRMbk!#aB#{)QzveJk;!8bn~Fpg z5}!#SzB_`f%Y0=bGI9OuxpKI5>f>W29 zf1s&F3lL_Si&ul*xxi}RFsYD;O#>DaL~635VN7sclX~Mi$jbQ?COY6sLRc5mFT3fO zf$M?+rjuf)kKh-W(Eo_n&VJO1q}V##mgPmTHm5gFosY0g^6jh5@oyproIC6P2y2Ac z1peA$Ilp$K_8%=i2qlMM7=Sg0g$v<}v`NodA;EiGq@$AS4`XRe{K?XSk)5&pYvvZ4 ztg!fJi~zLbr04^wQ^iD*e)o$Q%UtzVgknCPovna+9Bq$(g)bUGWo+6k6I59%D|Ump zjpbpnQl+%BGKf~rq8@7Wu`7I05l8IciBHI$>o9|1G6r4EKz9J@P<|q)mzm_iM`e1L z*%{o233v}WW(LQa==rak{AS^f1^ElVROS4GcLuJ4;JMj{^K>%CYB>AyuJ^G^s^$KW zgPeLdKHlg&I8?c4=~F|s?6HSDH{bWWUc7Pt zM(6j(?F}CXUTj%``(4GfsJK+;7za1{=I5wB-m`X|;xusvO<0QR3OJ36qzvO=iRoNi z*mRHJ(Lwa_#h6JNq2Xd`HHtqp`9$e6H?*~>k|@AQoM@Vspp%Y0w#QK-(7D9y36_xy z1uj|>OmRG?Lx)vt=5CCDIjiJKZ85s#IxF^wj(8Qv-V*t%w-`hzj6>$&J+w0rQ<8^4 zXXG&DbyHf72a|Y10L12cFL 1N6jySaqk4E4k>l1|51#pBuYT1rHjaJ%5 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 diff --git a/example/vendor/bundle/ruby/2.7.0/cache/escape-0.0.4.gem b/example/vendor/bundle/ruby/2.7.0/cache/escape-0.0.4.gem deleted file mode 100644 index 0152d1444f3d7426c4f191402e2398a78f666b48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9730 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 Mtib=y3Lt;_7q&CkEdT%j diff --git a/example/vendor/bundle/ruby/2.7.0/cache/ethon-0.16.0.gem b/example/vendor/bundle/ruby/2.7.0/cache/ethon-0.16.0.gem deleted file mode 100644 index 2af3d14b09f3b5f0b1b5720b510dae10336e9276..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60416 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 diff --git a/example/vendor/bundle/ruby/2.7.0/cache/ffi-1.15.5.gem b/example/vendor/bundle/ruby/2.7.0/cache/ffi-1.15.5.gem deleted file mode 100644 index a632047fd7902c498ba736b48c4fdd414523793c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 909824 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

    ahw%;P>n=Qx-9X; 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¨dp(C`|dD~8wp|TYp<^w0bViim08_0gyX%V;avEJ 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%0DK@CNu>l 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 K+XDY97Wf~>UW|GG diff --git a/example/vendor/bundle/ruby/2.7.0/cache/fourflusher-2.3.1.gem b/example/vendor/bundle/ruby/2.7.0/cache/fourflusher-2.3.1.gem deleted file mode 100644 index a1fd07505db312ee6197651b28bb1f0bef7279a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 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⩔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 O@HYZ~Bk(^5fqw%<4}n7f diff --git a/example/vendor/bundle/ruby/2.7.0/cache/httpclient-2.8.3.gem b/example/vendor/bundle/ruby/2.7.0/cache/httpclient-2.8.3.gem deleted file mode 100644 index 9c19ad46dc8c75bc64897bdd40b1546bcec6e4bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 385536 zcmeFYQ?M{F)1Y~5+qP}nwr$(CZQHhO+dk(#wmILwdoff0&0fv!Tx{QTQk`^lS0ztU zskE)Bi=m03iy@u47r_56Vfc@*u&@C9m;R6Zcg@Jk$^yX1%)rF-pFs>v>;Mdm%q%R7 z00a#Gy8`-O{kl547&`qYBzFr_Q=9+Q@ZZ}1Pxk*ixBr>kf1Cb)Y8O8m0su`yN&^UZ zR82a5n+>7wNu8mSgj3>?OE3XSVgU#?OIR5Ny8uuL1V}WNwC+Pe(yBL`;ICI$s*Qxc zcYOm)#&3VdLhpoPn(1={?#0*e68oU<8(2lt?=mnt_h1IPIMNJCYRhxqnNq;p33`oC zk&NXJlTzqH(jvQmQa?$Lsh?RbmE|0P?R`!|Jt@WyVXZ@Mp?@QM1!XC z@spAUqEs>o2lU6hw?cYH_3Y~^=$=KaY!Ib%wwwpQV!97K2$`)#ffq?iw!*>`rzYp{ zTLPL>Mv=51sH%%E`BwBZaayl}K^P0W2VwGvi(S$Vpw-$D5%>K1ju5k%5Mg?OaaFnk zgM0l47N@EYP}&)Jg<*TOuQ}XaO@cE%8Aq4m>TtU~q=&g;-zFdn}T2!fpe{eJ$4mM#lBunFXQz78|>DEn%NDJMROX`sOy9P0U?glIZur zUoNw>)7;FJ(B@|I+x}(@HO>@{3Eag6;tn}2bu>|G?{*c=b}EQv%T5jwgN^{PPo#6o zpm~QJCZs>V!Ovt~S3Jp0N*E?A(nkSIj<>PIR#;7{^FHXZhpmnv*;H$viHiQbP*n%; zrEYtLlv2#!e7Yvz0BGsUG)i(AhPSfaBn$M|^z)CYj6V-Ntis7;c+$+LMH-KMo7j_GdcTAMty{+5| zCBlaZhm)xxGd=*0S~me!;y9EQEF-|IZ}A|Hc0Q5b*yi{xdSOGO)8V z|9Ac~vornw{QrMr#r#kHU;BFMA8D-Je}6qvGI1>nR0ni0+o}T+6&(R}sI3lzKp=gt4-Io~E_Bj{LVUU-&W>!T;^c;EW9d8bJccB|8ofYtVYcl57VQMGpV{idUQ zLHpU&*xUY?y3(e~)z{aTFKH|A^>%iBqSL;l`w#AKIJ#nYFP72&Q}nP=_UV8t23ack|{Y;^I;T5N^)`%z#4-z+uYE@Syc8Pbv`%dkDG zjZ3tQD@?Q`xe;FkN^`*Ha!`Nx40@0xwTmflU%Tkiro~%ZX7r`HSh)%>%QcB_K8lid z*WhNfow~@%e%V&I&%V8OFzQ}h4a*HRarcuGC02klRJqQ84=>_a8+7QhCFB)$>Iz%O zhs&ai6}-v1S83Yf9GNg_Vq&`KN8{?}jZYqin)6_3wn@)VwW5mKV?Xa+0nY`a75i5P`Zn8> zNS8ZOjfF`7m+zB{jXTNivL93jIOJ)C0+kJ~)MvQ@Ngy2E0h!Tj1@$+Cef zTf=ypW4N}~{Q_j~E@gGuPV5%M-k)>P zB2S|>+qbZA0NUt2o29qvEgA;2m9^tN8zM_hn2pEnF&0=gM~jyMfv;(VE=B7TV++`zOMe7lQh9oLlQJ{#{qw7FF%||&c-Fj zPJlMfDRft)u$)Joxzt7q&yzQ7)IJ!5#1p?8lnhg7DePjt=?btw@XZduA7(%yqY_B@T7Q!RKuOsjcWkv#ZVDkmb;$BjlI%qn2`f!}!CrVf zJh0{@ac?AUjRY8G(+M4RGy@Ogvll=Ilc=dSkO{|*n<3AIAx5rrl?7MS0(YROLArsE zQ!*^tVly-wx9&pXL2igMn~Y|+Le!)R2!PQ+(r6*Afyb3^<{bq;Ah;9LMFIn_9U#Er z@K8yx7I9Rr6#I+7B+r4M*~Gr|c@*+85JhogQ|xXvfi1iostgkwMz;ripaLBd2!@3> zP#ajl;=02NC_o_eKJrSIAytlW!PG#RFaT-Kjmj;dy~@JLh-oJkBr=>_*@^RI`2=2M~_I%pYWfIYZsY8iK?{EC-MI(hiGU;A&K% zZ6A|vjSQYbWdA_q`<^Rdnj=-gd&A*LqwmCBMNZ;XoP%6Y*eQ{$VBX~4 zBPw0y!{8mp;0u3?!oTzZpZ8d^cypX1Ca?_9)`eQb={w{YXB=N^PD(1II|;bk0w=QG z($4Wh*q}z{yufY>9>ofw%NjxXyy7V zB*U1CEkV{ox@?V#g^!5{2$lh~Ny0m7v&=)KG>DKeMj0n3-4Q)FzDqUgkE@Lzo91H*7TdEX0UKz;aA)#QS=#yI4N>#Xg!t~Y6788`QAS^C=oedA)*ir#oPX+>|n8MdLd?zgf(XzFO(Ll!4O z09V~uZAv{b0fN-shyff&j(2ONJRvF?)QcOhD|V$#>Y!1rE?q$OFyYCv8xb7yfB|~I zb?Eyo9?+(oP4`p-NCS|i+apO-WZU7Id7A)k)^ndFE1HK`t2^H?LP7u9wFzY0YI{*j z84XOZC1#or7-U^i&<(v|w8S?hEV{!`O++U|Xxd}K1N3QaQ>#!tzuJ3;?uag0D=nYU z#EJEkCSEhc@Q-=5#2o9a`HgB8oEaFca3(1j%!~N;Cpqv0&~>vMCz|QI3v6HpXP5#5 zAh;WFXAoGu8uC?qyiHX?X3FUYs?Sor#Iuf$DdA_7j6}lbz`;oBulZSyK(fegHL*)x zPdBk^!WJ7dEix>?XH^n#9NYy!JslxYunz6FfB!U(!+2CC0VmvgpkQbDfgZ1WfI6@+|$$SZy<7#qe{ZJ81Co zdPYJkOz{kZE|}2HWYeBkv9@J{IRN{MH0rCNcm|!1G=0^cqsPB{D1*Nfq|j#+Uc*+i zhLYp+5yt)@jK+zi2eQQNo|l89@9aA!VVI+2uYz?2i+H1Q0fWqrT^yux)) zSCJ(IMu}2~UT$7UwiXnQ^(stSDAG8&rD4Px0Wb`%q|7nZkD9~nYxKG^j|68hUHciC zVApZiy2A(@5PT!i_^BP`csgbo2Sb@NiK@*sLATj%QZbb3jfmR@R9R5EKBgMZt_>|! zQ(1l}>den<{hS#7N_$|~pZ3GUKRw-D{e7AdZ?fVg8jxL&^`HLo=k8@3{weW)^!p?J zf&Z(wBs7~M7%$!)`CYV~0^!JswCxhWR*=qabuBA@(}l6&hgk9@Ywc{8?wFT9|u>bLa;iZ75G z8mx}OsBWpLwHvd{xaV7B55qNp^#2#opijHI+S+FMto@D1yRllN_=}zT0l&cy!hi>a zcs^Q0-f#6;KfvF=zL(Jz_B#IW>|cY{g?PnEjJ1BjRs*WQE(Z_^Q6J($uZwLDLzeL z1759T#r)mmx7or1dIrPEzew6&!(kELwY%{&>y>cEbL($uA4<*@w?Fjtd*JXa2@C4# ze4;;lJACBGkZW9-n)S^7pCNVb$3Ha1B8)d}9rDq7aR(^JkC8JYZ}An+<(8TnyH9g6 zlhP4#U}{#S>ynjF#^^LdZ~h^Uxhc`xvN=_st-J0mpq#`|h-{;syLwKAYl%XaTtqaG!BX12W8ms+THQphw&k5>{bcs%UK-54Xdt zpG>QF2B9uml?I2|Bl|v~Z>1O%hA?aS##pF+`k*3JJMD{$7@sB1XF_|}Z8LHki)+{v zqHG10w=7E1{ey~$38t2eH>fGezIFvH{@2NC#_%%g!K2@Gh2P6dDik{ZI4^FN z85mmP{ezi|TN~?lguT;J%u|`j9xFpl(=qLac~^rc^TH3k=G6)<3oK{TtKtS!LwmIj5=d>o=f2mwdF^X;W zd>Gzk!?7xdD6?sQlZd|@zx10V##eV!V0{DsIcQ-Y{j;mF|7$}}>O=URY7=}u`TVfw z`F}s;h7P39`z!o)H+E+Jdj9_D{=@J8<@x!K&fky!O`t9?pXbNdM$;I2BXE zx((~a={Dp4jy--})It+^xqr)B-p~1z0fF(Kgb>=mc5%sBCom>5T*wTxgHyEywF4F2 z^^o}u{?DbgZJ~HLKr^5eK~32s_w0hCJ|>Lpx)>*bv`24~47zzRtQX8+b`HT+6;032 z;ccMTsGiuB+E`MAHiyLlRcxx#9G<$M!m4Yi5NSD!i7ne?H}um} zjWaAIMGuU>CTRYeGnr-(x{S7Bo$QxBjh5QV*Qr}Pp`nJk%Y4xgoHvzH8FJX)n+S<% zLwr(z?=s;b$!@end?qh?00~C73N25=@nZp5K|6>q-^izDdZ#mKVM%OXzAbhjJMy8K z*g`vdxXIIdPkBWEXSmSz9GbJ`AM&RCf;xN2wXPvK?Z+TUn`-!97I9~>78%1|P3}#^ zdHI510nPT>?xmS)Z~f%5jMnI1{mK>q58Pt3o-?@h$+7q<_ng9eUThE6XTl2Mfrtqb zups!98Nv2VOIzqjR|}$~#Sw{LIK>lRYK~26l0|QrhD6{U`2ypPY_2pFfD%6one2;M zw2DE)ue3yJ;1r~;z+UY?BgGe^*6W~proGZMT|5V&M`R+p6(Naknd#INoNfB}Mc`e< zbt{RT0mm6UFNd#?H|_(rS#`^-joznjP{Bp{332;dEaoxhYPdyjeiA{4hILMeHj!o=-jf5HHbO29i&AO0$?rwj?4qjUzt(Du|h zK%dv=IoL$P253S#cZk>L1Huc1xt_VVNJUb2n*mr%msATlt>DHl$VT1Z<6vBWAWLIo z#S{w~qXcV6W6}h+QWBAQ%ys4PN|UQ0U+Jw+Xl-L*3Lh}<3{ph?R3Dc-7{~kG%k{GR z*J!h7YJiZzw*}3T!E2)0f9B;2;NNOM%K*T3NqQ$u`5U+M3-mu-!_=%CAT;b<5}SE| zypvT5OH0QG|MCO07G4E(dn<11Z^qF{E9~iu5g33xV*50f_YW)mrkUs)0-0Hdx&dhF zQ*&a}hO-^3HoO!rvt6eGwQm`=X5Q>Y^Op2JpDu5&gTUvGn-fm!*5WN=r&L%FbLF&) zRXZTx@muc78M+pnS7V?9vJYbMi%63eb$%x3$#;<*_@Zp+j`=a`!QxUB?UfaXyPmxw zsN&Mth>QP=vIw{xH39Yfjmic1LY+kW_r4o~q?Du)Gp3gIsZc5u*3AI97=PkH(co10pQUg=-bwa48VXr@gKj}5CCwe0gsOJr_y>SzM@CO?b`XP6_S z3FDTUf%@)*54DGrtpf3YY3wiJ;?z>&u ziE2fJ>tm^vg1|p(88!MIs5Cb?S<_w7uJu|zTOvgCaWNSGr(8=Bi5pcvLzV)X=$N5JwhGqQjqq+6~vG=r8ThHuUZ46hO_ZeyJDs+}< z7tYyau6AylgsUNo&3RnR3pT4je*JUcM?5UVpLP=x4(DUjPhE}cO#U$ml!ALL&_-V zgFjs_b2Z=(2r?%*k)#7&_)8`m;z59lbS)S}Njft)U~x!!Cl3r2rRm&=DGQ254pja& z4%NS@VmnXrHkTEf2wy!l%#04^^ej3Wzfn5_DrP7yAk+lg8*VabO#moN*1Y7Nw-i2@ z9KbSrfjuUn4QmnCc{V^j5m^N8Z4#@uq?RxcE@ea1cFj)pY}lSIXIXtb3o8U>8AKLf z4;AlT;RYzlGF~VDaT5AR#8hF!Ul%uY5TZ0LpJm&41+)%rq=`XnUX7><>r|~)T>t*s z`7Z@G-pbJ8k+Xwpq3*u6=zMrzpB6up8y+P}iS--7YC zK#7CSq&oCduTAY8NxVM!SgFo0i59(qDg}u(4Vb_KSOdIQqeHN%!3UI3nSC(@D;@jC zBHM=X`XNCsyl8qoD<^}w$}j zXUT0(z~fq_ju__?)vc;I_+c*Q|p}xX~okJI%41K1@nmOUKo}LnJeD_)c?`Xf zio>xC@UA2J#xNumojvjzhUO8;_19~?{p_7=!T9B$wHHmw5Cuv?#bcJ;d^O5BcOTq^ z2P&SwbNvUKY0*437hgLbRDcou)30+Ul?epu>se~?2D2CdRE0hC`zW^x#bE%JS2O#d z!LUc0p#dy1un_o7iKTpX*>rQ*-EZ;*>&!s`KEXs6$iKVfjG#|UXd*v?wz6$LC@3J5 z;ASGFbV3dI)7M~(*bes#?iKJc^Fw}!Yao_BC63+Xy>E{d^uGZmeWQLL?TAJAPqk+B zc#kZhIfQ5el^k+~AyAJ|B>KTePzZ&~K{f%gn*Fy_TT!$A=)EUOQBV}BQIaE~6tNt) znM^n=GzVUW3yik{L8@vt2-~o8BsVl&-%10aF(LwqGXxT0BUmF1nz|oC@29+NQHV)K z#royRs^+Ag9rStm)vLge!l$+iW69`Su~kt;taZ<;E%WXxAGI@cKl%!&gX_BE*`IU; zdL>UHA=gj=h6EU|k>p%s{MCCFUuK64fjM6cfHVd9kRjt0bUDK@`c&kVYXlQC6r-B9 za7K>mdAg?vz?1c!B)NFds!Q!P3($D?kWNnSArQcRGJjJoMB&(Mt0h)uXmqZ{%rFGF z6c7hwMi#|&X?0RpuouIb;Su6hj*CeCy#xbnh0ga+i?0F zucc)P;)DV*4UgfFI9{e|NeG2_E3&H+X`f_VuA` z88RpqjHLja$p9D*D&~2eV-*wX8OV2#rfOF<$7)Iy#i7ELNizepez4nPz!Q&&Hn2|8 z!&KnywwVNC5Fjs*HBA}f64{jm9gDVlA*%usgfHza@^U#ry* zlqBR)jJjYxX_jL@C&>Yj$&`>=)DpD^Tkr&IN%rQV*2)>m(Qa!^uw@{ah$}Pp zkZ-Er4AHQMG)27Qg*ZB^*5%&in6bK-l=Q(~UiQ6et^ng|NEtqUA+PFCV;PAmf)W8Y znNJP2#n$)P`5qt?M!fW#+vGAV-c(0~My|$&m?9>8R~`$Pu^eP629bVWm3Vn1DowX2jOD1dsh0K}(^^WV>-!e6Xh1P?LB%^)81~5%t_+>Re0Piw zF;%{8s;&AQ(cn7D|-U`orLJq>`yy#Z`&qk{%>-&{><2)RI0R79}Vo>H zFRRpD6EH`nTiK!7b5R2rEU{|SmLLo@?gR3+*`NqAGsPz2$jp|TjQV5D?V6;oGV-*3>bB*^X z#XK?&n?(|>^!cI3c1arwR96<~01FL#s9dz_j6-cxR>G7Y+i58_7wlhuDJ$ukVCw$x z-cj`)FRq%;@2w`YQ32#o@L<$yr)Jp2%2v-@DUu|5!LR3mg|wT4Sp?H3bXY@jM>5hz+y4P9|1Wp zAzaiY>MJmzonkMy2{=Gzx4{bSSMRCa&J=S^XNhQkTC~>8%DvO5DLe07bQuL0)^x+$ z_mOfsFiI2}WE*ocSxtET=pmjKuc1*ciC30@?#bNv(?V~47OSa4zviw{2JB8f2uXLO zReP%_y>LAc*K4~2DHi$s*8U8%H{OL~K|(sPXQu)8DrWa;RC_&dMRr5jPC>JP^~C}i z+GHG-h<^3uR)CH(P&KCY7xG2}dOfzB&PuXi+MRKJVk9QFkHZ+rSLj-C^|~EZDw@Fo zW;n;bUqF`#*&|M1VOC4NIGK;YX%=b*5a5HJY~K*{2b6P;vOfJKKztkXn8B?1QM=o~ zg;bIheN#oLMHi;JuCB$_IxrIyY+PR;Y8ibZ8=Wj-FOiEF1$&XZ35^x2IzUy&KT0vi zpfytaE8Jjum>vnUB3N#J5i@wTg@0*Yi8kCJJ@6h-4TABC0ey#JxR($`GCp;g3kd@EJcV! zWj?J96ZZX$Af6ayT1XE(Z@MIMOy&{O~B~T`aKEHOxA?t-%_3wr@n=>w_d~#h$-NaF9_P5gHs!J-o*H_)a2|~Hd*&~nyN3!=iwDl2W3Bz-E^)j<*AF9)8Jx)N zLk{N=;GYkVrXqU=68e-nuO;h2~tEgi_G)aqqp;23upG zKA!OhQAi!$7Dp{vY<}f+V4JS3uk+xblD@E7gR*j#pxZI()`En4Dj9-ub;atDnuK3k zLa@d-&eOsAPJ|jll13sHBf-H`$I@x%MHUS>Db{0mQK}4HYXxxzr_HI|;{jX*#>hQ- znNWufmnqj|!7utDGa=o(8y{)=sGURYDhWMGv3!NuLG!%sscTTey$j=yB{jnTJuObs z_-jRt@0l_+#@Cj5eCsB4hPq{zb6%s(Pk{*>9m7}3N3idaqR0$yh5wSG|J{dDk3&7s z}=?^qph ziJ-@ax1cWJaB|KFP3`jZNyABh@0TX5cvB-{&g(noe%VyS=NKYBL(Prnb~z+d-ZyUd zlLiXsu4Oe!?5vrpE++u{9>s2$1sk+U(T)zNWXU1RO(w-X;f2)#dhdI{kHV|4$z^tLw9ad{eBxo zssJW0X8xN;+=m@CEe15s_C6Bwzz##UAtBjj3R_GEZH@*qayxShGRv_Q7OP5m8WIVu z(o7nI4`NdfWV~iZ<;U^0fgQ6bSm^LXFS#utO zsbCS$ll1SH{p@1rqEw-WA6)YuD&>@+X29;6)Ay(6RX88K4LMXucv31h>?{_+Dy+Fs zr+=($ldVHA9|p^))f|xNpAr!JF)#F~rV3GFI52S)B@Vd@mgO-1R#0ESnK*PT=neEH zq2nBk=O>ApU-=zd(Qj2n-f&q4X#R8!B2Qn^4iE27*8A5z;Fi`{+CpZUuRWd5CrkUP z{_`%GeJ0{$r?6@W2fmu}u%a3!l7&2pT z9W)Zlu>zh`_RSL`I1B5YSXTNpgt^NZj3gD-rq}@)T^gY<)oN<4i1rJVh8tO3(GYVq zovg{wHGVMQ1Io-Ol*F6LO#4fPgul0(}_glVFj89ST>f6iI^!j&SOSfzaT-6>{|1 z7(TkNZDjn-TRlNQGxQ$~=rcNO(l9@w;EE5<9ehb7{g;+6u_DQ`ij6uW&O0KB;xs0g zW-{!;Lt4zPgz6+pHiw_tdVm>hpWyJvQf4&>^xFszVkjoHXer7OV=}-ZT@O7`q9i^n zf>W2-unX#!X$q1*L1$Se>LBwws*%BRh>~LRVM8TJw(EN&<6aKIkBOori)>-<`#CI1 z2I?E4k?1L%P^H(pUp)vuSeo^ce#sM!U9Hr)Z|r~mN;Df07ov9bwKj^@e9- z)yC#vl<}OV%UC^cJt9y<(X;n28hqytd-eMe{i6PxJ(wsNE94Wrj?*B5LQ{f6H3boN zQicB21-4ZpZi=n9cB6UWLlQPwh|LG^(NriCVUc+-GjT7hxAMGR+oyOaV2b_4rIhj2 zZ)8@L%`Yc{+;frY&&0H+*k4-~O}M*jI4#MYXO_yf-&L&F-Ho(^H->hC)G$Dke+$-4 z@6gv^uU<4?STzEus4{Iq`(`L+UBbf>h{X_w#h4OICW;CvAwA1mUMA{wkT zUQg@MJ=~uCdqjS=#qN|s3%Am+7qks7d|afH>)O)Rn_#J&Mk(y)yg^3CRUu9@1f02O zCGoEdMQOmMfA^FM71%+|Kk;Q{me;y%@|Oxc@S;SzZro2XB<2Ipb#|5JCS zSf{5)L61ApEIrC@)Nq%DcK+jDq(sEFe)UXAx#$fcOpIFzm0q3-bYk(thd`& zw39xCt|9{4deVx~QCL#2+C-UO$ZS30;z@#m%3{ZLb~H=Aa?t7DvLVA&5JPjK9+g;3 z#zLpk6D5wfxBwG|DHWpQ#V{>lM|evr`RFpb<2kl2h&UlWOp=Ik55y)sF0&DvX|*Gh zy@}2E8boL?r#sW%s@{4%y%l5e)m9ziIfN&JRSw?Wopr+9DM7;e-8~;d4K<}GMS2TD zXHw$eZBnVHjAN@w2JbS<=HbI(@~Qn9(cL_@a-o#s5l9Fn5r_@D{~a#Z2H(Tpg676+ z0y}K@4vqlN{*}FWlqrmNnoFww^w2^B;FlqFqJ4bNtz%959LTidSD}{BE9)QXbWf^! z(C`1u6gw0h>|brh_*?XQf4W%i|9qbs0?&+mU%u8eVG6k{-d7U-{btXt?-%_yVVSRr z)K`G>&3yg(;Qw9{ug~}okn}j;U~5%`g}!LhUO}r*Nb`d{16Cg^550W2zRxF{=$UnD zmVdbNnUu)OQB1Fr<^{i6{Zi_Wr1=3y6)roj{Yp>2(D?^>CN#WrbR2AiK~@X8?yKeb}@hHr_@uyY(BZWnW=&5RD&TjG#^P$DVD7|BH!oJ z3>3pmy^UrGqIzwIVro>Mc-RwZX~*o_Dan4y@iJr$Thv*DiVb6m^Ux>_)dT62R%CcA z6)v&vpVX?pc|3T{Ao$!Z0pM@S!9~vAL)meZC0^v#S zUJIGgsea=ZBq9II!B4%D?6)4!P5S5U6IjpQ$5{|c$vjjzztB6!yp9Tp0kWhZ{a z-mxPoctP!lFDva%*wO)i2$PKkS zgYbW9Tu{ZS3d10=wg&?(WAT`5Ah0QMCamIf3~9x1uc*`rr9nHf9)bK5T!sOK1GcLELRsZA@bTr-&~T<( zWE2(|mz4DF+(0}v8#1{Rep@s;P^|*0Ng*E#ZAkKSQm6nw?Gt*sT&CAt6#=*p3trwW&^jF zl|zG|eN)5~wCeCuqG8XXfjGr+e)OR6nP}|}X*@W|%9ye~3)pLDTuL{Q9rUS1X?v+i zS^X({F;pZVm5s?HP)ho09_kQiGswN$yR1T+j?7@_{UN<+;h8Rb5)fBtqYTu6j;CVS z+2Is>gPgo=01f~$)`eJFv=VM1^nPDBUgvs&X8Pi-P0}x}lrOfHFC;o&$b3I$IavAc zH!_;B4|5({I50Wv_c^NC?7#PS;rvhbA7^ZS2QXpw>u=?WLNvUGxNIb<>hTENGe!pt zF@r1rL~J%e?w(twOtcK^k1>BTA>#)ol4=nq=8GuMsL`NB;^U<1ha(N8FkXRsz92kMzJ2p zNV7uYkw(I&bNI!|vF40O1)4HqgjMIWSH_kl8_+(#=wAzG6-`J{^2_N4563^F$2UEm z%%RCs@Nd#%H9w(w`i~UMV&6yLOn2kybENiCg!Mki+#@u=;%qb-on$9by5fH;=6Vpj z+D7-@VeUU|(tGW?vg~=Cv2dLoa4{prUN$V(jGOcukkxN<=`PBOSU&Q3UL0g$j_Jla zp%T%LK|PSG2)=U+gE({c&OomHQLJY?@)S^SFGs5E*Up`A@!4kAaPFh3la?LoDf~{? z(slx-$(hBt;5m6J;>@e{v=N=5RuaQsri+y043{R(uW{x5HP`=^v#YbWtf(5(G}2R5 z(d+LuSZ$^y_ZvEhBv)wi`s!H623D8)l23CbEcQ|ukhu~^cbGwBD~7`C-zu)dn%J6a zF!mLsq3FxRa!xXatJ#Mud9MmjOA%QD@UYIE$&WyrAu|$pY*Q0ukgTO1tSBXcGyVnML!vB8G56s9Z@lx629K2!a^(qFY+>=AzM$ zd#s&pjGemRrLZo%+9Uy~1u351_v9mNZyFJ&HoShaC7ZudXBDct{uxax^VHWH5}zvO zwoawFPxxTwcKyw)v^^I z?VpU-m~++K{MvgAVj^fTQHHf+OVf<<^O644w6VYTe`uWf1@x*xJ<<~9y)*lM{j>ZJ zPhTd}{UtcMqx~c5_0fC?PNB&^P_|Cp;kfyEtoz>$Sy$uQdf9 zRE^=|ct%#fN*BS&cmWuzHVnw{)ya}4p#;JFVrqn9)mT#O9zRCj2mO#O|7K?6$zzsE z@<)v>^U@iDFbK1y{7g)?J~x?#y*SjQ>|2eF03MW>$zl%+K|h4g7#g_Amk7LZmA}(x z+v>~o+0S1nr-V4f(tS(+ft&ZkiQ23c8_YdD$%9Y0QFb8d}I&Kmn<| zZ_;8<=nT0R@)_WO(^vjHMo$G^4pUMNc{8l%3vXV8V>TM?T|BR;S`9E(1<33$H^Vo` z+M{|kODrpINn3Pe_J;9=GK=U*QoPA@*rY|I!pn~E*W>4?S*u>RAwm5rlOQaA=gK2} zQp@`Tz|`W$xFbdt7EwO8=gTIc=(||6fpz6DutIb&Ir^7&3nuV1LMDO&@;eI2@-xp1 zCI8ivc^xmezH>k8Kw-%?Aw2rs*ZZ$NZbG+^1l8}D^v`qzQY=IMV2!3=$AO6hG$?hB z@e)!H)eCYWZXfe8s_Ob~BzF4l6@0;-G(4Kc{rp}hiy>bN7csx*46+b}5K%$OOQt$> znQ6}ulvP#^^9NV11VuS9{;>k5J&$a^{o3#dy+aRo;b5)ks5L0_ASq~%qHt0XU`HfM zhGW#(BV0=OQU4jCd;DzLQBb-bywhGs`P}1&SU>B+y-9aF?=wJ|o*w;fVe0VB)c7R*Mv!FDVrT>Ga@QMS|d zuo=Av36M3^_|z#7s%95eR^eWPPbLlYj}0^AX~<*HrDZ#tP!graraxhj1@Lq(;7K@2 z3`G-3NjiIp{6mO~2OM8z8;k29(o~5>71^nVG@Cu+yvPI$j(dpEbo)w}_C=XK$K!@O zpbQ3+HEp)%6uZLBzXeROTYQDUxhh+|EAAi1r^mIq`=)F>QL#by#S z4E{Vq)-``#B!YK<_CKck7N`_ z3C80iV_*sh&_At~EHZ=xA3*JgOLw&3XWVojGO>XqYrDWwVc~0bLw1|%$6{XbN08D$ zS;s(n8PQ-N^V{Hc7T?i*Fpqy{ZkDg2;gRGqhR>EpE3wa{He!??Y?A5izM_qnv8|`f z(wv$bfOfXqQJxEhmafu5x2kUts@On15957k!4mX@T1(>q^r^th57EFB9m}dV_5wVn zkY;hlduvF$Qwd8!e%mhumlRNlQ>KU*fck<1W;FgK28j1i1Jjg3Bhcpk9fo(k<(<~B zs#gshmKOP%rr**ykuOHEe+KaM{=`hwa#-4ApQQM=l}bS|0&#z zGfzu4vAn_BZ;$<7DiM9`?CR`Gew(_|q{`RV*Of15Df$~5^M0e#KGkIgFcNBEbu(RH zi~nRg)Azu^-|!#*L9cckN%sP453k)=5;awv)-JA;r5rW-=tvL0t1UH1Ww|BsPNmUP zZJOQ;w9p>lv);59?y>G~ACI||!WVh}S0y2E3ZPXTt7W6s>>Qstrb|GmV0~0rFdsf$ zy9${)iocQi9KIxZ6jo$J2f@XC(N1WnIo-So1?rLvrB##=wemBFe`4WcqmJ@FbyF*v z_^?Ac7~=|)ieOrYu$-`B(ZWeoe`CdY15$vAbgcqm%d!PT(#z@X5*2k^VYJ?nt9?(8 zJpfInhD^exV|93^Uj|+dde}5u7@AIb;_1e0uF(xW4nbk~tKUQ~9Xf`(IyzB+Ox#pm zb7(PSDWAuyQiZFL&Tj)T)emjco9ui~{uAxRP&1vcq=J!so)JLv+LgI^H6-|w3!X;B z>FcomIS})DVw%a5ahq%7R3;femo%eD{o@Ds|2%Lz9@B@If4IlotlN!FzyX1pEWV(^Fw2dRo9@2kBZd zVtU(U>VGucmwy++RFQUpX6(I_%@GSN+r!QBjG8ryb-)dg?Vj+u2&YIk5=&$t54ZD2 zSk>V3rVWd~hs+8dM?R#bMj$(Lpv`s3NxT3LlqZ1*lNw?9W{XwaSe2jshjhp zZ0lhB$NO6Kt3()$=RC+?&q4JFNFt7a06aj$zld`$T=fXHiBCj7Gy@YUJKoxc zr}OrY$J2@6V^1UUOg?Z`;lVpwHQXQu@ukImeV<=SrTV7+Ka<%sU@|?M{oNZJJLZ%; z)1L_sL&nb{TEu7!!}9v`$Vr=0T^KEI@beVjuO0NzcytBNAtnGV2mxzj4n+zp=`Qn( ziY%pvdV`8fhL)~a6XTXC?fXjX0v76-BcFN8BE#MOvl7F@OA{hbXIu@~rB)YdKPc{> z8Vru-L)FzuOlYMc3#2cNuRKVm%+|~<09o+9z&R&xDHbdY`$q%POeX*eg{XmU_c-B{ zEhd6C`a+E#X8EtE4{<{Vw!<=CDdL#4C2axzTcU}MN9HyWes%rU{i?9n#6&t`!v;7f zBdYKNj3bcw4umfn^F)_th>K(Weh@7%yBg7w{s5<+)XzLnD)*++PFVm;z!?r6h9TEf z3x`L3LY6rg|G8ly8XbceYl7n17WPR^1`{}Np=w#pyDL)+T7`)&OFXl?>r45Q$y}Ud zFKP#;mC|it&v&>Kx#2~5BZ_8Fy1D}DW?)vo;aX|c&`L7*5?##j<)3{U`E^+4+i{JY z6fQuhW--cXkk11Zm7&qz;g#e=hV$hZnn?~$xPGdk>n>c_(mNnYyu^N>L0#9jh8W;U2`2Gg zxd7}Ny8WCb*{ei8$(^dw9^>gR92PoXTwUP4_3^-LxjhKKg)e=XUF~~J5Ww+Gq;|lw zJ(}=vOo<*1^8tIeo?7*`f=;fs(D@9rBb&#kdmZv_@#nDXEGSr%YIs~Ur|%vne$Tn% zKZL#Wd#?vRztLCodb|+fQ)-D;g#===sg1_=$by3vW65V(&Rb&9lEk4|HVaOHMi>{B z5#|kz4x;gdYsVHo4i|uS zD3l`LxW~u_9{U7(n72$DBSEO{W^$H4z{5{p-RyIOp7OX%IG=)HBQd%f+R>u5k7+RD zd@}QYfGyGzvu+MqQF11Dn9rZt5XgHh1i^5v0wvbAGcx4T?5-$@6c_~7 z8uq6crv&gh4-JRYX*&PlrGEviW%iLN=}=fVA32G^nbuScWB`4HtpofeLV><4&jCZh zLXDQvJvs6K&+Fip z$GmQlFDAP%wmesoFToD5RV3SB+wcf00mdMHb&531JSAzNH>BS61%1ctD z>=+)s4fAlZC=uLUK`zZaP9zWuF?1cgdH)&|_~HTB1rd7&TudJmur^7}U-s&7C^ zGx#86AAjra{1BC2ThUMcUjHdq+1KBOGg_{GA{kSWiWPtvM~ zZzEJ;R*KXIFSL-dspfXfPe1V&IqrY|zF}`Xk5IketmB$61&rELjz;5Oi>Z+qc;cgL z^^D;gvG-f3^Czjz@ys^~P%K3G5Q@r!)~t){e0nJ#)tj`&RC8==pbssk|6&;&T}uhv zmq{jF%j!D`m`#|KzD_|>DRLpmbjgX?Gm{M0?pt=%(nr!3Kp*y;zY5Wrr9#8>ko^u` zD|81=Ml0`aEaN{bGW0Ud2n>!0oeBSz}XJS{$3G;&QEa1^W7G?LN zI7c5B7G{glk)kqzGZtE!Mo6XEjtDIT=a>V81L&1NU95kGlsZihax)0po1?&TsvT?Y zF8&d^VoJaxr96Pyl|!Zl`7+y_Z<-jLp&o`WjDGW~*LbM#&eI zl!=iEG{^>88Qa|0Slftyq5;M~q?Wa{v^Wb`Ut7|mnJD}_>PZpySCCI7A^vZN{1m5VQAkw2Ah#IU2G zCNcVKRLpFX#gXdrR7ECAc7CCo!(rmt+cZ4lw7d`A!Ms`2c`xmYexxk&4VOkfMln<; z_N~InH_Ih&Q!z<ut2D`ye9`Ej;2{uwb(o2WoRzbR(`JBR1U`P1o;g(Oar zAVoz2-~q*Q&<>>OLv?~^{h_XCQ=Q+y=5G4V2J#y7!#mHmG_R46O+3?(KY~CI13kxk zesAV8gyEd^mr$9`=R786Yrg%ObQZ>IZ%bvZX#A_Vwv*GER=qeoJFV0Tdl^lr0BPrY zPBBQSG;$GiZPR#Q7ZBd0sN8|~^m%Lfn3CU>rMz*y%ZAx=YBYPA-k<1G9_`L(w=uRS z@J}ols0R40=fuNUA=O?*$p`Wc98h44{}vYLPsIVv@(0R^Ar4`-LMd69GLPh`CaS^2bsy>>GfL{zp9JyTmb;IevU^_2uO;t$WcO_$WrXRUo;fx z90fD@mxW;Zsy?!+&`G*~Bqt|t?@<81Wi5(o;AlMHgn$@ubDaeeG?-5?lUNuf^_BkM zA0Ljb&P%J7L|h*^OfE;G^D-&SWvkxIi@bfUDYg%0y9^lh&*9kKutL5mQNSg}LvMOU z*68_J`N>0lM;^*|Ow`%>&*ZXR$z+|r+J202Ry^8%h6NcwB*JWfII-8Fi(6WjEXfi2 z8B2%+uqr&vs1rr7r`%W(L&gC|v6@I}m|ls|Uu%+}0DQs~%W9x+Fo(*w9BxDYz%hWV zyTHN_yeYIoS4PkEn0&vGR}#Huv%tf;YB`KXOxd1&or);77#8zRv#d^^q&Tw1a2|$9 ztdWE>oun|us5eN$=ves`e1?w_U3bvu9b|0h>8n{yRz7bH+h#}HiazTEGGpFPVSs&h z8G!mWss$cFh57OMNhU zt`NI;6*1NQnrI($4wO^b0m~{yrG@uBQP(^C1zRuQJ6c`elaNBewe-CdL8^T%@|6n~ zqy^J<)vHw0j>weoEEBv+Cg%)4Gc)|myy0h_8GdGF_?eJG&ka8lGW<-~@V)&io`f$l zFy%mRMr!7j_x@cPAbIa+HmFKaLvOYS=^9Q`9~mqy=%SVxS}m)Y@oYDcru))c`y*DX z8bV5&7K~^e&6Q5Fl^e-9#y86g?^e){j;h{UNL?V z4uOq?@$&5ZSNgq)E#uoIZ}4g3o-=bV{DN?wyRs|3Zu}kJ_+R4&!V@xhmF8~2pSJg} z@eSg7Dn+t_r=R??pceR?&J#NsEG&W7BdPJml<|Ey2-G+aFVBYOhnayyz&;rZd9ri#poIviG;#4VP;xj+3rK4SAQqknG)9L9nM3$OAfRFws4`rY|{ z3Q9Jac^EIO`~L0k>#Ldy+ozCz;bt93Zma$}_fJ-emyf@WfqM4*NyBQ%^NO@JB*@oQ zxghEhokWOu?5`MP`_;;Gq+34#DGRDK17afLBcH7;<+uz5$K4%*pqRq~fbnd9eGUtO zKB2&)0%1BDmK<3A4z0>19ksGdhtLi@310~=7Wr0zKT|*i#QvF1kQ5c@1rscN-B5+C zz{2{(Dc`dC1uYL=Ku^FihS&sX2Mph1tguMSL^+S*&u=YiT>et{Oo`oE7U9B)A+R{b z9%D?ogM-GPpFAKSmwCJ-)L6FOn0onJd)k-8Kp%Mz*cE|@e1p$0PCk=!mbIua2QJNo zs&Epm{rx<~ToYJMXITt0uwx=2PbcajIW?aBtZlk#nm*4F{6u-#0%$!@=-aI2vA9}?LB<1E~b)~V(1Lw=C3}?!RVieQ+#!C8oPIW zz)Q3AoT7_Lw?mV3vec1GT|8!iC=0f2*>v-_aKS?vG0x4yJ*@qVCXZgQYo04uIB|W` zoU#oB^Xc1U{zS9nAs8-3&@073h)N!XudR zW+=fm6U`8xzCMXMg(LI)B3W)#mWusVx!7sM{(PB^r@omxI{zH8^m=|Myesk9DR_lo z$9Y9{iQd!|SvjP64qN1&#_!xHvX0Nxoa($+eeP5WB?E!TzGRX~_5!cKzp$@92hu>Y z?>B?YaG21uQ1EhCALe?|as}bC+WfLWzetujjr}DGq=aKzC6^+{sq)JDi&s1xhk6RM z=g!Z~o)hYoxW^h9L&xcR9w**ai$7A}!tBxmdyPigd_+O!o2lCw+fV-lWlnGEU}6+4a(vH)rz6Py7M0C-+{b-IF-doY?YjQhWw`7n_G zuc>3c*~G{g{HyZ+ZEdb^q|<@?f1By_#?SnJ|C0QFi;=}eEjK11$ZBi(tX8osSIc9} z?lx&4od_$WJYu$rZQB}XW$Vf8_jPosu-X~z3NXfL)78@3T53JBn$D!wHB1%AVX(`7 zN7F&l5lvnvHc~rUQ)v*Nj>Zijt-eNi_&nF7E@`oRHlDy7b(C}5rtq@XKt~l9YMv-c zY?I{{^!gcfG#kg)^p6j3S`00QPjP4o_tA}W-57h-)G-=7Aj2_*@nx}J`OujOh349Z zkwIA87@^xq@Di8EKwbb}|7|ClhUP3uVOPFge7JQ0jMb8C+ZxBNMtba;2o8gjy5n zXcF^4@^7Q=sNN*%X0f=1SRblqN0=ObX<)VLNIE7)g9n2|+5yN|WR&#lAQM>o5Os}B zPK&s5k0xAaBZ1oatg;FAO*9MU8`2sItpu7}u}%+qD@}cc?XJYAFVi@#CejyKI$R|aTj zHnJQ1i>%;Zu23wUX!$~=R@$fNwDdGmE|vC5d-;6U8g#OgQZCym6;4`Psi&vxNv_ko z@Ak~%&Low~o?q-|_j0G@b7zu2zuCJyKQ9(0hnE*mh4XTDy_j9SC`9tz@j=>*c-9w0u`cpX?P@%a;~BD+HfSYIlX>a<)f}<+|nkG7&pQ|C%e&U~VIL---yBv(w}bxO&2n5E`fCDJZ$wsS^)J=@Nmo}50J=IEkud-U|Eub#AXjkDw1^?dTYb99y@Q!^RRb$xlz7~Y@aV(>vlV@=gZBf!s>1L=&^EeH-0$U zX^d}Dms^jme*5C&`0gURy=k5r$^Emn&f``upPdx4S^YGhJ?~9Aox*E|=>}_O0wi_4L+S zsya5vD;dUnb_x?D}QZ%R{W`RVkg zcbL2=XD3DK%;bE(oGs@f+4lCN*tt18vTjS=hufW8s*ufPVHl6j{^ebHTrQUPvYke@ zoJ|$;)%#+#)L7d)FXVFP7g?CXTz3EN^vJNccXl>cBTt>9js2~w{ZwOkw|;nCKCBf^ zvPXKgF*Db>qG za;4k6k$f7rH%nI+_T}()=Omkcat2q&C9Cz69`7Htx~mV?{jF(q_S*Nu=IYaZ^Q?GL zy1Fb}C++R6Y2Uinj}8oDXCtzeT5@u0&2@%a3MYHBh$T|&TMfNm1+jqB?GV)TGHzMrTJ~C?gF>O@G}4FN z#{S9ZHoe|y3~$_Kx}cy8rf5Ojq+aMv3!@El=pHvJe$HZ_}!7u%KOd7{8RQ2fktxKn_9MaxL>aHCi`r= z9~B;R2aV#6d2{tx)2~|NQgI`Fe0|a_SF)464wX4BOj^}OdM5?=Dp#&JlOk-|2%VM3 zLx1IcITSqIW^nUmY4eqGdy_1_KgwD#*XMhBWN)nB-ZeMx)>BJI?T3d)bG_Wxmqw+7 zWZ~X99$XgAt2^7pv&#CQHF$b_YCS!=rK6?I6Z2+Mx2J>bt^P22oTjSNO{W>D9b^xz zTI#4=PF>zzB-htk)$&E|qPYcl>@mN!mOSlOw@3Rs>&3OplUn}tx_9!l-8&eqUfFk! z)!V$h>#a8?H``{h--sOb*7irM)%8YcScVg@Jsn@~nC*+|+2P@O-)%Ho#m!o!cu={6 zZ_e=Iv^(zHn(n3BIJsQkA6=Q7O+cxq57Wck$yubiS_PVNv02=j7$?V9$GMy7Mr(ci zn10;u^mOO&BE5P3G<4Ql$NfoVqhMZKm9Gqa^U>}V2KjR5_Go9nc;CCby3O0yks zd7QU%ja+}P+A;Pwc22f;%zbNX$(~+}c9Ok~y|Zkm4EwlvcYX&uieb*y-lULAPRFcT0KR;ee6`pEUE17)S zsfJMR2#_eigoW(t@NC#F?4(nrbaLzX-h8;L?H}zOt+vk|ond}rKb#MYi>)2|`rfKk zj~o5`(dpClZnax$ofPwp^3r5;?=Et)dePXn?FYLy?4ED+)~%(R2h+US+S<&WUp@?r z`G?f{Q}g_|xnI2KZ*&T4+b8Y*$;IWgQppX=l~(KO{Bp0ob6Gx}79)4b?USwPbmJz~ zNZ&s^wI7PZo#XCd>Gsg>^xOHt)^u=|Z4@ru^GR#e-WVMhdp#q!`80Zbe7qTN9Ze4n zXMZ()G-<`J^=9YBsNAn# zK3(lRtnaM#4$8UBjk^nbr*@G%w>O*Z9rwY=N3PeetLK%wMyF9O9F#BGqf+i+zq)t0 z)|r;_-LD8#Z~bPl(Mg4( z#@b#1_TIYS%C0Nv$A`$xVBfh&_lFHLClN|1pXyxPl^zRE*@{4$`JNALD(}kjU4*}! z9CVu}<-Hp~dBCFWbpY*UCs+9FuHb)mmn)a6*~x*xYL6|6ydnYY)j6)_s!$mSe?hPt zM>qsI0_7cGT;ID$1Lvz+3eF4A-s~Qry|XN`!RJ;UzUQ(>jkCk-=F;(C+ZtS4<{yuo zrP5`!k>5EV-o*UQIQSUxCT}mAcjilLG zTFnk8jlO-iKdxEM!^ur`Y`C{=38H_W}7^Kj59=MT+7(cai0EPB|HOE$~w0DDG7oEdY@@mrPG|$(}r@ccPIP=MNV^C<+E}T(h=XQJl zpxVfdPX~M1;^Dq~-z)XD2BUJyxfwXe>)rM4X?kb%@g!&GE>A|qv!%V-(Y@hL@-ML)CJZ*32DXOmn?vrI~f_ zPVd%_^-AipH{8!PF3T^c7(Hj0PEt;kMssWoZm%O^LFt!(>YuhAGj zREnz`mAn0={KMv`;~XTnHr;WlTsfa!F12d6&h=gPsh@2QfO?IdE|T~Ci{r}p@I1K{ zspalc$;;#0yTRabGgmlUv+iz|9#;={Hf^Kd-0m3V!%o3<`sby``{cn!{o!0VXnzN>zF$K<oc%g_G zX;R7;&hw3S=l0Ng+Aznh>v6BpeLOODuEV5+a_QhGD1k*l1iLQhE(A_Iy&POl^-Ds; zPN~oz-%QsZ5BTXp=61h-+Xr!$bBC2_>-q$+KJ5L2)V*jqRpPTAetKH_X=aUa3@Z|xBRIYVhu^MZKqt-zWNy0(-iL>6d z0??EK(G|{mKb_oV*FY|umY*&*PHKH!%wHrR!hX~IMbruW*7=L56Zoz37x4?&^XBh$ zlrci2u{_=!?jLU(xo!Pmu-!OWJKb3-_w9bJG^r)C=}PkYymxM|?r)p@n`Ytays)-q z4vOa+*EgL>rBH0cA#B_?RwIRr;^~r^c8>=8x1(ZnP&)y%ynone=Cg&Xll{%9UKu@< z%Gb9?seNHMm^d2)AlZEqJ25Az%8>%(+&+87tdy~m4Yq05uea_FyZaYb@9OIE=Ip3k8d_^7<{c2??AhAR#_eTuX}_8qt^|}cDQjpx{IVXHq4WqtNq*C_0x@hx!20M#zEz+be? zt(Cnz-oA3%j~DHe^x@N)TN_?)uU}_(oYf`sp1KSZmRcd1Gm5LtljUJo0Eg{1GBbdSliWN_s|-jxr0IF z{GxI>9dB%IjP}-kkK?26^?tQ6>Yrzyl6#Mnrg2lwSz9OFM#D;P-6!?* zbmH0%*vhN#}BZ ze7|as&qtfJ9taty8^_x)V}*OA?H77 z$T!iD^M4f$Ia)g&RrW`Z{eiuGv$R?~-?@5nrmF|jy&eed{pwQg>Gr07yXNNiHqI{2 z+{W15zJ9Vw?Wf*m_G#QMT$sgcy&7?Ir)#Bs=WuCI9N(WEp~60Y9DYWb6_6rJY8Ix{qycPRcy2_Hjm4Z?c84T^5FD1ceGzD zKbOx=5c5$;Qf_On$%IPXj8T~y$p;%u!|cd+2N zpu?bYL%s8&{Fy@vsHsAjicYd|zanlgXyS6wdxm#fYi#Ka_?|~; zTfY?BttL%33mQqY(F%=p5BuO8pJP462Mw!az$Jf4PAUDnwD5Qp%uv7d(V|9z$7!5eA)oa+BUVVwL@yE8vkCV!eI|8Lnr zezU{+HAlqXMJ)xnpOyAlX5@HVVWckrb~D@)9KW1BVNVkfc>1byH24{iY!yqeWII*S z>l5;Sj+{ALP#;P`!*`ZxqgtKg7d=Vh^(0-cRq(_!SzKEnaw|CAm?3n9=j~apSBoyb zAl-%i2I+WbN-kF<#`GzwodX@$_WiR5u&oDPubT7qFTbIq`h^Z{&Df6$Y@;;)ED6+mRJ2bCGlVdl-gnz&-?>tI#XD9ii4c8J>-K8D+~qkJ%-xf^&lF3bX4&-Yn{9 z$rO@Km(W*(`wb9Vgyi?;enBSeGCsy;H=?eu{vY4=J zy+7$0$+0wXVys-SvlrH859Ed^R?g%p6*Ft`lL)fCfNm&m#sd1Z%K(bmX7=kM*dXzB zURTj&@mpFBTfm^fYqIf*X^dsx^}t|hCYmjv}g9__&qh$hQdvz&tP8k zpuiI=I9YDdE$EF>E7l^u+t8&6lJwO$b4t=hZa)EsiRqFJt(iVu!>b5^{KI+$4!h_l z6+_8-Clz0EueFYGE)vrhT$eanr;-b$olqE=KK9Fy$K zhWcFREngj3f> zoze7U{nYFc{tzQv4U0DwhW={yxazeq9M~})m{BQ)vhezs(qzk}?zM`mPw=Q5!cd|= zSMt}2_1zUd)aCr)0Klr}0Z3Q-6FPk=L3}cQycM|pt`^`b=P!!zHh)OSr)$!#TIKuN z;{IU%08HCn`GVHJ)-CL79$gL=aH%b@zNsFpiv0fVUw=8rKaZ941u}#8(*a)|@1T^E ze@J@g6PSN0`*QzDMM2?#X_Nb!Lp*{Fwz_vt2>W{C>C?$>;({a7UEb<2P{G_w(c_JG zMs&-jy_TQ;Ou$dIF^RqCr2wOKb6^1bHAxAj#08lWlmA4*?DdMl%+TeBu`BJfFtMsw zrrK8J##WSunBD&Br*hr;ap$JEw(JfCRVKedEFeuh_Jgy6Er}`2F0p+J=wY(3>d?lPwvuJd3Ndpk+d1}$^F5jJqV0hSGYaL5G$MCd zQVBt4XiJLK-`QMe~hF7=5yVg)>(lQ(ECZGjF6XvMn%uo7FRia zrzq5-Zb`i0gsuzV9Li>mrWS=#d1*=KOlRlHZ&f1);v3BSZeu?4hr{-mFmnuvOr>)5 zQBmiiVV70#uJ{;lLnG#9Yf>&Y5s&7wukxlg*EWOc>9`C0h*5SGkvgUslA>K@n+nj2eL%&5CZ-gDNi|w z?K8K%HsUOvADb=ZdpX>m_!_EpA+a5f`&e4)e0l=aaMJr7U#d&5D?9oMbO?bYBJ~IA z0vPPVc+rrI*3C313BQdTm?g^=<^*ysb_cqr%;f;=D}U?!y>5R8k93lJg2Y?1{6Ege zsTFSx{fyJ$4=DN9$(8p4Uf3^S$O^BRV+6~vf&fJ2~Rhbj)a+ZD;nF_Z7cPD5~VD{+}EgqHz#6* z_*`6D*tzA0tZB%FQHj?m-eKr0#(lBP$vJS>$nAkm1-w#p+PURa4* zH6oCl^@U%P^%hiHl}Mo955;Mr{pX2TcZ{$n5V^&J;Z%~=AV5&RQf%ATs9zRzTS|VM zd)0E9QW@ys8t0m)=Mrke@_EGFP;+t5Kh>RaEt(bXQKGCnEvS!`&;U-9c zS5?8pyEtSfvElX+q|gl>t?oc#+wQlrJsXu^=*qew$s@qv^}yc?M94ElIn zhNPEU2kjfmYakA`d$YBdLc@8;N~`+~iiX%Jq7CY0^yGzS#JpDR4uP;6j_i5uf!dE| z4a0VkyU8gT6&-4b)g!CJq;fKB7^>_6x#r3@WKP{4I4S?vU-1CHj_>}()$h>%kC?B1q)doE zVgCFdWB#?E%dc4u`7l77Bj_Ev?bS;D>E0NMM>1LT9VHSC_=hME5!l%s7rz-KYBt ze}Zua_u1}VH$Z6mekqU2z>`I{w_2_ikG+NR&;`#3eDgxsDpvxVB3pRGRlBlWdW5KM z>4vPWLNR??Ft&W%LYT`p0A0<-h>b*kq1dQK{JGmz9yYPfoD+RHV!c{Cg>LIhtBAGx zU2|SeK*ey2z#+yy$7&o^Hd@_ny3A+b3|5Iv*|7VJzxs4Aj%85m`#eG)p?+GJ@O6F= zD;wD7-FFU z;IGKx#zwegSIg)Zcm}#mD<^vJj8We>Wl5R3tA3I8paP0B=O^cB(B1XoOR6zwhsH=B zB=z*I6{p=cqC!Y|Xz8WCNC6qQ=iZkPSC8vHIY7xkLdw6;P|O2C=^HoXq1dJ5}TsY!G*A;GD*<|n6YEkDbX zFr`>>#i@Iq>3_!!p9{ACL4fc_rV!rV^cnpVQ~EV4vlzV7z1zkQ-F>k9a~u#S;@Sy;li z6eBQ*U$3pdeZyzJ$UXyK($C*!p9!N`3j8h!hrC3&Eh^R#q%rf1)-TKGJiHhrg%22` zHL2R+8HX5$hgn4v@Y>Xg;$F8Vs%G+aK6!pz`vD$<_uJ4m7hH<%a%Xr&qlP+u^%pvb zF9P)PM0Qyo`iZ#IQo5Ei4SC2DNGO%RJRhhAkNj|sanvdwzUmm|OW{VEX>mxgt?6uF z^h-;2L$q%k&OdJ8{qn+?{RP^A?6JrodAlhBbcjk7IM%y!HXv%H$i@n%S2|)6Ev-a) zK`QrA9Xf7fgmRkVK(i&H9AtM(udMjKpJ#8FilN~9ATO`83KX2 zc4)K2qPp;OYbk~i8)D~$sx|H|E8brelR;my&-fwfrOW+oLkIrxp_`0WJp8h!AIXV| zM|s@4>4B;uJ%c~li1V{7H301g`e&ba=t!b?L<(H?yBF?+rWO4q;Qp;(fZs|O175`C zi-a-0oy0$?mJg#e@L9Ha-_Gc-Me@Im3}_7#>>dZMYEw9QXeA?z%C~wF&jm-iCLu97 zUYX^~SzPkL_VDBg4%);lmXWToU-0f#PONc1_h%^+jayYh)eQiBtua)0(@ht8UYr?P zInt~w-Geydya)Tk7*Hej^C;4ti9c&EVXHK!p^GdkG;!EcNPdvFh{7Pc0Ytu7)_&LL z-K4AGDi1DtUr&sHJ*ijE+kAudu@l^`1{(QdvtQ1^daozioX$>XNmh=VlA13}2{kJP z_(fH<6UB}VUGX)~bgXX0G;Lffh)^9)FqK6#!0d%ySk*(Vy0P`zd)|g}z#zSCdC5iM zHC2v>qAmbGJ?r{^4<2~zsnN+6&GAS zY&hYcxZw4FkqeYX(!X#)`yCe;i7Omj5VUVc$Zz-n{s|wzpZFkNf&Wl+{gw}a?}XM) z=U;_Z`RyYLi0`iNDsC09zvcws$CBi?oN!`@5E_@O+oa_SPC?!Q=bW=5zgSP{?a?YX zZ{V1vTbT&L@9PQ>c#rVzd9)VPfOE;e*`;%6tWwIg3-4Nxl*{4dpW@pQFUM}T2a6Dp z4kD6g25%q!U4Qk(W1SUPV=+M1;ErgCeYll;H)H5}HrI*mG7u?NF=XbLbwI7IWxQ2Dm}YExs()T}Da4^j2gb`evY4vgVO^xVFP3`;y&Wl5%gR79W9ys#@|8F02aqbNXCi-%fCk5R5E0Yz_G+B zdk`gNFzPdJhOj!Dm}rBAo}3MJ+8PF`S!$SE&nN!j1p8P4?_AHfdz182<&V!NvR@I2 zC0rWxwAGe$a`W5$_nZLyQ@UiCQvb>c*Mk$p>~}9r2z@J-OYlup3;b1B`og;Beja36 z%Yyh;IrL)8NX)wnCSU~hx`qjLE%uo5pE|?(J9WAz3_nQMNjF{%mU0a66nf+G60OUo zFUj3bI~6Cddje$yaReREqTDW!d3rT#$N!BL=f{Q;-+4Fx&+tO|juEhb_SPHjs5`$f z;0)Zqcd-ivZGX18G!|!nHIsa`6uw<5UtNNiUzu{0EcA{)?x{GqVgZi7@*{*TzdCbj zXA6#R1{VMLypG?n?S3+vyfa7sH%5~sGmm?3#i#AvUldaL&kbL5<0{w-6kblfLpG}c~VwH>fWnu3OmSFJ| zeD9Z;b%e1bvD&|yagNcwcl{rP^Gr?Vcw62^NoN9l)c)ST`TQ^{y}1(o#;El5gZZb; zfbwoL@a6j-+zY((%Yk==-=yrL!tpOP{m^INuXA7keG8qjR9SEcM!BXW>|`i+Cl=0w zdg5)NQ73GG+J-3z9+$Np@@~9ZIj}M%6@$)N zDR|^S+@zu(GIQbecvQlyZJc{=h7C*dk=%4>;%66r7stQvO~B9#mk*Lt#FJt*@U5UZ zIy3d3xyFIdwQdXH*acaXOdh$D4?Yc!wzJM5gY7kL)@ZIM#kwG3grd19td?%GbXG(_|D1o%`R)rVlo+@0c<7XpVjeU_yQ;qF(*qHuG1XDS{)}?^OEsTFcW$?rM!9;- zmY6Zi-SFCa9l|IGePP{@!pk)ld9<)hz{Q@NGi|XtC^ep6&;TxzvYQkToS}3g1hY%@ zOk-aj-`Tf{6l!ZV^^{XbQPXJqPP`;7E>QYRA{`8jmuW(?NxxsbIWv$No)a(T!hMF8 zrpNdycLoc}PmtT|z>c{Q1`Rr{#}yZ0Hu(Q<)NIE zLj8z9)Z#$aZ>}j^vwqjYLAY8+Jn*@X$N`w<2j+i-OTbr%{?|?PC*!5y?|-s2eu*J~ zcMvh+loKa1jd^36hL1%Q=uH!^FY1{0429JqbWhRb$~fXQzOW4xW9)2nBNH;XPgI_C zI|=yHEY84nt1^fJwSt?kW-uY`)wHO}8F;CDJO7Po^K6A$fEAjDoR+jQsA- zi414Ha#|4#4qi==Hp1?OZ1DMc0pxxxcv|TOLeMy;O^rULxY>cv*ZKikaGCkf8gm(& zxZ0=|``7Z+6?{X}PEZEM8Pi*D=cajhP>`(wpuC;NhmO^Z;$w{yjmyT~@no*7%2(8O zIuOm1hMi`Y&p`yLEC;9mt7`la5B#D-!VdtcUlxR4TDfnH5J#?B4_(=1hi_t1a6fDt zW=PdgWV0h|cT!D@fHr+lD0Y4M%db;70tx1?V466avPo5W!llz`#joH5){Zy?5Yxd>Lq5|D|qA86BIn%#40Xb^CITVXIliw1%RX87LSR)MUAyq&+)FC+!KNQNtY#8Ve~JFBGo{h`Ah8iMqS|0Nv?o$&W)MYS|)#Cr6P1$s=k{w#dy!#%PJax ziIVQ|63f$IWNpvQ+1~aS0?Af^JZb+3d z7%k-G5|YEEp|X2=Bh*Tmg~P6;JU%Tknu~Irrj4s; z#$#dUCU)l%{E|IEl*P7wWtaIbqhir%n>U63I(Lgxa*RM7*j-IZuUP*A!|(3}ez^IU zTZ7b8X~W5$J;%Ju4r{+oWhmTDEoIwhB}=d1bk>1=J;(ukF+*o*n9YX=B}688k|V@1 zht15@rSF4_-`$@34p}2o-XJ1Qii>7F%u#n8zprboDJk_e;6MUDyW6I&6z@0fH|64gmdv{=xFRJOA{5~4%+26MIcf*s1QA`Dm*s5@JmZY3mL z(8=sw{B_rpv775k_LvpFk0@ln@&)H3)q}8*NzQ&^j@xixC4Oq_7ABIOKb==qWr!B= zczE|t()EVtwdbYYx*{k~yqwd6cUgl+kZ_N#7h$V^?!dC0 zh852K2I$_F?avoK10Db00Nr1Y5gd3e-7|>Gjg#nlzojRtm+&Owo&}b@>Q+vjrNalz%Z6`a6^VXaxbjctO518(w%^ zoh4Rr)QgM~L|}(4&p5tB+gF7lKYK=WUtvP}+k1h3-TV{jnEwU++EZXD7x^q7dKAF`>oP&AP@uxKj55S zvz*>lJc@62+eh6ExbH@l7~?7#@F39LQnfCQO#K!-hIT5Ut_)N-jG_$!`4FaeBWb+b z^XXC*f)CN^2G=P?-A9wv$ct(a57liiW)=Fd(+R)@-w~+?`@PY2{3*5l>j=Q*ClS$q34r$N z`R4S<=$zX z_kQwEM!eIPi=VG8hV|>j@29+PQbov@f<-j}AA89QI{xaS`1S_DnL;n9;+Oi#8TgL( zpT9~aN*eHyOU&N6#N)k^ea8veVx8zmafNeReK7NLjK7{ zNI%I`|G+dhzIW6JT(u_|>tf2x4(Y9DhO0a|JGFr#)n+i|iHs>{Wtg>BT)$8Teg0h!Trzd==aT!D|9m+nx2aFJxCvyj+{70`ax5bVF{L z6O;EJTaLAiX`_+UD^gQZeK0JlA zO+qKUKuaB*V?)ot6D3_a%e66|x!b3QH|iBHiMlH+3Tp|98meap=w4T~L{auw`tclt zFo~>*b7@;Ph+K5NFoowfqe7lG1t(|LAW!v8#v_Dk&xjZ3a|u1YajZ)nW3v!2dYHK+ ztT(2je8NG=81#g_Tm^gP#eA>B)7JmsI zRL%eaCO>7B$}*x(x64f0n7X+S*GlsQ<%TnMa`u2lY`E##Xmnfqv}&>gZeH{-Qszks zPo%J=H8f95Fafft28v4Qbg&jrqkEuhYG*GRTQ)PT%ZKX@?Y$H0Yn+2dq>kV#pT>2i zcFbHg(e)n6x%MUkyckfT=1^6YuWIU~SMZKQA$8?{ZLbf$8qLViO+H(&Bqa6z`MnWPekvl(3`0p3~~)dP6N5F3U1g^9^XO7vrHu+@s>0m-7U5tLP`sCWWMqHoN28mNshYx{+G*>|e;ik?&4 zyvPcCoY7Oj>5(t5X$im9enLoFET5WK?ymuki&}e(xp*^F{`r=r{2xhVhqc=$?Ifbe7oARW11A6pBbv))nc?ESS z_Ttlks8?;Ti}pm;Hqe`TV{mvu5F@41_C<%eI%3W&_=5C`}O}Fo7NQ^D2hrHk)_t-e-{cnC3dVu3F}{L?CZxZS-Cn=1*&Q z%yDPaIdYZ&4eD!U5>*ie%TsgqL9>#c!)b?}%YV+>|MOq>v=pKb?l%9#-IxD{yT3NR zq(2&8{+hdg3}Jw;;mSv@=3gPqT7kWL#)^ifBFOyBP6>UW7y}58~7+Vws@SsiP3=~M7tLoCR zS~)F?SWBfITXf2vs`(D{Ey<`#5O0sAYjfzk-YIdMPQ?<*YS24M*tt~tyfH(t%MweqV=!Au zpZCs~^}SCFl{?EN3b+~!iVtn%*sv}40=EtTl(I;#z~kOHaBzw5Wl15x**HrMPtTQv z?*me&VF71O^n@klY9K;ni@gS*a29&j8QY+sqR@S<9vOSzuWnXUgnNePr!hfIWHk^5 zs)b5&q|4mhL&y?@0`cs`)tRuPfidPZ{Q`n+Ut*rV>a9FlCq?!3%DAde6VWHzkL1fR zVNhLoQ0`dr**3VI8AzcXB{OScUCJKiaLfeSgUBIc0kbo^F5ZHwU1s;rP%IQr&3sqWUG ztp4XJzz>~|Q4;ZTu+vchgxH5CUe~j=!^WQJ^8T;V>DQZoa_>(%Dfs>`ssINZi4n6t zwH;0ADXO4mCx~TW9aV<1vwI!sE0=^DF}UUf+=0X^_r|2gn2F)?ae6%(XsAIa&AQ6D zY*35{{Dq&1K`8J+je`PG7oAwpq8k}0j>%G}t6GfijIb!6i_TXQ!+;#ws zNcjt9n*iZ95@{Y7MHbY!;?@-U7Ge`NsLkYTK2~h^U72j9HpTH9YTSATeJhR~BwIt% z+T3e1zz2;)!AlRd#10*!UF4i?$K(EnDn%}!e8Ev(BNb#F@XfWZ14IHn<3`*O`?#B)c#xHcpGfi!i-2q4%&+{ge@r_z@3dpneJv{UxQ|!{3^DVK0bN@_0y_48 zT2yBGZ`l+0OrPrKJ*98@%A_Nz0gcIs;P-!Q?Cek{_fiu%TC;1#K5l?O4Hpe(1&e&f zV_I?_B9V@; z*?sF_z|u}$6C0Vq5iU*|DBNMIh`8UyUD>~YmK4XAy2vTZGklGod)JncwxZR`ql z4n5YIig|ofxd#}t<^aRS5QjJ;i38U(q(5#Y@knhK@C6mu6m}MT4J#07zupeQKRu== z^oT?`ALB^FZp=eZSf{0+Q?Ff3(6UFS;Lp#P;);^J?mCI>XRzIYy>#V44z3WqQZG-G z){CE%!jPP2OrgLt<;(7x=D`XZk^W#LG7@VKB~Fif&@Q*dCPmxlYm-J{k(mHr56?m= zE3p>JmLtEVWfL;Foo%k2)#n6p&RlFF)a%LsA z+Xx&4w!ajp=);3oq;qW{;w-ec%+ve}_lH8x+e-i;%Qhb=y z-oj^cKq9c<`*Ru{^Z2Lfq^Ph@Wi_jV8SE!gjhx=dwKHzd3;6qme*iCj`P2mMUnVfu9-!s*gxih9w8g8XX#}=K%pN6x*Dwcm* zAOQB`SDHGCohnT4JBe6KE8;17t7_XUo=VDT-BK2+{qt!JOzscy zpP;9yo22<4nx_BR&izbgzittnDY+`=%Rn)L^gc-PS*1DviQef zn13DJ_EkArZN&EYcYL&>{X_oYd&Ikr9eRB#_rtoF51+D-G zo|IXxF!^X+0Wo$wV)4&mXw0%)Y*ZM6n%a)hh62X8;4cSS?@c(nhh=kD!9zaGYfr!AVVt7_QheJ&#@Tf$^9dr)M+ z`-#30Brzto)VPX1h0MqaF?&-@6R~}AL!&wu0T$7^4PMISwr4LhXgx2z8j@ zoicbS7a0A$PN_>q6fvox_U&2ITYo!|cluBouTym;P3+NM3{^Zm5rgz9Ik}ulrnmrp zyMY-Q*Xd5k*Z4tW0amMSrb|~;L)Ejn;AYG@=jKL!JwK0GIF^}z@MAX&F9Xs}xTO9V z@Q!THxLiFbdTDR^FZzuATrH-bkoW;G7k!Bf8gIBTQzd`<;YgF>({iB--+X@!&+nD- zeYa2N>l6aw?Nr3|vZx&mH=HagVh$%4nz(J$`}%uN#K%PayqDyVAHw(Z(fMbI0iVxH z`K2ypg@~kQHX<~z1jpdKmL|O)#JxUz+EuoC>=)Z~Gd`J$8aP+jKxb5jG{}J~WNl@a z;?%R%xd+KaFqj#_NWL#F7Sh8{mlhr_YRR`H&#(*p~s_;xX?Ijdkz57 zsU(FJs`mkUgemOj>!FlW8tX&a5haM2vfI7gww7m<0lC}KwHuxl%HgGOf)QB`?K8G@ z?!nFVnFSDZTbl(;XK-vzNVN6yt&sPOV0{q@anGBd*r=@?Hq_daa-|^~jgIC8owRE1 zb@E!Z4gDzlD{lCv(eR(?;cpm1djrsx{)r*L|KAv*R9NW?Lqxwk;PW>u@onAyUo7z` z{xg;U-Zb%lf+gM?NX50*gG%Ez27_}^d(;CpS&tO_p6@P+GRJY{v&PEN{vDSCl|M8kuCXmWCH=5G)?_mcZ*w((dg;_j;#iPdRPvBL#Qc!#QP?67k~&z# zqbKgkt^;B+j zmc0}@D8+K)+SiM|`Y`z)F$IwMADdL)$F~y7C0p(UeQLN=RNbG0yN~i8U*En=CHtQh z0=$=q{icuOKY^!AK6V`xuFh0~M)HGhlZ&z3pXB_$eh|PMxl|c#pLW-MS#n?K2l$bH zzR=GvefLt#M5dBFs=<52Laq#;c7pD5B^)n?U-70B&ejO&@TqG~LmRuRf1Q=iYKwb1 zLn*`(x9Zk)8hjc%H83ydsp0zT^C^fkek#;c#Ly<}XmtSurxOEamATW7)F~w->3X`C zc@Ifmv%IGHaegSEKoXGUiChYL7{B#=D)ifaF(Pf0GI@?)T#8GEaRWGyr_PeHN24$) zc{J2Y>^_mYR^>r(Hq@es#@Z;!!uxo-lSpqf@ipWK1=eZ=hH+RF zc_qQ63E^9Q1~991X2FrxJ512`X62)Pi#9yfse(2DqGHU1+bq={3pljPcyEIP1@0ybw#!+%J@RA|vaLSIH@Yj( z)$e1dx!$WBzHB4L&b=8euc+H#*&t zh~obKbj6PzJlW?MgSjkATF_*}b=h6=(LaS4UsuWJsRVqPOaCU0;{|0J%?snV#PRJ5 z0^d%~f4$&OPtyJ{bW0`9pP!LAPm*q05@wR>xByd?ih`x`;edWN_1h0(=9RvX59pC+1E^>S{_j`2e`zV|JL0tqnj z7YaJoh+Mv48{E`_P|JX~IgqVR{6kg;pZAyUB)XilN@l^tP{l={cSKD`To+rDraOp5 z;`>!6oP<3@ze~^pl;wHNq%7Gim$S9=l1zmsy-|5^?S%Erfte(&^}VU#Vzm6hhAY4T z@%gD7;kE7v%MG{VHM%^sp@PqhUjrC;#a~*FH4!w3Va29mXB^x(U|UB61NSd z=w65lbqA>JL z(|rBL&JQq)_4(xO!T;_7|AnM&g1KX5-7xF0V&^)%-m+)HxMW!chCazhY(2PLm7hwB zA+J0y znxcAc-$LX{kXg>YL2om_trLfIe83WvlqC(?~sre zGr&dkH$Cb~y+7dXtt@*Cj$Y>Nv?G7hy~t_rNxbbzA^r04QpN_@`qO-S<1+dFl{Q&e zLq7&N3&S;t5km?}j*DmX<~MV7(jN&X$CE!=M z^go3q;8(cxKY^t*)i7YFsOxVs$bajm%m>XJ5*(^Kso|n~nKXi1T&fmGSfNDhXu3I1 z=24w4rz)QfhjKHHZ#huuI0CS8<^1t-=c6pXIjjAI2{ z`}@JlBTa%OY%2RuWvx)tp>k@4R6imcxS<$Z7fE6s^^ngT-jL&iCV369DpYEzFMPap zyo23q_ywfGNwl7I$kjCHguD|EvmPt7?Sve1^r5BJWGwGrrnm{7)aebO;xN5lvJu5G zl6#3_b6258eXcZ>1L)X!LYthbgLyl|Pq}<(_KOueIRzg2;OaROe8}+;U?YoapHkj(mHD5~A%f&aF@U7mx_5yCSfP55`d^<|t z8n?E0anG3lTHNp33i#YtKc=4lYK#110P!9_4Ez*8>~nH=tq6#?`e#~lpEG^pg=aZ? znGOjJ)_1z#tk)Aa$Qh>TPq4^x*XJh`|@ z&)}6KRN4=RxCHTeGl^bwhsYww9|a^-rE}kMrO)hsRKx z!Z1i2@x(7tI-g@>5+Jxtlmn>rI&;2<5fYHkXGr-ii#<%6KBZ1QS^)`EbgbTawh+eI z*~GS$ms3)lJ)auw`Eo1^~kj2-{D=dN-e_e!%PQkelI*ne$6PQ|z(?I!spAn$d4;SZ|ByMled=r<`_e zBPmRVzOucEJc`k)0cH)&Tp?f8fol(v>hl4u_jkoaARP|kBMHmgB0N2VSI$R1S~f$t zeW4U`L}MpdZu9|lX@`Pu>0!NP0FAdjt2>VhSMTl92G8wc^Vvh??WJ^$7|j}a-R`uT zT)CtVT~1>ugMzMcP?K+$P{%V@i}4qGFP8-%6>0lw&V^?Ao5{6;oYXp;E~>|FD#iM^ z3iM?x?C^3M0x+>gVX<(0<@hjP6$FB`MbWC96a{-5d%S6b34UAn0=)H+{i*tJ^CsJd z-}yy9h{-?wr$5@!nxApf`OeIn@nx9!K*PjY^Yno;{goU)$VGoV?R1vwOTvO4I&~o51XHOT@Lcu8=#5Sq{t00lCh)(iR z&}`{+a9w=ypZvt}sASu!RQRHO^uuXl-DF)G@-+3*gEae1He&AC>#NQ5hUx=-&q4_R zMfz@Gf@k{XP(i#;LSSbq53TTY?quL|r9#^*6~`Nx5vM>Ot*lK~?&20PH0tib#yt6e z;!KaMPa6>0HO#Jk9$e@XD!VAA-33*?Vc5~a0+;ec)#{04I#oDj+Te8Adhv?jR8efL zcwRHB)l}Uu1rJfPBVb#80s5I3C;3D_OTFb6#2+CDy1KPnq<%K9CrpJ#2qh0B$~^eU z10BJp>wq{>^r3U6@<@V)=+>wMBv_=kOHNl*7X53^wll z3VChDn4FC*SvIt4nIc@9BaY|Ajhsv(EC|4zJv(ISV*EOgd@$B>zadiai5pv z;tI}OF5e!L9eZS~Lb z?S)@Jy*O$QYH>(0YZx;lSTC}v&BCYT5E}oJYJmI?R0FOtD2f#9@2WxQ{(qnvtUs#; zZ|Z>ZqiSFfutMwqPpby+(z;iHxHDz^s1txYncYqCgy0N5sH99M)HX>7pd2) zTa&~1un>K8HEM6h@Otol{H6?>a?!}rhEM&(KDpSZdoIAxOLHhBjOA z<@8_^j04D`+HviahOp}Son+ok40@Um_9e-=tj;2Cr+J9^0?nG4Ej!t*J3o-{nUy!% z3$dY3uSHA2ccT>-8Q>Cdh0?Vz?>?VDZ~4ig)GP6ZNhCvF z`6)K>+bGaxp&qw=`g`95`y2FF-u;Zgmy;+hfM1=9l<9T(g%gq`7uViiXzwWk3bc13 zu&ptoHuL(Me+c;SF$nhWTntL{jmzr&q!?D_@E1(Zy9)yN^g-;&Et@)^tvHV7mqzZ~ zqoa(cWqYs8oxbH+>y6CW#P6;J_KRDyF7@?qlnp<4d;h`N`*~~#?8I2Va@=ZnV%>0# zef>l7wt>Ovm07V_6{idAS-@kFA$$xwxL1PVNzrgbYn#r4pJA%G9gnHG#Cd&i1tEVn z6GkqmHp2MO&iq z+IGu12Z>kQE+%c>s|6=d$>AlOGW{kV7O(PPbiU{nX5DG#D4L!L18M-~_j%TM*Y^zR zxv4{(f!>~QeR;HwA1MQRqMnUREJ|AtV1Z&;1-U6@E{l*(-Mz5`oARHS7dwv*IG1f{ zP7!nnx*PgPBcjG$v`aFxj~l`oCF99DOQ8xcE{j;d^3DjP2YYslMh(~`Hxx;yX7nhLqdy%WUpw$pbm;K{=1%@SwY5}_L#hph zC|6GbRM^WA(!{IhzDgy$96Mm*M1H!Fkc3~KNq~|Z?htx!XF@+DM$fe6aB|1Nd`Q<` z&tI`oi&a{&bFm)VraGRkn|)y@uM_SY!4r6RXvXj1m+ht>HyRkvWeKM&qMtQ$94L;*HFAa&?wFzdM{mm~pXi?dH8vj%*uOis`H#sA_L~n{`hLv+OV(>r z`)N;0Ce64q>3-~K6)+)-HXtaqzLZgy@8K+d6dQh_Uui)1WBnnr(J%P7gQrew#$N32 zEwxLYZ+k6FTHEPB(f7=*pW2H5w|n*ck?ydd3p`5l>-yZ^a<4Nr+Y^V?;<@hi>beWxAyLAuT){=ny}(alKzJfn zinQcg6Ew;It#(#TPcBAD*&Sg{vA;NFU9Y)=KQ>*OtI4~aUBpazz6SB=#}&Xwx z`DVEaqn@Q<29?9raPa;(J)UrIJXoq!Va^7vkp}}Jm8~CHTk1+&eoVx=ry*2(zOt}3 z>=gBqPMi69k@1glrkuJ(}DlFp+ z`an&!nr2k@mx6fpj8EmvjeU+wJ|mP`z0CdEf@|FPcUiL*utCWgyqiodAqM9-=cZGz z7PoENspzW+^ynG9)uQ_{>%mRYS7%6%>)98hQX!a^(x|>@iaLEg8_xw!p26Mn@ovHz z&2Z?GkY$To@W|?FLYH{}_9P|n=-MHS^+portqBgi(+>JQsbrar&qHf0i$$59wJoAo zFN7~h8;{0eyvLUQHtynNF4v_=w6}e3Hd?o&nHgRv8`04*eRes<91^)s3{s?-) z8<*1O(KX5cGPa38e}We7ZZPV;`M*I62blXolOtwdOufyDBaHw?tFUHL4Sr=IA}?RK zrrzj7m4ZOzqJ+MMtiJP%ereo5?x&d5vV75R3-jHwC96$6t*yoVqFQZ_);>A}Y;Wvc zM_J|kKW1!+gmW+KXqgD5>LUisTm(2U`DJoI;%b=q$p%{ws}IEMr4-zG(JvP1OPWE- z%#ju!jCOd1d;*F+m^z#c>&{^mPvGNVRL3*71O^Z}&49K>VS)A_g$A^liB0E>jIv?X z!9wB5mxnsKX+|!$iJlc_OT)$P2-|2x^%FRr8N5e~+A`Yh10-N1YI4C6foR&b8>z{P zV#X{rEq4l4g3Lj!u=rJYPPxXXlpPMbxx!2_-JW=(Nfs3NXlQgDMW0n*xUtmhR2)?_ zZ#%pVPdxj=H$yeGNX+2|NKdhCQ51CX$i{QyEZS+s+wJ|a_pk{pqSR?GuU zasykDC{(vCPf?q}XZa&z>#e-!Z=gs22sNcrO}Ia(hb*094$k%bHi~qqj%DpAy=+J{3Y8nE81S=*d4Vy0d!lW|<_@vSjgN0PwH7YJPBstNn@;sqXS(XtI`BRqxxA^iz7xqY|iOW2-OyEf>ba`JD zTX=eS0d04Eoq>9MXiyxIFr&ocb<=1oW%YFL730h%(=i-!!utzghE=*@>DcJHPdYY& zD^YQJw#Q+c*fK8s##>?UX}VA1QCpM?$rmA*BmKY?j~j)xOE64lW3dz1xbi?%b@NlX z$p45@gYOT2Me*}5CEosD`Aro6OFiw6h&AqN+T&AAV+b*~^IvD`TR)-J&7i*%;_bmU zmWk+@>u9O>7Q2X6`_JI*DBT*r6p!7I>}YKEZnl|TO)Rp@H>l)V&VZ*zACrB zW+8!li!Z%-_MWK!+M_Wy>pB1KLi@Ko^1G0)73pZ|ESCDNS@Y}wO#Rw0ugMl?6zk#E z<*#054^~D6hqxqF-UIRIe0j1oDaDFqf>$aQG;Tr=1La+)H*V&DV zm~G-hx`)Z#KvRSA1yE@7Fu4Q^!`Yk4b#{+>Qh>5^IdyQ3ALU!-#5oNzvksmJbX6`o z7y1BoCvi1p}seILA4lIj{^$AmD;L!llM_zNkUy z{=lmz&WAlYWWXd=3o_ot0cmR|YS+6p+#3Qv<`0A(X{06VCw08H*MJ|H$#U7{$PVlqn!@86J#IWcSZvRGcmg+)XCtZwEl%4}XmL zn|FsvXT2a9GSw}BzY~N^&-3l4P>bu&krv$01;}0rCaZjV*YxKpOsHbkMEsiP}4 zA{`}<`IzL0FiEpHT}lqw zb)*Q}n{DM(Ok`MqW@RM26Vx#*-ZJ)dIMAGH&3FAQH#5x}V`ekvQvN|tG!5l1nlK2e zeRhA{IqHw_`^PwVXGdP>vt*#AUr%y=BnTnUbZF^X@=*`I@#|7i<i z^`@+cGy4wLJTs$v9Q+1Zugu@cMc_Rm@jHC)=xuRX1qiHV=$2@jm1S5z)E8uC{xgCn z`wZTVw*7H!tabM~eygjr2Z_BMgaF@9LM+qBi9uj=(qdS8FG3}-3a`DNgrNIj$9p`4 zxhbmb8@zwE?LSx2-{y=nenGbKIS&-MPlNViSHk)hBX7`^k_Eh$Zu{i9=SRJT75yX= zOrJAT%Tidg((l_(^M~4m-|}(yav~h}BPc}9n`?Ig-fL}bdb9B(1;1tKH-UmuoncMQ zRHm>YQWJ{k{}xmaqAnu|&!BRc;&~qRv}sO6s$TN}V^A%a5+6jT54W##+@NYxGrO52Z=KQ2$F+t@K`$k#2DA5eR8E$;mCyHcX?W! z(@|D+i9o|!cbPd_PNVZZe|`@dcy3Fp{l?i7ZKnHsgxIV2S5#z%JaFrZ9I%thrH*Ue z%0Y^C9fpjRxV%T%>1Sp$!62EIQduI#EPwqN`~LUsGwn;~YJT4>`?C2+uYJ6SBACp3 z;mpq%%B^><^exbmQs$N>W><6tPaxdjq@^19Rj~(t)a;2y@j@bR`*sT5Jqxls+^)#c zD@^S=q{|b0ZYaFz`4%Cj-E(@o?Z5aDxpWDO$-QQd{GtA#NwLbXgnN3T&SfeE@uk8k+0jtL4bfr=_BP61WiGfrBeCs zU!+^*%anHnogw7~WL+(y4m7Q)hl53%7BAU-k2Zn#xK|f>Kt!cjF3-Z*ly&bEjVN(o z%IH=M5lF-0%3DHxBWL%XKyxHM8T2kpuuLhq$6_18t6_7A-~kG9$akFu~f-x$4ado{q7KxHG{-6G3JL4uDqU^6ZjyZCYJ|I?uZzZ(1hbm+jZ z#{O@I{vEP)D!!?v=QEmC><0XB0!HgCKh;b5K_F2rsz^kmM*8beJ{#`M0z`SvxgWaQMLUSZ1PLOu>b`LOg*v#zpt z7N77rU?X67L<0ztFBTs2TW)^(-mD8Y{fi!S`^11Nbzv8Wy*u`1gKoT>$vLIf$*ep#}UX6bcdv;D!$wzZ=p zt|M08gwE?j=tu?8{v>q1n@+R&c`y!;v&?HGGwN7K-u;tj` zC5lUzPzDZ%AYP7kPK~T=akk-dW5RUH;Iwj&9UtR-(}oK{7JN_;fqGT%!Jw4zW<;cI z-j`KQG5BGTQ?qYV8*t)~L`lg)O%v)*L${NzXYS=_dg$d=q!`Pj_t!Kwx7S0VU6CNc zl%Yf_%fsF?H>-*#xHGS5Ui>0qpjxMKKP-6>r-ZH1BfhF92)+b-7ZfL6MtVr4E*tBMi2WDn;P^mJ&Xh+4R;#ip1g>qAu$|ilB|CGq3{Cb*YPvSpSAxN zmHBlLKl{JhL7P;LjOd8)Pz#Oqm}*8UvasZxG848z|PkBM$DJ z+^hW2chgNZBVCkLTje4}zEnitP__FJRcobn?PI

    +0Llc-`3-)(t5s;zND+G&suw zTimvb{1%n*#>QY<%O0iiLk0C+fULv|Pzq*M==V4-oBoT8u1&0bKP%h}5tP&x zl6K$79K8+*>tnXrNIR#IsOKcP$B!$tyxi#UOU3lfD*4G(;ePg7={)!}ZUUwOx<$5NUaTqGpwN`KDbCHkqrqSI1``&#O3qb*!)fngC~;ErJ<# zk)|7UiK-R90xMHe(`2k5t|%n z-pwM0+16N`>aXv;Lf%fqiM>O>&#PFb!gm>&YMVI4NS=G&#QPrJ9dHpt{%v^M=w_RE zk4Z{NmYI!}+*Wn}9@FJ={55TNw+<-N^VgUzk}b$DMjE+(AjbYO;1e-+p~}m@n7<4P z?0;aj*u-gd7W}Lyav%{8c&W-hq}^WlOGO3i%rweV>|Ce`M4vAMlq?B$DZwyKtOLB6 z?NJ92qUygy-E_ih3(fvj5XWiSOvLkoQJ3=}LIy4|+Pf%VcCpSZRUhsZl}3TK64y4( zk5QrWy2_uK!a2@%vz{ZqDf+V_=Y(<5%<(WQfT<=}556b|YoZ`5peVfHvm?~K#)J;F zUg8pih|pv$ylGUaWns7INXR4C@j|9P>LRDxX4pKP=yhlSf?lHFgqLz!Muw9@F|C~| zv9EFS@_J@M-^BDF4{3h|Ur+HRK=i{wL*QIdPv&7~E0k$ne7G-UYk*Jk(7Qqy!L90C=4<61 zCJn)BT`Q|iR?vHRuDQD_%z0+g@8{RRwtwagsyA`BeG!^CeE8FDdntALp2`nm&T{l; zE{VS{jSZ=RAB02mwglceB!2Yh(GBe+E+&# zL%xeZf|sfHjA%yF3Yp?a9{#asA5shWmDrNr=iyFL+b(dKTZX$(;PTXr7e{RR3&M z_V(oRIv}%6`_6IfK6Oh;%8>}DBHl{QLp&a^=>QkUPLH)|GrLyF=B&AD^kK5uUgXa4 zy)#u?g*?H6j%V}kG+1}VqZ0ce9k z---$tpN)Tx z2yVAJfiJGfFIK1ad%-6NluP{ZH-+5VOx>pdqC9eUGxBuv#Ts`e)tzn+seyi2Dt9t_ zJBMX94G!+pJM2N%oFoHY&-RF-0Fl$p7@dHCi?Y2j+7{imqB+lgLEfI>!dcxWpGJXu zRhyCt37pmYHM_Wuvf(J zj=o0@{i;`Q6d|5H)cbt_cUeQ&YJjUPc5$Om`-8T(W&-b39#@Y0OFXV>d}kj@wI=}e zu3c?C+g`R))xlBbZKK(yBinkqKNJGqhh(O%)9x2dA4A%Pxr=4YbCmA;5al$mttR5E zw~_4g7U$%4f0u>zwl}}cNw!xIdB1S)!K-z5wtkLDzi#dwA@-W1J00B~-!5?36x6Q` zak^~#Xxa9#U27oM?~3_0Kiu2=yamKxcYew3Yq@YW?6FjE*R=PcRX&aJgSfpxJI%!l|Ca`ZTG2Kr1vQq(Wzwe=1 z-}qL3PRZha;#}F=`0d8Jt6XHi=lp)(moE)yN7C533h%wxX=3&_Y|G(0bIvyO=&iSU zAHd4<8((s{{l2~Mvb@vNm_uN*9S~4&H*Z?j--bH=E&7u9jJ^~^CP2o@o4`J835dL* zn=IL+llL??%^$fO*3f|JnbdBtI>H4kmBR}}j^{uMiV(FThc8$+rSnvx2jS6ONzv@x z6M4WuDy?P6D^y?^T2uB}6)KuD{bG9UtVR!12D6V9F;G@}?SWYf#Jrhe&sNRv>c3F5=7d3$xx^$wc`M&C*Bc`J%h# z{$Psazoh}DKT?WU(}o7*_AtHOHu3(zj~a?Ed5=vu!k0o5(7VsToZs4Lb5&Lb-OpUp z;_qj!!2gcneT)wH-!Z(8(EOk%M1MLirAi*mahE!zy=;gwqP1^&)$HSfgJ%jitRzh(joE{7>tD>eS@g#KZf@J+9$?N2)MtlX47R>Us z2``~!VXv}&HO~uiW+>s&1H>!zJXQC_yQC=8vRvvkVrs<5vy%z;ceNXZB8x1H4vvr0 zt=V=)jBDA@JaT8yT{%0*yqG9fu1?Pdc-;}>5b4$D!K!zjQ*WM``IBpmQeGOhY11)D zkTkK`yFZ?}a-V0ez&{?k%AVR55a*sWv60anCGLG;Ek`VH1DSR|&Rlm^wOPW54rr;E z6My1aj`@8-lI!m0svd&EQUS zy=bCz4;-FT$L9d@V3(v`i0&=pBspa?=|Ct%8Qe+tibsy=#6|i zYquamA?4BzDK_}EaxU&0&T8683oewaX*UpO4AtmGge|S5+K%mrARTT zdk|o`CevgqwSE z67kFAq}{Qryk{q+@7YNT79GLP;g~wJ!O3x;oWq`YbO4RXd##%uov#+crA`y$xHpKH zLlLUwy6&7!06bk~h`t<%O3N*hcKen$XWqQrkpmx{WiXa{pTN!3UoH;`=h>Xcnem0q zbCj_n3_g@&fn-bIz!U-l4?RYBM1YNl>!`5pmP7vtDmXv1MM_=J1L|&?Q#@U7gOf84 z!MH~G?Rh-kRi6+@Er%V+s&0hN);d-IE=NKyldHm72;AOGg5%lOo+rw*?e>|=u0Op_ z1Xd}@iKfBF;2$KG=;YR8Cu~`6mpGh}F~VX0($p?6T^ZiP1dEQ~)RsLao?Fn(vt%q8 z-aHm6B?3@m`)s+IsM7M{-VY{JtE7EWih{1P?Lg2j+`<3YxNk1~P9tKLbtZ;T1 z;MO0ELf*9WPl`g4b_&E#Vw_r|- z*E4>V)Q&$hy`Pb%!Psbrikq3Io}toKmfH=N`ArD& zp4N6W568W3Zfb2MTPfZ4>&+cTQ+IC1335d7>R4$i4S;}DT@mE45#p*Lx2piAVJsO)?xrlORSy_lv)B&=50U~wxINT@qSaOd_eU%OO|8E zm@cCQ3fMj41r%H8M+(C9>O~`UU7tqo!{H_+po1qLa_@Dj89id22kZ6VX~YtMYk$#w zJx+;C%&JZ0(yoGL+;HYel63d5V`{K1w`-O4lv6K5kWp$(^w?FJB@g?ceArbyC^Ied?h_?>7Rw85^CCNR+7d(|FT6iAisp(sm@Z`9F-SFl|3b<{M zaMmhs9FPQzyjS_~08!UXYzg=?a`uh}ITsi>>-qEWjQb9c;^dLu`SxO6hz)zukbbeaE%4PygLY6b+*I&@1>idK+PKa^H+MNIe_+O3q;FtXnEa3iB)8yyS2+^P!TPC#+09D?xztQQgeG8h}4{g$~5C3;^;Vrusk&O}p zltTU{7``{YwH1FJ*3Y8?{#SMz!$bVGFN(W;$B?B=Sk&^M;WD; zu)f-};ck!7<8`c%b16%0>Xn_m+>|Ljp}9H-HT+VQ;{voNGi)PyLv{HHE#Pz*AG2mv z&CqLHqCMhBaO~Jz2nBg2x1FgiNgxjL=uVN?EV|NRq8#1gj$MWB0PyW$#0^7Z!q{Fd z;W8GgjhIMGt%Gz&50sc6ut9gju&|J&ctvRc%*3|$mBtH+Xn3}Mq?`rsPUBS*W(NZ)m&I**44CAb?$JXH56+nFtObXH>P)vCK*d`3i4N+1iX zPkjJj)niVMlJo1tOb^nqa;rDB26;RtX+nZa;7w~2jR)2C&ot{lo@gdiMt4Q9$TgMn z6!}$vm9k7spa)=J)*B8PNVXj!eiyCMnUv#M#x9bA-5y~KdgEn@YMShXBaBj~^$-gN zil4OO48pg^gPVQps)wTU6oIy{uk6Feul&hzQcJP9)1BA&k;w?pJ)AGQJG~55U+A9mvx>*t7_&qzcq{s&xRh0lewZfJ}2u zA>R6o4v$B8R_@mX5%RV7lL`+`&(kAiq{0JV1vfmcP01@3amdO?I5QGG-&UrkmpBJW z7*oc>;?C8kA>fTG?mhly^%|vc@5lGbV|&;QHKvkJG+A!_ln?iQ^UwDJKin(` zr1MGGCy>@|%v-zC$I4&gJCDjXWMcOO82xV5eFnS$Z)|t)ue<%_%^w-vW60^XOq)Lj ziRRT?&w;nD@6bb`d+mS?g7(acw>X~3x6yA0gnG9hH(eXD^a_fEh_B%{!kmWkEWX?i zJk!3!n^##t5$zY8>jdTndDLls6FB;Vte{U0(w+G(bL*<#brfJTYxf$2<+nNty9@H& zQ$lsJXGhzEKUn(NZ&eN2FBF9D)3J9%_^A-j-%Q@`l?%u$s@ZN+qw@C?OD+8pguJO# z+8Ayl*&nt$LEoc_kdK?u+2j5ppo&g^h$*Hu?YVsf19+SCo!IzJa$#-lT{nzBS7iBR zsM5YP2)16l3+Kv;>S&pTUZ`>P8RoR9x_Hv%CVNMjWsXz)Y#@Ufvc3RO?MOJi|1`HB;POkMTl`IOzIJ7JQ@;;aRk-*0W8ylG9UEx zga)ewCvr%LJjZ6p$laWjIR468(g0c)<`SQ1Zd((>RlJ_udqK(KtdGvB6A1^i#u_5X0$Z@M)oxLt zNeBCY^Y#I#<||9-y@0SLa%y>8Iq9^U(-M00u3r2E1DPqy<(?_Go;{##{_KW}dSEM4 zd(<-bST8~vrUY^h+h+@;$J0M5!G@pDe)AWn|LEWNV>N|vmm|l|D&QKw_0Ar`X-+++ za|ywZmH6^Y!WiO*TpnOk3{7igW|=yD6gX{k_yTWRbbRL{{g>5-$kQH0MJ%!*%!@39TXD%e2x-<5LOrX&}B=UEosd9Tu) z_iCFnv8~42Dz}Z@#)sr)A8Too4;+(bCN8cE3I%YkDrd}h5`zihj_gUEKgZVTp#byQ z(S=y`MfxI0hcUT6I1^pwu)J^wZsvFsZEoGclmy2^4p@!6nwx1r0m3jP0zNYDZf##q zi|ljzL;-T3k&qI%^&OF;A)We!dd=v32-Ty3xZDHgl+$I%jNrlbeyf#Xb?07#v@F?t zi(TFxw%tn+%xIM78*tRQ>ER!$`gsUfAsWQd5H0MAS5qUOjEhllFFEN3gCd4)@ea)* zOG6*R#2_YNw259et{z9s$YLhB0omZ-a-w4L|4rL_Y&oheTf=>x;`AB+knp1MHSiuu zc6l8Ct_G2?VrWoQig5H4K< z98J1!t%)9=Bt;2F8taGXE_fjC+&WqlU2larXnD?njCDd5a(WU%_T%BjrZuni3%xZs z`+6c>GLLqj*lL}Ucs;%$sBe$5ioFKj-1p>Guk10Cwj3e~^g@VT# ztW9rfov>BYaE>FNw$5E@!m*q7A~+OQ%ro~J)*dG{s-ELh9BdP2ipl|9Mu5f(E@P0% zHoeuynDmtLULnkLQRw3<4apmh7`MPzA3maoTS|R8%-J!y)|R98YU$8yKDM!5})?Ob?JT4eh&F0$T~kiQLl*^=UqJq*l~BD)7gev()4HjuaxDJFSvy6!lKVuz8Ulw^MEA zFmNWfbYWFOvwFpL?LRj>;26rBpUoCysis4>#}QlHn>)QwZBG>gPv|%Rtf@A~sLh$y zDEg*UQiaxP;Z_L* zOL@X#${p>T&e9fR=1YXRT{k27qt}#H!W*GS0vD%HjeOh^r3saQJ3hIOLaZn=yVnY0 zU1rcY^Dv;NrxPXmuwg0DT7|rqO4W-dN>dJf=bYM(_q^RBo|A7k`t<0A87;{rjKT`0 z)7Icf>WVpU0ed*pzd6;Ba7_c$4hF(R)Hl zs7-12$ff>v&dlVhru{i#_m0KyJHW1#G1D3iP4@LnfDqTK55v4sJN20SD3yEkR?0Nd zc=xOoHwxV0Ov3PGiOfU|1x!`yg<)7L0>!8Tf@8O|ELdnSSy_F~*9_Y2pVqA2htoup z$aw&3SD_0`Pt?kD^}=WTtU*-!jHSaV+-lVIrlfP|p{f94%!DhA9g#*N>Xi3~o0>gz zCu_`$?l^OE)nC&MQ9D!e)M=}%az#-mYWLUczBHzO^)gv{8j^<4${k<=+OF=}#Q;5L zbG>{#k0ilmN7nEHhk&>z2QtJ7$QWWaRW+6kXJSUEsRgSj^Ytn2>iV9TdKY8Y4FI!+ zIiIs8j?p_cp=~Kyr-8F|4%%34qUz4~U)k+${$DPFJm*?coRfc__5Nbvipx_m24 z-92jJJ!)=UTg;rxa>_9HssCQ?t@`!!E<=_xzLF;1WgW>zk~ib-Lz3Wo8TMs~e_6$G zHsC7{=NGpG9SJ>sf9GC5>79R-fYYtxbM%&ODBrq3U%YkS*MQ^V_IdHhPk$y-H~RAj z!nDFI4=aJ|J%&G6LqEAd8baLyAEeB`wEF#7;^&7Y_)$!JeG_1TKjk>*9~@`qgX4VU z8fUdxdTI}*{qg|m+0n4;k$>2E5=mqO)1&b!G(dAN-g4^0h>ymb<{HlBruSGNSIm*u zt#}zZS#mMQLJ=L_>j&38Jykg=9{gOzD?>E3*|ob)by2zTfX+T1X2ek~>Ep3O>QRhk zQ`lC8NA~tSD9uTY`>aVCJ3d)OosCMUd)`ZJ4DNt+L<^Hsd0LN!45$>Kj0^MFXNqd8(iUA@# zkw-R2&We@N+Xg35{H&7Dn~M@^Xrgzw=-3;K7nA)|nb8nxB6c-AH#onP$Udn%!B+QH z&}^h_0b&v(F{CHaU&3T}V*Y^+_If!NB>y_y8Hobo*z4#WGC;WTOp2$ z*vf)t=R3B}&vK*#F-2UqRBxsV*RQCk@~%Nlf%Wt(-F$clEJE>ue(=VY-qfdyu8eTk zmQlKpR`i5O>Y6fIUd2_VG7dq`u^I_hS!$!VMHF4Feuw2>WO5{z9~L)^GUMo)5sJv{1s7MgElP zMs}mpir~9~X`)xsy4sc(W#Mc}8FXi*8b#G2B3TRF2Q*t|RnNlK4sVM5)SU*9#VXyC z)nPVDvxioRzFxmO*+1Uwz5O>n!@j=&UkghQn)Vl-rA#_c@`rb)?S-O${Qh&a`Hvj) z_=_@%aV~-5Cl>xm+0FMQIBkA)`CVu4Cw@HbQ_RU?XFu00hUb2|h!>P^e zZAy7}K#TaWkvhog=s0}bdz6>OykQ%0?CDqbvKeStTT*eRlDG?`?}*_QJOFgWUT8T` zUz1JO>bbB`#6U&B87cHBJBuWS8bqE`q$Agrxy|{i$ItEVSY}P#gn{dm0_iHVW-}{q zy*Ry#RCCgYK%Wc@Q|;3%k2Nq4FQa~)qP57eYhGRrXtdmy8=PvmLsC+Mw6GrTYEx3N zDK;1O?1K68q;<2QingLG8CrCWmxiyHse!AB#hK6+s>=2{+*hbGJV=MFa}cbjt(P!# zk4`R>)@$?3ng9wBv7ZT1jBxf`_SQ@1`KV-kHdc59fbN{>EEEK9x0HQ8pG^j@oIt9l zJs*7zeYMxI9YaVas#i8BCxQ*=Flgw-3kN;b?-lWS&`K=I*>NgL98N z3OKEcK9rP8sb15(9(?eaTh2SZD=#NPc$~fNR4TcUpRG8`CS(2H&gOwQxgvlcwzI+*vu% zTtN46?#!QXjUJ$;+0Sf!!>;vgh<`Kx#TI$-?tT4-dcCG0P5vXX|3qZ!Z^dIjoEE!p zPK$T;n&p_0`NoXjFqgduCu+I=z7McxOw~C*W3>X2z@`@YBWe=g0oHPYwLlWB=Qy{x^mJBm3~K7k5!2 zg(>_aXKw{{d>EbDk{>tKT@}exigC-Bd}Dc}zg5bnU`TCwtiUO=e`{C?PF{P8SljbC zkv+JH8(=qL)^4mPg31bKs2}K(=|U&WrE_TJGW}^qScshL7n_5NF|#Fm3t;BrpNjnU z!c!J{9breKA9~=sz^QKH0trUwBoyXy9!|@+!5x;LCH$_(0qXd1{)|s`bRQ(sTh@lv zU((cwXI2iM!_&$i;&?UEq_MgUc%~8F>8-=>JTyEVQtHtYWrqS;Jg`j_LyV8TRYYTU zV9r$^xGw_UY7p+b6N9W_eyWY=e!>M8Umh7Ch{^3UQTBKG@jIK@$3GJhQww zyyQmPpW1E{k_(JT?EZx|`R2h1Eam3M&3|$4$43qL-SF)*$1ez|j+d*x#Ye2K)e{mo zk*`e#leo(C0Ot)#+SD1Y*{-3sqE>nh(=otRtB>g#nV)Okm18J0`lkVQ?%Fm3H$K|j zx3X-hF7-7;MG2XBrK|LR-wu)qJgqBj|74lS@DfTb4Z-E*5JT(*?O?{(7KT@Oh48 z7kZVri}-h8J@;DkH0ZSrkzzTuY~u)svc%F}5RI)WEtq$_imS^d|A(>n>jcT)#NEG* zxx+`y{YEppGwhr@9nBbn@JQT2b^}o~f1lAk{*PiVbpX9@(JT2edVQOw_*KyR!~4#n zzJ}HxTyc+Uz~@Cx;C{~LYRA$H`%Uuyn$4|0zS*0;`GZT}%i_cY0g?@?-Zy=1&wV7T zZ`qk|`g!M%Wc4HClepv+!SXu;{H?$@@ORUyXgNPPPfdHpvYt@dAE@WXAnAPzm6~{{ z*SdbujLB+LaBTsrWDxt5u&Yo}4u%w^sV0vlpeTux_ZJ%F#3|dYaWy8@4PG(-Lj0D0 zl0^H!oh-!>Q_&=N4CgdoFo15HlUbj$na~?Q4Av3A$%I2TTOeBI!x_xr1CK`O<8A#2tUA;G?fPEwhN51(C0$ z#&dH|jdolLtU<0k-Cx7k4DOL;2XrR7Ta#+TX#qcB zCJk;(QxbR{6-nlAZEaUY=pT4N>e+0*=mF-_Q94}n>+a$&gMQbr+Yq&FP#G%NzFcs? zrXob0O3pdgFW=;R=x&ZFyS%PXdg#Du<_)WZrIwzo#|!QFS22^-QdRA^))IovkL<#!O;;dNYk1s$s zY~%DlobwO$RR2-*{gC$Qze)StseX;+=BeK0>G+_x+fey+vi~;vzW$G*?`r{+PoK|C z{xKj*$M;W(i|?t9=r`m`-lD8e@+Hgt z7)a~M-?;$z=FYcj_b=1IA2)qrTYMSa`$hz#R;~DH3Etm-L%{q5yoL7+$N%9l`4{#x zTBKp#tpQ1sz|8XqXnmAnK6l#Ub8SY!s=RJa%^L0VK$9dR-6`y)U>TzC?bNNJVenbGxnDo~ru8g2>2jNWd{F57rr-ehD(r`R2 zRaou&DSdaCCUrI$dDMzS+7nivV|!b{MmvY}BdkL4b_b3Hu{?!e&ro-9k}(ag9P-#{ zm%iG@$Q&QGna8evQBV*5BEtvPQ4{p?dMZ6z3`}D&GaMwfZ_!WFPJst>4sGg{bFY=2 zU{tlO0yQtMueBh(JPz#NXb1?uRW}9xFlnc9-~v}HsFEU;n7;gYO4LM_0W-5-2RIUG zx%(O&Qor5{{B-l5`qxmgkcS?kr*XS)Qjq(Svx$*pXQSn-OTnFnYgcRvqavSOv+H=QU*M;%@*U7@ zH>qv&LP2O2g&a|HxqyI5{$Y|=?H1;m;g{PrD+0scH{ucsI7Nb5mlnIA`cxsS_eJn{ z1zC^W3utuC@vw_Iw+rm=1!*Y831j?$d6`~#N4oN=QXHS6o9LUB<87wU`ZM!n+=b*I zhFam1iN{QkR05L%Gxzcs6FhG##)euY$`{e}Zdory^^@zCORIwENuuKhzUc&)_Oh9@ zPd3{rNhTdV?Z9g_ak!4)G^zZh=-LsLyLx(ko3OYIMf297`7f&v)ti~neq$yWl;o1; z>E^?e-jSW<9UsElV6@*FJm0Ke#;J{3S~=@Wvi6Q<%oi5I5{b_Kiy6BK=B!ZIo2sXC!P< z?jo1p-m^)67Y%`*!lAz2>ya`+)-xILfseJkoZQp26P2++5Q3(Am*u7oz1BHC>z=PH zJ5yON3cAEOV;TS!7KZas7!srgQlBQ@#AQx`hDhyqYCs(Qi>EHpumaggECo^!v@gaB++NjViCv%S`+}@Tq&Yc9 zT5F$0A?cPI&!Fe@bz<^3sO@i+@sefe!upo~a{%)m*g3)?m2=9c-N2{Y0A2nfw~1&Y za(P`9YEO~qT5WBEmc#tir0Rnm2mFy9#|au6e-0$SX*R#3XMWX)J@CPot@QyS0QIb! z7DJXFJA0SDFf9Kxj54jGfs#SDDnc43N+(?nRv;4M=;}JNz>O3n<62c-dTM#~oR8S^ zLfx>jC8s;0XJ>y5)tE~2WC`?zcw&s^a3w0hk|bOdP{r2}jy2~t1?V2zp;2yLZK zHw(jFauY^*9n4o@OipvTU+qCN_?Wx#moqzIOU*}pkv!WAJ#+q9)>XFMm=X8RWPJhw z!e*M*KhB$|jm4+!!bKH53XR&LNzNLaDrj`()jKOI`4%nL(Abt`e(R>3B_^il{;n4| zeb*NnH(lU#f+TGj9*E-7l|1T*cl=6(s(ad_ud|{ip9tr9xiq&g0jk=YUinR>{ZDvY-|LeK@L8aItHwzDhZfx<5uNP-m-ZKtdYX+k^amdn&0;I#t$6?4c%IMq zPaf9+FsuEoh^1N5dUZa13*Xnc^YOLn&Iga{Cy58+Q$UBIt+()vfH} z(+?v3EVp2s4c&ie(jGbQ{^t=B_yd5{!5I&dJ0t1dsI5hih4*~g#pC!KG_8vWy=AjF zp%x>z3y^(kNFXbdc9QJI0tODf4m&1ous5A_?ZLvHsf^WDqI*pu>B6-WRL6|`#2cJA zK9omFFKEwekv*Tbrk#!FmFur+jWMN20=5cMK>{MSdu6w)BKc{j`o8$Gn+bbPvMLls zW-8Z|)t_=%qMrI75=kecwdj?8!^v1dcxHXpm1u0h>WzKBTdpRxC(O;Q6uPUM9!><` z$JGNR1NEw{BY4_uej(^!gUsl4X5dnjm=4R%_n`m>j)GujafKeKq?mo)y5DgRfy@$X6v zX8Q^aLKQ_E26?p-z0*oN`NOa7z+VKjQYf~FU+B0uh)EHA&&LO+wN%R?l7Stg<7#?>_Nc)w(!7lo4tVl$FkBaBdN55-(F zUnXy$X3?OYuVBOOxL1`NAkdgEIG2>FhlRZf>pN?8{ZNgj#vuJj0f)NL@GfvKMA5Cm zZd_i&E;oyQE^jClsAPP(v7)p+F3|!Q>S)Cc#FAzpHMQK1P%)gE1dhEjVnf;GX$_NE zfq(Wnr_blo%VZL5Ps{TlhtYjkk} zW0%M_b;G>ZlVv`Z_{EiZ7AcXh5FO0umVN)bSVl3N`4P+Te;La-<_&e`@2nQq!2@Ot zlMyLjF!ip7_zwL0zEkwOEc}}m?h#tN--VVRBFhgb@nyZA?ucvj{p?u4@50U9)_HsT z5^nVJQ!k!-vsktR%3-?o_+n=G%e5m5fBmucX;RDALaXvwX#LYD`~z19II?fa;NQ+x zJZrqu_CJQ^k6+o|Ru< zcSs>}m3IpNwSpsqBm+j@EG7gxMyh$__7o@88knAR_xu5woeDt?iSC^?06@M@-`z|WsRAxLc{RE zso9Va7*@Ka7|e?`N4BhkSi)SzJw@ke5L);^(d=ylv~p>T)3cQ+Rn8tzRB)0Nmd+)! zyiRRGBkpdFRzzHKbF3$!C(Z23+qYpJQPL!l|5Le|KW5yb@R=}k_m6~`=0$o4O=x~A zjwK%(*{I%@OH!^gz!WB3reAc4_#y$+c{g z=ZTPX*}LbuIcj-9IqaU#j%-1Ye0eq1DMN-^*jfsh-+Q3t){ySKPEsH~$jR=Kz$ZM_ zw&FD8iy!E5xlFLEqf9ZNur9SXqmezRBZ_j?SiLibSFDoTwCIcX0%krg(XuofxZIEI zOtQ}MWnx8cOy+81xHE3&hMp4mipky@T+W!5!Q_Ifmb^Ywaa^@H8^noj@7Waro=T=; z-gDQR0dI=eUr!g+^mSzX&$)OT*nZ$w_#Zin{EPG8_Qq+O z`8VUY3_X|JNn^j*Y*WhuJK8n2tMSv2i3cLV8IF&~95wZDMAgqZguypyDfGJWtwm_V zBG17e_E;jgYKX2!}xL?~>EN|EgwwfmN={tBN z^G7}@Y36b~$T^JNEOgI#avVOu{XNk2^@4G^UXsR{BB4E=q{tZtm6AT+mvKFMIPFOA6!>&GqMP8}3PC6XQp z6vGa%c|wmoKo+}Kv&Oe5C9Ov01^}Z#(Df=YRVS~`%q&a{|FQHPdf8x?ZZf$L)|GGc zSH(k%0(E=0P|Qt&Pdl+Z@0W0(EwXE<50(Y+rdix~n*L=TALA?? z3BTtHTni6q;yM`w9)d*i1bmT=hj$s%E`l0qW=%wWI%pe2F|TQ_qE@2%xtc)E5G(C&Sf&C2P+o}8Zof?>=VmtI;rM{ z1Z3uyz8L4c=;D`Jshd(v*7ejIU_lz~RAGQUL@mup|L<=p@aEf@LwLRgdZ_>WfBzBw z?C|(oD*T7jIsUBxazL?>61f}XRp9cw^ibn|^%K{nH~Rqifqw9XOb&g>;~$tM{>7Q^ z3#0u*xS*iL2>uYbp+78Pcj+?}`>V!EkjCb_#%j=4iG`o9l{EiL#AHqO=icF)hz`Vv z{*kgAIA7F^ukDqOqIK}olNvDjA$4*$-=4hj_9mnMiuZv(W2+CKHD%9N#XjVzcc_uC z?nKqe@ish?hb%MP)?WfAW$rBI$r^MoHoFH#_;ev~^}f&-M&_PY{k)VM=s#VGDUC}k zbm+ZQh>5I=@#Mstx;SyhHge69XVQ6gJKSSn6!o+yVhm6+6a?G4{K7>isalWs*u{2B6UBYSsg_NO{;Caw99AG5fx_* z&Dj8`!rES2WQXLFb5f6HUdgDj>0O!3lxOvne;og*GeO&K%GE3+@)LZ}q$RxC#~of4 zjX@T*S3UsN>vTbpdiwAR|V%0CGd$896*jMaM-O;p(W=Xn2CD*xS z$5AHN8*|)li{J3PIFbE|% zip9dYUa_rOwOk^R6lOwk1mR1Sr|i&O9Rc>yt55(!FC(^g;(Sbf8EbR=-GX6%ao=k4 z!+`>O>-WW^U-=`z?+7IBagNr#QQIDlUb7pO3PFmqLwmWRf8dY&crWnl%|`xJynwwd zH;W?Zy#AoWyLaxLRv&*l>h*(tB10Mew>f%1MdbQOruNV?jvZf3@s}}_uO1-pY1 zlX6UoqnL5Igam~=vIfAC(jgsl$xkM+J1C!?!7OpZ`F4G{*}QHko3pSv7Q(_{;I+>8 zc)!~Ifn`{JLhTL|7_xICpA4kq$VbsDhZTxgw#bpFDS;p5DXHc|K_A;llh$f4TrCW- zE2N#4&9t0)?5b(!m*|C3*V~K78x+x!3*}!kK&w*RE~K+)$vESLZN}JeZ$T>jVwh;@ z3GP*h<`x^EfsQMty$|C|ZblO}aphuIf+3xqK1xq>f;WIL;ggz;QnF^?1a7l%vwJ(E zu!o#Fk$^_aHgkzUV{$|(GI`3pQNs4KbDVl}_S%+oje}&XZTu;(9nd^aAwek1O$Nn? zmWIHioCCy$vPRCDsozC(y_MUIO*p<3dH2cdXAtH2`+nk%6x+X61H(L$g55T`0%itA z<;1a{LoVPwY<7%!q<$e}KJ@#b5=%8CZN&vl)e;B~6U0^Ibexnsz+ zpe!jD4gQZlBd7>^^QWW1-@ud_nFQAD={HZcTmymq6p_c50QU(EIG`i zHlqXfOdP5k(RmZF8;SBRuJ$D`7uR{1p_u|H=DO1`_!!4~e4$@ygKlng1gB`f_Qv^A zRh4^bmNTExV2R;qkjeiHCYVJ%A4%q41BHJ86@Kxml&p2ORmddN^Xs?WWaF19^ZPmf zpvC~-xH0@sP=Gdm5T&G6&Hp+^_T}*A^)3>FIxc=VpuhG?-r3p5)SI?TXTAO)>il}` zPoL(;hXMYpr}+gg0Dm>yw%!CWBXv~EVsy(&wz035^^{(8FuBH2r%F6p7omtFCkFfSBiB&Zc}58CNmRypA#_&LXig>1_;7IDf_ z2>7`^NQ)Zh#*V$Q4b%dz?2bucdjd4!sgVIY)oHZtzWRbgULkJbW`Yj?NP{tzHBRj| zCbGhAW%)`(LzdZwvwrW;&GBych!$~+$(jgz06i6Qllj2Cy$l4rLSK@8iZ3F2J?DL% zUmgunYCY?*4|-x>I}UcT(@|D0Q)14+aeHozW^h_8Do`H-_&}&QW|6fgoxiXfr3}8$ zU=Uc^?Z$E42}~S8T^sXxAPBkNh?3nKc34H4Tz5O;mw>rQU}T7*MZW;!`s{SnHA5l1 zZ@Vb&Cm9p36UVG8|fQo^HsMiZ%(FQWu?wfFB*B!=tUB{CI;fP z)?md$j8)1Koj2NNv@g9>-l=hi&r^dTnow#&j>mj3a1o9bCv-=I*l1vErCt3hR;*!{ z^U5P0z+7?hYAQ!EbH2IU4T-~AQfH)x9+!U&7l1$GoANlTFR4L~Wfxs9T7e4O=es}X)AIDy@U zYl%9?ski0(eL}Bh?LJuf`WRm1$_xRtk{dB&#?zGPm&Y;w+A}Xf8N50+Me?Kqi02-w z2w|19L@3WTNGXDiI4&OU-eCnnsUeupFq_;D%&=PUcy0SkcywarRr~Z*W38#!xrxs{2O^onQESQZ%eI zRxEm73*2(yLx2^EOK8-`1|-3HaZhVnRklOekUd&NQk8D$vq5;HDIB7;n=S~bdmmsI zf+Dfv>k&;1*h?EI=*|8Hq$I&U(CXgU^`2@uIXfJbFoSdPuuj-|;!2$BN$$d%CqF77 z6p4Iyt>kVb)YzZ$7kg54=SclQ^EFL?yT<%>Q*>$Pt*b7LVF@ymf0n{IN$;L9Eh`Vw z_|o|@ce-kw$5Ak;F(s zbsGiEKIeWPpc_lZL{F1N7(R#>M)ibJ?E~Xd*#7DYn8BvM)NfCp)-b)s?=-akp(^A* zre0+4@^tg9Jbf3G4GL$d8y`0A!`lqc!;upIwq5D}u3h<)wxR($^C#)ySM7A_Lp%NZ z>p#-PfWMK(`aY&n#y^c|=;ga`>~Gp`W4cv`8lSJgAICKOg{MC2B#;=m}gS512M zEwcT?>v!OIg7Iy2_P0tv|G-BK_+}(FocDdp z-Hibx;Zxv%d&4agavYkALQ-y|5D!-eBAi=V6@EMd+`i7bTTs-xljRh4J_Dy`w!Do{ zlxF?J+b(T{A$g_KmtRtW?!S<9=nl zsrs=Qg4iie%uR3j$ehOk4q92mzB6=yKh$RVZppSi8F%AG`hn4#A!rgsfAKgS5k&EM zeV)a(L)hgG;Y@mqWad;Eer1%H0$49};741vAIL?7(}Jq()w&Qnm|xp8fUIzALw_I8 zT+gf~6>2mhY{wIP-Ri*#?5Dw2wn{kVCx+Jn-PQKOZr$cgDC>c3nLCTXuWW8yB}j6KiBcpoMWFdO}XA;s0-{1 zU)sk8>n^Q%y~_(YG3&kYyS^I@!lG^IVPtUlN|w~LFSim>PFcUT4*`IN!Z?M#uB=a+ zvT*9cDS3TQ(kMnW6F2xWe3`g9-L2*Ao_h+rN|E z0do0njHGjf<7})$q^nFar>joBhUiavdcE}@WJ;o$(vD_~$kGyCnhs&6@n( zk^ui^P5y34fWKRle=!050-iUP$obZ8wY1tX_~Ck*%yG8Hn(Gwa_?LTrJWZ!UPSk4` zVj0OU%UuoZvv`dL>)y1YuAo~G!_<(<0K^y>{bDskHtq5*7ZEsyh#}~T+{F)>x~Dlz zCW1eQWs#$!V;k33LSq+kYEBcLL04vLq1*F71ep*62QZ7XXH(&d=*OiVZi3j=nyM2Z;`wo?I7ut;7+zJ)i%D=%;w0Lf<=h&y1H$ZunWmpI zp-ZJ_YQ(|3eZ(#3XAp?Bn1ZrHJ#6E z_2~L>)&(3&B>Oi$3c%-7b83i`NnDL_-WS}>Y}Up2x%QqFsa~o5G{S|uh)$-8Wd}dG z{bh^MGY}=MQ`&WsW*2&<95C%_eLw!Aglu+SMh1cOjOa*N`p~Bd-YG;cMLh|VOmB;? zP;3kewCgB3r~Gygxh(JnwmDHTDHW6lthd<3W6O`{R*I25waO(05 zN_9P;`h>eY9@A`NqLkv33K3F!f=~TQrKx-5L>Ce$*AYveGp7^ULy)Xm&)LD>m|#j< zP+Lsm9v`bd*W7U}&0~x?lm1B+Bg@Cu0P(>Fz2muBiHO=cBCr!Xshw^x1M^_kaYJrr zjJ&f`x6+A@lJV7?EBZzgr4wr5-zZ8r=}>%>+`i0oApf~d(ShIp4pYDDa@fCQfBeg{ zg87R+%$KRz|g z)5fWQPeaS7SuxGFm-{D>-q#=B{c}!bmv|cTo3-<|AL8iW89sgKQrbTpJQVtO=MJ#_ z#>Ve|x_-cq3;5rzAMoP>{GU1uo6KI zy;+QJ;f~Pq8Ais$gd(dRE>40A3#mx;rN6{g6Z=?p7w9W^pVB*p>1TX2+7mzx!})e4 z@&bGz1-PFfeBa2KA_o$JDoYDQW2H9aUJ0gP!G;A6OlPj>$)UNnDqUSH*tN^wa*4!w z0J7@D*CBds6U(??=r#s5n-PinhLQWkYRV3sPr8)4#e`WnV>{n$0wd{dw*9BIyWbZ2 zqWcd*-S>s_EjoKTaPIDOpz-nI7{2@-0}Eh#1_HQlH0Ho-`&-n~9@t!Cgd@8tLC+GN z;j8qqVYz@*I2w|`tb|~qi){GicZuw`UCw2CYtp`p^zVNC$Bd4O1bZZqZM0!+=>9@| z7f)6YW(<;U#D%5g%UQ#~T$#0<+y7vZ^8@wWlDX&N!RigBdtcp=9+9hY_A^bFmJ$lPL?EQgFxa1COff%ygq{S@13Wlzoou^+Hiayq9M2Vh-Y8p+t0l5`ilu`;CvLJ5<2CsubE4Cg&&K9dQ<|ujft}&FeYW5(*?o zfOX^8A!A{P2Z_wk>j3+;NtrGK!R7RbScW?p#+=*UO_jV{2%-#@b}4)=?&Zk)SM%1C z>Se9Y2r-F(z=xFlvhIjR&j^X&eqsJr!x zH--NX+bs7|f%*B#oiZ#jk%2vBiFT)<@Qz;={fhxcM!y|ecdC0HP+9i<68OQDV2c>+ zt2?W6{<43*IJDZ3@s|#*Z!P2Z_5yxy>c@`Od3d;NXU6peb-i8-N=Vq&h~NRzpD{8< zIj2q+L~%iRu~o&U4RZp_IMwg>*o-j)WEt&oik5o@Q+Kyjp@za=gj$~vubaI@i^&@( z9f6YR@6NiZ=}VsSX_VIfgoyE^iW$&E>qTnOhwhoG{{AoGPR09wuF6KZaQ?PfB!O~ON5%|LD;*#tbr z{stFtY8(hLx}qX7O2;Xzp6<6mC51qsYqPnOlHzav5@NFfAkrvKlYl|4dVlupIanN2 zakVg7EEm)Q?TPiPPMA7oK2$M4U(4`#&et*%6}bYze^Y$;gbIv15H{4zFAZMR1cy)teCV?LO)=6S*-^o zKdx8MTNT$We}1CR2Lk>#p6K&|fPYzynRS!!2Vr%>d$3}L{yg^E4c3;2aVl59XA8Nw z-?};NQlr*ngx?`|DiOncGWgCvpsm_1jSw^HiDWs5YhC#egLE!0S-e?=dm&%pi5JIE zi|#+zRHquI!RA%$jjYn;_NJ=AsS+?JjODVGc=0(W zhU7B$k(L)4%7Kf{d8+IUWbe^cf8&=vmV64zX_|4<0Cn|i*p2hEHmp_>8xN~aZhvvq zxOoqD_}I;?V4`rqb9?ccA;Iy{D-{ss)~mEBxrQ^EU8_zwWm$lSp5LY*a`Wk8Sj2^!)v} z=6l%aPUmIp9RI#cM$})7anhxbKd3A;QhR|ASnQ`a2(%5KCDzAfyI$w8E-YSPjMvkO z3l0Z?tN+9=V8|Q^6s;52L00Y#+ewgHb(~jW9@u(U@myYm`F^=Gq1gyaL==X=(&=vZ zUepDGvG17`fpH5kYq)Um_DB)o z;5^@GbZ@9Rh0w@gNBcGM@(BYF#@A;&5ECl$3!TFii{bWB!g4{1dM)wHXzd+`Z+W{1 z^?O!9p6lyKweb3@Yu%j><5hG*X(2Cb3}hFTZRmBd9wCJz9U9nfLDBtuz%VCZ4QY}U z>=GGwC6jN`dI}?D$&9O*NXWx*FR}ZV(jHgs%3lA69n`-q<%n+@*7A*pb+?|}@dk2@ zQm^9-Kq0D%>f4{R1@b=#e4M2pWHgSKtK@BrbPhZzw_N_%gO55!j5;p4``30AN3WV_ z!~83FdqJ^WsL}aX-_nO>+|Q(LosHWErJMU^zqHCbReuIcvC?mrO>)-udq)xAHx1WK zW4Rw2u5WAY?Euo>8?KT-{}R&0d&xz>r!YA~Yo>w7_1kSKE@=HN{S*oZs1ck^GpH{E zgZI10Es5p3YZD!5pJqH4;j>}8@+@GTp_{>7J~Y@Zp&pM7TOVuCYK;BaTTXvig1@YV z0RN;@``M^HbBtObYFQaGV#i$MP^N#zo70kpif0{I7bGTW&yiByFG4*th2k*5FusVV zlP(F*uX_qHl?~CSzLj917m~9{xNhj#Jbs3lbuqM4sACQjTFU~gqOjXD^{_(GpUV0o z%6KWu$d<36-#>!O9eX+dKX31`^eVP&jrMtp>MKqNE2PHXz=QA}5xax;P9R~P{-Vz; zSIbnLv*WG^E$N#=z=R}oWX{YSE}lG;D}R7Eq2ZVy&<;=XkaD_nc#KH~OE4nLK@&Ov z$^>PkEFGMl8B?ec`S5P-*Fx%*VN}(NV^cco+kvGp=cx=34x$(z>~N8E*@Z+D z9=mlua|anK!qirD1mG@>&E-o$DW~o-Bz+%%*CkhVrKOr3KZ;DKGQyN#0&*NA9HpLRiT^>P6{ynY;Y$QTbMu_HEaY z{uOiAE8)miJpNA##MK8ZkO;biBtdS;?(^L&*RM|>h5Fs`tO$nlw_K_d-a#u)sL4Q7{4n8{nu$Vf5hn6tDa{(eX$PCdECPD zHDVt=&*o`a(QJqQJQ7m;45NR?5^wE(V7#N?U?r^(UZA%{&{obY3X`SkmA^vF(r3@p zHU1Kx1_X8&W#0MV()$~c#LqZZUxok6ccJwU3=e#bt$%;Y|C=)ges#+K=8XSEH6&d< z`I9Mg2nP%3ox*qH`ykqS!jnVVncy~W5iTCD(K9{Sw1m#RW&uGUlv~9un`$}y78*r) zM@vpCShntQ9kEjQ**yrYw%~i+a7u3y?m>Ez znfzEr>V0ULyA9W*y_wJ`wJe$4nUV1z-GLs3?ckaK0NcLLDR91(t6%n;0zLxO_`Q0z z6O`W5Q#Vb!fy>=HiHUZMsnPkA8ouu(P_l!R(zIceA3Uin2?wU=h6v~uui>P@bO4nG zLDCj>Ba6B59fN+%@k1z&IYdO+u60pbB%UWiGR`F}CkNl(M8aC4JkgilQ?Nu4QED>7 z!B#FufaC0OO|K;yRQ$1BUJam?MuRwAT2}w(G^%&2DyAuZa=q zkp-Q)+*dC;uk_qf2O@io>xBl^xHv0KJodf`LGp_2_6~9iK7nQJemFm>8?(+%KxO+C zTYsm}-K4I^k66mb^6q<{&;LcO|3m2iLj}e!EBbTm=RxF8em{VP;yT>5fx!5A)WlDL zegFG2zxXSTOSftwA!YkuK12EHu8+gSPMDZXY1{I{m~nj!GtnBu>& z6ps)$FG(V56vZVfVUXA4aCeu*s)l81CxlukjI9Y70*W2XI|nT-rJ{|yGk!Uh47}DQ z-Lsw24PM#xOF&dSrj|Bc9Z{&5)hklzD=) zrd->1$fVEJ%VRnk`N2puu0&1ztUL_#p*)Hn6H}BvKd9K7A<2~7`F@tpxOE1?tCRC} z>g}%Jnn70#>y&cCQ|X3|26~5*)9!QNzO#ywIWmpZo2AxdoA@9-*LmJd2VVQALD2^- z6(k^ne50~KYWmX{KL^oEBQm+M=lP}(WQr|EeLijsmQgxZ8w>FyB7)V>BRYco)2*%t zH#wU1ywqPUMYhY-?qkXHFX#y9>N9e)zGP1th_RyvPUOB<_CUlm zbu!)}{#xEXV&y;YN%Nh*(Eznk>2OlyHO3zivh^ojKY*<)2D{Xc*++4Nzzw^z(q{V) ze!2a?kw9@W$%6i8kISE)7U17JE`NGjfImMj&0EFiFZ&Njl{4C=vBLmi7YztOk42EI zk+OLr-srTLayQ?WL#I*U`*T(T%tmT{%(ci*I4F_hqfcKo-a#CszZ?`CgcJ{{6CVV^ z96aCK9e(VdA!#m)x!MQvpd`)H+3#&5aAlEhr=BEG(+e;eO~!6E$gwhLO~({I66q4$ z1q)Klx&#J(Ev5iOdljCJQ4sLQgBKlfeB9i&LSKzK7y=s>gB|r&uD39{40Q!1s@8ze zHOqY{i5UpFWw%2z0t}qeVaU!#yE%2vTnhIR4n*}e11lsZag1c<@Zf(KB8L;Mg1RY z1pZ{|sN!YnvacjMJeWL(Mj#@Vv@L>58d&wkk`T!(+s$98YOi4E_IE)C{#y~Q_m*M5 ziEzDE(LN(w!q*5FtAld(lgv>P_`B1S&GM@s?sxe_`-+;@BmcrDvbn5QbjLd2VU!W%i_d39gsv6pEiACMz~mRB|CuEC^f_jmFtss5_k?h zhSd2 z^-a1#vnH$Dfu;F@C<*&=mCt4nZAnjZ2CkH;p@!ByesXj|0QM1&1(krBGBlQ%!?0*!2>ro+t+1L%-q znHHnU#QYhhWzGE_OCYld8G{l;rm$K{dS7483O;UDZXY1{I{m~Rw49H1Jh%EG(b*bO~y3h*qP-n68@2i|eJFyO(1LiQX+ zP=9<{E=Ym>$bp8HvVbg`6V7?JU6h`Bdl$7N9xk3t(AF+-XG^1&!C0~4Cl+#kr$)Z z^6QG|Fe}Xt5aSNZjW&wZB#p=9378VG?{Hv0%vS9lssB?ipvD7AR+-g~G?K zsCCX+Z({~f_dYmYyHS%6dOFu}LfNba-Rx%Gg2UDe$3E`8vD5Qstk#(>Sjjp+Ya~)p zOq)|UP)akfSmVIXiU8Dl_R6Jy=6ZhcY=mj!Cw?DKD;TP12G8+$SFm%O&y9!A%q*$i z1R3Dv3}*ooCe&pakF0Mox0@(FSO9ED*Zl*-)?0|;m0V7BP4j3!LD~oL3q?S{f1!l) z1=5;t;t@X&EN4GNX+@j#)SHj>wpl|`cZv4XgyK06sAlt`tqohe!u=2xgNpELIsYFqu;Va73sK2ZrP-Fj()dRH$5OZ}ctylpa;^A?R$h!cCTOgRPfr3YS)H{a8a4HRqS>ksBk5sNMsO!Q$U=cI>8~3Ejpph2Y{skW z$v4QUu7k`Tso@wFnswM#gVSVt^IEX_t_AmZ@nqT&fr|}4wM#;&;(Cu<+ly~&?D$&q ztAO&)75K07kh}cQjt7Qpy+|YdF(ynbJ?D$6yQB5&Pg!wcsU9E18i+_q;@}nOH!1{5z5nf&6s7@+Yu0P#FGrECgS4!Os?ZqKz>WukI##R)+jcA-r=WUlw{>G>FmB)%xZfj13{ z1?r=6JJt1=Ua}*3TiVtI8h-7{^u%dd(B#};Ii5&xhUn3$)HQMd)OU%tA*h6B2# ztRqgYy6o~8=<P5P!js&5hP!3OQwyyGZ4ub2EK4<5< zUS7v*PIT+NEd*_fcfa9xYEu<<6!n)Yn2DII-?0;N#6Mum`lHG`zaH(W`Qq2=7PKx$ zX9g&w}BBA)Yt3}E8s&9PW@kNgEjQDzeF<-?L z@wGn0Vv5~s`N-Z_WZwd7%VF$SLE^5Qj88|7-9JC0R(Yj5e5r`s5oY?iy|cgj_Eaa| zCggoYczE6XhT-s)wP7(Y$gnB2@m@N=eHp_Pi+yEsd`Zp&zUl1u#dqCJ2LI)V)>rEJ zeFo-k3Fc(C3O<~J0+pAdNxWir&@R9;AbcX`rPfSGu?>^tcF_CqxzFU2*XPR`!A>Qc z*?j%N-+1}l-rL`66Lv7*@3e?9`6D&rpTP499(M0wya39CV4z(O!9rg7!*&yKi966D zDcY)IU3U|(GL8}BH4< zY@r$9D#%-s2&b)|Qh2@~%2PC@$*=PV!4=)bP@vt3tO5j`hAmC%XcGqC2Z@aTPCh*OZmADCHgnWRvlbEKMY{?pz zUoTG|IIfFRT)7No&iqK_?ru`U8Z^}+Mlu%0Tk&zwRJ~hrLAvRrah2Mh#KiP~!j?Qc z^`OgVQD!fT)R`u`&BnR(>L`N4;G4V!IsF*UiHN$|1iHF@ZDf)~wd0Bfz> zz}>P!&u6$+m#5GGvRvtF4hsiF_xWAnK0|V}(+WI8riBpKr8rm1E7XZ29=mZ`Xxu`bE&>3pR=N$8N4X)UCzrG&2gx_R~X?-EEy71-2F%;rj(!q6E6EwbC&+psN-$9top^@n*kBrF%zV`)nWL z+kp$r`ex&9^neekC)+n%0iUQ}UXK!kh?fj&99ySa_`#@gH zJGg8b#LgHC2uEne7^~m0*)VmyMg1ucO z?u7XV!sn?VWD?$+EF&x%h> zz3no?7GySml<06BN4!w_OV(KZ<(GcP1CcM^@jw87o5KDq+fes>0}I(Vm6VzA5>A`n zg_9w6t3nY(OprOjp~N90H$nvoU>|@9l_A26#9kYmbaEwlo$z&XBslQ(ej?P0h-SJc zxa|G!_wBaV`}=k`BAm$Q?`N>@@Rscd;$|Yz-~WD_+Wvj?_PtF+*}nZg)tDf5 z7{iSpr#iomRKMPX*A95$HT9mLyVrR4I^e#e`SrIn6HkJVhx+OOA%Z%;&MY8UnQ${=zZtynnWdRUyOs#S{WWA+nCvf;`xGzWpU77z1Z3GP z)y;d8$ML1o|0V^Xq5|4C`s`{6^Eb+`mdkf+`5NE#+Gs)c<%jQS-CVTKeE^?3dDE)J zB5U?nV%{EF2c5Iq zV>g!d!*4Fc_m{-2;*H#~x4dKTkD5f9?7uZ*Uo6&)%ima{Z|uc9D_^EOs++*%7T}h@ zHYg_SgVHy&k>nx^dh6^rf~;RmML$}t-J)~jXRI>|^f?Q-T_Tdq^lbNbvqIT^FyNCx z^eg?erVZ)5po(d7{UNF)I2L07zd9;g684vR|8FfAvw%K@E-X!$U-*;YcdG`xnYEWo zu{$pxzRT{5)IYs`yT$)PB$wq3u}Nk71ks**!Ue(wHNaD|w&RTN5bkm!ud(6hxiT&$ zYMEy%CMxx!B3kt8g?D8)!Y${Qu8E5tPsm3>Jv$)}mRUUdMXJu$m<`5?8?`ax^cBF>O>%x< zFqv4p{x&A~L{~5foig~^Zkamrj)O`|9EO*|IR?P_l%efrbCir0b%-lax*psMh6R`9 zG`LRlyfd|1AE$IuN27t{3oY^!MKCD0pd+6ex$R4RE+TP~i@@smBZP_fHg&G5a@FjE z;#4FbHrJ3dQ{iyAo{NrH53#Sraaq5-O@Ccn5ZMDnePn-MG z`rntUjNNf&J}@Xv)J(wDQ{rC0z>~kht+GsgmOH>${!O^`Rj2{&F5s-ZlNi4GG<`QX zD?gMxzmd+qEf&A$rck!g1ulezh|x#e*9V)JX94(FcHZ^Pzp1sOg+Sx4&=hP6Z#P+v zkCTKCfTuDIZm|3<;fj>>QJvze+Z78|PRkdGbF1h17P?i5np1JPAcayK3=*$}ZN|qW zyp7mqND-0kfNe<(D%g~|(VI4xim6K#i;)Y{co^9qDQ(b^KLw= zU#*9Kr-rx(a?q_t2PVq!pBcZ}lfz!>4ns(0_KA<2Cl;Jtl=!mo-?!y*Rn*~6AqIYw z;(sf|SymCpY1<|7cm+)D{Bv8lKYo-;apsO&56nxp-U7Y^x&3-g49ImksahV^hhyHs zTyi>U1bq~1NEsY#3Jw8%yQB@8TEhJa>gPOkPPN@=D)TI#;?zG++pD@*;@53F07CN& zZYFkwc;SLrbk0}H4(?_R+NCkuNW5X&D2)P)rfRvf)Zzq3C;w(y^+THC%9%^tz9Y}7 zgsS=hXru`({TbqGTAy#1A!2muHa;G_o0I*i_fD)jkQafwO!jWh9tMHfW5|op&3E^c zeqeNxLI`9j$RoS~P*w>wtktu5nkP_iW-27^kUh8M(@~1fCp9DDpGQrS(j%zByiW2C zW2(3*6ZsJ6os@#kK_XT0sLz1A@@K~14ROUk6Abp^^x)MI<+{{ycz~hzI9R^)hcz)e zc}!!JCx2Ne9B#l-$S~)*B|_1 zr(a2D>37bR4~A~+Ev?~uhHmVmwv0)A-XYfN!VqFKVst)JcX=VeDCn zvGd@3W>g&m!p(`z0gq1&r_^=}hOk+34cYW!O$eRkL!wtFS6K}RZhF{Iq>i}t5OYdb zj#`HgyD$zWcbcPS>I6Vs?e?%63**RVr*%0sN82JM@}Te=)s{2i?tU|zZIE2f_d81m z(5NLDW{Cr_`f`Q}ChLd6^BJH{egg=*PNRxBv-*uJYj_&&g*C}=ayq45P(Y@lj3*pg zAUnQ?=Z(kkmb=NLVY9X_AN~$BJ0pV1k41p$lKYs6fbf4CIp)<(uXGt1*sMg z2NzS>yy5+Py|QQM6{G7}JwI?U^$4c=BE(DCUsikzh|O|bgP3(w-XK4N)$*TBGw5d0fHaP}8VX}{F0HD~yDtFExMy#ve< z3ubh*oO8xpH4==^WQM{ie!4YHh9BIlT^^7uUvTV1g!i$ZuK8)SCi}Eio`Il2nLW?^ z#`>~uuE3V3nHE+hv^n6Q_du89|&9T)ko(fGlxeD_p-S@)Q-?f z?LqaBa>c>B+M%s*2JSw7%-FVSKo`7}k9o5yzoDi2RIqua>Wgqg!7+`ViaoH5a&L<= z%Aa*zqMFDSG;2YuZs#6}T_}_T;x&e(<$xB?_OOKaoANMeT#f4qzm)D%;qEABD;I+- zm0JnrxOQ=~(BRau%m%0B?J>ReAeC^sJEH5I7_x_^n2NUKhg;G~y5G!`B zbb~`dm%0GhZRYOQ6vr({8_vxb5a-0k3?ZK|w?*eJ^zOb<#oP1(%&5NXZjX!meEL<^L*HU|HzC&SLamaNrcJ#rQe8~ zXWDJAf2j?wWq~XHU8&gjsa7z>k4iGGqrj}3Q(lwpG(BCnt*pXGc$Q0 z=DfhZ3nIz|Hh-kgPv7;3c^y9rLNa=apPjVSfCfD z>l)@TkgH&MX+eJ25hHjxY|ld@P9xlP zO?0;>7x7a9vp6-YyvDM#i;dh=yuEPRu9vs@{5;C)awetnW{?L9@DS!I+~bG#=pq6< z#auz=2b4i@7C%#!dxs8@=fqTYYN)V(hGof){haw3dj+Q&T>ENq<6ESY9$317D?zSo zTvaB@a#WIy%JsrY3)OWTUb<(BT{ko4AW%<^!_5%GpUeT+#6}>h(>Alq|T8Zi3a% zD?@(Sil1iIS0=+-bDuJP&nNh140sL7Ecyd$xZ%BGk{=;SktTaO;GKsL=g7?@-$3c> z!Fr`>NyYrRL^S|k($D5O_Z?C)zvAdWwdDWjOoFIsYj}r*1+75-8J>6qJXsAKgX`Ho z!wR_0Odgc!kh27Du6{__$_NNPHmr(GUtF>;&)Y0K^b|YBgHUpaM0zW#p+rz=#~k*! z$+(j}xJ*JzVLumLbF2aUb0JXIRCpS4#B3YpqpPE4LSsyL<5+{(E+my@0 zHC-&r!G8Mm}PL2-}59rvdDJyQ~$o`ZjM)x1>NQRis?EvRh5bl2ZK~NnLc=$QhERc-yiB$mg2?q=zA6J z3h|n5(Qxo$bc3wP1%tRl3AM5{5~`<^m4>wMz{&tg|A`3bSo))KJoumks(`Bx_aIG) zF*Det)`|Navo3e9MbqruZM-?8Xl^$a+c)VP>k(IzCh0`C79%)~J+ng;CkONRuw5QH z0F0$B`ZF#c#(m*?a}uXYeq_nN=vWD}qB{7^V#(}^S8^Ks+B>Uhv@ zdE_T^*KNk#%oa3X*7XQHpO-w4;+DfF)Vd+6fAFgLc0vR=ELxx3foahz#Y5a}CDtaJ zT-SKq9aPeVqd-QpVr_-=s~9`kvk?N4R(|z9-wOfjMo!NUpm%jJ$Fqh7 zN`P?-^8%|3s ze(H1=-Pdb7D>GxA9ocA|=Nvo0av#mfPeBh=*+5P$Zm2oI4m*qw~q6^NH+-h2L3#d-fG}LWwmnZc$D$y-;>S% zXNi#iESKm%3kv^dq0s*tNk?vwsYs|12lu^Yi%m;jjPs%lz08b^rX({Du6Vx|jc-|NRl@u&)r^@k=!!$^5)< zo+8ZgN2FlNMmDn_y`cb_xbVJvJ^62>f75H-v<|syF*cI@T(8h-i+=Lgd*IdeI~#jF zMX)mpyk85fQ3o*g47tky1n#)QgloR|7jTi-HFTNGM4WZk6VR(s_KR3vAI;feSV^`& z*v?+{xAescd1reiSsFW52@qoiLKy3Vm4tnhly-zP$J}LiDEod#P3tXk(^xi_sDbiV zj$?!veJrcz=&YXK4rDu$ZrdM)LW%>t@EBK3dFa`h{bjj$$|K}0A5__)+1>a0Uf$gR z^RwEQVP8b_)FP3#ZjYZk%>eVP!ms`-pLj0V0pTavyud2?a=nZd|3^@7H&q85uP^ z3$%!}pZ;~)5u_A*SLk)^q#aFub4?bLCb>_%t3l4Vd;TwvpAGjNzPWBqeSe7wu*=qt z97!;QmuJvae-jhK#kT#XfHS^qGd{l#Vd&A9*SiBkg~IQPC!QwY3%@;!YQ5uRz`B~K!A zxt(`8+h4D1Ywz+Ejp{ixiS1_r4d7Q1jiQ01<3b7QsKIG(b*F-?A`#8A5IrT^7M=~r zOriF4UaxW;Q2LX}Re%Ye_=LMk(#c&(`5erg99@X>_UtC%jpH476;<45PUAuxRdom@ zNh0ELeO{z{9vyPp@o0C;y-3O-U};-}rRj--@-R4@q4U7x*669}wN68+L4{t?`!gg* z+;9jo=g465oqya9#u;UL_b^r~b{4Tik{GH1oYWy%%N!~jajt!Nz~W=?^)DLHOPcdN zqZ&2AOT8l=$9e4dXRc}ye$7x-S6ND|ZDO|jv)pLKp_72Tv3(}iddk$2;40Irb&CXd zw@qBQG!}h>aE<2Ef|Q2hl4VnK>?8?Ih#(skBKw|}Dh9q?g?ru#e!U&xp6I0E@nnxZ zQ?|h*7Nzj>rLP}&O@J@NCcnxYAffZ2YBWV{kZUivP3C|Y_|!wI9_KZLw|llcWh;GB zcN9=C=7tcK;9sjd$H4>vwb%PIzkxJ9&8wOQ*2<~mn&6kNO%(1$Y$fix1KSXcC8yg2 z?{{d2YVJLfEMUDzx}M67QVn74&NBY+41JB8`BoyyUCu&v*q@arFR0l*D}yBcw$Kj7 z{UGjuGfJ2xKRPDLm}7p+0f|)eOu8mC(^+jn-)s}4WbUN6^a%7ot{19IQ)#YghaN&>$YynbH&^~b=h{j#Iw z;|~pJNa=?)BGuZMSSH6$tN9vkpxNFE4W`Dc~MGvlgnt~Eh79>M=W!N5|7*s z&#S_Gd3%@NNq0YMy5Lt2uU94R?(o~Q`j%zDz(0)5<_|W(s?OgWsQYpt;O$6`JgHW; z$<}R?Hvy3iaOURE{3U~my?VZR%C`IcbzyG+MsIS;4O z)>s3DXLn>!7!w&@JX;WPc`DT{TPR!xB98#O(z28lzadtSNN4&kCV2$j-M+F+UZ~r{ zraapwIJk3A^11@o>}`3h{OS?sXCr8mS3~EeGtUSB-totCXr_T#6T$Uq^;DeCb5p8{ z<6mW-GLT>?*p*W8@!n^aR}zV~#SY1*)Z;-_W6fSO<*MWGV>im64{loSfz>9lgfc*) zdsEdm(*)<55)ao*R?n((^vU`#iCtm!q#mwYZpaP^MwxL{BC$9ygzcsI(EuK7?BEfM z+oL%1ZAn>{->uNCnH`CIdLiN}&YI>ICcckEVSsMyFc1zRl=HaUQDMgECP?$TwB)sJTSb7(9R$Sk{ zDMxQ=4z!r-xGC}XT~Ooaa{}-j<9#het_T!~#D!g)rSOIzsC*8wm*|0rP}cf>rG`)& zNaBNxCIy4ese^`&aGkpYe7020gBf3ffz+=Pe%`tP)GN`u5}M_kcXYW`yhh?2GbRB) z=D2-?E5sLcVn%v8peH#n#p;mjqg|luS@*HwGGj9^(;lJ**Vvy(-1QHgv53KSRV(R+ zwiza5T^u>-k$G?`4x0S=nI5^EliZxb%4!&gdm@v`aps>X!yi(PKRF4wqP{vBKz;^(W{SuA*BT9Q~ zv-KGUr7%{nq6~P0ySvK}xZrnCcR$D)m~Sq|$4+;**V`>Q!#oxref*&HZF^T5zG~bGzm4hpnEW;-3mhR^*{o!r&4Vs)XY=Xcy!;#BU%3$$vwH+z0R6+T zul&0^*0L>JPr$dnSg;=@+Hv*^-GA=%W4fd?x`|Z&&83*LOep?Vzxk1GK)vT12(Nqt z>ebAv6O0_B`@zqN6{Z<9JtZxc!a15gyco}y`jJ_670?zQu7HPJ-7r_OUgr$7ezKbr zr7^4+$Mt-H@#;7X6@($Jeu;@{D)`~Fs`jyHjt8_cXwD2sySs11_BdN`2xLuDSy~Z< zhp2#a>f~Y4nWG|c5PRlOpyQ-XT$5#VhKTn&w?FkOYnNgH&u1s_@PTof#Qx!=RFVoA}(4vrq& zMH;_~$Byy=Yfv~gc%l(_9p=V|N4;y<7`Cd%77otE7HZLmSkO9E(qSn_mS|b& zD^7mu`V!>iO7);BwZX-EDn@a8bh}@-Jul;FDRj2(uL3Ys4@Jzh+QAt8!gU?%VtkAm zk?ol&m$VJv$gY~m2Ae21t}-v{d4H^?gdwN%e4&#W826@iv zg+6!l-7Av8O*=@)4XpAmlidxQlVn#cxQODJO9S5%6qcu}(+xw*?Fy!Bxpxe8ar?_hbp{j&YU*Y!}~R}8k;8Rx9y?D|-EG6$KT zb+cXJdjeO{-^kuSw*`K-@h`d9ua8?(!-w;lmGS707v$LJSDa9$)u9b|0@%ogVa3Mq zqmT&oY0K_L`~c@*?F9t^ql&-F72I>e>88wxuX(3%*pS5!v2az#Y~QcJ5|HeqE$;0$*H7O*FFZW0S(Duu%jR}+0BP9sjU-I`55Q6 zv(ShlPiO^r8kydSZr+65>EdN(P9N8+76d%IA{x=RN@fdks6JtW?RKk;mWY)+SgtC$ zInx3OA20g#=skD0d9Z+xYHmVM;OtZFnfd}wx8!#2?FQMbXHlz0!Gb|8%Ey$FPzWtf zeYd&;4VeljrUZ%Ej(u&H3gSw9v;o5c#X1jEM&!IE_AFWOWaMtF6TXVOEcAhfM3KIq zE?p0Y2VCFj?0GOyozDD)%SrjzI)~$ed8#dm0CZrS&hZ`Bcp5vpGGGR$d-M6Mq$7dv zR?kHdH!4=k>MnyAA6QM16;u>%%(yrbm>@kiQpbvi3uc)Bc&JDNRjMm2=-G5L69}dG z&Foj7KinZ`%8LXMPCdlQU54R=2BEui)gm| z^5UKjH<3s2q;xCh94w=oiLu%WK?%9#E)if;2!1ctj*!)@82IB80Xv^gDe+K0n+re$ zIgcbZu4^?UV&mOtOs+I=usn`@e4z(35Teo%>^|G?)^D&(w1XE@;FP}%Rki+COfBlm z&nUhmescnGW7(FVexCIGW6blaeOB@T?}dkX`7*jTSo2oN_%a!NrXuQZwIr-^H9$18 ztBdA*TSxe!M5py-_m6ffZv-zWu)Q&}d^7mFqyO&Uz^{+~=iV7#TW3Vu!@~vOY7gqP z>jaT}3=T$jpeb3tbhoNQY2O7u*SS7(;M~p`_#D(aMW)BJ!MfpIgM10zX^}rZ59{-k zq&yGY(;Wn?re46|br6dC9U4kPZ4Qqre7J~$OJqW24pvAaL;0b4S6O3m02_tp@O>eTO&{$7V_uB6E$03AH zm97%_p#+z(0mDI0-I?Mo8UTfCo7&Bbm1C4EEKRpI)|n0=sy({S=qQyU)HTsDGm9gh^F$d{(jRRv9WE#W5W9!vu4M`K%chkg--!IxHjf@M%-aZ_zw4dx z3m5E52Q}aevtaZCho4HxJNm56P+L+VbjM2MsSA1Ul(zbn3%2`d!~x9Lt5kaD1MkIH zd#MY}SS`64q3x=kFQA{;$)zl(u$nKrY3f$6=v?$TU%?ZXqad|=#nDY}^)p~{sMdl{ z`?BCxh5D6qjmxN}9Va@TgsV(-{gW0jMP+LT?syUlBQWRB=cg3TK8j|`fvtjUzlHV5 z2Z3dWe(rhk%KH^M8Y4x;lOH0Y6{OLk$AO?q2Y$SRZjv?wChhx=q5Qha(PS|^Ne3X; zQRz>~B}8Vw%jU_2}*V)rx^0Zi!7R}*uJ4$r7k=Hl4WIXzoLdomj+wyI-4 z&po5cX%qSo(${64c(}3wR+l;c<&?xZSqKv51inKPbgf(-r`fHrtHByK4;1O&CIKpn zK)op~;9uw}=k>sr@Taa~OiLzy9#fC>i!-<>cu-T%xsVg%a+6f}p$1`@=J~osj~$vmy4*pI@BlC8 z<&^OYvQ^}4Xcvm}p1O=)%Xu{{2zDq3 z6dh?2H;`TCQ(}hCau^p49(ca$9IMb5MGM$n&}ZY~A(fdClc)rLp30ge#35m;tmLth zN~gZBh)YXZoL1z@ZdnoUPH}t-Cyfnl7=3?Qs?|d39f-DP(`-e*uY@GRrP1%k=0AfECmb-aJE*HoI>g>)FBctM{ z&{3D)w7X?S2p_lVem~OT0H?JzNg6aJ2o&|*jz&~f!~pJjNU#Q75##hYl`eAeRl}Nk z3XNp%#?mY3%+2E_BButaTES`wr1I`qcBz#o|H$a}A)QI*%p&_!Dg)|~19_sDj}Di0 zF&ymEgqsFNmTkq*$n)9b4jwJg>F5>bvuCkhiQ^#L`G)cFda!RijF6h6H4RIpCrFPGFi+%7tG#UJW!eO7mh9PU(w zS?=sMkvmr=H1f)Jqc6G&mi|9$IoYk4l7hs}qmG#g(1 z8i*QX^d00!Rtu3@E_lS^!xwFA_4gQbfX`B42VJw6y0PWWVy;b5Kyct2kS0edCgA?0 zye3u>NB*Te=-bH0dFj1QYxj!q-e9amyOOOA18IE{QpBh(=ZFJsJg_JI*%SHxWalnj z3qzwGW1BjYPUX9t1&L2AcbQN_mk6uKZPW{cAY9*=OVrE2VuxeF^zM_aa-5Ea=j=T6 zGp)L%R@9-D3eF`lW?7DU1h)%<1(jOU(P*I+Br0j==6Dbb5^7SR7zLE-bq>R;mJCg; zG~FgWe1X&~S11m15TxE^CQc}MEX5)pHHRwWwj?LUsUDZtbO6H_l*Hb(_fM^7Pe8jp zg%Ej=f=Rdn4n4*PY6%viOKH`PMb>~XzC@}6p^%EF|E7zSNE{RXM2u?z&M-9Um6dAB zJ5Zwf3eKfgfd~H6ed6qfIjwSn)2zBEgppbK8f)dt-FRw`z z%qX4W^W9lfN-cMKK4P=td1|Sgk~Z)RCJ_^XjyOG!Z;yx+iu7*2#gp9;Z0 zjXdXqgkojkW$GS|v`mAp$1|)&jRVBTlXb6^5uA(?zdY&t7W4bYq(!yx5fgO$K=qUb z@8|6PxHP*#mV6bcrxADa6kDMuj1U8_V5%m>BG5mF=Lm}egQd-Q8P7KZ^V2&Q7Pj`M zww6hr-xQ$LzG#Ae`=i$9!wfUm|E{(M34Sma2fy_~2kTVh&6Zdrjuy%B-eoHLPeYx< z2QgdoGh^hNUjO$K|8X5&J|{iu$=l#nIU?cDiGS%grZSkLemfTUe(<}$g9)!(=6!V) zcePL8m$#8WjQ5bdOP=3^Cg1aNqYl~g7nvr@ccDXXKw|twQ}stvQ?!3Ctis0!E+385 zUxP2wRr+8#=5|0ftINBvn)%sJ0laPgL|erA4*ID-&4Rn7Ye-Q+UKR#?4-`*SO#_zI+Z|8^MAr{N^2?sRRTNXJ*RSih#ug zY~>?@v0KPIAckaMjn(8sP!}nAyTC>k38>0+5r|i&y(QyDvDZp6$~(&(kv0}nK!k8b z5JY6bY_a#q4XDdnWXYw7yqz~)#8)RFT~pn$l^uc+H{p@F$qiv;;+T8T8q(K$s_|O# zTCN1Z8TnGEpu;!o;9**A*7hk)PGC)y$+%wQh&$8nfutHxB<@qMAJ%g8$}G0CkjBoj z&f)DNSuv4pgb9di2XwE=Nv$f}+98kEWQeDq@hDIHt!?YEm+tDllLU$e@z?q)2UbHf zD^3r;n!j`RR`jT}`Yn5GgxYFRe%-MZlq>_M%B zvCDkObg$=fh4MT?Q>1)4{Cz=^+Ql8tM!(&TEsqDM#vopMTM zy+y&{`X$)mHJZ(s_SdWI`0nd~Vi0%7HOY0U)eoX06bLkyN_vI_FegV#i^*%e#Cdyv zJk%SBJ>v(dT~#s5BcsA(b=q(*@ha%iXJm0^hZ1qF-1VY)7HjZ>L_9`by4$M5+R5)Q&xuIUr1V}tv81q8$lT~)vl)vw47KQ5*vYv!(Z2<=kmxW1-Cq{W{-|CCG-HNI7}*Bb6U`_$aU5;}sb)GH z9^clRE9~2?Q}6FK(6GhNxD}JHFigj+b4wdyP*Bt(gnGARfPt%r&G}bBdcE%^850j4 zRJ@M36~t$43Bte>Me6lljZ^ zM4%#~=Gap=WW(yDEN_(cSNscqyu`2n$r7i8H+EZvuO;qbj60r#_SPHcX7oi7OtjM< zV7I>f6?XgcW&Xv1do1(x7qH^pqW}TNhC14CDscTSf{q=3XdkkFvJXF-2jD-k4`1ft zdm}Y)*n+e4apvFb!$*Wq{!UMM`jvh7**pNhvk$+K=8Dw%&yuy@T2tPCw|9=xySS=3qX++@*kn%Ql7 z+`P6ajWQtVRUzd9QRUTdoAu>5W#`Ry2_2S9J&V$-8McK`MUi4-LxsssO6#<;^!3xe|8eUGf02YeYo?D|o zCzvaS#?^c(R}@V32Q?Bw2#b2qQxR&1r8^M5Az;+1F`)+;28tHF2iysocljAgrW&+O z`&1wHuR^4DLxlV7wPFho5+{yS-Bb^*5^~O8-YLXJbL$~v&nqUHJjo^VZe2_Vn3-L1 z!0;OId&KKDR|stPN(--5$o*ncPfw=@9|>f|Z^fmuD&_a>$-gt9z`tTcduMyq3=zF` z>`o;t#Kc%)U;;VemXZ*(G01s3ezg0>(!v`VW?G@uzpJ3)0Zk)x!{Nw?g`HjS=+j*)Um#>#<6n z*aF6ze})XpfJ!!C@_Qs$jLwy7*WCvKc=Ue6FA9%h;j206TQ(^<5wRVHx28JkOK|Vj z?$vqyY}{|o2HoLQYVI?rB);RtlF&W$$Yk(4?nVue^q_}dxWSv_#X~D(W**VfwozO( z^FCOEkLgK4`jZsv7}IcPxqMu(;5K+S?7tTEL;u~VpXlG7qx@2^(2nJJHn1lK&-b1u z4`)f<$zcCyaM=739R7O||Mka+|9vd*--`I(0YC6JBL3}*ug#>EZz9P@NY-_B@P`HhQYTZ6qI1}-P{Y{#)RV-R$vf^;kdKj z)H6w2YTYZ-5l7O+9TiBq=26{_MB{n6+vIQy>xYdExYiAiTD)EbLo8W~ks?4SC@$rn z5QNRAvk}q`Ni725?ye1$lNi(^FODIxr8o3K76JD#&V|k%pU97(;}JKM`=N*q{99o# zZl|&x>vlTS!|O~2>4G1q_XJS3Yk!vr`ndPEFg*rEn8av=#2Ahfgij*AiPPK#1y?RC z!kYT4+>B}=Ja8P`y$r>QF<;uf0or(3Sy9NkHH(sjW#x=plscH3Rv*xLB4JWB3Hp?` z5+Anb&>4qG#~Y=8+!|Ex$`0T6DY3i_a^_hy`_J6p1+ZeA$82gZ*V=VN{PW=#@YBG9ZUc77x8BX z3iz~8KlEvv;^oJ)+tU#e95`71K|A8t1QNgx3=)5v4rqm_tJ_n!ERV%ybwcox2PGku zz@;ISDo(V9lW$0!`3kqw=ww%Uc;KCM9_O$PcI%9dQZ`06mknITX7}nbR2thVnR2Qw z!b-5I;4ms66?~oz4$DF}DWx9{N7K~V#Z~*%m#m^nNrHF~b|;3jV=lzrHhI)13wBK^ zYEKkuhi6G++7l~^cL+e!n1Ck-%prky7hJqP+!$ePN~)+E+tO1I4PtD0+&StE0dch* zoDhu}tCEgo5SR4CGe@^JA(?-00G3J`uX(O9_ABdlO@QQ?|1$kM%1znKF88H<=~86} z6Gw)nYW6&8V^Rtc%*&c=Fggs?nlmKgY>^I(>f${5(FvYdUH(P~v>h+y{D*a=Uk%GK zZ`J27if~H8kN4QU(eaZW7RSV0iMAZVIRZB)u0<&B{1VG0{ITGRM+*x~V)>JzIj}yj zFQ(@p1qdFhnlZg);MtI@)g%#?!$DsJ=tBs_v)F#Tcl*c7+r0T#P$+`d`7KcFLv{06 z)B`?Aiej+q3@S;jRkWAs$x5xqp8berer3nLldc(a2@jash)jG(c>M}^k99KD8YQ!9 zw29SaI$jG8d{(DsBTFiY6-eEixrU_9(FZqq^!)2IB-+YF0bbjFK=v$g5t+sb_VxI% z2{!SIUr~oi#l0tcc}iSO=L)?C zdFqYk3aDV2#dOp&JcN&u_Jlga?Od|≈7v>~e|c81eSyVhT%k@?H3O0_PX=n)h=& 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 J;Qv1Z{|gEOeXsxk diff --git a/example/vendor/bundle/ruby/2.7.0/cache/json-2.6.3.gem b/example/vendor/bundle/ruby/2.7.0/cache/json-2.6.3.gem deleted file mode 100644 index f76ee7480565db8e1050f4777d633c6ef98a709f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67072 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

    TmmRUpCkF{`>uhy@Lbb4b=Xd_pkT&UN(Uezj*!2 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 Y2ApbBWJOts9iM(%^jGeW5i*KlB6UH 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 diff --git a/example/vendor/bundle/ruby/2.7.0/cache/molinillo-0.8.0.gem b/example/vendor/bundle/ruby/2.7.0/cache/molinillo-0.8.0.gem deleted file mode 100644 index e8b8deb077b7de40e6ecd36c50baf2a99c2d81e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29696 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 diff --git a/example/vendor/bundle/ruby/2.7.0/cache/nanaimo-0.3.0.gem b/example/vendor/bundle/ruby/2.7.0/cache/nanaimo-0.3.0.gem deleted file mode 100644 index 3a369b2003dab615a9768f1d61157d81c5f811d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19456 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 Z;ldS)vKY~EF{*Gh1V%$(Gz91w0s!KSZXN&t diff --git a/example/vendor/bundle/ruby/2.7.0/cache/nap-1.1.0.gem b/example/vendor/bundle/ruby/2.7.0/cache/nap-1.1.0.gem deleted file mode 100644 index 1f6dd74b96d2e023887d32d2ae4388f3b61c77ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 156160 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 ZYVM2w*Q@joxPKV_`hf1KLAtZXxsn* diff --git a/example/vendor/bundle/ruby/2.7.0/cache/netrc-0.11.0.gem b/example/vendor/bundle/ruby/2.7.0/cache/netrc-0.11.0.gem deleted file mode 100644 index 78226f36533119681a5bbdc787b6b2d6c3bf050f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10752 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 z%0A`Nk$~uzQf!I}3-^#8wWh#jf@0W=joI%yg9F>wIL_Q^{JM>6zTDI{e&`Ge+Nk;K z&5*B{=cymx79+w?akgKaX_&n9^<9qt;)2^aWUeFqZM!#rplq=-fX+_$EKzG&opt+u zsH#Bhvs9{AqAaqQxuH05IBJVKe0ZD-udHyl^1Pag)+Z(cl{(^6r3xuch21Ev zWvwxo1=C5Sst!QnZl%GH)Gc0Qu*Pli#jIg4+K$Y(;e@h~g0V9&VxG%WzwDp~*QXjS zN~yx%*&{AlM5AY!56e@xz_pMAQWc#2VEofzI?68DJNoAcj_4yHN&&)u0`9-(_#1)0 M5%?Q{|27ExFHyCCMF0Q* diff --git a/example/vendor/bundle/ruby/2.7.0/cache/public_suffix-4.0.7.gem b/example/vendor/bundle/ruby/2.7.0/cache/public_suffix-4.0.7.gem deleted file mode 100644 index 18c4dfa5bb9bca3fafa57fef9e21339c80bd5e0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113664 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

    X^|D8d~Y;c+3g1> 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 m0{|Sp_6gEGG5t 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 diff --git a/example/vendor/bundle/ruby/2.7.0/cache/rexml-3.2.5.gem b/example/vendor/bundle/ruby/2.7.0/cache/rexml-3.2.5.gem deleted file mode 100644 index 5680fec4c6a6c21d480bf8501599ebd4278097ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 93184 zcmeFYQ;;r95H_~9ZTqZk+qQYuwtaT@tZjSG+O}=mw)cJW{mDgAe^n|sNhKHQn^8^I z^i1_r(@)RXTez8+o4A=UTKRzdKPAln2|GJG$p0w+lmEG7;pF53VPR)xW98stXJ+LD zVP;`t=U@XNVg7$=LH|d+?yhboF8?jb^S6bC-T!gmf2#jqjsI`9{qM&8Pt*Uu+9ZyF z0l|8=F$M#_(cX(cVn+#>GeUhm$xBMv-I1d}8M6;Z@qDXK1qoI@USAqrZU_}HEF}SW zj>-huWw9HO7ADWP#+uLh;RX_o9Wf~+Q2+)%UGg&@J@+#Lq22T9@b_KFdBm*UN^}st z?F#>CJj1LeGUT^kjO}8MJitEl8k9K}OR{X^=&2!eQkxR}GBY5ed_W%6A~|Z2Itty< zejk#PE0!o-7Tx5Jz#>D!f;VK5Ar1UtKtq6S(5LT{$8t;>+45=_?=tG-4mdO-14aA| znk9EWiih4SMD{w|k#By{qHJ6lXsjAKS~($@vjaiYZ{2JxbME{0qUC8o?RLhx8mQ>) z+u|i5xy>a`i+v9>$sSpV2akopELDrBhBW)Z2t^?Xe_>U&(MZ^R{N6Xi5;8Pw8^sg_ zNH2lpcCZM|J;;p<1iX_PDz^owHP-#>!@g4OYoX+XC`efsE#a6gD$JeN< z2a0ZlV2MPYm)BZ^V@6=(SAOEX9DKc1D_vmg_0IV!4<2p?ekh zqieB68aoaSA~=S8>g1U)#e4}FZc}JBUYk@h+GROM^#eKP1w+1B)0R}xd= zZZjBqUuOa3B*GWUT6M;bt3fI_nU_bs>}H=yiaY4_M_f?Jk7PHj^bRw-d4vLEsP`cf zOTag`USRNrI%+l1RuGd`zBh0(;-%v9%g|nzDHuy6kOAd;DBwN1@#^`4(2rRmh8M%{ zY3-M^K`FO7zjP5&RTXdh886W0+f`FSIXi6<)`BjzwP{)kw}d|WSyHsrZPo3tw;NpK3+>WmKk4(4=_za#thkf>$II)@QIsJ$2k;nm25TI4(LebJPcj!#k>n z`AVbJP)0Mr=DCE(x}aKtY?nh*_4{;iaw2ZFLWS|5A@gUCCR3)hG|Y*VeN`PpQopuG z=cr5WBa~l+btRtsx%Zm2<&&5i21%9v(5&Y44jMk=a>tY`7Z(WsF zOxgoMLboVCPEh`D1e5<2`~O40|JU%Jm4kzsi|v2Lf42X+{(t=czww;^&s6>I_rWTQ?e`yKX(piSCU{$oVG6`Y*^yk`|Vb@CP&F0&4fPB-?CCCgZJPMRWRH} zi%AGz9Ou!G*0BeKhYz?fKc7p`5xUPMbHW!awo$YO&PBsee-OutCoR_DXG3ZuLGT7+ z{8*lgr;OPjeNAz~i9?C}a1Ff3-^ZXyegeEO5oRU02%f=eFtq9yONDGSG_wXrXs`}4 zMN9Et3vdv4+>DPwqhaQ*!iXPIDa0*M;zDZof;>g&KS5wYGs-H27>VZf+wLIK1D0!Q z%C;gsY5>)*g=Rf0`)+$QFt?he*dAl)0OR9I6CJSV$a^ZZ^xg4zusUM=%f$o|X?%B_ zo#OPa$U`UK$iiJVG#^-RAJ01Q>-KfF)e8{G?bAWdxkuEqErgQoyJcz{cz166_OVs` z6Dsxq_&Fs_sav_%uyDOYZg`64g64~i1e3k%4S2G_HU^mwo#`pw$sLMV-`Vnc@$mJ$ zYl{FuF?9q=cW?Ul_(F`tz2dKHQW_{+_o38zBDES0&dr>4)p^7NNYo9liEd2vm{2$# zET8s&dtTjC&wxLi-V9{_4CTVTTKc{@U9FtnUgh4D1)UbkG(5fK_K-WjyF9J@>hiqL zU+OsH3)(t;(&EFk0pV@y@vU!i59?vxYYkEiTCI-Y_G@Zti81m3G=TfB^S>99nh@Q7 z-!Nc=q^I7@tY!C!q@PkNgGm}+-3-jy4r6o%zQ2APEZi<^6%#&e0RXQikRZgj1mA=> zUk6NwD*#f|i<<*QF*`>hd(|NjFdB%ugRiHy$S(2fou1;{(9kx=IFGlt%hdF*K5!P0 zF@=gw1@WD|;#x3+S7d;2fi!rLx7atp1v-zI1UE`GTRKFnV0~3(gbwNk6g0j@FuEsq z&+rD&+SJw(>iC8_dDj)m=icC5@B0VRqhn)_3s`a8SIT%a4x;(Jl9i8$C)DsIYUcp- z$6iPaHyKCvJb7LZRN?XKdQoNW$W9gd(F=U_2oSO}eC@TtM}GyD+tzP%eE~0vTUsK2 zfO>wX!+C+2T6C_irvExN{phhqE*~!^4er?FqfR2Z0t?`_7$>HbSlvxr{R8Wt;@9eQ|K$pz+au9{1@3kI;WreZ4T=a0MAiRF zI(%=T=3l_gZ!$00Tu17X;t~r)qG171eHImx{4B5|{kC0ygElm}c2Jud0D(kPa(IEV z!-#|Kkw5{DI6P_>x+kwge-2$hY^D10KM!4Aj2}vC$BB(_wza;vysW~F<>QL+cXZlC zD1M?0tY;6JXbD5NvHnTMVgTm!7=Q#K!G5;dp?kV^q(S(~!NX zsJos`Tt;&!0jA==r|=t|7Vw8ZnvQ$+;zOI>Ox@TJ(EG1t+OR!Fxl9nuH=YE&nn9Ax zo3@UqCuFl|Y{gSj^Rczku(dSN#dW$Egh~(c?fbUIXbGvypTCUiij0qo3v#p-tEV*Q zgi~>)bbb!7@y;~DpB|G(PFf<F3eDBK!AskuK{?AnLi}u@K-c6Zgs~p{{28h(b;= z^sdFox*nHvd+I{Z#bD6uu>HN8qJn=T zVQJ#8d&&dB5u-wxfx0X9&^JA+;Pf4!T4@D=YxZa z9TXfdC<&%iStJJ6e-S~D=L43gD&^wLHqm?jBx8vDpm6c+^`v7;S)mSeerFkmcMAZP zIALjDBgg@G9Zk*&c#@07B@nsUn&FIb+~&paOsjb#lcONQ-As{RF+xg)pIM*LuM{TZ zy9DnKFvmRP={=;N91bmc;NBln)h`}*j&+`jBH@q&%XdEJOM`{sOafrwYM0=D4Vb#| z*f|aZ8AQM9B*57B(c>f88>I&sX{Zh??qOs3fCQ1`S$v7mzq080K?;cT;?ebCaqe6* z#$1K!1Z3=Jr0Thjh}M}_GfEa(XG_%F~Ny1a`HOpOTQVU%W1Thu<+U#QNRI# z1`p!BMGJ)DxZj4ZJRH0W_&rGRvVz{YhA8?jbl!EWIPb*<_ucy*7$78kaXu7V48HGU zyiZShZzu~E(jr_I8Ndw}DRwF=K1VomgMK(a7dH>H97q%w3eu=1G zyB}rigzJR!HysoJlHc!BS1TR=)%WiH<|f4=2wLU_?1!#%pPNTn&ZeZ6$j=K;lxTXs zCxU=d2lPC-GYF$!3)$Mn6I0#@DQTt=UkmMx0>o^)R11X;Cx?!ry>P_4 zB~@@XFG2}$Aq|2dKSijMsBsVby5kMS^bLZ@7-s#D%|X%xM5H@(2*P8=<2m=PImP`h zUcShX1cMPm5s7=@g5E~JImmyMQz$vbxOHxKX zfuef}6P-}~?kMwI+2R5rk>9-^2PZBkCPL1QWXp5cOUYfd4e#526L%3iqG`Is8Z@xI0gp zeSa8xcpADHSsD2!cxg-hRQK0YuIGaU%F@r6MUIFewcHXSzPI$dt+BK9m4Xx~5b$mO zA_Dlr%JAr{slV`9rfs)C;9Ok5U?!f zsz@dx1z|4^hjBfAb9~QfEJWmk%^3DJZn~SFAbm`OFh5ms89|YgY|vUvqyxuftS_># zI~Td@q6rzrB-3N&24C?eF$k*d#(zK>2?FV<<`<5ORi7StNH9A_&Qk0We6+~VaDcCD zpAShCDZZn%BO!0?WoWMO!gw`H;pjmvg!z+6rcf0#M&$+1 zDzsr0PhVZj=Fpt2C)Os2XYbc*U=$)W6ODFnns3!n1zSvAO}_}G@JgOAU|sdrXfgYt z`;S!6Dxrf?m&CjP$$7-c@d~E25-%J52JwN%HfR%HAKiLr&+!+YmD_?@O(H^~NN?yP z_N5MefC$=I@GTsY(E4aGk)4o zlU`>P-cg4<5K|bt%T;uB8}OqkeI^>OyaBdzODrMlk~}gf`+c_5vrT`{ReC4IMSP#A z7c#xDv!`hY)0X+0knx%6$trZhAnQCE(!N%r@PprGKlBJ({LK<|Ob1#?FMNj03*k&X zFO=Vt@q+g6_a_L%{+rrHMVl=l6E?a>6Wnl0W@WA~f?2hibdHIcRfkJ}4s;M3FVy{2+r!YK6?7=M70BPs1#S*bg=OZ_ErB2z zLN-hL56BN=6#Nvw#y5eMXOP?-&eRhYZ_NYh<6=>A+)s!MV(oBXujPty0M8R>iR|?- z8C8A>7jE&@{uE6*xqJY5)PWD?9~MGzxoo` zA}y;@^=&Rou-TSbV!U-2EJMt(*uIZBR81L{7ITTvJ93_m=V9eGbvwfskr|A(EeEHJ z#k>4f(-?AC*SNY=Pjggr`WuE_4{UN*=0ddNtp0pDxqgGR_pGs`)B| z^W?ljD-n$NteUTdt)7Cu@V;Y@6dy;zco%R;5(=%U?0iqOfRa=3>9IsAXGv=dI!D2* ziP3F2h3WOYOc&E4WFp1!Q)CX(%sEWf_EMMjZyYw(3EsZZ;pP~ce=zL!F-p;pTHV$e z(1vxM(Z~FvYzL*2CyCK;Wz_U08$=Cgc+l8b3Z}}fN(?*Owi;adSKa-$C zTN=m!E=WS@Cf#LuJnJ0S&(1STOAw^y)2XaChx8A4Mc@iR3ed{DLwx8e`1oO?vz{$s zOvD>&M;0dz#UBqwnuCHPS|x7dNnayVmqPV*q1Z&UJSnW1z7pQxx$9-|>K`W=^C z;VveQ#uu<|I~oh8l%R*UYwW{s<2@!vAhGvDq!;Wzpqzp6ThA9COvXO&;r!uIb`St` zbH5n?9_eiWt)Wr%xKC4~U&O|bE^rv!%+`T##_2z$XkWeWeqqVs2o>-5uQ*)$YB|g^ zF$)$z2#=t&nw<~16fb=}Dsr zT9E8I`gwD&=@KZBJ@54hs>RZhdSlN3Pn2SzyXF6N zRTuOK--v>T{19$vLu8lDfH1=T&vR%{3s&GU=sjz*Pu(zxmqIp)8agrekj4AL)e-1G zu+VjA%A5n~YQHk75o>i5O*g$U7HTSk0KI;WWN054VP_ekThl(}cZ^4X)me(1i%@yd zNbyPs5cO*PXmvuHn~>ADgnk(5dRL&0%qs7r&B?m62NR$t9r!t9xzm0?zC^u5d z-t!$%f~A(gC$XMWx|j^ss8Ic3*ki1$s{M?1WvS;orxW^;y?s4B_3Tv%{;_CQN;hwu zJB8JJmh-6g8F8c*;I@5I;0)#S^1efZ_jRv$C=4MAA+OTY2mCb&tV(|?0h7N6dN+P@ zUjUz;FP0+Th4wT7Tr~qf3YIp8PYoO2hY$1d%RN5q1hUqB)b8OK&k&EY4Q`MVUk>r5 zsly96IZ4w_4)NZ}GfYyyo?bIFVzyOzc;QmKXR>ByK|b*c^9!BLBSM@%MZYLN44E?F zAmQS5C1G=|=K3a27xfm`TuD3_Ba5>M9RB6C>h>ozX0)7UaCY5>lz2`;%2IVAK9nU$+->2x_IleSqJzvGM_AZ06*p>l_E zgFiTU8g<+T>VcUIH7woxqeSUnUsV10*@ppMS|X%TqBX0XyvWj4B%KwAi!ax7}|{i{C7Caqxc$4j5zGlQg0g1^xw?1+8nr3JT;Z| z8^`G3JKSr0|0Cr3iVMI-kh;}TI-B` zNudt$do~alY5B3fT4Kk1Q#&s9wg~MWn97x{T>E<-_PAvX-vIGGp%&X;96D2Eh-#x6 zQLXouB^>xoX9PwC^a2+l5_EG*ik$b%ZMTAL1-M0J=B%P|-3jEgRcpu`GYIKJAVT4v zx%7!VKgLjh_ir%Jl~>1CpY9bJwyr+&+uqvZ0A5XIbc6tBujVIR^&{uAz=wo}4g8lX ze2zSd#*V*Yvbb9n^JARYP;|CBP^Vy7w0>vCE(#({Gz!gw8R{hdbbO;J=D%*Eavq-; zE$Cg{b#xb}MLR&nuDwuoj@ZsLtK_LlokrdYmNAZ1HF7>Aut61U-}r{qV{pwA8zOQ{ zTQ@9zaQP`cUhIm8&v&%sbkN(jgQhv%Z+N~mA_udEl1O06XO~>$SVhafaN-at`Q2?P ztpjVg{e@mqXL%42)fsyJ{<|V{VRMJLlv(Nrf~lR;T+qT5y^c<3#o2%xo6?Vv?z#pLwAx z?T~e$YF;5-8`aaR^4KZ#awjWVLC8v`-X}r{m{(i7?t{FrFy`w1Tb#x4IIDYSSL0cT z|1QKU>CL9J_%XL_E=Rw&%4SI)@Nm9|^fNWqzfSjapw+>a(djN-n_PkBk6h%l=#IVx zj9WICDXuMI;?u8o%vu!vZDX~l_icYI#U;b3=k{!_(slk!Ys5gy9hhbG=LfJM`h$%c z@LWtIEQDoFJ6WoTnKP_+YX$Qdm(fVm!ge0f6P7&Chg|Bn;d^oV_If^YXjGl)CR!aJ zYuyAR@d}{TFfbS+#pDq@QY+Aq8baCd^CRjtxZXK}=RVh(gq*xdX)-l8)m0}S>ipD;Wctn8 zTF&%pQHJ+c{j1JMx*Rx9q$$Dor-1CIzz(mwDe(69@4%aj%}d?KZ{WmZa^w@x(FaiX z261-gp9cWS?mzLu3golA<)9eg9^3(+$ zd|J8U6(5ZsL>$P(_EFvaveVhfWXcd7`=;}&>`f&&p#igR4PjOav1@tO6>wFJn(yy9^3(zE{Mx>FHw}m#cGG2VO zn>312D?^Gh_mDE&<;P2j=3E3Fv<~`X0@FUI4mzBW4C~XjXHayep7$b%jU(I(BHKYD zI)ZKtB;Eq8TNHhgY?4;<9CNY@isUi{{y@?wF|KP$`?Qnm;jGJzN%rOtjd&BJUbYtV z`tS+0S8YgD9YO0qW)mS=ii(ZrCo__D;KXL1&i6PEp3(o9hTv@u6SScN&e) zB_3|JF`mMf_w9P}W~{X}EyJ_bT>LJ1M(52vW|!xRz0$fwVUkr{5catqk~>5R>mx`) z@B2{4`?3QwHB~2aZFzy?-#asbt@IkL%o;?5{2#VD;;+*2JRO64ADvl&E5J#_(HNN0 zTKfJ0L{!6g5%a_wb>LOKLEvB10XVcOiZNlIVPguytxo0#tdGVcWOJ%*m&wxb5UN}Z zSs$Z(7#)C;+MD;`jCVQ>K-N3@SP@~hn)=^R9hb_wXzD!Ho$qOopw5tgq&Qc{+U_ZO z{A)!ky_SoE46iC)v7_kB9ox}ua*_>t3%?>9cGY%7Sy_(WTu+@tjsga$%=Ql;CVjUf z<7|~@B2i&^`FcCy*W3#i`4vfi)*l4k4SgWDd2Vi1%GZfhAsy+{k#b9GSmIHd&B>o^ z42gr;s+B&A&Yhucu8*yUS-Tf2d8`JXq zf2(P%xi?|P!fFyS^uPu(4WVHV`5q74GKdf(Ln_6IsMuo&Adn%MS$gX&i+Jxr zXe8sSH}~8;;;0;t+(}67$6i+r#fkWB$SJ*>GD{A6(+rmxVwHnCHG?t+sFkH+JgG$) zaR%%hD@hznDN7>Zy>KrHBr*gUA-Q&N9*=Y=m?|9NXF#x?gga4X(r4IlY&q1o3v<;P zlb!H+RFxG47`^DpH}6NzAQRKK;2qSR#%XRkQPa!8P@eq*Vd`$n3w}uno>tf4Xgg3R)NSNIc|_z?|y`Y$rH5ylotQXF{}IP^L=^S{v&q;Yg=Ba;!z zFhw>+)9<{GmN-a9x=1j7>ELAK?JI4C4Gxz;gs9Xvi7J43r*3yWhK2K4PMl{2p7rV1 z(UR5y+<6}>GYVI6_rZX>x$}7X1Xfo3BBa-B zlG;JE6WZQE>PkytEj38KmQLq3r>uX9CMJ@V25LS1gMa@iRthrPj%yOCW`#cZ(O4)_ zxiun8$P=2SD`8k_fRqONlS%Y)7x?Az(2+n%VD~{1i?A{=qi+v2=&Z4OD$d}F3D?TE zs9XZF_|B3b%HsJX~QIKpm8JhnBOOBqQ6D;uW` z=1h>{LtX5mAfAbI8O8!j9}jVJJ*BpG(SjvFk^#Df^Xh6VNE)tGB+oA)P(QcBj=i&>Ldbyi!X zi?`kJmSL`2K}8KEb|y)Y>$eGK+e~VyvXNl=h+vDYEyt7O=CIX{01sI`i&&ANWMT+n zXj4w*yxg2Omr>WkO)-df6Up?3dWWEa}LQZA(o58~(TA&7L9&)8^`2$Q3^;^2t`E-MKos9QQGo z>FzYzr)FOyW$>=oo})^N^wsY=toWH%c|=-NgQxb~5;)H?+U*%81R#xG^E%-N?!e@G zCDW@=R_JPu_kr(D%*CA6wQf$0Nb8?Mkj6Qcm^pP$UbnBFn7}UltDe~1PgO^=9i{vR zZH7?wyFgU2gd>L?WgpJa3!WIIC={ZcEV9raX<_4q+jiUe)uacHw?M(d>O}faRrg0&Is)TcHApxyZeRpU$f#B0{xhKP$f7WWc-S(1Vp^STzP98yNO(@o=5J`Ndv!Nl%nRD+A-ft z(48uo)(wL!%NKqPXHv`t$B+(o`-1xAk{2mao0X;|KEJ&<`0B^KbXb|;_~DkuIUuOE zmSsv0pRm7v@jg?fp&*(L%V*rMsDsQR1A| zqm>U)pt5c2b3r8>tzfXjE@S$*C4!Od05y{m7L|Iw#CQtEFBG;W*KHw~tR}cDf}VeC zd&QtZQb@g)_x)@= zEds{&?q}a%uE#H~qGBf#1Jh_{fFS%+=kz)^Mt_U1feYiYo#O1deO_?CM!-Ekz2MEd zN~w(4nT$99QYx-f(_x=?_5LE*Z0tVeuV=w_3w10ZAA33x2ji_**xMJ`wZ|B0isYHH zDt9tCNBHK&3Ci3Ov|}b+nS!o5bkFeJEXG~TcwJvUMed+n&^=sjl%6E!5r4CiuHQg^ zu1_)T7?KUeou;-2))C4uR9Im40(j$eU0T@U1g<2*4nbk)iY>95H(QEc#wY_^chLaC zY#HJ7{xp&N+Rzmm>iMK)?y)=jWw#{XPyLt4rb;VK{?OTE3Y}h!TgR0sZYu6s%V#mr z&}t@PAHh+AER0EBgLjr<>NnfggZ^$}!nI;1pZHo0CxfvR$q_6H)tf-Yk`ERf#_{hsB2Cuh4b? z$+5-K1H@y|fg22o25dtH5>V*oi05D=YhjG;*erj-Vnr>s$rBk2xLw zFk;@(uizyXWLUEQjC&P1eZfNpRTb~*5T3{(uPODK-%7t3J%acU6=sj>g^C~50O#Y0 zxzk#!>mL15<6l@#u`xsyO`b$?sSG3t`ji2>Ei0`?H?7GFlJ%fN5)Y&9 z-|S%Qcc)3&_kTEp&VCyx6E?tw4l5S zUvwe@c7N{|{v3Sn zhYrXuory8V*&~{J>51Dja?2}1A<5;^Jya&*tD*>O1nbq;-_j3SgTMDVh<)yAv5^f` zS#;%x44Go6aDk7UT;V~Sdaa)g4Yfc(xMcY)Y)FjESF-Z4cpK%{gCYsPYFqBE7j?we zL15!F07=le?6B)_-lOa&RT%Ze}HU@>SZ_R%7dh#gz3Ju@+fvn|hpiBnU z>|Nn0cS{S88eUBBt`k0-=;X0aqPoHa83n`Aw*sR4_j*jIC5nE3X)t&AUwT_^$pJxH zh-(HSbU{!YIGlakU4ys$TG$!<>XZET(|U|4`IP2k+Y*vs@xB@mHQwidTL8YYAB;YK zWJOA!qN~@i_ygtHXF8}K*I2A^WnznrC#asn&1--z6M9bjL@s0nQ~w+Uf9J2GooN-c zXX+NK&7Cy9x`Vw2NfW2{IcBX3ec~J~()?!q(i{B4n5fMwukxZ{Xe7Dgyxz9CtMPwv zeh-NplXfXv!xx|4l?!U}9dP9MK>mX%^Z5H}7pNW3{769y6!3XG{x7Ay`)K4+S(K36 z!ur&>jSa)DUyqZO%qd8Wh50K?J;$#{S~3-%*bzY)k?6J2?Zx^jPHE}%@G{K~t&bE8 zO`3Bhr+MQ;J$XbMqs0IBl57i|t-Y>}dXrD~>`u;JLtc_RrviNj!Uk1pKetxD3Yn8& zH!P128)-E!lpTHPEo2Rw1U_rqP0BwI|9Z_qG<8O5yNJX;za9bMnAinHY%uI2k9xnd z-CEkMm$Jgcbd-ImJ`0-m${!OfuOGFk0yPzqOPj)AM9`A-^Od~^42eri-?!buDOVM- z(x+rLxtw<}T&86zF{X|t|I$Y$%cnZk+r^v5X!F(Wd_Vhjs7)vBHj_d}hZoD{K6&k1+d)S~4C76Hj)gh554V9!z)C9G07;kDr`g1c zcRX|$GBQs!{4fXUaLJ(k620X@HghIgM#}1>+|~egN4GK>U7g*UdLqlSD5*)&XFe)8 zceHQbpV+C=pq_#{;(NHdG83GMs>7R{rKyBnApiO~L*ihwa;n@#((DMU4e#i-ZWvUt zL+P&YGc3R|8$FOA$abm9+Wa)I$wUGSOqz52ISi+zhXv=!sW|VGfQQMTLWWTuE zA7r<{wsdyR>WuQku1G47?UYuC(vE<~WT*uT+B_OHFs1kDo{+(dySWr{Fc+DVxG{f%utBIFiVegR8ugLN)&pDe6mpk8h@`8o|R7u6kQYm$@ z;BF+{;&t`*_J-AU%V>r8RIs5ldu;mJOzm1t4eyrTkgF-#(W5V?a;sZvE;n-%0M{$< z_IGTjJFrahRPPgd2eISpi6jdz{_BM$tMDVUCqcH2<6r)wfKzrQf9CD9_3inUTi{QR zl4HeJ(InwdsimQ^=Y2)z5Lw>F*=4|H&djeXqV`e3pVqR`{XG6IOPja2UL&>^o@~!` zJ6kU-U<2;!UYBpi%>22)d%=#va(ig{<~8D86Y-XS9IofRTedaB&H}bW8K>22T6Ry1 z??ZWZ$A|BIdv?c-X@2*kWnPk@FPqDT&iAKfD%$P&ho=>(9o=4k=BU5T-M~i21wA1A zZC@x)vN?8cK?SoeEX3Hioew<)6}mEmQrTY}Hk~o0^N|@?DzlFBq!2Xl7Gl z{kKKF54;t_sKcyTe^w77?~dPS?0Hb`~jN)<05rlO~1XyQf_~ z301a~kyff~DZifq?HWPVd%&Y{hhM}H5A;_)k&p++*(Nfn z&D{rpIBM_>3*c+|?I{16Hx2|mlLD^ZVu2Plpls`^w?o>jr5wjdr*U5mR@*zq&QdYM zgbGNWjkMF2>=}!6PE0ny8lRs&Okle2U0Vkb(Jzn(6NuU?bPv3n0Jf;uaAq%QvC#Sp z#4PyZh4n`CoEc8@c-F6Ox3QdFt?Txd(w^Y!%Jw#r9>;ma;ZEZiP02p|i$!^}Hp`d@ zbE?A%*+2lXc=>{U`5F6u4n>*@oT+$f*~}mT4qT;%0s3COZb$)dTp!a1v1LjCVJb-e z8@0uS0J*J`gdZdjK@{k7j_5;Pw#h9_&{}^r;l?z>KID!V7VO@u0uGg-B(EU;|O&=9t9!iIBt+R$16l4P=OD)>K30 z*&38h`(57Tx5LcH@SpD%BLm4)hYIhwBL=Ab21xL6*sce~baE=A%%lB!t)TvR4PKGZ zG8U-({#nFVb!6Pv;2!-R55R!T6|_{03w;7@ZS-%>z15O7Nri$5Aedh#{>#U;y@~r= zOe(B^5_A+VL&!cI*|ntch|c6ml1_c^dvOie&i6%y|@tCb@B}avxHuW03N(y z)|7#A6cK6%&>l%gEnf`}+j24%LJAx~quo8Hm5U#B?!8rDpEDsGMh=HGiwd<4y<$Ek0cnV) z^I#$#JY+;=;jceg4>x}NC@KQg-vBhXUIk&N<({?F6iG2o{RlX z1-m~Lvfruo2(ttb*^QrUDv+QiC~dQY^+ysKw#x7RcpFswQ40R=sl$G2iVpGTBDmRZ z4B;uEsFvB-`6JlrE{HKn5Qj0pIkOKn$)i_Jfr}TBJIJv7YL0e?s=~zPF@Tn}ksI+l z4AL76JU}YlM$i~ePI*r|+19}2)s>}BN35}hpndp^{OWI=B<&G-;csjpF#3@=`F@vU z0QMt)HBZndCjm$#6!3@we3423E`H`?$yDLG5E-J3Cq1?%u7Kb-GHPC3q4oXQA=K`- zgl$8_4mzvnK+>ksPyf3`r&C(AQi`~)Tth-=@Vh(|pMW)u1nmG5UI5P%BR{~5R_3pn z5E)C7XI(Xj_!Q_r#}aWZ!#-$X+0Df3WDDf&1_GI|J>ExXywe?M-J0Z_Q<(SsOTz0t zEo_mukQ1<>TD|}wf}F7q(P&7Upf91RKzX_IT=>{9{iI+#8|>s6V@FDw?JTL_cyeYi zQSC?62fp8%?BaL3c0`0X1lI$CZO@DV>ww#*-P5bwrJ>@`E#7a3qoyO9n-amj?+cxu zoy*1dB-r}4rY3){PH&&~rk1`o|IQZ|tE)cL@$b*{zG?6bLh<9W6;Y?Q7o*Cz$d5ql!^y*n6Gfg~4 zk1{+@hFN`)6!y)40Px7i-G)cHf>=o#-{kVcxuUJ(?&3IHAj(}sv{Sd`^phj{Dnl3e zuVX~wu03?o4Eo|pr%#t3Y%qn0R^11;hoIfZDXNOu*irt$AwlxN(k)=3N2!8$YdvrkLEjM*uJj8oBm|r z8z&4;(FbfrgIpfc*LW5brym#jlSX4Rl!6a58Kit!17%2i0<{sQj`Rdk*c2gm!*+r2 z^rV|oHg-@gFZ^Xu0v|10ZDi)LO0&VCWgt-JceSDhcX?@8Z9iKDDYjU48N=GpohW?h z>hIQ(x})GPJ&pxQJUoR^V?CdUCJ-4e(3xtPm}Um}rjOyf2FXf|B=J!Fw9m>ZVc%`o zr2>J^S_g3E_WFRcBZoX4WwNxOldDc;wjHg!v{VGARlGTh;L0O6oma$D75#~R?nmRx zm?~Y3Eb?i8%i-T&r5+B>;4L23LtoV&pWDI6pV$4&8odNLLzK%DBa9QI2}{dTloyYZ zXhT_Z0ZUgeiX0>~ynlMqq}1>tI_k}#<=jNNa-7qs{nH-c|S5#B^ za8unCkbQFWv)2CX#)fBGRVjV0?>is3Na!^%aVa|@8*(@WCrHMe3Z8mISYsg*{MF-N z0l|CaPeAhZV!=bylao85(O6bSj(*JWfSb~HEp*_p<)%#VS$cL*Y~~_>aH%q|T2Vu= zRg8&jSNSZCsfX4(N%cgJkzQ=prPP}vX{ND-{X6$l%M}-U5{&?Z0qDoj5>4SE7{rPy z6YfE&Oy~+REU-rS!W0{;t*y<{vYlb(HR9#f1`Bsfw4tAgg&q)cUhH69lLUpL=shb; z$b+MJYtuck3gaODw!L#%f6FH6X4v3xk({H=sW?7$8Sn-a$U*EF;k@5qBi znFYccU;U8Cy42DDA6~vofQj^%`g!_p!>PNPd&s0?L!yTs*9daufX9|ypQhFNJARBe zJtH;}i1;$o`tla6j-I@mFnKg3WrTK-3E$SM+TtS{T7RAsHKv z_G`lSkkiGtdwcr_uQy-q{=c2=GR6?qdHY1A{SQEz<*A;af?2$h9 zgPblhiL8h7c3(3{lt-XcTNxzsKtLYeu0`)#?Snmfa)l z{IA~~N#1Xhe~%FD-!!P41Qzf{-U}k1jPH2T<@a0>BAYoHyFa4=dxNVbIvR^wZPo%z z4U(W?X?8FC?uW#9WErp0qoj!>G6~1NgR&oHSEL;U={bsgpDh_tVmpn;bQX0s&X@Dx z+c+M3Y_%9kI%>L_Jv1UD5(Ki9g&v2XGCG~KSQwc=i4@6Gl+^Y$zw;ZOnZk6beeiFT zA-5)1mpn$Vy9X@u^09TuVs?8zcVAymY$g*=TC5r4lnn;)5a^>8^haUIMiLu%Sl92< z5P)Hf)K-sQZ5Ez-w*cUmex3VFv~~8D+p5b{bWQhIsK`^J)cH@h=Z(Ct;srR#|7T?_ zdH?Uxla;3r=RZH>`45U()zlFWAAf9Z!xR$h#4Blv9v*ET9KpP=t^fI$f-4@^p;CpK~lyWoh` zrPHGq)7dUf)iyHyOamr+L8NP_!VMnJhF}Pa+^Hk)*XV7N5DIwLo3MJ6>6XLY5}JR_+n8+GF|*Jd>N49q zZw_|0Hjj3;wYbH{0L;LZBU*&_xVj&_b65T2^G@7~QD;FQz;-==59uk_#xh(?ZOE6fbWcV`yc88fhnRf+9;Q{gpNq?HYaIjbOid9mXT_+=0S9-#G2SBV|IElR~Mj z=Snd(U2I=OLXc$x^YIY7^6*fj(A9qTHLM0`OW<*1Ca^roDh zmHWmx@}*mY*5VxtNZOBptO3JeKR~mD@wYGy%bT<0ZUWNNNNU>}fU2#`fjBm}-{?AC z&sf0hlisA{DjOzql(0N5qvR?2oXi#KtGDcP+zas(iI4NpE19K+0q(MWd=yJNlZL{T zn_8o$Ux4jA<6lSGSok^uBN;hk$3jJRP*2|Ye-br zQngw}Vr6p+SHQ;R<=`Y}8B(7%$wyx7tOs9Z;>kj9oMz{5-mOB^u(k=Eyx*9 zYb1{hSxsF!WoPvZO}bfCF37ahuwLZ*1~30Fx@HsT|yjx(m}?vHdJ9mmY=0=`7=32SW&k1o@b zVSowA5bVP?=SbNz2fBEE=FzFIGyu%o$GzQTP0LfD({$(q`m}mOC&BC9#(HOIW4#Oi zFL_2Cu`8tpUJfUB@>F(<7){0~*=ttCeVT=o5*ROw4#z$C=Cn*rptAH#R&37`+SwFU zy~`)5S+wNTpi+%ntWY}t0tK~mOJGx50y4#rIXUNq@}$u|IMfE^$Uaq6j6Tih)wXS6 zPD8A`K5l%>L^J4tTyykeUbEDj5g~p?)im9U!Z7X?DCcnM@$LVOkf(AH2|9iCZ zG2mSAd)c=Uxv_7agl8Hi;EjZ zLz7vSvTk$2J77(8o6|mGs3M@MeY#Kuh*kTBg|Y`D0u`g~d31mZT(u=lTwG-?Q>Qyh zd!@@Aj@|X4n-N-N@out`Nm1WuvyVL)mpN%23g?1WdxLq>{YBVL8e7 z#vm}0C6Eg0JDuz%lq?-X2T(2N+^vcYxVW=>ZlPPghK@hwE2Ya`sN2)zfQ^c}QBI=e!f*d&wej9>3X++?&Er(iHP>>fwJXemzBK$r9S8Gf~{T2 z@_bWO)!>7G@nr`U?=!)-wO9%2ns{7PHVMe5?5Um%Z-!ptbjr{yI#1AdFFH4tai(dr z3tF0TRd9%bfsc1qfdNuXr)KV9gxK@_o?KV}49{nR(T&pGSg_lCv&$wAX}wBfGSLHK zwv&XanqC>F2QaFc6Y0C1D%d(79l7N(YTOu<)kAF|6pw&r;4c{r*LV0W(qB(|^%h_T zacEukU2ku=;y$~L5@zr&=K$|pV>!toRyXZw3k~;*`hXm#jyz_$gcnWMVtn`Fl=ATT z4)VYBSo`Mk|H{*~wUw0ozq^HIRUw8c>?!VP(?~aq_?M+tnAS)h1 z)@zu&qws@2h-*1+NeBKJ$T)+pPp*hjmf#rlh@&+s8Ml;%;|@sEr%*%^C$m(16Oa7M z!Xna99UXVHonJN#LZbYpO{K|J@%~2gnRXd*8prE&&I2Rt+79&EZ+;ks{qTJ3xXq*M z`X~yA7uL-WdE17Ip@LP*z9Et-_pVy#0MDY0?eb}h0#z~hS&>QmLXvelhZ;F=bu^NB zz`JgZPX?N)`;w}R+qaC{l1a>|+%5DVh0m>eSxp_4ApV&nnDuJveied%vY9YyUy(E} zGP!gyqD79WVS9h;=#Mu$b_5*T?2r(v*8eQa6Ew6yU=#`Y>@aD!?#W|HO8a}X%`v2v z9h1UTT=}4tczp8Q@lgv(*3}m)=!KNsv@KM#tL?CRge+lQYQ>KA1NwPH%r0sCkchh$ zkPZ3skHe##*Z6?H@zXbNpTFAO!l(R=pKkBG*nIoy=yYfAX!mFr2+Yf^N0&t@98&twpW_L&EExDpj$DJ^vsRjM=Ib8>XzH{Z7E9<7Bci1yV@l>)$yX*Mpe`mX6EY0 zsZmHzab1Smzk~b%c1LUmfW52Zb^14=7sTFh=zCGK$S{<3_g^o|c53pgB6zBDDsQp> zI*x(~kpL1lBsWAE-q^{!4{uM~#69{bI#8+gENQ^hFI&rCs^0$ePB z!S`TAoqhz>6V0)w=l*EEWlCBYFv*JRL793{cPWh9be%n3J}K<#@yba-506(*GJ9~m zc2XD`!Hyl5kEjeg(?%wb5r|r?=U(jd4_+&5Wi>VYk2=Bvmcf97wpc)~p~ob?p;9wC zb#E4G@-!S`G_0;SsG|+M6h+Whn$1OvMov%&KWBbtig+oTfsL9|(p)zJY6|xzB;CR} z*3`#XaJ^7`Axqj9jSin3>$e~Lo5n}4|HYyLzyTS=y}>Gr)$Pub#7xlaARju`q&7-6 z?T~^LL1z~;0$t_~#^$McRy$I%<1s!y zX{PRbyYDlYf3Igb@Tjeno|KVK`7)K$5+4j^i?JFT$=W&UEP6e$cVcR{V|6Uk=|_4c z1M80h|Dy~s%SH|iC=C_Q0*v#)UvE@Y3Z?GWlxrlYW3E5vYX*!X#ajg(iM{j(QSd>$ z2C)W|-&n@1C0{IRQ+BZnGE^2*xWXWDj`r&gIls5{V0V${$5Y5B2Aeg?5kp4Po}CKZ z*i2MN^)iPTz_v^{6;^TT;u(v^t)k_VB9aU}K;eo*6b^a+j9IlbF&CuaMA=HzeJ+a3 zi5-*ir#rC^D&d}nA}uSb|5hnJz73T_0V0r$C@?MIHS!fpXaZg{UvGlof=-)1-l$_eEWW2xpS&AR}OOKt#m|v(o86{6XRT(YZj~W6`%)e!&QofG^F3nEYqe ztp{l~RB_s4PBztb(*+poq7@$8cCT^`CL)fynE}>~Q;RC$>}ToAt_wAJ#ruxFE4h+u zP6&wfywMv46GFNL%d7zwSu*WM&|BA$C=FkNm0X9n&H@r=z?^sY{F?-ovxw}wJM^@a zO4oNfV{<2`D+$LrCT&BstZgVUq1e1|8T4SKV&sob1NSVa_x8D%G{jh(;8(5-5BZCG zP{yZY?s*uWgB4CvbslEh^UO0>XiVH8GR%t&@O%45n@79*dw5)xh}%(49Z|ITRZ&xR zqmdN;b3}iIPLc_eSiMnAJk2|XD;;B{ydY#->h=D0w@t^I7W(^x&-h*aKgM6j0le7% zW9`w((`5XY$7>JypMFsPj~G*d!%p+$ zs9Lr3%SCt%V)A)kIir&Lr2@crWgwf6fv4E|Toi^39P7$9jo_r;SXY?Ph$|nz;n+Bo zamoyll_3kn!d;Y?Uyh@QOjG=r^IX;B1u;s&a^_tI{lJU(qOKwc#}K7_vp}^`&>aJ2 z0`r=qQgjI$T7$}A>Ll#tmB*f!F^5s1cb_Q@Iwiu6Z;zYJrOX8BmmX})5hh4K#RTci zi_vBOq@j@r1{MO1EZ8KiD=HN3b(QZ&;J17mqz!VL(&Y2}jAv2v4xCf>$=;`mlv z-eAZ{*yy1!%6?5**($cZv-N88fF+)Gs+@$>!h6z-vHwqFjYd&N>kxDuz{p#lZ|fLE z2a23JSJhO#fI_>$(wV-ho{{Bira~p+VZ=MBqiCAT+r>_m-_d}Aw}a(12zDDMhXWPJ zR$D;^f-JFmG9-thXN>KtO>JSP_w0CV2Lg7`(6=-eq&|kqC!=B~HSpZy5*dO4M@cHq z4ueS|3A6T84{B{4*~G^BSr~4-2*dRy{IcHhqK)TXw7!I2)|aSAZBj4i4d8lqk4v{z zNE$t{@~ATq?{@c{C`rn(NQ6UQ-JU@o5}k5_tZ4Xzp~y3`GSqw#^nEGQ*G5esL9HP& z2?0c-vWS8yT8nCRIv)(eFXk>nCV7LD3chwRt zV2urO-G^N~wgSZQt6Qt86CXUD|4eQ(*xYghU1&bh_mx`yOn`Bzq_?zSR=$Rs+d5oy#fEWYs)o^bMAej-=EsGmD+9543hZdGB6!H z+hJd-7e1<%zA=-j3GjV?1%%C9DAMoSI>LvMo{^ z3Nd4kOdNULoYGB>7)`fbish!Rilj_g28w(5CK)0It&t95PCWW#7RT*m&}$2@EbGFT zhzK{AqkZDn8B;f=aD^h`z`N_iFZo!@AZflGOmr>_%zSc;^zX^ zTxb@tU4^2>ca^J&vwchUB{c!HYpWcv6a<`;obe<~s39r7Yy@SDfTT`Lbq7g4iY~?CGiP(-l zJ}s%8%8i*Rt?rjiCbaFtOb*iyp)=q(PQ}FpW=buHc{&qJ&)O)Pv~}Z{%xQFkkq*kF z?y7?>K4L@4^u)1xZ-=W%_ulR`yj*g6D?Lh*!Nk&j9kRR5tr8^+9xtEd7Zgr8I(!TH6=0wbgK1Ug`ti~v2r7=*B_5Kx0M$=jfq;OrM~0fP=Ez<8=CqM}kENF-%O zMH%x=XX9p1IxCdWDIU#Sqbs_mFCMeY$DhTQYui8T+V~tuy41y&FZN^Ee3oNYaF*Hh z9G(n{!MKn9sJN2QSvEW)hYG7{XIf{eVcd}*IPEEkn6r2PD-9DGI0VT5M@tp~d zUX|Bj-4@!;W}NF*(mQl_Hiykt9y~l92Pp@6PmdD*$bc89eAZDC<*xEWh(PlR%fo(#7u{z^yWF5{2f_+c$ zO$(DGAI>kC#M#ESZu3@MLFU(L;NG%oU+GMZ+E*E~q$hdipb%&vGXB-0!QsPll>-MI zbG=I5b3=YGlCcRJ#wA)T0LX>1wiIO`ltw^%d!yDl^csF$+L#P1r@q@qie?#x#_^M> zYA%4xS&MMa<*Ue1L505jBJkf-`b}|LVkA^L7#IvC;!PR|R{%*1ZTB@6T6WTFOI{bO z#$#$aZuUmKsyj|f2;&0?BDgCzO*w8E@X`b5US}ycNQ#PO21$wVI7;e!?(n#J&ZOb7 zW0le%+1U$SP~}I?(Jrbh&E=|&yVtJ1J$kYD*XlEO*tC+89yeRk%hG7FRT^ltW*V(g zqejOmJ^XjaD=7v$<0qN2ExNi!D0mIS6@APTd{ct#eB!{Xu0R&gFiAI@VDf8`EyJE> zs-}v8r57tY14?6uRuyUHVKznbqK*AgBWLDGsIyMF)e=)qA!E`Svcz$DM$ z0&=L-z|Ys4_KOL2CfNrvG0E>`M@H98ZkAJzhJtjD9AM>1ay&G;Oix*8$}!0R^4H|B z=-8gAadF-h4-8%v?VWmPMtnALB&aZzwKM(s_q0}$(5DllIM{{9Grw_sSY(&T26_37cGU;`Zm3^g)E4>4sX;yA_^c zV=dhpK9Mc7WQ+DAJ&Bo2x9%16-}OC0G&Q0pj-b{U6>>W#=M!#RMLWLYWOveWT*V_8 zjDpB_j(i(3paV9aFlELjd7$%D9cY5AGtBm+q1fT*1h2gf>aJyXlRYd$;uv0E48wrK zH(p)%6#7ehHOPpKGDGy0O$&8AYZ+hXGo*rN8+8qqvPzFALZ&vLQJ6bLAj1#FSf39Nbh$HEZO0N)wsSr)F#J+fsbVKq8rfxGF}BeOw}7w zs%Q+CNi;+wk0LdhnHLY_W?N|| z!f>u1-W8U$)|F4PwbWPLM(`vG*0l_+h*G4lF9PMI$I?POtS3Avyz+GJsZew;yurD< z14syRuQyq=ifLa+g%Ns#AL)Cyj#YT19J>oh)eu<}Pu-4|O`8KDJ|d7wRbo+FUzhu0 z?H86WnJGlRbJtmKr0SwG;y3aK&6zG)mktz~dByrF=zfih)#$CYhT<`46_&o_O+=;_JCUX6WDD_iH z)>>RNp_hOI_kB-Y2QbO*$Z!b#F(ZhXBgw=bC*val`{pHC5O9^YVA|%{(o5nVbwyhB z5#Z7W-pb-b;*rO}@}cYKD`Ail{opc?Qx4GDrOR~wNbFn>`v53Pq`YHiX|>x+Dc<0< zqa+Q^2_MSOhyiy7D&)1RqbQ09L;ks9-&)VXk=_8R)#aK5jrSj9EJ0)_vYdeK2$(!N$ zX{*A=a%VWPjz@YbQASaU?3fE$ zDmL;k24XP;PiKO} zWMUILx&zHo%{i3((rVFV2I*?6yv-VX4SQfkD%K&94ymLa6e(S&NkB8Q)bJ&6zDTLP z)tIq2#q%32*3sELKBYUn9CCjJ@9?;C-L@4V`)#Z*s~*bxFwK--9KmcWcHPV%M^2S_ z+#)qGCNuzZ`=gi2%kta*-R`@V*$MFPeb`qY-L>E3B059ot$JlAfT{A8X2E?@V@6_> zoeqf_CT_eP+%emCwPGc_>xNP9G+Atd>+3>WAIs`UEa_4krRK7AU~Ht~k6SiM?bKPO_RsA4R^O#h^LwVuCq8T+jW1 z@BfZ^OID=qd%OlbA^+3z+T&#YrzcO=9zWdw{UPuFHk(T_1ytffs{E+}8L_%&2O+fM zM>wI2H;;~9?H(Rg?Kh_fJMePpf8NDE&3&dPw@YIc-{=k0*g4pfWuVBsD%1Sw*+yLz zeBe0Ku7CLd+vk5r~!leil{o-XinJztgW`gXGn=cBdTR zDmg_d-o#RiN=XTljuc}^WI@&1jaEoO)##yqL{~f$!JcJg-_r}fk7o)Q74XVtVeux4 zt64#Jjpb)f9C;roEEqS>$ASncMr*6F110+<8_MXO3XR`Z39U^WPeeTE%ib$b#AT}w z8MKj|wW2IF4cm519GBjxdjZY<$6qR`h?j`a`nm&!q)e_;Pqt=lH-)YByby_<0En(#*hj`fQ zXW#!V=Kc-k|EDXKkWbi_vL>#$X<^8zw>J6_0HZD^8Z{y1NfhW3Q*t3(-mxZ z@8X5|`Dd-;*1M~dgso6`#PCuX3+Snnks$Kpk$$0*5!^4wORRq_z1^o8 zFk$_#tv*W1|4$x0eaQdzFR}i$L{qT*F-r9xQ)vGxZ&7MBKWqIb{HZ^ie|NP|hi_bx z*12A@YjyYcWBC1(#V>TOq>0eEWD+_QgGYPYn@5}Q7mGe~8+h|-b9XNbz66`V)v3C3 zum#l0sQjPh0ANxfCO5kxsGAs>IMAhV=4pFyB>}+0*qAl`K zjZ_ilrA|Q;3N#g^TE&H+YiHHD&zC*moVS9$JUY2eCPK4Xle8#8h>H{>l#H(JAVk>Y zqrg+6kR({57=am^mQ$;+aV~Qo&07LJpLURrx}$>cv8UUa2TEs8@(|tzs|`e`j&td< zXFDNS`)JQ>qL#*-2>dFqglP67=D2>f;wFiy&Z)lfeLVh=)`7XS>TveON(+Fs=u zfNfO2*xV>~1#&W-Fo#Iuwgr#*5Nm@ovsp zaILSR;oTRNRS19EfH=bjo%@>l{V@D69*Rr6&~rv%$rY>$M?&QsTmJPZ!Z_}iVRVBR zI~cDRqoo(&Q&G`W)x8|PTP1rEj5yPgq8Q)JXxOxKvv;f zH1ke1%qI^dX^1T}^fmHsu(@c&(CkgZ>TqSYN4od#VnU=te%eSDOhAGM2gfpAHVF z%5aEMjvN3ls=EG>%D^KNJIGsfP6IOY8s}rrf{0O@RR!JicW+cSq*UiGlMBz#YA@oI=>!2EZ@{RZun#L50yIRVZ)WC`j#oOWrG% z982F5v;vmNtMlKmQO4(s^5TQ<4`bFb zVgC1hkD^0xs0t48XD%gEbxcX)Spnf;D&TGMX5E?rZcd8z^~Ih2BlU{oPV8+vuR zyktEgd1u)w@#n=w*;TQ;xMa|$JFOzl5fTG$w{)!l~kK6 z*=?>Aw7F8y=8Dy(jJKzLTJ*32y$6&m+zJ|hO1H5~g|g?MEz?D^r#ck1uPwv(*$;Jw z0zPn|CA+fhl;FJ7GA*?j;+Y?Z*CYevZA-}Cw^fP($J2u^lG+TT>N2&Ko)gtX0lcB! z67L3biolm-3F%bV5_-ZUOYEAp(MnIC6ufO1Nr1+as9K2d$|QtW${@Tl1;Q&65MHTT z$*4H?t=e{o!H*@k0D(8a-~`NASrTUXV$KQMik#AY?wx@wXpd!PHX3hfW4#Oi_m=GJ zGv!l$%;n6}u6}U5aw0dCu3pwOMIHR-yN&D(l;b?>N~7@9Q#nNd_lCfr9}R*H|Moby zNG4rn{9r{|Ni6yFR0pV@vs-iC=An3962Lz8cuq$GoEnRSWwaJP~Y`XHYWGwGPtPc3 zk};jU+oDs@q{U0_b}^@13CQ9Fa`OnLzYJYv+qcxND$h=>M+yBq)eOn`GSs|jBj!L^ zO2}u+sng=;odIlv5oS2QJ-!%?hH+~N4J2_h8h36M`yR;JVRXLa52Ph#$y8tyiHql+ zvIHg`D_iHH73}pW{NN8_hkI~#U{2k%g*E`G>b^7C4!Llv1q-~@N~G-LP(QXYQOr?d z8mAKg7N<(A>R6!dIGPD$sFR)y*T<2Iba*?jZ%oD#YH}?SaNOqI zj^@)dr6+$rrV#zbL`-I1kobmYXP^~YL{f(1Rw}f7Dt(9BAyaXi9+(^s?vz4B#45Z6 zN>OYf)ai$4DMx!LsVtK~oMKUjno~hE8e#s2)4lrsNX2CAQabU#Ym}+YB2d>GXinnJ zA!Fsr=oiWf_uQqKdy~--z)qr$dXBPrB$jRz!Omn%B1Zm`X>>;vVvTX3gRK0i|Bm9G zr4|59TuCa)1I$5;JRovs5TYw97}jRhF*Gs(#uS|-h(vX4gN01isA$W=hn#9MSD{HSJaz=RaZ|cx3*i&N~XtC(bRu?u&Yl{ zb3i!6;-gz>GVS?i0b0MU^U7e50g6vX{UWMM#8gQ^X+`3CiUE~vId_EqHuj?%sR>F- z>tH$#shoTS-r%NT;yo(9)$u{}p*V=Lqo^|`z+B=naxcK>&?Y+w<e4={!{ESks3@;4%XR1J}#iRw!{zlCa;y zO@xCq;w)f?CmH2hA>|J~22nWRje%nU$0m8CS_;siUSB6sC44+NZ!o_wC)>@>4PYDH zlz)MyYpo&l8F3=naBga_1WcW(YidBroUx=PXS*e3q(()9qmI3+MLNT}QHufvOx3dv>x> zHpP2h=j=T1ddE{qYt`aU>AY1TCqtvztJ4M3Io+LL;3kb$A~+KHoyffa$~g&Moq9II z%Ba}P%Hu8QjU|ke*-8KYEWYUPc79a5*Btmq8Y=0gi?L^ArAM_0fo;19=*#7im+~BC z@h(VfURuU8brW7pybFa%fn*R`E@vrkwUWHLsd^!k#97;vyNMi91GY4iole>>$4%XX zsd)Y~o#-GA%kun<4t$(Nm_QXE3aHesE!W`hr*>_nmV#bTzGmOMy6TOg^+n3~hYU_qIzE?rS zqmP(}x1PQzrBXj@C!qAL>uRDm=`^}nXlbK5)xzWhp;F>wmb9RyQ)CJraCEst>4Ow& z5lDa?yqOS6VO{Rr#;xERE)nj!mPgX-BQa^HycJNG1yT}Q)A5CKGu4uIE;FQ#RjS$| z!WWv47O>@o4DmhTRE&<|WRFWF?u(LHaS6Xfo)eX31HFQcY0VVJRE@#enNOps&78W2 z3HgMqf0k$Df=8lIvN+A3R6E8!wtQ+j%q7HrQA-_4DP&EZQ8=_xIQN=tSGU|qJlk_t zE*j!}ZM&|jC;e^Hb=Z4~N52gXB^469)R=`-vRb+@pXOykPZTbgAh;qkCJC)p%8<|}FE=gDAxHE}ryozUKeJ*l2 zxE-Kj*zdL2MBOl!^kzo>=u>$=O9t+wmV^E?@r>i0x70(oY`HAmQ?WXIoLbTf{}oxn zH6c%O5M@I zEyXQWG!xUr$=gqy8zd!EE{#J*p4a>pkj+rDdz9a+6wlQ2znRY2?#$wm^hwpf)y9JP zx68~*=PF2=Q7#~^3ka?FtSHc@ZfeU}pc~H%CJA9Pm0)se(~%1T4fQ^{R_P3DfFNZe zJooUtKH)XI;3!=Sb^=&*-?J_O1BFzEDU+_vr4uM?7D4R5Y#7zbHC#B)j$4v+);ZdV zZ9Z|p&KFk0$L^EY^@MNQy$(t6Ap25f{Qq)=@e!bjv3ckPLRNrNzPA`V3g@- zy2DwZCiXbzlTL@`l7m8pj0b&a&VAFivKcy+${4e_vmVA$rx845I|IgmH zw>Oa-d!N7kDF%62Nm!OIz-A*X8!t8+pRk62NpfCW(KD9Dpdd?*Mgn_nozMPuUAnuv zr)MM?LpbNKPl7cweede(>guXrxebu5o5vCKI^UnPDuh#WPAadh#pPDrj5>LFl`c!Q zsB~3oPOEcc`jKu5+2US|uS2T|Jt2lG}&+c`|yJROB)cDXZ>M@LE>97);^{LmpX!A;!X* zjCvt`$D)?V`rvjkOu=#zVs4IlAB`hK}e*C3^%j89}Hkm$NxbIPSq~ zOfOAi`I_ELOZpf`&&TVv$0#(GFrxh22*3zkO#k+%maDZM%7lvu-% zvs})kv0ZkWq*v`ctJQHo;KtMbpk0aAx=@Jn^(*-en=!OW+z;WC~u|)&dJ_ zw+b1*7V>JhCSy8-xwdoI#pm4X3VQagdqON8NlUSG0CSpV`+7PYzZaH`PODecNUyk7 zemUKCO9@*)IL-c@T#3hvw7y1O&-gUXY*20$ksubwP>NTLdc72|1v=&$TV_3f&Z3N( z{~fLUgVL-8t23)m6=s`cSM8h^>Au5F#m_fhV9Jnk;=oi zXXhE)Gwzld=8PXeP0vR>zQf6w)8fV*gk)pR3G=7Q_%wXhY&qmVW4@A&+fCM}aI&;y zrsu(74{6h0NK)8=(sMK$Gkw+e|49!$_JmkGdHG{?^9{R4C zmE`3<+i}L{`B#Tn7gW+WG0uxoH7c&>8cCTltJZT9 zJ5s3dlHxL*&&4d-arvKd-|ZX1q6V0e?|d+sTy>dzL! zG0I0Os^>VkX3i$2(OD+YF-@7H5r`lGKP=AFLSz;7y3Nu?37}Q+=O+B@+P6tQy$Omc znx1m6TjpWEh!StuEsU>hGBrzxpLC-E?>3!xT`yf&{uX16W+47tAl0ng=_F`Zd~?Xe zI{bdl9=IBa>vu7F^Nds~hpMK>rN#jnd;w1_uX)A{777?^Q~F}hx;e+A7Hxd)kT~7% z_r(xse`SNn&wF)YCvlCB5wP9uA!joDLc&|UA0>$cab`3S;5SX^W8w;ensMtP+f;wo z))rriLBavnUQ};nk6TU6i<^oQ17*>RA8GVpmv3D4l72UBcrL?OK9&nXOHk2SK?Dqg z6)w&62z=4G%+sdc-We~t=LR+QLgoeYG@XN?RO(N$Z#6!`>R#PyM}z&nVu3Hdi4DxV zA4qGrV2l6*v(TQjeTpsu9r)W(yU})cYpr|xtq6y7L3WW9n^beM@4DW*oQucIj)M>h zv$vYeSSFWoXN;^S9tQ_Dum6Zn{sjghyx|f8ME<)I6XiMlUOc+5T2yY2kS)>szzQR6$XllW2z+kc!bADpL&B(C>zhi!XCp`S$#8bZ# zC&lQ5{J$hg05obg=SC!$+A9mE<fkJD^s)^;1ZL;xYu{Ca0Dns9$b*?T|38Y`oNdDGdc$Z=D%@P*=XJA3eD_k(afIaWy{WP zaG>NQ`cXu3XE_sY?%w>uh#GL;hHiRlAbj}d@Ek_nA$lS!)PP#p^bBf<#z!ly2V@XaLf+& zjEIGWm%09S_yzHbey$gC$mGszQ*L8a19H5-a}Dt>wn1v9GL$feZqpE!XxQ)G1BuWQ z*Vfua*02u6X#%IjnG|SnUMdHG($-mMMaL&6I|5Gc10xW2QL%DWlIF=%qNV0ewB(G2 z+fs`L6bE9Wn&=$%t~ui)kR})L2z=}z6e0yA84L%j4oZFvZCN0Altv-i2bnM(>e!($ zE~*5&*XTJO3n5Y=6F|?2pF4x+MuTs}4Ii^>y(%*KNKNIqm^uzY)@hyNq7DF{77z}* z2EtmdZ#wze)oDFF0Fg|WUa?}d*$YM=>(pPi)l<*nK&MyqY*{^@KM)L5F?R?ug85j0 z6&Y^J2K>r#n!obW*Fz|mzX(W}m;6rnK;96z*zi_!GS}KSG%thF2Zz)JpumisU zNrYNKi%RBna!iG^B%+;_q)bgr@IiYg7Y?s!aarpa<^DRlfnmC#)o+9?l!T@kQ*^V^ z=GciSg=dQA1ll6>3m0nmSoMZBNBFL7jk%)e= zmI8F{_d~_o3?A)dgy<%0xJuyQ0`CA#HHM#Rh8`9F7NJbAx;Q7SiQCVNwGwx#UIa(O zFkH6Knq=?fk#EA?Eg~ESPbxguXikX-44qoN5E=5D8aplRjcNCxXqN?BwhnCW)Tv%% z>-4Q;6$`HAQC!f3)U6e$I&y0D1ZHQyYm%xn5?*G=LG!?LxsoH)SprrqMP#TyN26cQB_sNT$kKrkGHt~njra6e%+n8W_$cO!EY__$%~vH^HJ zTarA!C(zO}Va#W-4q`=yVPsjT!#+9agLRPmT-F)8tkYV12SQ{m1~#_lql^Vlwq}+* z8}ZnQLW}WdODctf8xR~)Z#<1S7++i{dU8d0>RlTG*R^eyMY;)$SMb8QJL{rDI-SLC z>X^IWtOt&It-B~i6y(54n$60+Lc}$bwU3emDYsV)|K}W*3pdvVgz3*2X|Z^MSkJ|S zru`&aU#@7k2FK9f-rmiGe)0|wWnZ&;tm&Dw7pVndtb&&bEc4|L& zLZ8<K9ff;_bMQ{rPx1+=dICtvx z=ciQ5x7}6@4$Er4Px=rvgI2a)@QNe!Q4Fa&AP2hWz=wINfXvlA+0iLLNuVE-QJU2M zIqVH8YK}^otI1p5aO`?9&%gE!2gmh=RZkM3{bEc=@hd)A<2jo`vB6*hd5+8VDhdWG za^eWH=MZN=y@T=o89?Odd5^=}blVP06;)+w{{+1mu@wANc5$FH!a!xcPG?F8eo(b8 zY1p(IaVJkW*H{XVulRTom6osZ?X(dsUqjkyRG}ZFqMKGNd(d=QY@JbBZ{Thbc|j>e zL8Xlb?UGX3kl!~OC{q*_@vuRv#=IgPHIQW%74f*C#__P%$7t-;(i|EgVf39#Eu6{5 z%C=@1ZWQDh{x*yF*{D4U$pk8BmayuQp`_{zQbN)wL)Nm{ZMY0C4LkFthX27|xlE)S}L zWdcYmLY{b+o-@|M9Oze!@=+S3>!pkhllit$@)u6*B|f!@H#3P(y~G_Sfi#f1E0d`3 zI*v7)H@?>f>`V2rOsy(otICcrFHHN93-C>bOdn1?7+xghY5_M8P9WA*M&O)$buuXl zvS`H3a;%005Chde#KNlP$)pa_aY;{zZmEB& zwk{IhvUh-uB%Yl;cmP2_zP}4hJpk4os)O}-xDz!#Bv)BDBav8r7sx11Nri|=q6p-F zvkEb?ux!4En8uhcR%iy3#i#s2<>#!}W(Gu$p?R~CGlrg2 znDGv=1Leld^oJz3n{ko+F=NPP*Un=%XYG`F{;}0c?p&`$sqRDq}w5FvqyWjv7-jHz#_C+DZhNOXR4)grM#0z7GpJ)reO7J}T*AGrm)4~y^k*zJF- z79G1I&}!umL0m0bOR1$tTtDy>L{Ez76FT<5G)C7FswsELSeqs^g>Z}Cg+a`g4>nSP zVyQq--<#6mSTY$ojMou#U@v@Ac4NX9xhk>_0k5AAVU`Cw^Yo(L_^=V<6d8hQZu#lcdwZ5 zbmMXC#sQzs3$h2opSkd zglo=t``7W*HYQ`R_-un)vf^mu0?W>;h6U1`O;t0KSzLggAPUoH(gEC8m!`yr&!DRVTgsQCt(~!w>XPxg+E0f&;cpudS$pS8P+3n< znH)@!AjpKWq}J19(z}UzVNw&rSqlttE2k`v&V1$cQ z=xK%yY-{Hs0PfGLHqvM~8GCv$ zf@17UMyWc@_0`D)T4sDN^i?ojuZuWM{0fwAtgiX=zNgM0>Ez;KI8qZ;-rC}$Tlq<( z9Z^1^wT{*sJNFu&da7P^-~%1q*wze+`GKr?cc9HC>Jc1FS2t>4`$Oq~{B%K+H0eIE zXM~zlEhVSudO8C(axlTOt0H#NMAHD7MZjsja^QS|roBDF0gvKybwU}d2JVqs990gh zIxP8k6mv*E(J!!NGVjq94)oH5G1KM1yxWMDG}fWYc?$eCU8wWZ_-gfH)Weqb2IMvu zN1x&=>mWyP%fedO;KasfXVTyWy~^W}I%SOk(2LoC6E#;&Q__APcRq;z9KmS9JK%u{ zP((~as+xK>Br1s3wgLSamB`UJeuu-P8V2#!#8JNAJMZyasoD=zuSSDp9PM9T^i@G4 zZ2SKgIUvDC;a0m`PZa3O4`QW zv1AHN*KD4WlPS|O#e+>!vWBI0m@$cDpjppVB3RxlTpx3kB}{U?as#C@339QS;%s4N z5H$V3yw&t#u6ni=Y88Ks$Ch?7_IlQDSUc{4!ITqUQxU~*Ai}_63ePZ5Eje63P5HHM zx2l`Ljp+Zt>{Y%^6LPG9TR-0IWm;v5n@ZzqZb!YJ4Bn03D`InKtqYf~Itks`l2w_U zH#G`s?nrImthyB$46{}0IeDPC(|yqtpLh`Zwbc&(KTIv@)q9MYZYM@c%4l@t_@S(;JFN4PC4@o46r6A>n9M}3RH zqE~IT&C*7Fy@bsN7`SHX?a}kqpG$ZaB;>2%@B@SbO!OOm7r{pJZaBJXmOAQDxER2Ze+EFn6#Y-FmQ<0H_A1S-ObTW^$_Jg5u$Sq3TE1ZMCr$jQswn_aQn` zBotrWvPTb9j~>tH5j{EU+%k;$&hE<=GeDf*1wy2g08i7)Tdr7Oi|*=FuW zymenfPwJQ%`)UVFM)7GsDMC#9R3W*?4<41ar4v9#g@Qi#rltBgtgmr(gheb_d#qA? zGveT?(Y<#A+z43g5~Bs&dm;C!klsX;U&H09LUNt^PF#O)Eg+_9+6hu zSe;J=XqSCI11HTU45FjqXB)zx#|LD*d)IEg{#5EII}&;m!ihk98+xCGBhrAr(JF{$2E#~a{WfpwPSzk)XhK^E{ z@sV5Jqnz@T6j5d=qHLsyoYIdU=Qzb28Gmxt0TX4gVXu;q^yJqB7#4ieFkKk~3ulax zROw&tgb-}X$slhqqz|`$77&-x&Ugo75CusyHxQA}7c_z5dX7H!Vp5eF?525%G)#DR zKx<_yiIrQy~EcR#Hw6xO)pjVJDd@xIGy_$d4& zvG0oZnyng}$?ayeQ8ML3TS7TV>e#3cu=^--vmqb5yV!J&zS4?)28_+qR7U<4rj{dO zp+t`&tc@U@cIbkuA<*mLy(OCtNRk}q+(pWO_^`NM)Yc!C_S4=-@JT_Ku zysSFKA8ogmqY#R(jMV2Awf3@gf?34q(#X1Cx5>o9kWXl}q+5eVnAz7sX_%4Q zAQUOPOyq+xv1U@s@1&H}o^BfP4y-rvsJjwq!-~MxG{7{WbayZ5{o8~)$TpYVsZ)je z=7r{P0-#p_RuEP_P1$89!HCmUdqfEiYe2SZxDD963wF0DdMv?uMt*lctG1b>=>|G= zoJGQ;*mIj^)75h> z98w83pEPdAjt_m$!pggNeP&lwL>Bpg^RCA!<(7zjeufOv3TK)}(}G@jw{T_zx0q34 zQ1TG5IpfDTuX3tfmXR{N7?=TDti>X41j`Gl6NO8nC%5FCZ#@^9YYL43OIu~uvz|@OX}Ev$xaBMwZhi4E>x+d~H{L!*x_lD!>9M}KzEYJ_)Nc=& zWC3xDBCmh>Wkuwhvv-qtzj-V5h_kjftG6%0w(a5kZ3BsIcC#L@7a?*KL}$;LOg|j^ zH_8>i^lW2;zRekzO$&oE`L6S74npQuXPOKty zhU1~P1I?q}Fq>$w1V{Q!`dX^yL@n`2dn;m{w{l7C_rt;Jcn|9L?IcU;@#52koxs^A z!rQP?eH&22j)tJ9zwTB-L(!EelO8SLFog&X>{D7&aQBK5^=%e4X7iSfxr3_L^A>b|%JNii#86oLo^QRPy6c$>{e`eAOpYivgMQ zs!rzCW8>z&Zm5B3Zi|7M4IFfr6bu7ErT*`y;;%)@i_!B8wd*|9%t_o)2!nbSjo$&G z&r9vugIy;0hNXA(QOQw~6)XUT8Pw3<=&a|{aJaOuBdN_Gqhx))%c6~(WCT`{tk)z} zXPWC%XtI%mTQa-pkNw1jWa+EtKZhi5PmYYBP{n31(kEd(2~9p9G7)KP=5p>ibx3W^*ILIsKypkp*Tij5!$bVB7ODSj z{6YO`&9f%lo|zWeC1AsX6)yulbNLG(w^NmjdLrDnOs@z=hsp?$E`I{+@i|o_OwjhK z%$A^b86@*cQjJ_f_qWe!ruw-qYyaude@(lbh`6}{2cKs_rWRZQ7@8|f{fiO5Twugf zwMPn;%%uo_QI^wIBk}}@#=UcY!AUOyC{YQ@Y3gX!(bPLp@gzg$(hMT zm_kxB+y*&}n3c}vLjy#~QGNMZ42uXF^@G$TW6pBp#8Wx;ZqF%kwHCNl$3-TivG@wT z`QojB5$>if=6JIfJrs`*Ytf?s>nyO_&q@~PQw=LoBZlgMLzZd+-Ucs*yb&yvD89YX z%^SY(RT|*4{LdFwQo>z*nX3RxW+wR#iTr0sJOuGCBshnvK@&Ie;EGKt++4>Xn& zP&A+{brdU|^yBex)R<@d)@j_v!*SdX4jX;}V;(6P$zfof&74hcqO~Z@0Ti+YkkG1MsBw*|;d5FZrjYrq zGmf2FeXvNp^fZYF0OFS@k#smlJipOIEz^EKHqXQ66e8W9JXWk=q>RXT^Y~E z6%e3|i8pys1+ZUAfoTzCC6)mf*HQJ^Am0KXGT>G;c(x9V-m5XWyE@;Dn*hD$4+;u%cv4RNnwWqMR*9uUzykg0zc_ zNzcC~;9pPIJNUcH_o}JsoAqy#Zf)%R27it>>h;ylmiBuCbbPg2?3B@*RlF$q)K(T{ zePIl(-J_$|2fw^M+W#CBtuKe6g(Rs4yEia0HSRPbbSp5FfwZ4CkXu;N@B-8yh@cDy z3?7+(3?8Bo{wuOBM$t0A~;|VpUQt zUS)N);HL_UfK?4Y4P-PD^1x8bd)V!r^@48pb6pZbk!c|4OsX%NyrgyNR=cN-(CZ?^ zfc+M9w9tV72yslE5D6j=XN+bkFpTGl#f_3PP<0J`!-W-N*u-0kuwO9WC|FqNi-Rn< zQqM=2aWB4}W-dtQ*wc@l;J?_nHpd7o1|V@mTH1&fhKO7zYbP{@AM8RBBbBRB8dzr) zO$Gx%nuK1<@EMrcD7o;|F&I-U2R(?lj&9jd1lcUTACE5@YinSVz^_l^k$DYQ!YcD-m@)p|HOtrvyFjXWX~ zurPq(Mu;GT0Z3#-z&Yh-M`X53j@mt2cFr&&?lHtlR1760*l2MXV@LY`;zDp_a=RL$ z+pPz^CwaRIPOFGRBFe1ELTjSbmbZHm-b@fNLt1a!v)05l& z>T*`0oPr>Z-&gG&tXlGv3C)~$ITlE=@cJ!rYa!ChhJdF#E^*W0!>03rUv8B`>+!P} zTpr7^D~gzw*Ly3cw-#C`fdhbh66TA$8Asu~ZOxpHCF)1lu?$5Hn|L%-qs)cY8hzPuR7vcnNmOuD=h$teTc zq0-TSq-wiNFe-SSvJ&Zh-U1ZZTLzRZ~RU5$?qB<^tr|l@boF z?9B61S5F+Z^88=Tq|c@3)ghVHHfO_`J8)zx_?~gC2CJx`HTYwQ?#|aGY%*x~?9g^+ zKsG-nBM1?stw0S%6*WhyhrjQTUw(%?HoF>-1QeCg({j4g_;;J`p-%U(R7f~PH0+L^ zdSp^G*MUl>U=cH~le#hq-f%j(+=k$eZ?cA& zxc+=h#Sr&4d^cPYv-o?Q$QKFJ5gla{;IEzG;H=;4ARirQ0V(xV6Q&3#vV=^qghUdk zkw1$mg+!)k)o?pj`lSq>mV9y&+rjfwa)(9YrkmT9Xb=|o6@+Ts*HDZ|AWI>`fRd3F z%>cpWEd;Ry4|T(OPD;zywuRG^QX?v@giCxyBLq3TQB&DeNA(BOe0U9GoLAt5El^I8 zEzKDW^}1A@LzY95jU>tX%>~A&U)7chtScPCQU5hrLSeLx!pva1j*V1(R0AroA$GMaU|iG zB$8%HNGF#~^epD5t7d8ZDM?Dv@6FP?{%~|rTDxU@VHPSxr_IQ+QP?GDa;`F(9Gy%X z2c^<2Do0I&PgYl>@@#F{@ir2?ePa(nW$bu4BrD%`rk+>xKrj=4T;RM|RH ztiRB>ea^@U0(R8P6faJVS!$HizH5t4U@!XfFsclST$ElU9kkBNIh6(R{n2K5DiVIY2R%Zx!eoxGa~)c^Y`Y%SF;`A$S|}G>dFn z*zGtP4=+~x$;YH0*{JIgq)tYTw#&9)fukP4H@W*(958Ux=!&Lcf*a`AExuY=>#N

    |*??^w(63LtmYyld-IVBN|THBcdJ=vvY!;Q=3{8I#l-3jgw4!`|Kr z>~NF-HG{m|6A3<~j2mKeREeLlAm7lGQZ&SFbgOV#F&wj$6t0_247-fNL=iI}I}-sE}RHNbM-wCgGO2uQ__lMbQLzFe%8B9r#omnKv zXgw{3fA+}JQ%F}CY+vm{B~~!dDF5|z7!Ut_G5ycIgn*kC|82$7|13X$^87*n^9|^K zX431BFd7h-*-N%N;d{hsya{4*SWSDHo@AQaJn)~dxBi8Ea$iB;W?%nLpD(XE@!y`V zEIoNx|KGs+4=8{!r!OyB41A+FR=z&CKuM3;#=AEke%;*JU*F$;x1*v(@-iEo^3YhO zCrkun2(eAk8p$;>D(gQsclS612v@#bU5c!4n>%mbZEWxS3?D!2Z!P{{f8N_)-`QAy z`)&tfk4J-qzVf%b`+x;$R(zF(ZT= zvx@i)fyC!RfiDHjhSO09UQQ4w0<&%qeygNT3bw86er@5vzde%A=KUr=wu#oYKr3d( z$;EDH5JU}7uZga7>uq%go+Q zLDNG|pFoU8Tq=j_V~Mz$Fe`qvnLtF$nG^ZV2n|jNcItJN$YdLn@ll@3c*J*P&J!Wm z-5_B)i@VH+)gEAyO-h|>#%|O(hj`gC6!Qw(a=QVmeC~G zaA?vkY0_iEBu^h@ArUae=rkMi2sv|&Oj#kh>mxs5vZ+u}B{>^yr-CE55Yn2@pQ%jJ z@3uHL4UwiEn5&U@S-yh&106H(0{>~7{9q3SFlW;V@--_`kHvRvK>XiqAO?HaJOlxB z6D;el`geo=B_!>nBo@3Mm&pXoN(RZ8owo;+G}BqxBIhN*<3#^LWxR#8L>Z%0D$g!E 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 diff --git a/example/vendor/bundle/ruby/2.7.0/cache/ruby-macho-2.5.1.gem b/example/vendor/bundle/ruby/2.7.0/cache/ruby-macho-2.5.1.gem deleted file mode 100644 index 4b0322bd4d2dc4392bfcbb8892bcc7c8302804f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34304 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 G0{;gHG1U(M diff --git a/example/vendor/bundle/ruby/2.7.0/cache/typhoeus-1.4.0.gem b/example/vendor/bundle/ruby/2.7.0/cache/typhoeus-1.4.0.gem deleted file mode 100644 index b71baf3b189c2e96529076f7744245bb11d198cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56832 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 diff --git a/example/vendor/bundle/ruby/2.7.0/extensions/arm64-darwin-22/2.7.0/ffi-1.15.5/ffi_c.bundle b/example/vendor/bundle/ruby/2.7.0/extensions/arm64-darwin-22/2.7.0/ffi-1.15.5/ffi_c.bundle deleted file mode 100755 index 8587e28111f51dfbd2a4de2a46c76eb4fdcfff76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211065 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
    >Am=kUzEZ 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 /dev/null; \ - fi - @if [ ! -f ${LIBFFI_BUILD_DIR}/Makefile ]; then \ - echo "Configuring libffi"; \ - cd ${LIBFFI_BUILD_DIR} && \ - /usr/bin/env CC="${CC}" LD="${LD}" CFLAGS="${LIBFFI_CFLAGS}" GREP_OPTIONS="" \ - /bin/sh ${LIBFFI_CONFIGURE} ${LIBFFI_HOST} > /dev/null; \ - fi - @cd ${LIBFFI_BUILD_DIR} && ${MAKE} - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi.darwin.mk b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi.darwin.mk deleted file mode 100644 index 893a8e1..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi.darwin.mk +++ /dev/null @@ -1,105 +0,0 @@ -# -*- makefile -*- - -include ${srcdir}/libffi.gnu.mk - -CCACHE := $(shell type -p ccache) -BUILD_DIR := $(shell pwd) - -INCFLAGS += -I"$(BUILD_DIR)" - -# Work out which arches we need to compile the lib for -ARCHES := -ARCHFLAGS ?= $(filter -arch %, $(CFLAGS)) - -ifneq ($(findstring -arch ppc,$(ARCHFLAGS)),) - ARCHES += ppc -endif - -ifneq ($(findstring -arch i386,$(ARCHFLAGS)),) - ARCHES += i386 -endif - -ifneq ($(findstring -arch x86_64,$(ARCHFLAGS)),) - ARCHES += x86_64 -endif - -ifeq ($(strip $(ARCHES)),) -LIBFFI_BUILD_DIR = $(BUILD_DIR)/libffi-$(arch) -# Just build the one (default) architecture -$(LIBFFI): - @mkdir -p "$(LIBFFI_BUILD_DIR)" "$(@D)" - @if [ ! -f "$(LIBFFI_SRC_DIR)"/configure ]; then \ - echo "Running autoreconf for libffi"; \ - cd "$(LIBFFI_SRC_DIR)" && \ - /bin/sh $(LIBFFI_AUTOGEN) > /dev/null; \ - fi - @if [ ! -f "$(LIBFFI_BUILD_DIR)"/Makefile ]; then \ - echo "Configuring libffi"; \ - cd "$(LIBFFI_BUILD_DIR)" && \ - /usr/bin/env CC="$(CC)" LD="$(LD)" CFLAGS="$(LIBFFI_CFLAGS)" GREP_OPTIONS="" \ - /bin/sh $(LIBFFI_CONFIGURE) $(LIBFFI_HOST) > /dev/null; \ - fi - cd "$(LIBFFI_BUILD_DIR)" && $(MAKE) - -else -LIBTARGETS = $(foreach arch,$(ARCHES),"$(BUILD_DIR)"/libffi-$(arch)/.libs/libffi_convenience.a) - -# Build a fat binary and assemble -build_ffi = \ - mkdir -p "$(BUILD_DIR)"/libffi-$(1); \ - (if [ ! -f "$(LIBFFI_SRC_DIR)"/configure ]; then \ - echo "Running autoreconf for libffi"; \ - cd "$(LIBFFI_SRC_DIR)" && \ - /bin/sh $(LIBFFI_AUTOGEN) > /dev/null; \ - fi); \ - (if [ ! -f "$(BUILD_DIR)"/libffi-$(1)/Makefile ]; then \ - echo "Configuring libffi for $(1)"; \ - cd "$(BUILD_DIR)"/libffi-$(1) && \ - env CC="$(CCACHE) $(CC)" CFLAGS="-arch $(1) $(LIBFFI_CFLAGS)" LDFLAGS="-arch $(1)" \ - $(LIBFFI_CONFIGURE) --host=$(1)-apple-darwin > /dev/null; \ - fi); \ - $(MAKE) -C "$(BUILD_DIR)"/libffi-$(1) - -target_ffi = "$(BUILD_DIR)"/libffi-$(1)/.libs/libffi_convenience.a:; $(call build_ffi,$(1)) - -# Work out which arches we need to compile the lib for -ifneq ($(findstring ppc,$(ARCHES)),) - $(call target_ffi,ppc) -endif - -ifneq ($(findstring i386,$(ARCHES)),) - $(call target_ffi,i386) -endif - -ifneq ($(findstring x86_64,$(ARCHES)),) - $(call target_ffi,x86_64) -endif - - -$(LIBFFI): $(LIBTARGETS) - # Assemble into a FAT (x86_64, i386, ppc) library - @mkdir -p "$(@D)" - /usr/bin/libtool -static -o $@ \ - $(foreach arch, $(ARCHES),"$(BUILD_DIR)"/libffi-$(arch)/.libs/libffi_convenience.a) - @mkdir -p "$(LIBFFI_BUILD_DIR)"/include - $(RM) "$(LIBFFI_BUILD_DIR)"/include/ffi.h - @( \ - printf "#if defined(__i386__)\n"; \ - printf "#include \"libffi-i386/include/ffi.h\"\n"; \ - printf "#elif defined(__x86_64__)\n"; \ - printf "#include \"libffi-x86_64/include/ffi.h\"\n";\ - printf "#elif defined(__ppc__)\n"; \ - printf "#include \"libffi-ppc/include/ffi.h\"\n";\ - printf "#endif\n";\ - ) > "$(LIBFFI_BUILD_DIR)"/include/ffi.h - @( \ - printf "#if defined(__i386__)\n"; \ - printf "#include \"libffi-i386/include/ffitarget.h\"\n"; \ - printf "#elif defined(__x86_64__)\n"; \ - printf "#include \"libffi-x86_64/include/ffitarget.h\"\n";\ - printf "#elif defined(__ppc__)\n"; \ - printf "#include \"libffi-ppc/include/ffitarget.h\"\n";\ - printf "#endif\n";\ - ) > "$(LIBFFI_BUILD_DIR)"/include/ffitarget.h - -endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi.gnu.mk b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi.gnu.mk deleted file mode 100644 index 473b8fb..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi.gnu.mk +++ /dev/null @@ -1,32 +0,0 @@ -# -*- makefile -*- -# -# Common definitions for all systems that use GNU make -# - - -# Tack the extra deps onto the autogenerated variables -LOCAL_LIBS += $(LIBFFI) -BUILD_DIR = $(shell pwd) -LIBFFI_CFLAGS = $(FFI_MMAP_EXEC) -LIBFFI_BUILD_DIR = $(BUILD_DIR)/libffi-$(arch) -INCFLAGS := -I"$(LIBFFI_BUILD_DIR)"/include $(INCFLAGS) - -ifeq ($(srcdir),.) - LIBFFI_SRC_DIR := $(shell pwd)/libffi -else ifeq ($(srcdir),..) - LIBFFI_SRC_DIR := $(shell pwd)/../libffi -else - LIBFFI_SRC_DIR := $(realpath $(srcdir)/libffi) -endif - -LIBFFI = "$(LIBFFI_BUILD_DIR)"/.libs/libffi_convenience.a -LIBFFI_AUTOGEN = ${LIBFFI_SRC_DIR}/autogen.sh -LIBFFI_CONFIGURE = "$(LIBFFI_SRC_DIR)"/configure --disable-static \ - --with-pic=yes --disable-dependency-tracking --disable-docs - -$(OBJS): $(LIBFFI) - -# -# libffi.mk or libffi.darwin.mk contains rules for building the actual library -# - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi.mk b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi.mk deleted file mode 100644 index 3b58227..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi.mk +++ /dev/null @@ -1,18 +0,0 @@ -# -*- makefile -*- - -include ${srcdir}/libffi.gnu.mk - -$(LIBFFI): - @mkdir -p "$(LIBFFI_BUILD_DIR)" "$@(D)" - @if [ ! -f "$(LIBFFI_SRC_DIR)"/configure ]; then \ - echo "Running autoreconf for libffi"; \ - cd "$(LIBFFI_SRC_DIR)" && \ - /bin/sh $(LIBFFI_AUTOGEN) > /dev/null; \ - fi - @if [ ! -f "$(LIBFFI_BUILD_DIR)"/Makefile ]; then \ - echo "Configuring libffi"; \ - cd "$(LIBFFI_BUILD_DIR)" && \ - env CFLAGS="$(LIBFFI_CFLAGS)" GREP_OPTIONS="" \ - sh $(LIBFFI_CONFIGURE) $(LIBFFI_HOST) > /dev/null; \ - fi - $(MAKE) -C "$(LIBFFI_BUILD_DIR)" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi.vc.mk b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi.vc.mk deleted file mode 100644 index 8cd4603..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi.vc.mk +++ /dev/null @@ -1,26 +0,0 @@ -# -*- makefile -*- -# -# Makefile for msvc -# - -# Tack the extra deps onto the autogenerated variables -INCFLAGS = -I$(LIBFFI_BUILD_DIR)/include -I$(LIBFFI_BUILD_DIR)/src/x86 $(INCFLAGS) -LOCAL_LIBS = $(LOCAL_LIBS) $(LIBFFI) -BUILD_DIR = $(MAKEDIR) -LIBFFI_BUILD_DIR = $(BUILD_DIR)/libffi - -!IF "$(srcdir)" == "." -LIBFFI_SRC_DIR = $(MAKEDIR)/libffi -!ELSE -LIBFFI_SRC_DIR = $(srcdir)/libffi -!ENDIF - -LIBFFI = $(LIBFFI_BUILD_DIR)/.libs/libffi_convenience.lib - -$(OBJS): $(LIBFFI) - -$(LIBFFI): - @$(MAKEDIRS) $(LIBFFI_BUILD_DIR) - @cd $(LIBFFI_BUILD_DIR) && $(MAKE) -f Makefile.vc - - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi.vc64.mk b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi.vc64.mk deleted file mode 100644 index 6f3dbbc..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi.vc64.mk +++ /dev/null @@ -1,26 +0,0 @@ -# -*- makefile -*- -# -# Makefile for msvc -# - -# Tack the extra deps onto the autogenerated variables -INCFLAGS = -I$(LIBFFI_BUILD_DIR)/include -I$(LIBFFI_BUILD_DIR)/src/x86 $(INCFLAGS) -LOCAL_LIBS = $(LOCAL_LIBS) $(LIBFFI) -BUILD_DIR = $(MAKEDIR) -LIBFFI_BUILD_DIR = $(BUILD_DIR)/libffi - -!IF "$(srcdir)" == "." -LIBFFI_SRC_DIR = $(MAKEDIR)/libffi -!ELSE -LIBFFI_SRC_DIR = $(srcdir)/libffi -!ENDIF - -LIBFFI = $(LIBFFI_BUILD_DIR)/.libs/libffi_convenience.lib - -$(OBJS): $(LIBFFI) - -$(LIBFFI): - @$(MAKEDIRS) $(LIBFFI_BUILD_DIR) - @cd $(LIBFFI_BUILD_DIR) && $(MAKE) -f Makefile.vc64 - - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.appveyor.yml b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.appveyor.yml deleted file mode 100644 index ece8a94..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.appveyor.yml +++ /dev/null @@ -1,66 +0,0 @@ -shallow_clone: true - -# We're currently only testing libffi built with Microsoft's -# tools. -# This matrix should be expanded to include at least: -# 32- and 64-bit gcc/cygwin -# 32- and 64-bit gcc/mingw -# 32- and 64-bit clang/mingw -# and perhaps more. - -image: Visual Studio 2017 -platform: - - x64 - - x86 - - arm - - arm64 - -environment: - global: - CYG_ROOT: C:/cygwin - CYG_CACHE: C:/cygwin/var/cache/setup - CYG_MIRROR: http://mirrors.kernel.org/sourceware/cygwin/ - matrix: - - VSVER: 15 - -install: - - ps: >- - If ($env:Platform -Match "x86") { - $env:VCVARS_PLATFORM="x86" - $env:BUILD="i686-pc-cygwin" - $env:HOST="i686-pc-cygwin" - $env:MSVCC="/cygdrive/c/projects/libffi/msvcc.sh" - $env:SRC_ARCHITECTURE="x86" - } ElseIf ($env:Platform -Match "arm64") { - $env:VCVARS_PLATFORM="x86_arm64" - $env:BUILD="i686-pc-cygwin" - $env:HOST="aarch64-w64-cygwin" - $env:MSVCC="/cygdrive/c/projects/libffi/msvcc.sh -marm64" - $env:SRC_ARCHITECTURE="aarch64" - } ElseIf ($env:Platform -Match "arm") { - $env:VCVARS_PLATFORM="x86_arm" - $env:BUILD="i686-pc-cygwin" - $env:HOST="arm-w32-cygwin" - $env:MSVCC="/cygdrive/c/projects/libffi/msvcc.sh -marm" - $env:SRC_ARCHITECTURE="arm" - } Else { - $env:VCVARS_PLATFORM="amd64" - $env:BUILD="x86_64-w64-cygwin" - $env:HOST="x86_64-w64-cygwin" - $env:MSVCC="/cygdrive/c/projects/libffi/msvcc.sh -m64" - $env:SRC_ARCHITECTURE="x86" - } - - 'appveyor DownloadFile https://cygwin.com/setup-x86.exe -FileName setup.exe' - - 'setup.exe -qnNdO -R "%CYG_ROOT%" -s "%CYG_MIRROR%" -l "%CYG_CACHE%" -P dejagnu >NUL' - - '%CYG_ROOT%/bin/bash -lc "cygcheck -dc cygwin"' - - echo call VsDevCmd to set VS150COMNTOOLS - - call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools\VsDevCmd.bat" - - ps: $env:VSCOMNTOOLS=(Get-Content ("env:VS" + "$env:VSVER" + "0COMNTOOLS")) - - echo "Using Visual Studio %VSVER%.0 at %VSCOMNTOOLS%" - - call "%VSCOMNTOOLS%..\..\vc\Auxiliary\Build\vcvarsall.bat" %VCVARS_PLATFORM% - -build_script: - - c:\cygwin\bin\sh -lc "(cd $OLDPWD; ./autogen.sh;)" - - c:\cygwin\bin\sh -lc "(cd $OLDPWD; ./configure CC='%MSVCC%' CXX='%MSVCC%' LD='link' CPP='cl -nologo -EP' CXXCPP='cl -nologo -EP' CPPFLAGS='-DFFI_BUILDING_DLL' AR='/cygdrive/c/projects/libffi/.travis/ar-lib lib' NM='dumpbin -symbols' STRIP=':' --build=$BUILD --host=$HOST;)" - - c:\cygwin\bin\sh -lc "(cd $OLDPWD; cp src/%SRC_ARCHITECTURE%/ffitarget.h include; make; find .;)" - - c:\cygwin\bin\sh -lc "(cd $OLDPWD; cp `find . -name 'libffi-?.dll'` $HOST/testsuite/; make check; cat `find ./ -name libffi.log`)" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.gitattributes b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.gitattributes deleted file mode 100644 index f7d3833..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.gitattributes +++ /dev/null @@ -1,4 +0,0 @@ -* text=auto - -*.sln text eol=crlf -*.vcxproj* text eol=crlf diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.github/issue_template.md b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.github/issue_template.md deleted file mode 100644 index e197e2c..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.github/issue_template.md +++ /dev/null @@ -1,10 +0,0 @@ -## System Details - - - - -## Problems Description - - - - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.gitignore b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.gitignore deleted file mode 100644 index 5d39689..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.gitignore +++ /dev/null @@ -1,38 +0,0 @@ -.libs -.deps -*.o -*.lo -.dirstamp -*.la -Makefile -!testsuite/libffi.bhaible/Makefile -Makefile.in -aclocal.m4 -compile -!.travis/compile -configure -depcomp -doc/libffi.info -*~ -fficonfig.h.in -fficonfig.h -include/ffi.h -include/ffitarget.h -install-sh -libffi.pc -libtool -libtool-ldflags -ltmain.sh -m4/libtool.m4 -m4/lt*.m4 -mdate-sh -missing -stamp-h1 -libffi*gz -autom4te.cache -libffi.xcodeproj/xcuserdata -libffi.xcodeproj/project.xcworkspace -build_*/ -darwin_*/ -src/arm/trampoline.S -**/texinfo.tex diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis.yml b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis.yml deleted file mode 100644 index 8db2ddf..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis.yml +++ /dev/null @@ -1,83 +0,0 @@ ---- -sudo: required - -language: cpp - -# For qemu-powered targets, get the list of supported processors from -# travis by setting QEMU_CPU=help, then set -mcpu= for the compilers -# accordingly. - -matrix: - include: - - os: linux - env: HOST=powerpc-eabisim RUNTESTFLAGS="--target_board powerpc-eabisim" DEJAGNU="/opt/.travis/site.exp" - - os: linux - env: HOST=or1k-elf RUNTESTFLAGS="--target_board or1k-sim" DEJAGNU="/opt/.travis/site.exp" - - os: linux - env: HOST=m32r-elf RUNTESTFLAGS="--target_board m32r-sim" DEJAGNU="/opt/.travis/site.exp" - - os: linux - env: HOST=bfin-elf RUNTESTFLAGS="--target_board bfin-sim" DEJAGNU="/opt/.travis/site.exp" -# This configuration is still using the native x86 toolchain? -# - os: osx -# env: HOST=aarch64-apple-darwin13 - - os: osx - env: HOST=x86_64-apple-darwin10 - - os: linux - env: HOST=x86_64-w64-mingw32 MEVAL='export CC="x86_64-w64-mingw32-gcc" && CXX="x86_64-w64-mingw32-g++" RUNTESTFLAGS="--target_board wine-sim" DEJAGNU="$TRAVIS_BUILD_DIR/.travis/site.exp" CONFIGURE_OPTIONS=--disable-shared LIBFFI_TEST_OPTIMIZATION="-O2" - - os: linux - env: HOST=sh4-linux-gnu CONFIGURE_OPTIONS=--disable-shared QEMU_LD_PREFIX=/usr/sh4-linux-gnu - - os: linux - env: HOST=alpha-linux-gnu CONFIGURE_OPTIONS=--disable-shared QEMU_LD_PREFIX=/usr/alpha-linux-gnu - - os: linux - env: HOST=m68k-linux-gnu MEVAL='export CC="m68k-linux-gnu-gcc-8 -mcpu=547x" && CXX="m68k-linux-gnu-g++-8 -mcpu=547x"' CONFIGURE_OPTIONS=--disable-shared QEMU_LD_PREFIX=/usr/m68k-linux-gnu QEMU_CPU=cfv4e - - os: linux - arch: s390x - env: HOST=s390x-linux-gnu - - os: linux - arch: ppc64le - env: HOST=ppc64le-linux-gnu - - os: linux - arch: arm64 - env: HOST=aarch64-linux-gnu - - os: linux - arch: arm64 - env: HOST=aarch64-linux-gnu - compiler: clang - - os: linux - env: HOST=arm32v7-linux-gnu LIBFFI_TEST_OPTIMIZATION="-O0" - - os: linux - env: HOST=arm32v7-linux-gnu LIBFFI_TEST_OPTIMIZATION="-O2" - - os: linux - env: HOST=arm32v7-linux-gnu LIBFFI_TEST_OPTIMIZATION="-O2 -fomit-frame-pointer" -# The sparc64 linux system in the GCC compile farm is non-responsive. -# - os: linux -# env: HOST=sparc64-linux-gnu -# The mips64 linux system in the GCC compile farm is not allowing logins -# - os: linux -# env: HOST=mips64el-linux-gnu - - os: linux - compiler: gcc - env: HOST=i386-pc-linux-gnu MEVAL='export CC="$CC -m32" && CXX="$CXX -m32"' - - os: linux - compiler: gcc - - os: linux - compiler: gcc - env: CONFIGURE_OPTIONS=--disable-shared - - os: linux - compiler: clang - - os: linux - compiler: clang - env: CONFIGURE_OPTIONS=--disable-shared - - os: linux - env: HOST=moxie-elf MEVAL='export PATH=/opt/moxielogic/bin:$PATH && CC=moxie-elf-gcc && CXX=moxie-elf-g++' LDFLAGS=-Tsim.ld RUNTESTFLAGS="--target_board moxie-sim" DEJAGNU="$TRAVIS_BUILD_DIR/.travis/site.exp" - -before_install: - - if test x"$MEVAL" != x; then eval ${MEVAL}; fi - -install: - - travis_wait 30 ./.travis/install.sh - -script: - - if ! test x"$MEVAL" = x; then eval ${MEVAL}; fi - - travis_wait 115 sleep infinity & - - ./.travis/build.sh diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis/ar-lib b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis/ar-lib deleted file mode 100755 index 0baa4f6..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis/ar-lib +++ /dev/null @@ -1,270 +0,0 @@ -#! /bin/sh -# Wrapper for Microsoft lib.exe - -me=ar-lib -scriptversion=2012-03-01.08; # UTC - -# Copyright (C) 2010-2018 Free Software Foundation, Inc. -# Written by Peter Rosin . -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# This file is maintained in Automake, please report -# bugs to or send patches to -# . - - -# func_error message -func_error () -{ - echo "$me: $1" 1>&2 - exit 1 -} - -file_conv= - -# func_file_conv build_file -# Convert a $build file to $host form and store it in $file -# Currently only supports Windows hosts. -func_file_conv () -{ - file=$1 - case $file in - / | /[!/]*) # absolute file, and not a UNC file - if test -z "$file_conv"; then - # lazily determine how to convert abs files - case `uname -s` in - MINGW*) - file_conv=mingw - ;; - CYGWIN*) - file_conv=cygwin - ;; - *) - file_conv=wine - ;; - esac - fi - case $file_conv in - mingw) - file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` - ;; - cygwin) - file=`cygpath -m "$file" || echo "$file"` - ;; - wine) - file=`winepath -w "$file" || echo "$file"` - ;; - esac - ;; - esac -} - -# func_at_file at_file operation archive -# Iterate over all members in AT_FILE performing OPERATION on ARCHIVE -# for each of them. -# When interpreting the content of the @FILE, do NOT use func_file_conv, -# since the user would need to supply preconverted file names to -# binutils ar, at least for MinGW. -func_at_file () -{ - operation=$2 - archive=$3 - at_file_contents=`cat "$1"` - eval set x "$at_file_contents" - shift - - for member - do - $AR -NOLOGO $operation:"$member" "$archive" || exit $? - done -} - -case $1 in - '') - func_error "no command. Try '$0 --help' for more information." - ;; - -h | --h*) - cat < libffi.log - - ./rlgl l --key=${RLGL_KEY} https://rl.gl - ID=$(./rlgl start) - ./rlgl e --id=$ID --policy=https://github.com/libffi/rlgl-policy.git libffi.log - exit $? -} - -function build_linux() -{ - ./autogen.sh - ./configure ${HOST+--host=$HOST} ${CONFIGURE_OPTIONS} || cat */config.log - make - make dist - make check RUNTESTFLAGS="-a $RUNTESTFLAGS" - - ./rlgl l --key=${RLGL_KEY} https://rl.gl - ID=$(./rlgl start) - ./rlgl e --id=$ID --policy=https://github.com/libffi/rlgl-policy.git */testsuite/libffi.log - exit $? -} - -function build_foreign_linux() -{ - ${DOCKER} run --rm -t -i -v $(pwd):/opt ${SET_QEMU_CPU} -e LIBFFI_TEST_OPTIMIZATION="${LIBFFI_TEST_OPTIMIZATION}" $2 bash -c /opt/.travis/build-in-container.sh - - ./rlgl l --key=${RLGL_KEY} https://rl.gl - ID=$(./rlgl start) - ./rlgl e --id=$ID --policy=https://github.com/libffi/rlgl-policy.git */testsuite/libffi.log - exit $? -} - -function build_cross_linux() -{ - ${DOCKER} run --rm -t -i -v $(pwd):/opt ${SET_QEMU_CPU} -e HOST="${HOST}" -e CC="${HOST}-gcc-8 ${GCC_OPTIONS}" -e CXX="${HOST}-g++-8 ${GCC_OPTIONS}" -e LIBFFI_TEST_OPTIMIZATION="${LIBFFI_TEST_OPTIMIZATION}" moxielogic/cross-ci-build-container:latest bash -c /opt/.travis/build-in-container.sh - - ./rlgl l --key=${RLGL_KEY} https://rl.gl - ID=$(./rlgl start) - ./rlgl e --id=$ID --policy=https://github.com/libffi/rlgl-policy.git */testsuite/libffi.log - exit $? -} - -function build_cross() -{ - ${DOCKER} pull quay.io/moxielogic/libffi-ci-${HOST} - ${DOCKER} run --rm -t -i -v $(pwd):/opt -e HOST="${HOST}" -e CC="${HOST}-gcc ${GCC_OPTIONS}" -e CXX="${HOST}-g++ ${GCC_OPTIONS}" -e TRAVIS_BUILD_DIR=/opt -e DEJAGNU="${DEJAGNU}" -e RUNTESTFLAGS="${RUNTESTFLAGS}" -e LIBFFI_TEST_OPTIMIZATION="${LIBFFI_TEST_OPTIMIZATION}" quay.io/moxielogic/libffi-ci-${HOST} bash -c /opt/.travis/build-cross-in-container.sh - - ./rlgl l --key=${RLGL_KEY} https://rl.gl - ID=$(./rlgl start) - ./rlgl e --id=$ID --policy=https://github.com/libffi/rlgl-policy.git */testsuite/libffi.log - exit $? -} - -function build_ios() -{ - which python -# export PYTHON_BIN=/usr/local/bin/python - ./generate-darwin-source-and-headers.py --only-ios - xcodebuild -showsdks - xcodebuild -project libffi.xcodeproj -target "libffi-iOS" -configuration Release -sdk iphoneos11.4 - exit $? -} - -function build_macosx() -{ - which python -# export PYTHON_BIN=/usr/local/bin/python - ./generate-darwin-source-and-headers.py --only-osx - xcodebuild -showsdks - xcodebuild -project libffi.xcodeproj -target "libffi-Mac" -configuration Release -sdk macosx10.13 - echo "Finished build" - exit $? -} - -case "$HOST" in - arm-apple-darwin*) - ./autogen.sh - build_ios - ;; - x86_64-apple-darwin*) - ./autogen.sh - build_macosx - ;; - arm32v7-linux-gnu) - ./autogen.sh - build_foreign_linux arm moxielogic/arm32v7-ci-build-container:latest - ;; - mips64el-linux-gnu | sparc64-linux-gnu) - build_cfarm - ;; - bfin-elf ) - ./autogen.sh - GCC_OPTIONS=-msim build_cross - ;; - m32r-elf ) - ./autogen.sh - build_cross - ;; - or1k-elf ) - ./autogen.sh - build_cross - ;; - powerpc-eabisim ) - ./autogen.sh - build_cross - ;; - m68k-linux-gnu ) - ./autogen.sh - GCC_OPTIONS=-mcpu=547x build_cross_linux - ;; - alpha-linux-gnu | sh4-linux-gnu ) - ./autogen.sh - build_cross_linux - ;; - *) - ./autogen.sh - build_linux - ;; -esac diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis/compile b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis/compile deleted file mode 100755 index 655932a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis/compile +++ /dev/null @@ -1,351 +0,0 @@ -#! /bin/sh -# Wrapper for compilers which do not understand '-c -o'. - -scriptversion=2018-03-27.18; # UTC - -# Copyright (C) 1999-2018 Free Software Foundation, Inc. -# Written by Tom Tromey . -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# This file is maintained in Automake, please report -# bugs to or send patches to -# . - -nl=' -' - -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent tools from complaining about whitespace usage. -IFS=" "" $nl" - -file_conv= - -# func_file_conv build_file lazy -# Convert a $build file to $host form and store it in $file -# Currently only supports Windows hosts. If the determined conversion -# type is listed in (the comma separated) LAZY, no conversion will -# take place. -func_file_conv () -{ - file=$1 - case $file in - / | /[!/]*) # absolute file, and not a UNC file - if test -z "$file_conv"; then - # lazily determine how to convert abs files - case `uname -s` in - MINGW*) - file_conv=mingw - ;; - CYGWIN*) - file_conv=cygwin - ;; - *) - file_conv=wine - ;; - esac - fi - case $file_conv/,$2, in - *,$file_conv,*) - ;; - mingw/*) - file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` - ;; - cygwin/*) - file=`cygpath -m "$file" || echo "$file"` - ;; - wine/*) - file=`winepath -w "$file" || echo "$file"` - ;; - esac - ;; - esac -} - -# func_cl_dashL linkdir -# Make cl look for libraries in LINKDIR -func_cl_dashL () -{ - func_file_conv "$1" - if test -z "$lib_path"; then - lib_path=$file - else - lib_path="$lib_path;$file" - fi - linker_opts="$linker_opts -LIBPATH:$file" -} - -# func_cl_dashl library -# Do a library search-path lookup for cl -func_cl_dashl () -{ - lib=$1 - found=no - save_IFS=$IFS - IFS=';' - for dir in $lib_path $LIB - do - IFS=$save_IFS - if $shared && test -f "$dir/$lib.dll.lib"; then - found=yes - lib=$dir/$lib.dll.lib - break - fi - if test -f "$dir/$lib.lib"; then - found=yes - lib=$dir/$lib.lib - break - fi - if test -f "$dir/lib$lib.a"; then - found=yes - lib=$dir/lib$lib.a - break - fi - done - IFS=$save_IFS - - if test "$found" != yes; then - lib=$lib.lib - fi -} - -# func_cl_wrapper cl arg... -# Adjust compile command to suit cl -func_cl_wrapper () -{ - # Assume a capable shell - lib_path= - shared=: - linker_opts= - for arg - do - if test -n "$eat"; then - eat= - else - case $1 in - -o) - # configure might choose to run compile as 'compile cc -o foo foo.c'. - eat=1 - case $2 in - *.o | *.[oO][bB][jJ]) - func_file_conv "$2" - set x "$@" -Fo"$file" - shift - ;; - *) - func_file_conv "$2" - set x "$@" -Fe"$file" - shift - ;; - esac - ;; - -I) - eat=1 - func_file_conv "$2" mingw - set x "$@" -I"$file" - shift - ;; - -I*) - func_file_conv "${1#-I}" mingw - set x "$@" -I"$file" - shift - ;; - -l) - eat=1 - func_cl_dashl "$2" - set x "$@" "$lib" - shift - ;; - -l*) - func_cl_dashl "${1#-l}" - set x "$@" "$lib" - shift - ;; - -L) - eat=1 - func_cl_dashL "$2" - ;; - -L*) - func_cl_dashL "${1#-L}" - ;; - -static) - shared=false - ;; - -warn) - eat=1 - ;; - -Wl,*) - arg=${1#-Wl,} - save_ifs="$IFS"; IFS=',' - for flag in $arg; do - IFS="$save_ifs" - linker_opts="$linker_opts $flag" - done - IFS="$save_ifs" - ;; - -Xlinker) - eat=1 - linker_opts="$linker_opts $2" - ;; - -*) - set x "$@" "$1" - shift - ;; - *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) - func_file_conv "$1" - set x "$@" -Tp"$file" - shift - ;; - *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) - func_file_conv "$1" mingw - set x "$@" "$file" - shift - ;; - *) - set x "$@" "$1" - shift - ;; - esac - fi - shift - done - if test -n "$linker_opts"; then - linker_opts="-link$linker_opts" - fi - exec "$@" $linker_opts - exit 1 -} - -eat= - -case $1 in - '') - echo "$0: No command. Try '$0 --help' for more information." 1>&2 - exit 1; - ;; - -h | --h*) - cat <<\EOF -Usage: compile [--help] [--version] PROGRAM [ARGS] - -Wrapper for compilers which do not understand '-c -o'. -Remove '-o dest.o' from ARGS, run PROGRAM with the remaining -arguments, and rename the output as expected. - -If you are trying to build a whole package this is not the -right script to run: please start by reading the file 'INSTALL'. - -Report bugs to . -EOF - exit $? - ;; - -v | --v*) - echo "compile $scriptversion" - exit $? - ;; - cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ - icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) - func_cl_wrapper "$@" # Doesn't return... - ;; -esac - -ofile= -cfile= - -for arg -do - if test -n "$eat"; then - eat= - else - case $1 in - -o) - # configure might choose to run compile as 'compile cc -o foo foo.c'. - # So we strip '-o arg' only if arg is an object. - eat=1 - case $2 in - *.o | *.obj) - ofile=$2 - ;; - *) - set x "$@" -o "$2" - shift - ;; - esac - ;; - *.c) - cfile=$1 - set x "$@" "$1" - shift - ;; - *) - set x "$@" "$1" - shift - ;; - esac - fi - shift -done - -if test -z "$ofile" || test -z "$cfile"; then - # If no '-o' option was seen then we might have been invoked from a - # pattern rule where we don't need one. That is ok -- this is a - # normal compilation that the losing compiler can handle. If no - # '.c' file was seen then we are probably linking. That is also - # ok. - exec "$@" -fi - -# Name of file we expect compiler to create. -cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` - -# Create the lock directory. -# Note: use '[/\\:.-]' here to ensure that we don't use the same name -# that we are using for the .o file. Also, base the name on the expected -# object file name, since that is what matters with a parallel build. -lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d -while true; do - if mkdir "$lockdir" >/dev/null 2>&1; then - break - fi - sleep 1 -done -# FIXME: race condition here if user kills between mkdir and trap. -trap "rmdir '$lockdir'; exit 1" 1 2 15 - -# Run the compile. -"$@" -ret=$? - -if test -f "$cofile"; then - test "$cofile" = "$ofile" || mv "$cofile" "$ofile" -elif test -f "${cofile}bj"; then - test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" -fi - -rmdir "$lockdir" -exit $ret - -# Local Variables: -# mode: shell-script -# sh-indentation: 2 -# eval: (add-hook 'before-save-hook 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC0" -# time-stamp-end: "; # UTC" -# End: diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis/install.sh b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis/install.sh deleted file mode 100755 index 2420245..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis/install.sh +++ /dev/null @@ -1,71 +0,0 @@ -#!/bin/bash -set -x - -if [[ $TRAVIS_OS_NAME != 'linux' ]]; then - brew update > brew-update.log 2>&1 - # fix an issue with libtool on travis by reinstalling it - brew uninstall libtool; - brew install libtool dejagnu; - - # Download and extract the rlgl client - wget -qO - https://rl.gl/cli/rlgl-darwin-amd64.tgz | \ - tar --strip-components=2 -xvzf - ./rlgl/rlgl; - -else - # Download and extract the rlgl client - case $HOST in - aarch64-linux-gnu) - wget -qO - https://rl.gl/cli/rlgl-linux-arm.tgz | \ - tar --strip-components=2 -xvzf - ./rlgl/rlgl; - ;; - ppc64le-linux-gnu) - wget -qO - https://rl.gl/cli/rlgl-linux-ppc64le.tgz | \ - tar --strip-components=2 -xvzf - ./rlgl/rlgl; - ;; - s390x-linux-gnu) - wget -qO - https://rl.gl/cli/rlgl-linux-s390x.tgz | \ - tar --strip-components=2 -xvzf - ./rlgl/rlgl; - ;; - *) - wget -qO - https://rl.gl/cli/rlgl-linux-amd64.tgz | \ - tar --strip-components=2 -xvzf - ./rlgl/rlgl; - ;; - esac - - sudo apt-get clean # clear the cache - sudo apt-get update - case $HOST in - mips64el-linux-gnu | sparc64-linux-gnu) - ;; - alpha-linux-gnu | arm32v7-linux-gnu | m68k-linux-gnu | sh4-linux-gnu) - sudo apt-get install qemu-user-static - ;; - hppa-linux-gnu ) - sudo apt-get install -y qemu-user-static g++-5-hppa-linux-gnu - ;; - i386-pc-linux-gnu) - sudo apt-get install gcc-multilib g++-multilib; - ;; - moxie-elf) - echo 'deb https://repos.moxielogic.org:7114/MoxieLogic moxiedev main' | sudo tee -a /etc/apt/sources.list - sudo apt-get clean # clear the cache - sudo apt-get update ## -qq - sudo apt-get update - sudo apt-get install -y --allow-unauthenticated moxielogic-moxie-elf-gcc moxielogic-moxie-elf-gcc-c++ moxielogic-moxie-elf-gcc-libstdc++ moxielogic-moxie-elf-gdb-sim - ;; - x86_64-w64-mingw32) - sudo apt-get install gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64 wine; - ;; - i686-w32-mingw32) - sudo apt-get install gcc-mingw-w64-i686 g++-mingw-w64-i686 wine; - ;; - esac - case $HOST in - arm32v7-linux-gnu) - # don't install host tools - ;; - *) - sudo apt-get install dejagnu texinfo sharutils - ;; - esac -fi diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis/m32r-sim.exp b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis/m32r-sim.exp deleted file mode 100644 index c18123f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis/m32r-sim.exp +++ /dev/null @@ -1,58 +0,0 @@ -# Copyright (C) 2010, 2019 Free Software Foundation, Inc. -# -# This file is part of DejaGnu. -# -# DejaGnu is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# DejaGnu is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with DejaGnu; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, MA 02110, USA. - -# This is a list of toolchains that are supported on this board. -set_board_info target_install {m32r-elf} - -# Load the generic configuration for this board. This will define a basic set -# of routines needed by the tool to communicate with the board. -load_generic_config "sim" - -# basic-sim.exp is a basic description for the standard Cygnus simulator. -load_base_board_description "basic-sim" - -# "m32r" is the name of the sim subdir in devo/sim. -setup_sim m32r - -# No multilib options needed by default. -process_multilib_options "" - -# We only support newlib on this target. We assume that all multilib -# options have been specified before we get here. - -set_board_info compiler "[find_gcc]" -set_board_info cflags "[libgloss_include_flags] [newlib_include_flags]" -set_board_info ldflags "[libgloss_link_flags] [newlib_link_flags]" - -# Configuration settings for testsuites -set_board_info noargs 1 -set_board_info gdb,nosignals 1 -set_board_info gdb,noresults 1 -set_board_info gdb,cannot_call_functions 1 -set_board_info gdb,skip_float_tests 1 -set_board_info gdb,can_reverse 1 -set_board_info gdb,use_precord 1 - -# More time is needed -set_board_info gcc,timeout 800 -set_board_info gdb,timeout 60 - -# Used by a few gcc.c-torture testcases to delimit how large the stack can -# be. -set_board_info gcc,stack_size 5000 - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis/moxie-sim.exp b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis/moxie-sim.exp deleted file mode 100644 index 32979ea..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis/moxie-sim.exp +++ /dev/null @@ -1,60 +0,0 @@ -# Copyright (C) 2010 Free Software Foundation, Inc. -# -# This file is part of DejaGnu. -# -# DejaGnu is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# DejaGnu is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with DejaGnu; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, MA 02110, USA. - -# This is a list of toolchains that are supported on this board. -set_board_info target_install {moxie-elf} - -# Load the generic configuration for this board. This will define a basic set -# of routines needed by the tool to communicate with the board. -load_generic_config "sim" - -# basic-sim.exp is a basic description for the standard Cygnus simulator. -load_base_board_description "basic-sim" - -# "moxie" is the name of the sim subdir in devo/sim. -setup_sim moxie - -# No multilib options needed by default. -process_multilib_options "" - -# We only support newlib on this target. We assume that all multilib -# options have been specified before we get here. - -set_board_info compiler "[find_gcc]" -set_board_info cflags "[libgloss_include_flags] [newlib_include_flags]" -set_board_info ldflags "[libgloss_link_flags] [newlib_link_flags]" -# No linker script needed. -set_board_info ldscript "-Tsim.ld" - -# Configuration settings for testsuites -set_board_info noargs 1 -set_board_info gdb,nosignals 1 -set_board_info gdb,noresults 1 -set_board_info gdb,cannot_call_functions 1 -set_board_info gdb,skip_float_tests 1 -set_board_info gdb,can_reverse 1 -set_board_info gdb,use_precord 1 - -# More time is needed -set_board_info gcc,timeout 800 -set_board_info gdb,timeout 60 - -# Used by a few gcc.c-torture testcases to delimit how large the stack can -# be. -set_board_info gcc,stack_size 5000 - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis/or1k-sim.exp b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis/or1k-sim.exp deleted file mode 100644 index 3920413..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis/or1k-sim.exp +++ /dev/null @@ -1,58 +0,0 @@ -# Copyright (C) 2010, 2019 Free Software Foundation, Inc. -# -# This file is part of DejaGnu. -# -# DejaGnu is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# DejaGnu is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with DejaGnu; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, MA 02110, USA. - -# This is a list of toolchains that are supported on this board. -set_board_info target_install {or1k-elf} - -# Load the generic configuration for this board. This will define a basic set -# of routines needed by the tool to communicate with the board. -load_generic_config "sim" - -# basic-sim.exp is a basic description for the standard Cygnus simulator. -load_base_board_description "basic-sim" - -# "or1k" is the name of the sim subdir in devo/sim. -setup_sim or1k - -# No multilib options needed by default. -process_multilib_options "" - -# We only support newlib on this target. We assume that all multilib -# options have been specified before we get here. - -set_board_info compiler "[find_gcc]" -set_board_info cflags "[libgloss_include_flags] [newlib_include_flags]" -set_board_info ldflags "[libgloss_link_flags] [newlib_link_flags]" - -# Configuration settings for testsuites -set_board_info noargs 1 -set_board_info gdb,nosignals 1 -set_board_info gdb,noresults 1 -set_board_info gdb,cannot_call_functions 1 -set_board_info gdb,skip_float_tests 1 -set_board_info gdb,can_reverse 1 -set_board_info gdb,use_precord 1 - -# More time is needed -set_board_info gcc,timeout 800 -set_board_info gdb,timeout 60 - -# Used by a few gcc.c-torture testcases to delimit how large the stack can -# be. -set_board_info gcc,stack_size 5000 - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis/powerpc-eabisim.exp b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis/powerpc-eabisim.exp deleted file mode 100644 index 285fd4f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis/powerpc-eabisim.exp +++ /dev/null @@ -1,58 +0,0 @@ -# Copyright (C) 2010, 2019 Free Software Foundation, Inc. -# -# This file is part of DejaGnu. -# -# DejaGnu is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# DejaGnu is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with DejaGnu; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, MA 02110, USA. - -# This is a list of toolchains that are supported on this board. -set_board_info target_install {powerpc-eabisim} - -# Load the generic configuration for this board. This will define a basic set -# of routines needed by the tool to communicate with the board. -load_generic_config "sim" - -# basic-sim.exp is a basic description for the standard Cygnus simulator. -load_base_board_description "basic-sim" - -# "powerpc" is the name of the sim subdir in devo/sim. -setup_sim powerpc - -# No multilib options needed by default. -process_multilib_options "" - -# We only support newlib on this target. We assume that all multilib -# options have been specified before we get here. - -set_board_info compiler "[find_gcc]" -set_board_info cflags "[libgloss_include_flags] [newlib_include_flags]" -set_board_info ldflags "[libgloss_link_flags] [newlib_link_flags]" - -# Configuration settings for testsuites -set_board_info noargs 1 -set_board_info gdb,nosignals 1 -set_board_info gdb,noresults 1 -set_board_info gdb,cannot_call_functions 1 -set_board_info gdb,skip_float_tests 1 -set_board_info gdb,can_reverse 1 -set_board_info gdb,use_precord 1 - -# More time is needed -set_board_info gcc,timeout 800 -set_board_info gdb,timeout 60 - -# Used by a few gcc.c-torture testcases to delimit how large the stack can -# be. -set_board_info gcc,stack_size 5000 - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis/site.exp b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis/site.exp deleted file mode 100644 index 644ec63..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis/site.exp +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (C) 2008, 2010, 2018, 2019 Anthony Green - -# Make sure we look in the right place for the board description files. -if ![info exists boards_dir] { - set boards_dir {} -} - -lappend boards_dir $::env(TRAVIS_BUILD_DIR)/.travis - -verbose "Global Config File: target_triplet is $target_triplet" 2 -global target_list - -case "$target_triplet" in { - { "bfin-elf" } { - set target_list "bfin-sim" - } - { "m32r-elf" } { - set target_list "m32r-sim" - } - { "moxie-elf" } { - set target_list "moxie-sim" - } - { "or1k-elf" } { - set target_list "or1k-sim" - } -} - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis/wine-sim.exp b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis/wine-sim.exp deleted file mode 100644 index 1ad6038..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/.travis/wine-sim.exp +++ /dev/null @@ -1,55 +0,0 @@ -# Copyright (C) 2010, 2019 Free Software Foundation, Inc. -# -# This file is part of DejaGnu. -# -# DejaGnu is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# DejaGnu is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with DejaGnu; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, MA 02110, USA. - -# This is a list of toolchains that are supported on this board. -set_board_info target_install {i686-w64-mingw32} - -# Load the generic configuration for this board. This will define a basic set -# of routines needed by the tool to communicate with the board. -load_generic_config "sim" - -set_board_info sim "wineconsole --backend=curses" -set_board_info is_simulator 1 - -# No multilib options needed by default. -process_multilib_options "" - -# We only support newlib on this target. We assume that all multilib -# options have been specified before we get here. - -set_board_info compiler "[find_gcc]" -set_board_info cflags "[libgloss_include_flags] [newlib_include_flags]" -set_board_info ldflags "[libgloss_link_flags] [newlib_link_flags]" - -# Configuration settings for testsuites -set_board_info noargs 1 -set_board_info gdb,nosignals 1 -set_board_info gdb,noresults 1 -set_board_info gdb,cannot_call_functions 1 -set_board_info gdb,skip_float_tests 1 -set_board_info gdb,can_reverse 1 -set_board_info gdb,use_precord 1 - -# More time is needed -set_board_info gcc,timeout 800 -set_board_info gdb,timeout 60 - -# Used by a few gcc.c-torture testcases to delimit how large the stack can -# be. -set_board_info gcc,stack_size 5000 - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/ChangeLog.old b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/ChangeLog.old deleted file mode 100644 index 8de1ca7..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/ChangeLog.old +++ /dev/null @@ -1,7407 +0,0 @@ -Libffi change logs used to be maintained in separate ChangeLog files. -These days we generate them directly from the git commit messages. -The old ChangeLog files are saved here in order to maintain the historical -record. - -============================================================================= -From the old ChangeLog.libffi-3.1 file... - -2014-03-16 Josh Triplett - - * ChangeLog: Archive to ChangeLog.libffi-3.1 and delete. Future - changelogs will come from git, with autogenerated snapshots shipped in - distributed tarballs. - -2014-03-16 Josh Triplett - - Add support for stdcall, thiscall, and fastcall on non-Windows - x86-32. - - Linux supports the stdcall calling convention, either via - functions explicitly declared with the stdcall attribute, or via - code compiled with -mrtd which effectively makes stdcall the - default. - - This introduces FFI_STDCALL, FFI_THISCALL, and FFI_FASTCALL on - non-Windows x86-32 platforms, as non-default calling conventions. - - * Makefile.am: Compile in src/x86/win32.S on non-Windows x86-32. - * src/x86/ffitarget.h: Add FFI_STDCALL, FFI_THISCALL, and - FFI_FASTCALL on non-Windows x86-32. Increase trampoline size to - accomodate these calling conventions, and unify some ifdeffery. - * src/x86/ffi.c: Add support for FFI_STDCALL, FFI_THISCALL, and - FFI_FASTCALL on non-Windows x86-32 platforms; update ifdeffery. - * src/x86/win32.S: Support compiling on non-Windows x86-32 - platforms. On those platforms, avoid redefining the SYSV symbols - already provided by src/x86/sysv.S. - * testsuite/libffi.call/closure_stdcall.c: Run on non-Windows. - #define __stdcall if needed. - * testsuite/libffi.call/closure_thiscall.c: Run on non-Windows. - #define __fastcall if needed. - * testsuite/libffi.call/fastthis1_win32.c: Run on non-Windows. - * testsuite/libffi.call/fastthis2_win32.c: Ditto. - * testsuite/libffi.call/fastthis3_win32.c: Ditto. - * testsuite/libffi.call/many2_win32.c: Ditto. - * testsuite/libffi.call/many_win32.c: Ditto. - * testsuite/libffi.call/strlen2_win32.c: Ditto. - * testsuite/libffi.call/strlen_win32.c: Ditto. - * testsuite/libffi.call/struct1_win32.c: Ditto. - * testsuite/libffi.call/struct2_win32.c: Ditto. - -2014-03-16 Josh Triplett - - * prep_cif.c: Remove unnecessary ifdef for X86_WIN32. - ffi_prep_cif_core had a special case for X86_WIN32, checking for - FFI_THISCALL in addition to the FFI_FIRST_ABI-to-FFI_LAST_ABI - range before returning FFI_BAD_ABI. However, on X86_WIN32, - FFI_THISCALL already falls in that range, making the special case - unnecessary. Remove it. - -2014-03-16 Josh Triplett - - * testsuite/libffi.call/closure_stdcall.c, - testsuite/libffi.call/closure_thiscall.c: Remove fragile stack - pointer checks. These files included inline assembly to save the - stack pointer before and after the call, and compare the values. - However, compilers can and do leave the stack in different states - for these two pieces of inline assembly, such as by saving a - temporary value on the stack across the call; observed with gcc - -Os, and verified as spurious through careful inspection of - disassembly. - -2014-03-16 Josh Triplett - - * testsuite/libffi.call/many.c: Avoid spurious failure due to - excess floating-point precision. - * testsuite/libffi.call/many_win32.c: Ditto. - -2014-03-16 Josh Triplett - - * libtool-ldflags: Re-add. - -2014-03-16 Josh Triplett - - * Makefile.in, aclocal.m4, compile, config.guess, config.sub, - configure, depcomp, include/Makefile.in, install-sh, - libtool-ldflags, ltmain.sh, m4/libtool.m4, m4/ltoptions.m4, - m4/ltsugar.m4, m4/ltversion.m4, m4/lt~obsolete.m4, - man/Makefile.in, mdate-sh, missing, testsuite/Makefile.in: Delete - autogenerated files from version control. - * .gitignore: Add autogenerated files. - * autogen.sh: New script to generate the autogenerated files. - * README: Document requirement to run autogen.sh when building - directly from version control. - * .travis.yml: Run autogen.sh - -2014-03-14 Anthony Green - - * configure, Makefile.in: Rebuilt. - -2014-03-10 Mike Hommey - - * configure.ac: Allow building for mipsel with Android NDK r8. - * Makefile.am (AM_MAKEFLAGS): Replace double quotes with single - quotes. - -2014-03-10 Landry Breuil - - * configure.ac: Ensure the linker supports @unwind sections in libffi. - -2014-03-01 Anthony Green - - * Makefile.am (EXTRA_DIST): Replace old scripts with - generate-darwin-source-and-headers.py. - * Makefile.in: Rebuilt. - -2014-02-28 Anthony Green - - * Makefile.am (AM_CFLAGS): Reintroduce missing -DFFI_DEBUG for - --enable-debug builds. - * Makefile.in: Rebuilt. - -2014-02-28 Makoto Kato - - * src/closures.c: Fix build failure when using clang for Android. - -2014-02-28 Marcin Wojdyr - - * libffi.pc.in (toolexeclibdir): use -L${toolexeclibdir} instead - of -L${libdir}. - -2014-02-28 Paulo Pizarro - - * src/bfin/sysv.S: Calling functions in shared libraries requires - considering the GOT. - -2014-02-28 Josh Triplett - - * src/x86/ffi64.c (classify_argument): Handle case where - FFI_TYPE_LONGDOUBLE == FFI_TYPE_DOUBLE. - -2014-02-28 Anthony Green - - * ltmain.sh: Generate with libtool-2.4.2.418. - * m4/libtool.m4, m4/ltoptions.m4, m4/ltversion.m4: Ditto. - * configure: Rebuilt. - -2014-02-28 Dominik Vogt - - * configure.ac (AC_ARG_ENABLE struct): Fix typo in help - message. - (AC_ARG_ENABLE raw_api): Ditto. - * configure, fficonfig.h.in: Rebuilt. - -2014-02-28 Will Newton - - * src/arm/sysv.S: Initialize IP register with FP. - -2014-02-28 Yufeng Zhang - - * src/aarch64/sysv.S (ffi_closure_SYSV): Use x29 as the - main CFA reg; update cfi_rel_offset. - -2014-02-15 Marcus Comstedt - - * src/powerpc/ffi_linux64.c, src/powerpc/linux64_closure.S: Remove - assumption on contents of r11 in closure. - -2014-02-09 Heiher - - * src/mips/n32.S: Fix call floating point va function. - -2014-01-21 Zachary Waldowski - - * src/aarch64/ffi.c: Fix missing semicolons on assertions under - debug mode. - -2013-12-30 Zachary Waldowski - - * .gitignore: Exclude darwin_* generated source and build_* trees. - * src/aarch64/ffi.c, src/arm/ffi.c, src/x86/ffi.c: Inhibit Clang - previous prototype warnings. - * src/arm/ffi.c: Prevent NULL dereference, fix short type warning - * src/dlmalloc.c: Fix warnings from set_segment_flags return type, - and the native use of size_t for malloc on platforms - * src/arm/sysv.S: Use unified syntax. Clang clean-ups for - ARM_FUNC_START. - * generate-osx-source-and-headers.py: Remove. - * build-ios.sh: Remove. - * libffi.xcodeproj/project.pbxproj: Rebuild targets. Include - x86_64+aarch64 pieces in library. Export headers properly. - * src/x86/ffi64.c: More Clang warning clean-ups. - * src/closures.c (open_temp_exec_file_dir): Use size_t. - * src/prep_cif.c (ffi_prep_cif_core): Cast ALIGN result. - * src/aarch64/sysv.S: Use CNAME for global symbols. Only use - .size for ELF targets. - * src/aarch64/ffi.c: Clean up for double == long double. Clean up - from Clang warnings. Use Clang cache invalidation builtin. Use - size_t in place of unsigned in many places. Accommodate for - differences in Apple AArch64 ABI. - -2013-12-02 Daniel Rodríguez Troitiño - - * generate-darwin-source-and-headers.py: Clean up, modernize, - merged version of previous scripts. - -2013-11-21 Anthony Green - - * configure, Makefile.in, include/Makefile.in, include/ffi.h.in, - man/Makefile.in, testsuite/Makefile.in, fficonfig.h.in: Rebuilt. - -2013-11-21 Alan Modra - - * Makefile.am (EXTRA_DIST): Add new src/powerpc files. - (nodist_libffi_la_SOURCES ): Likewise. - * configure.ac (HAVE_LONG_DOUBLE_VARIANT): Define for powerpc. - * include/ffi.h.in (ffi_prep_types): Declare. - * src/prep_cif.c (ffi_prep_cif_core): Call ffi_prep_types. - * src/types.c (FFI_NONCONST_TYPEDEF): Define and use for - HAVE_LONG_DOUBLE_VARIANT. - * src/powerpc/ffi_powerpc.h: New file. - * src/powerpc/ffi.c: Split into.. - * src/powerpc/ffi_sysv.c: ..new file, and.. - * src/powerpc/ffi_linux64.c: ..new file, rewriting parts. - * src/powerpc/ffitarget.h (enum ffi_abi): Rewrite powerpc ABI - selection as bits controlling features. - * src/powerpc/linux64.S: For consistency, use POWERPC64 rather - than __powerpc64__. - * src/powerpc/linux64_closure.S: Likewise. - * src/powerpc/ppc_closure.S: Likewise. Move .note.FNU-stack - inside guard. - * src/powerpc/sysv.S: Likewise. - * configure: Regenerate. - * fficonfig.h.in: Regenerate. - * Makefile.in: Regenerate. - -2013-11-20 Alan Modra - - * src/powerpc/ffi.c (ffi_prep_cif_machdep_core): Use - NUM_FPR_ARG_REGISTERS64 and NUM_GPR_ARG_REGISTERS64 not their - 32-bit versions for 64-bit code. - * src/powerpc/linux64_closure.S: Don't use the return value area - as a parameter save area on ELFv2. - -2013-11-18 Iain Sandoe - - * src/powerpc/darwin.S (EH): Correct use of pcrel FDE encoding. - * src/powerpc/darwin_closure.S (EH): Likewise. Modernise picbase - labels. - -2013-11-18 Anthony Green - - * src/arm/ffi.c (ffi_call): Hoist declaration of temp to top of - function. - * src/arm/ffi.c (ffi_closure_inner): Moderize function declaration - to appease compiler. - Thanks for Gregory P. Smith . - -2013-11-18 Anthony Green - - * README (tested): Mention PowerPC ELFv2. - -2013-11-16 Alan Modra - - * src/powerpc/ppc_closure.S: Move errant #endif to where it belongs. - Don't bl .Luint128. - -2013-11-16 Alan Modra - - * src/powerpc/ffi.c (ffi_prep_cif_machdep_core): Use #if _CALL_ELF - test to select parameter save sizing for ELFv2 vs. ELFv1. - * src/powerpc/ffitarget.h (FFI_V2_TYPE_FLOAT_HOMOG, - FFI_V2_TYPE_DOUBLE_HOMOG, FFI_V2_TYPE_SMALL_STRUCT): Define. - (FFI_TRAMPOLINE_SIZE): Define variant for ELFv2. - * src/powerpc/ffi.c (FLAG_ARG_NEEDS_PSAVE): Define. - (discover_homogeneous_aggregate): New function. - (ffi_prep_args64): Adjust start of param save area for ELFv2. - Handle homogenous floating point struct parms. - (ffi_prep_cif_machdep_core): Adjust space calculation for ELFv2. - Handle ELFv2 return values. Set FLAG_ARG_NEEDS_PSAVE. Handle - homogenous floating point structs. - (ffi_call): Increase size of smst_buffer for ELFv2. Handle ELFv2. - (flush_icache): Compile for ELFv2. - (ffi_prep_closure_loc): Set up ELFv2 trampoline. - (ffi_closure_helper_LINUX64): Don't return all structs directly - to caller. Handle homogenous floating point structs. Handle - ELFv2 struct return values. - * src/powerpc/linux64.S (ffi_call_LINUX64): Set up r2 for - ELFv2. Adjust toc save location. Call function pointer using - r12. Handle FLAG_RETURNS_SMST. Don't predict branches. - * src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Set up r2 - for ELFv2. Define ELFv2 versions of STACKFRAME, PARMSAVE, and - RETVAL. Handle possibly missing parameter save area. Handle - ELFv2 return values. - (.note.GNU-stack): Move inside outer #ifdef. - -2013-11-16 Alan Modra - - * src/powerpc/ffi.c (ffi_prep_cif_machdep): Revert 2013-02-08 - change. Do not consume an int arg when returning a small struct - for FFI_SYSV ABI. - (ffi_call): Only use bounce buffer when FLAG_RETURNS_SMST. - Properly copy bounce buffer to destination. - * src/powerpc/sysv.S: Revert 2013-02-08 change. - * src/powerpc/ppc_closure.S: Remove stray '+'. - -2013-11-16 Alan Modra - - * src/powerpc/ffi.c (ffi_prep_args64): Align struct parameters - according to __STRUCT_PARM_ALIGN__. - (ffi_prep_cif_machdep_core): Likewise. - (ffi_closure_helper_LINUX64): Likewise. - -2013-11-16 Alan Modra - - * src/powerpc/linux64.S (ffi_call_LINUX64): Tweak restore of r28. - (.note.GNU-stack): Move inside outer #ifdef. - * src/powerpc/linux64_closure.S (STACKFRAME, PARMSAVE, - RETVAL): Define and use throughout. - (ffi_closure_LINUX64): Save fprs before buying stack. - (.note.GNU-stack): Move inside outer #ifdef. - -2013-11-16 Alan Modra - - * src/powerpc/ffitarget.h (FFI_TARGET_SPECIFIC_VARIADIC): Define. - (FFI_EXTRA_CIF_FIELDS): Define. - * src/powerpc/ffi.c (ffi_prep_args64): Save fprs as per the - ABI, not to both fpr and param save area. - (ffi_prep_cif_machdep_core): Renamed from ffi_prep_cif_machdep. - Keep initial flags. Formatting. Remove dead FFI_LINUX_SOFT_FLOAT - code. - (ffi_prep_cif_machdep, ffi_prep_cif_machdep_var): New functions. - (ffi_closure_helper_LINUX64): Pass floating point as per ABI, - not to both fpr and parameter save areas. - - * libffi/testsuite/libffi.call/cls_double_va.c (main): Correct - function cast and don't call ffi_prep_cif. - * libffi/testsuite/libffi.call/cls_longdouble_va.c (main): Likewise. - -2013-11-15 Andrew Haley - - * doc/libffi.texi (Closure Example): Fix the sample code. - * doc/libffi.info, doc/stamp-vti, doc/version.texi: Rebuilt. - -2013-11-15 Andrew Haley - - * testsuite/libffi.call/va_struct1.c (main): Fix broken test. - * testsuite/libffi.call/cls_uint_va.c (cls_ret_T_fn): Likewise - * testsuite/libffi.call/cls_struct_va1.c (test_fn): Likewise. - * testsuite/libffi.call/va_1.c (main): Likewise. - -2013-11-14 David Schneider - - * src/arm/ffi.c: Fix register allocation for mixed float and - doubles. - * testsuite/libffi.call/cls_many_mixed_float_double.c: Testcase - for many mixed float and double arguments. - -2013-11-13 Alan Modra - - * doc/libffi.texi (Simple Example): Correct example code. - * doc/libffi.info, doc/stamp-vti, doc/version.texi: Rebuilt. - -2013-11-13 Anthony Green - - * include/ffi_common.h: Respect HAVE_ALLOCA_H for GNU compiler - based build. (Thanks to tmr111116 on github) - -2013-11-09 Anthony Green - - * m4/libtool.m4: Refresh. - * configure, Makefile.in: Rebuilt. - * README: Add more notes about next release. - -2013-11-09 Shigeharu TAKENO - - * m4/ax_gcc_archflag.m4 (ax_gcc_arch): Don't recognize - UltraSPARC-IIi as ultrasparc3. - -2013-11-06 Mark Kettenis - - * src/x86/freebsd.S (ffi_call_SYSV): Align the stack pointer to - 16-bytes. - -2013-11-06 Konstantin Belousov - - * src/x86/freebsd.S (ffi_closure_raw_SYSV): Mark the assembler - source as not requiring executable stack. - -2013-11-02 Anthony Green - - * doc/libffi.texi (The Basics): Clarify return value buffer size - requirements. Also, NULL result buffer pointers are no longer - supported. - * doc/libffi.info: Rebuilt. - -2013-11-02 Mischa Jonker - - * Makefile.am (nodist_libffi_la_SOURCES): Fix build error. - * Makefile.in: Rebuilt. - -2013-11-02 David Schneider - - * src/arm/ffi.c: more robust argument handling for closures on arm hardfloat - * testsuite/libffi.call/many_mixed.c: New file. - * testsuite/libffi.call/cls_many_mixed_args.c: More tests. - -2013-11-02 Vitaly Budovski - - * src/x86/ffi.c (ffi_prep_cif_machdep): Don't align stack for win32. - -2013-10-23 Mark H Weaver - - * src/mips/ffi.c: Fix handling of uint32_t arguments on the - MIPS N32 ABI. - -2013-10-13 Sandra Loosemore - - * README: Add Nios II to table of supported platforms. - * Makefile.am (EXTRA_DIST): Add nios2 files. - (nodist_libffi_la_SOURCES): Likewise. - * Makefile.in: Regenerated. - * configure.ac (nios2*-linux*): New host. - (NIOS2): Add AM_CONDITIONAL. - * configure: Regenerated. - * src/nios2/ffi.c: New. - * src/nios2/ffitarget.h: New. - * src/nios2/sysv.S: New. - * src/prep_cif.c (initialize_aggregate): Handle extra structure - alignment via FFI_AGGREGATE_ALIGNMENT. - (ffi_prep_cif_core): Conditionalize structure return for NIOS2. - -2013-10-10 Sandra Loosemore - - * testsuite/libffi.call/cls_many_mixed_args.c (cls_ret_double_fn): - Fix uninitialized variable. - -2013-10-11 Marcus Shawcroft - - * testsuite/libffi.call/many.c (many): Replace * with +. - -2013-10-08 Ondřej Bílka - - * src/aarch64/ffi.c, src/aarch64/sysv.S, src/arm/ffi.c, - src/arm/gentramp.sh, src/bfin/sysv.S, src/closures.c, - src/dlmalloc.c, src/ia64/ffi.c, src/microblaze/ffi.c, - src/microblaze/sysv.S, src/powerpc/darwin_closure.S, - src/powerpc/ffi.c, src/powerpc/ffi_darwin.c, src/sh/ffi.c, - src/tile/tile.S, testsuite/libffi.call/nested_struct11.c: Fix - spelling errors. - -2013-10-08 Anthony Green - - * aclocal.m4, compile, config.guess, config.sub, depcomp, - install-sh, mdate-sh, missing, texinfo.tex: Update from upstream. - * configure.ac: Update version to 3.0.14-rc0. - * Makefile.in, configure, Makefile.in, include/Makefile.in, - man/Makefile.in, testsuite/Makefile.in: Rebuilt. - * README: Mention M88K and VAX. - -2013-07-15 Miod Vallat - - * Makefile.am, - configure.ac, - src/m88k/ffi.c, - src/m88k/ffitarget.h, - src/m88k/obsd.S, - src/vax/elfbsd.S, - src/vax/ffi.c, - src/vax/ffitarget.h: Add m88k and vax support. - -2013-06-24 Alan Modra - - * src/powerpc/ffi.c (ffi_prep_args_SYSV): Move var declaration - before statements. - (ffi_prep_args64): Support little-endian. - (ffi_closure_helper_SYSV, ffi_closure_helper_LINUX64): Likewise. - * src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Likewise. - * src/powerpc/ppc_closure.S (ffi_closure_SYSV): Likewise. - -2013-06-12 Mischa Jonker - - * configure.ac: Add support for ARC. - * Makefile.am: Likewise. - * README: Add ARC details. - * src/arc/arcompact.S: New. - * src/arc/ffi.c: Likewise. - * src/arc/ffitarget.h: Likewise. - -2013-03-28 David Schneider - - * src/arm/ffi.c: Fix support for ARM hard-float calling convention. - * src/arm/sysv.S: call different methods for SYSV and VFP ABIs. - * testsuite/libffi.call/cls_many_mixed_args.c: testcase for a closure with - mixed arguments, many doubles. - * testsuite/libffi.call/many_double.c: testcase for calling a function using - more than 8 doubles. - * testcase/libffi.call/many.c: use absolute value to check result against an - epsilon - -2013-03-17 Anthony Green - - * README: Update for 3.0.13. - * configure.ac: Ditto. - * configure: Rebuilt. - * doc/*: Update version. - -2013-03-17 Dave Korn - - * src/closures.c (is_emutramp_enabled - [!FFI_MMAP_EXEC_EMUTRAMP_PAX]): Move default definition outside - enclosing #if scope. - -2013-03-17 Anthony Green - - * configure.ac: Only modify toolexecdir in certain cases. - * configure: Rebuilt. - -2013-03-16 Gilles Talis - - * src/powerpc/ffi.c (ffi_prep_args_SYSV): Don't use - fparg_count,etc on __NO_FPRS__ targets. - -2013-03-16 Alan Hourihane - - * src/m68k/sysv.S (epilogue): Don't use extb instruction on - m680000 machines. - -2013-03-16 Alex Gaynor - - * src/x86/ffi.c (ffi_prep_cif_machdep): Always align stack. - -2013-03-13 Markos Chandras - - * configure.ac: Add support for Imagination Technologies Meta. - * Makefile.am: Likewise. - * README: Add Imagination Technologies Meta details. - * src/metag/ffi.c: New. - * src/metag/ffitarget.h: Likewise. - * src/metag/sysv.S: Likewise. - -2013-02-24 Andreas Schwab - - * doc/libffi.texi (Structures): Fix missing category argument of - @deftp. - -2013-02-11 Anthony Green - - * configure.ac: Update release number to 3.0.12. - * configure: Rebuilt. - * README: Update release info. - -2013-02-10 Anthony Green - - * README: Add Moxie. - * src/moxie/ffi.c: Created. - * src/moxie/eabi.S: Created. - * src/moxie/ffitarget.h: Created. - * Makefile.am (nodist_libffi_la_SOURCES): Add Moxie. - * Makefile.in: Rebuilt. - * configure.ac: Add Moxie. - * configure: Rebuilt. - * testsuite/libffi.call/huge_struct.c: Disable format string - warnings for moxie*-*-elf tests. - -2013-02-10 Anthony Green - - * Makefile.am (LTLDFLAGS): Fix reference. - * Makefile.in: Rebuilt. - -2013-02-10 Anthony Green - - * README: Update supported platforms. Update test results link. - -2013-02-09 Anthony Green - - * testsuite/libffi.call/negint.c: Remove forced -O2. - * testsuite/libffi.call/many2.c (foo): Remove GCCism. - * testsuite/libffi.call/ffitest.h: Add default PRIuPTR definition. - - * src/sparc/v8.S (ffi_closure_v8): Import ancient ulonglong - closure return type fix developed by Martin v. Löwis for cpython - fork. - -2013-02-08 Andreas Tobler - - * src/powerpc/ffi.c (ffi_prep_cif_machdep): Fix small struct - support. - * src/powerpc/sysv.S: Ditto. - -2013-02-08 Anthony Green - - * testsuite/libffi.call/cls_longdouble.c: Remove xfail for - arm*-*-*. - -2013-02-08 Anthony Green - - * src/sparc/ffi.c (ffi_prep_closure_loc): Fix cache flushing for GCC. - -2013-02-08 Matthias Klose - - * man/ffi_prep_cif.3: Clean up for debian linter. - -2013-02-08 Peter Bergner - - * src/powerpc/ffi.c (ffi_prep_args_SYSV): Account for FP args pushed - on the stack. - -2013-02-08 Anthony Green - - * Makefile.am (EXTRA_DIST): Add missing files. - * testsuite/Makefile.am (EXTRA_DIST): Ditto. - * Makefile.in: Rebuilt. - -2013-02-08 Anthony Green - - * configure.ac: Move sparc asm config checks to within functions - for compatibility with sun tools. - * configure: Rebuilt. - * src/sparc/ffi.c (ffi_prep_closure_loc): Flush cache on v9 - systems. - * src/sparc/v8.S (ffi_flush_icache): Implement a sparc v9 cache - flusher. - -2013-02-08 Nathan Rossi - - * src/microblaze/ffi.c (ffi_closure_call_SYSV): Fix handling of - small big-endian structures. - (ffi_prep_args): Ditto. - -2013-02-07 Anthony Green - - * src/sparc/v8.S (ffi_call_v8): Fix typo from last patch - (effectively hiding ffi_call_v8). - -2013-02-07 Anthony Green - - * configure.ac: Update bug reporting address. - * configure.in: Rebuild. - - * src/sparc/v8.S (ffi_flush_icache): Out-of-line cache flusher for - Sun compiler. - * src/sparc/ffi.c (ffi_call): Remove warning. - Call ffi_flush_icache for non-GCC builds. - (ffi_prep_closure_loc): Use ffi_flush_icache. - - * Makefile.am (EXTRA_DIST): Add libtool-ldflags. - * Makefile.in: Rebuilt. - * libtool-ldflags: New file. - -2013-02-07 Daniel Schepler - - * configure.ac: Correctly identify x32 systems as 64-bit. - * m4/libtool.m4: Remove libtool expr error. - * aclocal.m4, configure: Rebuilt. - -2013-02-07 Anthony Green - - * configure.ac: Fix GCC usage test. - * configure: Rebuilt. - * README: Mention LLVM/GCC x86_64 issue. - * testsuite/Makefile.in: Rebuilt. - -2013-02-07 Anthony Green - - * testsuite/libffi.call/cls_double_va.c (main): Replace // style - comments with /* */ for xlc compiler. - * testsuite/libffi.call/stret_large.c (main): Ditto. - * testsuite/libffi.call/stret_large2.c (main): Ditto. - * testsuite/libffi.call/nested_struct1.c (main): Ditto. - * testsuite/libffi.call/huge_struct.c (main): Ditto. - * testsuite/libffi.call/float_va.c (main): Ditto. - * testsuite/libffi.call/cls_struct_va1.c (main): Ditto. - * testsuite/libffi.call/cls_pointer_stack.c (main): Ditto. - * testsuite/libffi.call/cls_pointer.c (main): Ditto. - * testsuite/libffi.call/cls_longdouble_va.c (main): Ditto. - -2013-02-06 Anthony Green - - * man/ffi_prep_cif.3: Clean up for debian lintian checker. - -2013-02-06 Anthony Green - - * Makefile.am (pkgconfigdir): Add missing pkgconfig install bits. - * Makefile.in: Rebuild. - -2013-02-02 Mark H Weaver - - * src/x86/ffi64.c (ffi_call): Sign-extend integer arguments passed - via general purpose registers. - -2013-01-21 Nathan Rossi - - * README: Add MicroBlaze details. - * Makefile.am: Add MicroBlaze support. - * configure.ac: Likewise. - * src/microblaze/ffi.c: New. - * src/microblaze/ffitarget.h: Likewise. - * src/microblaze/sysv.S: Likewise. - -2013-01-21 Nathan Rossi - * testsuite/libffi.call/return_uc.c: Fixed issue. - -2013-01-21 Chris Zankel - - * README: Add Xtensa support. - * Makefile.am: Likewise. - * configure.ac: Likewise. - * Makefile.in Regenerate. - * configure: Likewise. - * src/prep_cif.c: Handle Xtensa. - * src/xtensa: New directory. - * src/xtensa/ffi.c: New file. - * src/xtensa/ffitarget.h: Ditto. - * src/xtensa/sysv.S: Ditto. - -2013-01-11 Anthony Green - - * src/powerpc/ffi_darwin.c (ffi_prep_args): Replace // style - comments with /* */ for xlc compiler. - * src/powerpc/aix.S (ffi_call_AIX): Ditto. - * testsuite/libffi.call/ffitest.h (allocate_mmap): Delete - deprecated inline function. - * testsuite/libffi.special/ffitestcxx.h: Ditto. - * README: Add update for AIX support. - -2013-01-11 Anthony Green - - * configure.ac: Robustify pc relative reloc check. - * m4/ax_cc_maxopt.m4: Don't -malign-double. This is an ABI - changing option for 32-bit x86. - * aclocal.m4, configure: Rebuilt. - * README: Update supported target list. - -2013-01-10 Anthony Green - - * README (tested): Add Compiler column to table. - -2013-01-10 Anthony Green - - * src/x86/ffi64.c (struct register_args): Make sse array and array - of unions for sunpro compiler compatibility. - -2013-01-10 Anthony Green - - * configure.ac: Test target platform size_t size. Handle both 32 - and 64-bit builds for x86_64-* and i?86-* targets (allowing for - CFLAG option to change default settings). - * configure, aclocal.m4: Rebuilt. - -2013-01-10 Anthony Green - - * testsuite/libffi.special/special.exp: Only run exception - handling tests when using GNU compiler. - - * m4/ax_compiler_vendor.m4: New file. - * configure.ac: Test for compiler vendor and don't use - AX_CFLAGS_WARN_ALL with the sun compiler. - * aclocal.m4, configure: Rebuilt. - -2013-01-10 Anthony Green - - * include/ffi_common.h: Don't use GCCisms to define types when - building with the SUNPRO compiler. - -2013-01-10 Anthony Green - - * configure.ac: Put local.exp in the right place. - * configure: Rebuilt. - - * src/x86/ffi.c: Update comment about regparm function attributes. - * src/x86/sysv.S (ffi_closure_SYSV): The SUNPRO compiler requires - that all function arguments be passed on the stack (no regparm - support). - -2013-01-08 Anthony Green - - * configure.ac: Generate local.exp. This sets CC_FOR_TARGET - when we are using the vendor compiler. - * testsuite/Makefile.am (EXTRA_DEJAGNU_SITE_CONFIG): Point to - ../local.exp. - * configure, testsuite/Makefile.in: Rebuilt. - - * testsuite/libffi.call/call.exp: Run tests with different - options, depending on whether or not we are using gcc or the - vendor compiler. - * testsuite/lib/libffi.exp (libffi-init): Set using_gcc based on - whether or not we are building/testing with gcc. - -2013-01-08 Anthony Green - - * configure.ac: Switch x86 solaris target to X86 by default. - * configure: Rebuilt. - -2013-01-08 Anthony Green - - * configure.ac: Fix test for read-only eh_frame. - * configure: Rebuilt. - -2013-01-08 Anthony Green - - * src/x86/sysv.S, src/x86/unix64.S: Only emit DWARF unwind info - when building with the GNU toolchain. - * testsuite/libffi.call/ffitest.h (CHECK): Fix for Solaris vendor - compiler. - -2013-01-07 Thorsten Glaser - - * testsuite/libffi.call/cls_uchar_va.c, - testsuite/libffi.call/cls_ushort_va.c, - testsuite/libffi.call/va_1.c: Testsuite fixes. - -2013-01-07 Thorsten Glaser - - * src/m68k/ffi.c (CIF_FLAGS_SINT8, CIF_FLAGS_SINT16): Define. - (ffi_prep_cif_machdep): Fix 8-bit and 16-bit signed calls. - * src/m68k/sysv.S (ffi_call_SYSV, ffi_closure_SYSV): Ditto. - -2013-01-04 Anthony Green - - * Makefile.am (AM_CFLAGS): Don't automatically add -fexceptions - and -Wall. This is set in the configure script after testing for - GCC. - * Makefile.in: Rebuilt. - -2013-01-02 rofl0r - - * src/powerpc/ffi.c (ffi_prep_cif_machdep): Fix build error on ppc - when long double == double. - -2013-01-02 Reini Urban - - * Makefile.am (libffi_la_LDFLAGS): Add -no-undefined to LDFLAGS - (required for shared libs on cygwin/mingw). - * Makefile.in: Rebuilt. - -2012-10-31 Alan Modra - - * src/powerpc/linux64_closure.S: Add new ABI support. - * src/powerpc/linux64.S: Likewise. - -2012-10-30 Magnus Granberg - Pavel Labushev - - * configure.ac: New options pax_emutramp - * configure, fficonfig.h.in: Regenerated - * src/closures.c: New function emutramp_enabled_check() and - checks. - -2012-10-30 Frederick Cheung - - * configure.ac: Enable FFI_MAP_EXEC_WRIT for Darwin 12 (mountain - lion) and future version. - * configure: Rebuild. - -2012-10-30 James Greenhalgh - Marcus Shawcroft - - * README: Add details of aarch64 port. - * src/aarch64/ffi.c: New. - * src/aarch64/ffitarget.h: Likewise. - * src/aarch64/sysv.S: Likewise. - * Makefile.am: Support aarch64. - * configure.ac: Support aarch64. - * Makefile.in, configure: Rebuilt. - -2012-10-30 James Greenhalgh - Marcus Shawcroft - - * testsuite/lib/libffi.exp: Add support for aarch64. - * testsuite/libffi.call/cls_struct_va1.c: New. - * testsuite/libffi.call/cls_uchar_va.c: Likewise. - * testsuite/libffi.call/cls_uint_va.c: Likewise. - * testsuite/libffi.call/cls_ulong_va.c: Likewise. - * testsuite/libffi.call/cls_ushort_va.c: Likewise. - * testsuite/libffi.call/nested_struct11.c: Likewise. - * testsuite/libffi.call/uninitialized.c: Likewise. - * testsuite/libffi.call/va_1.c: Likewise. - * testsuite/libffi.call/va_struct1.c: Likewise. - * testsuite/libffi.call/va_struct2.c: Likewise. - * testsuite/libffi.call/va_struct3.c: Likewise. - -2012-10-12 Walter Lee - - * Makefile.am: Add TILE-Gx/TILEPro support. - * configure.ac: Likewise. - * Makefile.in: Regenerate. - * configure: Likewise. - * src/prep_cif.c (ffi_prep_cif_core): Handle TILE-Gx/TILEPro. - * src/tile: New directory. - * src/tile/ffi.c: New file. - * src/tile/ffitarget.h: Ditto. - * src/tile/tile.S: Ditto. - -2012-10-12 Matthias Klose - - * generate-osx-source-and-headers.py: Normalize whitespace. - -2012-09-14 David Edelsohn - - * configure: Regenerated. - -2012-08-26 Andrew Pinski - - PR libffi/53014 - * src/mips/ffi.c (ffi_prep_closure_loc): Allow n32 with soft-float and n64 with - soft-float. - -2012-08-08 Uros Bizjak - - * src/s390/ffi.c (ffi_prep_closure_loc): Don't ASSERT ABI test, - just return FFI_BAD_ABI when things are wrong. - -2012-07-18 H.J. Lu - - PR libffi/53982 - PR libffi/53973 - * src/x86/ffitarget.h: Check __ILP32__ instead of __LP64__ for x32. - (FFI_SIZEOF_JAVA_RAW): Defined to 4 for x32. - -2012-05-16 H.J. Lu - - * configure: Regenerated. - -2012-05-05 Nicolas Lelong - - * libffi.xcodeproj/project.pbxproj: Fixes. - * README: Update for iOS builds. - -2012-04-23 Alexandre Keunecke I. de Mendonca - - * configure.ac: Add Blackfin/sysv support - * Makefile.am: Add Blackfin/sysv support - * src/bfin/ffi.c: Add Blackfin/sysv support - * src/bfin/ffitarget.h: Add Blackfin/sysv support - -2012-04-11 Anthony Green - - * Makefile.am (EXTRA_DIST): Add new script. - * Makefile.in: Rebuilt. - -2012-04-11 Zachary Waldowski - - * generate-ios-source-and-headers.py, - libffi.xcodeproj/project.pbxproj: Support a Mac static library via - Xcode. Set iOS compatibility to 4.0. Move iOS trampoline - generation into an Xcode "run script" phase. Include both as - Xcode build scripts. Don't always regenerate config files. - -2012-04-10 Anthony Green - - * src/powerpc/ffi_darwin.c (ffi_prep_args): Add missing semicolon. - -2012-04-06 Anthony Green - - * Makefile.am (EXTRA_DIST): Add new iOS/xcode files. - * Makefile.in: Rebuilt. - -2012-04-06 Mike Lewis - - * generate-ios-source-and-headers.py: New file. - * libffi.xcodeproj/project.pbxproj: New file. - * README: Update instructions on building iOS binary. - * build-ios.sh: Delete. - -2012-04-06 Anthony Green - - * src/x86/ffi64.c (UINT128): Define differently for Intel and GNU - compilers, then use it. - -2012-04-06 H.J. Lu - - * m4/libtool.m4 (_LT_ENABLE_LOCK): Support x32. - -2012-04-06 Anthony Green - - * testsuite/Makefile.am (EXTRA_DIST): Add missing test cases. - * testsuite/Makefile.in: Rebuilt. - -2012-04-05 Zachary Waldowski - - * include/ffi.h.in: Add missing trampoline table fields. - * src/arm/sysv.S: Fix ENTRY definition, and wrap symbol references - in CNAME. - * src/x86/ffi.c: Wrap Windows specific code in ifdefs. - -2012-04-02 Peter Bergner - - * src/powerpc/ffi.c (ffi_prep_args_SYSV): Declare double_tmp. - Silence casting pointer to integer of different size warning. - Delete goto to previously deleted label. - (ffi_call): Silence possibly undefined warning. - (ffi_closure_helper_SYSV): Declare variable type. - -2012-04-02 Peter Rosin - - * src/x86/win32.S (ffi_call_win32): Sign/zero extend the return - value in the Intel version as is already done for the AT&T version. - (ffi_closure_SYSV): Likewise. - (ffi_closure_raw_SYSV): Likewise. - (ffi_closure_STDCALL): Likewise. - -2012-03-29 Peter Rosin - - * src/x86/win32.S (ffi_closure_raw_THISCALL): Unify the frame - generation, fix the ENDP label and remove the surplus third arg - from the 'lea' insn. - -2012-03-29 Peter Rosin - - * src/x86/win32.S (ffi_closure_raw_SYSV): Make the 'stubraw' label - visible outside the PROC, so that ffi_closure_raw_THISCALL can see - it. Also instruct the assembler to add a frame to the function. - -2012-03-23 Peter Rosin - - * Makefile.am (AM_CPPFLAGS): Add -DFFI_BUILDING. - * Makefile.in: Rebuilt. - * include/ffi.h.in [MSVC]: Add __declspec(dllimport) decorations - to all data exports, when compiling libffi clients using MSVC. - -2012-03-29 Peter Rosin - - * src/x86/ffitarget.h (ffi_abi): Add new ABI FFI_MS_CDECL and - make it the default for MSVC. - (FFI_TYPE_MS_STRUCT): New structure return convention. - * src/x86/ffi.c (ffi_prep_cif_machdep): Tweak the structure - return convention for FFI_MS_CDECL to be FFI_TYPE_MS_STRUCT - instead of an ordinary FFI_TYPE_STRUCT. - (ffi_prep_args): Treat FFI_TYPE_MS_STRUCT as FFI_TYPE_STRUCT. - (ffi_call): Likewise. - (ffi_prep_incoming_args_SYSV): Likewise. - (ffi_raw_call): Likewise. - (ffi_prep_closure_loc): Treat FFI_MS_CDECL as FFI_SYSV. - * src/x86/win32.S (ffi_closure_SYSV): For FFI_TYPE_MS_STRUCT, - return a pointer to the result structure in eax and don't pop - that pointer from the stack, the caller takes care of it. - (ffi_call_win32): Treat FFI_TYPE_MS_STRUCT as FFI_TYPE_STRUCT. - (ffi_closure_raw_SYSV): Likewise. - -2012-03-22 Peter Rosin - - * testsuite/libffi.call/closure_stdcall.c [MSVC]: Add inline - assembly version with Intel syntax. - * testsuite/libffi.call/closure_thiscall.c [MSVC]: Likewise. - -2012-03-23 Peter Rosin - - * testsuite/libffi.call/ffitest.h: Provide abstration of - __attribute__((fastcall)) in the form of a __FASTCALL__ - define. Define it to __fastcall for MSVC. - * testsuite/libffi.call/fastthis1_win32.c: Use the above. - * testsuite/libffi.call/fastthis2_win32.c: Likewise. - * testsuite/libffi.call/fastthis3_win32.c: Likewise. - * testsuite/libffi.call/strlen2_win32.c: Likewise. - * testsuite/libffi.call/struct1_win32.c: Likewise. - * testsuite/libffi.call/struct2_win32.c: Likewise. - -2012-03-22 Peter Rosin - - * src/x86/win32.S [MSVC] (ffi_closure_THISCALL): Remove the manual - frame on function entry, MASM adds one automatically. - -2012-03-22 Peter Rosin - - * testsuite/libffi.call/ffitest.h [MSVC]: Add kludge for missing - bits in the MSVC headers. - -2012-03-22 Peter Rosin - - * testsuite/libffi.call/cls_12byte.c: Adjust to the C89 style - with no declarations after statements. - * testsuite/libffi.call/cls_16byte.c: Likewise. - * testsuite/libffi.call/cls_18byte.c: Likewise. - * testsuite/libffi.call/cls_19byte.c: Likewise. - * testsuite/libffi.call/cls_1_1byte.c: Likewise. - * testsuite/libffi.call/cls_20byte.c: Likewise. - * testsuite/libffi.call/cls_20byte1.c: Likewise. - * testsuite/libffi.call/cls_24byte.c: Likewise. - * testsuite/libffi.call/cls_2byte.c: Likewise. - * testsuite/libffi.call/cls_3_1byte.c: Likewise. - * testsuite/libffi.call/cls_3byte1.c: Likewise. - * testsuite/libffi.call/cls_3byte2.c: Likewise. - * testsuite/libffi.call/cls_4_1byte.c: Likewise. - * testsuite/libffi.call/cls_4byte.c: Likewise. - * testsuite/libffi.call/cls_5_1_byte.c: Likewise. - * testsuite/libffi.call/cls_5byte.c: Likewise. - * testsuite/libffi.call/cls_64byte.c: Likewise. - * testsuite/libffi.call/cls_6_1_byte.c: Likewise. - * testsuite/libffi.call/cls_6byte.c: Likewise. - * testsuite/libffi.call/cls_7_1_byte.c: Likewise. - * testsuite/libffi.call/cls_7byte.c: Likewise. - * testsuite/libffi.call/cls_8byte.c: Likewise. - * testsuite/libffi.call/cls_9byte1.c: Likewise. - * testsuite/libffi.call/cls_9byte2.c: Likewise. - * testsuite/libffi.call/cls_align_double.c: Likewise. - * testsuite/libffi.call/cls_align_float.c: Likewise. - * testsuite/libffi.call/cls_align_longdouble.c: Likewise. - * testsuite/libffi.call/cls_align_longdouble_split.c: Likewise. - * testsuite/libffi.call/cls_align_longdouble_split2.c: Likewise. - * testsuite/libffi.call/cls_align_pointer.c: Likewise. - * testsuite/libffi.call/cls_align_sint16.c: Likewise. - * testsuite/libffi.call/cls_align_sint32.c: Likewise. - * testsuite/libffi.call/cls_align_sint64.c: Likewise. - * testsuite/libffi.call/cls_align_uint16.c: Likewise. - * testsuite/libffi.call/cls_align_uint32.c: Likewise. - * testsuite/libffi.call/cls_align_uint64.c: Likewise. - * testsuite/libffi.call/cls_dbls_struct.c: Likewise. - * testsuite/libffi.call/cls_pointer_stack.c: Likewise. - * testsuite/libffi.call/err_bad_typedef.c: Likewise. - * testsuite/libffi.call/huge_struct.c: Likewise. - * testsuite/libffi.call/nested_struct.c: Likewise. - * testsuite/libffi.call/nested_struct1.c: Likewise. - * testsuite/libffi.call/nested_struct10.c: Likewise. - * testsuite/libffi.call/nested_struct2.c: Likewise. - * testsuite/libffi.call/nested_struct3.c: Likewise. - * testsuite/libffi.call/nested_struct4.c: Likewise. - * testsuite/libffi.call/nested_struct5.c: Likewise. - * testsuite/libffi.call/nested_struct6.c: Likewise. - * testsuite/libffi.call/nested_struct7.c: Likewise. - * testsuite/libffi.call/nested_struct8.c: Likewise. - * testsuite/libffi.call/nested_struct9.c: Likewise. - * testsuite/libffi.call/stret_large.c: Likewise. - * testsuite/libffi.call/stret_large2.c: Likewise. - * testsuite/libffi.call/stret_medium.c: Likewise. - * testsuite/libffi.call/stret_medium2.c: Likewise. - * testsuite/libffi.call/struct1.c: Likewise. - * testsuite/libffi.call/struct1_win32.c: Likewise. - * testsuite/libffi.call/struct2.c: Likewise. - * testsuite/libffi.call/struct2_win32.c: Likewise. - * testsuite/libffi.call/struct3.c: Likewise. - * testsuite/libffi.call/struct4.c: Likewise. - * testsuite/libffi.call/struct5.c: Likewise. - * testsuite/libffi.call/struct6.c: Likewise. - * testsuite/libffi.call/struct7.c: Likewise. - * testsuite/libffi.call/struct8.c: Likewise. - * testsuite/libffi.call/struct9.c: Likewise. - * testsuite/libffi.call/testclosure.c: Likewise. - -2012-03-21 Peter Rosin - - * testsuite/libffi.call/float_va.c (float_va_fn): Use %f when - printing doubles (%lf is for long doubles). - (main): Likewise. - -2012-03-21 Peter Rosin - - * testsuite/lib/target-libpath.exp [*-*-cygwin*, *-*-mingw*] - (set_ld_library_path_env_vars): Add the library search dir to PATH - (and save PATH for later). - (restore_ld_library_path_env_vars): Restore PATH. - -2012-03-21 Peter Rosin - - * testsuite/lib/target-libpath.exp [*-*-cygwin*, *-*-mingw*] - (set_ld_library_path_env_vars): Add the library search dir to PATH - (and save PATH for later). - (restore_ld_library_path_env_vars): Restore PATH. - -2012-03-20 Peter Rosin - - * testsuite/libffi.call/strlen2_win32.c (main): Remove bug. - * src/x86/win32.S [MSVC] (ffi_closure_SYSV): Make the 'stub' label - visible outside the PROC, so that ffi_closure_THISCALL can see it. - -2012-03-20 Peter Rosin - - * testsuite/libffi.call/strlen2_win32.c (main): Remove bug. - * src/x86/win32.S [MSVC] (ffi_closure_SYSV): Make the 'stub' label - visible outside the PROC, so that ffi_closure_THISCALL can see it. - -2012-03-19 Alan Hourihane - - * src/m68k/ffi.c: Add MINT support. - * src/m68k/sysv.S: Ditto. - -2012-03-06 Chung-Lin Tang - - * src/arm/ffi.c (ffi_call): Add __ARM_EABI__ guard around call to - ffi_call_VFP(). - (ffi_prep_closure_loc): Add __ARM_EABI__ guard around use of - ffi_closure_VFP. - * src/arm/sysv.S: Add __ARM_EABI__ guard around VFP code. - -2012-03-19 chennam - - * src/powerpc/ffi_darwin.c (ffi_prep_closure_loc): Fix AIX closure - support. - -2012-03-13 Kaz Kojima - - * src/sh/ffi.c (ffi_prep_closure_loc): Don't ASSERT ABI test, - just return FFI_BAD_ABI when things are wrong. - * src/sh64/ffi.c (ffi_prep_closure_loc): Ditto. - -2012-03-09 David Edelsohn - - * src/powerpc/aix_closure.S (ffi_closure_ASM): Adjust for Darwin64 - change to return value of ffi_closure_helper_DARWIN and load type - from return type. - -2012-03-03 H.J. Lu - - * src/x86/ffi64.c (ffi_call): Cast the return value to unsigned - long. - (ffi_prep_closure_loc): Cast to 64bit address in trampoline. - (ffi_closure_unix64_inner): Cast return pointer to unsigned long - first. - - * src/x86/ffitarget.h (FFI_SIZEOF_ARG): Defined to 8 for x32. - (ffi_arg): Set to unsigned long long for x32. - (ffi_sarg): Set to long long for x32. - -2012-03-03 H.J. Lu - - * src/prep_cif.c (ffi_prep_cif_core): Properly check bad ABI. - -2012-03-03 Andoni Morales Alastruey - - * configure.ac: Add -no-undefined for both 32- and 64-bit x86 - windows-like hosts. - * configure: Rebuilt. - -2012-02-27 Mikael Pettersson - - PR libffi/52223 - * Makefile.am (FLAGS_TO_PASS): Define. - * Makefile.in: Regenerate. - -2012-02-23 Anthony Green - - * src/*/ffitarget.h: Ensure that users never include ffitarget.h - directly. - -2012-02-23 Kai Tietz - - PR libffi/52221 - * src/x86/ffi.c (ffi_closure_raw_THISCALL): New - prototype. - (ffi_prep_raw_closure_loc): Use ffi_closure_raw_THISCALL for - thiscall-convention. - (ffi_raw_call): Use ffi_prep_args_raw. - * src/x86/win32.S (ffi_closure_raw_THISCALL): Add - implementation for stub. - -2012-02-10 Kai Tietz - - * configure.ac (AM_LTLDFLAGS): Add -no-undefine for x64 - windows target. - * configure: Regenerated. - -2012-02-08 Kai Tietz - - * src/prep_cif.c (ffi_prep_cif): Allow for X86_WIN32 - also FFI_THISCALL. - * src/x86/ffi.c (ffi_closure_THISCALL): Add prototype. - (FFI_INIT_TRAMPOLINE_THISCALL): New trampoline code. - (ffi_prep_closure_loc): Add FFI_THISCALL support. - * src/x86/ffitarget.h (FFI_TRAMPOLINE_SIZE): Adjust size. - * src/x86/win32.S (ffi_closure_THISCALL): New closure code - for thiscall-calling convention. - * testsuite/libffi.call/closure_thiscall.c: New test. - -2012-01-28 Kai Tietz - - * src/libffi/src/x86/ffi.c (ffi_call_win32): Add new - argument to prototype for specify calling-convention. - (ffi_call): Add support for stdcall/thiscall convention. - (ffi_prep_args): Likewise. - (ffi_raw_call): Likewise. - * src/x86/ffitarget.h (ffi_abi): Add FFI_THISCALL and - FFI_FASTCALL. - * src/x86/win32.S (_ffi_call_win32): Add support for - fastcall/thiscall calling-convention calls. - * testsuite/libffi.call/fastthis1_win32.c: New test. - * testsuite/libffi.call/fastthis2_win32.c: New test. - * testsuite/libffi.call/fastthis3_win32.c: New test. - * testsuite/libffi.call/strlen2_win32.c: New test. - * testsuite/libffi.call/many2_win32.c: New test. - * testsuite/libffi.call/struct1_win32.c: New test. - * testsuite/libffi.call/struct2_win32.c: New test. - -2012-01-23 Uros Bizjak - - * src/alpha/ffi.c (ffi_prep_closure_loc): Check for bad ABI. - -2012-01-23 Anthony Green - Chris Young - - * configure.ac: Add Amiga support. - * configure: Rebuilt. - -2012-01-23 Dmitry Nadezhin - - * include/ffi_common.h (LIKELY, UNLIKELY): Fix definitions. - -2012-01-23 Andreas Schwab - - * src/m68k/sysv.S (ffi_call_SYSV): Properly test for plain - mc68000. Test for __HAVE_68881__ in addition to __MC68881__. - -2012-01-19 Jakub Jelinek - - PR rtl-optimization/48496 - * src/ia64/ffi.c (ffi_call): Fix up aliasing violations. - -2012-01-09 Rainer Orth - - * configure.ac (i?86-*-*): Set TARGET to X86_64. - * configure: Regenerate. - -2011-12-07 Andrew Pinski - - PR libffi/50051 - * src/mips/n32.S: Add ".set mips4". - -2011-11-21 Andreas Tobler - - * configure: Regenerate. - -2011-11-12 David Gilbert - - * doc/libffi.texi, include/ffi.h.in, include/ffi_common.h, - man/Makefile.am, man/ffi.3, man/ffi_prep_cif.3, - man/ffi_prep_cif_var.3, src/arm/ffi.c, src/arm/ffitarget.h, - src/cris/ffi.c, src/prep_cif.c, - testsuite/libffi.call/cls_double_va.c, - testsuite/libffi.call/cls_longdouble_va.c, - testsuite/libffi.call/float_va.c: Many changes to support variadic - function calls. - -2011-11-12 Kyle Moffett - - * src/powerpc/ffi.c, src/powerpc/ffitarget.h, - src/powerpc/ppc_closure.S, src/powerpc/sysv.S: Many changes for - softfloat powerpc variants. - -2011-11-12 Petr Salinger - - * configure.ac (FFI_EXEC_TRAMPOLINE_TABLE): Fix kfreebsd support. - * configure: Rebuilt. - -2011-11-12 Timothy Wall - - * src/arm/ffi.c (ffi_prep_args, ffi_prep_incoming_args_SYSV): Max - alignment of 4 for wince on ARM. - -2011-11-12 Kyle Moffett - Anthony Green - - * src/ppc/sysv.S, src/ppc/ffi.c: Remove use of ppc string - instructions (not available on some cores, like the PPC440). - -2011-11-12 Kimura Wataru - - * m4/ax_enable_builddir: Change from string comparison to numeric - comparison for wc output. - * configure.ac: Enable FFI_MMAP_EXEC_WRIT for darwin11 aka Mac OS - X 10.7. - * configure: Rebuilt. - -2011-11-12 Anthony Green - - * Makefile.am (AM_CCASFLAGS): Add -g option to build assembly - files with debug info. - * Makefile.in: Rebuilt. - -2011-11-12 Jasper Lievisse Adriaanse - - * README: Update list of supported OpenBSD systems. - -2011-11-12 Anthony Green - - * libtool-version: Update. - * Makefile.am (nodist_libffi_la_SOURCES): Add src/debug.c if - FFI_DEBUG. - (libffi_la_SOURCES): Remove src/debug.c - (EXTRA_DIST): Add src/debug.c - * Makefile.in: Rebuilt. - * README: Update for 3.0.11. - -2011-11-10 Richard Henderson - - * configure.ac (GCC_AS_CFI_PSEUDO_OP): Use it instead of inline check. - * configure, aclocal.m4: Rebuild. - -2011-09-04 Iain Sandoe - - PR libffi/49594 - * src/powerpc/darwin_closure.S (stubs): Make the stub binding - helper reference track the architecture pointer size. - -2011-08-25 Andrew Haley - - * src/arm/ffi.c (FFI_INIT_TRAMPOLINE): Remove hard-coded assembly - instructions. - * src/arm/sysv.S (ffi_arm_trampoline): Put them here instead. - -2011-07-11 Andrew Haley - - * src/arm/ffi.c (FFI_INIT_TRAMPOLINE): Clear icache. - -2011-06-29 Rainer Orth - - * testsuite/libffi.call/cls_double_va.c: Move PR number to comment. - * testsuite/libffi.call/cls_longdouble_va.c: Likewise. - -2011-06-29 Rainer Orth - - PR libffi/46660 - * testsuite/libffi.call/cls_double_va.c: xfail dg-output on - mips-sgi-irix6*. - * testsuite/libffi.call/cls_longdouble_va.c: Likewise. - -2011-06-14 Rainer Orth - - * testsuite/libffi.call/huge_struct.c (test_large_fn): Use PRIu8, - PRId8 instead of %hhu, %hhd. - * testsuite/libffi.call/ffitest.h [__alpha__ && __osf__] (PRId8, - PRIu8): Define. - [__sgi__] (PRId8, PRIu8): Define. - -2011-04-29 Rainer Orth - - * src/alpha/osf.S (UA_SI, FDE_ENCODING, FDE_ENCODE, FDE_ARANGE): - Define. - Use them to handle ELF vs. ECOFF differences. - [__osf__] (_GLOBAL__F_ffi_call_osf): Define. - -2011-03-30 Timothy Wall - - * src/powerpc/darwin.S: Fix unknown FDE encoding. - * src/powerpc/darwin_closure.S: ditto. - -2011-02-25 Anthony Green - - * src/powerpc/ffi.c (ffi_prep_closure_loc): Allow for more - 32-bit ABIs. - -2011-02-15 Anthony Green - - * m4/ax_cc_maxopt.m4: Don't -malign-double or use -ffast-math. - * configure: Rebuilt. - -2011-02-13 Ralf Wildenhues - - * configure: Regenerate. - -2011-02-13 Anthony Green - - * include/ffi_common.h (UNLIKELY, LIKELY): Define. - * src/x86/ffi64.c (UNLIKELY, LIKELY): Remove definition. - * src/prep_cif.c (UNLIKELY, LIKELY): Remove definition. - - * src/prep_cif.c (initialize_aggregate): Convert assertion into - FFI_BAD_TYPEDEF return. Initialize arg size and alignment to 0. - - * src/pa/ffi.c (ffi_prep_closure_loc): Don't ASSERT ABI test, - just return FFI_BAD_ABI when things are wrong. - * src/arm/ffi.c (ffi_prep_closure_loc): Ditto. - * src/powerpc/ffi.c (ffi_prep_closure_loc): Ditto. - * src/mips/ffi.c (ffi_prep_closure_loc): Ditto. - * src/ia64/ffi.c (ffi_prep_closure_loc): Ditto. - * src/avr32/ffi.c (ffi_prep_closure_loc): Ditto. - -2011-02-11 Anthony Green - - * src/sparc/ffi.c (ffi_prep_closure_loc): Don't ASSERT ABI test, - just return FFI_BAD_ABI when things are wrong. - -2012-02-11 Eric Botcazou - - * src/sparc/v9.S (STACKFRAME): Bump to 176. - -2011-02-09 Stuart Shelton - - http://bugs.gentoo.org/show_bug.cgi?id=286911 - * src/mips/ffitarget.h: Clean up error messages. - * src/java_raw_api.c (ffi_java_translate_args): Cast raw arg to - ffi_raw*. - * include/ffi.h.in: Add pragma for SGI compiler. - -2011-02-09 Anthony Green - - * configure.ac: Add powerpc64-*-darwin* support. - -2011-02-09 Anthony Green - - * README: Mention Interix. - -2011-02-09 Jonathan Callen - - * configure.ac: Add Interix to win32/cygwin/mingw case. - * configure: Ditto. - * src/closures.c: Treat Interix like Cygwin, instead of as a - generic win32. - -2011-02-09 Anthony Green - - * testsuite/libffi.call/err_bad_typedef.c: Remove xfail. - * testsuite/libffi.call/err_bad_abi.c: Remove xfail. - * src/x86/ffi64.c (UNLIKELY, LIKELY): Define. - (ffi_prep_closure_loc): Check for bad ABI. - * src/prep_cif.c (UNLIKELY, LIKELY): Define. - (initialize_aggregate): Check for bad types. - -2011-02-09 Landon Fuller - - * Makefile.am (EXTRA_DIST): Add build-ios.sh, src/arm/gentramp.sh, - src/arm/trampoline.S. - (nodist_libffi_la_SOURCES): Add src/arc/trampoline.S. - * configure.ac (FFI_EXEC_TRAMPOLINE_TABLE): Define. - * src/arm/ffi.c (ffi_trampoline_table) - (ffi_closure_trampoline_table_page, ffi_trampoline_table_entry) - (FFI_TRAMPOLINE_CODELOC_CONFIG, FFI_TRAMPOLINE_CONFIG_PAGE_OFFSET) - (FFI_TRAMPOLINE_COUNT, ffi_trampoline_lock, ffi_trampoline_tables) - (ffi_trampoline_table_alloc, ffi_closure_alloc, ffi_closure_free): - Define for FFI_EXEC_TRAMPOLINE_TABLE case (iOS). - (ffi_prep_closure_loc): Handl FFI_EXEC_TRAMPOLINE_TABLE case - separately. - * src/arm/sysv.S: Handle Apple iOS host. - * src/closures.c: Handle FFI_EXEC_TRAMPOLINE_TABLE case. - * build-ios.sh: New file. - * fficonfig.h.in, configure, Makefile.in: Rebuilt. - * README: Mention ARM iOS. - -2011-02-08 Oren Held - - * src/dlmalloc.c (_STRUCT_MALLINFO): Define in order to avoid - redefinition of mallinfo on HP-UX. - -2011-02-08 Ginn Chen - - * src/sparc/ffi.c (ffi_call): Make compatible with Solaris Studio - aggregate return ABI. Flush cache. - (ffi_prep_closure_loc): Flush cache. - -2011-02-11 Anthony Green - - From Tom Honermann : - * src/powerpc/aix.S (ffi_call_AIX): Support for xlc toolchain on - AIX. Declare .ffi_prep_args. Insert nops after branch - instructions so that the AIX linker can insert TOC reload - instructions. - * src/powerpc/aix_closure.S: Declare .ffi_closure_helper_DARWIN. - -2011-02-08 Ed - - * src/powerpc/asm.h: Fix grammar nit in comment. - -2011-02-08 Uli Link - - * include/ffi.h.in (FFI_64_BIT_MAX): Define and use. - -2011-02-09 Rainer Orth - - PR libffi/46661 - * testsuite/libffi.call/cls_pointer.c (main): Cast void * to - uintptr_t first. - * testsuite/libffi.call/cls_pointer_stack.c (main): Likewise. - -2011-02-08 Rafael Avila de Espindola - - * configure.ac: Fix x86 test for pc related relocs. - * configure: Rebuilt. - -2011-02-07 Joel Sherrill - - * libffi/src/m68k/ffi.c: Add RTEMS support for cache flushing. - Handle case when CPU variant does not have long double support. - * libffi/src/m68k/sysv.S: Add support for mc68000, Coldfire, - and cores with soft floating point. - -2011-02-07 Joel Sherrill - - * configure.ac: Add mips*-*-rtems* support. - * configure: Regenerate. - * src/mips/ffitarget.h: Ensure needed constants are available - for targets which do not have sgidefs.h. - -2011-01-26 Dave Korn - - PR target/40125 - * configure.ac (AM_LTLDFLAGS): Add -bindir option for windows DLLs. - * configure: Regenerate. - -2010-12-18 Iain Sandoe - - PR libffi/29152 - PR libffi/42378 - * src/powerpc/darwin_closure.S: Provide Darwin64 implementation, - update comments. - * src/powerpc/ffitarget.h (POWERPC_DARWIN64): New, - (FFI_TRAMPOLINE_SIZE): Update for Darwin64. - * src/powerpc/darwin.S: Provide Darwin64 implementation, - update comments. - * src/powerpc/ffi_darwin.c: Likewise. - -2010-12-06 Rainer Orth - - * configure.ac (libffi_cv_as_ascii_pseudo_op): Use double - backslashes. - (libffi_cv_as_string_pseudo_op): Likewise. - * configure: Regenerate. - -2010-12-03 Chung-Lin Tang - - * src/arm/sysv.S (ffi_closure_SYSV): Add UNWIND to .pad directive. - (ffi_closure_VFP): Same. - (ffi_call_VFP): Move down to before ffi_closure_VFP. Add '.fpu vfp' - directive. - -2010-12-01 Rainer Orth - - * testsuite/libffi.call/ffitest.h [__sgi] (PRId64, PRIu64): Define. - (PRIuPTR): Define. - -2010-11-29 Richard Henderson - Rainer Orth - - * src/x86/sysv.S (FDE_ENCODING, FDE_ENCODE): Define. - (.eh_frame): Use FDE_ENCODING. - (.LASFDE1, .LASFDE2, LASFDE3): Simplify with FDE_ENCODE. - -2010-11-22 Jacek Caban - - * configure.ac: Check for symbol underscores on mingw-w64. - * configure: Rebuilt. - * src/x86/win64.S: Correctly access extern symbols in respect to - underscores. - -2010-11-15 Rainer Orth - - * testsuite/lib/libffi-dg.exp: Rename ... - * testsuite/lib/libffi.exp: ... to this. - * libffi/testsuite/libffi.call/call.exp: Don't load libffi-dg.exp. - * libffi/testsuite/libffi.special/special.exp: Likewise. - -2010-10-28 Chung-Lin Tang - - * src/arm/ffi.c (ffi_prep_args): Add VFP register argument handling - code, new parameter, and return value. Update comments. - (ffi_prep_cif_machdep): Add case for VFP struct return values. Add - call to layout_vfp_args(). - (ffi_call_SYSV): Update declaration. - (ffi_call_VFP): New declaration. - (ffi_call): Add VFP struct return conditions. Call ffi_call_VFP() - when ABI is FFI_VFP. - (ffi_closure_VFP): New declaration. - (ffi_closure_SYSV_inner): Add new vfp_args parameter, update call to - ffi_prep_incoming_args_SYSV(). - (ffi_prep_incoming_args_SYSV): Update parameters. Add VFP argument - case handling. - (ffi_prep_closure_loc): Pass ffi_closure_VFP to trampoline - construction under VFP hard-float. - (rec_vfp_type_p): New function. - (vfp_type_p): Same. - (place_vfp_arg): Same. - (layout_vfp_args): Same. - * src/arm/ffitarget.h (ffi_abi): Add FFI_VFP. Define FFI_DEFAULT_ABI - based on __ARM_PCS_VFP. - (FFI_EXTRA_CIF_FIELDS): Define for adding VFP hard-float specific - fields. - (FFI_TYPE_STRUCT_VFP_FLOAT): Define internally used type code. - (FFI_TYPE_STRUCT_VFP_DOUBLE): Same. - * src/arm/sysv.S (ffi_call_SYSV): Change call of ffi_prep_args() to - direct call. Move function pointer load upwards. - (ffi_call_VFP): New function. - (ffi_closure_VFP): Same. - - * testsuite/lib/libffi-dg.exp (check-flags): New function. - (dg-skip-if): New function. - * testsuite/libffi.call/cls_double_va.c: Skip if target is arm*-*-* - and compiler options include -mfloat-abi=hard. - * testsuite/libffi.call/cls_longdouble_va.c: Same. - -2010-10-01 Jakub Jelinek - - PR libffi/45677 - * src/x86/ffi64.c (ffi_prep_cif_machdep): Ensure cif->bytes is - a multiple of 8. - * testsuite/libffi.call/many2.c: New test. - -2010-08-20 Mark Wielaard - - * src/closures.c (open_temp_exec_file_mnt): Check if getmntent_r - returns NULL. - -2010-08-09 Andreas Tobler - - * configure.ac: Add target powerpc64-*-freebsd*. - * configure: Regenerate. - * testsuite/libffi.call/cls_align_longdouble_split.c: Pass - -mlong-double-128 only to linux targets. - * testsuite/libffi.call/cls_align_longdouble_split2.c: Likewise. - * testsuite/libffi.call/cls_longdouble.c: Likewise. - * testsuite/libffi.call/huge_struct.c: Likewise. - -2010-08-05 Dan Witte - - * Makefile.am: Pass FFI_DEBUG define to msvcc.sh for linking to the - debug CRT when --enable-debug is given. - * configure.ac: Define it. - * msvcc.sh: Translate -g and -DFFI_DEBUG appropriately. - -2010-08-04 Dan Witte - - * src/x86/ffitarget.h: Add X86_ANY define for all x86/x86_64 - platforms. - * src/x86/ffi.c: Remove redundant ifdef checks. - * src/prep_cif.c: Push stack space computation into src/x86/ffi.c - for X86_ANY so return value space doesn't get added twice. - -2010-08-03 Neil Rashbrooke - - * msvcc.sh: Don't pass -safeseh to ml64 because behavior is buggy. - -2010-07-22 Dan Witte - - * src/*/ffitarget.h: Make FFI_LAST_ABI one past the last valid ABI. - * src/prep_cif.c: Fix ABI assertion. - * src/cris/ffi.c: Ditto. - -2010-07-10 Evan Phoenix - - * src/closures.c (selinux_enabled_check): Fix strncmp usage bug. - -2010-07-07 Dan Horák - - * include/ffi.h.in: Protect #define with #ifndef. - * src/powerpc/ffitarget.h: Ditto. - * src/s390/ffitarget.h: Ditto. - * src/sparc/ffitarget.h: Ditto. - -2010-07-07 Neil Roberts - - * src/x86/sysv.S (ffi_call_SYSV): Align the stack pointer to - 16-bytes. - -2010-07-02 Jakub Jelinek - - * Makefile.am (AM_MAKEFLAGS): Pass also mandir to submakes. - * Makefile.in: Regenerated. - -2010-05-19 Rainer Orth - - * configure.ac (libffi_cv_as_x86_pcrel): Check for illegal in as - output, too. - (libffi_cv_as_ascii_pseudo_op): Check for .ascii. - (libffi_cv_as_string_pseudo_op): Check for .string. - * configure: Regenerate. - * fficonfig.h.in: Regenerate. - * src/x86/sysv.S (.eh_frame): Use .ascii, .string or error. - -2010-05-11 Dan Witte - - * doc/libffi.tex: Document previous change. - -2010-05-11 Makoto Kato - - * src/x86/ffi.c (ffi_call): Don't copy structs passed by value. - -2010-05-05 Michael Kohler - - * src/dlmalloc.c (dlfree): Fix spelling. - * src/ia64/ffi.c (ffi_prep_cif_machdep): Ditto. - * configure.ac: Ditto. - * configure: Rebuilt. - -2010-04-13 Dan Witte - - * msvcc.sh: Build with -W3 instead of -Wall. - * src/powerpc/ffi_darwin.c: Remove build warnings. - * src/x86/ffi.c: Ditto. - * src/x86/ffitarget.h: Ditto. - -2010-04-12 Dan Witte - Walter Meinl - - * configure.ac: Add OS/2 support. - * configure: Rebuilt. - * src/closures.c: Ditto. - * src/dlmalloc.c: Ditto. - * src/x86/win32.S: Ditto. - -2010-04-07 Jakub Jelinek - - * testsuite/libffi.call/err_bad_abi.c: Remove unused args variable. - -2010-04-02 Ralf Wildenhues - - * Makefile.in: Regenerate. - * aclocal.m4: Regenerate. - * include/Makefile.in: Regenerate. - * man/Makefile.in: Regenerate. - * testsuite/Makefile.in: Regenerate. - -2010-03-30 Dan Witte - - * msvcc.sh: Disable build warnings. - * README (tested): Clarify windows build procedure. - -2010-03-15 Rainer Orth - - * configure.ac (libffi_cv_as_x86_64_unwind_section_type): New test. - * configure: Regenerate. - * fficonfig.h.in: Regenerate. - * libffi/src/x86/unix64.S (.eh_frame) - [HAVE_AS_X86_64_UNWIND_SECTION_TYPE]: Use @unwind section type. - -2010-03-14 Matthias Klose - - * src/x86/ffi64.c: Fix typo in comment. - * src/x86/ffi.c: Use /* ... */ comment style. - -2010-02-24 Rainer Orth - - * doc/libffi.texi (The Closure API): Fix typo. - * doc/libffi.info: Remove. - -2010-02-15 Matthias Klose - - * src/arm/sysv.S (__ARM_ARCH__): Define for processor - __ARM_ARCH_7EM__. - -2010-01-15 Anthony Green - - * README: Add notes on building with Microsoft Visual C++. - -2010-01-15 Daniel Witte - - * msvcc.sh: New file. - - * src/x86/win32.S: Port assembly routines to MSVC and #ifdef. - * src/x86/ffi.c: Tweak function declaration and remove excess - parens. - * include/ffi.h.in: Add __declspec(align(8)) to typedef struct - ffi_closure. - - * src/x86/ffi.c: Merge ffi_call_SYSV and ffi_call_STDCALL into new - function ffi_call_win32 on X86_WIN32. - * src/x86/win32.S (ffi_call_SYSV): Rename to ffi_call_win32. - (ffi_call_STDCALL): Remove. - - * src/prep_cif.c (ffi_prep_cif): Move stack space allocation code - to ffi_prep_cif_machdep for x86. - * src/x86/ffi.c (ffi_prep_cif_machdep): To here. - -2010-01-15 Oliver Kiddle - - * src/x86/ffitarget.h (ffi_abi): Check for __i386 and __amd64 for - Sun Studio compiler compatibility. - -2010-01-12 Conrad Irwin - - * doc/libffi.texi: Add closure example. - -2010-01-07 Rainer Orth - - PR libffi/40701 - * testsuite/libffi.call/ffitest.h [__alpha__ && __osf__] (PRIdLL, - PRIuLL, PRId64, PRIu64, PRIuPTR): Define. - * testsuite/libffi.call/cls_align_sint64.c: Add -Wno-format on - alpha*-dec-osf*. - * testsuite/libffi.call/cls_align_uint64.c: Likewise. - * testsuite/libffi.call/cls_ulonglong.c: Likewise. - * testsuite/libffi.call/return_ll1.c: Likewise. - * testsuite/libffi.call/stret_medium2.c: Likewise. - * testsuite/libffi.special/ffitestcxx.h (allocate_mmap): Cast - MAP_FAILED to char *. - -2010-01-06 Rainer Orth - - * src/mips/n32.S: Use .abicalls and .eh_frame with __GNUC__. - -2009-12-31 Anthony Green - - * README: Update for libffi 3.0.9. - -2009-12-27 Matthias Klose - - * configure.ac (HAVE_LONG_DOUBLE): Define for mips when - appropriate. - * configure: Rebuilt. - -2009-12-26 Anthony Green - - * testsuite/libffi.call/cls_longdouble_va.c: Mark as xfail for - avr32*-*-*. - * testsuite/libffi.call/cls_double_va.c: Ditto. - -2009-12-26 Andreas Tobler - - * testsuite/libffi.call/ffitest.h: Conditionally include stdint.h - and inttypes.h. - * testsuite/libffi.special/unwindtest.cc: Ditto. - -2009-12-26 Andreas Tobler - - * configure.ac: Add amd64-*-openbsd*. - * configure: Rebuilt. - * testsuite/lib/libffi-dg.exp (libffi_target_compile): Link - openbsd programs with -lpthread. - -2009-12-26 Anthony Green - - * testsuite/libffi.call/cls_double_va.c, - testsuite/libffi.call/cls_longdouble.c, - testsuite/libffi.call/cls_longdouble_va.c, - testsuite/libffi.call/cls_pointer.c, - testsuite/libffi.call/cls_pointer_stack.c: Remove xfail for - mips*-*-* and arm*-*-*. - * testsuite/libffi.call/cls_align_longdouble_split.c, - testsuite/libffi.call/cls_align_longdouble_split2.c, - testsuite/libffi.call/stret_medium2.c, - testsuite/libffi.call/stret_medium.c, - testsuite/libffi.call/stret_large.c, - testsuite/libffi.call/stret_large2.c: Remove xfail for arm*-*-*. - -2009-12-31 Kay Tietz - - * testsuite/libffi.call/ffitest.h, - testsuite/libffi.special/ffitestcxx.h (PRIdLL, PRuLL): Fix - definitions. - -2009-12-31 Carlo Bramini - - * configure.ac (AM_LTLDFLAGS): Define for windows hosts. - * Makefile.am (libffi_la_LDFLAGS): Add AM_LTLDFLAGS. - * configure: Rebuilt. - * Makefile.in: Rebuilt. - -2009-12-31 Anthony Green - Blake Chaffin. - - * testsuite/libffi.call/huge_struct.c: New test case from Blake - Chaffin @ Apple. - -2009-12-28 David Edelsohn - - * src/powerpc/ffi_darwin.c (ffi_prep_args): Copy abi and nargs to - local variables. - (aix_adjust_aggregate_sizes): New function. - (ffi_prep_cif_machdep): Call it. - -2009-12-26 Andreas Tobler - - * configure.ac: Define FFI_MMAP_EXEC_WRIT for the given targets. - * configure: Regenerate. - * fficonfig.h.in: Likewise. - * src/closures.c: Remove the FFI_MMAP_EXEC_WRIT definition for - Solaris/x86. - -2009-12-26 Andreas Schwab - - * src/powerpc/ffi.c (ffi_prep_args_SYSV): Advance intarg_count - when a float arguments is passed in memory. - (ffi_closure_helper_SYSV): Mark general registers as used up when - a 64bit or soft-float long double argument is passed in memory. - -2009-12-25 Matthias Klose - - * man/ffi_call.3: Fix #include in examples. - * doc/libffi.texi: Add dircategory. - -2009-12-25 Frank Everdij - - * include/ffi.h.in: Placed '__GNUC__' ifdef around - '__attribute__((aligned(8)))' in ffi_closure, fixes compile for - IRIX MIPSPro c99. - * include/ffi_common.h: Added '__sgi' define to non - '__attribute__((__mode__()))' integer typedefs. - * src/mips/ffi.c (ffi_call, ffi_closure_mips_inner_O32, - ffi_closure_mips_inner_N32): Added 'defined(_MIPSEB)' to BE check. - (ffi_closure_mips_inner_O32, ffi_closure_mips_inner_N32): Added - FFI_LONGDOUBLE support and alignment(N32 only). - * src/mips/ffitarget.h: Corrected '#include ' for IRIX and - fixed non '__attribute__((__mode__()))' integer typedefs. - * src/mips/n32.S: Put '#ifdef linux' around '.abicalls' and '.eh_frame' - since they are Linux/GNU Assembler specific. - -2009-12-25 Bradley Smith - - * configure.ac, Makefile.am, src/avr32/ffi.c, - src/avr32/ffitarget.h, - src/avr32/sysv.S: Add AVR32 port. - * configure, Makefile.in: Rebuilt. - -2009-12-21 Andreas Tobler - - * configure.ac: Make i?86 build on FreeBSD and OpenBSD. - * configure: Regenerate. - -2009-12-15 John David Anglin - - * testsuite/libffi.call/ffitest.h: Define PRIuPTR on PA HP-UX. - -2009-12-13 John David Anglin - - * src/pa/ffi.c (ffi_closure_inner_pa32): Handle FFI_TYPE_LONGDOUBLE - type on HP-UX. - -2012-02-13 Kai Tietz - - PR libffi/52221 - * src/x86/ffi.c (ffi_prep_raw_closure_loc): Add thiscall - support for X86_WIN32. - (FFI_INIT_TRAMPOLINE_THISCALL): Fix displacement. - -2009-12-11 Eric Botcazou - - * src/sparc/ffi.c (ffi_closure_sparc_inner_v9): Properly align 'long - double' arguments. - -2009-12-11 Eric Botcazou - - * testsuite/libffi.call/ffitest.h: Define PRIuPTR on Solaris < 10. - -2009-12-10 Rainer Orth - - PR libffi/40700 - * src/closures.c [X86_64 && __sun__ && __svr4__] - (FFI_MMAP_EXEC_WRIT): Define. - -2009-12-08 David Daney - - * testsuite/libffi.call/stret_medium.c: Remove xfail for mips*-*-* - * testsuite/libffi.call/cls_align_longdouble_split2.c: Same. - * testsuite/libffi.call/stret_large.c: Same. - * testsuite/libffi.call/cls_align_longdouble_split.c: Same. - * testsuite/libffi.call/stret_large2.c: Same. - * testsuite/libffi.call/stret_medium2.c: Same. - -2009-12-07 David Edelsohn - - * src/powerpc/aix_closure.S (libffi_closure_ASM): Fix tablejump - typo. - -2009-12-05 David Edelsohn - - * src/powerpc/aix.S: Update AIX32 code to be consistent with AIX64 - code. - * src/powerpc/aix_closure.S: Same. - -2009-12-05 Ralf Wildenhues - - * Makefile.in: Regenerate. - * configure: Regenerate. - * include/Makefile.in: Regenerate. - * man/Makefile.in: Regenerate. - * testsuite/Makefile.in: Regenerate. - -2009-12-04 David Edelsohn - - * src/powerpc/aix_closure.S: Reorganize 64-bit code to match - linux64_closure.S. - -2009-12-04 Uros Bizjak - - PR libffi/41908 - * src/x86/ffi64.c (classify_argument): Update from - gcc/config/i386/i386.c. - (ffi_closure_unix64_inner): Do not use the address of two consecutive - SSE registers directly. - * testsuite/libffi.call/cls_dbls_struct.c (main): Remove xfail - for x86_64 linux targets. - -2009-12-04 David Edelsohn - - * src/powerpc/ffi_darwin.c (ffi_closure_helper_DARWIN): Increment - pfr for long double split between fpr13 and stack. - -2009-12-03 David Edelsohn - - * src/powerpc/ffi_darwin.c (ffi_prep_args): Increment next_arg and - fparg_count twice for long double. - -2009-12-03 David Edelsohn - - PR libffi/42243 - * src/powerpc/ffi_darwin.c (ffi_prep_args): Remove extra parentheses. - -2009-12-03 Uros Bizjak - - * testsuite/libffi.call/cls_longdouble_va.c (main): Fix format string. - Remove xfails for x86 linux targets. - -2009-12-02 David Edelsohn - - * src/powerpc/ffi_darwin.c (ffi_prep_args): Fix typo in INT64 - case. - -2009-12-01 David Edelsohn - - * src/powerpc/aix.S (ffi_call_AIX): Convert to more standard - register usage. Call ffi_prep_args directly. Add long double - return value support. - * src/powerpc/ffi_darwin.c (ffi_prep_args): Double arg increment - applies to FFI_TYPE_DOUBLE. Correct fpr_base increment typo. - Separate FFI_TYPE_SINT32 and FFI_TYPE_UINT32 cases. - (ffi_prep_cif_machdep): Only 16 byte stack alignment in 64 bit - mode. - (ffi_closure_helper_DARWIN): Remove nf and ng counters. Move temp - into case. - * src/powerpc/aix_closure.S: Maintain 16 byte stack alignment. - Allocate result area between params and FPRs. - -2009-11-30 David Edelsohn - - PR target/35484 - * src/powerpc/ffitarget.h (POWERPC64): Define for PPC64 Linux and - AIX64. - * src/powerpc/aix.S: Implement AIX64 version. - * src/powerpc/aix_closure.S: Implement AIX64 version. - (ffi_closure_ASM): Use extsb, lha and displament addresses. - * src/powerpc/ffi_darwin.c (ffi_prep_args): Implement AIX64 - support. - (ffi_prep_cif_machdep): Same. - (ffi_call): Same. - (ffi_closure_helper_DARWIN): Same. - -2009-11-02 Andreas Tobler - - PR libffi/41908 - * testsuite/libffi.call/testclosure.c: New test. - -2009-09-28 Kai Tietz - - * src/x86/win64.S (_ffi_call_win64 stack): Remove for gnu - assembly version use of ___chkstk. - -2009-09-23 Matthias Klose - - PR libffi/40242, PR libffi/41443 - * src/arm/sysv.S (__ARM_ARCH__): Define for processors - __ARM_ARCH_6T2__, __ARM_ARCH_6M__, __ARM_ARCH_7__, - __ARM_ARCH_7A__, __ARM_ARCH_7R__, __ARM_ARCH_7M__. - Change the conditionals to __SOFTFP__ || __ARM_EABI__ - for -mfloat-abi=softfp to work. - -2009-09-17 Loren J. Rittle - - PR testsuite/32843 (strikes again) - * src/x86/ffi.c (ffi_prep_cif_machdep): Add X86_FREEBSD to - enable proper extension on char and short. - -2009-09-15 David Daney - - * src/java_raw_api.c (ffi_java_raw_to_rvalue): Remove special - handling for FFI_TYPE_POINTER. - * src/mips/ffitarget.h (FFI_TYPE_STRUCT_D_SOFT, - FFI_TYPE_STRUCT_F_SOFT, FFI_TYPE_STRUCT_DD_SOFT, - FFI_TYPE_STRUCT_FF_SOFT, FFI_TYPE_STRUCT_FD_SOFT, - FFI_TYPE_STRUCT_DF_SOFT, FFI_TYPE_STRUCT_SOFT): New defines. - (FFI_N32_SOFT_FLOAT, FFI_N64_SOFT_FLOAT): New ffi_abi enumerations. - (enum ffi_abi): Set FFI_DEFAULT_ABI for soft-float. - * src/mips/n32.S (ffi_call_N32): Add handling for soft-float - structure and pointer returns. - (ffi_closure_N32): Add handling for pointer returns. - * src/mips/ffi.c (ffi_prep_args, calc_n32_struct_flags, - calc_n32_return_struct_flags): Handle soft-float. - (ffi_prep_cif_machdep): Handle soft-float, fix pointer handling. - (ffi_call_N32): Declare proper argument types. - (ffi_call, copy_struct_N32, ffi_closure_mips_inner_N32): Handle - soft-float. - -2009-08-24 Ralf Wildenhues - - * configure.ac (AC_PREREQ): Bump to 2.64. - -2009-08-22 Ralf Wildenhues - - * Makefile.am (install-html, install-pdf): Remove. - * Makefile.in: Regenerate. - - * Makefile.in: Regenerate. - * aclocal.m4: Regenerate. - * configure: Regenerate. - * fficonfig.h.in: Regenerate. - * include/Makefile.in: Regenerate. - * man/Makefile.in: Regenerate. - * testsuite/Makefile.in: Regenerate. - -2011-08-22 Jasper Lievisse Adriaanse - - * configure.ac: Add OpenBSD/hppa and OpenBSD/powerpc support. - * configure: Rebuilt. - -2009-07-30 Ralf Wildenhues - - * configure.ac (_AC_ARG_VAR_PRECIOUS): Use m4_rename_force. - -2009-07-24 Dave Korn - - PR libffi/40807 - * src/x86/ffi.c (ffi_prep_cif_machdep): Also use sign/zero-extending - return types for X86_WIN32. - * src/x86/win32.S (_ffi_call_SYSV): Handle omitted return types. - (_ffi_call_STDCALL, _ffi_closure_SYSV, _ffi_closure_raw_SYSV, - _ffi_closure_STDCALL): Likewise. - - * src/closures.c (is_selinux_enabled): Define to const 0 for Cygwin. - (dlmmap, dlmunmap): Also use these functions on Cygwin. - -2009-07-11 Richard Sandiford - - PR testsuite/40699 - PR testsuite/40707 - PR testsuite/40709 - * testsuite/lib/libffi-dg.exp: Revert 2009-07-02, 2009-07-01 and - 2009-06-30 commits. - -2009-07-01 Richard Sandiford - - * testsuite/lib/libffi-dg.exp (libffi-init): Set ld_library_path - to "" before adding paths. (This reinstates an assignment that - was removed by my 2009-06-30 commit, but changes the initial - value from "." to "".) - -2009-07-01 H.J. Lu - - PR testsuite/40601 - * testsuite/lib/libffi-dg.exp (libffi-init): Properly set - gccdir. Adjust ld_library_path for gcc only if gccdir isn't - empty. - -2009-06-30 Richard Sandiford - - * testsuite/lib/libffi-dg.exp (libffi-init): Don't add "." - to ld_library_path. Use add_path. Add just find_libgcc_s - to ld_library_path, not every libgcc multilib directory. - -2009-06-16 Wim Lewis - - * src/powerpc/ffi.c: Avoid clobbering cr3 and cr4, which are - supposed to be callee-saved. - * src/powerpc/sysv.S (small_struct_return_value): Fix overrun of - return buffer for odd-size structs. - -2009-06-16 Andreas Tobler - - PR libffi/40444 - * testsuite/lib/libffi-dg.exp (libffi_target_compile): Add - allow_stack_execute for Darwin. - -2009-06-16 Andrew Haley - - * configure.ac (TARGETDIR): Add missing blank lines. - * configure: Regenerate. - -2009-06-16 Andrew Haley - - * testsuite/libffi.call/cls_align_sint64.c, - testsuite/libffi.call/cls_align_uint64.c, - testsuite/libffi.call/cls_longdouble_va.c, - testsuite/libffi.call/cls_ulonglong.c, - testsuite/libffi.call/return_ll1.c, - testsuite/libffi.call/stret_medium2.c: Fix printf format - specifiers. - * testsuite/libffi.call/ffitest.h, - testsuite/libffi.special/ffitestcxx.h (PRIdLL, PRIuLL): Define. - -2009-06-15 Andrew Haley - - * testsuite/libffi.call/err_bad_typedef.c: xfail everywhere. - * testsuite/libffi.call/err_bad_abi.c: Likewise. - -2009-06-12 Andrew Haley - - * Makefile.am: Remove info_TEXINFOS. - -2009-06-12 Andrew Haley - - * ChangeLog.libffi: testsuite/libffi.call/cls_align_sint64.c, - testsuite/libffi.call/cls_align_uint64.c, - testsuite/libffi.call/cls_ulonglong.c, - testsuite/libffi.call/return_ll1.c, - testsuite/libffi.call/stret_medium2.c: Fix printf format - specifiers. - testsuite/libffi.special/unwindtest.cc: include stdint.h. - -2009-06-11 Timothy Wall - - * Makefile.am, - configure.ac, - include/ffi.h.in, - include/ffi_common.h, - src/closures.c, - src/dlmalloc.c, - src/x86/ffi.c, - src/x86/ffitarget.h, - src/x86/win64.S (new), - README: Added win64 support (mingw or MSVC) - * Makefile.in, - include/Makefile.in, - man/Makefile.in, - testsuite/Makefile.in, - configure, - aclocal.m4: Regenerated - * ltcf-c.sh: properly escape cygwin/w32 path - * man/ffi_call.3: Clarify size requirements for return value. - * src/x86/ffi64.c: Fix filename in comment. - * src/x86/win32.S: Remove unused extern. - - * testsuite/libffi.call/closure_fn0.c, - testsuite/libffi.call/closure_fn1.c, - testsuite/libffi.call/closure_fn2.c, - testsuite/libffi.call/closure_fn3.c, - testsuite/libffi.call/closure_fn4.c, - testsuite/libffi.call/closure_fn5.c, - testsuite/libffi.call/closure_fn6.c, - testsuite/libffi.call/closure_stdcall.c, - testsuite/libffi.call/cls_12byte.c, - testsuite/libffi.call/cls_16byte.c, - testsuite/libffi.call/cls_18byte.c, - testsuite/libffi.call/cls_19byte.c, - testsuite/libffi.call/cls_1_1byte.c, - testsuite/libffi.call/cls_20byte.c, - testsuite/libffi.call/cls_20byte1.c, - testsuite/libffi.call/cls_24byte.c, - testsuite/libffi.call/cls_2byte.c, - testsuite/libffi.call/cls_3_1byte.c, - testsuite/libffi.call/cls_3byte1.c, - testsuite/libffi.call/cls_3byte2.c, - testsuite/libffi.call/cls_4_1byte.c, - testsuite/libffi.call/cls_4byte.c, - testsuite/libffi.call/cls_5_1_byte.c, - testsuite/libffi.call/cls_5byte.c, - testsuite/libffi.call/cls_64byte.c, - testsuite/libffi.call/cls_6_1_byte.c, - testsuite/libffi.call/cls_6byte.c, - testsuite/libffi.call/cls_7_1_byte.c, - testsuite/libffi.call/cls_7byte.c, - testsuite/libffi.call/cls_8byte.c, - testsuite/libffi.call/cls_9byte1.c, - testsuite/libffi.call/cls_9byte2.c, - testsuite/libffi.call/cls_align_double.c, - testsuite/libffi.call/cls_align_float.c, - testsuite/libffi.call/cls_align_longdouble.c, - testsuite/libffi.call/cls_align_longdouble_split.c, - testsuite/libffi.call/cls_align_longdouble_split2.c, - testsuite/libffi.call/cls_align_pointer.c, - testsuite/libffi.call/cls_align_sint16.c, - testsuite/libffi.call/cls_align_sint32.c, - testsuite/libffi.call/cls_align_sint64.c, - testsuite/libffi.call/cls_align_uint16.c, - testsuite/libffi.call/cls_align_uint32.c, - testsuite/libffi.call/cls_align_uint64.c, - testsuite/libffi.call/cls_dbls_struct.c, - testsuite/libffi.call/cls_double.c, - testsuite/libffi.call/cls_double_va.c, - testsuite/libffi.call/cls_float.c, - testsuite/libffi.call/cls_longdouble.c, - testsuite/libffi.call/cls_longdouble_va.c, - testsuite/libffi.call/cls_multi_schar.c, - testsuite/libffi.call/cls_multi_sshort.c, - testsuite/libffi.call/cls_multi_sshortchar.c, - testsuite/libffi.call/cls_multi_uchar.c, - testsuite/libffi.call/cls_multi_ushort.c, - testsuite/libffi.call/cls_multi_ushortchar.c, - testsuite/libffi.call/cls_pointer.c, - testsuite/libffi.call/cls_pointer_stack.c, - testsuite/libffi.call/cls_schar.c, - testsuite/libffi.call/cls_sint.c, - testsuite/libffi.call/cls_sshort.c, - testsuite/libffi.call/cls_uchar.c, - testsuite/libffi.call/cls_uint.c, - testsuite/libffi.call/cls_ulonglong.c, - testsuite/libffi.call/cls_ushort.c, - testsuite/libffi.call/err_bad_abi.c, - testsuite/libffi.call/err_bad_typedef.c, - testsuite/libffi.call/float2.c, - testsuite/libffi.call/huge_struct.c, - testsuite/libffi.call/nested_struct.c, - testsuite/libffi.call/nested_struct1.c, - testsuite/libffi.call/nested_struct10.c, - testsuite/libffi.call/nested_struct2.c, - testsuite/libffi.call/nested_struct3.c, - testsuite/libffi.call/nested_struct4.c, - testsuite/libffi.call/nested_struct5.c, - testsuite/libffi.call/nested_struct6.c, - testsuite/libffi.call/nested_struct7.c, - testsuite/libffi.call/nested_struct8.c, - testsuite/libffi.call/nested_struct9.c, - testsuite/libffi.call/problem1.c, - testsuite/libffi.call/return_ldl.c, - testsuite/libffi.call/return_ll1.c, - testsuite/libffi.call/stret_large.c, - testsuite/libffi.call/stret_large2.c, - testsuite/libffi.call/stret_medium.c, - testsuite/libffi.call/stret_medium2.c, - testsuite/libffi.special/unwindtest.cc: use ffi_closure_alloc instead - of checking for MMAP. Use intptr_t instead of long casts. - -2009-06-11 Kaz Kojima - - * testsuite/libffi.call/cls_longdouble_va.c: Add xfail sh*-*-linux-*. - * testsuite/libffi.call/err_bad_abi.c: Add xfail sh*-*-*. - * testsuite/libffi.call/err_bad_typedef.c: Likewise. - -2009-06-09 Andrew Haley - - * src/x86/freebsd.S: Add missing file. - -2009-06-08 Andrew Haley - - Import from libffi 3.0.8: - - * doc/libffi.texi: New file. - * doc/libffi.info: Likewise. - * doc/stamp-vti: Likewise. - * man/Makefile.am: New file. - * man/ffi_call.3: New file. - - * Makefile.am (EXTRA_DIST): Add src/x86/darwin64.S, - src/dlmalloc.c. - (nodist_libffi_la_SOURCES): Add X86_FREEBSD. - - * configure.ac: Bump version to 3.0.8. - parisc*-*-linux*: Add. - i386-*-freebsd* | i386-*-openbsd*: Add. - powerpc-*-beos*: Add. - AM_CONDITIONAL X86_FREEBSD: Add. - AC_CONFIG_FILES: Add man/Makefile. - - * include/ffi.h.in (FFI_FN): Change void (*)() to void (*)(void). - -2009-06-08 Andrew Haley - - * README: Import from libffi 3.0.8. - -2009-06-08 Andrew Haley - - * testsuite/libffi.call/err_bad_abi.c: Add xfails. - * testsuite/libffi.call/cls_longdouble_va.c: Add xfails. - * testsuite/libffi.call/cls_dbls_struct.c: Add xfail x86_64-*-linux-*. - * testsuite/libffi.call/err_bad_typedef.c: Add xfails. - - * testsuite/libffi.call/stret_medium2.c: Add __UNUSED__ to args. - * testsuite/libffi.call/stret_medium.c: Likewise. - * testsuite/libffi.call/stret_large2.c: Likewise. - * testsuite/libffi.call/stret_large.c: Likewise. - -2008-12-26 Timothy Wall - - * testsuite/libffi.call/cls_longdouble.c, - testsuite/libffi.call/cls_longdouble_va.c, - testsuite/libffi.call/cls_align_longdouble.c, - testsuite/libffi.call/cls_align_longdouble_split.c, - testsuite/libffi.call/cls_align_longdouble_split2.c: mark expected - failures on x86_64 cygwin/mingw. - -2008-12-22 Timothy Wall - - * testsuite/libffi.call/closure_fn0.c, - testsuite/libffi.call/closure_fn1.c, - testsuite/libffi.call/closure_fn2.c, - testsuite/libffi.call/closure_fn3.c, - testsuite/libffi.call/closure_fn4.c, - testsuite/libffi.call/closure_fn5.c, - testsuite/libffi.call/closure_fn6.c, - testsuite/libffi.call/closure_loc_fn0.c, - testsuite/libffi.call/closure_stdcall.c, - testsuite/libffi.call/cls_align_pointer.c, - testsuite/libffi.call/cls_pointer.c, - testsuite/libffi.call/cls_pointer_stack.c: use portable cast from - pointer to integer (intptr_t). - * testsuite/libffi.call/cls_longdouble.c: disable for win64. - -2008-07-24 Anthony Green - - * testsuite/libffi.call/cls_dbls_struct.c, - testsuite/libffi.call/cls_double_va.c, - testsuite/libffi.call/cls_longdouble.c, - testsuite/libffi.call/cls_longdouble_va.c, - testsuite/libffi.call/cls_pointer.c, - testsuite/libffi.call/cls_pointer_stack.c, - testsuite/libffi.call/err_bad_abi.c: Clean up failures from - compiler warnings. - -2008-03-04 Anthony Green - Blake Chaffin - hos@tamanegi.org - - * testsuite/libffi.call/cls_align_longdouble_split2.c - testsuite/libffi.call/cls_align_longdouble_split.c - testsuite/libffi.call/cls_dbls_struct.c - testsuite/libffi.call/cls_double_va.c - testsuite/libffi.call/cls_longdouble.c - testsuite/libffi.call/cls_longdouble_va.c - testsuite/libffi.call/cls_pointer.c - testsuite/libffi.call/cls_pointer_stack.c - testsuite/libffi.call/err_bad_abi.c - testsuite/libffi.call/err_bad_typedef.c - testsuite/libffi.call/stret_large2.c - testsuite/libffi.call/stret_large.c - testsuite/libffi.call/stret_medium2.c - testsuite/libffi.call/stret_medium.c: New tests from Apple. - -2009-06-05 Andrew Haley - - * src/x86/ffitarget.h, src/x86/ffi.c: Merge stdcall changes from - libffi. - -2009-06-04 Andrew Haley - - * src/x86/ffitarget.h, src/x86/win32.S, src/x86/ffi.c: Back out - stdcall changes. - -2008-02-26 Anthony Green - Thomas Heller - - * src/x86/ffi.c (ffi_closure_SYSV_inner): Change C++ comment to C - comment. - -2008-02-03 Timothy Wall - - * src/x86/ffi.c (FFI_INIT_TRAMPOLINE_STDCALL): Calculate jump return - offset based on code pointer, not data pointer. - -2008-01-31 Timothy Wall - - * testsuite/libffi.call/closure_stdcall.c: Add test for stdcall - closures. - * src/x86/ffitarget.h: Increase size of trampoline for stdcall - closures. - * src/x86/win32.S: Add assembly for stdcall closure. - * src/x86/ffi.c: Initialize stdcall closure trampoline. - -2009-06-04 Andrew Haley - - * include/ffi.h.in: Change void (*)() to void (*)(void). - * src/x86/ffi.c: Likewise. - -2009-06-04 Andrew Haley - - * src/powerpc/ppc_closure.S: Insert licence header. - * src/powerpc/linux64_closure.S: Likewise. - * src/m68k/sysv.S: Likewise. - - * src/sh64/ffi.c: Change void (*)() to void (*)(void). - * src/powerpc/ffi.c: Likewise. - * src/powerpc/ffi_darwin.c: Likewise. - * src/m32r/ffi.c: Likewise. - * src/sh64/ffi.c: Likewise. - * src/x86/ffi64.c: Likewise. - * src/alpha/ffi.c: Likewise. - * src/alpha/osf.S: Likewise. - * src/frv/ffi.c: Likewise. - * src/s390/ffi.c: Likewise. - * src/pa/ffi.c: Likewise. - * src/pa/hpux32.S: Likewise. - * src/ia64/unix.S: Likewise. - * src/ia64/ffi.c: Likewise. - * src/sparc/ffi.c: Likewise. - * src/mips/ffi.c: Likewise. - * src/sh/ffi.c: Likewise. - -2008-02-15 David Daney - - * src/mips/ffi.c (USE__BUILTIN___CLEAR_CACHE): - Define (conditionally), and use it to include cachectl.h. - (ffi_prep_closure_loc): Fix cache flushing. - * src/mips/ffitarget.h (_ABIN32, _ABI64, _ABIO32): Define. - -2009-06-04 Andrew Haley - - include/ffi.h.in, - src/arm/ffitarget.h, - src/arm/ffi.c, - src/arm/sysv.S, - src/powerpc/ffitarget.h, - src/closures.c, - src/sh64/ffitarget.h, - src/sh64/ffi.c, - src/sh64/sysv.S, - src/types.c, - src/x86/ffi64.c, - src/x86/ffitarget.h, - src/x86/win32.S, - src/x86/darwin.S, - src/x86/ffi.c, - src/x86/sysv.S, - src/x86/unix64.S, - src/alpha/ffitarget.h, - src/alpha/ffi.c, - src/alpha/osf.S, - src/m68k/ffitarget.h, - src/frv/ffitarget.h, - src/frv/ffi.c, - src/s390/ffitarget.h, - src/s390/sysv.S, - src/cris/ffitarget.h, - src/pa/linux.S, - src/pa/ffitarget.h, - src/pa/ffi.c, - src/raw_api.c, - src/ia64/ffitarget.h, - src/ia64/unix.S, - src/ia64/ffi.c, - src/ia64/ia64_flags.h, - src/java_raw_api.c, - src/debug.c, - src/sparc/v9.S, - src/sparc/ffitarget.h, - src/sparc/ffi.c, - src/sparc/v8.S, - src/mips/ffitarget.h, - src/mips/n32.S, - src/mips/o32.S, - src/mips/ffi.c, - src/prep_cif.c, - src/sh/ffitarget.h, - src/sh/ffi.c, - src/sh/sysv.S: Update license text. - -2009-05-22 Dave Korn - - * src/x86/win32.S (_ffi_closure_STDCALL): New function. - (.eh_frame): Add FDE for it. - -2009-05-22 Dave Korn - - * configure.ac: Also check if assembler supports pc-relative - relocs on X86_WIN32 targets. - * configure: Regenerate. - * src/x86/win32.S (ffi_prep_args): Declare extern, not global. - (_ffi_call_SYSV): Add missing function type symbol .def and - add EH markup labels. - (_ffi_call_STDCALL): Likewise. - (_ffi_closure_SYSV): Likewise. - (_ffi_closure_raw_SYSV): Likewise. - (.eh_frame): Add hand-crafted EH data. - -2009-04-09 Jakub Jelinek - - * testsuite/lib/libffi-dg.exp: Change copyright header to refer to - version 3 of the GNU General Public License and to point readers - at the COPYING3 file and the FSF's license web page. - * testsuite/libffi.call/call.exp: Likewise. - * testsuite/libffi.special/special.exp: Likewise. - -2009-03-01 Ralf Wildenhues - - * configure: Regenerate. - -2008-12-18 Rainer Orth - - PR libffi/26048 - * configure.ac (HAVE_AS_X86_PCREL): New test. - * configure: Regenerate. - * fficonfig.h.in: Regenerate. - * src/x86/sysv.S [!FFI_NO_RAW_API]: Precalculate - RAW_CLOSURE_CIF_OFFSET, RAW_CLOSURE_FUN_OFFSET, - RAW_CLOSURE_USER_DATA_OFFSET for the Solaris 10/x86 assembler. - (.eh_frame): Only use SYMBOL-. iff HAVE_AS_X86_PCREL. - * src/x86/unix64.S (.Lstore_table): Move to .text section. - (.Lload_table): Likewise. - (.eh_frame): Only use SYMBOL-. iff HAVE_AS_X86_PCREL. - -2008-12-18 Ralf Wildenhues - - * configure: Regenerate. - -2008-11-21 Eric Botcazou - - * src/sparc/ffi.c (ffi_prep_cif_machdep): Add support for - signed/unsigned int8/16 return values. - * src/sparc/v8.S (ffi_call_v8): Likewise. - (ffi_closure_v8): Likewise. - -2008-09-26 Peter O'Gorman - Steve Ellcey - - * configure: Regenerate for new libtool. - * Makefile.in: Ditto. - * include/Makefile.in: Ditto. - * aclocal.m4: Ditto. - -2008-08-25 Andreas Tobler - - * src/powerpc/ffitarget.h (ffi_abi): Add FFI_LINUX and - FFI_LINUX_SOFT_FLOAT to the POWERPC_FREEBSD enum. - Add note about flag bits used for FFI_SYSV_TYPE_SMALL_STRUCT. - Adjust copyright notice. - * src/powerpc/ffi.c: Add two new flags to indicate if we have one - register or two register to use for FFI_SYSV structs. - (ffi_prep_cif_machdep): Pass the right register flag introduced above. - (ffi_closure_helper_SYSV): Fix the return type for - FFI_SYSV_TYPE_SMALL_STRUCT. Comment. - Adjust copyright notice. - -2008-07-16 Kaz Kojima - - * src/sh/ffi.c (ffi_prep_closure_loc): Turn INSN into an unsigned - int. - -2008-06-17 Ralf Wildenhues - - * configure: Regenerate. - * include/Makefile.in: Regenerate. - * testsuite/Makefile.in: Regenerate. - -2008-06-07 Joseph Myers - - * configure.ac (parisc*-*-linux*, powerpc-*-sysv*, - powerpc-*-beos*): Remove. - * configure: Regenerate. - -2008-05-09 Julian Brown - - * Makefile.am (LTLDFLAGS): New. - (libffi_la_LDFLAGS): Use above. - * Makefile.in: Regenerate. - -2008-04-18 Paolo Bonzini - - PR bootstrap/35457 - * aclocal.m4: Regenerate. - * configure: Regenerate. - -2008-03-26 Kaz Kojima - - * src/sh/sysv.S: Add .note.GNU-stack on Linux. - * src/sh64/sysv.S: Likewise. - -2008-03-26 Daniel Jacobowitz - - * src/arm/sysv.S: Fix ARM comment marker. - -2008-03-26 Jakub Jelinek - - * src/alpha/osf.S: Add .note.GNU-stack on Linux. - * src/s390/sysv.S: Likewise. - * src/powerpc/ppc_closure.S: Likewise. - * src/powerpc/sysv.S: Likewise. - * src/x86/unix64.S: Likewise. - * src/x86/sysv.S: Likewise. - * src/sparc/v8.S: Likewise. - * src/sparc/v9.S: Likewise. - * src/m68k/sysv.S: Likewise. - * src/arm/sysv.S: Likewise. - -2008-03-16 Ralf Wildenhues - - * aclocal.m4: Regenerate. - * configure: Likewise. - * Makefile.in: Likewise. - * include/Makefile.in: Likewise. - * testsuite/Makefile.in: Likewise. - -2008-02-12 Bjoern Koenig - Andreas Tobler - - * configure.ac: Add amd64-*-freebsd* target. - * configure: Regenerate. - -2008-01-30 H.J. Lu - - PR libffi/34612 - * src/x86/sysv.S (ffi_closure_SYSV): Pop 4 byte from stack when - returning struct. - - * testsuite/libffi.call/call.exp: Add "-O2 -fomit-frame-pointer" - tests. - -2008-01-24 David Edelsohn - - * configure: Regenerate. - -2008-01-06 Andreas Tobler - - * src/x86/ffi.c (ffi_prep_cif_machdep): Fix thinko. - -2008-01-05 Andreas Tobler - - PR testsuite/32843 - * src/x86/ffi.c (ffi_prep_cif_machdep): Add code for - signed/unsigned int8/16 for X86_DARWIN. - Updated copyright info. - Handle one and two byte structs with special cif->flags. - * src/x86/ffitarget.h: Add special types for one and two byte structs. - Updated copyright info. - * src/x86/darwin.S (ffi_call_SYSV): Rewrite to use a jump table like - sysv.S - Remove code to pop args from the stack after call. - Special-case signed/unsigned for int8/16, one and two byte structs. - (ffi_closure_raw_SYSV): Handle FFI_TYPE_UINT8, - FFI_TYPE_SINT8, FFI_TYPE_UINT16, FFI_TYPE_SINT16, FFI_TYPE_UINT32, - FFI_TYPE_SINT32. - Updated copyright info. - -2007-12-08 David Daney - - * src/mips/n32.S (ffi_call_N32): Replace dadd with ADDU, dsub with - SUBU, add with ADDU and use smaller code sequences. - -2007-12-07 David Daney - - * src/mips/ffi.c (ffi_prep_cif_machdep): Handle long double return - type. - -2007-12-06 David Daney - - * include/ffi.h.in (FFI_SIZEOF_JAVA_RAW): Define if not already - defined. - (ffi_java_raw): New typedef. - (ffi_java_raw_call, ffi_java_ptrarray_to_raw, - ffi_java_raw_to_ptrarray): Change parameter types from ffi_raw to - ffi_java_raw. - (ffi_java_raw_closure) : Same. - (ffi_prep_java_raw_closure, ffi_prep_java_raw_closure_loc): Change - parameter types. - * src/java_raw_api.c (ffi_java_raw_size): Replace FFI_SIZEOF_ARG with - FFI_SIZEOF_JAVA_RAW. - (ffi_java_raw_to_ptrarray): Change type of raw to ffi_java_raw. - Replace FFI_SIZEOF_ARG with FFI_SIZEOF_JAVA_RAW. Use - sizeof(ffi_java_raw) for alignment calculations. - (ffi_java_ptrarray_to_raw): Same. - (ffi_java_rvalue_to_raw): Add special handling for FFI_TYPE_POINTER - if FFI_SIZEOF_JAVA_RAW == 4. - (ffi_java_raw_to_rvalue): Same. - (ffi_java_raw_call): Change type of raw to ffi_java_raw. - (ffi_java_translate_args): Same. - (ffi_prep_java_raw_closure_loc, ffi_prep_java_raw_closure): Change - parameter types. - * src/mips/ffitarget.h (FFI_SIZEOF_JAVA_RAW): Define for N32 ABI. - -2007-12-06 David Daney - - * src/mips/n32.S (ffi_closure_N32): Use 64-bit add instruction on - pointer values. - -2007-12-01 Andreas Tobler - - PR libffi/31937 - * src/powerpc/ffitarget.h: Introduce new ABI FFI_LINUX_SOFT_FLOAT. - Add local FFI_TYPE_UINT128 to handle soft-float long-double-128. - * src/powerpc/ffi.c: Distinguish between __NO_FPRS__ and not and - set the NUM_FPR_ARG_REGISTERS according to. - Add support for potential soft-float support under hard-float - architecture. - (ffi_prep_args_SYSV): Set NUM_FPR_ARG_REGISTERS to 0 in case of - FFI_LINUX_SOFT_FLOAT, handle float, doubles and long-doubles according - to the FFI_LINUX_SOFT_FLOAT ABI. - (ffi_prep_cif_machdep): Likewise. - (ffi_closure_helper_SYSV): Likewise. - * src/powerpc/ppc_closure.S: Make sure not to store float/double - on archs where __NO_FPRS__ is true. - Add FFI_TYPE_UINT128 support. - * src/powerpc/sysv.S: Add support for soft-float long-double-128. - Adjust copyright notice. - -2007-11-25 Andreas Tobler - - * src/closures.c: Move defintion of MAYBE_UNUSED from here to ... - * include/ffi_common.h: ... here. - Update copyright. - -2007-11-17 Andreas Tobler - - * src/powerpc/sysv.S: Load correct cr to compare if we have long double. - * src/powerpc/linux64.S: Likewise. - * src/powerpc/ffi.c: Add a comment to show which part goes into cr6. - * testsuite/libffi.call/return_ldl.c: New test. - -2007-09-04 - - * src/arm/sysv.S (UNWIND): New. - (Whole file): Conditionally compile unwinder directives. - * src/arm/sysv.S: Add unwinder directives. - - * src/arm/ffi.c (ffi_prep_args): Align structs by at least 4 bytes. - Only treat r0 as a struct address if we're actually returning a - struct by address. - Only copy the bytes that are actually within a struct. - (ffi_prep_cif_machdep): A Composite Type not larger than 4 bytes - is returned in r0, not passed by address. - (ffi_call): Allocate a word-sized temporary for the case where - a composite is returned in r0. - (ffi_prep_incoming_args_SYSV): Align as necessary. - -2007-08-05 Steven Newbury - - * src/arm/ffi.c (FFI_INIT_TRAMPOLINE): Use __clear_cache instead of - directly using the sys_cacheflush syscall. - -2007-07-27 Andrew Haley - - * src/arm/sysv.S (ffi_closure_SYSV): Add soft-float. - -2007-09-03 Maciej W. Rozycki - - * Makefile.am: Unify MIPS_IRIX and MIPS_LINUX into MIPS. - * configure.ac: Likewise. - * Makefile.in: Regenerate. - * include/Makefile.in: Likewise. - * testsuite/Makefile.in: Likewise. - * configure: Likewise. - -2007-08-24 David Daney - - * testsuite/libffi.call/return_sl.c: New test. - -2007-08-10 David Daney - - * testsuite/libffi.call/cls_multi_ushort.c, - testsuite/libffi.call/cls_align_uint16.c, - testsuite/libffi.call/nested_struct1.c, - testsuite/libffi.call/nested_struct3.c, - testsuite/libffi.call/cls_7_1_byte.c, - testsuite/libffi.call/nested_struct5.c, - testsuite/libffi.call/cls_double.c, - testsuite/libffi.call/nested_struct7.c, - testsuite/libffi.call/cls_sint.c, - testsuite/libffi.call/nested_struct9.c, - testsuite/libffi.call/cls_20byte1.c, - testsuite/libffi.call/cls_multi_sshortchar.c, - testsuite/libffi.call/cls_align_sint64.c, - testsuite/libffi.call/cls_3byte2.c, - testsuite/libffi.call/cls_multi_schar.c, - testsuite/libffi.call/cls_multi_uchar.c, - testsuite/libffi.call/cls_19byte.c, - testsuite/libffi.call/cls_9byte1.c, - testsuite/libffi.call/cls_align_float.c, - testsuite/libffi.call/closure_fn1.c, - testsuite/libffi.call/problem1.c, - testsuite/libffi.call/closure_fn3.c, - testsuite/libffi.call/cls_sshort.c, - testsuite/libffi.call/closure_fn5.c, - testsuite/libffi.call/cls_align_double.c, - testsuite/libffi.call/nested_struct.c, - testsuite/libffi.call/cls_2byte.c, - testsuite/libffi.call/nested_struct10.c, - testsuite/libffi.call/cls_4byte.c, - testsuite/libffi.call/cls_6byte.c, - testsuite/libffi.call/cls_8byte.c, - testsuite/libffi.call/cls_multi_sshort.c, - testsuite/libffi.call/cls_align_sint16.c, - testsuite/libffi.call/cls_align_uint32.c, - testsuite/libffi.call/cls_20byte.c, - testsuite/libffi.call/cls_float.c, - testsuite/libffi.call/nested_struct2.c, - testsuite/libffi.call/cls_5_1_byte.c, - testsuite/libffi.call/nested_struct4.c, - testsuite/libffi.call/cls_24byte.c, - testsuite/libffi.call/nested_struct6.c, - testsuite/libffi.call/cls_64byte.c, - testsuite/libffi.call/nested_struct8.c, - testsuite/libffi.call/cls_uint.c, - testsuite/libffi.call/cls_multi_ushortchar.c, - testsuite/libffi.call/cls_schar.c, - testsuite/libffi.call/cls_uchar.c, - testsuite/libffi.call/cls_align_uint64.c, - testsuite/libffi.call/cls_ulonglong.c, - testsuite/libffi.call/cls_align_longdouble.c, - testsuite/libffi.call/cls_1_1byte.c, - testsuite/libffi.call/cls_12byte.c, - testsuite/libffi.call/cls_3_1byte.c, - testsuite/libffi.call/cls_3byte1.c, - testsuite/libffi.call/cls_4_1byte.c, - testsuite/libffi.call/cls_6_1_byte.c, - testsuite/libffi.call/cls_16byte.c, - testsuite/libffi.call/cls_18byte.c, - testsuite/libffi.call/closure_fn0.c, - testsuite/libffi.call/cls_9byte2.c, - testsuite/libffi.call/closure_fn2.c, - testsuite/libffi.call/closure_fn4.c, - testsuite/libffi.call/cls_ushort.c, - testsuite/libffi.call/closure_fn6.c, - testsuite/libffi.call/cls_5byte.c, - testsuite/libffi.call/cls_align_pointer.c, - testsuite/libffi.call/cls_7byte.c, - testsuite/libffi.call/cls_align_sint32.c, - testsuite/libffi.special/unwindtest_ffi_call.cc, - testsuite/libffi.special/unwindtest.cc: Remove xfail for mips64*-*-*. - -2007-08-10 David Daney - - PR libffi/28313 - * configure.ac: Don't treat mips64 as a special case. - * Makefile.am (nodist_libffi_la_SOURCES): Add n32.S. - * configure: Regenerate - * Makefile.in: Ditto. - * fficonfig.h.in: Ditto. - * src/mips/ffitarget.h (REG_L, REG_S, SUBU, ADDU, SRL, LI): Indent. - (LA, EH_FRAME_ALIGN, FDE_ADDR_BYTES): New preprocessor macros. - (FFI_DEFAULT_ABI): Set for n64 case. - (FFI_CLOSURES, FFI_TRAMPOLINE_SIZE): Define for n32 and n64 cases. - * src/mips/n32.S (ffi_call_N32): Add debug macros and labels for FDE. - (ffi_closure_N32): New function. - (.eh_frame): New section - * src/mips/o32.S: Clean up comments. - (ffi_closure_O32): Pass ffi_closure parameter in $12. - * src/mips/ffi.c: Use FFI_MIPS_N32 instead of - _MIPS_SIM == _ABIN32 throughout. - (FFI_MIPS_STOP_HERE): New, use in place of - ffi_stop_here. - (ffi_prep_args): Use unsigned long to hold pointer values. Rewrite - to support n32/n64 ABIs. - (calc_n32_struct_flags): Rewrite. - (calc_n32_return_struct_flags): Remove unused variable. Reverse - position of flag bits. - (ffi_prep_cif_machdep): Rewrite n32 portion. - (ffi_call): Enable for n64. Add special handling for small structure - return values. - (ffi_prep_closure_loc): Add n32 and n64 support. - (ffi_closure_mips_inner_O32): Add cast to silence warning. - (copy_struct_N32, ffi_closure_mips_inner_N32): New functions. - -2007-08-08 David Daney - - * testsuite/libffi.call/ffitest.h (ffi_type_mylong): Remove definition. - * testsuite/libffi.call/cls_align_uint16.c (main): Use correct type - specifiers. - * testsuite/libffi.call/nested_struct1.c (main): Ditto. - * testsuite/libffi.call/cls_sint.c (main): Ditto. - * testsuite/libffi.call/nested_struct9.c (main): Ditto. - * testsuite/libffi.call/cls_20byte1.c (main): Ditto. - * testsuite/libffi.call/cls_9byte1.c (main): Ditto. - * testsuite/libffi.call/closure_fn1.c (main): Ditto. - * testsuite/libffi.call/closure_fn3.c (main): Ditto. - * testsuite/libffi.call/return_dbl2.c (main): Ditto. - * testsuite/libffi.call/cls_sshort.c (main): Ditto. - * testsuite/libffi.call/return_fl3.c (main): Ditto. - * testsuite/libffi.call/closure_fn5.c (main): Ditto. - * testsuite/libffi.call/nested_struct.c (main): Ditto. - * testsuite/libffi.call/nested_struct10.c (main): Ditto. - * testsuite/libffi.call/return_ll1.c (main): Ditto. - * testsuite/libffi.call/cls_8byte.c (main): Ditto. - * testsuite/libffi.call/cls_align_uint32.c (main): Ditto. - * testsuite/libffi.call/cls_align_sint16.c (main): Ditto. - * testsuite/libffi.call/cls_20byte.c (main): Ditto. - * testsuite/libffi.call/nested_struct2.c (main): Ditto. - * testsuite/libffi.call/cls_24byte.c (main): Ditto. - * testsuite/libffi.call/nested_struct6.c (main): Ditto. - * testsuite/libffi.call/cls_uint.c (main): Ditto. - * testsuite/libffi.call/cls_12byte.c (main): Ditto. - * testsuite/libffi.call/cls_16byte.c (main): Ditto. - * testsuite/libffi.call/closure_fn0.c (main): Ditto. - * testsuite/libffi.call/cls_9byte2.c (main): Ditto. - * testsuite/libffi.call/closure_fn2.c (main): Ditto. - * testsuite/libffi.call/return_dbl1.c (main): Ditto. - * testsuite/libffi.call/closure_fn4.c (main): Ditto. - * testsuite/libffi.call/closure_fn6.c (main): Ditto. - * testsuite/libffi.call/cls_align_sint32.c (main): Ditto. - -2007-08-07 Andrew Haley - - * src/x86/sysv.S (ffi_closure_raw_SYSV): Fix typo in previous - checkin. - -2007-08-06 Andrew Haley - - PR testsuite/32843 - * src/x86/sysv.S (ffi_closure_raw_SYSV): Handle FFI_TYPE_UINT8, - FFI_TYPE_SINT8, FFI_TYPE_UINT16, FFI_TYPE_SINT16, FFI_TYPE_UINT32, - FFI_TYPE_SINT32. - -2007-08-02 David Daney - - * testsuite/libffi.call/return_ul.c (main): Define return type as - ffi_arg. Use proper printf conversion specifier. - -2007-07-30 Andrew Haley - - PR testsuite/32843 - * src/x86/ffi.c (ffi_prep_cif_machdep): in x86 case, add code for - signed/unsigned int8/16. - * src/x86/sysv.S (ffi_call_SYSV): Rewrite to: - Use a jump table. - Remove code to pop args from the stack after call. - Special-case signed/unsigned int8/16. - * testsuite/libffi.call/return_sc.c (main): Revert. - -2007-07-26 Richard Guenther - - PR testsuite/32843 - * testsuite/libffi.call/return_sc.c (main): Verify call - result as signed char, not ffi_arg. - -2007-07-16 Rainer Orth - - * configure.ac (i?86-*-solaris2.1[0-9]): Set TARGET to X86_64. - * configure: Regenerate. - -2007-07-11 David Daney - - * src/mips/ffi.c: Don't include sys/cachectl.h. - (ffi_prep_closure_loc): Use __builtin___clear_cache() instead of - cacheflush(). - -2007-05-18 Aurelien Jarno - - * src/arm/ffi.c (ffi_prep_closure_loc): Renamed and ajusted - from (ffi_prep_closure): ... this. - (FFI_INIT_TRAMPOLINE): Adjust. - -2005-12-31 Phil Blundell - - * src/arm/ffi.c (ffi_prep_incoming_args_SYSV, - ffi_closure_SYSV_inner, ffi_prep_closure): New, add closure support. - * src/arm/sysv.S(ffi_closure_SYSV): Likewise. - * src/arm/ffitarget.h (FFI_TRAMPOLINE_SIZE): Likewise. - (FFI_CLOSURES): Enable closure support. - -2007-07-03 Andrew Haley - - * testsuite/libffi.call/cls_multi_ushort.c, - testsuite/libffi.call/cls_align_uint16.c, - testsuite/libffi.call/nested_struct1.c, - testsuite/libffi.call/nested_struct3.c, - testsuite/libffi.call/cls_7_1_byte.c, - testsuite/libffi.call/cls_double.c, - testsuite/libffi.call/nested_struct5.c, - testsuite/libffi.call/nested_struct7.c, - testsuite/libffi.call/cls_sint.c, - testsuite/libffi.call/nested_struct9.c, - testsuite/libffi.call/cls_20byte1.c, - testsuite/libffi.call/cls_multi_sshortchar.c, - testsuite/libffi.call/cls_align_sint64.c, - testsuite/libffi.call/cls_3byte2.c, - testsuite/libffi.call/cls_multi_schar.c, - testsuite/libffi.call/cls_multi_uchar.c, - testsuite/libffi.call/cls_19byte.c, - testsuite/libffi.call/cls_9byte1.c, - testsuite/libffi.call/cls_align_float.c, - testsuite/libffi.call/closure_fn1.c, - testsuite/libffi.call/problem1.c, - testsuite/libffi.call/closure_fn3.c, - testsuite/libffi.call/cls_sshort.c, - testsuite/libffi.call/closure_fn5.c, - testsuite/libffi.call/cls_align_double.c, - testsuite/libffi.call/cls_2byte.c, - testsuite/libffi.call/nested_struct.c, - testsuite/libffi.call/nested_struct10.c, - testsuite/libffi.call/cls_4byte.c, - testsuite/libffi.call/cls_6byte.c, - testsuite/libffi.call/cls_8byte.c, - testsuite/libffi.call/cls_multi_sshort.c, - testsuite/libffi.call/cls_align_uint32.c, - testsuite/libffi.call/cls_align_sint16.c, - testsuite/libffi.call/cls_float.c, - testsuite/libffi.call/cls_20byte.c, - testsuite/libffi.call/cls_5_1_byte.c, - testsuite/libffi.call/nested_struct2.c, - testsuite/libffi.call/cls_24byte.c, - testsuite/libffi.call/nested_struct4.c, - testsuite/libffi.call/nested_struct6.c, - testsuite/libffi.call/cls_64byte.c, - testsuite/libffi.call/nested_struct8.c, - testsuite/libffi.call/cls_uint.c, - testsuite/libffi.call/cls_multi_ushortchar.c, - testsuite/libffi.call/cls_schar.c, - testsuite/libffi.call/cls_uchar.c, - testsuite/libffi.call/cls_align_uint64.c, - testsuite/libffi.call/cls_ulonglong.c, - testsuite/libffi.call/cls_align_longdouble.c, - testsuite/libffi.call/cls_1_1byte.c, - testsuite/libffi.call/cls_12byte.c, - testsuite/libffi.call/cls_3_1byte.c, - testsuite/libffi.call/cls_3byte1.c, - testsuite/libffi.call/cls_4_1byte.c, - testsuite/libffi.call/cls_6_1_byte.c, - testsuite/libffi.call/cls_16byte.c, - testsuite/libffi.call/cls_18byte.c, - testsuite/libffi.call/closure_fn0.c, - testsuite/libffi.call/cls_9byte2.c, - testsuite/libffi.call/closure_fn2.c, - testsuite/libffi.call/closure_fn4.c, - testsuite/libffi.call/cls_ushort.c, - testsuite/libffi.call/closure_fn6.c, - testsuite/libffi.call/cls_5byte.c, - testsuite/libffi.call/cls_align_pointer.c, - testsuite/libffi.call/cls_7byte.c, - testsuite/libffi.call/cls_align_sint32.c, - testsuite/libffi.special/unwindtest_ffi_call.cc, - testsuite/libffi.special/unwindtest.cc: Enable for ARM. - -2007-07-05 H.J. Lu - - * aclocal.m4: Regenerated. - -2007-06-02 Paolo Bonzini - - * configure: Regenerate. - -2007-05-23 Steve Ellcey - - * Makefile.in: Regenerate. - * configure: Regenerate. - * aclocal.m4: Regenerate. - * include/Makefile.in: Regenerate. - * testsuite/Makefile.in: Regenerate. - -2007-05-10 Roman Zippel - - * src/m68k/ffi.c (ffi_prep_incoming_args_SYSV, - ffi_closure_SYSV_inner,ffi_prep_closure): New, add closure support. - * src/m68k/sysv.S(ffi_closure_SYSV,ffi_closure_struct_SYSV): Likewise. - * src/m68k/ffitarget.h (FFI_TRAMPOLINE_SIZE): Likewise. - (FFI_CLOSURES): Enable closure support. - -2007-05-10 Roman Zippel - - * configure.ac (HAVE_AS_CFI_PSEUDO_OP): New test. - * configure: Regenerate. - * fficonfig.h.in: Regenerate. - * src/m68k/sysv.S (CFI_STARTPROC,CFI_ENDPROC, - CFI_OFFSET,CFI_DEF_CFA): New macros. - (ffi_call_SYSV): Add callframe annotation. - -2007-05-10 Roman Zippel - - * src/m68k/ffi.c (ffi_prep_args,ffi_prep_cif_machdep): Fix - numerous test suite failures. - * src/m68k/sysv.S (ffi_call_SYSV): Likewise. - -2007-04-11 Paolo Bonzini - - * Makefile.am (EXTRA_DIST): Bring up to date. - * Makefile.in: Regenerate. - * src/frv/eabi.S: Remove RCS keyword. - -2007-04-06 Richard Henderson - - * configure.ac: Tidy target case. - (HAVE_LONG_DOUBLE): Allow the target to override. - * configure: Regenerate. - * include/ffi.h.in: Don't define ffi_type_foo if - LIBFFI_HIDE_BASIC_TYPES is defined. - (ffi_type_longdouble): If not HAVE_LONG_DOUBLE, define - to ffi_type_double. - * types.c (LIBFFI_HIDE_BASIC_TYPES): Define. - (FFI_TYPEDEF, ffi_type_void): Mark the data const. - (ffi_type_longdouble): Special case for Alpha. Don't define - if long double == double. - - * src/alpha/ffi.c (FFI_TYPE_LONGDOUBLE): Assert unique value. - (ffi_prep_cif_machdep): Handle it as the 128-bit type. - (ffi_call, ffi_closure_osf_inner): Likewise. - (ffi_closure_osf_inner): Likewise. Mark hidden. - (ffi_call_osf, ffi_closure_osf): Mark hidden. - * src/alpha/ffitarget.h (FFI_LAST_ABI): Tidy definition. - * src/alpha/osf.S (ffi_call_osf, ffi_closure_osf): Mark hidden. - (load_table): Handle 128-bit long double. - - * testsuite/libffi.call/float4.c: Add -mieee for alpha. - -2007-04-06 Tom Tromey - - PR libffi/31491: - * README: Fixed bug in example. - -2007-04-03 Jakub Jelinek - - * src/closures.c: Include sys/statfs.h. - (_GNU_SOURCE): Define on Linux. - (FFI_MMAP_EXEC_SELINUX): Define. - (selinux_enabled): New variable. - (selinux_enabled_check): New function. - (is_selinux_enabled): Define. - (dlmmap): Use it. - -2007-03-24 Uros Bizjak - - * testsuite/libffi.call/return_fl2.c (return_fl): Mark as static. - Use 'volatile float sum' to create sum of floats to avoid false - negative due to excess precision on ix86 targets. - (main): Ditto. - -2007-03-08 Alexandre Oliva - - * src/powerpc/ffi.c (flush_icache): Fix left-over from previous - patch. - (ffi_prep_closure_loc): Remove unneeded casts. Add needed ones. - -2007-03-07 Alexandre Oliva - - * include/ffi.h.in (ffi_closure_alloc, ffi_closure_free): New. - (ffi_prep_closure_loc): New. - (ffi_prep_raw_closure_loc): New. - (ffi_prep_java_raw_closure_loc): New. - * src/closures.c: New file. - * src/dlmalloc.c [FFI_MMAP_EXEC_WRIT] (struct malloc_segment): - Replace sflags with exec_offset. - [FFI_MMAP_EXEC_WRIT] (mmap_exec_offset, add_segment_exec_offset, - sub_segment_exec_offset): New macros. - (get_segment_flags, set_segment_flags, check_segment_merge): New - macros. - (is_mmapped_segment, is_extern_segment): Use get_segment_flags. - (add_segment, sys_alloc, create_mspace, create_mspace_with_base, - destroy_mspace): Use new macros. - (sys_alloc): Silence warning. - * Makefile.am (libffi_la_SOURCES): Add src/closures.c. - * Makefile.in: Rebuilt. - * src/prep_cif [FFI_CLOSURES] (ffi_prep_closure): Implement in - terms of ffi_prep_closure_loc. - * src/raw_api.c (ffi_prep_raw_closure_loc): Renamed and adjusted - from... - (ffi_prep_raw_closure): ... this. Re-implement in terms of the - renamed version. - * src/java_raw_api (ffi_prep_java_raw_closure_loc): Renamed and - adjusted from... - (ffi_prep_java_raw_closure): ... this. Re-implement in terms of - the renamed version. - * src/alpha/ffi.c (ffi_prep_closure_loc): Renamed from - (ffi_prep_closure): ... this. - * src/pa/ffi.c: Likewise. - * src/cris/ffi.c: Likewise. Adjust. - * src/frv/ffi.c: Likewise. - * src/ia64/ffi.c: Likewise. - * src/mips/ffi.c: Likewise. - * src/powerpc/ffi_darwin.c: Likewise. - * src/s390/ffi.c: Likewise. - * src/sh/ffi.c: Likewise. - * src/sh64/ffi.c: Likewise. - * src/sparc/ffi.c: Likewise. - * src/x86/ffi64.c: Likewise. - * src/x86/ffi.c: Likewise. - (FFI_INIT_TRAMPOLINE): Adjust. - (ffi_prep_raw_closure_loc): Renamed and adjusted from... - (ffi_prep_raw_closure): ... this. - * src/powerpc/ffi.c (ffi_prep_closure_loc): Renamed from - (ffi_prep_closure): ... this. - (flush_icache): Adjust. - -2007-03-07 Alexandre Oliva - - * src/dlmalloc.c: New file, imported version 2.8.3 of Doug - Lea's malloc. - -2007-03-01 Brooks Moses - - * Makefile.am: Add dummy install-pdf target. - * Makefile.in: Regenerate - -2007-02-13 Andreas Krebbel - - * src/s390/ffi.c (ffi_prep_args, ffi_prep_cif_machdep, - ffi_closure_helper_SYSV): Add long double handling. - -2007-02-02 Jakub Jelinek - - * src/powerpc/linux64.S (ffi_call_LINUX64): Move restore of r2 - immediately after bctrl instruction. - -2007-01-18 Alexandre Oliva - - * Makefile.am (all-recursive, install-recursive, - mostlyclean-recursive, clean-recursive, distclean-recursive, - maintainer-clean-recursive): Add missing targets. - * Makefile.in: Rebuilt. - -2006-12-14 Andreas Tobler - - * configure.ac: Add TARGET for x86_64-*-darwin*. - * Makefile.am (nodist_libffi_la_SOURCES): Add rules for 64-bit sources - for X86_DARWIN. - * src/x86/ffitarget.h: Set trampoline size for x86_64-*-darwin*. - * src/x86/darwin64.S: New file for x86_64-*-darwin* support. - * configure: Regenerate. - * Makefile.in: Regenerate. - * include/Makefile.in: Regenerate. - * testsuite/Makefile.in: Regenerate. - * testsuite/libffi.special/unwindtest_ffi_call.cc: New test case for - ffi_call only. - -2006-12-13 Andreas Tobler - - * aclocal.m4: Regenerate with aclocal -I .. as written in the - Makefile.am. - -2006-10-31 Geoffrey Keating - - * src/powerpc/ffi_darwin.c (darwin_adjust_aggregate_sizes): New. - (ffi_prep_cif_machdep): Call darwin_adjust_aggregate_sizes for - Darwin. - * testsuite/libffi.call/nested_struct4.c: Remove Darwin XFAIL. - * testsuite/libffi.call/nested_struct6.c: Remove Darwin XFAIL. - -2006-10-10 Paolo Bonzini - Sandro Tolaini - - * configure.ac [i*86-*-darwin*]: Set X86_DARWIN symbol and - conditional. - * configure: Regenerated. - * Makefile.am (nodist_libffi_la_SOURCES) [X86_DARWIN]: New case. - (EXTRA_DIST): Add src/x86/darwin.S. - * Makefile.in: Regenerated. - * include/Makefile.in: Regenerated. - * testsuite/Makefile.in: Regenerated. - - * src/x86/ffi.c (ffi_prep_cif_machdep) [X86_DARWIN]: Treat like - X86_WIN32, and additionally align stack to 16 bytes. - * src/x86/darwin.S: New, based on sysv.S. - * src/prep_cif.c (ffi_prep_cif) [X86_DARWIN]: Align > 8-byte structs. - -2006-09-12 David Daney - - PR libffi/23935 - * include/Makefile.am: Install both ffi.h and ffitarget.h in - $(libdir)/gcc/$(target_alias)/$(gcc_version)/include. - * aclocal.m4: Regenerated for automake 1.9.6. - * Makefile.in: Regenerated. - * include/Makefile.in: Regenerated. - * testsuite/Makefile.in: Regenerated. - -2006-08-17 Andreas Tobler - - * include/ffi_common.h (struct): Revert accidental commit. - -2006-08-15 Andreas Tobler - - * include/ffi_common.h: Remove lint directives. - * include/ffi.h.in: Likewise. - -2006-07-25 Torsten Schoenfeld - - * include/ffi.h.in (ffi_type_ulong, ffi_type_slong): Define correctly - for 32-bit architectures. - * testsuite/libffi.call/return_ul.c: New test case. - -2006-07-19 David Daney - - * testsuite/libffi.call/closure_fn6.c: Remove xfail for mips, - xfail remains for mips64. - -2006-05-23 Carlos O'Donell - - * Makefile.am: Add install-html target. Add install-html to .PHONY - * Makefile.in: Regenerate. - * aclocal.m4: Regenerate. - * include/Makefile.in: Regenerate. - * testsuite/Makefile.in: Regenerate. - -2006-05-18 John David Anglin - - * pa/ffi.c (ffi_prep_args_pa32): Load floating point arguments from - stack slot. - -2006-04-22 Andreas Tobler - - * README: Remove notice about 'Crazy Comments'. - * src/debug.c: Remove lint directives. Cleanup white spaces. - * src/java_raw_api.c: Likewise. - * src/prep_cif.c: Likewise. - * src/raw_api.c: Likewise. - * src/ffitest.c: Delete. No longer needed, all test cases migrated - to the testsuite. - * src/arm/ffi.c: Remove lint directives. - * src/m32r/ffi.c: Likewise. - * src/pa/ffi.c: Likewise. - * src/powerpc/ffi.c: Likewise. - * src/powerpc/ffi_darwin.c: Likewise. - * src/sh/ffi.c: Likewise. - * src/sh64/ffi.c: Likewise. - * src/x86/ffi.c: Likewise. - * testsuite/libffi.call/float2.c: Likewise. - * testsuite/libffi.call/promotion.c: Likewise. - * testsuite/libffi.call/struct1.c: Likewise. - -2006-04-13 Andreas Tobler - - * src/pa/hpux32.S: Correct unwind offset calculation for - ffi_closure_pa32. - * src/pa/linux.S: Likewise. - -2006-04-12 James E Wilson - - PR libgcj/26483 - * src/ia64/ffi.c (stf_spill, ldf_fill): Rewrite as macros. - (hfa_type_load): Call stf_spill. - (hfa_type_store): Call ldf_fill. - (ffi_call): Adjust calls to above routines. Add local temps for - macro result. - -2006-04-10 Matthias Klose - - * testsuite/lib/libffi-dg.exp (libffi-init): Recognize multilib - directory names containing underscores. - -2006-04-07 James E Wilson - - * testsuite/libffi.call/float4.c: New testcase. - -2006-04-05 John David Anglin - Andreas Tobler - - * Makefile.am: Add PA_HPUX port. - * Makefile.in: Regenerate. - * include/Makefile.in: Likewise. - * testsuite/Makefile.in: Likewise. - * configure.ac: Add PA_HPUX rules. - * configure: Regenerate. - * src/pa/ffitarget.h: Rename linux target to PA_LINUX. - Add PA_HPUX and PA64_HPUX. - Rename FFI_LINUX ABI to FFI_PA32 ABI. - (FFI_TRAMPOLINE_SIZE): Define for 32-bit HP-UX targets. - (FFI_TYPE_SMALL_STRUCT2): Define. - (FFI_TYPE_SMALL_STRUCT4): Likewise. - (FFI_TYPE_SMALL_STRUCT8): Likewise. - (FFI_TYPE_SMALL_STRUCT3): Redefine. - (FFI_TYPE_SMALL_STRUCT5): Likewise. - (FFI_TYPE_SMALL_STRUCT6): Likewise. - (FFI_TYPE_SMALL_STRUCT7): Likewise. - * src/pa/ffi.c (ROUND_DOWN): Delete. - (fldw, fstw, fldd, fstd): Use '__asm__'. - (ffi_struct_type): Add support for FFI_TYPE_SMALL_STRUCT2, - FFI_TYPE_SMALL_STRUCT4 and FFI_TYPE_SMALL_STRUCT8. - (ffi_prep_args_LINUX): Rename to ffi_prep_args_pa32. Update comment. - Simplify incrementing of stack slot variable. Change type of local - 'n' to unsigned int. - (ffi_size_stack_LINUX): Rename to ffi_size_stack_pa32. Handle long - double on PA_HPUX. - (ffi_prep_cif_machdep): Likewise. - (ffi_call): Likewise. - (ffi_closure_inner_LINUX): Rename to ffi_closure_inner_pa32. Change - return type to ffi_status. Simplify incrementing of stack slot - variable. Only copy floating point argument registers when PA_LINUX - is true. Reformat debug statement. - Add support for FFI_TYPE_SMALL_STRUCT2, FFI_TYPE_SMALL_STRUCT4 and - FFI_TYPE_SMALL_STRUCT8. - (ffi_closure_LINUX): Rename to ffi_closure_pa32. Add 'extern' to - declaration. - (ffi_prep_closure): Make linux trampoline conditional on PA_LINUX. - Add nops to cache flush. Add trampoline for PA_HPUX. - * src/pa/hpux32.S: New file. - * src/pa/linux.S (ffi_call_LINUX): Rename to ffi_call_pa32. Rename - ffi_prep_args_LINUX to ffi_prep_args_pa32. - Localize labels. Add support for 2, 4 and 8-byte small structs. Handle - unaligned destinations in 3, 5, 6 and 7-byte small structs. Order - argument type checks so that common argument types appear first. - (ffi_closure_LINUX): Rename to ffi_closure_pa32. Rename - ffi_closure_inner_LINUX to ffi_closure_inner_pa32. - -2006-03-24 Alan Modra - - * src/powerpc/ffitarget.h (enum ffi_abi): Add FFI_LINUX. Default - for 32-bit using IBM extended double format. Fix FFI_LAST_ABI. - * src/powerpc/ffi.c (ffi_prep_args_SYSV): Handle linux variant of - FFI_TYPE_LONGDOUBLE. - (ffi_prep_args64): Assert using IBM extended double. - (ffi_prep_cif_machdep): Don't munge FFI_TYPE_LONGDOUBLE type. - Handle FFI_LINUX FFI_TYPE_LONGDOUBLE return and args. - (ffi_call): Handle FFI_LINUX. - (ffi_closure_helper_SYSV): Non FFI_LINUX long double return needs - gpr3 return pointer as for struct return. Handle FFI_LINUX - FFI_TYPE_LONGDOUBLE return and args. Don't increment "nf" - unnecessarily. - * src/powerpc/ppc_closure.S (ffi_closure_SYSV): Load both f1 and f2 - for FFI_TYPE_LONGDOUBLE. Move epilogue insns into case table. - Don't use r6 as pointer to results, instead use sp offset. Don't - make a special call to load lr with case table address, instead - use offset from previous call. - * src/powerpc/sysv.S (ffi_call_SYSV): Save long double return. - * src/powerpc/linux64.S (ffi_call_LINUX64): Simplify long double - return. - -2006-03-15 Kaz Kojima - - * src/sh64/ffi.c (ffi_prep_cif_machdep): Handle float arguments - passed with FP registers correctly. - (ffi_closure_helper_SYSV): Likewise. - * src/sh64/sysv.S: Likewise. - -2006-03-01 Andreas Tobler - - * testsuite/libffi.special/unwindtest.cc (closure_test_fn): Mark cif, - args and userdata unused. - (closure_test_fn1): Mark cif and userdata unused. - (main): Remove unused res. - -2006-02-28 Andreas Tobler - - * testsuite/libffi.call/call.exp: Adjust FSF address. Add test runs for - -O2, -O3, -Os and the warning flags -W -Wall. - * testsuite/libffi.special/special.exp: Likewise. - * testsuite/libffi.call/ffitest.h: Add an __UNUSED__ macro to mark - unused parameter unused for gcc or else do nothing. - * testsuite/libffi.special/ffitestcxx.h: Likewise. - * testsuite/libffi.call/cls_12byte.c (cls_struct_12byte_gn): Mark cif - and userdata unused. - * testsuite/libffi.call/cls_16byte.c (cls_struct_16byte_gn): Likewise. - * testsuite/libffi.call/cls_18byte.c (cls_struct_18byte_gn): Likewise. - * testsuite/libffi.call/cls_19byte.c (cls_struct_19byte_gn): Likewise. - * testsuite/libffi.call/cls_1_1byte.c (cls_struct_1_1byte_gn): Likewise. - * testsuite/libffi.call/cls_20byte.c (cls_struct_20byte_gn): Likewise. - * testsuite/libffi.call/cls_20byte1.c (cls_struct_20byte_gn): Likewise. - * testsuite/libffi.call/cls_24byte.c (cls_struct_24byte_gn): Likewise. - * testsuite/libffi.call/cls_2byte.c (cls_struct_2byte_gn): Likewise. - * testsuite/libffi.call/cls_3_1byte.c (cls_struct_3_1byte_gn): Likewise. - * testsuite/libffi.call/cls_3byte1.c (cls_struct_3byte_gn): Likewise. - * testsuite/libffi.call/cls_3byte2.c (cls_struct_3byte_gn1): Likewise. - * testsuite/libffi.call/cls_4_1byte.c (cls_struct_4_1byte_gn): Likewise. - * testsuite/libffi.call/cls_4byte.c (cls_struct_4byte_gn): Likewise. - * testsuite/libffi.call/cls_5_1_byte.c (cls_struct_5byte_gn): Likewise. - * testsuite/libffi.call/cls_5byte.c (cls_struct_5byte_gn): Likewise. - * testsuite/libffi.call/cls_64byte.c (cls_struct_64byte_gn): Likewise. - * testsuite/libffi.call/cls_6_1_byte.c (cls_struct_6byte_gn): Likewise. - * testsuite/libffi.call/cls_6byte.c (cls_struct_6byte_gn): Likewise. - * testsuite/libffi.call/cls_7_1_byte.c (cls_struct_7byte_gn): Likewise. - * testsuite/libffi.call/cls_7byte.c (cls_struct_7byte_gn): Likewise. - * testsuite/libffi.call/cls_8byte.c (cls_struct_8byte_gn): Likewise. - * testsuite/libffi.call/cls_9byte1.c (cls_struct_9byte_gn): Likewise. - * testsuite/libffi.call/cls_9byte2.c (cls_struct_9byte_gn): Likewise. - * testsuite/libffi.call/cls_align_double.c (cls_struct_align_gn): - Likewise. - * testsuite/libffi.call/cls_align_float.c (cls_struct_align_gn): - Likewise. - * testsuite/libffi.call/cls_align_longdouble.c (cls_struct_align_gn): - Likewise. - * testsuite/libffi.call/cls_align_pointer.c (cls_struct_align_fn): Cast - void* to avoid compiler warning. - (main): Likewise. - (cls_struct_align_gn): Mark cif and userdata unused. - * testsuite/libffi.call/cls_align_sint16.c (cls_struct_align_gn): - Likewise. - * testsuite/libffi.call/cls_align_sint32.c (cls_struct_align_gn): - Likewise. - * testsuite/libffi.call/cls_align_sint64.c (cls_struct_align_gn): - Likewise. - * testsuite/libffi.call/cls_align_uint16.c (cls_struct_align_gn): - Likewise. - * testsuite/libffi.call/cls_align_uint32.c (cls_struct_align_gn): - Likewise. - * testsuite/libffi.call/cls_double.c (cls_ret_double_fn): Likewise. - * testsuite/libffi.call/cls_float.c (cls_ret_float_fn): Likewise. - * testsuite/libffi.call/cls_multi_schar.c (test_func_gn): Mark cif and - data unused. - (main): Cast res_call to silence gcc. - * testsuite/libffi.call/cls_multi_sshort.c (test_func_gn): Mark cif and - data unused. - (main): Cast res_call to silence gcc. - * testsuite/libffi.call/cls_multi_sshortchar.c (test_func_gn): Mark cif - and data unused. - (main): Cast res_call to silence gcc. - * testsuite/libffi.call/cls_multi_uchar.c (test_func_gn): Mark cif and - data unused. - (main): Cast res_call to silence gcc. - * testsuite/libffi.call/cls_multi_ushort.c (test_func_gn): Mark cif and - data unused. - (main): Cast res_call to silence gcc. - * testsuite/libffi.call/cls_multi_ushortchar.c (test_func_gn): Mark cif - and data unused. - (main): Cast res_call to silence gcc. - * testsuite/libffi.call/cls_schar.c (cls_ret_schar_fn): Mark cif and - userdata unused. - (cls_ret_schar_fn): Cast printf parameter to silence gcc. - * testsuite/libffi.call/cls_sint.c (cls_ret_sint_fn): Mark cif and - userdata unused. - (cls_ret_sint_fn): Cast printf parameter to silence gcc. - * testsuite/libffi.call/cls_sshort.c (cls_ret_sshort_fn): Mark cif and - userdata unused. - (cls_ret_sshort_fn): Cast printf parameter to silence gcc. - * testsuite/libffi.call/cls_uchar.c (cls_ret_uchar_fn): Mark cif and - userdata unused. - (cls_ret_uchar_fn): Cast printf parameter to silence gcc. - * testsuite/libffi.call/cls_uint.c (cls_ret_uint_fn): Mark cif and - userdata unused. - (cls_ret_uint_fn): Cast printf parameter to silence gcc. - * testsuite/libffi.call/cls_ulonglong.c (cls_ret_ulonglong_fn): Mark cif - and userdata unused. - * testsuite/libffi.call/cls_ushort.c (cls_ret_ushort_fn): Mark cif and - userdata unused. - (cls_ret_ushort_fn): Cast printf parameter to silence gcc. - * testsuite/libffi.call/float.c (floating): Remove unused parameter e. - * testsuite/libffi.call/float1.c (main): Remove unused variable i. - Cleanup white spaces. - * testsuite/libffi.call/negint.c (checking): Remove unused variable i. - * testsuite/libffi.call/nested_struct.c (cls_struct_combined_gn): Mark - cif and userdata unused. - * testsuite/libffi.call/nested_struct1.c (cls_struct_combined_gn): - Likewise. - * testsuite/libffi.call/nested_struct10.c (B_gn): Likewise. - * testsuite/libffi.call/nested_struct2.c (B_fn): Adjust printf - formatters to silence gcc. - (B_gn): Mark cif and userdata unused. - * testsuite/libffi.call/nested_struct3.c (B_gn): Mark cif and userdata - unused. - * testsuite/libffi.call/nested_struct4.c: Mention related PR. - (B_gn): Mark cif and userdata unused. - * testsuite/libffi.call/nested_struct5.c (B_gn): Mark cif and userdata - unused. - * testsuite/libffi.call/nested_struct6.c: Mention related PR. - (B_gn): Mark cif and userdata unused. - * testsuite/libffi.call/nested_struct7.c (B_gn): Mark cif and userdata - unused. - * testsuite/libffi.call/nested_struct8.c (B_gn): Likewise. - * testsuite/libffi.call/nested_struct9.c (B_gn): Likewise. - * testsuite/libffi.call/problem1.c (stub): Likewise. - * testsuite/libffi.call/pyobjc-tc.c (main): Cast the result to silence - gcc. - * testsuite/libffi.call/return_fl2.c (return_fl): Add the note mentioned - in the last commit for this test case in the test case itself. - * testsuite/libffi.call/closure_fn0.c (closure_test_fn0): Mark cif as - unused. - * testsuite/libffi.call/closure_fn1.c (closure_test_fn1): Likewise. - * testsuite/libffi.call/closure_fn2.c (closure_test_fn2): Likewise. - * testsuite/libffi.call/closure_fn3.c (closure_test_fn3): Likewise. - * testsuite/libffi.call/closure_fn4.c (closure_test_fn0): Likewise. - * testsuite/libffi.call/closure_fn5.c (closure_test_fn5): Likewise. - * testsuite/libffi.call/closure_fn6.c (closure_test_fn0): Likewise. - -2006-02-22 Kaz Kojima - - * src/sh/sysv.S: Fix register numbers in the FDE for - ffi_closure_SYSV. - -2006-02-20 Andreas Tobler - - * testsuite/libffi.call/return_fl2.c (return_fl): Remove static - declaration to avoid a false negative on ix86. See PR323. - -2006-02-18 Kaz Kojima - - * src/sh/ffi.c (ffi_closure_helper_SYSV): Remove unused variable - and cast integer to void * if needed. Update the pointer to - the FP register saved area correctly. - -2006-02-17 Andreas Tobler - - * testsuite/libffi.call/nested_struct6.c: XFAIL this test until PR25630 - is fixed. - * testsuite/libffi.call/nested_struct4.c: Likewise. - -2006-02-16 Andreas Tobler - - * testsuite/libffi.call/return_dbl.c: New test case. - * testsuite/libffi.call/return_dbl1.c: Likewise. - * testsuite/libffi.call/return_dbl2.c: Likewise. - * testsuite/libffi.call/return_fl.c: Likewise. - * testsuite/libffi.call/return_fl1.c: Likewise. - * testsuite/libffi.call/return_fl2.c: Likewise. - * testsuite/libffi.call/return_fl3.c: Likewise. - * testsuite/libffi.call/closure_fn6.c: Likewise. - - * testsuite/libffi.call/nested_struct2.c: Remove ffi_type_mylong - definition. - * testsuite/libffi.call/ffitest.h: Add ffi_type_mylong definition - here to be used by other test cases too. - - * testsuite/libffi.call/nested_struct10.c: New test case. - * testsuite/libffi.call/nested_struct9.c: Likewise. - * testsuite/libffi.call/nested_struct8.c: Likewise. - * testsuite/libffi.call/nested_struct7.c: Likewise. - * testsuite/libffi.call/nested_struct6.c: Likewise. - * testsuite/libffi.call/nested_struct5.c: Likewise. - * testsuite/libffi.call/nested_struct4.c: Likewise. - -2006-01-21 Andreas Tobler - - * configure.ac: Enable libffi for sparc64-*-freebsd*. - * configure: Rebuilt. - -2006-01-18 Jakub Jelinek - - * src/powerpc/sysv.S (smst_two_register): Don't call __ashldi3, - instead do the shifting inline. - * src/powerpc/ppc_closure.S (ffi_closure_SYSV): Don't compute %r5 - shift count unconditionally. Simplify load sequences for 1, 2, 3, 4 - and 8 byte structs, for the remaining struct sizes don't call - __lshrdi3, instead do the shifting inline. - -2005-12-07 Thiemo Seufer - - * src/mips/ffitarget.h: Remove obsolete sgidefs.h include. Add - missing parentheses. - * src/mips/o32.S (ffi_call_O32): Code formatting. Define - and use A3_OFF, FP_OFF, RA_OFF. Micro-optimizations. - (ffi_closure_O32): Likewise, but with newly defined A3_OFF2, - A2_OFF2, A1_OFF2, A0_OFF2, RA_OFF2, FP_OFF2, S0_OFF2, GP_OFF2, - V1_OFF2, V0_OFF2, FA_1_1_OFF2, FA_1_0_OFF2, FA_0_1_OFF2, - FA_0_0_OFF2. - * src/mips/ffi.c (ffi_prep_args): Code formatting. Fix - endianness bugs. - (ffi_prep_closure): Improve trampoline instruction scheduling. - (ffi_closure_mips_inner_O32): Fix endianness bugs. - -2005-12-03 Alan Modra - - * src/powerpc/ffi.c: Formatting. - (ffi_prep_args_SYSV): Avoid possible aliasing problems by using unions. - (ffi_prep_args64): Likewise. - -2005-09-30 Geoffrey Keating - - * testsuite/lib/libffi-dg.exp (libffi_target_compile): For - darwin, use -shared-libgcc not -lgcc_s, and explain why. - -2005-09-26 Tom Tromey - - * testsuite/libffi.call/float1.c (value_type): New typedef. - (CANARY): New define. - (main): Check for result buffer overflow. - * src/powerpc/linux64.S: Handle linux64 long double returns. - * src/powerpc/ffi.c (FLAG_RETURNS_128BITS): New constant. - (ffi_prep_cif_machdep): Handle linux64 long double returns. - -2005-08-25 Alan Modra - - PR target/23404 - * src/powerpc/ffi.c (ffi_prep_args_SYSV): Correct placement of stack - homed fp args. - (ffi_status ffi_prep_cif_machdep): Correct stack sizing for same. - -2005-08-11 Jakub Jelinek - - * configure.ac (HAVE_HIDDEN_VISIBILITY_ATTRIBUTE): New test. - (AH_BOTTOM): Add FFI_HIDDEN definition. - * configure: Rebuilt. - * fficonfig.h.in: Rebuilt. - * src/powerpc/ffi.c (hidden): Remove. - (ffi_closure_LINUX64, ffi_prep_args64, ffi_call_LINUX64, - ffi_closure_helper_LINUX64): Use FFI_HIDDEN instead of hidden. - * src/powerpc/linux64_closure.S (ffi_closure_LINUX64, - .ffi_closure_LINUX64): Use FFI_HIDDEN instead of .hidden. - * src/x86/ffi.c (ffi_closure_SYSV, ffi_closure_raw_SYSV): Remove, - add FFI_HIDDEN to its prototype. - (ffi_closure_SYSV_inner): New. - * src/x86/sysv.S (ffi_closure_SYSV, ffi_closure_raw_SYSV): New. - * src/x86/win32.S (ffi_closure_SYSV, ffi_closure_raw_SYSV): New. - -2005-08-10 Alfred M. Szmidt - - PR libffi/21819: - * configure: Rebuilt. - * configure.ac: Handle i*86-*-gnu*. - -2005-08-09 Jakub Jelinek - - * src/powerpc/ppc_closure.S (ffi_closure_SYSV): Use - DW_CFA_offset_extended_sf rather than - DW_CFA_GNU_negative_offset_extended. - * src/powerpc/sysv.S (ffi_call_SYSV): Likewise. - -2005-07-22 SUGIOKA Toshinobu - - * src/sh/sysv.S (ffi_call_SYSV): Stop argument popping correctly - on sh3. - (ffi_closure_SYSV): Change the stack layout for sh3 struct argument. - * src/sh/ffi.c (ffi_prep_args): Fix sh3 argument copy, when it is - partially on register. - (ffi_closure_helper_SYSV): Likewise. - (ffi_prep_cif_machdep): Don't set too many cif->flags. - -2005-07-20 Kaz Kojima - - * src/sh/ffi.c (ffi_call): Handle small structures correctly. - Remove empty line. - * src/sh64/ffi.c (simple_type): Remove. - (return_type): Handle small structures correctly. - (ffi_prep_args): Likewise. - (ffi_call): Likewise. - (ffi_closure_helper_SYSV): Likewise. - * src/sh64/sysv.S (ffi_call_SYSV): Handle 1, 2 and 4-byte return. - Emit position independent code if PIC and remove wrong datalabel - prefixes from EH data. - -2005-07-19 Andreas Tobler - - * Makefile.am (nodist_libffi_la_SOURCES): Add POWERPC_FREEBSD. - * Makefile.in: Regenerate. - * include/Makefile.in: Likewise. - * testsuite/Makefile.in: Likewise. - * configure.ac: Add POWERPC_FREEBSD rules. - * configure: Regenerate. - * src/powerpc/ffitarget.h: Add POWERPC_FREEBSD rules. - (FFI_SYSV_TYPE_SMALL_STRUCT): Define. - * src/powerpc/ffi.c: Add flags to handle small structure returns - in ffi_call_SYSV. - (ffi_prep_cif_machdep): Handle small structures for SYSV 4 ABI. - Aka FFI_SYSV. - (ffi_closure_helper_SYSV): Likewise. - * src/powerpc/ppc_closure.S: Add return types for small structures. - * src/powerpc/sysv.S: Add bits to handle small structures for - final SYSV 4 ABI. - -2005-07-10 Andreas Tobler - - * testsuite/libffi.call/cls_5_1_byte.c: New test file. - * testsuite/libffi.call/cls_6_1_byte.c: Likewise. - * testsuite/libffi.call/cls_7_1_byte.c: Likewise. - -2005-07-05 Randolph Chung - - * src/pa/ffi.c (ffi_struct_type): Rename FFI_TYPE_SMALL_STRUCT1 - as FFI_TYPE_SMALL_STRUCT3. Break out handling for 5-7 byte - structures. Kill compilation warnings. - (ffi_closure_inner_LINUX): Print return values as hex in debug - message. Rename FFI_TYPE_SMALL_STRUCT1 as FFI_TYPE_SMALL_STRUCT3. - Properly handle 5-7 byte structure returns. - * src/pa/ffitarget.h (FFI_TYPE_SMALL_STRUCT1) - (FFI_TYPE_SMALL_STRUCT2): Remove. - (FFI_TYPE_SMALL_STRUCT3, FFI_TYPE_SMALL_STRUCT5) - (FFI_TYPE_SMALL_STRUCT6, FFI_TYPE_SMALL_STRUCT7): Define. - * src/pa/linux.S: Mark source file as using PA1.1 assembly. - (checksmst1, checksmst2): Remove. - (checksmst3): Optimize handling of 3-byte struct returns. - (checksmst567): Properly handle 5-7 byte struct returns. - -2005-06-15 Rainer Orth - - PR libgcj/21943 - * src/mips/n32.S: Enforce PIC code. - * src/mips/o32.S: Likewise. - -2005-06-15 Rainer Orth - - * configure.ac: Treat i*86-*-solaris2.10 and up as X86_64. - * configure: Regenerate. - -2005-06-01 Alan Modra - - * src/powerpc/ppc_closure.S (ffi_closure_SYSV): Don't use JUMPTARGET - to call ffi_closure_helper_SYSV. Append @local instead. - * src/powerpc/sysv.S (ffi_call_SYSV): Likewise for ffi_prep_args_SYSV. - -2005-05-17 Kelley Cook - - * configure.ac: Use AC_C_BIGENDIAN instead of AC_C_BIGENDIAN_CROSS. - Use AC_CHECK_SIZEOF instead of AC_COMPILE_CHECK_SIZEOF. - * Makefile.am (ACLOCAL_AMFLAGS): Remove -I ../config. - * aclocal.m4, configure, fficonfig.h.in, Makefile.in, - include/Makefile.in, testsuite/Makefile.in: Regenerate. - -2005-05-09 Mike Stump - - * configure: Regenerate. - -2005-05-08 Richard Henderson - - PR libffi/21285 - * src/alpha/osf.S: Update unwind into to match code. - -2005-05-04 Andreas Degert - Richard Henderson - - * src/x86/ffi64.c (ffi_prep_cif_machdep): Save sse-used flag in - bit 11 of flags. - (ffi_call): Mask return type field. Pass ssecount to ffi_call_unix64. - (ffi_prep_closure): Set carry bit if sse-used flag set. - * src/x86/unix64.S (ffi_call_unix64): Add ssecount argument. - Only load sse registers if ssecount non-zero. - (ffi_closure_unix64): Only save sse registers if carry set on entry. - -2005-04-29 Ralf Corsepius - - * configure.ac: Add i*86-*-rtems*, sparc*-*-rtems*, - powerpc-*rtems*, arm*-*-rtems*, sh-*-rtems*. - * configure: Regenerate. - -2005-04-20 Hans-Peter Nilsson - - * testsuite/lib/libffi-dg.exp (libffi-dg-test-1): In regsub use, - have Tcl8.3-compatible intermediate variable. - -2005-04-18 Simon Posnjak - Hans-Peter Nilsson - - * Makefile.am: Add CRIS support. - * configure.ac: Likewise. - * Makefile.in, configure, testsuite/Makefile.in, - include/Makefile.in: Regenerate. - * src/cris: New directory. - * src/cris/ffi.c, src/cris/sysv.S, src/cris/ffitarget.h: New files. - * src/prep_cif.c (ffi_prep_cif): Wrap in #ifndef __CRIS__. - - * testsuite/lib/libffi-dg.exp (libffi-dg-test-1): Replace \n with - \r?\n in output tests. - -2005-04-12 Mike Stump - - * configure: Regenerate. - -2005-03-30 Hans Boehm - - * src/ia64/ffitarget.h (ffi_arg): Use long long instead of DI. - -2005-03-30 Steve Ellcey - - * src/ia64/ffitarget.h (ffi_arg) ADD DI attribute. - (ffi_sarg) Ditto. - * src/ia64/unix.S (ffi_closure_unix): Extend gp - to 64 bits in ILP32 mode. - Load 64 bits even for short data. - -2005-03-23 Mike Stump - - * src/powerpc/darwin.S: Update for -m64 multilib. - * src/powerpc/darwin_closure.S: Likewise. - -2005-03-21 Zack Weinberg - - * configure.ac: Do not invoke TL_AC_GCC_VERSION. - Do not set tool_include_dir. - * aclocal.m4, configure, Makefile.in, testsuite/Makefile.in: - Regenerate. - * include/Makefile.am: Set gcc_version and toollibffidir. - * include/Makefile.in: Regenerate. - -2005-02-22 Andrew Haley - - * src/powerpc/ffi.c (ffi_prep_cif_machdep): Bump alignment to - odd-numbered register pairs for 64-bit integer types. - -2005-02-23 Andreas Tobler - - PR libffi/20104 - * testsuite/libffi.call/return_ll1.c: New test case. - -2005-02-11 Janis Johnson - - * testsuite/libffi.call/cls_align_longdouble.c: Remove dg-options. - * testsuite/libffi.call/float.c: Ditto. - * testsuite/libffi.call/float2.c: Ditto. - * testsuite/libffi.call/float3.c: Ditto. - -2005-02-08 Andreas Tobler - - * src/frv/ffitarget.h: Remove PPC stuff which does not belong to frv. - -2005-01-12 Eric Botcazou - - * testsuite/libffi.special/special.exp (cxx_options): Add - -shared-libgcc. - -2004-12-31 Richard Henderson - - * src/types.c (FFI_AGGREGATE_TYPEDEF): Remove. - (FFI_TYPEDEF): Rename from FFI_INTEGRAL_TYPEDEF. Replace size and - offset parameters with a type parameter; deduce size and structure - alignment. Update all users. - -2004-12-31 Richard Henderson - - * src/types.c (FFI_TYPE_POINTER): Define with sizeof. - (FFI_TYPE_LONGDOUBLE): Fix for ia64. - * src/ia64/ffitarget.h (struct ffi_ia64_trampoline_struct): Move - into ffi_prep_closure. - * src/ia64/ia64_flags.h, src/ia64/ffi.c, src/ia64/unix.S: Rewrite - from scratch. - -2004-12-27 Richard Henderson - - * src/x86/unix64.S: Fix typo in unwind info. - -2004-12-25 Richard Henderson - - * src/x86/ffi64.c (struct register_args): Rename from stackLayout. - (enum x86_64_reg_class): Add X86_64_COMPLEX_X87_CLASS. - (merge_classes): Check for it. - (SSE_CLASS_P): New. - (classify_argument): Pass byte_offset by value; perform all updates - inside struct case. - (examine_argument): Add classes argument; handle - X86_64_COMPLEX_X87_CLASS. - (ffi_prep_args): Merge into ... - (ffi_call): ... here. Share stack frame with ffi_call_unix64. - (ffi_prep_cif_machdep): Setup cif->flags for proper structure return. - (ffi_fill_return_value): Remove. - (ffi_prep_closure): Remove dead assert. - (ffi_closure_unix64_inner): Rename from ffi_closure_UNIX64_inner. - Rewrite to use struct register_args instead of va_list. Create - flags for handling structure returns. - * src/x86/unix64.S: Remove dead strings. - (ffi_call_unix64): Rename from ffi_call_UNIX64. Rewrite to share - stack frame with ffi_call. Handle structure returns properly. - (float2sse, floatfloat2sse, double2sse): Remove. - (sse2float, sse2double, sse2floatfloat): Remove. - (ffi_closure_unix64): Rename from ffi_closure_UNIX64. Rewrite - to handle structure returns properly. - -2004-12-08 David Edelsohn - - * Makefile.am (AM_MAKEFLAGS): Remove duplicate LIBCFLAGS and - PICFLAG. - * Makefile.in: Regenerated. - -2004-12-02 Richard Sandiford - - * configure.ac: Use TL_AC_GCC_VERSION to set gcc_version. - * configure, aclocal.m4, Makefile.in: Regenerate. - * include/Makefile.in, testsuite/Makefile.in: Regenerate. - -2004-11-29 Kelley Cook - - * configure: Regenerate for libtool change. - -2004-11-25 Kelley Cook - - * configure: Regenerate for libtool reversion. - -2004-11-24 Kelley Cook - - * configure: Regenerate for libtool change. - -2004-11-23 John David Anglin - - * testsuite/lib/libffi-dg.exp: Use new procs in target-libpath.exp. - -2004-11-23 Richard Sandiford - - * src/mips/o32.S (ffi_call_O32, ffi_closure_O32): Use jalr instead - of jal. Use an absolute encoding for the frame information. - -2004-11-23 Kelley Cook - - * Makefile.am: Remove no-dependencies. Add ACLOCAL_AMFLAGS. - * acinclude.m4: Delete logic for sincludes. - * aclocal.m4, Makefile.in, configure: Regenerate. - * include/Makefile: Likewise. - * testsuite/Makefile: Likewise. - -2004-11-22 Eric Botcazou - - * src/sparc/ffi.c (ffi_prep_closure): Align doubles and 64-bit integers - on a 8-byte boundary. - * src/sparc/v8.S (ffi_closure_v8): Reserve frame space for arguments. - -2004-10-27 Richard Earnshaw - - * src/arm/ffi.c (ffi_prep_cif_machdep): Handle functions that return - long long values. Round stack allocation to a multiple of 8 bytes - for ATPCS compatibility. - * src/arm/sysv.S (ffi_call_SYSV): Rework to avoid use of APCS register - names. Handle returning long long types. Add Thumb and interworking - support. Improve soft-float code. - -2004-10-27 Richard Earnshaw - - * testsuite/lib/libffi-db.exp (load_gcc_lib): New function. - (libffi_exit): New function. - (libffi_init): Build the testglue wrapper if needed. - -2004-10-25 Eric Botcazou - - PR other/18138 - * testsuite/lib/libffi-dg.exp: Accept more than one multilib libgcc. - -2004-10-25 Kazuhiro Inaoka - - * src/m32r/libffitarget.h (FFI_CLOSURES): Set to 0. - -2004-10-20 Kaz Kojima - - * src/sh/sysv.S (ffi_call_SYSV): Don't align for double data. - * testsuite/libffi.call/float3.c: New test case. - -2004-10-18 Kaz Kojima - - * src/sh/ffi.c (ffi_prep_closure): Set T bit in trampoline for - the function returning a structure pointed with R2. - * src/sh/sysv.S (ffi_closure_SYSV): Use R2 as the pointer to - the structure return value if T bit set. Emit position - independent code and EH data if PIC. - -2004-10-13 Kazuhiro Inaoka - - * Makefile.am: Add m32r support. - * configure.ac: Likewise. - * Makefile.in: Regenerate. - * confiugre: Regenerate. - * src/types.c: Add m32r port to FFI_INTERNAL_TYPEDEF - (uint64, sint64, double, longdouble) - * src/m32r: New directory. - * src/m32r/ffi.c: New file. - * src/m32r/sysv.S: Likewise. - * src/m32r/ffitarget.h: Likewise. - -2004-10-02 Kaz Kojima - - * testsuite/libffi.call/negint.c: New test case. - -2004-09-14 H.J. Lu - - PR libgcj/17465 - * testsuite/lib/libffi-dg.exp: Don't use global ld_library_path. - Set up LD_LIBRARY_PATH, SHLIB_PATH, LD_LIBRARYN32_PATH, - LD_LIBRARY64_PATH, LD_LIBRARY_PATH_32, LD_LIBRARY_PATH_64 and - DYLD_LIBRARY_PATH. - -2004-09-05 Andreas Tobler - - * testsuite/libffi.call/many_win32.c: Remove whitespaces. - * testsuite/libffi.call/promotion.c: Likewise. - * testsuite/libffi.call/return_ll.c: Remove unused var. Cleanup - whitespaces. - * testsuite/libffi.call/return_sc.c: Likewise. - * testsuite/libffi.call/return_uc.c: Likewise. - -2004-09-05 Andreas Tobler - - * src/powerpc/darwin.S: Fix comments and identation. - * src/powerpc/darwin_closure.S: Likewise. - -2004-09-02 Andreas Tobler - - * src/powerpc/ffi_darwin.c: Add flag for longdouble return values. - (ffi_prep_args): Handle longdouble arguments. - (ffi_prep_cif_machdep): Set flags for longdouble. Calculate space for - longdouble. - (ffi_closure_helper_DARWIN): Add closure handling for longdouble. - * src/powerpc/darwin.S (_ffi_call_DARWIN): Add handling of longdouble - values. - * src/powerpc/darwin_closure.S (_ffi_closure_ASM): Likewise. - * src/types.c: Defined longdouble size and alignment for darwin. - -2004-09-02 Andreas Tobler - - * src/powerpc/aix.S: Remove whitespaces. - * src/powerpc/aix_closure.S: Likewise. - * src/powerpc/asm.h: Likewise. - * src/powerpc/ffi.c: Likewise. - * src/powerpc/ffitarget.h: Likewise. - * src/powerpc/linux64.S: Likewise. - * src/powerpc/linux64_closure.S: Likewise. - * src/powerpc/ppc_closure.S: Likewise. - * src/powerpc/sysv.S: Likewise. - -2004-08-30 Anthony Green - - * Makefile.am: Add frv support. - * Makefile.in, testsuite/Makefile.in: Rebuilt. - * configure.ac: Read configure.host. - * configure.in: Read configure.host. - * configure.host: New file. frv-elf needs libgloss. - * include/ffi.h.in: Force ffi_closure to have a nice big (8) - alignment. This is needed to frv and shouldn't harm the others. - * include/ffi_common.h (ALIGN_DOWN): New macro. - * src/frv/ffi.c, src/frv/ffitarget.h, src/frv/eabi.S: New files. - -2004-08-24 David Daney - - * testsuite/libffi.call/closure_fn0.c: Xfail mips64* instead of mips*. - * testsuite/libffi.call/closure_fn1.c: Likewise. - * testsuite/libffi.call/closure_fn2.c Likewise. - * testsuite/libffi.call/closure_fn3.c: Likewise. - * testsuite/libffi.call/closure_fn4.c: Likewise. - * testsuite/libffi.call/closure_fn5.c: Likewise. - * testsuite/libffi.call/cls_18byte.c: Likewise. - * testsuite/libffi.call/cls_19byte.c: Likewise. - * testsuite/libffi.call/cls_1_1byte.c: Likewise. - * testsuite/libffi.call/cls_20byte.c: Likewise. - * testsuite/libffi.call/cls_20byte1.c: Likewise. - * testsuite/libffi.call/cls_24byte.c: Likewise. - * testsuite/libffi.call/cls_2byte.c: Likewise. - * testsuite/libffi.call/cls_3_1byte.c: Likewise. - * testsuite/libffi.call/cls_3byte1.c: Likewise. - * testsuite/libffi.call/cls_3byte2.c: Likewise. - * testsuite/libffi.call/cls_4_1byte.c: Likewise. - * testsuite/libffi.call/cls_4byte.c: Likewise. - * testsuite/libffi.call/cls_64byte.c: Likewise. - * testsuite/libffi.call/cls_6byte.c: Likewise. - * testsuite/libffi.call/cls_7byte.c: Likewise. - * testsuite/libffi.call/cls_8byte.c: Likewise. - * testsuite/libffi.call/cls_9byte1.c: Likewise. - * testsuite/libffi.call/cls_9byte2.c: Likewise. - * testsuite/libffi.call/cls_align_double.c: Likewise. - * testsuite/libffi.call/cls_align_float.c: Likewise. - * testsuite/libffi.call/cls_align_longdouble.c: Likewise. - * testsuite/libffi.call/cls_align_pointer.c: Likewise. - * testsuite/libffi.call/cls_align_sint16.c: Likewise. - * testsuite/libffi.call/cls_align_sint32.c: Likewise. - * testsuite/libffi.call/cls_align_sint64.c: Likewise. - * testsuite/libffi.call/cls_align_uint16.c: Likewise. - * testsuite/libffi.call/cls_align_uint32.c: Likewise. - * testsuite/libffi.call/cls_align_uint64.c: Likewise. - * testsuite/libffi.call/cls_double.c: Likewise. - * testsuite/libffi.call/cls_float.c: Likewise. - * testsuite/libffi.call/cls_multi_schar.c: Likewise. - * testsuite/libffi.call/cls_multi_sshort.c: Likewise. - * testsuite/libffi.call/cls_multi_sshortchar.c: Likewise. - * testsuite/libffi.call/cls_multi_uchar.c: Likewise. - * testsuite/libffi.call/cls_multi_ushort.c: Likewise. - * testsuite/libffi.call/cls_multi_ushortchar.c: Likewise. - * testsuite/libffi.call/cls_schar.c: Likewise. - * testsuite/libffi.call/cls_sint.c: Likewise. - * testsuite/libffi.call/cls_sshort.c: Likewise. - * testsuite/libffi.call/cls_uchar.c: Likewise. - * testsuite/libffi.call/cls_uint.c: Likewise. - * testsuite/libffi.call/cls_ulonglong.c: Likewise. - * testsuite/libffi.call/cls_ushort.c: Likewise. - * testsuite/libffi.call/nested_struct.c: Likewise. - * testsuite/libffi.call/nested_struct1.c: Likewise. - * testsuite/libffi.call/nested_struct2.c: Likewise. - * testsuite/libffi.call/nested_struct3.c: Likewise. - * testsuite/libffi.call/problem1.c: Likewise. - * testsuite/libffi.special/unwindtest.cc: Likewise. - * testsuite/libffi.call/cls_12byte.c: Likewise and set return value - to zero. - * testsuite/libffi.call/cls_16byte.c: Likewise. - * testsuite/libffi.call/cls_5byte.c: Likewise. - -2004-08-23 David Daney - - PR libgcj/13141 - * src/mips/ffitarget.h (FFI_O32_SOFT_FLOAT): New ABI. - * src/mips/ffi.c (ffi_prep_args): Fix alignment calculation. - (ffi_prep_cif_machdep): Handle FFI_O32_SOFT_FLOAT floating point - parameters and return types. - (ffi_call): Handle FFI_O32_SOFT_FLOAT ABI. - (ffi_prep_closure): Ditto. - (ffi_closure_mips_inner_O32): Handle FFI_O32_SOFT_FLOAT ABI, fix - alignment calculations. - * src/mips/o32.S (ffi_closure_O32): Don't use floating point - instructions if FFI_O32_SOFT_FLOAT, make stack frame ABI compliant. - -2004-08-14 Casey Marshall - - * src/mips/ffi.c (ffi_pref_cif_machdep): set `cif->flags' to - contain `FFI_TYPE_UINT64' as return type for any 64-bit - integer (O32 ABI only). - (ffi_prep_closure): new function. - (ffi_closure_mips_inner_O32): new function. - * src/mips/ffitarget.h: Define `FFI_CLOSURES' and - `FFI_TRAMPOLINE_SIZE' appropriately if the ABI is o32. - * src/mips/o32.S (ffi_call_O32): add labels for .eh_frame. Return - 64 bit integers correctly. - (ffi_closure_O32): new function. - Added DWARF-2 unwind info for both functions. - -2004-08-10 Andrew Haley - - * src/x86/ffi64.c (ffi_prep_args ): 8-align all stack arguments. - -2004-08-01 Robert Millan - - * configure.ac: Detect knetbsd-gnu and kfreebsd-gnu. - * configure: Regenerate. - -2004-07-30 Maciej W. Rozycki - - * acinclude.m4 (AC_FUNC_MMAP_BLACKLIST): Check for - and mmap() explicitly instead of relying on preset autoconf cache - variables. - * aclocal.m4: Regenerate. - * configure: Regenerate. - -2004-07-11 Ulrich Weigand - - * src/s390/ffi.c (ffi_prep_args): Fix C aliasing violation. - (ffi_check_float_struct): Remove unused prototype. - -2004-06-30 Geoffrey Keating - - * src/powerpc/ffi_darwin.c (flush_icache): ';' is a comment - character on Darwin, use '\n\t' instead. - -2004-06-26 Matthias Klose - - * libtool-version: Fix typo in revision/age. - -2004-06-17 Matthias Klose - - * libtool-version: New. - * Makefile.am (libffi_la_LDFLAGS): Use -version-info for soname. - * Makefile.in: Regenerate. - -2004-06-15 Paolo Bonzini - - * Makefile.am: Remove useless multilib rules. - * Makefile.in: Regenerate. - * aclocal.m4: Regenerate with automake 1.8.5. - * configure.ac: Remove useless multilib configury. - * configure: Regenerate. - -2004-06-15 Paolo Bonzini - - * .cvsignore: New file. - -2004-06-10 Jakub Jelinek - - * src/ia64/unix.S (ffi_call_unix): Insert group barrier break - fp_done. - (ffi_closure_UNIX): Fix f14/f15 adjustment if FLOAT_SZ is ever - changed from 8. - -2004-06-06 Sean McNeil - - * configure.ac: Add x86_64-*-freebsd* support. - * configure: Regenerate. - -2004-04-26 Joe Buck - - Bug 15093 - * configure.ac: Test for existence of mmap and sys/mman.h before - checking blacklist. Fix suggested by Jim Wilson. - * configure: Regenerate. - -2004-04-26 Matt Austern - - * src/powerpc/darwin.S: Go through a non-lazy pointer for initial - FDE location. - * src/powerpc/darwin_closure.S: Likewise. - -2004-04-24 Andreas Tobler - - * testsuite/libffi.call/cls_multi_schar.c (main): Fix initialization - error. Reported by Thomas Heller . - * testsuite/libffi.call/cls_multi_sshort.c (main): Likewise. - * testsuite/libffi.call/cls_multi_ushort.c (main): Likewise. - -2004-03-20 Matthias Klose - - * src/pa/linux.S: Fix typo. - -2004-03-19 Matthias Klose - - * Makefile.am: Update. - * Makefile.in: Regenerate. - * src/pa/ffi.h.in: Remove. - * src/pa/ffitarget.h: New file. - -2004-02-10 Randolph Chung - - * Makefile.am: Add PA support. - * Makefile.in: Regenerate. - * include/Makefile.in: Regenerate. - * configure.ac: Add PA target. - * configure: Regenerate. - * src/pa/ffi.c: New file. - * src/pa/ffi.h.in: Add PA support. - * src/pa/linux.S: New file. - * prep_cif.c: Add PA support. - -2004-03-16 Hosaka Yuji - - * src/types.c: Fix alignment size of X86_WIN32 case int64 and - double. - * src/x86/ffi.c (ffi_prep_args): Replace ecif->cif->rtype->type - with ecif->cif->flags. - (ffi_call, ffi_prep_incoming_args_SYSV): Replace cif->rtype->type - with cif->flags. - (ffi_prep_cif_machdep): Add X86_WIN32 struct case. - (ffi_closure_SYSV): Add 1 or 2-bytes struct case for X86_WIN32. - * src/x86/win32.S (retstruct1b, retstruct2b, sc_retstruct1b, - sc_retstruct2b): Add for 1 or 2-bytes struct case. - -2004-03-15 Kelley Cook - - * configure.in: Rename file to ... - * configure.ac: ... this. - * fficonfig.h.in: Regenerate. - * Makefile.in: Regenerate. - * include/Makefile.in: Regenerate. - * testsuite/Makefile.in: Regenerate. - -2004-03-12 Matt Austern - - * src/powerpc/darwin.S: Fix EH information so it corresponds to - changes in EH format resulting from addition of linkonce support. - * src/powerpc/darwin_closure.S: Likewise. - -2004-03-11 Andreas Tobler - Paolo Bonzini - - * Makefile.am (AUTOMAKE_OPTIONS): Set them. - Remove VPATH. Remove rules for object files. Remove multilib support. - (AM_CCASFLAGS): Add. - * configure.in (AC_CONFIG_HEADERS): Relace AM_CONFIG_HEADER. - (AC_PREREQ): Bump version to 2.59. - (AC_INIT): Fill with version info and bug address. - (ORIGINAL_LD_FOR_MULTILIBS): Remove. - (AM_ENABLE_MULTILIB): Use this instead of AC_ARG_ENABLE. - De-precious CC so that the right flags are passed down to multilibs. - (AC_MSG_ERROR): Replace obsolete macro AC_ERROR. - (AC_CONFIG_FILES): Replace obsolete macro AC_LINK_FILES. - (AC_OUTPUT): Reorganize the output with AC_CONFIG_COMMANDS. - * configure: Rebuilt. - * aclocal.m4: Likewise. - * Makefile.in, include/Makefile.in, testsuite/Makefile.in: Likewise. - * fficonfig.h.in: Likewise. - -2004-03-11 Andreas Schwab - - * src/ia64/ffi.c (ffi_prep_incoming_args_UNIX): Get floating point - arguments from fp registers only for the first 8 parameter slots. - Don't convert a float parameter when passed in memory. - -2004-03-09 Hans-Peter Nilsson - - * configure: Regenerate for config/accross.m4 correction. - -2004-02-25 Matt Kraai - - * src/powerpc/ffi.c (ffi_prep_args_SYSV): Change - ecif->cif->bytes to bytes. - (ffi_prep_cif_machdep): Add braces around nested if statement. - -2004-02-09 Alan Modra - - * src/types.c (pointer): POWERPC64 has 8 byte pointers. - - * src/powerpc/ffi.c (ffi_prep_args64): Correct long double handling. - (ffi_closure_helper_LINUX64): Fix typo. - * testsuite/libffi.call/cls_align_longdouble.c: Pass -mlong-double-128 - for powerpc64-*-*. - * testsuite/libffi.call/float.c: Likewise. - * testsuite/libffi.call/float2.c: Likewise. - -2004-02-08 Alan Modra - - * src/powerpc/ffi.c (ffi_prep_cif_machdep ): Correct - long double function return and long double arg handling. - (ffi_closure_helper_LINUX64): Formatting. Delete unused "ng" var. - Use "end_pfr" instead of "nf". Correct long double handling. - Localise "temp". - * src/powerpc/linux64.S (ffi_call_LINUX64): Save f2 long double - return value. - * src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Allocate - space for long double return value. Adjust stack frame and offsets. - Load f2 long double return. - -2004-02-07 Alan Modra - - * src/types.c: Use 16 byte long double for POWERPC64. - -2004-01-25 Eric Botcazou - - * src/sparc/ffi.c (ffi_prep_args_v9): Shift the parameter array - when the structure return address is passed in %o0. - (ffi_V9_return_struct): Rename into ffi_v9_layout_struct. - (ffi_v9_layout_struct): Align the field following a nested structure - on a word boundary. Use memmove instead of memcpy. - (ffi_call): Update call to ffi_V9_return_struct. - (ffi_prep_closure): Define 'ctx' only for V8. - (ffi_closure_sparc_inner): Clone into ffi_closure_sparc_inner_v8 - and ffi_closure_sparc_inner_v9. - (ffi_closure_sparc_inner_v8): Return long doubles by reference. - Always skip the structure return address. For structures and long - doubles, copy the argument directly. - (ffi_closure_sparc_inner_v9): Skip the structure return address only - if required. Shift the maximum floating-point slot accordingly. For - big structures, copy the argument directly; otherwise, left-justify the - argument and call ffi_v9_layout_struct to lay out the structure on - the stack. - * src/sparc/v8.S: Undef STACKFRAME before defining it. - (ffi_closure_v8): Pass the structure return address. Update call to - ffi_closure_sparc_inner_v8. Short-circuit FFI_TYPE_INT handling. - Skip the 'unimp' insn when returning long doubles and structures. - * src/sparc/v9.S: Undef STACKFRAME before defining it. - (ffi_closure_v9): Increase the frame size by 2 words. Short-circuit - FFI_TYPE_INT handling. Load structures both in integers and - floating-point registers on return. - * README: Update status of the SPARC port. - -2004-01-24 Andreas Tobler - - * testsuite/libffi.call/pyobjc-tc.c (main): Treat result value - as of type ffi_arg. - * testsuite/libffi.call/struct3.c (main): Fix CHECK. - -2004-01-22 Ulrich Weigand - - * testsuite/libffi.call/cls_uint.c (cls_ret_uint_fn): Treat result - value as of type ffi_arg, not unsigned int. - -2004-01-21 Michael Ritzert - - * ffi64.c (ffi_prep_args): Cast the RHS of an assignment instead - of the LHS. - -2004-01-12 Andreas Tobler - - * testsuite/lib/libffi-dg.exp: Set LD_LIBRARY_PATH_32 for - Solaris. - -2004-01-08 Rainer Orth - - * testsuite/libffi.call/ffitest.h (allocate_mmap): Cast MAP_FAILED - to void *. - -2003-12-10 Richard Henderson - - * testsuite/libffi.call/cls_align_pointer.c: Cast pointers to - size_t instead of int. - -2003-12-04 Hosaka Yuji - - * testsuite/libffi.call/many_win32.c: Include . - * testsuite/libffi.call/many_win32.c (main): Replace variable - int i with unsigned long ul. - - * testsuite/libffi.call/cls_align_uint64.c: New test case. - * testsuite/libffi.call/cls_align_sint64.c: Likewise. - * testsuite/libffi.call/cls_align_uint32.c: Likewise. - * testsuite/libffi.call/cls_align_sint32.c: Likewise. - * testsuite/libffi.call/cls_align_uint16.c: Likewise. - * testsuite/libffi.call/cls_align_sint16.c: Likewise. - * testsuite/libffi.call/cls_align_float.c: Likewise. - * testsuite/libffi.call/cls_align_double.c: Likewise. - * testsuite/libffi.call/cls_align_longdouble.c: Likewise. - * testsuite/libffi.call/cls_align_pointer.c: Likewise. - -2003-12-02 Hosaka Yuji - - PR other/13221 - * src/x86/ffi.c (ffi_prep_args, ffi_prep_incoming_args_SYSV): - Align arguments to 32 bits. - -2003-12-01 Andreas Tobler - - PR other/13221 - * testsuite/libffi.call/cls_multi_sshort.c: New test case. - * testsuite/libffi.call/cls_multi_sshortchar.c: Likewise. - * testsuite/libffi.call/cls_multi_uchar.c: Likewise. - * testsuite/libffi.call/cls_multi_schar.c: Likewise. - * testsuite/libffi.call/cls_multi_ushortchar.c: Likewise. - * testsuite/libffi.call/cls_multi_ushort.c: Likewise. - - * testsuite/libffi.special/unwindtest.cc: Cosmetics. - -2003-11-26 Kaveh R. Ghazi - - * testsuite/libffi.call/ffitest.h: Include . - * testsuite/libffi.special/ffitestcxx.h: Likewise. - -2003-11-22 Andreas Tobler - - * Makefile.in: Rebuilt. - * configure: Likewise. - * testsuite/libffi.special/unwindtest.cc: Convert the mmap to - the right type. - -2003-11-21 Andreas Jaeger - Andreas Tobler - - * acinclude.m4: Add AC_FUNC_MMAP_BLACKLIST. - * configure.in: Call AC_FUNC_MMAP_BLACKLIST. - * Makefile.in: Rebuilt. - * aclocal.m4: Likewise. - * configure: Likewise. - * fficonfig.h.in: Likewise. - * testsuite/lib/libffi-dg.exp: Add include dir. - * testsuite/libffi.call/ffitest.h: Add MMAP definitions. - * testsuite/libffi.special/ffitestcxx.h: Likewise. - * testsuite/libffi.call/closure_fn0.c: Use MMAP functionality - for ffi_closure if available. - * testsuite/libffi.call/closure_fn1.c: Likewise. - * testsuite/libffi.call/closure_fn2.c: Likewise. - * testsuite/libffi.call/closure_fn3.c: Likewise. - * testsuite/libffi.call/closure_fn4.c: Likewise. - * testsuite/libffi.call/closure_fn5.c: Likewise. - * testsuite/libffi.call/cls_12byte.c: Likewise. - * testsuite/libffi.call/cls_16byte.c: Likewise. - * testsuite/libffi.call/cls_18byte.c: Likewise. - * testsuite/libffi.call/cls_19byte.c: Likewise. - * testsuite/libffi.call/cls_1_1byte.c: Likewise. - * testsuite/libffi.call/cls_20byte.c: Likewise. - * testsuite/libffi.call/cls_20byte1.c: Likewise. - * testsuite/libffi.call/cls_24byte.c: Likewise. - * testsuite/libffi.call/cls_2byte.c: Likewise. - * testsuite/libffi.call/cls_3_1byte.c: Likewise. - * testsuite/libffi.call/cls_3byte1.c: Likewise. - * testsuite/libffi.call/cls_3byte2.c: Likewise. - * testsuite/libffi.call/cls_4_1byte.c: Likewise. - * testsuite/libffi.call/cls_4byte.c: Likewise. - * testsuite/libffi.call/cls_5byte.c: Likewise. - * testsuite/libffi.call/cls_64byte.c: Likewise. - * testsuite/libffi.call/cls_6byte.c: Likewise. - * testsuite/libffi.call/cls_7byte.c: Likewise. - * testsuite/libffi.call/cls_8byte.c: Likewise. - * testsuite/libffi.call/cls_9byte1.c: Likewise. - * testsuite/libffi.call/cls_9byte2.c: Likewise. - * testsuite/libffi.call/cls_double.c: Likewise. - * testsuite/libffi.call/cls_float.c: Likewise. - * testsuite/libffi.call/cls_schar.c: Likewise. - * testsuite/libffi.call/cls_sint.c: Likewise. - * testsuite/libffi.call/cls_sshort.c: Likewise. - * testsuite/libffi.call/cls_uchar.c: Likewise. - * testsuite/libffi.call/cls_uint.c: Likewise. - * testsuite/libffi.call/cls_ulonglong.c: Likewise. - * testsuite/libffi.call/cls_ushort.c: Likewise. - * testsuite/libffi.call/nested_struct.c: Likewise. - * testsuite/libffi.call/nested_struct1.c: Likewise. - * testsuite/libffi.call/nested_struct2.c: Likewise. - * testsuite/libffi.call/nested_struct3.c: Likewise. - * testsuite/libffi.call/problem1.c: Likewise. - * testsuite/libffi.special/unwindtest.cc: Likewise. - -2003-11-20 Andreas Tobler - - * testsuite/lib/libffi-dg.exp: Make the -lgcc_s conditional. - -2003-11-19 Andreas Tobler - - * testsuite/lib/libffi-dg.exp: Add DYLD_LIBRARY_PATH for darwin. - Add -lgcc_s to additional flags. - -2003-11-12 Andreas Tobler - - * configure.in, include/Makefile.am: PR libgcj/11147, install - the ffitarget.h header file in a gcc versioned and target - dependent place. - * configure: Regenerated. - * Makefile.in, include/Makefile.in: Likewise. - * testsuite/Makefile.in: Likewise. - -2003-11-09 Andreas Tobler - - * testsuite/libffi.call/closure_fn0.c: Print result and check - with dg-output to make debugging easier. - * testsuite/libffi.call/closure_fn1.c: Likewise. - * testsuite/libffi.call/closure_fn2.c: Likewise. - * testsuite/libffi.call/closure_fn3.c: Likewise. - * testsuite/libffi.call/closure_fn4.c: Likewise. - * testsuite/libffi.call/closure_fn5.c: Likewise. - * testsuite/libffi.call/cls_12byte.c: Likewise. - * testsuite/libffi.call/cls_16byte.c: Likewise. - * testsuite/libffi.call/cls_18byte.c: Likewise. - * testsuite/libffi.call/cls_19byte.c: Likewise. - * testsuite/libffi.call/cls_1_1byte.c: Likewise. - * testsuite/libffi.call/cls_20byte.c: Likewise. - * testsuite/libffi.call/cls_20byte1.c: Likewise. - * testsuite/libffi.call/cls_24byte.c: Likewise. - * testsuite/libffi.call/cls_2byte.c: Likewise. - * testsuite/libffi.call/cls_3_1byte.c: Likewise. - * testsuite/libffi.call/cls_3byte1.c: Likewise. - * testsuite/libffi.call/cls_3byte2.c: Likewise. - * testsuite/libffi.call/cls_4_1byte.c: Likewise. - * testsuite/libffi.call/cls_4byte.c: Likewise. - * testsuite/libffi.call/cls_5byte.c: Likewise. - * testsuite/libffi.call/cls_64byte.c: Likewise. - * testsuite/libffi.call/cls_6byte.c: Likewise. - * testsuite/libffi.call/cls_7byte.c: Likewise. - * testsuite/libffi.call/cls_8byte.c: Likewise. - * testsuite/libffi.call/cls_9byte1.c: Likewise. - * testsuite/libffi.call/cls_9byte2.c: Likewise. - * testsuite/libffi.call/cls_double.c: Likewise. - * testsuite/libffi.call/cls_float.c: Likewise. - * testsuite/libffi.call/cls_schar.c: Likewise. - * testsuite/libffi.call/cls_sint.c: Likewise. - * testsuite/libffi.call/cls_sshort.c: Likewise. - * testsuite/libffi.call/cls_uchar.c: Likewise. - * testsuite/libffi.call/cls_uint.c: Likewise. - * testsuite/libffi.call/cls_ulonglong.c: Likewise. - * testsuite/libffi.call/cls_ushort.c: Likewise. - * testsuite/libffi.call/problem1.c: Likewise. - - * testsuite/libffi.special/unwindtest.cc: Make ffi_closure - static. - -2003-11-08 Andreas Tobler - - * testsuite/libffi.call/cls_9byte2.c: New test case. - * testsuite/libffi.call/cls_9byte1.c: Likewise. - * testsuite/libffi.call/cls_64byte.c: Likewise. - * testsuite/libffi.call/cls_20byte1.c: Likewise. - * testsuite/libffi.call/cls_19byte.c: Likewise. - * testsuite/libffi.call/cls_18byte.c: Likewise. - * testsuite/libffi.call/closure_fn4.c: Likewise. - * testsuite/libffi.call/closure_fn5.c: Likewise. - * testsuite/libffi.call/cls_schar.c: Likewise. - * testsuite/libffi.call/cls_sint.c: Likewise. - * testsuite/libffi.call/cls_sshort.c: Likewise. - * testsuite/libffi.call/nested_struct2.c: Likewise. - * testsuite/libffi.call/nested_struct3.c: Likewise. - -2003-11-08 Andreas Tobler - - * testsuite/libffi.call/cls_double.c: Do a check on the result. - * testsuite/libffi.call/cls_uchar.c: Likewise. - * testsuite/libffi.call/cls_uint.c: Likewise. - * testsuite/libffi.call/cls_ulonglong.c: Likewise. - * testsuite/libffi.call/cls_ushort.c: Likewise. - * testsuite/libffi.call/return_sc.c: Cleanup whitespaces. - -2003-11-06 Andreas Tobler - - * src/prep_cif.c (ffi_prep_cif): Move the validity check after - the initialization. - -2003-10-23 Andreas Tobler - - * src/java_raw_api.c (ffi_java_ptrarray_to_raw): Replace - FFI_ASSERT(FALSE) with FFI_ASSERT(0). - -2003-10-22 David Daney - - * src/mips/ffitarget.h: Replace undefined UINT32 and friends with - __attribute__((__mode__(__SI__))) and friends. - -2003-10-22 Andreas Schwab - - * src/ia64/ffi.c: Replace FALSE/TRUE with false/true. - -2003-10-21 Andreas Tobler - - * configure.in: AC_LINK_FILES(ffitarget.h). - * configure: Regenerate. - * Makefile.in: Likewise. - * include/Makefile.in: Likewise. - * testsuite/Makefile.in: Likewise. - * fficonfig.h.in: Likewise. - -2003-10-21 Paolo Bonzini - Richard Henderson - - Avoid that ffi.h includes fficonfig.h. - - * Makefile.am (EXTRA_DIST): Include ffitarget.h files - (TARGET_SRC_MIPS_GCC): Renamed to TARGET_SRC_MIPS_IRIX. - (TARGET_SRC_MIPS_SGI): Removed. - (MIPS_GCC): Renamed to TARGET_SRC_MIPS_IRIX. - (MIPS_SGI): Removed. - (CLEANFILES): Removed. - (mostlyclean-am, clean-am, mostlyclean-sub, clean-sub): New - targets. - * acconfig.h: Removed. - * configure.in: Compute sizeofs only for double and long double. - Use them to define and subst HAVE_LONG_DOUBLE. Include comments - into AC_DEFINE instead of using acconfig.h. Create - include/ffitarget.h instead of include/fficonfig.h. Rename - MIPS_GCC to MIPS_IRIX, drop MIPS_SGI since we are in gcc's tree. - AC_DEFINE EH_FRAME_FLAGS. - * include/Makefile.am (DISTCLEANFILES): New automake macro. - (hack_DATA): Add ffitarget.h. - * include/ffi.h.in: Remove all system specific definitions. - Declare raw API even if it is not installed, why bother? - Use limits.h instead of SIZEOF_* to define ffi_type_*. Do - not define EH_FRAME_FLAGS, it is in fficonfig.h now. Include - ffitarget.h instead of fficonfig.h. Remove ALIGN macro. - (UINT_ARG, INT_ARG): Removed, use ffi_arg and ffi_sarg instead. - * include/ffi_common.h (bool): Do not define. - (ffi_assert): Accept failed assertion. - (ffi_type_test): Return void and accept file/line. - (FFI_ASSERT): Pass stringized failed assertion. - (FFI_ASSERT_AT): New macro. - (FFI_ASSERT_VALID_TYPE): New macro. - (UINT8, SINT8, UINT16, SINT16, UINT32, SINT32, - UINT64, SINT64): Define here with gcc's __attribute__ macro - instead of in ffi.h - (FLOAT32, ALIGN): Define here instead of in ffi.h - * include/ffi-mips.h: Removed. Its content moved to - src/mips/ffitarget.h after separating assembly and C sections. - * src/alpha/ffi.c, src/alpha/ffi.c, src/java_raw_api.c - src/prep_cif.c, src/raw_api.c, src/ia64/ffi.c, - src/mips/ffi.c, src/mips/n32.S, src/mips/o32.S, - src/mips/ffitarget.h, src/sparc/ffi.c, src/x86/ffi64.c: - SIZEOF_ARG -> FFI_SIZEOF_ARG. - * src/ia64/ffi.c: Include stdbool.h (provided by GCC 2.95+). - * src/debug.c (ffi_assert): Accept stringized failed assertion. - (ffi_type_test): Rewritten. - * src/prep-cif.c (initialize_aggregate, ffi_prep_cif): Call - FFI_ASSERT_VALID_TYPE. - * src/alpha/ffitarget.h, src/arm/ffitarget.h, - src/ia64/ffitarget.h, src/m68k/ffitarget.h, - src/mips/ffitarget.h, src/powerpc/ffitarget.h, - src/s390/ffitarget.h, src/sh/ffitarget.h, - src/sh64/ffitarget.h, src/sparc/ffitarget.h, - src/x86/ffitarget.h: New files. - * src/alpha/osf.S, src/arm/sysv.S, src/ia64/unix.S, - src/m68k/sysv.S, src/mips/n32.S, src/mips/o32.S, - src/powerpc/aix.S, src/powerpc/darwin.S, - src/powerpc/ffi_darwin.c, src/powerpc/linux64.S, - src/powerpc/linux64_closure.S, src/powerpc/ppc_closure.S, - src/powerpc/sysv.S, src/s390/sysv.S, src/sh/sysv.S, - src/sh64/sysv.S, src/sparc/v8.S, src/sparc/v9.S, - src/x86/sysv.S, src/x86/unix64.S, src/x86/win32.S: - include fficonfig.h - -2003-10-20 Rainer Orth - - * src/mips/ffi.c: Use _ABIN32, _ABIO32 instead of external - _MIPS_SIM_NABI32, _MIPS_SIM_ABI32. - -2003-10-19 Andreas Tobler - - * src/powerpc/ffi_darwin.c (ffi_prep_args): Declare bytes again. - Used when FFI_DEBUG = 1. - -2003-10-14 Alan Modra - - * src/types.c (double, longdouble): Default POWERPC64 to 8 byte size - and align. - -2003-10-06 Rainer Orth - - * include/ffi_mips.h: Define FFI_MIPS_N32 for N32/N64 ABIs, - FFI_MIPS_O32 for O32 ABI. - -2003-10-01 Andreas Tobler - - * testsuite/lib/libffi-dg.exp: Set LD_LIBRARY_PATH_64 for - SPARC64. Cleanup whitespaces. - -2003-09-19 Andreas Tobler - - * testsuite/libffi.call/closure_fn0.c: Xfail mips, arm, - strongarm, xscale. Cleanup whitespaces. - * testsuite/libffi.call/closure_fn1.c: Likewise. - * testsuite/libffi.call/closure_fn2.c: Likewise. - * testsuite/libffi.call/closure_fn3.c: Likewise. - * testsuite/libffi.call/cls_12byte.c: Likewise. - * testsuite/libffi.call/cls_16byte.c: Likewise. - * testsuite/libffi.call/cls_1_1byte.c: Likewise. - * testsuite/libffi.call/cls_20byte.c: Likewise. - * testsuite/libffi.call/cls_24byte.c: Likewise. - * testsuite/libffi.call/cls_2byte.c: Likewise. - * testsuite/libffi.call/cls_3_1byte.c: Likewise. - * testsuite/libffi.call/cls_3byte1.c: Likewise. - * testsuite/libffi.call/cls_3byte2.c: Likewise. - * testsuite/libffi.call/cls_4_1byte.c: Likewise. - * testsuite/libffi.call/cls_4byte.c: Likewise. - * testsuite/libffi.call/cls_5byte.c: Likewise. - * testsuite/libffi.call/cls_6byte.c: Likewise. - * testsuite/libffi.call/cls_7byte.c: Likewise. - * testsuite/libffi.call/cls_8byte.c: Likewise. - * testsuite/libffi.call/cls_double.c: Likewise. - * testsuite/libffi.call/cls_float.c: Likewise. - * testsuite/libffi.call/cls_uchar.c: Likewise. - * testsuite/libffi.call/cls_uint.c: Likewise. - * testsuite/libffi.call/cls_ulonglong.c: Likewise. - * testsuite/libffi.call/cls_ushort.c: Likewise. - * testsuite/libffi.call/nested_struct.c: Likewise. - * testsuite/libffi.call/nested_struct1.c: Likewise. - * testsuite/libffi.call/problem1.c: Likewise. - * testsuite/libffi.special/unwindtest.cc: Likewise. - * testsuite/libffi.call/pyobjc-tc.c: Cleanup whitespaces. - -2003-09-18 David Edelsohn - - * src/powerpc/aix.S: Cleanup whitespaces. - * src/powerpc/aix_closure.S: Likewise. - -2003-09-18 Andreas Tobler - - * src/powerpc/darwin.S: Cleanup whitespaces, comment formatting. - * src/powerpc/darwin_closure.S: Likewise. - * src/powerpc/ffi_darwin.c: Likewise. - -2003-09-18 Andreas Tobler - David Edelsohn - - * src/types.c (double): Add AIX and Darwin to the right TYPEDEF. - * src/powerpc/aix_closure.S: Remove the pointer to the outgoing - parameter stack. - * src/powerpc/darwin_closure.S: Likewise. - * src/powerpc/ffi_darwin.c (ffi_prep_args): Handle structures - according to the Darwin/AIX ABI. - (ffi_prep_cif_machdep): Likewise. - (ffi_closure_helper_DARWIN): Likewise. - Remove the outgoing parameter stack logic. Simplify the evaluation - of the different CASE types. - (ffi_prep_clousure): Avoid the casts on lvalues. Change the branch - statement in the trampoline code. - -2003-09-18 Kaz Kojima - - * src/sh/ffi.c (ffi_prep_args): Take account into the alignement - for the register size. - (ffi_closure_helper_SYSV): Handle the structure return value - address correctly. - (ffi_closure_helper_SYSV): Return the appropriate type when - the registers are used for the structure return value. - * src/sh/sysv.S (ffi_closure_SYSV): Fix the stack layout for - the 64-bit return value. Update copyright years. - -2003-09-17 Rainer Orth - - * testsuite/lib/libffi-dg.exp (libffi_target_compile): Search in - srcdir for ffi_mips.h. - -2003-09-12 Alan Modra - - * src/prep_cif.c (initialize_aggregate): Include tail padding in - structure size. - * src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Correct - placement of float result. - * testsuite/libffi.special/unwindtest.cc (closure_test_fn1): Correct - cast of "resp" for big-endian 64 bit machines. - -2003-09-11 Alan Modra - - * src/types.c (double, longdouble): Merge identical SH and ARM - typedefs, and add POWERPC64. - * src/powerpc/ffi.c (ffi_prep_args64): Correct next_arg calc for - struct split over gpr and rest. - (ffi_prep_cif_machdep): Correct intarg_count for structures. - * src/powerpc/linux64.S (ffi_call_LINUX64): Fix gpr offsets. - -2003-09-09 Andreas Tobler - - * src/powerpc/ffi.c (ffi_closure_helper_SYSV) Handle struct - passing correctly. - -2003-09-09 Alan Modra - - * configure: Regenerate. - -2003-09-04 Andreas Tobler - - * Makefile.am: Remove build rules for ffitest. - * Makefile.in: Rebuilt. - -2003-09-04 Andreas Tobler - - * src/java_raw_api.c: Include to fix compiler warning - about implicit declaration of abort(). - -2003-09-04 Andreas Tobler - - * Makefile.am: Add dejagnu test framework. Fixes PR other/11411. - * Makefile.in: Rebuilt. - * configure.in: Add dejagnu test framework. - * configure: Rebuilt. - - * testsuite/Makefile.am: New file. - * testsuite/Makefile.in: Built - * testsuite/lib/libffi-dg.exp: New file. - * testsuite/config/default.exp: Likewise. - * testsuite/libffi.call/call.exp: Likewise. - * testsuite/libffi.call/ffitest.h: Likewise. - * testsuite/libffi.call/closure_fn0.c: Likewise. - * testsuite/libffi.call/closure_fn1.c: Likewise. - * testsuite/libffi.call/closure_fn2.c: Likewise. - * testsuite/libffi.call/closure_fn3.c: Likewise. - * testsuite/libffi.call/cls_1_1byte.c: Likewise. - * testsuite/libffi.call/cls_3_1byte.c: Likewise. - * testsuite/libffi.call/cls_4_1byte.c: Likewise. - * testsuite/libffi.call/cls_2byte.c: Likewise. - * testsuite/libffi.call/cls_3byte1.c: Likewise. - * testsuite/libffi.call/cls_3byte2.c: Likewise. - * testsuite/libffi.call/cls_4byte.c: Likewise. - * testsuite/libffi.call/cls_5byte.c: Likewise. - * testsuite/libffi.call/cls_6byte.c: Likewise. - * testsuite/libffi.call/cls_7byte.c: Likewise. - * testsuite/libffi.call/cls_8byte.c: Likewise. - * testsuite/libffi.call/cls_12byte.c: Likewise. - * testsuite/libffi.call/cls_16byte.c: Likewise. - * testsuite/libffi.call/cls_20byte.c: Likewise. - * testsuite/libffi.call/cls_24byte.c: Likewise. - * testsuite/libffi.call/cls_double.c: Likewise. - * testsuite/libffi.call/cls_float.c: Likewise. - * testsuite/libffi.call/cls_uchar.c: Likewise. - * testsuite/libffi.call/cls_uint.c: Likewise. - * testsuite/libffi.call/cls_ulonglong.c: Likewise. - * testsuite/libffi.call/cls_ushort.c: Likewise. - * testsuite/libffi.call/float.c: Likewise. - * testsuite/libffi.call/float1.c: Likewise. - * testsuite/libffi.call/float2.c: Likewise. - * testsuite/libffi.call/many.c: Likewise. - * testsuite/libffi.call/many_win32.c: Likewise. - * testsuite/libffi.call/nested_struct.c: Likewise. - * testsuite/libffi.call/nested_struct1.c: Likewise. - * testsuite/libffi.call/pyobjc-tc.c: Likewise. - * testsuite/libffi.call/problem1.c: Likewise. - * testsuite/libffi.call/promotion.c: Likewise. - * testsuite/libffi.call/return_ll.c: Likewise. - * testsuite/libffi.call/return_sc.c: Likewise. - * testsuite/libffi.call/return_uc.c: Likewise. - * testsuite/libffi.call/strlen.c: Likewise. - * testsuite/libffi.call/strlen_win32.c: Likewise. - * testsuite/libffi.call/struct1.c: Likewise. - * testsuite/libffi.call/struct2.c: Likewise. - * testsuite/libffi.call/struct3.c: Likewise. - * testsuite/libffi.call/struct4.c: Likewise. - * testsuite/libffi.call/struct5.c: Likewise. - * testsuite/libffi.call/struct6.c: Likewise. - * testsuite/libffi.call/struct7.c: Likewise. - * testsuite/libffi.call/struct8.c: Likewise. - * testsuite/libffi.call/struct9.c: Likewise. - * testsuite/libffi.special/special.exp: New file. - * testsuite/libffi.special/ffitestcxx.h: Likewise. - * testsuite/libffi.special/unwindtest.cc: Likewise. - - -2003-08-13 Kaz Kojima - - * src/sh/ffi.c (OFS_INT16): Set 0 for little endian case. Update - copyright years. - -2003-08-02 Alan Modra - - * src/powerpc/ffi.c (ffi_prep_args64): Modify for changed gcc - structure passing. - (ffi_closure_helper_LINUX64): Likewise. - * src/powerpc/linux64.S: Remove code writing to parm save area. - * src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Use return - address in lr from ffi_closure_helper_LINUX64 call to calculate - table address. Optimize function tail. - -2003-07-28 Andreas Tobler - - * src/sparc/ffi.c: Handle all floating point registers. - * src/sparc/v9.S: Likewise. Fixes second part of PR target/11410. - -2003-07-11 Gerald Pfeifer - - * README: Note that libffi is not part of GCC. Update the project - URL and status. - -2003-06-19 Franz Sirl - - * src/powerpc/ppc_closure.S: Include ffi.h. - -2003-06-13 Rainer Orth - - * src/x86/sysv.S: Avoid gas-only .uleb128/.sleb128 directives. - Use C style comments. - -2003-06-13 Kaz Kojima - - * Makefile.am: Add SHmedia support. Fix a typo of SH support. - * Makefile.in: Regenerate. - * configure.in (sh64-*-linux*, sh5*-*-linux*): Add target. - * configure: Regenerate. - * include/ffi.h.in: Add SHmedia support. - * src/sh64/ffi.c: New file. - * src/sh64/sysv.S: New file. - -2003-05-16 Jakub Jelinek - - * configure.in (HAVE_RO_EH_FRAME): Check whether .eh_frame section - should be read-only. - * configure: Rebuilt. - * fficonfig.h.in: Rebuilt. - * include/ffi.h.in (EH_FRAME_FLAGS): Define. - * src/alpha/osf.S: Use EH_FRAME_FLAGS. - * src/powerpc/linux64.S: Likewise. - * src/powerpc/linux64_closure.S: Likewise. Include ffi.h. - * src/powerpc/sysv.S: Use EH_FRAME_FLAGS. Use pcrel encoding - if -fpic/-fPIC/-mrelocatable. - * src/powerpc/powerpc_closure.S: Likewise. - * src/sparc/v8.S: If HAVE_RO_EH_FRAME is defined, don't include - #write in .eh_frame flags. - * src/sparc/v9.S: Likewise. - * src/x86/unix64.S: Use EH_FRAME_FLAGS. - * src/x86/sysv.S: Likewise. Use pcrel encoding if -fpic/-fPIC. - * src/s390/sysv.S: Use EH_FRAME_FLAGS. Include ffi.h. - -2003-05-07 Jeff Sturm - - Fixes PR bootstrap/10656 - * configure.in (HAVE_AS_REGISTER_PSEUDO_OP): Test assembler - support for .register pseudo-op. - * src/sparc/v8.S: Use it. - * fficonfig.h.in: Rebuilt. - * configure: Rebuilt. - -2003-04-18 Jakub Jelinek - - * include/ffi.h.in (POWERPC64): Define if 64-bit. - (enum ffi_abi): Add FFI_LINUX64 on POWERPC. - Make it the default on POWERPC64. - (FFI_TRAMPOLINE_SIZE): Define to 24 on POWERPC64. - * configure.in: Change powerpc-*-linux* into powerpc*-*-linux*. - * configure: Rebuilt. - * src/powerpc/ffi.c (hidden): Define. - (ffi_prep_args_SYSV): Renamed from - ffi_prep_args. Cast pointers to unsigned long to shut up warnings. - (NUM_GPR_ARG_REGISTERS64, NUM_FPR_ARG_REGISTERS64, - ASM_NEEDS_REGISTERS64): New. - (ffi_prep_args64): New function. - (ffi_prep_cif_machdep): Handle FFI_LINUX64 ABI. - (ffi_call): Likewise. - (ffi_prep_closure): Likewise. - (flush_icache): Surround by #ifndef POWERPC64. - (ffi_dblfl): New union type. - (ffi_closure_helper_SYSV): Use it to avoid aliasing problems. - (ffi_closure_helper_LINUX64): New function. - * src/powerpc/ppc_closure.S: Surround whole file by #ifndef - __powerpc64__. - * src/powerpc/sysv.S: Likewise. - (ffi_call_SYSV): Rename ffi_prep_args to ffi_prep_args_SYSV. - * src/powerpc/linux64.S: New file. - * src/powerpc/linux64_closure.S: New file. - * Makefile.am (EXTRA_DIST): Add src/powerpc/linux64.S and - src/powerpc/linux64_closure.S. - (TARGET_SRC_POWERPC): Likewise. - - * src/ffitest.c (closure_test_fn, closure_test_fn1, closure_test_fn2, - closure_test_fn3): Fix result printing on big-endian 64-bit - machines. - (main): Print tst2_arg instead of uninitialized tst2_result. - - * src/ffitest.c (main): Hide what closure pointer really points to - from the compiler. - -2003-04-16 Richard Earnshaw - - * configure.in (arm-*-netbsdelf*): Add configuration. - (configure): Regenerated. - -2003-04-04 Loren J. Rittle - - * include/Makefile.in: Regenerate. - -2003-03-21 Zdenek Dvorak - - * libffi/include/ffi.h.in: Define X86 instead of X86_64 in 32 - bit mode. - * libffi/src/x86/ffi.c (ffi_closure_SYSV, ffi_closure_raw_SYSV): - Receive closure pointer through parameter, read args using - __builtin_dwarf_cfa. - (FFI_INIT_TRAMPOLINE): Send closure reference through eax. - -2003-03-12 Andreas Schwab - - * configure.in: Avoid trailing /. in toolexeclibdir. - * configure: Rebuilt. - -2003-03-03 Andreas Tobler - - * src/powerpc/darwin_closure.S: Recode to fit dynamic libraries. - -2003-02-06 Andreas Tobler - - * libffi/src/powerpc/darwin_closure.S: - Fix alignement bug, allocate 8 bytes for the result. - * libffi/src/powerpc/aix_closure.S: - Likewise. - * libffi/src/powerpc/ffi_darwin.c: - Update stackframe description for aix/darwin_closure.S. - -2003-02-06 Jakub Jelinek - - * src/s390/ffi.c (ffi_closure_helper_SYSV): Add hidden visibility - attribute. - -2003-01-31 Christian Cornelssen , - Andreas Schwab - - * configure.in: Adjust command to source config-ml.in to account - for changes to the libffi_basedir definition. - (libffi_basedir): Remove ${srcdir} from value and include trailing - slash if nonempty. - - * configure: Regenerate. - -2003-01-29 Franz Sirl - - * src/powerpc/ppc_closure.S: Recode to fit shared libs. - -2003-01-28 Andrew Haley - - * include/ffi.h.in: Enable FFI_CLOSURES for x86_64. - * src/x86/ffi64.c (ffi_prep_closure): New. - (ffi_closure_UNIX64_inner): New. - * src/x86/unix64.S (ffi_closure_UNIX64): New. - -2003-01-27 Alexandre Oliva - - * configure.in (toolexecdir, toolexeclibdir): Set and AC_SUBST. - Remove USE_LIBDIR conditional. - * Makefile.am (toolexecdir, toolexeclibdir): Don't override. - * Makefile.in, configure: Rebuilt. - -2003-01027 David Edelsohn - - * Makefile.am (TARGET_SRC_POWERPC_AIX): Fix typo. - * Makefile.in: Regenerate. - -2003-01-22 Andrew Haley - - * src/powerpc/darwin.S (_ffi_call_AIX): Add Augmentation size to - unwind info. - -2003-01-21 Andreas Tobler - - * src/powerpc/darwin.S: Add unwind info. - * src/powerpc/darwin_closure.S: Likewise. - -2003-01-14 Andrew Haley - - * src/x86/ffi64.c (ffi_prep_args): Check for void retval. - (ffi_prep_cif_machdep): Likewise. - * src/x86/unix64.S: Add unwind info. - -2003-01-14 Andreas Jaeger - - * src/ffitest.c (main): Only use ffi_closures if those are - supported. - -2003-01-13 Andreas Tobler - - * libffi/src/ffitest.c - add closure testcases - -2003-01-13 Kevin B. Hendricks - - * libffi/src/powerpc/ffi.c - fix alignment bug for float (4 byte aligned iso 8 byte) - -2003-01-09 Geoffrey Keating - - * src/powerpc/ffi_darwin.c: Remove RCS version string. - * src/powerpc/darwin.S: Remove RCS version string. - -2003-01-03 Jeff Sturm - - * include/ffi.h.in: Add closure defines for SPARC, SPARC64. - * src/ffitest.c (main): Use static storage for closure. - * src/sparc/ffi.c (ffi_prep_closure, ffi_closure_sparc_inner): New. - * src/sparc/v8.S (ffi_closure_v8): New. - * src/sparc/v9.S (ffi_closure_v9): New. - -2002-11-10 Ranjit Mathew - - * include/ffi.h.in: Added FFI_STDCALL ffi_type - enumeration for X86_WIN32. - * src/x86/win32.S: Added ffi_call_STDCALL function - definition. - * src/x86/ffi.c (ffi_call/ffi_raw_call): Added - switch cases for recognising FFI_STDCALL and - calling ffi_call_STDCALL if target is X86_WIN32. - * src/ffitest.c (my_stdcall_strlen/stdcall_many): - stdcall versions of the "my_strlen" and "many" - test functions (for X86_WIN32). - Added test cases to test stdcall invocation using - these functions. - -2002-12-02 Kaz Kojima - - * src/sh/sysv.S: Add DWARF2 unwind info. - -2002-11-27 Ulrich Weigand - - * src/s390/sysv.S (.eh_frame section): Make section read-only. - -2002-11-26 Jim Wilson - - * src/types.c (FFI_TYPE_POINTER): Has size 8 on IA64. - -2002-11-23 H.J. Lu - - * acinclude.m4: Add dummy AM_PROG_LIBTOOL. - Include ../config/accross.m4. - * aclocal.m4; Rebuild. - * configure: Likewise. - -2002-11-15 Ulrich Weigand - - * src/s390/sysv.S (.eh_frame section): Adapt to pcrel FDE encoding. - -2002-11-11 DJ Delorie - - * configure.in: Look for common files in the right place. - -2002-10-08 Ulrich Weigand - - * src/java_raw_api.c (ffi_java_raw_to_ptrarray): Interpret - raw data as _Jv_word values, not ffi_raw. - (ffi_java_ptrarray_to_raw): Likewise. - (ffi_java_rvalue_to_raw): New function. - (ffi_java_raw_call): Call it. - (ffi_java_raw_to_rvalue): New function. - (ffi_java_translate_args): Call it. - * src/ffitest.c (closure_test_fn): Interpret return value - as ffi_arg, not int. - * src/s390/ffi.c (ffi_prep_cif_machdep): Add missing - FFI_TYPE_POINTER case. - (ffi_closure_helper_SYSV): Likewise. Also, assume return - values extended to word size. - -2002-10-02 Andreas Jaeger - - * src/x86/ffi64.c (ffi_prep_cif_machdep): Remove debug output. - -2002-10-01 Bo Thorsen - - * include/ffi.h.in: Fix i386 win32 compilation. - -2002-09-30 Ulrich Weigand - - * configure.in: Add s390x-*-linux-* target. - * configure: Regenerate. - * include/ffi.h.in: Define S390X for s390x targets. - (FFI_CLOSURES): Define for s390/s390x. - (FFI_TRAMPOLINE_SIZE): Likewise. - (FFI_NATIVE_RAW_API): Likewise. - * src/prep_cif.c (ffi_prep_cif): Do not compute stack space for s390. - * src/types.c (FFI_TYPE_POINTER): Use 8-byte pointers on s390x. - * src/s390/ffi.c: Major rework of existing code. Add support for - s390x targets. Add closure support. - * src/s390/sysv.S: Likewise. - -2002-09-29 Richard Earnshaw - - * src/arm/sysv.S: Fix typo. - -2002-09-28 Richard Earnshaw - - * src/arm/sysv.S: If we don't have machine/asm.h and the pre-processor - has defined __USER_LABEL_PREFIX__, then use it in CNAME. - (ffi_call_SYSV): Handle soft-float. - -2002-09-27 Bo Thorsen - - * include/ffi.h.in: Fix multilib x86-64 support. - -2002-09-22 Kaveh R. Ghazi - - * Makefile.am (all-multi): Fix multilib parallel build. - -2002-07-19 Kaz Kojima - - * configure.in (sh[34]*-*-linux*): Add brackets. - * configure: Regenerate. - -2002-07-18 Kaz Kojima - - * Makefile.am: Add SH support. - * Makefile.in: Regenerate. - * configure.in (sh-*-linux*, sh[34]*-*-linux*): Add target. - * configure: Regenerate. - * include/ffi.h.in: Add SH support. - * src/sh/ffi.c: New file. - * src/sh/sysv.S: New file. - * src/types.c: Add SH support. - -2002-07-16 Bo Thorsen - - * src/x86/ffi64.c: New file that adds x86-64 support. - * src/x86/unix64.S: New file that handles argument setup for - x86-64. - * src/x86/sysv.S: Don't use this on x86-64. - * src/x86/ffi.c: Don't use this on x86-64. - Remove unused vars. - * src/prep_cif.c (ffi_prep_cif): Don't do stack size calculation - for x86-64. - * src/ffitest.c (struct6): New test that tests a special case in - the x86-64 ABI. - (struct7): Likewise. - (struct8): Likewise. - (struct9): Likewise. - (closure_test_fn): Silence warning about this when it's not used. - (main): Add the new tests. - (main): Fix a couple of wrong casts and silence some compiler warnings. - * include/ffi.h.in: Add x86-64 ABI definition. - * fficonfig.h.in: Regenerate. - * Makefile.am: Add x86-64 support. - * configure.in: Likewise. - * Makefile.in: Regenerate. - * configure: Likewise. - -2002-06-24 Bo Thorsen - - * src/types.c: Merge settings for similar architectures. - Add x86-64 sizes and alignments. - -2002-06-23 Bo Thorsen - - * src/arm/ffi.c (ffi_prep_args): Remove unused vars. - * src/sparc/ffi.c (ffi_prep_args_v8): Likewise. - * src/mips/ffi.c (ffi_prep_args): Likewise. - * src/m68k/ffi.c (ffi_prep_args): Likewise. - -2002-07-18 H.J. Lu (hjl@gnu.org) - - * Makefile.am (TARGET_SRC_MIPS_LINUX): New. - (libffi_la_SOURCES): Support MIPS_LINUX. - (libffi_convenience_la_SOURCES): Likewise. - * Makefile.in: Regenerated. - - * configure.in (mips64*-*): Skip. - (mips*-*-linux*): New. - * configure: Regenerated. - - * src/mips/ffi.c: Include . - -2002-06-06 Ulrich Weigand - - * src/s390/sysv.S: Save/restore %r6. Add DWARF-2 unwind info. - -2002-05-27 Roger Sayle - - * src/x86/ffi.c (ffi_prep_args): Remove reference to avn. - -2002-05-27 Bo Thorsen - - * src/x86/ffi.c (ffi_prep_args): Remove unused variable and - fix formatting. - -2002-05-13 Andreas Tobler - - * src/powerpc/ffi_darwin.c (ffi_prep_closure): Declare fd at - beginning of function (for older apple cc). - -2002-05-08 Alexandre Oliva - - * configure.in (ORIGINAL_LD_FOR_MULTILIBS): Preserve LD at - script entry, and set LD to it when configuring multilibs. - * configure: Rebuilt. - -2002-05-05 Jason Thorpe - - * configure.in (sparc64-*-netbsd*): Add target. - (sparc-*-netbsdelf*): Likewise. - * configure: Regenerate. - -2002-04-28 David S. Miller - - * configure.in, configure: Fix SPARC test in previous change. - -2002-04-29 Gerhard Tonn - - * Makefile.am: Add Linux for S/390 support. - * Makefile.in: Regenerate. - * configure.in: Add Linux for S/390 support. - * configure: Regenerate. - * include/ffi.h.in: Add Linux for S/390 support. - * src/s390/ffi.c: New file from libffi CVS tree. - * src/s390/sysv.S: New file from libffi CVS tree. - -2002-04-28 Jakub Jelinek - - * configure.in (HAVE_AS_SPARC_UA_PCREL): Check for working - %r_disp32(). - * src/sparc/v8.S: Use it. - * src/sparc/v9.S: Likewise. - * fficonfig.h.in: Rebuilt. - * configure: Rebuilt. - -2002-04-08 Hans Boehm - - * src/java_raw_api.c (ffi_java_raw_size): Handle FFI_TYPE_DOUBLE - correctly. - * src/ia64/unix.S: Add unwind information. Fix comments. - Save sp in a way that's compatible with unwind info. - (ffi_call_unix): Correctly restore sp in all cases. - * src/ia64/ffi.c: Add, fix comments. - -2002-04-08 Jakub Jelinek - - * src/sparc/v8.S: Make .eh_frame dependent on target word size. - -2002-04-06 Jason Thorpe - - * configure.in (alpha*-*-netbsd*): Add target. - * configure: Regenerate. - -2002-04-04 Jeff Sturm - - * src/sparc/v8.S: Add unwind info. - * src/sparc/v9.S: Likewise. - -2002-03-30 Krister Walfridsson - - * configure.in: Enable i*86-*-netbsdelf*. - * configure: Rebuilt. - -2002-03-29 David Billinghurst - - PR other/2620 - * src/mips/n32.s: Delete - * src/mips/o32.s: Delete - -2002-03-21 Loren J. Rittle - - * configure.in: Enable alpha*-*-freebsd*. - * configure: Rebuilt. - -2002-03-17 Bryce McKinlay - - * Makefile.am: libfficonvenience -> libffi_convenience. - * Makefile.in: Rebuilt. - - * Makefile.am: Define ffitest_OBJECTS. - * Makefile.in: Rebuilt. - -2002-03-07 Andreas Tobler - David Edelsohn - - * Makefile.am (EXTRA_DIST): Add Darwin and AIX closure files. - (TARGET_SRC_POWERPC_AIX): Add aix_closure.S. - (TARGET_SRC_POWERPC_DARWIN): Add darwin_closure.S. - * Makefile.in: Regenerate. - * include/ffi.h.in: Add AIX and Darwin closure definitions. - * src/powerpc/ffi_darwin.c (ffi_prep_closure): New function. - (flush_icache, flush_range): New functions. - (ffi_closure_helper_DARWIN): New function. - * src/powerpc/aix_closure.S: New file. - * src/powerpc/darwin_closure.S: New file. - -2002-02-24 Jeff Sturm - - * include/ffi.h.in: Add typedef for ffi_arg. - * src/ffitest.c (main): Declare rint with ffi_arg. - -2002-02-21 Andreas Tobler - - * src/powerpc/ffi_darwin.c (ffi_prep_args): Skip appropriate - number of GPRs for floating-point arguments. - -2002-01-31 Anthony Green - - * configure: Rebuilt. - * configure.in: Replace CHECK_SIZEOF and endian tests with - cross-compiler friendly macros. - * aclocal.m4 (AC_COMPILE_CHECK_SIZEOF, AC_C_BIGENDIAN_CROSS): New - macros. - -2002-01-18 David Edelsohn - - * src/powerpc/darwin.S (_ffi_call_AIX): New. - * src/powerpc/aix.S (ffi_call_DARWIN): New. - -2002-01-17 David Edelsohn - - * Makefile.am (EXTRA_DIST): Add Darwin and AIX files. - (TARGET_SRC_POWERPC_AIX): New. - (POWERPC_AIX): New stanza. - * Makefile.in: Regenerate. - * configure.in: Add AIX case. - * configure: Regenerate. - * include/ffi.h.in (ffi_abi): Add FFI_AIX. - * src/powerpc/ffi_darwin.c (ffi_status): Use "long" to scale frame - size. Fix "long double" support. - (ffi_call): Add FFI_AIX case. - * src/powerpc/aix.S: New. - -2001-10-09 John Hornkvist - - Implement Darwin PowerPC ABI. - * configure.in: Handle powerpc-*-darwin*. - * Makefile.am: Set source files for POWERPC_DARWIN. - * configure: Rebuilt. - * Makefile.in: Rebuilt. - * include/ffi.h.in: Define FFI_DARWIN and FFI_DEFAULT_ABI for - POWERPC_DARWIN. - * src/powerpc/darwin.S: New file. - * src/powerpc/ffi_darwin.c: New file. - -2001-10-07 Joseph S. Myers - - * src/x86/ffi.c: Fix spelling error of "separate" as "seperate". - -2001-07-16 Rainer Orth - - * src/x86/sysv.S: Avoid gas-only .balign directive. - Use C style comments. - -2001-07-16 Rainer Orth - - * src/alpha/ffi.c (ffi_prep_closure): Avoid gas-only mnemonic. - Fixes PR bootstrap/3563. - -2001-06-26 Rainer Orth - - * src/alpha/osf.S (ffi_closure_osf): Use .rdata for ECOFF. - -2001-06-25 Rainer Orth - - * configure.in: Recognize sparc*-sun-* host. - * configure: Regenerate. - -2001-06-06 Andrew Haley - - * src/alpha/osf.S (__FRAME_BEGIN__): Conditionalize for ELF. - -2001-06-03 Andrew Haley - - * src/alpha/osf.S: Add unwind info. - * src/powerpc/sysv.S: Add unwind info. - * src/powerpc/ppc_closure.S: Likewise. - -2000-05-31 Jeff Sturm - - * configure.in: Fix AC_ARG_ENABLE usage. - * configure: Rebuilt. - -2001-05-06 Bryce McKinlay - - * configure.in: Remove warning about beta code. - * configure: Rebuilt. - -2001-04-25 Hans Boehm - - * src/ia64/unix.S: Restore stack pointer when returning from - ffi_closure_UNIX. - * src/ia64/ffi.c: Fix typo in comment. - -2001-04-18 Jim Wilson - - * src/ia64/unix.S: Delete unnecessary increment and decrement of loc2 - to eliminate RAW DV. - -2001-04-12 Bryce McKinlay - - * Makefile.am: Make a libtool convenience library. - * Makefile.in: Rebuilt. - -2001-03-29 Bryce McKinlay - - * configure.in: Use different syntax for subdirectory creation. - * configure: Rebuilt. - -2001-03-27 Jon Beniston - - * configure.in: Added X86_WIN32 target (Win32, CygWin, MingW). - * configure: Rebuilt. - * Makefile.am: Added X86_WIN32 target support. - * Makefile.in: Rebuilt. - - * include/ffi.h.in: Added X86_WIN32 target support. - - * src/ffitest.c: Doesn't run structure tests for X86_WIN32 targets. - * src/types.c: Added X86_WIN32 target support. - - * src/x86/win32.S: New file. Based on sysv.S, but with EH - stuff removed and made to work with CygWin's gas. - -2001-03-26 Bryce McKinlay - - * configure.in: Make target subdirectory in build dir. - * Makefile.am: Override suffix based rules to specify correct output - subdirectory. - * Makefile.in: Rebuilt. - * configure: Rebuilt. - -2001-03-23 Kevin B Hendricks - - * src/powerpc/ppc_closure.S: New file. - * src/powerpc/ffi.c (ffi_prep_args): Fixed ABI compatibility bug - involving long long and register pairs. - (ffi_prep_closure): New function. - (flush_icache): Likewise. - (ffi_closure_helper_SYSV): Likewise. - * include/ffi.h.in (FFI_CLOSURES): Define on PPC. - (FFI_TRAMPOLINE_SIZE): Likewise. - (FFI_NATIVE_RAW_API): Likewise. - * Makefile.in: Rebuilt. - * Makefile.am (EXTRA_DIST): Added src/powerpc/ppc_closure.S. - (TARGET_SRC_POWERPC): Likewise. - -2001-03-19 Tom Tromey - - * Makefile.in: Rebuilt. - * Makefile.am (ffitest_LDFLAGS): New macro. - -2001-03-02 Nick Clifton - - * include/ffi.h.in: Remove RCS ident string. - * include/ffi_mips.h: Remove RCS ident string. - * src/debug.c: Remove RCS ident string. - * src/ffitest.c: Remove RCS ident string. - * src/prep_cif.c: Remove RCS ident string. - * src/types.c: Remove RCS ident string. - * src/alpha/ffi.c: Remove RCS ident string. - * src/alpha/osf.S: Remove RCS ident string. - * src/arm/ffi.c: Remove RCS ident string. - * src/arm/sysv.S: Remove RCS ident string. - * src/mips/ffi.c: Remove RCS ident string. - * src/mips/n32.S: Remove RCS ident string. - * src/mips/o32.S: Remove RCS ident string. - * src/sparc/ffi.c: Remove RCS ident string. - * src/sparc/v8.S: Remove RCS ident string. - * src/sparc/v9.S: Remove RCS ident string. - * src/x86/ffi.c: Remove RCS ident string. - * src/x86/sysv.S: Remove RCS ident string. - -2001-02-08 Joseph S. Myers - - * include/ffi.h.in: Change sourceware.cygnus.com references to - gcc.gnu.org. - -2000-12-09 Richard Henderson - - * src/alpha/ffi.c (ffi_call): Simplify struct return test. - (ffi_closure_osf_inner): Index rather than increment avalue - and arg_types. Give ffi_closure_osf the raw return value type. - * src/alpha/osf.S (ffi_closure_osf): Handle return value type - promotion. - -2000-12-07 Richard Henderson - - * src/raw_api.c (ffi_translate_args): Fix typo. - (ffi_prep_closure): Likewise. - - * include/ffi.h.in [ALPHA]: Define FFI_CLOSURES and - FFI_TRAMPOLINE_SIZE. - * src/alpha/ffi.c (ffi_prep_cif_machdep): Adjust minimal - cif->bytes for new ffi_call_osf implementation. - (ffi_prep_args): Absorb into ... - (ffi_call): ... here. Do all stack allocation here and - avoid a callback function. - (ffi_prep_closure, ffi_closure_osf_inner): New. - * src/alpha/osf.S (ffi_call_osf): Reimplement with no callback. - (ffi_closure_osf): New. - -2000-09-10 Alexandre Oliva - - * config.guess, config.sub, install-sh: Removed. - * ltconfig, ltmain.sh, missing, mkinstalldirs: Likewise. - * Makefile.in: Rebuilt. - - * acinclude.m4: Include libtool macros from the top level. - * aclocal.m4, configure: Rebuilt. - -2000-08-22 Alexandre Oliva - - * configure.in [i*86-*-freebsd*] (TARGET, TARGETDIR): Set. - * configure: Rebuilt. - -2000-05-11 Scott Bambrough - - * libffi/src/arm/sysv.S (ffi_call_SYSV): Doubles are not saved to - memory correctly. Use conditional instructions, not branches where - possible. - -2000-05-04 Tom Tromey - - * configure: Rebuilt. - * configure.in: Match `arm*-*-linux-*'. - From Chris Dornan . - -2000-04-28 Jakub Jelinek - - * Makefile.am (SUBDIRS): Define. - (AM_MAKEFLAGS): Likewise. - (Multilib support.): Add section. - * Makefile.in: Rebuilt. - * ltconfig (extra_compiler_flags, extra_compiler_flags_value): - New variables. Set for gcc using -print-multi-lib. Export them - to libtool. - (sparc64-*-linux-gnu*): Use libsuff 64 for search paths. - * ltmain.sh (B|b|V): Don't throw away gcc's -B, -b and -V options - for -shared links. - (extra_compiler_flags_value, extra_compiler_flags): Check these - for extra compiler options which need to be passed down in - compiler_flags. - -2000-04-16 Anthony Green - - * configure: Rebuilt. - * configure.in: Change i*86-pc-linux* to i*86-*-linux*. - -2000-04-14 Jakub Jelinek - - * include/ffi.h.in (SPARC64): Define for 64bit SPARC builds. - Set SPARC FFI_DEFAULT_ABI based on SPARC64 define. - * src/sparc/ffi.c (ffi_prep_args_v8): Renamed from ffi_prep_args. - Replace all void * sizeofs with sizeof(int). - Only compare type with FFI_TYPE_LONGDOUBLE if LONGDOUBLE is - different than DOUBLE. - Remove FFI_TYPE_SINT32 and FFI_TYPE_UINT32 cases (handled elsewhere). - (ffi_prep_args_v9): New function. - (ffi_prep_cif_machdep): Handle V9 ABI and long long on V8. - (ffi_V9_return_struct): New function. - (ffi_call): Handle FFI_V9 ABI from 64bit code and FFI_V8 ABI from - 32bit code (not yet cross-arch calls). - * src/sparc/v8.S: Add struct return delay nop. - Handle long long. - * src/sparc/v9.S: New file. - * src/prep_cif.c (ffi_prep_cif): Return structure pointer - is used on sparc64 only for structures larger than 32 bytes. - Pass by reference for structures is done for structure arguments - larger than 16 bytes. - * src/ffitest.c (main): Use 64bit rint on sparc64. - Run long long tests on sparc. - * src/types.c (FFI_TYPE_POINTER): Pointer is 64bit on alpha and - sparc64. - (FFI_TYPE_LONGDOUBLE): long double is 128 bit aligned to 128 bits - on sparc64. - * configure.in (sparc-*-linux*): New supported target. - (sparc64-*-linux*): Likewise. - * configure: Rebuilt. - * Makefile.am: Add v9.S to SPARC files. - * Makefile.in: Likewise. - (LINK): Surround $(CCLD) into double quotes, so that multilib - compiles work correctly. - -2000-04-04 Alexandre Petit-Bianco - - * configure: Rebuilt. - * configure.in: (i*86-*-solaris*): New libffi target. Patch - proposed by Bryce McKinlay. - -2000-03-20 Tom Tromey - - * Makefile.in: Hand edit for java_raw_api.lo. - -2000-03-08 Bryce McKinlay - - * config.guess, config.sub: Update from the gcc tree. - Fix for PR libgcj/168. - -2000-03-03 Tom Tromey - - * Makefile.in: Fixed ia64 by hand. - - * configure: Rebuilt. - * configure.in (--enable-multilib): New option. - (libffi_basedir): New subst. - (AC_OUTPUT): Added multilib code. - -2000-03-02 Tom Tromey - - * Makefile.in: Rebuilt. - * Makefile.am (TARGET_SRC_IA64): Use `ia64', not `alpha', as - directory name. - -2000-02-25 Hans Boehm - - * src/ia64/ffi.c, src/ia64/ia64_flags.h, src/ia64/unix.S: New - files. - * src/raw_api.c (ffi_translate_args): Fixed typo in argument - list. - (ffi_prep_raw_closure): Use ffi_translate_args, not - ffi_closure_translate. - * src/java_raw_api.c: New file. - * src/ffitest.c (closure_test_fn): New function. - (main): Define `rint' as long long on IA64. Added new test when - FFI_CLOSURES is defined. - * include/ffi.h.in (ALIGN): Use size_t, not unsigned. - (ffi_abi): Recognize IA64. - (ffi_raw): Added `flt' field. - Added "Java raw API" code. - * configure.in: Recognize ia64. - * Makefile.am (TARGET_SRC_IA64): New macro. - (libffi_la_common_SOURCES): Added java_raw_api.c. - (libffi_la_SOURCES): Define in IA64 case. - -2000-01-04 Tom Tromey - - * Makefile.in: Rebuilt with newer automake. - -1999-12-31 Tom Tromey - - * Makefile.am (INCLUDES): Added -I$(top_srcdir)/src. - -1999-09-01 Tom Tromey - - * include/ffi.h.in: Removed PACKAGE and VERSION defines and - undefs. - * fficonfig.h.in: Rebuilt. - * configure: Rebuilt. - * configure.in: Pass 3rd argument to AM_INIT_AUTOMAKE. - Use AM_PROG_LIBTOOL (automake 1.4 compatibility). - * acconfig.h: Don't #undef PACKAGE or VERSION. - -1999-08-09 Anthony Green - - * include/ffi.h.in: Try to work around messy header problem - with PACKAGE and VERSION. - - * configure: Rebuilt. - * configure.in: Change version to 2.00-beta. - - * fficonfig.h.in: Rebuilt. - * acconfig.h (FFI_NO_STRUCTS, FFI_NO_RAW_API): Define. - - * src/x86/ffi.c (ffi_raw_call): Rename. - -1999-08-02 Kresten Krab Thorup - - * src/x86/ffi.c (ffi_closure_SYSV): New function. - (ffi_prep_incoming_args_SYSV): Ditto. - (ffi_prep_closure): Ditto. - (ffi_closure_raw_SYSV): Ditto. - (ffi_prep_raw_closure): More ditto. - (ffi_call_raw): Final ditto. - - * include/ffi.h.in: Add definitions for closure and raw API. - - * src/x86/ffi.c (ffi_prep_cif_machdep): Added case for - FFI_TYPE_UINT64. - - * Makefile.am (libffi_la_common_SOURCES): Added raw_api.c - - * src/raw_api.c: New file. - - * include/ffi.h.in (ffi_raw): New type. - (UINT_ARG, SINT_ARG): New defines. - (ffi_closure, ffi_raw_closure): New types. - (ffi_prep_closure, ffi_prep_raw_closure): New declarations. - - * configure.in: Add check for endianness and sizeof void*. - - * src/x86/sysv.S (ffi_call_SYSV): Call fixup routine via argument, - instead of directly. - - * configure: Rebuilt. - -Thu Jul 8 14:28:42 1999 Anthony Green - - * configure.in: Add x86 and powerpc BeOS configurations. - From Makoto Kato . - -1999-05-09 Anthony Green - - * configure.in: Add warning about this being beta code. - Remove src/Makefile.am from the picture. - * configure: Rebuilt. - - * Makefile.am: Move logic from src/Makefile.am. Add changes - to support libffi as a target library. - * Makefile.in: Rebuilt. - - * aclocal.m4, config.guess, config.sub, ltconfig, ltmain.sh: - Upgraded to new autoconf, automake, libtool. - - * README: Tweaks. - - * LICENSE: Update copyright date. - - * src/Makefile.am, src/Makefile.in: Removed. - -1998-11-29 Anthony Green - - * include/ChangeLog: Removed. - * src/ChangeLog: Removed. - * src/mips/ChangeLog: Removed. - * src/sparc/ChangeLog: Remboved. - * src/x86/ChangeLog: Removed. - - * ChangeLog.v1: Created. - -============================================================================= -From the old ChangeLog.libffi file.... - -2011-02-08 Andreas Tobler - - * testsuite/lib/libffi.exp: Tweak for stand-alone mode. - -2009-12-25 Samuli Suominen - - * configure.ac: Undefine _AC_ARG_VAR_PRECIOUS for autoconf 2.64. - * configure: Rebuilt. - * fficonfig.h.in: Rebuilt. - -2009-06-16 Andrew Haley - - * testsuite/libffi.call/cls_align_sint64.c, - testsuite/libffi.call/cls_align_uint64.c, - testsuite/libffi.call/cls_longdouble_va.c, - testsuite/libffi.call/cls_ulonglong.c, - testsuite/libffi.call/return_ll1.c, - testsuite/libffi.call/stret_medium2.c: Fix printf format - specifiers. - * testsuite/libffi.call/huge_struct.c: Ad x86 XFAILs. - * testsuite/libffi.call/float2.c: Fix dg-excess-errors. - * testsuite/libffi.call/ffitest.h, - testsuite/libffi.special/ffitestcxx.h (PRIdLL, PRIuLL): Define. - -2009-06-12 Andrew Haley - - * testsuite/libffi.call/cls_align_sint64.c, - testsuite/libffi.call/cls_align_uint64.c, - testsuite/libffi.call/cls_ulonglong.c, - testsuite/libffi.call/return_ll1.c, - testsuite/libffi.call/stret_medium2.c: Fix printf format - specifiers. - testsuite/libffi.special/unwindtest.cc: include stdint.h. - -2009-06-11 Timothy Wall - - * Makefile.am, - configure.ac, - include/ffi.h.in, - include/ffi_common.h, - src/closures.c, - src/dlmalloc.c, - src/x86/ffi.c, - src/x86/ffitarget.h, - src/x86/win64.S (new), - README: Added win64 support (mingw or MSVC) - * Makefile.in, - include/Makefile.in, - man/Makefile.in, - testsuite/Makefile.in, - configure, - aclocal.m4: Regenerated - * ltcf-c.sh: properly escape cygwin/w32 path - * man/ffi_call.3: Clarify size requirements for return value. - * src/x86/ffi64.c: Fix filename in comment. - * src/x86/win32.S: Remove unused extern. - - * testsuite/libffi.call/closure_fn0.c, - testsuite/libffi.call/closure_fn1.c, - testsuite/libffi.call/closure_fn2.c, - testsuite/libffi.call/closure_fn3.c, - testsuite/libffi.call/closure_fn4.c, - testsuite/libffi.call/closure_fn5.c, - testsuite/libffi.call/closure_fn6.c, - testsuite/libffi.call/closure_stdcall.c, - testsuite/libffi.call/cls_12byte.c, - testsuite/libffi.call/cls_16byte.c, - testsuite/libffi.call/cls_18byte.c, - testsuite/libffi.call/cls_19byte.c, - testsuite/libffi.call/cls_1_1byte.c, - testsuite/libffi.call/cls_20byte.c, - testsuite/libffi.call/cls_20byte1.c, - testsuite/libffi.call/cls_24byte.c, - testsuite/libffi.call/cls_2byte.c, - testsuite/libffi.call/cls_3_1byte.c, - testsuite/libffi.call/cls_3byte1.c, - testsuite/libffi.call/cls_3byte2.c, - testsuite/libffi.call/cls_4_1byte.c, - testsuite/libffi.call/cls_4byte.c, - testsuite/libffi.call/cls_5_1_byte.c, - testsuite/libffi.call/cls_5byte.c, - testsuite/libffi.call/cls_64byte.c, - testsuite/libffi.call/cls_6_1_byte.c, - testsuite/libffi.call/cls_6byte.c, - testsuite/libffi.call/cls_7_1_byte.c, - testsuite/libffi.call/cls_7byte.c, - testsuite/libffi.call/cls_8byte.c, - testsuite/libffi.call/cls_9byte1.c, - testsuite/libffi.call/cls_9byte2.c, - testsuite/libffi.call/cls_align_double.c, - testsuite/libffi.call/cls_align_float.c, - testsuite/libffi.call/cls_align_longdouble.c, - testsuite/libffi.call/cls_align_longdouble_split.c, - testsuite/libffi.call/cls_align_longdouble_split2.c, - testsuite/libffi.call/cls_align_pointer.c, - testsuite/libffi.call/cls_align_sint16.c, - testsuite/libffi.call/cls_align_sint32.c, - testsuite/libffi.call/cls_align_sint64.c, - testsuite/libffi.call/cls_align_uint16.c, - testsuite/libffi.call/cls_align_uint32.c, - testsuite/libffi.call/cls_align_uint64.c, - testsuite/libffi.call/cls_dbls_struct.c, - testsuite/libffi.call/cls_double.c, - testsuite/libffi.call/cls_double_va.c, - testsuite/libffi.call/cls_float.c, - testsuite/libffi.call/cls_longdouble.c, - testsuite/libffi.call/cls_longdouble_va.c, - testsuite/libffi.call/cls_multi_schar.c, - testsuite/libffi.call/cls_multi_sshort.c, - testsuite/libffi.call/cls_multi_sshortchar.c, - testsuite/libffi.call/cls_multi_uchar.c, - testsuite/libffi.call/cls_multi_ushort.c, - testsuite/libffi.call/cls_multi_ushortchar.c, - testsuite/libffi.call/cls_pointer.c, - testsuite/libffi.call/cls_pointer_stack.c, - testsuite/libffi.call/cls_schar.c, - testsuite/libffi.call/cls_sint.c, - testsuite/libffi.call/cls_sshort.c, - testsuite/libffi.call/cls_uchar.c, - testsuite/libffi.call/cls_uint.c, - testsuite/libffi.call/cls_ulonglong.c, - testsuite/libffi.call/cls_ushort.c, - testsuite/libffi.call/err_bad_abi.c, - testsuite/libffi.call/err_bad_typedef.c, - testsuite/libffi.call/float2.c, - testsuite/libffi.call/huge_struct.c, - testsuite/libffi.call/nested_struct.c, - testsuite/libffi.call/nested_struct1.c, - testsuite/libffi.call/nested_struct10.c, - testsuite/libffi.call/nested_struct2.c, - testsuite/libffi.call/nested_struct3.c, - testsuite/libffi.call/nested_struct4.c, - testsuite/libffi.call/nested_struct5.c, - testsuite/libffi.call/nested_struct6.c, - testsuite/libffi.call/nested_struct7.c, - testsuite/libffi.call/nested_struct8.c, - testsuite/libffi.call/nested_struct9.c, - testsuite/libffi.call/problem1.c, - testsuite/libffi.call/return_ldl.c, - testsuite/libffi.call/return_ll1.c, - testsuite/libffi.call/stret_large.c, - testsuite/libffi.call/stret_large2.c, - testsuite/libffi.call/stret_medium.c, - testsuite/libffi.call/stret_medium2.c, - testsuite/libffi.special/unwindtest.cc: use ffi_closure_alloc instead - of checking for MMAP. Use intptr_t instead of long casts. - -2009-06-04 Andrew Haley - - * src/powerpc/ffitarget.h: Fix misapplied merge from gcc. - -2009-06-04 Andrew Haley - - * src/mips/o32.S, - src/mips/n32.S: Fix licence formatting. - -2009-06-04 Andrew Haley - - * src/x86/darwin.S: Fix licence formatting. - src/x86/win32.S: Likewise. - src/sh64/sysv.S: Likewise. - src/sh/sysv.S: Likewise. - -2009-06-04 Andrew Haley - - * src/sh64/ffi.c: Remove lint directives. Was missing from merge - of Andreas Tobler's patch from 2006-04-22. - -2009-06-04 Andrew Haley - - * src/sh/ffi.c: Apply missing hunk from Alexandre Oliva's patch of - 2007-03-07. - -2008-12-26 Timothy Wall - - * testsuite/libffi.call/cls_longdouble.c, - testsuite/libffi.call/cls_longdouble_va.c, - testsuite/libffi.call/cls_align_longdouble.c, - testsuite/libffi.call/cls_align_longdouble_split.c, - testsuite/libffi.call/cls_align_longdouble_split2.c: mark expected - failures on x86_64 cygwin/mingw. - -2008-12-22 Timothy Wall - - * testsuite/libffi.call/closure_fn0.c, - testsuite/libffi.call/closure_fn1.c, - testsuite/libffi.call/closure_fn2.c, - testsuite/libffi.call/closure_fn3.c, - testsuite/libffi.call/closure_fn4.c, - testsuite/libffi.call/closure_fn5.c, - testsuite/libffi.call/closure_fn6.c, - testsuite/libffi.call/closure_loc_fn0.c, - testsuite/libffi.call/closure_stdcall.c, - testsuite/libffi.call/cls_align_pointer.c, - testsuite/libffi.call/cls_pointer.c, - testsuite/libffi.call/cls_pointer_stack.c: use portable cast from - pointer to integer (intptr_t). - * testsuite/libffi.call/cls_longdouble.c: disable for win64. - -2008-12-19 Anthony Green - - * configure.ac: Bump version to 3.0.8. - * configure, doc/stamp-vti, doc/version.texi: Rebuilt. - * libtool-version: Increment revision. - * README: Update for new release. - -2008-11-11 Anthony Green - - * configure.ac: Bump version to 3.0.7. - * configure, doc/stamp-vti, doc/version.texi: Rebuilt. - * libtool-version: Increment revision. - * README: Update for new release. - -2008-08-25 Andreas Tobler - - * src/powerpc/ffitarget.h (ffi_abi): Add FFI_LINUX and - FFI_LINUX_SOFT_FLOAT to the POWERPC_FREEBSD enum. - Add note about flag bits used for FFI_SYSV_TYPE_SMALL_STRUCT. - Adjust copyright notice. - * src/powerpc/ffi.c: Add two new flags to indicate if we have one - register or two register to use for FFI_SYSV structs. - (ffi_prep_cif_machdep): Pass the right register flag introduced above. - (ffi_closure_helper_SYSV): Fix the return type for - FFI_SYSV_TYPE_SMALL_STRUCT. Comment. - Adjust copyright notice. - -2008-07-24 Anthony Green - - * testsuite/libffi.call/cls_dbls_struct.c, - testsuite/libffi.call/cls_double_va.c, - testsuite/libffi.call/cls_longdouble.c, - testsuite/libffi.call/cls_longdouble_va.c, - testsuite/libffi.call/cls_pointer.c, - testsuite/libffi.call/cls_pointer_stack.c, - testsuite/libffi.call/err_bad_abi.c: Clean up failures from - compiler warnings. - -2008-07-17 Anthony Green - - * configure.ac: Bump version to 3.0.6. - * configure, doc/stamp-vti, doc/version.texi: Rebuilt. - * libtool-version: Increment revision. Add documentation. - * README: Update for new release. - -2008-07-16 Kaz Kojima - - * src/sh/ffi.c (ffi_prep_closure_loc): Turn INSN into an unsigned - int. - -2008-07-16 Kaz Kojima - - * src/sh/sysv.S: Add .note.GNU-stack on Linux. - * src/sh64/sysv.S: Likewise. - -2008-04-03 Anthony Green - - * libffi.pc.in (Libs): Add -L${libdir}. - * configure.ac: Bump version to 3.0.5. - * configure, doc/stamp-vti, doc/version.texi: Rebuilt. - * libtool-version: Increment revision. - * README: Update for new release. - -2008-04-03 Anthony Green - Xerces Ranby - - * include/ffi.h.in: Wrap definition of target architecture to - protect from double definitions. - -2008-03-22 Moriyoshi Koizumi - - * src/x86/ffi.c (ffi_prep_closure_loc): Fix for bug revealed in - closure_loc_fn0.c. - * testsuite/libffi.call/closure_loc_fn0.c (closure_loc_test_fn0): - New test. - -2008-03-04 Anthony Green - Blake Chaffin - hos@tamanegi.org - - * testsuite/libffi.call/cls_align_longdouble_split2.c - testsuite/libffi.call/cls_align_longdouble_split.c - testsuite/libffi.call/cls_dbls_struct.c - testsuite/libffi.call/cls_double_va.c - testsuite/libffi.call/cls_longdouble.c - testsuite/libffi.call/cls_longdouble_va.c - testsuite/libffi.call/cls_pointer.c - testsuite/libffi.call/cls_pointer_stack.c - testsuite/libffi.call/err_bad_abi.c - testsuite/libffi.call/err_bad_typedef.c - testsuite/libffi.call/huge_struct.c - testsuite/libffi.call/stret_large2.c - testsuite/libffi.call/stret_large.c - testsuite/libffi.call/stret_medium2.c - testsuite/libffi.call/stret_medium.c: New tests from Apple. - -2008-02-26 Jakub Jelinek - Anthony Green - - * src/alpha/osf.S: Add .note.GNU-stack on Linux. - * src/s390/sysv.S: Likewise. - * src/powerpc/linux64.S: Likewise. - * src/powerpc/linux64_closure.S: Likewise. - * src/powerpc/ppc_closure.S: Likewise. - * src/powerpc/sysv.S: Likewise. - * src/x86/unix64.S: Likewise. - * src/x86/sysv.S: Likewise. - * src/sparc/v8.S: Likewise. - * src/sparc/v9.S: Likewise. - * src/m68k/sysv.S: Likewise. - * src/ia64/unix.S: Likewise. - * src/arm/sysv.S: Likewise. - -2008-02-26 Anthony Green - Thomas Heller - - * src/x86/ffi.c (ffi_closure_SYSV_inner): Change C++ comment to C - comment. - -2008-02-26 Anthony Green - Thomas Heller - - * include/ffi.h.in: Change void (*)() to void (*)(void). - -2008-02-26 Anthony Green - Thomas Heller - - * src/alpha/ffi.c: Change void (*)() to void (*)(void). - src/alpha/osf.S, src/arm/ffi.c, src/frv/ffi.c, src/ia64/ffi.c, - src/ia64/unix.S, src/java_raw_api.c, src/m32r/ffi.c, - src/mips/ffi.c, src/pa/ffi.c, src/pa/hpux32.S, src/pa/linux.S, - src/powerpc/ffi.c, src/powerpc/ffi_darwin.c, src/raw_api.c, - src/s390/ffi.c, src/sh/ffi.c, src/sh64/ffi.c, src/sparc/ffi.c, - src/x86/ffi.c, src/x86/unix64.S, src/x86/darwin64.S, - src/x86/ffi64.c: Ditto. - -2008-02-24 Anthony Green - - * configure.ac: Accept openbsd*, not just openbsd. - Bump version to 3.0.4. - * configure, doc/stamp-vti, doc/version.texi: Rebuilt. - * libtool-version: Increment revision. - * README: Update for new release. - -2008-02-22 Anthony Green - - * README: Clean up list of tested platforms. - -2008-02-22 Anthony Green - - * configure.ac: Bump version to 3.0.3. - * configure, doc/stamp-vti, doc/version.texi: Rebuilt. - * libtool-version: Increment revision. - * README: Update for new release. Clean up test docs. - -2008-02-22 Bjoern Koenig - Andreas Tobler - - * configure.ac: Add amd64-*-freebsd* target. - * configure: Regenerate. - -2008-02-22 Thomas Heller - - * configure.ac: Add x86 OpenBSD support. - * configure: Rebuilt. - -2008-02-21 Thomas Heller - - * README: Change "make test" to "make check". - -2008-02-21 Anthony Green - - * configure.ac: Bump version to 3.0.2. - * configure, doc/stamp-vti, doc/version.texi: Rebuilt. - * libtool-version: Increment revision. - * README: Update for new release. - -2008-02-21 Björn König - - * src/x86/freebsd.S: New file. - * configure.ac: Add x86 FreeBSD support. - * Makefile.am: Ditto. - -2008-02-15 Anthony Green - - * configure.ac: Bump version to 3.0.1. - * configure, doc/stamp-vti, doc/version.texi: Rebuilt. - * libtool-version: Increment revision. - * README: Update for new release. - -2008-02-15 David Daney - - * src/mips/ffi.c: Remove extra '>' from include directive. - (ffi_prep_closure_loc): Use clear_location instead of tramp. - -2008-02-15 Anthony Green - - * configure.ac: Bump version to 3.0.0. - * configure, doc/stamp-vti, doc/version.texi: Rebuilt. - -2008-02-15 David Daney - - * src/mips/ffi.c (USE__BUILTIN___CLEAR_CACHE): - Define (conditionally), and use it to include cachectl.h. - (ffi_prep_closure_loc): Fix cache flushing. - * src/mips/ffitarget.h (_ABIN32, _ABI64, _ABIO32): Define. - -2008-02-15 Anthony Green - - * man/ffi_call.3, man/ffi_prep_cif.3, man/ffi.3: - Update dates and remove all references to ffi_prep_closure. - * configure.ac: Bump version to 2.99.9. - * configure, doc/stamp-vti, doc/version.texi: Rebuilt. - -2008-02-15 Anthony Green - - * man/ffi_prep_closure.3: Delete. - * man/Makefile.am (EXTRA_DIST): Remove ffi_prep_closure.3. - (man_MANS): Ditto. - * man/Makefile.in: Rebuilt. - * configure.ac: Bump version to 2.99.8. - * configure, doc/stamp-vti, doc/version.texi: Rebuilt. - -2008-02-14 Anthony Green - - * configure.ac: Bump version to 2.99.7. - * configure, doc/stamp-vti, doc/version.texi: Rebuilt. - * include/ffi.h.in LICENSE src/debug.c src/closures.c - src/ffitest.c src/s390/sysv.S src/s390/ffitarget.h - src/types.c src/m68k/ffitarget.h src/raw_api.c src/frv/ffi.c - src/frv/ffitarget.h src/sh/ffi.c src/sh/sysv.S - src/sh/ffitarget.h src/powerpc/ffitarget.h src/pa/ffi.c - src/pa/ffitarget.h src/pa/linux.S src/java_raw_api.c - src/cris/ffitarget.h src/x86/ffi.c src/x86/sysv.S - src/x86/unix64.S src/x86/win32.S src/x86/ffitarget.h - src/x86/ffi64.c src/x86/darwin.S src/ia64/ffi.c - src/ia64/ffitarget.h src/ia64/ia64_flags.h src/ia64/unix.S - src/sparc/ffi.c src/sparc/v9.S src/sparc/ffitarget.h - src/sparc/v8.S src/alpha/ffi.c src/alpha/ffitarget.h - src/alpha/osf.S src/sh64/ffi.c src/sh64/sysv.S - src/sh64/ffitarget.h src/mips/ffi.c src/mips/ffitarget.h - src/mips/n32.S src/mips/o32.S src/arm/ffi.c src/arm/sysv.S - src/arm/ffitarget.h src/prep_cif.c: Update license text. - -2008-02-14 Anthony Green - - * README: Update tested platforms. - * configure.ac: Bump version to 2.99.6. - * configure: Rebuilt. - -2008-02-14 Anthony Green - - * configure.ac: Bump version to 2.99.5. - * configure: Rebuilt. - * Makefile.am (EXTRA_DIST): Add darwin64.S - * Makefile.in: Rebuilt. - * testsuite/lib/libffi-dg.exp: Remove libstdc++ bits from GCC tree. - * LICENSE: Update WARRANTY. - -2008-02-14 Anthony Green - - * libffi.pc.in (libdir): Fix libdir definition. - * configure.ac: Bump version to 2.99.4. - * configure: Rebuilt. - -2008-02-14 Anthony Green - - * README: Update. - * libffi.info: New file. - * doc/stamp-vti: New file. - * configure.ac: Bump version to 2.99.3. - * configure: Rebuilt. - -2008-02-14 Anthony Green - - * Makefile.am (SUBDIRS): Add man dir. - * Makefile.in: Rebuilt. - * configure.ac: Create Makefile. - * configure: Rebuilt. - * man/ffi_call.3 man/ffi_prep_cif.3 man/ffi_prep_closure.3 - man/Makefile.am man/Makefile.in: New files. - -2008-02-14 Tom Tromey - - * aclocal.m4, Makefile.in, configure, fficonfig.h.in: Rebuilt. - * mdate-sh, texinfo.tex: New files. - * Makefile.am (info_TEXINFOS): New variable. - * doc/libffi.texi: New file. - * doc/version.texi: Likewise. - -2008-02-14 Anthony Green - - * Makefile.am (AM_CFLAGS): Don't compile with -D$(TARGET). - (lib_LTLIBRARIES): Define. - (toolexeclib_LIBRARIES): Undefine. - * Makefile.in: Rebuilt. - * configure.ac: Reset version to 2.99.1. - * configure.in: Rebuilt. - -2008-02-14 Anthony Green - - * libffi.pc.in: Use @PACKAGE_NAME@ and @PACKAGE_VERSION@. - * configure.ac: Reset version to 2.99.1. - * configure.in: Rebuilt. - * Makefile.am (EXTRA_DIST): Add ChangeLog.libffi. - * Makefile.in: Rebuilt. - * LICENSE: Update copyright notice. - -2008-02-14 Anthony Green - - * include/Makefile.am (nodist_includes_HEADERS): Define. Don't - distribute ffitarget.h or ffi.h from the build include dir. - * Makefile.in: Rebuilt. - -2008-02-14 Anthony Green - - * include/Makefile.am (includesdir): Install headers under libdir. - (pkgconfigdir): Define. Install libffi.pc. - * include/Makefile.in: Rebuilt. - * libffi.pc.in: Create. - * libtool-version: Increment CURRENT - * configure.ac: Add libffi.pc.in - * configure: Rebuilt. - -2008-02-03 Anthony Green - - * include/Makefile.am (includesdir): Fix header install with - DESTDIR. - * include/Makefile.in: Rebuilt. - -2008-02-03 Timothy Wall - - * src/x86/ffi.c (FFI_INIT_TRAMPOLINE_STDCALL): Calculate jump return - offset based on code pointer, not data pointer. - -2008-02-01 Anthony Green - - * include/Makefile.am: Fix header installs. - * Makefile.am: Ditto. - * include/Makefile.in: Rebuilt. - * Makefile.in: Ditto. - -2008-02-01 Anthony Green - - * src/x86/ffi.c (FFI_INIT_TRAMPOLINE_STDCALL, - FFI_INIT_TRAMPOLINE): Revert my broken changes to twall's last - patch. - -2008-01-31 Anthony Green - - * Makefile.am (EXTRA_DIST): Add missing files. - * testsuite/Makefile.am: Ditto. - * Makefile.in, testsuite/Makefile.in: Rebuilt. - -2008-01-31 Timothy Wall - - * testsuite/libffi.call/closure_stdcall.c: Add test for stdcall - closures. - * src/x86/ffitarget.h: Increase size of trampoline for stdcall - closures. - * src/x86/win32.S: Add assembly for stdcall closure. - * src/x86/ffi.c: Initialize stdcall closure trampoline. - -2008-01-30 H.J. Lu - - PR libffi/34612 - * src/x86/sysv.S (ffi_closure_SYSV): Pop 4 byte from stack when - returning struct. - - * testsuite/libffi.call/call.exp: Add "-O2 -fomit-frame-pointer" - tests. - -2008-01-30 Anthony Green - - * Makefile.am, include/Makefile.am: Move headers to - libffi_la_SOURCES for new automake. - * Makefile.in, include/Makefile.in: Rebuilt. - - * testsuite/lib/wrapper.exp: Copied from gcc tree to allow for - execution outside of gcc tree. - * testsuite/lib/target-libpath.exp: Ditto. - - * testsuite/lib/libffi-dg.exp: Many changes to allow for execution - outside of gcc tree. - - -============================================================================= -From the old ChangeLog.libgcj file.... - -2004-01-14 Kelley Cook - - * configure.in: Add in AC_PREREQ(2.13) - -2003-02-20 Alexandre Oliva - - * configure.in: Propagate ORIGINAL_LD_FOR_MULTILIBS to - config.status. - * configure: Rebuilt. - -2002-01-27 Alexandre Oliva - - * configure.in (toolexecdir, toolexeclibdir): Set and AC_SUBST. - Remove USE_LIBDIR conditional. - * Makefile.am (toolexecdir, toolexeclibdir): Don't override. - * Makefile.in, configure: Rebuilt. - -Mon Aug 9 18:33:38 1999 Rainer Orth - - * include/Makefile.in: Rebuilt. - * Makefile.in: Rebuilt - * Makefile.am (toolexeclibdir): Add $(MULTISUBDIR) even for native - builds. - Use USE_LIBDIR. - - * configure: Rebuilt. - * configure.in (USE_LIBDIR): Define for native builds. - Use lowercase in configure --help explanations. - -1999-08-08 Anthony Green - - * include/ffi.h.in (FFI_FN): Remove `...'. - -1999-08-08 Anthony Green - - * Makefile.in: Rebuilt. - * Makefile.am (AM_CFLAGS): Compile with -fexceptions. - - * src/x86/sysv.S: Add exception handling metadata. - - -============================================================================= - -The libffi version 1 ChangeLog archive. - -Version 1 of libffi had per-directory ChangeLogs. Current and future -versions have a single ChangeLog file in the root directory. The -version 1 ChangeLogs have all been concatenated into this file for -future reference only. - ---- libffi ---------------------------------------------------------------- - -Mon Oct 5 02:17:50 1998 Anthony Green - - * configure.in: Boosted rev. - * configure, Makefile.in, aclocal.m4: Rebuilt. - * README: Boosted rev and updated release notes. - -Mon Oct 5 01:03:03 1998 Anthony Green - - * configure.in: Boosted rev. - * configure, Makefile.in, aclocal.m4: Rebuilt. - * README: Boosted rev and updated release notes. - -1998-07-25 Andreas Schwab - - * m68k/ffi.c (ffi_prep_cif_machdep): Use bitmask for cif->flags. - Correctly handle small structures. - (ffi_prep_args): Also handle small structures. - (ffi_call): Pass size of return type to ffi_call_SYSV. - * m68k/sysv.S: Adjust for above changes. Correctly align small - structures in the return value. - - * types.c (uint64, sint64) [M68K]: Change alignment to 4. - -Fri Apr 17 17:26:58 1998 Anthony Green - - * configure.in: Boosted rev. - * configure,Makefile.in,aclocal.m4: Rebuilt. - * README: Boosted rev and added release notes. - -Sun Feb 22 00:50:41 1998 Geoff Keating - - * configure.in: Add PowerPC config bits. - -1998-02-14 Andreas Schwab - - * configure.in: Add m68k config bits. Change AC_CANONICAL_SYSTEM - to AC_CANONICAL_HOST, this is not a compiler. Use $host instead - of $target. Remove AC_CHECK_SIZEOF(char), we already know the - result. Fix argument of AC_ARG_ENABLE. - * configure, fficonfig.h.in: Rebuilt. - -Tue Feb 10 20:53:40 1998 Richard Henderson - - * configure.in: Add Alpha config bits. - -Tue May 13 13:39:20 1997 Anthony Green - - * README: Updated dates and reworded Irix comments. - - * configure.in: Removed AC_PROG_RANLIB. - - * Makefile.in, aclocal.m4, config.guess, config.sub, configure, - ltmain.sh, */Makefile.in: libtoolized again and rebuilt with - automake and autoconf. - -Sat May 10 18:44:50 1997 Tom Tromey - - * configure, aclocal.m4: Rebuilt. - * configure.in: Don't compute EXTRADIST; now handled in - src/Makefile.in. Removed macros implied by AM_INIT_AUTOMAKE. - Don't run AM_MAINTAINER_MODE. - -Thu May 8 14:34:05 1997 Anthony Green - - * missing, ltmain.sh, ltconfig.sh: Created. These are new files - required by automake and libtool. - - * README: Boosted rev to 1.14. Added notes. - - * acconfig.h: Moved PACKAGE and VERSION for new automake. - - * configure.in: Changes for libtool. - - * Makefile.am (check): make test now make check. Uses libtool now. - - * Makefile.in, configure.in, aclocal.h, fficonfig.h.in: Rebuilt. - -Thu May 1 16:27:07 1997 Anthony Green - - * missing: Added file required by new automake. - -Tue Nov 26 14:10:42 1996 Anthony Green - - * acconfig.h: Added USING_PURIFY flag. This is defined when - --enable-purify-safety was used at configure time. - - * configure.in (allsources): Added --enable-purify-safety switch. - (VERSION): Boosted rev to 1.13. - * configure: Rebuilt. - -Fri Nov 22 06:46:12 1996 Anthony Green - - * configure.in (VERSION): Boosted rev to 1.12. - Removed special CFLAGS hack for gcc. - * configure: Rebuilt. - - * README: Boosted rev to 1.12. Added notes. - - * Many files: Cygnus Support changed to Cygnus Solutions. - -Wed Oct 30 11:15:25 1996 Anthony Green - - * configure.in (VERSION): Boosted rev to 1.11. - * configure: Rebuilt. - - * README: Boosted rev to 1.11. Added notes about GNU make. - -Tue Oct 29 12:25:12 1996 Anthony Green - - * configure.in: Fixed -Wall trick. - (VERSION): Boosted rev. - * configure: Rebuilt - - * acconfig.h: Needed for --enable-debug configure switch. - - * README: Boosted rev to 1.09. Added more notes on building - libffi, and LCLint. - - * configure.in: Added --enable-debug switch. Boosted rev to - 1.09. - * configure: Rebuilt - -Tue Oct 15 13:11:28 1996 Anthony Green - - * configure.in (VERSION): Boosted rev to 1.08 - * configure: Rebuilt. - - * README: Added n32 bug fix notes. - - * Makefile.am: Added "make lint" production. - * Makefile.in: Rebuilt. - -Mon Oct 14 10:54:46 1996 Anthony Green - - * README: Added web page reference. - - * configure.in, README: Boosted rev to 1.05 - * configure: Rebuilt. - - * README: Fixed n32 sample code. - -Fri Oct 11 17:09:28 1996 Anthony Green - - * README: Added sparc notes. - - * configure.in, README: Boosted rev to 1.04. - * configure: Rebuilt. - -Thu Oct 10 10:31:03 1996 Anthony Green - - * configure.in, README: Boosted rev to 1.03. - * configure: Rebuilt. - - * README: Added struct notes. - - * Makefile.am (EXTRA_DIST): Added LICENSE to distribution. - * Makefile.in: Rebuilt. - - * README: Removed Linux section. No special notes now - because aggregates arg/return types work. - -Wed Oct 9 16:16:42 1996 Anthony Green - - * README, configure.in (VERSION): Boosted rev to 1.02 - * configure: Rebuilt. - -Tue Oct 8 11:56:33 1996 Anthony Green - - * README (NOTE): Added n32 notes. - - * Makefile.am: Added test production. - * Makefile: Rebuilt - - * README: spell checked! - - * configure.in (VERSION): Boosted rev to 1.01 - * configure: Rebuilt. - -Mon Oct 7 15:50:22 1996 Anthony Green - - * configure.in: Added nasty bit to support SGI tools. - * configure: Rebuilt. - - * README: Added SGI notes. Added note about automake bug. - -Mon Oct 7 11:00:28 1996 Anthony Green - - * README: Rewrote intro, and fixed examples. - -Fri Oct 4 10:19:55 1996 Anthony Green - - * configure.in: -D$TARGET is no longer used as a compiler switch. - It is now inserted into ffi.h at configure time. - * configure: Rebuilt. - - * FFI_ABI and FFI_STATUS are now ffi_abi and ffi_status. - -Thu Oct 3 13:47:34 1996 Anthony Green - - * README, LICENSE: Created. Wrote some docs. - - * configure.in: Don't barf on i586-unknown-linuxaout. - Added EXTRADIST code for "make dist". - * configure: Rebuilt. - - * */Makefile.in: Rebuilt with patched automake. - -Tue Oct 1 17:12:25 1996 Anthony Green - - * Makefile.am, aclocal.m4, config.guess, config.sub, - configure.in, fficonfig.h.in, install-sh, mkinstalldirs, - stamp-h.in: Created - * Makefile.in, configure: Generated - ---- libffi/include -------------------------------------------------------- - -Tue Feb 24 13:09:36 1998 Anthony Green - - * ffi_mips.h: Updated FFI_TYPE_STRUCT_* values based on - ffi.h.in changes. This is a work-around for SGI's "simple" - assembler. - -Sun Feb 22 00:51:55 1998 Geoff Keating - - * ffi.h.in: PowerPC support. - -1998-02-14 Andreas Schwab - - * ffi.h.in: Add m68k support. - (FFI_TYPE_LONGDOUBLE): Make it a separate value. - -Tue Feb 10 20:55:16 1998 Richard Henderson - - * ffi.h.in (SIZEOF_ARG): Use a pointer type by default. - - * ffi.h.in: Alpha support. - -Fri Nov 22 06:48:45 1996 Anthony Green - - * ffi.h.in, ffi_common.h: Cygnus Support -> Cygnus Solutions. - -Wed Nov 20 22:31:01 1996 Anthony Green - - * ffi.h.in: Added ffi_type_void definition. - -Tue Oct 29 12:22:40 1996 Anthony Green - - * Makefile.am (hack_DATA): Always install ffi_mips.h. - - * ffi.h.in: Removed FFI_DEBUG. It's now in the correct - place (acconfig.h). - Added #include for size_t definition. - -Tue Oct 15 17:23:35 1996 Anthony Green - - * ffi.h.in, ffi_common.h, ffi_mips.h: More clean up. - Commented out #define of FFI_DEBUG. - -Tue Oct 15 13:01:06 1996 Anthony Green - - * ffi_common.h: Added bool definition. - - * ffi.h.in, ffi_common.h: Clean up based on LCLint output. - Added funny /*@...@*/ comments to annotate source. - -Mon Oct 14 12:29:23 1996 Anthony Green - - * ffi.h.in: Interface changes based on feedback from Jim - Blandy. - -Fri Oct 11 16:49:35 1996 Anthony Green - - * ffi.h.in: Small change for sparc support. - -Thu Oct 10 14:53:37 1996 Anthony Green - - * ffi_mips.h: Added FFI_TYPE_STRUCT_* definitions for - special structure return types. - -Wed Oct 9 13:55:57 1996 Anthony Green - - * ffi.h.in: Added SIZEOF_ARG definition for X86 - -Tue Oct 8 11:40:36 1996 Anthony Green - - * ffi.h.in (FFI_FN): Added macro for eliminating compiler warnings. - Use it to case your function pointers to the proper type. - - * ffi_mips.h (SIZEOF_ARG): Added magic to fix type promotion bug. - - * Makefile.am (EXTRA_DIST): Added ffi_mips.h to EXTRA_DIST. - * Makefile: Rebuilt. - - * ffi_mips.h: Created. Moved all common mips definitions here. - -Mon Oct 7 10:58:12 1996 Anthony Green - - * ffi.h.in: The SGI assember is very picky about parens. Redefined - some macros to avoid problems. - - * ffi.h.in: Added FFI_DEFAULT_ABI definitions. Also added - externs for pointer, and 64bit integral ffi_types. - -Fri Oct 4 09:51:37 1996 Anthony Green - - * ffi.h.in: Added FFI_ABI member to ffi_cif and changed - function prototypes accordingly. - Added #define @TARGET@. Now programs including ffi.h don't - have to specify this themselves. - -Thu Oct 3 15:36:44 1996 Anthony Green - - * ffi.h.in: Changed ffi_prep_cif's values from void* to void** - - * Makefile.am (EXTRA_DIST): Added EXTRA_DIST for "make dist" - to work. - * Makefile.in: Regenerated. - -Wed Oct 2 10:16:59 1996 Anthony Green - - * Makefile.am: Created - * Makefile.in: Generated - - * ffi_common.h: Added rcsid comment - -Tue Oct 1 17:13:51 1996 Anthony Green - - * ffi.h.in, ffi_common.h: Created - ---- libffi/src ------------------------------------------------------------ - -Mon Oct 5 02:17:50 1998 Anthony Green - - * arm/ffi.c, arm/sysv.S: Created. - - * Makefile.am: Added arm files. - * Makefile.in: Rebuilt. - -Mon Oct 5 01:41:38 1998 Anthony Green - - * Makefile.am (libffi_la_LDFLAGS): Incremented revision. - -Sun Oct 4 16:27:17 1998 Anthony Green - - * alpha/osf.S (ffi_call_osf): Patch for DU assembler. - - * ffitest.c (main): long long and long double return values work - for x86. - -Fri Apr 17 11:50:58 1998 Anthony Green - - * Makefile.in: Rebuilt. - - * ffitest.c (main): Floating point tests not executed for systems - with broken lond double (SunOS 4 w/ GCC). - - * types.c: Fixed x86 alignment info for long long types. - -Thu Apr 16 07:15:28 1998 Anthony Green - - * ffitest.c: Added more notes about GCC bugs under Irix 6. - -Wed Apr 15 08:42:22 1998 Anthony Green - - * ffitest.c (struct5): New test function. - (main): New test with struct5. - -Thu Mar 5 10:48:11 1998 Anthony Green - - * prep_cif.c (initialize_aggregate): Fix assertion for - nested structures. - -Tue Feb 24 16:33:41 1998 Anthony Green - - * prep_cif.c (ffi_prep_cif): Added long double support for sparc. - -Sun Feb 22 00:52:18 1998 Geoff Keating - - * powerpc/asm.h: New file. - * powerpc/ffi.c: New file. - * powerpc/sysv.S: New file. - * Makefile.am: PowerPC port. - * ffitest.c (main): Allow all tests to run even in presence of gcc - bug on PowerPC. - -1998-02-17 Anthony Green - - * mips/ffi.c: Fixed comment typo. - - * x86/ffi.c (ffi_prep_cif_machdep), x86/sysv.S (retfloat): - Fixed x86 long double return handling. - - * types.c: Fixed x86 long double alignment info. - -1998-02-14 Andreas Schwab - - * types.c: Add m68k support. - - * ffitest.c (floating): Add long double parameter. - (return_ll, ldblit): New functions to test long long and long - double return value. - (main): Fix type error in assignment of ts[1-4]_type.elements. - Add tests for long long and long double arguments and return - values. - - * prep_cif.c (ffi_prep_cif) [M68K]: Don't allocate argument for - struct value pointer. - - * m68k/ffi.c, m68k/sysv.S: New files. - * Makefile.am: Add bits for m68k port. Add kludge to work around - automake deficiency. - (test): Don't require "." in $PATH. - * Makefile.in: Rebuilt. - -Wed Feb 11 07:36:50 1998 Anthony Green - - * Makefile.in: Rebuilt. - -Tue Feb 10 20:56:00 1998 Richard Henderson - - * alpha/ffi.c, alpha/osf.S: New files. - * Makefile.am: Alpha port. - -Tue Nov 18 14:12:07 1997 Anthony Green - - * mips/ffi.c (ffi_prep_cif_machdep): Initialize rstruct_flag - for n32. - -Tue Jun 3 17:18:20 1997 Anthony Green - - * ffitest.c (main): Added hack to get structure tests working - correctly. - -Sat May 10 19:06:42 1997 Tom Tromey - - * Makefile.in: Rebuilt. - * Makefile.am (EXTRA_DIST): Explicitly list all distributable - files in subdirs. - (VERSION, CC): Removed. - -Thu May 8 17:19:01 1997 Anthony Green - - * Makefile.am: Many changes for new automake and libtool. - * Makefile.in: Rebuilt. - -Fri Nov 22 06:57:56 1996 Anthony Green - - * ffitest.c (main): Fixed test case for non mips machines. - -Wed Nov 20 22:31:59 1996 Anthony Green - - * types.c: Added ffi_type_void declaration. - -Tue Oct 29 13:07:19 1996 Anthony Green - - * ffitest.c (main): Fixed character constants. - (main): Emit warning for structure test 3 failure on Sun. - - * Makefile.am (VPATH): Fixed VPATH def'n so automake won't - strip it out. - Moved distdir hack from libffi to automake. - (ffitest): Added missing -c for $(COMPILE) (change in automake). - * Makefile.in: Rebuilt. - -Tue Oct 15 13:08:20 1996 Anthony Green - - * Makefile.am: Added "make lint" production. - * Makefile.in: Rebuilt. - - * prep_cif.c (STACK_ARG_SIZE): Improved STACK_ARG_SIZE macro. - Clean up based on LCLint output. Added funny /*@...@*/ comments to - annotate source. - - * ffitest.c, debug.c: Cleaned up code. - -Mon Oct 14 12:26:56 1996 Anthony Green - - * ffitest.c: Changes based on interface changes. - - * prep_cif.c (ffi_prep_cif): Cleaned up interface based on - feedback from Jim Blandy. - -Fri Oct 11 15:53:18 1996 Anthony Green - - * ffitest.c: Reordered tests while porting to sparc. - Made changes to handle lame structure passing for sparc. - Removed calls to fflush(). - - * prep_cif.c (ffi_prep_cif): Added special case for sparc - aggregate type arguments. - -Thu Oct 10 09:56:51 1996 Anthony Green - - * ffitest.c (main): Added structure passing/returning tests. - - * prep_cif.c (ffi_prep_cif): Perform proper initialization - of structure return types if needed. - (initialize_aggregate): Bug fix - -Wed Oct 9 16:04:20 1996 Anthony Green - - * types.c: Added special definitions for x86 (double doesn't - need double word alignment). - - * ffitest.c: Added many tests - -Tue Oct 8 09:19:22 1996 Anthony Green - - * prep_cif.c (ffi_prep_cif): Fixed assertion. - - * debug.c (ffi_assert): Must return a non void now. - - * Makefile.am: Added test production. - * Makefile: Rebuilt. - - * ffitest.c (main): Created. - - * types.c: Created. Stripped common code out of */ffi.c. - - * prep_cif.c: Added missing stdlib.h include. - - * debug.c (ffi_type_test): Used "a" to eliminate compiler - warnings in non-debug builds. Included ffi_common.h. - -Mon Oct 7 15:36:42 1996 Anthony Green - - * Makefile.am: Added a rule for .s -> .o - This is required by the SGI compiler. - * Makefile: Rebuilt. - -Fri Oct 4 09:51:08 1996 Anthony Green - - * prep_cif.c (initialize_aggregate): Moved abi specification - to ffi_prep_cif(). - -Thu Oct 3 15:37:37 1996 Anthony Green - - * prep_cif.c (ffi_prep_cif): Changed values from void* to void**. - (initialize_aggregate): Fixed aggregate type initialization. - - * Makefile.am (EXTRA_DIST): Added support code for "make dist". - * Makefile.in: Regenerated. - -Wed Oct 2 11:41:57 1996 Anthony Green - - * debug.c, prep_cif: Created. - - * Makefile.am: Added debug.o and prep_cif.o to OBJ. - * Makefile.in: Regenerated. - - * Makefile.am (INCLUDES): Added missing -I../include - * Makefile.in: Regenerated. - -Tue Oct 1 17:11:51 1996 Anthony Green - - * error.c, Makefile.am: Created. - * Makefile.in: Generated. - ---- libffi/src/x86 -------------------------------------------------------- - -Sun Oct 4 16:27:17 1998 Anthony Green - - * sysv.S (retlongdouble): Fixed long long return value support. - * ffi.c (ffi_prep_cif_machdep): Ditto. - -Wed May 13 04:30:33 1998 Anthony Green - - * ffi.c (ffi_prep_cif_machdep): Fixed long double return value - support. - -Wed Apr 15 08:43:20 1998 Anthony Green - - * ffi.c (ffi_prep_args): small struct support was missing. - -Thu May 8 16:53:58 1997 Anthony Green - - * objects.mak: Removed. - -Mon Dec 2 15:12:58 1996 Tom Tromey - - * sysv.S: Use .balign, for a.out Linux boxes. - -Tue Oct 15 13:06:50 1996 Anthony Green - - * ffi.c: Clean up based on LCLint output. - Added funny /*@...@*/ comments to annotate source. - -Fri Oct 11 16:43:38 1996 Anthony Green - - * ffi.c (ffi_call): Added assertion for bad ABIs. - -Wed Oct 9 13:57:27 1996 Anthony Green - - * sysv.S (retdouble): Fixed double return problems. - - * ffi.c (ffi_call): Corrected fn arg definition. - (ffi_prep_cif_machdep): Fixed double return problems - -Tue Oct 8 12:12:49 1996 Anthony Green - - * ffi.c: Moved ffi_type definitions to types.c. - (ffi_prep_args): Fixed type promotion bug. - -Mon Oct 7 15:53:06 1996 Anthony Green - - * ffi.c (FFI_*_TYPEDEF): Removed redundant ';' - -Fri Oct 4 09:54:53 1996 Anthony Green - - * ffi.c (ffi_call): Removed FFI_ABI arg, and swapped - remaining args. - -Wed Oct 2 10:07:05 1996 Anthony Green - - * ffi.c, sysv.S, objects.mak: Created. - (ffi_prep_cif): cif->rvalue no longer initialized to NULL. - (ffi_prep_cif_machdep): Moved machine independent cif processing - to src/prep_cif.c. Introduced ffi_prep_cif_machdep(). - ---- libffi/src/mips ------------------------------------------------------- - -Tue Feb 17 17:18:07 1998 Anthony Green - - * o32.S: Fixed typo in comment. - - * ffi.c (ffi_prep_cif_machdep): Fixed argument processing. - -Thu May 8 16:53:58 1997 Anthony Green - - * o32.s, n32.s: Wrappers for SGI tool support. - - * objects.mak: Removed. - -Tue Oct 29 14:37:45 1996 Anthony Green - - * ffi.c (ffi_prep_args): Changed int z to size_t z. - -Tue Oct 15 13:17:25 1996 Anthony Green - - * n32.S: Fixed bad stack munging. - - * ffi.c: Moved prototypes for ffi_call_?32() to here from - ffi_mips.h because extended_cif is not defined in ffi_mips.h. - -Mon Oct 14 12:42:02 1996 Anthony Green - - * ffi.c: Interface changes based on feedback from Jim Blandy. - -Thu Oct 10 11:22:16 1996 Anthony Green - - * n32.S, ffi.c: Lots of changes to support passing and - returning structures with the n32 calling convention. - - * n32.S: Fixed fn pointer bug. - - * ffi.c (ffi_prep_cif_machdep): Fix for o32 structure - return values. - (ffi_prep_args): Fixed n32 structure passing when structures - partially fit in registers. - -Wed Oct 9 13:49:25 1996 Anthony Green - - * objects.mak: Added n32.o. - - * n32.S: Created. - - * ffi.c (ffi_prep_args): Added magic to support proper - n32 processing. - -Tue Oct 8 10:37:35 1996 Anthony Green - - * ffi.c: Moved ffi_type definitions to types.c. - (ffi_prep_args): Fixed type promotion bug. - - * o32.S: This code is only built for o32 compiles. - A lot of the #define cruft has moved to ffi_mips.h. - - * ffi.c (ffi_prep_cif_machdep): Fixed arg flags. Second arg - is only processed if the first is either a float or double. - -Mon Oct 7 15:33:59 1996 Anthony Green - - * o32.S: Modified to compile under each of o32, n32 and n64. - - * ffi.c (FFI_*_TYPEDEF): Removed redundant ';' - -Fri Oct 4 09:53:25 1996 Anthony Green - - * ffi.c (ffi_call): Removed FFI_ABI arg, and swapped - remaining args. - -Wed Oct 2 17:41:22 1996 Anthony Green - - * o32.S: Removed crufty definitions. - -Wed Oct 2 12:53:42 1996 Anthony Green - - * ffi.c (ffi_prep_cif): cif->rvalue no longer initialized to NULL. - (ffi_prep_cif_machdep): Moved all machine independent cif processing - to src/prep_cif.c. Introduced ffi_prep_cif_machdep. Return types - of FFI_TYPE_STRUCT are no different than FFI_TYPE_INT. - -Tue Oct 1 17:11:02 1996 Anthony Green - - * ffi.c, o32.S, object.mak: Created - ---- libffi/src/sparc ------------------------------------------------------ - -Tue Feb 24 16:33:18 1998 Anthony Green - - * ffi.c (ffi_prep_args): Added long double support. - -Thu May 8 16:53:58 1997 Anthony Green - - * objects.mak: Removed. - -Thu May 1 16:07:56 1997 Anthony Green - - * v8.S: Fixed minor portability problem reported by - Russ McManus . - -Tue Nov 26 14:12:43 1996 Anthony Green - - * v8.S: Used STACKFRAME define elsewhere. - - * ffi.c (ffi_prep_args): Zero out space when USING_PURIFY - is set. - (ffi_prep_cif_machdep): Allocate the correct stack frame - space for functions with < 6 args. - -Tue Oct 29 15:08:55 1996 Anthony Green - - * ffi.c (ffi_prep_args): int z is now size_t z. - -Mon Oct 14 13:31:24 1996 Anthony Green - - * v8.S (ffi_call_V8): Gordon rewrites this again. It looks - great now. - - * ffi.c (ffi_call): The comment about hijacked registers - is no longer valid after gordoni hacked v8.S. - - * v8.S (ffi_call_V8): Rewrote with gordoni. Much simpler. - - * v8.S, ffi.c: ffi_call() had changed to accept more than - two args, so v8.S had to change (because it hijacks incoming - arg registers). - - * ffi.c: Interface changes based on feedback from Jim Blandy. - -Thu Oct 10 17:48:16 1996 Anthony Green - - * ffi.c, v8.S, objects.mak: Created. - - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/LICENSE b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/LICENSE deleted file mode 100644 index 4f0b762..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -libffi - Copyright (c) 1996-2020 Anthony Green, Red Hat, Inc and others. -See source files for details. - -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/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/LICENSE-BUILDTOOLS b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/LICENSE-BUILDTOOLS deleted file mode 100644 index d1d626e..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/LICENSE-BUILDTOOLS +++ /dev/null @@ -1,353 +0,0 @@ -The libffi source distribution contains certain code that is not part -of libffi, and is only used as tooling to assist with the building and -testing of libffi. This includes the msvcc.sh script used to wrap the -Microsoft compiler with GNU compatible command-line options, -make_sunver.pl, and the libffi test code distributed in the -testsuite/libffi.bhaible directory. This code is distributed with -libffi for the purpose of convenience only, and libffi is in no way -derived from this code. - -msvcc.sh an testsuite/libffi.bhaible are both distributed under the -terms of the GNU GPL version 2, as below. - - - - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/Makefile.am b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/Makefile.am deleted file mode 100644 index 7654bf5..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/Makefile.am +++ /dev/null @@ -1,150 +0,0 @@ -## Process this with automake to create Makefile.in - -AUTOMAKE_OPTIONS = foreign subdir-objects - -ACLOCAL_AMFLAGS = -I m4 - -SUBDIRS = include testsuite man -if BUILD_DOCS -## This hack is needed because it doesn't seem possible to make a -## conditional info_TEXINFOS in Automake. At least Automake 1.14 -## either gives errors -- if this attempted in the most -## straightforward way -- or simply unconditionally tries to build the -## info file. -SUBDIRS += doc -endif - -EXTRA_DIST = LICENSE ChangeLog.old \ - m4/libtool.m4 m4/lt~obsolete.m4 \ - m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4 \ - m4/ltversion.m4 src/debug.c msvcc.sh \ - generate-darwin-source-and-headers.py \ - libffi.xcodeproj/project.pbxproj \ - libtool-ldflags libtool-version configure.host README.md \ - libffi.map.in LICENSE-BUILDTOOLS msvc_build make_sunver.pl - -# local.exp is generated by configure -DISTCLEANFILES = local.exp - -# Subdir rules rely on $(FLAGS_TO_PASS) -FLAGS_TO_PASS = $(AM_MAKEFLAGS) - -MAKEOVERRIDES= - -pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = libffi.pc - -toolexeclib_LTLIBRARIES = libffi.la -noinst_LTLIBRARIES = libffi_convenience.la - -libffi_la_SOURCES = src/prep_cif.c src/types.c \ - src/raw_api.c src/java_raw_api.c src/closures.c - -if FFI_DEBUG -libffi_la_SOURCES += src/debug.c -endif - -noinst_HEADERS = src/aarch64/ffitarget.h src/aarch64/internal.h \ - src/alpha/ffitarget.h src/alpha/internal.h \ - src/arc/ffitarget.h src/arm/ffitarget.h src/arm/internal.h \ - src/avr32/ffitarget.h src/bfin/ffitarget.h \ - src/cris/ffitarget.h src/csky/ffitarget.h src/frv/ffitarget.h \ - src/ia64/ffitarget.h src/ia64/ia64_flags.h \ - src/m32r/ffitarget.h src/m68k/ffitarget.h \ - src/m88k/ffitarget.h src/metag/ffitarget.h \ - src/microblaze/ffitarget.h src/mips/ffitarget.h \ - src/moxie/ffitarget.h src/nios2/ffitarget.h \ - src/or1k/ffitarget.h src/pa/ffitarget.h \ - src/powerpc/ffitarget.h src/powerpc/asm.h \ - src/powerpc/ffi_powerpc.h src/riscv/ffitarget.h \ - src/s390/ffitarget.h src/s390/internal.h src/sh/ffitarget.h \ - src/sh64/ffitarget.h src/sparc/ffitarget.h \ - src/sparc/internal.h src/tile/ffitarget.h src/vax/ffitarget.h \ - src/x86/ffitarget.h src/x86/internal.h src/x86/internal64.h \ - src/x86/asmnames.h src/xtensa/ffitarget.h src/dlmalloc.c \ - src/kvx/ffitarget.h - -EXTRA_libffi_la_SOURCES = src/aarch64/ffi.c src/aarch64/sysv.S \ - src/aarch64/win64_armasm.S src/alpha/ffi.c src/alpha/osf.S \ - src/arc/ffi.c src/arc/arcompact.S src/arm/ffi.c \ - src/arm/sysv.S src/arm/ffi.c src/arm/sysv_msvc_arm32.S \ - src/avr32/ffi.c src/avr32/sysv.S src/bfin/ffi.c \ - src/bfin/sysv.S src/cris/ffi.c src/cris/sysv.S src/frv/ffi.c \ - src/csky/ffi.c src/csky/sysv.S src/frv/eabi.S src/ia64/ffi.c \ - src/ia64/unix.S src/m32r/ffi.c src/m32r/sysv.S src/m68k/ffi.c \ - src/m68k/sysv.S src/m88k/ffi.c src/m88k/obsd.S \ - src/metag/ffi.c src/metag/sysv.S src/microblaze/ffi.c \ - src/microblaze/sysv.S src/mips/ffi.c src/mips/o32.S \ - src/mips/n32.S src/moxie/ffi.c src/moxie/eabi.S \ - src/nios2/ffi.c src/nios2/sysv.S src/or1k/ffi.c \ - src/or1k/sysv.S src/pa/ffi.c src/pa/linux.S src/pa/hpux32.S \ - src/powerpc/ffi.c src/powerpc/ffi_sysv.c \ - src/powerpc/ffi_linux64.c src/powerpc/sysv.S \ - src/powerpc/linux64.S src/powerpc/linux64_closure.S \ - src/powerpc/ppc_closure.S src/powerpc/aix.S \ - src/powerpc/darwin.S src/powerpc/aix_closure.S \ - src/powerpc/darwin_closure.S src/powerpc/ffi_darwin.c \ - src/riscv/ffi.c src/riscv/sysv.S src/s390/ffi.c \ - src/s390/sysv.S src/sh/ffi.c src/sh/sysv.S src/sh64/ffi.c \ - src/sh64/sysv.S src/sparc/ffi.c src/sparc/ffi64.c \ - src/sparc/v8.S src/sparc/v9.S src/tile/ffi.c src/tile/tile.S \ - src/vax/ffi.c src/vax/elfbsd.S src/x86/ffi.c src/x86/sysv.S \ - src/x86/ffiw64.c src/x86/win64.S src/x86/ffi64.c \ - src/x86/unix64.S src/x86/sysv_intel.S src/x86/win64_intel.S \ - src/xtensa/ffi.c src/xtensa/sysv.S src/kvx/ffi.c \ - src/kvx/sysv.S - -TARGET_OBJ = @TARGET_OBJ@ -libffi_la_LIBADD = $(TARGET_OBJ) - -libffi_convenience_la_SOURCES = $(libffi_la_SOURCES) -EXTRA_libffi_convenience_la_SOURCES = $(EXTRA_libffi_la_SOURCES) -libffi_convenience_la_LIBADD = $(libffi_la_LIBADD) -libffi_convenience_la_DEPENDENCIES = $(libffi_la_DEPENDENCIES) -nodist_libffi_convenience_la_SOURCES = $(nodist_libffi_la_SOURCES) - -LTLDFLAGS = $(shell $(SHELL) $(top_srcdir)/libtool-ldflags $(LDFLAGS)) - -AM_CFLAGS = -if FFI_DEBUG -# Build debug. Define FFI_DEBUG on the commandline so that, when building with -# MSVC, it can link against the debug CRT. -AM_CFLAGS += -DFFI_DEBUG -endif - -if LIBFFI_BUILD_VERSIONED_SHLIB -if LIBFFI_BUILD_VERSIONED_SHLIB_GNU -libffi_version_script = -Wl,--version-script,libffi.map -libffi_version_dep = libffi.map -endif -if LIBFFI_BUILD_VERSIONED_SHLIB_SUN -libffi_version_script = -Wl,-M,libffi.map-sun -libffi_version_dep = libffi.map-sun -libffi.map-sun : libffi.map $(top_srcdir)/make_sunver.pl \ - $(libffi_la_OBJECTS) $(libffi_la_LIBADD) - perl $(top_srcdir)/make_sunver.pl libffi.map \ - `echo $(libffi_la_OBJECTS) $(libffi_la_LIBADD) | \ - sed 's,\([^/ ]*\)\.l\([ao]\),.libs/\1.\2,g'` \ - > $@ || (rm -f $@ ; exit 1) -endif -else -libffi_version_script = -libffi_version_dep = -endif -libffi_version_info = -version-info `grep -v '^\#' $(srcdir)/libtool-version` - -libffi.map: $(top_srcdir)/libffi.map.in - $(COMPILE) -D$(TARGET) -DGENERATE_LIBFFI_MAP \ - -E -x assembler-with-cpp -o $@ $(top_srcdir)/libffi.map.in - -libffi_la_LDFLAGS = -no-undefined $(libffi_version_info) $(libffi_version_script) $(LTLDFLAGS) $(AM_LTLDFLAGS) -libffi_la_DEPENDENCIES = $(libffi_la_LIBADD) $(libffi_version_dep) - -AM_CPPFLAGS = -I. -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src -AM_CCASFLAGS = $(AM_CPPFLAGS) - -dist-hook: - d=`(cd $(distdir); pwd)`; (cd doc; make pdf; cp *.pdf $$d/doc) - if [ -d $(top_srcdir)/.git ] ; then (cd $(top_srcdir); git log --no-decorate) ; else echo 'See git log for history.' ; fi > $(distdir)/ChangeLog - s=`awk '/was released on/{ print NR; exit}' $(top_srcdir)/README.md`; tail -n +$$(($$s-1)) $(top_srcdir)/README.md > $(distdir)/README.md - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/README.md b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/README.md deleted file mode 100644 index 4225d85..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/README.md +++ /dev/null @@ -1,486 +0,0 @@ -Status -====== - -[![Build Status](https://travis-ci.org/libffi/libffi.svg?branch=master)](https://travis-ci.org/libffi/libffi) -[![Build status](https://ci.appveyor.com/api/projects/status/8lko9vagbx4w2kxq?svg=true)](https://ci.appveyor.com/project/atgreen/libffi) - -libffi-3.4 was released on TBD. Check the libffi web -page for updates: . - - -What is libffi? -=============== - -Compilers for high level languages generate code that follow certain -conventions. These conventions are necessary, in part, for separate -compilation to work. One such convention is the "calling -convention". The "calling convention" is essentially a set of -assumptions made by the compiler about where function arguments will -be found on entry to a function. A "calling convention" also specifies -where the return value for a function is found. - -Some programs may not know at the time of compilation what arguments -are to be passed to a function. For instance, an interpreter may be -told at run-time about the number and types of arguments used to call -a given function. Libffi can be used in such programs to provide a -bridge from the interpreter program to compiled code. - -The libffi library provides a portable, high level programming -interface to various calling conventions. This allows a programmer to -call any function specified by a call interface description at run -time. - -FFI stands for Foreign Function Interface. A foreign function -interface is the popular name for the interface that allows code -written in one language to call code written in another language. The -libffi library really only provides the lowest, machine dependent -layer of a fully featured foreign function interface. A layer must -exist above libffi that handles type conversions for values passed -between the two languages. - - -Supported Platforms -=================== - -Libffi has been ported to many different platforms. - -At the time of release, the following basic configurations have been -tested: - -| Architecture | Operating System | Compiler | -| --------------- | ---------------- | ----------------------- | -| AArch64 (ARM64) | iOS | Clang | -| AArch64 | Linux | GCC | -| AArch64 | Windows | MSVC | -| Alpha | Linux | GCC | -| Alpha | Tru64 | GCC | -| ARC | Linux | GCC | -| ARM | Linux | GCC | -| ARM | iOS | GCC | -| ARM | Windows | MSVC | -| AVR32 | Linux | GCC | -| Blackfin | uClinux | GCC | -| CSKY | Linux | GCC | -| HPPA | HPUX | GCC | -| KVX | Linux | GCC | -| IA-64 | Linux | GCC | -| M68K | FreeMiNT | GCC | -| M68K | Linux | GCC | -| M68K | RTEMS | GCC | -| M88K | OpenBSD/mvme88k | GCC | -| Meta | Linux | GCC | -| MicroBlaze | Linux | GCC | -| MIPS | IRIX | GCC | -| MIPS | Linux | GCC | -| MIPS | RTEMS | GCC | -| MIPS64 | Linux | GCC | -| Moxie | Bare metal | GCC | -| Nios II | Linux | GCC | -| OpenRISC | Linux | GCC | -| PowerPC 32-bit | AIX | IBM XL C | -| PowerPC 64-bit | AIX | IBM XL C | -| PowerPC | AMIGA | GCC | -| PowerPC | Linux | GCC | -| PowerPC | Mac OSX | GCC | -| PowerPC | FreeBSD | GCC | -| PowerPC 64-bit | FreeBSD | GCC | -| PowerPC 64-bit | Linux ELFv1 | GCC | -| PowerPC 64-bit | Linux ELFv2 | GCC | -| RISC-V 32-bit | Linux | GCC | -| RISC-V 64-bit | Linux | GCC | -| S390 | Linux | GCC | -| S390X | Linux | GCC | -| SPARC | Linux | GCC | -| SPARC | Solaris | GCC | -| SPARC | Solaris | Oracle Solaris Studio C | -| SPARC64 | Linux | GCC | -| SPARC64 | FreeBSD | GCC | -| SPARC64 | Solaris | Oracle Solaris Studio C | -| TILE-Gx/TILEPro | Linux | GCC | -| VAX | OpenBSD/vax | GCC | -| X86 | FreeBSD | GCC | -| X86 | GNU HURD | GCC | -| X86 | Interix | GCC | -| X86 | kFreeBSD | GCC | -| X86 | Linux | GCC | -| X86 | OpenBSD | GCC | -| X86 | OS/2 | GCC | -| X86 | Solaris | GCC | -| X86 | Solaris | Oracle Solaris Studio C | -| X86 | Windows/Cygwin | GCC | -| X86 | Windows/MingW | GCC | -| X86-64 | FreeBSD | GCC | -| X86-64 | Linux | GCC | -| X86-64 | Linux/x32 | GCC | -| X86-64 | OpenBSD | GCC | -| X86-64 | Solaris | Oracle Solaris Studio C | -| X86-64 | Windows/Cygwin | GCC | -| X86-64 | Windows/MingW | GCC | -| X86-64 | Mac OSX | GCC | -| Xtensa | Linux | GCC | - -Please send additional platform test results to -libffi-discuss@sourceware.org. - -Installing libffi -================= - -First you must configure the distribution for your particular -system. Go to the directory you wish to build libffi in and run the -"configure" program found in the root directory of the libffi source -distribution. Note that building libffi requires a C99 compatible -compiler. - -If you're building libffi directly from git hosted sources, configure -won't exist yet; run ./autogen.sh first. This will require that you -install autoconf, automake and libtool. - -You may want to tell configure where to install the libffi library and -header files. To do that, use the ``--prefix`` configure switch. Libffi -will install under /usr/local by default. - -If you want to enable extra run-time debugging checks use the the -``--enable-debug`` configure switch. This is useful when your program dies -mysteriously while using libffi. - -Another useful configure switch is ``--enable-purify-safety``. Using this -will add some extra code which will suppress certain warnings when you -are using Purify with libffi. Only use this switch when using -Purify, as it will slow down the library. - -If you don't want to build documentation, use the ``--disable-docs`` -configure switch. - -It's also possible to build libffi on Windows platforms with -Microsoft's Visual C++ compiler. In this case, use the msvcc.sh -wrapper script during configuration like so: - - path/to/configure CC=path/to/msvcc.sh CXX=path/to/msvcc.sh LD=link CPP="cl -nologo -EP" CPPFLAGS="-DFFI_BUILDING_DLL" - -For 64-bit Windows builds, use ``CC="path/to/msvcc.sh -m64"`` and -``CXX="path/to/msvcc.sh -m64"``. You may also need to specify -``--build`` appropriately. - -It is also possible to build libffi on Windows platforms with the LLVM -project's clang-cl compiler, like below: - - path/to/configure CC="path/to/msvcc.sh -clang-cl" CXX="path/to/msvcc.sh -clang-cl" LD=link CPP="clang-cl -EP" - -When building with MSVC under a MingW environment, you may need to -remove the line in configure that sets 'fix_srcfile_path' to a 'cygpath' -command. ('cygpath' is not present in MingW, and is not required when -using MingW-style paths.) - -To build static library for ARM64 with MSVC using visual studio solution, msvc_build folder have - aarch64/Ffi_staticLib.sln - required header files in aarch64/aarch64_include/ - - -SPARC Solaris builds require the use of the GNU assembler and linker. -Point ``AS`` and ``LD`` environment variables at those tool prior to -configuration. - -For iOS builds, the ``libffi.xcodeproj`` Xcode project is available. - -Configure has many other options. Use ``configure --help`` to see them all. - -Once configure has finished, type "make". Note that you must be using -GNU make. You can ftp GNU make from ftp.gnu.org:/pub/gnu/make . - -To ensure that libffi is working as advertised, type "make check". -This will require that you have DejaGNU installed. - -To install the library and header files, type ``make install``. - - -History -======= - -See the git log for details at http://github.com/libffi/libffi. - - 3.4 TBD - Add support for Alibaba's CSKY architecture. - Add support for Intel Control-flow Enforcement Technology (CET). - Add support for ARM Pointer Authentication (PA). - Fix 32-bit PPC regression. - Fix MIPS soft-float problem. - - 3.3 Nov-23-19 - Add RISC-V support. - New API in support of GO closures. - Add IEEE754 binary128 long double support for 64-bit Power - Default to Microsoft's 64 bit long double ABI with Visual C++. - GNU compiler uses 80 bits (128 in memory) FFI_GNUW64 ABI. - Add Windows on ARM64 (WOA) support. - Add Windows 32-bit ARM support. - Raw java (gcj) API deprecated. - Add pre-built PDF documentation to source distribution. - Many new test cases and bug fixes. - - 3.2.1 Nov-12-14 - Build fix for non-iOS AArch64 targets. - - 3.2 Nov-11-14 - Add C99 Complex Type support (currently only supported on - s390). - Add support for PASCAL and REGISTER calling conventions on x86 - Windows/Linux. - Add OpenRISC and Cygwin-64 support. - Bug fixes. - - 3.1 May-19-14 - Add AArch64 (ARM64) iOS support. - Add Nios II support. - Add m88k and DEC VAX support. - Add support for stdcall, thiscall, and fastcall on non-Windows - 32-bit x86 targets such as Linux. - Various Android, MIPS N32, x86, FreeBSD and UltraSPARC IIi - fixes. - Make the testsuite more robust: eliminate several spurious - failures, and respect the $CC and $CXX environment variables. - Archive off the manually maintained ChangeLog in favor of git - log. - - 3.0.13 Mar-17-13 - Add Meta support. - Add missing Moxie bits. - Fix stack alignment bug on 32-bit x86. - Build fix for m68000 targets. - Build fix for soft-float Power targets. - Fix the install dir location for some platforms when building - with GCC (OS X, Solaris). - Fix Cygwin regression. - - 3.0.12 Feb-11-13 - Add Moxie support. - Add AArch64 support. - Add Blackfin support. - Add TILE-Gx/TILEPro support. - Add MicroBlaze support. - Add Xtensa support. - Add support for PaX enabled kernels with MPROTECT. - Add support for native vendor compilers on - Solaris and AIX. - Work around LLVM/GCC interoperability issue on x86_64. - - 3.0.11 Apr-11-12 - Lots of build fixes. - Add support for variadic functions (ffi_prep_cif_var). - Add Linux/x32 support. - Add thiscall, fastcall and MSVC cdecl support on Windows. - Add Amiga and newer MacOS support. - Add m68k FreeMiNT support. - Integration with iOS' xcode build tools. - Fix Octeon and MC68881 support. - Fix code pessimizations. - - 3.0.10 Aug-23-11 - Add support for Apple's iOS. - Add support for ARM VFP ABI. - Add RTEMS support for MIPS and M68K. - Fix instruction cache clearing problems on - ARM and SPARC. - Fix the N64 build on mips-sgi-irix6.5. - Enable builds with Microsoft's compiler. - Enable x86 builds with Oracle's Solaris compiler. - Fix support for calling code compiled with Oracle's Sparc - Solaris compiler. - Testsuite fixes for Tru64 Unix. - Additional platform support. - - 3.0.9 Dec-31-09 - Add AVR32 and win64 ports. Add ARM softfp support. - Many fixes for AIX, Solaris, HP-UX, *BSD. - Several PowerPC and x86-64 bug fixes. - Build DLL for windows. - - 3.0.8 Dec-19-08 - Add *BSD, BeOS, and PA-Linux support. - - 3.0.7 Nov-11-08 - Fix for ppc FreeBSD. - (thanks to Andreas Tobler) - - 3.0.6 Jul-17-08 - Fix for closures on sh. - Mark the sh/sh64 stack as non-executable. - (both thanks to Kaz Kojima) - - 3.0.5 Apr-3-08 - Fix libffi.pc file. - Fix #define ARM for IcedTea users. - Fix x86 closure bug. - - 3.0.4 Feb-24-08 - Fix x86 OpenBSD configury. - - 3.0.3 Feb-22-08 - Enable x86 OpenBSD thanks to Thomas Heller, and - x86-64 FreeBSD thanks to Björn König and Andreas Tobler. - Clean up test instruction in README. - - 3.0.2 Feb-21-08 - Improved x86 FreeBSD support. - Thanks to Björn König. - - 3.0.1 Feb-15-08 - Fix instruction cache flushing bug on MIPS. - Thanks to David Daney. - - 3.0.0 Feb-15-08 - Many changes, mostly thanks to the GCC project. - Cygnus Solutions is now Red Hat. - - [10 years go by...] - - 1.20 Oct-5-98 - Raffaele Sena produces ARM port. - - 1.19 Oct-5-98 - Fixed x86 long double and long long return support. - m68k bug fixes from Andreas Schwab. - Patch for DU assembler compatibility for the Alpha from Richard - Henderson. - - 1.18 Apr-17-98 - Bug fixes and MIPS configuration changes. - - 1.17 Feb-24-98 - Bug fixes and m68k port from Andreas Schwab. PowerPC port from - Geoffrey Keating. Various bug x86, Sparc and MIPS bug fixes. - - 1.16 Feb-11-98 - Richard Henderson produces Alpha port. - - 1.15 Dec-4-97 - Fixed an n32 ABI bug. New libtool, auto* support. - - 1.14 May-13-97 - libtool is now used to generate shared and static libraries. - Fixed a minor portability problem reported by Russ McManus - . - - 1.13 Dec-2-96 - Added --enable-purify-safety to keep Purify from complaining - about certain low level code. - Sparc fix for calling functions with < 6 args. - Linux x86 a.out fix. - - 1.12 Nov-22-96 - Added missing ffi_type_void, needed for supporting void return - types. Fixed test case for non MIPS machines. Cygnus Support - is now Cygnus Solutions. - - 1.11 Oct-30-96 - Added notes about GNU make. - - 1.10 Oct-29-96 - Added configuration fix for non GNU compilers. - - 1.09 Oct-29-96 - Added --enable-debug configure switch. Clean-ups based on LCLint - feedback. ffi_mips.h is always installed. Many configuration - fixes. Fixed ffitest.c for sparc builds. - - 1.08 Oct-15-96 - Fixed n32 problem. Many clean-ups. - - 1.07 Oct-14-96 - Gordon Irlam rewrites v8.S again. Bug fixes. - - 1.06 Oct-14-96 - Gordon Irlam improved the sparc port. - - 1.05 Oct-14-96 - Interface changes based on feedback. - - 1.04 Oct-11-96 - Sparc port complete (modulo struct passing bug). - - 1.03 Oct-10-96 - Passing struct args, and returning struct values works for - all architectures/calling conventions. Expanded tests. - - 1.02 Oct-9-96 - Added SGI n32 support. Fixed bugs in both o32 and Linux support. - Added "make test". - - 1.01 Oct-8-96 - Fixed float passing bug in mips version. Restructured some - of the code. Builds cleanly with SGI tools. - - 1.00 Oct-7-96 - First release. No public announcement. - -Authors & Credits -================= - -libffi was originally written by Anthony Green . - -The developers of the GNU Compiler Collection project have made -innumerable valuable contributions. See the ChangeLog file for -details. - -Some of the ideas behind libffi were inspired by Gianni Mariani's free -gencall library for Silicon Graphics machines. - -The closure mechanism was designed and implemented by Kresten Krab -Thorup. - -Major processor architecture ports were contributed by the following -developers: - - aarch64 Marcus Shawcroft, James Greenhalgh - alpha Richard Henderson - arc Hackers at Synopsis - arm Raffaele Sena - avr32 Bradley Smith - blackfin Alexandre Keunecke I. de Mendonca - cris Simon Posnjak, Hans-Peter Nilsson - csky Ma Jun, Zhang Wenmeng - frv Anthony Green - ia64 Hans Boehm - m32r Kazuhiro Inaoka - m68k Andreas Schwab - m88k Miod Vallat - metag Hackers at Imagination Technologies - microblaze Nathan Rossi - mips Anthony Green, Casey Marshall - mips64 David Daney - moxie Anthony Green - nios ii Sandra Loosemore - openrisc Sebastian Macke - pa Randolph Chung, Dave Anglin, Andreas Tobler - powerpc Geoffrey Keating, Andreas Tobler, - David Edelsohn, John Hornkvist - powerpc64 Jakub Jelinek - riscv Michael Knyszek, Andrew Waterman, Stef O'Rear - s390 Gerhard Tonn, Ulrich Weigand - sh Kaz Kojima - sh64 Kaz Kojima - sparc Anthony Green, Gordon Irlam - tile-gx/tilepro Walter Lee - vax Miod Vallat - x86 Anthony Green, Jon Beniston - x86-64 Bo Thorsen - xtensa Chris Zankel - -Jesper Skov and Andrew Haley both did more than their fair share of -stepping through the code and tracking down bugs. - -Thanks also to Tom Tromey for bug fixes, documentation and -configuration help. - -Thanks to Jim Blandy, who provided some useful feedback on the libffi -interface. - -Andreas Tobler has done a tremendous amount of work on the testsuite. - -Alex Oliva solved the executable page problem for SElinux. - -The list above is almost certainly incomplete and inaccurate. I'm -happy to make corrections or additions upon request. - -If you have a problem, or have found a bug, please send a note to the -author at green@moxielogic.com, or the project mailing list at -libffi-discuss@sourceware.org. diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/acinclude.m4 b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/acinclude.m4 deleted file mode 100644 index 1a70efb..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/acinclude.m4 +++ /dev/null @@ -1,479 +0,0 @@ -# mmap(2) blacklisting. Some platforms provide the mmap library routine -# but don't support all of the features we need from it. -AC_DEFUN([AC_FUNC_MMAP_BLACKLIST], -[ -AC_CHECK_HEADER([sys/mman.h], - [libffi_header_sys_mman_h=yes], [libffi_header_sys_mman_h=no]) -AC_CHECK_FUNC([mmap], [libffi_func_mmap=yes], [libffi_func_mmap=no]) -if test "$libffi_header_sys_mman_h" != yes \ - || test "$libffi_func_mmap" != yes; then - ac_cv_func_mmap_file=no - ac_cv_func_mmap_dev_zero=no - ac_cv_func_mmap_anon=no -else - AC_CACHE_CHECK([whether read-only mmap of a plain file works], - ac_cv_func_mmap_file, - [# Add a system to this blacklist if - # mmap(0, stat_size, PROT_READ, MAP_PRIVATE, fd, 0) doesn't return a - # memory area containing the same data that you'd get if you applied - # read() to the same fd. The only system known to have a problem here - # is VMS, where text files have record structure. - case "$host_os" in - vms* | ultrix*) - ac_cv_func_mmap_file=no ;; - *) - ac_cv_func_mmap_file=yes;; - esac]) - AC_CACHE_CHECK([whether mmap from /dev/zero works], - ac_cv_func_mmap_dev_zero, - [# Add a system to this blacklist if it has mmap() but /dev/zero - # does not exist, or if mmapping /dev/zero does not give anonymous - # zeroed pages with both the following properties: - # 1. If you map N consecutive pages in with one call, and then - # unmap any subset of those pages, the pages that were not - # explicitly unmapped remain accessible. - # 2. If you map two adjacent blocks of memory and then unmap them - # both at once, they must both go away. - # Systems known to be in this category are Windows (all variants), - # VMS, and Darwin. - case "$host_os" in - vms* | cygwin* | pe | mingw* | darwin* | ultrix* | hpux10* | hpux11.00) - ac_cv_func_mmap_dev_zero=no ;; - *) - ac_cv_func_mmap_dev_zero=yes;; - esac]) - - # Unlike /dev/zero, the MAP_ANON(YMOUS) defines can be probed for. - AC_CACHE_CHECK([for MAP_ANON(YMOUS)], ac_cv_decl_map_anon, - [AC_TRY_COMPILE( -[#include -#include -#include - -#ifndef MAP_ANONYMOUS -#define MAP_ANONYMOUS MAP_ANON -#endif -], -[int n = MAP_ANONYMOUS;], - ac_cv_decl_map_anon=yes, - ac_cv_decl_map_anon=no)]) - - if test $ac_cv_decl_map_anon = no; then - ac_cv_func_mmap_anon=no - else - AC_CACHE_CHECK([whether mmap with MAP_ANON(YMOUS) works], - ac_cv_func_mmap_anon, - [# Add a system to this blacklist if it has mmap() and MAP_ANON or - # MAP_ANONYMOUS, but using mmap(..., MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) - # doesn't give anonymous zeroed pages with the same properties listed - # above for use of /dev/zero. - # Systems known to be in this category are Windows, VMS, and SCO Unix. - case "$host_os" in - vms* | cygwin* | pe | mingw* | sco* | udk* ) - ac_cv_func_mmap_anon=no ;; - *) - ac_cv_func_mmap_anon=yes;; - esac]) - fi -fi - -if test $ac_cv_func_mmap_file = yes; then - AC_DEFINE(HAVE_MMAP_FILE, 1, - [Define if read-only mmap of a plain file works.]) -fi -if test $ac_cv_func_mmap_dev_zero = yes; then - AC_DEFINE(HAVE_MMAP_DEV_ZERO, 1, - [Define if mmap of /dev/zero works.]) -fi -if test $ac_cv_func_mmap_anon = yes; then - AC_DEFINE(HAVE_MMAP_ANON, 1, - [Define if mmap with MAP_ANON(YMOUS) works.]) -fi -]) - -dnl ---------------------------------------------------------------------- -dnl This whole bit snagged from libstdc++-v3, via libatomic. - -dnl -dnl LIBFFI_ENABLE -dnl (FEATURE, DEFAULT, HELP-ARG, HELP-STRING) -dnl (FEATURE, DEFAULT, HELP-ARG, HELP-STRING, permit a|b|c) -dnl (FEATURE, DEFAULT, HELP-ARG, HELP-STRING, SHELL-CODE-HANDLER) -dnl -dnl See docs/html/17_intro/configury.html#enable for documentation. -dnl -m4_define([LIBFFI_ENABLE],[dnl -m4_define([_g_switch],[--enable-$1])dnl -m4_define([_g_help],[AC_HELP_STRING(_g_switch$3,[$4 @<:@default=$2@:>@])])dnl - AC_ARG_ENABLE($1,_g_help, - m4_bmatch([$5], - [^permit ], - [[ - case "$enableval" in - m4_bpatsubst([$5],[permit ])) ;; - *) AC_MSG_ERROR(Unknown argument to enable/disable $1) ;; - dnl Idea for future: generate a URL pointing to - dnl "onlinedocs/configopts.html#whatever" - esac - ]], - [^$], - [[ - case "$enableval" in - yes|no) ;; - *) AC_MSG_ERROR(Argument to enable/disable $1 must be yes or no) ;; - esac - ]], - [[$5]]), - [enable_]m4_bpatsubst([$1],-,_)[=][$2]) -m4_undefine([_g_switch])dnl -m4_undefine([_g_help])dnl -]) - -dnl -dnl If GNU ld is in use, check to see if tricky linker opts can be used. If -dnl the native linker is in use, all variables will be defined to something -dnl safe (like an empty string). -dnl -dnl Defines: -dnl SECTION_LDFLAGS='-Wl,--gc-sections' if possible -dnl OPT_LDFLAGS='-Wl,-O1' if possible -dnl LD (as a side effect of testing) -dnl Sets: -dnl with_gnu_ld -dnl libat_ld_is_gold (possibly) -dnl libat_gnu_ld_version (possibly) -dnl -dnl The last will be a single integer, e.g., version 1.23.45.0.67.89 will -dnl set libat_gnu_ld_version to 12345. Zeros cause problems. -dnl -AC_DEFUN([LIBFFI_CHECK_LINKER_FEATURES], [ - # If we're not using GNU ld, then there's no point in even trying these - # tests. Check for that first. We should have already tested for gld - # by now (in libtool), but require it now just to be safe... - test -z "$SECTION_LDFLAGS" && SECTION_LDFLAGS='' - test -z "$OPT_LDFLAGS" && OPT_LDFLAGS='' - AC_REQUIRE([AC_PROG_LD]) - AC_REQUIRE([AC_PROG_AWK]) - - # The name set by libtool depends on the version of libtool. Shame on us - # for depending on an impl detail, but c'est la vie. Older versions used - # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on - # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually - # makes sense). We'll test with_gnu_ld everywhere else, so if that isn't - # set (hence we're using an older libtool), then set it. - if test x${with_gnu_ld+set} != xset; then - if test x${ac_cv_prog_gnu_ld+set} != xset; then - # We got through "ac_require(ac_prog_ld)" and still not set? Huh? - with_gnu_ld=no - else - with_gnu_ld=$ac_cv_prog_gnu_ld - fi - fi - - # Start by getting the version number. I think the libtool test already - # does some of this, but throws away the result. - libat_ld_is_gold=no - if $LD --version 2>/dev/null | grep 'GNU gold'> /dev/null 2>&1; then - libat_ld_is_gold=yes - fi - changequote(,) - ldver=`$LD --version 2>/dev/null | - sed -e 's/GNU gold /GNU ld /;s/GNU ld version /GNU ld /;s/GNU ld ([^)]*) /GNU ld /;s/GNU ld \([0-9.][0-9.]*\).*/\1/; q'` - changequote([,]) - libat_gnu_ld_version=`echo $ldver | \ - $AWK -F. '{ if (NF<3) [$]3=0; print ([$]1*100+[$]2)*100+[$]3 }'` - - # Set --gc-sections. - if test "$with_gnu_ld" = "notbroken"; then - # GNU ld it is! Joy and bunny rabbits! - - # All these tests are for C++; save the language and the compiler flags. - # Need to do this so that g++ won't try to link in libstdc++ - ac_test_CFLAGS="${CFLAGS+set}" - ac_save_CFLAGS="$CFLAGS" - CFLAGS='-x c++ -Wl,--gc-sections' - - # Check for -Wl,--gc-sections - # XXX This test is broken at the moment, as symbols required for linking - # are now in libsupc++ (not built yet). In addition, this test has - # cored on solaris in the past. In addition, --gc-sections doesn't - # really work at the moment (keeps on discarding used sections, first - # .eh_frame and now some of the glibc sections for iconv). - # Bzzzzt. Thanks for playing, maybe next time. - AC_MSG_CHECKING([for ld that supports -Wl,--gc-sections]) - AC_TRY_RUN([ - int main(void) - { - try { throw 1; } - catch (...) { }; - return 0; - } - ], [ac_sectionLDflags=yes],[ac_sectionLDflags=no], [ac_sectionLDflags=yes]) - if test "$ac_test_CFLAGS" = set; then - CFLAGS="$ac_save_CFLAGS" - else - # this is the suspicious part - CFLAGS='' - fi - if test "$ac_sectionLDflags" = "yes"; then - SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS" - fi - AC_MSG_RESULT($ac_sectionLDflags) - fi - - # Set linker optimization flags. - if test x"$with_gnu_ld" = x"yes"; then - OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS" - fi - - AC_SUBST(SECTION_LDFLAGS) - AC_SUBST(OPT_LDFLAGS) -]) - - -dnl -dnl If GNU ld is in use, check to see if tricky linker opts can be used. If -dnl the native linker is in use, all variables will be defined to something -dnl safe (like an empty string). -dnl -dnl Defines: -dnl SECTION_LDFLAGS='-Wl,--gc-sections' if possible -dnl OPT_LDFLAGS='-Wl,-O1' if possible -dnl LD (as a side effect of testing) -dnl Sets: -dnl with_gnu_ld -dnl libat_ld_is_gold (possibly) -dnl libat_gnu_ld_version (possibly) -dnl -dnl The last will be a single integer, e.g., version 1.23.45.0.67.89 will -dnl set libat_gnu_ld_version to 12345. Zeros cause problems. -dnl -AC_DEFUN([LIBFFI_CHECK_LINKER_FEATURES], [ - # If we're not using GNU ld, then there's no point in even trying these - # tests. Check for that first. We should have already tested for gld - # by now (in libtool), but require it now just to be safe... - test -z "$SECTION_LDFLAGS" && SECTION_LDFLAGS='' - test -z "$OPT_LDFLAGS" && OPT_LDFLAGS='' - AC_REQUIRE([AC_PROG_LD]) - AC_REQUIRE([AC_PROG_AWK]) - - # The name set by libtool depends on the version of libtool. Shame on us - # for depending on an impl detail, but c'est la vie. Older versions used - # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on - # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually - # makes sense). We'll test with_gnu_ld everywhere else, so if that isn't - # set (hence we're using an older libtool), then set it. - if test x${with_gnu_ld+set} != xset; then - if test x${ac_cv_prog_gnu_ld+set} != xset; then - # We got through "ac_require(ac_prog_ld)" and still not set? Huh? - with_gnu_ld=no - else - with_gnu_ld=$ac_cv_prog_gnu_ld - fi - fi - - # Start by getting the version number. I think the libtool test already - # does some of this, but throws away the result. - libat_ld_is_gold=no - if $LD --version 2>/dev/null | grep 'GNU gold'> /dev/null 2>&1; then - libat_ld_is_gold=yes - fi - libat_ld_is_lld=no - if $LD --version 2>/dev/null | grep 'LLD '> /dev/null 2>&1; then - libat_ld_is_lld=yes - fi - changequote(,) - ldver=`$LD --version 2>/dev/null | - sed -e 's/GNU gold /GNU ld /;s/GNU ld version /GNU ld /;s/GNU ld ([^)]*) /GNU ld /;s/GNU ld \([0-9.][0-9.]*\).*/\1/; q'` - changequote([,]) - libat_gnu_ld_version=`echo $ldver | \ - $AWK -F. '{ if (NF<3) [$]3=0; print ([$]1*100+[$]2)*100+[$]3 }'` - - # Set --gc-sections. - if test "$with_gnu_ld" = "notbroken"; then - # GNU ld it is! Joy and bunny rabbits! - - # All these tests are for C++; save the language and the compiler flags. - # Need to do this so that g++ won't try to link in libstdc++ - ac_test_CFLAGS="${CFLAGS+set}" - ac_save_CFLAGS="$CFLAGS" - CFLAGS='-x c++ -Wl,--gc-sections' - - # Check for -Wl,--gc-sections - # XXX This test is broken at the moment, as symbols required for linking - # are now in libsupc++ (not built yet). In addition, this test has - # cored on solaris in the past. In addition, --gc-sections doesn't - # really work at the moment (keeps on discarding used sections, first - # .eh_frame and now some of the glibc sections for iconv). - # Bzzzzt. Thanks for playing, maybe next time. - AC_MSG_CHECKING([for ld that supports -Wl,--gc-sections]) - AC_TRY_RUN([ - int main(void) - { - try { throw 1; } - catch (...) { }; - return 0; - } - ], [ac_sectionLDflags=yes],[ac_sectionLDflags=no], [ac_sectionLDflags=yes]) - if test "$ac_test_CFLAGS" = set; then - CFLAGS="$ac_save_CFLAGS" - else - # this is the suspicious part - CFLAGS='' - fi - if test "$ac_sectionLDflags" = "yes"; then - SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS" - fi - AC_MSG_RESULT($ac_sectionLDflags) - fi - - # Set linker optimization flags. - if test x"$with_gnu_ld" = x"yes"; then - OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS" - fi - - AC_SUBST(SECTION_LDFLAGS) - AC_SUBST(OPT_LDFLAGS) -]) - - -dnl -dnl Add version tags to symbols in shared library (or not), additionally -dnl marking other symbols as private/local (or not). -dnl -dnl --enable-symvers=style adds a version script to the linker call when -dnl creating the shared library. The choice of version script is -dnl controlled by 'style'. -dnl --disable-symvers does not. -dnl + Usage: LIBFFI_ENABLE_SYMVERS[(DEFAULT)] -dnl Where DEFAULT is either 'yes' or 'no'. Passing `yes' tries to -dnl choose a default style based on linker characteristics. Passing -dnl 'no' disables versioning. -dnl -AC_DEFUN([LIBFFI_ENABLE_SYMVERS], [ - -LIBFFI_ENABLE(symvers,yes,[=STYLE], - [enables symbol versioning of the shared library], - [permit yes|no|gnu*|sun]) - -# If we never went through the LIBFFI_CHECK_LINKER_FEATURES macro, then we -# don't know enough about $LD to do tricks... -AC_REQUIRE([LIBFFI_CHECK_LINKER_FEATURES]) - -# Turn a 'yes' into a suitable default. -if test x$enable_symvers = xyes ; then - # FIXME The following test is too strict, in theory. - if test $enable_shared = no || test "x$LD" = x; then - enable_symvers=no - else - if test $with_gnu_ld = yes ; then - enable_symvers=gnu - else - case ${target_os} in - # Sun symbol versioning exists since Solaris 2.5. - solaris2.[[5-9]]* | solaris2.1[[0-9]]*) - enable_symvers=sun ;; - *) - enable_symvers=no ;; - esac - fi - fi -fi - -# Check if 'sun' was requested on non-Solaris 2 platforms. -if test x$enable_symvers = xsun ; then - case ${target_os} in - solaris2*) - # All fine. - ;; - *) - # Unlikely to work. - AC_MSG_WARN([=== You have requested Sun symbol versioning, but]) - AC_MSG_WARN([=== you are not targetting Solaris 2.]) - AC_MSG_WARN([=== Symbol versioning will be disabled.]) - enable_symvers=no - ;; - esac -fi - -# Check to see if libgcc_s exists, indicating that shared libgcc is possible. -if test $enable_symvers != no; then - AC_MSG_CHECKING([for shared libgcc]) - ac_save_CFLAGS="$CFLAGS" - CFLAGS=' -lgcc_s' - AC_TRY_LINK(, [return 0;], libat_shared_libgcc=yes, libat_shared_libgcc=no) - CFLAGS="$ac_save_CFLAGS" - if test $libat_shared_libgcc = no; then - cat > conftest.c <&1 >/dev/null \ - | sed -n 's/^.* -lgcc_s\([^ ]*\) .*$/\1/p'` -changequote([,])dnl - rm -f conftest.c conftest.so - if test x${libat_libgcc_s_suffix+set} = xset; then - CFLAGS=" -lgcc_s$libat_libgcc_s_suffix" - AC_TRY_LINK(, [return 0;], libat_shared_libgcc=yes) - CFLAGS="$ac_save_CFLAGS" - fi - fi - AC_MSG_RESULT($libat_shared_libgcc) -fi - -# For GNU ld, we need at least this version. The format is described in -# LIBFFI_CHECK_LINKER_FEATURES above. -libat_min_gnu_ld_version=21400 -# XXXXXXXXXXX libat_gnu_ld_version=21390 - -# Check to see if unspecified "yes" value can win, given results above. -# Change "yes" into either "no" or a style name. -if test $enable_symvers != no && test $libat_shared_libgcc = yes; then - if test $with_gnu_ld = yes; then - if test $libat_gnu_ld_version -ge $libat_min_gnu_ld_version ; then - enable_symvers=gnu - elif test $libat_ld_is_gold = yes ; then - enable_symvers=gnu - elif test $libat_ld_is_lld = yes ; then - enable_symvers=gnu - else - # The right tools, the right setup, but too old. Fallbacks? - AC_MSG_WARN(=== Linker version $libat_gnu_ld_version is too old for) - AC_MSG_WARN(=== full symbol versioning support in this release of GCC.) - AC_MSG_WARN(=== You would need to upgrade your binutils to version) - AC_MSG_WARN(=== $libat_min_gnu_ld_version or later and rebuild GCC.) - if test $libat_gnu_ld_version -ge 21200 ; then - # Globbing fix is present, proper block support is not. - dnl AC_MSG_WARN([=== Dude, you are soooo close. Maybe we can fake it.]) - dnl enable_symvers=??? - AC_MSG_WARN([=== Symbol versioning will be disabled.]) - enable_symvers=no - else - # 2.11 or older. - AC_MSG_WARN([=== Symbol versioning will be disabled.]) - enable_symvers=no - fi - fi - elif test $enable_symvers = sun; then - : All interesting versions of Sun ld support sun style symbol versioning. - else - # just fail for now - AC_MSG_WARN([=== You have requested some kind of symbol versioning, but]) - AC_MSG_WARN([=== either you are not using a supported linker, or you are]) - AC_MSG_WARN([=== not building a shared libgcc_s (which is required).]) - AC_MSG_WARN([=== Symbol versioning will be disabled.]) - enable_symvers=no - fi -fi -if test $enable_symvers = gnu; then - AC_DEFINE(LIBFFI_GNU_SYMBOL_VERSIONING, 1, - [Define to 1 if GNU symbol versioning is used for libatomic.]) -fi - -AM_CONDITIONAL(LIBFFI_BUILD_VERSIONED_SHLIB, test $enable_symvers != no) -AM_CONDITIONAL(LIBFFI_BUILD_VERSIONED_SHLIB_GNU, test $enable_symvers = gnu) -AM_CONDITIONAL(LIBFFI_BUILD_VERSIONED_SHLIB_SUN, test $enable_symvers = sun) -AC_MSG_NOTICE(versioning on shared library symbols is $enable_symvers) -]) diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/autogen.sh b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/autogen.sh deleted file mode 100755 index fb014a3..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/autogen.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -exec autoreconf -v -i diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/config.guess b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/config.guess deleted file mode 100644 index e94095c..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/config.guess +++ /dev/null @@ -1,1687 +0,0 @@ -#! /bin/sh -# Attempt to guess a canonical system name. -# Copyright 1992-2020 Free Software Foundation, Inc. - -timestamp='2020-07-12' - -# This file is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, see . -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that -# program. This Exception is an additional permission under section 7 -# of the GNU General Public License, version 3 ("GPLv3"). -# -# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. -# -# You can get the latest version of this script from: -# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess -# -# Please send patches to . - - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] - -Output the configuration name of the system \`$me' is run on. - -Options: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to ." - -version="\ -GNU config.guess ($timestamp) - -Originally written by Per Bothner. -Copyright 1992-2020 Free Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try \`$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit ;; - --version | -v ) - echo "$version" ; exit ;; - --help | --h* | -h ) - echo "$usage"; exit ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" >&2 - exit 1 ;; - * ) - break ;; - esac -done - -if test $# != 0; then - echo "$me: too many arguments$help" >&2 - exit 1 -fi - -# CC_FOR_BUILD -- compiler used by this script. Note that the use of a -# compiler to aid in system detection is discouraged as it requires -# temporary files to be created and, as you can see below, it is a -# headache to deal with in a portable fashion. - -# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still -# use `HOST_CC' if defined, but it is deprecated. - -# Portable tmp directory creation inspired by the Autoconf team. - -tmp= -# shellcheck disable=SC2172 -trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15 - -set_cc_for_build() { - # prevent multiple calls if $tmp is already set - test "$tmp" && return 0 - : "${TMPDIR=/tmp}" - # shellcheck disable=SC2039 - { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || - { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || - { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || - { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } - dummy=$tmp/dummy - case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in - ,,) echo "int x;" > "$dummy.c" - for driver in cc gcc c89 c99 ; do - if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then - CC_FOR_BUILD="$driver" - break - fi - done - if test x"$CC_FOR_BUILD" = x ; then - CC_FOR_BUILD=no_compiler_found - fi - ;; - ,,*) CC_FOR_BUILD=$CC ;; - ,*,*) CC_FOR_BUILD=$HOST_CC ;; - esac -} - -# This is needed to find uname on a Pyramid OSx when run in the BSD universe. -# (ghazi@noc.rutgers.edu 1994-08-24) -if test -f /.attbin/uname ; then - PATH=$PATH:/.attbin ; export PATH -fi - -UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown -UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown -UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown -UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown - -case "$UNAME_SYSTEM" in -Linux|GNU|GNU/*) - # If the system lacks a compiler, then just pick glibc. - # We could probably try harder. - LIBC=gnu - - set_cc_for_build - cat <<-EOF > "$dummy.c" - #include - #if defined(__UCLIBC__) - LIBC=uclibc - #elif defined(__dietlibc__) - LIBC=dietlibc - #else - LIBC=gnu - #endif - EOF - eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`" - - # If ldd exists, use it to detect musl libc. - if command -v ldd >/dev/null && \ - ldd --version 2>&1 | grep -q ^musl - then - LIBC=musl - fi - ;; -esac - -# Note: order is significant - the case branches are not exclusive. - -case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in - *:NetBSD:*:*) - # NetBSD (nbsd) targets should (where applicable) match one or - # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, - # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently - # switched to ELF, *-*-netbsd* would select the old - # object file format. This provides both forward - # compatibility and a consistent mechanism for selecting the - # object file format. - # - # Note: NetBSD doesn't particularly care about the vendor - # portion of the name. We always set it to "unknown". - sysctl="sysctl -n hw.machine_arch" - UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ - "/sbin/$sysctl" 2>/dev/null || \ - "/usr/sbin/$sysctl" 2>/dev/null || \ - echo unknown)` - case "$UNAME_MACHINE_ARCH" in - armeb) machine=armeb-unknown ;; - arm*) machine=arm-unknown ;; - sh3el) machine=shl-unknown ;; - sh3eb) machine=sh-unknown ;; - sh5el) machine=sh5le-unknown ;; - earmv*) - arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` - endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` - machine="${arch}${endian}"-unknown - ;; - *) machine="$UNAME_MACHINE_ARCH"-unknown ;; - esac - # The Operating System including object format, if it has switched - # to ELF recently (or will in the future) and ABI. - case "$UNAME_MACHINE_ARCH" in - earm*) - os=netbsdelf - ;; - arm*|i386|m68k|ns32k|sh3*|sparc|vax) - set_cc_for_build - if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ELF__ - then - # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). - # Return netbsd for either. FIX? - os=netbsd - else - os=netbsdelf - fi - ;; - *) - os=netbsd - ;; - esac - # Determine ABI tags. - case "$UNAME_MACHINE_ARCH" in - earm*) - expr='s/^earmv[0-9]/-eabi/;s/eb$//' - abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` - ;; - esac - # The OS release - # Debian GNU/NetBSD machines have a different userland, and - # thus, need a distinct triplet. However, they do not need - # kernel version information, so it can be replaced with a - # suitable tag, in the style of linux-gnu. - case "$UNAME_VERSION" in - Debian*) - release='-gnu' - ;; - *) - release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` - ;; - esac - # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: - # contains redundant information, the shorter form: - # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. - echo "$machine-${os}${release}${abi-}" - exit ;; - *:Bitrig:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` - echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" - exit ;; - *:OpenBSD:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` - echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" - exit ;; - *:LibertyBSD:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` - echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" - exit ;; - *:MidnightBSD:*:*) - echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE" - exit ;; - *:ekkoBSD:*:*) - echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE" - exit ;; - *:SolidBSD:*:*) - echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE" - exit ;; - *:OS108:*:*) - echo "$UNAME_MACHINE"-unknown-os108_"$UNAME_RELEASE" - exit ;; - macppc:MirBSD:*:*) - echo powerpc-unknown-mirbsd"$UNAME_RELEASE" - exit ;; - *:MirBSD:*:*) - echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE" - exit ;; - *:Sortix:*:*) - echo "$UNAME_MACHINE"-unknown-sortix - exit ;; - *:Twizzler:*:*) - echo "$UNAME_MACHINE"-unknown-twizzler - exit ;; - *:Redox:*:*) - echo "$UNAME_MACHINE"-unknown-redox - exit ;; - mips:OSF1:*.*) - echo mips-dec-osf1 - exit ;; - alpha:OSF1:*:*) - case $UNAME_RELEASE in - *4.0) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` - ;; - *5.*) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` - ;; - esac - # According to Compaq, /usr/sbin/psrinfo has been available on - # OSF/1 and Tru64 systems produced since 1995. I hope that - # covers most systems running today. This code pipes the CPU - # types through head -n 1, so we only detect the type of CPU 0. - ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` - case "$ALPHA_CPU_TYPE" in - "EV4 (21064)") - UNAME_MACHINE=alpha ;; - "EV4.5 (21064)") - UNAME_MACHINE=alpha ;; - "LCA4 (21066/21068)") - UNAME_MACHINE=alpha ;; - "EV5 (21164)") - UNAME_MACHINE=alphaev5 ;; - "EV5.6 (21164A)") - UNAME_MACHINE=alphaev56 ;; - "EV5.6 (21164PC)") - UNAME_MACHINE=alphapca56 ;; - "EV5.7 (21164PC)") - UNAME_MACHINE=alphapca57 ;; - "EV6 (21264)") - UNAME_MACHINE=alphaev6 ;; - "EV6.7 (21264A)") - UNAME_MACHINE=alphaev67 ;; - "EV6.8CB (21264C)") - UNAME_MACHINE=alphaev68 ;; - "EV6.8AL (21264B)") - UNAME_MACHINE=alphaev68 ;; - "EV6.8CX (21264D)") - UNAME_MACHINE=alphaev68 ;; - "EV6.9A (21264/EV69A)") - UNAME_MACHINE=alphaev69 ;; - "EV7 (21364)") - UNAME_MACHINE=alphaev7 ;; - "EV7.9 (21364A)") - UNAME_MACHINE=alphaev79 ;; - esac - # A Pn.n version is a patched version. - # A Vn.n version is a released version. - # A Tn.n version is a released field test version. - # A Xn.n version is an unreleased experimental baselevel. - # 1.2 uses "1.2" for uname -r. - echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`" - # Reset EXIT trap before exiting to avoid spurious non-zero exit code. - exitcode=$? - trap '' 0 - exit $exitcode ;; - Amiga*:UNIX_System_V:4.0:*) - echo m68k-unknown-sysv4 - exit ;; - *:[Aa]miga[Oo][Ss]:*:*) - echo "$UNAME_MACHINE"-unknown-amigaos - exit ;; - *:[Mm]orph[Oo][Ss]:*:*) - echo "$UNAME_MACHINE"-unknown-morphos - exit ;; - *:OS/390:*:*) - echo i370-ibm-openedition - exit ;; - *:z/VM:*:*) - echo s390-ibm-zvmoe - exit ;; - *:OS400:*:*) - echo powerpc-ibm-os400 - exit ;; - arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) - echo arm-acorn-riscix"$UNAME_RELEASE" - exit ;; - arm*:riscos:*:*|arm*:RISCOS:*:*) - echo arm-unknown-riscos - exit ;; - SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) - echo hppa1.1-hitachi-hiuxmpp - exit ;; - Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) - # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. - if test "`(/bin/universe) 2>/dev/null`" = att ; then - echo pyramid-pyramid-sysv3 - else - echo pyramid-pyramid-bsd - fi - exit ;; - NILE*:*:*:dcosx) - echo pyramid-pyramid-svr4 - exit ;; - DRS?6000:unix:4.0:6*) - echo sparc-icl-nx6 - exit ;; - DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) - case `/usr/bin/uname -p` in - sparc) echo sparc-icl-nx7; exit ;; - esac ;; - s390x:SunOS:*:*) - echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" - exit ;; - sun4H:SunOS:5.*:*) - echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" - exit ;; - sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) - echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" - exit ;; - i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) - echo i386-pc-auroraux"$UNAME_RELEASE" - exit ;; - i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) - set_cc_for_build - SUN_ARCH=i386 - # If there is a compiler, see if it is configured for 64-bit objects. - # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. - # This test works for both compilers. - if [ "$CC_FOR_BUILD" != no_compiler_found ]; then - if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - SUN_ARCH=x86_64 - fi - fi - echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" - exit ;; - sun4*:SunOS:6*:*) - # According to config.sub, this is the proper way to canonicalize - # SunOS6. Hard to guess exactly what SunOS6 will be like, but - # it's likely to be more like Solaris than SunOS4. - echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" - exit ;; - sun4*:SunOS:*:*) - case "`/usr/bin/arch -k`" in - Series*|S4*) - UNAME_RELEASE=`uname -v` - ;; - esac - # Japanese Language versions have a version number like `4.1.3-JL'. - echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`" - exit ;; - sun3*:SunOS:*:*) - echo m68k-sun-sunos"$UNAME_RELEASE" - exit ;; - sun*:*:4.2BSD:*) - UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` - test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 - case "`/bin/arch`" in - sun3) - echo m68k-sun-sunos"$UNAME_RELEASE" - ;; - sun4) - echo sparc-sun-sunos"$UNAME_RELEASE" - ;; - esac - exit ;; - aushp:SunOS:*:*) - echo sparc-auspex-sunos"$UNAME_RELEASE" - exit ;; - # The situation for MiNT is a little confusing. The machine name - # can be virtually everything (everything which is not - # "atarist" or "atariste" at least should have a processor - # > m68000). The system name ranges from "MiNT" over "FreeMiNT" - # to the lowercase version "mint" (or "freemint"). Finally - # the system name "TOS" denotes a system which is actually not - # MiNT. But MiNT is downward compatible to TOS, so this should - # be no problem. - atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint"$UNAME_RELEASE" - exit ;; - atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint"$UNAME_RELEASE" - exit ;; - *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) - echo m68k-atari-mint"$UNAME_RELEASE" - exit ;; - milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) - echo m68k-milan-mint"$UNAME_RELEASE" - exit ;; - hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) - echo m68k-hades-mint"$UNAME_RELEASE" - exit ;; - *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) - echo m68k-unknown-mint"$UNAME_RELEASE" - exit ;; - m68k:machten:*:*) - echo m68k-apple-machten"$UNAME_RELEASE" - exit ;; - powerpc:machten:*:*) - echo powerpc-apple-machten"$UNAME_RELEASE" - exit ;; - RISC*:Mach:*:*) - echo mips-dec-mach_bsd4.3 - exit ;; - RISC*:ULTRIX:*:*) - echo mips-dec-ultrix"$UNAME_RELEASE" - exit ;; - VAX*:ULTRIX*:*:*) - echo vax-dec-ultrix"$UNAME_RELEASE" - exit ;; - 2020:CLIX:*:* | 2430:CLIX:*:*) - echo clipper-intergraph-clix"$UNAME_RELEASE" - exit ;; - mips:*:*:UMIPS | mips:*:*:RISCos) - set_cc_for_build - sed 's/^ //' << EOF > "$dummy.c" -#ifdef __cplusplus -#include /* for printf() prototype */ - int main (int argc, char *argv[]) { -#else - int main (argc, argv) int argc; char *argv[]; { -#endif - #if defined (host_mips) && defined (MIPSEB) - #if defined (SYSTYPE_SYSV) - printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_SVR4) - printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) - printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); - #endif - #endif - exit (-1); - } -EOF - $CC_FOR_BUILD -o "$dummy" "$dummy.c" && - dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && - SYSTEM_NAME=`"$dummy" "$dummyarg"` && - { echo "$SYSTEM_NAME"; exit; } - echo mips-mips-riscos"$UNAME_RELEASE" - exit ;; - Motorola:PowerMAX_OS:*:*) - echo powerpc-motorola-powermax - exit ;; - Motorola:*:4.3:PL8-*) - echo powerpc-harris-powermax - exit ;; - Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) - echo powerpc-harris-powermax - exit ;; - Night_Hawk:Power_UNIX:*:*) - echo powerpc-harris-powerunix - exit ;; - m88k:CX/UX:7*:*) - echo m88k-harris-cxux7 - exit ;; - m88k:*:4*:R4*) - echo m88k-motorola-sysv4 - exit ;; - m88k:*:3*:R3*) - echo m88k-motorola-sysv3 - exit ;; - AViiON:dgux:*:*) - # DG/UX returns AViiON for all architectures - UNAME_PROCESSOR=`/usr/bin/uname -p` - if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ] - then - if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \ - [ "$TARGET_BINARY_INTERFACE"x = x ] - then - echo m88k-dg-dgux"$UNAME_RELEASE" - else - echo m88k-dg-dguxbcs"$UNAME_RELEASE" - fi - else - echo i586-dg-dgux"$UNAME_RELEASE" - fi - exit ;; - M88*:DolphinOS:*:*) # DolphinOS (SVR3) - echo m88k-dolphin-sysv3 - exit ;; - M88*:*:R3*:*) - # Delta 88k system running SVR3 - echo m88k-motorola-sysv3 - exit ;; - XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) - echo m88k-tektronix-sysv3 - exit ;; - Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) - echo m68k-tektronix-bsd - exit ;; - *:IRIX*:*:*) - echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`" - exit ;; - ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. - echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id - exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' - i*86:AIX:*:*) - echo i386-ibm-aix - exit ;; - ia64:AIX:*:*) - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` - else - IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" - fi - echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV" - exit ;; - *:AIX:2:3) - if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then - set_cc_for_build - sed 's/^ //' << EOF > "$dummy.c" - #include - - main() - { - if (!__power_pc()) - exit(1); - puts("powerpc-ibm-aix3.2.5"); - exit(0); - } -EOF - if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` - then - echo "$SYSTEM_NAME" - else - echo rs6000-ibm-aix3.2.5 - fi - elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then - echo rs6000-ibm-aix3.2.4 - else - echo rs6000-ibm-aix3.2 - fi - exit ;; - *:AIX:*:[4567]) - IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` - if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then - IBM_ARCH=rs6000 - else - IBM_ARCH=powerpc - fi - if [ -x /usr/bin/lslpp ] ; then - IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | - awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` - else - IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" - fi - echo "$IBM_ARCH"-ibm-aix"$IBM_REV" - exit ;; - *:AIX:*:*) - echo rs6000-ibm-aix - exit ;; - ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) - echo romp-ibm-bsd4.4 - exit ;; - ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and - echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to - exit ;; # report: romp-ibm BSD 4.3 - *:BOSX:*:*) - echo rs6000-bull-bosx - exit ;; - DPX/2?00:B.O.S.:*:*) - echo m68k-bull-sysv3 - exit ;; - 9000/[34]??:4.3bsd:1.*:*) - echo m68k-hp-bsd - exit ;; - hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) - echo m68k-hp-bsd4.4 - exit ;; - 9000/[34678]??:HP-UX:*:*) - HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` - case "$UNAME_MACHINE" in - 9000/31?) HP_ARCH=m68000 ;; - 9000/[34]??) HP_ARCH=m68k ;; - 9000/[678][0-9][0-9]) - if [ -x /usr/bin/getconf ]; then - sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` - sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` - case "$sc_cpu_version" in - 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 - 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 - 532) # CPU_PA_RISC2_0 - case "$sc_kernel_bits" in - 32) HP_ARCH=hppa2.0n ;; - 64) HP_ARCH=hppa2.0w ;; - '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 - esac ;; - esac - fi - if [ "$HP_ARCH" = "" ]; then - set_cc_for_build - sed 's/^ //' << EOF > "$dummy.c" - - #define _HPUX_SOURCE - #include - #include - - int main () - { - #if defined(_SC_KERNEL_BITS) - long bits = sysconf(_SC_KERNEL_BITS); - #endif - long cpu = sysconf (_SC_CPU_VERSION); - - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1"); break; - case CPU_PA_RISC2_0: - #if defined(_SC_KERNEL_BITS) - switch (bits) - { - case 64: puts ("hppa2.0w"); break; - case 32: puts ("hppa2.0n"); break; - default: puts ("hppa2.0"); break; - } break; - #else /* !defined(_SC_KERNEL_BITS) */ - puts ("hppa2.0"); break; - #endif - default: puts ("hppa1.0"); break; - } - exit (0); - } -EOF - (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` - test -z "$HP_ARCH" && HP_ARCH=hppa - fi ;; - esac - if [ "$HP_ARCH" = hppa2.0w ] - then - set_cc_for_build - - # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating - # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler - # generating 64-bit code. GNU and HP use different nomenclature: - # - # $ CC_FOR_BUILD=cc ./config.guess - # => hppa2.0w-hp-hpux11.23 - # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess - # => hppa64-hp-hpux11.23 - - if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | - grep -q __LP64__ - then - HP_ARCH=hppa2.0w - else - HP_ARCH=hppa64 - fi - fi - echo "$HP_ARCH"-hp-hpux"$HPUX_REV" - exit ;; - ia64:HP-UX:*:*) - HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` - echo ia64-hp-hpux"$HPUX_REV" - exit ;; - 3050*:HI-UX:*:*) - set_cc_for_build - sed 's/^ //' << EOF > "$dummy.c" - #include - int - main () - { - long cpu = sysconf (_SC_CPU_VERSION); - /* The order matters, because CPU_IS_HP_MC68K erroneously returns - true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct - results, however. */ - if (CPU_IS_PA_RISC (cpu)) - { - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; - case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; - default: puts ("hppa-hitachi-hiuxwe2"); break; - } - } - else if (CPU_IS_HP_MC68K (cpu)) - puts ("m68k-hitachi-hiuxwe2"); - else puts ("unknown-hitachi-hiuxwe2"); - exit (0); - } -EOF - $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && - { echo "$SYSTEM_NAME"; exit; } - echo unknown-hitachi-hiuxwe2 - exit ;; - 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) - echo hppa1.1-hp-bsd - exit ;; - 9000/8??:4.3bsd:*:*) - echo hppa1.0-hp-bsd - exit ;; - *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) - echo hppa1.0-hp-mpeix - exit ;; - hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) - echo hppa1.1-hp-osf - exit ;; - hp8??:OSF1:*:*) - echo hppa1.0-hp-osf - exit ;; - i*86:OSF1:*:*) - if [ -x /usr/sbin/sysversion ] ; then - echo "$UNAME_MACHINE"-unknown-osf1mk - else - echo "$UNAME_MACHINE"-unknown-osf1 - fi - exit ;; - parisc*:Lites*:*:*) - echo hppa1.1-hp-lites - exit ;; - C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) - echo c1-convex-bsd - exit ;; - C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) - echo c34-convex-bsd - exit ;; - C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) - echo c38-convex-bsd - exit ;; - C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) - echo c4-convex-bsd - exit ;; - CRAY*Y-MP:*:*:*) - echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*[A-Z]90:*:*:*) - echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ - | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ - -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ - -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*TS:*:*:*) - echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*T3E:*:*:*) - echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*SV1:*:*:*) - echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' - exit ;; - *:UNICOS/mp:*:*) - echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' - exit ;; - F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) - FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` - FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` - FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` - echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; - 5000:UNIX_System_V:4.*:*) - FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` - FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` - echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; - i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) - echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE" - exit ;; - sparc*:BSD/OS:*:*) - echo sparc-unknown-bsdi"$UNAME_RELEASE" - exit ;; - *:BSD/OS:*:*) - echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE" - exit ;; - arm:FreeBSD:*:*) - UNAME_PROCESSOR=`uname -p` - set_cc_for_build - if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ARM_PCS_VFP - then - echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabi - else - echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabihf - fi - exit ;; - *:FreeBSD:*:*) - UNAME_PROCESSOR=`/usr/bin/uname -p` - case "$UNAME_PROCESSOR" in - amd64) - UNAME_PROCESSOR=x86_64 ;; - i386) - UNAME_PROCESSOR=i586 ;; - esac - echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" - exit ;; - i*:CYGWIN*:*) - echo "$UNAME_MACHINE"-pc-cygwin - exit ;; - *:MINGW64*:*) - echo "$UNAME_MACHINE"-pc-mingw64 - exit ;; - *:MINGW*:*) - echo "$UNAME_MACHINE"-pc-mingw32 - exit ;; - *:MSYS*:*) - echo "$UNAME_MACHINE"-pc-msys - exit ;; - i*:PW*:*) - echo "$UNAME_MACHINE"-pc-pw32 - exit ;; - *:Interix*:*) - case "$UNAME_MACHINE" in - x86) - echo i586-pc-interix"$UNAME_RELEASE" - exit ;; - authenticamd | genuineintel | EM64T) - echo x86_64-unknown-interix"$UNAME_RELEASE" - exit ;; - IA64) - echo ia64-unknown-interix"$UNAME_RELEASE" - exit ;; - esac ;; - i*:UWIN*:*) - echo "$UNAME_MACHINE"-pc-uwin - exit ;; - amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) - echo x86_64-pc-cygwin - exit ;; - prep*:SunOS:5.*:*) - echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" - exit ;; - *:GNU:*:*) - # the GNU system - echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`" - exit ;; - *:GNU/*:*:*) - # other systems with GNU libc and userland - echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC" - exit ;; - *:Minix:*:*) - echo "$UNAME_MACHINE"-unknown-minix - exit ;; - aarch64:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - aarch64_be:Linux:*:*) - UNAME_MACHINE=aarch64_be - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - alpha:Linux:*:*) - case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in - EV5) UNAME_MACHINE=alphaev5 ;; - EV56) UNAME_MACHINE=alphaev56 ;; - PCA56) UNAME_MACHINE=alphapca56 ;; - PCA57) UNAME_MACHINE=alphapca56 ;; - EV6) UNAME_MACHINE=alphaev6 ;; - EV67) UNAME_MACHINE=alphaev67 ;; - EV68*) UNAME_MACHINE=alphaev68 ;; - esac - objdump --private-headers /bin/sh | grep -q ld.so.1 - if test "$?" = 0 ; then LIBC=gnulibc1 ; fi - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - arc:Linux:*:* | arceb:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - arm*:Linux:*:*) - set_cc_for_build - if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ARM_EABI__ - then - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - else - if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ARM_PCS_VFP - then - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi - else - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf - fi - fi - exit ;; - avr32*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - cris:Linux:*:*) - echo "$UNAME_MACHINE"-axis-linux-"$LIBC" - exit ;; - crisv32:Linux:*:*) - echo "$UNAME_MACHINE"-axis-linux-"$LIBC" - exit ;; - e2k:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - frv:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - hexagon:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - i*86:Linux:*:*) - echo "$UNAME_MACHINE"-pc-linux-"$LIBC" - exit ;; - ia64:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - k1om:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - m32r*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - m68*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - mips:Linux:*:* | mips64:Linux:*:*) - set_cc_for_build - IS_GLIBC=0 - test x"${LIBC}" = xgnu && IS_GLIBC=1 - sed 's/^ //' << EOF > "$dummy.c" - #undef CPU - #undef mips - #undef mipsel - #undef mips64 - #undef mips64el - #if ${IS_GLIBC} && defined(_ABI64) - LIBCABI=gnuabi64 - #else - #if ${IS_GLIBC} && defined(_ABIN32) - LIBCABI=gnuabin32 - #else - LIBCABI=${LIBC} - #endif - #endif - - #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 - CPU=mipsisa64r6 - #else - #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 - CPU=mipsisa32r6 - #else - #if defined(__mips64) - CPU=mips64 - #else - CPU=mips - #endif - #endif - #endif - - #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - MIPS_ENDIAN=el - #else - #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - MIPS_ENDIAN= - #else - MIPS_ENDIAN= - #endif - #endif -EOF - eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'`" - test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } - ;; - mips64el:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - openrisc*:Linux:*:*) - echo or1k-unknown-linux-"$LIBC" - exit ;; - or32:Linux:*:* | or1k*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - padre:Linux:*:*) - echo sparc-unknown-linux-"$LIBC" - exit ;; - parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-"$LIBC" - exit ;; - parisc:Linux:*:* | hppa:Linux:*:*) - # Look for CPU level - case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in - PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; - PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; - *) echo hppa-unknown-linux-"$LIBC" ;; - esac - exit ;; - ppc64:Linux:*:*) - echo powerpc64-unknown-linux-"$LIBC" - exit ;; - ppc:Linux:*:*) - echo powerpc-unknown-linux-"$LIBC" - exit ;; - ppc64le:Linux:*:*) - echo powerpc64le-unknown-linux-"$LIBC" - exit ;; - ppcle:Linux:*:*) - echo powerpcle-unknown-linux-"$LIBC" - exit ;; - riscv32:Linux:*:* | riscv64:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - s390:Linux:*:* | s390x:Linux:*:*) - echo "$UNAME_MACHINE"-ibm-linux-"$LIBC" - exit ;; - sh64*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - sh*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - sparc:Linux:*:* | sparc64:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - tile*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - vax:Linux:*:*) - echo "$UNAME_MACHINE"-dec-linux-"$LIBC" - exit ;; - x86_64:Linux:*:*) - set_cc_for_build - LIBCABI=$LIBC - if [ "$CC_FOR_BUILD" != no_compiler_found ]; then - if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \ - (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_X32 >/dev/null - then - LIBCABI="$LIBC"x32 - fi - fi - echo "$UNAME_MACHINE"-pc-linux-"$LIBCABI" - exit ;; - xtensa*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - i*86:DYNIX/ptx:4*:*) - # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. - # earlier versions are messed up and put the nodename in both - # sysname and nodename. - echo i386-sequent-sysv4 - exit ;; - i*86:UNIX_SV:4.2MP:2.*) - # Unixware is an offshoot of SVR4, but it has its own version - # number series starting with 2... - # I am not positive that other SVR4 systems won't match this, - # I just have to hope. -- rms. - # Use sysv4.2uw... so that sysv4* matches it. - echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION" - exit ;; - i*86:OS/2:*:*) - # If we were able to find `uname', then EMX Unix compatibility - # is probably installed. - echo "$UNAME_MACHINE"-pc-os2-emx - exit ;; - i*86:XTS-300:*:STOP) - echo "$UNAME_MACHINE"-unknown-stop - exit ;; - i*86:atheos:*:*) - echo "$UNAME_MACHINE"-unknown-atheos - exit ;; - i*86:syllable:*:*) - echo "$UNAME_MACHINE"-pc-syllable - exit ;; - i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) - echo i386-unknown-lynxos"$UNAME_RELEASE" - exit ;; - i*86:*DOS:*:*) - echo "$UNAME_MACHINE"-pc-msdosdjgpp - exit ;; - i*86:*:4.*:*) - UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` - if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then - echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL" - else - echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL" - fi - exit ;; - i*86:*:5:[678]*) - # UnixWare 7.x, OpenUNIX and OpenServer 6. - case `/bin/uname -X | grep "^Machine"` in - *486*) UNAME_MACHINE=i486 ;; - *Pentium) UNAME_MACHINE=i586 ;; - *Pent*|*Celeron) UNAME_MACHINE=i686 ;; - esac - echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}" - exit ;; - i*86:*:3.2:*) - if test -f /usr/options/cb.name; then - UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then - UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` - (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 - (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ - && UNAME_MACHINE=i586 - (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ - && UNAME_MACHINE=i686 - (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ - && UNAME_MACHINE=i686 - echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL" - else - echo "$UNAME_MACHINE"-pc-sysv32 - fi - exit ;; - pc:*:*:*) - # Left here for compatibility: - # uname -m prints for DJGPP always 'pc', but it prints nothing about - # the processor, so we play safe by assuming i586. - # Note: whatever this is, it MUST be the same as what config.sub - # prints for the "djgpp" host, or else GDB configure will decide that - # this is a cross-build. - echo i586-pc-msdosdjgpp - exit ;; - Intel:Mach:3*:*) - echo i386-pc-mach3 - exit ;; - paragon:*:*:*) - echo i860-intel-osf1 - exit ;; - i860:*:4.*:*) # i860-SVR4 - if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then - echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4 - else # Add other i860-SVR4 vendors below as they are discovered. - echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4 - fi - exit ;; - mini*:CTIX:SYS*5:*) - # "miniframe" - echo m68010-convergent-sysv - exit ;; - mc68k:UNIX:SYSTEM5:3.51m) - echo m68k-convergent-sysv - exit ;; - M680?0:D-NIX:5.3:*) - echo m68k-diab-dnix - exit ;; - M68*:*:R3V[5678]*:*) - test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; - 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) - OS_REL='' - test -r /etc/.relid \ - && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } - /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; - 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4; exit; } ;; - NCR*:*:4.2:* | MPRAS*:*:4.2:*) - OS_REL='.3' - test -r /etc/.relid \ - && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } - /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } - /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ - && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; - m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) - echo m68k-unknown-lynxos"$UNAME_RELEASE" - exit ;; - mc68030:UNIX_System_V:4.*:*) - echo m68k-atari-sysv4 - exit ;; - TSUNAMI:LynxOS:2.*:*) - echo sparc-unknown-lynxos"$UNAME_RELEASE" - exit ;; - rs6000:LynxOS:2.*:*) - echo rs6000-unknown-lynxos"$UNAME_RELEASE" - exit ;; - PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) - echo powerpc-unknown-lynxos"$UNAME_RELEASE" - exit ;; - SM[BE]S:UNIX_SV:*:*) - echo mips-dde-sysv"$UNAME_RELEASE" - exit ;; - RM*:ReliantUNIX-*:*:*) - echo mips-sni-sysv4 - exit ;; - RM*:SINIX-*:*:*) - echo mips-sni-sysv4 - exit ;; - *:SINIX-*:*:*) - if uname -p 2>/dev/null >/dev/null ; then - UNAME_MACHINE=`(uname -p) 2>/dev/null` - echo "$UNAME_MACHINE"-sni-sysv4 - else - echo ns32k-sni-sysv - fi - exit ;; - PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort - # says - echo i586-unisys-sysv4 - exit ;; - *:UNIX_System_V:4*:FTX*) - # From Gerald Hewes . - # How about differentiating between stratus architectures? -djm - echo hppa1.1-stratus-sysv4 - exit ;; - *:*:*:FTX*) - # From seanf@swdc.stratus.com. - echo i860-stratus-sysv4 - exit ;; - i*86:VOS:*:*) - # From Paul.Green@stratus.com. - echo "$UNAME_MACHINE"-stratus-vos - exit ;; - *:VOS:*:*) - # From Paul.Green@stratus.com. - echo hppa1.1-stratus-vos - exit ;; - mc68*:A/UX:*:*) - echo m68k-apple-aux"$UNAME_RELEASE" - exit ;; - news*:NEWS-OS:6*:*) - echo mips-sony-newsos6 - exit ;; - R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) - if [ -d /usr/nec ]; then - echo mips-nec-sysv"$UNAME_RELEASE" - else - echo mips-unknown-sysv"$UNAME_RELEASE" - fi - exit ;; - BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. - echo powerpc-be-beos - exit ;; - BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. - echo powerpc-apple-beos - exit ;; - BePC:BeOS:*:*) # BeOS running on Intel PC compatible. - echo i586-pc-beos - exit ;; - BePC:Haiku:*:*) # Haiku running on Intel PC compatible. - echo i586-pc-haiku - exit ;; - x86_64:Haiku:*:*) - echo x86_64-unknown-haiku - exit ;; - SX-4:SUPER-UX:*:*) - echo sx4-nec-superux"$UNAME_RELEASE" - exit ;; - SX-5:SUPER-UX:*:*) - echo sx5-nec-superux"$UNAME_RELEASE" - exit ;; - SX-6:SUPER-UX:*:*) - echo sx6-nec-superux"$UNAME_RELEASE" - exit ;; - SX-7:SUPER-UX:*:*) - echo sx7-nec-superux"$UNAME_RELEASE" - exit ;; - SX-8:SUPER-UX:*:*) - echo sx8-nec-superux"$UNAME_RELEASE" - exit ;; - SX-8R:SUPER-UX:*:*) - echo sx8r-nec-superux"$UNAME_RELEASE" - exit ;; - SX-ACE:SUPER-UX:*:*) - echo sxace-nec-superux"$UNAME_RELEASE" - exit ;; - Power*:Rhapsody:*:*) - echo powerpc-apple-rhapsody"$UNAME_RELEASE" - exit ;; - *:Rhapsody:*:*) - echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" - exit ;; - arm64:Darwin:*:*) - echo aarch64-apple-darwin"$UNAME_RELEASE" - exit ;; - *:Darwin:*:*) - UNAME_PROCESSOR=`uname -p` - case $UNAME_PROCESSOR in - unknown) UNAME_PROCESSOR=powerpc ;; - esac - if command -v xcode-select > /dev/null 2> /dev/null && \ - ! xcode-select --print-path > /dev/null 2> /dev/null ; then - # Avoid executing cc if there is no toolchain installed as - # cc will be a stub that puts up a graphical alert - # prompting the user to install developer tools. - CC_FOR_BUILD=no_compiler_found - else - set_cc_for_build - fi - if [ "$CC_FOR_BUILD" != no_compiler_found ]; then - if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - case $UNAME_PROCESSOR in - i386) UNAME_PROCESSOR=x86_64 ;; - powerpc) UNAME_PROCESSOR=powerpc64 ;; - esac - fi - # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc - if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ - (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_PPC >/dev/null - then - UNAME_PROCESSOR=powerpc - fi - elif test "$UNAME_PROCESSOR" = i386 ; then - # uname -m returns i386 or x86_64 - UNAME_PROCESSOR=$UNAME_MACHINE - fi - echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" - exit ;; - *:procnto*:*:* | *:QNX:[0123456789]*:*) - UNAME_PROCESSOR=`uname -p` - if test "$UNAME_PROCESSOR" = x86; then - UNAME_PROCESSOR=i386 - UNAME_MACHINE=pc - fi - echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE" - exit ;; - *:QNX:*:4*) - echo i386-pc-qnx - exit ;; - NEO-*:NONSTOP_KERNEL:*:*) - echo neo-tandem-nsk"$UNAME_RELEASE" - exit ;; - NSE-*:NONSTOP_KERNEL:*:*) - echo nse-tandem-nsk"$UNAME_RELEASE" - exit ;; - NSR-*:NONSTOP_KERNEL:*:*) - echo nsr-tandem-nsk"$UNAME_RELEASE" - exit ;; - NSV-*:NONSTOP_KERNEL:*:*) - echo nsv-tandem-nsk"$UNAME_RELEASE" - exit ;; - NSX-*:NONSTOP_KERNEL:*:*) - echo nsx-tandem-nsk"$UNAME_RELEASE" - exit ;; - *:NonStop-UX:*:*) - echo mips-compaq-nonstopux - exit ;; - BS2000:POSIX*:*:*) - echo bs2000-siemens-sysv - exit ;; - DS/*:UNIX_System_V:*:*) - echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE" - exit ;; - *:Plan9:*:*) - # "uname -m" is not consistent, so use $cputype instead. 386 - # is converted to i386 for consistency with other x86 - # operating systems. - # shellcheck disable=SC2154 - if test "$cputype" = 386; then - UNAME_MACHINE=i386 - else - UNAME_MACHINE="$cputype" - fi - echo "$UNAME_MACHINE"-unknown-plan9 - exit ;; - *:TOPS-10:*:*) - echo pdp10-unknown-tops10 - exit ;; - *:TENEX:*:*) - echo pdp10-unknown-tenex - exit ;; - KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) - echo pdp10-dec-tops20 - exit ;; - XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) - echo pdp10-xkl-tops20 - exit ;; - *:TOPS-20:*:*) - echo pdp10-unknown-tops20 - exit ;; - *:ITS:*:*) - echo pdp10-unknown-its - exit ;; - SEI:*:*:SEIUX) - echo mips-sei-seiux"$UNAME_RELEASE" - exit ;; - *:DragonFly:*:*) - echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" - exit ;; - *:*VMS:*:*) - UNAME_MACHINE=`(uname -p) 2>/dev/null` - case "$UNAME_MACHINE" in - A*) echo alpha-dec-vms ; exit ;; - I*) echo ia64-dec-vms ; exit ;; - V*) echo vax-dec-vms ; exit ;; - esac ;; - *:XENIX:*:SysV) - echo i386-pc-xenix - exit ;; - i*86:skyos:*:*) - echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`" - exit ;; - i*86:rdos:*:*) - echo "$UNAME_MACHINE"-pc-rdos - exit ;; - i*86:AROS:*:*) - echo "$UNAME_MACHINE"-pc-aros - exit ;; - x86_64:VMkernel:*:*) - echo "$UNAME_MACHINE"-unknown-esx - exit ;; - amd64:Isilon\ OneFS:*:*) - echo x86_64-unknown-onefs - exit ;; - *:Unleashed:*:*) - echo "$UNAME_MACHINE"-unknown-unleashed"$UNAME_RELEASE" - exit ;; -esac - -# No uname command or uname output not recognized. -set_cc_for_build -cat > "$dummy.c" < -#include -#endif -#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) -#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) -#include -#if defined(_SIZE_T_) || defined(SIGLOST) -#include -#endif -#endif -#endif -main () -{ -#if defined (sony) -#if defined (MIPSEB) - /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, - I don't know.... */ - printf ("mips-sony-bsd\n"); exit (0); -#else -#include - printf ("m68k-sony-newsos%s\n", -#ifdef NEWSOS4 - "4" -#else - "" -#endif - ); exit (0); -#endif -#endif - -#if defined (NeXT) -#if !defined (__ARCHITECTURE__) -#define __ARCHITECTURE__ "m68k" -#endif - int version; - version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; - if (version < 4) - printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); - else - printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); - exit (0); -#endif - -#if defined (MULTIMAX) || defined (n16) -#if defined (UMAXV) - printf ("ns32k-encore-sysv\n"); exit (0); -#else -#if defined (CMU) - printf ("ns32k-encore-mach\n"); exit (0); -#else - printf ("ns32k-encore-bsd\n"); exit (0); -#endif -#endif -#endif - -#if defined (__386BSD__) - printf ("i386-pc-bsd\n"); exit (0); -#endif - -#if defined (sequent) -#if defined (i386) - printf ("i386-sequent-dynix\n"); exit (0); -#endif -#if defined (ns32000) - printf ("ns32k-sequent-dynix\n"); exit (0); -#endif -#endif - -#if defined (_SEQUENT_) - struct utsname un; - - uname(&un); - if (strncmp(un.version, "V2", 2) == 0) { - printf ("i386-sequent-ptx2\n"); exit (0); - } - if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ - printf ("i386-sequent-ptx1\n"); exit (0); - } - printf ("i386-sequent-ptx\n"); exit (0); -#endif - -#if defined (vax) -#if !defined (ultrix) -#include -#if defined (BSD) -#if BSD == 43 - printf ("vax-dec-bsd4.3\n"); exit (0); -#else -#if BSD == 199006 - printf ("vax-dec-bsd4.3reno\n"); exit (0); -#else - printf ("vax-dec-bsd\n"); exit (0); -#endif -#endif -#else - printf ("vax-dec-bsd\n"); exit (0); -#endif -#else -#if defined(_SIZE_T_) || defined(SIGLOST) - struct utsname un; - uname (&un); - printf ("vax-dec-ultrix%s\n", un.release); exit (0); -#else - printf ("vax-dec-ultrix\n"); exit (0); -#endif -#endif -#endif -#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) -#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) -#if defined(_SIZE_T_) || defined(SIGLOST) - struct utsname *un; - uname (&un); - printf ("mips-dec-ultrix%s\n", un.release); exit (0); -#else - printf ("mips-dec-ultrix\n"); exit (0); -#endif -#endif -#endif - -#if defined (alliant) && defined (i860) - printf ("i860-alliant-bsd\n"); exit (0); -#endif - - exit (1); -} -EOF - -$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } - -# Apollos put the system type in the environment. -test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; } - -echo "$0: unable to guess system type" >&2 - -case "$UNAME_MACHINE:$UNAME_SYSTEM" in - mips:Linux | mips64:Linux) - # If we got here on MIPS GNU/Linux, output extra information. - cat >&2 <&2 <&2 </dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null` - -hostinfo = `(hostinfo) 2>/dev/null` -/bin/universe = `(/bin/universe) 2>/dev/null` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` -/bin/arch = `(/bin/arch) 2>/dev/null` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` - -UNAME_MACHINE = "$UNAME_MACHINE" -UNAME_RELEASE = "$UNAME_RELEASE" -UNAME_SYSTEM = "$UNAME_SYSTEM" -UNAME_VERSION = "$UNAME_VERSION" -EOF -fi - -exit 1 - -# Local variables: -# eval: (add-hook 'before-save-hook 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/config.sub b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/config.sub deleted file mode 100644 index 14b5150..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/config.sub +++ /dev/null @@ -1,1851 +0,0 @@ -#! /bin/sh -# Configuration validation subroutine script. -# Copyright 1992-2020 Free Software Foundation, Inc. - -timestamp='2020-08-05' - -# This file is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, see . -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that -# program. This Exception is an additional permission under section 7 -# of the GNU General Public License, version 3 ("GPLv3"). - - -# Please send patches to . -# -# Configuration subroutine to validate and canonicalize a configuration type. -# Supply the specified configuration type as an argument. -# If it is invalid, we print an error message on stderr and exit with code 1. -# Otherwise, we print the canonical config type on stdout and succeed. - -# You can get the latest version of this script from: -# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub - -# This file is supposed to be the same for all GNU packages -# and recognize all the CPU types, system types and aliases -# that are meaningful with *any* GNU software. -# Each package is responsible for reporting which valid configurations -# it does not support. The user should be able to distinguish -# a failure to support a valid configuration from a meaningless -# configuration. - -# The goal of this file is to map all the various variations of a given -# machine specification into a single specification in the form: -# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM -# or in some cases, the newer four-part form: -# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM -# It is wrong to echo any other type of specification. - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS - -Canonicalize a configuration name. - -Options: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to ." - -version="\ -GNU config.sub ($timestamp) - -Copyright 1992-2020 Free Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try \`$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit ;; - --version | -v ) - echo "$version" ; exit ;; - --help | --h* | -h ) - echo "$usage"; exit ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" >&2 - exit 1 ;; - - *local*) - # First pass through any local machine types. - echo "$1" - exit ;; - - * ) - break ;; - esac -done - -case $# in - 0) echo "$me: missing argument$help" >&2 - exit 1;; - 1) ;; - *) echo "$me: too many arguments$help" >&2 - exit 1;; -esac - -# Split fields of configuration type -# shellcheck disable=SC2162 -IFS="-" read field1 field2 field3 field4 <&2 - exit 1 - ;; - *-*-*-*) - basic_machine=$field1-$field2 - basic_os=$field3-$field4 - ;; - *-*-*) - # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two - # parts - maybe_os=$field2-$field3 - case $maybe_os in - nto-qnx* | linux-* | uclinux-uclibc* \ - | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ - | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ - | storm-chaos* | os2-emx* | rtmk-nova*) - basic_machine=$field1 - basic_os=$maybe_os - ;; - android-linux) - basic_machine=$field1-unknown - basic_os=linux-android - ;; - *) - basic_machine=$field1-$field2 - basic_os=$field3 - ;; - esac - ;; - *-*) - # A lone config we happen to match not fitting any pattern - case $field1-$field2 in - decstation-3100) - basic_machine=mips-dec - basic_os= - ;; - *-*) - # Second component is usually, but not always the OS - case $field2 in - # Prevent following clause from handling this valid os - sun*os*) - basic_machine=$field1 - basic_os=$field2 - ;; - # Manufacturers - dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \ - | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ - | unicom* | ibm* | next | hp | isi* | apollo | altos* \ - | convergent* | ncr* | news | 32* | 3600* | 3100* \ - | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \ - | ultra | tti* | harris | dolphin | highlevel | gould \ - | cbm | ns | masscomp | apple | axis | knuth | cray \ - | microblaze* | sim | cisco \ - | oki | wec | wrs | winbond) - basic_machine=$field1-$field2 - basic_os= - ;; - *) - basic_machine=$field1 - basic_os=$field2 - ;; - esac - ;; - esac - ;; - *) - # Convert single-component short-hands not valid as part of - # multi-component configurations. - case $field1 in - 386bsd) - basic_machine=i386-pc - basic_os=bsd - ;; - a29khif) - basic_machine=a29k-amd - basic_os=udi - ;; - adobe68k) - basic_machine=m68010-adobe - basic_os=scout - ;; - alliant) - basic_machine=fx80-alliant - basic_os= - ;; - altos | altos3068) - basic_machine=m68k-altos - basic_os= - ;; - am29k) - basic_machine=a29k-none - basic_os=bsd - ;; - amdahl) - basic_machine=580-amdahl - basic_os=sysv - ;; - amiga) - basic_machine=m68k-unknown - basic_os= - ;; - amigaos | amigados) - basic_machine=m68k-unknown - basic_os=amigaos - ;; - amigaunix | amix) - basic_machine=m68k-unknown - basic_os=sysv4 - ;; - apollo68) - basic_machine=m68k-apollo - basic_os=sysv - ;; - apollo68bsd) - basic_machine=m68k-apollo - basic_os=bsd - ;; - aros) - basic_machine=i386-pc - basic_os=aros - ;; - aux) - basic_machine=m68k-apple - basic_os=aux - ;; - balance) - basic_machine=ns32k-sequent - basic_os=dynix - ;; - blackfin) - basic_machine=bfin-unknown - basic_os=linux - ;; - cegcc) - basic_machine=arm-unknown - basic_os=cegcc - ;; - convex-c1) - basic_machine=c1-convex - basic_os=bsd - ;; - convex-c2) - basic_machine=c2-convex - basic_os=bsd - ;; - convex-c32) - basic_machine=c32-convex - basic_os=bsd - ;; - convex-c34) - basic_machine=c34-convex - basic_os=bsd - ;; - convex-c38) - basic_machine=c38-convex - basic_os=bsd - ;; - cray) - basic_machine=j90-cray - basic_os=unicos - ;; - crds | unos) - basic_machine=m68k-crds - basic_os= - ;; - da30) - basic_machine=m68k-da30 - basic_os= - ;; - decstation | pmax | pmin | dec3100 | decstatn) - basic_machine=mips-dec - basic_os= - ;; - delta88) - basic_machine=m88k-motorola - basic_os=sysv3 - ;; - dicos) - basic_machine=i686-pc - basic_os=dicos - ;; - djgpp) - basic_machine=i586-pc - basic_os=msdosdjgpp - ;; - ebmon29k) - basic_machine=a29k-amd - basic_os=ebmon - ;; - es1800 | OSE68k | ose68k | ose | OSE) - basic_machine=m68k-ericsson - basic_os=ose - ;; - gmicro) - basic_machine=tron-gmicro - basic_os=sysv - ;; - go32) - basic_machine=i386-pc - basic_os=go32 - ;; - h8300hms) - basic_machine=h8300-hitachi - basic_os=hms - ;; - h8300xray) - basic_machine=h8300-hitachi - basic_os=xray - ;; - h8500hms) - basic_machine=h8500-hitachi - basic_os=hms - ;; - harris) - basic_machine=m88k-harris - basic_os=sysv3 - ;; - hp300 | hp300hpux) - basic_machine=m68k-hp - basic_os=hpux - ;; - hp300bsd) - basic_machine=m68k-hp - basic_os=bsd - ;; - hppaosf) - basic_machine=hppa1.1-hp - basic_os=osf - ;; - hppro) - basic_machine=hppa1.1-hp - basic_os=proelf - ;; - i386mach) - basic_machine=i386-mach - basic_os=mach - ;; - isi68 | isi) - basic_machine=m68k-isi - basic_os=sysv - ;; - m68knommu) - basic_machine=m68k-unknown - basic_os=linux - ;; - magnum | m3230) - basic_machine=mips-mips - basic_os=sysv - ;; - merlin) - basic_machine=ns32k-utek - basic_os=sysv - ;; - mingw64) - basic_machine=x86_64-pc - basic_os=mingw64 - ;; - mingw32) - basic_machine=i686-pc - basic_os=mingw32 - ;; - mingw32ce) - basic_machine=arm-unknown - basic_os=mingw32ce - ;; - monitor) - basic_machine=m68k-rom68k - basic_os=coff - ;; - morphos) - basic_machine=powerpc-unknown - basic_os=morphos - ;; - moxiebox) - basic_machine=moxie-unknown - basic_os=moxiebox - ;; - msdos) - basic_machine=i386-pc - basic_os=msdos - ;; - msys) - basic_machine=i686-pc - basic_os=msys - ;; - mvs) - basic_machine=i370-ibm - basic_os=mvs - ;; - nacl) - basic_machine=le32-unknown - basic_os=nacl - ;; - ncr3000) - basic_machine=i486-ncr - basic_os=sysv4 - ;; - netbsd386) - basic_machine=i386-pc - basic_os=netbsd - ;; - netwinder) - basic_machine=armv4l-rebel - basic_os=linux - ;; - news | news700 | news800 | news900) - basic_machine=m68k-sony - basic_os=newsos - ;; - news1000) - basic_machine=m68030-sony - basic_os=newsos - ;; - necv70) - basic_machine=v70-nec - basic_os=sysv - ;; - nh3000) - basic_machine=m68k-harris - basic_os=cxux - ;; - nh[45]000) - basic_machine=m88k-harris - basic_os=cxux - ;; - nindy960) - basic_machine=i960-intel - basic_os=nindy - ;; - mon960) - basic_machine=i960-intel - basic_os=mon960 - ;; - nonstopux) - basic_machine=mips-compaq - basic_os=nonstopux - ;; - os400) - basic_machine=powerpc-ibm - basic_os=os400 - ;; - OSE68000 | ose68000) - basic_machine=m68000-ericsson - basic_os=ose - ;; - os68k) - basic_machine=m68k-none - basic_os=os68k - ;; - paragon) - basic_machine=i860-intel - basic_os=osf - ;; - parisc) - basic_machine=hppa-unknown - basic_os=linux - ;; - psp) - basic_machine=mipsallegrexel-sony - basic_os=psp - ;; - pw32) - basic_machine=i586-unknown - basic_os=pw32 - ;; - rdos | rdos64) - basic_machine=x86_64-pc - basic_os=rdos - ;; - rdos32) - basic_machine=i386-pc - basic_os=rdos - ;; - rom68k) - basic_machine=m68k-rom68k - basic_os=coff - ;; - sa29200) - basic_machine=a29k-amd - basic_os=udi - ;; - sei) - basic_machine=mips-sei - basic_os=seiux - ;; - sequent) - basic_machine=i386-sequent - basic_os= - ;; - sps7) - basic_machine=m68k-bull - basic_os=sysv2 - ;; - st2000) - basic_machine=m68k-tandem - basic_os= - ;; - stratus) - basic_machine=i860-stratus - basic_os=sysv4 - ;; - sun2) - basic_machine=m68000-sun - basic_os= - ;; - sun2os3) - basic_machine=m68000-sun - basic_os=sunos3 - ;; - sun2os4) - basic_machine=m68000-sun - basic_os=sunos4 - ;; - sun3) - basic_machine=m68k-sun - basic_os= - ;; - sun3os3) - basic_machine=m68k-sun - basic_os=sunos3 - ;; - sun3os4) - basic_machine=m68k-sun - basic_os=sunos4 - ;; - sun4) - basic_machine=sparc-sun - basic_os= - ;; - sun4os3) - basic_machine=sparc-sun - basic_os=sunos3 - ;; - sun4os4) - basic_machine=sparc-sun - basic_os=sunos4 - ;; - sun4sol2) - basic_machine=sparc-sun - basic_os=solaris2 - ;; - sun386 | sun386i | roadrunner) - basic_machine=i386-sun - basic_os= - ;; - sv1) - basic_machine=sv1-cray - basic_os=unicos - ;; - symmetry) - basic_machine=i386-sequent - basic_os=dynix - ;; - t3e) - basic_machine=alphaev5-cray - basic_os=unicos - ;; - t90) - basic_machine=t90-cray - basic_os=unicos - ;; - toad1) - basic_machine=pdp10-xkl - basic_os=tops20 - ;; - tpf) - basic_machine=s390x-ibm - basic_os=tpf - ;; - udi29k) - basic_machine=a29k-amd - basic_os=udi - ;; - ultra3) - basic_machine=a29k-nyu - basic_os=sym1 - ;; - v810 | necv810) - basic_machine=v810-nec - basic_os=none - ;; - vaxv) - basic_machine=vax-dec - basic_os=sysv - ;; - vms) - basic_machine=vax-dec - basic_os=vms - ;; - vsta) - basic_machine=i386-pc - basic_os=vsta - ;; - vxworks960) - basic_machine=i960-wrs - basic_os=vxworks - ;; - vxworks68) - basic_machine=m68k-wrs - basic_os=vxworks - ;; - vxworks29k) - basic_machine=a29k-wrs - basic_os=vxworks - ;; - xbox) - basic_machine=i686-pc - basic_os=mingw32 - ;; - ymp) - basic_machine=ymp-cray - basic_os=unicos - ;; - *) - basic_machine=$1 - basic_os= - ;; - esac - ;; -esac - -# Decode 1-component or ad-hoc basic machines -case $basic_machine in - # Here we handle the default manufacturer of certain CPU types. It is in - # some cases the only manufacturer, in others, it is the most popular. - w89k) - cpu=hppa1.1 - vendor=winbond - ;; - op50n) - cpu=hppa1.1 - vendor=oki - ;; - op60c) - cpu=hppa1.1 - vendor=oki - ;; - ibm*) - cpu=i370 - vendor=ibm - ;; - orion105) - cpu=clipper - vendor=highlevel - ;; - mac | mpw | mac-mpw) - cpu=m68k - vendor=apple - ;; - pmac | pmac-mpw) - cpu=powerpc - vendor=apple - ;; - - # Recognize the various machine names and aliases which stand - # for a CPU type and a company and sometimes even an OS. - 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) - cpu=m68000 - vendor=att - ;; - 3b*) - cpu=we32k - vendor=att - ;; - bluegene*) - cpu=powerpc - vendor=ibm - basic_os=cnk - ;; - decsystem10* | dec10*) - cpu=pdp10 - vendor=dec - basic_os=tops10 - ;; - decsystem20* | dec20*) - cpu=pdp10 - vendor=dec - basic_os=tops20 - ;; - delta | 3300 | motorola-3300 | motorola-delta \ - | 3300-motorola | delta-motorola) - cpu=m68k - vendor=motorola - ;; - dpx2*) - cpu=m68k - vendor=bull - basic_os=sysv3 - ;; - encore | umax | mmax) - cpu=ns32k - vendor=encore - ;; - elxsi) - cpu=elxsi - vendor=elxsi - basic_os=${basic_os:-bsd} - ;; - fx2800) - cpu=i860 - vendor=alliant - ;; - genix) - cpu=ns32k - vendor=ns - ;; - h3050r* | hiux*) - cpu=hppa1.1 - vendor=hitachi - basic_os=hiuxwe2 - ;; - hp3k9[0-9][0-9] | hp9[0-9][0-9]) - cpu=hppa1.0 - vendor=hp - ;; - hp9k2[0-9][0-9] | hp9k31[0-9]) - cpu=m68000 - vendor=hp - ;; - hp9k3[2-9][0-9]) - cpu=m68k - vendor=hp - ;; - hp9k6[0-9][0-9] | hp6[0-9][0-9]) - cpu=hppa1.0 - vendor=hp - ;; - hp9k7[0-79][0-9] | hp7[0-79][0-9]) - cpu=hppa1.1 - vendor=hp - ;; - hp9k78[0-9] | hp78[0-9]) - # FIXME: really hppa2.0-hp - cpu=hppa1.1 - vendor=hp - ;; - hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) - # FIXME: really hppa2.0-hp - cpu=hppa1.1 - vendor=hp - ;; - hp9k8[0-9][13679] | hp8[0-9][13679]) - cpu=hppa1.1 - vendor=hp - ;; - hp9k8[0-9][0-9] | hp8[0-9][0-9]) - cpu=hppa1.0 - vendor=hp - ;; - i*86v32) - cpu=`echo "$1" | sed -e 's/86.*/86/'` - vendor=pc - basic_os=sysv32 - ;; - i*86v4*) - cpu=`echo "$1" | sed -e 's/86.*/86/'` - vendor=pc - basic_os=sysv4 - ;; - i*86v) - cpu=`echo "$1" | sed -e 's/86.*/86/'` - vendor=pc - basic_os=sysv - ;; - i*86sol2) - cpu=`echo "$1" | sed -e 's/86.*/86/'` - vendor=pc - basic_os=solaris2 - ;; - j90 | j90-cray) - cpu=j90 - vendor=cray - basic_os=${basic_os:-unicos} - ;; - iris | iris4d) - cpu=mips - vendor=sgi - case $basic_os in - irix*) - ;; - *) - basic_os=irix4 - ;; - esac - ;; - miniframe) - cpu=m68000 - vendor=convergent - ;; - *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) - cpu=m68k - vendor=atari - basic_os=mint - ;; - news-3600 | risc-news) - cpu=mips - vendor=sony - basic_os=newsos - ;; - next | m*-next) - cpu=m68k - vendor=next - case $basic_os in - openstep*) - ;; - nextstep*) - ;; - ns2*) - basic_os=nextstep2 - ;; - *) - basic_os=nextstep3 - ;; - esac - ;; - np1) - cpu=np1 - vendor=gould - ;; - op50n-* | op60c-*) - cpu=hppa1.1 - vendor=oki - basic_os=proelf - ;; - pa-hitachi) - cpu=hppa1.1 - vendor=hitachi - basic_os=hiuxwe2 - ;; - pbd) - cpu=sparc - vendor=tti - ;; - pbb) - cpu=m68k - vendor=tti - ;; - pc532) - cpu=ns32k - vendor=pc532 - ;; - pn) - cpu=pn - vendor=gould - ;; - power) - cpu=power - vendor=ibm - ;; - ps2) - cpu=i386 - vendor=ibm - ;; - rm[46]00) - cpu=mips - vendor=siemens - ;; - rtpc | rtpc-*) - cpu=romp - vendor=ibm - ;; - sde) - cpu=mipsisa32 - vendor=sde - basic_os=${basic_os:-elf} - ;; - simso-wrs) - cpu=sparclite - vendor=wrs - basic_os=vxworks - ;; - tower | tower-32) - cpu=m68k - vendor=ncr - ;; - vpp*|vx|vx-*) - cpu=f301 - vendor=fujitsu - ;; - w65) - cpu=w65 - vendor=wdc - ;; - w89k-*) - cpu=hppa1.1 - vendor=winbond - basic_os=proelf - ;; - none) - cpu=none - vendor=none - ;; - leon|leon[3-9]) - cpu=sparc - vendor=$basic_machine - ;; - leon-*|leon[3-9]-*) - cpu=sparc - vendor=`echo "$basic_machine" | sed 's/-.*//'` - ;; - - *-*) - # shellcheck disable=SC2162 - IFS="-" read cpu vendor <&2 - exit 1 - ;; - esac - ;; -esac - -# Here we canonicalize certain aliases for manufacturers. -case $vendor in - digital*) - vendor=dec - ;; - commodore*) - vendor=cbm - ;; - *) - ;; -esac - -# Decode manufacturer-specific aliases for certain operating systems. - -if [ x$basic_os != x ] -then - -# First recognize some ad-hoc caes, or perhaps split kernel-os, or else just -# set os. -case $basic_os in - gnu/linux*) - kernel=linux - os=`echo $basic_os | sed -e 's|gnu/linux|gnu|'` - ;; - nto-qnx*) - kernel=nto - os=`echo $basic_os | sed -e 's|nto-qnx|qnx|'` - ;; - *-*) - # shellcheck disable=SC2162 - IFS="-" read kernel os <&2 - exit 1 - ;; -esac - -# As a final step for OS-related things, validate the OS-kernel combination -# (given a valid OS), if there is a kernel. -case $kernel-$os in - linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* | linux-musl* | linux-uclibc* ) - ;; - -dietlibc* | -newlib* | -musl* | -uclibc* ) - # These are just libc implementations, not actual OSes, and thus - # require a kernel. - echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2 - exit 1 - ;; - kfreebsd*-gnu* | kopensolaris*-gnu*) - ;; - nto-qnx*) - ;; - *-eabi* | *-gnueabi*) - ;; - -*) - # Blank kernel with real OS is always fine. - ;; - *-*) - echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2 - exit 1 - ;; -esac - -# Here we handle the case where we know the os, and the CPU type, but not the -# manufacturer. We pick the logical manufacturer. -case $vendor in - unknown) - case $cpu-$os in - *-riscix*) - vendor=acorn - ;; - *-sunos*) - vendor=sun - ;; - *-cnk* | *-aix*) - vendor=ibm - ;; - *-beos*) - vendor=be - ;; - *-hpux*) - vendor=hp - ;; - *-mpeix*) - vendor=hp - ;; - *-hiux*) - vendor=hitachi - ;; - *-unos*) - vendor=crds - ;; - *-dgux*) - vendor=dg - ;; - *-luna*) - vendor=omron - ;; - *-genix*) - vendor=ns - ;; - *-clix*) - vendor=intergraph - ;; - *-mvs* | *-opened*) - vendor=ibm - ;; - *-os400*) - vendor=ibm - ;; - s390-* | s390x-*) - vendor=ibm - ;; - *-ptx*) - vendor=sequent - ;; - *-tpf*) - vendor=ibm - ;; - *-vxsim* | *-vxworks* | *-windiss*) - vendor=wrs - ;; - *-aux*) - vendor=apple - ;; - *-hms*) - vendor=hitachi - ;; - *-mpw* | *-macos*) - vendor=apple - ;; - *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*) - vendor=atari - ;; - *-vos*) - vendor=stratus - ;; - esac - ;; -esac - -echo "$cpu-$vendor-${kernel:+$kernel-}$os" -exit - -# Local variables: -# eval: (add-hook 'before-save-hook 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/configure.ac b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/configure.ac deleted file mode 100644 index 093b87d..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/configure.ac +++ /dev/null @@ -1,415 +0,0 @@ -dnl Process this with autoconf to create configure - -AC_PREREQ(2.68) - -AC_INIT([libffi], [3.3], [http://github.com/libffi/libffi/issues]) -AC_CONFIG_HEADERS([fficonfig.h]) - -AC_CANONICAL_SYSTEM -target_alias=${target_alias-$host_alias} - -case "${host}" in - frv*-elf) - LDFLAGS=`echo $LDFLAGS | sed "s/\-B[^ ]*libgloss\/frv\///"`\ -B`pwd`/../libgloss/frv/ - ;; -esac - -AX_ENABLE_BUILDDIR - -AM_INIT_AUTOMAKE - -# The same as in boehm-gc and libstdc++. Have to borrow it from there. -# We must force CC to /not/ be precious variables; otherwise -# the wrong, non-multilib-adjusted value will be used in multilibs. -# As a side effect, we have to subst CFLAGS ourselves. -# Also save and restore CFLAGS, since AC_PROG_CC will come up with -# defaults of its own if none are provided. - -m4_rename([_AC_ARG_VAR_PRECIOUS],[real_PRECIOUS]) -m4_define([_AC_ARG_VAR_PRECIOUS],[]) -save_CFLAGS=$CFLAGS -AC_PROG_CC -AC_PROG_CXX -CFLAGS=$save_CFLAGS -m4_undefine([_AC_ARG_VAR_PRECIOUS]) -m4_rename_force([real_PRECIOUS],[_AC_ARG_VAR_PRECIOUS]) - -AC_SUBST(CFLAGS) - -AM_PROG_AS -AM_PROG_CC_C_O -AC_PROG_LIBTOOL -AC_CONFIG_MACRO_DIR([m4]) - -# Test for 64-bit build. -AC_CHECK_SIZEOF([size_t]) - -AX_COMPILER_VENDOR -AX_CC_MAXOPT -# The AX_CFLAGS_WARN_ALL macro doesn't currently work for sunpro -# compiler. -if test "$ax_cv_c_compiler_vendor" != "sun"; then - AX_CFLAGS_WARN_ALL -fi - -if test "x$GCC" = "xyes"; then - CFLAGS="$CFLAGS -fexceptions" -fi - -cat > local.exp < conftest.s - if $CC $CFLAGS -c conftest.s > /dev/null 2>&1; then - libffi_cv_as_x86_pcrel=yes - fi - ]) - if test "x$libffi_cv_as_x86_pcrel" = xyes; then - AC_DEFINE(HAVE_AS_X86_PCREL, 1, - [Define if your assembler supports PC relative relocs.]) - fi - ;; - - S390) - AC_CACHE_CHECK([compiler uses zarch features], - libffi_cv_as_s390_zarch, [ - libffi_cv_as_s390_zarch=no - echo 'void foo(void) { bar(); bar(); }' > conftest.c - if $CC $CFLAGS -S conftest.c > /dev/null 2>&1; then - if grep -q brasl conftest.s; then - libffi_cv_as_s390_zarch=yes - fi - fi - ]) - if test "x$libffi_cv_as_s390_zarch" = xyes; then - AC_DEFINE(HAVE_AS_S390_ZARCH, 1, - [Define if the compiler uses zarch features.]) - fi - ;; -esac - -AC_CACHE_CHECK([whether compiler supports pointer authentication], - libffi_cv_as_ptrauth, [ - libffi_cv_as_ptrauth=unknown - AC_TRY_COMPILE(,[ -#ifdef __clang__ -# if __has_feature(ptrauth_calls) -# define HAVE_PTRAUTH 1 -# endif -#endif - -#ifndef HAVE_PTRAUTH -# error Pointer authentication not supported -#endif - ], - [libffi_cv_as_ptrauth=yes], - [libffi_cv_as_ptrauth=no]) -]) -if test "x$libffi_cv_as_ptrauth" = xyes; then - AC_DEFINE(HAVE_PTRAUTH, 1, - [Define if your compiler supports pointer authentication.]) -fi - -# On PaX enable kernels that have MPROTECT enable we can't use PROT_EXEC. -AC_ARG_ENABLE(pax_emutramp, - [ --enable-pax_emutramp enable pax emulated trampolines, for we can't use PROT_EXEC], - if test "$enable_pax_emutramp" = "yes"; then - AC_DEFINE(FFI_MMAP_EXEC_EMUTRAMP_PAX, 1, - [Define this if you want to enable pax emulated trampolines]) - fi) - -LT_SYS_SYMBOL_USCORE -if test "x$sys_symbol_underscore" = xyes; then - AC_DEFINE(SYMBOL_UNDERSCORE, 1, [Define if symbols are underscored.]) -fi - -FFI_EXEC_TRAMPOLINE_TABLE=0 -case "$target" in - *arm*-apple-* | aarch64-apple-*) - FFI_EXEC_TRAMPOLINE_TABLE=1 - AC_DEFINE(FFI_EXEC_TRAMPOLINE_TABLE, 1, - [Cannot use PROT_EXEC on this target, so, we revert to - alternative means]) - ;; - *-apple-* | *-*-freebsd* | *-*-kfreebsd* | *-*-openbsd* | *-pc-solaris* | *-linux-android*) - AC_DEFINE(FFI_MMAP_EXEC_WRIT, 1, - [Cannot use malloc on this target, so, we revert to - alternative means]) - ;; -esac -AM_CONDITIONAL(FFI_EXEC_TRAMPOLINE_TABLE, test x$FFI_EXEC_TRAMPOLINE_TABLE = x1) -AC_SUBST(FFI_EXEC_TRAMPOLINE_TABLE) - -if test x$TARGET = xX86_64; then - AC_CACHE_CHECK([toolchain supports unwind section type], - libffi_cv_as_x86_64_unwind_section_type, [ - cat > conftest1.s << EOF -.text -.globl foo -foo: -jmp bar -.section .eh_frame,"a",@unwind -bar: -EOF - - cat > conftest2.c << EOF -extern void foo(); -int main(){foo();} -EOF - - libffi_cv_as_x86_64_unwind_section_type=no - # we ensure that we can compile _and_ link an assembly file containing an @unwind section - # since the compiler can support it and not the linker (ie old binutils) - if $CC -Wa,--fatal-warnings $CFLAGS -c conftest1.s > /dev/null 2>&1 && \ - $CC conftest2.c conftest1.o > /dev/null 2>&1 ; then - libffi_cv_as_x86_64_unwind_section_type=yes - fi - ]) - if test "x$libffi_cv_as_x86_64_unwind_section_type" = xyes; then - AC_DEFINE(HAVE_AS_X86_64_UNWIND_SECTION_TYPE, 1, - [Define if your assembler supports unwind section type.]) - fi -fi - -if test "x$GCC" = "xyes"; then - AX_CHECK_COMPILE_FLAG(-fno-lto, libffi_cv_no_lto=-fno-lto) - - AC_CACHE_CHECK([whether .eh_frame section should be read-only], - libffi_cv_ro_eh_frame, [ - libffi_cv_ro_eh_frame=yes - echo 'extern void foo (void); void bar (void) { foo (); foo (); }' > conftest.c - if $CC $CFLAGS -c -fpic -fexceptions $libffi_cv_no_lto -o conftest.o conftest.c > /dev/null 2>&1; then - if readelf -WS conftest.o | grep -q -n 'eh_frame .* WA'; then - libffi_cv_ro_eh_frame=no - fi - fi - rm -f conftest.* - ]) - if test "x$libffi_cv_ro_eh_frame" = xyes; then - AC_DEFINE(HAVE_RO_EH_FRAME, 1, - [Define if .eh_frame sections should be read-only.]) - AC_DEFINE(EH_FRAME_FLAGS, "a", - [Define to the flags needed for the .section .eh_frame directive. ]) - else - AC_DEFINE(EH_FRAME_FLAGS, "aw", - [Define to the flags needed for the .section .eh_frame directive. ]) - fi - - AC_CACHE_CHECK([for __attribute__((visibility("hidden")))], - libffi_cv_hidden_visibility_attribute, [ - echo 'int __attribute__ ((visibility ("hidden"))) foo (void) { return 1 ; }' > conftest.c - libffi_cv_hidden_visibility_attribute=no - if AC_TRY_COMMAND(${CC-cc} -Werror -S conftest.c -o conftest.s 1>&AS_MESSAGE_LOG_FD); then - if egrep '(\.hidden|\.private_extern).*foo' conftest.s >/dev/null; then - libffi_cv_hidden_visibility_attribute=yes - fi - fi - rm -f conftest.* - ]) - if test $libffi_cv_hidden_visibility_attribute = yes; then - AC_DEFINE(HAVE_HIDDEN_VISIBILITY_ATTRIBUTE, 1, - [Define if __attribute__((visibility("hidden"))) is supported.]) - fi -fi - -AC_ARG_ENABLE(docs, - AC_HELP_STRING([--disable-docs], - [Disable building of docs (default: no)]), - [enable_docs=no], - [enable_docs=yes]) -AM_CONDITIONAL(BUILD_DOCS, [test x$enable_docs = xyes]) - -AH_BOTTOM([ -#ifdef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE -#ifdef LIBFFI_ASM -#ifdef __APPLE__ -#define FFI_HIDDEN(name) .private_extern name -#else -#define FFI_HIDDEN(name) .hidden name -#endif -#else -#define FFI_HIDDEN __attribute__ ((visibility ("hidden"))) -#endif -#else -#ifdef LIBFFI_ASM -#define FFI_HIDDEN(name) -#else -#define FFI_HIDDEN -#endif -#endif -]) - -AC_SUBST(TARGET) -AC_SUBST(TARGETDIR) - -changequote(<,>) -TARGET_OBJ= -for i in $SOURCES; do - TARGET_OBJ="${TARGET_OBJ} src/${TARGETDIR}/"`echo $i | sed 's/[cS]$/lo/'` -done -changequote([,]) -AC_SUBST(TARGET_OBJ) - -AC_SUBST(SHELL) - -AC_ARG_ENABLE(debug, -[ --enable-debug debugging mode], - if test "$enable_debug" = "yes"; then - AC_DEFINE(FFI_DEBUG, 1, [Define this if you want extra debugging.]) - fi) -AM_CONDITIONAL(FFI_DEBUG, test "$enable_debug" = "yes") - -AC_ARG_ENABLE(structs, -[ --disable-structs omit code for struct support], - if test "$enable_structs" = "no"; then - AC_DEFINE(FFI_NO_STRUCTS, 1, [Define this if you do not want support for aggregate types.]) - fi) -AM_CONDITIONAL(FFI_DEBUG, test "$enable_debug" = "yes") - -AC_ARG_ENABLE(raw-api, -[ --disable-raw-api make the raw api unavailable], - if test "$enable_raw_api" = "no"; then - AC_DEFINE(FFI_NO_RAW_API, 1, [Define this if you do not want support for the raw API.]) - fi) - -AC_ARG_ENABLE(purify-safety, -[ --enable-purify-safety purify-safe mode], - if test "$enable_purify_safety" = "yes"; then - AC_DEFINE(USING_PURIFY, 1, [Define this if you are using Purify and want to suppress spurious messages.]) - fi) - -AC_ARG_ENABLE(multi-os-directory, -[ --disable-multi-os-directory - disable use of gcc --print-multi-os-directory to change the library installation directory]) - -# These variables are only ever used when we cross-build to X86_WIN32. -# And we only support this with GCC, so... -if test "x$GCC" = "xyes"; then - if test -n "$with_cross_host" && - test x"$with_cross_host" != x"no"; then - toolexecdir='${exec_prefix}'/'$(target_alias)' - toolexeclibdir='${toolexecdir}'/lib - else - toolexecdir='${libdir}'/gcc-lib/'$(target_alias)' - toolexeclibdir='${libdir}' - fi - if test x"$enable_multi_os_directory" != x"no"; then - multi_os_directory=`$CC $CFLAGS -print-multi-os-directory` - case $multi_os_directory in - .) ;; # Avoid trailing /. - ../*) toolexeclibdir=$toolexeclibdir/$multi_os_directory ;; - esac - fi - AC_SUBST(toolexecdir) -else - toolexeclibdir='${libdir}' -fi -AC_SUBST(toolexeclibdir) - -# Check linker support. -LIBFFI_ENABLE_SYMVERS - -AC_CONFIG_COMMANDS(include, [test -d include || mkdir include]) -AC_CONFIG_COMMANDS(src, [ -test -d src || mkdir src -test -d src/$TARGETDIR || mkdir src/$TARGETDIR -], [TARGETDIR="$TARGETDIR"]) - -AC_CONFIG_FILES(include/Makefile include/ffi.h Makefile testsuite/Makefile man/Makefile doc/Makefile libffi.pc) - -AC_OUTPUT - -# Copy this file instead of using AC_CONFIG_LINK in order to support -# compiling with MSVC, which won't understand cygwin style symlinks. -cp ${srcdir}/src/$TARGETDIR/ffitarget.h include/ffitarget.h diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/configure.host b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/configure.host deleted file mode 100644 index 257b784..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/configure.host +++ /dev/null @@ -1,318 +0,0 @@ -# configure.host -# -# This shell script handles all host based configuration for libffi. -# - -# THIS TABLE IS SORTED. KEEP IT THAT WAY. -# Most of the time we can define all the variables all at once... -case "${host}" in - aarch64*-*-cygwin* | aarch64*-*-mingw* | aarch64*-*-win* ) - TARGET=ARM_WIN64; TARGETDIR=aarch64 - if test "${ax_cv_c_compiler_vendor}" = "microsoft"; then - MSVC=1 - fi - ;; - - aarch64*-*-*) - TARGET=AARCH64; TARGETDIR=aarch64 - SOURCES="ffi.c sysv.S" - ;; - - alpha*-*-*) - TARGET=ALPHA; TARGETDIR=alpha; - # Support 128-bit long double, changeable via command-line switch. - HAVE_LONG_DOUBLE='defined(__LONG_DOUBLE_128__)' - SOURCES="ffi.c osf.S" - ;; - - arc*-*-*) - TARGET=ARC; TARGETDIR=arc - SOURCES="ffi.c arcompact.S" - ;; - - arm*-*-cygwin* | arm*-*-mingw* | arm*-*-win* ) - TARGET=ARM_WIN32; TARGETDIR=arm - MSVC=1 - ;; - - arm*-*-*) - TARGET=ARM; TARGETDIR=arm - SOURCES="ffi.c sysv.S" - ;; - - avr32*-*-*) - TARGET=AVR32; TARGETDIR=avr32 - SOURCES="ffi.c sysv.S" - ;; - - bfin*) - TARGET=BFIN; TARGETDIR=bfin - SOURCES="ffi.c sysv.S" - ;; - - cris-*-*) - TARGET=LIBFFI_CRIS; TARGETDIR=cris - SOURCES="ffi.c sysv.S" - ;; - - csky-*-*) - TARGET=CSKY; TARGETDIR=csky - SOURCES="ffi.c sysv.S" - ;; - - frv-*-*) - TARGET=FRV; TARGETDIR=frv - SOURCES="ffi.c eabi.S" - ;; - - hppa*-*-linux* | parisc*-*-linux* | hppa*-*-openbsd*) - TARGET=PA_LINUX; TARGETDIR=pa - SOURCES="ffi.c linux.S" - ;; - hppa*64-*-hpux*) - TARGET=PA64_HPUX; TARGETDIR=pa - ;; - hppa*-*-hpux*) - TARGET=PA_HPUX; TARGETDIR=pa - SOURCES="ffi.c hpux32.S" - ;; - - i?86-*-freebsd* | i?86-*-openbsd*) - TARGET=X86_FREEBSD; TARGETDIR=x86 - ;; - - i?86-*-cygwin* | i?86-*-mingw* | i?86-*-win* | i?86-*-os2* | i?86-*-interix* \ - | x86_64-*-cygwin* | x86_64-*-mingw* | x86_64-*-win* ) - TARGETDIR=x86 - if test $ac_cv_sizeof_size_t = 4; then - TARGET=X86_WIN32 - else - TARGET=X86_WIN64 - fi - if test "${ax_cv_c_compiler_vendor}" = "microsoft"; then - MSVC=1 - fi - # All mingw/cygwin/win32 builds require -no-undefined for sharedlib. - # We must also check with_cross_host to decide if this is a native - # or cross-build and select where to install dlls appropriately. - if test -n "$with_cross_host" && - test x"$with_cross_host" != x"no"; then - AM_LTLDFLAGS='-no-undefined -bindir "$(toolexeclibdir)"'; - else - AM_LTLDFLAGS='-no-undefined -bindir "$(bindir)"'; - fi - ;; - - i?86-*-darwin* | x86_64-*-darwin* | i?86-*-ios | x86_64-*-ios) - TARGETDIR=x86 - if test $ac_cv_sizeof_size_t = 4; then - TARGET=X86_DARWIN - else - TARGET=X86_64 - fi - ;; - - i?86-*-* | x86_64-*-* | amd64-*) - TARGETDIR=x86 - if test $ac_cv_sizeof_size_t = 4; then - echo 'int foo (void) { return __x86_64__; }' > conftest.c - if $CC $CFLAGS -Werror -S conftest.c -o conftest.s > /dev/null 2>&1; then - TARGET_X32=yes - TARGET=X86_64 - else - TARGET=X86; - fi - rm -f conftest.* - else - TARGET=X86_64; - fi - ;; - - ia64*-*-*) - TARGET=IA64; TARGETDIR=ia64 - SOURCES="ffi.c unix.S" - ;; - - kvx-*-*) - TARGET=KVX; TARGETDIR=kvx - SOURCES="ffi.c sysv.S" - ;; - - m32r*-*-*) - TARGET=M32R; TARGETDIR=m32r - SOURCES="ffi.c sysv.S" - ;; - - m68k-*-*) - TARGET=M68K; TARGETDIR=m68k - SOURCES="ffi.c sysv.S" - ;; - - m88k-*-*) - TARGET=M88K; TARGETDIR=m88k - SOURCES="ffi.c obsd.S" - ;; - - microblaze*-*-*) - TARGET=MICROBLAZE; TARGETDIR=microblaze - SOURCES="ffi.c sysv.S" - ;; - - moxie-*-*) - TARGET=MOXIE; TARGETDIR=moxie - SOURCES="ffi.c eabi.S" - ;; - - metag-*-*) - TARGET=METAG; TARGETDIR=metag - SOURCES="ffi.c sysv.S" - ;; - - mips-sgi-irix5.* | mips-sgi-irix6.* | mips*-*-rtems*) - TARGET=MIPS; TARGETDIR=mips - ;; - mips*-*linux* | mips*-*-openbsd* | mips*-*-freebsd*) - # Support 128-bit long double for NewABI. - HAVE_LONG_DOUBLE='defined(__mips64)' - TARGET=MIPS; TARGETDIR=mips - ;; - - nios2*-linux*) - TARGET=NIOS2; TARGETDIR=nios2 - SOURCES="ffi.c sysv.S" - ;; - - or1k*-*-*) - TARGET=OR1K; TARGETDIR=or1k - SOURCES="ffi.c sysv.S" - ;; - - powerpc*-*-linux* | powerpc-*-sysv*) - TARGET=POWERPC; TARGETDIR=powerpc - HAVE_LONG_DOUBLE_VARIANT=1 - ;; - powerpc-*-amigaos*) - TARGET=POWERPC; TARGETDIR=powerpc - ;; - powerpc-*-eabi*) - TARGET=POWERPC; TARGETDIR=powerpc - ;; - powerpc-*-beos*) - TARGET=POWERPC; TARGETDIR=powerpc - ;; - powerpc-*-darwin* | powerpc64-*-darwin*) - TARGET=POWERPC_DARWIN; TARGETDIR=powerpc - ;; - powerpc-*-aix* | rs6000-*-aix*) - TARGET=POWERPC_AIX; TARGETDIR=powerpc - ;; - powerpc-*-freebsd* | powerpc-*-openbsd* | powerpc-*-netbsd*) - TARGET=POWERPC_FREEBSD; TARGETDIR=powerpc - HAVE_LONG_DOUBLE_VARIANT=1 - ;; - powerpcspe-*-freebsd*) - TARGET=POWERPC_FREEBSD; TARGETDIR=powerpc - CFLAGS="$CFLAGS -D__NO_FPRS__" - ;; - powerpc64-*-freebsd* | powerpc64le-*-freebsd*) - TARGET=POWERPC; TARGETDIR=powerpc - ;; - powerpc*-*-rtems*) - TARGET=POWERPC; TARGETDIR=powerpc - ;; - - riscv*-*) - TARGET=RISCV; TARGETDIR=riscv - SOURCES="ffi.c sysv.S" - ;; - - s390-*-* | s390x-*-*) - TARGET=S390; TARGETDIR=s390 - SOURCES="ffi.c sysv.S" - ;; - - sh-*-* | sh[34]*-*-*) - TARGET=SH; TARGETDIR=sh - SOURCES="ffi.c sysv.S" - ;; - sh64-*-* | sh5*-*-*) - TARGET=SH64; TARGETDIR=sh64 - SOURCES="ffi.c sysv.S" - ;; - - sparc*-*-*) - TARGET=SPARC; TARGETDIR=sparc - SOURCES="ffi.c ffi64.c v8.S v9.S" - ;; - - tile*-*) - TARGET=TILE; TARGETDIR=tile - SOURCES="ffi.c tile.S" - ;; - - vax-*-*) - TARGET=VAX; TARGETDIR=vax - SOURCES="ffi.c elfbsd.S" - ;; - - xtensa*-*) - TARGET=XTENSA; TARGETDIR=xtensa - SOURCES="ffi.c sysv.S" - ;; -esac - -# ... but some of the cases above share configury. -case "${TARGET}" in - ARM_WIN32) - SOURCES="ffi.c sysv_msvc_arm32.S" - ;; - ARM_WIN64) - if test "$MSVC" = 1; then - SOURCES="ffi.c win64_armasm.S" - else - SOURCES="ffi.c sysv.S" - fi - ;; - MIPS) - SOURCES="ffi.c o32.S n32.S" - ;; - POWERPC) - SOURCES="ffi.c ffi_sysv.c ffi_linux64.c sysv.S ppc_closure.S" - SOURCES="${SOURCES} linux64.S linux64_closure.S" - ;; - POWERPC_AIX) - SOURCES="ffi_darwin.c aix.S aix_closure.S" - ;; - POWERPC_DARWIN) - SOURCES="ffi_darwin.c darwin.S darwin_closure.S" - ;; - POWERPC_FREEBSD) - SOURCES="ffi.c ffi_sysv.c sysv.S ppc_closure.S" - ;; - X86 | X86_DARWIN | X86_FREEBSD | X86_WIN32) - if test "$MSVC" = 1; then - SOURCES="ffi.c sysv_intel.S" - else - SOURCES="ffi.c sysv.S" - fi - ;; - X86_64) - if test x"$TARGET_X32" = xyes; then - SOURCES="ffi64.c unix64.S" - else - SOURCES="ffi64.c unix64.S ffiw64.c win64.S" - fi - ;; - X86_WIN64) - if test "$MSVC" = 1; then - SOURCES="ffiw64.c win64_intel.S" - else - SOURCES="ffiw64.c win64.S" - fi - ;; -esac - -# If we failed to configure SOURCES, we can't do anything. -if test -z "${SOURCES}"; then - UNSUPPORTED=1 -fi diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/doc/Makefile.am b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/doc/Makefile.am deleted file mode 100644 index 43b650a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/doc/Makefile.am +++ /dev/null @@ -1,3 +0,0 @@ -## Process this with automake to create Makefile.in - -info_TEXINFOS = libffi.texi diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/doc/libffi.texi b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/doc/libffi.texi deleted file mode 100644 index bd30593..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/doc/libffi.texi +++ /dev/null @@ -1,997 +0,0 @@ -\input texinfo @c -*-texinfo-*- -@c %**start of header -@setfilename libffi.info -@include version.texi -@settitle libffi: the portable foreign function interface library -@setchapternewpage off -@c %**end of header - -@c Merge the standard indexes into a single one. -@syncodeindex fn cp -@syncodeindex vr cp -@syncodeindex ky cp -@syncodeindex pg cp -@syncodeindex tp cp - -@copying - -This manual is for libffi, a portable foreign function interface -library. - -Copyright @copyright{} 2008--2019 Anthony Green and Red Hat, Inc. - -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. - -@end copying - -@dircategory Development -@direntry -* libffi: (libffi). Portable foreign function interface library. -@end direntry - -@titlepage -@title libffi: a foreign function interface library -@subtitle For Version @value{VERSION} of libffi -@author Anthony Green -@page -@vskip 0pt plus 1filll -@insertcopying -@end titlepage - - -@ifnottex -@node Top -@top libffi - -@insertcopying - -@menu -* Introduction:: What is libffi? -* Using libffi:: How to use libffi. -* Missing Features:: Things libffi can't do. -* Index:: Index. -@end menu - -@end ifnottex - - -@node Introduction -@chapter What is libffi? - -Compilers for high level languages generate code that follow certain -conventions. These conventions are necessary, in part, for separate -compilation to work. One such convention is the @dfn{calling -convention}. The calling convention is a set of assumptions made by -the compiler about where function arguments will be found on entry to -a function. A calling convention also specifies where the return -value for a function is found. The calling convention is also -sometimes called the @dfn{ABI} or @dfn{Application Binary Interface}. -@cindex calling convention -@cindex ABI -@cindex Application Binary Interface - -Some programs may not know at the time of compilation what arguments -are to be passed to a function. For instance, an interpreter may be -told at run-time about the number and types of arguments used to call -a given function. @samp{Libffi} can be used in such programs to -provide a bridge from the interpreter program to compiled code. - -The @samp{libffi} library provides a portable, high level programming -interface to various calling conventions. This allows a programmer to -call any function specified by a call interface description at run -time. - -@acronym{FFI} stands for Foreign Function Interface. A foreign -function interface is the popular name for the interface that allows -code written in one language to call code written in another language. -The @samp{libffi} library really only provides the lowest, machine -dependent layer of a fully featured foreign function interface. A -layer must exist above @samp{libffi} that handles type conversions for -values passed between the two languages. -@cindex FFI -@cindex Foreign Function Interface - - -@node Using libffi -@chapter Using libffi - -@menu -* The Basics:: The basic libffi API. -* Simple Example:: A simple example. -* Types:: libffi type descriptions. -* Multiple ABIs:: Different passing styles on one platform. -* The Closure API:: Writing a generic function. -* Closure Example:: A closure example. -* Thread Safety:: Thread safety. -@end menu - - -@node The Basics -@section The Basics - -@samp{Libffi} assumes that you have a pointer to the function you wish -to call and that you know the number and types of arguments to pass -it, as well as the return type of the function. - -The first thing you must do is create an @code{ffi_cif} object that -matches the signature of the function you wish to call. This is a -separate step because it is common to make multiple calls using a -single @code{ffi_cif}. The @dfn{cif} in @code{ffi_cif} stands for -Call InterFace. To prepare a call interface object, use the function -@code{ffi_prep_cif}. -@cindex cif - -@findex ffi_prep_cif -@defun ffi_status ffi_prep_cif (ffi_cif *@var{cif}, ffi_abi @var{abi}, unsigned int @var{nargs}, ffi_type *@var{rtype}, ffi_type **@var{argtypes}) -This initializes @var{cif} according to the given parameters. - -@var{abi} is the ABI to use; normally @code{FFI_DEFAULT_ABI} is what -you want. @ref{Multiple ABIs} for more information. - -@var{nargs} is the number of arguments that this function accepts. - -@var{rtype} is a pointer to an @code{ffi_type} structure that -describes the return type of the function. @xref{Types}. - -@var{argtypes} is a vector of @code{ffi_type} pointers. -@var{argtypes} must have @var{nargs} elements. If @var{nargs} is 0, -this argument is ignored. - -@code{ffi_prep_cif} returns a @code{libffi} status code, of type -@code{ffi_status}. This will be either @code{FFI_OK} if everything -worked properly; @code{FFI_BAD_TYPEDEF} if one of the @code{ffi_type} -objects is incorrect; or @code{FFI_BAD_ABI} if the @var{abi} parameter -is invalid. -@end defun - -If the function being called is variadic (varargs) then -@code{ffi_prep_cif_var} must be used instead of @code{ffi_prep_cif}. - -@findex ffi_prep_cif_var -@defun ffi_status ffi_prep_cif_var (ffi_cif *@var{cif}, ffi_abi @var{abi}, unsigned int @var{nfixedargs}, unsigned int @var{ntotalargs}, ffi_type *@var{rtype}, ffi_type **@var{argtypes}) -This initializes @var{cif} according to the given parameters for -a call to a variadic function. In general its operation is the -same as for @code{ffi_prep_cif} except that: - -@var{nfixedargs} is the number of fixed arguments, prior to any -variadic arguments. It must be greater than zero. - -@var{ntotalargs} the total number of arguments, including variadic -and fixed arguments. @var{argtypes} must have this many elements. - -Note that, different cif's must be prepped for calls to the same -function when different numbers of arguments are passed. - -Also note that a call to @code{ffi_prep_cif_var} with -@var{nfixedargs}=@var{nototalargs} is NOT equivalent to a call to -@code{ffi_prep_cif}. - -@end defun - -Note that the resulting @code{ffi_cif} holds pointers to all the -@code{ffi_type} objects that were used during initialization. You -must ensure that these type objects have a lifetime at least as long -as that of the @code{ffi_cif}. - -To call a function using an initialized @code{ffi_cif}, use the -@code{ffi_call} function: - -@findex ffi_call -@defun void ffi_call (ffi_cif *@var{cif}, void *@var{fn}, void *@var{rvalue}, void **@var{avalues}) -This calls the function @var{fn} according to the description given in -@var{cif}. @var{cif} must have already been prepared using -@code{ffi_prep_cif}. - -@var{rvalue} is a pointer to a chunk of memory that will hold the -result of the function call. This must be large enough to hold the -result, no smaller than the system register size (generally 32 or 64 -bits), and must be suitably aligned; it is the caller's responsibility -to ensure this. If @var{cif} declares that the function returns -@code{void} (using @code{ffi_type_void}), then @var{rvalue} is -ignored. - -In most situations, @samp{libffi} will handle promotion according to -the ABI. However, for historical reasons, there is a special case -with return values that must be handled by your code. In particular, -for integral (not @code{struct}) types that are narrower than the -system register size, the return value will be widened by -@samp{libffi}. @samp{libffi} provides a type, @code{ffi_arg}, that -can be used as the return type. For example, if the CIF was defined -with a return type of @code{char}, @samp{libffi} will try to store a -full @code{ffi_arg} into the return value. - -@var{avalues} is a vector of @code{void *} pointers that point to the -memory locations holding the argument values for a call. If @var{cif} -declares that the function has no arguments (i.e., @var{nargs} was 0), -then @var{avalues} is ignored. Note that argument values may be -modified by the callee (for instance, structs passed by value); the -burden of copying pass-by-value arguments is placed on the caller. - -Note that while the return value must be register-sized, arguments -should exactly match their declared type. For example, if an argument -is a @code{short}, then the entry in @var{avalues} should point to an -object declared as @code{short}; but if the return type is -@code{short}, then @var{rvalue} should point to an object declared as -a larger type -- usually @code{ffi_arg}. -@end defun - - -@node Simple Example -@section Simple Example - -Here is a trivial example that calls @code{puts} a few times. - -@example -#include -#include - -int main() -@{ - ffi_cif cif; - ffi_type *args[1]; - void *values[1]; - char *s; - ffi_arg rc; - - /* Initialize the argument info vectors */ - args[0] = &ffi_type_pointer; - values[0] = &s; - - /* Initialize the cif */ - if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_sint, args) == FFI_OK) - @{ - s = "Hello World!"; - ffi_call(&cif, puts, &rc, values); - /* rc now holds the result of the call to puts */ - - /* values holds a pointer to the function's arg, so to - call puts() again all we need to do is change the - value of s */ - s = "This is cool!"; - ffi_call(&cif, puts, &rc, values); - @} - - return 0; -@} -@end example - - -@node Types -@section Types - -@menu -* Primitive Types:: Built-in types. -* Structures:: Structure types. -* Size and Alignment:: Size and alignment of types. -* Arrays Unions Enums:: Arrays, unions, and enumerations. -* Type Example:: Structure type example. -* Complex:: Complex types. -* Complex Type Example:: Complex type example. -@end menu - -@node Primitive Types -@subsection Primitive Types - -@code{Libffi} provides a number of built-in type descriptors that can -be used to describe argument and return types: - -@table @code -@item ffi_type_void -@tindex ffi_type_void -The type @code{void}. This cannot be used for argument types, only -for return values. - -@item ffi_type_uint8 -@tindex ffi_type_uint8 -An unsigned, 8-bit integer type. - -@item ffi_type_sint8 -@tindex ffi_type_sint8 -A signed, 8-bit integer type. - -@item ffi_type_uint16 -@tindex ffi_type_uint16 -An unsigned, 16-bit integer type. - -@item ffi_type_sint16 -@tindex ffi_type_sint16 -A signed, 16-bit integer type. - -@item ffi_type_uint32 -@tindex ffi_type_uint32 -An unsigned, 32-bit integer type. - -@item ffi_type_sint32 -@tindex ffi_type_sint32 -A signed, 32-bit integer type. - -@item ffi_type_uint64 -@tindex ffi_type_uint64 -An unsigned, 64-bit integer type. - -@item ffi_type_sint64 -@tindex ffi_type_sint64 -A signed, 64-bit integer type. - -@item ffi_type_float -@tindex ffi_type_float -The C @code{float} type. - -@item ffi_type_double -@tindex ffi_type_double -The C @code{double} type. - -@item ffi_type_uchar -@tindex ffi_type_uchar -The C @code{unsigned char} type. - -@item ffi_type_schar -@tindex ffi_type_schar -The C @code{signed char} type. (Note that there is not an exact -equivalent to the C @code{char} type in @code{libffi}; ordinarily you -should either use @code{ffi_type_schar} or @code{ffi_type_uchar} -depending on whether @code{char} is signed.) - -@item ffi_type_ushort -@tindex ffi_type_ushort -The C @code{unsigned short} type. - -@item ffi_type_sshort -@tindex ffi_type_sshort -The C @code{short} type. - -@item ffi_type_uint -@tindex ffi_type_uint -The C @code{unsigned int} type. - -@item ffi_type_sint -@tindex ffi_type_sint -The C @code{int} type. - -@item ffi_type_ulong -@tindex ffi_type_ulong -The C @code{unsigned long} type. - -@item ffi_type_slong -@tindex ffi_type_slong -The C @code{long} type. - -@item ffi_type_longdouble -@tindex ffi_type_longdouble -On platforms that have a C @code{long double} type, this is defined. -On other platforms, it is not. - -@item ffi_type_pointer -@tindex ffi_type_pointer -A generic @code{void *} pointer. You should use this for all -pointers, regardless of their real type. - -@item ffi_type_complex_float -@tindex ffi_type_complex_float -The C @code{_Complex float} type. - -@item ffi_type_complex_double -@tindex ffi_type_complex_double -The C @code{_Complex double} type. - -@item ffi_type_complex_longdouble -@tindex ffi_type_complex_longdouble -The C @code{_Complex long double} type. -On platforms that have a C @code{long double} type, this is defined. -On other platforms, it is not. -@end table - -Each of these is of type @code{ffi_type}, so you must take the address -when passing to @code{ffi_prep_cif}. - - -@node Structures -@subsection Structures - -@samp{libffi} is perfectly happy passing structures back and forth. -You must first describe the structure to @samp{libffi} by creating a -new @code{ffi_type} object for it. - -@tindex ffi_type -@deftp {Data type} ffi_type -The @code{ffi_type} has the following members: -@table @code -@item size_t size -This is set by @code{libffi}; you should initialize it to zero. - -@item unsigned short alignment -This is set by @code{libffi}; you should initialize it to zero. - -@item unsigned short type -For a structure, this should be set to @code{FFI_TYPE_STRUCT}. - -@item ffi_type **elements -This is a @samp{NULL}-terminated array of pointers to @code{ffi_type} -objects. There is one element per field of the struct. - -Note that @samp{libffi} has no special support for bit-fields. You -must manage these manually. -@end table -@end deftp - -The @code{size} and @code{alignment} fields will be filled in by -@code{ffi_prep_cif} or @code{ffi_prep_cif_var}, as needed. - -@node Size and Alignment -@subsection Size and Alignment - -@code{libffi} will set the @code{size} and @code{alignment} fields of -an @code{ffi_type} object for you. It does so using its knowledge of -the ABI. - -You might expect that you can simply read these fields for a type that -has been laid out by @code{libffi}. However, there are some caveats. - -@itemize @bullet -@item -The size or alignment of some of the built-in types may vary depending -on the chosen ABI. - -@item -The size and alignment of a new structure type will not be set by -@code{libffi} until it has been passed to @code{ffi_prep_cif} or -@code{ffi_get_struct_offsets}. - -@item -A structure type cannot be shared across ABIs. Instead each ABI needs -its own copy of the structure type. -@end itemize - -So, before examining these fields, it is safest to pass the -@code{ffi_type} object to @code{ffi_prep_cif} or -@code{ffi_get_struct_offsets} first. This function will do all the -needed setup. - -@example -ffi_type *desired_type; -ffi_abi desired_abi; -@dots{} -ffi_cif cif; -if (ffi_prep_cif (&cif, desired_abi, 0, desired_type, NULL) == FFI_OK) - @{ - size_t size = desired_type->size; - unsigned short alignment = desired_type->alignment; - @} -@end example - -@code{libffi} also provides a way to get the offsets of the members of -a structure. - -@findex ffi_get_struct_offsets -@defun ffi_status ffi_get_struct_offsets (ffi_abi abi, ffi_type *struct_type, size_t *offsets) -Compute the offset of each element of the given structure type. -@var{abi} is the ABI to use; this is needed because in some cases the -layout depends on the ABI. - -@var{offsets} is an out parameter. The caller is responsible for -providing enough space for all the results to be written -- one -element per element type in @var{struct_type}. If @var{offsets} is -@code{NULL}, then the type will be laid out but not otherwise -modified. This can be useful for accessing the type's size or layout, -as mentioned above. - -This function returns @code{FFI_OK} on success; @code{FFI_BAD_ABI} if -@var{abi} is invalid; or @code{FFI_BAD_TYPEDEF} if @var{struct_type} -is invalid in some way. Note that only @code{FFI_STRUCT} types are -valid here. -@end defun - -@node Arrays Unions Enums -@subsection Arrays, Unions, and Enumerations - -@subsubsection Arrays - -@samp{libffi} does not have direct support for arrays or unions. -However, they can be emulated using structures. - -To emulate an array, simply create an @code{ffi_type} using -@code{FFI_TYPE_STRUCT} with as many members as there are elements in -the array. - -@example -ffi_type array_type; -ffi_type **elements -int i; - -elements = malloc ((n + 1) * sizeof (ffi_type *)); -for (i = 0; i < n; ++i) - elements[i] = array_element_type; -elements[n] = NULL; - -array_type.size = array_type.alignment = 0; -array_type.type = FFI_TYPE_STRUCT; -array_type.elements = elements; -@end example - -Note that arrays cannot be passed or returned by value in C -- -structure types created like this should only be used to refer to -members of real @code{FFI_TYPE_STRUCT} objects. - -However, a phony array type like this will not cause any errors from -@samp{libffi} if you use it as an argument or return type. This may -be confusing. - -@subsubsection Unions - -A union can also be emulated using @code{FFI_TYPE_STRUCT}. In this -case, however, you must make sure that the size and alignment match -the real requirements of the union. - -One simple way to do this is to ensue that each element type is laid -out. Then, give the new structure type a single element; the size of -the largest element; and the largest alignment seen as well. - -This example uses the @code{ffi_prep_cif} trick to ensure that each -element type is laid out. - -@example -ffi_abi desired_abi; -ffi_type union_type; -ffi_type **union_elements; - -int i; -ffi_type element_types[2]; - -element_types[1] = NULL; - -union_type.size = union_type.alignment = 0; -union_type.type = FFI_TYPE_STRUCT; -union_type.elements = element_types; - -for (i = 0; union_elements[i]; ++i) - @{ - ffi_cif cif; - if (ffi_prep_cif (&cif, desired_abi, 0, union_elements[i], NULL) == FFI_OK) - @{ - if (union_elements[i]->size > union_type.size) - @{ - union_type.size = union_elements[i]; - size = union_elements[i]->size; - @} - if (union_elements[i]->alignment > union_type.alignment) - union_type.alignment = union_elements[i]->alignment; - @} - @} -@end example - -@subsubsection Enumerations - -@code{libffi} does not have any special support for C @code{enum}s. -Although any given @code{enum} is implemented using a specific -underlying integral type, exactly which type will be used cannot be -determined by @code{libffi} -- it may depend on the values in the -enumeration or on compiler flags such as @option{-fshort-enums}. -@xref{Structures unions enumerations and bit-fields implementation, , , gcc}, -for more information about how GCC handles enumerations. - -@node Type Example -@subsection Type Example - -The following example initializes a @code{ffi_type} object -representing the @code{tm} struct from Linux's @file{time.h}. - -Here is how the struct is defined: - -@example -struct tm @{ - int tm_sec; - int tm_min; - int tm_hour; - int tm_mday; - int tm_mon; - int tm_year; - int tm_wday; - int tm_yday; - int tm_isdst; - /* Those are for future use. */ - long int __tm_gmtoff__; - __const char *__tm_zone__; -@}; -@end example - -Here is the corresponding code to describe this struct to -@code{libffi}: - -@example - @{ - ffi_type tm_type; - ffi_type *tm_type_elements[12]; - int i; - - tm_type.size = tm_type.alignment = 0; - tm_type.type = FFI_TYPE_STRUCT; - tm_type.elements = &tm_type_elements; - - for (i = 0; i < 9; i++) - tm_type_elements[i] = &ffi_type_sint; - - tm_type_elements[9] = &ffi_type_slong; - tm_type_elements[10] = &ffi_type_pointer; - tm_type_elements[11] = NULL; - - /* tm_type can now be used to represent tm argument types and - return types for ffi_prep_cif() */ - @} -@end example - -@node Complex -@subsection Complex Types - -@samp{libffi} supports the complex types defined by the C99 -standard (@code{_Complex float}, @code{_Complex double} and -@code{_Complex long double} with the built-in type descriptors -@code{ffi_type_complex_float}, @code{ffi_type_complex_double} and -@code{ffi_type_complex_longdouble}. - -Custom complex types like @code{_Complex int} can also be used. -An @code{ffi_type} object has to be defined to describe the -complex type to @samp{libffi}. - -@tindex ffi_type -@deftp {Data type} ffi_type -@table @code -@item size_t size -This must be manually set to the size of the complex type. - -@item unsigned short alignment -This must be manually set to the alignment of the complex type. - -@item unsigned short type -For a complex type, this must be set to @code{FFI_TYPE_COMPLEX}. - -@item ffi_type **elements - -This is a @samp{NULL}-terminated array of pointers to -@code{ffi_type} objects. The first element is set to the -@code{ffi_type} of the complex's base type. The second element -must be set to @code{NULL}. -@end table -@end deftp - -The section @ref{Complex Type Example} shows a way to determine -the @code{size} and @code{alignment} members in a platform -independent way. - -For platforms that have no complex support in @code{libffi} yet, -the functions @code{ffi_prep_cif} and @code{ffi_prep_args} abort -the program if they encounter a complex type. - -@node Complex Type Example -@subsection Complex Type Example - -This example demonstrates how to use complex types: - -@example -#include -#include -#include - -void complex_fn(_Complex float cf, - _Complex double cd, - _Complex long double cld) -@{ - printf("cf=%f+%fi\ncd=%f+%fi\ncld=%f+%fi\n", - (float)creal (cf), (float)cimag (cf), - (float)creal (cd), (float)cimag (cd), - (float)creal (cld), (float)cimag (cld)); -@} - -int main() -@{ - ffi_cif cif; - ffi_type *args[3]; - void *values[3]; - _Complex float cf; - _Complex double cd; - _Complex long double cld; - - /* Initialize the argument info vectors */ - args[0] = &ffi_type_complex_float; - args[1] = &ffi_type_complex_double; - args[2] = &ffi_type_complex_longdouble; - values[0] = &cf; - values[1] = &cd; - values[2] = &cld; - - /* Initialize the cif */ - if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, - &ffi_type_void, args) == FFI_OK) - @{ - cf = 1.0 + 20.0 * I; - cd = 300.0 + 4000.0 * I; - cld = 50000.0 + 600000.0 * I; - /* Call the function */ - ffi_call(&cif, (void (*)(void))complex_fn, 0, values); - @} - - return 0; -@} -@end example - -This is an example for defining a custom complex type descriptor -for compilers that support them: - -@example -/* - * This macro can be used to define new complex type descriptors - * in a platform independent way. - * - * name: Name of the new descriptor is ffi_type_complex_. - * type: The C base type of the complex type. - */ -#define FFI_COMPLEX_TYPEDEF(name, type, ffitype) \ - static ffi_type *ffi_elements_complex_##name [2] = @{ \ - (ffi_type *)(&ffitype), NULL \ - @}; \ - struct struct_align_complex_##name @{ \ - char c; \ - _Complex type x; \ - @}; \ - ffi_type ffi_type_complex_##name = @{ \ - sizeof(_Complex type), \ - offsetof(struct struct_align_complex_##name, x), \ - FFI_TYPE_COMPLEX, \ - (ffi_type **)ffi_elements_complex_##name \ - @} - -/* Define new complex type descriptors using the macro: */ -/* ffi_type_complex_sint */ -FFI_COMPLEX_TYPEDEF(sint, int, ffi_type_sint); -/* ffi_type_complex_uchar */ -FFI_COMPLEX_TYPEDEF(uchar, unsigned char, ffi_type_uint8); -@end example - -The new type descriptors can then be used like one of the built-in -type descriptors in the previous example. - -@node Multiple ABIs -@section Multiple ABIs - -A given platform may provide multiple different ABIs at once. For -instance, the x86 platform has both @samp{stdcall} and @samp{fastcall} -functions. - -@code{libffi} provides some support for this. However, this is -necessarily platform-specific. - -@c FIXME: document the platforms - -@node The Closure API -@section The Closure API - -@code{libffi} also provides a way to write a generic function -- a -function that can accept and decode any combination of arguments. -This can be useful when writing an interpreter, or to provide wrappers -for arbitrary functions. - -This facility is called the @dfn{closure API}. Closures are not -supported on all platforms; you can check the @code{FFI_CLOSURES} -define to determine whether they are supported on the current -platform. -@cindex closures -@cindex closure API -@findex FFI_CLOSURES - -Because closures work by assembling a tiny function at runtime, they -require special allocation on platforms that have a non-executable -heap. Memory management for closures is handled by a pair of -functions: - -@findex ffi_closure_alloc -@defun void *ffi_closure_alloc (size_t @var{size}, void **@var{code}) -Allocate a chunk of memory holding @var{size} bytes. This returns a -pointer to the writable address, and sets *@var{code} to the -corresponding executable address. - -@var{size} should be sufficient to hold a @code{ffi_closure} object. -@end defun - -@findex ffi_closure_free -@defun void ffi_closure_free (void *@var{writable}) -Free memory allocated using @code{ffi_closure_alloc}. The argument is -the writable address that was returned. -@end defun - - -Once you have allocated the memory for a closure, you must construct a -@code{ffi_cif} describing the function call. Finally you can prepare -the closure function: - -@findex ffi_prep_closure_loc -@defun ffi_status ffi_prep_closure_loc (ffi_closure *@var{closure}, ffi_cif *@var{cif}, void (*@var{fun}) (ffi_cif *@var{cif}, void *@var{ret}, void **@var{args}, void *@var{user_data}), void *@var{user_data}, void *@var{codeloc}) -Prepare a closure function. The arguments to -@code{ffi_prep_closure_loc} are: - -@table @var -@item closure -The address of a @code{ffi_closure} object; this is the writable -address returned by @code{ffi_closure_alloc}. - -@item cif -The @code{ffi_cif} describing the function parameters. Note that this -object, and the types to which it refers, must be kept alive until the -closure itself is freed. - -@item user_data -An arbitrary datum that is passed, uninterpreted, to your closure -function. - -@item codeloc -The executable address returned by @code{ffi_closure_alloc}. - -@item fun -The function which will be called when the closure is invoked. It is -called with the arguments: - -@table @var -@item cif -The @code{ffi_cif} passed to @code{ffi_prep_closure_loc}. - -@item ret -A pointer to the memory used for the function's return value. - -If the function is declared as returning @code{void}, then this value -is garbage and should not be used. - -Otherwise, @var{fun} must fill the object to which this points, -following the same special promotion behavior as @code{ffi_call}. -That is, in most cases, @var{ret} points to an object of exactly the -size of the type specified when @var{cif} was constructed. However, -integral types narrower than the system register size are widened. In -these cases your program may assume that @var{ret} points to an -@code{ffi_arg} object. - -@item args -A vector of pointers to memory holding the arguments to the function. - -@item user_data -The same @var{user_data} that was passed to -@code{ffi_prep_closure_loc}. -@end table -@end table - -@code{ffi_prep_closure_loc} will return @code{FFI_OK} if everything -went ok, and one of the other @code{ffi_status} values on error. - -After calling @code{ffi_prep_closure_loc}, you can cast @var{codeloc} -to the appropriate pointer-to-function type. -@end defun - -You may see old code referring to @code{ffi_prep_closure}. This -function is deprecated, as it cannot handle the need for separate -writable and executable addresses. - -@node Closure Example -@section Closure Example - -A trivial example that creates a new @code{puts} by binding -@code{fputs} with @code{stdout}. - -@example -#include -#include - -/* Acts like puts with the file given at time of enclosure. */ -void puts_binding(ffi_cif *cif, void *ret, void* args[], - void *stream) -@{ - *(ffi_arg *)ret = fputs(*(char **)args[0], (FILE *)stream); -@} - -typedef int (*puts_t)(char *); - -int main() -@{ - ffi_cif cif; - ffi_type *args[1]; - ffi_closure *closure; - - void *bound_puts; - int rc; - - /* Allocate closure and bound_puts */ - closure = ffi_closure_alloc(sizeof(ffi_closure), &bound_puts); - - if (closure) - @{ - /* Initialize the argument info vectors */ - args[0] = &ffi_type_pointer; - - /* Initialize the cif */ - if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_sint, args) == FFI_OK) - @{ - /* Initialize the closure, setting stream to stdout */ - if (ffi_prep_closure_loc(closure, &cif, puts_binding, - stdout, bound_puts) == FFI_OK) - @{ - rc = ((puts_t)bound_puts)("Hello World!"); - /* rc now holds the result of the call to fputs */ - @} - @} - @} - - /* Deallocate both closure, and bound_puts */ - ffi_closure_free(closure); - - return 0; -@} - -@end example - -@node Thread Safety -@section Thread Safety - -@code{libffi} is not completely thread-safe. However, many parts are, -and if you follow some simple rules, you can use it safely in a -multi-threaded program. - -@itemize @bullet -@item -@code{ffi_prep_cif} may modify the @code{ffi_type} objects passed to -it. It is best to ensure that only a single thread prepares a given -@code{ffi_cif} at a time. - -@item -On some platforms, @code{ffi_prep_cif} may modify the size and -alignment of some types, depending on the chosen ABI. On these -platforms, if you switch between ABIs, you must ensure that there is -only one call to @code{ffi_prep_cif} at a time. - -Currently the only affected platform is PowerPC and the only affected -type is @code{long double}. -@end itemize - -@node Missing Features -@chapter Missing Features - -@code{libffi} is missing a few features. We welcome patches to add -support for these. - -@itemize @bullet -@item -Variadic closures. - -@item -There is no support for bit fields in structures. - -@item -The ``raw'' API is undocumented. -@c anything else? - -@item -The Go API is undocumented. -@end itemize - -Note that variadic support is very new and tested on a relatively -small number of platforms. - -@node Index -@unnumbered Index - -@printindex cp - -@bye diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/doc/version.texi b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/doc/version.texi deleted file mode 100644 index d9d5094..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/doc/version.texi +++ /dev/null @@ -1,4 +0,0 @@ -@set UPDATED 22 November 2019 -@set UPDATED-MONTH November 2019 -@set EDITION 3.3 -@set VERSION 3.3 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/generate-darwin-source-and-headers.py b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/generate-darwin-source-and-headers.py deleted file mode 100755 index 516464f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +++ /dev/null @@ -1,201 +0,0 @@ -#!/usr/bin/env python -import subprocess -import os -import errno -import collections -import glob -import argparse - -class Platform(object): - pass - -class simulator_platform(Platform): - directory = 'darwin_ios' - sdk = 'iphonesimulator' - arch = 'i386' - triple = 'i386-apple-darwin11' - version_min = '-miphoneos-version-min=7.0' - - prefix = "#ifdef __i386__\n\n" - suffix = "\n\n#endif" - src_dir = 'x86' - src_files = ['sysv.S', 'ffi.c', 'internal.h'] - - -class simulator64_platform(Platform): - directory = 'darwin_ios' - sdk = 'iphonesimulator' - arch = 'x86_64' - triple = 'x86_64-apple-darwin13' - version_min = '-miphoneos-version-min=7.0' - - prefix = "#ifdef __x86_64__\n\n" - suffix = "\n\n#endif" - src_dir = 'x86' - src_files = ['unix64.S', 'ffi64.c', 'ffiw64.c', 'win64.S', 'internal64.h', 'asmnames.h'] - - -class device_platform(Platform): - directory = 'darwin_ios' - sdk = 'iphoneos' - arch = 'armv7' - triple = 'arm-apple-darwin11' - version_min = '-miphoneos-version-min=7.0' - - prefix = "#ifdef __arm__\n\n" - suffix = "\n\n#endif" - src_dir = 'arm' - src_files = ['sysv.S', 'ffi.c', 'internal.h'] - - -class device64_platform(Platform): - directory = 'darwin_ios' - sdk = 'iphoneos' - arch = 'arm64' - triple = 'aarch64-apple-darwin13' - version_min = '-miphoneos-version-min=7.0' - - prefix = "#ifdef __arm64__\n\n" - suffix = "\n\n#endif" - src_dir = 'aarch64' - src_files = ['sysv.S', 'ffi.c', 'internal.h'] - - -class desktop32_platform(Platform): - directory = 'darwin_osx' - sdk = 'macosx' - arch = 'i386' - triple = 'i386-apple-darwin10' - version_min = '-mmacosx-version-min=10.6' - src_dir = 'x86' - src_files = ['sysv.S', 'ffi.c', 'internal.h'] - - prefix = "#ifdef __i386__\n\n" - suffix = "\n\n#endif" - - -class desktop64_platform(Platform): - directory = 'darwin_osx' - sdk = 'macosx' - arch = 'x86_64' - triple = 'x86_64-apple-darwin10' - version_min = '-mmacosx-version-min=10.6' - - prefix = "#ifdef __x86_64__\n\n" - suffix = "\n\n#endif" - src_dir = 'x86' - src_files = ['unix64.S', 'ffi64.c', 'ffiw64.c', 'win64.S', 'internal64.h', 'asmnames.h'] - - -def mkdir_p(path): - try: - os.makedirs(path) - except OSError as exc: # Python >2.5 - if exc.errno != errno.EEXIST: - raise - - -def move_file(src_dir, dst_dir, filename, file_suffix=None, prefix='', suffix=''): - mkdir_p(dst_dir) - out_filename = filename - - if file_suffix: - if filename in ['internal64.h', 'asmnames.h', 'internal.h']: - out_filename = filename - else: - split_name = os.path.splitext(filename) - out_filename = "%s_%s%s" % (split_name[0], file_suffix, split_name[1]) - - with open(os.path.join(src_dir, filename)) as in_file: - with open(os.path.join(dst_dir, out_filename), 'w') as out_file: - if prefix: - out_file.write(prefix) - - out_file.write(in_file.read()) - - if suffix: - out_file.write(suffix) - - -def list_files(src_dir, pattern=None, filelist=None): - if pattern: filelist = glob.iglob(os.path.join(src_dir, pattern)) - for file in filelist: - yield os.path.basename(file) - - -def copy_files(src_dir, dst_dir, pattern=None, filelist=None, file_suffix=None, prefix=None, suffix=None): - for filename in list_files(src_dir, pattern=pattern, filelist=filelist): - move_file(src_dir, dst_dir, filename, file_suffix=file_suffix, prefix=prefix, suffix=suffix) - - -def copy_src_platform_files(platform): - src_dir = os.path.join('src', platform.src_dir) - dst_dir = os.path.join(platform.directory, 'src', platform.src_dir) - copy_files(src_dir, dst_dir, filelist=platform.src_files, file_suffix=platform.arch, prefix=platform.prefix, suffix=platform.suffix) - - -def build_target(platform, platform_headers): - def xcrun_cmd(cmd): - return 'xcrun -sdk %s %s -arch %s' % (platform.sdk, cmd, platform.arch) - - tag='%s-%s' % (platform.sdk, platform.arch) - build_dir = 'build_%s' % tag - mkdir_p(build_dir) - env = dict(CC=xcrun_cmd('clang'), - LD=xcrun_cmd('ld'), - CFLAGS='%s -fembed-bitcode' % (platform.version_min)) - working_dir = os.getcwd() - try: - os.chdir(build_dir) - subprocess.check_call(['../configure', '-host', platform.triple], env=env) - finally: - os.chdir(working_dir) - - for src_dir in [build_dir, os.path.join(build_dir, 'include')]: - copy_files(src_dir, - os.path.join(platform.directory, 'include'), - pattern='*.h', - file_suffix=platform.arch, - prefix=platform.prefix, - suffix=platform.suffix) - - for filename in list_files(src_dir, pattern='*.h'): - platform_headers[filename].add((platform.prefix, platform.arch, platform.suffix)) - - -def generate_source_and_headers(generate_osx=True, generate_ios=True): - copy_files('src', 'darwin_common/src', pattern='*.c') - copy_files('include', 'darwin_common/include', pattern='*.h') - - if generate_ios: - copy_src_platform_files(simulator_platform) - copy_src_platform_files(simulator64_platform) - copy_src_platform_files(device_platform) - copy_src_platform_files(device64_platform) - if generate_osx: - copy_src_platform_files(desktop64_platform) - - platform_headers = collections.defaultdict(set) - - if generate_ios: - build_target(simulator_platform, platform_headers) - build_target(simulator64_platform, platform_headers) - build_target(device_platform, platform_headers) - build_target(device64_platform, platform_headers) - if generate_osx: - build_target(desktop64_platform, platform_headers) - - mkdir_p('darwin_common/include') - for header_name, tag_tuples in platform_headers.items(): - basename, suffix = os.path.splitext(header_name) - with open(os.path.join('darwin_common/include', header_name), 'w') as header: - for tag_tuple in tag_tuples: - header.write('%s#include <%s_%s%s>\n%s\n' % (tag_tuple[0], basename, tag_tuple[1], suffix, tag_tuple[2])) - -if __name__ == '__main__': - parser = argparse.ArgumentParser() - parser.add_argument('--only-ios', action='store_true', default=False) - parser.add_argument('--only-osx', action='store_true', default=False) - args = parser.parse_args() - - generate_source_and_headers(generate_osx=not args.only_ios, generate_ios=not args.only_osx) diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/include/Makefile.am b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/include/Makefile.am deleted file mode 100644 index c59df9f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/include/Makefile.am +++ /dev/null @@ -1,9 +0,0 @@ -## Process this with automake to create Makefile.in - -AUTOMAKE_OPTIONS=foreign - -DISTCLEANFILES=ffitarget.h -noinst_HEADERS=ffi_common.h ffi_cfi.h -EXTRA_DIST=ffi.h.in - -nodist_include_HEADERS = ffi.h ffitarget.h diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/include/ffi.h.in b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/include/ffi.h.in deleted file mode 100644 index 38885b0..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/include/ffi.h.in +++ /dev/null @@ -1,523 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - libffi @VERSION@ - Copyright (c) 2011, 2014, 2019 Anthony Green - - Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc. - - 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. - - ----------------------------------------------------------------------- */ - -/* ------------------------------------------------------------------- - Most of the API is documented in doc/libffi.texi. - - The raw API is designed to bypass some of the argument packing and - unpacking on architectures for which it can be avoided. Routines - are provided to emulate the raw API if the underlying platform - doesn't allow faster implementation. - - More details on the raw API can be found in: - - http://gcc.gnu.org/ml/java/1999-q3/msg00138.html - - and - - http://gcc.gnu.org/ml/java/1999-q3/msg00174.html - -------------------------------------------------------------------- */ - -#ifndef LIBFFI_H -#define LIBFFI_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Specify which architecture libffi is configured for. */ -#ifndef @TARGET@ -#define @TARGET@ -#endif - -/* ---- System configuration information --------------------------------- */ - -#include - -#ifndef LIBFFI_ASM - -#if defined(_MSC_VER) && !defined(__clang__) -#define __attribute__(X) -#endif - -#include -#include - -/* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example). - But we can find it either under the correct ANSI name, or under GNU - C's internal name. */ - -#define FFI_64_BIT_MAX 9223372036854775807 - -#ifdef LONG_LONG_MAX -# define FFI_LONG_LONG_MAX LONG_LONG_MAX -#else -# ifdef LLONG_MAX -# define FFI_LONG_LONG_MAX LLONG_MAX -# ifdef _AIX52 /* or newer has C99 LLONG_MAX */ -# undef FFI_64_BIT_MAX -# define FFI_64_BIT_MAX 9223372036854775807LL -# endif /* _AIX52 or newer */ -# else -# ifdef __GNUC__ -# define FFI_LONG_LONG_MAX __LONG_LONG_MAX__ -# endif -# ifdef _AIX /* AIX 5.1 and earlier have LONGLONG_MAX */ -# ifndef __PPC64__ -# if defined (__IBMC__) || defined (__IBMCPP__) -# define FFI_LONG_LONG_MAX LONGLONG_MAX -# endif -# endif /* __PPC64__ */ -# undef FFI_64_BIT_MAX -# define FFI_64_BIT_MAX 9223372036854775807LL -# endif -# endif -#endif - -/* The closure code assumes that this works on pointers, i.e. a size_t - can hold a pointer. */ - -typedef struct _ffi_type -{ - size_t size; - unsigned short alignment; - unsigned short type; - struct _ffi_type **elements; -} ffi_type; - -/* Need minimal decorations for DLLs to work on Windows. GCC has - autoimport and autoexport. Always mark externally visible symbols - as dllimport for MSVC clients, even if it means an extra indirection - when using the static version of the library. - Besides, as a workaround, they can define FFI_BUILDING if they - *know* they are going to link with the static library. */ -#if defined _MSC_VER -# if defined FFI_BUILDING_DLL /* Building libffi.DLL with msvcc.sh */ -# define FFI_API __declspec(dllexport) -# elif !defined FFI_BUILDING /* Importing libffi.DLL */ -# define FFI_API __declspec(dllimport) -# else /* Building/linking static library */ -# define FFI_API -# endif -#else -# define FFI_API -#endif - -/* The externally visible type declarations also need the MSVC DLL - decorations, or they will not be exported from the object file. */ -#if defined LIBFFI_HIDE_BASIC_TYPES -# define FFI_EXTERN FFI_API -#else -# define FFI_EXTERN extern FFI_API -#endif - -#ifndef LIBFFI_HIDE_BASIC_TYPES -#if SCHAR_MAX == 127 -# define ffi_type_uchar ffi_type_uint8 -# define ffi_type_schar ffi_type_sint8 -#else - #error "char size not supported" -#endif - -#if SHRT_MAX == 32767 -# define ffi_type_ushort ffi_type_uint16 -# define ffi_type_sshort ffi_type_sint16 -#elif SHRT_MAX == 2147483647 -# define ffi_type_ushort ffi_type_uint32 -# define ffi_type_sshort ffi_type_sint32 -#else - #error "short size not supported" -#endif - -#if INT_MAX == 32767 -# define ffi_type_uint ffi_type_uint16 -# define ffi_type_sint ffi_type_sint16 -#elif INT_MAX == 2147483647 -# define ffi_type_uint ffi_type_uint32 -# define ffi_type_sint ffi_type_sint32 -#elif INT_MAX == 9223372036854775807 -# define ffi_type_uint ffi_type_uint64 -# define ffi_type_sint ffi_type_sint64 -#else - #error "int size not supported" -#endif - -#if LONG_MAX == 2147483647 -# if FFI_LONG_LONG_MAX != FFI_64_BIT_MAX - #error "no 64-bit data type supported" -# endif -#elif LONG_MAX != FFI_64_BIT_MAX - #error "long size not supported" -#endif - -#if LONG_MAX == 2147483647 -# define ffi_type_ulong ffi_type_uint32 -# define ffi_type_slong ffi_type_sint32 -#elif LONG_MAX == FFI_64_BIT_MAX -# define ffi_type_ulong ffi_type_uint64 -# define ffi_type_slong ffi_type_sint64 -#else - #error "long size not supported" -#endif - -/* These are defined in types.c. */ -FFI_EXTERN ffi_type ffi_type_void; -FFI_EXTERN ffi_type ffi_type_uint8; -FFI_EXTERN ffi_type ffi_type_sint8; -FFI_EXTERN ffi_type ffi_type_uint16; -FFI_EXTERN ffi_type ffi_type_sint16; -FFI_EXTERN ffi_type ffi_type_uint32; -FFI_EXTERN ffi_type ffi_type_sint32; -FFI_EXTERN ffi_type ffi_type_uint64; -FFI_EXTERN ffi_type ffi_type_sint64; -FFI_EXTERN ffi_type ffi_type_float; -FFI_EXTERN ffi_type ffi_type_double; -FFI_EXTERN ffi_type ffi_type_pointer; - -#if @HAVE_LONG_DOUBLE@ -FFI_EXTERN ffi_type ffi_type_longdouble; -#else -#define ffi_type_longdouble ffi_type_double -#endif - -#ifdef FFI_TARGET_HAS_COMPLEX_TYPE -FFI_EXTERN ffi_type ffi_type_complex_float; -FFI_EXTERN ffi_type ffi_type_complex_double; -#if @HAVE_LONG_DOUBLE@ -FFI_EXTERN ffi_type ffi_type_complex_longdouble; -#else -#define ffi_type_complex_longdouble ffi_type_complex_double -#endif -#endif -#endif /* LIBFFI_HIDE_BASIC_TYPES */ - -typedef enum { - FFI_OK = 0, - FFI_BAD_TYPEDEF, - FFI_BAD_ABI -} ffi_status; - -typedef struct { - ffi_abi abi; - unsigned nargs; - ffi_type **arg_types; - ffi_type *rtype; - unsigned bytes; - unsigned flags; -#ifdef FFI_EXTRA_CIF_FIELDS - FFI_EXTRA_CIF_FIELDS; -#endif -} ffi_cif; - -/* ---- Definitions for the raw API -------------------------------------- */ - -#ifndef FFI_SIZEOF_ARG -# if LONG_MAX == 2147483647 -# define FFI_SIZEOF_ARG 4 -# elif LONG_MAX == FFI_64_BIT_MAX -# define FFI_SIZEOF_ARG 8 -# endif -#endif - -#ifndef FFI_SIZEOF_JAVA_RAW -# define FFI_SIZEOF_JAVA_RAW FFI_SIZEOF_ARG -#endif - -typedef union { - ffi_sarg sint; - ffi_arg uint; - float flt; - char data[FFI_SIZEOF_ARG]; - void* ptr; -} ffi_raw; - -#if FFI_SIZEOF_JAVA_RAW == 4 && FFI_SIZEOF_ARG == 8 -/* This is a special case for mips64/n32 ABI (and perhaps others) where - sizeof(void *) is 4 and FFI_SIZEOF_ARG is 8. */ -typedef union { - signed int sint; - unsigned int uint; - float flt; - char data[FFI_SIZEOF_JAVA_RAW]; - void* ptr; -} ffi_java_raw; -#else -typedef ffi_raw ffi_java_raw; -#endif - - -FFI_API -void ffi_raw_call (ffi_cif *cif, - void (*fn)(void), - void *rvalue, - ffi_raw *avalue); - -FFI_API void ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw); -FFI_API void ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args); -FFI_API size_t ffi_raw_size (ffi_cif *cif); - -/* This is analogous to the raw API, except it uses Java parameter - packing, even on 64-bit machines. I.e. on 64-bit machines longs - and doubles are followed by an empty 64-bit word. */ - -#if !FFI_NATIVE_RAW_API -FFI_API -void ffi_java_raw_call (ffi_cif *cif, - void (*fn)(void), - void *rvalue, - ffi_java_raw *avalue) __attribute__((deprecated)); -#endif - -FFI_API -void ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw) __attribute__((deprecated)); -FFI_API -void ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args) __attribute__((deprecated)); -FFI_API -size_t ffi_java_raw_size (ffi_cif *cif) __attribute__((deprecated)); - -/* ---- Definitions for closures ----------------------------------------- */ - -#if FFI_CLOSURES - -#ifdef _MSC_VER -__declspec(align(8)) -#endif -typedef struct { -#if @FFI_EXEC_TRAMPOLINE_TABLE@ - void *trampoline_table; - void *trampoline_table_entry; -#else - char tramp[FFI_TRAMPOLINE_SIZE]; -#endif - ffi_cif *cif; - void (*fun)(ffi_cif*,void*,void**,void*); - void *user_data; -} ffi_closure -#ifdef __GNUC__ - __attribute__((aligned (8))) -#endif - ; - -#ifndef __GNUC__ -# ifdef __sgi -# pragma pack 0 -# endif -#endif - -FFI_API void *ffi_closure_alloc (size_t size, void **code); -FFI_API void ffi_closure_free (void *); - -#if defined(PA_LINUX) || defined(PA_HPUX) -#define FFI_CLOSURE_PTR(X) ((void *)((unsigned int)(X) | 2)) -#define FFI_RESTORE_PTR(X) ((void *)((unsigned int)(X) & ~3)) -#else -#define FFI_CLOSURE_PTR(X) (X) -#define FFI_RESTORE_PTR(X) (X) -#endif - -FFI_API ffi_status -ffi_prep_closure (ffi_closure*, - ffi_cif *, - void (*fun)(ffi_cif*,void*,void**,void*), - void *user_data) -#if defined(__GNUC__) && (((__GNUC__ * 100) + __GNUC_MINOR__) >= 405) - __attribute__((deprecated ("use ffi_prep_closure_loc instead"))) -#elif defined(__GNUC__) && __GNUC__ >= 3 - __attribute__((deprecated)) -#endif - ; - -FFI_API ffi_status -ffi_prep_closure_loc (ffi_closure*, - ffi_cif *, - void (*fun)(ffi_cif*,void*,void**,void*), - void *user_data, - void*codeloc); - -#ifdef __sgi -# pragma pack 8 -#endif -typedef struct { -#if @FFI_EXEC_TRAMPOLINE_TABLE@ - void *trampoline_table; - void *trampoline_table_entry; -#else - char tramp[FFI_TRAMPOLINE_SIZE]; -#endif - ffi_cif *cif; - -#if !FFI_NATIVE_RAW_API - - /* If this is enabled, then a raw closure has the same layout - as a regular closure. We use this to install an intermediate - handler to do the transaltion, void** -> ffi_raw*. */ - - void (*translate_args)(ffi_cif*,void*,void**,void*); - void *this_closure; - -#endif - - void (*fun)(ffi_cif*,void*,ffi_raw*,void*); - void *user_data; - -} ffi_raw_closure; - -typedef struct { -#if @FFI_EXEC_TRAMPOLINE_TABLE@ - void *trampoline_table; - void *trampoline_table_entry; -#else - char tramp[FFI_TRAMPOLINE_SIZE]; -#endif - - ffi_cif *cif; - -#if !FFI_NATIVE_RAW_API - - /* If this is enabled, then a raw closure has the same layout - as a regular closure. We use this to install an intermediate - handler to do the translation, void** -> ffi_raw*. */ - - void (*translate_args)(ffi_cif*,void*,void**,void*); - void *this_closure; - -#endif - - void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*); - void *user_data; - -} ffi_java_raw_closure; - -FFI_API ffi_status -ffi_prep_raw_closure (ffi_raw_closure*, - ffi_cif *cif, - void (*fun)(ffi_cif*,void*,ffi_raw*,void*), - void *user_data); - -FFI_API ffi_status -ffi_prep_raw_closure_loc (ffi_raw_closure*, - ffi_cif *cif, - void (*fun)(ffi_cif*,void*,ffi_raw*,void*), - void *user_data, - void *codeloc); - -#if !FFI_NATIVE_RAW_API -FFI_API ffi_status -ffi_prep_java_raw_closure (ffi_java_raw_closure*, - ffi_cif *cif, - void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), - void *user_data) __attribute__((deprecated)); - -FFI_API ffi_status -ffi_prep_java_raw_closure_loc (ffi_java_raw_closure*, - ffi_cif *cif, - void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), - void *user_data, - void *codeloc) __attribute__((deprecated)); -#endif - -#endif /* FFI_CLOSURES */ - -#if FFI_GO_CLOSURES - -typedef struct { - void *tramp; - ffi_cif *cif; - void (*fun)(ffi_cif*,void*,void**,void*); -} ffi_go_closure; - -FFI_API ffi_status ffi_prep_go_closure (ffi_go_closure*, ffi_cif *, - void (*fun)(ffi_cif*,void*,void**,void*)); - -FFI_API void ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue, - void **avalue, void *closure); - -#endif /* FFI_GO_CLOSURES */ - -/* ---- Public interface definition -------------------------------------- */ - -FFI_API -ffi_status ffi_prep_cif(ffi_cif *cif, - ffi_abi abi, - unsigned int nargs, - ffi_type *rtype, - ffi_type **atypes); - -FFI_API -ffi_status ffi_prep_cif_var(ffi_cif *cif, - ffi_abi abi, - unsigned int nfixedargs, - unsigned int ntotalargs, - ffi_type *rtype, - ffi_type **atypes); - -FFI_API -void ffi_call(ffi_cif *cif, - void (*fn)(void), - void *rvalue, - void **avalue); - -FFI_API -ffi_status ffi_get_struct_offsets (ffi_abi abi, ffi_type *struct_type, - size_t *offsets); - -/* Useful for eliminating compiler warnings. */ -#define FFI_FN(f) ((void (*)(void))f) - -/* ---- Definitions shared with assembly code ---------------------------- */ - -#endif - -/* If these change, update src/mips/ffitarget.h. */ -#define FFI_TYPE_VOID 0 -#define FFI_TYPE_INT 1 -#define FFI_TYPE_FLOAT 2 -#define FFI_TYPE_DOUBLE 3 -#if @HAVE_LONG_DOUBLE@ -#define FFI_TYPE_LONGDOUBLE 4 -#else -#define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE -#endif -#define FFI_TYPE_UINT8 5 -#define FFI_TYPE_SINT8 6 -#define FFI_TYPE_UINT16 7 -#define FFI_TYPE_SINT16 8 -#define FFI_TYPE_UINT32 9 -#define FFI_TYPE_SINT32 10 -#define FFI_TYPE_UINT64 11 -#define FFI_TYPE_SINT64 12 -#define FFI_TYPE_STRUCT 13 -#define FFI_TYPE_POINTER 14 -#define FFI_TYPE_COMPLEX 15 - -/* This should always refer to the last type code (for sanity checks). */ -#define FFI_TYPE_LAST FFI_TYPE_COMPLEX - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/include/ffi_cfi.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/include/ffi_cfi.h deleted file mode 100644 index 244ce57..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/include/ffi_cfi.h +++ /dev/null @@ -1,55 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi_cfi.h - Copyright (c) 2014 Red Hat, Inc. - - Conditionally assemble cfi directives. Only necessary for building libffi. - ----------------------------------------------------------------------- */ - -#ifndef FFI_CFI_H -#define FFI_CFI_H - -#ifdef HAVE_AS_CFI_PSEUDO_OP - -# define cfi_startproc .cfi_startproc -# define cfi_endproc .cfi_endproc -# define cfi_def_cfa(reg, off) .cfi_def_cfa reg, off -# define cfi_def_cfa_register(reg) .cfi_def_cfa_register reg -# define cfi_def_cfa_offset(off) .cfi_def_cfa_offset off -# define cfi_adjust_cfa_offset(off) .cfi_adjust_cfa_offset off -# define cfi_offset(reg, off) .cfi_offset reg, off -# define cfi_rel_offset(reg, off) .cfi_rel_offset reg, off -# define cfi_register(r1, r2) .cfi_register r1, r2 -# define cfi_return_column(reg) .cfi_return_column reg -# define cfi_restore(reg) .cfi_restore reg -# define cfi_same_value(reg) .cfi_same_value reg -# define cfi_undefined(reg) .cfi_undefined reg -# define cfi_remember_state .cfi_remember_state -# define cfi_restore_state .cfi_restore_state -# define cfi_window_save .cfi_window_save -# define cfi_personality(enc, exp) .cfi_personality enc, exp -# define cfi_lsda(enc, exp) .cfi_lsda enc, exp -# define cfi_escape(...) .cfi_escape __VA_ARGS__ - -#else - -# define cfi_startproc -# define cfi_endproc -# define cfi_def_cfa(reg, off) -# define cfi_def_cfa_register(reg) -# define cfi_def_cfa_offset(off) -# define cfi_adjust_cfa_offset(off) -# define cfi_offset(reg, off) -# define cfi_rel_offset(reg, off) -# define cfi_register(r1, r2) -# define cfi_return_column(reg) -# define cfi_restore(reg) -# define cfi_same_value(reg) -# define cfi_undefined(reg) -# define cfi_remember_state -# define cfi_restore_state -# define cfi_window_save -# define cfi_personality(enc, exp) -# define cfi_lsda(enc, exp) -# define cfi_escape(...) - -#endif /* HAVE_AS_CFI_PSEUDO_OP */ -#endif /* FFI_CFI_H */ diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/include/ffi_common.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/include/ffi_common.h deleted file mode 100644 index 76b9dd6..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/include/ffi_common.h +++ /dev/null @@ -1,153 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi_common.h - Copyright (C) 2011, 2012, 2013 Anthony Green - Copyright (C) 2007 Free Software Foundation, Inc - Copyright (c) 1996 Red Hat, Inc. - - Common internal definitions and macros. Only necessary for building - libffi. - ----------------------------------------------------------------------- */ - -#ifndef FFI_COMMON_H -#define FFI_COMMON_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -/* Do not move this. Some versions of AIX are very picky about where - this is positioned. */ -#ifdef __GNUC__ -# if HAVE_ALLOCA_H -# include -# else - /* mingw64 defines this already in malloc.h. */ -# ifndef alloca -# define alloca __builtin_alloca -# endif -# endif -# define MAYBE_UNUSED __attribute__((__unused__)) -#else -# define MAYBE_UNUSED -# if HAVE_ALLOCA_H -# include -# else -# ifdef _AIX -# pragma alloca -# else -# ifndef alloca /* predefined by HP cc +Olibcalls */ -# ifdef _MSC_VER -# define alloca _alloca -# else -char *alloca (); -# endif -# endif -# endif -# endif -#endif - -/* Check for the existence of memcpy. */ -#if STDC_HEADERS -# include -#else -# ifndef HAVE_MEMCPY -# define memcpy(d, s, n) bcopy ((s), (d), (n)) -# endif -#endif - -#if defined(FFI_DEBUG) -#include -#endif - -#ifdef FFI_DEBUG -void ffi_assert(char *expr, char *file, int line); -void ffi_stop_here(void); -void ffi_type_test(ffi_type *a, char *file, int line); - -#define FFI_ASSERT(x) ((x) ? (void)0 : ffi_assert(#x, __FILE__,__LINE__)) -#define FFI_ASSERT_AT(x, f, l) ((x) ? 0 : ffi_assert(#x, (f), (l))) -#define FFI_ASSERT_VALID_TYPE(x) ffi_type_test (x, __FILE__, __LINE__) -#else -#define FFI_ASSERT(x) -#define FFI_ASSERT_AT(x, f, l) -#define FFI_ASSERT_VALID_TYPE(x) -#endif - -/* v cast to size_t and aligned up to a multiple of a */ -#define FFI_ALIGN(v, a) (((((size_t) (v))-1) | ((a)-1))+1) -/* v cast to size_t and aligned down to a multiple of a */ -#define FFI_ALIGN_DOWN(v, a) (((size_t) (v)) & -a) - -/* Perform machine dependent cif processing */ -ffi_status ffi_prep_cif_machdep(ffi_cif *cif); -ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif, - unsigned int nfixedargs, unsigned int ntotalargs); - - -#if HAVE_LONG_DOUBLE_VARIANT -/* Used to adjust size/alignment of ffi types. */ -void ffi_prep_types (ffi_abi abi); -#endif - -/* Used internally, but overridden by some architectures */ -ffi_status ffi_prep_cif_core(ffi_cif *cif, - ffi_abi abi, - unsigned int isvariadic, - unsigned int nfixedargs, - unsigned int ntotalargs, - ffi_type *rtype, - ffi_type **atypes); - -/* Translate a data pointer to a code pointer. Needed for closures on - some targets. */ -void *ffi_data_to_code_pointer (void *data) FFI_HIDDEN; - -/* Extended cif, used in callback from assembly routine */ -typedef struct -{ - ffi_cif *cif; - void *rvalue; - void **avalue; -} extended_cif; - -/* Terse sized type definitions. */ -#if defined(_MSC_VER) || defined(__sgi) || defined(__SUNPRO_C) -typedef unsigned char UINT8; -typedef signed char SINT8; -typedef unsigned short UINT16; -typedef signed short SINT16; -typedef unsigned int UINT32; -typedef signed int SINT32; -# ifdef _MSC_VER -typedef unsigned __int64 UINT64; -typedef signed __int64 SINT64; -# else -# include -typedef uint64_t UINT64; -typedef int64_t SINT64; -# endif -#else -typedef unsigned int UINT8 __attribute__((__mode__(__QI__))); -typedef signed int SINT8 __attribute__((__mode__(__QI__))); -typedef unsigned int UINT16 __attribute__((__mode__(__HI__))); -typedef signed int SINT16 __attribute__((__mode__(__HI__))); -typedef unsigned int UINT32 __attribute__((__mode__(__SI__))); -typedef signed int SINT32 __attribute__((__mode__(__SI__))); -typedef unsigned int UINT64 __attribute__((__mode__(__DI__))); -typedef signed int SINT64 __attribute__((__mode__(__DI__))); -#endif - -typedef float FLOAT32; - -#ifndef __GNUC__ -#define __builtin_expect(x, expected_value) (x) -#endif -#define LIKELY(x) __builtin_expect(!!(x),1) -#define UNLIKELY(x) __builtin_expect((x)!=0,0) - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/libffi.map.in b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/libffi.map.in deleted file mode 100644 index de8778a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/libffi.map.in +++ /dev/null @@ -1,76 +0,0 @@ -#define LIBFFI_ASM -#define LIBFFI_H -#include -#include - -/* These version numbers correspond to the libtool-version abi numbers, - not to the libffi release numbers. */ - -LIBFFI_BASE_8.0 { - global: - /* Exported data variables. */ - ffi_type_void; - ffi_type_uint8; - ffi_type_sint8; - ffi_type_uint16; - ffi_type_sint16; - ffi_type_uint32; - ffi_type_sint32; - ffi_type_uint64; - ffi_type_sint64; - ffi_type_float; - ffi_type_double; - ffi_type_longdouble; - ffi_type_pointer; - - /* Exported functions. */ - ffi_call; - ffi_prep_cif; - ffi_prep_cif_var; - - ffi_raw_call; - ffi_ptrarray_to_raw; - ffi_raw_to_ptrarray; - ffi_raw_size; - - ffi_java_raw_call; - ffi_java_ptrarray_to_raw; - ffi_java_raw_to_ptrarray; - ffi_java_raw_size; - - ffi_get_struct_offsets; - local: - *; -}; - -#ifdef FFI_TARGET_HAS_COMPLEX_TYPE -LIBFFI_COMPLEX_8.0 { - global: - /* Exported data variables. */ - ffi_type_complex_float; - ffi_type_complex_double; - ffi_type_complex_longdouble; -} LIBFFI_BASE_8.0; -#endif - -#if FFI_CLOSURES -LIBFFI_CLOSURE_8.0 { - global: - ffi_closure_alloc; - ffi_closure_free; - ffi_prep_closure; - ffi_prep_closure_loc; - ffi_prep_raw_closure; - ffi_prep_raw_closure_loc; - ffi_prep_java_raw_closure; - ffi_prep_java_raw_closure_loc; -} LIBFFI_BASE_8.0; -#endif - -#if FFI_GO_CLOSURES -LIBFFI_GO_CLOSURE_8.0 { - global: - ffi_call_go; - ffi_prep_go_closure; -} LIBFFI_CLOSURE_8.0; -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/libffi.pc.in b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/libffi.pc.in deleted file mode 100644 index 6fad83b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/libffi.pc.in +++ /dev/null @@ -1,11 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -toolexeclibdir=@toolexeclibdir@ -includedir=@includedir@ - -Name: @PACKAGE_NAME@ -Description: Library supporting Foreign Function Interfaces -Version: @PACKAGE_VERSION@ -Libs: -L${toolexeclibdir} -lffi -Cflags: -I${includedir} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj deleted file mode 100644 index 480c4a4..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj +++ /dev/null @@ -1,997 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 43B5D3F81D35473200D1E1FD /* ffiw64_x86_64.c in Sources */ = {isa = PBXBuildFile; fileRef = 43B5D3F71D35473200D1E1FD /* ffiw64_x86_64.c */; }; - 43B5D3FA1D3547CE00D1E1FD /* win64_x86_64.S in Sources */ = {isa = PBXBuildFile; fileRef = 43B5D3F91D3547CE00D1E1FD /* win64_x86_64.S */; }; - 43E9A5C81D352C1500926A8F /* unix64_x86_64.S in Sources */ = {isa = PBXBuildFile; fileRef = 43E9A5C61D352C1500926A8F /* unix64_x86_64.S */; }; - DBFA714A187F1D8600A76262 /* ffi.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA713E187F1D8600A76262 /* ffi.h */; }; - DBFA714B187F1D8600A76262 /* ffi_common.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA713F187F1D8600A76262 /* ffi_common.h */; }; - DBFA714C187F1D8600A76262 /* fficonfig.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7140187F1D8600A76262 /* fficonfig.h */; }; - DBFA714D187F1D8600A76262 /* ffitarget.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7141187F1D8600A76262 /* ffitarget.h */; }; - DBFA714E187F1D8600A76262 /* closures.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7143187F1D8600A76262 /* closures.c */; }; - DBFA714F187F1D8600A76262 /* closures.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7143187F1D8600A76262 /* closures.c */; }; - DBFA7156187F1D8600A76262 /* prep_cif.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7147187F1D8600A76262 /* prep_cif.c */; }; - DBFA7157187F1D8600A76262 /* prep_cif.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7147187F1D8600A76262 /* prep_cif.c */; }; - DBFA7158187F1D8600A76262 /* raw_api.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7148187F1D8600A76262 /* raw_api.c */; }; - DBFA7159187F1D8600A76262 /* raw_api.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7148187F1D8600A76262 /* raw_api.c */; }; - DBFA715A187F1D8600A76262 /* types.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7149187F1D8600A76262 /* types.c */; }; - DBFA715B187F1D8600A76262 /* types.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7149187F1D8600A76262 /* types.c */; }; - DBFA7177187F1D9B00A76262 /* ffi_arm64.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA716C187F1D9B00A76262 /* ffi_arm64.c */; }; - DBFA7178187F1D9B00A76262 /* sysv_arm64.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA716D187F1D9B00A76262 /* sysv_arm64.S */; }; - DBFA7179187F1D9B00A76262 /* ffi_armv7.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA716F187F1D9B00A76262 /* ffi_armv7.c */; }; - DBFA717A187F1D9B00A76262 /* sysv_armv7.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7170187F1D9B00A76262 /* sysv_armv7.S */; }; - DBFA717E187F1D9B00A76262 /* ffi64_x86_64.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7175187F1D9B00A76262 /* ffi64_x86_64.c */; }; - DBFA718F187F1DA100A76262 /* ffi_x86_64.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7183187F1DA100A76262 /* ffi_x86_64.h */; }; - DBFA7191187F1DA100A76262 /* fficonfig_x86_64.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7185187F1DA100A76262 /* fficonfig_x86_64.h */; }; - DBFA7193187F1DA100A76262 /* ffitarget_x86_64.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7187187F1DA100A76262 /* ffitarget_x86_64.h */; }; - DBFA7194187F1DA100A76262 /* unix64_x86_64.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA718A187F1DA100A76262 /* unix64_x86_64.S */; }; - DBFA7196187F1DA100A76262 /* ffi64_x86_64.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA718C187F1DA100A76262 /* ffi64_x86_64.c */; }; - FDB52FB31F6144FA00AA92E6 /* unix64_x86_64.S in Sources */ = {isa = PBXBuildFile; fileRef = 43E9A5C61D352C1500926A8F /* unix64_x86_64.S */; }; - FDB52FB51F6144FA00AA92E6 /* ffi64_x86_64.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7175187F1D9B00A76262 /* ffi64_x86_64.c */; }; - FDB52FB61F6144FA00AA92E6 /* ffi_armv7.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA716F187F1D9B00A76262 /* ffi_armv7.c */; }; - FDB52FB71F6144FA00AA92E6 /* closures.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7143187F1D8600A76262 /* closures.c */; }; - FDB52FB81F6144FA00AA92E6 /* sysv_armv7.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7170187F1D9B00A76262 /* sysv_armv7.S */; }; - FDB52FB91F6144FA00AA92E6 /* ffiw64_x86_64.c in Sources */ = {isa = PBXBuildFile; fileRef = 43B5D3F71D35473200D1E1FD /* ffiw64_x86_64.c */; }; - FDB52FBA1F6144FA00AA92E6 /* prep_cif.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7147187F1D8600A76262 /* prep_cif.c */; }; - FDB52FBC1F6144FA00AA92E6 /* raw_api.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7148187F1D8600A76262 /* raw_api.c */; }; - FDB52FBD1F6144FA00AA92E6 /* sysv_arm64.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA716D187F1D9B00A76262 /* sysv_arm64.S */; }; - FDB52FBE1F6144FA00AA92E6 /* types.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7149187F1D8600A76262 /* types.c */; }; - FDB52FBF1F6144FA00AA92E6 /* ffi_arm64.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA716C187F1D9B00A76262 /* ffi_arm64.c */; }; - FDB52FC01F6144FA00AA92E6 /* win64_x86_64.S in Sources */ = {isa = PBXBuildFile; fileRef = 43B5D3F91D3547CE00D1E1FD /* win64_x86_64.S */; }; - FDB52FD01F614A8B00AA92E6 /* ffi.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA713E187F1D8600A76262 /* ffi.h */; }; - FDB52FD11F614AA700AA92E6 /* ffi_arm64.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA715E187F1D9B00A76262 /* ffi_arm64.h */; }; - FDB52FD21F614AAB00AA92E6 /* ffi_armv7.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA715F187F1D9B00A76262 /* ffi_armv7.h */; }; - FDB52FD41F614AB500AA92E6 /* ffi_x86_64.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA7161187F1D9B00A76262 /* ffi_x86_64.h */; }; - FDB52FD51F614AE200AA92E6 /* ffi.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA713E187F1D8600A76262 /* ffi.h */; }; - FDB52FD61F614AEA00AA92E6 /* ffi_arm64.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA715E187F1D9B00A76262 /* ffi_arm64.h */; }; - FDB52FD71F614AED00AA92E6 /* ffi_x86_64.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA7161187F1D9B00A76262 /* ffi_x86_64.h */; }; - FDB52FD81F614B8700AA92E6 /* ffitarget.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA7141187F1D8600A76262 /* ffitarget.h */; }; - FDB52FD91F614B8E00AA92E6 /* ffitarget_arm64.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA7166187F1D9B00A76262 /* ffitarget_arm64.h */; }; - FDB52FDA1F614B9300AA92E6 /* ffitarget_armv7.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA7167187F1D9B00A76262 /* ffitarget_armv7.h */; }; - FDB52FDD1F614BA900AA92E6 /* ffitarget_x86_64.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA7169187F1D9B00A76262 /* ffitarget_x86_64.h */; }; - FDB52FDE1F6155E300AA92E6 /* ffitarget.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA7141187F1D8600A76262 /* ffitarget.h */; }; - FDB52FDF1F6155EA00AA92E6 /* ffitarget_arm64.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA7166187F1D9B00A76262 /* ffitarget_arm64.h */; }; - FDB52FE01F6155EF00AA92E6 /* ffitarget_x86_64.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA7169187F1D9B00A76262 /* ffitarget_x86_64.h */; }; - FDB52FE21F6156FA00AA92E6 /* ffi.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA713E187F1D8600A76262 /* ffi.h */; }; - FDB52FE31F61571A00AA92E6 /* ffi_x86_64.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA7183187F1DA100A76262 /* ffi_x86_64.h */; }; - FDB52FE41F61571D00AA92E6 /* ffitarget.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA7141187F1D8600A76262 /* ffitarget.h */; }; - FDB52FE61F61573100AA92E6 /* ffitarget_x86_64.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA7187187F1DA100A76262 /* ffitarget_x86_64.h */; }; - FDDB2F411F5D66E200EF414E /* ffiw64_x86_64.c in Sources */ = {isa = PBXBuildFile; fileRef = FDDB2F3F1F5D666900EF414E /* ffiw64_x86_64.c */; }; - FDDB2F461F5D691E00EF414E /* win64_x86_64.S in Sources */ = {isa = PBXBuildFile; fileRef = FDDB2F441F5D68C900EF414E /* win64_x86_64.S */; }; - FDDB2F4A1F5D846400EF414E /* ffi64_x86_64.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA718C187F1DA100A76262 /* ffi64_x86_64.c */; }; - FDDB2F4C1F5D846400EF414E /* prep_cif.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7147187F1D8600A76262 /* prep_cif.c */; }; - FDDB2F4E1F5D846400EF414E /* ffiw64_x86_64.c in Sources */ = {isa = PBXBuildFile; fileRef = FDDB2F3F1F5D666900EF414E /* ffiw64_x86_64.c */; }; - FDDB2F4F1F5D846400EF414E /* types.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7149187F1D8600A76262 /* types.c */; }; - FDDB2F501F5D846400EF414E /* raw_api.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7148187F1D8600A76262 /* raw_api.c */; }; - FDDB2F511F5D846400EF414E /* closures.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7143187F1D8600A76262 /* closures.c */; }; - FDDB2F521F5D846400EF414E /* unix64_x86_64.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA718A187F1DA100A76262 /* unix64_x86_64.S */; }; - FDDB2F531F5D846400EF414E /* win64_x86_64.S in Sources */ = {isa = PBXBuildFile; fileRef = FDDB2F441F5D68C900EF414E /* win64_x86_64.S */; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - DB13B1641849DF1E0010F42D /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 12; - dstPath = "include/$(PRODUCT_NAME)"; - dstSubfolderSpec = 16; - files = ( - FDB52FD01F614A8B00AA92E6 /* ffi.h in CopyFiles */, - FDB52FD11F614AA700AA92E6 /* ffi_arm64.h in CopyFiles */, - FDB52FD21F614AAB00AA92E6 /* ffi_armv7.h in CopyFiles */, - FDB52FD41F614AB500AA92E6 /* ffi_x86_64.h in CopyFiles */, - FDB52FD81F614B8700AA92E6 /* ffitarget.h in CopyFiles */, - FDB52FD91F614B8E00AA92E6 /* ffitarget_arm64.h in CopyFiles */, - FDB52FDA1F614B9300AA92E6 /* ffitarget_armv7.h in CopyFiles */, - FDB52FDD1F614BA900AA92E6 /* ffitarget_x86_64.h in CopyFiles */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - FDB52FC11F6144FA00AA92E6 /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 12; - dstPath = "include/$(PRODUCT_NAME)"; - dstSubfolderSpec = 16; - files = ( - FDB52FD51F614AE200AA92E6 /* ffi.h in CopyFiles */, - FDB52FD61F614AEA00AA92E6 /* ffi_arm64.h in CopyFiles */, - FDB52FD71F614AED00AA92E6 /* ffi_x86_64.h in CopyFiles */, - FDB52FDE1F6155E300AA92E6 /* ffitarget.h in CopyFiles */, - FDB52FDF1F6155EA00AA92E6 /* ffitarget_arm64.h in CopyFiles */, - FDB52FE01F6155EF00AA92E6 /* ffitarget_x86_64.h in CopyFiles */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - FDB52FE11F6156E000AA92E6 /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = "include/$(PRODUCT_NAME)"; - dstSubfolderSpec = 16; - files = ( - FDB52FE21F6156FA00AA92E6 /* ffi.h in CopyFiles */, - FDB52FE31F61571A00AA92E6 /* ffi_x86_64.h in CopyFiles */, - FDB52FE41F61571D00AA92E6 /* ffitarget.h in CopyFiles */, - FDB52FE61F61573100AA92E6 /* ffitarget_x86_64.h in CopyFiles */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 43B5D3F71D35473200D1E1FD /* ffiw64_x86_64.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ffiw64_x86_64.c; sourceTree = ""; }; - 43B5D3F91D3547CE00D1E1FD /* win64_x86_64.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = win64_x86_64.S; sourceTree = ""; }; - 43E9A5C61D352C1500926A8F /* unix64_x86_64.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = unix64_x86_64.S; sourceTree = ""; }; - 43E9A5DA1D35373600926A8F /* internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = internal.h; sourceTree = ""; }; - 43E9A5DB1D35374400926A8F /* internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = internal.h; sourceTree = ""; }; - 43E9A5DC1D35375400926A8F /* internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = internal.h; sourceTree = ""; }; - 43E9A5DD1D35375400926A8F /* internal64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = internal64.h; sourceTree = ""; }; - DB13B1661849DF1E0010F42D /* libffi.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libffi.a; sourceTree = BUILT_PRODUCTS_DIR; }; - DB13B1911849DF510010F42D /* ffi.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = ffi.dylib; sourceTree = BUILT_PRODUCTS_DIR; }; - DBFA713E187F1D8600A76262 /* ffi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi.h; sourceTree = ""; }; - DBFA713F187F1D8600A76262 /* ffi_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_common.h; sourceTree = ""; }; - DBFA7140187F1D8600A76262 /* fficonfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig.h; sourceTree = ""; }; - DBFA7141187F1D8600A76262 /* ffitarget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget.h; sourceTree = ""; }; - DBFA7143187F1D8600A76262 /* closures.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = closures.c; sourceTree = ""; }; - DBFA7145187F1D8600A76262 /* dlmalloc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dlmalloc.c; sourceTree = ""; }; - DBFA7147187F1D8600A76262 /* prep_cif.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = prep_cif.c; sourceTree = ""; }; - DBFA7148187F1D8600A76262 /* raw_api.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = raw_api.c; sourceTree = ""; }; - DBFA7149187F1D8600A76262 /* types.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = types.c; sourceTree = ""; }; - DBFA715E187F1D9B00A76262 /* ffi_arm64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_arm64.h; sourceTree = ""; }; - DBFA715F187F1D9B00A76262 /* ffi_armv7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_armv7.h; sourceTree = ""; }; - DBFA7161187F1D9B00A76262 /* ffi_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_x86_64.h; sourceTree = ""; }; - DBFA7162187F1D9B00A76262 /* fficonfig_arm64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig_arm64.h; sourceTree = ""; }; - DBFA7163187F1D9B00A76262 /* fficonfig_armv7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig_armv7.h; sourceTree = ""; }; - DBFA7165187F1D9B00A76262 /* fficonfig_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig_x86_64.h; sourceTree = ""; }; - DBFA7166187F1D9B00A76262 /* ffitarget_arm64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_arm64.h; sourceTree = ""; }; - DBFA7167187F1D9B00A76262 /* ffitarget_armv7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_armv7.h; sourceTree = ""; }; - DBFA7169187F1D9B00A76262 /* ffitarget_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_x86_64.h; sourceTree = ""; }; - DBFA716C187F1D9B00A76262 /* ffi_arm64.c */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.c.c; path = ffi_arm64.c; sourceTree = ""; }; - DBFA716D187F1D9B00A76262 /* sysv_arm64.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = sysv_arm64.S; sourceTree = ""; }; - DBFA716F187F1D9B00A76262 /* ffi_armv7.c */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.c.c; path = ffi_armv7.c; sourceTree = ""; }; - DBFA7170187F1D9B00A76262 /* sysv_armv7.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = sysv_armv7.S; sourceTree = ""; }; - DBFA7175187F1D9B00A76262 /* ffi64_x86_64.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ffi64_x86_64.c; sourceTree = ""; }; - DBFA7183187F1DA100A76262 /* ffi_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_x86_64.h; sourceTree = ""; }; - DBFA7185187F1DA100A76262 /* fficonfig_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig_x86_64.h; sourceTree = ""; }; - DBFA7187187F1DA100A76262 /* ffitarget_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_x86_64.h; sourceTree = ""; }; - DBFA718A187F1DA100A76262 /* unix64_x86_64.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = unix64_x86_64.S; sourceTree = ""; }; - DBFA718C187F1DA100A76262 /* ffi64_x86_64.c */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.c.c; path = ffi64_x86_64.c; sourceTree = ""; }; - FDB52FC51F6144FA00AA92E6 /* libffi.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libffi.a; sourceTree = BUILT_PRODUCTS_DIR; }; - FDDB2F3E1F5D61BC00EF414E /* asmnames.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = asmnames.h; sourceTree = ""; }; - FDDB2F3F1F5D666900EF414E /* ffiw64_x86_64.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ffiw64_x86_64.c; sourceTree = ""; }; - FDDB2F421F5D68C900EF414E /* internal64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = internal64.h; sourceTree = ""; }; - FDDB2F431F5D68C900EF414E /* internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = internal.h; sourceTree = ""; }; - FDDB2F441F5D68C900EF414E /* win64_x86_64.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = win64_x86_64.S; sourceTree = ""; }; - FDDB2F621F5D846400EF414E /* libffi.a */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libffi.a; sourceTree = BUILT_PRODUCTS_DIR; }; -/* End PBXFileReference section */ - -/* Begin PBXGroup section */ - DB13B15B1849DEB70010F42D = { - isa = PBXGroup; - children = ( - DBFA713C187F1D8600A76262 /* darwin_common */, - DBFA715C187F1D9B00A76262 /* darwin_ios */, - DBFA7180187F1DA100A76262 /* darwin_osx */, - DB13B1671849DF1E0010F42D /* Products */, - ); - sourceTree = ""; - }; - DB13B1671849DF1E0010F42D /* Products */ = { - isa = PBXGroup; - children = ( - DB13B1661849DF1E0010F42D /* libffi.a */, - DB13B1911849DF510010F42D /* ffi.dylib */, - FDDB2F621F5D846400EF414E /* libffi.a */, - FDB52FC51F6144FA00AA92E6 /* libffi.a */, - ); - name = Products; - sourceTree = ""; - }; - DBFA713C187F1D8600A76262 /* darwin_common */ = { - isa = PBXGroup; - children = ( - DBFA713D187F1D8600A76262 /* include */, - DBFA7142187F1D8600A76262 /* src */, - ); - path = darwin_common; - sourceTree = ""; - }; - DBFA713D187F1D8600A76262 /* include */ = { - isa = PBXGroup; - children = ( - DBFA713E187F1D8600A76262 /* ffi.h */, - DBFA713F187F1D8600A76262 /* ffi_common.h */, - DBFA7140187F1D8600A76262 /* fficonfig.h */, - DBFA7141187F1D8600A76262 /* ffitarget.h */, - ); - path = include; - sourceTree = ""; - }; - DBFA7142187F1D8600A76262 /* src */ = { - isa = PBXGroup; - children = ( - DBFA7143187F1D8600A76262 /* closures.c */, - DBFA7145187F1D8600A76262 /* dlmalloc.c */, - DBFA7147187F1D8600A76262 /* prep_cif.c */, - DBFA7148187F1D8600A76262 /* raw_api.c */, - DBFA7149187F1D8600A76262 /* types.c */, - ); - path = src; - sourceTree = ""; - }; - DBFA715C187F1D9B00A76262 /* darwin_ios */ = { - isa = PBXGroup; - children = ( - DBFA715D187F1D9B00A76262 /* include */, - DBFA716A187F1D9B00A76262 /* src */, - ); - path = darwin_ios; - sourceTree = ""; - }; - DBFA715D187F1D9B00A76262 /* include */ = { - isa = PBXGroup; - children = ( - DBFA715E187F1D9B00A76262 /* ffi_arm64.h */, - DBFA715F187F1D9B00A76262 /* ffi_armv7.h */, - DBFA7161187F1D9B00A76262 /* ffi_x86_64.h */, - DBFA7162187F1D9B00A76262 /* fficonfig_arm64.h */, - DBFA7163187F1D9B00A76262 /* fficonfig_armv7.h */, - DBFA7165187F1D9B00A76262 /* fficonfig_x86_64.h */, - DBFA7166187F1D9B00A76262 /* ffitarget_arm64.h */, - DBFA7167187F1D9B00A76262 /* ffitarget_armv7.h */, - DBFA7169187F1D9B00A76262 /* ffitarget_x86_64.h */, - ); - path = include; - sourceTree = ""; - }; - DBFA716A187F1D9B00A76262 /* src */ = { - isa = PBXGroup; - children = ( - DBFA716B187F1D9B00A76262 /* aarch64 */, - DBFA716E187F1D9B00A76262 /* arm */, - DBFA7172187F1D9B00A76262 /* x86 */, - ); - path = src; - sourceTree = ""; - }; - DBFA716B187F1D9B00A76262 /* aarch64 */ = { - isa = PBXGroup; - children = ( - 43E9A5DA1D35373600926A8F /* internal.h */, - DBFA716C187F1D9B00A76262 /* ffi_arm64.c */, - DBFA716D187F1D9B00A76262 /* sysv_arm64.S */, - ); - path = aarch64; - sourceTree = ""; - }; - DBFA716E187F1D9B00A76262 /* arm */ = { - isa = PBXGroup; - children = ( - 43E9A5DB1D35374400926A8F /* internal.h */, - DBFA716F187F1D9B00A76262 /* ffi_armv7.c */, - DBFA7170187F1D9B00A76262 /* sysv_armv7.S */, - ); - path = arm; - sourceTree = ""; - }; - DBFA7172187F1D9B00A76262 /* x86 */ = { - isa = PBXGroup; - children = ( - 43E9A5DC1D35375400926A8F /* internal.h */, - 43E9A5DD1D35375400926A8F /* internal64.h */, - DBFA7175187F1D9B00A76262 /* ffi64_x86_64.c */, - 43B5D3F71D35473200D1E1FD /* ffiw64_x86_64.c */, - 43E9A5C61D352C1500926A8F /* unix64_x86_64.S */, - 43B5D3F91D3547CE00D1E1FD /* win64_x86_64.S */, - ); - path = x86; - sourceTree = ""; - }; - DBFA7180187F1DA100A76262 /* darwin_osx */ = { - isa = PBXGroup; - children = ( - DBFA7181187F1DA100A76262 /* include */, - DBFA7188187F1DA100A76262 /* src */, - ); - path = darwin_osx; - sourceTree = ""; - }; - DBFA7181187F1DA100A76262 /* include */ = { - isa = PBXGroup; - children = ( - DBFA7183187F1DA100A76262 /* ffi_x86_64.h */, - DBFA7185187F1DA100A76262 /* fficonfig_x86_64.h */, - DBFA7187187F1DA100A76262 /* ffitarget_x86_64.h */, - ); - path = include; - sourceTree = ""; - }; - DBFA7188187F1DA100A76262 /* src */ = { - isa = PBXGroup; - children = ( - DBFA7189187F1DA100A76262 /* x86 */, - ); - path = src; - sourceTree = ""; - }; - DBFA7189187F1DA100A76262 /* x86 */ = { - isa = PBXGroup; - children = ( - FDDB2F431F5D68C900EF414E /* internal.h */, - FDDB2F421F5D68C900EF414E /* internal64.h */, - FDDB2F3E1F5D61BC00EF414E /* asmnames.h */, - DBFA718C187F1DA100A76262 /* ffi64_x86_64.c */, - FDDB2F3F1F5D666900EF414E /* ffiw64_x86_64.c */, - DBFA718A187F1DA100A76262 /* unix64_x86_64.S */, - FDDB2F441F5D68C900EF414E /* win64_x86_64.S */, - ); - path = x86; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - DB13B18F1849DF510010F42D /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - DBFA714C187F1D8600A76262 /* fficonfig.h in Headers */, - DBFA714D187F1D8600A76262 /* ffitarget.h in Headers */, - DBFA714A187F1D8600A76262 /* ffi.h in Headers */, - DBFA718F187F1DA100A76262 /* ffi_x86_64.h in Headers */, - DBFA7191187F1DA100A76262 /* fficonfig_x86_64.h in Headers */, - DBFA714B187F1D8600A76262 /* ffi_common.h in Headers */, - DBFA7193187F1DA100A76262 /* ffitarget_x86_64.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - DB13B1651849DF1E0010F42D /* libffi-iOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = DB13B18B1849DF1E0010F42D /* Build configuration list for PBXNativeTarget "libffi-iOS" */; - buildPhases = ( - 43B5D3FB1D35480D00D1E1FD /* Run Script */, - DB13B1621849DF1E0010F42D /* Sources */, - DB13B1641849DF1E0010F42D /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "libffi-iOS"; - productName = ffi; - productReference = DB13B1661849DF1E0010F42D /* libffi.a */; - productType = "com.apple.product-type.library.static"; - }; - DB13B1901849DF510010F42D /* libffi-Mac */ = { - isa = PBXNativeTarget; - buildConfigurationList = DB13B1B01849DF520010F42D /* Build configuration list for PBXNativeTarget "libffi-Mac" */; - buildPhases = ( - DB13B3061849E0490010F42D /* ShellScript */, - DB13B18D1849DF510010F42D /* Sources */, - DB13B18F1849DF510010F42D /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "libffi-Mac"; - productName = ffi; - productReference = DB13B1911849DF510010F42D /* ffi.dylib */; - productType = "com.apple.product-type.library.dynamic"; - }; - FDB52FB01F6144FA00AA92E6 /* libffi-tvOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = FDB52FC21F6144FA00AA92E6 /* Build configuration list for PBXNativeTarget "libffi-tvOS" */; - buildPhases = ( - FDB52FB11F6144FA00AA92E6 /* Run Script */, - FDB52FB21F6144FA00AA92E6 /* Sources */, - FDB52FC11F6144FA00AA92E6 /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "libffi-tvOS"; - productName = ffi; - productReference = FDB52FC51F6144FA00AA92E6 /* libffi.a */; - productType = "com.apple.product-type.library.static"; - }; - FDDB2F471F5D846400EF414E /* libffi-static-Mac */ = { - isa = PBXNativeTarget; - buildConfigurationList = FDDB2F5F1F5D846400EF414E /* Build configuration list for PBXNativeTarget "libffi-static-Mac" */; - buildPhases = ( - FDDB2F481F5D846400EF414E /* ShellScript */, - FDDB2F491F5D846400EF414E /* Sources */, - FDB52FE11F6156E000AA92E6 /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "libffi-static-Mac"; - productName = ffi; - productReference = FDDB2F621F5D846400EF414E /* libffi.a */; - productType = "com.apple.product-type.library.dynamic"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - DB13B15C1849DEB70010F42D /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0830; - }; - buildConfigurationList = DB13B15F1849DEB70010F42D /* Build configuration list for PBXProject "libffi" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = DB13B15B1849DEB70010F42D; - productRefGroup = DB13B1671849DF1E0010F42D /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - DB13B1651849DF1E0010F42D /* libffi-iOS */, - FDB52FB01F6144FA00AA92E6 /* libffi-tvOS */, - DB13B1901849DF510010F42D /* libffi-Mac */, - FDDB2F471F5D846400EF414E /* libffi-static-Mac */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXShellScriptBuildPhase section */ - 43B5D3FB1D35480D00D1E1FD /* Run Script */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Run Script"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "if [ ! -f \"./compile\" ]\nthen\nautoreconf -i -f -v\nif [ -f \"../ltmain.sh\" ]\nthen\necho \"fixing ltmain.sh for some reason\"\nmv ../ltmain.sh ./\nautoreconf -i -f -v\nfi\n/usr/bin/python generate-darwin-source-and-headers.py --only-ios\nfi"; - }; - DB13B3061849E0490010F42D /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "if [ ! -f \"./compile\" ]\nthen\nautoreconf -i -f -v\nif [ -f \"../ltmain.sh\" ]\nthen\necho \"fixing ltmain.sh for some reason\"\nmv ../ltmain.sh ./\nautoreconf -i -f -v\nfi\n/usr/bin/python generate-darwin-source-and-headers.py --only-osx\nfi"; - }; - FDB52FB11F6144FA00AA92E6 /* Run Script */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Run Script"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "if [ ! -f \"./compile\" ]\nthen\nautoreconf -i -f -v\nif [ -f \"../ltmain.sh\" ]\nthen\necho \"fixing ltmain.sh for some reason\"\nmv ../ltmain.sh ./\nautoreconf -i -f -v\nfi\n/usr/bin/python generate-darwin-source-and-headers.py --only-ios\nfi"; - }; - FDDB2F481F5D846400EF414E /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "if [ ! -f \"./compile\" ]\nthen\nautoreconf -i -f -v\nif [ -f \"../ltmain.sh\" ]\nthen\necho \"fixing ltmain.sh for some reason\"\nmv ../ltmain.sh ./\nautoreconf -i -f -v\nfi\n/usr/bin/python generate-darwin-source-and-headers.py --only-osx\nfi"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - DB13B1621849DF1E0010F42D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 43E9A5C81D352C1500926A8F /* unix64_x86_64.S in Sources */, - DBFA717E187F1D9B00A76262 /* ffi64_x86_64.c in Sources */, - DBFA7179187F1D9B00A76262 /* ffi_armv7.c in Sources */, - DBFA714E187F1D8600A76262 /* closures.c in Sources */, - DBFA717A187F1D9B00A76262 /* sysv_armv7.S in Sources */, - 43B5D3F81D35473200D1E1FD /* ffiw64_x86_64.c in Sources */, - DBFA7156187F1D8600A76262 /* prep_cif.c in Sources */, - DBFA7158187F1D8600A76262 /* raw_api.c in Sources */, - DBFA7178187F1D9B00A76262 /* sysv_arm64.S in Sources */, - DBFA715A187F1D8600A76262 /* types.c in Sources */, - DBFA7177187F1D9B00A76262 /* ffi_arm64.c in Sources */, - 43B5D3FA1D3547CE00D1E1FD /* win64_x86_64.S in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DB13B18D1849DF510010F42D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - DBFA7196187F1DA100A76262 /* ffi64_x86_64.c in Sources */, - DBFA7157187F1D8600A76262 /* prep_cif.c in Sources */, - FDDB2F411F5D66E200EF414E /* ffiw64_x86_64.c in Sources */, - DBFA715B187F1D8600A76262 /* types.c in Sources */, - DBFA7159187F1D8600A76262 /* raw_api.c in Sources */, - DBFA714F187F1D8600A76262 /* closures.c in Sources */, - DBFA7194187F1DA100A76262 /* unix64_x86_64.S in Sources */, - FDDB2F461F5D691E00EF414E /* win64_x86_64.S in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - FDB52FB21F6144FA00AA92E6 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - FDB52FB31F6144FA00AA92E6 /* unix64_x86_64.S in Sources */, - FDB52FB51F6144FA00AA92E6 /* ffi64_x86_64.c in Sources */, - FDB52FB61F6144FA00AA92E6 /* ffi_armv7.c in Sources */, - FDB52FB71F6144FA00AA92E6 /* closures.c in Sources */, - FDB52FB81F6144FA00AA92E6 /* sysv_armv7.S in Sources */, - FDB52FB91F6144FA00AA92E6 /* ffiw64_x86_64.c in Sources */, - FDB52FBA1F6144FA00AA92E6 /* prep_cif.c in Sources */, - FDB52FBC1F6144FA00AA92E6 /* raw_api.c in Sources */, - FDB52FBD1F6144FA00AA92E6 /* sysv_arm64.S in Sources */, - FDB52FBE1F6144FA00AA92E6 /* types.c in Sources */, - FDB52FBF1F6144FA00AA92E6 /* ffi_arm64.c in Sources */, - FDB52FC01F6144FA00AA92E6 /* win64_x86_64.S in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - FDDB2F491F5D846400EF414E /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - FDDB2F4A1F5D846400EF414E /* ffi64_x86_64.c in Sources */, - FDDB2F4C1F5D846400EF414E /* prep_cif.c in Sources */, - FDDB2F4E1F5D846400EF414E /* ffiw64_x86_64.c in Sources */, - FDDB2F4F1F5D846400EF414E /* types.c in Sources */, - FDDB2F501F5D846400EF414E /* raw_api.c in Sources */, - FDDB2F511F5D846400EF414E /* closures.c in Sources */, - FDDB2F521F5D846400EF414E /* unix64_x86_64.S in Sources */, - FDDB2F531F5D846400EF414E /* win64_x86_64.S in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - DB13B1601849DEB70010F42D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - darwin_common/include, - ); - ONLY_ACTIVE_ARCH = YES; - }; - name = Debug; - }; - DB13B1611849DEB70010F42D /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - darwin_common/include, - ); - }; - name = Release; - }; - DB13B1871849DF1E0010F42D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DSTROOT = /tmp/ffi.dst; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - darwin_ios/include, - ); - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - PRODUCT_NAME = ffi; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - VALID_ARCHS = "arm64 armv7 armv7s x86_64"; - }; - name = Debug; - }; - DB13B1881849DF1E0010F42D /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = YES; - DSTROOT = /tmp/ffi.dst; - ENABLE_NS_ASSERTIONS = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - darwin_ios/include, - ); - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - PRODUCT_NAME = ffi; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - VALIDATE_PRODUCT = YES; - VALID_ARCHS = "arm64 armv7 armv7s x86_64"; - }; - name = Release; - }; - DB13B1B11849DF520010F42D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = NO; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - darwin_osx/include, - ); - MACOSX_DEPLOYMENT_TARGET = 10.6; - ONLY_ACTIVE_ARCH = YES; - OTHER_LDFLAGS = "-Wl,-no_compact_unwind"; - PRODUCT_NAME = ffi; - SDKROOT = macosx; - }; - name = Debug; - }; - DB13B1B21849DF520010F42D /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - darwin_osx/include, - ); - MACOSX_DEPLOYMENT_TARGET = 10.6; - OTHER_LDFLAGS = "-Wl,-no_compact_unwind"; - PRODUCT_NAME = ffi; - SDKROOT = macosx; - }; - name = Release; - }; - FDB52FC31F6144FA00AA92E6 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - darwin_ios/include, - ); - PRODUCT_NAME = ffi; - SDKROOT = appletvos; - SKIP_INSTALL = YES; - TVOS_DEPLOYMENT_TARGET = 9.0; - }; - name = Debug; - }; - FDB52FC41F6144FA00AA92E6 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = YES; - ENABLE_NS_ASSERTIONS = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - darwin_ios/include, - ); - PRODUCT_NAME = ffi; - SDKROOT = appletvos; - SKIP_INSTALL = YES; - TVOS_DEPLOYMENT_TARGET = 9.0; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - FDDB2F601F5D846400EF414E /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = NO; - EXECUTABLE_EXTENSION = a; - EXECUTABLE_PREFIX = lib; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - darwin_osx/include, - ); - MACH_O_TYPE = staticlib; - MACOSX_DEPLOYMENT_TARGET = 10.6; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = ffi; - SDKROOT = macosx; - }; - name = Debug; - }; - FDDB2F611F5D846400EF414E /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - EXECUTABLE_EXTENSION = a; - EXECUTABLE_PREFIX = lib; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - darwin_osx/include, - ); - MACH_O_TYPE = staticlib; - MACOSX_DEPLOYMENT_TARGET = 10.6; - PRODUCT_NAME = ffi; - SDKROOT = macosx; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - DB13B15F1849DEB70010F42D /* Build configuration list for PBXProject "libffi" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - DB13B1601849DEB70010F42D /* Debug */, - DB13B1611849DEB70010F42D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - DB13B18B1849DF1E0010F42D /* Build configuration list for PBXNativeTarget "libffi-iOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - DB13B1871849DF1E0010F42D /* Debug */, - DB13B1881849DF1E0010F42D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - DB13B1B01849DF520010F42D /* Build configuration list for PBXNativeTarget "libffi-Mac" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - DB13B1B11849DF520010F42D /* Debug */, - DB13B1B21849DF520010F42D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - FDB52FC21F6144FA00AA92E6 /* Build configuration list for PBXNativeTarget "libffi-tvOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - FDB52FC31F6144FA00AA92E6 /* Debug */, - FDB52FC41F6144FA00AA92E6 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - FDDB2F5F1F5D846400EF414E /* Build configuration list for PBXNativeTarget "libffi-static-Mac" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - FDDB2F601F5D846400EF414E /* Debug */, - FDDB2F611F5D846400EF414E /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = DB13B15C1849DEB70010F42D /* Project object */; -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/libtool-version b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/libtool-version deleted file mode 100644 index 607fee5..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/libtool-version +++ /dev/null @@ -1,29 +0,0 @@ -# This file is used to maintain libtool version info for libffi. See -# the libtool manual to understand the meaning of the fields. This is -# a separate file so that version updates don't involve re-running -# automake. -# -# Here are a set of rules to help you update your library version -# information: -# -# 1. Start with version information of `0:0:0' for each libtool library. -# -# 2. Update the version information only immediately before a public -# release of your software. More frequent updates are unnecessary, -# and only guarantee that the current interface number gets larger -# faster. -# -# 3. If the library source code has changed at all since the last -# update, then increment revision (`c:r:a' becomes `c:r+1:a'). -# -# 4. If any interfaces have been added, removed, or changed since the -# last update, increment current, and set revision to 0. -# -# 5. If any interfaces have been added since the last public release, -# then increment age. -# -# 6. If any interfaces have been removed since the last public -# release, then set age to 0. -# -# CURRENT:REVISION:AGE -9:0:1 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/asmcfi.m4 b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/asmcfi.m4 deleted file mode 100644 index 3e28602..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/asmcfi.m4 +++ /dev/null @@ -1,13 +0,0 @@ -AC_DEFUN([GCC_AS_CFI_PSEUDO_OP], -[AC_CACHE_CHECK([assembler .cfi pseudo-op support], - gcc_cv_as_cfi_pseudo_op, [ - gcc_cv_as_cfi_pseudo_op=unknown - AC_TRY_COMPILE([asm (".cfi_sections\n\t.cfi_startproc\n\t.cfi_endproc");],, - [gcc_cv_as_cfi_pseudo_op=yes], - [gcc_cv_as_cfi_pseudo_op=no]) - ]) - if test "x$gcc_cv_as_cfi_pseudo_op" = xyes; then - AC_DEFINE(HAVE_AS_CFI_PSEUDO_OP, 1, - [Define if your assembler supports .cfi_* directives.]) - fi -]) diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/ax_append_flag.m4 b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/ax_append_flag.m4 deleted file mode 100644 index dd6d8b6..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/ax_append_flag.m4 +++ /dev/null @@ -1,50 +0,0 @@ -# =========================================================================== -# https://www.gnu.org/software/autoconf-archive/ax_append_flag.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_APPEND_FLAG(FLAG, [FLAGS-VARIABLE]) -# -# DESCRIPTION -# -# FLAG is appended to the FLAGS-VARIABLE shell variable, with a space -# added in between. -# -# If FLAGS-VARIABLE is not specified, the current language's flags (e.g. -# CFLAGS) is used. FLAGS-VARIABLE is not changed if it already contains -# FLAG. If FLAGS-VARIABLE is unset in the shell, it is set to exactly -# FLAG. -# -# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. -# -# LICENSE -# -# Copyright (c) 2008 Guido U. Draheim -# Copyright (c) 2011 Maarten Bosmans -# -# Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice -# and this notice are preserved. This file is offered as-is, without any -# warranty. - -#serial 8 - -AC_DEFUN([AX_APPEND_FLAG], -[dnl -AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_SET_IF -AS_VAR_PUSHDEF([FLAGS], [m4_default($2,_AC_LANG_PREFIX[FLAGS])]) -AS_VAR_SET_IF(FLAGS,[ - AS_CASE([" AS_VAR_GET(FLAGS) "], - [*" $1 "*], [AC_RUN_LOG([: FLAGS already contains $1])], - [ - AS_VAR_APPEND(FLAGS,[" $1"]) - AC_RUN_LOG([: FLAGS="$FLAGS"]) - ]) - ], - [ - AS_VAR_SET(FLAGS,[$1]) - AC_RUN_LOG([: FLAGS="$FLAGS"]) - ]) -AS_VAR_POPDEF([FLAGS])dnl -])dnl AX_APPEND_FLAG diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 deleted file mode 100644 index 9e7f1ee..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +++ /dev/null @@ -1,194 +0,0 @@ -# =========================================================================== -# https://www.gnu.org/software/autoconf-archive/ax_cc_maxopt.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_CC_MAXOPT -# -# DESCRIPTION -# -# Try to turn on "good" C optimization flags for various compilers and -# architectures, for some definition of "good". (In our case, good for -# FFTW and hopefully for other scientific codes. Modify as needed.) -# -# The user can override the flags by setting the CFLAGS environment -# variable. The user can also specify --enable-portable-binary in order to -# disable any optimization flags that might result in a binary that only -# runs on the host architecture. -# -# Note also that the flags assume that ANSI C aliasing rules are followed -# by the code (e.g. for gcc's -fstrict-aliasing), and that floating-point -# computations can be re-ordered as needed. -# -# Requires macros: AX_CHECK_COMPILE_FLAG, AX_COMPILER_VENDOR, -# AX_GCC_ARCHFLAG, AX_GCC_X86_CPUID. -# -# LICENSE -# -# Copyright (c) 2008 Steven G. Johnson -# Copyright (c) 2008 Matteo Frigo -# -# This program is free software: you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation, either version 3 of the License, or (at your -# option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -# Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program. If not, see . -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. - -#serial 17 - -AC_DEFUN([AX_CC_MAXOPT], -[ -AC_REQUIRE([AC_PROG_CC]) -AC_REQUIRE([AX_COMPILER_VENDOR]) -AC_REQUIRE([AC_CANONICAL_HOST]) - -AC_ARG_ENABLE(portable-binary, [AS_HELP_STRING([--enable-portable-binary], [disable compiler optimizations that would produce unportable binaries])], - acx_maxopt_portable=$enableval, acx_maxopt_portable=no) - -# Try to determine "good" native compiler flags if none specified via CFLAGS -if test "$ac_test_CFLAGS" != "set"; then - CFLAGS="" - case $ax_cv_c_compiler_vendor in - dec) CFLAGS="-newc -w0 -O5 -ansi_alias -ansi_args -fp_reorder -tune host" - if test "x$acx_maxopt_portable" = xno; then - CFLAGS="$CFLAGS -arch host" - fi;; - - sun) CFLAGS="-native -fast -xO5 -dalign" - if test "x$acx_maxopt_portable" = xyes; then - CFLAGS="$CFLAGS -xarch=generic" - fi;; - - hp) CFLAGS="+Oall +Optrs_ansi +DSnative" - if test "x$acx_maxopt_portable" = xyes; then - CFLAGS="$CFLAGS +DAportable" - fi;; - - ibm) if test "x$acx_maxopt_portable" = xno; then - xlc_opt="-qarch=auto -qtune=auto" - else - xlc_opt="-qtune=auto" - fi - AX_CHECK_COMPILE_FLAG($xlc_opt, - CFLAGS="-O3 -qansialias -w $xlc_opt", - [CFLAGS="-O3 -qansialias -w" - echo "******************************************************" - echo "* You seem to have the IBM C compiler. It is *" - echo "* recommended for best performance that you use: *" - echo "* *" - echo "* CFLAGS=-O3 -qarch=xxx -qtune=xxx -qansialias -w *" - echo "* ^^^ ^^^ *" - echo "* where xxx is pwr2, pwr3, 604, or whatever kind of *" - echo "* CPU you have. (Set the CFLAGS environment var. *" - echo "* and re-run configure.) For more info, man cc. *" - echo "******************************************************"]) - ;; - - intel) CFLAGS="-O3 -ansi_alias" - if test "x$acx_maxopt_portable" = xno; then - icc_archflag=unknown - icc_flags="" - case $host_cpu in - i686*|x86_64*) - # icc accepts gcc assembly syntax, so these should work: - AX_GCC_X86_CPUID(0) - AX_GCC_X86_CPUID(1) - case $ax_cv_gcc_x86_cpuid_0 in # see AX_GCC_ARCHFLAG - *:756e6547:6c65746e:49656e69) # Intel - case $ax_cv_gcc_x86_cpuid_1 in - *0?6[[78ab]]?:*:*:*|?6[[78ab]]?:*:*:*|6[[78ab]]?:*:*:*) icc_flags="-xK" ;; - *0?6[[9d]]?:*:*:*|?6[[9d]]?:*:*:*|6[[9d]]?:*:*:*|*1?65?:*:*:*) icc_flags="-xSSE2 -xB -xK" ;; - *0?6e?:*:*:*|?6e?:*:*:*|6e?:*:*:*) icc_flags="-xSSE3 -xP -xO -xB -xK" ;; - *0?6f?:*:*:*|?6f?:*:*:*|6f?:*:*:*|*1?66?:*:*:*) icc_flags="-xSSSE3 -xT -xB -xK" ;; - *1?6[[7d]]?:*:*:*) icc_flags="-xSSE4.1 -xS -xT -xB -xK" ;; - *1?6[[aef]]?:*:*:*|*2?6[[5cef]]?:*:*:*) icc_flags="-xSSE4.2 -xS -xT -xB -xK" ;; - *2?6[[ad]]?:*:*:*) icc_flags="-xAVX -SSE4.2 -xS -xT -xB -xK" ;; - *3?6[[ae]]?:*:*:*) icc_flags="-xCORE-AVX-I -xAVX -SSE4.2 -xS -xT -xB -xK" ;; - *3?6[[cf]]?:*:*:*|*4?6[[56]]?:*:*:*) icc_flags="-xCORE-AVX2 -xCORE-AVX-I -xAVX -SSE4.2 -xS -xT -xB -xK" ;; - *000?f[[346]]?:*:*:*|?f[[346]]?:*:*:*|f[[346]]?:*:*:*) icc_flags="-xSSE3 -xP -xO -xN -xW -xK" ;; - *00??f??:*:*:*|??f??:*:*:*|?f??:*:*:*|f??:*:*:*) icc_flags="-xSSE2 -xN -xW -xK" ;; - esac ;; - esac ;; - esac - if test "x$icc_flags" != x; then - for flag in $icc_flags; do - AX_CHECK_COMPILE_FLAG($flag, [icc_archflag=$flag; break]) - done - fi - AC_MSG_CHECKING([for icc architecture flag]) - AC_MSG_RESULT($icc_archflag) - if test "x$icc_archflag" != xunknown; then - CFLAGS="$CFLAGS $icc_archflag" - fi - fi - ;; - - gnu) - # default optimization flags for gcc on all systems - CFLAGS="-O3 -fomit-frame-pointer" - - # -malign-double for x86 systems - # libffi local change -- don't align double, as it changes the ABI - # AX_CHECK_COMPILE_FLAG(-malign-double, CFLAGS="$CFLAGS -malign-double") - - # -fstrict-aliasing for gcc-2.95+ - AX_CHECK_COMPILE_FLAG(-fstrict-aliasing, - CFLAGS="$CFLAGS -fstrict-aliasing") - - # note that we enable "unsafe" fp optimization with other compilers, too - AX_CHECK_COMPILE_FLAG(-ffast-math, CFLAGS="$CFLAGS -ffast-math") - - AX_GCC_ARCHFLAG($acx_maxopt_portable) - ;; - - microsoft) - # default optimization flags for MSVC opt builds - CFLAGS="-O2" - ;; - esac - - if test -z "$CFLAGS"; then - echo "" - echo "********************************************************" - echo "* WARNING: Don't know the best CFLAGS for this system *" - echo "* Use ./configure CFLAGS=... to specify your own flags *" - echo "* (otherwise, a default of CFLAGS=-O3 will be used) *" - echo "********************************************************" - echo "" - CFLAGS="-O3" - fi - - AX_CHECK_COMPILE_FLAG($CFLAGS, [], [ - echo "" - echo "********************************************************" - echo "* WARNING: The guessed CFLAGS don't seem to work with *" - echo "* your compiler. *" - echo "* Use ./configure CFLAGS=... to specify your own flags *" - echo "********************************************************" - echo "" - CFLAGS="" - ]) - -fi -]) diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 deleted file mode 100644 index 094577e..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +++ /dev/null @@ -1,122 +0,0 @@ -# =========================================================================== -# https://www.gnu.org/software/autoconf-archive/ax_cflags_warn_all.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_CFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])] -# AX_CXXFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])] -# AX_FCFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])] -# -# DESCRIPTION -# -# Try to find a compiler option that enables most reasonable warnings. -# -# For the GNU compiler it will be -Wall (and -ansi -pedantic) The result -# is added to the shellvar being CFLAGS, CXXFLAGS, or FCFLAGS by default. -# -# Currently this macro knows about the GCC, Solaris, Digital Unix, AIX, -# HP-UX, IRIX, NEC SX-5 (Super-UX 10), Cray J90 (Unicos 10.0.0.8), and -# Intel compilers. For a given compiler, the Fortran flags are much more -# experimental than their C equivalents. -# -# - $1 shell-variable-to-add-to : CFLAGS, CXXFLAGS, or FCFLAGS -# - $2 add-value-if-not-found : nothing -# - $3 action-if-found : add value to shellvariable -# - $4 action-if-not-found : nothing -# -# NOTE: These macros depend on AX_APPEND_FLAG. -# -# LICENSE -# -# Copyright (c) 2008 Guido U. Draheim -# Copyright (c) 2010 Rhys Ulerich -# -# This program is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation; either version 3 of the License, or (at your -# option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -# Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program. If not, see . -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. - -#serial 16 - -AC_DEFUN([AX_FLAGS_WARN_ALL],[dnl -AS_VAR_PUSHDEF([FLAGS],[_AC_LANG_PREFIX[]FLAGS])dnl -AS_VAR_PUSHDEF([VAR],[ac_cv_[]_AC_LANG_ABBREV[]flags_warn_all])dnl -AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for maximum warnings], -VAR,[VAR="no, unknown" -ac_save_[]FLAGS="$[]FLAGS" -for ac_arg dnl -in "-warn all % -warn all" dnl Intel - "-pedantic % -Wall" dnl GCC - "-xstrconst % -v" dnl Solaris C - "-std1 % -verbose -w0 -warnprotos" dnl Digital Unix - "-qlanglvl=ansi % -qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd" dnl AIX - "-ansi -ansiE % -fullwarn" dnl IRIX - "+ESlit % +w1" dnl HP-UX C - "-Xc % -pvctl[,]fullmsg" dnl NEC SX-5 (Super-UX 10) - "-h conform % -h msglevel 2" dnl Cray C (Unicos) - # -do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` - AC_COMPILE_IFELSE([AC_LANG_PROGRAM], - [VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break]) -done -FLAGS="$ac_save_[]FLAGS" -]) -AS_VAR_POPDEF([FLAGS])dnl -AX_REQUIRE_DEFINED([AX_APPEND_FLAG]) -case ".$VAR" in - .ok|.ok,*) m4_ifvaln($3,$3) ;; - .|.no|.no,*) m4_default($4,[m4_ifval($2,[AX_APPEND_FLAG([$2], [$1])])]) ;; - *) m4_default($3,[AX_APPEND_FLAG([$VAR], [$1])]) ;; -esac -AS_VAR_POPDEF([VAR])dnl -])dnl AX_FLAGS_WARN_ALL -dnl implementation tactics: -dnl the for-argument contains a list of options. The first part of -dnl these does only exist to detect the compiler - usually it is -dnl a global option to enable -ansi or -extrawarnings. All other -dnl compilers will fail about it. That was needed since a lot of -dnl compilers will give false positives for some option-syntax -dnl like -Woption or -Xoption as they think of it is a pass-through -dnl to later compile stages or something. The "%" is used as a -dnl delimiter. A non-option comment can be given after "%%" marks -dnl which will be shown but not added to the respective C/CXXFLAGS. - -AC_DEFUN([AX_CFLAGS_WARN_ALL],[dnl -AC_LANG_PUSH([C]) -AX_FLAGS_WARN_ALL([$1], [$2], [$3], [$4]) -AC_LANG_POP([C]) -]) - -AC_DEFUN([AX_CXXFLAGS_WARN_ALL],[dnl -AC_LANG_PUSH([C++]) -AX_FLAGS_WARN_ALL([$1], [$2], [$3], [$4]) -AC_LANG_POP([C++]) -]) - -AC_DEFUN([AX_FCFLAGS_WARN_ALL],[dnl -AC_LANG_PUSH([Fortran]) -AX_FLAGS_WARN_ALL([$1], [$2], [$3], [$4]) -AC_LANG_POP([Fortran]) -]) diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/ax_check_compile_flag.m4 b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/ax_check_compile_flag.m4 deleted file mode 100644 index bd753b3..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/ax_check_compile_flag.m4 +++ /dev/null @@ -1,53 +0,0 @@ -# =========================================================================== -# https://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) -# -# DESCRIPTION -# -# Check whether the given FLAG works with the current language's compiler -# or gives an error. (Warnings, however, are ignored) -# -# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on -# success/failure. -# -# If EXTRA-FLAGS is defined, it is added to the current language's default -# flags (e.g. CFLAGS) when the check is done. The check is thus made with -# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to -# force the compiler to issue an error when a bad flag is given. -# -# INPUT gives an alternative input source to AC_COMPILE_IFELSE. -# -# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this -# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG. -# -# LICENSE -# -# Copyright (c) 2008 Guido U. Draheim -# Copyright (c) 2011 Maarten Bosmans -# -# Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice -# and this notice are preserved. This file is offered as-is, without any -# warranty. - -#serial 6 - -AC_DEFUN([AX_CHECK_COMPILE_FLAG], -[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF -AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl -AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [ - ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS - _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1" - AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], - [AS_VAR_SET(CACHEVAR,[yes])], - [AS_VAR_SET(CACHEVAR,[no])]) - _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags]) -AS_VAR_IF(CACHEVAR,yes, - [m4_default([$2], :)], - [m4_default([$3], :)]) -AS_VAR_POPDEF([CACHEVAR])dnl -])dnl AX_CHECK_COMPILE_FLAGS diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 deleted file mode 100644 index 73efdb0..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +++ /dev/null @@ -1,88 +0,0 @@ -# =========================================================================== -# https://www.gnu.org/software/autoconf-archive/ax_compiler_vendor.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_COMPILER_VENDOR -# -# DESCRIPTION -# -# Determine the vendor of the C/C++ compiler, e.g., gnu, intel, ibm, sun, -# hp, borland, comeau, dec, cray, kai, lcc, metrowerks, sgi, microsoft, -# watcom, etc. The vendor is returned in the cache variable -# $ax_cv_c_compiler_vendor for C and $ax_cv_cxx_compiler_vendor for C++. -# -# LICENSE -# -# Copyright (c) 2008 Steven G. Johnson -# Copyright (c) 2008 Matteo Frigo -# -# This program is free software: you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation, either version 3 of the License, or (at your -# option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -# Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program. If not, see . -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. - -#serial 17 - -AC_DEFUN([AX_COMPILER_VENDOR], -[AC_CACHE_CHECK([for _AC_LANG compiler vendor], ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor, - dnl Please add if possible support to ax_compiler_version.m4 - [# note: don't check for gcc first since some other compilers define __GNUC__ - vendors="intel: __ICC,__ECC,__INTEL_COMPILER - ibm: __xlc__,__xlC__,__IBMC__,__IBMCPP__ - pathscale: __PATHCC__,__PATHSCALE__ - clang: __clang__ - cray: _CRAYC - fujitsu: __FUJITSU - sdcc: SDCC, __SDCC - gnu: __GNUC__ - sun: __SUNPRO_C,__SUNPRO_CC - hp: __HP_cc,__HP_aCC - dec: __DECC,__DECCXX,__DECC_VER,__DECCXX_VER - borland: __BORLANDC__,__CODEGEARC__,__TURBOC__ - comeau: __COMO__ - kai: __KCC - lcc: __LCC__ - sgi: __sgi,sgi - microsoft: _MSC_VER - metrowerks: __MWERKS__ - watcom: __WATCOMC__ - portland: __PGI - tcc: __TINYC__ - unknown: UNKNOWN" - for ventest in $vendors; do - case $ventest in - *:) vendor=$ventest; continue ;; - *) vencpp="defined("`echo $ventest | sed 's/,/) || defined(/g'`")" ;; - esac - AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[ - #if !($vencpp) - thisisanerror; - #endif - ])], [break]) - done - ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor=`echo $vendor | cut -d: -f1` - ]) -]) diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/ax_configure_args.m4 b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/ax_configure_args.m4 deleted file mode 100644 index 9237efe..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/ax_configure_args.m4 +++ /dev/null @@ -1,49 +0,0 @@ -# =========================================================================== -# https://www.gnu.org/software/autoconf-archive/ax_configure_args.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_CONFIGURE_ARGS -# -# DESCRIPTION -# -# Helper macro for AX_ENABLE_BUILDDIR. -# -# The traditional way of starting a subdir-configure is running the script -# with ${1+"$@"} but since autoconf 2.60 this is broken. Instead we have -# to rely on eval'ing $ac_configure_args however some old autoconf -# versions do not provide that. To ensure maximum portability of autoconf -# extension macros this helper can be AC_REQUIRE'd so that -# $ac_configure_args will always be present. -# -# Sadly, the traditional "exec $SHELL" of the enable_builddir macros is -# spoiled now and must be replaced by "eval + exit $?". -# -# Example: -# -# AC_DEFUN([AX_ENABLE_SUBDIR],[dnl -# AC_REQUIRE([AX_CONFIGURE_ARGS])dnl -# eval $SHELL $ac_configure_args || exit $? -# ...]) -# -# LICENSE -# -# Copyright (c) 2008 Guido U. Draheim -# -# Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice -# and this notice are preserved. This file is offered as-is, without any -# warranty. - -#serial 14 - -AC_DEFUN([AX_CONFIGURE_ARGS],[ - # [$]@ is unusable in 2.60+ but earlier autoconf had no ac_configure_args - if test "${ac_configure_args+set}" != "set" ; then - ac_configure_args= - for ac_arg in ${1+"[$]@"}; do - ac_configure_args="$ac_configure_args '$ac_arg'" - done - fi -]) diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 deleted file mode 100644 index 710384d..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 +++ /dev/null @@ -1,302 +0,0 @@ -# =========================================================================== -# https://www.gnu.org/software/autoconf-archive/ax_enable_builddir.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_ENABLE_BUILDDIR [(dirstring-or-command [,Makefile.mk [,-all]])] -# -# DESCRIPTION -# -# If the current configure was run within the srcdir then we move all -# configure-files into a subdir and let the configure steps continue -# there. We provide an option --disable-builddir to suppress the move into -# a separate builddir. -# -# Defaults: -# -# $1 = $host (overridden with $HOST) -# $2 = Makefile.mk -# $3 = -all -# -# This macro must be called before AM_INIT_AUTOMAKE. It creates a default -# toplevel srcdir Makefile from the information found in the created -# toplevel builddir Makefile. It just copies the variables and -# rule-targets, each extended with a default rule-execution that recurses -# into the build directory of the current "HOST". You can override the -# auto-detection through `config.guess` and build-time of course, as in -# -# make HOST=i386-mingw-cross -# -# which can of course set at configure time as well using -# -# configure --host=i386-mingw-cross -# -# After the default has been created, additional rules can be appended -# that will not just recurse into the subdirectories and only ever exist -# in the srcdir toplevel makefile - these parts are read from the $2 = -# Makefile.mk file -# -# The automatic rules are usually scanning the toplevel Makefile for lines -# like '#### $host |$builddir' to recognize the place where to recurse -# into. Usually, the last one is the only one used. However, almost all -# targets have an additional "*-all" rule which makes the script to -# recurse into _all_ variants of the current HOST (!!) setting. The "-all" -# suffix can be overridden for the macro as well. -# -# a special rule is only given for things like "dist" that will copy the -# tarball from the builddir to the sourcedir (or $(PUB)) for reason of -# convenience. -# -# LICENSE -# -# Copyright (c) 2009 Guido U. Draheim -# Copyright (c) 2009 Alan Jenkins -# -# This program is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation; either version 3 of the License, or (at your -# option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -# Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program. If not, see . -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. - -#serial 30 - -AC_DEFUN([AX_ENABLE_BUILDDIR],[ -AC_REQUIRE([AC_CANONICAL_HOST])[]dnl -AC_REQUIRE([AC_CANONICAL_TARGET])[]dnl -AC_REQUIRE([AX_CONFIGURE_ARGS])[]dnl -AC_REQUIRE([AM_AUX_DIR_EXPAND])[]dnl -AC_BEFORE([$0],[AM_INIT_AUTOMAKE])dnl -AS_VAR_PUSHDEF([SUB],[ax_enable_builddir])dnl -AS_VAR_PUSHDEF([AUX],[ax_enable_builddir_auxdir])dnl -AS_VAR_PUSHDEF([SED],[ax_enable_builddir_sed])dnl -SUB="." -AC_ARG_ENABLE([builddir], AS_HELP_STRING( - [--disable-builddir],[disable automatic build in subdir of sources]) - ,[SUB="$enableval"], [SUB="auto"]) -if test ".$ac_srcdir_defaulted" != ".no" ; then -if test ".$srcdir" = ".." ; then - if test -f config.status ; then - AC_MSG_NOTICE(toplevel srcdir already configured... skipping subdir build) - else - test ".$SUB" = "." && SUB="." - test ".$SUB" = ".no" && SUB="." - test ".$TARGET" = "." && TARGET="$target" - test ".$SUB" = ".auto" && SUB="m4_ifval([$1], [$1],[$TARGET])" - if test ".$SUB" != ".." ; then # we know where to go and - AS_MKDIR_P([$SUB]) - echo __.$SUB.__ > $SUB/conftest.tmp - cd $SUB - if grep __.$SUB.__ conftest.tmp >/dev/null 2>/dev/null ; then - rm conftest.tmp - AC_MSG_RESULT([continue configure in default builddir "./$SUB"]) - else - AC_MSG_ERROR([could not change to default builddir "./$SUB"]) - fi - srcdir=`echo "$SUB" | - sed -e 's,^\./,,;s,[[^/]]$,&/,;s,[[^/]]*/,../,g;s,[[/]]$,,;'` - # going to restart from subdirectory location - test -f $srcdir/config.log && mv $srcdir/config.log . - test -f $srcdir/confdefs.h && mv $srcdir/confdefs.h . - test -f $srcdir/conftest.log && mv $srcdir/conftest.log . - test -f $srcdir/$cache_file && mv $srcdir/$cache_file . - AC_MSG_RESULT(....exec $SHELL $srcdir/[$]0 "--srcdir=$srcdir" "--enable-builddir=$SUB" ${1+"[$]@"}) - case "[$]0" in # restart - [[\\/]]* | ?:[[\\/]]*) # Absolute name - eval $SHELL "'[$]0'" "'--srcdir=$srcdir'" "'--enable-builddir=$SUB'" $ac_configure_args ;; - *) eval $SHELL "'$srcdir/[$]0'" "'--srcdir=$srcdir'" "'--enable-builddir=$SUB'" $ac_configure_args ;; - esac ; exit $? - fi - fi -fi fi -test ".$SUB" = ".auto" && SUB="." -dnl ac_path_prog uses "set dummy" to override $@ which would defeat the "exec" -AC_PATH_PROG(SED,gsed sed, sed) -AUX="$am_aux_dir" -AS_VAR_POPDEF([SED])dnl -AS_VAR_POPDEF([AUX])dnl -AS_VAR_POPDEF([SUB])dnl -AC_CONFIG_COMMANDS([buildir],[dnl .............. config.status .............. -AS_VAR_PUSHDEF([SUB],[ax_enable_builddir])dnl -AS_VAR_PUSHDEF([TOP],[top_srcdir])dnl -AS_VAR_PUSHDEF([SRC],[ac_top_srcdir])dnl -AS_VAR_PUSHDEF([AUX],[ax_enable_builddir_auxdir])dnl -AS_VAR_PUSHDEF([SED],[ax_enable_builddir_sed])dnl -pushdef([END],[Makefile.mk])dnl -pushdef([_ALL],[ifelse([$3],,[-all],[$3])])dnl - SRC="$ax_enable_builddir_srcdir" - if test ".$SUB" = ".." ; then - if test -f "$TOP/Makefile" ; then - AC_MSG_NOTICE([skipping TOP/Makefile - left untouched]) - else - AC_MSG_NOTICE([skipping TOP/Makefile - not created]) - fi - else - if test -f "$SRC/Makefile" ; then - a=`grep "^VERSION " "$SRC/Makefile"` ; b=`grep "^VERSION " Makefile` - test "$a" != "$b" && rm "$SRC/Makefile" - fi - if test -f "$SRC/Makefile" ; then - echo "$SRC/Makefile : $SRC/Makefile.in" > $tmp/conftemp.mk - echo " []@ echo 'REMOVED,,,' >\$[]@" >> $tmp/conftemp.mk - eval "${MAKE-make} -f $tmp/conftemp.mk 2>/dev/null >/dev/null" - if grep '^REMOVED,,,' "$SRC/Makefile" >/dev/null - then rm $SRC/Makefile ; fi - cp $tmp/conftemp.mk $SRC/makefiles.mk~ ## DEBUGGING - fi - if test ! -f "$SRC/Makefile" ; then - AC_MSG_NOTICE([create TOP/Makefile guessed from local Makefile]) - x='`' ; cat >$tmp/conftemp.sed <<_EOF -/^\$/n -x -/^\$/bS -x -/\\\\\$/{H;d;} -{H;s/.*//;x;} -bM -:S -x -/\\\\\$/{h;d;} -{h;s/.*//;x;} -:M -s/\\(\\n\\) /\\1 /g -/^ /d -/^[[ ]]*[[\\#]]/d -/^VPATH *=/d -s/^srcdir *=.*/srcdir = ./ -s/^top_srcdir *=.*/top_srcdir = ./ -/[[:=]]/!d -/^\\./d -dnl Now handle rules (i.e. lines containing ":" but not " = "). -/ = /b -/ .= /b -/:/!b -s/:.*/:/ -s/ / /g -s/ \\([[a-z]][[a-z-]]*[[a-zA-Z0-9]]\\)\\([[ :]]\\)/ \\1 \\1[]_ALL\\2/g -s/^\\([[a-z]][[a-z-]]*[[a-zA-Z0-9]]\\)\\([[ :]]\\)/\\1 \\1[]_ALL\\2/ -s/ / /g -/^all all[]_ALL[[ :]]/i\\ -all-configured : all[]_ALL -dnl dist-all exists... and would make for dist-all-all -s/ [[a-zA-Z0-9-]]*[]_ALL [[a-zA-Z0-9-]]*[]_ALL[]_ALL//g -/[]_ALL[]_ALL/d -a\\ - @ HOST="\$(HOST)\" \\\\\\ - ; test ".\$\$HOST" = "." && HOST=$x sh $AUX/config.guess $x \\\\\\ - ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\ - ; use=$x basename "\$\@" _ALL $x; n=$x echo \$\$BUILD | wc -w $x \\\\\\ - ; echo "MAKE \$\$HOST : \$\$n * \$\@"; if test "\$\$n" -eq "0" ; then : \\\\\\ - ; BUILD=$x grep "^####.*|" Makefile |tail -1| sed -e 's/.*|//' $x ; fi \\\\\\ - ; test ".\$\$BUILD" = "." && BUILD="." \\\\\\ - ; test "\$\$use" = "\$\@" && BUILD=$x echo "\$\$BUILD" | tail -1 $x \\\\\\ - ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ - ; (cd "\$\$i" && test ! -f configure && \$(MAKE) \$\$use) || exit; done -dnl special rule add-on: "dist" copies the tarball to $(PUB). (source tree) -/dist[]_ALL *:/a\\ - @ HOST="\$(HOST)\" \\\\\\ - ; test ".\$\$HOST" = "." && HOST=$x sh $AUX/config.guess $x \\\\\\ - ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\ - ; found=$x echo \$\$BUILD | wc -w $x \\\\\\ - ; echo "MAKE \$\$HOST : \$\$found \$(PACKAGE)-\$(VERSION).tar.*" \\\\\\ - ; if test "\$\$found" -eq "0" ; then : \\\\\\ - ; BUILD=$x grep "^#### .*|" Makefile |tail -1| sed -e 's/.*|//' $x \\\\\\ - ; fi ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ - ; for f in \$\$i/\$(PACKAGE)-\$(VERSION).tar.* \\\\\\ - ; do test -f "\$\$f" && mv "\$\$f" \$(PUB). ; done ; break ; done -dnl special rule add-on: "dist-foo" copies all the archives to $(PUB). (source tree) -/dist-[[a-zA-Z0-9]]*[]_ALL *:/a\\ - @ HOST="\$(HOST)\" \\\\\\ - ; test ".\$\$HOST" = "." && HOST=$x sh ./config.guess $x \\\\\\ - ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\ - ; found=$x echo \$\$BUILD | wc -w $x \\\\\\ - ; echo "MAKE \$\$HOST : \$\$found \$(PACKAGE)-\$(VERSION).*" \\\\\\ - ; if test "\$\$found" -eq "0" ; then : \\\\\\ - ; BUILD=$x grep "^#### .*|" Makefile |tail -1| sed -e 's/.*|//' $x \\\\\\ - ; fi ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ - ; for f in \$\$i/\$(PACKAGE)-\$(VERSION).* \\\\\\ - ; do test -f "\$\$f" && mv "\$\$f" \$(PUB). ; done ; break ; done -dnl special rule add-on: "distclean" removes all local builddirs completely -/distclean[]_ALL *:/a\\ - @ HOST="\$(HOST)\" \\\\\\ - ; test ".\$\$HOST" = "." && HOST=$x sh $AUX/config.guess $x \\\\\\ - ; BUILD=$x grep "^#### .*|" Makefile | sed -e 's/.*|//' $x \\\\\\ - ; use=$x basename "\$\@" _ALL $x; n=$x echo \$\$BUILD | wc -w $x \\\\\\ - ; echo "MAKE \$\$HOST : \$\$n * \$\@ (all local builds)" \\\\\\ - ; test ".\$\$BUILD" = "." && BUILD="." \\\\\\ - ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ - ; echo "# rm -r \$\$i"; done ; echo "# (sleep 3)" ; sleep 3 \\\\\\ - ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ - ; echo "\$\$i" | grep "^/" > /dev/null && continue \\\\\\ - ; echo "\$\$i" | grep "^../" > /dev/null && continue \\\\\\ - ; echo "rm -r \$\$i"; (rm -r "\$\$i") ; done ; rm Makefile -_EOF - cp "$tmp/conftemp.sed" "$SRC/makefile.sed~" ## DEBUGGING - $SED -f $tmp/conftemp.sed Makefile >$SRC/Makefile - if test -f "$SRC/m4_ifval([$2],[$2],[END])" ; then - AC_MSG_NOTICE([extend TOP/Makefile with TOP/m4_ifval([$2],[$2],[END])]) - cat $SRC/END >>$SRC/Makefile - fi ; xxxx="####" - echo "$xxxx CONFIGURATIONS FOR TOPLEVEL MAKEFILE: " >>$SRC/Makefile - # sanity check - if grep '^; echo "MAKE ' $SRC/Makefile >/dev/null ; then - AC_MSG_NOTICE([buggy sed found - it deletes tab in "a" text parts]) - $SED -e '/^@ HOST=/s/^/ /' -e '/^; /s/^/ /' $SRC/Makefile \ - >$SRC/Makefile~ - (test -s $SRC/Makefile~ && mv $SRC/Makefile~ $SRC/Makefile) 2>/dev/null - fi - else - xxxx="\\#\\#\\#\\#" - # echo "/^$xxxx *$ax_enable_builddir_host /d" >$tmp/conftemp.sed - echo "s!^$xxxx [[^|]]* | *$SUB *\$!$xxxx ...... $SUB!" >$tmp/conftemp.sed - $SED -f "$tmp/conftemp.sed" "$SRC/Makefile" >$tmp/mkfile.tmp - cp "$tmp/conftemp.sed" "$SRC/makefiles.sed~" ## DEBUGGING - cp "$tmp/mkfile.tmp" "$SRC/makefiles.out~" ## DEBUGGING - if cmp -s "$SRC/Makefile" "$tmp/mkfile.tmp" 2>/dev/null ; then - AC_MSG_NOTICE([keeping TOP/Makefile from earlier configure]) - rm "$tmp/mkfile.tmp" - else - AC_MSG_NOTICE([reusing TOP/Makefile from earlier configure]) - mv "$tmp/mkfile.tmp" "$SRC/Makefile" - fi - fi - AC_MSG_NOTICE([build in $SUB (HOST=$ax_enable_builddir_host)]) - xxxx="####" - echo "$xxxx" "$ax_enable_builddir_host" "|$SUB" >>$SRC/Makefile - fi -popdef([END])dnl -AS_VAR_POPDEF([SED])dnl -AS_VAR_POPDEF([AUX])dnl -AS_VAR_POPDEF([SRC])dnl -AS_VAR_POPDEF([TOP])dnl -AS_VAR_POPDEF([SUB])dnl -],[dnl -ax_enable_builddir_srcdir="$srcdir" # $srcdir -ax_enable_builddir_host="$HOST" # $HOST / $host -ax_enable_builddir_version="$VERSION" # $VERSION -ax_enable_builddir_package="$PACKAGE" # $PACKAGE -ax_enable_builddir_auxdir="$ax_enable_builddir_auxdir" # $AUX -ax_enable_builddir_sed="$ax_enable_builddir_sed" # $SED -ax_enable_builddir="$ax_enable_builddir" # $SUB -])dnl -]) diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 deleted file mode 100644 index c52b9b2..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +++ /dev/null @@ -1,267 +0,0 @@ -# =========================================================================== -# https://www.gnu.org/software/autoconf-archive/ax_gcc_archflag.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_GCC_ARCHFLAG([PORTABLE?], [ACTION-SUCCESS], [ACTION-FAILURE]) -# -# DESCRIPTION -# -# This macro tries to guess the "native" arch corresponding to the target -# architecture for use with gcc's -march=arch or -mtune=arch flags. If -# found, the cache variable $ax_cv_gcc_archflag is set to this flag and -# ACTION-SUCCESS is executed; otherwise $ax_cv_gcc_archflag is set to -# "unknown" and ACTION-FAILURE is executed. The default ACTION-SUCCESS is -# to add $ax_cv_gcc_archflag to the end of $CFLAGS. -# -# PORTABLE? should be either [yes] (default) or [no]. In the former case, -# the flag is set to -mtune (or equivalent) so that the architecture is -# only used for tuning, but the instruction set used is still portable. In -# the latter case, the flag is set to -march (or equivalent) so that -# architecture-specific instructions are enabled. -# -# The user can specify --with-gcc-arch= in order to override the -# macro's choice of architecture, or --without-gcc-arch to disable this. -# -# When cross-compiling, or if $CC is not gcc, then ACTION-FAILURE is -# called unless the user specified --with-gcc-arch manually. -# -# Requires macros: AX_CHECK_COMPILE_FLAG, AX_GCC_X86_CPUID -# -# (The main emphasis here is on recent CPUs, on the principle that doing -# high-performance computing on old hardware is uncommon.) -# -# LICENSE -# -# Copyright (c) 2008 Steven G. Johnson -# Copyright (c) 2008 Matteo Frigo -# Copyright (c) 2014 Tsukasa Oi -# Copyright (c) 2017-2018 Alexey Kopytov -# -# This program is free software: you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation, either version 3 of the License, or (at your -# option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -# Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program. If not, see . -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. - -#serial 22 - -AC_DEFUN([AX_GCC_ARCHFLAG], -[AC_REQUIRE([AC_PROG_CC]) -AC_REQUIRE([AC_CANONICAL_HOST]) -AC_REQUIRE([AC_PROG_SED]) -AC_REQUIRE([AX_COMPILER_VENDOR]) - -AC_ARG_WITH(gcc-arch, [AS_HELP_STRING([--with-gcc-arch=], [use architecture for gcc -march/-mtune, instead of guessing])], - ax_gcc_arch=$withval, ax_gcc_arch=yes) - -AC_MSG_CHECKING([for gcc architecture flag]) -AC_MSG_RESULT([]) -AC_CACHE_VAL(ax_cv_gcc_archflag, -[ -ax_cv_gcc_archflag="unknown" - -if test "$GCC" = yes; then - -if test "x$ax_gcc_arch" = xyes; then -ax_gcc_arch="" -if test "$cross_compiling" = no; then -case $host_cpu in - i[[3456]]86*|x86_64*|amd64*) # use cpuid codes - AX_GCC_X86_CPUID(0) - AX_GCC_X86_CPUID(1) - case $ax_cv_gcc_x86_cpuid_0 in - *:756e6547:6c65746e:49656e69) # Intel - case $ax_cv_gcc_x86_cpuid_1 in - *5[[4578]]?:*:*:*) ax_gcc_arch="pentium-mmx pentium" ;; - *5[[123]]?:*:*:*) ax_gcc_arch=pentium ;; - *0?61?:*:*:*|?61?:*:*:*|61?:*:*:*) ax_gcc_arch=pentiumpro ;; - *0?6[[356]]?:*:*:*|?6[[356]]?:*:*:*|6[[356]]?:*:*:*) ax_gcc_arch="pentium2 pentiumpro" ;; - *0?6[[78ab]]?:*:*:*|?6[[78ab]]?:*:*:*|6[[78ab]]?:*:*:*) ax_gcc_arch="pentium3 pentiumpro" ;; - *0?6[[9d]]?:*:*:*|?6[[9d]]?:*:*:*|6[[9d]]?:*:*:*|*1?65?:*:*:*) ax_gcc_arch="pentium-m pentium3 pentiumpro" ;; - *0?6e?:*:*:*|?6e?:*:*:*|6e?:*:*:*) ax_gcc_arch="yonah pentium-m pentium3 pentiumpro" ;; - *0?6f?:*:*:*|?6f?:*:*:*|6f?:*:*:*|*1?66?:*:*:*) ax_gcc_arch="core2 pentium-m pentium3 pentiumpro" ;; - *1?6[[7d]]?:*:*:*) ax_gcc_arch="penryn core2 pentium-m pentium3 pentiumpro" ;; - *1?6[[aef]]?:*:*:*|*2?6e?:*:*:*) ax_gcc_arch="nehalem corei7 core2 pentium-m pentium3 pentiumpro" ;; - *2?6[[5cf]]?:*:*:*) ax_gcc_arch="westmere corei7 core2 pentium-m pentium3 pentiumpro" ;; - *2?6[[ad]]?:*:*:*) ax_gcc_arch="sandybridge corei7-avx corei7 core2 pentium-m pentium3 pentiumpro" ;; - *3?6[[ae]]?:*:*:*) ax_gcc_arch="ivybridge core-avx-i corei7-avx corei7 core2 pentium-m pentium3 pentiumpro" ;; - *3?6[[cf]]?:*:*:*|*4?6[[56]]?:*:*:*) ax_gcc_arch="haswell core-avx2 core-avx-i corei7-avx corei7 core2 pentium-m pentium3 pentiumpro" ;; - *3?6d?:*:*:*|*4?6[[7f]]?:*:*:*|*5?66?:*:*:*) ax_gcc_arch="broadwell core-avx2 core-avx-i corei7-avx corei7 core2 pentium-m pentium3 pentiumpro" ;; - *1?6c?:*:*:*|*2?6[[67]]?:*:*:*|*3?6[[56]]?:*:*:*) ax_gcc_arch="bonnell atom core2 pentium-m pentium3 pentiumpro" ;; - *3?67?:*:*:*|*[[45]]?6[[ad]]?:*:*:*) ax_gcc_arch="silvermont atom core2 pentium-m pentium3 pentiumpro" ;; - *000?f[[012]]?:*:*:*|?f[[012]]?:*:*:*|f[[012]]?:*:*:*) ax_gcc_arch="pentium4 pentiumpro" ;; - *000?f[[346]]?:*:*:*|?f[[346]]?:*:*:*|f[[346]]?:*:*:*) ax_gcc_arch="nocona prescott pentium4 pentiumpro" ;; - # fallback - *5??:*:*:*) ax_gcc_arch=pentium ;; - *??6??:*:*:*) ax_gcc_arch="core2 pentiumpro" ;; - *6??:*:*:*) ax_gcc_arch=pentiumpro ;; - *00??f??:*:*:*|??f??:*:*:*|?f??:*:*:*|f??:*:*:*) ax_gcc_arch="pentium4 pentiumpro" ;; - esac ;; - *:68747541:444d4163:69746e65) # AMD - case $ax_cv_gcc_x86_cpuid_1 in - *5[[67]]?:*:*:*) ax_gcc_arch=k6 ;; - *5[[8]]?:*:*:*) ax_gcc_arch="k6-2 k6" ;; - *5[[9d]]?:*:*:*) ax_gcc_arch="k6-3 k6" ;; - *6[[12]]?:*:*:*) ax_gcc_arch="athlon k7" ;; - *6[[34]]?:*:*:*) ax_gcc_arch="athlon-tbird k7" ;; - *6[[678a]]?:*:*:*) ax_gcc_arch="athlon-xp athlon-4 athlon k7" ;; - *000?f[[4578bcef]]?:*:*:*|?f[[4578bcef]]?:*:*:*|f[[4578bcef]]?:*:*:*|*001?f[[4578bcf]]?:*:*:*|1?f[[4578bcf]]?:*:*:*) ax_gcc_arch="athlon64 k8" ;; - *002?f[[13457bcf]]?:*:*:*|2?f[[13457bcf]]?:*:*:*|*004?f[[138bcf]]?:*:*:*|4?f[[138bcf]]?:*:*:*|*005?f[[df]]?:*:*:*|5?f[[df]]?:*:*:*|*006?f[[8bcf]]?:*:*:*|6?f[[8bcf]]?:*:*:*|*007?f[[cf]]?:*:*:*|7?f[[cf]]?:*:*:*|*00c?f1?:*:*:*|c?f1?:*:*:*|*020?f3?:*:*:*|20?f3?:*:*:*) ax_gcc_arch="athlon64-sse3 k8-sse3 athlon64 k8" ;; - *010?f[[245689a]]?:*:*:*|10?f[[245689a]]?:*:*:*|*030?f1?:*:*:*|30?f1?:*:*:*) ax_gcc_arch="barcelona amdfam10 k8" ;; - *050?f[[12]]?:*:*:*|50?f[[12]]?:*:*:*) ax_gcc_arch="btver1 amdfam10 k8" ;; - *060?f1?:*:*:*|60?f1?:*:*:*) ax_gcc_arch="bdver1 amdfam10 k8" ;; - *060?f2?:*:*:*|60?f2?:*:*:*|*061?f[[03]]?:*:*:*|61?f[[03]]?:*:*:*) ax_gcc_arch="bdver2 bdver1 amdfam10 k8" ;; - *063?f0?:*:*:*|63?f0?:*:*:*) ax_gcc_arch="bdver3 bdver2 bdver1 amdfam10 k8" ;; - *07[[03]]?f0?:*:*:*|7[[03]]?f0?:*:*:*) ax_gcc_arch="btver2 btver1 amdfam10 k8" ;; - # fallback - *0[[13]]??f??:*:*:*|[[13]]??f??:*:*:*) ax_gcc_arch="barcelona amdfam10 k8" ;; - *020?f??:*:*:*|20?f??:*:*:*) ax_gcc_arch="athlon64-sse3 k8-sse3 athlon64 k8" ;; - *05??f??:*:*:*|5??f??:*:*:*) ax_gcc_arch="btver1 amdfam10 k8" ;; - *060?f??:*:*:*|60?f??:*:*:*) ax_gcc_arch="bdver1 amdfam10 k8" ;; - *061?f??:*:*:*|61?f??:*:*:*) ax_gcc_arch="bdver2 bdver1 amdfam10 k8" ;; - *06??f??:*:*:*|6??f??:*:*:*) ax_gcc_arch="bdver3 bdver2 bdver1 amdfam10 k8" ;; - *070?f??:*:*:*|70?f??:*:*:*) ax_gcc_arch="btver2 btver1 amdfam10 k8" ;; - *???f??:*:*:*) ax_gcc_arch="amdfam10 k8" ;; - esac ;; - *:746e6543:736c7561:48727561) # IDT / VIA (Centaur) - case $ax_cv_gcc_x86_cpuid_1 in - *54?:*:*:*) ax_gcc_arch=winchip-c6 ;; - *5[[89]]?:*:*:*) ax_gcc_arch=winchip2 ;; - *66?:*:*:*) ax_gcc_arch=winchip2 ;; - *6[[78]]?:*:*:*) ax_gcc_arch=c3 ;; - *6[[9adf]]?:*:*:*) ax_gcc_arch="c3-2 c3" ;; - esac ;; - esac - if test x"$ax_gcc_arch" = x; then # fallback - case $host_cpu in - i586*) ax_gcc_arch=pentium ;; - i686*) ax_gcc_arch=pentiumpro ;; - esac - fi - ;; - - sparc*) - AC_PATH_PROG([PRTDIAG], [prtdiag], [prtdiag], [$PATH:/usr/platform/`uname -i`/sbin/:/usr/platform/`uname -m`/sbin/]) - cputype=`(((grep cpu /proc/cpuinfo | cut -d: -f2) ; ($PRTDIAG -v |grep -i sparc) ; grep -i cpu /var/run/dmesg.boot ) | head -n 1) 2> /dev/null` - cputype=`echo "$cputype" | tr -d ' -' | $SED 's/SPARCIIi/SPARCII/' |tr $as_cr_LETTERS $as_cr_letters` - case $cputype in - *ultrasparciv*) ax_gcc_arch="ultrasparc4 ultrasparc3 ultrasparc v9" ;; - *ultrasparciii*) ax_gcc_arch="ultrasparc3 ultrasparc v9" ;; - *ultrasparc*) ax_gcc_arch="ultrasparc v9" ;; - *supersparc*|*tms390z5[[05]]*) ax_gcc_arch="supersparc v8" ;; - *hypersparc*|*rt62[[056]]*) ax_gcc_arch="hypersparc v8" ;; - *cypress*) ax_gcc_arch=cypress ;; - esac ;; - - alphaev5) ax_gcc_arch=ev5 ;; - alphaev56) ax_gcc_arch=ev56 ;; - alphapca56) ax_gcc_arch="pca56 ev56" ;; - alphapca57) ax_gcc_arch="pca57 pca56 ev56" ;; - alphaev6) ax_gcc_arch=ev6 ;; - alphaev67) ax_gcc_arch=ev67 ;; - alphaev68) ax_gcc_arch="ev68 ev67" ;; - alphaev69) ax_gcc_arch="ev69 ev68 ev67" ;; - alphaev7) ax_gcc_arch="ev7 ev69 ev68 ev67" ;; - alphaev79) ax_gcc_arch="ev79 ev7 ev69 ev68 ev67" ;; - - powerpc*) - cputype=`((grep cpu /proc/cpuinfo | head -n 1 | cut -d: -f2 | cut -d, -f1 | $SED 's/ //g') ; /usr/bin/machine ; /bin/machine; grep CPU /var/run/dmesg.boot | head -n 1 | cut -d" " -f2) 2> /dev/null` - cputype=`echo $cputype | $SED -e 's/ppc//g;s/ *//g'` - case $cputype in - *750*) ax_gcc_arch="750 G3" ;; - *740[[0-9]]*) ax_gcc_arch="$cputype 7400 G4" ;; - *74[[4-5]][[0-9]]*) ax_gcc_arch="$cputype 7450 G4" ;; - *74[[0-9]][[0-9]]*) ax_gcc_arch="$cputype G4" ;; - *970*) ax_gcc_arch="970 G5 power4";; - *POWER4*|*power4*|*gq*) ax_gcc_arch="power4 970";; - *POWER5*|*power5*|*gr*|*gs*) ax_gcc_arch="power5 power4 970";; - 603ev|8240) ax_gcc_arch="$cputype 603e 603";; - *POWER7*) ax_gcc_arch="power7";; - *POWER8*) ax_gcc_arch="power8";; - *POWER9*) ax_gcc_arch="power9";; - *POWER10*) ax_gcc_arch="power10";; - *) ax_gcc_arch=$cputype ;; - esac - ax_gcc_arch="$ax_gcc_arch powerpc" - ;; - aarch64) - cpuimpl=`grep 'CPU implementer' /proc/cpuinfo 2> /dev/null | cut -d: -f2 | tr -d " " | head -n 1` - cpuarch=`grep 'CPU architecture' /proc/cpuinfo 2> /dev/null | cut -d: -f2 | tr -d " " | head -n 1` - cpuvar=`grep 'CPU variant' /proc/cpuinfo 2> /dev/null | cut -d: -f2 | tr -d " " | head -n 1` - case $cpuimpl in - 0x42) case $cpuarch in - 8) case $cpuvar in - 0x0) ax_gcc_arch="thunderx2t99 vulcan armv8.1-a armv8-a+lse armv8-a native" ;; - esac - ;; - esac - ;; - 0x43) case $cpuarch in - 8) case $cpuvar in - 0x0) ax_gcc_arch="thunderx armv8-a native" ;; - 0x1) ax_gcc_arch="thunderx+lse armv8.1-a armv8-a+lse armv8-a native" ;; - esac - ;; - esac - ;; - esac - ;; -esac -fi # not cross-compiling -fi # guess arch - -if test "x$ax_gcc_arch" != x -a "x$ax_gcc_arch" != xno; then -if test "x[]m4_default([$1],yes)" = xyes; then # if we require portable code - flag_prefixes="-mtune=" - if test "x$ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor" = xclang; then flag_prefixes="-march="; fi - # -mcpu=$arch and m$arch generate nonportable code on every arch except - # x86. And some other arches (e.g. Alpha) don't accept -mtune. Grrr. - case $host_cpu in i*86|x86_64*|amd64*) flag_prefixes="$flag_prefixes -mcpu= -m";; esac -else - flag_prefixes="-march= -mcpu= -m" -fi -for flag_prefix in $flag_prefixes; do - for arch in $ax_gcc_arch; do - flag="$flag_prefix$arch" - AX_CHECK_COMPILE_FLAG($flag, [if test "x$ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor" = xclang; then - if test "x[]m4_default([$1],yes)" = xyes; then - if test "x$flag" = "x-march=$arch"; then flag=-mtune=$arch; fi - fi - fi; ax_cv_gcc_archflag=$flag; break]) - done - test "x$ax_cv_gcc_archflag" = xunknown || break -done -fi - -fi # $GCC=yes -]) -AC_MSG_CHECKING([for gcc architecture flag]) -AC_MSG_RESULT($ax_cv_gcc_archflag) -if test "x$ax_cv_gcc_archflag" = xunknown; then - m4_default([$3],:) -else - m4_default([$2], [CFLAGS="$CFLAGS $ax_cv_gcc_archflag"]) -fi -]) diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4 b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4 deleted file mode 100644 index df95465..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4 +++ /dev/null @@ -1,89 +0,0 @@ -# =========================================================================== -# https://www.gnu.org/software/autoconf-archive/ax_gcc_x86_cpuid.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_GCC_X86_CPUID(OP) -# AX_GCC_X86_CPUID_COUNT(OP, COUNT) -# -# DESCRIPTION -# -# On Pentium and later x86 processors, with gcc or a compiler that has a -# compatible syntax for inline assembly instructions, run a small program -# that executes the cpuid instruction with input OP. This can be used to -# detect the CPU type. AX_GCC_X86_CPUID_COUNT takes an additional COUNT -# parameter that gets passed into register ECX before calling cpuid. -# -# On output, the values of the eax, ebx, ecx, and edx registers are stored -# as hexadecimal strings as "eax:ebx:ecx:edx" in the cache variable -# ax_cv_gcc_x86_cpuid_OP. -# -# If the cpuid instruction fails (because you are running a -# cross-compiler, or because you are not using gcc, or because you are on -# a processor that doesn't have this instruction), ax_cv_gcc_x86_cpuid_OP -# is set to the string "unknown". -# -# This macro mainly exists to be used in AX_GCC_ARCHFLAG. -# -# LICENSE -# -# Copyright (c) 2008 Steven G. Johnson -# Copyright (c) 2008 Matteo Frigo -# Copyright (c) 2015 Michael Petch -# -# This program is free software: you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation, either version 3 of the License, or (at your -# option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -# Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program. If not, see . -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. - -#serial 10 - -AC_DEFUN([AX_GCC_X86_CPUID], -[AX_GCC_X86_CPUID_COUNT($1, 0) -]) - -AC_DEFUN([AX_GCC_X86_CPUID_COUNT], -[AC_REQUIRE([AC_PROG_CC]) -AC_LANG_PUSH([C]) -AC_CACHE_CHECK(for x86 cpuid $1 output, ax_cv_gcc_x86_cpuid_$1, - [AC_RUN_IFELSE([AC_LANG_PROGRAM([#include ], [ - int op = $1, level = $2, eax, ebx, ecx, edx; - FILE *f; - __asm__ __volatile__ ("xchg %%ebx, %1\n" - "cpuid\n" - "xchg %%ebx, %1\n" - : "=a" (eax), "=r" (ebx), "=c" (ecx), "=d" (edx) - : "a" (op), "2" (level)); - - f = fopen("conftest_cpuid", "w"); if (!f) return 1; - fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx); - fclose(f); - return 0; -])], - [ax_cv_gcc_x86_cpuid_$1=`cat conftest_cpuid`; rm -f conftest_cpuid], - [ax_cv_gcc_x86_cpuid_$1=unknown; rm -f conftest_cpuid], - [ax_cv_gcc_x86_cpuid_$1=unknown])]) -AC_LANG_POP([C]) -]) diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/ax_require_defined.m4 b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/ax_require_defined.m4 deleted file mode 100644 index 17c3eab..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/m4/ax_require_defined.m4 +++ /dev/null @@ -1,37 +0,0 @@ -# =========================================================================== -# https://www.gnu.org/software/autoconf-archive/ax_require_defined.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_REQUIRE_DEFINED(MACRO) -# -# DESCRIPTION -# -# AX_REQUIRE_DEFINED is a simple helper for making sure other macros have -# been defined and thus are available for use. This avoids random issues -# where a macro isn't expanded. Instead the configure script emits a -# non-fatal: -# -# ./configure: line 1673: AX_CFLAGS_WARN_ALL: command not found -# -# It's like AC_REQUIRE except it doesn't expand the required macro. -# -# Here's an example: -# -# AX_REQUIRE_DEFINED([AX_CHECK_LINK_FLAG]) -# -# LICENSE -# -# Copyright (c) 2014 Mike Frysinger -# -# Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice -# and this notice are preserved. This file is offered as-is, without any -# warranty. - -#serial 2 - -AC_DEFUN([AX_REQUIRE_DEFINED], [dnl - m4_ifndef([$1], [m4_fatal([macro ]$1[ is not defined; is a m4 file missing?])]) -])dnl AX_REQUIRE_DEFINED diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/make_sunver.pl b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/make_sunver.pl deleted file mode 100644 index 8a90b1f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/make_sunver.pl +++ /dev/null @@ -1,333 +0,0 @@ -#!/usr/bin/perl -w - -# make_sunver.pl -# -# This script takes at least two arguments, a GNU style version script and -# a list of object and archive files, and generates a corresponding Sun -# style version script as follows: -# -# Each glob pattern, C++ mangled pattern or literal in the input script is -# matched against all global symbols in the input objects, emitting those -# that matched (or nothing if no match was found). -# A comment with the original pattern and its type is left in the output -# file to make it easy to understand the matches. -# -# It uses elfdump when present (native), GNU readelf otherwise. -# It depends on the GNU version of c++filt, since it must understand the -# GNU mangling style. - -use FileHandle; -use IPC::Open2; - -# Enforce C locale. -$ENV{'LC_ALL'} = "C"; -$ENV{'LANG'} = "C"; - -# Input version script, GNU style. -my $symvers = shift; - -########## -# Get all the symbols from the library, match them, and add them to a hash. - -my %sym_hash = (); - -# List of objects and archives to process. -my @OBJECTS = (); - -# List of shared objects to omit from processing. -my @SHAREDOBJS = (); - -# Filter out those input archives that have corresponding shared objects to -# avoid adding all symbols matched in the archive to the output map. -foreach $file (@ARGV) { - if (($so = $file) =~ s/\.a$/.so/ && -e $so) { - printf STDERR "omitted $file -> $so\n"; - push (@SHAREDOBJS, $so); - } else { - push (@OBJECTS, $file); - } -} - -# We need to detect and ignore hidden symbols. Solaris nm can only detect -# this in the harder to parse default output format, and GNU nm not at all, -# so use elfdump -s in the native case and GNU readelf -s otherwise. -# GNU objdump -t cannot be used since it produces a variable number of -# columns. - -# The path to elfdump. -my $elfdump = "/usr/ccs/bin/elfdump"; - -if (-f $elfdump) { - open ELFDUMP,$elfdump.' -s '.(join ' ',@OBJECTS).'|' or die $!; - my $skip_arsym = 0; - - while () { - chomp; - - # Ignore empty lines. - if (/^$/) { - # End of archive symbol table, stop skipping. - $skip_arsym = 0 if $skip_arsym; - next; - } - - # Keep skipping until end of archive symbol table. - next if ($skip_arsym); - - # Ignore object name header for individual objects and archives. - next if (/:$/); - - # Ignore table header lines. - next if (/^Symbol Table Section:/); - next if (/index.*value.*size/); - - # Start of archive symbol table: start skipping. - if (/^Symbol Table: \(archive/) { - $skip_arsym = 1; - next; - } - - # Split table. - (undef, undef, undef, undef, $bind, $oth, undef, $shndx, $name) = split; - - # Error out for unknown input. - die "unknown input line:\n$_" unless defined($bind); - - # Ignore local symbols. - next if ($bind eq "LOCL"); - # Ignore hidden symbols. - next if ($oth eq "H"); - # Ignore undefined symbols. - next if ($shndx eq "UNDEF"); - # Error out for unhandled cases. - if ($bind !~ /^(GLOB|WEAK)/ or $oth ne "D") { - die "unhandled symbol:\n$_"; - } - - # Remember symbol. - $sym_hash{$name}++; - } - close ELFDUMP or die "$elfdump error"; -} else { - open READELF, 'readelf -s -W '.(join ' ',@OBJECTS).'|' or die $!; - # Process each symbol. - while () { - chomp; - - # Ignore empty lines. - next if (/^$/); - - # Ignore object name header. - next if (/^File: .*$/); - - # Ignore table header lines. - next if (/^Symbol table.*contains.*:/); - next if (/Num:.*Value.*Size/); - - # Split table. - (undef, undef, undef, undef, $bind, $vis, $ndx, $name) = split; - - # Error out for unknown input. - die "unknown input line:\n$_" unless defined($bind); - - # Ignore local symbols. - next if ($bind eq "LOCAL"); - # Ignore hidden symbols. - next if ($vis eq "HIDDEN"); - # Ignore undefined symbols. - next if ($ndx eq "UND"); - # Error out for unhandled cases. - if ($bind !~ /^(GLOBAL|WEAK)/ or $vis ne "DEFAULT") { - die "unhandled symbol:\n$_"; - } - - # Remember symbol. - $sym_hash{$name}++; - } - close READELF or die "readelf error"; -} - -########## -# The various types of glob patterns. -# -# A glob pattern that is to be applied to the demangled name: 'cxx'. -# A glob patterns that applies directly to the name in the .o files: 'glob'. -# This pattern is ignored; used for local variables (usually just '*'): 'ign'. - -# The type of the current pattern. -my $glob = 'glob'; - -# We're currently inside `extern "C++"', which Sun ld doesn't understand. -my $in_extern = 0; - -# The c++filt command to use. This *must* be GNU c++filt; the Sun Studio -# c++filt doesn't handle the GNU mangling style. -my $cxxfilt = $ENV{'CXXFILT'} || "c++filt"; - -# The current version name. -my $current_version = ""; - -# Was there any attempt to match a symbol to this version? -my $matches_attempted; - -# The number of versions which matched this symbol. -my $matched_symbols; - -open F,$symvers or die $!; - -# Print information about generating this file -print "# This file was generated by make_sunver.pl. DO NOT EDIT!\n"; -print "# It was generated by:\n"; -printf "# %s %s %s\n", $0, $symvers, (join ' ',@ARGV); -printf "# Omitted archives with corresponding shared libraries: %s\n", - (join ' ', @SHAREDOBJS) if $#SHAREDOBJS >= 0; -print "#\n\n"; - -while () { - # Lines of the form '};' - if (/^([ \t]*)(\}[ \t]*;[ \t]*)$/) { - $glob = 'glob'; - if ($in_extern) { - $in_extern--; - print "$1##$2\n"; - } else { - print; - } - next; - } - - # Lines of the form '} SOME_VERSION_NAME_1.0;' - if (/^[ \t]*\}[ \tA-Z0-9_.a-z]+;[ \t]*$/) { - $glob = 'glob'; - # We tried to match symbols agains this version, but none matched. - # Emit dummy hidden symbol to avoid marking this version WEAK. - if ($matches_attempted && $matched_symbols == 0) { - print " hidden:\n"; - print " .force_WEAK_off_$current_version = DATA S0x0 V0x0;\n"; - } - print; next; - } - - # Comment and blank lines - if (/^[ \t]*\#/) { print; next; } - if (/^[ \t]*$/) { print; next; } - - # Lines of the form '{' - if (/^([ \t]*){$/) { - if ($in_extern) { - print "$1##{\n"; - } else { - print; - } - next; - } - - # Lines of the form 'SOME_VERSION_NAME_1.1 {' - if (/^([A-Z0-9_.]+)[ \t]+{$/) { - # Record version name. - $current_version = $1; - # Reset match attempts, #matched symbols for this version. - $matches_attempted = 0; - $matched_symbols = 0; - print; - next; - } - - # Ignore 'global:' - if (/^[ \t]*global:$/) { print; next; } - - # After 'local:', globs should be ignored, they won't be exported. - if (/^[ \t]*local:$/) { - $glob = 'ign'; - print; - next; - } - - # After 'extern "C++"', globs are C++ patterns - if (/^([ \t]*)(extern \"C\+\+\"[ \t]*)$/) { - $in_extern++; - $glob = 'cxx'; - # Need to comment, Sun ld cannot handle this. - print "$1##$2\n"; next; - } - - # Chomp newline now we're done with passing through the input file. - chomp; - - # Catch globs. Note that '{}' is not allowed in globs by this script, - # so only '*' and '[]' are available. - if (/^([ \t]*)([^ \t;{}#]+);?[ \t]*$/) { - my $ws = $1; - my $ptn = $2; - # Turn the glob into a regex by replacing '*' with '.*', '?' with '.'. - # Keep $ptn so we can still print the original form. - ($pattern = $ptn) =~ s/\*/\.\*/g; - $pattern =~ s/\?/\./g; - - if ($glob eq 'ign') { - # We're in a local: * section; just continue. - print "$_\n"; - next; - } - - # Print the glob commented for human readers. - print "$ws##$ptn ($glob)\n"; - # We tried to match a symbol to this version. - $matches_attempted++; - - if ($glob eq 'glob') { - my %ptn_syms = (); - - # Match ptn against symbols in %sym_hash. - foreach my $sym (keys %sym_hash) { - # Maybe it matches one of the patterns based on the symbol in - # the .o file. - $ptn_syms{$sym}++ if ($sym =~ /^$pattern$/); - } - - foreach my $sym (sort keys(%ptn_syms)) { - $matched_symbols++; - print "$ws$sym;\n"; - } - } elsif ($glob eq 'cxx') { - my %dem_syms = (); - - # Verify that we're actually using GNU c++filt. Other versions - # most likely cannot handle GNU style symbol mangling. - my $cxxout = `$cxxfilt --version 2>&1`; - $cxxout =~ m/GNU/ or die "$0 requires GNU c++filt to function"; - - # Talk to c++filt through a pair of file descriptors. - # Need to start a fresh instance per pattern, otherwise the - # process grows to 500+ MB. - my $pid = open2(*FILTIN, *FILTOUT, $cxxfilt) or die $!; - - # Match ptn against symbols in %sym_hash. - foreach my $sym (keys %sym_hash) { - # No? Well, maybe its demangled form matches one of those - # patterns. - printf FILTOUT "%s\n",$sym; - my $dem = ; - chomp $dem; - $dem_syms{$sym}++ if ($dem =~ /^$pattern$/); - } - - close FILTOUT or die "c++filt error"; - close FILTIN or die "c++filt error"; - # Need to wait for the c++filt process to avoid lots of zombies. - waitpid $pid, 0; - - foreach my $sym (sort keys(%dem_syms)) { - $matched_symbols++; - print "$ws$sym;\n"; - } - } else { - # No? Well, then ignore it. - } - next; - } - # Important sanity check. This script can't handle lots of formats - # that GNU ld can, so be sure to error out if one is seen! - die "strange line `$_'"; -} -close F; diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/man/Makefile.am b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/man/Makefile.am deleted file mode 100644 index afcbfb6..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/man/Makefile.am +++ /dev/null @@ -1,8 +0,0 @@ -## Process this with automake to create Makefile.in - -AUTOMAKE_OPTIONS=foreign - -EXTRA_DIST = ffi.3 ffi_call.3 ffi_prep_cif.3 ffi_prep_cif_var.3 - -man_MANS = ffi.3 ffi_call.3 ffi_prep_cif.3 ffi_prep_cif_var.3 - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/man/ffi.3 b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/man/ffi.3 deleted file mode 100644 index 1f1d303..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/man/ffi.3 +++ /dev/null @@ -1,41 +0,0 @@ -.Dd February 15, 2008 -.Dt FFI 3 -.Sh NAME -.Nm FFI -.Nd Foreign Function Interface -.Sh LIBRARY -libffi, -lffi -.Sh SYNOPSIS -.In ffi.h -.Ft ffi_status -.Fo ffi_prep_cif -.Fa "ffi_cif *cif" -.Fa "ffi_abi abi" -.Fa "unsigned int nargs" -.Fa "ffi_type *rtype" -.Fa "ffi_type **atypes" -.Fc -.Ft void -.Fo ffi_prep_cif_var -.Fa "ffi_cif *cif" -.Fa "ffi_abi abi" -.Fa "unsigned int nfixedargs" -.Fa "unsigned int ntotalargs" -.Fa "ffi_type *rtype" -.Fa "ffi_type **atypes" -.Fc -.Ft void -.Fo ffi_call -.Fa "ffi_cif *cif" -.Fa "void (*fn)(void)" -.Fa "void *rvalue" -.Fa "void **avalue" -.Fc -.Sh DESCRIPTION -The foreign function interface provides a mechanism by which a function can -generate a call to another function at runtime without requiring knowledge of -the called function's interface at compile time. -.Sh SEE ALSO -.Xr ffi_prep_cif 3 , -.Xr ffi_prep_cif_var 3 , -.Xr ffi_call 3 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/man/ffi_call.3 b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/man/ffi_call.3 deleted file mode 100644 index 5351513..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/man/ffi_call.3 +++ /dev/null @@ -1,103 +0,0 @@ -.Dd February 15, 2008 -.Dt ffi_call 3 -.Sh NAME -.Nm ffi_call -.Nd Invoke a foreign function. -.Sh SYNOPSIS -.In ffi.h -.Ft void -.Fo ffi_call -.Fa "ffi_cif *cif" -.Fa "void (*fn)(void)" -.Fa "void *rvalue" -.Fa "void **avalue" -.Fc -.Sh DESCRIPTION -The -.Nm ffi_call -function provides a simple mechanism for invoking a function without -requiring knowledge of the function's interface at compile time. -.Fa fn -is called with the values retrieved from the pointers in the -.Fa avalue -array. The return value from -.Fa fn -is placed in storage pointed to by -.Fa rvalue . -.Fa cif -contains information describing the data types, sizes and alignments of the -arguments to and return value from -.Fa fn , -and must be initialized with -.Nm ffi_prep_cif -before it is used with -.Nm ffi_call . -.Pp -.Fa rvalue -must point to storage that is sizeof(ffi_arg) or larger for non-floating point -types. For smaller-sized return value types, the -.Nm ffi_arg -or -.Nm ffi_sarg -integral type must be used to hold -the return value. -.Sh EXAMPLES -.Bd -literal -#include -#include - -unsigned char -foo(unsigned int, float); - -int -main(int argc, const char **argv) -{ - ffi_cif cif; - ffi_type *arg_types[2]; - void *arg_values[2]; - ffi_status status; - - // Because the return value from foo() is smaller than sizeof(long), it - // must be passed as ffi_arg or ffi_sarg. - ffi_arg result; - - // Specify the data type of each argument. Available types are defined - // in . - arg_types[0] = &ffi_type_uint; - arg_types[1] = &ffi_type_float; - - // Prepare the ffi_cif structure. - if ((status = ffi_prep_cif(&cif, FFI_DEFAULT_ABI, - 2, &ffi_type_uint8, arg_types)) != FFI_OK) - { - // Handle the ffi_status error. - } - - // Specify the values of each argument. - unsigned int arg1 = 42; - float arg2 = 5.1; - - arg_values[0] = &arg1; - arg_values[1] = &arg2; - - // Invoke the function. - ffi_call(&cif, FFI_FN(foo), &result, arg_values); - - // The ffi_arg 'result' now contains the unsigned char returned from foo(), - // which can be accessed by a typecast. - printf("result is %hhu", (unsigned char)result); - - return 0; -} - -// The target function. -unsigned char -foo(unsigned int x, float y) -{ - unsigned char result = x - y; - return result; -} -.Ed -.Sh SEE ALSO -.Xr ffi 3 , -.Xr ffi_prep_cif 3 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/man/ffi_prep_cif.3 b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/man/ffi_prep_cif.3 deleted file mode 100644 index ab2be8a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/man/ffi_prep_cif.3 +++ /dev/null @@ -1,68 +0,0 @@ -.Dd February 15, 2008 -.Dt ffi_prep_cif 3 -.Sh NAME -.Nm ffi_prep_cif -.Nd Prepare a -.Nm ffi_cif -structure for use with -.Nm ffi_call -. -.Sh SYNOPSIS -.In ffi.h -.Ft ffi_status -.Fo ffi_prep_cif -.Fa "ffi_cif *cif" -.Fa "ffi_abi abi" -.Fa "unsigned int nargs" -.Fa "ffi_type *rtype" -.Fa "ffi_type **atypes" -.Fc -.Sh DESCRIPTION -The -.Nm ffi_prep_cif -function prepares a -.Nm ffi_cif -structure for use with -.Nm ffi_call -. -.Fa abi -specifies a set of calling conventions to use. -.Fa atypes -is an array of -.Fa nargs -pointers to -.Nm ffi_type -structs that describe the data type, size and alignment of each argument. -.Fa rtype -points to an -.Nm ffi_type -that describes the data type, size and alignment of the -return value. Note that to call a variadic function -.Nm ffi_prep_cif_var -must be used instead. -.Sh RETURN VALUES -Upon successful completion, -.Nm ffi_prep_cif -returns -.Nm FFI_OK . -It will return -.Nm FFI_BAD_TYPEDEF -if -.Fa cif -is -.Nm NULL -or -.Fa atypes -or -.Fa rtype -is malformed. If -.Fa abi -does not refer to a valid ABI, -.Nm FFI_BAD_ABI -will be returned. Available ABIs are -defined in -.Nm . -.Sh SEE ALSO -.Xr ffi 3 , -.Xr ffi_call 3 , -.Xr ffi_prep_cif_var 3 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/man/ffi_prep_cif_var.3 b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/man/ffi_prep_cif_var.3 deleted file mode 100644 index 7e19d0b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/man/ffi_prep_cif_var.3 +++ /dev/null @@ -1,73 +0,0 @@ -.Dd January 25, 2011 -.Dt ffi_prep_cif_var 3 -.Sh NAME -.Nm ffi_prep_cif_var -.Nd Prepare a -.Nm ffi_cif -structure for use with -.Nm ffi_call -for variadic functions. -.Sh SYNOPSIS -.In ffi.h -.Ft ffi_status -.Fo ffi_prep_cif_var -.Fa "ffi_cif *cif" -.Fa "ffi_abi abi" -.Fa "unsigned int nfixedargs" -.Fa "unsigned int ntotalargs" -.Fa "ffi_type *rtype" -.Fa "ffi_type **atypes" -.Fc -.Sh DESCRIPTION -The -.Nm ffi_prep_cif_var -function prepares a -.Nm ffi_cif -structure for use with -.Nm ffi_call -for variadic functions. -.Fa abi -specifies a set of calling conventions to use. -.Fa atypes -is an array of -.Fa ntotalargs -pointers to -.Nm ffi_type -structs that describe the data type, size and alignment of each argument. -.Fa rtype -points to an -.Nm ffi_type -that describes the data type, size and alignment of the -return value. -.Fa nfixedargs -must contain the number of fixed (non-variadic) arguments. -Note that to call a non-variadic function -.Nm ffi_prep_cif -must be used. -.Sh RETURN VALUES -Upon successful completion, -.Nm ffi_prep_cif_var -returns -.Nm FFI_OK . -It will return -.Nm FFI_BAD_TYPEDEF -if -.Fa cif -is -.Nm NULL -or -.Fa atypes -or -.Fa rtype -is malformed. If -.Fa abi -does not refer to a valid ABI, -.Nm FFI_BAD_ABI -will be returned. Available ABIs are -defined in -.Nm -. -.Sh SEE ALSO -.Xr ffi 3 , -.Xr ffi_call 3 , -.Xr ffi_prep_cif 3 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.sln b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.sln deleted file mode 100644 index d9119df..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.sln +++ /dev/null @@ -1,33 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.28302.56 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Ffi_staticLib_arm64", "Ffi_staticLib.vcxproj", "{115502C0-BE05-4767-BF19-5C87D805FAD6}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|ARM64 = Debug|ARM64 - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|ARM64 = Release|ARM64 - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {115502C0-BE05-4767-BF19-5C87D805FAD6}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {115502C0-BE05-4767-BF19-5C87D805FAD6}.Debug|ARM64.Build.0 = Debug|ARM64 - {115502C0-BE05-4767-BF19-5C87D805FAD6}.Debug|x64.ActiveCfg = Debug|ARM64 - {115502C0-BE05-4767-BF19-5C87D805FAD6}.Debug|x86.ActiveCfg = Debug|ARM64 - {115502C0-BE05-4767-BF19-5C87D805FAD6}.Release|ARM64.ActiveCfg = Release|ARM64 - {115502C0-BE05-4767-BF19-5C87D805FAD6}.Release|ARM64.Build.0 = Release|ARM64 - {115502C0-BE05-4767-BF19-5C87D805FAD6}.Release|x64.ActiveCfg = Release|ARM64 - {115502C0-BE05-4767-BF19-5C87D805FAD6}.Release|x86.ActiveCfg = Release|ARM64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {241C54C7-20DD-4897-9376-E6B6D1B43BD5} - EndGlobalSection -EndGlobal diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj deleted file mode 100644 index 3187699..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj +++ /dev/null @@ -1,130 +0,0 @@ - - - - - Debug - ARM64 - - - Release - ARM64 - - - - 15.0 - {115502C0-BE05-4767-BF19-5C87D805FAD6} - Win32Proj - FfistaticLib - 10.0.17763.0 - Ffi_staticLib_arm64 - - - - StaticLibrary - true - v141 - Unicode - - - StaticLibrary - false - v141 - true - Unicode - - - - - - - - - - - - - - - true - - - false - - - - NotUsing - Level3 - Disabled - true - FFI_BUILDING_DLL;_DEBUG;_LIB;USE_DL_PREFIX;ARM64;_M_ARM64;NDEBUG;%(PreprocessorDefinitions) - true - ..\..\include;.\aarch64_include;..\..\src\aarch64;%(AdditionalIncludeDirectories) - false - true - - - false - - - Windows - true - - - - - NotUsing - Level3 - MaxSpeed - true - true - true - FFI_BUILDING_DLL;USE_DL_PREFIX;ARM64;NDEBUG;_LIB;%(PreprocessorDefinitions) - true - ..\..\include;.\aarch64_include;..\..\src\aarch64;%(AdditionalIncludeDirectories) - true - Speed - true - ..\..\src;..\..\src\aarch64;%(AdditionalUsingDirectories) - - - Windows - true - true - true - - - true - - - - - - - - - - - - - - - - - - - - - - - cl /FA /EP /nologo /I"..\..\include" /I".\aarch64_include" /I"..\..\src\aarch64" "%(FullPath)" > $(IntDir)win64_armasm.i - armasm64 $(IntDir)win64_armasm.i /I"src\" /I"..\..\include" /I"..\..\src\aarch64" -o "$(IntDir)win64_armasm.obj" - - win64_armasm.obj;%(Outputs) - - - - - - \ No newline at end of file diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.filters b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.filters deleted file mode 100644 index 1f8c6e1..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.filters +++ /dev/null @@ -1,57 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;hm;inl;inc;ipp;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - - - - \ No newline at end of file diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.user b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.user deleted file mode 100644 index be25078..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.user +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/ffi.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/ffi.h deleted file mode 100644 index 02f26a2..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/ffi.h +++ /dev/null @@ -1,511 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - libffi 3.3-rc0 - Copyright (c) 2011, 2014 Anthony Green - - Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc. - - 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. - - ----------------------------------------------------------------------- */ - -/* ------------------------------------------------------------------- - Most of the API is documented in doc/libffi.texi. - - The raw API is designed to bypass some of the argument packing and - unpacking on architectures for which it can be avoided. Routines - are provided to emulate the raw API if the underlying platform - doesn't allow faster implementation. - - More details on the raw API can be found in: - - http://gcc.gnu.org/ml/java/1999-q3/msg00138.html - - and - - http://gcc.gnu.org/ml/java/1999-q3/msg00174.html - -------------------------------------------------------------------- */ - -#ifndef LIBFFI_H -#define LIBFFI_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Specify which architecture libffi is configured for. */ -#ifndef AARCH64 -#define AARCH64 -#endif - -/* ---- System configuration information --------------------------------- */ - -#include - -#ifndef LIBFFI_ASM - -#if defined(_MSC_VER) && !defined(__clang__) -#define __attribute__(X) -#endif - -#include -#include - -/* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example). - But we can find it either under the correct ANSI name, or under GNU - C's internal name. */ - -#define FFI_64_BIT_MAX 9223372036854775807 - -#ifdef LONG_LONG_MAX -# define FFI_LONG_LONG_MAX LONG_LONG_MAX -#else -# ifdef LLONG_MAX -# define FFI_LONG_LONG_MAX LLONG_MAX -# ifdef _AIX52 /* or newer has C99 LLONG_MAX */ -# undef FFI_64_BIT_MAX -# define FFI_64_BIT_MAX 9223372036854775807LL -# endif /* _AIX52 or newer */ -# else -# ifdef __GNUC__ -# define FFI_LONG_LONG_MAX __LONG_LONG_MAX__ -# endif -# ifdef _AIX /* AIX 5.1 and earlier have LONGLONG_MAX */ -# ifndef __PPC64__ -# if defined (__IBMC__) || defined (__IBMCPP__) -# define FFI_LONG_LONG_MAX LONGLONG_MAX -# endif -# endif /* __PPC64__ */ -# undef FFI_64_BIT_MAX -# define FFI_64_BIT_MAX 9223372036854775807LL -# endif -# endif -#endif - -/* The closure code assumes that this works on pointers, i.e. a size_t - can hold a pointer. */ - -typedef struct _ffi_type -{ - size_t size; - unsigned short alignment; - unsigned short type; - struct _ffi_type **elements; -} ffi_type; - -/* Need minimal decorations for DLLs to work on Windows. GCC has - autoimport and autoexport. Always mark externally visible symbols - as dllimport for MSVC clients, even if it means an extra indirection - when using the static version of the library. - Besides, as a workaround, they can define FFI_BUILDING if they - *know* they are going to link with the static library. */ -#if defined _MSC_VER -# if defined FFI_BUILDING_DLL /* Building libffi.DLL with msvcc.sh */ -# define FFI_API __declspec(dllexport) -# elif !defined FFI_BUILDING /* Importing libffi.DLL */ -# define FFI_API __declspec(dllimport) -# else /* Building/linking static library */ -# define FFI_API -# endif -#else -# define FFI_API -#endif - -/* The externally visible type declarations also need the MSVC DLL - decorations, or they will not be exported from the object file. */ -#if defined LIBFFI_HIDE_BASIC_TYPES -# define FFI_EXTERN FFI_API -#else -# define FFI_EXTERN extern FFI_API -#endif - -#ifndef LIBFFI_HIDE_BASIC_TYPES -#if SCHAR_MAX == 127 -# define ffi_type_uchar ffi_type_uint8 -# define ffi_type_schar ffi_type_sint8 -#else - #error "char size not supported" -#endif - -#if SHRT_MAX == 32767 -# define ffi_type_ushort ffi_type_uint16 -# define ffi_type_sshort ffi_type_sint16 -#elif SHRT_MAX == 2147483647 -# define ffi_type_ushort ffi_type_uint32 -# define ffi_type_sshort ffi_type_sint32 -#else - #error "short size not supported" -#endif - -#if INT_MAX == 32767 -# define ffi_type_uint ffi_type_uint16 -# define ffi_type_sint ffi_type_sint16 -#elif INT_MAX == 2147483647 -# define ffi_type_uint ffi_type_uint32 -# define ffi_type_sint ffi_type_sint32 -#elif INT_MAX == 9223372036854775807 -# define ffi_type_uint ffi_type_uint64 -# define ffi_type_sint ffi_type_sint64 -#else - #error "int size not supported" -#endif - -#if LONG_MAX == 2147483647 -# if FFI_LONG_LONG_MAX != FFI_64_BIT_MAX - #error "no 64-bit data type supported" -# endif -#elif LONG_MAX != FFI_64_BIT_MAX - #error "long size not supported" -#endif - -#if LONG_MAX == 2147483647 -# define ffi_type_ulong ffi_type_uint32 -# define ffi_type_slong ffi_type_sint32 -#elif LONG_MAX == FFI_64_BIT_MAX -# define ffi_type_ulong ffi_type_uint64 -# define ffi_type_slong ffi_type_sint64 -#else - #error "long size not supported" -#endif - -/* These are defined in types.c. */ -FFI_EXTERN ffi_type ffi_type_void; -FFI_EXTERN ffi_type ffi_type_uint8; -FFI_EXTERN ffi_type ffi_type_sint8; -FFI_EXTERN ffi_type ffi_type_uint16; -FFI_EXTERN ffi_type ffi_type_sint16; -FFI_EXTERN ffi_type ffi_type_uint32; -FFI_EXTERN ffi_type ffi_type_sint32; -FFI_EXTERN ffi_type ffi_type_uint64; -FFI_EXTERN ffi_type ffi_type_sint64; -FFI_EXTERN ffi_type ffi_type_float; -FFI_EXTERN ffi_type ffi_type_double; -FFI_EXTERN ffi_type ffi_type_pointer; - -#ifndef _M_ARM64 -FFI_EXTERN ffi_type ffi_type_longdouble; -#else -#define ffi_type_longdouble ffi_type_double -#endif - -#ifdef FFI_TARGET_HAS_COMPLEX_TYPE -FFI_EXTERN ffi_type ffi_type_complex_float; -FFI_EXTERN ffi_type ffi_type_complex_double; -#if 1 -FFI_EXTERN ffi_type ffi_type_complex_longdouble; -#else -#define ffi_type_complex_longdouble ffi_type_complex_double -#endif -#endif -#endif /* LIBFFI_HIDE_BASIC_TYPES */ - -typedef enum { - FFI_OK = 0, - FFI_BAD_TYPEDEF, - FFI_BAD_ABI -} ffi_status; - -typedef struct { - ffi_abi abi; - unsigned nargs; - ffi_type **arg_types; - ffi_type *rtype; - unsigned bytes; - unsigned flags; -#ifdef FFI_EXTRA_CIF_FIELDS - FFI_EXTRA_CIF_FIELDS; -#endif -} ffi_cif; - -/* ---- Definitions for the raw API -------------------------------------- */ - -#ifndef FFI_SIZEOF_ARG -# if LONG_MAX == 2147483647 -# define FFI_SIZEOF_ARG 4 -# elif LONG_MAX == FFI_64_BIT_MAX -# define FFI_SIZEOF_ARG 8 -# endif -#endif - -#ifndef FFI_SIZEOF_JAVA_RAW -# define FFI_SIZEOF_JAVA_RAW FFI_SIZEOF_ARG -#endif - -typedef union { - ffi_sarg sint; - ffi_arg uint; - float flt; - char data[FFI_SIZEOF_ARG]; - void* ptr; -} ffi_raw; - -#if FFI_SIZEOF_JAVA_RAW == 4 && FFI_SIZEOF_ARG == 8 -/* This is a special case for mips64/n32 ABI (and perhaps others) where - sizeof(void *) is 4 and FFI_SIZEOF_ARG is 8. */ -typedef union { - signed int sint; - unsigned int uint; - float flt; - char data[FFI_SIZEOF_JAVA_RAW]; - void* ptr; -} ffi_java_raw; -#else -typedef ffi_raw ffi_java_raw; -#endif - - -FFI_API -void ffi_raw_call (ffi_cif *cif, - void (*fn)(void), - void *rvalue, - ffi_raw *avalue); - -FFI_API void ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw); -FFI_API void ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args); -FFI_API size_t ffi_raw_size (ffi_cif *cif); - -/* This is analogous to the raw API, except it uses Java parameter - packing, even on 64-bit machines. I.e. on 64-bit machines longs - and doubles are followed by an empty 64-bit word. */ - -FFI_API -void ffi_java_raw_call (ffi_cif *cif, - void (*fn)(void), - void *rvalue, - ffi_java_raw *avalue); - -FFI_API -void ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw); -FFI_API -void ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args); -FFI_API -size_t ffi_java_raw_size (ffi_cif *cif); - -/* ---- Definitions for closures ----------------------------------------- */ - -#if FFI_CLOSURES - -#ifdef _MSC_VER -__declspec(align(8)) -#endif -typedef struct { -#if 0 - void *trampoline_table; - void *trampoline_table_entry; -#else - char tramp[FFI_TRAMPOLINE_SIZE]; -#endif - ffi_cif *cif; - void (*fun)(ffi_cif*,void*,void**,void*); - void *user_data; -} ffi_closure -#ifdef __GNUC__ - __attribute__((aligned (8))) -#endif - ; - -#ifndef __GNUC__ -# ifdef __sgi -# pragma pack 0 -# endif -#endif - -FFI_API void *ffi_closure_alloc (size_t size, void **code); -FFI_API void ffi_closure_free (void *); - -FFI_API ffi_status -ffi_prep_closure (ffi_closure*, - ffi_cif *, - void (*fun)(ffi_cif*,void*,void**,void*), - void *user_data) -#if defined(__GNUC__) && (((__GNUC__ * 100) + __GNUC_MINOR__) >= 405) - __attribute__((deprecated ("use ffi_prep_closure_loc instead"))) -#elif defined(__GNUC__) && __GNUC__ >= 3 - __attribute__((deprecated)) -#endif - ; - -FFI_API ffi_status -ffi_prep_closure_loc (ffi_closure*, - ffi_cif *, - void (*fun)(ffi_cif*,void*,void**,void*), - void *user_data, - void*codeloc); - -#ifdef __sgi -# pragma pack 8 -#endif -typedef struct { -#if 0 - void *trampoline_table; - void *trampoline_table_entry; -#else - char tramp[FFI_TRAMPOLINE_SIZE]; -#endif - ffi_cif *cif; - -#if !FFI_NATIVE_RAW_API - - /* If this is enabled, then a raw closure has the same layout - as a regular closure. We use this to install an intermediate - handler to do the transaltion, void** -> ffi_raw*. */ - - void (*translate_args)(ffi_cif*,void*,void**,void*); - void *this_closure; - -#endif - - void (*fun)(ffi_cif*,void*,ffi_raw*,void*); - void *user_data; - -} ffi_raw_closure; - -typedef struct { -#if 0 - void *trampoline_table; - void *trampoline_table_entry; -#else - char tramp[FFI_TRAMPOLINE_SIZE]; -#endif - - ffi_cif *cif; - -#if !FFI_NATIVE_RAW_API - - /* If this is enabled, then a raw closure has the same layout - as a regular closure. We use this to install an intermediate - handler to do the translation, void** -> ffi_raw*. */ - - void (*translate_args)(ffi_cif*,void*,void**,void*); - void *this_closure; - -#endif - - void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*); - void *user_data; - -} ffi_java_raw_closure; - -FFI_API ffi_status -ffi_prep_raw_closure (ffi_raw_closure*, - ffi_cif *cif, - void (*fun)(ffi_cif*,void*,ffi_raw*,void*), - void *user_data); - -FFI_API ffi_status -ffi_prep_raw_closure_loc (ffi_raw_closure*, - ffi_cif *cif, - void (*fun)(ffi_cif*,void*,ffi_raw*,void*), - void *user_data, - void *codeloc); - -FFI_API ffi_status -ffi_prep_java_raw_closure (ffi_java_raw_closure*, - ffi_cif *cif, - void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), - void *user_data); - -FFI_API ffi_status -ffi_prep_java_raw_closure_loc (ffi_java_raw_closure*, - ffi_cif *cif, - void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), - void *user_data, - void *codeloc); - -#endif /* FFI_CLOSURES */ - -#if FFI_GO_CLOSURES - -typedef struct { - void *tramp; - ffi_cif *cif; - void (*fun)(ffi_cif*,void*,void**,void*); -} ffi_go_closure; - -FFI_API ffi_status ffi_prep_go_closure (ffi_go_closure*, ffi_cif *, - void (*fun)(ffi_cif*,void*,void**,void*)); - -FFI_API void ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue, - void **avalue, void *closure); - -#endif /* FFI_GO_CLOSURES */ - -/* ---- Public interface definition -------------------------------------- */ - -FFI_API -ffi_status ffi_prep_cif(ffi_cif *cif, - ffi_abi abi, - unsigned int nargs, - ffi_type *rtype, - ffi_type **atypes); - -FFI_API -ffi_status ffi_prep_cif_var(ffi_cif *cif, - ffi_abi abi, - unsigned int nfixedargs, - unsigned int ntotalargs, - ffi_type *rtype, - ffi_type **atypes); - -FFI_API -void ffi_call(ffi_cif *cif, - void (*fn)(void), - void *rvalue, - void **avalue); - -FFI_API -ffi_status ffi_get_struct_offsets (ffi_abi abi, ffi_type *struct_type, - size_t *offsets); - -/* Useful for eliminating compiler warnings. */ -#define FFI_FN(f) ((void (*)(void))f) - -/* ---- Definitions shared with assembly code ---------------------------- */ - -#endif - -/* If these change, update src/mips/ffitarget.h. */ -#define FFI_TYPE_VOID 0 -#define FFI_TYPE_INT 1 -#define FFI_TYPE_FLOAT 2 -#define FFI_TYPE_DOUBLE 3 -#ifndef _M_ARM64 -#define FFI_TYPE_LONGDOUBLE 4 -#else -#define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE -#endif -#define FFI_TYPE_UINT8 5 -#define FFI_TYPE_SINT8 6 -#define FFI_TYPE_UINT16 7 -#define FFI_TYPE_SINT16 8 -#define FFI_TYPE_UINT32 9 -#define FFI_TYPE_SINT32 10 -#define FFI_TYPE_UINT64 11 -#define FFI_TYPE_SINT64 12 -#define FFI_TYPE_STRUCT 13 -#define FFI_TYPE_POINTER 14 -#define FFI_TYPE_COMPLEX 15 -/* This should always refer to the last type code (for sanity checks). */ -#define FFI_TYPE_LAST FFI_TYPE_COMPLEX - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/msvcc.sh b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/msvcc.sh deleted file mode 100755 index 7cfc509..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/msvcc.sh +++ /dev/null @@ -1,353 +0,0 @@ -#!/bin/sh - -# ***** BEGIN LICENSE BLOCK ***** -# Version: MPL 1.1/GPL 2.0/LGPL 2.1 -# -# The contents of this file are subject to the Mozilla Public License Version -# 1.1 (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.mozilla.org/MPL/ -# -# Software distributed under the License is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -# for the specific language governing rights and limitations under the -# License. -# -# The Original Code is the MSVC wrappificator. -# -# The Initial Developer of the Original Code is -# Timothy Wall . -# Portions created by the Initial Developer are Copyright (C) 2009 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Daniel Witte -# -# Alternatively, the contents of this file may be used under the terms of -# either the GNU General Public License Version 2 or later (the "GPL"), or -# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), -# in which case the provisions of the GPL or the LGPL are applicable instead -# of those above. If you wish to allow use of your version of this file only -# under the terms of either the GPL or the LGPL, and not to allow others to -# use your version of this file under the terms of the MPL, indicate your -# decision by deleting the provisions above and replace them with the notice -# and other provisions required by the GPL or the LGPL. If you do not delete -# the provisions above, a recipient may use your version of this file under -# the terms of any one of the MPL, the GPL or the LGPL. -# -# ***** END LICENSE BLOCK ***** - -# -# GCC-compatible wrapper for cl.exe and ml.exe. Arguments are given in GCC -# format and translated into something sensible for cl or ml. -# - -args_orig=$@ -args="-nologo -W3" -linkargs= -static_crt= -debug_crt= -cl="cl" -ml="ml" -safeseh="-safeseh" -output= -libpaths= -libversion=7 -verbose= - -while [ $# -gt 0 ] -do - case $1 - in - --verbose) - verbose=1 - shift 1 - ;; - --version) - args="-help" - shift 1 - ;; - -fexceptions) - # Don't enable exceptions for now. - #args="$args -EHac" - shift 1 - ;; - -m32) - shift 1 - ;; - -m64) - ml="ml64" # "$MSVC/x86_amd64/ml64" - safeseh= - shift 1 - ;; - -marm) - ml='armasm' - safeseh= - shift 1 - ;; - -marm64) - ml='armasm64' - safeseh= - shift 1 - ;; - -clang-cl) - cl="clang-cl" - shift 1 - ;; - -O0) - args="$args -Od" - shift 1 - ;; - -O*) - # Runtime error checks (enabled by setting -RTC1 in the -DFFI_DEBUG - # case below) are not compatible with optimization flags and will - # cause the build to fail. Therefore, drop the optimization flag if - # -DFFI_DEBUG is also set. - case $args_orig in - *-DFFI_DEBUG*) - args="$args" - ;; - *) - # The ax_cc_maxopt.m4 macro from the upstream autoconf-archive - # project doesn't support MSVC and therefore ends up trying to - # use -O3. Use the equivalent "max optimization" flag for MSVC - # instead of erroring out. - case $1 in - -O3) - args="$args -O2" - ;; - *) - args="$args $1" - ;; - esac - opt="true" - ;; - esac - shift 1 - ;; - -g) - # Enable debug symbol generation. - args="$args -Zi" - shift 1 - ;; - -DFFI_DEBUG) - # Enable runtime error checks. - args="$args -RTC1" - defines="$defines $1" - shift 1 - ;; - -DUSE_STATIC_RTL) - # Link against static CRT. - static_crt=1 - shift 1 - ;; - -DUSE_DEBUG_RTL) - # Link against debug CRT. - debug_crt=1 - shift 1 - ;; - -c) - args="$args -c" - args="$(echo $args | sed 's%/Fe%/Fo%g')" - single="-c" - shift 1 - ;; - -D*=*) - name="$(echo $1|sed 's/-D\([^=][^=]*\)=.*/\1/g')" - value="$(echo $1|sed 's/-D[^=][^=]*=//g')" - args="$args -D${name}='$value'" - defines="$defines -D${name}='$value'" - shift 1 - ;; - -D*) - args="$args $1" - defines="$defines $1" - shift 1 - ;; - -I) - p=$(cygpath -ma "$2") - args="$args -I\"$p\"" - includes="$includes -I\"$p\"" - shift 2 - ;; - -I*) - p=$(cygpath -ma "${1#-I}") - args="$args -I\"$p\"" - includes="$includes -I\"$p\"" - shift 1 - ;; - -L) - p=$(cygpath -ma $2) - linkargs="$linkargs -LIBPATH:$p" - shift 2 - ;; - -L*) - p=$(cygpath -ma ${1#-L}) - linkargs="$linkargs -LIBPATH:$p" - shift 1 - ;; - -link) - # add next argument verbatim to linker args - linkargs="$linkargs $2" - shift 2 - ;; - -l*) - case $1 - in - -lffi) - linkargs="$linkargs lib${1#-l}-${libversion}.lib" - ;; - *) - # ignore other libraries like -lm, hope they are - # covered by MSVCRT - # linkargs="$linkargs ${1#-l}.lib" - ;; - esac - shift 1 - ;; - -W|-Wextra) - # TODO map extra warnings - shift 1 - ;; - -Wall) - # -Wall on MSVC is overzealous, and we already build with -W3. Nothing - # to do here. - shift 1 - ;; - -pedantic) - # libffi tests -pedantic with -Wall, so drop it also. - shift 1 - ;; - -warn) - # ignore -warn all from libtool as well. - if test "$2" = "all"; then - shift 2 - else - args="$args -warn" - shift 1 - fi - ;; - -Werror) - args="$args -WX" - shift 1 - ;; - -W*) - # TODO map specific warnings - shift 1 - ;; - -S) - args="$args -FAs" - shift 1 - ;; - -o) - outdir="$(dirname $2)" - base="$(basename $2|sed 's/\.[^.]*//g')" - if [ -n "$single" ]; then - output="-Fo$2" - else - output="-Fe$2" - fi - armasm_output="-o $2" - if [ -n "$assembly" ]; then - args="$args $output" - else - args="$args $output -Fd$outdir/$base -Fp$outdir/$base -Fa$outdir/$base" - fi - shift 2 - ;; - *.S) - src="$(cygpath -ma $1)" - assembly="true" - shift 1 - ;; - *.c) - args="$args $(cygpath -ma $1)" - shift 1 - ;; - *) - # Assume it's an MSVC argument, and pass it through. - args="$args $1" - shift 1 - ;; - esac -done - -if [ -n "$linkargs" ]; then - - # If -Zi is specified, certain optimizations are implicitly disabled - # by MSVC. Add back those optimizations if this is an optimized build. - # NOTE: These arguments must come after all others. - if [ -n "$opt" ]; then - linkargs="$linkargs -OPT:REF -OPT:ICF -INCREMENTAL:NO" - fi - - args="$args -link $linkargs" -fi - -if [ -n "$static_crt" ]; then - md=-MT -else - md=-MD -fi - -if [ -n "$debug_crt" ]; then - md="${md}d" -fi - -if [ -n "$assembly" ]; then - if [ -z "$outdir" ]; then - outdir="." - fi - ppsrc="$outdir/$(basename $src|sed 's/.S$/.asm/g')" - - if [ $ml = "armasm" ]; then - defines="$defines -D_M_ARM" - fi - - if [ $ml = "armasm64" ]; then - defines="$defines -D_M_ARM64" - fi - - if test -n "$verbose"; then - echo "$cl -nologo -EP $includes $defines $src > $ppsrc" - fi - - eval "\"$cl\" -nologo -EP $includes $defines $src" > $ppsrc || exit $? - output="$(echo $output | sed 's%/F[dpa][^ ]*%%g')" - if [ $ml = "armasm" ]; then - args="-nologo -g -oldit $armasm_output $ppsrc -errorReport:prompt" - elif [ $ml = "armasm64" ]; then - args="-nologo -g $armasm_output $ppsrc -errorReport:prompt" - else - args="-nologo $safeseh $single $output $ppsrc" - fi - - if test -n "$verbose"; then - echo "$ml $args" - fi - - eval "\"$ml\" $args" - result=$? - - # required to fix ml64 broken output? - #mv *.obj $outdir -else - args="$md $args" - - if test -n "$verbose"; then - echo "$cl $args" - fi - # Return an error code of 1 if an invalid command line parameter is passed - # instead of just ignoring it. Any output that is not a warning or an - # error is filtered so this command behaves more like gcc. cl.exe prints - # the name of the compiled file otherwise, which breaks the dejagnu checks - # for excess warnings and errors. - eval "(\"$cl\" $args 2>&1 1>&3 | \ - awk '{print \$0} /D9002/ {error=1} END{exit error}' >&2) 3>&1 | \ - awk '/warning|error/'" - result=$? -fi - -exit $result - -# vim: noai:ts=4:sw=4 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/aarch64/ffi.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/aarch64/ffi.c deleted file mode 100644 index ef09f4d..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/aarch64/ffi.c +++ /dev/null @@ -1,1025 +0,0 @@ -/* Copyright (c) 2009, 2010, 2011, 2012 ARM Ltd. - -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. */ - -#if defined(__aarch64__) || defined(__arm64__)|| defined (_M_ARM64) -#include -#include -#include -#include -#include -#include -#include "internal.h" -#ifdef _WIN32 -#include /* FlushInstructionCache */ -#endif - -/* Force FFI_TYPE_LONGDOUBLE to be different than FFI_TYPE_DOUBLE; - all further uses in this file will refer to the 128-bit type. */ -#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE -# if FFI_TYPE_LONGDOUBLE != 4 -# error FFI_TYPE_LONGDOUBLE out of date -# endif -#else -# undef FFI_TYPE_LONGDOUBLE -# define FFI_TYPE_LONGDOUBLE 4 -#endif - -union _d -{ - UINT64 d; - UINT32 s[2]; -}; - -struct _v -{ - union _d d[2] __attribute__((aligned(16))); -}; - -struct call_context -{ - struct _v v[N_V_ARG_REG]; - UINT64 x[N_X_ARG_REG]; -}; - -#if FFI_EXEC_TRAMPOLINE_TABLE - -#ifdef __MACH__ -#ifdef HAVE_PTRAUTH -#include -#endif -#include -#endif - -#else - -#if defined (__clang__) && defined (__APPLE__) -extern void sys_icache_invalidate (void *start, size_t len); -#endif - -static inline void -ffi_clear_cache (void *start, void *end) -{ -#if defined (__clang__) && defined (__APPLE__) - sys_icache_invalidate (start, (char *)end - (char *)start); -#elif defined (__GNUC__) - __builtin___clear_cache (start, end); -#elif defined (_WIN32) - FlushInstructionCache(GetCurrentProcess(), start, (char*)end - (char*)start); -#else -#error "Missing builtin to flush instruction cache" -#endif -} - -#endif - -/* A subroutine of is_vfp_type. Given a structure type, return the type code - of the first non-structure element. Recurse for structure elements. - Return -1 if the structure is in fact empty, i.e. no nested elements. */ - -static int -is_hfa0 (const ffi_type *ty) -{ - ffi_type **elements = ty->elements; - int i, ret = -1; - - if (elements != NULL) - for (i = 0; elements[i]; ++i) - { - ret = elements[i]->type; - if (ret == FFI_TYPE_STRUCT || ret == FFI_TYPE_COMPLEX) - { - ret = is_hfa0 (elements[i]); - if (ret < 0) - continue; - } - break; - } - - return ret; -} - -/* A subroutine of is_vfp_type. Given a structure type, return true if all - of the non-structure elements are the same as CANDIDATE. */ - -static int -is_hfa1 (const ffi_type *ty, int candidate) -{ - ffi_type **elements = ty->elements; - int i; - - if (elements != NULL) - for (i = 0; elements[i]; ++i) - { - int t = elements[i]->type; - if (t == FFI_TYPE_STRUCT || t == FFI_TYPE_COMPLEX) - { - if (!is_hfa1 (elements[i], candidate)) - return 0; - } - else if (t != candidate) - return 0; - } - - return 1; -} - -/* Determine if TY may be allocated to the FP registers. This is both an - fp scalar type as well as an homogenous floating point aggregate (HFA). - That is, a structure consisting of 1 to 4 members of all the same type, - where that type is an fp scalar. - - Returns non-zero iff TY is an HFA. The result is the AARCH64_RET_* - constant for the type. */ - -static int -is_vfp_type (const ffi_type *ty) -{ - ffi_type **elements; - int candidate, i; - size_t size, ele_count; - - /* Quickest tests first. */ - candidate = ty->type; - switch (candidate) - { - default: - return 0; - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - case FFI_TYPE_LONGDOUBLE: - ele_count = 1; - goto done; - case FFI_TYPE_COMPLEX: - candidate = ty->elements[0]->type; - switch (candidate) - { - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - case FFI_TYPE_LONGDOUBLE: - ele_count = 2; - goto done; - } - return 0; - case FFI_TYPE_STRUCT: - break; - } - - /* No HFA types are smaller than 4 bytes, or larger than 64 bytes. */ - size = ty->size; - if (size < 4 || size > 64) - return 0; - - /* Find the type of the first non-structure member. */ - elements = ty->elements; - candidate = elements[0]->type; - if (candidate == FFI_TYPE_STRUCT || candidate == FFI_TYPE_COMPLEX) - { - for (i = 0; ; ++i) - { - candidate = is_hfa0 (elements[i]); - if (candidate >= 0) - break; - } - } - - /* If the first member is not a floating point type, it's not an HFA. - Also quickly re-check the size of the structure. */ - switch (candidate) - { - case FFI_TYPE_FLOAT: - ele_count = size / sizeof(float); - if (size != ele_count * sizeof(float)) - return 0; - break; - case FFI_TYPE_DOUBLE: - ele_count = size / sizeof(double); - if (size != ele_count * sizeof(double)) - return 0; - break; - case FFI_TYPE_LONGDOUBLE: - ele_count = size / sizeof(long double); - if (size != ele_count * sizeof(long double)) - return 0; - break; - default: - return 0; - } - if (ele_count > 4) - return 0; - - /* Finally, make sure that all scalar elements are the same type. */ - for (i = 0; elements[i]; ++i) - { - int t = elements[i]->type; - if (t == FFI_TYPE_STRUCT || t == FFI_TYPE_COMPLEX) - { - if (!is_hfa1 (elements[i], candidate)) - return 0; - } - else if (t != candidate) - return 0; - } - - /* All tests succeeded. Encode the result. */ - done: - return candidate * 4 + (4 - (int)ele_count); -} - -/* Representation of the procedure call argument marshalling - state. - - The terse state variable names match the names used in the AARCH64 - PCS. */ - -struct arg_state -{ - unsigned ngrn; /* Next general-purpose register number. */ - unsigned nsrn; /* Next vector register number. */ - size_t nsaa; /* Next stack offset. */ - -#if defined (__APPLE__) - unsigned allocating_variadic; -#endif -}; - -/* Initialize a procedure call argument marshalling state. */ -static void -arg_init (struct arg_state *state) -{ - state->ngrn = 0; - state->nsrn = 0; - state->nsaa = 0; -#if defined (__APPLE__) - state->allocating_variadic = 0; -#endif -} - -/* Allocate an aligned slot on the stack and return a pointer to it. */ -static void * -allocate_to_stack (struct arg_state *state, void *stack, - size_t alignment, size_t size) -{ - size_t nsaa = state->nsaa; - - /* Round up the NSAA to the larger of 8 or the natural - alignment of the argument's type. */ -#if defined (__APPLE__) - if (state->allocating_variadic && alignment < 8) - alignment = 8; -#else - if (alignment < 8) - alignment = 8; -#endif - - nsaa = FFI_ALIGN (nsaa, alignment); - state->nsaa = nsaa + size; - - return (char *)stack + nsaa; -} - -static ffi_arg -extend_integer_type (void *source, int type) -{ - switch (type) - { - case FFI_TYPE_UINT8: - return *(UINT8 *) source; - case FFI_TYPE_SINT8: - return *(SINT8 *) source; - case FFI_TYPE_UINT16: - return *(UINT16 *) source; - case FFI_TYPE_SINT16: - return *(SINT16 *) source; - case FFI_TYPE_UINT32: - return *(UINT32 *) source; - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: - return *(SINT32 *) source; - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - return *(UINT64 *) source; - break; - case FFI_TYPE_POINTER: - return *(uintptr_t *) source; - default: - abort(); - } -} - -#if defined(_MSC_VER) -void extend_hfa_type (void *dest, void *src, int h); -#else -static void -extend_hfa_type (void *dest, void *src, int h) -{ - ssize_t f = h - AARCH64_RET_S4; - void *x0; - - asm volatile ( - "adr %0, 0f\n" -" add %0, %0, %1\n" -" br %0\n" -"0: ldp s16, s17, [%3]\n" /* S4 */ -" ldp s18, s19, [%3, #8]\n" -" b 4f\n" -" ldp s16, s17, [%3]\n" /* S3 */ -" ldr s18, [%3, #8]\n" -" b 3f\n" -" ldp s16, s17, [%3]\n" /* S2 */ -" b 2f\n" -" nop\n" -" ldr s16, [%3]\n" /* S1 */ -" b 1f\n" -" nop\n" -" ldp d16, d17, [%3]\n" /* D4 */ -" ldp d18, d19, [%3, #16]\n" -" b 4f\n" -" ldp d16, d17, [%3]\n" /* D3 */ -" ldr d18, [%3, #16]\n" -" b 3f\n" -" ldp d16, d17, [%3]\n" /* D2 */ -" b 2f\n" -" nop\n" -" ldr d16, [%3]\n" /* D1 */ -" b 1f\n" -" nop\n" -" ldp q16, q17, [%3]\n" /* Q4 */ -" ldp q18, q19, [%3, #32]\n" -" b 4f\n" -" ldp q16, q17, [%3]\n" /* Q3 */ -" ldr q18, [%3, #32]\n" -" b 3f\n" -" ldp q16, q17, [%3]\n" /* Q2 */ -" b 2f\n" -" nop\n" -" ldr q16, [%3]\n" /* Q1 */ -" b 1f\n" -"4: str q19, [%2, #48]\n" -"3: str q18, [%2, #32]\n" -"2: str q17, [%2, #16]\n" -"1: str q16, [%2]" - : "=&r"(x0) - : "r"(f * 12), "r"(dest), "r"(src) - : "memory", "v16", "v17", "v18", "v19"); -} -#endif - -#if defined(_MSC_VER) -void* compress_hfa_type (void *dest, void *src, int h); -#else -static void * -compress_hfa_type (void *dest, void *reg, int h) -{ - switch (h) - { - case AARCH64_RET_S1: - if (dest == reg) - { -#ifdef __AARCH64EB__ - dest += 12; -#endif - } - else - *(float *)dest = *(float *)reg; - break; - case AARCH64_RET_S2: - asm ("ldp q16, q17, [%1]\n\t" - "st2 { v16.s, v17.s }[0], [%0]" - : : "r"(dest), "r"(reg) : "memory", "v16", "v17"); - break; - case AARCH64_RET_S3: - asm ("ldp q16, q17, [%1]\n\t" - "ldr q18, [%1, #32]\n\t" - "st3 { v16.s, v17.s, v18.s }[0], [%0]" - : : "r"(dest), "r"(reg) : "memory", "v16", "v17", "v18"); - break; - case AARCH64_RET_S4: - asm ("ldp q16, q17, [%1]\n\t" - "ldp q18, q19, [%1, #32]\n\t" - "st4 { v16.s, v17.s, v18.s, v19.s }[0], [%0]" - : : "r"(dest), "r"(reg) : "memory", "v16", "v17", "v18", "v19"); - break; - - case AARCH64_RET_D1: - if (dest == reg) - { -#ifdef __AARCH64EB__ - dest += 8; -#endif - } - else - *(double *)dest = *(double *)reg; - break; - case AARCH64_RET_D2: - asm ("ldp q16, q17, [%1]\n\t" - "st2 { v16.d, v17.d }[0], [%0]" - : : "r"(dest), "r"(reg) : "memory", "v16", "v17"); - break; - case AARCH64_RET_D3: - asm ("ldp q16, q17, [%1]\n\t" - "ldr q18, [%1, #32]\n\t" - "st3 { v16.d, v17.d, v18.d }[0], [%0]" - : : "r"(dest), "r"(reg) : "memory", "v16", "v17", "v18"); - break; - case AARCH64_RET_D4: - asm ("ldp q16, q17, [%1]\n\t" - "ldp q18, q19, [%1, #32]\n\t" - "st4 { v16.d, v17.d, v18.d, v19.d }[0], [%0]" - : : "r"(dest), "r"(reg) : "memory", "v16", "v17", "v18", "v19"); - break; - - default: - if (dest != reg) - return memcpy (dest, reg, 16 * (4 - (h & 3))); - break; - } - return dest; -} -#endif - -/* Either allocate an appropriate register for the argument type, or if - none are available, allocate a stack slot and return a pointer - to the allocated space. */ - -static void * -allocate_int_to_reg_or_stack (struct call_context *context, - struct arg_state *state, - void *stack, size_t size) -{ - if (state->ngrn < N_X_ARG_REG) - return &context->x[state->ngrn++]; - - state->ngrn = N_X_ARG_REG; - return allocate_to_stack (state, stack, size, size); -} - -ffi_status FFI_HIDDEN -ffi_prep_cif_machdep (ffi_cif *cif) -{ - ffi_type *rtype = cif->rtype; - size_t bytes = cif->bytes; - int flags, i, n; - - switch (rtype->type) - { - case FFI_TYPE_VOID: - flags = AARCH64_RET_VOID; - break; - case FFI_TYPE_UINT8: - flags = AARCH64_RET_UINT8; - break; - case FFI_TYPE_UINT16: - flags = AARCH64_RET_UINT16; - break; - case FFI_TYPE_UINT32: - flags = AARCH64_RET_UINT32; - break; - case FFI_TYPE_SINT8: - flags = AARCH64_RET_SINT8; - break; - case FFI_TYPE_SINT16: - flags = AARCH64_RET_SINT16; - break; - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: - flags = AARCH64_RET_SINT32; - break; - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - flags = AARCH64_RET_INT64; - break; - case FFI_TYPE_POINTER: - flags = (sizeof(void *) == 4 ? AARCH64_RET_UINT32 : AARCH64_RET_INT64); - break; - - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - case FFI_TYPE_LONGDOUBLE: - case FFI_TYPE_STRUCT: - case FFI_TYPE_COMPLEX: - flags = is_vfp_type (rtype); - if (flags == 0) - { - size_t s = rtype->size; - if (s > 16) - { - flags = AARCH64_RET_VOID | AARCH64_RET_IN_MEM; - bytes += 8; - } - else if (s == 16) - flags = AARCH64_RET_INT128; - else if (s == 8) - flags = AARCH64_RET_INT64; - else - flags = AARCH64_RET_INT128 | AARCH64_RET_NEED_COPY; - } - break; - - default: - abort(); - } - - for (i = 0, n = cif->nargs; i < n; i++) - if (is_vfp_type (cif->arg_types[i])) - { - flags |= AARCH64_FLAG_ARG_V; - break; - } - - /* Round the stack up to a multiple of the stack alignment requirement. */ - cif->bytes = (unsigned) FFI_ALIGN(bytes, 16); - cif->flags = flags; -#if defined (__APPLE__) - cif->aarch64_nfixedargs = 0; -#endif - - return FFI_OK; -} - -#if defined (__APPLE__) -/* Perform Apple-specific cif processing for variadic calls */ -ffi_status FFI_HIDDEN -ffi_prep_cif_machdep_var(ffi_cif *cif, unsigned int nfixedargs, - unsigned int ntotalargs) -{ - ffi_status status = ffi_prep_cif_machdep (cif); - cif->aarch64_nfixedargs = nfixedargs; - return status; -} -#else -ffi_status FFI_HIDDEN -ffi_prep_cif_machdep_var(ffi_cif *cif, unsigned int nfixedargs, unsigned int ntotalargs) -{ - ffi_status status = ffi_prep_cif_machdep (cif); - cif->flags |= AARCH64_FLAG_VARARG; - return status; -} -#endif /* __APPLE__ */ - -extern void ffi_call_SYSV (struct call_context *context, void *frame, - void (*fn)(void), void *rvalue, int flags, - void *closure) FFI_HIDDEN; - -/* Call a function with the provided arguments and capture the return - value. */ -static void -ffi_call_int (ffi_cif *cif, void (*fn)(void), void *orig_rvalue, - void **avalue, void *closure) -{ - struct call_context *context; - void *stack, *frame, *rvalue; - struct arg_state state; - size_t stack_bytes, rtype_size, rsize; - int i, nargs, flags, isvariadic = 0; - ffi_type *rtype; - - flags = cif->flags; - rtype = cif->rtype; - rtype_size = rtype->size; - stack_bytes = cif->bytes; - - if (flags & AARCH64_FLAG_VARARG) - { - isvariadic = 1; - flags &= ~AARCH64_FLAG_VARARG; - } - - /* If the target function returns a structure via hidden pointer, - then we cannot allow a null rvalue. Otherwise, mash a null - rvalue to void return type. */ - rsize = 0; - if (flags & AARCH64_RET_IN_MEM) - { - if (orig_rvalue == NULL) - rsize = rtype_size; - } - else if (orig_rvalue == NULL) - flags &= AARCH64_FLAG_ARG_V; - else if (flags & AARCH64_RET_NEED_COPY) - rsize = 16; - - /* Allocate consectutive stack for everything we'll need. */ - context = alloca (sizeof(struct call_context) + stack_bytes + 32 + rsize); - stack = context + 1; - frame = (void*)((uintptr_t)stack + (uintptr_t)stack_bytes); - rvalue = (rsize ? (void*)((uintptr_t)frame + 32) : orig_rvalue); - - arg_init (&state); - for (i = 0, nargs = cif->nargs; i < nargs; i++) - { - ffi_type *ty = cif->arg_types[i]; - size_t s = ty->size; - void *a = avalue[i]; - int h, t; - - t = ty->type; - switch (t) - { - case FFI_TYPE_VOID: - FFI_ASSERT (0); - break; - - /* If the argument is a basic type the argument is allocated to an - appropriate register, or if none are available, to the stack. */ - case FFI_TYPE_INT: - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - case FFI_TYPE_POINTER: - do_pointer: - { - ffi_arg ext = extend_integer_type (a, t); - if (state.ngrn < N_X_ARG_REG) - context->x[state.ngrn++] = ext; - else - { - void *d = allocate_to_stack (&state, stack, ty->alignment, s); - state.ngrn = N_X_ARG_REG; - /* Note that the default abi extends each argument - to a full 64-bit slot, while the iOS abi allocates - only enough space. */ -#ifdef __APPLE__ - memcpy(d, a, s); -#else - *(ffi_arg *)d = ext; -#endif - } - } - break; - - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - case FFI_TYPE_LONGDOUBLE: - case FFI_TYPE_STRUCT: - case FFI_TYPE_COMPLEX: - { - void *dest; - - h = is_vfp_type (ty); - if (h) - { - int elems = 4 - (h & 3); - if (cif->abi == FFI_WIN64 && isvariadic) - { - if (state.ngrn + elems <= N_X_ARG_REG) - { - dest = &context->x[state.ngrn]; - state.ngrn += elems; - extend_hfa_type(dest, a, h); - break; - } - state.nsrn = N_X_ARG_REG; - dest = allocate_to_stack(&state, stack, ty->alignment, s); - } - else - { - if (state.nsrn + elems <= N_V_ARG_REG) - { - dest = &context->v[state.nsrn]; - state.nsrn += elems; - extend_hfa_type (dest, a, h); - break; - } - state.nsrn = N_V_ARG_REG; - dest = allocate_to_stack (&state, stack, ty->alignment, s); - } - } - else if (s > 16) - { - /* If the argument is a composite type that is larger than 16 - bytes, then the argument has been copied to memory, and - the argument is replaced by a pointer to the copy. */ - a = &avalue[i]; - t = FFI_TYPE_POINTER; - s = sizeof (void *); - goto do_pointer; - } - else - { - size_t n = (s + 7) / 8; - if (state.ngrn + n <= N_X_ARG_REG) - { - /* If the argument is a composite type and the size in - double-words is not more than the number of available - X registers, then the argument is copied into - consecutive X registers. */ - dest = &context->x[state.ngrn]; - state.ngrn += (unsigned int)n; - } - else - { - /* Otherwise, there are insufficient X registers. Further - X register allocations are prevented, the NSAA is - adjusted and the argument is copied to memory at the - adjusted NSAA. */ - state.ngrn = N_X_ARG_REG; - dest = allocate_to_stack (&state, stack, ty->alignment, s); - } - } - memcpy (dest, a, s); - } - break; - - default: - abort(); - } - -#if defined (__APPLE__) - if (i + 1 == cif->aarch64_nfixedargs) - { - state.ngrn = N_X_ARG_REG; - state.nsrn = N_V_ARG_REG; - state.allocating_variadic = 1; - } -#endif - } - - ffi_call_SYSV (context, frame, fn, rvalue, flags, closure); - - if (flags & AARCH64_RET_NEED_COPY) - memcpy (orig_rvalue, rvalue, rtype_size); -} - -void -ffi_call (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue) -{ - ffi_call_int (cif, fn, rvalue, avalue, NULL); -} - -#ifdef FFI_GO_CLOSURES -void -ffi_call_go (ffi_cif *cif, void (*fn) (void), void *rvalue, - void **avalue, void *closure) -{ - ffi_call_int (cif, fn, rvalue, avalue, closure); -} -#endif /* FFI_GO_CLOSURES */ - -/* Build a trampoline. */ - -extern void ffi_closure_SYSV (void) FFI_HIDDEN; -extern void ffi_closure_SYSV_V (void) FFI_HIDDEN; - -ffi_status -ffi_prep_closure_loc (ffi_closure *closure, - ffi_cif* cif, - void (*fun)(ffi_cif*,void*,void**,void*), - void *user_data, - void *codeloc) -{ - if (cif->abi != FFI_SYSV) - return FFI_BAD_ABI; - - void (*start)(void); - - if (cif->flags & AARCH64_FLAG_ARG_V) - start = ffi_closure_SYSV_V; - else - start = ffi_closure_SYSV; - -#if FFI_EXEC_TRAMPOLINE_TABLE -#ifdef __MACH__ -#ifdef HAVE_PTRAUTH - codeloc = ptrauth_strip (codeloc, ptrauth_key_asia); -#endif - void **config = (void **)((uint8_t *)codeloc - PAGE_MAX_SIZE); - config[0] = closure; - config[1] = start; -#endif -#else - static const unsigned char trampoline[16] = { - 0x90, 0x00, 0x00, 0x58, /* ldr x16, tramp+16 */ - 0xf1, 0xff, 0xff, 0x10, /* adr x17, tramp+0 */ - 0x00, 0x02, 0x1f, 0xd6 /* br x16 */ - }; - char *tramp = closure->tramp; - - memcpy (tramp, trampoline, sizeof(trampoline)); - - *(UINT64 *)(tramp + 16) = (uintptr_t)start; - - ffi_clear_cache(tramp, tramp + FFI_TRAMPOLINE_SIZE); - - /* Also flush the cache for code mapping. */ -#ifdef _WIN32 - // Not using dlmalloc.c for Windows ARM64 builds - // so calling ffi_data_to_code_pointer() isn't necessary - unsigned char *tramp_code = tramp; - #else - unsigned char *tramp_code = ffi_data_to_code_pointer (tramp); - #endif - ffi_clear_cache (tramp_code, tramp_code + FFI_TRAMPOLINE_SIZE); -#endif - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - return FFI_OK; -} - -#ifdef FFI_GO_CLOSURES -extern void ffi_go_closure_SYSV (void) FFI_HIDDEN; -extern void ffi_go_closure_SYSV_V (void) FFI_HIDDEN; - -ffi_status -ffi_prep_go_closure (ffi_go_closure *closure, ffi_cif* cif, - void (*fun)(ffi_cif*,void*,void**,void*)) -{ - void (*start)(void); - - if (cif->abi != FFI_SYSV) - return FFI_BAD_ABI; - - if (cif->flags & AARCH64_FLAG_ARG_V) - start = ffi_go_closure_SYSV_V; - else - start = ffi_go_closure_SYSV; - - closure->tramp = start; - closure->cif = cif; - closure->fun = fun; - - return FFI_OK; -} -#endif /* FFI_GO_CLOSURES */ - -/* Primary handler to setup and invoke a function within a closure. - - A closure when invoked enters via the assembler wrapper - ffi_closure_SYSV(). The wrapper allocates a call context on the - stack, saves the interesting registers (from the perspective of - the calling convention) into the context then passes control to - ffi_closure_SYSV_inner() passing the saved context and a pointer to - the stack at the point ffi_closure_SYSV() was invoked. - - On the return path the assembler wrapper will reload call context - registers. - - ffi_closure_SYSV_inner() marshalls the call context into ffi value - descriptors, invokes the wrapped function, then marshalls the return - value back into the call context. */ - -int FFI_HIDDEN -ffi_closure_SYSV_inner (ffi_cif *cif, - void (*fun)(ffi_cif*,void*,void**,void*), - void *user_data, - struct call_context *context, - void *stack, void *rvalue, void *struct_rvalue) -{ - void **avalue = (void**) alloca (cif->nargs * sizeof (void*)); - int i, h, nargs, flags; - struct arg_state state; - - arg_init (&state); - - for (i = 0, nargs = cif->nargs; i < nargs; i++) - { - ffi_type *ty = cif->arg_types[i]; - int t = ty->type; - size_t n, s = ty->size; - - switch (t) - { - case FFI_TYPE_VOID: - FFI_ASSERT (0); - break; - - case FFI_TYPE_INT: - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - case FFI_TYPE_POINTER: - avalue[i] = allocate_int_to_reg_or_stack (context, &state, stack, s); - break; - - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - case FFI_TYPE_LONGDOUBLE: - case FFI_TYPE_STRUCT: - case FFI_TYPE_COMPLEX: - h = is_vfp_type (ty); - if (h) - { - n = 4 - (h & 3); -#ifdef _WIN32 /* for handling armasm calling convention */ - if (cif->is_variadic) - { - if (state.ngrn + n <= N_X_ARG_REG) - { - void *reg = &context->x[state.ngrn]; - state.ngrn += (unsigned int)n; - - /* Eeek! We need a pointer to the structure, however the - homogeneous float elements are being passed in individual - registers, therefore for float and double the structure - is not represented as a contiguous sequence of bytes in - our saved register context. We don't need the original - contents of the register storage, so we reformat the - structure into the same memory. */ - avalue[i] = compress_hfa_type(reg, reg, h); - } - else - { - state.ngrn = N_X_ARG_REG; - state.nsrn = N_V_ARG_REG; - avalue[i] = allocate_to_stack(&state, stack, - ty->alignment, s); - } - } - else - { -#endif /* for handling armasm calling convention */ - if (state.nsrn + n <= N_V_ARG_REG) - { - void *reg = &context->v[state.nsrn]; - state.nsrn += (unsigned int)n; - avalue[i] = compress_hfa_type(reg, reg, h); - } - else - { - state.nsrn = N_V_ARG_REG; - avalue[i] = allocate_to_stack(&state, stack, - ty->alignment, s); - } -#ifdef _WIN32 /* for handling armasm calling convention */ - } -#endif /* for handling armasm calling convention */ - } - else if (s > 16) - { - /* Replace Composite type of size greater than 16 with a - pointer. */ - avalue[i] = *(void **) - allocate_int_to_reg_or_stack (context, &state, stack, - sizeof (void *)); - } - else - { - n = (s + 7) / 8; - if (state.ngrn + n <= N_X_ARG_REG) - { - avalue[i] = &context->x[state.ngrn]; - state.ngrn += (unsigned int)n; - } - else - { - state.ngrn = N_X_ARG_REG; - avalue[i] = allocate_to_stack(&state, stack, - ty->alignment, s); - } - } - break; - - default: - abort(); - } - -#if defined (__APPLE__) - if (i + 1 == cif->aarch64_nfixedargs) - { - state.ngrn = N_X_ARG_REG; - state.nsrn = N_V_ARG_REG; - state.allocating_variadic = 1; - } -#endif - } - - flags = cif->flags; - if (flags & AARCH64_RET_IN_MEM) - rvalue = struct_rvalue; - - fun (cif, rvalue, avalue, user_data); - - return flags; -} - -#endif /* (__aarch64__) || defined(__arm64__)|| defined (_M_ARM64)*/ diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/aarch64/ffitarget.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/aarch64/ffitarget.h deleted file mode 100644 index d5622e1..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/aarch64/ffitarget.h +++ /dev/null @@ -1,97 +0,0 @@ -/* Copyright (c) 2009, 2010, 2011, 2012 ARM Ltd. - -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. */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#ifndef LIBFFI_ASM -#ifdef __ILP32__ -#define FFI_SIZEOF_ARG 8 -#define FFI_SIZEOF_JAVA_RAW 4 -typedef unsigned long long ffi_arg; -typedef signed long long ffi_sarg; -#elif defined(_WIN32) -#define FFI_SIZEOF_ARG 8 -typedef unsigned long long ffi_arg; -typedef signed long long ffi_sarg; -#else -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; -#endif - -typedef enum ffi_abi - { - FFI_FIRST_ABI = 0, - FFI_SYSV, - FFI_WIN64, - FFI_LAST_ABI, -#if defined(_WIN32) - FFI_DEFAULT_ABI = FFI_WIN64 -#else - FFI_DEFAULT_ABI = FFI_SYSV -#endif - } ffi_abi; -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_NATIVE_RAW_API 0 - -#if defined (FFI_EXEC_TRAMPOLINE_TABLE) && FFI_EXEC_TRAMPOLINE_TABLE - -#ifdef __MACH__ -#define FFI_TRAMPOLINE_SIZE 16 -#define FFI_TRAMPOLINE_CLOSURE_OFFSET 16 -#else -#error "No trampoline table implementation" -#endif - -#else -#define FFI_TRAMPOLINE_SIZE 24 -#define FFI_TRAMPOLINE_CLOSURE_OFFSET FFI_TRAMPOLINE_SIZE -#endif - -#ifdef _WIN32 -#define FFI_EXTRA_CIF_FIELDS unsigned is_variadic -#endif -#define FFI_TARGET_SPECIFIC_VARIADIC - -/* ---- Internal ---- */ - -#if defined (__APPLE__) -#define FFI_EXTRA_CIF_FIELDS unsigned aarch64_nfixedargs -#elif !defined(_WIN32) -/* iOS and Windows reserve x18 for the system. Disable Go closures until - a new static chain is chosen. */ -#define FFI_GO_CLOSURES 1 -#endif - -#ifndef _WIN32 -/* No complex type on Windows */ -#define FFI_TARGET_HAS_COMPLEX_TYPE -#endif - -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/aarch64/internal.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/aarch64/internal.h deleted file mode 100644 index 3d4d035..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/aarch64/internal.h +++ /dev/null @@ -1,68 +0,0 @@ -/* -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. */ - -#define AARCH64_RET_VOID 0 -#define AARCH64_RET_INT64 1 -#define AARCH64_RET_INT128 2 - -#define AARCH64_RET_UNUSED3 3 -#define AARCH64_RET_UNUSED4 4 -#define AARCH64_RET_UNUSED5 5 -#define AARCH64_RET_UNUSED6 6 -#define AARCH64_RET_UNUSED7 7 - -/* Note that FFI_TYPE_FLOAT == 2, _DOUBLE == 3, _LONGDOUBLE == 4, - so _S4 through _Q1 are layed out as (TYPE * 4) + (4 - COUNT). */ -#define AARCH64_RET_S4 8 -#define AARCH64_RET_S3 9 -#define AARCH64_RET_S2 10 -#define AARCH64_RET_S1 11 - -#define AARCH64_RET_D4 12 -#define AARCH64_RET_D3 13 -#define AARCH64_RET_D2 14 -#define AARCH64_RET_D1 15 - -#define AARCH64_RET_Q4 16 -#define AARCH64_RET_Q3 17 -#define AARCH64_RET_Q2 18 -#define AARCH64_RET_Q1 19 - -/* Note that each of the sub-64-bit integers gets two entries. */ -#define AARCH64_RET_UINT8 20 -#define AARCH64_RET_UINT16 22 -#define AARCH64_RET_UINT32 24 - -#define AARCH64_RET_SINT8 26 -#define AARCH64_RET_SINT16 28 -#define AARCH64_RET_SINT32 30 - -#define AARCH64_RET_MASK 31 - -#define AARCH64_RET_IN_MEM (1 << 5) -#define AARCH64_RET_NEED_COPY (1 << 6) - -#define AARCH64_FLAG_ARG_V_BIT 7 -#define AARCH64_FLAG_ARG_V (1 << AARCH64_FLAG_ARG_V_BIT) -#define AARCH64_FLAG_VARARG (1 << 8) - -#define N_X_ARG_REG 8 -#define N_V_ARG_REG 8 -#define CALL_CONTEXT_SIZE (N_V_ARG_REG * 16 + N_X_ARG_REG * 8) diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/aarch64/sysv.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/aarch64/sysv.S deleted file mode 100644 index b720a92..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/aarch64/sysv.S +++ /dev/null @@ -1,451 +0,0 @@ -/* Copyright (c) 2009, 2010, 2011, 2012 ARM Ltd. - -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. */ - -#if defined(__aarch64__) || defined(__arm64__) -#define LIBFFI_ASM -#include -#include -#include -#include "internal.h" - -#ifdef HAVE_MACHINE_ASM_H -#include -#else -#ifdef __USER_LABEL_PREFIX__ -#define CONCAT1(a, b) CONCAT2(a, b) -#define CONCAT2(a, b) a ## b - -/* Use the right prefix for global labels. */ -#define CNAME(x) CONCAT1 (__USER_LABEL_PREFIX__, x) -#else -#define CNAME(x) x -#endif -#endif - -#ifdef __AARCH64EB__ -# define BE(X) X -#else -# define BE(X) 0 -#endif - -#ifdef __ILP32__ -#define PTR_REG(n) w##n -#else -#define PTR_REG(n) x##n -#endif - -#ifdef __ILP32__ -#define PTR_SIZE 4 -#else -#define PTR_SIZE 8 -#endif - -#if FFI_EXEC_TRAMPOLINE_TABLE && defined(__MACH__) && defined(HAVE_PTRAUTH) -# define BR(r) braaz r -# define BLR(r) blraaz r -#else -# define BR(r) br r -# define BLR(r) blr r -#endif - - .text - .align 4 - -/* ffi_call_SYSV - extern void ffi_call_SYSV (void *stack, void *frame, - void (*fn)(void), void *rvalue, - int flags, void *closure); - - Therefore on entry we have: - - x0 stack - x1 frame - x2 fn - x3 rvalue - x4 flags - x5 closure -*/ - - cfi_startproc -CNAME(ffi_call_SYSV): - /* Use a stack frame allocated by our caller. */ - cfi_def_cfa(x1, 32); - stp x29, x30, [x1] - mov x29, x1 - mov sp, x0 - cfi_def_cfa_register(x29) - cfi_rel_offset (x29, 0) - cfi_rel_offset (x30, 8) - - mov x9, x2 /* save fn */ - mov x8, x3 /* install structure return */ -#ifdef FFI_GO_CLOSURES - mov x18, x5 /* install static chain */ -#endif - stp x3, x4, [x29, #16] /* save rvalue and flags */ - - /* Load the vector argument passing registers, if necessary. */ - tbz w4, #AARCH64_FLAG_ARG_V_BIT, 1f - ldp q0, q1, [sp, #0] - ldp q2, q3, [sp, #32] - ldp q4, q5, [sp, #64] - ldp q6, q7, [sp, #96] -1: - /* Load the core argument passing registers, including - the structure return pointer. */ - ldp x0, x1, [sp, #16*N_V_ARG_REG + 0] - ldp x2, x3, [sp, #16*N_V_ARG_REG + 16] - ldp x4, x5, [sp, #16*N_V_ARG_REG + 32] - ldp x6, x7, [sp, #16*N_V_ARG_REG + 48] - - /* Deallocate the context, leaving the stacked arguments. */ - add sp, sp, #CALL_CONTEXT_SIZE - - BLR(x9) /* call fn */ - - ldp x3, x4, [x29, #16] /* reload rvalue and flags */ - - /* Partially deconstruct the stack frame. */ - mov sp, x29 - cfi_def_cfa_register (sp) - ldp x29, x30, [x29] - - /* Save the return value as directed. */ - adr x5, 0f - and w4, w4, #AARCH64_RET_MASK - add x5, x5, x4, lsl #3 - br x5 - - /* Note that each table entry is 2 insns, and thus 8 bytes. - For integer data, note that we're storing into ffi_arg - and therefore we want to extend to 64 bits; these types - have two consecutive entries allocated for them. */ - .align 4 -0: ret /* VOID */ - nop -1: str x0, [x3] /* INT64 */ - ret -2: stp x0, x1, [x3] /* INT128 */ - ret -3: brk #1000 /* UNUSED */ - ret -4: brk #1000 /* UNUSED */ - ret -5: brk #1000 /* UNUSED */ - ret -6: brk #1000 /* UNUSED */ - ret -7: brk #1000 /* UNUSED */ - ret -8: st4 { v0.s, v1.s, v2.s, v3.s }[0], [x3] /* S4 */ - ret -9: st3 { v0.s, v1.s, v2.s }[0], [x3] /* S3 */ - ret -10: stp s0, s1, [x3] /* S2 */ - ret -11: str s0, [x3] /* S1 */ - ret -12: st4 { v0.d, v1.d, v2.d, v3.d }[0], [x3] /* D4 */ - ret -13: st3 { v0.d, v1.d, v2.d }[0], [x3] /* D3 */ - ret -14: stp d0, d1, [x3] /* D2 */ - ret -15: str d0, [x3] /* D1 */ - ret -16: str q3, [x3, #48] /* Q4 */ - nop -17: str q2, [x3, #32] /* Q3 */ - nop -18: stp q0, q1, [x3] /* Q2 */ - ret -19: str q0, [x3] /* Q1 */ - ret -20: uxtb w0, w0 /* UINT8 */ - str x0, [x3] -21: ret /* reserved */ - nop -22: uxth w0, w0 /* UINT16 */ - str x0, [x3] -23: ret /* reserved */ - nop -24: mov w0, w0 /* UINT32 */ - str x0, [x3] -25: ret /* reserved */ - nop -26: sxtb x0, w0 /* SINT8 */ - str x0, [x3] -27: ret /* reserved */ - nop -28: sxth x0, w0 /* SINT16 */ - str x0, [x3] -29: ret /* reserved */ - nop -30: sxtw x0, w0 /* SINT32 */ - str x0, [x3] -31: ret /* reserved */ - nop - - cfi_endproc - - .globl CNAME(ffi_call_SYSV) - FFI_HIDDEN(CNAME(ffi_call_SYSV)) -#ifdef __ELF__ - .type CNAME(ffi_call_SYSV), #function - .size CNAME(ffi_call_SYSV), .-CNAME(ffi_call_SYSV) -#endif - -/* ffi_closure_SYSV - - Closure invocation glue. This is the low level code invoked directly by - the closure trampoline to setup and call a closure. - - On entry x17 points to a struct ffi_closure, x16 has been clobbered - all other registers are preserved. - - We allocate a call context and save the argument passing registers, - then invoked the generic C ffi_closure_SYSV_inner() function to do all - the real work, on return we load the result passing registers back from - the call context. -*/ - -#define ffi_closure_SYSV_FS (8*2 + CALL_CONTEXT_SIZE + 64) - - .align 4 -CNAME(ffi_closure_SYSV_V): - cfi_startproc - stp x29, x30, [sp, #-ffi_closure_SYSV_FS]! - cfi_adjust_cfa_offset (ffi_closure_SYSV_FS) - cfi_rel_offset (x29, 0) - cfi_rel_offset (x30, 8) - - /* Save the argument passing vector registers. */ - stp q0, q1, [sp, #16 + 0] - stp q2, q3, [sp, #16 + 32] - stp q4, q5, [sp, #16 + 64] - stp q6, q7, [sp, #16 + 96] - b 0f - cfi_endproc - - .globl CNAME(ffi_closure_SYSV_V) - FFI_HIDDEN(CNAME(ffi_closure_SYSV_V)) -#ifdef __ELF__ - .type CNAME(ffi_closure_SYSV_V), #function - .size CNAME(ffi_closure_SYSV_V), . - CNAME(ffi_closure_SYSV_V) -#endif - - .align 4 - cfi_startproc -CNAME(ffi_closure_SYSV): - stp x29, x30, [sp, #-ffi_closure_SYSV_FS]! - cfi_adjust_cfa_offset (ffi_closure_SYSV_FS) - cfi_rel_offset (x29, 0) - cfi_rel_offset (x30, 8) -0: - mov x29, sp - - /* Save the argument passing core registers. */ - stp x0, x1, [sp, #16 + 16*N_V_ARG_REG + 0] - stp x2, x3, [sp, #16 + 16*N_V_ARG_REG + 16] - stp x4, x5, [sp, #16 + 16*N_V_ARG_REG + 32] - stp x6, x7, [sp, #16 + 16*N_V_ARG_REG + 48] - - /* Load ffi_closure_inner arguments. */ - ldp PTR_REG(0), PTR_REG(1), [x17, #FFI_TRAMPOLINE_CLOSURE_OFFSET] /* load cif, fn */ - ldr PTR_REG(2), [x17, #FFI_TRAMPOLINE_CLOSURE_OFFSET+PTR_SIZE*2] /* load user_data */ -.Ldo_closure: - add x3, sp, #16 /* load context */ - add x4, sp, #ffi_closure_SYSV_FS /* load stack */ - add x5, sp, #16+CALL_CONTEXT_SIZE /* load rvalue */ - mov x6, x8 /* load struct_rval */ - bl CNAME(ffi_closure_SYSV_inner) - - /* Load the return value as directed. */ -#if FFI_EXEC_TRAMPOLINE_TABLE && defined(__MACH__) && defined(HAVE_PTRAUTH) - autiza x1 -#endif - adr x1, 0f - and w0, w0, #AARCH64_RET_MASK - add x1, x1, x0, lsl #3 - add x3, sp, #16+CALL_CONTEXT_SIZE - br x1 - - /* Note that each table entry is 2 insns, and thus 8 bytes. */ - .align 4 -0: b 99f /* VOID */ - nop -1: ldr x0, [x3] /* INT64 */ - b 99f -2: ldp x0, x1, [x3] /* INT128 */ - b 99f -3: brk #1000 /* UNUSED */ - nop -4: brk #1000 /* UNUSED */ - nop -5: brk #1000 /* UNUSED */ - nop -6: brk #1000 /* UNUSED */ - nop -7: brk #1000 /* UNUSED */ - nop -8: ldr s3, [x3, #12] /* S4 */ - nop -9: ldr s2, [x3, #8] /* S3 */ - nop -10: ldp s0, s1, [x3] /* S2 */ - b 99f -11: ldr s0, [x3] /* S1 */ - b 99f -12: ldr d3, [x3, #24] /* D4 */ - nop -13: ldr d2, [x3, #16] /* D3 */ - nop -14: ldp d0, d1, [x3] /* D2 */ - b 99f -15: ldr d0, [x3] /* D1 */ - b 99f -16: ldr q3, [x3, #48] /* Q4 */ - nop -17: ldr q2, [x3, #32] /* Q3 */ - nop -18: ldp q0, q1, [x3] /* Q2 */ - b 99f -19: ldr q0, [x3] /* Q1 */ - b 99f -20: ldrb w0, [x3, #BE(7)] /* UINT8 */ - b 99f -21: brk #1000 /* reserved */ - nop -22: ldrh w0, [x3, #BE(6)] /* UINT16 */ - b 99f -23: brk #1000 /* reserved */ - nop -24: ldr w0, [x3, #BE(4)] /* UINT32 */ - b 99f -25: brk #1000 /* reserved */ - nop -26: ldrsb x0, [x3, #BE(7)] /* SINT8 */ - b 99f -27: brk #1000 /* reserved */ - nop -28: ldrsh x0, [x3, #BE(6)] /* SINT16 */ - b 99f -29: brk #1000 /* reserved */ - nop -30: ldrsw x0, [x3, #BE(4)] /* SINT32 */ - nop -31: /* reserved */ -99: ldp x29, x30, [sp], #ffi_closure_SYSV_FS - cfi_adjust_cfa_offset (-ffi_closure_SYSV_FS) - cfi_restore (x29) - cfi_restore (x30) - ret - cfi_endproc - - .globl CNAME(ffi_closure_SYSV) - FFI_HIDDEN(CNAME(ffi_closure_SYSV)) -#ifdef __ELF__ - .type CNAME(ffi_closure_SYSV), #function - .size CNAME(ffi_closure_SYSV), . - CNAME(ffi_closure_SYSV) -#endif - -#if FFI_EXEC_TRAMPOLINE_TABLE - -#ifdef __MACH__ -#include - .align PAGE_MAX_SHIFT -CNAME(ffi_closure_trampoline_table_page): - .rept PAGE_MAX_SIZE / FFI_TRAMPOLINE_SIZE - adr x16, -PAGE_MAX_SIZE - ldp x17, x16, [x16] - BR(x16) - nop /* each entry in the trampoline config page is 2*sizeof(void*) so the trampoline itself cannot be smaller than 16 bytes */ - .endr - - .globl CNAME(ffi_closure_trampoline_table_page) - FFI_HIDDEN(CNAME(ffi_closure_trampoline_table_page)) - #ifdef __ELF__ - .type CNAME(ffi_closure_trampoline_table_page), #function - .size CNAME(ffi_closure_trampoline_table_page), . - CNAME(ffi_closure_trampoline_table_page) - #endif -#endif - -#endif /* FFI_EXEC_TRAMPOLINE_TABLE */ - -#ifdef FFI_GO_CLOSURES - .align 4 -CNAME(ffi_go_closure_SYSV_V): - cfi_startproc - stp x29, x30, [sp, #-ffi_closure_SYSV_FS]! - cfi_adjust_cfa_offset (ffi_closure_SYSV_FS) - cfi_rel_offset (x29, 0) - cfi_rel_offset (x30, 8) - - /* Save the argument passing vector registers. */ - stp q0, q1, [sp, #16 + 0] - stp q2, q3, [sp, #16 + 32] - stp q4, q5, [sp, #16 + 64] - stp q6, q7, [sp, #16 + 96] - b 0f - cfi_endproc - - .globl CNAME(ffi_go_closure_SYSV_V) - FFI_HIDDEN(CNAME(ffi_go_closure_SYSV_V)) -#ifdef __ELF__ - .type CNAME(ffi_go_closure_SYSV_V), #function - .size CNAME(ffi_go_closure_SYSV_V), . - CNAME(ffi_go_closure_SYSV_V) -#endif - - .align 4 - cfi_startproc -CNAME(ffi_go_closure_SYSV): - stp x29, x30, [sp, #-ffi_closure_SYSV_FS]! - cfi_adjust_cfa_offset (ffi_closure_SYSV_FS) - cfi_rel_offset (x29, 0) - cfi_rel_offset (x30, 8) -0: - mov x29, sp - - /* Save the argument passing core registers. */ - stp x0, x1, [sp, #16 + 16*N_V_ARG_REG + 0] - stp x2, x3, [sp, #16 + 16*N_V_ARG_REG + 16] - stp x4, x5, [sp, #16 + 16*N_V_ARG_REG + 32] - stp x6, x7, [sp, #16 + 16*N_V_ARG_REG + 48] - - /* Load ffi_closure_inner arguments. */ - ldp PTR_REG(0), PTR_REG(1), [x18, #PTR_SIZE]/* load cif, fn */ - mov x2, x18 /* load user_data */ - b .Ldo_closure - cfi_endproc - - .globl CNAME(ffi_go_closure_SYSV) - FFI_HIDDEN(CNAME(ffi_go_closure_SYSV)) -#ifdef __ELF__ - .type CNAME(ffi_go_closure_SYSV), #function - .size CNAME(ffi_go_closure_SYSV), . - CNAME(ffi_go_closure_SYSV) -#endif -#endif /* FFI_GO_CLOSURES */ -#endif /* __arm64__ */ - -#if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",%progbits -#endif - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/aarch64/win64_armasm.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/aarch64/win64_armasm.S deleted file mode 100644 index 7fc185b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/aarch64/win64_armasm.S +++ /dev/null @@ -1,506 +0,0 @@ -/* Copyright (c) 2009, 2010, 2011, 2012 ARM Ltd. -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. */ - -#define LIBFFI_ASM -#include -#include -#include -#include "internal.h" - - OPT 2 /*disable listing */ -/* For some macros to add unwind information */ -#include "ksarm64.h" - OPT 1 /*re-enable listing */ - -#define BE(X) 0 -#define PTR_REG(n) x##n -#define PTR_SIZE 8 - - IMPORT ffi_closure_SYSV_inner - EXPORT ffi_call_SYSV - EXPORT ffi_closure_SYSV_V - EXPORT ffi_closure_SYSV - EXPORT extend_hfa_type - EXPORT compress_hfa_type -#ifdef FFI_GO_CLOSURES - EXPORT ffi_go_closure_SYSV_V - EXPORT ffi_go_closure_SYSV -#endif - - TEXTAREA, ALIGN=8 - -/* ffi_call_SYSV - extern void ffi_call_SYSV (void *stack, void *frame, - void (*fn)(void), void *rvalue, - int flags, void *closure); - Therefore on entry we have: - x0 stack - x1 frame - x2 fn - x3 rvalue - x4 flags - x5 closure -*/ - - NESTED_ENTRY ffi_call_SYSV_fake - - /* For unwind information, Windows has to store fp and lr */ - PROLOG_SAVE_REG_PAIR x29, x30, #-32! - - ALTERNATE_ENTRY ffi_call_SYSV - /* Use a stack frame allocated by our caller. */ - stp x29, x30, [x1] - mov x29, x1 - mov sp, x0 - - mov x9, x2 /* save fn */ - mov x8, x3 /* install structure return */ -#ifdef FFI_GO_CLOSURES - /*mov x18, x5 install static chain */ -#endif - stp x3, x4, [x29, #16] /* save rvalue and flags */ - - /* Load the vector argument passing registers, if necessary. */ - tbz x4, #AARCH64_FLAG_ARG_V_BIT, ffi_call_SYSV_L1 - ldp q0, q1, [sp, #0] - ldp q2, q3, [sp, #32] - ldp q4, q5, [sp, #64] - ldp q6, q7, [sp, #96] - -ffi_call_SYSV_L1 - /* Load the core argument passing registers, including - the structure return pointer. */ - ldp x0, x1, [sp, #16*N_V_ARG_REG + 0] - ldp x2, x3, [sp, #16*N_V_ARG_REG + 16] - ldp x4, x5, [sp, #16*N_V_ARG_REG + 32] - ldp x6, x7, [sp, #16*N_V_ARG_REG + 48] - - /* Deallocate the context, leaving the stacked arguments. */ - add sp, sp, #CALL_CONTEXT_SIZE - - blr x9 /* call fn */ - - ldp x3, x4, [x29, #16] /* reload rvalue and flags */ - - /* Partially deconstruct the stack frame. */ - mov sp, x29 - ldp x29, x30, [x29] - - /* Save the return value as directed. */ - adr x5, ffi_call_SYSV_return - and w4, w4, #AARCH64_RET_MASK - add x5, x5, x4, lsl #3 - br x5 - - /* Note that each table entry is 2 insns, and thus 8 bytes. - For integer data, note that we're storing into ffi_arg - and therefore we want to extend to 64 bits; these types - have two consecutive entries allocated for them. */ - ALIGN 4 -ffi_call_SYSV_return - ret /* VOID */ - nop - str x0, [x3] /* INT64 */ - ret - stp x0, x1, [x3] /* INT128 */ - ret - brk #1000 /* UNUSED */ - ret - brk #1000 /* UNUSED */ - ret - brk #1000 /* UNUSED */ - ret - brk #1000 /* UNUSED */ - ret - brk #1000 /* UNUSED */ - ret - st4 { v0.s, v1.s, v2.s, v3.s }[0], [x3] /* S4 */ - ret - st3 { v0.s, v1.s, v2.s }[0], [x3] /* S3 */ - ret - stp s0, s1, [x3] /* S2 */ - ret - str s0, [x3] /* S1 */ - ret - st4 { v0.d, v1.d, v2.d, v3.d }[0], [x3] /* D4 */ - ret - st3 { v0.d, v1.d, v2.d }[0], [x3] /* D3 */ - ret - stp d0, d1, [x3] /* D2 */ - ret - str d0, [x3] /* D1 */ - ret - str q3, [x3, #48] /* Q4 */ - nop - str q2, [x3, #32] /* Q3 */ - nop - stp q0, q1, [x3] /* Q2 */ - ret - str q0, [x3] /* Q1 */ - ret - uxtb w0, w0 /* UINT8 */ - str x0, [x3] - ret /* reserved */ - nop - uxth w0, w0 /* UINT16 */ - str x0, [x3] - ret /* reserved */ - nop - mov w0, w0 /* UINT32 */ - str x0, [x3] - ret /* reserved */ - nop - sxtb x0, w0 /* SINT8 */ - str x0, [x3] - ret /* reserved */ - nop - sxth x0, w0 /* SINT16 */ - str x0, [x3] - ret /* reserved */ - nop - sxtw x0, w0 /* SINT32 */ - str x0, [x3] - ret /* reserved */ - nop - - - NESTED_END ffi_call_SYSV_fake - - -/* ffi_closure_SYSV - Closure invocation glue. This is the low level code invoked directly by - the closure trampoline to setup and call a closure. - On entry x17 points to a struct ffi_closure, x16 has been clobbered - all other registers are preserved. - We allocate a call context and save the argument passing registers, - then invoked the generic C ffi_closure_SYSV_inner() function to do all - the real work, on return we load the result passing registers back from - the call context. -*/ - -#define ffi_closure_SYSV_FS (8*2 + CALL_CONTEXT_SIZE + 64) - - NESTED_ENTRY ffi_closure_SYSV_V - PROLOG_SAVE_REG_PAIR x29, x30, #-ffi_closure_SYSV_FS! - - /* Save the argument passing vector registers. */ - stp q0, q1, [sp, #16 + 0] - stp q2, q3, [sp, #16 + 32] - stp q4, q5, [sp, #16 + 64] - stp q6, q7, [sp, #16 + 96] - - b ffi_closure_SYSV_save_argument - NESTED_END ffi_closure_SYSV_V - - NESTED_ENTRY ffi_closure_SYSV - PROLOG_SAVE_REG_PAIR x29, x30, #-ffi_closure_SYSV_FS! - -ffi_closure_SYSV_save_argument - /* Save the argument passing core registers. */ - stp x0, x1, [sp, #16 + 16*N_V_ARG_REG + 0] - stp x2, x3, [sp, #16 + 16*N_V_ARG_REG + 16] - stp x4, x5, [sp, #16 + 16*N_V_ARG_REG + 32] - stp x6, x7, [sp, #16 + 16*N_V_ARG_REG + 48] - - /* Load ffi_closure_inner arguments. */ - ldp PTR_REG(0), PTR_REG(1), [x17, #FFI_TRAMPOLINE_CLOSURE_OFFSET] /* load cif, fn */ - ldr PTR_REG(2), [x17, #FFI_TRAMPOLINE_CLOSURE_OFFSET+PTR_SIZE*2] /* load user_data */ - -do_closure - add x3, sp, #16 /* load context */ - add x4, sp, #ffi_closure_SYSV_FS /* load stack */ - add x5, sp, #16+CALL_CONTEXT_SIZE /* load rvalue */ - mov x6, x8 /* load struct_rval */ - - bl ffi_closure_SYSV_inner - - /* Load the return value as directed. */ - adr x1, ffi_closure_SYSV_return_base - and w0, w0, #AARCH64_RET_MASK - add x1, x1, x0, lsl #3 - add x3, sp, #16+CALL_CONTEXT_SIZE - br x1 - - /* Note that each table entry is 2 insns, and thus 8 bytes. */ - ALIGN 8 -ffi_closure_SYSV_return_base - b ffi_closure_SYSV_epilog /* VOID */ - nop - ldr x0, [x3] /* INT64 */ - b ffi_closure_SYSV_epilog - ldp x0, x1, [x3] /* INT128 */ - b ffi_closure_SYSV_epilog - brk #1000 /* UNUSED */ - nop - brk #1000 /* UNUSED */ - nop - brk #1000 /* UNUSED */ - nop - brk #1000 /* UNUSED */ - nop - brk #1000 /* UNUSED */ - nop - ldr s3, [x3, #12] /* S4 */ - nop - ldr s2, [x3, #8] /* S3 */ - nop - ldp s0, s1, [x3] /* S2 */ - b ffi_closure_SYSV_epilog - ldr s0, [x3] /* S1 */ - b ffi_closure_SYSV_epilog - ldr d3, [x3, #24] /* D4 */ - nop - ldr d2, [x3, #16] /* D3 */ - nop - ldp d0, d1, [x3] /* D2 */ - b ffi_closure_SYSV_epilog - ldr d0, [x3] /* D1 */ - b ffi_closure_SYSV_epilog - ldr q3, [x3, #48] /* Q4 */ - nop - ldr q2, [x3, #32] /* Q3 */ - nop - ldp q0, q1, [x3] /* Q2 */ - b ffi_closure_SYSV_epilog - ldr q0, [x3] /* Q1 */ - b ffi_closure_SYSV_epilog - ldrb w0, [x3, #BE(7)] /* UINT8 */ - b ffi_closure_SYSV_epilog - brk #1000 /* reserved */ - nop - ldrh w0, [x3, #BE(6)] /* UINT16 */ - b ffi_closure_SYSV_epilog - brk #1000 /* reserved */ - nop - ldr w0, [x3, #BE(4)] /* UINT32 */ - b ffi_closure_SYSV_epilog - brk #1000 /* reserved */ - nop - ldrsb x0, [x3, #BE(7)] /* SINT8 */ - b ffi_closure_SYSV_epilog - brk #1000 /* reserved */ - nop - ldrsh x0, [x3, #BE(6)] /* SINT16 */ - b ffi_closure_SYSV_epilog - brk #1000 /* reserved */ - nop - ldrsw x0, [x3, #BE(4)] /* SINT32 */ - nop - /* reserved */ - -ffi_closure_SYSV_epilog - EPILOG_RESTORE_REG_PAIR x29, x30, #ffi_closure_SYSV_FS! - EPILOG_RETURN - NESTED_END ffi_closure_SYSV - - -#ifdef FFI_GO_CLOSURES - NESTED_ENTRY ffi_go_closure_SYSV_V - PROLOG_SAVE_REG_PAIR x29, x30, #-ffi_closure_SYSV_FS! - - /* Save the argument passing vector registers. */ - stp q0, q1, [sp, #16 + 0] - stp q2, q3, [sp, #16 + 32] - stp q4, q5, [sp, #16 + 64] - stp q6, q7, [sp, #16 + 96] - b ffi_go_closure_SYSV_save_argument - NESTED_END ffi_go_closure_SYSV_V - - NESTED_ENTRY ffi_go_closure_SYSV - PROLOG_SAVE_REG_PAIR x29, x30, #-ffi_closure_SYSV_FS! - -ffi_go_closure_SYSV_save_argument - /* Save the argument passing core registers. */ - stp x0, x1, [sp, #16 + 16*N_V_ARG_REG + 0] - stp x2, x3, [sp, #16 + 16*N_V_ARG_REG + 16] - stp x4, x5, [sp, #16 + 16*N_V_ARG_REG + 32] - stp x6, x7, [sp, #16 + 16*N_V_ARG_REG + 48] - - /* Load ffi_closure_inner arguments. */ - ldp PTR_REG(0), PTR_REG(1), [x18, #PTR_SIZE]/* load cif, fn */ - mov x2, x18 /* load user_data */ - b do_closure - NESTED_END ffi_go_closure_SYSV - -#endif /* FFI_GO_CLOSURES */ - - -/* void extend_hfa_type (void *dest, void *src, int h) */ - - LEAF_ENTRY extend_hfa_type - - adr x3, extend_hfa_type_jump_base - and w2, w2, #AARCH64_RET_MASK - sub x2, x2, #AARCH64_RET_S4 - add x3, x3, x2, lsl #4 - br x3 - - ALIGN 4 -extend_hfa_type_jump_base - ldp s16, s17, [x1] /* S4 */ - ldp s18, s19, [x1, #8] - b extend_hfa_type_store_4 - nop - - ldp s16, s17, [x1] /* S3 */ - ldr s18, [x1, #8] - b extend_hfa_type_store_3 - nop - - ldp s16, s17, [x1] /* S2 */ - b extend_hfa_type_store_2 - nop - nop - - ldr s16, [x1] /* S1 */ - b extend_hfa_type_store_1 - nop - nop - - ldp d16, d17, [x1] /* D4 */ - ldp d18, d19, [x1, #16] - b extend_hfa_type_store_4 - nop - - ldp d16, d17, [x1] /* D3 */ - ldr d18, [x1, #16] - b extend_hfa_type_store_3 - nop - - ldp d16, d17, [x1] /* D2 */ - b extend_hfa_type_store_2 - nop - nop - - ldr d16, [x1] /* D1 */ - b extend_hfa_type_store_1 - nop - nop - - ldp q16, q17, [x1] /* Q4 */ - ldp q18, q19, [x1, #16] - b extend_hfa_type_store_4 - nop - - ldp q16, q17, [x1] /* Q3 */ - ldr q18, [x1, #16] - b extend_hfa_type_store_3 - nop - - ldp q16, q17, [x1] /* Q2 */ - b extend_hfa_type_store_2 - nop - nop - - ldr q16, [x1] /* Q1 */ - b extend_hfa_type_store_1 - -extend_hfa_type_store_4 - str q19, [x0, #48] -extend_hfa_type_store_3 - str q18, [x0, #32] -extend_hfa_type_store_2 - str q17, [x0, #16] -extend_hfa_type_store_1 - str q16, [x0] - ret - - LEAF_END extend_hfa_type - - -/* void compress_hfa_type (void *dest, void *reg, int h) */ - - LEAF_ENTRY compress_hfa_type - - adr x3, compress_hfa_type_jump_base - and w2, w2, #AARCH64_RET_MASK - sub x2, x2, #AARCH64_RET_S4 - add x3, x3, x2, lsl #4 - br x3 - - ALIGN 4 -compress_hfa_type_jump_base - ldp q16, q17, [x1] /* S4 */ - ldp q18, q19, [x1, #32] - st4 { v16.s, v17.s, v18.s, v19.s }[0], [x0] - ret - - ldp q16, q17, [x1] /* S3 */ - ldr q18, [x1, #32] - st3 { v16.s, v17.s, v18.s }[0], [x0] - ret - - ldp q16, q17, [x1] /* S2 */ - st2 { v16.s, v17.s }[0], [x0] - ret - nop - - ldr q16, [x1] /* S1 */ - st1 { v16.s }[0], [x0] - ret - nop - - ldp q16, q17, [x1] /* D4 */ - ldp q18, q19, [x1, #32] - st4 { v16.d, v17.d, v18.d, v19.d }[0], [x0] - ret - - ldp q16, q17, [x1] /* D3 */ - ldr q18, [x1, #32] - st3 { v16.d, v17.d, v18.d }[0], [x0] - ret - - ldp q16, q17, [x1] /* D2 */ - st2 { v16.d, v17.d }[0], [x0] - ret - nop - - ldr q16, [x1] /* D1 */ - st1 { v16.d }[0], [x0] - ret - nop - - ldp q16, q17, [x1] /* Q4 */ - ldp q18, q19, [x1, #32] - b compress_hfa_type_store_q4 - nop - - ldp q16, q17, [x1] /* Q3 */ - ldr q18, [x1, #32] - b compress_hfa_type_store_q3 - nop - - ldp q16, q17, [x1] /* Q2 */ - stp q16, q17, [x0] - ret - nop - - ldr q16, [x1] /* Q1 */ - str q16, [x0] - ret - -compress_hfa_type_store_q4 - str q19, [x0, #48] -compress_hfa_type_store_q3 - str q18, [x0, #32] - stp q16, q17, [x0] - ret - - LEAF_END compress_hfa_type - - END \ No newline at end of file diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/alpha/ffi.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/alpha/ffi.c deleted file mode 100644 index 7a95e97..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/alpha/ffi.c +++ /dev/null @@ -1,521 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2012 Anthony Green - Copyright (c) 1998, 2001, 2007, 2008 Red Hat, Inc. - - Alpha Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#include -#include -#include -#include "internal.h" - -/* Force FFI_TYPE_LONGDOUBLE to be different than FFI_TYPE_DOUBLE; - all further uses in this file will refer to the 128-bit type. */ -#if defined(__LONG_DOUBLE_128__) -# if FFI_TYPE_LONGDOUBLE != 4 -# error FFI_TYPE_LONGDOUBLE out of date -# endif -#else -# undef FFI_TYPE_LONGDOUBLE -# define FFI_TYPE_LONGDOUBLE 4 -#endif - -extern void ffi_call_osf(void *stack, void *frame, unsigned flags, - void *raddr, void (*fn)(void), void *closure) - FFI_HIDDEN; -extern void ffi_closure_osf(void) FFI_HIDDEN; -extern void ffi_go_closure_osf(void) FFI_HIDDEN; - -/* Promote a float value to its in-register double representation. - Unlike actually casting to double, this does not trap on NaN. */ -static inline UINT64 lds(void *ptr) -{ - UINT64 ret; - asm("lds %0,%1" : "=f"(ret) : "m"(*(UINT32 *)ptr)); - return ret; -} - -/* And the reverse. */ -static inline void sts(void *ptr, UINT64 val) -{ - asm("sts %1,%0" : "=m"(*(UINT32 *)ptr) : "f"(val)); -} - -ffi_status FFI_HIDDEN -ffi_prep_cif_machdep(ffi_cif *cif) -{ - size_t bytes = 0; - int flags, i, avn; - ffi_type *rtype, *itype; - - if (cif->abi != FFI_OSF) - return FFI_BAD_ABI; - - /* Compute the size of the argument area. */ - for (i = 0, avn = cif->nargs; i < avn; i++) - { - itype = cif->arg_types[i]; - switch (itype->type) - { - case FFI_TYPE_INT: - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - case FFI_TYPE_POINTER: - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - case FFI_TYPE_LONGDOUBLE: - /* All take one 8 byte slot. */ - bytes += 8; - break; - - case FFI_TYPE_VOID: - case FFI_TYPE_STRUCT: - /* Passed by value in N slots. */ - bytes += FFI_ALIGN(itype->size, FFI_SIZEOF_ARG); - break; - - case FFI_TYPE_COMPLEX: - /* _Complex long double passed by reference; others in 2 slots. */ - if (itype->elements[0]->type == FFI_TYPE_LONGDOUBLE) - bytes += 8; - else - bytes += 16; - break; - - default: - abort(); - } - } - - /* Set the return type flag */ - rtype = cif->rtype; - switch (rtype->type) - { - case FFI_TYPE_VOID: - flags = ALPHA_FLAGS(ALPHA_ST_VOID, ALPHA_LD_VOID); - break; - case FFI_TYPE_INT: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - flags = ALPHA_FLAGS(ALPHA_ST_INT, ALPHA_LD_INT32); - break; - case FFI_TYPE_FLOAT: - flags = ALPHA_FLAGS(ALPHA_ST_FLOAT, ALPHA_LD_FLOAT); - break; - case FFI_TYPE_DOUBLE: - flags = ALPHA_FLAGS(ALPHA_ST_DOUBLE, ALPHA_LD_DOUBLE); - break; - case FFI_TYPE_UINT8: - flags = ALPHA_FLAGS(ALPHA_ST_INT, ALPHA_LD_UINT8); - break; - case FFI_TYPE_SINT8: - flags = ALPHA_FLAGS(ALPHA_ST_INT, ALPHA_LD_SINT8); - break; - case FFI_TYPE_UINT16: - flags = ALPHA_FLAGS(ALPHA_ST_INT, ALPHA_LD_UINT16); - break; - case FFI_TYPE_SINT16: - flags = ALPHA_FLAGS(ALPHA_ST_INT, ALPHA_LD_SINT16); - break; - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - case FFI_TYPE_POINTER: - flags = ALPHA_FLAGS(ALPHA_ST_INT, ALPHA_LD_INT64); - break; - case FFI_TYPE_LONGDOUBLE: - case FFI_TYPE_STRUCT: - /* Passed in memory, with a hidden pointer. */ - flags = ALPHA_RET_IN_MEM; - break; - case FFI_TYPE_COMPLEX: - itype = rtype->elements[0]; - switch (itype->type) - { - case FFI_TYPE_FLOAT: - flags = ALPHA_FLAGS(ALPHA_ST_CPLXF, ALPHA_LD_CPLXF); - break; - case FFI_TYPE_DOUBLE: - flags = ALPHA_FLAGS(ALPHA_ST_CPLXD, ALPHA_LD_CPLXD); - break; - default: - if (rtype->size <= 8) - flags = ALPHA_FLAGS(ALPHA_ST_INT, ALPHA_LD_INT64); - else - flags = ALPHA_RET_IN_MEM; - break; - } - break; - default: - abort(); - } - cif->flags = flags; - - /* Include the hidden structure pointer in args requirement. */ - if (flags == ALPHA_RET_IN_MEM) - bytes += 8; - /* Minimum size is 6 slots, so that ffi_call_osf can pop them. */ - if (bytes < 6*8) - bytes = 6*8; - cif->bytes = bytes; - - return FFI_OK; -} - -static unsigned long -extend_basic_type(void *valp, int type, int argn) -{ - switch (type) - { - case FFI_TYPE_SINT8: - return *(SINT8 *)valp; - case FFI_TYPE_UINT8: - return *(UINT8 *)valp; - case FFI_TYPE_SINT16: - return *(SINT16 *)valp; - case FFI_TYPE_UINT16: - return *(UINT16 *)valp; - - case FFI_TYPE_FLOAT: - if (argn < 6) - return lds(valp); - /* FALLTHRU */ - - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - /* Note that unsigned 32-bit quantities are sign extended. */ - return *(SINT32 *)valp; - - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - case FFI_TYPE_POINTER: - case FFI_TYPE_DOUBLE: - return *(UINT64 *)valp; - - default: - abort(); - } -} - -static void -ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue, - void **avalue, void *closure) -{ - unsigned long *argp; - long i, avn, argn, flags = cif->flags; - ffi_type **arg_types; - void *frame; - - /* If the return value is a struct and we don't have a return - value address then we need to make one. */ - if (rvalue == NULL && flags == ALPHA_RET_IN_MEM) - rvalue = alloca(cif->rtype->size); - - /* Allocate the space for the arguments, plus 4 words of temp - space for ffi_call_osf. */ - argp = frame = alloca(cif->bytes + 4*FFI_SIZEOF_ARG); - frame += cif->bytes; - - argn = 0; - if (flags == ALPHA_RET_IN_MEM) - argp[argn++] = (unsigned long)rvalue; - - avn = cif->nargs; - arg_types = cif->arg_types; - - for (i = 0, avn = cif->nargs; i < avn; i++) - { - ffi_type *ty = arg_types[i]; - void *valp = avalue[i]; - int type = ty->type; - size_t size; - - switch (type) - { - case FFI_TYPE_INT: - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - case FFI_TYPE_POINTER: - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - argp[argn] = extend_basic_type(valp, type, argn); - argn++; - break; - - case FFI_TYPE_LONGDOUBLE: - by_reference: - /* Note that 128-bit long double is passed by reference. */ - argp[argn++] = (unsigned long)valp; - break; - - case FFI_TYPE_VOID: - case FFI_TYPE_STRUCT: - size = ty->size; - memcpy(argp + argn, valp, size); - argn += FFI_ALIGN(size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; - break; - - case FFI_TYPE_COMPLEX: - type = ty->elements[0]->type; - if (type == FFI_TYPE_LONGDOUBLE) - goto by_reference; - - /* Most complex types passed as two separate arguments. */ - size = ty->elements[0]->size; - argp[argn] = extend_basic_type(valp, type, argn); - argp[argn + 1] = extend_basic_type(valp + size, type, argn + 1); - argn += 2; - break; - - default: - abort(); - } - } - - flags = (flags >> ALPHA_ST_SHIFT) & 0xff; - ffi_call_osf(argp, frame, flags, rvalue, fn, closure); -} - -void -ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - ffi_call_int(cif, fn, rvalue, avalue, NULL); -} - -void -ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue, - void **avalue, void *closure) -{ - ffi_call_int(cif, fn, rvalue, avalue, closure); -} - -ffi_status -ffi_prep_closure_loc (ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, - void *codeloc) -{ - unsigned int *tramp; - - if (cif->abi != FFI_OSF) - return FFI_BAD_ABI; - - tramp = (unsigned int *) &closure->tramp[0]; - tramp[0] = 0x47fb0401; /* mov $27,$1 */ - tramp[1] = 0xa77b0010; /* ldq $27,16($27) */ - tramp[2] = 0x6bfb0000; /* jmp $31,($27),0 */ - tramp[3] = 0x47ff041f; /* nop */ - *(void **) &tramp[4] = ffi_closure_osf; - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - /* Flush the Icache. - - Tru64 UNIX as doesn't understand the imb mnemonic, so use call_pal - instead, since both Compaq as and gas can handle it. - - 0x86 is PAL_imb in Tru64 UNIX . */ - asm volatile ("call_pal 0x86" : : : "memory"); - - return FFI_OK; -} - -ffi_status -ffi_prep_go_closure (ffi_go_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*)) -{ - if (cif->abi != FFI_OSF) - return FFI_BAD_ABI; - - closure->tramp = (void *)ffi_go_closure_osf; - closure->cif = cif; - closure->fun = fun; - - return FFI_OK; -} - -long FFI_HIDDEN -ffi_closure_osf_inner (ffi_cif *cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, - void *rvalue, unsigned long *argp) -{ - void **avalue; - ffi_type **arg_types; - long i, avn, argn, flags; - - avalue = alloca(cif->nargs * sizeof(void *)); - flags = cif->flags; - argn = 0; - - /* Copy the caller's structure return address to that the closure - returns the data directly to the caller. */ - if (flags == ALPHA_RET_IN_MEM) - { - rvalue = (void *) argp[0]; - argn = 1; - } - - arg_types = cif->arg_types; - - /* Grab the addresses of the arguments from the stack frame. */ - for (i = 0, avn = cif->nargs; i < avn; i++) - { - ffi_type *ty = arg_types[i]; - int type = ty->type; - void *valp = &argp[argn]; - size_t size; - - switch (type) - { - case FFI_TYPE_INT: - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - case FFI_TYPE_POINTER: - argn += 1; - break; - - case FFI_TYPE_VOID: - case FFI_TYPE_STRUCT: - size = ty->size; - argn += FFI_ALIGN(size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; - break; - - case FFI_TYPE_FLOAT: - /* Floats coming from registers need conversion from double - back to float format. */ - if (argn < 6) - { - valp = &argp[argn - 6]; - sts(valp, argp[argn - 6]); - } - argn += 1; - break; - - case FFI_TYPE_DOUBLE: - if (argn < 6) - valp = &argp[argn - 6]; - argn += 1; - break; - - case FFI_TYPE_LONGDOUBLE: - by_reference: - /* 128-bit long double is passed by reference. */ - valp = (void *)argp[argn]; - argn += 1; - break; - - case FFI_TYPE_COMPLEX: - type = ty->elements[0]->type; - switch (type) - { - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - /* Passed as separate arguments, but they wind up sequential. */ - break; - - case FFI_TYPE_INT: - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - /* Passed as separate arguments. Disjoint, but there's room - enough in one slot to hold the pair. */ - size = ty->elements[0]->size; - memcpy(valp + size, valp + 8, size); - break; - - case FFI_TYPE_FLOAT: - /* Passed as separate arguments. Disjoint, and each piece - may need conversion back to float. */ - if (argn < 6) - { - valp = &argp[argn - 6]; - sts(valp, argp[argn - 6]); - } - if (argn + 1 < 6) - sts(valp + 4, argp[argn + 1 - 6]); - else - *(UINT32 *)(valp + 4) = argp[argn + 1]; - break; - - case FFI_TYPE_DOUBLE: - /* Passed as separate arguments. Only disjoint if one part - is in fp regs and the other is on the stack. */ - if (argn < 5) - valp = &argp[argn - 6]; - else if (argn == 5) - { - valp = alloca(16); - ((UINT64 *)valp)[0] = argp[5 - 6]; - ((UINT64 *)valp)[1] = argp[6]; - } - break; - - case FFI_TYPE_LONGDOUBLE: - goto by_reference; - - default: - abort(); - } - argn += 2; - break; - - default: - abort (); - } - - avalue[i] = valp; - } - - /* Invoke the closure. */ - fun (cif, rvalue, avalue, user_data); - - /* Tell ffi_closure_osf how to perform return type promotions. */ - return (flags >> ALPHA_LD_SHIFT) & 0xff; -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/alpha/ffitarget.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/alpha/ffitarget.h deleted file mode 100644 index a02dbd0..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/alpha/ffitarget.h +++ /dev/null @@ -1,57 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - Copyright (c) 1996-2003 Red Hat, Inc. - Target configuration macros for Alpha. - - 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. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_OSF, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_OSF -} ffi_abi; -#endif - -#define FFI_TARGET_SPECIFIC_STACK_SPACE_ALLOCATION -#define FFI_TARGET_HAS_COMPLEX_TYPE - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_GO_CLOSURES 1 -#define FFI_TRAMPOLINE_SIZE 24 -#define FFI_NATIVE_RAW_API 0 - -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/alpha/internal.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/alpha/internal.h deleted file mode 100644 index 44da192..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/alpha/internal.h +++ /dev/null @@ -1,23 +0,0 @@ -#define ALPHA_ST_VOID 0 -#define ALPHA_ST_INT 1 -#define ALPHA_ST_FLOAT 2 -#define ALPHA_ST_DOUBLE 3 -#define ALPHA_ST_CPLXF 4 -#define ALPHA_ST_CPLXD 5 - -#define ALPHA_LD_VOID 0 -#define ALPHA_LD_INT64 1 -#define ALPHA_LD_INT32 2 -#define ALPHA_LD_UINT16 3 -#define ALPHA_LD_SINT16 4 -#define ALPHA_LD_UINT8 5 -#define ALPHA_LD_SINT8 6 -#define ALPHA_LD_FLOAT 7 -#define ALPHA_LD_DOUBLE 8 -#define ALPHA_LD_CPLXF 9 -#define ALPHA_LD_CPLXD 10 - -#define ALPHA_ST_SHIFT 0 -#define ALPHA_LD_SHIFT 8 -#define ALPHA_RET_IN_MEM 0x10000 -#define ALPHA_FLAGS(S, L) (((L) << ALPHA_LD_SHIFT) | (S)) diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/alpha/osf.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/alpha/osf.S deleted file mode 100644 index b031828..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/alpha/osf.S +++ /dev/null @@ -1,282 +0,0 @@ -/* ----------------------------------------------------------------------- - osf.S - Copyright (c) 1998, 2001, 2007, 2008, 2011, 2014 Red Hat - - Alpha/OSF Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include -#include -#include "internal.h" - - .arch ev6 - .text - -/* Aid in building a direct addressed jump table, 4 insns per entry. */ -.macro E index - .align 4 - .org 99b + \index * 16 -.endm - -/* ffi_call_osf (void *stack, void *frame, unsigned flags, - void *raddr, void (*fnaddr)(void), void *closure) - - Bit o trickiness here -- FRAME is the base of the stack frame - for this function. This has been allocated by ffi_call. We also - deallocate some of the stack that has been alloca'd. */ - - .align 4 - .globl ffi_call_osf - .ent ffi_call_osf - FFI_HIDDEN(ffi_call_osf) - -ffi_call_osf: - cfi_startproc - cfi_def_cfa($17, 32) - mov $16, $30 - stq $26, 0($17) - stq $15, 8($17) - mov $17, $15 - .prologue 0 - cfi_def_cfa_register($15) - cfi_rel_offset($26, 0) - cfi_rel_offset($15, 8) - - stq $18, 16($17) # save flags into frame - stq $19, 24($17) # save rvalue into frame - mov $20, $27 # fn into place for call - mov $21, $1 # closure into static chain - - # Load up all of the (potential) argument registers. - ldq $16, 0($30) - ldt $f16, 0($30) - ldt $f17, 8($30) - ldq $17, 8($30) - ldt $f18, 16($30) - ldq $18, 16($30) - ldt $f19, 24($30) - ldq $19, 24($30) - ldt $f20, 32($30) - ldq $20, 32($30) - ldt $f21, 40($30) - ldq $21, 40($30) - - # Deallocate the register argument area. - lda $30, 48($30) - - jsr $26, ($27), 0 -0: - ldah $29, 0($26) !gpdisp!1 - ldq $2, 24($15) # reload rvalue - lda $29, 0($29) !gpdisp!1 - ldq $3, 16($15) # reload flags - lda $1, 99f-0b($26) - ldq $26, 0($15) - ldq $15, 8($15) - cfi_restore($26) - cfi_restore($15) - cfi_def_cfa($sp, 0) - cmoveq $2, ALPHA_ST_VOID, $3 # mash null rvalue to void - addq $3, $3, $3 - s8addq $3, $1, $1 # 99f + stcode * 16 - jmp $31, ($1), $st_int - - .align 4 -99: -E ALPHA_ST_VOID - ret -E ALPHA_ST_INT -$st_int: - stq $0, 0($2) - ret -E ALPHA_ST_FLOAT - sts $f0, 0($2) - ret -E ALPHA_ST_DOUBLE - stt $f0, 0($2) - ret -E ALPHA_ST_CPLXF - sts $f0, 0($2) - sts $f1, 4($2) - ret -E ALPHA_ST_CPLXD - stt $f0, 0($2) - stt $f1, 8($2) - ret - - cfi_endproc - .end ffi_call_osf - -/* ffi_closure_osf(...) - - Receives the closure argument in $1. */ - -#define CLOSURE_FS (16*8) - - .align 4 - .globl ffi_go_closure_osf - .ent ffi_go_closure_osf - FFI_HIDDEN(ffi_go_closure_osf) - -ffi_go_closure_osf: - cfi_startproc - ldgp $29, 0($27) - subq $30, CLOSURE_FS, $30 - cfi_adjust_cfa_offset(CLOSURE_FS) - stq $26, 0($30) - .prologue 1 - cfi_rel_offset($26, 0) - - stq $16, 10*8($30) - stq $17, 11*8($30) - stq $18, 12*8($30) - - ldq $16, 8($1) # load cif - ldq $17, 16($1) # load fun - mov $1, $18 # closure is user_data - br $do_closure - - cfi_endproc - .end ffi_go_closure_osf - - .align 4 - .globl ffi_closure_osf - .ent ffi_closure_osf - FFI_HIDDEN(ffi_closure_osf) - -ffi_closure_osf: - cfi_startproc - ldgp $29, 0($27) - subq $30, CLOSURE_FS, $30 - cfi_adjust_cfa_offset(CLOSURE_FS) - stq $26, 0($30) - .prologue 1 - cfi_rel_offset($26, 0) - - # Store all of the potential argument registers in va_list format. - stq $16, 10*8($30) - stq $17, 11*8($30) - stq $18, 12*8($30) - - ldq $16, 24($1) # load cif - ldq $17, 32($1) # load fun - ldq $18, 40($1) # load user_data - -$do_closure: - stq $19, 13*8($30) - stq $20, 14*8($30) - stq $21, 15*8($30) - stt $f16, 4*8($30) - stt $f17, 5*8($30) - stt $f18, 6*8($30) - stt $f19, 7*8($30) - stt $f20, 8*8($30) - stt $f21, 9*8($30) - - # Call ffi_closure_osf_inner to do the bulk of the work. - lda $19, 2*8($30) - lda $20, 10*8($30) - jsr $26, ffi_closure_osf_inner -0: - ldah $29, 0($26) !gpdisp!2 - lda $2, 99f-0b($26) - s4addq $0, 0, $1 # ldcode * 4 - ldq $0, 16($30) # preload return value - s4addq $1, $2, $1 # 99f + ldcode * 16 - lda $29, 0($29) !gpdisp!2 - ldq $26, 0($30) - cfi_restore($26) - jmp $31, ($1), $load_32 - -.macro epilogue - addq $30, CLOSURE_FS, $30 - cfi_adjust_cfa_offset(-CLOSURE_FS) - ret - .align 4 - cfi_adjust_cfa_offset(CLOSURE_FS) -.endm - - .align 4 -99: -E ALPHA_LD_VOID - epilogue - -E ALPHA_LD_INT64 - epilogue - -E ALPHA_LD_INT32 -$load_32: - sextl $0, $0 - epilogue - -E ALPHA_LD_UINT16 - zapnot $0, 3, $0 - epilogue - -E ALPHA_LD_SINT16 -#ifdef __alpha_bwx__ - sextw $0, $0 -#else - sll $0, 48, $0 - sra $0, 48, $0 -#endif - epilogue - -E ALPHA_LD_UINT8 - and $0, 0xff, $0 - epilogue - -E ALPHA_LD_SINT8 -#ifdef __alpha_bwx__ - sextb $0, $0 -#else - sll $0, 56, $0 - sra $0, 56, $0 -#endif - epilogue - -E ALPHA_LD_FLOAT - lds $f0, 16($sp) - epilogue - -E ALPHA_LD_DOUBLE - ldt $f0, 16($sp) - epilogue - -E ALPHA_LD_CPLXF - lds $f0, 16($sp) - lds $f1, 20($sp) - epilogue - -E ALPHA_LD_CPLXD - ldt $f0, 16($sp) - ldt $f1, 24($sp) - epilogue - - cfi_endproc - .end ffi_closure_osf - -#if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",@progbits -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/arc/arcompact.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/arc/arcompact.S deleted file mode 100644 index 03715fd..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/arc/arcompact.S +++ /dev/null @@ -1,135 +0,0 @@ -/* ----------------------------------------------------------------------- - arcompact.S - Copyright (c) 2013 Synposys, Inc. (www.synopsys.com) - - ARCompact Foreign Function Interface - - 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 RENESAS TECHNOLOGY 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. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include -#ifdef HAVE_MACHINE_ASM_H -#include -#else -#define CNAME(x) x -#define ENTRY(x) .globl CNAME(x)` .type CNAME(x),%function` CNAME(x): -#endif - -.text - - /* R0: ffi_prep_args */ - /* R1: &ecif */ - /* R2: cif->bytes */ - /* R3: fig->flags */ - /* R4: ecif.rvalue */ - /* R5: fn */ -ENTRY(ffi_call_ARCompact) - /* Save registers. */ - st.a fp, [sp, -4] /* fp + 20, fp */ - push_s blink /* fp + 16, blink */ - st.a r4, [sp, -4] /* fp + 12, ecif.rvalue */ - push_s r3 /* fp + 8, fig->flags */ - st.a r5, [sp, -4] /* fp + 4, fn */ - push_s r2 /* fp + 0, cif->bytes */ - mov fp, sp - - /* Make room for all of the new args. */ - sub sp, sp, r2 - - /* Place all of the ffi_prep_args in position. */ - /* ffi_prep_args(char *stack, extended_cif *ecif) */ - /* R1 already set. */ - - /* And call. */ - jl_s.d [r0] - mov_s r0, sp - - ld.ab r12, [fp, 4] /* cif->bytes */ - ld.ab r11, [fp, 4] /* fn */ - - /* Move first 8 parameters in registers... */ - ld_s r0, [sp] - ld_s r1, [sp, 4] - ld_s r2, [sp, 8] - ld_s r3, [sp, 12] - ld r4, [sp, 16] - ld r5, [sp, 20] - ld r6, [sp, 24] - ld r7, [sp, 28] - - /* ...and adjust the stack. */ - min r12, r12, 32 - - /* Call the function. */ - jl.d [r11] - add sp, sp, r12 - - mov sp, fp - pop_s r3 /* fig->flags, return type */ - pop_s r2 /* ecif.rvalue, pointer for return value */ - - /* If the return value pointer is NULL, assume no return value. */ - breq.d r2, 0, epilogue - pop_s blink - - /* Return INT. */ - brne r3, FFI_TYPE_INT, return_double - b.d epilogue - st_s r0, [r2] - -return_double: - brne r3, FFI_TYPE_DOUBLE, epilogue - st_s r0, [r2] - st_s r1, [r2,4] - -epilogue: - j_s.d [blink] - ld.ab fp, [sp, 4] - -ENTRY(ffi_closure_ARCompact) - st.a r0, [sp, -32] - st_s r1, [sp, 4] - st_s r2, [sp, 8] - st_s r3, [sp, 12] - st r4, [sp, 16] - st r5, [sp, 20] - st r6, [sp, 24] - st r7, [sp, 28] - - /* pointer to arguments */ - mov_s r2, sp - - /* return value goes here */ - sub sp, sp, 8 - mov_s r1, sp - - push_s blink - - bl.d ffi_closure_inner_ARCompact - mov_s r0, r8 /* codeloc, set by trampoline */ - - pop_s blink - - /* set return value to r1:r0 */ - pop_s r0 - pop_s r1 - j_s.d [blink] - add_s sp, sp, 32 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/arc/ffi.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/arc/ffi.c deleted file mode 100644 index 4d10b21..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/arc/ffi.c +++ /dev/null @@ -1,266 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2013 Synopsys, Inc. (www.synopsys.com) - - ARC Foreign Function Interface - - 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 RENESAS TECHNOLOGY 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. - ----------------------------------------------------------------------- */ - -#include -#include - -#include -#include - -#include - -/* for little endian ARC, the code is in fact stored as mixed endian for - performance reasons */ -#if __BIG_ENDIAN__ -#define CODE_ENDIAN(x) (x) -#else -#define CODE_ENDIAN(x) ( (((uint32_t) (x)) << 16) | (((uint32_t) (x)) >> 16)) -#endif - -/* ffi_prep_args is called by the assembly routine once stack - space has been allocated for the function's arguments. */ - -void -ffi_prep_args (char *stack, extended_cif * ecif) -{ - unsigned int i; - void **p_argv; - char *argp; - ffi_type **p_arg; - - argp = stack; - - if (ecif->cif->rtype->type == FFI_TYPE_STRUCT) - { - *(void **) argp = ecif->rvalue; - argp += 4; - } - - p_argv = ecif->avalue; - - for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; - (i != 0); i--, p_arg++) - { - size_t z; - int alignment; - - /* align alignment to 4 */ - alignment = (((*p_arg)->alignment - 1) | 3) + 1; - - /* Align if necessary. */ - if ((alignment - 1) & (unsigned) argp) - argp = (char *) FFI_ALIGN (argp, alignment); - - z = (*p_arg)->size; - if (z < sizeof (int)) - { - z = sizeof (int); - - switch ((*p_arg)->type) - { - case FFI_TYPE_SINT8: - *(signed int *) argp = (signed int) *(SINT8 *) (*p_argv); - break; - - case FFI_TYPE_UINT8: - *(unsigned int *) argp = (unsigned int) *(UINT8 *) (*p_argv); - break; - - case FFI_TYPE_SINT16: - *(signed int *) argp = (signed int) *(SINT16 *) (*p_argv); - break; - - case FFI_TYPE_UINT16: - *(unsigned int *) argp = (unsigned int) *(UINT16 *) (*p_argv); - break; - - case FFI_TYPE_STRUCT: - memcpy (argp, *p_argv, (*p_arg)->size); - break; - - default: - FFI_ASSERT (0); - } - } - else if (z == sizeof (int)) - { - *(unsigned int *) argp = (unsigned int) *(UINT32 *) (*p_argv); - } - else - { - if ((*p_arg)->type == FFI_TYPE_STRUCT) - { - memcpy (argp, *p_argv, z); - } - else - { - /* Double or long long 64bit. */ - memcpy (argp, *p_argv, z); - } - } - p_argv++; - argp += z; - } - - return; -} - -/* Perform machine dependent cif processing. */ -ffi_status -ffi_prep_cif_machdep (ffi_cif * cif) -{ - /* Set the return type flag. */ - switch (cif->rtype->type) - { - case FFI_TYPE_VOID: - cif->flags = (unsigned) cif->rtype->type; - break; - - case FFI_TYPE_STRUCT: - cif->flags = (unsigned) cif->rtype->type; - break; - - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - case FFI_TYPE_DOUBLE: - cif->flags = FFI_TYPE_DOUBLE; - break; - - case FFI_TYPE_FLOAT: - default: - cif->flags = FFI_TYPE_INT; - break; - } - - return FFI_OK; -} - -extern void ffi_call_ARCompact (void (*)(char *, extended_cif *), - extended_cif *, unsigned, unsigned, - unsigned *, void (*fn) (void)); - -void -ffi_call (ffi_cif * cif, void (*fn) (void), void *rvalue, void **avalue) -{ - extended_cif ecif; - - ecif.cif = cif; - ecif.avalue = avalue; - - /* If the return value is a struct and we don't have - a return value address then we need to make one. */ - if ((rvalue == NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) - { - ecif.rvalue = alloca (cif->rtype->size); - } - else - ecif.rvalue = rvalue; - - switch (cif->abi) - { - case FFI_ARCOMPACT: - ffi_call_ARCompact (ffi_prep_args, &ecif, cif->bytes, - cif->flags, ecif.rvalue, fn); - break; - - default: - FFI_ASSERT (0); - break; - } -} - -int -ffi_closure_inner_ARCompact (ffi_closure * closure, void *rvalue, - ffi_arg * args) -{ - void **arg_area, **p_argv; - ffi_cif *cif = closure->cif; - char *argp = (char *) args; - ffi_type **p_argt; - int i; - - arg_area = (void **) alloca (cif->nargs * sizeof (void *)); - - /* handle hidden argument */ - if (cif->flags == FFI_TYPE_STRUCT) - { - rvalue = *(void **) argp; - argp += 4; - } - - p_argv = arg_area; - - for (i = 0, p_argt = cif->arg_types; i < cif->nargs; - i++, p_argt++, p_argv++) - { - size_t z; - int alignment; - - /* align alignment to 4 */ - alignment = (((*p_argt)->alignment - 1) | 3) + 1; - - /* Align if necessary. */ - if ((alignment - 1) & (unsigned) argp) - argp = (char *) FFI_ALIGN (argp, alignment); - - z = (*p_argt)->size; - *p_argv = (void *) argp; - argp += z; - } - - (closure->fun) (cif, rvalue, arg_area, closure->user_data); - - return cif->flags; -} - -extern void ffi_closure_ARCompact (void); - -ffi_status -ffi_prep_closure_loc (ffi_closure * closure, ffi_cif * cif, - void (*fun) (ffi_cif *, void *, void **, void *), - void *user_data, void *codeloc) -{ - uint32_t *tramp = (uint32_t *) & (closure->tramp[0]); - - switch (cif->abi) - { - case FFI_ARCOMPACT: - FFI_ASSERT (tramp == codeloc); - tramp[0] = CODE_ENDIAN (0x200a1fc0); /* mov r8, pcl */ - tramp[1] = CODE_ENDIAN (0x20200f80); /* j [long imm] */ - tramp[2] = CODE_ENDIAN (ffi_closure_ARCompact); - break; - - default: - return FFI_BAD_ABI; - } - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - cacheflush (codeloc, FFI_TRAMPOLINE_SIZE, BCACHE); - - return FFI_OK; -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/arc/ffitarget.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/arc/ffitarget.h deleted file mode 100644 index bf8311b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/arc/ffitarget.h +++ /dev/null @@ -1,53 +0,0 @@ -/* ----------------------------------------------------------------------- - ffitarget.h - Copyright (c) 2012 Anthony Green - Copyright (c) 2013 Synopsys, Inc. (www.synopsys.com) - Target configuration macros for ARC. - - 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 RENESAS TECHNOLOGY 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. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -/* ---- Generic type definitions ----------------------------------------- */ - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi -{ - FFI_FIRST_ABI = 0, - FFI_ARCOMPACT, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_ARCOMPACT -} ffi_abi; -#endif - -#define FFI_CLOSURES 1 -#define FFI_TRAMPOLINE_SIZE 12 -#define FFI_NATIVE_RAW_API 0 - -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/arm/ffi.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/arm/ffi.c deleted file mode 100644 index 0058390..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/arm/ffi.c +++ /dev/null @@ -1,876 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2011 Timothy Wall - Copyright (c) 2011 Plausible Labs Cooperative, Inc. - Copyright (c) 2011 Anthony Green - Copyright (c) 2011 Free Software Foundation - Copyright (c) 1998, 2008, 2011 Red Hat, Inc. - - ARM Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#if defined(__arm__) || defined(_M_ARM) -#include -#include -#include -#include -#include -#include "internal.h" - -#if defined(_MSC_VER) && defined(_M_ARM) -#define WIN32_LEAN_AND_MEAN -#include -#endif - -#if FFI_EXEC_TRAMPOLINE_TABLE - -#ifdef __MACH__ -#include -#endif - -#else -#ifndef _M_ARM -extern unsigned int ffi_arm_trampoline[2] FFI_HIDDEN; -#else -extern unsigned int ffi_arm_trampoline[3] FFI_HIDDEN; -#endif -#endif - -#if defined(__FreeBSD__) && defined(__arm__) -#include -#include -#endif - -/* Forward declares. */ -static int vfp_type_p (const ffi_type *); -static void layout_vfp_args (ffi_cif *); - -static void * -ffi_align (ffi_type *ty, void *p) -{ - /* Align if necessary */ - size_t alignment; -#ifdef _WIN32_WCE - alignment = 4; -#else - alignment = ty->alignment; - if (alignment < 4) - alignment = 4; -#endif - return (void *) FFI_ALIGN (p, alignment); -} - -static size_t -ffi_put_arg (ffi_type *ty, void *src, void *dst) -{ - size_t z = ty->size; - - switch (ty->type) - { - case FFI_TYPE_SINT8: - *(UINT32 *)dst = *(SINT8 *)src; - break; - case FFI_TYPE_UINT8: - *(UINT32 *)dst = *(UINT8 *)src; - break; - case FFI_TYPE_SINT16: - *(UINT32 *)dst = *(SINT16 *)src; - break; - case FFI_TYPE_UINT16: - *(UINT32 *)dst = *(UINT16 *)src; - break; - - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - case FFI_TYPE_POINTER: -#ifndef _MSC_VER - case FFI_TYPE_FLOAT: -#endif - *(UINT32 *)dst = *(UINT32 *)src; - break; - -#ifdef _MSC_VER - // casting a float* to a UINT32* doesn't work on Windows - case FFI_TYPE_FLOAT: - *(uintptr_t *)dst = 0; - *(float *)dst = *(float *)src; - break; -#endif - - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - case FFI_TYPE_DOUBLE: - *(UINT64 *)dst = *(UINT64 *)src; - break; - - case FFI_TYPE_STRUCT: - case FFI_TYPE_COMPLEX: - memcpy (dst, src, z); - break; - - default: - abort(); - } - - return FFI_ALIGN (z, 4); -} - -/* ffi_prep_args is called once stack space has been allocated - for the function's arguments. - - The vfp_space parameter is the load area for VFP regs, the return - value is cif->vfp_used (word bitset of VFP regs used for passing - arguments). These are only used for the VFP hard-float ABI. -*/ -static void -ffi_prep_args_SYSV (ffi_cif *cif, int flags, void *rvalue, - void **avalue, char *argp) -{ - ffi_type **arg_types = cif->arg_types; - int i, n; - - if (flags == ARM_TYPE_STRUCT) - { - *(void **) argp = rvalue; - argp += 4; - } - - for (i = 0, n = cif->nargs; i < n; i++) - { - ffi_type *ty = arg_types[i]; - argp = ffi_align (ty, argp); - argp += ffi_put_arg (ty, avalue[i], argp); - } -} - -static void -ffi_prep_args_VFP (ffi_cif *cif, int flags, void *rvalue, - void **avalue, char *stack, char *vfp_space) -{ - ffi_type **arg_types = cif->arg_types; - int i, n, vi = 0; - char *argp, *regp, *eo_regp; - char stack_used = 0; - char done_with_regs = 0; - - /* The first 4 words on the stack are used for values - passed in core registers. */ - regp = stack; - eo_regp = argp = regp + 16; - - /* If the function returns an FFI_TYPE_STRUCT in memory, - that address is passed in r0 to the function. */ - if (flags == ARM_TYPE_STRUCT) - { - *(void **) regp = rvalue; - regp += 4; - } - - for (i = 0, n = cif->nargs; i < n; i++) - { - ffi_type *ty = arg_types[i]; - void *a = avalue[i]; - int is_vfp_type = vfp_type_p (ty); - - /* Allocated in VFP registers. */ - if (vi < cif->vfp_nargs && is_vfp_type) - { - char *vfp_slot = vfp_space + cif->vfp_args[vi++] * 4; - ffi_put_arg (ty, a, vfp_slot); - continue; - } - /* Try allocating in core registers. */ - else if (!done_with_regs && !is_vfp_type) - { - char *tregp = ffi_align (ty, regp); - size_t size = ty->size; - size = (size < 4) ? 4 : size; // pad - /* Check if there is space left in the aligned register - area to place the argument. */ - if (tregp + size <= eo_regp) - { - regp = tregp + ffi_put_arg (ty, a, tregp); - done_with_regs = (regp == argp); - // ensure we did not write into the stack area - FFI_ASSERT (regp <= argp); - continue; - } - /* In case there are no arguments in the stack area yet, - the argument is passed in the remaining core registers - and on the stack. */ - else if (!stack_used) - { - stack_used = 1; - done_with_regs = 1; - argp = tregp + ffi_put_arg (ty, a, tregp); - FFI_ASSERT (eo_regp < argp); - continue; - } - } - /* Base case, arguments are passed on the stack */ - stack_used = 1; - argp = ffi_align (ty, argp); - argp += ffi_put_arg (ty, a, argp); - } -} - -/* Perform machine dependent cif processing */ -ffi_status FFI_HIDDEN -ffi_prep_cif_machdep (ffi_cif *cif) -{ - int flags = 0, cabi = cif->abi; - size_t bytes = cif->bytes; - - /* Map out the register placements of VFP register args. The VFP - hard-float calling conventions are slightly more sophisticated - than the base calling conventions, so we do it here instead of - in ffi_prep_args(). */ - if (cabi == FFI_VFP) - layout_vfp_args (cif); - - /* Set the return type flag */ - switch (cif->rtype->type) - { - case FFI_TYPE_VOID: - flags = ARM_TYPE_VOID; - break; - - case FFI_TYPE_INT: - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - case FFI_TYPE_POINTER: - flags = ARM_TYPE_INT; - break; - - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - flags = ARM_TYPE_INT64; - break; - - case FFI_TYPE_FLOAT: - flags = (cabi == FFI_VFP ? ARM_TYPE_VFP_S : ARM_TYPE_INT); - break; - case FFI_TYPE_DOUBLE: - flags = (cabi == FFI_VFP ? ARM_TYPE_VFP_D : ARM_TYPE_INT64); - break; - - case FFI_TYPE_STRUCT: - case FFI_TYPE_COMPLEX: - if (cabi == FFI_VFP) - { - int h = vfp_type_p (cif->rtype); - - flags = ARM_TYPE_VFP_N; - if (h == 0x100 + FFI_TYPE_FLOAT) - flags = ARM_TYPE_VFP_S; - if (h == 0x100 + FFI_TYPE_DOUBLE) - flags = ARM_TYPE_VFP_D; - if (h != 0) - break; - } - - /* A Composite Type not larger than 4 bytes is returned in r0. - A Composite Type larger than 4 bytes, or whose size cannot - be determined statically ... is stored in memory at an - address passed [in r0]. */ - if (cif->rtype->size <= 4) - flags = ARM_TYPE_INT; - else - { - flags = ARM_TYPE_STRUCT; - bytes += 4; - } - break; - - default: - abort(); - } - - /* Round the stack up to a multiple of 8 bytes. This isn't needed - everywhere, but it is on some platforms, and it doesn't harm anything - when it isn't needed. */ - bytes = FFI_ALIGN (bytes, 8); - - /* Minimum stack space is the 4 register arguments that we pop. */ - if (bytes < 4*4) - bytes = 4*4; - - cif->bytes = bytes; - cif->flags = flags; - - return FFI_OK; -} - -/* Perform machine dependent cif processing for variadic calls */ -ffi_status FFI_HIDDEN -ffi_prep_cif_machdep_var (ffi_cif * cif, - unsigned int nfixedargs, unsigned int ntotalargs) -{ - /* VFP variadic calls actually use the SYSV ABI */ - if (cif->abi == FFI_VFP) - cif->abi = FFI_SYSV; - - return ffi_prep_cif_machdep (cif); -} - -/* Prototypes for assembly functions, in sysv.S. */ - -struct call_frame -{ - void *fp; - void *lr; - void *rvalue; - int flags; - void *closure; -}; - -extern void ffi_call_SYSV (void *stack, struct call_frame *, - void (*fn) (void)) FFI_HIDDEN; -extern void ffi_call_VFP (void *vfp_space, struct call_frame *, - void (*fn) (void), unsigned vfp_used) FFI_HIDDEN; - -static void -ffi_call_int (ffi_cif * cif, void (*fn) (void), void *rvalue, - void **avalue, void *closure) -{ - int flags = cif->flags; - ffi_type *rtype = cif->rtype; - size_t bytes, rsize, vfp_size; - char *stack, *vfp_space, *new_rvalue; - struct call_frame *frame; - - rsize = 0; - if (rvalue == NULL) - { - /* If the return value is a struct and we don't have a return - value address then we need to make one. Otherwise the return - value is in registers and we can ignore them. */ - if (flags == ARM_TYPE_STRUCT) - rsize = rtype->size; - else - flags = ARM_TYPE_VOID; - } - else if (flags == ARM_TYPE_VFP_N) - { - /* Largest case is double x 4. */ - rsize = 32; - } - else if (flags == ARM_TYPE_INT && rtype->type == FFI_TYPE_STRUCT) - rsize = 4; - - /* Largest case. */ - vfp_size = (cif->abi == FFI_VFP && cif->vfp_used ? 8*8: 0); - - bytes = cif->bytes; - stack = alloca (vfp_size + bytes + sizeof(struct call_frame) + rsize); - - vfp_space = NULL; - if (vfp_size) - { - vfp_space = stack; - stack += vfp_size; - } - - frame = (struct call_frame *)(stack + bytes); - - new_rvalue = rvalue; - if (rsize) - new_rvalue = (void *)(frame + 1); - - frame->rvalue = new_rvalue; - frame->flags = flags; - frame->closure = closure; - - if (vfp_space) - { - ffi_prep_args_VFP (cif, flags, new_rvalue, avalue, stack, vfp_space); - ffi_call_VFP (vfp_space, frame, fn, cif->vfp_used); - } - else - { - ffi_prep_args_SYSV (cif, flags, new_rvalue, avalue, stack); - ffi_call_SYSV (stack, frame, fn); - } - - if (rvalue && rvalue != new_rvalue) - memcpy (rvalue, new_rvalue, rtype->size); -} - -void -ffi_call (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue) -{ - ffi_call_int (cif, fn, rvalue, avalue, NULL); -} - -#ifdef FFI_GO_CLOSURES -void -ffi_call_go (ffi_cif *cif, void (*fn) (void), void *rvalue, - void **avalue, void *closure) -{ - ffi_call_int (cif, fn, rvalue, avalue, closure); -} -#endif - -static void * -ffi_prep_incoming_args_SYSV (ffi_cif *cif, void *rvalue, - char *argp, void **avalue) -{ - ffi_type **arg_types = cif->arg_types; - int i, n; - - if (cif->flags == ARM_TYPE_STRUCT) - { - rvalue = *(void **) argp; - argp += 4; - } - else - { - if (cif->rtype->size && cif->rtype->size < 4) - *(uint32_t *) rvalue = 0; - } - - for (i = 0, n = cif->nargs; i < n; i++) - { - ffi_type *ty = arg_types[i]; - size_t z = ty->size; - - argp = ffi_align (ty, argp); - avalue[i] = (void *) argp; - argp += z; - } - - return rvalue; -} - -static void * -ffi_prep_incoming_args_VFP (ffi_cif *cif, void *rvalue, char *stack, - char *vfp_space, void **avalue) -{ - ffi_type **arg_types = cif->arg_types; - int i, n, vi = 0; - char *argp, *regp, *eo_regp; - char done_with_regs = 0; - char stack_used = 0; - - regp = stack; - eo_regp = argp = regp + 16; - - if (cif->flags == ARM_TYPE_STRUCT) - { - rvalue = *(void **) regp; - regp += 4; - } - - for (i = 0, n = cif->nargs; i < n; i++) - { - ffi_type *ty = arg_types[i]; - int is_vfp_type = vfp_type_p (ty); - size_t z = ty->size; - - if (vi < cif->vfp_nargs && is_vfp_type) - { - avalue[i] = vfp_space + cif->vfp_args[vi++] * 4; - continue; - } - else if (!done_with_regs && !is_vfp_type) - { - char *tregp = ffi_align (ty, regp); - - z = (z < 4) ? 4 : z; // pad - - /* If the arguments either fits into the registers or uses registers - and stack, while we haven't read other things from the stack */ - if (tregp + z <= eo_regp || !stack_used) - { - /* Because we're little endian, this is what it turns into. */ - avalue[i] = (void *) tregp; - regp = tregp + z; - - /* If we read past the last core register, make sure we - have not read from the stack before and continue - reading after regp. */ - if (regp > eo_regp) - { - FFI_ASSERT (!stack_used); - argp = regp; - } - if (regp >= eo_regp) - { - done_with_regs = 1; - stack_used = 1; - } - continue; - } - } - - stack_used = 1; - argp = ffi_align (ty, argp); - avalue[i] = (void *) argp; - argp += z; - } - - return rvalue; -} - -struct closure_frame -{ - char vfp_space[8*8] __attribute__((aligned(8))); - char result[8*4]; - char argp[]; -}; - -int FFI_HIDDEN -ffi_closure_inner_SYSV (ffi_cif *cif, - void (*fun) (ffi_cif *, void *, void **, void *), - void *user_data, - struct closure_frame *frame) -{ - void **avalue = (void **) alloca (cif->nargs * sizeof (void *)); - void *rvalue = ffi_prep_incoming_args_SYSV (cif, frame->result, - frame->argp, avalue); - fun (cif, rvalue, avalue, user_data); - return cif->flags; -} - -int FFI_HIDDEN -ffi_closure_inner_VFP (ffi_cif *cif, - void (*fun) (ffi_cif *, void *, void **, void *), - void *user_data, - struct closure_frame *frame) -{ - void **avalue = (void **) alloca (cif->nargs * sizeof (void *)); - void *rvalue = ffi_prep_incoming_args_VFP (cif, frame->result, frame->argp, - frame->vfp_space, avalue); - fun (cif, rvalue, avalue, user_data); - return cif->flags; -} - -void ffi_closure_SYSV (void) FFI_HIDDEN; -void ffi_closure_VFP (void) FFI_HIDDEN; - -#ifdef FFI_GO_CLOSURES -void ffi_go_closure_SYSV (void) FFI_HIDDEN; -void ffi_go_closure_VFP (void) FFI_HIDDEN; -#endif - -/* the cif must already be prep'ed */ - -#if defined(__FreeBSD__) && defined(__arm__) -#define __clear_cache(start, end) do { \ - struct arm_sync_icache_args ua; \ - \ - ua.addr = (uintptr_t)(start); \ - ua.len = (char *)(end) - (char *)start; \ - sysarch(ARM_SYNC_ICACHE, &ua); \ - } while (0); -#endif - -ffi_status -ffi_prep_closure_loc (ffi_closure * closure, - ffi_cif * cif, - void (*fun) (ffi_cif *, void *, void **, void *), - void *user_data, void *codeloc) -{ - void (*closure_func) (void) = ffi_closure_SYSV; - - if (cif->abi == FFI_VFP) - { - /* We only need take the vfp path if there are vfp arguments. */ - if (cif->vfp_used) - closure_func = ffi_closure_VFP; - } - else if (cif->abi != FFI_SYSV) - return FFI_BAD_ABI; - -#if FFI_EXEC_TRAMPOLINE_TABLE - void **config = (void **)((uint8_t *)codeloc - PAGE_MAX_SIZE); - config[0] = closure; - config[1] = closure_func; -#else - -#ifndef _M_ARM - memcpy(closure->tramp, ffi_arm_trampoline, 8); -#else - // cast away function type so MSVC doesn't set the lower bit of the function pointer - memcpy(closure->tramp, (void*)((uintptr_t)ffi_arm_trampoline & 0xFFFFFFFE), FFI_TRAMPOLINE_CLOSURE_OFFSET); -#endif - -#if defined (__QNX__) - msync(closure->tramp, 8, 0x1000000); /* clear data map */ - msync(codeloc, 8, 0x1000000); /* clear insn map */ -#elif defined(_MSC_VER) - FlushInstructionCache(GetCurrentProcess(), closure->tramp, FFI_TRAMPOLINE_SIZE); -#else - __clear_cache(closure->tramp, closure->tramp + 8); /* clear data map */ - __clear_cache(codeloc, codeloc + 8); /* clear insn map */ -#endif -#ifdef _M_ARM - *(void(**)(void))(closure->tramp + FFI_TRAMPOLINE_CLOSURE_FUNCTION) = closure_func; -#else - *(void (**)(void))(closure->tramp + 8) = closure_func; -#endif -#endif - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - return FFI_OK; -} - -#ifdef FFI_GO_CLOSURES -ffi_status -ffi_prep_go_closure (ffi_go_closure *closure, ffi_cif *cif, - void (*fun) (ffi_cif *, void *, void **, void *)) -{ - void (*closure_func) (void) = ffi_go_closure_SYSV; - - if (cif->abi == FFI_VFP) - { - /* We only need take the vfp path if there are vfp arguments. */ - if (cif->vfp_used) - closure_func = ffi_go_closure_VFP; - } - else if (cif->abi != FFI_SYSV) - return FFI_BAD_ABI; - - closure->tramp = closure_func; - closure->cif = cif; - closure->fun = fun; - - return FFI_OK; -} -#endif - -/* Below are routines for VFP hard-float support. */ - -/* A subroutine of vfp_type_p. Given a structure type, return the type code - of the first non-structure element. Recurse for structure elements. - Return -1 if the structure is in fact empty, i.e. no nested elements. */ - -static int -is_hfa0 (const ffi_type *ty) -{ - ffi_type **elements = ty->elements; - int i, ret = -1; - - if (elements != NULL) - for (i = 0; elements[i]; ++i) - { - ret = elements[i]->type; - if (ret == FFI_TYPE_STRUCT || ret == FFI_TYPE_COMPLEX) - { - ret = is_hfa0 (elements[i]); - if (ret < 0) - continue; - } - break; - } - - return ret; -} - -/* A subroutine of vfp_type_p. Given a structure type, return true if all - of the non-structure elements are the same as CANDIDATE. */ - -static int -is_hfa1 (const ffi_type *ty, int candidate) -{ - ffi_type **elements = ty->elements; - int i; - - if (elements != NULL) - for (i = 0; elements[i]; ++i) - { - int t = elements[i]->type; - if (t == FFI_TYPE_STRUCT || t == FFI_TYPE_COMPLEX) - { - if (!is_hfa1 (elements[i], candidate)) - return 0; - } - else if (t != candidate) - return 0; - } - - return 1; -} - -/* Determine if TY is an homogenous floating point aggregate (HFA). - That is, a structure consisting of 1 to 4 members of all the same type, - where that type is a floating point scalar. - - Returns non-zero iff TY is an HFA. The result is an encoded value where - bits 0-7 contain the type code, and bits 8-10 contain the element count. */ - -static int -vfp_type_p (const ffi_type *ty) -{ - ffi_type **elements; - int candidate, i; - size_t size, ele_count; - - /* Quickest tests first. */ - candidate = ty->type; - switch (ty->type) - { - default: - return 0; - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - ele_count = 1; - goto done; - case FFI_TYPE_COMPLEX: - candidate = ty->elements[0]->type; - if (candidate != FFI_TYPE_FLOAT && candidate != FFI_TYPE_DOUBLE) - return 0; - ele_count = 2; - goto done; - case FFI_TYPE_STRUCT: - break; - } - - /* No HFA types are smaller than 4 bytes, or larger than 32 bytes. */ - size = ty->size; - if (size < 4 || size > 32) - return 0; - - /* Find the type of the first non-structure member. */ - elements = ty->elements; - candidate = elements[0]->type; - if (candidate == FFI_TYPE_STRUCT || candidate == FFI_TYPE_COMPLEX) - { - for (i = 0; ; ++i) - { - candidate = is_hfa0 (elements[i]); - if (candidate >= 0) - break; - } - } - - /* If the first member is not a floating point type, it's not an HFA. - Also quickly re-check the size of the structure. */ - switch (candidate) - { - case FFI_TYPE_FLOAT: - ele_count = size / sizeof(float); - if (size != ele_count * sizeof(float)) - return 0; - break; - case FFI_TYPE_DOUBLE: - ele_count = size / sizeof(double); - if (size != ele_count * sizeof(double)) - return 0; - break; - default: - return 0; - } - if (ele_count > 4) - return 0; - - /* Finally, make sure that all scalar elements are the same type. */ - for (i = 0; elements[i]; ++i) - { - int t = elements[i]->type; - if (t == FFI_TYPE_STRUCT || t == FFI_TYPE_COMPLEX) - { - if (!is_hfa1 (elements[i], candidate)) - return 0; - } - else if (t != candidate) - return 0; - } - - /* All tests succeeded. Encode the result. */ - done: - return (ele_count << 8) | candidate; -} - -static int -place_vfp_arg (ffi_cif *cif, int h) -{ - unsigned short reg = cif->vfp_reg_free; - int align = 1, nregs = h >> 8; - - if ((h & 0xff) == FFI_TYPE_DOUBLE) - align = 2, nregs *= 2; - - /* Align register number. */ - if ((reg & 1) && align == 2) - reg++; - - while (reg + nregs <= 16) - { - int s, new_used = 0; - for (s = reg; s < reg + nregs; s++) - { - new_used |= (1 << s); - if (cif->vfp_used & (1 << s)) - { - reg += align; - goto next_reg; - } - } - /* Found regs to allocate. */ - cif->vfp_used |= new_used; - cif->vfp_args[cif->vfp_nargs++] = (signed char)reg; - - /* Update vfp_reg_free. */ - if (cif->vfp_used & (1 << cif->vfp_reg_free)) - { - reg += nregs; - while (cif->vfp_used & (1 << reg)) - reg += 1; - cif->vfp_reg_free = reg; - } - return 0; - next_reg:; - } - // done, mark all regs as used - cif->vfp_reg_free = 16; - cif->vfp_used = 0xFFFF; - return 1; -} - -static void -layout_vfp_args (ffi_cif * cif) -{ - unsigned int i; - /* Init VFP fields */ - cif->vfp_used = 0; - cif->vfp_nargs = 0; - cif->vfp_reg_free = 0; - memset (cif->vfp_args, -1, 16); /* Init to -1. */ - - for (i = 0; i < cif->nargs; i++) - { - int h = vfp_type_p (cif->arg_types[i]); - if (h && place_vfp_arg (cif, h) == 1) - break; - } -} - -#endif /* __arm__ or _M_ARM */ diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/arm/ffitarget.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/arm/ffitarget.h deleted file mode 100644 index cb57b84..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/arm/ffitarget.h +++ /dev/null @@ -1,89 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - Copyright (c) 2010 CodeSourcery - Copyright (c) 1996-2003 Red Hat, Inc. - - Target configuration macros for ARM. - - 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. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_SYSV, - FFI_VFP, - FFI_LAST_ABI, -#if defined(__ARM_PCS_VFP) || defined(_M_ARM) - FFI_DEFAULT_ABI = FFI_VFP, -#else - FFI_DEFAULT_ABI = FFI_SYSV, -#endif -} ffi_abi; -#endif - -#define FFI_EXTRA_CIF_FIELDS \ - int vfp_used; \ - unsigned short vfp_reg_free, vfp_nargs; \ - signed char vfp_args[16] \ - -#define FFI_TARGET_SPECIFIC_VARIADIC -#ifndef _M_ARM -#define FFI_TARGET_HAS_COMPLEX_TYPE -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_GO_CLOSURES 1 -#define FFI_NATIVE_RAW_API 0 - -#if defined (FFI_EXEC_TRAMPOLINE_TABLE) && FFI_EXEC_TRAMPOLINE_TABLE - -#ifdef __MACH__ -#define FFI_TRAMPOLINE_SIZE 12 -#define FFI_TRAMPOLINE_CLOSURE_OFFSET 8 -#else -#error "No trampoline table implementation" -#endif - -#else -#ifdef _MSC_VER -#define FFI_TRAMPOLINE_SIZE 16 -#define FFI_TRAMPOLINE_CLOSURE_FUNCTION 12 -#else -#define FFI_TRAMPOLINE_SIZE 12 -#endif -#define FFI_TRAMPOLINE_CLOSURE_OFFSET FFI_TRAMPOLINE_SIZE -#endif - -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/arm/internal.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/arm/internal.h deleted file mode 100644 index 6cf0b2a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/arm/internal.h +++ /dev/null @@ -1,7 +0,0 @@ -#define ARM_TYPE_VFP_S 0 -#define ARM_TYPE_VFP_D 1 -#define ARM_TYPE_VFP_N 2 -#define ARM_TYPE_INT64 3 -#define ARM_TYPE_INT 4 -#define ARM_TYPE_VOID 5 -#define ARM_TYPE_STRUCT 6 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/arm/sysv.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/arm/sysv.S deleted file mode 100644 index 74bc53f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/arm/sysv.S +++ /dev/null @@ -1,385 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.S - Copyright (c) 1998, 2008, 2011 Red Hat, Inc. - Copyright (c) 2011 Plausible Labs Cooperative, Inc. - - ARM Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#ifdef __arm__ -#define LIBFFI_ASM -#include -#include -#include -#include "internal.h" - -/* GCC 4.8 provides __ARM_ARCH; construct it otherwise. */ -#ifndef __ARM_ARCH -# if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) \ - || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) \ - || defined(__ARM_ARCH_7EM__) -# define __ARM_ARCH 7 -# elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) \ - || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) \ - || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) \ - || defined(__ARM_ARCH_6M__) -# define __ARM_ARCH 6 -# elif defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) \ - || defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) \ - || defined(__ARM_ARCH_5TEJ__) -# define __ARM_ARCH 5 -# else -# define __ARM_ARCH 4 -# endif -#endif - -/* Conditionally compile unwinder directives. */ -#ifdef __ARM_EABI__ -# define UNWIND(...) __VA_ARGS__ -#else -# define UNWIND(...) -#endif - -#if defined(HAVE_AS_CFI_PSEUDO_OP) && defined(__ARM_EABI__) - .cfi_sections .debug_frame -#endif - -#define CONCAT(a, b) CONCAT2(a, b) -#define CONCAT2(a, b) a ## b - -#ifdef __USER_LABEL_PREFIX__ -# define CNAME(X) CONCAT (__USER_LABEL_PREFIX__, X) -#else -# define CNAME(X) X -#endif -#ifdef __ELF__ -# define SIZE(X) .size CNAME(X), . - CNAME(X) -# define TYPE(X, Y) .type CNAME(X), Y -#else -# define SIZE(X) -# define TYPE(X, Y) -#endif - -#define ARM_FUNC_START_LOCAL(name) \ - .align 3; \ - TYPE(CNAME(name), %function); \ - CNAME(name): - -#define ARM_FUNC_START(name) \ - .globl CNAME(name); \ - FFI_HIDDEN(CNAME(name)); \ - ARM_FUNC_START_LOCAL(name) - -#define ARM_FUNC_END(name) \ - SIZE(name) - -/* Aid in defining a jump table with 8 bytes between entries. */ -/* ??? The clang assembler doesn't handle .if with symbolic expressions. */ -#ifdef __clang__ -# define E(index) -#else -# define E(index) \ - .if . - 0b - 8*index; \ - .error "type table out of sync"; \ - .endif -#endif - - .text - .syntax unified - .arm - -#ifndef __clang__ - /* We require interworking on LDM, which implies ARMv5T, - which implies the existance of BLX. */ - .arch armv5t -#endif - - /* Note that we use STC and LDC to encode VFP instructions, - so that we do not need ".fpu vfp", nor get that added to - the object file attributes. These will not be executed - unless the FFI_VFP abi is used. */ - - @ r0: stack - @ r1: frame - @ r2: fn - @ r3: vfp_used - -ARM_FUNC_START(ffi_call_VFP) - UNWIND(.fnstart) - cfi_startproc - - cmp r3, #3 @ load only d0 if possible -#ifdef __clang__ - vldrle d0, [r0] - vldmgt r0, {d0-d7} -#else - ldcle p11, cr0, [r0] @ vldrle d0, [r0] - ldcgt p11, cr0, [r0], {16} @ vldmgt r0, {d0-d7} -#endif - add r0, r0, #64 @ discard the vfp register args - /* FALLTHRU */ -ARM_FUNC_END(ffi_call_VFP) - -ARM_FUNC_START(ffi_call_SYSV) - stm r1, {fp, lr} - mov fp, r1 - - @ This is a bit of a lie wrt the origin of the unwind info, but - @ now we've got the usual frame pointer and two saved registers. - UNWIND(.save {fp,lr}) - UNWIND(.setfp fp, sp) - cfi_def_cfa(fp, 8) - cfi_rel_offset(fp, 0) - cfi_rel_offset(lr, 4) - - mov sp, r0 @ install the stack pointer - mov lr, r2 @ move the fn pointer out of the way - ldr ip, [fp, #16] @ install the static chain - ldmia sp!, {r0-r3} @ move first 4 parameters in registers. - blx lr @ call fn - - @ Load r2 with the pointer to storage for the return value - @ Load r3 with the return type code - ldr r2, [fp, #8] - ldr r3, [fp, #12] - - @ Deallocate the stack with the arguments. - mov sp, fp - cfi_def_cfa_register(sp) - - @ Store values stored in registers. - .align 3 - add pc, pc, r3, lsl #3 - nop -0: -E(ARM_TYPE_VFP_S) -#ifdef __clang__ - vstr s0, [r2] -#else - stc p10, cr0, [r2] @ vstr s0, [r2] -#endif - pop {fp,pc} -E(ARM_TYPE_VFP_D) -#ifdef __clang__ - vstr d0, [r2] -#else - stc p11, cr0, [r2] @ vstr d0, [r2] -#endif - pop {fp,pc} -E(ARM_TYPE_VFP_N) -#ifdef __clang__ - vstm r2, {d0-d3} -#else - stc p11, cr0, [r2], {8} @ vstm r2, {d0-d3} -#endif - pop {fp,pc} -E(ARM_TYPE_INT64) - str r1, [r2, #4] - nop -E(ARM_TYPE_INT) - str r0, [r2] - pop {fp,pc} -E(ARM_TYPE_VOID) - pop {fp,pc} - nop -E(ARM_TYPE_STRUCT) - pop {fp,pc} - - cfi_endproc - UNWIND(.fnend) -ARM_FUNC_END(ffi_call_SYSV) - - -/* - int ffi_closure_inner_* (cif, fun, user_data, frame) -*/ - -ARM_FUNC_START(ffi_go_closure_SYSV) - cfi_startproc - stmdb sp!, {r0-r3} @ save argument regs - cfi_adjust_cfa_offset(16) - ldr r0, [ip, #4] @ load cif - ldr r1, [ip, #8] @ load fun - mov r2, ip @ load user_data - b 0f - cfi_endproc -ARM_FUNC_END(ffi_go_closure_SYSV) - -ARM_FUNC_START(ffi_closure_SYSV) - UNWIND(.fnstart) - cfi_startproc - stmdb sp!, {r0-r3} @ save argument regs - cfi_adjust_cfa_offset(16) - -#if FFI_EXEC_TRAMPOLINE_TABLE - ldr ip, [ip] @ ip points to the config page, dereference to get the ffi_closure* -#endif - ldr r0, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET] @ load cif - ldr r1, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET+4] @ load fun - ldr r2, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET+8] @ load user_data -0: - add ip, sp, #16 @ compute entry sp - sub sp, sp, #64+32 @ allocate frame - cfi_adjust_cfa_offset(64+32) - stmdb sp!, {ip,lr} - - /* Remember that EABI unwind info only applies at call sites. - We need do nothing except note the save of the stack pointer - and the link registers. */ - UNWIND(.save {sp,lr}) - cfi_adjust_cfa_offset(8) - cfi_rel_offset(lr, 4) - - add r3, sp, #8 @ load frame - bl CNAME(ffi_closure_inner_SYSV) - - @ Load values returned in registers. - add r2, sp, #8+64 @ load result - adr r3, CNAME(ffi_closure_ret) - add pc, r3, r0, lsl #3 - cfi_endproc - UNWIND(.fnend) -ARM_FUNC_END(ffi_closure_SYSV) - -ARM_FUNC_START(ffi_go_closure_VFP) - cfi_startproc - stmdb sp!, {r0-r3} @ save argument regs - cfi_adjust_cfa_offset(16) - ldr r0, [ip, #4] @ load cif - ldr r1, [ip, #8] @ load fun - mov r2, ip @ load user_data - b 0f - cfi_endproc -ARM_FUNC_END(ffi_go_closure_VFP) - -ARM_FUNC_START(ffi_closure_VFP) - UNWIND(.fnstart) - cfi_startproc - stmdb sp!, {r0-r3} @ save argument regs - cfi_adjust_cfa_offset(16) - -#if FFI_EXEC_TRAMPOLINE_TABLE - ldr ip, [ip] @ ip points to the config page, dereference to get the ffi_closure* -#endif - ldr r0, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET] @ load cif - ldr r1, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET+4] @ load fun - ldr r2, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET+8] @ load user_data -0: - add ip, sp, #16 - sub sp, sp, #64+32 @ allocate frame - cfi_adjust_cfa_offset(64+32) -#ifdef __clang__ - vstm sp, {d0-d7} -#else - stc p11, cr0, [sp], {16} @ vstm sp, {d0-d7} -#endif - stmdb sp!, {ip,lr} - - /* See above. */ - UNWIND(.save {sp,lr}) - cfi_adjust_cfa_offset(8) - cfi_rel_offset(lr, 4) - - add r3, sp, #8 @ load frame - bl CNAME(ffi_closure_inner_VFP) - - @ Load values returned in registers. - add r2, sp, #8+64 @ load result - adr r3, CNAME(ffi_closure_ret) - add pc, r3, r0, lsl #3 - cfi_endproc - UNWIND(.fnend) -ARM_FUNC_END(ffi_closure_VFP) - -/* Load values returned in registers for both closure entry points. - Note that we use LDM with SP in the register set. This is deprecated - by ARM, but not yet unpredictable. */ - -ARM_FUNC_START_LOCAL(ffi_closure_ret) - cfi_startproc - cfi_rel_offset(sp, 0) - cfi_rel_offset(lr, 4) -0: -E(ARM_TYPE_VFP_S) -#ifdef __clang__ - vldr s0, [r2] -#else - ldc p10, cr0, [r2] @ vldr s0, [r2] -#endif - ldm sp, {sp,pc} -E(ARM_TYPE_VFP_D) -#ifdef __clang__ - vldr d0, [r2] -#else - ldc p11, cr0, [r2] @ vldr d0, [r2] -#endif - ldm sp, {sp,pc} -E(ARM_TYPE_VFP_N) -#ifdef __clang__ - vldm r2, {d0-d3} -#else - ldc p11, cr0, [r2], {8} @ vldm r2, {d0-d3} -#endif - ldm sp, {sp,pc} -E(ARM_TYPE_INT64) - ldr r1, [r2, #4] - nop -E(ARM_TYPE_INT) - ldr r0, [r2] - ldm sp, {sp,pc} -E(ARM_TYPE_VOID) - ldm sp, {sp,pc} - nop -E(ARM_TYPE_STRUCT) - ldm sp, {sp,pc} - cfi_endproc -ARM_FUNC_END(ffi_closure_ret) - -#if FFI_EXEC_TRAMPOLINE_TABLE - -#ifdef __MACH__ -#include - -.align PAGE_MAX_SHIFT -ARM_FUNC_START(ffi_closure_trampoline_table_page) -.rept PAGE_MAX_SIZE / FFI_TRAMPOLINE_SIZE - adr ip, #-PAGE_MAX_SIZE @ the config page is PAGE_MAX_SIZE behind the trampoline page - sub ip, #8 @ account for pc bias - ldr pc, [ip, #4] @ jump to ffi_closure_SYSV or ffi_closure_VFP -.endr -ARM_FUNC_END(ffi_closure_trampoline_table_page) -#endif - -#else - -ARM_FUNC_START(ffi_arm_trampoline) -0: adr ip, 0b - ldr pc, 1f -1: .long 0 -ARM_FUNC_END(ffi_arm_trampoline) - -#endif /* FFI_EXEC_TRAMPOLINE_TABLE */ -#endif /* __arm__ */ - -#if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",%progbits -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/arm/sysv_msvc_arm32.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/arm/sysv_msvc_arm32.S deleted file mode 100644 index 5c99d02..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/arm/sysv_msvc_arm32.S +++ /dev/null @@ -1,311 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.S - Copyright (c) 1998, 2008, 2011 Red Hat, Inc. - Copyright (c) 2011 Plausible Labs Cooperative, Inc. - Copyright (c) 2019 Microsoft Corporation. - - ARM Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include -#include -#include "internal.h" -#include "ksarm.h" - - - ; 8 byte aligned AREA to support 8 byte aligned jump tables - MACRO - NESTED_ENTRY_FFI $FuncName, $AreaName, $ExceptHandler - - ; compute the function's labels - __DeriveFunctionLabels $FuncName - - ; determine the area we will put the function into -__FuncArea SETS "|.text|" - IF "$AreaName" != "" -__FuncArea SETS "$AreaName" - ENDIF - - ; set up the exception handler itself -__FuncExceptionHandler SETS "" - IF "$ExceptHandler" != "" -__FuncExceptionHandler SETS "|$ExceptHandler|" - ENDIF - - ; switch to the specified area, jump tables require 8 byte alignment - AREA $__FuncArea,CODE,CODEALIGN,ALIGN=3,READONLY - - ; export the function name - __ExportProc $FuncName - - ; flush any pending literal pool stuff - ROUT - - ; reset the state of the unwind code tracking - __ResetUnwindState - - MEND - -; MACRO -; TABLE_ENTRY $Type, $Table -;$Type_$Table -; MEND - -#define E(index,table) return_##index##_##table - - ; r0: stack - ; r1: frame - ; r2: fn - ; r3: vfp_used - - ; fake entry point exists only to generate exists only to - ; generate .pdata for exception unwinding - NESTED_ENTRY_FFI ffi_call_VFP_fake - PROLOG_PUSH {r11, lr} ; save fp and lr for unwind - - ALTERNATE_ENTRY ffi_call_VFP - cmp r3, #3 ; load only d0 if possible - vldrle d0, [r0] - vldmgt r0, {d0-d7} - add r0, r0, #64 ; discard the vfp register args - b ffi_call_SYSV - NESTED_END ffi_call_VFP_fake - - ; fake entry point exists only to generate exists only to - ; generate .pdata for exception unwinding - NESTED_ENTRY_FFI ffi_call_SYSV_fake - PROLOG_PUSH {r11, lr} ; save fp and lr for unwind - - ALTERNATE_ENTRY ffi_call_SYSV - stm r1, {fp, lr} - mov fp, r1 - - mov sp, r0 ; install the stack pointer - mov lr, r2 ; move the fn pointer out of the way - ldr ip, [fp, #16] ; install the static chain - ldmia sp!, {r0-r3} ; move first 4 parameters in registers. - blx lr ; call fn - - ; Load r2 with the pointer to storage for the return value - ; Load r3 with the return type code - ldr r2, [fp, #8] - ldr r3, [fp, #12] - - ; Deallocate the stack with the arguments. - mov sp, fp - - ; Store values stored in registers. - ALIGN 8 - lsl r3, #3 - add r3, r3, pc - add r3, #8 - mov pc, r3 - - -E(ARM_TYPE_VFP_S, ffi_call) - ALIGN 8 - vstr s0, [r2] - pop {fp,pc} -E(ARM_TYPE_VFP_D, ffi_call) - ALIGN 8 - vstr d0, [r2] - pop {fp,pc} -E(ARM_TYPE_VFP_N, ffi_call) - ALIGN 8 - vstm r2, {d0-d3} - pop {fp,pc} -E(ARM_TYPE_INT64, ffi_call) - ALIGN 8 - str r1, [r2, #4] - nop -E(ARM_TYPE_INT, ffi_call) - ALIGN 8 - str r0, [r2] - pop {fp,pc} -E(ARM_TYPE_VOID, ffi_call) - ALIGN 8 - pop {fp,pc} - nop -E(ARM_TYPE_STRUCT, ffi_call) - ALIGN 8 - cmp r3, #ARM_TYPE_STRUCT - pop {fp,pc} - NESTED_END ffi_call_SYSV_fake - - IMPORT |ffi_closure_inner_SYSV| - /* - int ffi_closure_inner_SYSV - ( - cif, ; r0 - fun, ; r1 - user_data, ; r2 - frame ; r3 - ) - */ - - NESTED_ENTRY_FFI ffi_go_closure_SYSV - stmdb sp!, {r0-r3} ; save argument regs - ldr r0, [ip, #4] ; load cif - ldr r1, [ip, #8] ; load fun - mov r2, ip ; load user_data - b ffi_go_closure_SYSV_0 - NESTED_END ffi_go_closure_SYSV - - ; r3: ffi_closure - - ; fake entry point exists only to generate exists only to - ; generate .pdata for exception unwinding - NESTED_ENTRY_FFI ffi_closure_SYSV_fake - PROLOG_PUSH {r11, lr} ; save fp and lr for unwind - ALTERNATE_ENTRY ffi_closure_SYSV - ldmfd sp!, {ip,r0} ; restore fp (r0 is used for stack alignment) - stmdb sp!, {r0-r3} ; save argument regs - - ldr r0, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET] ; ffi_closure->cif - ldr r1, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET+4] ; ffi_closure->fun - ldr r2, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET+8] ; ffi_closure->user_data - - ALTERNATE_ENTRY ffi_go_closure_SYSV_0 - add ip, sp, #16 ; compute entry sp - - sub sp, sp, #64+32 ; allocate frame parameter (sizeof(vfp_space) = 64, sizeof(result) = 32) - mov r3, sp ; set frame parameter - stmdb sp!, {ip,lr} - - bl ffi_closure_inner_SYSV ; call the Python closure - - ; Load values returned in registers. - add r2, sp, #64+8 ; address of closure_frame->result - bl ffi_closure_ret ; move result to correct register or memory for type - - ldmfd sp!, {ip,lr} - mov sp, ip ; restore stack pointer - mov pc, lr - NESTED_END ffi_closure_SYSV_fake - - IMPORT |ffi_closure_inner_VFP| - /* - int ffi_closure_inner_VFP - ( - cif, ; r0 - fun, ; r1 - user_data, ; r2 - frame ; r3 - ) - */ - - NESTED_ENTRY_FFI ffi_go_closure_VFP - stmdb sp!, {r0-r3} ; save argument regs - ldr r0, [ip, #4] ; load cif - ldr r1, [ip, #8] ; load fun - mov r2, ip ; load user_data - b ffi_go_closure_VFP_0 - NESTED_END ffi_go_closure_VFP - - ; fake entry point exists only to generate exists only to - ; generate .pdata for exception unwinding - ; r3: closure - NESTED_ENTRY_FFI ffi_closure_VFP_fake - PROLOG_PUSH {r11, lr} ; save fp and lr for unwind - - ALTERNATE_ENTRY ffi_closure_VFP - ldmfd sp!, {ip,r0} ; restore fp (r0 is used for stack alignment) - stmdb sp!, {r0-r3} ; save argument regs - - ldr r0, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET] ; load cif - ldr r1, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET+4] ; load fun - ldr r2, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET+8] ; load user_data - - ALTERNATE_ENTRY ffi_go_closure_VFP_0 - add ip, sp, #16 ; compute entry sp - sub sp, sp, #32 ; save space for closure_frame->result - vstmdb sp!, {d0-d7} ; push closure_frame->vfp_space - - mov r3, sp ; save closure_frame - stmdb sp!, {ip,lr} - - bl ffi_closure_inner_VFP - - ; Load values returned in registers. - add r2, sp, #64+8 ; load result - bl ffi_closure_ret - ldmfd sp!, {ip,lr} - mov sp, ip ; restore stack pointer - mov pc, lr - NESTED_END ffi_closure_VFP_fake - -/* Load values returned in registers for both closure entry points. - Note that we use LDM with SP in the register set. This is deprecated - by ARM, but not yet unpredictable. */ - - NESTED_ENTRY_FFI ffi_closure_ret - stmdb sp!, {fp,lr} - - ALIGN 8 - lsl r0, #3 - add r0, r0, pc - add r0, #8 - mov pc, r0 - -E(ARM_TYPE_VFP_S, ffi_closure) - ALIGN 8 - vldr s0, [r2] - b call_epilogue -E(ARM_TYPE_VFP_D, ffi_closure) - ALIGN 8 - vldr d0, [r2] - b call_epilogue -E(ARM_TYPE_VFP_N, ffi_closure) - ALIGN 8 - vldm r2, {d0-d3} - b call_epilogue -E(ARM_TYPE_INT64, ffi_closure) - ALIGN 8 - ldr r1, [r2, #4] - nop -E(ARM_TYPE_INT, ffi_closure) - ALIGN 8 - ldr r0, [r2] - b call_epilogue -E(ARM_TYPE_VOID, ffi_closure) - ALIGN 8 - b call_epilogue - nop -E(ARM_TYPE_STRUCT, ffi_closure) - ALIGN 8 - b call_epilogue -call_epilogue - ldmfd sp!, {fp,pc} - NESTED_END ffi_closure_ret - - AREA |.trampoline|, DATA, THUMB, READONLY - EXPORT |ffi_arm_trampoline| -|ffi_arm_trampoline| DATA -thisproc adr ip, thisproc - stmdb sp!, {ip, r0} - ldr pc, [pc, #0] - DCD 0 - ;ENDP - - END \ No newline at end of file diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/avr32/ffi.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/avr32/ffi.c deleted file mode 100644 index 3d43397..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/avr32/ffi.c +++ /dev/null @@ -1,423 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2011 Anthony Green - Copyright (c) 2009 Bradley Smith - - AVR32 Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#include -#include - -#include -#include -#include -#include - -/* #define DEBUG */ - -extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, - unsigned int, unsigned int, unsigned int*, unsigned int, - void (*fn)(void)); -extern void ffi_closure_SYSV (ffi_closure *); - -unsigned int pass_struct_on_stack(ffi_type *type) -{ - if(type->type != FFI_TYPE_STRUCT) - return 0; - - if(type->alignment < type->size && - !(type->size == 4 || type->size == 8) && - !(type->size == 8 && type->alignment >= 4)) - return 1; - - if(type->size == 3 || type->size == 5 || type->size == 6 || - type->size == 7) - return 1; - - return 0; -} - -/* ffi_prep_args is called by the assembly routine once stack space - * has been allocated for the function's arguments - * - * This is annoyingly complex since we need to keep track of used - * registers. - */ - -void ffi_prep_args(char *stack, extended_cif *ecif) -{ - unsigned int i; - void **p_argv; - ffi_type **p_arg; - char *reg_base = stack; - char *stack_base = stack + 20; - unsigned int stack_offset = 0; - unsigned int reg_mask = 0; - - p_argv = ecif->avalue; - - /* If cif->flags is struct then we know it's not passed in registers */ - if(ecif->cif->flags == FFI_TYPE_STRUCT) - { - *(void**)reg_base = ecif->rvalue; - reg_mask |= 1; - } - - for(i = 0, p_arg = ecif->cif->arg_types; i < ecif->cif->nargs; - i++, p_arg++) - { - size_t z = (*p_arg)->size; - int alignment = (*p_arg)->alignment; - int type = (*p_arg)->type; - char *addr = 0; - - if(z % 4 != 0) - z += (4 - z % 4); - - if(reg_mask != 0x1f) - { - if(pass_struct_on_stack(*p_arg)) - { - addr = stack_base + stack_offset; - stack_offset += z; - } - else if(z == sizeof(int)) - { - char index = 0; - - while((reg_mask >> index) & 1) - index++; - - addr = reg_base + (index * 4); - reg_mask |= (1 << index); - } - else if(z == 2 * sizeof(int)) - { - if(!((reg_mask >> 1) & 1)) - { - addr = reg_base + 4; - reg_mask |= (3 << 1); - } - else if(!((reg_mask >> 3) & 1)) - { - addr = reg_base + 12; - reg_mask |= (3 << 3); - } - } - } - - if(!addr) - { - addr = stack_base + stack_offset; - stack_offset += z; - } - - if(type == FFI_TYPE_STRUCT && (*p_arg)->elements[1] == NULL) - type = (*p_arg)->elements[0]->type; - - switch(type) - { - case FFI_TYPE_UINT8: - *(unsigned int *)addr = (unsigned int)*(UINT8 *)(*p_argv); - break; - case FFI_TYPE_SINT8: - *(signed int *)addr = (signed int)*(SINT8 *)(*p_argv); - break; - case FFI_TYPE_UINT16: - *(unsigned int *)addr = (unsigned int)*(UINT16 *)(*p_argv); - break; - case FFI_TYPE_SINT16: - *(signed int *)addr = (signed int)*(SINT16 *)(*p_argv); - break; - default: - memcpy(addr, *p_argv, z); - } - - p_argv++; - } - -#ifdef DEBUG - /* Debugging */ - for(i = 0; i < 5; i++) - { - if((reg_mask & (1 << i)) == 0) - printf("r%d: (unused)\n", 12 - i); - else - printf("r%d: 0x%08x\n", 12 - i, ((unsigned int*)reg_base)[i]); - } - - for(i = 0; i < stack_offset / 4; i++) - { - printf("sp+%d: 0x%08x\n", i*4, ((unsigned int*)stack_base)[i]); - } -#endif -} - -/* Perform machine dependent cif processing */ -ffi_status ffi_prep_cif_machdep(ffi_cif *cif) -{ - /* Round the stack up to a multiple of 8 bytes. This isn't needed - * everywhere, but it is on some platforms, and it doesn't harm - * anything when it isn't needed. */ - cif->bytes = (cif->bytes + 7) & ~7; - - /* Flag to indicate that he return value is in fact a struct */ - cif->rstruct_flag = 0; - - /* Set the return type flag */ - switch(cif->rtype->type) - { - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: - cif->flags = (unsigned)FFI_TYPE_UINT8; - break; - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: - cif->flags = (unsigned)FFI_TYPE_UINT16; - break; - case FFI_TYPE_FLOAT: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - case FFI_TYPE_POINTER: - cif->flags = (unsigned)FFI_TYPE_UINT32; - break; - case FFI_TYPE_DOUBLE: - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - cif->flags = (unsigned)FFI_TYPE_UINT64; - break; - case FFI_TYPE_STRUCT: - cif->rstruct_flag = 1; - if(!pass_struct_on_stack(cif->rtype)) - { - if(cif->rtype->size <= 1) - cif->flags = (unsigned)FFI_TYPE_UINT8; - else if(cif->rtype->size <= 2) - cif->flags = (unsigned)FFI_TYPE_UINT16; - else if(cif->rtype->size <= 4) - cif->flags = (unsigned)FFI_TYPE_UINT32; - else if(cif->rtype->size <= 8) - cif->flags = (unsigned)FFI_TYPE_UINT64; - else - cif->flags = (unsigned)cif->rtype->type; - } - else - cif->flags = (unsigned)cif->rtype->type; - break; - default: - cif->flags = (unsigned)cif->rtype->type; - break; - } - - return FFI_OK; -} - -void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - extended_cif ecif; - - unsigned int size = 0, i = 0; - ffi_type **p_arg; - - ecif.cif = cif; - ecif.avalue = avalue; - - for(i = 0, p_arg = cif->arg_types; i < cif->nargs; i++, p_arg++) - size += (*p_arg)->size + (4 - (*p_arg)->size % 4); - - /* If the return value is a struct and we don't have a return value - * address then we need to make one */ - - /* If cif->flags is struct then it's not suitable for registers */ - if((rvalue == NULL) && (cif->flags == FFI_TYPE_STRUCT)) - ecif.rvalue = alloca(cif->rtype->size); - else - ecif.rvalue = rvalue; - - switch(cif->abi) - { - case FFI_SYSV: - ffi_call_SYSV(ffi_prep_args, &ecif, size, cif->flags, - ecif.rvalue, cif->rstruct_flag, fn); - break; - default: - FFI_ASSERT(0); - break; - } -} - -static void ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, - void **avalue, ffi_cif *cif) -{ - register unsigned int i, reg_mask = 0; - register void **p_argv; - register ffi_type **p_arg; - register char *reg_base = stack; - register char *stack_base = stack + 20; - register unsigned int stack_offset = 0; - -#ifdef DEBUG - /* Debugging */ - for(i = 0; i < cif->nargs + 7; i++) - { - printf("sp+%d: 0x%08x\n", i*4, ((unsigned int*)stack)[i]); - } -#endif - - /* If cif->flags is struct then we know it's not passed in registers */ - if(cif->flags == FFI_TYPE_STRUCT) - { - *rvalue = *(void **)reg_base; - reg_mask |= 1; - } - - p_argv = avalue; - - for(i = 0, p_arg = cif->arg_types; i < cif->nargs; i++, p_arg++) - { - size_t z = (*p_arg)->size; - int alignment = (*p_arg)->alignment; - - *p_argv = 0; - - if(z % 4 != 0) - z += (4 - z % 4); - - if(reg_mask != 0x1f) - { - if(pass_struct_on_stack(*p_arg)) - { - *p_argv = (void*)stack_base + stack_offset; - stack_offset += z; - } - else if(z <= sizeof(int)) - { - char index = 0; - - while((reg_mask >> index) & 1) - index++; - - *p_argv = (void*)reg_base + (index * 4); - reg_mask |= (1 << index); - } - else if(z == 2 * sizeof(int)) - { - if(!((reg_mask >> 1) & 1)) - { - *p_argv = (void*)reg_base + 4; - reg_mask |= (3 << 1); - } - else if(!((reg_mask >> 3) & 1)) - { - *p_argv = (void*)reg_base + 12; - reg_mask |= (3 << 3); - } - } - } - - if(!*p_argv) - { - *p_argv = (void*)stack_base + stack_offset; - stack_offset += z; - } - - if((*p_arg)->type != FFI_TYPE_STRUCT || - (*p_arg)->elements[1] == NULL) - { - if(alignment == 1) - **(unsigned int**)p_argv <<= 24; - else if(alignment == 2) - **(unsigned int**)p_argv <<= 16; - } - - p_argv++; - } - -#ifdef DEBUG - /* Debugging */ - for(i = 0; i < cif->nargs; i++) - { - printf("sp+%d: 0x%08x\n", i*4, *(((unsigned int**)avalue)[i])); - } -#endif -} - -/* This function is jumped to by the trampoline */ - -unsigned int ffi_closure_SYSV_inner(ffi_closure *closure, void **respp, - void *args) -{ - ffi_cif *cif; - void **arg_area; - unsigned int i, size = 0; - ffi_type **p_arg; - - cif = closure->cif; - - for(i = 0, p_arg = cif->arg_types; i < cif->nargs; i++, p_arg++) - size += (*p_arg)->size + (4 - (*p_arg)->size % 4); - - arg_area = (void **)alloca(size); - - /* this call will initialize ARG_AREA, such that each element in that - * array points to the corresponding value on the stack; and if the - * function returns a structure, it will re-set RESP to point to the - * structure return address. */ - - ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif); - - (closure->fun)(cif, *respp, arg_area, closure->user_data); - - return cif->flags; -} - -ffi_status ffi_prep_closure_loc(ffi_closure* closure, ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*), void *user_data, - void *codeloc) -{ - if (cif->abi != FFI_SYSV) - return FFI_BAD_ABI; - - unsigned char *__tramp = (unsigned char*)(&closure->tramp[0]); - unsigned int __fun = (unsigned int)(&ffi_closure_SYSV); - unsigned int __ctx = (unsigned int)(codeloc); - unsigned int __rstruct_flag = (unsigned int)(cif->rstruct_flag); - unsigned int __inner = (unsigned int)(&ffi_closure_SYSV_inner); - *(unsigned int*) &__tramp[0] = 0xebcd1f00; /* pushm r8-r12 */ - *(unsigned int*) &__tramp[4] = 0xfefc0010; /* ld.w r12, pc[16] */ - *(unsigned int*) &__tramp[8] = 0xfefb0010; /* ld.w r11, pc[16] */ - *(unsigned int*) &__tramp[12] = 0xfefa0010; /* ld.w r10, pc[16] */ - *(unsigned int*) &__tramp[16] = 0xfeff0010; /* ld.w pc, pc[16] */ - *(unsigned int*) &__tramp[20] = __ctx; - *(unsigned int*) &__tramp[24] = __rstruct_flag; - *(unsigned int*) &__tramp[28] = __inner; - *(unsigned int*) &__tramp[32] = __fun; - syscall(__NR_cacheflush, 0, (&__tramp[0]), 36); - - closure->cif = cif; - closure->user_data = user_data; - closure->fun = fun; - - return FFI_OK; -} - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/avr32/ffitarget.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/avr32/ffitarget.h deleted file mode 100644 index d0c7586..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/avr32/ffitarget.h +++ /dev/null @@ -1,55 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - Copyright (c) 2009 Bradley Smith - Target configuration macros for AVR32. - - 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. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_SYSV, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_SYSV -} ffi_abi; -#endif - -#define FFI_EXTRA_CIF_FIELDS unsigned int rstruct_flag - -/* Definitions for closures */ - -#define FFI_CLOSURES 1 -#define FFI_TRAMPOLINE_SIZE 36 -#define FFI_NATIVE_RAW_API 0 - -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/avr32/sysv.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/avr32/sysv.S deleted file mode 100644 index a984b3c..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/avr32/sysv.S +++ /dev/null @@ -1,208 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.S - Copyright (c) 2009 Bradley Smith - - AVR32 Foreign Function Interface - - 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. - --------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include - - /* r12: ffi_prep_args - * r11: &ecif - * r10: size - * r9: cif->flags - * r8: ecif.rvalue - * sp+0: cif->rstruct_flag - * sp+4: fn */ - - .text - .align 1 - .globl ffi_call_SYSV - .type ffi_call_SYSV, @function -ffi_call_SYSV: - stm --sp, r0,r1,lr - stm --sp, r8-r12 - mov r0, sp - - /* Make room for all of the new args. */ - sub sp, r10 - /* Pad to make way for potential skipped registers */ - sub sp, 20 - - /* Call ffi_prep_args(stack, &ecif). */ - /* r11 already set */ - mov r1, r12 - mov r12, sp - icall r1 - - /* Save new argument size */ - mov r1, r12 - - /* Move first 5 parameters in registers. */ - ldm sp++, r8-r12 - - /* call (fn) (...). */ - ld.w r1, r0[36] - icall r1 - - /* Remove the space we pushed for the args. */ - mov sp, r0 - - /* Load r1 with the rstruct flag. */ - ld.w r1, sp[32] - - /* Load r9 with the return type code. */ - ld.w r9, sp[12] - - /* Load r8 with the return value pointer. */ - ld.w r8, sp[16] - - /* If the return value pointer is NULL, assume no return value. */ - cp.w r8, 0 - breq .Lend - - /* Check if return type is actually a struct */ - cp.w r1, 0 - breq 1f - - /* Return 8bit */ - cp.w r9, FFI_TYPE_UINT8 - breq .Lstore8 - - /* Return 16bit */ - cp.w r9, FFI_TYPE_UINT16 - breq .Lstore16 - -1: - /* Return 32bit */ - cp.w r9, FFI_TYPE_UINT32 - breq .Lstore32 - cp.w r9, FFI_TYPE_UINT16 - breq .Lstore32 - cp.w r9, FFI_TYPE_UINT8 - breq .Lstore32 - - /* Return 64bit */ - cp.w r9, FFI_TYPE_UINT64 - breq .Lstore64 - - /* Didn't match anything */ - bral .Lend - -.Lstore64: - st.w r8[0], r11 - st.w r8[4], r10 - bral .Lend - -.Lstore32: - st.w r8[0], r12 - bral .Lend - -.Lstore16: - st.h r8[0], r12 - bral .Lend - -.Lstore8: - st.b r8[0], r12 - bral .Lend - -.Lend: - sub sp, -20 - ldm sp++, r0,r1,pc - - .size ffi_call_SYSV, . - ffi_call_SYSV - - - /* r12: __ctx - * r11: __rstruct_flag - * r10: __inner */ - - .align 1 - .globl ffi_closure_SYSV - .type ffi_closure_SYSV, @function -ffi_closure_SYSV: - stm --sp, r0,lr - mov r0, r11 - mov r8, r10 - sub r10, sp, -8 - sub sp, 12 - st.w sp[8], sp - sub r11, sp, -8 - icall r8 - - /* Check if return type is actually a struct */ - cp.w r0, 0 - breq 1f - - /* Return 8bit */ - cp.w r12, FFI_TYPE_UINT8 - breq .Lget8 - - /* Return 16bit */ - cp.w r12, FFI_TYPE_UINT16 - breq .Lget16 - -1: - /* Return 32bit */ - cp.w r12, FFI_TYPE_UINT32 - breq .Lget32 - cp.w r12, FFI_TYPE_UINT16 - breq .Lget32 - cp.w r12, FFI_TYPE_UINT8 - breq .Lget32 - - /* Return 64bit */ - cp.w r12, FFI_TYPE_UINT64 - breq .Lget64 - - /* Didn't match anything */ - bral .Lclend - -.Lget64: - ld.w r11, sp[0] - ld.w r10, sp[4] - bral .Lclend - -.Lget32: - ld.w r12, sp[0] - bral .Lclend - -.Lget16: - ld.uh r12, sp[0] - bral .Lclend - -.Lget8: - ld.ub r12, sp[0] - bral .Lclend - -.Lclend: - sub sp, -12 - ldm sp++, r0,lr - sub sp, -20 - mov pc, lr - - .size ffi_closure_SYSV, . - ffi_closure_SYSV - -#if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",@progbits -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/bfin/ffi.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/bfin/ffi.c deleted file mode 100644 index 22a2acd..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/bfin/ffi.c +++ /dev/null @@ -1,196 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2012 Alexandre K. I. de Mendonca , - Paulo Pizarro - - Blackfin Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ -#include -#include - -#include -#include - -/* Maximum number of GPRs available for argument passing. */ -#define MAX_GPRARGS 3 - -/* - * Return types - */ -#define FFIBFIN_RET_VOID 0 -#define FFIBFIN_RET_BYTE 1 -#define FFIBFIN_RET_HALFWORD 2 -#define FFIBFIN_RET_INT64 3 -#define FFIBFIN_RET_INT32 4 - -/*====================================================================*/ -/* PROTOTYPE * - /*====================================================================*/ -void ffi_prep_args(unsigned char *, extended_cif *); - -/*====================================================================*/ -/* Externals */ -/* (Assembly) */ -/*====================================================================*/ - -extern void ffi_call_SYSV(unsigned, extended_cif *, void(*)(unsigned char *, extended_cif *), unsigned, void *, void(*fn)(void)); - -/*====================================================================*/ -/* Implementation */ -/* */ -/*====================================================================*/ - - -/* - * This function calculates the return type (size) based on type. - */ - -ffi_status ffi_prep_cif_machdep(ffi_cif *cif) -{ - /* --------------------------------------* - * Return handling * - * --------------------------------------*/ - switch (cif->rtype->type) { - case FFI_TYPE_VOID: - cif->flags = FFIBFIN_RET_VOID; - break; - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT16: - cif->flags = FFIBFIN_RET_HALFWORD; - break; - case FFI_TYPE_UINT8: - cif->flags = FFIBFIN_RET_BYTE; - break; - case FFI_TYPE_INT: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - case FFI_TYPE_FLOAT: - case FFI_TYPE_POINTER: - case FFI_TYPE_SINT8: - cif->flags = FFIBFIN_RET_INT32; - break; - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - case FFI_TYPE_DOUBLE: - cif->flags = FFIBFIN_RET_INT64; - break; - case FFI_TYPE_STRUCT: - if (cif->rtype->size <= 4){ - cif->flags = FFIBFIN_RET_INT32; - }else if (cif->rtype->size == 8){ - cif->flags = FFIBFIN_RET_INT64; - }else{ - //it will return via a hidden pointer in P0 - cif->flags = FFIBFIN_RET_VOID; - } - break; - default: - FFI_ASSERT(0); - break; - } - return FFI_OK; -} - -/* - * This will prepare the arguments and will call the assembly routine - * cif = the call interface - * fn = the function to be called - * rvalue = the return value - * avalue = the arguments - */ -void ffi_call(ffi_cif *cif, void(*fn)(void), void *rvalue, void **avalue) -{ - int ret_type = cif->flags; - extended_cif ecif; - ecif.cif = cif; - ecif.avalue = avalue; - ecif.rvalue = rvalue; - - switch (cif->abi) { - case FFI_SYSV: - ffi_call_SYSV(cif->bytes, &ecif, ffi_prep_args, ret_type, ecif.rvalue, fn); - break; - default: - FFI_ASSERT(0); - break; - } -} - - -/* -* This function prepares the parameters (copies them from the ecif to the stack) -* to call the function (ffi_prep_args is called by the assembly routine in file -* sysv.S, which also calls the actual function) -*/ -void ffi_prep_args(unsigned char *stack, extended_cif *ecif) -{ - register unsigned int i = 0; - void **p_argv; - unsigned char *argp; - ffi_type **p_arg; - argp = stack; - p_argv = ecif->avalue; - for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; - (i != 0); - i--, p_arg++) { - size_t z; - z = (*p_arg)->size; - if (z < sizeof(int)) { - z = sizeof(int); - switch ((*p_arg)->type) { - case FFI_TYPE_SINT8: { - signed char v = *(SINT8 *)(* p_argv); - signed int t = v; - *(signed int *) argp = t; - } - break; - case FFI_TYPE_UINT8: { - unsigned char v = *(UINT8 *)(* p_argv); - unsigned int t = v; - *(unsigned int *) argp = t; - } - break; - case FFI_TYPE_SINT16: - *(signed int *) argp = (signed int) * (SINT16 *)(* p_argv); - break; - case FFI_TYPE_UINT16: - *(unsigned int *) argp = (unsigned int) * (UINT16 *)(* p_argv); - break; - case FFI_TYPE_STRUCT: - memcpy(argp, *p_argv, (*p_arg)->size); - break; - default: - FFI_ASSERT(0); - break; - } - } else if (z == sizeof(int)) { - *(unsigned int *) argp = (unsigned int) * (UINT32 *)(* p_argv); - } else { - memcpy(argp, *p_argv, z); - } - p_argv++; - argp += z; - } -} - - - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/bfin/ffitarget.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/bfin/ffitarget.h deleted file mode 100644 index 2175c01..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/bfin/ffitarget.h +++ /dev/null @@ -1,43 +0,0 @@ -/* ----------------------------------------------------------------------- - ffitarget.h - Copyright (c) 2012 Alexandre K. I. de Mendonca - - Blackfin Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_SYSV, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_SYSV -} ffi_abi; -#endif - -#endif - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/bfin/sysv.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/bfin/sysv.S deleted file mode 100644 index f4278be..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/bfin/sysv.S +++ /dev/null @@ -1,179 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.S - Copyright (c) 2012 Alexandre K. I. de Mendonca , - Paulo Pizarro - - Blackfin Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include - -.text -.align 4 - - /* - There is a "feature" in the bfin toolchain that it puts a _ before function names - that's why the function here it's called _ffi_call_SYSV and not ffi_call_SYSV - */ - .global _ffi_call_SYSV; - .type _ffi_call_SYSV, STT_FUNC; - .func ffi_call_SYSV - - /* - cif->bytes = R0 (fp+8) - &ecif = R1 (fp+12) - ffi_prep_args = R2 (fp+16) - ret_type = stack (fp+20) - ecif.rvalue = stack (fp+24) - fn = stack (fp+28) - got (fp+32) - - There is room for improvement here (we can use temporary registers - instead of saving the values in the memory) - REGS: - P5 => Stack pointer (function arguments) - R5 => cif->bytes - R4 => ret->type - - FP-20 = P3 - FP-16 = SP (parameters area) - FP-12 = SP (temp) - FP-08 = function return part 1 [R0] - FP-04 = function return part 2 [R1] - */ - -_ffi_call_SYSV: -.prologue: - LINK 20; - [FP-20] = P3; - [FP+8] = R0; - [FP+12] = R1; - [FP+16] = R2; - -.allocate_stack: - //alocate cif->bytes into the stack - R1 = [FP+8]; - R0 = SP; - R0 = R0 - R1; - R1 = 4; - R0 = R0 - R1; - [FP-12] = SP; - SP = R0; - [FP-16] = SP; - -.call_prep_args: - //get the addr of prep_args - P0 = [P3 + _ffi_prep_args@FUNCDESC_GOT17M4]; - P1 = [P0]; - P3 = [P0+4]; - R0 = [FP-16];//SP (parameter area) - R1 = [FP+12];//ecif - call (P1); - -.call_user_function: - //ajust SP so as to allow the user function access the parameters on the stack - SP = [FP-16]; //point to function parameters - R0 = [SP]; - R1 = [SP+4]; - R2 = [SP+8]; - //load user function address - P0 = FP; - P0 +=28; - P1 = [P0]; - P1 = [P1]; - P3 = [P0+4]; - /* - For functions returning aggregate values (struct) occupying more than 8 bytes, - the caller allocates the return value object on the stack and the address - of this object is passed to the callee as a hidden argument in register P0. - */ - P0 = [FP+24]; - - call (P1); - SP = [FP-12]; -.compute_return: - P2 = [FP-20]; - [FP-8] = R0; - [FP-4] = R1; - - R0 = [FP+20]; - R1 = R0 << 2; - - R0 = [P2+.rettable@GOT17M4]; - R0 = R1 + R0; - P2 = R0; - R1 = [P2]; - - P2 = [FP+-20]; - R0 = [P2+.rettable@GOT17M4]; - R0 = R1 + R0; - P2 = R0; - R0 = [FP-8]; - R1 = [FP-4]; - jump (P2); - -/* -#define FFIBFIN_RET_VOID 0 -#define FFIBFIN_RET_BYTE 1 -#define FFIBFIN_RET_HALFWORD 2 -#define FFIBFIN_RET_INT64 3 -#define FFIBFIN_RET_INT32 4 -*/ -.align 4 -.align 4 -.rettable: - .dd .epilogue - .rettable - .dd .rbyte - .rettable; - .dd .rhalfword - .rettable; - .dd .rint64 - .rettable; - .dd .rint32 - .rettable; - -.rbyte: - P0 = [FP+24]; - R0 = R0.B (Z); - [P0] = R0; - JUMP .epilogue -.rhalfword: - P0 = [FP+24]; - R0 = R0.L; - [P0] = R0; - JUMP .epilogue -.rint64: - P0 = [FP+24];// &rvalue - [P0] = R0; - [P0+4] = R1; - JUMP .epilogue -.rint32: - P0 = [FP+24]; - [P0] = R0; -.epilogue: - R0 = [FP+8]; - R1 = [FP+12]; - R2 = [FP+16]; - P3 = [FP-20]; - UNLINK; - RTS; - -.size _ffi_call_SYSV,.-_ffi_call_SYSV; -.endfunc diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/closures.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/closures.c deleted file mode 100644 index dfc2f68..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/closures.c +++ /dev/null @@ -1,1021 +0,0 @@ -/* ----------------------------------------------------------------------- - closures.c - Copyright (c) 2019 Anthony Green - Copyright (c) 2007, 2009, 2010 Red Hat, Inc. - Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc - Copyright (c) 2011 Plausible Labs Cooperative, Inc. - - Code to allocate and deallocate memory for closures. - - 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. - ----------------------------------------------------------------------- */ - -#if defined __linux__ && !defined _GNU_SOURCE -#define _GNU_SOURCE 1 -#endif - -#include -#include -#include - -#ifdef __NetBSD__ -#include -#endif - -#if __NetBSD_Version__ - 0 >= 799007200 -/* NetBSD with PROT_MPROTECT */ -#include - -#include -#include -#ifdef HAVE_SYS_MEMFD_H -#include -#endif - -static const size_t overhead = - (sizeof(max_align_t) > sizeof(void *) + sizeof(size_t)) ? - sizeof(max_align_t) - : sizeof(void *) + sizeof(size_t); - -#define ADD_TO_POINTER(p, d) ((void *)((uintptr_t)(p) + (d))) - -void * -ffi_closure_alloc (size_t size, void **code) -{ - static size_t page_size; - size_t rounded_size; - void *codeseg, *dataseg; - int prot; - - /* Expect that PAX mprotect is active and a separate code mapping is necessary. */ - if (!code) - return NULL; - - /* Obtain system page size. */ - if (!page_size) - page_size = sysconf(_SC_PAGESIZE); - - /* Round allocation size up to the next page, keeping in mind the size field and pointer to code map. */ - rounded_size = (size + overhead + page_size - 1) & ~(page_size - 1); - - /* Primary mapping is RW, but request permission to switch to PROT_EXEC later. */ - prot = PROT_READ | PROT_WRITE | PROT_MPROTECT(PROT_EXEC); - dataseg = mmap(NULL, rounded_size, prot, MAP_ANON | MAP_PRIVATE, -1, 0); - if (dataseg == MAP_FAILED) - return NULL; - - /* Create secondary mapping and switch it to RX. */ - codeseg = mremap(dataseg, rounded_size, NULL, rounded_size, MAP_REMAPDUP); - if (codeseg == MAP_FAILED) { - munmap(dataseg, rounded_size); - return NULL; - } - if (mprotect(codeseg, rounded_size, PROT_READ | PROT_EXEC) == -1) { - munmap(codeseg, rounded_size); - munmap(dataseg, rounded_size); - return NULL; - } - - /* Remember allocation size and location of the secondary mapping for ffi_closure_free. */ - memcpy(dataseg, &rounded_size, sizeof(rounded_size)); - memcpy(ADD_TO_POINTER(dataseg, sizeof(size_t)), &codeseg, sizeof(void *)); - *code = ADD_TO_POINTER(codeseg, overhead); - return ADD_TO_POINTER(dataseg, overhead); -} - -void -ffi_closure_free (void *ptr) -{ - void *codeseg, *dataseg; - size_t rounded_size; - - dataseg = ADD_TO_POINTER(ptr, -overhead); - memcpy(&rounded_size, dataseg, sizeof(rounded_size)); - memcpy(&codeseg, ADD_TO_POINTER(dataseg, sizeof(size_t)), sizeof(void *)); - munmap(dataseg, rounded_size); - munmap(codeseg, rounded_size); -} -#else /* !NetBSD with PROT_MPROTECT */ - -#if !FFI_MMAP_EXEC_WRIT && !FFI_EXEC_TRAMPOLINE_TABLE -# if __linux__ && !defined(__ANDROID__) -/* This macro indicates it may be forbidden to map anonymous memory - with both write and execute permission. Code compiled when this - option is defined will attempt to map such pages once, but if it - fails, it falls back to creating a temporary file in a writable and - executable filesystem and mapping pages from it into separate - locations in the virtual memory space, one location writable and - another executable. */ -# define FFI_MMAP_EXEC_WRIT 1 -# define HAVE_MNTENT 1 -# endif -# if defined(_WIN32) || defined(__OS2__) -/* Windows systems may have Data Execution Protection (DEP) enabled, - which requires the use of VirtualMalloc/VirtualFree to alloc/free - executable memory. */ -# define FFI_MMAP_EXEC_WRIT 1 -# endif -#endif - -#if FFI_MMAP_EXEC_WRIT && !defined FFI_MMAP_EXEC_SELINUX -# if defined(__linux__) && !defined(__ANDROID__) -/* When defined to 1 check for SELinux and if SELinux is active, - don't attempt PROT_EXEC|PROT_WRITE mapping at all, as that - might cause audit messages. */ -# define FFI_MMAP_EXEC_SELINUX 1 -# endif -#endif - -#if FFI_CLOSURES - -#if FFI_EXEC_TRAMPOLINE_TABLE - -#ifdef __MACH__ - -#include -#include -#ifdef HAVE_PTRAUTH -#include -#endif -#include -#include - -extern void *ffi_closure_trampoline_table_page; - -typedef struct ffi_trampoline_table ffi_trampoline_table; -typedef struct ffi_trampoline_table_entry ffi_trampoline_table_entry; - -struct ffi_trampoline_table -{ - /* contiguous writable and executable pages */ - vm_address_t config_page; - vm_address_t trampoline_page; - - /* free list tracking */ - uint16_t free_count; - ffi_trampoline_table_entry *free_list; - ffi_trampoline_table_entry *free_list_pool; - - ffi_trampoline_table *prev; - ffi_trampoline_table *next; -}; - -struct ffi_trampoline_table_entry -{ - void *(*trampoline) (void); - ffi_trampoline_table_entry *next; -}; - -/* Total number of trampolines that fit in one trampoline table */ -#define FFI_TRAMPOLINE_COUNT (PAGE_MAX_SIZE / FFI_TRAMPOLINE_SIZE) - -static pthread_mutex_t ffi_trampoline_lock = PTHREAD_MUTEX_INITIALIZER; -static ffi_trampoline_table *ffi_trampoline_tables = NULL; - -static ffi_trampoline_table * -ffi_trampoline_table_alloc (void) -{ - ffi_trampoline_table *table; - vm_address_t config_page; - vm_address_t trampoline_page; - vm_address_t trampoline_page_template; - vm_prot_t cur_prot; - vm_prot_t max_prot; - kern_return_t kt; - uint16_t i; - - /* Allocate two pages -- a config page and a placeholder page */ - config_page = 0x0; - kt = vm_allocate (mach_task_self (), &config_page, PAGE_MAX_SIZE * 2, - VM_FLAGS_ANYWHERE); - if (kt != KERN_SUCCESS) - return NULL; - - /* Remap the trampoline table on top of the placeholder page */ - trampoline_page = config_page + PAGE_MAX_SIZE; - trampoline_page_template = (vm_address_t)&ffi_closure_trampoline_table_page; -#ifdef __arm__ - /* ffi_closure_trampoline_table_page can be thumb-biased on some ARM archs */ - trampoline_page_template &= ~1UL; -#endif - kt = vm_remap (mach_task_self (), &trampoline_page, PAGE_MAX_SIZE, 0x0, - VM_FLAGS_OVERWRITE, mach_task_self (), trampoline_page_template, - FALSE, &cur_prot, &max_prot, VM_INHERIT_SHARE); - if (kt != KERN_SUCCESS) - { - vm_deallocate (mach_task_self (), config_page, PAGE_MAX_SIZE * 2); - return NULL; - } - - /* We have valid trampoline and config pages */ - table = calloc (1, sizeof (ffi_trampoline_table)); - table->free_count = FFI_TRAMPOLINE_COUNT; - table->config_page = config_page; - table->trampoline_page = trampoline_page; - - /* Create and initialize the free list */ - table->free_list_pool = - calloc (FFI_TRAMPOLINE_COUNT, sizeof (ffi_trampoline_table_entry)); - - for (i = 0; i < table->free_count; i++) - { - ffi_trampoline_table_entry *entry = &table->free_list_pool[i]; - entry->trampoline = - (void *) (table->trampoline_page + (i * FFI_TRAMPOLINE_SIZE)); - - if (i < table->free_count - 1) - entry->next = &table->free_list_pool[i + 1]; - } - - table->free_list = table->free_list_pool; - - return table; -} - -static void -ffi_trampoline_table_free (ffi_trampoline_table *table) -{ - /* Remove from the list */ - if (table->prev != NULL) - table->prev->next = table->next; - - if (table->next != NULL) - table->next->prev = table->prev; - - /* Deallocate pages */ - vm_deallocate (mach_task_self (), table->config_page, PAGE_MAX_SIZE * 2); - - /* Deallocate free list */ - free (table->free_list_pool); - free (table); -} - -void * -ffi_closure_alloc (size_t size, void **code) -{ - /* Create the closure */ - ffi_closure *closure = malloc (size); - if (closure == NULL) - return NULL; - - pthread_mutex_lock (&ffi_trampoline_lock); - - /* Check for an active trampoline table with available entries. */ - ffi_trampoline_table *table = ffi_trampoline_tables; - if (table == NULL || table->free_list == NULL) - { - table = ffi_trampoline_table_alloc (); - if (table == NULL) - { - pthread_mutex_unlock (&ffi_trampoline_lock); - free (closure); - return NULL; - } - - /* Insert the new table at the top of the list */ - table->next = ffi_trampoline_tables; - if (table->next != NULL) - table->next->prev = table; - - ffi_trampoline_tables = table; - } - - /* Claim the free entry */ - ffi_trampoline_table_entry *entry = ffi_trampoline_tables->free_list; - ffi_trampoline_tables->free_list = entry->next; - ffi_trampoline_tables->free_count--; - entry->next = NULL; - - pthread_mutex_unlock (&ffi_trampoline_lock); - - /* Initialize the return values */ - *code = entry->trampoline; -#ifdef HAVE_PTRAUTH - *code = ptrauth_sign_unauthenticated (*code, ptrauth_key_asia, 0); -#endif - closure->trampoline_table = table; - closure->trampoline_table_entry = entry; - - return closure; -} - -void -ffi_closure_free (void *ptr) -{ - ffi_closure *closure = ptr; - - pthread_mutex_lock (&ffi_trampoline_lock); - - /* Fetch the table and entry references */ - ffi_trampoline_table *table = closure->trampoline_table; - ffi_trampoline_table_entry *entry = closure->trampoline_table_entry; - - /* Return the entry to the free list */ - entry->next = table->free_list; - table->free_list = entry; - table->free_count++; - - /* If all trampolines within this table are free, and at least one other table exists, deallocate - * the table */ - if (table->free_count == FFI_TRAMPOLINE_COUNT - && ffi_trampoline_tables != table) - { - ffi_trampoline_table_free (table); - } - else if (ffi_trampoline_tables != table) - { - /* Otherwise, bump this table to the top of the list */ - table->prev = NULL; - table->next = ffi_trampoline_tables; - if (ffi_trampoline_tables != NULL) - ffi_trampoline_tables->prev = table; - - ffi_trampoline_tables = table; - } - - pthread_mutex_unlock (&ffi_trampoline_lock); - - /* Free the closure */ - free (closure); -} - -#endif - -// Per-target implementation; It's unclear what can reasonable be shared between two OS/architecture implementations. - -#elif FFI_MMAP_EXEC_WRIT /* !FFI_EXEC_TRAMPOLINE_TABLE */ - -#define USE_LOCKS 1 -#define USE_DL_PREFIX 1 -#ifdef __GNUC__ -#ifndef USE_BUILTIN_FFS -#define USE_BUILTIN_FFS 1 -#endif -#endif - -/* We need to use mmap, not sbrk. */ -#define HAVE_MORECORE 0 - -/* We could, in theory, support mremap, but it wouldn't buy us anything. */ -#define HAVE_MREMAP 0 - -/* We have no use for this, so save some code and data. */ -#define NO_MALLINFO 1 - -/* We need all allocations to be in regular segments, otherwise we - lose track of the corresponding code address. */ -#define DEFAULT_MMAP_THRESHOLD MAX_SIZE_T - -/* Don't allocate more than a page unless needed. */ -#define DEFAULT_GRANULARITY ((size_t)malloc_getpagesize) - -#include -#include -#include -#include -#ifndef _MSC_VER -#include -#endif -#include -#include -#if !defined(_WIN32) -#ifdef HAVE_MNTENT -#include -#endif /* HAVE_MNTENT */ -#include -#include - -/* We don't want sys/mman.h to be included after we redefine mmap and - dlmunmap. */ -#include -#define LACKS_SYS_MMAN_H 1 - -#if FFI_MMAP_EXEC_SELINUX -#include -#include - -static int selinux_enabled = -1; - -static int -selinux_enabled_check (void) -{ - struct statfs sfs; - FILE *f; - char *buf = NULL; - size_t len = 0; - - if (statfs ("/selinux", &sfs) >= 0 - && (unsigned int) sfs.f_type == 0xf97cff8cU) - return 1; - f = fopen ("/proc/mounts", "r"); - if (f == NULL) - return 0; - while (getline (&buf, &len, f) >= 0) - { - char *p = strchr (buf, ' '); - if (p == NULL) - break; - p = strchr (p + 1, ' '); - if (p == NULL) - break; - if (strncmp (p + 1, "selinuxfs ", 10) == 0) - { - free (buf); - fclose (f); - return 1; - } - } - free (buf); - fclose (f); - return 0; -} - -#define is_selinux_enabled() (selinux_enabled >= 0 ? selinux_enabled \ - : (selinux_enabled = selinux_enabled_check ())) - -#else - -#define is_selinux_enabled() 0 - -#endif /* !FFI_MMAP_EXEC_SELINUX */ - -/* On PaX enable kernels that have MPROTECT enable we can't use PROT_EXEC. */ -#ifdef FFI_MMAP_EXEC_EMUTRAMP_PAX -#include - -static int emutramp_enabled = -1; - -static int -emutramp_enabled_check (void) -{ - char *buf = NULL; - size_t len = 0; - FILE *f; - int ret; - f = fopen ("/proc/self/status", "r"); - if (f == NULL) - return 0; - ret = 0; - - while (getline (&buf, &len, f) != -1) - if (!strncmp (buf, "PaX:", 4)) - { - char emutramp; - if (sscanf (buf, "%*s %*c%c", &emutramp) == 1) - ret = (emutramp == 'E'); - break; - } - free (buf); - fclose (f); - return ret; -} - -#define is_emutramp_enabled() (emutramp_enabled >= 0 ? emutramp_enabled \ - : (emutramp_enabled = emutramp_enabled_check ())) -#endif /* FFI_MMAP_EXEC_EMUTRAMP_PAX */ - -#elif defined (__CYGWIN__) || defined(__INTERIX) - -#include - -/* Cygwin is Linux-like, but not quite that Linux-like. */ -#define is_selinux_enabled() 0 - -#endif /* !defined(X86_WIN32) && !defined(X86_WIN64) */ - -#ifndef FFI_MMAP_EXEC_EMUTRAMP_PAX -#define is_emutramp_enabled() 0 -#endif /* FFI_MMAP_EXEC_EMUTRAMP_PAX */ - -/* Declare all functions defined in dlmalloc.c as static. */ -static void *dlmalloc(size_t); -static void dlfree(void*); -static void *dlcalloc(size_t, size_t) MAYBE_UNUSED; -static void *dlrealloc(void *, size_t) MAYBE_UNUSED; -static void *dlmemalign(size_t, size_t) MAYBE_UNUSED; -static void *dlvalloc(size_t) MAYBE_UNUSED; -static int dlmallopt(int, int) MAYBE_UNUSED; -static size_t dlmalloc_footprint(void) MAYBE_UNUSED; -static size_t dlmalloc_max_footprint(void) MAYBE_UNUSED; -static void** dlindependent_calloc(size_t, size_t, void**) MAYBE_UNUSED; -static void** dlindependent_comalloc(size_t, size_t*, void**) MAYBE_UNUSED; -static void *dlpvalloc(size_t) MAYBE_UNUSED; -static int dlmalloc_trim(size_t) MAYBE_UNUSED; -static size_t dlmalloc_usable_size(void*) MAYBE_UNUSED; -static void dlmalloc_stats(void) MAYBE_UNUSED; - -#if !(defined(_WIN32) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX) -/* Use these for mmap and munmap within dlmalloc.c. */ -static void *dlmmap(void *, size_t, int, int, int, off_t); -static int dlmunmap(void *, size_t); -#endif /* !(defined(_WIN32) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX) */ - -#define mmap dlmmap -#define munmap dlmunmap - -#include "dlmalloc.c" - -#undef mmap -#undef munmap - -#if !(defined(_WIN32) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX) - -/* A mutex used to synchronize access to *exec* variables in this file. */ -static pthread_mutex_t open_temp_exec_file_mutex = PTHREAD_MUTEX_INITIALIZER; - -/* A file descriptor of a temporary file from which we'll map - executable pages. */ -static int execfd = -1; - -/* The amount of space already allocated from the temporary file. */ -static size_t execsize = 0; - -#ifdef HAVE_MEMFD_CREATE -/* Open a temporary file name, and immediately unlink it. */ -static int -open_temp_exec_file_memfd (const char *name) -{ - int fd; - fd = memfd_create (name, MFD_CLOEXEC); - return fd; -} -#endif - -/* Open a temporary file name, and immediately unlink it. */ -static int -open_temp_exec_file_name (char *name, int flags) -{ - int fd; - -#ifdef HAVE_MKOSTEMP - fd = mkostemp (name, flags); -#else - fd = mkstemp (name); -#endif - - if (fd != -1) - unlink (name); - - return fd; -} - -/* Open a temporary file in the named directory. */ -static int -open_temp_exec_file_dir (const char *dir) -{ - static const char suffix[] = "/ffiXXXXXX"; - int lendir, flags; - char *tempname; -#ifdef O_TMPFILE - int fd; -#endif - -#ifdef O_CLOEXEC - flags = O_CLOEXEC; -#else - flags = 0; -#endif - -#ifdef O_TMPFILE - fd = open (dir, flags | O_RDWR | O_EXCL | O_TMPFILE, 0700); - /* If the running system does not support the O_TMPFILE flag then retry without it. */ - if (fd != -1 || (errno != EINVAL && errno != EISDIR && errno != EOPNOTSUPP)) { - return fd; - } else { - errno = 0; - } -#endif - - lendir = (int) strlen (dir); - tempname = __builtin_alloca (lendir + sizeof (suffix)); - - if (!tempname) - return -1; - - memcpy (tempname, dir, lendir); - memcpy (tempname + lendir, suffix, sizeof (suffix)); - - return open_temp_exec_file_name (tempname, flags); -} - -/* Open a temporary file in the directory in the named environment - variable. */ -static int -open_temp_exec_file_env (const char *envvar) -{ - const char *value = getenv (envvar); - - if (!value) - return -1; - - return open_temp_exec_file_dir (value); -} - -#ifdef HAVE_MNTENT -/* Open a temporary file in an executable and writable mount point - listed in the mounts file. Subsequent calls with the same mounts - keep searching for mount points in the same file. Providing NULL - as the mounts file closes the file. */ -static int -open_temp_exec_file_mnt (const char *mounts) -{ - static const char *last_mounts; - static FILE *last_mntent; - - if (mounts != last_mounts) - { - if (last_mntent) - endmntent (last_mntent); - - last_mounts = mounts; - - if (mounts) - last_mntent = setmntent (mounts, "r"); - else - last_mntent = NULL; - } - - if (!last_mntent) - return -1; - - for (;;) - { - int fd; - struct mntent mnt; - char buf[MAXPATHLEN * 3]; - - if (getmntent_r (last_mntent, &mnt, buf, sizeof (buf)) == NULL) - return -1; - - if (hasmntopt (&mnt, "ro") - || hasmntopt (&mnt, "noexec") - || access (mnt.mnt_dir, W_OK)) - continue; - - fd = open_temp_exec_file_dir (mnt.mnt_dir); - - if (fd != -1) - return fd; - } -} -#endif /* HAVE_MNTENT */ - -/* Instructions to look for a location to hold a temporary file that - can be mapped in for execution. */ -static struct -{ - int (*func)(const char *); - const char *arg; - int repeat; -} open_temp_exec_file_opts[] = { -#ifdef HAVE_MEMFD_CREATE - { open_temp_exec_file_memfd, "libffi", 0 }, -#endif - { open_temp_exec_file_env, "TMPDIR", 0 }, - { open_temp_exec_file_dir, "/tmp", 0 }, - { open_temp_exec_file_dir, "/var/tmp", 0 }, - { open_temp_exec_file_dir, "/dev/shm", 0 }, - { open_temp_exec_file_env, "HOME", 0 }, -#ifdef HAVE_MNTENT - { open_temp_exec_file_mnt, "/etc/mtab", 1 }, - { open_temp_exec_file_mnt, "/proc/mounts", 1 }, -#endif /* HAVE_MNTENT */ -}; - -/* Current index into open_temp_exec_file_opts. */ -static int open_temp_exec_file_opts_idx = 0; - -/* Reset a current multi-call func, then advances to the next entry. - If we're at the last, go back to the first and return nonzero, - otherwise return zero. */ -static int -open_temp_exec_file_opts_next (void) -{ - if (open_temp_exec_file_opts[open_temp_exec_file_opts_idx].repeat) - open_temp_exec_file_opts[open_temp_exec_file_opts_idx].func (NULL); - - open_temp_exec_file_opts_idx++; - if (open_temp_exec_file_opts_idx - == (sizeof (open_temp_exec_file_opts) - / sizeof (*open_temp_exec_file_opts))) - { - open_temp_exec_file_opts_idx = 0; - return 1; - } - - return 0; -} - -/* Return a file descriptor of a temporary zero-sized file in a - writable and executable filesystem. */ -static int -open_temp_exec_file (void) -{ - int fd; - - do - { - fd = open_temp_exec_file_opts[open_temp_exec_file_opts_idx].func - (open_temp_exec_file_opts[open_temp_exec_file_opts_idx].arg); - - if (!open_temp_exec_file_opts[open_temp_exec_file_opts_idx].repeat - || fd == -1) - { - if (open_temp_exec_file_opts_next ()) - break; - } - } - while (fd == -1); - - return fd; -} - -/* We need to allocate space in a file that will be backing a writable - mapping. Several problems exist with the usual approaches: - - fallocate() is Linux-only - - posix_fallocate() is not available on all platforms - - ftruncate() does not allocate space on filesystems with sparse files - Failure to allocate the space will cause SIGBUS to be thrown when - the mapping is subsequently written to. */ -static int -allocate_space (int fd, off_t offset, off_t len) -{ - static size_t page_size; - - /* Obtain system page size. */ - if (!page_size) - page_size = sysconf(_SC_PAGESIZE); - - unsigned char buf[page_size]; - memset (buf, 0, page_size); - - while (len > 0) - { - off_t to_write = (len < page_size) ? len : page_size; - if (write (fd, buf, to_write) < to_write) - return -1; - len -= to_write; - } - - return 0; -} - -/* Map in a chunk of memory from the temporary exec file into separate - locations in the virtual memory address space, one writable and one - executable. Returns the address of the writable portion, after - storing an offset to the corresponding executable portion at the - last word of the requested chunk. */ -static void * -dlmmap_locked (void *start, size_t length, int prot, int flags, off_t offset) -{ - void *ptr; - - if (execfd == -1) - { - open_temp_exec_file_opts_idx = 0; - retry_open: - execfd = open_temp_exec_file (); - if (execfd == -1) - return MFAIL; - } - - offset = execsize; - - if (allocate_space (execfd, offset, length)) - return MFAIL; - - flags &= ~(MAP_PRIVATE | MAP_ANONYMOUS); - flags |= MAP_SHARED; - - ptr = mmap (NULL, length, (prot & ~PROT_WRITE) | PROT_EXEC, - flags, execfd, offset); - if (ptr == MFAIL) - { - if (!offset) - { - close (execfd); - goto retry_open; - } - if (ftruncate (execfd, offset) != 0) - { - /* Fixme : Error logs can be added here. Returning an error for - * ftruncte() will not add any advantage as it is being - * validating in the error case. */ - } - - return MFAIL; - } - else if (!offset - && open_temp_exec_file_opts[open_temp_exec_file_opts_idx].repeat) - open_temp_exec_file_opts_next (); - - start = mmap (start, length, prot, flags, execfd, offset); - - if (start == MFAIL) - { - munmap (ptr, length); - if (ftruncate (execfd, offset) != 0) - { - /* Fixme : Error logs can be added here. Returning an error for - * ftruncte() will not add any advantage as it is being - * validating in the error case. */ - } - return start; - } - - mmap_exec_offset ((char *)start, length) = (char*)ptr - (char*)start; - - execsize += length; - - return start; -} - -/* Map in a writable and executable chunk of memory if possible. - Failing that, fall back to dlmmap_locked. */ -static void * -dlmmap (void *start, size_t length, int prot, - int flags, int fd, off_t offset) -{ - void *ptr; - - assert (start == NULL && length % malloc_getpagesize == 0 - && prot == (PROT_READ | PROT_WRITE) - && flags == (MAP_PRIVATE | MAP_ANONYMOUS) - && fd == -1 && offset == 0); - - if (execfd == -1 && is_emutramp_enabled ()) - { - ptr = mmap (start, length, prot & ~PROT_EXEC, flags, fd, offset); - return ptr; - } - - if (execfd == -1 && !is_selinux_enabled ()) - { - ptr = mmap (start, length, prot | PROT_EXEC, flags, fd, offset); - - if (ptr != MFAIL || (errno != EPERM && errno != EACCES)) - /* Cool, no need to mess with separate segments. */ - return ptr; - - /* If MREMAP_DUP is ever introduced and implemented, try mmap - with ((prot & ~PROT_WRITE) | PROT_EXEC) and mremap with - MREMAP_DUP and prot at this point. */ - } - - if (execsize == 0 || execfd == -1) - { - pthread_mutex_lock (&open_temp_exec_file_mutex); - ptr = dlmmap_locked (start, length, prot, flags, offset); - pthread_mutex_unlock (&open_temp_exec_file_mutex); - - return ptr; - } - - return dlmmap_locked (start, length, prot, flags, offset); -} - -/* Release memory at the given address, as well as the corresponding - executable page if it's separate. */ -static int -dlmunmap (void *start, size_t length) -{ - /* We don't bother decreasing execsize or truncating the file, since - we can't quite tell whether we're unmapping the end of the file. - We don't expect frequent deallocation anyway. If we did, we - could locate pages in the file by writing to the pages being - deallocated and checking that the file contents change. - Yuck. */ - msegmentptr seg = segment_holding (gm, start); - void *code; - - if (seg && (code = add_segment_exec_offset (start, seg)) != start) - { - int ret = munmap (code, length); - if (ret) - return ret; - } - - return munmap (start, length); -} - -#if FFI_CLOSURE_FREE_CODE -/* Return segment holding given code address. */ -static msegmentptr -segment_holding_code (mstate m, char* addr) -{ - msegmentptr sp = &m->seg; - for (;;) { - if (addr >= add_segment_exec_offset (sp->base, sp) - && addr < add_segment_exec_offset (sp->base, sp) + sp->size) - return sp; - if ((sp = sp->next) == 0) - return 0; - } -} -#endif - -#endif /* !(defined(_WIN32) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX) */ - -/* Allocate a chunk of memory with the given size. Returns a pointer - to the writable address, and sets *CODE to the executable - corresponding virtual address. */ -void * -ffi_closure_alloc (size_t size, void **code) -{ - void *ptr; - - if (!code) - return NULL; - - ptr = FFI_CLOSURE_PTR (dlmalloc (size)); - - if (ptr) - { - msegmentptr seg = segment_holding (gm, ptr); - - *code = add_segment_exec_offset (ptr, seg); - } - - return ptr; -} - -void * -ffi_data_to_code_pointer (void *data) -{ - msegmentptr seg = segment_holding (gm, data); - /* We expect closures to be allocated with ffi_closure_alloc(), in - which case seg will be non-NULL. However, some users take on the - burden of managing this memory themselves, in which case this - we'll just return data. */ - if (seg) - return add_segment_exec_offset (data, seg); - else - return data; -} - -/* Release a chunk of memory allocated with ffi_closure_alloc. If - FFI_CLOSURE_FREE_CODE is nonzero, the given address can be the - writable or the executable address given. Otherwise, only the - writable address can be provided here. */ -void -ffi_closure_free (void *ptr) -{ -#if FFI_CLOSURE_FREE_CODE - msegmentptr seg = segment_holding_code (gm, ptr); - - if (seg) - ptr = sub_segment_exec_offset (ptr, seg); -#endif - - dlfree (FFI_RESTORE_PTR (ptr)); -} - -# else /* ! FFI_MMAP_EXEC_WRIT */ - -/* On many systems, memory returned by malloc is writable and - executable, so just use it. */ - -#include - -void * -ffi_closure_alloc (size_t size, void **code) -{ - if (!code) - return NULL; - - return *code = FFI_CLOSURE_PTR (malloc (size)); -} - -void -ffi_closure_free (void *ptr) -{ - free (FFI_RESTORE_PTR (ptr)); -} - -void * -ffi_data_to_code_pointer (void *data) -{ - return data; -} - -# endif /* ! FFI_MMAP_EXEC_WRIT */ -#endif /* FFI_CLOSURES */ - -#endif /* NetBSD with PROT_MPROTECT */ diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/cris/ffi.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/cris/ffi.c deleted file mode 100644 index 9011fde..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/cris/ffi.c +++ /dev/null @@ -1,386 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 1998 Cygnus Solutions - Copyright (c) 2004 Simon Posnjak - Copyright (c) 2005 Axis Communications AB - Copyright (C) 2007 Free Software Foundation, Inc. - - CRIS Foreign Function Interface - - 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 SIMON POSNJAK 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. - ----------------------------------------------------------------------- */ - -#include -#include - -#define STACK_ARG_SIZE(x) FFI_ALIGN(x, FFI_SIZEOF_ARG) - -static ffi_status -initialize_aggregate_packed_struct (ffi_type * arg) -{ - ffi_type **ptr; - - FFI_ASSERT (arg != NULL); - - FFI_ASSERT (arg->elements != NULL); - FFI_ASSERT (arg->size == 0); - FFI_ASSERT (arg->alignment == 0); - - ptr = &(arg->elements[0]); - - while ((*ptr) != NULL) - { - if (((*ptr)->size == 0) - && (initialize_aggregate_packed_struct ((*ptr)) != FFI_OK)) - return FFI_BAD_TYPEDEF; - - FFI_ASSERT (ffi_type_test ((*ptr))); - - arg->size += (*ptr)->size; - - arg->alignment = (arg->alignment > (*ptr)->alignment) ? - arg->alignment : (*ptr)->alignment; - - ptr++; - } - - if (arg->size == 0) - return FFI_BAD_TYPEDEF; - else - return FFI_OK; -} - -int -ffi_prep_args (char *stack, extended_cif * ecif) -{ - unsigned int i; - unsigned int struct_count = 0; - void **p_argv; - char *argp; - ffi_type **p_arg; - - argp = stack; - - p_argv = ecif->avalue; - - for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; - (i != 0); i--, p_arg++) - { - size_t z; - - switch ((*p_arg)->type) - { - case FFI_TYPE_STRUCT: - { - z = (*p_arg)->size; - if (z <= 4) - { - memcpy (argp, *p_argv, z); - z = 4; - } - else if (z <= 8) - { - memcpy (argp, *p_argv, z); - z = 8; - } - else - { - unsigned int uiLocOnStack; - z = sizeof (void *); - uiLocOnStack = 4 * ecif->cif->nargs + struct_count; - struct_count = struct_count + (*p_arg)->size; - *(unsigned int *) argp = - (unsigned int) (UINT32 *) (stack + uiLocOnStack); - memcpy ((stack + uiLocOnStack), *p_argv, (*p_arg)->size); - } - break; - } - default: - z = (*p_arg)->size; - if (z < sizeof (int)) - { - switch ((*p_arg)->type) - { - case FFI_TYPE_SINT8: - *(signed int *) argp = (signed int) *(SINT8 *) (*p_argv); - break; - - case FFI_TYPE_UINT8: - *(unsigned int *) argp = - (unsigned int) *(UINT8 *) (*p_argv); - break; - - case FFI_TYPE_SINT16: - *(signed int *) argp = (signed int) *(SINT16 *) (*p_argv); - break; - - case FFI_TYPE_UINT16: - *(unsigned int *) argp = - (unsigned int) *(UINT16 *) (*p_argv); - break; - - default: - FFI_ASSERT (0); - } - z = sizeof (int); - } - else if (z == sizeof (int)) - *(unsigned int *) argp = (unsigned int) *(UINT32 *) (*p_argv); - else - memcpy (argp, *p_argv, z); - break; - } - p_argv++; - argp += z; - } - - return (struct_count); -} - -ffi_status FFI_HIDDEN -ffi_prep_cif_core (ffi_cif * cif, - ffi_abi abi, unsigned int isvariadic, - unsigned int nfixedargs, unsigned int ntotalargs, - ffi_type * rtype, ffi_type ** atypes) -{ - unsigned bytes = 0; - unsigned int i; - ffi_type **ptr; - - FFI_ASSERT (cif != NULL); - FFI_ASSERT((!isvariadic) || (nfixedargs >= 1)); - FFI_ASSERT(nfixedargs <= ntotalargs); - FFI_ASSERT (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI); - - cif->abi = abi; - cif->arg_types = atypes; - cif->nargs = ntotalargs; - cif->rtype = rtype; - - cif->flags = 0; - - if ((cif->rtype->size == 0) - && (initialize_aggregate_packed_struct (cif->rtype) != FFI_OK)) - return FFI_BAD_TYPEDEF; - - FFI_ASSERT_VALID_TYPE (cif->rtype); - - for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) - { - if (((*ptr)->size == 0) - && (initialize_aggregate_packed_struct ((*ptr)) != FFI_OK)) - return FFI_BAD_TYPEDEF; - - FFI_ASSERT_VALID_TYPE (*ptr); - - if (((*ptr)->alignment - 1) & bytes) - bytes = FFI_ALIGN (bytes, (*ptr)->alignment); - if ((*ptr)->type == FFI_TYPE_STRUCT) - { - if ((*ptr)->size > 8) - { - bytes += (*ptr)->size; - bytes += sizeof (void *); - } - else - { - if ((*ptr)->size > 4) - bytes += 8; - else - bytes += 4; - } - } - else - bytes += STACK_ARG_SIZE ((*ptr)->size); - } - - cif->bytes = bytes; - - return ffi_prep_cif_machdep (cif); -} - -ffi_status -ffi_prep_cif_machdep (ffi_cif * cif) -{ - switch (cif->rtype->type) - { - case FFI_TYPE_VOID: - case FFI_TYPE_STRUCT: - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - cif->flags = (unsigned) cif->rtype->type; - break; - - default: - cif->flags = FFI_TYPE_INT; - break; - } - - return FFI_OK; -} - -extern void ffi_call_SYSV (int (*)(char *, extended_cif *), - extended_cif *, - unsigned, unsigned, unsigned *, void (*fn) ()) - __attribute__ ((__visibility__ ("hidden"))); - -void -ffi_call (ffi_cif * cif, void (*fn) (), void *rvalue, void **avalue) -{ - extended_cif ecif; - - ecif.cif = cif; - ecif.avalue = avalue; - - if ((rvalue == NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) - { - ecif.rvalue = alloca (cif->rtype->size); - } - else - ecif.rvalue = rvalue; - - switch (cif->abi) - { - case FFI_SYSV: - ffi_call_SYSV (ffi_prep_args, &ecif, cif->bytes, - cif->flags, ecif.rvalue, fn); - break; - default: - FFI_ASSERT (0); - break; - } -} - -/* Because the following variables are not exported outside libffi, we - mark them hidden. */ - -/* Assembly code for the jump stub. */ -extern const char ffi_cris_trampoline_template[] - __attribute__ ((__visibility__ ("hidden"))); - -/* Offset into ffi_cris_trampoline_template of where to put the - ffi_prep_closure_inner function. */ -extern const int ffi_cris_trampoline_fn_offset - __attribute__ ((__visibility__ ("hidden"))); - -/* Offset into ffi_cris_trampoline_template of where to put the - closure data. */ -extern const int ffi_cris_trampoline_closure_offset - __attribute__ ((__visibility__ ("hidden"))); - -/* This function is sibling-called (jumped to) by the closure - trampoline. We get R10..R13 at PARAMS[0..3] and a copy of [SP] at - PARAMS[4] to simplify handling of a straddling parameter. A copy - of R9 is at PARAMS[5] and SP at PARAMS[6]. These parameters are - put at the appropriate place in CLOSURE which is then executed and - the return value is passed back to the caller. */ - -static unsigned long long -ffi_prep_closure_inner (void **params, ffi_closure* closure) -{ - char *register_args = (char *) params; - void *struct_ret = params[5]; - char *stack_args = params[6]; - char *ptr = register_args; - ffi_cif *cif = closure->cif; - ffi_type **arg_types = cif->arg_types; - - /* Max room needed is number of arguments as 64-bit values. */ - void **avalue = alloca (closure->cif->nargs * sizeof(void *)); - int i; - int doing_regs; - long long llret = 0; - - /* Find the address of each argument. */ - for (i = 0, doing_regs = 1; i < cif->nargs; i++) - { - /* Types up to and including 8 bytes go by-value. */ - if (arg_types[i]->size <= 4) - { - avalue[i] = ptr; - ptr += 4; - } - else if (arg_types[i]->size <= 8) - { - avalue[i] = ptr; - ptr += 8; - } - else - { - FFI_ASSERT (arg_types[i]->type == FFI_TYPE_STRUCT); - - /* Passed by-reference, so copy the pointer. */ - avalue[i] = *(void **) ptr; - ptr += 4; - } - - /* If we've handled more arguments than fit in registers, start - looking at the those passed on the stack. Step over the - first one if we had a straddling parameter. */ - if (doing_regs && ptr >= register_args + 4*4) - { - ptr = stack_args + ((ptr > register_args + 4*4) ? 4 : 0); - doing_regs = 0; - } - } - - /* Invoke the closure. */ - (closure->fun) (cif, - - cif->rtype->type == FFI_TYPE_STRUCT - /* The caller allocated space for the return - structure, and passed a pointer to this space in - R9. */ - ? struct_ret - - /* We take advantage of being able to ignore that - the high part isn't set if the return value is - not in R10:R11, but in R10 only. */ - : (void *) &llret, - - avalue, closure->user_data); - - return llret; -} - -/* API function: Prepare the trampoline. */ - -ffi_status -ffi_prep_closure_loc (ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif *, void *, void **, void*), - void *user_data, - void *codeloc) -{ - void *innerfn = ffi_prep_closure_inner; - FFI_ASSERT (cif->abi == FFI_SYSV); - closure->cif = cif; - closure->user_data = user_data; - closure->fun = fun; - memcpy (closure->tramp, ffi_cris_trampoline_template, - FFI_CRIS_TRAMPOLINE_CODE_PART_SIZE); - memcpy (closure->tramp + ffi_cris_trampoline_fn_offset, - &innerfn, sizeof (void *)); - memcpy (closure->tramp + ffi_cris_trampoline_closure_offset, - &codeloc, sizeof (void *)); - - return FFI_OK; -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/cris/ffitarget.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/cris/ffitarget.h deleted file mode 100644 index b837e97..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/cris/ffitarget.h +++ /dev/null @@ -1,56 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - Copyright (c) 1996-2003 Red Hat, Inc. - Target configuration macros for CRIS. - - 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. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_SYSV, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_SYSV -} ffi_abi; -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_CRIS_TRAMPOLINE_CODE_PART_SIZE 36 -#define FFI_CRIS_TRAMPOLINE_DATA_PART_SIZE (7*4) -#define FFI_TRAMPOLINE_SIZE \ - (FFI_CRIS_TRAMPOLINE_CODE_PART_SIZE + FFI_CRIS_TRAMPOLINE_DATA_PART_SIZE) -#define FFI_NATIVE_RAW_API 0 - -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/cris/sysv.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/cris/sysv.S deleted file mode 100644 index 79abaee..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/cris/sysv.S +++ /dev/null @@ -1,215 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.S - Copyright (c) 2004 Simon Posnjak - Copyright (c) 2005 Axis Communications AB - - CRIS Foreign Function Interface - - 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 SIMON POSNJAK 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. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#define CONCAT(x,y) x ## y -#define XCONCAT(x,y) CONCAT (x, y) -#define L(x) XCONCAT (__USER_LABEL_PREFIX__, x) - - .text - - ;; OK, when we get called we should have this (according to - ;; AXIS ETRAX 100LX Programmer's Manual chapter 6.3). - ;; - ;; R10: ffi_prep_args (func. pointer) - ;; R11: &ecif - ;; R12: cif->bytes - ;; R13: fig->flags - ;; sp+0: ecif.rvalue - ;; sp+4: fn (function pointer to the function that we need to call) - - .globl L(ffi_call_SYSV) - .type L(ffi_call_SYSV),@function - .hidden L(ffi_call_SYSV) - -L(ffi_call_SYSV): - ;; Save the regs to the stack. - push $srp - ;; Used for stack pointer saving. - push $r6 - ;; Used for function address pointer. - push $r7 - ;; Used for stack pointer saving. - push $r8 - ;; We save fig->flags to stack we will need them after we - ;; call The Function. - push $r13 - - ;; Saving current stack pointer. - move.d $sp,$r8 - move.d $sp,$r6 - - ;; Move address of ffi_prep_args to r13. - move.d $r10,$r13 - - ;; Make room on the stack for the args of fn. - sub.d $r12,$sp - - ;; Function void ffi_prep_args(char *stack, extended_cif *ecif) parameters are: - ;; r10 <-- stack pointer - ;; r11 <-- &ecif (already there) - move.d $sp,$r10 - - ;; Call the function. - jsr $r13 - - ;; Save the size of the structures which are passed on stack. - move.d $r10,$r7 - - ;; Move first four args in to r10..r13. - move.d [$sp+0],$r10 - move.d [$sp+4],$r11 - move.d [$sp+8],$r12 - move.d [$sp+12],$r13 - - ;; Adjust the stack and check if any parameters are given on stack. - addq 16,$sp - sub.d $r7,$r6 - cmp.d $sp,$r6 - - bpl go_on - nop - -go_on_no_params_on_stack: - move.d $r6,$sp - -go_on: - ;; Discover if we need to put rval address in to r9. - move.d [$r8+0],$r7 - cmpq FFI_TYPE_STRUCT,$r7 - bne call_now - nop - - ;; Move rval address to $r9. - move.d [$r8+20],$r9 - -call_now: - ;; Move address of The Function in to r7. - move.d [$r8+24],$r7 - - ;; Call The Function. - jsr $r7 - - ;; Reset stack. - move.d $r8,$sp - - ;; Load rval type (fig->flags) in to r13. - pop $r13 - - ;; Detect rval type. - cmpq FFI_TYPE_VOID,$r13 - beq epilogue - - cmpq FFI_TYPE_STRUCT,$r13 - beq epilogue - - cmpq FFI_TYPE_DOUBLE,$r13 - beq return_double_or_longlong - - cmpq FFI_TYPE_UINT64,$r13 - beq return_double_or_longlong - - cmpq FFI_TYPE_SINT64,$r13 - beq return_double_or_longlong - nop - - ;; Just return the 32 bit value. - ba return - nop - -return_double_or_longlong: - ;; Load half of the rval to r10 and the other half to r11. - move.d [$sp+16],$r13 - move.d $r10,[$r13] - addq 4,$r13 - move.d $r11,[$r13] - ba epilogue - nop - -return: - ;; Load the rval to r10. - move.d [$sp+16],$r13 - move.d $r10,[$r13] - -epilogue: - pop $r8 - pop $r7 - pop $r6 - Jump [$sp+] - - .size ffi_call_SYSV,.-ffi_call_SYSV - -/* Save R10..R13 into an array, somewhat like varargs. Copy the next - argument too, to simplify handling of any straddling parameter. - Save R9 and SP after those. Jump to function handling the rest. - Since this is a template, copied and the main function filled in by - the user. */ - - .globl L(ffi_cris_trampoline_template) - .type L(ffi_cris_trampoline_template),@function - .hidden L(ffi_cris_trampoline_template) - -L(ffi_cris_trampoline_template): -0: - /* The value we get for "PC" is right after the prefix instruction, - two bytes from the beginning, i.e. 0b+2. */ - move.d $r10,[$pc+2f-(0b+2)] - move.d $pc,$r10 -1: - addq 2f-1b+4,$r10 - move.d $r11,[$r10+] - move.d $r12,[$r10+] - move.d $r13,[$r10+] - move.d [$sp],$r11 - move.d $r11,[$r10+] - move.d $r9,[$r10+] - move.d $sp,[$r10+] - subq FFI_CRIS_TRAMPOLINE_DATA_PART_SIZE,$r10 - move.d 0,$r11 -3: - jump 0 -2: - .size ffi_cris_trampoline_template,.-0b - -/* This macro create a constant usable as "extern const int \name" in - C from within libffi, when \name has no prefix decoration. */ - - .macro const name,value - .globl \name - .type \name,@object - .hidden \name -\name: - .dword \value - .size \name,4 - .endm - -/* Constants for offsets within the trampoline. We could do this with - just symbols, avoiding memory contents and memory accesses, but the - C usage code would look a bit stranger. */ - - const L(ffi_cris_trampoline_fn_offset),2b-4-0b - const L(ffi_cris_trampoline_closure_offset),3b-4-0b diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/csky/ffi.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/csky/ffi.c deleted file mode 100644 index af50b7c..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/csky/ffi.c +++ /dev/null @@ -1,395 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - - CSKY Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#include -#include - -#include - -/* ffi_prep_args is called by the assembly routine once stack space - has been allocated for the function's arguments -*/ -void ffi_prep_args(char *stack, extended_cif *ecif) -{ - register unsigned int i; - register void **p_argv; - register char *argp; - register ffi_type **p_arg; - - argp = stack; - - if ( ecif->cif->flags == FFI_TYPE_STRUCT ) { - *(void **) argp = ecif->rvalue; - argp += 4; - } - - p_argv = ecif->avalue; - - for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; - (i != 0); - i--, p_arg++) - { - size_t z; - size_t alignment; - - /* Align if necessary */ - alignment = (*p_arg)->alignment; -#ifdef __CSKYABIV1__ - /* - * Adapt ABIV1 bug. - * If struct's size is larger than 8 bytes, then it always alignment as 4 bytes. - */ - if (((*p_arg)->type == FFI_TYPE_STRUCT) && ((*p_arg)->size > 8) && (alignment == 8)) { - alignment = 4; - } -#endif - - if ((alignment - 1) & (unsigned) argp) { - argp = (char *) FFI_ALIGN(argp, alignment); - } - - if ((*p_arg)->type == FFI_TYPE_STRUCT) - argp = (char *) FFI_ALIGN(argp, 4); - - z = (*p_arg)->size; - if (z < sizeof(int)) - { - z = sizeof(int); - switch ((*p_arg)->type) - { - case FFI_TYPE_SINT8: - *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); - break; - - case FFI_TYPE_UINT8: - *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); - break; - - case FFI_TYPE_SINT16: - *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); - break; - - case FFI_TYPE_UINT16: - *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); - break; - - case FFI_TYPE_STRUCT: -#ifdef __CSKYBE__ - memcpy((argp + 4 - (*p_arg)->size), *p_argv, (*p_arg)->size); -#else - memcpy(argp, *p_argv, (*p_arg)->size); -#endif - break; - - default: - FFI_ASSERT(0); - } - } - else if (z == sizeof(int)) - { - *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); - } - else - { - memcpy(argp, *p_argv, z); - } - p_argv++; - argp += z; - } - - return; -} - -/* Perform machine dependent cif processing */ -ffi_status ffi_prep_cif_machdep(ffi_cif *cif) -{ - /* Round the stack up to a multiple of 8 bytes. This isn't needed - everywhere, but it is on some platforms, and it doesn't hcsky anything - when it isn't needed. */ - cif->bytes = (cif->bytes + 7) & ~7; - - /* Set the return type flag */ - switch (cif->rtype->type) - { - - case FFI_TYPE_DOUBLE: - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - cif->flags = (unsigned) FFI_TYPE_SINT64; - break; - - case FFI_TYPE_STRUCT: - if (cif->rtype->size <= 4) - /* A Composite Type not larger than 4 bytes is returned in r0. */ - cif->flags = (unsigned)FFI_TYPE_INT; - else if (cif->rtype->size <= 8) - /* A Composite Type not larger than 8 bytes is returned in r0, r1. */ - cif->flags = (unsigned)FFI_TYPE_SINT64; - else - /* A Composite Type larger than 8 bytes, or whose size cannot - be determined statically ... is stored in memory at an - address passed [in r0]. */ - cif->flags = (unsigned)FFI_TYPE_STRUCT; - break; - - default: - cif->flags = FFI_TYPE_INT; - break; - } - - return FFI_OK; -} - -/* Perform machine dependent cif processing for variadic calls */ -ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif, - unsigned int nfixedargs, - unsigned int ntotalargs) -{ - return ffi_prep_cif_machdep(cif); -} - -/* Prototypes for assembly functions, in sysv.S */ -extern void ffi_call_SYSV (void (*fn)(void), extended_cif *, unsigned, unsigned, unsigned *); - -void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - extended_cif ecif; - - int small_struct = (cif->flags == FFI_TYPE_INT - && cif->rtype->type == FFI_TYPE_STRUCT); - - ecif.cif = cif; - ecif.avalue = avalue; - - unsigned int temp; - - /* If the return value is a struct and we don't have a return */ - /* value address then we need to make one */ - - if ((rvalue == NULL) && - (cif->flags == FFI_TYPE_STRUCT)) - { - ecif.rvalue = alloca(cif->rtype->size); - } - else if (small_struct) - ecif.rvalue = &temp; - else - ecif.rvalue = rvalue; - - switch (cif->abi) - { - case FFI_SYSV: - ffi_call_SYSV (fn, &ecif, cif->bytes, cif->flags, ecif.rvalue); - break; - - default: - FFI_ASSERT(0); - break; - } - if (small_struct) -#ifdef __CSKYBE__ - memcpy (rvalue, ((unsigned char *)&temp + (4 - cif->rtype->size)), cif->rtype->size); -#else - memcpy (rvalue, &temp, cif->rtype->size); -#endif -} - -/** private members **/ - -static void ffi_prep_incoming_args_SYSV (char *stack, void **ret, - void** args, ffi_cif* cif); - -void ffi_closure_SYSV (ffi_closure *); - -/* This function is jumped to by the trampoline */ - -unsigned int -ffi_closure_SYSV_inner (closure, respp, args) - ffi_closure *closure; - void **respp; - void *args; -{ - // our various things... - ffi_cif *cif; - void **arg_area; - - cif = closure->cif; - arg_area = (void**) alloca (cif->nargs * sizeof (void*)); - - /* this call will initialize ARG_AREA, such that each - * element in that array points to the corresponding - * value on the stack; and if the function returns - * a structure, it will re-set RESP to point to the - * structure return address. */ - - ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif); - - (closure->fun) (cif, *respp, arg_area, closure->user_data); - -#ifdef __CSKYBE__ - if (cif->flags == FFI_TYPE_INT && cif->rtype->type == FFI_TYPE_STRUCT) { - unsigned int tmp = 0; - tmp = *(unsigned int *)(*respp); - *(unsigned int *)(*respp) = (tmp >> ((4 - cif->rtype->size) * 8)); - } -#endif - - return cif->flags; -} - - -static void -ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, - void **avalue, ffi_cif *cif) -{ - register unsigned int i; - register void **p_argv; - register char *argp; - register ffi_type **p_arg; - - argp = stack; - - if ( cif->flags == FFI_TYPE_STRUCT ) { - *rvalue = *(void **) argp; - argp += 4; - } - - p_argv = avalue; - - for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) - { - size_t z; - size_t alignment; - - alignment = (*p_arg)->alignment; - if (alignment < 4) - alignment = 4; - -#ifdef __CSKYABIV1__ - /* - * Adapt ABIV1 bug. - * If struct's size is larger than 8 bytes, then it always alignment as 4 bytes. - */ - if (((*p_arg)->type == FFI_TYPE_STRUCT) && ((*p_arg)->size > 8) && (alignment == 8)) { - alignment = 4; - } -#endif - - /* Align if necessary */ - if ((alignment - 1) & (unsigned) argp) { - argp = (char *) FFI_ALIGN(argp, alignment); - } - - z = (*p_arg)->size; - -#ifdef __CSKYBE__ - unsigned int tmp = 0; - if ((*p_arg)->size < 4) { - tmp = *(unsigned int *)argp; - memcpy(argp, ((unsigned char *)&tmp + (4 - (*p_arg)->size)), (*p_arg)->size); - } -#else - /* because we're little endian, this is what it turns into. */ -#endif - *p_argv = (void*) argp; - - p_argv++; - argp += z; - } - - return; -} - -/* How to make a trampoline. */ - -extern unsigned char ffi_csky_trampoline[TRAMPOLINE_SIZE]; - -/* - * Since there is no __clear_cache in libgcc in csky toolchain. - * define ffi_csky_cacheflush in sysv.S. - * void ffi_csky_cacheflush(uint32 start_addr, uint32 size, int cache) - */ -#define CACHEFLUSH_IN_FFI 1 -#if CACHEFLUSH_IN_FFI -extern void ffi_csky_cacheflush(unsigned char *__tramp, unsigned int k, - int i); -#define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX) \ -({ unsigned char *__tramp = (unsigned char*)(TRAMP); \ - unsigned int __fun = (unsigned int)(FUN); \ - unsigned int __ctx = (unsigned int)(CTX); \ - unsigned char *insns = (unsigned char *)(CTX); \ - memcpy (__tramp, ffi_csky_trampoline, TRAMPOLINE_SIZE); \ - *(unsigned int*) &__tramp[TRAMPOLINE_SIZE] = __ctx; \ - *(unsigned int*) &__tramp[TRAMPOLINE_SIZE + 4] = __fun; \ - ffi_csky_cacheflush(&__tramp[0], TRAMPOLINE_SIZE, 3); /* Clear data mapping. */ \ - ffi_csky_cacheflush(insns, TRAMPOLINE_SIZE, 3); \ - /* Clear instruction \ - mapping. */ \ - }) -#else -#define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX) \ -({ unsigned char *__tramp = (unsigned char*)(TRAMP); \ - unsigned int __fun = (unsigned int)(FUN); \ - unsigned int __ctx = (unsigned int)(CTX); \ - unsigned char *insns = (unsigned char *)(CTX); \ - memcpy (__tramp, ffi_csky_trampoline, TRAMPOLINE_SIZE); \ - *(unsigned int*) &__tramp[TRAMPOLINE_SIZE] = __ctx; \ - *(unsigned int*) &__tramp[TRAMPOLINE_SIZE + 4] = __fun; \ - __clear_cache((&__tramp[0]), (&__tramp[TRAMPOLINE_SIZE-1])); /* Clear data mapping. */ \ - __clear_cache(insns, insns + TRAMPOLINE_SIZE); \ - /* Clear instruction \ - mapping. */ \ - }) -#endif - -/* the cif must already be prep'ed */ - -ffi_status -ffi_prep_closure_loc (ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*,void*,void**,void*), - void *user_data, - void *codeloc) -{ - void (*closure_func)(ffi_closure*) = NULL; - - if (cif->abi == FFI_SYSV) - closure_func = &ffi_closure_SYSV; - else - return FFI_BAD_ABI; - - FFI_INIT_TRAMPOLINE (&closure->tramp[0], \ - closure_func, \ - codeloc); - - closure->cif = cif; - closure->user_data = user_data; - closure->fun = fun; - - return FFI_OK; -} - - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/csky/ffitarget.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/csky/ffitarget.h deleted file mode 100644 index f770aac..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/csky/ffitarget.h +++ /dev/null @@ -1,63 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - Copyright (c) 2010 CodeSourcery - Copyright (c) 1996-2003 Red Hat, Inc. - - Target configuration macros for CSKY. - - 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. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_SYSV, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_SYSV, -} ffi_abi; -#endif - -#ifdef __CSKYABIV2__ -#define FFI_ASM_ARGREG_SIZE 16 -#define TRAMPOLINE_SIZE 16 -#define FFI_TRAMPOLINE_SIZE 24 -#else -#define FFI_ASM_ARGREG_SIZE 24 -#define TRAMPOLINE_SIZE 20 -#define FFI_TRAMPOLINE_SIZE 28 -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_NATIVE_RAW_API 0 -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/csky/sysv.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/csky/sysv.S deleted file mode 100644 index 21670bf..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/csky/sysv.S +++ /dev/null @@ -1,371 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.S - - CSKY Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include - -.macro CSKY_FUNC_START name - .text - .align 2 - .globl \name - .type \name, @function - \name: -.endm - -#ifdef __CSKYABIV2__ - - /* - * a0: fn - * a1: &ecif - * a2: cif->bytes - * a3: fig->flags - * sp+0: ecif.rvalue - */ -CSKY_FUNC_START ffi_call_SYSV - /* Save registers */ - .cfi_startproc - subi sp, 28 - .cfi_def_cfa_offset 28 - stw a0, (sp, 0x0) - .cfi_offset 0, -28 - stw a1, (sp, 0x4) - .cfi_offset 1, -24 - stw a2, (sp, 0x8) - .cfi_offset 2, -20 - stw a3, (sp, 0xC) - .cfi_offset 3, -16 - stw l0, (sp, 0x10) - .cfi_offset 4, -12 - stw l1, (sp, 0x14) - .cfi_offset 5, -8 - stw lr, (sp, 0x18) - .cfi_offset 15, -4 - - mov l0, sp - .cfi_def_cfa_register 4 - - /* Make room for all of the new args. */ - subu sp, sp, a2 - - /* Place all of the ffi_prep_args in position */ - mov a0, sp - /* a1 already set */ - - /* Call ffi_prep_args(stack, &ecif) */ - jsri ffi_prep_args - - /* move first 4 parameters in registers */ - ldw a0, (sp, 0x0) - ldw a1, (sp, 0x4) - ldw a2, (sp, 0x8) - ldw a3, (sp, 0xC) - - /* and adjust stack */ - subu lr, l0, sp /* cif->bytes == l0 - sp */ - cmphsi lr, 16 - movi l1, 16 - movt lr, l1 - addu sp, sp, lr - - ldw l1, (l0, 0) /* load fn() in advance */ - - /* call (fn) (...) */ - jsr l1 - - /* Remove the space we pushed for the args */ - mov sp, l0 - - /* Load r2 with the pointer to storage for the return value */ - ldw a2, (sp, 0x1C) - - /* Load r3 with the return type code */ - ldw a3, (sp, 0xC) - - /* If the return value pointer is NULL, assume no return value. */ - cmpnei a2, 0 - bf .Lepilogue - - cmpnei a3, FFI_TYPE_STRUCT - bf .Lepilogue - - /* return INT64 */ - cmpnei a3, FFI_TYPE_SINT64 - bt .Lretint - /* stw a0, (a2, 0x0) at .Lretint */ - stw a1, (a2, 0x4) - -.Lretint: - /* return INT */ - stw a0, (a2, 0x0) - -.Lepilogue: - ldw a0, (sp, 0x0) - ldw a1, (sp, 0x4) - ldw a2, (sp, 0x8) - ldw a3, (sp, 0xC) - ldw l0, (sp, 0x10) - ldw l1, (sp, 0x14) - ldw lr, (sp, 0x18) - addi sp, sp, 28 - rts - .cfi_endproc - .size ffi_call_SYSV, .-ffi_call_SYSV - - - /* - * unsigned int FFI_HIDDEN - * ffi_closure_SYSV_inner (closure, respp, args) - * ffi_closure *closure; - * void **respp; - * void *args; - */ -CSKY_FUNC_START ffi_closure_SYSV - .cfi_startproc - mov a2, sp - addi a1, sp, 16 - subi sp, sp, 24 - .cfi_def_cfa_offset 40 - stw a1, (sp, 0x10) - .cfi_offset 1, -24 - stw lr, (sp, 0x14) - .cfi_offset 15, -20 - stw sp, (sp, 0x8) - addi a1, sp, 8 - jsri ffi_closure_SYSV_inner - ldw a0, (sp, 0x0) - /* - * if FFI_TYPE_SINT64, need a1. - * if FFI_TYPE_INT, ignore a1. - */ - ldw a1, (sp, 0x4) - - ldw lr, (sp, 0x14) - addi sp, sp, 40 - rts - .cfi_endproc - .size ffi_closure_SYSV, .-ffi_closure_SYSV - -CSKY_FUNC_START ffi_csky_trampoline - subi sp, sp, 16 - stw a0, (sp, 0x0) - stw a1, (sp, 0x4) - stw a2, (sp, 0x8) - stw a3, (sp, 0xC) - lrw a0, [.Lctx] - lrw a1, [.Lfun] - jmp a1 -.Lctx: - mov a0, a0 - mov a0, a0 -.Lfun: - - .size ffi_csky_trampoline, .-ffi_csky_trampoline - -CSKY_FUNC_START ffi_csky_cacheflush - mov t0, r7 - movi r7, 123 - trap 0 - mov r7, t0 - rts - - .size ffi_csky_cacheflush, .-ffi_csky_cacheflush - -#else /* !__CSKYABIV2__ */ - - /* - * a0: fn - * a1: &ecif - * a2: cif->bytes - * a3: fig->flags - * a4: ecif.rvalue - */ -CSKY_FUNC_START ffi_call_SYSV - /* Save registers */ - .cfi_startproc - subi sp, 32 - subi sp, 8 - .cfi_def_cfa_offset 40 - stw a0, (sp, 0x0) - .cfi_offset 2, -40 - stw a1, (sp, 0x4) - .cfi_offset 3, -36 - stw a2, (sp, 0x8) - .cfi_offset 4, -32 - stw a3, (sp, 0xC) - .cfi_offset 5, -28 - stw a4, (sp, 0x10) - .cfi_offset 6, -24 - stw a5, (sp, 0x14) - .cfi_offset 7, -20 - stw l0, (sp, 0x18) - .cfi_offset 8, -16 - stw l1, (sp, 0x1C) - .cfi_offset 9, -12 - stw lr, (sp, 0x20) - .cfi_offset 15, -8 - - mov l0, sp - .cfi_def_cfa_register 8 - - /* Make room for all of the new args. */ - subu sp, sp, a2 - - /* Place all of the ffi_prep_args in position */ - mov a0, sp - /* a1 already set */ - - /* Call ffi_prep_args(stack, &ecif) */ - jsri ffi_prep_args - - /* move first 4 parameters in registers */ - ldw a0, (sp, 0x0) - ldw a1, (sp, 0x4) - ldw a2, (sp, 0x8) - ldw a3, (sp, 0xC) - ldw a4, (sp, 0x10) - ldw a5, (sp, 0x14) - - /* and adjust stack */ - mov lr, l0 - subu lr, sp /* cif->bytes == l0 - sp */ - movi l1, 24 - cmphs lr, l1 - movt lr, l1 - addu sp, sp, lr - - ldw l1, (l0, 0) /* load fn() in advance */ - - /* call (fn) (...) */ - jsr l1 - - /* Remove the space we pushed for the args */ - mov sp, l0 - - /* Load r2 with the pointer to storage for the return value */ - ldw a2, (sp, 0x10) - - /* Load r3 with the return type code */ - ldw a3, (sp, 0xC) - - /* If the return value pointer is NULL, assume no return value. */ - cmpnei a2, 0 - bf .Lepilogue - - cmpnei a3, FFI_TYPE_STRUCT - bf .Lepilogue - - /* return INT64 */ - cmpnei a3, FFI_TYPE_SINT64 - bt .Lretint - /* stw a0, (a2, 0x0) at .Lretint */ - stw a1, (a2, 0x4) - -.Lretint: - /* return INT */ - stw a0, (a2, 0x0) - -.Lepilogue: - ldw a0, (sp, 0x0) - ldw a1, (sp, 0x4) - ldw a2, (sp, 0x8) - ldw a3, (sp, 0xC) - ldw a4, (sp, 0x10) - ldw a5, (sp, 0x14) - ldw l0, (sp, 0x18) - ldw l1, (sp, 0x1C) - ldw lr, (sp, 0x20) - addi sp, sp, 32 - addi sp, sp, 8 - rts - .cfi_endproc - - .size ffi_call_SYSV, .-ffi_call_SYSV - - - /* - * unsigned int FFI_HIDDEN - * ffi_closure_SYSV_inner (closure, respp, args) - * ffi_closure *closure; - * void **respp; - * void *args; - */ -CSKY_FUNC_START ffi_closure_SYSV - .cfi_startproc - mov a2, sp - mov a1, sp - addi a1, 24 - subi sp, sp, 24 - .cfi_def_cfa_offset 48 - stw a1, (sp, 0x10) - .cfi_offset 3, -32 - stw lr, (sp, 0x14) - .cfi_offset 15, -28 - stw sp, (sp, 0x8) - mov a1, sp - addi a1, 8 - jsri ffi_closure_SYSV_inner - ldw a0, (sp, 0x0) - /* - * if FFI_TYPE_SINT64, need a1. - * if FFI_TYPE_INT, ignore a1. - */ - ldw a1, (sp, 0x4) - - ldw lr, (sp, 0x14) - addi sp, sp, 24 - addi sp, sp, 24 - rts - .cfi_endproc - - .size ffi_closure_SYSV, .-ffi_closure_SYSV - -CSKY_FUNC_START ffi_csky_trampoline - subi sp, 24 - stw a0, (sp, 0x0) - stw a1, (sp, 0x4) - stw a2, (sp, 0x8) - stw a3, (sp, 0xC) - stw a4, (sp, 0x10) - stw a5, (sp, 0x14) - lrw a0, [.Lctx] - lrw a1, [.Lfun] - jmp a1 -.Lctx: - mov a0, a0 - mov a0, a0 -.Lfun: - - .size ffi_csky_trampoline, .-ffi_csky_trampoline - -CSKY_FUNC_START ffi_csky_cacheflush - lrw r1, 123 - trap 0 - rts - - .size ffi_csky_cacheflush, .-ffi_csky_cacheflush - -#endif /* __CSKYABIV2__ */ diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/debug.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/debug.c deleted file mode 100644 index f3172b1..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/debug.c +++ /dev/null @@ -1,64 +0,0 @@ -/* ----------------------------------------------------------------------- - debug.c - Copyright (c) 1996 Red Hat, Inc. - - 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. - ----------------------------------------------------------------------- */ - -#include -#include -#include -#include - -/* General debugging routines */ - -void ffi_stop_here(void) -{ - /* This function is only useful for debugging purposes. - Place a breakpoint on ffi_stop_here to be notified of - significant events. */ -} - -/* This function should only be called via the FFI_ASSERT() macro */ - -void ffi_assert(char *expr, char *file, int line) -{ - fprintf(stderr, "ASSERTION FAILURE: %s at %s:%d\n", expr, file, line); - ffi_stop_here(); - abort(); -} - -/* Perform a sanity check on an ffi_type structure */ - -void ffi_type_test(ffi_type *a, char *file, int line) -{ - FFI_ASSERT_AT(a != NULL, file, line); - - FFI_ASSERT_AT(a->type <= FFI_TYPE_LAST, file, line); - FFI_ASSERT_AT(a->type == FFI_TYPE_VOID || a->size > 0, file, line); - FFI_ASSERT_AT(a->type == FFI_TYPE_VOID || a->alignment > 0, file, line); - FFI_ASSERT_AT((a->type != FFI_TYPE_STRUCT && a->type != FFI_TYPE_COMPLEX) - || a->elements != NULL, file, line); - FFI_ASSERT_AT(a->type != FFI_TYPE_COMPLEX - || (a->elements != NULL - && a->elements[0] != NULL && a->elements[1] == NULL), - file, line); - -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/dlmalloc.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/dlmalloc.c deleted file mode 100644 index 1aba657..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/dlmalloc.c +++ /dev/null @@ -1,5166 +0,0 @@ -/* - This is a version (aka dlmalloc) of malloc/free/realloc written by - Doug Lea and released to the public domain, as explained at - http://creativecommons.org/licenses/publicdomain. Send questions, - comments, complaints, performance data, etc to dl@cs.oswego.edu - -* Version 2.8.3 Thu Sep 22 11:16:15 2005 Doug Lea (dl at gee) - - Note: There may be an updated version of this malloc obtainable at - ftp://gee.cs.oswego.edu/pub/misc/malloc.c - Check before installing! - -* Quickstart - - This library is all in one file to simplify the most common usage: - ftp it, compile it (-O3), and link it into another program. All of - the compile-time options default to reasonable values for use on - most platforms. You might later want to step through various - compile-time and dynamic tuning options. - - For convenience, an include file for code using this malloc is at: - ftp://gee.cs.oswego.edu/pub/misc/malloc-2.8.3.h - You don't really need this .h file unless you call functions not - defined in your system include files. The .h file contains only the - excerpts from this file needed for using this malloc on ANSI C/C++ - systems, so long as you haven't changed compile-time options about - naming and tuning parameters. If you do, then you can create your - own malloc.h that does include all settings by cutting at the point - indicated below. Note that you may already by default be using a C - library containing a malloc that is based on some version of this - malloc (for example in linux). You might still want to use the one - in this file to customize settings or to avoid overheads associated - with library versions. - -* Vital statistics: - - Supported pointer/size_t representation: 4 or 8 bytes - size_t MUST be an unsigned type of the same width as - pointers. (If you are using an ancient system that declares - size_t as a signed type, or need it to be a different width - than pointers, you can use a previous release of this malloc - (e.g. 2.7.2) supporting these.) - - Alignment: 8 bytes (default) - This suffices for nearly all current machines and C compilers. - However, you can define MALLOC_ALIGNMENT to be wider than this - if necessary (up to 128bytes), at the expense of using more space. - - Minimum overhead per allocated chunk: 4 or 8 bytes (if 4byte sizes) - 8 or 16 bytes (if 8byte sizes) - Each malloced chunk has a hidden word of overhead holding size - and status information, and additional cross-check word - if FOOTERS is defined. - - Minimum allocated size: 4-byte ptrs: 16 bytes (including overhead) - 8-byte ptrs: 32 bytes (including overhead) - - Even a request for zero bytes (i.e., malloc(0)) returns a - pointer to something of the minimum allocatable size. - The maximum overhead wastage (i.e., number of extra bytes - allocated than were requested in malloc) is less than or equal - to the minimum size, except for requests >= mmap_threshold that - are serviced via mmap(), where the worst case wastage is about - 32 bytes plus the remainder from a system page (the minimal - mmap unit); typically 4096 or 8192 bytes. - - Security: static-safe; optionally more or less - The "security" of malloc refers to the ability of malicious - code to accentuate the effects of errors (for example, freeing - space that is not currently malloc'ed or overwriting past the - ends of chunks) in code that calls malloc. This malloc - guarantees not to modify any memory locations below the base of - heap, i.e., static variables, even in the presence of usage - errors. The routines additionally detect most improper frees - and reallocs. All this holds as long as the static bookkeeping - for malloc itself is not corrupted by some other means. This - is only one aspect of security -- these checks do not, and - cannot, detect all possible programming errors. - - If FOOTERS is defined nonzero, then each allocated chunk - carries an additional check word to verify that it was malloced - from its space. These check words are the same within each - execution of a program using malloc, but differ across - executions, so externally crafted fake chunks cannot be - freed. This improves security by rejecting frees/reallocs that - could corrupt heap memory, in addition to the checks preventing - writes to statics that are always on. This may further improve - security at the expense of time and space overhead. (Note that - FOOTERS may also be worth using with MSPACES.) - - By default detected errors cause the program to abort (calling - "abort()"). You can override this to instead proceed past - errors by defining PROCEED_ON_ERROR. In this case, a bad free - has no effect, and a malloc that encounters a bad address - caused by user overwrites will ignore the bad address by - dropping pointers and indices to all known memory. This may - be appropriate for programs that should continue if at all - possible in the face of programming errors, although they may - run out of memory because dropped memory is never reclaimed. - - If you don't like either of these options, you can define - CORRUPTION_ERROR_ACTION and USAGE_ERROR_ACTION to do anything - else. And if if you are sure that your program using malloc has - no errors or vulnerabilities, you can define INSECURE to 1, - which might (or might not) provide a small performance improvement. - - Thread-safety: NOT thread-safe unless USE_LOCKS defined - When USE_LOCKS is defined, each public call to malloc, free, - etc is surrounded with either a pthread mutex or a win32 - spinlock (depending on WIN32). This is not especially fast, and - can be a major bottleneck. It is designed only to provide - minimal protection in concurrent environments, and to provide a - basis for extensions. If you are using malloc in a concurrent - program, consider instead using ptmalloc, which is derived from - a version of this malloc. (See http://www.malloc.de). - - System requirements: Any combination of MORECORE and/or MMAP/MUNMAP - This malloc can use unix sbrk or any emulation (invoked using - the CALL_MORECORE macro) and/or mmap/munmap or any emulation - (invoked using CALL_MMAP/CALL_MUNMAP) to get and release system - memory. On most unix systems, it tends to work best if both - MORECORE and MMAP are enabled. On Win32, it uses emulations - based on VirtualAlloc. It also uses common C library functions - like memset. - - Compliance: I believe it is compliant with the Single Unix Specification - (See http://www.unix.org). Also SVID/XPG, ANSI C, and probably - others as well. - -* Overview of algorithms - - This is not the fastest, most space-conserving, most portable, or - most tunable malloc ever written. However it is among the fastest - while also being among the most space-conserving, portable and - tunable. Consistent balance across these factors results in a good - general-purpose allocator for malloc-intensive programs. - - In most ways, this malloc is a best-fit allocator. Generally, it - chooses the best-fitting existing chunk for a request, with ties - broken in approximately least-recently-used order. (This strategy - normally maintains low fragmentation.) However, for requests less - than 256bytes, it deviates from best-fit when there is not an - exactly fitting available chunk by preferring to use space adjacent - to that used for the previous small request, as well as by breaking - ties in approximately most-recently-used order. (These enhance - locality of series of small allocations.) And for very large requests - (>= 256Kb by default), it relies on system memory mapping - facilities, if supported. (This helps avoid carrying around and - possibly fragmenting memory used only for large chunks.) - - All operations (except malloc_stats and mallinfo) have execution - times that are bounded by a constant factor of the number of bits in - a size_t, not counting any clearing in calloc or copying in realloc, - or actions surrounding MORECORE and MMAP that have times - proportional to the number of non-contiguous regions returned by - system allocation routines, which is often just 1. - - The implementation is not very modular and seriously overuses - macros. Perhaps someday all C compilers will do as good a job - inlining modular code as can now be done by brute-force expansion, - but now, enough of them seem not to. - - Some compilers issue a lot of warnings about code that is - dead/unreachable only on some platforms, and also about intentional - uses of negation on unsigned types. All known cases of each can be - ignored. - - For a longer but out of date high-level description, see - http://gee.cs.oswego.edu/dl/html/malloc.html - -* MSPACES - If MSPACES is defined, then in addition to malloc, free, etc., - this file also defines mspace_malloc, mspace_free, etc. These - are versions of malloc routines that take an "mspace" argument - obtained using create_mspace, to control all internal bookkeeping. - If ONLY_MSPACES is defined, only these versions are compiled. - So if you would like to use this allocator for only some allocations, - and your system malloc for others, you can compile with - ONLY_MSPACES and then do something like... - static mspace mymspace = create_mspace(0,0); // for example - #define mymalloc(bytes) mspace_malloc(mymspace, bytes) - - (Note: If you only need one instance of an mspace, you can instead - use "USE_DL_PREFIX" to relabel the global malloc.) - - You can similarly create thread-local allocators by storing - mspaces as thread-locals. For example: - static __thread mspace tlms = 0; - void* tlmalloc(size_t bytes) { - if (tlms == 0) tlms = create_mspace(0, 0); - return mspace_malloc(tlms, bytes); - } - void tlfree(void* mem) { mspace_free(tlms, mem); } - - Unless FOOTERS is defined, each mspace is completely independent. - You cannot allocate from one and free to another (although - conformance is only weakly checked, so usage errors are not always - caught). If FOOTERS is defined, then each chunk carries around a tag - indicating its originating mspace, and frees are directed to their - originating spaces. - - ------------------------- Compile-time options --------------------------- - -Be careful in setting #define values for numerical constants of type -size_t. On some systems, literal values are not automatically extended -to size_t precision unless they are explicitly casted. - -WIN32 default: defined if _WIN32 defined - Defining WIN32 sets up defaults for MS environment and compilers. - Otherwise defaults are for unix. - -MALLOC_ALIGNMENT default: (size_t)8 - Controls the minimum alignment for malloc'ed chunks. It must be a - power of two and at least 8, even on machines for which smaller - alignments would suffice. It may be defined as larger than this - though. Note however that code and data structures are optimized for - the case of 8-byte alignment. - -MSPACES default: 0 (false) - If true, compile in support for independent allocation spaces. - This is only supported if HAVE_MMAP is true. - -ONLY_MSPACES default: 0 (false) - If true, only compile in mspace versions, not regular versions. - -USE_LOCKS default: 0 (false) - Causes each call to each public routine to be surrounded with - pthread or WIN32 mutex lock/unlock. (If set true, this can be - overridden on a per-mspace basis for mspace versions.) - -FOOTERS default: 0 - If true, provide extra checking and dispatching by placing - information in the footers of allocated chunks. This adds - space and time overhead. - -INSECURE default: 0 - If true, omit checks for usage errors and heap space overwrites. - -USE_DL_PREFIX default: NOT defined - Causes compiler to prefix all public routines with the string 'dl'. - This can be useful when you only want to use this malloc in one part - of a program, using your regular system malloc elsewhere. - -ABORT default: defined as abort() - Defines how to abort on failed checks. On most systems, a failed - check cannot die with an "assert" or even print an informative - message, because the underlying print routines in turn call malloc, - which will fail again. Generally, the best policy is to simply call - abort(). It's not very useful to do more than this because many - errors due to overwriting will show up as address faults (null, odd - addresses etc) rather than malloc-triggered checks, so will also - abort. Also, most compilers know that abort() does not return, so - can better optimize code conditionally calling it. - -PROCEED_ON_ERROR default: defined as 0 (false) - Controls whether detected bad addresses cause them to bypassed - rather than aborting. If set, detected bad arguments to free and - realloc are ignored. And all bookkeeping information is zeroed out - upon a detected overwrite of freed heap space, thus losing the - ability to ever return it from malloc again, but enabling the - application to proceed. If PROCEED_ON_ERROR is defined, the - static variable malloc_corruption_error_count is compiled in - and can be examined to see if errors have occurred. This option - generates slower code than the default abort policy. - -DEBUG default: NOT defined - The DEBUG setting is mainly intended for people trying to modify - this code or diagnose problems when porting to new platforms. - However, it may also be able to better isolate user errors than just - using runtime checks. The assertions in the check routines spell - out in more detail the assumptions and invariants underlying the - algorithms. The checking is fairly extensive, and will slow down - execution noticeably. Calling malloc_stats or mallinfo with DEBUG - set will attempt to check every non-mmapped allocated and free chunk - in the course of computing the summaries. - -ABORT_ON_ASSERT_FAILURE default: defined as 1 (true) - Debugging assertion failures can be nearly impossible if your - version of the assert macro causes malloc to be called, which will - lead to a cascade of further failures, blowing the runtime stack. - ABORT_ON_ASSERT_FAILURE cause assertions failures to call abort(), - which will usually make debugging easier. - -MALLOC_FAILURE_ACTION default: sets errno to ENOMEM, or no-op on win32 - The action to take before "return 0" when malloc fails to be able to - return memory because there is none available. - -HAVE_MORECORE default: 1 (true) unless win32 or ONLY_MSPACES - True if this system supports sbrk or an emulation of it. - -MORECORE default: sbrk - The name of the sbrk-style system routine to call to obtain more - memory. See below for guidance on writing custom MORECORE - functions. The type of the argument to sbrk/MORECORE varies across - systems. It cannot be size_t, because it supports negative - arguments, so it is normally the signed type of the same width as - size_t (sometimes declared as "intptr_t"). It doesn't much matter - though. Internally, we only call it with arguments less than half - the max value of a size_t, which should work across all reasonable - possibilities, although sometimes generating compiler warnings. See - near the end of this file for guidelines for creating a custom - version of MORECORE. - -MORECORE_CONTIGUOUS default: 1 (true) - If true, take advantage of fact that consecutive calls to MORECORE - with positive arguments always return contiguous increasing - addresses. This is true of unix sbrk. It does not hurt too much to - set it true anyway, since malloc copes with non-contiguities. - Setting it false when definitely non-contiguous saves time - and possibly wasted space it would take to discover this though. - -MORECORE_CANNOT_TRIM default: NOT defined - True if MORECORE cannot release space back to the system when given - negative arguments. This is generally necessary only if you are - using a hand-crafted MORECORE function that cannot handle negative - arguments. - -HAVE_MMAP default: 1 (true) - True if this system supports mmap or an emulation of it. If so, and - HAVE_MORECORE is not true, MMAP is used for all system - allocation. If set and HAVE_MORECORE is true as well, MMAP is - primarily used to directly allocate very large blocks. It is also - used as a backup strategy in cases where MORECORE fails to provide - space from system. Note: A single call to MUNMAP is assumed to be - able to unmap memory that may have be allocated using multiple calls - to MMAP, so long as they are adjacent. - -HAVE_MREMAP default: 1 on linux, else 0 - If true realloc() uses mremap() to re-allocate large blocks and - extend or shrink allocation spaces. - -MMAP_CLEARS default: 1 on unix - True if mmap clears memory so calloc doesn't need to. This is true - for standard unix mmap using /dev/zero. - -USE_BUILTIN_FFS default: 0 (i.e., not used) - Causes malloc to use the builtin ffs() function to compute indices. - Some compilers may recognize and intrinsify ffs to be faster than the - supplied C version. Also, the case of x86 using gcc is special-cased - to an asm instruction, so is already as fast as it can be, and so - this setting has no effect. (On most x86s, the asm version is only - slightly faster than the C version.) - -malloc_getpagesize default: derive from system includes, or 4096. - The system page size. To the extent possible, this malloc manages - memory from the system in page-size units. This may be (and - usually is) a function rather than a constant. This is ignored - if WIN32, where page size is determined using getSystemInfo during - initialization. - -USE_DEV_RANDOM default: 0 (i.e., not used) - Causes malloc to use /dev/random to initialize secure magic seed for - stamping footers. Otherwise, the current time is used. - -NO_MALLINFO default: 0 - If defined, don't compile "mallinfo". This can be a simple way - of dealing with mismatches between system declarations and - those in this file. - -MALLINFO_FIELD_TYPE default: size_t - The type of the fields in the mallinfo struct. This was originally - defined as "int" in SVID etc, but is more usefully defined as - size_t. The value is used only if HAVE_USR_INCLUDE_MALLOC_H is not set - -REALLOC_ZERO_BYTES_FREES default: not defined - This should be set if a call to realloc with zero bytes should - be the same as a call to free. Some people think it should. Otherwise, - since this malloc returns a unique pointer for malloc(0), so does - realloc(p, 0). - -LACKS_UNISTD_H, LACKS_FCNTL_H, LACKS_SYS_PARAM_H, LACKS_SYS_MMAN_H -LACKS_STRINGS_H, LACKS_STRING_H, LACKS_SYS_TYPES_H, LACKS_ERRNO_H -LACKS_STDLIB_H default: NOT defined unless on WIN32 - Define these if your system does not have these header files. - You might need to manually insert some of the declarations they provide. - -DEFAULT_GRANULARITY default: page size if MORECORE_CONTIGUOUS, - system_info.dwAllocationGranularity in WIN32, - otherwise 64K. - Also settable using mallopt(M_GRANULARITY, x) - The unit for allocating and deallocating memory from the system. On - most systems with contiguous MORECORE, there is no reason to - make this more than a page. However, systems with MMAP tend to - either require or encourage larger granularities. You can increase - this value to prevent system allocation functions to be called so - often, especially if they are slow. The value must be at least one - page and must be a power of two. Setting to 0 causes initialization - to either page size or win32 region size. (Note: In previous - versions of malloc, the equivalent of this option was called - "TOP_PAD") - -DEFAULT_TRIM_THRESHOLD default: 2MB - Also settable using mallopt(M_TRIM_THRESHOLD, x) - The maximum amount of unused top-most memory to keep before - releasing via malloc_trim in free(). Automatic trimming is mainly - useful in long-lived programs using contiguous MORECORE. Because - trimming via sbrk can be slow on some systems, and can sometimes be - wasteful (in cases where programs immediately afterward allocate - more large chunks) the value should be high enough so that your - overall system performance would improve by releasing this much - memory. As a rough guide, you might set to a value close to the - average size of a process (program) running on your system. - Releasing this much memory would allow such a process to run in - memory. Generally, it is worth tuning trim thresholds when a - program undergoes phases where several large chunks are allocated - and released in ways that can reuse each other's storage, perhaps - mixed with phases where there are no such chunks at all. The trim - value must be greater than page size to have any useful effect. To - disable trimming completely, you can set to MAX_SIZE_T. Note that the trick - some people use of mallocing a huge space and then freeing it at - program startup, in an attempt to reserve system memory, doesn't - have the intended effect under automatic trimming, since that memory - will immediately be returned to the system. - -DEFAULT_MMAP_THRESHOLD default: 256K - Also settable using mallopt(M_MMAP_THRESHOLD, x) - The request size threshold for using MMAP to directly service a - request. Requests of at least this size that cannot be allocated - using already-existing space will be serviced via mmap. (If enough - normal freed space already exists it is used instead.) Using mmap - segregates relatively large chunks of memory so that they can be - individually obtained and released from the host system. A request - serviced through mmap is never reused by any other request (at least - not directly; the system may just so happen to remap successive - requests to the same locations). Segregating space in this way has - the benefits that: Mmapped space can always be individually released - back to the system, which helps keep the system level memory demands - of a long-lived program low. Also, mapped memory doesn't become - `locked' between other chunks, as can happen with normally allocated - chunks, which means that even trimming via malloc_trim would not - release them. However, it has the disadvantage that the space - cannot be reclaimed, consolidated, and then used to service later - requests, as happens with normal chunks. The advantages of mmap - nearly always outweigh disadvantages for "large" chunks, but the - value of "large" may vary across systems. The default is an - empirically derived value that works well in most systems. You can - disable mmap by setting to MAX_SIZE_T. - -*/ - -#if defined __linux__ && !defined _GNU_SOURCE -/* mremap() on Linux requires this via sys/mman.h */ -#define _GNU_SOURCE 1 -#endif - -#ifndef WIN32 -#ifdef _WIN32 -#define WIN32 1 -#endif /* _WIN32 */ -#endif /* WIN32 */ -#ifdef WIN32 -#define WIN32_LEAN_AND_MEAN -#include -#define HAVE_MMAP 1 -#define HAVE_MORECORE 0 -#define LACKS_UNISTD_H -#define LACKS_SYS_PARAM_H -#define LACKS_SYS_MMAN_H -#define LACKS_STRING_H -#define LACKS_STRINGS_H -#define LACKS_SYS_TYPES_H -#define LACKS_ERRNO_H -#define MALLOC_FAILURE_ACTION -#define MMAP_CLEARS 0 /* WINCE and some others apparently don't clear */ -#endif /* WIN32 */ - -#ifdef __OS2__ -#define INCL_DOS -#include -#define HAVE_MMAP 1 -#define HAVE_MORECORE 0 -#define LACKS_SYS_MMAN_H -#endif /* __OS2__ */ - -#if defined(DARWIN) || defined(_DARWIN) -/* Mac OSX docs advise not to use sbrk; it seems better to use mmap */ -#ifndef HAVE_MORECORE -#define HAVE_MORECORE 0 -#define HAVE_MMAP 1 -#endif /* HAVE_MORECORE */ -#endif /* DARWIN */ - -#ifndef LACKS_SYS_TYPES_H -#include /* For size_t */ -#endif /* LACKS_SYS_TYPES_H */ - -/* The maximum possible size_t value has all bits set */ -#define MAX_SIZE_T (~(size_t)0) - -#ifndef ONLY_MSPACES -#define ONLY_MSPACES 0 -#endif /* ONLY_MSPACES */ -#ifndef MSPACES -#if ONLY_MSPACES -#define MSPACES 1 -#else /* ONLY_MSPACES */ -#define MSPACES 0 -#endif /* ONLY_MSPACES */ -#endif /* MSPACES */ -#ifndef MALLOC_ALIGNMENT -#define MALLOC_ALIGNMENT ((size_t)8U) -#endif /* MALLOC_ALIGNMENT */ -#ifndef FOOTERS -#define FOOTERS 0 -#endif /* FOOTERS */ -#ifndef ABORT -#define ABORT abort() -#endif /* ABORT */ -#ifndef ABORT_ON_ASSERT_FAILURE -#define ABORT_ON_ASSERT_FAILURE 1 -#endif /* ABORT_ON_ASSERT_FAILURE */ -#ifndef PROCEED_ON_ERROR -#define PROCEED_ON_ERROR 0 -#endif /* PROCEED_ON_ERROR */ -#ifndef USE_LOCKS -#define USE_LOCKS 0 -#endif /* USE_LOCKS */ -#ifndef INSECURE -#define INSECURE 0 -#endif /* INSECURE */ -#ifndef HAVE_MMAP -#define HAVE_MMAP 1 -#endif /* HAVE_MMAP */ -#ifndef MMAP_CLEARS -#define MMAP_CLEARS 1 -#endif /* MMAP_CLEARS */ -#ifndef HAVE_MREMAP -#ifdef linux -#define HAVE_MREMAP 1 -#else /* linux */ -#define HAVE_MREMAP 0 -#endif /* linux */ -#endif /* HAVE_MREMAP */ -#ifndef MALLOC_FAILURE_ACTION -#define MALLOC_FAILURE_ACTION errno = ENOMEM; -#endif /* MALLOC_FAILURE_ACTION */ -#ifndef HAVE_MORECORE -#if ONLY_MSPACES -#define HAVE_MORECORE 0 -#else /* ONLY_MSPACES */ -#define HAVE_MORECORE 1 -#endif /* ONLY_MSPACES */ -#endif /* HAVE_MORECORE */ -#if !HAVE_MORECORE -#define MORECORE_CONTIGUOUS 0 -#else /* !HAVE_MORECORE */ -#ifndef MORECORE -#define MORECORE sbrk -#endif /* MORECORE */ -#ifndef MORECORE_CONTIGUOUS -#define MORECORE_CONTIGUOUS 1 -#endif /* MORECORE_CONTIGUOUS */ -#endif /* HAVE_MORECORE */ -#ifndef DEFAULT_GRANULARITY -#if MORECORE_CONTIGUOUS -#define DEFAULT_GRANULARITY (0) /* 0 means to compute in init_mparams */ -#else /* MORECORE_CONTIGUOUS */ -#define DEFAULT_GRANULARITY ((size_t)64U * (size_t)1024U) -#endif /* MORECORE_CONTIGUOUS */ -#endif /* DEFAULT_GRANULARITY */ -#ifndef DEFAULT_TRIM_THRESHOLD -#ifndef MORECORE_CANNOT_TRIM -#define DEFAULT_TRIM_THRESHOLD ((size_t)2U * (size_t)1024U * (size_t)1024U) -#else /* MORECORE_CANNOT_TRIM */ -#define DEFAULT_TRIM_THRESHOLD MAX_SIZE_T -#endif /* MORECORE_CANNOT_TRIM */ -#endif /* DEFAULT_TRIM_THRESHOLD */ -#ifndef DEFAULT_MMAP_THRESHOLD -#if HAVE_MMAP -#define DEFAULT_MMAP_THRESHOLD ((size_t)256U * (size_t)1024U) -#else /* HAVE_MMAP */ -#define DEFAULT_MMAP_THRESHOLD MAX_SIZE_T -#endif /* HAVE_MMAP */ -#endif /* DEFAULT_MMAP_THRESHOLD */ -#ifndef USE_BUILTIN_FFS -#define USE_BUILTIN_FFS 0 -#endif /* USE_BUILTIN_FFS */ -#ifndef USE_DEV_RANDOM -#define USE_DEV_RANDOM 0 -#endif /* USE_DEV_RANDOM */ -#ifndef NO_MALLINFO -#define NO_MALLINFO 0 -#endif /* NO_MALLINFO */ -#ifndef MALLINFO_FIELD_TYPE -#define MALLINFO_FIELD_TYPE size_t -#endif /* MALLINFO_FIELD_TYPE */ - -/* - mallopt tuning options. SVID/XPG defines four standard parameter - numbers for mallopt, normally defined in malloc.h. None of these - are used in this malloc, so setting them has no effect. But this - malloc does support the following options. -*/ - -#define M_TRIM_THRESHOLD (-1) -#define M_GRANULARITY (-2) -#define M_MMAP_THRESHOLD (-3) - -/* ------------------------ Mallinfo declarations ------------------------ */ - -#if !NO_MALLINFO -/* - This version of malloc supports the standard SVID/XPG mallinfo - routine that returns a struct containing usage properties and - statistics. It should work on any system that has a - /usr/include/malloc.h defining struct mallinfo. The main - declaration needed is the mallinfo struct that is returned (by-copy) - by mallinfo(). The malloinfo struct contains a bunch of fields that - are not even meaningful in this version of malloc. These fields are - are instead filled by mallinfo() with other numbers that might be of - interest. - - HAVE_USR_INCLUDE_MALLOC_H should be set if you have a - /usr/include/malloc.h file that includes a declaration of struct - mallinfo. If so, it is included; else a compliant version is - declared below. These must be precisely the same for mallinfo() to - work. The original SVID version of this struct, defined on most - systems with mallinfo, declares all fields as ints. But some others - define as unsigned long. If your system defines the fields using a - type of different width than listed here, you MUST #include your - system version and #define HAVE_USR_INCLUDE_MALLOC_H. -*/ - -/* #define HAVE_USR_INCLUDE_MALLOC_H */ - -#ifdef HAVE_USR_INCLUDE_MALLOC_H -#include "/usr/include/malloc.h" -#else /* HAVE_USR_INCLUDE_MALLOC_H */ - -/* HP-UX's stdlib.h redefines mallinfo unless _STRUCT_MALLINFO is defined */ -#define _STRUCT_MALLINFO - -struct mallinfo { - MALLINFO_FIELD_TYPE arena; /* non-mmapped space allocated from system */ - MALLINFO_FIELD_TYPE ordblks; /* number of free chunks */ - MALLINFO_FIELD_TYPE smblks; /* always 0 */ - MALLINFO_FIELD_TYPE hblks; /* always 0 */ - MALLINFO_FIELD_TYPE hblkhd; /* space in mmapped regions */ - MALLINFO_FIELD_TYPE usmblks; /* maximum total allocated space */ - MALLINFO_FIELD_TYPE fsmblks; /* always 0 */ - MALLINFO_FIELD_TYPE uordblks; /* total allocated space */ - MALLINFO_FIELD_TYPE fordblks; /* total free space */ - MALLINFO_FIELD_TYPE keepcost; /* releasable (via malloc_trim) space */ -}; - -#endif /* HAVE_USR_INCLUDE_MALLOC_H */ -#endif /* NO_MALLINFO */ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#if !ONLY_MSPACES - -/* ------------------- Declarations of public routines ------------------- */ - -#ifndef USE_DL_PREFIX -#define dlcalloc calloc -#define dlfree free -#define dlmalloc malloc -#define dlmemalign memalign -#define dlrealloc realloc -#define dlvalloc valloc -#define dlpvalloc pvalloc -#define dlmallinfo mallinfo -#define dlmallopt mallopt -#define dlmalloc_trim malloc_trim -#define dlmalloc_stats malloc_stats -#define dlmalloc_usable_size malloc_usable_size -#define dlmalloc_footprint malloc_footprint -#define dlmalloc_max_footprint malloc_max_footprint -#define dlindependent_calloc independent_calloc -#define dlindependent_comalloc independent_comalloc -#endif /* USE_DL_PREFIX */ - - -/* - malloc(size_t n) - Returns a pointer to a newly allocated chunk of at least n bytes, or - null if no space is available, in which case errno is set to ENOMEM - on ANSI C systems. - - If n is zero, malloc returns a minimum-sized chunk. (The minimum - size is 16 bytes on most 32bit systems, and 32 bytes on 64bit - systems.) Note that size_t is an unsigned type, so calls with - arguments that would be negative if signed are interpreted as - requests for huge amounts of space, which will often fail. The - maximum supported value of n differs across systems, but is in all - cases less than the maximum representable value of a size_t. -*/ -void* dlmalloc(size_t); - -/* - free(void* p) - Releases the chunk of memory pointed to by p, that had been previously - allocated using malloc or a related routine such as realloc. - It has no effect if p is null. If p was not malloced or already - freed, free(p) will by default cause the current program to abort. -*/ -void dlfree(void*); - -/* - calloc(size_t n_elements, size_t element_size); - Returns a pointer to n_elements * element_size bytes, with all locations - set to zero. -*/ -void* dlcalloc(size_t, size_t); - -/* - realloc(void* p, size_t n) - Returns a pointer to a chunk of size n that contains the same data - as does chunk p up to the minimum of (n, p's size) bytes, or null - if no space is available. - - The returned pointer may or may not be the same as p. The algorithm - prefers extending p in most cases when possible, otherwise it - employs the equivalent of a malloc-copy-free sequence. - - If p is null, realloc is equivalent to malloc. - - If space is not available, realloc returns null, errno is set (if on - ANSI) and p is NOT freed. - - if n is for fewer bytes than already held by p, the newly unused - space is lopped off and freed if possible. realloc with a size - argument of zero (re)allocates a minimum-sized chunk. - - The old unix realloc convention of allowing the last-free'd chunk - to be used as an argument to realloc is not supported. -*/ - -void* dlrealloc(void*, size_t); - -/* - memalign(size_t alignment, size_t n); - Returns a pointer to a newly allocated chunk of n bytes, aligned - in accord with the alignment argument. - - The alignment argument should be a power of two. If the argument is - not a power of two, the nearest greater power is used. - 8-byte alignment is guaranteed by normal malloc calls, so don't - bother calling memalign with an argument of 8 or less. - - Overreliance on memalign is a sure way to fragment space. -*/ -void* dlmemalign(size_t, size_t); - -/* - valloc(size_t n); - Equivalent to memalign(pagesize, n), where pagesize is the page - size of the system. If the pagesize is unknown, 4096 is used. -*/ -void* dlvalloc(size_t); - -/* - mallopt(int parameter_number, int parameter_value) - Sets tunable parameters The format is to provide a - (parameter-number, parameter-value) pair. mallopt then sets the - corresponding parameter to the argument value if it can (i.e., so - long as the value is meaningful), and returns 1 if successful else - 0. SVID/XPG/ANSI defines four standard param numbers for mallopt, - normally defined in malloc.h. None of these are use in this malloc, - so setting them has no effect. But this malloc also supports other - options in mallopt. See below for details. Briefly, supported - parameters are as follows (listed defaults are for "typical" - configurations). - - Symbol param # default allowed param values - M_TRIM_THRESHOLD -1 2*1024*1024 any (MAX_SIZE_T disables) - M_GRANULARITY -2 page size any power of 2 >= page size - M_MMAP_THRESHOLD -3 256*1024 any (or 0 if no MMAP support) -*/ -int dlmallopt(int, int); - -/* - malloc_footprint(); - Returns the number of bytes obtained from the system. The total - number of bytes allocated by malloc, realloc etc., is less than this - value. Unlike mallinfo, this function returns only a precomputed - result, so can be called frequently to monitor memory consumption. - Even if locks are otherwise defined, this function does not use them, - so results might not be up to date. -*/ -size_t dlmalloc_footprint(void); - -/* - malloc_max_footprint(); - Returns the maximum number of bytes obtained from the system. This - value will be greater than current footprint if deallocated space - has been reclaimed by the system. The peak number of bytes allocated - by malloc, realloc etc., is less than this value. Unlike mallinfo, - this function returns only a precomputed result, so can be called - frequently to monitor memory consumption. Even if locks are - otherwise defined, this function does not use them, so results might - not be up to date. -*/ -size_t dlmalloc_max_footprint(void); - -#if !NO_MALLINFO -/* - mallinfo() - Returns (by copy) a struct containing various summary statistics: - - arena: current total non-mmapped bytes allocated from system - ordblks: the number of free chunks - smblks: always zero. - hblks: current number of mmapped regions - hblkhd: total bytes held in mmapped regions - usmblks: the maximum total allocated space. This will be greater - than current total if trimming has occurred. - fsmblks: always zero - uordblks: current total allocated space (normal or mmapped) - fordblks: total free space - keepcost: the maximum number of bytes that could ideally be released - back to system via malloc_trim. ("ideally" means that - it ignores page restrictions etc.) - - Because these fields are ints, but internal bookkeeping may - be kept as longs, the reported values may wrap around zero and - thus be inaccurate. -*/ -struct mallinfo dlmallinfo(void); -#endif /* NO_MALLINFO */ - -/* - independent_calloc(size_t n_elements, size_t element_size, void* chunks[]); - - independent_calloc is similar to calloc, but instead of returning a - single cleared space, it returns an array of pointers to n_elements - independent elements that can hold contents of size elem_size, each - of which starts out cleared, and can be independently freed, - realloc'ed etc. The elements are guaranteed to be adjacently - allocated (this is not guaranteed to occur with multiple callocs or - mallocs), which may also improve cache locality in some - applications. - - The "chunks" argument is optional (i.e., may be null, which is - probably the most typical usage). If it is null, the returned array - is itself dynamically allocated and should also be freed when it is - no longer needed. Otherwise, the chunks array must be of at least - n_elements in length. It is filled in with the pointers to the - chunks. - - In either case, independent_calloc returns this pointer array, or - null if the allocation failed. If n_elements is zero and "chunks" - is null, it returns a chunk representing an array with zero elements - (which should be freed if not wanted). - - Each element must be individually freed when it is no longer - needed. If you'd like to instead be able to free all at once, you - should instead use regular calloc and assign pointers into this - space to represent elements. (In this case though, you cannot - independently free elements.) - - independent_calloc simplifies and speeds up implementations of many - kinds of pools. It may also be useful when constructing large data - structures that initially have a fixed number of fixed-sized nodes, - but the number is not known at compile time, and some of the nodes - may later need to be freed. For example: - - struct Node { int item; struct Node* next; }; - - struct Node* build_list() { - struct Node** pool; - int n = read_number_of_nodes_needed(); - if (n <= 0) return 0; - pool = (struct Node**)(independent_calloc(n, sizeof(struct Node), 0); - if (pool == 0) die(); - // organize into a linked list... - struct Node* first = pool[0]; - for (i = 0; i < n-1; ++i) - pool[i]->next = pool[i+1]; - free(pool); // Can now free the array (or not, if it is needed later) - return first; - } -*/ -void** dlindependent_calloc(size_t, size_t, void**); - -/* - independent_comalloc(size_t n_elements, size_t sizes[], void* chunks[]); - - independent_comalloc allocates, all at once, a set of n_elements - chunks with sizes indicated in the "sizes" array. It returns - an array of pointers to these elements, each of which can be - independently freed, realloc'ed etc. The elements are guaranteed to - be adjacently allocated (this is not guaranteed to occur with - multiple callocs or mallocs), which may also improve cache locality - in some applications. - - The "chunks" argument is optional (i.e., may be null). If it is null - the returned array is itself dynamically allocated and should also - be freed when it is no longer needed. Otherwise, the chunks array - must be of at least n_elements in length. It is filled in with the - pointers to the chunks. - - In either case, independent_comalloc returns this pointer array, or - null if the allocation failed. If n_elements is zero and chunks is - null, it returns a chunk representing an array with zero elements - (which should be freed if not wanted). - - Each element must be individually freed when it is no longer - needed. If you'd like to instead be able to free all at once, you - should instead use a single regular malloc, and assign pointers at - particular offsets in the aggregate space. (In this case though, you - cannot independently free elements.) - - independent_comallac differs from independent_calloc in that each - element may have a different size, and also that it does not - automatically clear elements. - - independent_comalloc can be used to speed up allocation in cases - where several structs or objects must always be allocated at the - same time. For example: - - struct Head { ... } - struct Foot { ... } - - void send_message(char* msg) { - int msglen = strlen(msg); - size_t sizes[3] = { sizeof(struct Head), msglen, sizeof(struct Foot) }; - void* chunks[3]; - if (independent_comalloc(3, sizes, chunks) == 0) - die(); - struct Head* head = (struct Head*)(chunks[0]); - char* body = (char*)(chunks[1]); - struct Foot* foot = (struct Foot*)(chunks[2]); - // ... - } - - In general though, independent_comalloc is worth using only for - larger values of n_elements. For small values, you probably won't - detect enough difference from series of malloc calls to bother. - - Overuse of independent_comalloc can increase overall memory usage, - since it cannot reuse existing noncontiguous small chunks that - might be available for some of the elements. -*/ -void** dlindependent_comalloc(size_t, size_t*, void**); - - -/* - pvalloc(size_t n); - Equivalent to valloc(minimum-page-that-holds(n)), that is, - round up n to nearest pagesize. - */ -void* dlpvalloc(size_t); - -/* - malloc_trim(size_t pad); - - If possible, gives memory back to the system (via negative arguments - to sbrk) if there is unused memory at the `high' end of the malloc - pool or in unused MMAP segments. You can call this after freeing - large blocks of memory to potentially reduce the system-level memory - requirements of a program. However, it cannot guarantee to reduce - memory. Under some allocation patterns, some large free blocks of - memory will be locked between two used chunks, so they cannot be - given back to the system. - - The `pad' argument to malloc_trim represents the amount of free - trailing space to leave untrimmed. If this argument is zero, only - the minimum amount of memory to maintain internal data structures - will be left. Non-zero arguments can be supplied to maintain enough - trailing space to service future expected allocations without having - to re-obtain memory from the system. - - Malloc_trim returns 1 if it actually released any memory, else 0. -*/ -int dlmalloc_trim(size_t); - -/* - malloc_usable_size(void* p); - - Returns the number of bytes you can actually use in - an allocated chunk, which may be more than you requested (although - often not) due to alignment and minimum size constraints. - You can use this many bytes without worrying about - overwriting other allocated objects. This is not a particularly great - programming practice. malloc_usable_size can be more useful in - debugging and assertions, for example: - - p = malloc(n); - assert(malloc_usable_size(p) >= 256); -*/ -size_t dlmalloc_usable_size(void*); - -/* - malloc_stats(); - Prints on stderr the amount of space obtained from the system (both - via sbrk and mmap), the maximum amount (which may be more than - current if malloc_trim and/or munmap got called), and the current - number of bytes allocated via malloc (or realloc, etc) but not yet - freed. Note that this is the number of bytes allocated, not the - number requested. It will be larger than the number requested - because of alignment and bookkeeping overhead. Because it includes - alignment wastage as being in use, this figure may be greater than - zero even when no user-level chunks are allocated. - - The reported current and maximum system memory can be inaccurate if - a program makes other calls to system memory allocation functions - (normally sbrk) outside of malloc. - - malloc_stats prints only the most commonly interesting statistics. - More information can be obtained by calling mallinfo. -*/ -void dlmalloc_stats(void); - -#endif /* ONLY_MSPACES */ - -#if MSPACES - -/* - mspace is an opaque type representing an independent - region of space that supports mspace_malloc, etc. -*/ -typedef void* mspace; - -/* - create_mspace creates and returns a new independent space with the - given initial capacity, or, if 0, the default granularity size. It - returns null if there is no system memory available to create the - space. If argument locked is non-zero, the space uses a separate - lock to control access. The capacity of the space will grow - dynamically as needed to service mspace_malloc requests. You can - control the sizes of incremental increases of this space by - compiling with a different DEFAULT_GRANULARITY or dynamically - setting with mallopt(M_GRANULARITY, value). -*/ -mspace create_mspace(size_t capacity, int locked); - -/* - destroy_mspace destroys the given space, and attempts to return all - of its memory back to the system, returning the total number of - bytes freed. After destruction, the results of access to all memory - used by the space become undefined. -*/ -size_t destroy_mspace(mspace msp); - -/* - create_mspace_with_base uses the memory supplied as the initial base - of a new mspace. Part (less than 128*sizeof(size_t) bytes) of this - space is used for bookkeeping, so the capacity must be at least this - large. (Otherwise 0 is returned.) When this initial space is - exhausted, additional memory will be obtained from the system. - Destroying this space will deallocate all additionally allocated - space (if possible) but not the initial base. -*/ -mspace create_mspace_with_base(void* base, size_t capacity, int locked); - -/* - mspace_malloc behaves as malloc, but operates within - the given space. -*/ -void* mspace_malloc(mspace msp, size_t bytes); - -/* - mspace_free behaves as free, but operates within - the given space. - - If compiled with FOOTERS==1, mspace_free is not actually needed. - free may be called instead of mspace_free because freed chunks from - any space are handled by their originating spaces. -*/ -void mspace_free(mspace msp, void* mem); - -/* - mspace_realloc behaves as realloc, but operates within - the given space. - - If compiled with FOOTERS==1, mspace_realloc is not actually - needed. realloc may be called instead of mspace_realloc because - realloced chunks from any space are handled by their originating - spaces. -*/ -void* mspace_realloc(mspace msp, void* mem, size_t newsize); - -/* - mspace_calloc behaves as calloc, but operates within - the given space. -*/ -void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size); - -/* - mspace_memalign behaves as memalign, but operates within - the given space. -*/ -void* mspace_memalign(mspace msp, size_t alignment, size_t bytes); - -/* - mspace_independent_calloc behaves as independent_calloc, but - operates within the given space. -*/ -void** mspace_independent_calloc(mspace msp, size_t n_elements, - size_t elem_size, void* chunks[]); - -/* - mspace_independent_comalloc behaves as independent_comalloc, but - operates within the given space. -*/ -void** mspace_independent_comalloc(mspace msp, size_t n_elements, - size_t sizes[], void* chunks[]); - -/* - mspace_footprint() returns the number of bytes obtained from the - system for this space. -*/ -size_t mspace_footprint(mspace msp); - -/* - mspace_max_footprint() returns the peak number of bytes obtained from the - system for this space. -*/ -size_t mspace_max_footprint(mspace msp); - - -#if !NO_MALLINFO -/* - mspace_mallinfo behaves as mallinfo, but reports properties of - the given space. -*/ -struct mallinfo mspace_mallinfo(mspace msp); -#endif /* NO_MALLINFO */ - -/* - mspace_malloc_stats behaves as malloc_stats, but reports - properties of the given space. -*/ -void mspace_malloc_stats(mspace msp); - -/* - mspace_trim behaves as malloc_trim, but - operates within the given space. -*/ -int mspace_trim(mspace msp, size_t pad); - -/* - An alias for mallopt. -*/ -int mspace_mallopt(int, int); - -#endif /* MSPACES */ - -#ifdef __cplusplus -}; /* end of extern "C" */ -#endif /* __cplusplus */ - -/* - ======================================================================== - To make a fully customizable malloc.h header file, cut everything - above this line, put into file malloc.h, edit to suit, and #include it - on the next line, as well as in programs that use this malloc. - ======================================================================== -*/ - -/* #include "malloc.h" */ - -/*------------------------------ internal #includes ---------------------- */ - -#ifdef _MSC_VER -#pragma warning( disable : 4146 ) /* no "unsigned" warnings */ -#endif /* _MSC_VER */ - -#include /* for printing in malloc_stats */ - -#ifndef LACKS_ERRNO_H -#include /* for MALLOC_FAILURE_ACTION */ -#endif /* LACKS_ERRNO_H */ -#if FOOTERS -#include /* for magic initialization */ -#endif /* FOOTERS */ -#ifndef LACKS_STDLIB_H -#include /* for abort() */ -#endif /* LACKS_STDLIB_H */ -#ifdef DEBUG -#if ABORT_ON_ASSERT_FAILURE -#define assert(x) if(!(x)) ABORT -#else /* ABORT_ON_ASSERT_FAILURE */ -#include -#endif /* ABORT_ON_ASSERT_FAILURE */ -#else /* DEBUG */ -#define assert(x) -#endif /* DEBUG */ -#ifndef LACKS_STRING_H -#include /* for memset etc */ -#endif /* LACKS_STRING_H */ -#if USE_BUILTIN_FFS -#ifndef LACKS_STRINGS_H -#include /* for ffs */ -#endif /* LACKS_STRINGS_H */ -#endif /* USE_BUILTIN_FFS */ -#if HAVE_MMAP -#ifndef LACKS_SYS_MMAN_H -#include /* for mmap */ -#endif /* LACKS_SYS_MMAN_H */ -#ifndef LACKS_FCNTL_H -#include -#endif /* LACKS_FCNTL_H */ -#endif /* HAVE_MMAP */ -#if HAVE_MORECORE -#ifndef LACKS_UNISTD_H -#include /* for sbrk */ -#else /* LACKS_UNISTD_H */ -#if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__) -extern void* sbrk(ptrdiff_t); -#endif /* FreeBSD etc */ -#endif /* LACKS_UNISTD_H */ -#endif /* HAVE_MMAP */ - -#ifndef WIN32 -#ifndef malloc_getpagesize -# ifdef _SC_PAGESIZE /* some SVR4 systems omit an underscore */ -# ifndef _SC_PAGE_SIZE -# define _SC_PAGE_SIZE _SC_PAGESIZE -# endif -# endif -# ifdef _SC_PAGE_SIZE -# define malloc_getpagesize sysconf(_SC_PAGE_SIZE) -# else -# if defined(BSD) || defined(DGUX) || defined(HAVE_GETPAGESIZE) - extern size_t getpagesize(); -# define malloc_getpagesize getpagesize() -# else -# ifdef WIN32 /* use supplied emulation of getpagesize */ -# define malloc_getpagesize getpagesize() -# else -# ifndef LACKS_SYS_PARAM_H -# include -# endif -# ifdef EXEC_PAGESIZE -# define malloc_getpagesize EXEC_PAGESIZE -# else -# ifdef NBPG -# ifndef CLSIZE -# define malloc_getpagesize NBPG -# else -# define malloc_getpagesize (NBPG * CLSIZE) -# endif -# else -# ifdef NBPC -# define malloc_getpagesize NBPC -# else -# ifdef PAGESIZE -# define malloc_getpagesize PAGESIZE -# else /* just guess */ -# define malloc_getpagesize ((size_t)4096U) -# endif -# endif -# endif -# endif -# endif -# endif -# endif -#endif -#endif - -/* ------------------- size_t and alignment properties -------------------- */ - -/* The byte and bit size of a size_t */ -#define SIZE_T_SIZE (sizeof(size_t)) -#define SIZE_T_BITSIZE (sizeof(size_t) << 3) - -/* Some constants coerced to size_t */ -/* Annoying but necessary to avoid errors on some platforms */ -#define SIZE_T_ZERO ((size_t)0) -#define SIZE_T_ONE ((size_t)1) -#define SIZE_T_TWO ((size_t)2) -#define TWO_SIZE_T_SIZES (SIZE_T_SIZE<<1) -#define FOUR_SIZE_T_SIZES (SIZE_T_SIZE<<2) -#define SIX_SIZE_T_SIZES (FOUR_SIZE_T_SIZES+TWO_SIZE_T_SIZES) -#define HALF_MAX_SIZE_T (MAX_SIZE_T / 2U) - -/* The bit mask value corresponding to MALLOC_ALIGNMENT */ -#define CHUNK_ALIGN_MASK (MALLOC_ALIGNMENT - SIZE_T_ONE) - -/* True if address a has acceptable alignment */ -#define is_aligned(A) (((size_t)((A)) & (CHUNK_ALIGN_MASK)) == 0) - -/* the number of bytes to offset an address to align it */ -#define align_offset(A)\ - ((((size_t)(A) & CHUNK_ALIGN_MASK) == 0)? 0 :\ - ((MALLOC_ALIGNMENT - ((size_t)(A) & CHUNK_ALIGN_MASK)) & CHUNK_ALIGN_MASK)) - -/* -------------------------- MMAP preliminaries ------------------------- */ - -/* - If HAVE_MORECORE or HAVE_MMAP are false, we just define calls and - checks to fail so compiler optimizer can delete code rather than - using so many "#if"s. -*/ - - -/* MORECORE and MMAP must return MFAIL on failure */ -#define MFAIL ((void*)(MAX_SIZE_T)) -#define CMFAIL ((char*)(MFAIL)) /* defined for convenience */ - -#if !HAVE_MMAP -#define IS_MMAPPED_BIT (SIZE_T_ZERO) -#define USE_MMAP_BIT (SIZE_T_ZERO) -#define CALL_MMAP(s) MFAIL -#define CALL_MUNMAP(a, s) (-1) -#define DIRECT_MMAP(s) MFAIL - -#else /* HAVE_MMAP */ -#define IS_MMAPPED_BIT (SIZE_T_ONE) -#define USE_MMAP_BIT (SIZE_T_ONE) - -#if !defined(WIN32) && !defined (__OS2__) -#define CALL_MUNMAP(a, s) munmap((a), (s)) -#define MMAP_PROT (PROT_READ|PROT_WRITE) -#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON) -#define MAP_ANONYMOUS MAP_ANON -#endif /* MAP_ANON */ -#ifdef MAP_ANONYMOUS -#define MMAP_FLAGS (MAP_PRIVATE|MAP_ANONYMOUS) -#define CALL_MMAP(s) mmap(0, (s), MMAP_PROT, MMAP_FLAGS, -1, 0) -#else /* MAP_ANONYMOUS */ -/* - Nearly all versions of mmap support MAP_ANONYMOUS, so the following - is unlikely to be needed, but is supplied just in case. -*/ -#define MMAP_FLAGS (MAP_PRIVATE) -static int dev_zero_fd = -1; /* Cached file descriptor for /dev/zero. */ -#define CALL_MMAP(s) ((dev_zero_fd < 0) ? \ - (dev_zero_fd = open("/dev/zero", O_RDWR), \ - mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0)) : \ - mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0)) -#endif /* MAP_ANONYMOUS */ - -#define DIRECT_MMAP(s) CALL_MMAP(s) - -#elif defined(__OS2__) - -/* OS/2 MMAP via DosAllocMem */ -static void* os2mmap(size_t size) { - void* ptr; - if (DosAllocMem(&ptr, size, OBJ_ANY|PAG_COMMIT|PAG_READ|PAG_WRITE) && - DosAllocMem(&ptr, size, PAG_COMMIT|PAG_READ|PAG_WRITE)) - return MFAIL; - return ptr; -} - -#define os2direct_mmap(n) os2mmap(n) - -/* This function supports releasing coalesed segments */ -static int os2munmap(void* ptr, size_t size) { - while (size) { - ULONG ulSize = size; - ULONG ulFlags = 0; - if (DosQueryMem(ptr, &ulSize, &ulFlags) != 0) - return -1; - if ((ulFlags & PAG_BASE) == 0 ||(ulFlags & PAG_COMMIT) == 0 || - ulSize > size) - return -1; - if (DosFreeMem(ptr) != 0) - return -1; - ptr = ( void * ) ( ( char * ) ptr + ulSize ); - size -= ulSize; - } - return 0; -} - -#define CALL_MMAP(s) os2mmap(s) -#define CALL_MUNMAP(a, s) os2munmap((a), (s)) -#define DIRECT_MMAP(s) os2direct_mmap(s) - -#else /* WIN32 */ - -/* Win32 MMAP via VirtualAlloc */ -static void* win32mmap(size_t size) { - void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE); - return (ptr != 0)? ptr: MFAIL; -} - -/* For direct MMAP, use MEM_TOP_DOWN to minimize interference */ -static void* win32direct_mmap(size_t size) { - void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN, - PAGE_EXECUTE_READWRITE); - return (ptr != 0)? ptr: MFAIL; -} - -/* This function supports releasing coalesed segments */ -static int win32munmap(void* ptr, size_t size) { - MEMORY_BASIC_INFORMATION minfo; - char* cptr = ptr; - while (size) { - if (VirtualQuery(cptr, &minfo, sizeof(minfo)) == 0) - return -1; - if (minfo.BaseAddress != cptr || minfo.AllocationBase != cptr || - minfo.State != MEM_COMMIT || minfo.RegionSize > size) - return -1; - if (VirtualFree(cptr, 0, MEM_RELEASE) == 0) - return -1; - cptr += minfo.RegionSize; - size -= minfo.RegionSize; - } - return 0; -} - -#define CALL_MMAP(s) win32mmap(s) -#define CALL_MUNMAP(a, s) win32munmap((a), (s)) -#define DIRECT_MMAP(s) win32direct_mmap(s) -#endif /* WIN32 */ -#endif /* HAVE_MMAP */ - -#if HAVE_MMAP && HAVE_MREMAP -#define CALL_MREMAP(addr, osz, nsz, mv) mremap((addr), (osz), (nsz), (mv)) -#else /* HAVE_MMAP && HAVE_MREMAP */ -#define CALL_MREMAP(addr, osz, nsz, mv) MFAIL -#endif /* HAVE_MMAP && HAVE_MREMAP */ - -#if HAVE_MORECORE -#define CALL_MORECORE(S) MORECORE(S) -#else /* HAVE_MORECORE */ -#define CALL_MORECORE(S) MFAIL -#endif /* HAVE_MORECORE */ - -/* mstate bit set if contiguous morecore disabled or failed */ -#define USE_NONCONTIGUOUS_BIT (4U) - -/* segment bit set in create_mspace_with_base */ -#define EXTERN_BIT (8U) - - -/* --------------------------- Lock preliminaries ------------------------ */ - -#if USE_LOCKS - -/* - When locks are defined, there are up to two global locks: - - * If HAVE_MORECORE, morecore_mutex protects sequences of calls to - MORECORE. In many cases sys_alloc requires two calls, that should - not be interleaved with calls by other threads. This does not - protect against direct calls to MORECORE by other threads not - using this lock, so there is still code to cope the best we can on - interference. - - * magic_init_mutex ensures that mparams.magic and other - unique mparams values are initialized only once. -*/ - -#if !defined(WIN32) && !defined(__OS2__) -/* By default use posix locks */ -#include -#define MLOCK_T pthread_mutex_t -#define INITIAL_LOCK(l) pthread_mutex_init(l, NULL) -#define ACQUIRE_LOCK(l) pthread_mutex_lock(l) -#define RELEASE_LOCK(l) pthread_mutex_unlock(l) - -#if HAVE_MORECORE -static MLOCK_T morecore_mutex = PTHREAD_MUTEX_INITIALIZER; -#endif /* HAVE_MORECORE */ - -static MLOCK_T magic_init_mutex = PTHREAD_MUTEX_INITIALIZER; - -#elif defined(__OS2__) -#define MLOCK_T HMTX -#define INITIAL_LOCK(l) DosCreateMutexSem(0, l, 0, FALSE) -#define ACQUIRE_LOCK(l) DosRequestMutexSem(*l, SEM_INDEFINITE_WAIT) -#define RELEASE_LOCK(l) DosReleaseMutexSem(*l) -#if HAVE_MORECORE -static MLOCK_T morecore_mutex; -#endif /* HAVE_MORECORE */ -static MLOCK_T magic_init_mutex; - -#else /* WIN32 */ -/* - Because lock-protected regions have bounded times, and there - are no recursive lock calls, we can use simple spinlocks. -*/ - -#define MLOCK_T long -static int win32_acquire_lock (MLOCK_T *sl) { - for (;;) { -#ifdef InterlockedCompareExchangePointer - if (!InterlockedCompareExchange(sl, 1, 0)) - return 0; -#else /* Use older void* version */ - if (!InterlockedCompareExchange((void**)sl, (void*)1, (void*)0)) - return 0; -#endif /* InterlockedCompareExchangePointer */ - Sleep (0); - } -} - -static void win32_release_lock (MLOCK_T *sl) { - InterlockedExchange (sl, 0); -} - -#define INITIAL_LOCK(l) *(l)=0 -#define ACQUIRE_LOCK(l) win32_acquire_lock(l) -#define RELEASE_LOCK(l) win32_release_lock(l) -#if HAVE_MORECORE -static MLOCK_T morecore_mutex; -#endif /* HAVE_MORECORE */ -static MLOCK_T magic_init_mutex; -#endif /* WIN32 */ - -#define USE_LOCK_BIT (2U) -#else /* USE_LOCKS */ -#define USE_LOCK_BIT (0U) -#define INITIAL_LOCK(l) -#endif /* USE_LOCKS */ - -#if USE_LOCKS && HAVE_MORECORE -#define ACQUIRE_MORECORE_LOCK() ACQUIRE_LOCK(&morecore_mutex); -#define RELEASE_MORECORE_LOCK() RELEASE_LOCK(&morecore_mutex); -#else /* USE_LOCKS && HAVE_MORECORE */ -#define ACQUIRE_MORECORE_LOCK() -#define RELEASE_MORECORE_LOCK() -#endif /* USE_LOCKS && HAVE_MORECORE */ - -#if USE_LOCKS -#define ACQUIRE_MAGIC_INIT_LOCK() ACQUIRE_LOCK(&magic_init_mutex); -#define RELEASE_MAGIC_INIT_LOCK() RELEASE_LOCK(&magic_init_mutex); -#else /* USE_LOCKS */ -#define ACQUIRE_MAGIC_INIT_LOCK() -#define RELEASE_MAGIC_INIT_LOCK() -#endif /* USE_LOCKS */ - - -/* ----------------------- Chunk representations ------------------------ */ - -/* - (The following includes lightly edited explanations by Colin Plumb.) - - The malloc_chunk declaration below is misleading (but accurate and - necessary). It declares a "view" into memory allowing access to - necessary fields at known offsets from a given base. - - Chunks of memory are maintained using a `boundary tag' method as - originally described by Knuth. (See the paper by Paul Wilson - ftp://ftp.cs.utexas.edu/pub/garbage/allocsrv.ps for a survey of such - techniques.) Sizes of free chunks are stored both in the front of - each chunk and at the end. This makes consolidating fragmented - chunks into bigger chunks fast. The head fields also hold bits - representing whether chunks are free or in use. - - Here are some pictures to make it clearer. They are "exploded" to - show that the state of a chunk can be thought of as extending from - the high 31 bits of the head field of its header through the - prev_foot and PINUSE_BIT bit of the following chunk header. - - A chunk that's in use looks like: - - chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Size of previous chunk (if P = 1) | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P| - | Size of this chunk 1| +-+ - mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | | - +- -+ - | | - +- -+ - | : - +- size - sizeof(size_t) available payload bytes -+ - : | - chunk-> +- -+ - | | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |1| - | Size of next chunk (may or may not be in use) | +-+ - mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - - And if it's free, it looks like this: - - chunk-> +- -+ - | User payload (must be in use, or we would have merged!) | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P| - | Size of this chunk 0| +-+ - mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Next pointer | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Prev pointer | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | : - +- size - sizeof(struct chunk) unused bytes -+ - : | - chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Size of this chunk | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |0| - | Size of next chunk (must be in use, or we would have merged)| +-+ - mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | : - +- User payload -+ - : | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - |0| - +-+ - Note that since we always merge adjacent free chunks, the chunks - adjacent to a free chunk must be in use. - - Given a pointer to a chunk (which can be derived trivially from the - payload pointer) we can, in O(1) time, find out whether the adjacent - chunks are free, and if so, unlink them from the lists that they - are on and merge them with the current chunk. - - Chunks always begin on even word boundaries, so the mem portion - (which is returned to the user) is also on an even word boundary, and - thus at least double-word aligned. - - The P (PINUSE_BIT) bit, stored in the unused low-order bit of the - chunk size (which is always a multiple of two words), is an in-use - bit for the *previous* chunk. If that bit is *clear*, then the - word before the current chunk size contains the previous chunk - size, and can be used to find the front of the previous chunk. - The very first chunk allocated always has this bit set, preventing - access to non-existent (or non-owned) memory. If pinuse is set for - any given chunk, then you CANNOT determine the size of the - previous chunk, and might even get a memory addressing fault when - trying to do so. - - The C (CINUSE_BIT) bit, stored in the unused second-lowest bit of - the chunk size redundantly records whether the current chunk is - inuse. This redundancy enables usage checks within free and realloc, - and reduces indirection when freeing and consolidating chunks. - - Each freshly allocated chunk must have both cinuse and pinuse set. - That is, each allocated chunk borders either a previously allocated - and still in-use chunk, or the base of its memory arena. This is - ensured by making all allocations from the the `lowest' part of any - found chunk. Further, no free chunk physically borders another one, - so each free chunk is known to be preceded and followed by either - inuse chunks or the ends of memory. - - Note that the `foot' of the current chunk is actually represented - as the prev_foot of the NEXT chunk. This makes it easier to - deal with alignments etc but can be very confusing when trying - to extend or adapt this code. - - The exceptions to all this are - - 1. The special chunk `top' is the top-most available chunk (i.e., - the one bordering the end of available memory). It is treated - specially. Top is never included in any bin, is used only if - no other chunk is available, and is released back to the - system if it is very large (see M_TRIM_THRESHOLD). In effect, - the top chunk is treated as larger (and thus less well - fitting) than any other available chunk. The top chunk - doesn't update its trailing size field since there is no next - contiguous chunk that would have to index off it. However, - space is still allocated for it (TOP_FOOT_SIZE) to enable - separation or merging when space is extended. - - 3. Chunks allocated via mmap, which have the lowest-order bit - (IS_MMAPPED_BIT) set in their prev_foot fields, and do not set - PINUSE_BIT in their head fields. Because they are allocated - one-by-one, each must carry its own prev_foot field, which is - also used to hold the offset this chunk has within its mmapped - region, which is needed to preserve alignment. Each mmapped - chunk is trailed by the first two fields of a fake next-chunk - for sake of usage checks. - -*/ - -struct malloc_chunk { - size_t prev_foot; /* Size of previous chunk (if free). */ - size_t head; /* Size and inuse bits. */ - struct malloc_chunk* fd; /* double links -- used only if free. */ - struct malloc_chunk* bk; -}; - -typedef struct malloc_chunk mchunk; -typedef struct malloc_chunk* mchunkptr; -typedef struct malloc_chunk* sbinptr; /* The type of bins of chunks */ -typedef size_t bindex_t; /* Described below */ -typedef unsigned int binmap_t; /* Described below */ -typedef unsigned int flag_t; /* The type of various bit flag sets */ - -/* ------------------- Chunks sizes and alignments ----------------------- */ - -#define MCHUNK_SIZE (sizeof(mchunk)) - -#if FOOTERS -#define CHUNK_OVERHEAD (TWO_SIZE_T_SIZES) -#else /* FOOTERS */ -#define CHUNK_OVERHEAD (SIZE_T_SIZE) -#endif /* FOOTERS */ - -/* MMapped chunks need a second word of overhead ... */ -#define MMAP_CHUNK_OVERHEAD (TWO_SIZE_T_SIZES) -/* ... and additional padding for fake next-chunk at foot */ -#define MMAP_FOOT_PAD (FOUR_SIZE_T_SIZES) - -/* The smallest size we can malloc is an aligned minimal chunk */ -#define MIN_CHUNK_SIZE\ - ((MCHUNK_SIZE + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK) - -/* conversion from malloc headers to user pointers, and back */ -#define chunk2mem(p) ((void*)((char*)(p) + TWO_SIZE_T_SIZES)) -#define mem2chunk(mem) ((mchunkptr)((char*)(mem) - TWO_SIZE_T_SIZES)) -/* chunk associated with aligned address A */ -#define align_as_chunk(A) (mchunkptr)((A) + align_offset(chunk2mem(A))) - -/* Bounds on request (not chunk) sizes. */ -#define MAX_REQUEST ((-MIN_CHUNK_SIZE) << 2) -#define MIN_REQUEST (MIN_CHUNK_SIZE - CHUNK_OVERHEAD - SIZE_T_ONE) - -/* pad request bytes into a usable size */ -#define pad_request(req) \ - (((req) + CHUNK_OVERHEAD + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK) - -/* pad request, checking for minimum (but not maximum) */ -#define request2size(req) \ - (((req) < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(req)) - - -/* ------------------ Operations on head and foot fields ----------------- */ - -/* - The head field of a chunk is or'ed with PINUSE_BIT when previous - adjacent chunk in use, and or'ed with CINUSE_BIT if this chunk is in - use. If the chunk was obtained with mmap, the prev_foot field has - IS_MMAPPED_BIT set, otherwise holding the offset of the base of the - mmapped region to the base of the chunk. -*/ - -#define PINUSE_BIT (SIZE_T_ONE) -#define CINUSE_BIT (SIZE_T_TWO) -#define INUSE_BITS (PINUSE_BIT|CINUSE_BIT) - -/* Head value for fenceposts */ -#define FENCEPOST_HEAD (INUSE_BITS|SIZE_T_SIZE) - -/* extraction of fields from head words */ -#define cinuse(p) ((p)->head & CINUSE_BIT) -#define pinuse(p) ((p)->head & PINUSE_BIT) -#define chunksize(p) ((p)->head & ~(INUSE_BITS)) - -#define clear_pinuse(p) ((p)->head &= ~PINUSE_BIT) -#define clear_cinuse(p) ((p)->head &= ~CINUSE_BIT) - -/* Treat space at ptr +/- offset as a chunk */ -#define chunk_plus_offset(p, s) ((mchunkptr)(((char*)(p)) + (s))) -#define chunk_minus_offset(p, s) ((mchunkptr)(((char*)(p)) - (s))) - -/* Ptr to next or previous physical malloc_chunk. */ -#define next_chunk(p) ((mchunkptr)( ((char*)(p)) + ((p)->head & ~INUSE_BITS))) -#define prev_chunk(p) ((mchunkptr)( ((char*)(p)) - ((p)->prev_foot) )) - -/* extract next chunk's pinuse bit */ -#define next_pinuse(p) ((next_chunk(p)->head) & PINUSE_BIT) - -/* Get/set size at footer */ -#define get_foot(p, s) (((mchunkptr)((char*)(p) + (s)))->prev_foot) -#define set_foot(p, s) (((mchunkptr)((char*)(p) + (s)))->prev_foot = (s)) - -/* Set size, pinuse bit, and foot */ -#define set_size_and_pinuse_of_free_chunk(p, s)\ - ((p)->head = (s|PINUSE_BIT), set_foot(p, s)) - -/* Set size, pinuse bit, foot, and clear next pinuse */ -#define set_free_with_pinuse(p, s, n)\ - (clear_pinuse(n), set_size_and_pinuse_of_free_chunk(p, s)) - -#define is_mmapped(p)\ - (!((p)->head & PINUSE_BIT) && ((p)->prev_foot & IS_MMAPPED_BIT)) - -/* Get the internal overhead associated with chunk p */ -#define overhead_for(p)\ - (is_mmapped(p)? MMAP_CHUNK_OVERHEAD : CHUNK_OVERHEAD) - -/* Return true if malloced space is not necessarily cleared */ -#if MMAP_CLEARS -#define calloc_must_clear(p) (!is_mmapped(p)) -#else /* MMAP_CLEARS */ -#define calloc_must_clear(p) (1) -#endif /* MMAP_CLEARS */ - -/* ---------------------- Overlaid data structures ----------------------- */ - -/* - When chunks are not in use, they are treated as nodes of either - lists or trees. - - "Small" chunks are stored in circular doubly-linked lists, and look - like this: - - chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Size of previous chunk | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - `head:' | Size of chunk, in bytes |P| - mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Forward pointer to next chunk in list | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Back pointer to previous chunk in list | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Unused space (may be 0 bytes long) . - . . - . | -nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - `foot:' | Size of chunk, in bytes | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - - Larger chunks are kept in a form of bitwise digital trees (aka - tries) keyed on chunksizes. Because malloc_tree_chunks are only for - free chunks greater than 256 bytes, their size doesn't impose any - constraints on user chunk sizes. Each node looks like: - - chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Size of previous chunk | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - `head:' | Size of chunk, in bytes |P| - mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Forward pointer to next chunk of same size | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Back pointer to previous chunk of same size | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Pointer to left child (child[0]) | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Pointer to right child (child[1]) | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Pointer to parent | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | bin index of this chunk | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Unused space . - . | -nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - `foot:' | Size of chunk, in bytes | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - - Each tree holding treenodes is a tree of unique chunk sizes. Chunks - of the same size are arranged in a circularly-linked list, with only - the oldest chunk (the next to be used, in our FIFO ordering) - actually in the tree. (Tree members are distinguished by a non-null - parent pointer.) If a chunk with the same size an an existing node - is inserted, it is linked off the existing node using pointers that - work in the same way as fd/bk pointers of small chunks. - - Each tree contains a power of 2 sized range of chunk sizes (the - smallest is 0x100 <= x < 0x180), which is is divided in half at each - tree level, with the chunks in the smaller half of the range (0x100 - <= x < 0x140 for the top nose) in the left subtree and the larger - half (0x140 <= x < 0x180) in the right subtree. This is, of course, - done by inspecting individual bits. - - Using these rules, each node's left subtree contains all smaller - sizes than its right subtree. However, the node at the root of each - subtree has no particular ordering relationship to either. (The - dividing line between the subtree sizes is based on trie relation.) - If we remove the last chunk of a given size from the interior of the - tree, we need to replace it with a leaf node. The tree ordering - rules permit a node to be replaced by any leaf below it. - - The smallest chunk in a tree (a common operation in a best-fit - allocator) can be found by walking a path to the leftmost leaf in - the tree. Unlike a usual binary tree, where we follow left child - pointers until we reach a null, here we follow the right child - pointer any time the left one is null, until we reach a leaf with - both child pointers null. The smallest chunk in the tree will be - somewhere along that path. - - The worst case number of steps to add, find, or remove a node is - bounded by the number of bits differentiating chunks within - bins. Under current bin calculations, this ranges from 6 up to 21 - (for 32 bit sizes) or up to 53 (for 64 bit sizes). The typical case - is of course much better. -*/ - -struct malloc_tree_chunk { - /* The first four fields must be compatible with malloc_chunk */ - size_t prev_foot; - size_t head; - struct malloc_tree_chunk* fd; - struct malloc_tree_chunk* bk; - - struct malloc_tree_chunk* child[2]; - struct malloc_tree_chunk* parent; - bindex_t index; -}; - -typedef struct malloc_tree_chunk tchunk; -typedef struct malloc_tree_chunk* tchunkptr; -typedef struct malloc_tree_chunk* tbinptr; /* The type of bins of trees */ - -/* A little helper macro for trees */ -#define leftmost_child(t) ((t)->child[0] != 0? (t)->child[0] : (t)->child[1]) - -/* ----------------------------- Segments -------------------------------- */ - -/* - Each malloc space may include non-contiguous segments, held in a - list headed by an embedded malloc_segment record representing the - top-most space. Segments also include flags holding properties of - the space. Large chunks that are directly allocated by mmap are not - included in this list. They are instead independently created and - destroyed without otherwise keeping track of them. - - Segment management mainly comes into play for spaces allocated by - MMAP. Any call to MMAP might or might not return memory that is - adjacent to an existing segment. MORECORE normally contiguously - extends the current space, so this space is almost always adjacent, - which is simpler and faster to deal with. (This is why MORECORE is - used preferentially to MMAP when both are available -- see - sys_alloc.) When allocating using MMAP, we don't use any of the - hinting mechanisms (inconsistently) supported in various - implementations of unix mmap, or distinguish reserving from - committing memory. Instead, we just ask for space, and exploit - contiguity when we get it. It is probably possible to do - better than this on some systems, but no general scheme seems - to be significantly better. - - Management entails a simpler variant of the consolidation scheme - used for chunks to reduce fragmentation -- new adjacent memory is - normally prepended or appended to an existing segment. However, - there are limitations compared to chunk consolidation that mostly - reflect the fact that segment processing is relatively infrequent - (occurring only when getting memory from system) and that we - don't expect to have huge numbers of segments: - - * Segments are not indexed, so traversal requires linear scans. (It - would be possible to index these, but is not worth the extra - overhead and complexity for most programs on most platforms.) - * New segments are only appended to old ones when holding top-most - memory; if they cannot be prepended to others, they are held in - different segments. - - Except for the top-most segment of an mstate, each segment record - is kept at the tail of its segment. Segments are added by pushing - segment records onto the list headed by &mstate.seg for the - containing mstate. - - Segment flags control allocation/merge/deallocation policies: - * If EXTERN_BIT set, then we did not allocate this segment, - and so should not try to deallocate or merge with others. - (This currently holds only for the initial segment passed - into create_mspace_with_base.) - * If IS_MMAPPED_BIT set, the segment may be merged with - other surrounding mmapped segments and trimmed/de-allocated - using munmap. - * If neither bit is set, then the segment was obtained using - MORECORE so can be merged with surrounding MORECORE'd segments - and deallocated/trimmed using MORECORE with negative arguments. -*/ - -struct malloc_segment { - char* base; /* base address */ - size_t size; /* allocated size */ - struct malloc_segment* next; /* ptr to next segment */ -#if FFI_MMAP_EXEC_WRIT - /* The mmap magic is supposed to store the address of the executable - segment at the very end of the requested block. */ - -# define mmap_exec_offset(b,s) (*(ptrdiff_t*)((b)+(s)-sizeof(ptrdiff_t))) - - /* We can only merge segments if their corresponding executable - segments are at identical offsets. */ -# define check_segment_merge(S,b,s) \ - (mmap_exec_offset((b),(s)) == (S)->exec_offset) - -# define add_segment_exec_offset(p,S) ((char*)(p) + (S)->exec_offset) -# define sub_segment_exec_offset(p,S) ((char*)(p) - (S)->exec_offset) - - /* The removal of sflags only works with HAVE_MORECORE == 0. */ - -# define get_segment_flags(S) (IS_MMAPPED_BIT) -# define set_segment_flags(S,v) \ - (((v) != IS_MMAPPED_BIT) ? (ABORT, (v)) : \ - (((S)->exec_offset = \ - mmap_exec_offset((S)->base, (S)->size)), \ - (mmap_exec_offset((S)->base + (S)->exec_offset, (S)->size) != \ - (S)->exec_offset) ? (ABORT, (v)) : \ - (mmap_exec_offset((S)->base, (S)->size) = 0), (v))) - - /* We use an offset here, instead of a pointer, because then, when - base changes, we don't have to modify this. On architectures - with segmented addresses, this might not work. */ - ptrdiff_t exec_offset; -#else - -# define get_segment_flags(S) ((S)->sflags) -# define set_segment_flags(S,v) ((S)->sflags = (v)) -# define check_segment_merge(S,b,s) (1) - - flag_t sflags; /* mmap and extern flag */ -#endif -}; - -#define is_mmapped_segment(S) (get_segment_flags(S) & IS_MMAPPED_BIT) -#define is_extern_segment(S) (get_segment_flags(S) & EXTERN_BIT) - -typedef struct malloc_segment msegment; -typedef struct malloc_segment* msegmentptr; - -/* ---------------------------- malloc_state ----------------------------- */ - -/* - A malloc_state holds all of the bookkeeping for a space. - The main fields are: - - Top - The topmost chunk of the currently active segment. Its size is - cached in topsize. The actual size of topmost space is - topsize+TOP_FOOT_SIZE, which includes space reserved for adding - fenceposts and segment records if necessary when getting more - space from the system. The size at which to autotrim top is - cached from mparams in trim_check, except that it is disabled if - an autotrim fails. - - Designated victim (dv) - This is the preferred chunk for servicing small requests that - don't have exact fits. It is normally the chunk split off most - recently to service another small request. Its size is cached in - dvsize. The link fields of this chunk are not maintained since it - is not kept in a bin. - - SmallBins - An array of bin headers for free chunks. These bins hold chunks - with sizes less than MIN_LARGE_SIZE bytes. Each bin contains - chunks of all the same size, spaced 8 bytes apart. To simplify - use in double-linked lists, each bin header acts as a malloc_chunk - pointing to the real first node, if it exists (else pointing to - itself). This avoids special-casing for headers. But to avoid - waste, we allocate only the fd/bk pointers of bins, and then use - repositioning tricks to treat these as the fields of a chunk. - - TreeBins - Treebins are pointers to the roots of trees holding a range of - sizes. There are 2 equally spaced treebins for each power of two - from TREE_SHIFT to TREE_SHIFT+16. The last bin holds anything - larger. - - Bin maps - There is one bit map for small bins ("smallmap") and one for - treebins ("treemap). Each bin sets its bit when non-empty, and - clears the bit when empty. Bit operations are then used to avoid - bin-by-bin searching -- nearly all "search" is done without ever - looking at bins that won't be selected. The bit maps - conservatively use 32 bits per map word, even if on 64bit system. - For a good description of some of the bit-based techniques used - here, see Henry S. Warren Jr's book "Hacker's Delight" (and - supplement at http://hackersdelight.org/). Many of these are - intended to reduce the branchiness of paths through malloc etc, as - well as to reduce the number of memory locations read or written. - - Segments - A list of segments headed by an embedded malloc_segment record - representing the initial space. - - Address check support - The least_addr field is the least address ever obtained from - MORECORE or MMAP. Attempted frees and reallocs of any address less - than this are trapped (unless INSECURE is defined). - - Magic tag - A cross-check field that should always hold same value as mparams.magic. - - Flags - Bits recording whether to use MMAP, locks, or contiguous MORECORE - - Statistics - Each space keeps track of current and maximum system memory - obtained via MORECORE or MMAP. - - Locking - If USE_LOCKS is defined, the "mutex" lock is acquired and released - around every public call using this mspace. -*/ - -/* Bin types, widths and sizes */ -#define NSMALLBINS (32U) -#define NTREEBINS (32U) -#define SMALLBIN_SHIFT (3U) -#define SMALLBIN_WIDTH (SIZE_T_ONE << SMALLBIN_SHIFT) -#define TREEBIN_SHIFT (8U) -#define MIN_LARGE_SIZE (SIZE_T_ONE << TREEBIN_SHIFT) -#define MAX_SMALL_SIZE (MIN_LARGE_SIZE - SIZE_T_ONE) -#define MAX_SMALL_REQUEST (MAX_SMALL_SIZE - CHUNK_ALIGN_MASK - CHUNK_OVERHEAD) - -struct malloc_state { - binmap_t smallmap; - binmap_t treemap; - size_t dvsize; - size_t topsize; - char* least_addr; - mchunkptr dv; - mchunkptr top; - size_t trim_check; - size_t magic; - mchunkptr smallbins[(NSMALLBINS+1)*2]; - tbinptr treebins[NTREEBINS]; - size_t footprint; - size_t max_footprint; - flag_t mflags; -#if USE_LOCKS - MLOCK_T mutex; /* locate lock among fields that rarely change */ -#endif /* USE_LOCKS */ - msegment seg; -}; - -typedef struct malloc_state* mstate; - -/* ------------- Global malloc_state and malloc_params ------------------- */ - -/* - malloc_params holds global properties, including those that can be - dynamically set using mallopt. There is a single instance, mparams, - initialized in init_mparams. -*/ - -struct malloc_params { - size_t magic; - size_t page_size; - size_t granularity; - size_t mmap_threshold; - size_t trim_threshold; - flag_t default_mflags; -}; - -static struct malloc_params mparams; - -/* The global malloc_state used for all non-"mspace" calls */ -static struct malloc_state _gm_; -#define gm (&_gm_) -#define is_global(M) ((M) == &_gm_) -#define is_initialized(M) ((M)->top != 0) - -/* -------------------------- system alloc setup ------------------------- */ - -/* Operations on mflags */ - -#define use_lock(M) ((M)->mflags & USE_LOCK_BIT) -#define enable_lock(M) ((M)->mflags |= USE_LOCK_BIT) -#define disable_lock(M) ((M)->mflags &= ~USE_LOCK_BIT) - -#define use_mmap(M) ((M)->mflags & USE_MMAP_BIT) -#define enable_mmap(M) ((M)->mflags |= USE_MMAP_BIT) -#define disable_mmap(M) ((M)->mflags &= ~USE_MMAP_BIT) - -#define use_noncontiguous(M) ((M)->mflags & USE_NONCONTIGUOUS_BIT) -#define disable_contiguous(M) ((M)->mflags |= USE_NONCONTIGUOUS_BIT) - -#define set_lock(M,L)\ - ((M)->mflags = (L)?\ - ((M)->mflags | USE_LOCK_BIT) :\ - ((M)->mflags & ~USE_LOCK_BIT)) - -/* page-align a size */ -#define page_align(S)\ - (((S) + (mparams.page_size)) & ~(mparams.page_size - SIZE_T_ONE)) - -/* granularity-align a size */ -#define granularity_align(S)\ - (((S) + (mparams.granularity)) & ~(mparams.granularity - SIZE_T_ONE)) - -#define is_page_aligned(S)\ - (((size_t)(S) & (mparams.page_size - SIZE_T_ONE)) == 0) -#define is_granularity_aligned(S)\ - (((size_t)(S) & (mparams.granularity - SIZE_T_ONE)) == 0) - -/* True if segment S holds address A */ -#define segment_holds(S, A)\ - ((char*)(A) >= S->base && (char*)(A) < S->base + S->size) - -/* Return segment holding given address */ -static msegmentptr segment_holding(mstate m, char* addr) { - msegmentptr sp = &m->seg; - for (;;) { - if (addr >= sp->base && addr < sp->base + sp->size) - return sp; - if ((sp = sp->next) == 0) - return 0; - } -} - -/* Return true if segment contains a segment link */ -static int has_segment_link(mstate m, msegmentptr ss) { - msegmentptr sp = &m->seg; - for (;;) { - if ((char*)sp >= ss->base && (char*)sp < ss->base + ss->size) - return 1; - if ((sp = sp->next) == 0) - return 0; - } -} - -#ifndef MORECORE_CANNOT_TRIM -#define should_trim(M,s) ((s) > (M)->trim_check) -#else /* MORECORE_CANNOT_TRIM */ -#define should_trim(M,s) (0) -#endif /* MORECORE_CANNOT_TRIM */ - -/* - TOP_FOOT_SIZE is padding at the end of a segment, including space - that may be needed to place segment records and fenceposts when new - noncontiguous segments are added. -*/ -#define TOP_FOOT_SIZE\ - (align_offset(chunk2mem(0))+pad_request(sizeof(struct malloc_segment))+MIN_CHUNK_SIZE) - - -/* ------------------------------- Hooks -------------------------------- */ - -/* - PREACTION should be defined to return 0 on success, and nonzero on - failure. If you are not using locking, you can redefine these to do - anything you like. -*/ - -#if USE_LOCKS - -/* Ensure locks are initialized */ -#define GLOBALLY_INITIALIZE() (mparams.page_size == 0 && init_mparams()) - -#define PREACTION(M) ((GLOBALLY_INITIALIZE() || use_lock(M))? ACQUIRE_LOCK(&(M)->mutex) : 0) -#define POSTACTION(M) { if (use_lock(M)) RELEASE_LOCK(&(M)->mutex); } -#else /* USE_LOCKS */ - -#ifndef PREACTION -#define PREACTION(M) (0) -#endif /* PREACTION */ - -#ifndef POSTACTION -#define POSTACTION(M) -#endif /* POSTACTION */ - -#endif /* USE_LOCKS */ - -/* - CORRUPTION_ERROR_ACTION is triggered upon detected bad addresses. - USAGE_ERROR_ACTION is triggered on detected bad frees and - reallocs. The argument p is an address that might have triggered the - fault. It is ignored by the two predefined actions, but might be - useful in custom actions that try to help diagnose errors. -*/ - -#if PROCEED_ON_ERROR - -/* A count of the number of corruption errors causing resets */ -int malloc_corruption_error_count; - -/* default corruption action */ -static void reset_on_error(mstate m); - -#define CORRUPTION_ERROR_ACTION(m) reset_on_error(m) -#define USAGE_ERROR_ACTION(m, p) - -#else /* PROCEED_ON_ERROR */ - -#ifndef CORRUPTION_ERROR_ACTION -#define CORRUPTION_ERROR_ACTION(m) ABORT -#endif /* CORRUPTION_ERROR_ACTION */ - -#ifndef USAGE_ERROR_ACTION -#define USAGE_ERROR_ACTION(m,p) ABORT -#endif /* USAGE_ERROR_ACTION */ - -#endif /* PROCEED_ON_ERROR */ - -/* -------------------------- Debugging setup ---------------------------- */ - -#if ! DEBUG - -#define check_free_chunk(M,P) -#define check_inuse_chunk(M,P) -#define check_malloced_chunk(M,P,N) -#define check_mmapped_chunk(M,P) -#define check_malloc_state(M) -#define check_top_chunk(M,P) - -#else /* DEBUG */ -#define check_free_chunk(M,P) do_check_free_chunk(M,P) -#define check_inuse_chunk(M,P) do_check_inuse_chunk(M,P) -#define check_top_chunk(M,P) do_check_top_chunk(M,P) -#define check_malloced_chunk(M,P,N) do_check_malloced_chunk(M,P,N) -#define check_mmapped_chunk(M,P) do_check_mmapped_chunk(M,P) -#define check_malloc_state(M) do_check_malloc_state(M) - -static void do_check_any_chunk(mstate m, mchunkptr p); -static void do_check_top_chunk(mstate m, mchunkptr p); -static void do_check_mmapped_chunk(mstate m, mchunkptr p); -static void do_check_inuse_chunk(mstate m, mchunkptr p); -static void do_check_free_chunk(mstate m, mchunkptr p); -static void do_check_malloced_chunk(mstate m, void* mem, size_t s); -static void do_check_tree(mstate m, tchunkptr t); -static void do_check_treebin(mstate m, bindex_t i); -static void do_check_smallbin(mstate m, bindex_t i); -static void do_check_malloc_state(mstate m); -static int bin_find(mstate m, mchunkptr x); -static size_t traverse_and_check(mstate m); -#endif /* DEBUG */ - -/* ---------------------------- Indexing Bins ---------------------------- */ - -#define is_small(s) (((s) >> SMALLBIN_SHIFT) < NSMALLBINS) -#define small_index(s) ((s) >> SMALLBIN_SHIFT) -#define small_index2size(i) ((i) << SMALLBIN_SHIFT) -#define MIN_SMALL_INDEX (small_index(MIN_CHUNK_SIZE)) - -/* addressing by index. See above about smallbin repositioning */ -#define smallbin_at(M, i) ((sbinptr)((char*)&((M)->smallbins[(i)<<1]))) -#define treebin_at(M,i) (&((M)->treebins[i])) - -/* assign tree index for size S to variable I */ -#if defined(__GNUC__) && defined(__i386__) -#define compute_tree_index(S, I)\ -{\ - size_t X = S >> TREEBIN_SHIFT;\ - if (X == 0)\ - I = 0;\ - else if (X > 0xFFFF)\ - I = NTREEBINS-1;\ - else {\ - unsigned int K;\ - __asm__("bsrl %1,%0\n\t" : "=r" (K) : "rm" (X));\ - I = (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\ - }\ -} -#else /* GNUC */ -#define compute_tree_index(S, I)\ -{\ - size_t X = S >> TREEBIN_SHIFT;\ - if (X == 0)\ - I = 0;\ - else if (X > 0xFFFF)\ - I = NTREEBINS-1;\ - else {\ - unsigned int Y = (unsigned int)X;\ - unsigned int N = ((Y - 0x100) >> 16) & 8;\ - unsigned int K = (((Y <<= N) - 0x1000) >> 16) & 4;\ - N += K;\ - N += K = (((Y <<= K) - 0x4000) >> 16) & 2;\ - K = 14 - N + ((Y <<= K) >> 15);\ - I = (K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1));\ - }\ -} -#endif /* GNUC */ - -/* Bit representing maximum resolved size in a treebin at i */ -#define bit_for_tree_index(i) \ - (i == NTREEBINS-1)? (SIZE_T_BITSIZE-1) : (((i) >> 1) + TREEBIN_SHIFT - 2) - -/* Shift placing maximum resolved bit in a treebin at i as sign bit */ -#define leftshift_for_tree_index(i) \ - ((i == NTREEBINS-1)? 0 : \ - ((SIZE_T_BITSIZE-SIZE_T_ONE) - (((i) >> 1) + TREEBIN_SHIFT - 2))) - -/* The size of the smallest chunk held in bin with index i */ -#define minsize_for_tree_index(i) \ - ((SIZE_T_ONE << (((i) >> 1) + TREEBIN_SHIFT)) | \ - (((size_t)((i) & SIZE_T_ONE)) << (((i) >> 1) + TREEBIN_SHIFT - 1))) - - -/* ------------------------ Operations on bin maps ----------------------- */ - -/* bit corresponding to given index */ -#define idx2bit(i) ((binmap_t)(1) << (i)) - -/* Mark/Clear bits with given index */ -#define mark_smallmap(M,i) ((M)->smallmap |= idx2bit(i)) -#define clear_smallmap(M,i) ((M)->smallmap &= ~idx2bit(i)) -#define smallmap_is_marked(M,i) ((M)->smallmap & idx2bit(i)) - -#define mark_treemap(M,i) ((M)->treemap |= idx2bit(i)) -#define clear_treemap(M,i) ((M)->treemap &= ~idx2bit(i)) -#define treemap_is_marked(M,i) ((M)->treemap & idx2bit(i)) - -/* index corresponding to given bit */ - -#if defined(__GNUC__) && defined(__i386__) -#define compute_bit2idx(X, I)\ -{\ - unsigned int J;\ - __asm__("bsfl %1,%0\n\t" : "=r" (J) : "rm" (X));\ - I = (bindex_t)J;\ -} - -#else /* GNUC */ -#if USE_BUILTIN_FFS -#define compute_bit2idx(X, I) I = __builtin_ffs(X)-1 - -#else /* USE_BUILTIN_FFS */ -#define compute_bit2idx(X, I)\ -{\ - unsigned int Y = X - 1;\ - unsigned int K = Y >> (16-4) & 16;\ - unsigned int N = K; Y >>= K;\ - N += K = Y >> (8-3) & 8; Y >>= K;\ - N += K = Y >> (4-2) & 4; Y >>= K;\ - N += K = Y >> (2-1) & 2; Y >>= K;\ - N += K = Y >> (1-0) & 1; Y >>= K;\ - I = (bindex_t)(N + Y);\ -} -#endif /* USE_BUILTIN_FFS */ -#endif /* GNUC */ - -/* isolate the least set bit of a bitmap */ -#define least_bit(x) ((x) & -(x)) - -/* mask with all bits to left of least bit of x on */ -#define left_bits(x) ((x<<1) | -(x<<1)) - -/* mask with all bits to left of or equal to least bit of x on */ -#define same_or_left_bits(x) ((x) | -(x)) - - -/* ----------------------- Runtime Check Support ------------------------- */ - -/* - For security, the main invariant is that malloc/free/etc never - writes to a static address other than malloc_state, unless static - malloc_state itself has been corrupted, which cannot occur via - malloc (because of these checks). In essence this means that we - believe all pointers, sizes, maps etc held in malloc_state, but - check all of those linked or offsetted from other embedded data - structures. These checks are interspersed with main code in a way - that tends to minimize their run-time cost. - - When FOOTERS is defined, in addition to range checking, we also - verify footer fields of inuse chunks, which can be used guarantee - that the mstate controlling malloc/free is intact. This is a - streamlined version of the approach described by William Robertson - et al in "Run-time Detection of Heap-based Overflows" LISA'03 - http://www.usenix.org/events/lisa03/tech/robertson.html The footer - of an inuse chunk holds the xor of its mstate and a random seed, - that is checked upon calls to free() and realloc(). This is - (probablistically) unguessable from outside the program, but can be - computed by any code successfully malloc'ing any chunk, so does not - itself provide protection against code that has already broken - security through some other means. Unlike Robertson et al, we - always dynamically check addresses of all offset chunks (previous, - next, etc). This turns out to be cheaper than relying on hashes. -*/ - -#if !INSECURE -/* Check if address a is at least as high as any from MORECORE or MMAP */ -#define ok_address(M, a) ((char*)(a) >= (M)->least_addr) -/* Check if address of next chunk n is higher than base chunk p */ -#define ok_next(p, n) ((char*)(p) < (char*)(n)) -/* Check if p has its cinuse bit on */ -#define ok_cinuse(p) cinuse(p) -/* Check if p has its pinuse bit on */ -#define ok_pinuse(p) pinuse(p) - -#else /* !INSECURE */ -#define ok_address(M, a) (1) -#define ok_next(b, n) (1) -#define ok_cinuse(p) (1) -#define ok_pinuse(p) (1) -#endif /* !INSECURE */ - -#if (FOOTERS && !INSECURE) -/* Check if (alleged) mstate m has expected magic field */ -#define ok_magic(M) ((M)->magic == mparams.magic) -#else /* (FOOTERS && !INSECURE) */ -#define ok_magic(M) (1) -#endif /* (FOOTERS && !INSECURE) */ - - -/* In gcc, use __builtin_expect to minimize impact of checks */ -#if !INSECURE -#if defined(__GNUC__) && __GNUC__ >= 3 -#define RTCHECK(e) __builtin_expect(e, 1) -#else /* GNUC */ -#define RTCHECK(e) (e) -#endif /* GNUC */ -#else /* !INSECURE */ -#define RTCHECK(e) (1) -#endif /* !INSECURE */ - -/* macros to set up inuse chunks with or without footers */ - -#if !FOOTERS - -#define mark_inuse_foot(M,p,s) - -/* Set cinuse bit and pinuse bit of next chunk */ -#define set_inuse(M,p,s)\ - ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\ - ((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT) - -/* Set cinuse and pinuse of this chunk and pinuse of next chunk */ -#define set_inuse_and_pinuse(M,p,s)\ - ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\ - ((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT) - -/* Set size, cinuse and pinuse bit of this chunk */ -#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\ - ((p)->head = (s|PINUSE_BIT|CINUSE_BIT)) - -#else /* FOOTERS */ - -/* Set foot of inuse chunk to be xor of mstate and seed */ -#define mark_inuse_foot(M,p,s)\ - (((mchunkptr)((char*)(p) + (s)))->prev_foot = ((size_t)(M) ^ mparams.magic)) - -#define get_mstate_for(p)\ - ((mstate)(((mchunkptr)((char*)(p) +\ - (chunksize(p))))->prev_foot ^ mparams.magic)) - -#define set_inuse(M,p,s)\ - ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\ - (((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT), \ - mark_inuse_foot(M,p,s)) - -#define set_inuse_and_pinuse(M,p,s)\ - ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\ - (((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT),\ - mark_inuse_foot(M,p,s)) - -#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\ - ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\ - mark_inuse_foot(M, p, s)) - -#endif /* !FOOTERS */ - -/* ---------------------------- setting mparams -------------------------- */ - -/* Initialize mparams */ -static int init_mparams(void) { - if (mparams.page_size == 0) { - size_t s; - - mparams.mmap_threshold = DEFAULT_MMAP_THRESHOLD; - mparams.trim_threshold = DEFAULT_TRIM_THRESHOLD; -#if MORECORE_CONTIGUOUS - mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT; -#else /* MORECORE_CONTIGUOUS */ - mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT|USE_NONCONTIGUOUS_BIT; -#endif /* MORECORE_CONTIGUOUS */ - -#if (FOOTERS && !INSECURE) - { -#if USE_DEV_RANDOM - int fd; - unsigned char buf[sizeof(size_t)]; - /* Try to use /dev/urandom, else fall back on using time */ - if ((fd = open("/dev/urandom", O_RDONLY)) >= 0 && - read(fd, buf, sizeof(buf)) == sizeof(buf)) { - s = *((size_t *) buf); - close(fd); - } - else -#endif /* USE_DEV_RANDOM */ - s = (size_t)(time(0) ^ (size_t)0x55555555U); - - s |= (size_t)8U; /* ensure nonzero */ - s &= ~(size_t)7U; /* improve chances of fault for bad values */ - - } -#else /* (FOOTERS && !INSECURE) */ - s = (size_t)0x58585858U; -#endif /* (FOOTERS && !INSECURE) */ - ACQUIRE_MAGIC_INIT_LOCK(); - if (mparams.magic == 0) { - mparams.magic = s; - /* Set up lock for main malloc area */ - INITIAL_LOCK(&gm->mutex); - gm->mflags = mparams.default_mflags; - } - RELEASE_MAGIC_INIT_LOCK(); - -#if !defined(WIN32) && !defined(__OS2__) - mparams.page_size = malloc_getpagesize; - mparams.granularity = ((DEFAULT_GRANULARITY != 0)? - DEFAULT_GRANULARITY : mparams.page_size); -#elif defined (__OS2__) - /* if low-memory is used, os2munmap() would break - if it were anything other than 64k */ - mparams.page_size = 4096u; - mparams.granularity = 65536u; -#else /* WIN32 */ - { - SYSTEM_INFO system_info; - GetSystemInfo(&system_info); - mparams.page_size = system_info.dwPageSize; - mparams.granularity = system_info.dwAllocationGranularity; - } -#endif /* WIN32 */ - - /* Sanity-check configuration: - size_t must be unsigned and as wide as pointer type. - ints must be at least 4 bytes. - alignment must be at least 8. - Alignment, min chunk size, and page size must all be powers of 2. - */ - if ((sizeof(size_t) != sizeof(char*)) || - (MAX_SIZE_T < MIN_CHUNK_SIZE) || - (sizeof(int) < 4) || - (MALLOC_ALIGNMENT < (size_t)8U) || - ((MALLOC_ALIGNMENT & (MALLOC_ALIGNMENT-SIZE_T_ONE)) != 0) || - ((MCHUNK_SIZE & (MCHUNK_SIZE-SIZE_T_ONE)) != 0) || - ((mparams.granularity & (mparams.granularity-SIZE_T_ONE)) != 0) || - ((mparams.page_size & (mparams.page_size-SIZE_T_ONE)) != 0)) - ABORT; - } - return 0; -} - -/* support for mallopt */ -static int change_mparam(int param_number, int value) { - size_t val = (size_t)value; - init_mparams(); - switch(param_number) { - case M_TRIM_THRESHOLD: - mparams.trim_threshold = val; - return 1; - case M_GRANULARITY: - if (val >= mparams.page_size && ((val & (val-1)) == 0)) { - mparams.granularity = val; - return 1; - } - else - return 0; - case M_MMAP_THRESHOLD: - mparams.mmap_threshold = val; - return 1; - default: - return 0; - } -} - -#if DEBUG -/* ------------------------- Debugging Support --------------------------- */ - -/* Check properties of any chunk, whether free, inuse, mmapped etc */ -static void do_check_any_chunk(mstate m, mchunkptr p) { - assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD)); - assert(ok_address(m, p)); -} - -/* Check properties of top chunk */ -static void do_check_top_chunk(mstate m, mchunkptr p) { - msegmentptr sp = segment_holding(m, (char*)p); - size_t sz = chunksize(p); - assert(sp != 0); - assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD)); - assert(ok_address(m, p)); - assert(sz == m->topsize); - assert(sz > 0); - assert(sz == ((sp->base + sp->size) - (char*)p) - TOP_FOOT_SIZE); - assert(pinuse(p)); - assert(!next_pinuse(p)); -} - -/* Check properties of (inuse) mmapped chunks */ -static void do_check_mmapped_chunk(mstate m, mchunkptr p) { - size_t sz = chunksize(p); - size_t len = (sz + (p->prev_foot & ~IS_MMAPPED_BIT) + MMAP_FOOT_PAD); - assert(is_mmapped(p)); - assert(use_mmap(m)); - assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD)); - assert(ok_address(m, p)); - assert(!is_small(sz)); - assert((len & (mparams.page_size-SIZE_T_ONE)) == 0); - assert(chunk_plus_offset(p, sz)->head == FENCEPOST_HEAD); - assert(chunk_plus_offset(p, sz+SIZE_T_SIZE)->head == 0); -} - -/* Check properties of inuse chunks */ -static void do_check_inuse_chunk(mstate m, mchunkptr p) { - do_check_any_chunk(m, p); - assert(cinuse(p)); - assert(next_pinuse(p)); - /* If not pinuse and not mmapped, previous chunk has OK offset */ - assert(is_mmapped(p) || pinuse(p) || next_chunk(prev_chunk(p)) == p); - if (is_mmapped(p)) - do_check_mmapped_chunk(m, p); -} - -/* Check properties of free chunks */ -static void do_check_free_chunk(mstate m, mchunkptr p) { - size_t sz = p->head & ~(PINUSE_BIT|CINUSE_BIT); - mchunkptr next = chunk_plus_offset(p, sz); - do_check_any_chunk(m, p); - assert(!cinuse(p)); - assert(!next_pinuse(p)); - assert (!is_mmapped(p)); - if (p != m->dv && p != m->top) { - if (sz >= MIN_CHUNK_SIZE) { - assert((sz & CHUNK_ALIGN_MASK) == 0); - assert(is_aligned(chunk2mem(p))); - assert(next->prev_foot == sz); - assert(pinuse(p)); - assert (next == m->top || cinuse(next)); - assert(p->fd->bk == p); - assert(p->bk->fd == p); - } - else /* markers are always of size SIZE_T_SIZE */ - assert(sz == SIZE_T_SIZE); - } -} - -/* Check properties of malloced chunks at the point they are malloced */ -static void do_check_malloced_chunk(mstate m, void* mem, size_t s) { - if (mem != 0) { - mchunkptr p = mem2chunk(mem); - size_t sz = p->head & ~(PINUSE_BIT|CINUSE_BIT); - do_check_inuse_chunk(m, p); - assert((sz & CHUNK_ALIGN_MASK) == 0); - assert(sz >= MIN_CHUNK_SIZE); - assert(sz >= s); - /* unless mmapped, size is less than MIN_CHUNK_SIZE more than request */ - assert(is_mmapped(p) || sz < (s + MIN_CHUNK_SIZE)); - } -} - -/* Check a tree and its subtrees. */ -static void do_check_tree(mstate m, tchunkptr t) { - tchunkptr head = 0; - tchunkptr u = t; - bindex_t tindex = t->index; - size_t tsize = chunksize(t); - bindex_t idx; - compute_tree_index(tsize, idx); - assert(tindex == idx); - assert(tsize >= MIN_LARGE_SIZE); - assert(tsize >= minsize_for_tree_index(idx)); - assert((idx == NTREEBINS-1) || (tsize < minsize_for_tree_index((idx+1)))); - - do { /* traverse through chain of same-sized nodes */ - do_check_any_chunk(m, ((mchunkptr)u)); - assert(u->index == tindex); - assert(chunksize(u) == tsize); - assert(!cinuse(u)); - assert(!next_pinuse(u)); - assert(u->fd->bk == u); - assert(u->bk->fd == u); - if (u->parent == 0) { - assert(u->child[0] == 0); - assert(u->child[1] == 0); - } - else { - assert(head == 0); /* only one node on chain has parent */ - head = u; - assert(u->parent != u); - assert (u->parent->child[0] == u || - u->parent->child[1] == u || - *((tbinptr*)(u->parent)) == u); - if (u->child[0] != 0) { - assert(u->child[0]->parent == u); - assert(u->child[0] != u); - do_check_tree(m, u->child[0]); - } - if (u->child[1] != 0) { - assert(u->child[1]->parent == u); - assert(u->child[1] != u); - do_check_tree(m, u->child[1]); - } - if (u->child[0] != 0 && u->child[1] != 0) { - assert(chunksize(u->child[0]) < chunksize(u->child[1])); - } - } - u = u->fd; - } while (u != t); - assert(head != 0); -} - -/* Check all the chunks in a treebin. */ -static void do_check_treebin(mstate m, bindex_t i) { - tbinptr* tb = treebin_at(m, i); - tchunkptr t = *tb; - int empty = (m->treemap & (1U << i)) == 0; - if (t == 0) - assert(empty); - if (!empty) - do_check_tree(m, t); -} - -/* Check all the chunks in a smallbin. */ -static void do_check_smallbin(mstate m, bindex_t i) { - sbinptr b = smallbin_at(m, i); - mchunkptr p = b->bk; - unsigned int empty = (m->smallmap & (1U << i)) == 0; - if (p == b) - assert(empty); - if (!empty) { - for (; p != b; p = p->bk) { - size_t size = chunksize(p); - mchunkptr q; - /* each chunk claims to be free */ - do_check_free_chunk(m, p); - /* chunk belongs in bin */ - assert(small_index(size) == i); - assert(p->bk == b || chunksize(p->bk) == chunksize(p)); - /* chunk is followed by an inuse chunk */ - q = next_chunk(p); - if (q->head != FENCEPOST_HEAD) - do_check_inuse_chunk(m, q); - } - } -} - -/* Find x in a bin. Used in other check functions. */ -static int bin_find(mstate m, mchunkptr x) { - size_t size = chunksize(x); - if (is_small(size)) { - bindex_t sidx = small_index(size); - sbinptr b = smallbin_at(m, sidx); - if (smallmap_is_marked(m, sidx)) { - mchunkptr p = b; - do { - if (p == x) - return 1; - } while ((p = p->fd) != b); - } - } - else { - bindex_t tidx; - compute_tree_index(size, tidx); - if (treemap_is_marked(m, tidx)) { - tchunkptr t = *treebin_at(m, tidx); - size_t sizebits = size << leftshift_for_tree_index(tidx); - while (t != 0 && chunksize(t) != size) { - t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]; - sizebits <<= 1; - } - if (t != 0) { - tchunkptr u = t; - do { - if (u == (tchunkptr)x) - return 1; - } while ((u = u->fd) != t); - } - } - } - return 0; -} - -/* Traverse each chunk and check it; return total */ -static size_t traverse_and_check(mstate m) { - size_t sum = 0; - if (is_initialized(m)) { - msegmentptr s = &m->seg; - sum += m->topsize + TOP_FOOT_SIZE; - while (s != 0) { - mchunkptr q = align_as_chunk(s->base); - mchunkptr lastq = 0; - assert(pinuse(q)); - while (segment_holds(s, q) && - q != m->top && q->head != FENCEPOST_HEAD) { - sum += chunksize(q); - if (cinuse(q)) { - assert(!bin_find(m, q)); - do_check_inuse_chunk(m, q); - } - else { - assert(q == m->dv || bin_find(m, q)); - assert(lastq == 0 || cinuse(lastq)); /* Not 2 consecutive free */ - do_check_free_chunk(m, q); - } - lastq = q; - q = next_chunk(q); - } - s = s->next; - } - } - return sum; -} - -/* Check all properties of malloc_state. */ -static void do_check_malloc_state(mstate m) { - bindex_t i; - size_t total; - /* check bins */ - for (i = 0; i < NSMALLBINS; ++i) - do_check_smallbin(m, i); - for (i = 0; i < NTREEBINS; ++i) - do_check_treebin(m, i); - - if (m->dvsize != 0) { /* check dv chunk */ - do_check_any_chunk(m, m->dv); - assert(m->dvsize == chunksize(m->dv)); - assert(m->dvsize >= MIN_CHUNK_SIZE); - assert(bin_find(m, m->dv) == 0); - } - - if (m->top != 0) { /* check top chunk */ - do_check_top_chunk(m, m->top); - assert(m->topsize == chunksize(m->top)); - assert(m->topsize > 0); - assert(bin_find(m, m->top) == 0); - } - - total = traverse_and_check(m); - assert(total <= m->footprint); - assert(m->footprint <= m->max_footprint); -} -#endif /* DEBUG */ - -/* ----------------------------- statistics ------------------------------ */ - -#if !NO_MALLINFO -static struct mallinfo internal_mallinfo(mstate m) { - struct mallinfo nm = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - if (!PREACTION(m)) { - check_malloc_state(m); - if (is_initialized(m)) { - size_t nfree = SIZE_T_ONE; /* top always free */ - size_t mfree = m->topsize + TOP_FOOT_SIZE; - size_t sum = mfree; - msegmentptr s = &m->seg; - while (s != 0) { - mchunkptr q = align_as_chunk(s->base); - while (segment_holds(s, q) && - q != m->top && q->head != FENCEPOST_HEAD) { - size_t sz = chunksize(q); - sum += sz; - if (!cinuse(q)) { - mfree += sz; - ++nfree; - } - q = next_chunk(q); - } - s = s->next; - } - - nm.arena = sum; - nm.ordblks = nfree; - nm.hblkhd = m->footprint - sum; - nm.usmblks = m->max_footprint; - nm.uordblks = m->footprint - mfree; - nm.fordblks = mfree; - nm.keepcost = m->topsize; - } - - POSTACTION(m); - } - return nm; -} -#endif /* !NO_MALLINFO */ - -static void internal_malloc_stats(mstate m) { - if (!PREACTION(m)) { - size_t maxfp = 0; - size_t fp = 0; - size_t used = 0; - check_malloc_state(m); - if (is_initialized(m)) { - msegmentptr s = &m->seg; - maxfp = m->max_footprint; - fp = m->footprint; - used = fp - (m->topsize + TOP_FOOT_SIZE); - - while (s != 0) { - mchunkptr q = align_as_chunk(s->base); - while (segment_holds(s, q) && - q != m->top && q->head != FENCEPOST_HEAD) { - if (!cinuse(q)) - used -= chunksize(q); - q = next_chunk(q); - } - s = s->next; - } - } - - fprintf(stderr, "max system bytes = %10lu\n", (unsigned long)(maxfp)); - fprintf(stderr, "system bytes = %10lu\n", (unsigned long)(fp)); - fprintf(stderr, "in use bytes = %10lu\n", (unsigned long)(used)); - - POSTACTION(m); - } -} - -/* ----------------------- Operations on smallbins ----------------------- */ - -/* - Various forms of linking and unlinking are defined as macros. Even - the ones for trees, which are very long but have very short typical - paths. This is ugly but reduces reliance on inlining support of - compilers. -*/ - -/* Link a free chunk into a smallbin */ -#define insert_small_chunk(M, P, S) {\ - bindex_t I = small_index(S);\ - mchunkptr B = smallbin_at(M, I);\ - mchunkptr F = B;\ - assert(S >= MIN_CHUNK_SIZE);\ - if (!smallmap_is_marked(M, I))\ - mark_smallmap(M, I);\ - else if (RTCHECK(ok_address(M, B->fd)))\ - F = B->fd;\ - else {\ - CORRUPTION_ERROR_ACTION(M);\ - }\ - B->fd = P;\ - F->bk = P;\ - P->fd = F;\ - P->bk = B;\ -} - -/* Unlink a chunk from a smallbin */ -#define unlink_small_chunk(M, P, S) {\ - mchunkptr F = P->fd;\ - mchunkptr B = P->bk;\ - bindex_t I = small_index(S);\ - assert(P != B);\ - assert(P != F);\ - assert(chunksize(P) == small_index2size(I));\ - if (F == B)\ - clear_smallmap(M, I);\ - else if (RTCHECK((F == smallbin_at(M,I) || ok_address(M, F)) &&\ - (B == smallbin_at(M,I) || ok_address(M, B)))) {\ - F->bk = B;\ - B->fd = F;\ - }\ - else {\ - CORRUPTION_ERROR_ACTION(M);\ - }\ -} - -/* Unlink the first chunk from a smallbin */ -#define unlink_first_small_chunk(M, B, P, I) {\ - mchunkptr F = P->fd;\ - assert(P != B);\ - assert(P != F);\ - assert(chunksize(P) == small_index2size(I));\ - if (B == F)\ - clear_smallmap(M, I);\ - else if (RTCHECK(ok_address(M, F))) {\ - B->fd = F;\ - F->bk = B;\ - }\ - else {\ - CORRUPTION_ERROR_ACTION(M);\ - }\ -} - -/* Replace dv node, binning the old one */ -/* Used only when dvsize known to be small */ -#define replace_dv(M, P, S) {\ - size_t DVS = M->dvsize;\ - if (DVS != 0) {\ - mchunkptr DV = M->dv;\ - assert(is_small(DVS));\ - insert_small_chunk(M, DV, DVS);\ - }\ - M->dvsize = S;\ - M->dv = P;\ -} - -/* ------------------------- Operations on trees ------------------------- */ - -/* Insert chunk into tree */ -#define insert_large_chunk(M, X, S) {\ - tbinptr* H;\ - bindex_t I;\ - compute_tree_index(S, I);\ - H = treebin_at(M, I);\ - X->index = I;\ - X->child[0] = X->child[1] = 0;\ - if (!treemap_is_marked(M, I)) {\ - mark_treemap(M, I);\ - *H = X;\ - X->parent = (tchunkptr)H;\ - X->fd = X->bk = X;\ - }\ - else {\ - tchunkptr T = *H;\ - size_t K = S << leftshift_for_tree_index(I);\ - for (;;) {\ - if (chunksize(T) != S) {\ - tchunkptr* C = &(T->child[(K >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]);\ - K <<= 1;\ - if (*C != 0)\ - T = *C;\ - else if (RTCHECK(ok_address(M, C))) {\ - *C = X;\ - X->parent = T;\ - X->fd = X->bk = X;\ - break;\ - }\ - else {\ - CORRUPTION_ERROR_ACTION(M);\ - break;\ - }\ - }\ - else {\ - tchunkptr F = T->fd;\ - if (RTCHECK(ok_address(M, T) && ok_address(M, F))) {\ - T->fd = F->bk = X;\ - X->fd = F;\ - X->bk = T;\ - X->parent = 0;\ - break;\ - }\ - else {\ - CORRUPTION_ERROR_ACTION(M);\ - break;\ - }\ - }\ - }\ - }\ -} - -/* - Unlink steps: - - 1. If x is a chained node, unlink it from its same-sized fd/bk links - and choose its bk node as its replacement. - 2. If x was the last node of its size, but not a leaf node, it must - be replaced with a leaf node (not merely one with an open left or - right), to make sure that lefts and rights of descendants - correspond properly to bit masks. We use the rightmost descendant - of x. We could use any other leaf, but this is easy to locate and - tends to counteract removal of leftmosts elsewhere, and so keeps - paths shorter than minimally guaranteed. This doesn't loop much - because on average a node in a tree is near the bottom. - 3. If x is the base of a chain (i.e., has parent links) relink - x's parent and children to x's replacement (or null if none). -*/ - -#define unlink_large_chunk(M, X) {\ - tchunkptr XP = X->parent;\ - tchunkptr R;\ - if (X->bk != X) {\ - tchunkptr F = X->fd;\ - R = X->bk;\ - if (RTCHECK(ok_address(M, F))) {\ - F->bk = R;\ - R->fd = F;\ - }\ - else {\ - CORRUPTION_ERROR_ACTION(M);\ - }\ - }\ - else {\ - tchunkptr* RP;\ - if (((R = *(RP = &(X->child[1]))) != 0) ||\ - ((R = *(RP = &(X->child[0]))) != 0)) {\ - tchunkptr* CP;\ - while ((*(CP = &(R->child[1])) != 0) ||\ - (*(CP = &(R->child[0])) != 0)) {\ - R = *(RP = CP);\ - }\ - if (RTCHECK(ok_address(M, RP)))\ - *RP = 0;\ - else {\ - CORRUPTION_ERROR_ACTION(M);\ - }\ - }\ - }\ - if (XP != 0) {\ - tbinptr* H = treebin_at(M, X->index);\ - if (X == *H) {\ - if ((*H = R) == 0) \ - clear_treemap(M, X->index);\ - }\ - else if (RTCHECK(ok_address(M, XP))) {\ - if (XP->child[0] == X) \ - XP->child[0] = R;\ - else \ - XP->child[1] = R;\ - }\ - else\ - CORRUPTION_ERROR_ACTION(M);\ - if (R != 0) {\ - if (RTCHECK(ok_address(M, R))) {\ - tchunkptr C0, C1;\ - R->parent = XP;\ - if ((C0 = X->child[0]) != 0) {\ - if (RTCHECK(ok_address(M, C0))) {\ - R->child[0] = C0;\ - C0->parent = R;\ - }\ - else\ - CORRUPTION_ERROR_ACTION(M);\ - }\ - if ((C1 = X->child[1]) != 0) {\ - if (RTCHECK(ok_address(M, C1))) {\ - R->child[1] = C1;\ - C1->parent = R;\ - }\ - else\ - CORRUPTION_ERROR_ACTION(M);\ - }\ - }\ - else\ - CORRUPTION_ERROR_ACTION(M);\ - }\ - }\ -} - -/* Relays to large vs small bin operations */ - -#define insert_chunk(M, P, S)\ - if (is_small(S)) insert_small_chunk(M, P, S)\ - else { tchunkptr TP = (tchunkptr)(P); insert_large_chunk(M, TP, S); } - -#define unlink_chunk(M, P, S)\ - if (is_small(S)) unlink_small_chunk(M, P, S)\ - else { tchunkptr TP = (tchunkptr)(P); unlink_large_chunk(M, TP); } - - -/* Relays to internal calls to malloc/free from realloc, memalign etc */ - -#if ONLY_MSPACES -#define internal_malloc(m, b) mspace_malloc(m, b) -#define internal_free(m, mem) mspace_free(m,mem); -#else /* ONLY_MSPACES */ -#if MSPACES -#define internal_malloc(m, b)\ - (m == gm)? dlmalloc(b) : mspace_malloc(m, b) -#define internal_free(m, mem)\ - if (m == gm) dlfree(mem); else mspace_free(m,mem); -#else /* MSPACES */ -#define internal_malloc(m, b) dlmalloc(b) -#define internal_free(m, mem) dlfree(mem) -#endif /* MSPACES */ -#endif /* ONLY_MSPACES */ - -/* ----------------------- Direct-mmapping chunks ----------------------- */ - -/* - Directly mmapped chunks are set up with an offset to the start of - the mmapped region stored in the prev_foot field of the chunk. This - allows reconstruction of the required argument to MUNMAP when freed, - and also allows adjustment of the returned chunk to meet alignment - requirements (especially in memalign). There is also enough space - allocated to hold a fake next chunk of size SIZE_T_SIZE to maintain - the PINUSE bit so frees can be checked. -*/ - -/* Malloc using mmap */ -static void* mmap_alloc(mstate m, size_t nb) { - size_t mmsize = granularity_align(nb + SIX_SIZE_T_SIZES + CHUNK_ALIGN_MASK); - if (mmsize > nb) { /* Check for wrap around 0 */ - char* mm = (char*)(DIRECT_MMAP(mmsize)); - if (mm != CMFAIL) { - size_t offset = align_offset(chunk2mem(mm)); - size_t psize = mmsize - offset - MMAP_FOOT_PAD; - mchunkptr p = (mchunkptr)(mm + offset); - p->prev_foot = offset | IS_MMAPPED_BIT; - (p)->head = (psize|CINUSE_BIT); - mark_inuse_foot(m, p, psize); - chunk_plus_offset(p, psize)->head = FENCEPOST_HEAD; - chunk_plus_offset(p, psize+SIZE_T_SIZE)->head = 0; - - if (mm < m->least_addr) - m->least_addr = mm; - if ((m->footprint += mmsize) > m->max_footprint) - m->max_footprint = m->footprint; - assert(is_aligned(chunk2mem(p))); - check_mmapped_chunk(m, p); - return chunk2mem(p); - } - } - return 0; -} - -/* Realloc using mmap */ -static mchunkptr mmap_resize(mstate m, mchunkptr oldp, size_t nb) { - size_t oldsize = chunksize(oldp); - if (is_small(nb)) /* Can't shrink mmap regions below small size */ - return 0; - /* Keep old chunk if big enough but not too big */ - if (oldsize >= nb + SIZE_T_SIZE && - (oldsize - nb) <= (mparams.granularity << 1)) - return oldp; - else { - size_t offset = oldp->prev_foot & ~IS_MMAPPED_BIT; - size_t oldmmsize = oldsize + offset + MMAP_FOOT_PAD; - size_t newmmsize = granularity_align(nb + SIX_SIZE_T_SIZES + - CHUNK_ALIGN_MASK); - char* cp = (char*)CALL_MREMAP((char*)oldp - offset, - oldmmsize, newmmsize, 1); - if (cp != CMFAIL) { - mchunkptr newp = (mchunkptr)(cp + offset); - size_t psize = newmmsize - offset - MMAP_FOOT_PAD; - newp->head = (psize|CINUSE_BIT); - mark_inuse_foot(m, newp, psize); - chunk_plus_offset(newp, psize)->head = FENCEPOST_HEAD; - chunk_plus_offset(newp, psize+SIZE_T_SIZE)->head = 0; - - if (cp < m->least_addr) - m->least_addr = cp; - if ((m->footprint += newmmsize - oldmmsize) > m->max_footprint) - m->max_footprint = m->footprint; - check_mmapped_chunk(m, newp); - return newp; - } - } - return 0; -} - -/* -------------------------- mspace management -------------------------- */ - -/* Initialize top chunk and its size */ -static void init_top(mstate m, mchunkptr p, size_t psize) { - /* Ensure alignment */ - size_t offset = align_offset(chunk2mem(p)); - p = (mchunkptr)((char*)p + offset); - psize -= offset; - - m->top = p; - m->topsize = psize; - p->head = psize | PINUSE_BIT; - /* set size of fake trailing chunk holding overhead space only once */ - chunk_plus_offset(p, psize)->head = TOP_FOOT_SIZE; - m->trim_check = mparams.trim_threshold; /* reset on each update */ -} - -/* Initialize bins for a new mstate that is otherwise zeroed out */ -static void init_bins(mstate m) { - /* Establish circular links for smallbins */ - bindex_t i; - for (i = 0; i < NSMALLBINS; ++i) { - sbinptr bin = smallbin_at(m,i); - bin->fd = bin->bk = bin; - } -} - -#if PROCEED_ON_ERROR - -/* default corruption action */ -static void reset_on_error(mstate m) { - int i; - ++malloc_corruption_error_count; - /* Reinitialize fields to forget about all memory */ - m->smallbins = m->treebins = 0; - m->dvsize = m->topsize = 0; - m->seg.base = 0; - m->seg.size = 0; - m->seg.next = 0; - m->top = m->dv = 0; - for (i = 0; i < NTREEBINS; ++i) - *treebin_at(m, i) = 0; - init_bins(m); -} -#endif /* PROCEED_ON_ERROR */ - -/* Allocate chunk and prepend remainder with chunk in successor base. */ -static void* prepend_alloc(mstate m, char* newbase, char* oldbase, - size_t nb) { - mchunkptr p = align_as_chunk(newbase); - mchunkptr oldfirst = align_as_chunk(oldbase); - size_t psize = (char*)oldfirst - (char*)p; - mchunkptr q = chunk_plus_offset(p, nb); - size_t qsize = psize - nb; - set_size_and_pinuse_of_inuse_chunk(m, p, nb); - - assert((char*)oldfirst > (char*)q); - assert(pinuse(oldfirst)); - assert(qsize >= MIN_CHUNK_SIZE); - - /* consolidate remainder with first chunk of old base */ - if (oldfirst == m->top) { - size_t tsize = m->topsize += qsize; - m->top = q; - q->head = tsize | PINUSE_BIT; - check_top_chunk(m, q); - } - else if (oldfirst == m->dv) { - size_t dsize = m->dvsize += qsize; - m->dv = q; - set_size_and_pinuse_of_free_chunk(q, dsize); - } - else { - if (!cinuse(oldfirst)) { - size_t nsize = chunksize(oldfirst); - unlink_chunk(m, oldfirst, nsize); - oldfirst = chunk_plus_offset(oldfirst, nsize); - qsize += nsize; - } - set_free_with_pinuse(q, qsize, oldfirst); - insert_chunk(m, q, qsize); - check_free_chunk(m, q); - } - - check_malloced_chunk(m, chunk2mem(p), nb); - return chunk2mem(p); -} - - -/* Add a segment to hold a new noncontiguous region */ -static void add_segment(mstate m, char* tbase, size_t tsize, flag_t mmapped) { - /* Determine locations and sizes of segment, fenceposts, old top */ - char* old_top = (char*)m->top; - msegmentptr oldsp = segment_holding(m, old_top); - char* old_end = oldsp->base + oldsp->size; - size_t ssize = pad_request(sizeof(struct malloc_segment)); - char* rawsp = old_end - (ssize + FOUR_SIZE_T_SIZES + CHUNK_ALIGN_MASK); - size_t offset = align_offset(chunk2mem(rawsp)); - char* asp = rawsp + offset; - char* csp = (asp < (old_top + MIN_CHUNK_SIZE))? old_top : asp; - mchunkptr sp = (mchunkptr)csp; - msegmentptr ss = (msegmentptr)(chunk2mem(sp)); - mchunkptr tnext = chunk_plus_offset(sp, ssize); - mchunkptr p = tnext; - int nfences = 0; - - /* reset top to new space */ - init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE); - - /* Set up segment record */ - assert(is_aligned(ss)); - set_size_and_pinuse_of_inuse_chunk(m, sp, ssize); - *ss = m->seg; /* Push current record */ - m->seg.base = tbase; - m->seg.size = tsize; - (void)set_segment_flags(&m->seg, mmapped); - m->seg.next = ss; - - /* Insert trailing fenceposts */ - for (;;) { - mchunkptr nextp = chunk_plus_offset(p, SIZE_T_SIZE); - p->head = FENCEPOST_HEAD; - ++nfences; - if ((char*)(&(nextp->head)) < old_end) - p = nextp; - else - break; - } - assert(nfences >= 2); - - /* Insert the rest of old top into a bin as an ordinary free chunk */ - if (csp != old_top) { - mchunkptr q = (mchunkptr)old_top; - size_t psize = csp - old_top; - mchunkptr tn = chunk_plus_offset(q, psize); - set_free_with_pinuse(q, psize, tn); - insert_chunk(m, q, psize); - } - - check_top_chunk(m, m->top); -} - -/* -------------------------- System allocation -------------------------- */ - -/* Get memory from system using MORECORE or MMAP */ -static void* sys_alloc(mstate m, size_t nb) { - char* tbase = CMFAIL; - size_t tsize = 0; - flag_t mmap_flag = 0; - - init_mparams(); - - /* Directly map large chunks */ - if (use_mmap(m) && nb >= mparams.mmap_threshold) { - void* mem = mmap_alloc(m, nb); - if (mem != 0) - return mem; - } - - /* - Try getting memory in any of three ways (in most-preferred to - least-preferred order): - 1. A call to MORECORE that can normally contiguously extend memory. - (disabled if not MORECORE_CONTIGUOUS or not HAVE_MORECORE or - or main space is mmapped or a previous contiguous call failed) - 2. A call to MMAP new space (disabled if not HAVE_MMAP). - Note that under the default settings, if MORECORE is unable to - fulfill a request, and HAVE_MMAP is true, then mmap is - used as a noncontiguous system allocator. This is a useful backup - strategy for systems with holes in address spaces -- in this case - sbrk cannot contiguously expand the heap, but mmap may be able to - find space. - 3. A call to MORECORE that cannot usually contiguously extend memory. - (disabled if not HAVE_MORECORE) - */ - - if (MORECORE_CONTIGUOUS && !use_noncontiguous(m)) { - char* br = CMFAIL; - msegmentptr ss = (m->top == 0)? 0 : segment_holding(m, (char*)m->top); - size_t asize = 0; - ACQUIRE_MORECORE_LOCK(); - - if (ss == 0) { /* First time through or recovery */ - char* base = (char*)CALL_MORECORE(0); - if (base != CMFAIL) { - asize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE); - /* Adjust to end on a page boundary */ - if (!is_page_aligned(base)) - asize += (page_align((size_t)base) - (size_t)base); - /* Can't call MORECORE if size is negative when treated as signed */ - if (asize < HALF_MAX_SIZE_T && - (br = (char*)(CALL_MORECORE(asize))) == base) { - tbase = base; - tsize = asize; - } - } - } - else { - /* Subtract out existing available top space from MORECORE request. */ - asize = granularity_align(nb - m->topsize + TOP_FOOT_SIZE + SIZE_T_ONE); - /* Use mem here only if it did continuously extend old space */ - if (asize < HALF_MAX_SIZE_T && - (br = (char*)(CALL_MORECORE(asize))) == ss->base+ss->size) { - tbase = br; - tsize = asize; - } - } - - if (tbase == CMFAIL) { /* Cope with partial failure */ - if (br != CMFAIL) { /* Try to use/extend the space we did get */ - if (asize < HALF_MAX_SIZE_T && - asize < nb + TOP_FOOT_SIZE + SIZE_T_ONE) { - size_t esize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE - asize); - if (esize < HALF_MAX_SIZE_T) { - char* end = (char*)CALL_MORECORE(esize); - if (end != CMFAIL) - asize += esize; - else { /* Can't use; try to release */ - (void)CALL_MORECORE(-asize); - br = CMFAIL; - } - } - } - } - if (br != CMFAIL) { /* Use the space we did get */ - tbase = br; - tsize = asize; - } - else - disable_contiguous(m); /* Don't try contiguous path in the future */ - } - - RELEASE_MORECORE_LOCK(); - } - - if (HAVE_MMAP && tbase == CMFAIL) { /* Try MMAP */ - size_t req = nb + TOP_FOOT_SIZE + SIZE_T_ONE; - size_t rsize = granularity_align(req); - if (rsize > nb) { /* Fail if wraps around zero */ - char* mp = (char*)(CALL_MMAP(rsize)); - if (mp != CMFAIL) { - tbase = mp; - tsize = rsize; - mmap_flag = IS_MMAPPED_BIT; - } - } - } - - if (HAVE_MORECORE && tbase == CMFAIL) { /* Try noncontiguous MORECORE */ - size_t asize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE); - if (asize < HALF_MAX_SIZE_T) { - char* br = CMFAIL; - char* end = CMFAIL; - ACQUIRE_MORECORE_LOCK(); - br = (char*)(CALL_MORECORE(asize)); - end = (char*)(CALL_MORECORE(0)); - RELEASE_MORECORE_LOCK(); - if (br != CMFAIL && end != CMFAIL && br < end) { - size_t ssize = end - br; - if (ssize > nb + TOP_FOOT_SIZE) { - tbase = br; - tsize = ssize; - } - } - } - } - - if (tbase != CMFAIL) { - - if ((m->footprint += tsize) > m->max_footprint) - m->max_footprint = m->footprint; - - if (!is_initialized(m)) { /* first-time initialization */ - m->seg.base = m->least_addr = tbase; - m->seg.size = tsize; - (void)set_segment_flags(&m->seg, mmap_flag); - m->magic = mparams.magic; - init_bins(m); - if (is_global(m)) - init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE); - else { - /* Offset top by embedded malloc_state */ - mchunkptr mn = next_chunk(mem2chunk(m)); - init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) -TOP_FOOT_SIZE); - } - } - - else { - /* Try to merge with an existing segment */ - msegmentptr sp = &m->seg; - while (sp != 0 && tbase != sp->base + sp->size) - sp = sp->next; - if (sp != 0 && - !is_extern_segment(sp) && - check_segment_merge(sp, tbase, tsize) && - (get_segment_flags(sp) & IS_MMAPPED_BIT) == mmap_flag && - segment_holds(sp, m->top)) { /* append */ - sp->size += tsize; - init_top(m, m->top, m->topsize + tsize); - } - else { - if (tbase < m->least_addr) - m->least_addr = tbase; - sp = &m->seg; - while (sp != 0 && sp->base != tbase + tsize) - sp = sp->next; - if (sp != 0 && - !is_extern_segment(sp) && - check_segment_merge(sp, tbase, tsize) && - (get_segment_flags(sp) & IS_MMAPPED_BIT) == mmap_flag) { - char* oldbase = sp->base; - sp->base = tbase; - sp->size += tsize; - return prepend_alloc(m, tbase, oldbase, nb); - } - else - add_segment(m, tbase, tsize, mmap_flag); - } - } - - if (nb < m->topsize) { /* Allocate from new or extended top space */ - size_t rsize = m->topsize -= nb; - mchunkptr p = m->top; - mchunkptr r = m->top = chunk_plus_offset(p, nb); - r->head = rsize | PINUSE_BIT; - set_size_and_pinuse_of_inuse_chunk(m, p, nb); - check_top_chunk(m, m->top); - check_malloced_chunk(m, chunk2mem(p), nb); - return chunk2mem(p); - } - } - - MALLOC_FAILURE_ACTION; - return 0; -} - -/* ----------------------- system deallocation -------------------------- */ - -/* Unmap and unlink any mmapped segments that don't contain used chunks */ -static size_t release_unused_segments(mstate m) { - size_t released = 0; - msegmentptr pred = &m->seg; - msegmentptr sp = pred->next; - while (sp != 0) { - char* base = sp->base; - size_t size = sp->size; - msegmentptr next = sp->next; - if (is_mmapped_segment(sp) && !is_extern_segment(sp)) { - mchunkptr p = align_as_chunk(base); - size_t psize = chunksize(p); - /* Can unmap if first chunk holds entire segment and not pinned */ - if (!cinuse(p) && (char*)p + psize >= base + size - TOP_FOOT_SIZE) { - tchunkptr tp = (tchunkptr)p; - assert(segment_holds(sp, (char*)sp)); - if (p == m->dv) { - m->dv = 0; - m->dvsize = 0; - } - else { - unlink_large_chunk(m, tp); - } - if (CALL_MUNMAP(base, size) == 0) { - released += size; - m->footprint -= size; - /* unlink obsoleted record */ - sp = pred; - sp->next = next; - } - else { /* back out if cannot unmap */ - insert_large_chunk(m, tp, psize); - } - } - } - pred = sp; - sp = next; - } - return released; -} - -static int sys_trim(mstate m, size_t pad) { - size_t released = 0; - if (pad < MAX_REQUEST && is_initialized(m)) { - pad += TOP_FOOT_SIZE; /* ensure enough room for segment overhead */ - - if (m->topsize > pad) { - /* Shrink top space in granularity-size units, keeping at least one */ - size_t unit = mparams.granularity; - size_t extra = ((m->topsize - pad + (unit - SIZE_T_ONE)) / unit - - SIZE_T_ONE) * unit; - msegmentptr sp = segment_holding(m, (char*)m->top); - - if (!is_extern_segment(sp)) { - if (is_mmapped_segment(sp)) { - if (HAVE_MMAP && - sp->size >= extra && - !has_segment_link(m, sp)) { /* can't shrink if pinned */ - size_t newsize = sp->size - extra; - /* Prefer mremap, fall back to munmap */ - if ((CALL_MREMAP(sp->base, sp->size, newsize, 0) != MFAIL) || - (CALL_MUNMAP(sp->base + newsize, extra) == 0)) { - released = extra; - } - } - } - else if (HAVE_MORECORE) { - if (extra >= HALF_MAX_SIZE_T) /* Avoid wrapping negative */ - extra = (HALF_MAX_SIZE_T) + SIZE_T_ONE - unit; - ACQUIRE_MORECORE_LOCK(); - { - /* Make sure end of memory is where we last set it. */ - char* old_br = (char*)(CALL_MORECORE(0)); - if (old_br == sp->base + sp->size) { - char* rel_br = (char*)(CALL_MORECORE(-extra)); - char* new_br = (char*)(CALL_MORECORE(0)); - if (rel_br != CMFAIL && new_br < old_br) - released = old_br - new_br; - } - } - RELEASE_MORECORE_LOCK(); - } - } - - if (released != 0) { - sp->size -= released; - m->footprint -= released; - init_top(m, m->top, m->topsize - released); - check_top_chunk(m, m->top); - } - } - - /* Unmap any unused mmapped segments */ - if (HAVE_MMAP) - released += release_unused_segments(m); - - /* On failure, disable autotrim to avoid repeated failed future calls */ - if (released == 0) - m->trim_check = MAX_SIZE_T; - } - - return (released != 0)? 1 : 0; -} - -/* ---------------------------- malloc support --------------------------- */ - -/* allocate a large request from the best fitting chunk in a treebin */ -static void* tmalloc_large(mstate m, size_t nb) { - tchunkptr v = 0; - size_t rsize = -nb; /* Unsigned negation */ - tchunkptr t; - bindex_t idx; - compute_tree_index(nb, idx); - - if ((t = *treebin_at(m, idx)) != 0) { - /* Traverse tree for this bin looking for node with size == nb */ - size_t sizebits = nb << leftshift_for_tree_index(idx); - tchunkptr rst = 0; /* The deepest untaken right subtree */ - for (;;) { - tchunkptr rt; - size_t trem = chunksize(t) - nb; - if (trem < rsize) { - v = t; - if ((rsize = trem) == 0) - break; - } - rt = t->child[1]; - t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]; - if (rt != 0 && rt != t) - rst = rt; - if (t == 0) { - t = rst; /* set t to least subtree holding sizes > nb */ - break; - } - sizebits <<= 1; - } - } - - if (t == 0 && v == 0) { /* set t to root of next non-empty treebin */ - binmap_t leftbits = left_bits(idx2bit(idx)) & m->treemap; - if (leftbits != 0) { - bindex_t i; - binmap_t leastbit = least_bit(leftbits); - compute_bit2idx(leastbit, i); - t = *treebin_at(m, i); - } - } - - while (t != 0) { /* find smallest of tree or subtree */ - size_t trem = chunksize(t) - nb; - if (trem < rsize) { - rsize = trem; - v = t; - } - t = leftmost_child(t); - } - - /* If dv is a better fit, return 0 so malloc will use it */ - if (v != 0 && rsize < (size_t)(m->dvsize - nb)) { - if (RTCHECK(ok_address(m, v))) { /* split */ - mchunkptr r = chunk_plus_offset(v, nb); - assert(chunksize(v) == rsize + nb); - if (RTCHECK(ok_next(v, r))) { - unlink_large_chunk(m, v); - if (rsize < MIN_CHUNK_SIZE) - set_inuse_and_pinuse(m, v, (rsize + nb)); - else { - set_size_and_pinuse_of_inuse_chunk(m, v, nb); - set_size_and_pinuse_of_free_chunk(r, rsize); - insert_chunk(m, r, rsize); - } - return chunk2mem(v); - } - } - CORRUPTION_ERROR_ACTION(m); - } - return 0; -} - -/* allocate a small request from the best fitting chunk in a treebin */ -static void* tmalloc_small(mstate m, size_t nb) { - tchunkptr t, v; - size_t rsize; - bindex_t i; - binmap_t leastbit = least_bit(m->treemap); - compute_bit2idx(leastbit, i); - - v = t = *treebin_at(m, i); - rsize = chunksize(t) - nb; - - while ((t = leftmost_child(t)) != 0) { - size_t trem = chunksize(t) - nb; - if (trem < rsize) { - rsize = trem; - v = t; - } - } - - if (RTCHECK(ok_address(m, v))) { - mchunkptr r = chunk_plus_offset(v, nb); - assert(chunksize(v) == rsize + nb); - if (RTCHECK(ok_next(v, r))) { - unlink_large_chunk(m, v); - if (rsize < MIN_CHUNK_SIZE) - set_inuse_and_pinuse(m, v, (rsize + nb)); - else { - set_size_and_pinuse_of_inuse_chunk(m, v, nb); - set_size_and_pinuse_of_free_chunk(r, rsize); - replace_dv(m, r, rsize); - } - return chunk2mem(v); - } - } - - CORRUPTION_ERROR_ACTION(m); - return 0; -} - -/* --------------------------- realloc support --------------------------- */ - -static void* internal_realloc(mstate m, void* oldmem, size_t bytes) { - if (bytes >= MAX_REQUEST) { - MALLOC_FAILURE_ACTION; - return 0; - } - if (!PREACTION(m)) { - mchunkptr oldp = mem2chunk(oldmem); - size_t oldsize = chunksize(oldp); - mchunkptr next = chunk_plus_offset(oldp, oldsize); - mchunkptr newp = 0; - void* extra = 0; - - /* Try to either shrink or extend into top. Else malloc-copy-free */ - - if (RTCHECK(ok_address(m, oldp) && ok_cinuse(oldp) && - ok_next(oldp, next) && ok_pinuse(next))) { - size_t nb = request2size(bytes); - if (is_mmapped(oldp)) - newp = mmap_resize(m, oldp, nb); - else if (oldsize >= nb) { /* already big enough */ - size_t rsize = oldsize - nb; - newp = oldp; - if (rsize >= MIN_CHUNK_SIZE) { - mchunkptr remainder = chunk_plus_offset(newp, nb); - set_inuse(m, newp, nb); - set_inuse(m, remainder, rsize); - extra = chunk2mem(remainder); - } - } - else if (next == m->top && oldsize + m->topsize > nb) { - /* Expand into top */ - size_t newsize = oldsize + m->topsize; - size_t newtopsize = newsize - nb; - mchunkptr newtop = chunk_plus_offset(oldp, nb); - set_inuse(m, oldp, nb); - newtop->head = newtopsize |PINUSE_BIT; - m->top = newtop; - m->topsize = newtopsize; - newp = oldp; - } - } - else { - USAGE_ERROR_ACTION(m, oldmem); - POSTACTION(m); - return 0; - } - - POSTACTION(m); - - if (newp != 0) { - if (extra != 0) { - internal_free(m, extra); - } - check_inuse_chunk(m, newp); - return chunk2mem(newp); - } - else { - void* newmem = internal_malloc(m, bytes); - if (newmem != 0) { - size_t oc = oldsize - overhead_for(oldp); - memcpy(newmem, oldmem, (oc < bytes)? oc : bytes); - internal_free(m, oldmem); - } - return newmem; - } - } - return 0; -} - -/* --------------------------- memalign support -------------------------- */ - -static void* internal_memalign(mstate m, size_t alignment, size_t bytes) { - if (alignment <= MALLOC_ALIGNMENT) /* Can just use malloc */ - return internal_malloc(m, bytes); - if (alignment < MIN_CHUNK_SIZE) /* must be at least a minimum chunk size */ - alignment = MIN_CHUNK_SIZE; - if ((alignment & (alignment-SIZE_T_ONE)) != 0) {/* Ensure a power of 2 */ - size_t a = MALLOC_ALIGNMENT << 1; - while (a < alignment) a <<= 1; - alignment = a; - } - - if (bytes >= MAX_REQUEST - alignment) { - if (m != 0) { /* Test isn't needed but avoids compiler warning */ - MALLOC_FAILURE_ACTION; - } - } - else { - size_t nb = request2size(bytes); - size_t req = nb + alignment + MIN_CHUNK_SIZE - CHUNK_OVERHEAD; - char* mem = (char*)internal_malloc(m, req); - if (mem != 0) { - void* leader = 0; - void* trailer = 0; - mchunkptr p = mem2chunk(mem); - - if (PREACTION(m)) return 0; - if ((((size_t)(mem)) % alignment) != 0) { /* misaligned */ - /* - Find an aligned spot inside chunk. Since we need to give - back leading space in a chunk of at least MIN_CHUNK_SIZE, if - the first calculation places us at a spot with less than - MIN_CHUNK_SIZE leader, we can move to the next aligned spot. - We've allocated enough total room so that this is always - possible. - */ - char* br = (char*)mem2chunk((size_t)(((size_t)(mem + - alignment - - SIZE_T_ONE)) & - -alignment)); - char* pos = ((size_t)(br - (char*)(p)) >= MIN_CHUNK_SIZE)? - br : br+alignment; - mchunkptr newp = (mchunkptr)pos; - size_t leadsize = pos - (char*)(p); - size_t newsize = chunksize(p) - leadsize; - - if (is_mmapped(p)) { /* For mmapped chunks, just adjust offset */ - newp->prev_foot = p->prev_foot + leadsize; - newp->head = (newsize|CINUSE_BIT); - } - else { /* Otherwise, give back leader, use the rest */ - set_inuse(m, newp, newsize); - set_inuse(m, p, leadsize); - leader = chunk2mem(p); - } - p = newp; - } - - /* Give back spare room at the end */ - if (!is_mmapped(p)) { - size_t size = chunksize(p); - if (size > nb + MIN_CHUNK_SIZE) { - size_t remainder_size = size - nb; - mchunkptr remainder = chunk_plus_offset(p, nb); - set_inuse(m, p, nb); - set_inuse(m, remainder, remainder_size); - trailer = chunk2mem(remainder); - } - } - - assert (chunksize(p) >= nb); - assert((((size_t)(chunk2mem(p))) % alignment) == 0); - check_inuse_chunk(m, p); - POSTACTION(m); - if (leader != 0) { - internal_free(m, leader); - } - if (trailer != 0) { - internal_free(m, trailer); - } - return chunk2mem(p); - } - } - return 0; -} - -/* ------------------------ comalloc/coalloc support --------------------- */ - -static void** ialloc(mstate m, - size_t n_elements, - size_t* sizes, - int opts, - void* chunks[]) { - /* - This provides common support for independent_X routines, handling - all of the combinations that can result. - - The opts arg has: - bit 0 set if all elements are same size (using sizes[0]) - bit 1 set if elements should be zeroed - */ - - size_t element_size; /* chunksize of each element, if all same */ - size_t contents_size; /* total size of elements */ - size_t array_size; /* request size of pointer array */ - void* mem; /* malloced aggregate space */ - mchunkptr p; /* corresponding chunk */ - size_t remainder_size; /* remaining bytes while splitting */ - void** marray; /* either "chunks" or malloced ptr array */ - mchunkptr array_chunk; /* chunk for malloced ptr array */ - flag_t was_enabled; /* to disable mmap */ - size_t size; - size_t i; - - /* compute array length, if needed */ - if (chunks != 0) { - if (n_elements == 0) - return chunks; /* nothing to do */ - marray = chunks; - array_size = 0; - } - else { - /* if empty req, must still return chunk representing empty array */ - if (n_elements == 0) - return (void**)internal_malloc(m, 0); - marray = 0; - array_size = request2size(n_elements * (sizeof(void*))); - } - - /* compute total element size */ - if (opts & 0x1) { /* all-same-size */ - element_size = request2size(*sizes); - contents_size = n_elements * element_size; - } - else { /* add up all the sizes */ - element_size = 0; - contents_size = 0; - for (i = 0; i != n_elements; ++i) - contents_size += request2size(sizes[i]); - } - - size = contents_size + array_size; - - /* - Allocate the aggregate chunk. First disable direct-mmapping so - malloc won't use it, since we would not be able to later - free/realloc space internal to a segregated mmap region. - */ - was_enabled = use_mmap(m); - disable_mmap(m); - mem = internal_malloc(m, size - CHUNK_OVERHEAD); - if (was_enabled) - enable_mmap(m); - if (mem == 0) - return 0; - - if (PREACTION(m)) return 0; - p = mem2chunk(mem); - remainder_size = chunksize(p); - - assert(!is_mmapped(p)); - - if (opts & 0x2) { /* optionally clear the elements */ - memset((size_t*)mem, 0, remainder_size - SIZE_T_SIZE - array_size); - } - - /* If not provided, allocate the pointer array as final part of chunk */ - if (marray == 0) { - size_t array_chunk_size; - array_chunk = chunk_plus_offset(p, contents_size); - array_chunk_size = remainder_size - contents_size; - marray = (void**) (chunk2mem(array_chunk)); - set_size_and_pinuse_of_inuse_chunk(m, array_chunk, array_chunk_size); - remainder_size = contents_size; - } - - /* split out elements */ - for (i = 0; ; ++i) { - marray[i] = chunk2mem(p); - if (i != n_elements-1) { - if (element_size != 0) - size = element_size; - else - size = request2size(sizes[i]); - remainder_size -= size; - set_size_and_pinuse_of_inuse_chunk(m, p, size); - p = chunk_plus_offset(p, size); - } - else { /* the final element absorbs any overallocation slop */ - set_size_and_pinuse_of_inuse_chunk(m, p, remainder_size); - break; - } - } - -#if DEBUG - if (marray != chunks) { - /* final element must have exactly exhausted chunk */ - if (element_size != 0) { - assert(remainder_size == element_size); - } - else { - assert(remainder_size == request2size(sizes[i])); - } - check_inuse_chunk(m, mem2chunk(marray)); - } - for (i = 0; i != n_elements; ++i) - check_inuse_chunk(m, mem2chunk(marray[i])); - -#endif /* DEBUG */ - - POSTACTION(m); - return marray; -} - - -/* -------------------------- public routines ---------------------------- */ - -#if !ONLY_MSPACES - -void* dlmalloc(size_t bytes) { - /* - Basic algorithm: - If a small request (< 256 bytes minus per-chunk overhead): - 1. If one exists, use a remainderless chunk in associated smallbin. - (Remainderless means that there are too few excess bytes to - represent as a chunk.) - 2. If it is big enough, use the dv chunk, which is normally the - chunk adjacent to the one used for the most recent small request. - 3. If one exists, split the smallest available chunk in a bin, - saving remainder in dv. - 4. If it is big enough, use the top chunk. - 5. If available, get memory from system and use it - Otherwise, for a large request: - 1. Find the smallest available binned chunk that fits, and use it - if it is better fitting than dv chunk, splitting if necessary. - 2. If better fitting than any binned chunk, use the dv chunk. - 3. If it is big enough, use the top chunk. - 4. If request size >= mmap threshold, try to directly mmap this chunk. - 5. If available, get memory from system and use it - - The ugly goto's here ensure that postaction occurs along all paths. - */ - - if (!PREACTION(gm)) { - void* mem; - size_t nb; - if (bytes <= MAX_SMALL_REQUEST) { - bindex_t idx; - binmap_t smallbits; - nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes); - idx = small_index(nb); - smallbits = gm->smallmap >> idx; - - if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */ - mchunkptr b, p; - idx += ~smallbits & 1; /* Uses next bin if idx empty */ - b = smallbin_at(gm, idx); - p = b->fd; - assert(chunksize(p) == small_index2size(idx)); - unlink_first_small_chunk(gm, b, p, idx); - set_inuse_and_pinuse(gm, p, small_index2size(idx)); - mem = chunk2mem(p); - check_malloced_chunk(gm, mem, nb); - goto postaction; - } - - else if (nb > gm->dvsize) { - if (smallbits != 0) { /* Use chunk in next nonempty smallbin */ - mchunkptr b, p, r; - size_t rsize; - bindex_t i; - binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx)); - binmap_t leastbit = least_bit(leftbits); - compute_bit2idx(leastbit, i); - b = smallbin_at(gm, i); - p = b->fd; - assert(chunksize(p) == small_index2size(i)); - unlink_first_small_chunk(gm, b, p, i); - rsize = small_index2size(i) - nb; - /* Fit here cannot be remainderless if 4byte sizes */ - if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE) - set_inuse_and_pinuse(gm, p, small_index2size(i)); - else { - set_size_and_pinuse_of_inuse_chunk(gm, p, nb); - r = chunk_plus_offset(p, nb); - set_size_and_pinuse_of_free_chunk(r, rsize); - replace_dv(gm, r, rsize); - } - mem = chunk2mem(p); - check_malloced_chunk(gm, mem, nb); - goto postaction; - } - - else if (gm->treemap != 0 && (mem = tmalloc_small(gm, nb)) != 0) { - check_malloced_chunk(gm, mem, nb); - goto postaction; - } - } - } - else if (bytes >= MAX_REQUEST) - nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */ - else { - nb = pad_request(bytes); - if (gm->treemap != 0 && (mem = tmalloc_large(gm, nb)) != 0) { - check_malloced_chunk(gm, mem, nb); - goto postaction; - } - } - - if (nb <= gm->dvsize) { - size_t rsize = gm->dvsize - nb; - mchunkptr p = gm->dv; - if (rsize >= MIN_CHUNK_SIZE) { /* split dv */ - mchunkptr r = gm->dv = chunk_plus_offset(p, nb); - gm->dvsize = rsize; - set_size_and_pinuse_of_free_chunk(r, rsize); - set_size_and_pinuse_of_inuse_chunk(gm, p, nb); - } - else { /* exhaust dv */ - size_t dvs = gm->dvsize; - gm->dvsize = 0; - gm->dv = 0; - set_inuse_and_pinuse(gm, p, dvs); - } - mem = chunk2mem(p); - check_malloced_chunk(gm, mem, nb); - goto postaction; - } - - else if (nb < gm->topsize) { /* Split top */ - size_t rsize = gm->topsize -= nb; - mchunkptr p = gm->top; - mchunkptr r = gm->top = chunk_plus_offset(p, nb); - r->head = rsize | PINUSE_BIT; - set_size_and_pinuse_of_inuse_chunk(gm, p, nb); - mem = chunk2mem(p); - check_top_chunk(gm, gm->top); - check_malloced_chunk(gm, mem, nb); - goto postaction; - } - - mem = sys_alloc(gm, nb); - - postaction: - POSTACTION(gm); - return mem; - } - - return 0; -} - -void dlfree(void* mem) { - /* - Consolidate freed chunks with preceding or succeeding bordering - free chunks, if they exist, and then place in a bin. Intermixed - with special cases for top, dv, mmapped chunks, and usage errors. - */ - - if (mem != 0) { - mchunkptr p = mem2chunk(mem); -#if FOOTERS - mstate fm = get_mstate_for(p); - if (!ok_magic(fm)) { - USAGE_ERROR_ACTION(fm, p); - return; - } -#else /* FOOTERS */ -#define fm gm -#endif /* FOOTERS */ - if (!PREACTION(fm)) { - check_inuse_chunk(fm, p); - if (RTCHECK(ok_address(fm, p) && ok_cinuse(p))) { - size_t psize = chunksize(p); - mchunkptr next = chunk_plus_offset(p, psize); - if (!pinuse(p)) { - size_t prevsize = p->prev_foot; - if ((prevsize & IS_MMAPPED_BIT) != 0) { - prevsize &= ~IS_MMAPPED_BIT; - psize += prevsize + MMAP_FOOT_PAD; - if (CALL_MUNMAP((char*)p - prevsize, psize) == 0) - fm->footprint -= psize; - goto postaction; - } - else { - mchunkptr prev = chunk_minus_offset(p, prevsize); - psize += prevsize; - p = prev; - if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */ - if (p != fm->dv) { - unlink_chunk(fm, p, prevsize); - } - else if ((next->head & INUSE_BITS) == INUSE_BITS) { - fm->dvsize = psize; - set_free_with_pinuse(p, psize, next); - goto postaction; - } - } - else - goto erroraction; - } - } - - if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) { - if (!cinuse(next)) { /* consolidate forward */ - if (next == fm->top) { - size_t tsize = fm->topsize += psize; - fm->top = p; - p->head = tsize | PINUSE_BIT; - if (p == fm->dv) { - fm->dv = 0; - fm->dvsize = 0; - } - if (should_trim(fm, tsize)) - sys_trim(fm, 0); - goto postaction; - } - else if (next == fm->dv) { - size_t dsize = fm->dvsize += psize; - fm->dv = p; - set_size_and_pinuse_of_free_chunk(p, dsize); - goto postaction; - } - else { - size_t nsize = chunksize(next); - psize += nsize; - unlink_chunk(fm, next, nsize); - set_size_and_pinuse_of_free_chunk(p, psize); - if (p == fm->dv) { - fm->dvsize = psize; - goto postaction; - } - } - } - else - set_free_with_pinuse(p, psize, next); - insert_chunk(fm, p, psize); - check_free_chunk(fm, p); - goto postaction; - } - } - erroraction: - USAGE_ERROR_ACTION(fm, p); - postaction: - POSTACTION(fm); - } - } -#if !FOOTERS -#undef fm -#endif /* FOOTERS */ -} - -void* dlcalloc(size_t n_elements, size_t elem_size) { - void* mem; - size_t req = 0; - if (n_elements != 0) { - req = n_elements * elem_size; - if (((n_elements | elem_size) & ~(size_t)0xffff) && - (req / n_elements != elem_size)) - req = MAX_SIZE_T; /* force downstream failure on overflow */ - } - mem = dlmalloc(req); - if (mem != 0 && calloc_must_clear(mem2chunk(mem))) - memset(mem, 0, req); - return mem; -} - -void* dlrealloc(void* oldmem, size_t bytes) { - if (oldmem == 0) - return dlmalloc(bytes); -#ifdef REALLOC_ZERO_BYTES_FREES - if (bytes == 0) { - dlfree(oldmem); - return 0; - } -#endif /* REALLOC_ZERO_BYTES_FREES */ - else { -#if ! FOOTERS - mstate m = gm; -#else /* FOOTERS */ - mstate m = get_mstate_for(mem2chunk(oldmem)); - if (!ok_magic(m)) { - USAGE_ERROR_ACTION(m, oldmem); - return 0; - } -#endif /* FOOTERS */ - return internal_realloc(m, oldmem, bytes); - } -} - -void* dlmemalign(size_t alignment, size_t bytes) { - return internal_memalign(gm, alignment, bytes); -} - -void** dlindependent_calloc(size_t n_elements, size_t elem_size, - void* chunks[]) { - size_t sz = elem_size; /* serves as 1-element array */ - return ialloc(gm, n_elements, &sz, 3, chunks); -} - -void** dlindependent_comalloc(size_t n_elements, size_t sizes[], - void* chunks[]) { - return ialloc(gm, n_elements, sizes, 0, chunks); -} - -void* dlvalloc(size_t bytes) { - size_t pagesz; - init_mparams(); - pagesz = mparams.page_size; - return dlmemalign(pagesz, bytes); -} - -void* dlpvalloc(size_t bytes) { - size_t pagesz; - init_mparams(); - pagesz = mparams.page_size; - return dlmemalign(pagesz, (bytes + pagesz - SIZE_T_ONE) & ~(pagesz - SIZE_T_ONE)); -} - -int dlmalloc_trim(size_t pad) { - int result = 0; - if (!PREACTION(gm)) { - result = sys_trim(gm, pad); - POSTACTION(gm); - } - return result; -} - -size_t dlmalloc_footprint(void) { - return gm->footprint; -} - -size_t dlmalloc_max_footprint(void) { - return gm->max_footprint; -} - -#if !NO_MALLINFO -struct mallinfo dlmallinfo(void) { - return internal_mallinfo(gm); -} -#endif /* NO_MALLINFO */ - -void dlmalloc_stats() { - internal_malloc_stats(gm); -} - -size_t dlmalloc_usable_size(void* mem) { - if (mem != 0) { - mchunkptr p = mem2chunk(mem); - if (cinuse(p)) - return chunksize(p) - overhead_for(p); - } - return 0; -} - -int dlmallopt(int param_number, int value) { - return change_mparam(param_number, value); -} - -#endif /* !ONLY_MSPACES */ - -/* ----------------------------- user mspaces ---------------------------- */ - -#if MSPACES - -static mstate init_user_mstate(char* tbase, size_t tsize) { - size_t msize = pad_request(sizeof(struct malloc_state)); - mchunkptr mn; - mchunkptr msp = align_as_chunk(tbase); - mstate m = (mstate)(chunk2mem(msp)); - memset(m, 0, msize); - INITIAL_LOCK(&m->mutex); - msp->head = (msize|PINUSE_BIT|CINUSE_BIT); - m->seg.base = m->least_addr = tbase; - m->seg.size = m->footprint = m->max_footprint = tsize; - m->magic = mparams.magic; - m->mflags = mparams.default_mflags; - disable_contiguous(m); - init_bins(m); - mn = next_chunk(mem2chunk(m)); - init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) - TOP_FOOT_SIZE); - check_top_chunk(m, m->top); - return m; -} - -mspace create_mspace(size_t capacity, int locked) { - mstate m = 0; - size_t msize = pad_request(sizeof(struct malloc_state)); - init_mparams(); /* Ensure pagesize etc initialized */ - - if (capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) { - size_t rs = ((capacity == 0)? mparams.granularity : - (capacity + TOP_FOOT_SIZE + msize)); - size_t tsize = granularity_align(rs); - char* tbase = (char*)(CALL_MMAP(tsize)); - if (tbase != CMFAIL) { - m = init_user_mstate(tbase, tsize); - set_segment_flags(&m->seg, IS_MMAPPED_BIT); - set_lock(m, locked); - } - } - return (mspace)m; -} - -mspace create_mspace_with_base(void* base, size_t capacity, int locked) { - mstate m = 0; - size_t msize = pad_request(sizeof(struct malloc_state)); - init_mparams(); /* Ensure pagesize etc initialized */ - - if (capacity > msize + TOP_FOOT_SIZE && - capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) { - m = init_user_mstate((char*)base, capacity); - set_segment_flags(&m->seg, EXTERN_BIT); - set_lock(m, locked); - } - return (mspace)m; -} - -size_t destroy_mspace(mspace msp) { - size_t freed = 0; - mstate ms = (mstate)msp; - if (ok_magic(ms)) { - msegmentptr sp = &ms->seg; - while (sp != 0) { - char* base = sp->base; - size_t size = sp->size; - flag_t flag = get_segment_flags(sp); - sp = sp->next; - if ((flag & IS_MMAPPED_BIT) && !(flag & EXTERN_BIT) && - CALL_MUNMAP(base, size) == 0) - freed += size; - } - } - else { - USAGE_ERROR_ACTION(ms,ms); - } - return freed; -} - -/* - mspace versions of routines are near-clones of the global - versions. This is not so nice but better than the alternatives. -*/ - - -void* mspace_malloc(mspace msp, size_t bytes) { - mstate ms = (mstate)msp; - if (!ok_magic(ms)) { - USAGE_ERROR_ACTION(ms,ms); - return 0; - } - if (!PREACTION(ms)) { - void* mem; - size_t nb; - if (bytes <= MAX_SMALL_REQUEST) { - bindex_t idx; - binmap_t smallbits; - nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes); - idx = small_index(nb); - smallbits = ms->smallmap >> idx; - - if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */ - mchunkptr b, p; - idx += ~smallbits & 1; /* Uses next bin if idx empty */ - b = smallbin_at(ms, idx); - p = b->fd; - assert(chunksize(p) == small_index2size(idx)); - unlink_first_small_chunk(ms, b, p, idx); - set_inuse_and_pinuse(ms, p, small_index2size(idx)); - mem = chunk2mem(p); - check_malloced_chunk(ms, mem, nb); - goto postaction; - } - - else if (nb > ms->dvsize) { - if (smallbits != 0) { /* Use chunk in next nonempty smallbin */ - mchunkptr b, p, r; - size_t rsize; - bindex_t i; - binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx)); - binmap_t leastbit = least_bit(leftbits); - compute_bit2idx(leastbit, i); - b = smallbin_at(ms, i); - p = b->fd; - assert(chunksize(p) == small_index2size(i)); - unlink_first_small_chunk(ms, b, p, i); - rsize = small_index2size(i) - nb; - /* Fit here cannot be remainderless if 4byte sizes */ - if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE) - set_inuse_and_pinuse(ms, p, small_index2size(i)); - else { - set_size_and_pinuse_of_inuse_chunk(ms, p, nb); - r = chunk_plus_offset(p, nb); - set_size_and_pinuse_of_free_chunk(r, rsize); - replace_dv(ms, r, rsize); - } - mem = chunk2mem(p); - check_malloced_chunk(ms, mem, nb); - goto postaction; - } - - else if (ms->treemap != 0 && (mem = tmalloc_small(ms, nb)) != 0) { - check_malloced_chunk(ms, mem, nb); - goto postaction; - } - } - } - else if (bytes >= MAX_REQUEST) - nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */ - else { - nb = pad_request(bytes); - if (ms->treemap != 0 && (mem = tmalloc_large(ms, nb)) != 0) { - check_malloced_chunk(ms, mem, nb); - goto postaction; - } - } - - if (nb <= ms->dvsize) { - size_t rsize = ms->dvsize - nb; - mchunkptr p = ms->dv; - if (rsize >= MIN_CHUNK_SIZE) { /* split dv */ - mchunkptr r = ms->dv = chunk_plus_offset(p, nb); - ms->dvsize = rsize; - set_size_and_pinuse_of_free_chunk(r, rsize); - set_size_and_pinuse_of_inuse_chunk(ms, p, nb); - } - else { /* exhaust dv */ - size_t dvs = ms->dvsize; - ms->dvsize = 0; - ms->dv = 0; - set_inuse_and_pinuse(ms, p, dvs); - } - mem = chunk2mem(p); - check_malloced_chunk(ms, mem, nb); - goto postaction; - } - - else if (nb < ms->topsize) { /* Split top */ - size_t rsize = ms->topsize -= nb; - mchunkptr p = ms->top; - mchunkptr r = ms->top = chunk_plus_offset(p, nb); - r->head = rsize | PINUSE_BIT; - set_size_and_pinuse_of_inuse_chunk(ms, p, nb); - mem = chunk2mem(p); - check_top_chunk(ms, ms->top); - check_malloced_chunk(ms, mem, nb); - goto postaction; - } - - mem = sys_alloc(ms, nb); - - postaction: - POSTACTION(ms); - return mem; - } - - return 0; -} - -void mspace_free(mspace msp, void* mem) { - if (mem != 0) { - mchunkptr p = mem2chunk(mem); -#if FOOTERS - mstate fm = get_mstate_for(p); -#else /* FOOTERS */ - mstate fm = (mstate)msp; -#endif /* FOOTERS */ - if (!ok_magic(fm)) { - USAGE_ERROR_ACTION(fm, p); - return; - } - if (!PREACTION(fm)) { - check_inuse_chunk(fm, p); - if (RTCHECK(ok_address(fm, p) && ok_cinuse(p))) { - size_t psize = chunksize(p); - mchunkptr next = chunk_plus_offset(p, psize); - if (!pinuse(p)) { - size_t prevsize = p->prev_foot; - if ((prevsize & IS_MMAPPED_BIT) != 0) { - prevsize &= ~IS_MMAPPED_BIT; - psize += prevsize + MMAP_FOOT_PAD; - if (CALL_MUNMAP((char*)p - prevsize, psize) == 0) - fm->footprint -= psize; - goto postaction; - } - else { - mchunkptr prev = chunk_minus_offset(p, prevsize); - psize += prevsize; - p = prev; - if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */ - if (p != fm->dv) { - unlink_chunk(fm, p, prevsize); - } - else if ((next->head & INUSE_BITS) == INUSE_BITS) { - fm->dvsize = psize; - set_free_with_pinuse(p, psize, next); - goto postaction; - } - } - else - goto erroraction; - } - } - - if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) { - if (!cinuse(next)) { /* consolidate forward */ - if (next == fm->top) { - size_t tsize = fm->topsize += psize; - fm->top = p; - p->head = tsize | PINUSE_BIT; - if (p == fm->dv) { - fm->dv = 0; - fm->dvsize = 0; - } - if (should_trim(fm, tsize)) - sys_trim(fm, 0); - goto postaction; - } - else if (next == fm->dv) { - size_t dsize = fm->dvsize += psize; - fm->dv = p; - set_size_and_pinuse_of_free_chunk(p, dsize); - goto postaction; - } - else { - size_t nsize = chunksize(next); - psize += nsize; - unlink_chunk(fm, next, nsize); - set_size_and_pinuse_of_free_chunk(p, psize); - if (p == fm->dv) { - fm->dvsize = psize; - goto postaction; - } - } - } - else - set_free_with_pinuse(p, psize, next); - insert_chunk(fm, p, psize); - check_free_chunk(fm, p); - goto postaction; - } - } - erroraction: - USAGE_ERROR_ACTION(fm, p); - postaction: - POSTACTION(fm); - } - } -} - -void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size) { - void* mem; - size_t req = 0; - mstate ms = (mstate)msp; - if (!ok_magic(ms)) { - USAGE_ERROR_ACTION(ms,ms); - return 0; - } - if (n_elements != 0) { - req = n_elements * elem_size; - if (((n_elements | elem_size) & ~(size_t)0xffff) && - (req / n_elements != elem_size)) - req = MAX_SIZE_T; /* force downstream failure on overflow */ - } - mem = internal_malloc(ms, req); - if (mem != 0 && calloc_must_clear(mem2chunk(mem))) - memset(mem, 0, req); - return mem; -} - -void* mspace_realloc(mspace msp, void* oldmem, size_t bytes) { - if (oldmem == 0) - return mspace_malloc(msp, bytes); -#ifdef REALLOC_ZERO_BYTES_FREES - if (bytes == 0) { - mspace_free(msp, oldmem); - return 0; - } -#endif /* REALLOC_ZERO_BYTES_FREES */ - else { -#if FOOTERS - mchunkptr p = mem2chunk(oldmem); - mstate ms = get_mstate_for(p); -#else /* FOOTERS */ - mstate ms = (mstate)msp; -#endif /* FOOTERS */ - if (!ok_magic(ms)) { - USAGE_ERROR_ACTION(ms,ms); - return 0; - } - return internal_realloc(ms, oldmem, bytes); - } -} - -void* mspace_memalign(mspace msp, size_t alignment, size_t bytes) { - mstate ms = (mstate)msp; - if (!ok_magic(ms)) { - USAGE_ERROR_ACTION(ms,ms); - return 0; - } - return internal_memalign(ms, alignment, bytes); -} - -void** mspace_independent_calloc(mspace msp, size_t n_elements, - size_t elem_size, void* chunks[]) { - size_t sz = elem_size; /* serves as 1-element array */ - mstate ms = (mstate)msp; - if (!ok_magic(ms)) { - USAGE_ERROR_ACTION(ms,ms); - return 0; - } - return ialloc(ms, n_elements, &sz, 3, chunks); -} - -void** mspace_independent_comalloc(mspace msp, size_t n_elements, - size_t sizes[], void* chunks[]) { - mstate ms = (mstate)msp; - if (!ok_magic(ms)) { - USAGE_ERROR_ACTION(ms,ms); - return 0; - } - return ialloc(ms, n_elements, sizes, 0, chunks); -} - -int mspace_trim(mspace msp, size_t pad) { - int result = 0; - mstate ms = (mstate)msp; - if (ok_magic(ms)) { - if (!PREACTION(ms)) { - result = sys_trim(ms, pad); - POSTACTION(ms); - } - } - else { - USAGE_ERROR_ACTION(ms,ms); - } - return result; -} - -void mspace_malloc_stats(mspace msp) { - mstate ms = (mstate)msp; - if (ok_magic(ms)) { - internal_malloc_stats(ms); - } - else { - USAGE_ERROR_ACTION(ms,ms); - } -} - -size_t mspace_footprint(mspace msp) { - size_t result; - mstate ms = (mstate)msp; - if (ok_magic(ms)) { - result = ms->footprint; - } - USAGE_ERROR_ACTION(ms,ms); - return result; -} - - -size_t mspace_max_footprint(mspace msp) { - size_t result; - mstate ms = (mstate)msp; - if (ok_magic(ms)) { - result = ms->max_footprint; - } - USAGE_ERROR_ACTION(ms,ms); - return result; -} - - -#if !NO_MALLINFO -struct mallinfo mspace_mallinfo(mspace msp) { - mstate ms = (mstate)msp; - if (!ok_magic(ms)) { - USAGE_ERROR_ACTION(ms,ms); - } - return internal_mallinfo(ms); -} -#endif /* NO_MALLINFO */ - -int mspace_mallopt(int param_number, int value) { - return change_mparam(param_number, value); -} - -#endif /* MSPACES */ - -/* -------------------- Alternative MORECORE functions ------------------- */ - -/* - Guidelines for creating a custom version of MORECORE: - - * For best performance, MORECORE should allocate in multiples of pagesize. - * MORECORE may allocate more memory than requested. (Or even less, - but this will usually result in a malloc failure.) - * MORECORE must not allocate memory when given argument zero, but - instead return one past the end address of memory from previous - nonzero call. - * For best performance, consecutive calls to MORECORE with positive - arguments should return increasing addresses, indicating that - space has been contiguously extended. - * Even though consecutive calls to MORECORE need not return contiguous - addresses, it must be OK for malloc'ed chunks to span multiple - regions in those cases where they do happen to be contiguous. - * MORECORE need not handle negative arguments -- it may instead - just return MFAIL when given negative arguments. - Negative arguments are always multiples of pagesize. MORECORE - must not misinterpret negative args as large positive unsigned - args. You can suppress all such calls from even occurring by defining - MORECORE_CANNOT_TRIM, - - As an example alternative MORECORE, here is a custom allocator - kindly contributed for pre-OSX macOS. It uses virtually but not - necessarily physically contiguous non-paged memory (locked in, - present and won't get swapped out). You can use it by uncommenting - this section, adding some #includes, and setting up the appropriate - defines above: - - #define MORECORE osMoreCore - - There is also a shutdown routine that should somehow be called for - cleanup upon program exit. - - #define MAX_POOL_ENTRIES 100 - #define MINIMUM_MORECORE_SIZE (64 * 1024U) - static int next_os_pool; - void *our_os_pools[MAX_POOL_ENTRIES]; - - void *osMoreCore(int size) - { - void *ptr = 0; - static void *sbrk_top = 0; - - if (size > 0) - { - if (size < MINIMUM_MORECORE_SIZE) - size = MINIMUM_MORECORE_SIZE; - if (CurrentExecutionLevel() == kTaskLevel) - ptr = PoolAllocateResident(size + RM_PAGE_SIZE, 0); - if (ptr == 0) - { - return (void *) MFAIL; - } - // save ptrs so they can be freed during cleanup - our_os_pools[next_os_pool] = ptr; - next_os_pool++; - ptr = (void *) ((((size_t) ptr) + RM_PAGE_MASK) & ~RM_PAGE_MASK); - sbrk_top = (char *) ptr + size; - return ptr; - } - else if (size < 0) - { - // we don't currently support shrink behavior - return (void *) MFAIL; - } - else - { - return sbrk_top; - } - } - - // cleanup any allocated memory pools - // called as last thing before shutting down driver - - void osCleanupMem(void) - { - void **ptr; - - for (ptr = our_os_pools; ptr < &our_os_pools[MAX_POOL_ENTRIES]; ptr++) - if (*ptr) - { - PoolDeallocate(*ptr); - *ptr = 0; - } - } - -*/ - - -/* ----------------------------------------------------------------------- -History: - V2.8.3 Thu Sep 22 11:16:32 2005 Doug Lea (dl at gee) - * Add max_footprint functions - * Ensure all appropriate literals are size_t - * Fix conditional compilation problem for some #define settings - * Avoid concatenating segments with the one provided - in create_mspace_with_base - * Rename some variables to avoid compiler shadowing warnings - * Use explicit lock initialization. - * Better handling of sbrk interference. - * Simplify and fix segment insertion, trimming and mspace_destroy - * Reinstate REALLOC_ZERO_BYTES_FREES option from 2.7.x - * Thanks especially to Dennis Flanagan for help on these. - - V2.8.2 Sun Jun 12 16:01:10 2005 Doug Lea (dl at gee) - * Fix memalign brace error. - - V2.8.1 Wed Jun 8 16:11:46 2005 Doug Lea (dl at gee) - * Fix improper #endif nesting in C++ - * Add explicit casts needed for C++ - - V2.8.0 Mon May 30 14:09:02 2005 Doug Lea (dl at gee) - * Use trees for large bins - * Support mspaces - * Use segments to unify sbrk-based and mmap-based system allocation, - removing need for emulation on most platforms without sbrk. - * Default safety checks - * Optional footer checks. Thanks to William Robertson for the idea. - * Internal code refactoring - * Incorporate suggestions and platform-specific changes. - Thanks to Dennis Flanagan, Colin Plumb, Niall Douglas, - Aaron Bachmann, Emery Berger, and others. - * Speed up non-fastbin processing enough to remove fastbins. - * Remove useless cfree() to avoid conflicts with other apps. - * Remove internal memcpy, memset. Compilers handle builtins better. - * Remove some options that no one ever used and rename others. - - V2.7.2 Sat Aug 17 09:07:30 2002 Doug Lea (dl at gee) - * Fix malloc_state bitmap array misdeclaration - - V2.7.1 Thu Jul 25 10:58:03 2002 Doug Lea (dl at gee) - * Allow tuning of FIRST_SORTED_BIN_SIZE - * Use PTR_UINT as type for all ptr->int casts. Thanks to John Belmonte. - * Better detection and support for non-contiguousness of MORECORE. - Thanks to Andreas Mueller, Conal Walsh, and Wolfram Gloger - * Bypass most of malloc if no frees. Thanks To Emery Berger. - * Fix freeing of old top non-contiguous chunk im sysmalloc. - * Raised default trim and map thresholds to 256K. - * Fix mmap-related #defines. Thanks to Lubos Lunak. - * Fix copy macros; added LACKS_FCNTL_H. Thanks to Neal Walfield. - * Branch-free bin calculation - * Default trim and mmap thresholds now 256K. - - V2.7.0 Sun Mar 11 14:14:06 2001 Doug Lea (dl at gee) - * Introduce independent_comalloc and independent_calloc. - Thanks to Michael Pachos for motivation and help. - * Make optional .h file available - * Allow > 2GB requests on 32bit systems. - * new WIN32 sbrk, mmap, munmap, lock code from . - Thanks also to Andreas Mueller , - and Anonymous. - * Allow override of MALLOC_ALIGNMENT (Thanks to Ruud Waij for - helping test this.) - * memalign: check alignment arg - * realloc: don't try to shift chunks backwards, since this - leads to more fragmentation in some programs and doesn't - seem to help in any others. - * Collect all cases in malloc requiring system memory into sysmalloc - * Use mmap as backup to sbrk - * Place all internal state in malloc_state - * Introduce fastbins (although similar to 2.5.1) - * Many minor tunings and cosmetic improvements - * Introduce USE_PUBLIC_MALLOC_WRAPPERS, USE_MALLOC_LOCK - * Introduce MALLOC_FAILURE_ACTION, MORECORE_CONTIGUOUS - Thanks to Tony E. Bennett and others. - * Include errno.h to support default failure action. - - V2.6.6 Sun Dec 5 07:42:19 1999 Doug Lea (dl at gee) - * return null for negative arguments - * Added Several WIN32 cleanups from Martin C. Fong - * Add 'LACKS_SYS_PARAM_H' for those systems without 'sys/param.h' - (e.g. WIN32 platforms) - * Cleanup header file inclusion for WIN32 platforms - * Cleanup code to avoid Microsoft Visual C++ compiler complaints - * Add 'USE_DL_PREFIX' to quickly allow co-existence with existing - memory allocation routines - * Set 'malloc_getpagesize' for WIN32 platforms (needs more work) - * Use 'assert' rather than 'ASSERT' in WIN32 code to conform to - usage of 'assert' in non-WIN32 code - * Improve WIN32 'sbrk()' emulation's 'findRegion()' routine to - avoid infinite loop - * Always call 'fREe()' rather than 'free()' - - V2.6.5 Wed Jun 17 15:57:31 1998 Doug Lea (dl at gee) - * Fixed ordering problem with boundary-stamping - - V2.6.3 Sun May 19 08:17:58 1996 Doug Lea (dl at gee) - * Added pvalloc, as recommended by H.J. Liu - * Added 64bit pointer support mainly from Wolfram Gloger - * Added anonymously donated WIN32 sbrk emulation - * Malloc, calloc, getpagesize: add optimizations from Raymond Nijssen - * malloc_extend_top: fix mask error that caused wastage after - foreign sbrks - * Add linux mremap support code from HJ Liu - - V2.6.2 Tue Dec 5 06:52:55 1995 Doug Lea (dl at gee) - * Integrated most documentation with the code. - * Add support for mmap, with help from - Wolfram Gloger (Gloger@lrz.uni-muenchen.de). - * Use last_remainder in more cases. - * Pack bins using idea from colin@nyx10.cs.du.edu - * Use ordered bins instead of best-fit threshold - * Eliminate block-local decls to simplify tracing and debugging. - * Support another case of realloc via move into top - * Fix error occurring when initial sbrk_base not word-aligned. - * Rely on page size for units instead of SBRK_UNIT to - avoid surprises about sbrk alignment conventions. - * Add mallinfo, mallopt. Thanks to Raymond Nijssen - (raymond@es.ele.tue.nl) for the suggestion. - * Add `pad' argument to malloc_trim and top_pad mallopt parameter. - * More precautions for cases where other routines call sbrk, - courtesy of Wolfram Gloger (Gloger@lrz.uni-muenchen.de). - * Added macros etc., allowing use in linux libc from - H.J. Lu (hjl@gnu.ai.mit.edu) - * Inverted this history list - - V2.6.1 Sat Dec 2 14:10:57 1995 Doug Lea (dl at gee) - * Re-tuned and fixed to behave more nicely with V2.6.0 changes. - * Removed all preallocation code since under current scheme - the work required to undo bad preallocations exceeds - the work saved in good cases for most test programs. - * No longer use return list or unconsolidated bins since - no scheme using them consistently outperforms those that don't - given above changes. - * Use best fit for very large chunks to prevent some worst-cases. - * Added some support for debugging - - V2.6.0 Sat Nov 4 07:05:23 1995 Doug Lea (dl at gee) - * Removed footers when chunks are in use. Thanks to - Paul Wilson (wilson@cs.texas.edu) for the suggestion. - - V2.5.4 Wed Nov 1 07:54:51 1995 Doug Lea (dl at gee) - * Added malloc_trim, with help from Wolfram Gloger - (wmglo@Dent.MED.Uni-Muenchen.DE). - - V2.5.3 Tue Apr 26 10:16:01 1994 Doug Lea (dl at g) - - V2.5.2 Tue Apr 5 16:20:40 1994 Doug Lea (dl at g) - * realloc: try to expand in both directions - * malloc: swap order of clean-bin strategy; - * realloc: only conditionally expand backwards - * Try not to scavenge used bins - * Use bin counts as a guide to preallocation - * Occasionally bin return list chunks in first scan - * Add a few optimizations from colin@nyx10.cs.du.edu - - V2.5.1 Sat Aug 14 15:40:43 1993 Doug Lea (dl at g) - * faster bin computation & slightly different binning - * merged all consolidations to one part of malloc proper - (eliminating old malloc_find_space & malloc_clean_bin) - * Scan 2 returns chunks (not just 1) - * Propagate failure in realloc if malloc returns 0 - * Add stuff to allow compilation on non-ANSI compilers - from kpv@research.att.com - - V2.5 Sat Aug 7 07:41:59 1993 Doug Lea (dl at g.oswego.edu) - * removed potential for odd address access in prev_chunk - * removed dependency on getpagesize.h - * misc cosmetics and a bit more internal documentation - * anticosmetics: mangled names in macros to evade debugger strangeness - * tested on sparc, hp-700, dec-mips, rs6000 - with gcc & native cc (hp, dec only) allowing - Detlefs & Zorn comparison study (in SIGPLAN Notices.) - - Trial version Fri Aug 28 13:14:29 1992 Doug Lea (dl at g.oswego.edu) - * Based loosely on libg++-1.2X malloc. (It retains some of the overall - structure of old version, but most details differ.) - -*/ diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/frv/eabi.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/frv/eabi.S deleted file mode 100644 index 379ea4b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/frv/eabi.S +++ /dev/null @@ -1,128 +0,0 @@ -/* ----------------------------------------------------------------------- - eabi.S - Copyright (c) 2004 Anthony Green - - FR-V Assembly glue. - - 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 AUTHOR 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. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include - - .globl ffi_prep_args_EABI - - .text - .p2align 4 - .globl ffi_call_EABI - .type ffi_call_EABI, @function - - # gr8 : ffi_prep_args - # gr9 : &ecif - # gr10: cif->bytes - # gr11: fig->flags - # gr12: ecif.rvalue - # gr13: fn - -ffi_call_EABI: - addi sp, #-80, sp - sti fp, @(sp, #24) - addi sp, #24, fp - movsg lr, gr5 - - /* Make room for the new arguments. */ - /* subi sp, fp, gr10 */ - - /* Store return address and incoming args on stack. */ - sti gr5, @(fp, #8) - sti gr8, @(fp, #-4) - sti gr9, @(fp, #-8) - sti gr10, @(fp, #-12) - sti gr11, @(fp, #-16) - sti gr12, @(fp, #-20) - sti gr13, @(fp, #-24) - - sub sp, gr10, sp - - /* Call ffi_prep_args. */ - ldi @(fp, #-4), gr4 - addi sp, #0, gr8 - ldi @(fp, #-8), gr9 -#ifdef __FRV_FDPIC__ - ldd @(gr4, gr0), gr14 - calll @(gr14, gr0) -#else - calll @(gr4, gr0) -#endif - - /* ffi_prep_args returns the new stack pointer. */ - mov gr8, gr4 - - ldi @(sp, #0), gr8 - ldi @(sp, #4), gr9 - ldi @(sp, #8), gr10 - ldi @(sp, #12), gr11 - ldi @(sp, #16), gr12 - ldi @(sp, #20), gr13 - - /* Always copy the return value pointer into the hidden - parameter register. This is only strictly necessary - when we're returning an aggregate type, but it doesn't - hurt to do this all the time, and it saves a branch. */ - ldi @(fp, #-20), gr3 - - /* Use the ffi_prep_args return value for the new sp. */ - mov gr4, sp - - /* Call the target function. */ - ldi @(fp, -24), gr4 -#ifdef __FRV_FDPIC__ - ldd @(gr4, gr0), gr14 - calll @(gr14, gr0) -#else - calll @(gr4, gr0) -#endif - - /* Store the result. */ - ldi @(fp, #-16), gr10 /* fig->flags */ - ldi @(fp, #-20), gr4 /* ecif.rvalue */ - - /* Is the return value stored in two registers? */ - cmpi gr10, #8, icc0 - bne icc0, 0, .L2 - /* Yes, save them. */ - sti gr8, @(gr4, #0) - sti gr9, @(gr4, #4) - bra .L3 -.L2: - /* Is the return value a structure? */ - cmpi gr10, #-1, icc0 - beq icc0, 0, .L3 - /* No, save a 4 byte return value. */ - sti gr8, @(gr4, #0) -.L3: - - /* Restore the stack, and return. */ - ldi @(fp, 8), gr5 - ld @(fp, gr0), fp - addi sp,#80,sp - jmpl @(gr5,gr0) - .size ffi_call_EABI, .-ffi_call_EABI - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/frv/ffi.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/frv/ffi.c deleted file mode 100644 index ed1c65a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/frv/ffi.c +++ /dev/null @@ -1,292 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (C) 2004 Anthony Green - Copyright (C) 2007 Free Software Foundation, Inc. - Copyright (C) 2008 Red Hat, Inc. - - FR-V Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#include -#include - -#include - -/* ffi_prep_args is called by the assembly routine once stack space - has been allocated for the function's arguments */ - -void *ffi_prep_args(char *stack, extended_cif *ecif) -{ - register unsigned int i; - register void **p_argv; - register char *argp; - register ffi_type **p_arg; - register int count = 0; - - p_argv = ecif->avalue; - argp = stack; - - for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; - (i != 0); - i--, p_arg++) - { - size_t z; - - z = (*p_arg)->size; - - if ((*p_arg)->type == FFI_TYPE_STRUCT) - { - z = sizeof(void*); - *(void **) argp = *p_argv; - } - /* if ((*p_arg)->type == FFI_TYPE_FLOAT) - { - if (count > 24) - { - // This is going on the stack. Turn it into a double. - *(double *) argp = (double) *(float*)(* p_argv); - z = sizeof(double); - } - else - *(void **) argp = *(void **)(* p_argv); - } */ - else if (z < sizeof(int)) - { - z = sizeof(int); - switch ((*p_arg)->type) - { - case FFI_TYPE_SINT8: - *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); - break; - - case FFI_TYPE_UINT8: - *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); - break; - - case FFI_TYPE_SINT16: - *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); - break; - - case FFI_TYPE_UINT16: - *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); - break; - - default: - FFI_ASSERT(0); - } - } - else if (z == sizeof(int)) - { - *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); - } - else - { - memcpy(argp, *p_argv, z); - } - p_argv++; - argp += z; - count += z; - } - - return (stack + ((count > 24) ? 24 : FFI_ALIGN_DOWN(count, 8))); -} - -/* Perform machine dependent cif processing */ -ffi_status ffi_prep_cif_machdep(ffi_cif *cif) -{ - if (cif->rtype->type == FFI_TYPE_STRUCT) - cif->flags = -1; - else - cif->flags = cif->rtype->size; - - cif->bytes = FFI_ALIGN (cif->bytes, 8); - - return FFI_OK; -} - -extern void ffi_call_EABI(void *(*)(char *, extended_cif *), - extended_cif *, - unsigned, unsigned, - unsigned *, - void (*fn)(void)); - -void ffi_call(ffi_cif *cif, - void (*fn)(void), - void *rvalue, - void **avalue) -{ - extended_cif ecif; - - ecif.cif = cif; - ecif.avalue = avalue; - - /* If the return value is a struct and we don't have a return */ - /* value address then we need to make one */ - - if ((rvalue == NULL) && - (cif->rtype->type == FFI_TYPE_STRUCT)) - { - ecif.rvalue = alloca(cif->rtype->size); - } - else - ecif.rvalue = rvalue; - - - switch (cif->abi) - { - case FFI_EABI: - ffi_call_EABI(ffi_prep_args, &ecif, cif->bytes, - cif->flags, ecif.rvalue, fn); - break; - default: - FFI_ASSERT(0); - break; - } -} - -void ffi_closure_eabi (unsigned arg1, unsigned arg2, unsigned arg3, - unsigned arg4, unsigned arg5, unsigned arg6) -{ - /* This function is called by a trampoline. The trampoline stows a - pointer to the ffi_closure object in gr7. We must save this - pointer in a place that will persist while we do our work. */ - register ffi_closure *creg __asm__ ("gr7"); - ffi_closure *closure = creg; - - /* Arguments that don't fit in registers are found on the stack - at a fixed offset above the current frame pointer. */ - register char *frame_pointer __asm__ ("fp"); - char *stack_args = frame_pointer + 16; - - /* Lay the register arguments down in a continuous chunk of memory. */ - unsigned register_args[6] = - { arg1, arg2, arg3, arg4, arg5, arg6 }; - - ffi_cif *cif = closure->cif; - ffi_type **arg_types = cif->arg_types; - void **avalue = alloca (cif->nargs * sizeof(void *)); - char *ptr = (char *) register_args; - int i; - - /* Find the address of each argument. */ - for (i = 0; i < cif->nargs; i++) - { - switch (arg_types[i]->type) - { - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: - avalue[i] = ptr + 3; - break; - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: - avalue[i] = ptr + 2; - break; - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - case FFI_TYPE_FLOAT: - avalue[i] = ptr; - break; - case FFI_TYPE_STRUCT: - avalue[i] = *(void**)ptr; - break; - default: - /* This is an 8-byte value. */ - avalue[i] = ptr; - ptr += 4; - break; - } - ptr += 4; - - /* If we've handled more arguments than fit in registers, - start looking at the those passed on the stack. */ - if (ptr == ((char *)register_args + (6*4))) - ptr = stack_args; - } - - /* Invoke the closure. */ - if (cif->rtype->type == FFI_TYPE_STRUCT) - { - /* The caller allocates space for the return structure, and - passes a pointer to this space in gr3. Use this value directly - as the return value. */ - register void *return_struct_ptr __asm__("gr3"); - (closure->fun) (cif, return_struct_ptr, avalue, closure->user_data); - } - else - { - /* Allocate space for the return value and call the function. */ - long long rvalue; - (closure->fun) (cif, &rvalue, avalue, closure->user_data); - - /* Functions return 4-byte or smaller results in gr8. 8-byte - values also use gr9. We fill the both, even for small return - values, just to avoid a branch. */ - asm ("ldi @(%0, #0), gr8" : : "r" (&rvalue)); - asm ("ldi @(%0, #0), gr9" : : "r" (&((int *) &rvalue)[1])); - } -} - -ffi_status -ffi_prep_closure_loc (ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, - void *codeloc) -{ - unsigned int *tramp = (unsigned int *) &closure->tramp[0]; - unsigned long fn = (long) ffi_closure_eabi; - unsigned long cls = (long) codeloc; -#ifdef __FRV_FDPIC__ - register void *got __asm__("gr15"); -#endif - int i; - - fn = (unsigned long) ffi_closure_eabi; - -#ifdef __FRV_FDPIC__ - tramp[0] = &((unsigned int *)codeloc)[2]; - tramp[1] = got; - tramp[2] = 0x8cfc0000 + (fn & 0xffff); /* setlos lo(fn), gr6 */ - tramp[3] = 0x8efc0000 + (cls & 0xffff); /* setlos lo(cls), gr7 */ - tramp[4] = 0x8cf80000 + (fn >> 16); /* sethi hi(fn), gr6 */ - tramp[5] = 0x8ef80000 + (cls >> 16); /* sethi hi(cls), gr7 */ - tramp[6] = 0x9cc86000; /* ldi @(gr6, #0), gr14 */ - tramp[7] = 0x8030e000; /* jmpl @(gr14, gr0) */ -#else - tramp[0] = 0x8cfc0000 + (fn & 0xffff); /* setlos lo(fn), gr6 */ - tramp[1] = 0x8efc0000 + (cls & 0xffff); /* setlos lo(cls), gr7 */ - tramp[2] = 0x8cf80000 + (fn >> 16); /* sethi hi(fn), gr6 */ - tramp[3] = 0x8ef80000 + (cls >> 16); /* sethi hi(cls), gr7 */ - tramp[4] = 0x80300006; /* jmpl @(gr0, gr6) */ -#endif - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - /* Cache flushing. */ - for (i = 0; i < FFI_TRAMPOLINE_SIZE; i++) - __asm__ volatile ("dcf @(%0,%1)\n\tici @(%2,%1)" :: "r" (tramp), "r" (i), - "r" (codeloc)); - - return FFI_OK; -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/frv/ffitarget.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/frv/ffitarget.h deleted file mode 100644 index d42540e..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/frv/ffitarget.h +++ /dev/null @@ -1,62 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - Copyright (c) 1996-2004 Red Hat, Inc. - Target configuration macros for FR-V - - 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. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -/* ---- System specific configurations ----------------------------------- */ - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_EABI, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_EABI -} ffi_abi; -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_NATIVE_RAW_API 0 - -#ifdef __FRV_FDPIC__ -/* Trampolines are 8 4-byte instructions long. */ -#define FFI_TRAMPOLINE_SIZE (8*4) -#else -/* Trampolines are 5 4-byte instructions long. */ -#define FFI_TRAMPOLINE_SIZE (5*4) -#endif - -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/ia64/ffi.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/ia64/ffi.c deleted file mode 100644 index b1d04c3..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/ia64/ffi.c +++ /dev/null @@ -1,604 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 1998, 2007, 2008, 2012 Red Hat, Inc. - Copyright (c) 2000 Hewlett Packard Company - Copyright (c) 2011 Anthony Green - - IA64 Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#include -#include - -#include -#include -#include - -#include "ia64_flags.h" - -/* A 64-bit pointer value. In LP64 mode, this is effectively a plain - pointer. In ILP32 mode, it's a pointer that's been extended to - 64 bits by "addp4". */ -typedef void *PTR64 __attribute__((mode(DI))); - -/* Memory image of fp register contents. This is the implementation - specific format used by ldf.fill/stf.spill. All we care about is - that it wants a 16 byte aligned slot. */ -typedef struct -{ - UINT64 x[2] __attribute__((aligned(16))); -} fpreg; - - -/* The stack layout given to ffi_call_unix and ffi_closure_unix_inner. */ - -struct ia64_args -{ - fpreg fp_regs[8]; /* Contents of 8 fp arg registers. */ - UINT64 gp_regs[8]; /* Contents of 8 gp arg registers. */ - UINT64 other_args[]; /* Arguments passed on stack, variable size. */ -}; - - -/* Adjust ADDR, a pointer to an 8 byte slot, to point to the low LEN bytes. */ - -static inline void * -endian_adjust (void *addr, size_t len) -{ -#ifdef __BIG_ENDIAN__ - return addr + (8 - len); -#else - return addr; -#endif -} - -/* Store VALUE to ADDR in the current cpu implementation's fp spill format. - This is a macro instead of a function, so that it works for all 3 floating - point types without type conversions. Type conversion to long double breaks - the denorm support. */ - -#define stf_spill(addr, value) \ - asm ("stf.spill %0 = %1%P0" : "=m" (*addr) : "f"(value)); - -/* Load a value from ADDR, which is in the current cpu implementation's - fp spill format. As above, this must also be a macro. */ - -#define ldf_fill(result, addr) \ - asm ("ldf.fill %0 = %1%P1" : "=f"(result) : "m"(*addr)); - -/* Return the size of the C type associated with with TYPE. Which will - be one of the FFI_IA64_TYPE_HFA_* values. */ - -static size_t -hfa_type_size (int type) -{ - switch (type) - { - case FFI_IA64_TYPE_HFA_FLOAT: - return sizeof(float); - case FFI_IA64_TYPE_HFA_DOUBLE: - return sizeof(double); - case FFI_IA64_TYPE_HFA_LDOUBLE: - return sizeof(__float80); - default: - abort (); - } -} - -/* Load from ADDR a value indicated by TYPE. Which will be one of - the FFI_IA64_TYPE_HFA_* values. */ - -static void -hfa_type_load (fpreg *fpaddr, int type, void *addr) -{ - switch (type) - { - case FFI_IA64_TYPE_HFA_FLOAT: - stf_spill (fpaddr, *(float *) addr); - return; - case FFI_IA64_TYPE_HFA_DOUBLE: - stf_spill (fpaddr, *(double *) addr); - return; - case FFI_IA64_TYPE_HFA_LDOUBLE: - stf_spill (fpaddr, *(__float80 *) addr); - return; - default: - abort (); - } -} - -/* Load VALUE into ADDR as indicated by TYPE. Which will be one of - the FFI_IA64_TYPE_HFA_* values. */ - -static void -hfa_type_store (int type, void *addr, fpreg *fpaddr) -{ - switch (type) - { - case FFI_IA64_TYPE_HFA_FLOAT: - { - float result; - ldf_fill (result, fpaddr); - *(float *) addr = result; - break; - } - case FFI_IA64_TYPE_HFA_DOUBLE: - { - double result; - ldf_fill (result, fpaddr); - *(double *) addr = result; - break; - } - case FFI_IA64_TYPE_HFA_LDOUBLE: - { - __float80 result; - ldf_fill (result, fpaddr); - *(__float80 *) addr = result; - break; - } - default: - abort (); - } -} - -/* Is TYPE a struct containing floats, doubles, or extended doubles, - all of the same fp type? If so, return the element type. Return - FFI_TYPE_VOID if not. */ - -static int -hfa_element_type (ffi_type *type, int nested) -{ - int element = FFI_TYPE_VOID; - - switch (type->type) - { - case FFI_TYPE_FLOAT: - /* We want to return VOID for raw floating-point types, but the - synthetic HFA type if we're nested within an aggregate. */ - if (nested) - element = FFI_IA64_TYPE_HFA_FLOAT; - break; - - case FFI_TYPE_DOUBLE: - /* Similarly. */ - if (nested) - element = FFI_IA64_TYPE_HFA_DOUBLE; - break; - - case FFI_TYPE_LONGDOUBLE: - /* Similarly, except that that HFA is true for double extended, - but not quad precision. Both have sizeof == 16, so tell the - difference based on the precision. */ - if (LDBL_MANT_DIG == 64 && nested) - element = FFI_IA64_TYPE_HFA_LDOUBLE; - break; - - case FFI_TYPE_STRUCT: - { - ffi_type **ptr = &type->elements[0]; - - for (ptr = &type->elements[0]; *ptr ; ptr++) - { - int sub_element = hfa_element_type (*ptr, 1); - if (sub_element == FFI_TYPE_VOID) - return FFI_TYPE_VOID; - - if (element == FFI_TYPE_VOID) - element = sub_element; - else if (element != sub_element) - return FFI_TYPE_VOID; - } - } - break; - - default: - return FFI_TYPE_VOID; - } - - return element; -} - - -/* Perform machine dependent cif processing. */ - -static ffi_status -ffi_prep_cif_machdep_core(ffi_cif *cif) -{ - int flags; - - /* Adjust cif->bytes to include space for the bits of the ia64_args frame - that precedes the integer register portion. The estimate that the - generic bits did for the argument space required is good enough for the - integer component. */ - cif->bytes += offsetof(struct ia64_args, gp_regs[0]); - if (cif->bytes < sizeof(struct ia64_args)) - cif->bytes = sizeof(struct ia64_args); - - /* Set the return type flag. */ - flags = cif->rtype->type; - switch (cif->rtype->type) - { - case FFI_TYPE_LONGDOUBLE: - /* Leave FFI_TYPE_LONGDOUBLE as meaning double extended precision, - and encode quad precision as a two-word integer structure. */ - if (LDBL_MANT_DIG != 64) - flags = FFI_IA64_TYPE_SMALL_STRUCT | (16 << 8); - break; - - case FFI_TYPE_STRUCT: - { - size_t size = cif->rtype->size; - int hfa_type = hfa_element_type (cif->rtype, 0); - - if (hfa_type != FFI_TYPE_VOID) - { - size_t nelts = size / hfa_type_size (hfa_type); - if (nelts <= 8) - flags = hfa_type | (size << 8); - } - else - { - if (size <= 32) - flags = FFI_IA64_TYPE_SMALL_STRUCT | (size << 8); - } - } - break; - - default: - break; - } - cif->flags = flags; - - return FFI_OK; -} - -ffi_status -ffi_prep_cif_machdep(ffi_cif *cif) -{ - cif->nfixedargs = cif->nargs; - return ffi_prep_cif_machdep_core(cif); -} - -ffi_status -ffi_prep_cif_machdep_var(ffi_cif *cif, - unsigned int nfixedargs, - unsigned int ntotalargs MAYBE_UNUSED) -{ - cif->nfixedargs = nfixedargs; - return ffi_prep_cif_machdep_core(cif); -} - -extern int ffi_call_unix (struct ia64_args *, PTR64, void (*)(void), UINT64); - -void -ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - struct ia64_args *stack; - long i, avn, gpcount, fpcount; - ffi_type **p_arg; - - FFI_ASSERT (cif->abi == FFI_UNIX); - - /* If we have no spot for a return value, make one. */ - if (rvalue == NULL && cif->rtype->type != FFI_TYPE_VOID) - rvalue = alloca (cif->rtype->size); - - /* Allocate the stack frame. */ - stack = alloca (cif->bytes); - - gpcount = fpcount = 0; - avn = cif->nargs; - for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++) - { - switch ((*p_arg)->type) - { - case FFI_TYPE_SINT8: - stack->gp_regs[gpcount++] = *(SINT8 *)avalue[i]; - break; - case FFI_TYPE_UINT8: - stack->gp_regs[gpcount++] = *(UINT8 *)avalue[i]; - break; - case FFI_TYPE_SINT16: - stack->gp_regs[gpcount++] = *(SINT16 *)avalue[i]; - break; - case FFI_TYPE_UINT16: - stack->gp_regs[gpcount++] = *(UINT16 *)avalue[i]; - break; - case FFI_TYPE_SINT32: - stack->gp_regs[gpcount++] = *(SINT32 *)avalue[i]; - break; - case FFI_TYPE_UINT32: - stack->gp_regs[gpcount++] = *(UINT32 *)avalue[i]; - break; - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - stack->gp_regs[gpcount++] = *(UINT64 *)avalue[i]; - break; - - case FFI_TYPE_POINTER: - stack->gp_regs[gpcount++] = (UINT64)(PTR64) *(void **)avalue[i]; - break; - - case FFI_TYPE_FLOAT: - if (gpcount < 8 && fpcount < 8) - stf_spill (&stack->fp_regs[fpcount++], *(float *)avalue[i]); - { - UINT32 tmp; - memcpy (&tmp, avalue[i], sizeof (UINT32)); - stack->gp_regs[gpcount++] = tmp; - } - break; - - case FFI_TYPE_DOUBLE: - if (gpcount < 8 && fpcount < 8) - stf_spill (&stack->fp_regs[fpcount++], *(double *)avalue[i]); - memcpy (&stack->gp_regs[gpcount++], avalue[i], sizeof (UINT64)); - break; - - case FFI_TYPE_LONGDOUBLE: - if (gpcount & 1) - gpcount++; - if (LDBL_MANT_DIG == 64 && gpcount < 8 && fpcount < 8) - stf_spill (&stack->fp_regs[fpcount++], *(__float80 *)avalue[i]); - memcpy (&stack->gp_regs[gpcount], avalue[i], 16); - gpcount += 2; - break; - - case FFI_TYPE_STRUCT: - { - size_t size = (*p_arg)->size; - size_t align = (*p_arg)->alignment; - int hfa_type = hfa_element_type (*p_arg, 0); - - FFI_ASSERT (align <= 16); - if (align == 16 && (gpcount & 1)) - gpcount++; - - if (hfa_type != FFI_TYPE_VOID) - { - size_t hfa_size = hfa_type_size (hfa_type); - size_t offset = 0; - size_t gp_offset = gpcount * 8; - - while (fpcount < 8 - && offset < size - && gp_offset < 8 * 8) - { - hfa_type_load (&stack->fp_regs[fpcount], hfa_type, - avalue[i] + offset); - offset += hfa_size; - gp_offset += hfa_size; - fpcount += 1; - } - } - - memcpy (&stack->gp_regs[gpcount], avalue[i], size); - gpcount += (size + 7) / 8; - } - break; - - default: - abort (); - } - } - - ffi_call_unix (stack, rvalue, fn, cif->flags); -} - -/* Closures represent a pair consisting of a function pointer, and - some user data. A closure is invoked by reinterpreting the closure - as a function pointer, and branching to it. Thus we can make an - interpreted function callable as a C function: We turn the - interpreter itself, together with a pointer specifying the - interpreted procedure, into a closure. - - For IA64, function pointer are already pairs consisting of a code - pointer, and a gp pointer. The latter is needed to access global - variables. Here we set up such a pair as the first two words of - the closure (in the "trampoline" area), but we replace the gp - pointer with a pointer to the closure itself. We also add the real - gp pointer to the closure. This allows the function entry code to - both retrieve the user data, and to restore the correct gp pointer. */ - -extern void ffi_closure_unix (); - -ffi_status -ffi_prep_closure_loc (ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*,void*,void**,void*), - void *user_data, - void *codeloc) -{ - /* The layout of a function descriptor. A C function pointer really - points to one of these. */ - struct ia64_fd - { - UINT64 code_pointer; - UINT64 gp; - }; - - struct ffi_ia64_trampoline_struct - { - UINT64 code_pointer; /* Pointer to ffi_closure_unix. */ - UINT64 fake_gp; /* Pointer to closure, installed as gp. */ - UINT64 real_gp; /* Real gp value. */ - }; - - struct ffi_ia64_trampoline_struct *tramp; - struct ia64_fd *fd; - - if (cif->abi != FFI_UNIX) - return FFI_BAD_ABI; - - tramp = (struct ffi_ia64_trampoline_struct *)closure->tramp; - fd = (struct ia64_fd *)(void *)ffi_closure_unix; - - tramp->code_pointer = fd->code_pointer; - tramp->real_gp = fd->gp; - tramp->fake_gp = (UINT64)(PTR64)codeloc; - closure->cif = cif; - closure->user_data = user_data; - closure->fun = fun; - - return FFI_OK; -} - - -UINT64 -ffi_closure_unix_inner (ffi_closure *closure, struct ia64_args *stack, - void *rvalue, void *r8) -{ - ffi_cif *cif; - void **avalue; - ffi_type **p_arg; - long i, avn, gpcount, fpcount, nfixedargs; - - cif = closure->cif; - avn = cif->nargs; - nfixedargs = cif->nfixedargs; - avalue = alloca (avn * sizeof (void *)); - - /* If the structure return value is passed in memory get that location - from r8 so as to pass the value directly back to the caller. */ - if (cif->flags == FFI_TYPE_STRUCT) - rvalue = r8; - - gpcount = fpcount = 0; - for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++) - { - int named = i < nfixedargs; - switch ((*p_arg)->type) - { - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: - avalue[i] = endian_adjust(&stack->gp_regs[gpcount++], 1); - break; - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: - avalue[i] = endian_adjust(&stack->gp_regs[gpcount++], 2); - break; - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - avalue[i] = endian_adjust(&stack->gp_regs[gpcount++], 4); - break; - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - avalue[i] = &stack->gp_regs[gpcount++]; - break; - case FFI_TYPE_POINTER: - avalue[i] = endian_adjust(&stack->gp_regs[gpcount++], sizeof(void*)); - break; - - case FFI_TYPE_FLOAT: - if (named && gpcount < 8 && fpcount < 8) - { - fpreg *addr = &stack->fp_regs[fpcount++]; - float result; - avalue[i] = addr; - ldf_fill (result, addr); - *(float *)addr = result; - } - else - avalue[i] = endian_adjust(&stack->gp_regs[gpcount], 4); - gpcount++; - break; - - case FFI_TYPE_DOUBLE: - if (named && gpcount < 8 && fpcount < 8) - { - fpreg *addr = &stack->fp_regs[fpcount++]; - double result; - avalue[i] = addr; - ldf_fill (result, addr); - *(double *)addr = result; - } - else - avalue[i] = &stack->gp_regs[gpcount]; - gpcount++; - break; - - case FFI_TYPE_LONGDOUBLE: - if (gpcount & 1) - gpcount++; - if (LDBL_MANT_DIG == 64 && named && gpcount < 8 && fpcount < 8) - { - fpreg *addr = &stack->fp_regs[fpcount++]; - __float80 result; - avalue[i] = addr; - ldf_fill (result, addr); - *(__float80 *)addr = result; - } - else - avalue[i] = &stack->gp_regs[gpcount]; - gpcount += 2; - break; - - case FFI_TYPE_STRUCT: - { - size_t size = (*p_arg)->size; - size_t align = (*p_arg)->alignment; - int hfa_type = hfa_element_type (*p_arg, 0); - - FFI_ASSERT (align <= 16); - if (align == 16 && (gpcount & 1)) - gpcount++; - - if (hfa_type != FFI_TYPE_VOID) - { - size_t hfa_size = hfa_type_size (hfa_type); - size_t offset = 0; - size_t gp_offset = gpcount * 8; - void *addr = alloca (size); - - avalue[i] = addr; - - while (fpcount < 8 - && offset < size - && gp_offset < 8 * 8) - { - hfa_type_store (hfa_type, addr + offset, - &stack->fp_regs[fpcount]); - offset += hfa_size; - gp_offset += hfa_size; - fpcount += 1; - } - - if (offset < size) - memcpy (addr + offset, (char *)stack->gp_regs + gp_offset, - size - offset); - } - else - avalue[i] = &stack->gp_regs[gpcount]; - - gpcount += (size + 7) / 8; - } - break; - - default: - abort (); - } - } - - closure->fun (cif, rvalue, avalue, closure->user_data); - - return cif->flags; -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/ia64/ffitarget.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/ia64/ffitarget.h deleted file mode 100644 index fd5b9a0..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/ia64/ffitarget.h +++ /dev/null @@ -1,56 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - Copyright (c) 1996-2003 Red Hat, Inc. - Target configuration macros for IA-64. - - 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. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#ifndef LIBFFI_ASM -typedef unsigned long long ffi_arg; -typedef signed long long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_UNIX, /* Linux and all Unix variants use the same conventions */ - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_UNIX -} ffi_abi; -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_TRAMPOLINE_SIZE 24 /* Really the following struct, which */ - /* can be interpreted as a C function */ - /* descriptor: */ -#define FFI_TARGET_SPECIFIC_VARIADIC 1 -#define FFI_EXTRA_CIF_FIELDS unsigned nfixedargs - -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/ia64/ia64_flags.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/ia64/ia64_flags.h deleted file mode 100644 index 9d652ce..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/ia64/ia64_flags.h +++ /dev/null @@ -1,40 +0,0 @@ -/* ----------------------------------------------------------------------- - ia64_flags.h - Copyright (c) 2000 Hewlett Packard Company - - IA64/unix Foreign Function Interface - - Original author: Hans Boehm, HP Labs - - 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. - ----------------------------------------------------------------------- */ - -/* "Type" codes used between assembly and C. When used as a part of - a cfi->flags value, the low byte will be these extra type codes, - and bits 8-31 will be the actual size of the type. */ - -/* Small structures containing N words in integer registers. */ -#define FFI_IA64_TYPE_SMALL_STRUCT (FFI_TYPE_LAST + 1) - -/* Homogeneous Floating Point Aggregates (HFAs) which are returned - in FP registers. */ -#define FFI_IA64_TYPE_HFA_FLOAT (FFI_TYPE_LAST + 2) -#define FFI_IA64_TYPE_HFA_DOUBLE (FFI_TYPE_LAST + 3) -#define FFI_IA64_TYPE_HFA_LDOUBLE (FFI_TYPE_LAST + 4) diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/ia64/unix.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/ia64/unix.S deleted file mode 100644 index e2547e0..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/ia64/unix.S +++ /dev/null @@ -1,567 +0,0 @@ -/* ----------------------------------------------------------------------- - unix.S - Copyright (c) 1998, 2008 Red Hat, Inc. - Copyright (c) 2000 Hewlett Packard Company - - IA64/unix Foreign Function Interface - - Primary author: Hans Boehm, HP Labs - - Loosely modeled on Cygnus code for other platforms. - - 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. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include -#include "ia64_flags.h" - - .pred.safe_across_calls p1-p5,p16-p63 -.text - -/* int ffi_call_unix (struct ia64_args *stack, PTR64 rvalue, - void (*fn)(void), int flags); - */ - - .align 16 - .global ffi_call_unix - .proc ffi_call_unix -ffi_call_unix: - .prologue - /* Bit o trickiness. We actually share a stack frame with ffi_call. - Rely on the fact that ffi_call uses a vframe and don't bother - tracking one here at all. */ - .fframe 0 - .save ar.pfs, r36 // loc0 - alloc loc0 = ar.pfs, 4, 3, 8, 0 - .save rp, loc1 - mov loc1 = b0 - .body - add r16 = 16, in0 - mov loc2 = gp - mov r8 = in1 - ;; - - /* Load up all of the argument registers. */ - ldf.fill f8 = [in0], 32 - ldf.fill f9 = [r16], 32 - ;; - ldf.fill f10 = [in0], 32 - ldf.fill f11 = [r16], 32 - ;; - ldf.fill f12 = [in0], 32 - ldf.fill f13 = [r16], 32 - ;; - ldf.fill f14 = [in0], 32 - ldf.fill f15 = [r16], 24 - ;; - ld8 out0 = [in0], 16 - ld8 out1 = [r16], 16 - ;; - ld8 out2 = [in0], 16 - ld8 out3 = [r16], 16 - ;; - ld8 out4 = [in0], 16 - ld8 out5 = [r16], 16 - ;; - ld8 out6 = [in0] - ld8 out7 = [r16] - ;; - - /* Deallocate the register save area from the stack frame. */ - mov sp = in0 - - /* Call the target function. */ - ld8 r16 = [in2], 8 - ;; - ld8 gp = [in2] - mov b6 = r16 - br.call.sptk.many b0 = b6 - ;; - - /* Dispatch to handle return value. */ - mov gp = loc2 - zxt1 r16 = in3 - ;; - mov ar.pfs = loc0 - addl r18 = @ltoffx(.Lst_table), gp - ;; - ld8.mov r18 = [r18], .Lst_table - mov b0 = loc1 - ;; - shladd r18 = r16, 3, r18 - ;; - ld8 r17 = [r18] - shr in3 = in3, 8 - ;; - add r17 = r17, r18 - ;; - mov b6 = r17 - br b6 - ;; - -.Lst_void: - br.ret.sptk.many b0 - ;; -.Lst_uint8: - zxt1 r8 = r8 - ;; - st8 [in1] = r8 - br.ret.sptk.many b0 - ;; -.Lst_sint8: - sxt1 r8 = r8 - ;; - st8 [in1] = r8 - br.ret.sptk.many b0 - ;; -.Lst_uint16: - zxt2 r8 = r8 - ;; - st8 [in1] = r8 - br.ret.sptk.many b0 - ;; -.Lst_sint16: - sxt2 r8 = r8 - ;; - st8 [in1] = r8 - br.ret.sptk.many b0 - ;; -.Lst_uint32: - zxt4 r8 = r8 - ;; - st8 [in1] = r8 - br.ret.sptk.many b0 - ;; -.Lst_sint32: - sxt4 r8 = r8 - ;; - st8 [in1] = r8 - br.ret.sptk.many b0 - ;; -.Lst_int64: - st8 [in1] = r8 - br.ret.sptk.many b0 - ;; -.Lst_float: - stfs [in1] = f8 - br.ret.sptk.many b0 - ;; -.Lst_double: - stfd [in1] = f8 - br.ret.sptk.many b0 - ;; -.Lst_ldouble: - stfe [in1] = f8 - br.ret.sptk.many b0 - ;; - -.Lst_small_struct: - cmp.lt p6, p0 = 8, in3 - cmp.lt p7, p0 = 16, in3 - cmp.lt p8, p0 = 24, in3 - ;; - add r16 = 8, sp - add r17 = 16, sp - add r18 = 24, sp - ;; - st8 [sp] = r8 -(p6) st8 [r16] = r9 - mov out0 = in1 -(p7) st8 [r17] = r10 -(p8) st8 [r18] = r11 - mov out1 = sp - mov out2 = in3 - ;; - // ia64 software calling convention requires - // top 16 bytes of stack to be scratch space - // PLT resolver uses that scratch space at - // 'memcpy' symbol reolution time - add sp = -16, sp - br.call.sptk.many b0 = memcpy# - ;; - mov ar.pfs = loc0 - mov b0 = loc1 - mov gp = loc2 - br.ret.sptk.many b0 - -.Lst_hfa_float: - add r16 = 4, in1 - cmp.lt p6, p0 = 4, in3 - ;; - stfs [in1] = f8, 8 -(p6) stfs [r16] = f9, 8 - cmp.lt p7, p0 = 8, in3 - cmp.lt p8, p0 = 12, in3 - ;; -(p7) stfs [in1] = f10, 8 -(p8) stfs [r16] = f11, 8 - cmp.lt p9, p0 = 16, in3 - cmp.lt p10, p0 = 20, in3 - ;; -(p9) stfs [in1] = f12, 8 -(p10) stfs [r16] = f13, 8 - cmp.lt p6, p0 = 24, in3 - cmp.lt p7, p0 = 28, in3 - ;; -(p6) stfs [in1] = f14 -(p7) stfs [r16] = f15 - br.ret.sptk.many b0 - ;; - -.Lst_hfa_double: - add r16 = 8, in1 - cmp.lt p6, p0 = 8, in3 - ;; - stfd [in1] = f8, 16 -(p6) stfd [r16] = f9, 16 - cmp.lt p7, p0 = 16, in3 - cmp.lt p8, p0 = 24, in3 - ;; -(p7) stfd [in1] = f10, 16 -(p8) stfd [r16] = f11, 16 - cmp.lt p9, p0 = 32, in3 - cmp.lt p10, p0 = 40, in3 - ;; -(p9) stfd [in1] = f12, 16 -(p10) stfd [r16] = f13, 16 - cmp.lt p6, p0 = 48, in3 - cmp.lt p7, p0 = 56, in3 - ;; -(p6) stfd [in1] = f14 -(p7) stfd [r16] = f15 - br.ret.sptk.many b0 - ;; - -.Lst_hfa_ldouble: - add r16 = 16, in1 - cmp.lt p6, p0 = 16, in3 - ;; - stfe [in1] = f8, 32 -(p6) stfe [r16] = f9, 32 - cmp.lt p7, p0 = 32, in3 - cmp.lt p8, p0 = 48, in3 - ;; -(p7) stfe [in1] = f10, 32 -(p8) stfe [r16] = f11, 32 - cmp.lt p9, p0 = 64, in3 - cmp.lt p10, p0 = 80, in3 - ;; -(p9) stfe [in1] = f12, 32 -(p10) stfe [r16] = f13, 32 - cmp.lt p6, p0 = 96, in3 - cmp.lt p7, p0 = 112, in3 - ;; -(p6) stfe [in1] = f14 -(p7) stfe [r16] = f15 - br.ret.sptk.many b0 - ;; - - .endp ffi_call_unix - - .align 16 - .global ffi_closure_unix - .proc ffi_closure_unix - -#define FRAME_SIZE (8*16 + 8*8 + 8*16) - -ffi_closure_unix: - .prologue - .save ar.pfs, r40 // loc0 - alloc loc0 = ar.pfs, 8, 4, 4, 0 - .fframe FRAME_SIZE - add r12 = -FRAME_SIZE, r12 - .save rp, loc1 - mov loc1 = b0 - .save ar.unat, loc2 - mov loc2 = ar.unat - .body - - /* Retrieve closure pointer and real gp. */ -#ifdef _ILP32 - addp4 out0 = 0, gp - addp4 gp = 16, gp -#else - mov out0 = gp - add gp = 16, gp -#endif - ;; - ld8 gp = [gp] - - /* Spill all of the possible argument registers. */ - add r16 = 16 + 8*16, sp - add r17 = 16 + 8*16 + 16, sp - ;; - stf.spill [r16] = f8, 32 - stf.spill [r17] = f9, 32 - mov loc3 = gp - ;; - stf.spill [r16] = f10, 32 - stf.spill [r17] = f11, 32 - ;; - stf.spill [r16] = f12, 32 - stf.spill [r17] = f13, 32 - ;; - stf.spill [r16] = f14, 32 - stf.spill [r17] = f15, 24 - ;; - .mem.offset 0, 0 - st8.spill [r16] = in0, 16 - .mem.offset 8, 0 - st8.spill [r17] = in1, 16 - add out1 = 16 + 8*16, sp - ;; - .mem.offset 0, 0 - st8.spill [r16] = in2, 16 - .mem.offset 8, 0 - st8.spill [r17] = in3, 16 - add out2 = 16, sp - ;; - .mem.offset 0, 0 - st8.spill [r16] = in4, 16 - .mem.offset 8, 0 - st8.spill [r17] = in5, 16 - mov out3 = r8 - ;; - .mem.offset 0, 0 - st8.spill [r16] = in6 - .mem.offset 8, 0 - st8.spill [r17] = in7 - - /* Invoke ffi_closure_unix_inner for the hard work. */ - br.call.sptk.many b0 = ffi_closure_unix_inner - ;; - - /* Dispatch to handle return value. */ - mov gp = loc3 - zxt1 r16 = r8 - ;; - addl r18 = @ltoffx(.Lld_table), gp - mov ar.pfs = loc0 - ;; - ld8.mov r18 = [r18], .Lld_table - mov b0 = loc1 - ;; - shladd r18 = r16, 3, r18 - mov ar.unat = loc2 - ;; - ld8 r17 = [r18] - shr r8 = r8, 8 - ;; - add r17 = r17, r18 - add r16 = 16, sp - ;; - mov b6 = r17 - br b6 - ;; - .label_state 1 - -.Lld_void: - .restore sp - add sp = FRAME_SIZE, sp - br.ret.sptk.many b0 - ;; -.Lld_int: - .body - .copy_state 1 - ld8 r8 = [r16] - .restore sp - add sp = FRAME_SIZE, sp - br.ret.sptk.many b0 - ;; -.Lld_float: - .body - .copy_state 1 - ldfs f8 = [r16] - .restore sp - add sp = FRAME_SIZE, sp - br.ret.sptk.many b0 - ;; -.Lld_double: - .body - .copy_state 1 - ldfd f8 = [r16] - .restore sp - add sp = FRAME_SIZE, sp - br.ret.sptk.many b0 - ;; -.Lld_ldouble: - .body - .copy_state 1 - ldfe f8 = [r16] - .restore sp - add sp = FRAME_SIZE, sp - br.ret.sptk.many b0 - ;; - -.Lld_small_struct: - .body - .copy_state 1 - add r17 = 8, r16 - cmp.lt p6, p0 = 8, r8 - cmp.lt p7, p0 = 16, r8 - cmp.lt p8, p0 = 24, r8 - ;; - ld8 r8 = [r16], 16 -(p6) ld8 r9 = [r17], 16 - ;; -(p7) ld8 r10 = [r16] -(p8) ld8 r11 = [r17] - .restore sp - add sp = FRAME_SIZE, sp - br.ret.sptk.many b0 - ;; - -.Lld_hfa_float: - .body - .copy_state 1 - add r17 = 4, r16 - cmp.lt p6, p0 = 4, r8 - ;; - ldfs f8 = [r16], 8 -(p6) ldfs f9 = [r17], 8 - cmp.lt p7, p0 = 8, r8 - cmp.lt p8, p0 = 12, r8 - ;; -(p7) ldfs f10 = [r16], 8 -(p8) ldfs f11 = [r17], 8 - cmp.lt p9, p0 = 16, r8 - cmp.lt p10, p0 = 20, r8 - ;; -(p9) ldfs f12 = [r16], 8 -(p10) ldfs f13 = [r17], 8 - cmp.lt p6, p0 = 24, r8 - cmp.lt p7, p0 = 28, r8 - ;; -(p6) ldfs f14 = [r16] -(p7) ldfs f15 = [r17] - .restore sp - add sp = FRAME_SIZE, sp - br.ret.sptk.many b0 - ;; - -.Lld_hfa_double: - .body - .copy_state 1 - add r17 = 8, r16 - cmp.lt p6, p0 = 8, r8 - ;; - ldfd f8 = [r16], 16 -(p6) ldfd f9 = [r17], 16 - cmp.lt p7, p0 = 16, r8 - cmp.lt p8, p0 = 24, r8 - ;; -(p7) ldfd f10 = [r16], 16 -(p8) ldfd f11 = [r17], 16 - cmp.lt p9, p0 = 32, r8 - cmp.lt p10, p0 = 40, r8 - ;; -(p9) ldfd f12 = [r16], 16 -(p10) ldfd f13 = [r17], 16 - cmp.lt p6, p0 = 48, r8 - cmp.lt p7, p0 = 56, r8 - ;; -(p6) ldfd f14 = [r16] -(p7) ldfd f15 = [r17] - .restore sp - add sp = FRAME_SIZE, sp - br.ret.sptk.many b0 - ;; - -.Lld_hfa_ldouble: - .body - .copy_state 1 - add r17 = 16, r16 - cmp.lt p6, p0 = 16, r8 - ;; - ldfe f8 = [r16], 32 -(p6) ldfe f9 = [r17], 32 - cmp.lt p7, p0 = 32, r8 - cmp.lt p8, p0 = 48, r8 - ;; -(p7) ldfe f10 = [r16], 32 -(p8) ldfe f11 = [r17], 32 - cmp.lt p9, p0 = 64, r8 - cmp.lt p10, p0 = 80, r8 - ;; -(p9) ldfe f12 = [r16], 32 -(p10) ldfe f13 = [r17], 32 - cmp.lt p6, p0 = 96, r8 - cmp.lt p7, p0 = 112, r8 - ;; -(p6) ldfe f14 = [r16] -(p7) ldfe f15 = [r17] - .restore sp - add sp = FRAME_SIZE, sp - br.ret.sptk.many b0 - ;; - - .endp ffi_closure_unix - - .section .rodata - .align 8 -.Lst_table: - data8 @pcrel(.Lst_void) // FFI_TYPE_VOID - data8 @pcrel(.Lst_sint32) // FFI_TYPE_INT - data8 @pcrel(.Lst_float) // FFI_TYPE_FLOAT - data8 @pcrel(.Lst_double) // FFI_TYPE_DOUBLE - data8 @pcrel(.Lst_ldouble) // FFI_TYPE_LONGDOUBLE - data8 @pcrel(.Lst_uint8) // FFI_TYPE_UINT8 - data8 @pcrel(.Lst_sint8) // FFI_TYPE_SINT8 - data8 @pcrel(.Lst_uint16) // FFI_TYPE_UINT16 - data8 @pcrel(.Lst_sint16) // FFI_TYPE_SINT16 - data8 @pcrel(.Lst_uint32) // FFI_TYPE_UINT32 - data8 @pcrel(.Lst_sint32) // FFI_TYPE_SINT32 - data8 @pcrel(.Lst_int64) // FFI_TYPE_UINT64 - data8 @pcrel(.Lst_int64) // FFI_TYPE_SINT64 - data8 @pcrel(.Lst_void) // FFI_TYPE_STRUCT - data8 @pcrel(.Lst_int64) // FFI_TYPE_POINTER - data8 @pcrel(.Lst_void) // FFI_TYPE_COMPLEX (not implemented) - data8 @pcrel(.Lst_small_struct) // FFI_IA64_TYPE_SMALL_STRUCT - data8 @pcrel(.Lst_hfa_float) // FFI_IA64_TYPE_HFA_FLOAT - data8 @pcrel(.Lst_hfa_double) // FFI_IA64_TYPE_HFA_DOUBLE - data8 @pcrel(.Lst_hfa_ldouble) // FFI_IA64_TYPE_HFA_LDOUBLE - -.Lld_table: - data8 @pcrel(.Lld_void) // FFI_TYPE_VOID - data8 @pcrel(.Lld_int) // FFI_TYPE_INT - data8 @pcrel(.Lld_float) // FFI_TYPE_FLOAT - data8 @pcrel(.Lld_double) // FFI_TYPE_DOUBLE - data8 @pcrel(.Lld_ldouble) // FFI_TYPE_LONGDOUBLE - data8 @pcrel(.Lld_int) // FFI_TYPE_UINT8 - data8 @pcrel(.Lld_int) // FFI_TYPE_SINT8 - data8 @pcrel(.Lld_int) // FFI_TYPE_UINT16 - data8 @pcrel(.Lld_int) // FFI_TYPE_SINT16 - data8 @pcrel(.Lld_int) // FFI_TYPE_UINT32 - data8 @pcrel(.Lld_int) // FFI_TYPE_SINT32 - data8 @pcrel(.Lld_int) // FFI_TYPE_UINT64 - data8 @pcrel(.Lld_int) // FFI_TYPE_SINT64 - data8 @pcrel(.Lld_void) // FFI_TYPE_STRUCT - data8 @pcrel(.Lld_int) // FFI_TYPE_POINTER - data8 @pcrel(.Lld_void) // FFI_TYPE_COMPLEX (not implemented) - data8 @pcrel(.Lld_small_struct) // FFI_IA64_TYPE_SMALL_STRUCT - data8 @pcrel(.Lld_hfa_float) // FFI_IA64_TYPE_HFA_FLOAT - data8 @pcrel(.Lld_hfa_double) // FFI_IA64_TYPE_HFA_DOUBLE - data8 @pcrel(.Lld_hfa_ldouble) // FFI_IA64_TYPE_HFA_LDOUBLE - -#if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",@progbits -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/java_raw_api.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/java_raw_api.c deleted file mode 100644 index 114d3e4..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/java_raw_api.c +++ /dev/null @@ -1,374 +0,0 @@ -/* ----------------------------------------------------------------------- - java_raw_api.c - Copyright (c) 1999, 2007, 2008 Red Hat, Inc. - - Cloned from raw_api.c - - Raw_api.c author: Kresten Krab Thorup - Java_raw_api.c author: Hans-J. Boehm - - $Id $ - - 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. - ----------------------------------------------------------------------- */ - -/* This defines a Java- and 64-bit specific variant of the raw API. */ -/* It assumes that "raw" argument blocks look like Java stacks on a */ -/* 64-bit machine. Arguments that can be stored in a single stack */ -/* stack slots (longs, doubles) occupy 128 bits, but only the first */ -/* 64 bits are actually used. */ - -#include -#include -#include - -#if !defined(NO_JAVA_RAW_API) - -size_t -ffi_java_raw_size (ffi_cif *cif) -{ - size_t result = 0; - int i; - - ffi_type **at = cif->arg_types; - - for (i = cif->nargs-1; i >= 0; i--, at++) - { - switch((*at) -> type) { - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - case FFI_TYPE_DOUBLE: - result += 2 * FFI_SIZEOF_JAVA_RAW; - break; - case FFI_TYPE_STRUCT: - /* No structure parameters in Java. */ - abort(); - case FFI_TYPE_COMPLEX: - /* Not supported yet. */ - abort(); - default: - result += FFI_SIZEOF_JAVA_RAW; - } - } - - return result; -} - - -void -ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args) -{ - unsigned i; - ffi_type **tp = cif->arg_types; - -#if WORDS_BIGENDIAN - - for (i = 0; i < cif->nargs; i++, tp++, args++) - { - switch ((*tp)->type) - { - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT8: - *args = (void*) ((char*)(raw++) + 3); - break; - - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT16: - *args = (void*) ((char*)(raw++) + 2); - break; - -#if FFI_SIZEOF_JAVA_RAW == 8 - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - case FFI_TYPE_DOUBLE: - *args = (void *)raw; - raw += 2; - break; -#endif - - case FFI_TYPE_POINTER: - *args = (void*) &(raw++)->ptr; - break; - - case FFI_TYPE_COMPLEX: - /* Not supported yet. */ - abort(); - - default: - *args = raw; - raw += - FFI_ALIGN ((*tp)->size, sizeof(ffi_java_raw)) / sizeof(ffi_java_raw); - } - } - -#else /* WORDS_BIGENDIAN */ - -#if !PDP - - /* then assume little endian */ - for (i = 0; i < cif->nargs; i++, tp++, args++) - { -#if FFI_SIZEOF_JAVA_RAW == 8 - switch((*tp)->type) { - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - case FFI_TYPE_DOUBLE: - *args = (void*) raw; - raw += 2; - break; - case FFI_TYPE_COMPLEX: - /* Not supported yet. */ - abort(); - default: - *args = (void*) raw++; - } -#else /* FFI_SIZEOF_JAVA_RAW != 8 */ - *args = (void*) raw; - raw += - FFI_ALIGN ((*tp)->size, sizeof(ffi_java_raw)) / sizeof(ffi_java_raw); -#endif /* FFI_SIZEOF_JAVA_RAW == 8 */ - } - -#else -#error "pdp endian not supported" -#endif /* ! PDP */ - -#endif /* WORDS_BIGENDIAN */ -} - -void -ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw) -{ - unsigned i; - ffi_type **tp = cif->arg_types; - - for (i = 0; i < cif->nargs; i++, tp++, args++) - { - switch ((*tp)->type) - { - case FFI_TYPE_UINT8: -#if WORDS_BIGENDIAN - *(UINT32*)(raw++) = *(UINT8*) (*args); -#else - (raw++)->uint = *(UINT8*) (*args); -#endif - break; - - case FFI_TYPE_SINT8: -#if WORDS_BIGENDIAN - *(SINT32*)(raw++) = *(SINT8*) (*args); -#else - (raw++)->sint = *(SINT8*) (*args); -#endif - break; - - case FFI_TYPE_UINT16: -#if WORDS_BIGENDIAN - *(UINT32*)(raw++) = *(UINT16*) (*args); -#else - (raw++)->uint = *(UINT16*) (*args); -#endif - break; - - case FFI_TYPE_SINT16: -#if WORDS_BIGENDIAN - *(SINT32*)(raw++) = *(SINT16*) (*args); -#else - (raw++)->sint = *(SINT16*) (*args); -#endif - break; - - case FFI_TYPE_UINT32: -#if WORDS_BIGENDIAN - *(UINT32*)(raw++) = *(UINT32*) (*args); -#else - (raw++)->uint = *(UINT32*) (*args); -#endif - break; - - case FFI_TYPE_SINT32: -#if WORDS_BIGENDIAN - *(SINT32*)(raw++) = *(SINT32*) (*args); -#else - (raw++)->sint = *(SINT32*) (*args); -#endif - break; - - case FFI_TYPE_FLOAT: - (raw++)->flt = *(FLOAT32*) (*args); - break; - -#if FFI_SIZEOF_JAVA_RAW == 8 - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - case FFI_TYPE_DOUBLE: - raw->uint = *(UINT64*) (*args); - raw += 2; - break; -#endif - - case FFI_TYPE_POINTER: - (raw++)->ptr = **(void***) args; - break; - - default: -#if FFI_SIZEOF_JAVA_RAW == 8 - FFI_ASSERT(0); /* Should have covered all cases */ -#else - memcpy ((void*) raw->data, (void*)*args, (*tp)->size); - raw += - FFI_ALIGN ((*tp)->size, sizeof(ffi_java_raw)) / sizeof(ffi_java_raw); -#endif - } - } -} - -#if !FFI_NATIVE_RAW_API - -static void -ffi_java_rvalue_to_raw (ffi_cif *cif, void *rvalue) -{ -#if WORDS_BIGENDIAN && FFI_SIZEOF_ARG == 8 - switch (cif->rtype->type) - { - case FFI_TYPE_UINT8: - case FFI_TYPE_UINT16: - case FFI_TYPE_UINT32: - *(UINT64 *)rvalue <<= 32; - break; - - case FFI_TYPE_SINT8: - case FFI_TYPE_SINT16: - case FFI_TYPE_SINT32: - case FFI_TYPE_INT: -#if FFI_SIZEOF_JAVA_RAW == 4 - case FFI_TYPE_POINTER: -#endif - *(SINT64 *)rvalue <<= 32; - break; - - case FFI_TYPE_COMPLEX: - /* Not supported yet. */ - abort(); - - default: - break; - } -#endif -} - -static void -ffi_java_raw_to_rvalue (ffi_cif *cif, void *rvalue) -{ -#if WORDS_BIGENDIAN && FFI_SIZEOF_ARG == 8 - switch (cif->rtype->type) - { - case FFI_TYPE_UINT8: - case FFI_TYPE_UINT16: - case FFI_TYPE_UINT32: - *(UINT64 *)rvalue >>= 32; - break; - - case FFI_TYPE_SINT8: - case FFI_TYPE_SINT16: - case FFI_TYPE_SINT32: - case FFI_TYPE_INT: - *(SINT64 *)rvalue >>= 32; - break; - - case FFI_TYPE_COMPLEX: - /* Not supported yet. */ - abort(); - - default: - break; - } -#endif -} - -/* This is a generic definition of ffi_raw_call, to be used if the - * native system does not provide a machine-specific implementation. - * Having this, allows code to be written for the raw API, without - * the need for system-specific code to handle input in that format; - * these following couple of functions will handle the translation forth - * and back automatically. */ - -void ffi_java_raw_call (ffi_cif *cif, void (*fn)(void), void *rvalue, - ffi_java_raw *raw) -{ - void **avalue = (void**) alloca (cif->nargs * sizeof (void*)); - ffi_java_raw_to_ptrarray (cif, raw, avalue); - ffi_call (cif, fn, rvalue, avalue); - ffi_java_rvalue_to_raw (cif, rvalue); -} - -#if FFI_CLOSURES /* base system provides closures */ - -static void -ffi_java_translate_args (ffi_cif *cif, void *rvalue, - void **avalue, void *user_data) -{ - ffi_java_raw *raw = (ffi_java_raw*)alloca (ffi_java_raw_size (cif)); - ffi_raw_closure *cl = (ffi_raw_closure*)user_data; - - ffi_java_ptrarray_to_raw (cif, avalue, raw); - (*cl->fun) (cif, rvalue, (ffi_raw*)raw, cl->user_data); - ffi_java_raw_to_rvalue (cif, rvalue); -} - -ffi_status -ffi_prep_java_raw_closure_loc (ffi_java_raw_closure* cl, - ffi_cif *cif, - void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), - void *user_data, - void *codeloc) -{ - ffi_status status; - - status = ffi_prep_closure_loc ((ffi_closure*) cl, - cif, - &ffi_java_translate_args, - codeloc, - codeloc); - if (status == FFI_OK) - { - cl->fun = fun; - cl->user_data = user_data; - } - - return status; -} - -/* Again, here is the generic version of ffi_prep_raw_closure, which - * will install an intermediate "hub" for translation of arguments from - * the pointer-array format, to the raw format */ - -ffi_status -ffi_prep_java_raw_closure (ffi_java_raw_closure* cl, - ffi_cif *cif, - void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), - void *user_data) -{ - return ffi_prep_java_raw_closure_loc (cl, cif, fun, user_data, cl); -} - -#endif /* FFI_CLOSURES */ -#endif /* !FFI_NATIVE_RAW_API */ -#endif /* !NO_JAVA_RAW_API */ diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/kvx/asm.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/kvx/asm.h deleted file mode 100644 index 4edba41..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/kvx/asm.h +++ /dev/null @@ -1,5 +0,0 @@ -/* args are passed on registers from r0 up to r11 => 12*8 bytes */ -#define REG_ARGS_SIZE (12*8) -#define KVX_REGISTER_SIZE (8) -#define KVX_ABI_SLOT_SIZE (KVX_REGISTER_SIZE) -#define KVX_ABI_MAX_AGGREGATE_IN_REG_SIZE (4*KVX_ABI_SLOT_SIZE) diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/kvx/ffi.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/kvx/ffi.c deleted file mode 100644 index 58f6aef..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/kvx/ffi.c +++ /dev/null @@ -1,273 +0,0 @@ -/* Copyright (c) 2020 Kalray - -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. */ - -#if defined(__kvx__) -#include -#include -#include -#include -#include -#include "ffi_common.h" -#include "asm.h" - -#define ALIGN(x, a) ALIGN_MASK(x, (typeof(x))(a) - 1) -#define ALIGN_MASK(x, mask) (((x) + (mask)) & ~(mask)) -#define KVX_ABI_STACK_ALIGNMENT (32) -#define KVX_ABI_STACK_ARG_ALIGNMENT (8) -#define max(a,b) ((a) > (b) ? (a) : (b)) - -#ifdef FFI_DEBUG -#define DEBUG_PRINT(...) do{ fprintf( stderr, __VA_ARGS__ ); } while(0) -#else -#define DEBUG_PRINT(...) -#endif - -struct ret_value { - unsigned long int r0; - unsigned long int r1; - unsigned long int r2; - unsigned long int r3; -}; - -extern struct ret_value ffi_call_SYSV(unsigned total_size, - unsigned size, - extended_cif *ecif, - unsigned *rvalue_addr, - void *fn, - unsigned int_ext_method); - -/* Perform machine dependent cif processing */ -ffi_status ffi_prep_cif_machdep(ffi_cif *cif) -{ - cif->flags = cif->rtype->size; - return FFI_OK; -} - -/* ffi_prep_args is called by the assembly routine once stack space - has been allocated for the function's arguments */ - -void *ffi_prep_args(char *stack, unsigned int arg_slots_size, extended_cif *ecif) -{ - char *stacktemp = stack; - char *current_arg_passed_by_value = stack + arg_slots_size; - int i, s; - ffi_type **arg; - int count = 0; - ffi_cif *cif = ecif->cif; - void **argv = ecif->avalue; - - arg = cif->arg_types; - - DEBUG_PRINT("stack: %p\n", stack); - DEBUG_PRINT("arg_slots_size: %u\n", arg_slots_size); - DEBUG_PRINT("current_arg_passed_by_value: %p\n", current_arg_passed_by_value); - DEBUG_PRINT("ecif: %p\n", ecif); - DEBUG_PRINT("ecif->avalue: %p\n", ecif->avalue); - - for (i = 0; i < cif->nargs; i++) { - - s = KVX_ABI_SLOT_SIZE; - switch((*arg)->type) { - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - case FFI_TYPE_POINTER: - DEBUG_PRINT("INT64/32/16/8/FLOAT/DOUBLE or POINTER @%p\n", stack); - *(uint64_t *) stack = *(uint64_t *)(* argv); - break; - - case FFI_TYPE_COMPLEX: - if ((*arg)->size == 8) - *(_Complex float *) stack = *(_Complex float *)(* argv); - else if ((*arg)->size == 16) { - *(_Complex double *) stack = *(_Complex double *)(* argv); - s = 16; - } else - abort(); - break; - case FFI_TYPE_STRUCT: { - char *value; - unsigned int written_size = 0; - DEBUG_PRINT("struct by value @%p\n", stack); - if ((*arg)->size > KVX_ABI_MAX_AGGREGATE_IN_REG_SIZE) { - DEBUG_PRINT("big struct\n"); - *(uint64_t *) stack = (uintptr_t)current_arg_passed_by_value; - value = current_arg_passed_by_value; - current_arg_passed_by_value += (*arg)->size; - written_size = KVX_ABI_SLOT_SIZE; - } else { - value = stack; - written_size = (*arg)->size; - } - memcpy(value, *argv, (*arg)->size); - s = ALIGN(written_size, KVX_ABI_STACK_ARG_ALIGNMENT); - break; - } - default: - printf("Error: unsupported arg type %d\n", (*arg)->type); - abort(); - break; - - } - stack += s; - count += s; - argv++; - arg++; - } -#ifdef FFI_DEBUG - FFI_ASSERT(((intptr_t)(stacktemp + REG_ARGS_SIZE) & (KVX_ABI_STACK_ALIGNMENT-1)) == 0); -#endif - return stacktemp + REG_ARGS_SIZE; -} - -/* Perform machine dependent cif processing when we have a variadic function */ - -ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif, unsigned int nfixedargs, - unsigned int ntotalargs) -{ - cif->flags = cif->rtype->size; - return FFI_OK; -} - -static unsigned long handle_small_int_ext(kvx_intext_method *int_ext_method, - const ffi_type *rtype) -{ - switch (rtype->type) { - case FFI_TYPE_SINT8: - *int_ext_method = KVX_RET_SXBD; - return KVX_REGISTER_SIZE; - - case FFI_TYPE_SINT16: - *int_ext_method = KVX_RET_SXHD; - return KVX_REGISTER_SIZE; - - case FFI_TYPE_SINT32: - *int_ext_method = KVX_RET_SXWD; - return KVX_REGISTER_SIZE; - - case FFI_TYPE_UINT8: - *int_ext_method = KVX_RET_ZXBD; - return KVX_REGISTER_SIZE; - - case FFI_TYPE_UINT16: - *int_ext_method = KVX_RET_ZXHD; - return KVX_REGISTER_SIZE; - - case FFI_TYPE_UINT32: - *int_ext_method = KVX_RET_ZXWD; - return KVX_REGISTER_SIZE; - - default: - *int_ext_method = KVX_RET_NONE; - return rtype->size; - } -} - -void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - int i; - unsigned long int slot_fitting_args_size = 0; - unsigned long int total_size = 0; - unsigned long int big_struct_size = 0; - kvx_intext_method int_extension_method; - ffi_type **arg; - struct ret_value local_rvalue = {0}; - size_t wb_size; - - - /* Calculate size to allocate on stack */ - for (i = 0, arg = cif->arg_types; i < cif->nargs; i++, arg++) { - DEBUG_PRINT("argument %d, type %d, size %lu\n", i, (*arg)->type, (*arg)->size); - if (((*arg)->type == FFI_TYPE_STRUCT) || ((*arg)->type == FFI_TYPE_COMPLEX)) { - if ((*arg)->size <= KVX_ABI_MAX_AGGREGATE_IN_REG_SIZE) { - slot_fitting_args_size += ALIGN((*arg)->size, KVX_ABI_SLOT_SIZE); - } else { - slot_fitting_args_size += KVX_ABI_SLOT_SIZE; /* aggregate passed by reference */ - big_struct_size += ALIGN((*arg)->size, KVX_ABI_SLOT_SIZE); - } - } else if ((*arg)->size <= KVX_ABI_SLOT_SIZE) { - slot_fitting_args_size += KVX_ABI_SLOT_SIZE; - } else { - printf("Error: unsupported arg size %ld arg type %d\n", (*arg)->size, (*arg)->type); - abort(); /* should never happen? */ - } - } - - extended_cif ecif; - ecif.cif = cif; - ecif.avalue = avalue; - ecif.rvalue = rvalue; - - /* This implementation allocates anyway for all register based args */ - slot_fitting_args_size = max(slot_fitting_args_size, REG_ARGS_SIZE); - total_size = slot_fitting_args_size + big_struct_size; - total_size = ALIGN(total_size, KVX_ABI_STACK_ALIGNMENT); - - /* wb_size: write back size, the size we will need to write back to user - * provided buffer. In theory it should always be cif->flags which is - * cif->rtype->size. But libffi API mandates that for integral types - * of size <= system register size, then we *MUST* write back - * the size of system register size. - * in our case, if size <= 8 bytes we must write back 8 bytes. - * floats, complex and structs are not affected, only integrals. - */ - wb_size = handle_small_int_ext(&int_extension_method, cif->rtype); - - switch (cif->abi) { - case FFI_SYSV: - DEBUG_PRINT("total_size: %lu\n", total_size); - DEBUG_PRINT("slot fitting args size: %lu\n", slot_fitting_args_size); - DEBUG_PRINT("rvalue: %p\n", rvalue); - DEBUG_PRINT("fn: %p\n", fn); - DEBUG_PRINT("rsize: %u\n", cif->flags); - DEBUG_PRINT("wb_size: %u\n", wb_size); - DEBUG_PRINT("int_extension_method: %u\n", int_extension_method); - local_rvalue = ffi_call_SYSV(total_size, slot_fitting_args_size, - &ecif, rvalue, fn, int_extension_method); - if ((cif->flags <= KVX_ABI_MAX_AGGREGATE_IN_REG_SIZE) - && (cif->rtype->type != FFI_TYPE_VOID)) - memcpy(rvalue, &local_rvalue, wb_size); - break; - default: - abort(); - break; - } -} - -/* Closures not supported yet */ -ffi_status -ffi_prep_closure_loc (ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*,void*,void**,void*), - void *user_data, - void *codeloc) -{ - return FFI_BAD_ABI; -} - -#endif /* (__kvx__) */ diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/kvx/ffitarget.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/kvx/ffitarget.h deleted file mode 100644 index 8df8735..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/kvx/ffitarget.h +++ /dev/null @@ -1,75 +0,0 @@ -/* ----------------------------------------------------------------------- - ffitarget.h - Copyright (c) 2020 Kalray - - KVX Target configuration macros - - 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. - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -/* ---- System specific configurations ----------------------------------- */ - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_SYSV, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_SYSV -} ffi_abi; - -/* Those values are set depending on return type - * they are used in the assembly code in sysv.S - */ -typedef enum kvx_intext_method { - KVX_RET_NONE = 0, - KVX_RET_SXBD = 1, - KVX_RET_SXHD = 2, - KVX_RET_SXWD = 3, - KVX_RET_ZXBD = 4, - KVX_RET_ZXHD = 5, - KVX_RET_ZXWD = 6 -} kvx_intext_method; - -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -/* This is only to allow Python to compile - * but closures are not supported yet - */ -#define FFI_CLOSURES 1 -#define FFI_TRAMPOLINE_SIZE 0 - -#define FFI_NATIVE_RAW_API 0 -#define FFI_TARGET_SPECIFIC_VARIADIC 1 -#define FFI_TARGET_HAS_COMPLEX_TYPE - -#endif - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/kvx/sysv.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/kvx/sysv.S deleted file mode 100644 index 952afc7..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/kvx/sysv.S +++ /dev/null @@ -1,127 +0,0 @@ -/* Copyright (c) 2020 Kalray - -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. */ - -#if defined(__kvx__) -#define LIBFFI_ASM -#include -#include -#include -#include - -.text -.global ffi_call_SYSV -.type ffi_call_SYSV, @function -.type ffi_prep_args, @function -.align 8 - -/* ffi_call_SYSV - - r0: total size to allocate on stack - r1: size of arg slots - r2: extended cif structure, DO NOT REMOVE: it is used by ffi_prep_args() - r3: return value address - r4: function to call - r5: integer sign extension method to be used -*/ -ffi_call_SYSV: - addd $r12 = $r12, -64 - so (-32)[$r12] = $r20r21r22r23 - ;; - sd (0)[$r12] = $r24 - ;; - get $r23 = $ra - copyd $r20 = $r12 - sbfd $r12 = $r0, $r12 - ;; - copyd $r0 = $r12 - copyd $r21 = $r3 - copyd $r22 = $r4 - copyd $r24 = $r5 - call ffi_prep_args - ;; - lo $r8r9r10r11 = (64)[$r12] - ;; - lo $r4r5r6r7 = (32)[$r12] - ;; - lo $r0r1r2r3 = (0)[$r12] - copyd $r12 = $r0 - /* $r15 is the register used by the ABI to return big (>32 bytes) - * structs by value. - * It is also referred to as the "struct register" in the ABI. - */ - copyd $r15 = $r21 - icall $r22 - ;; - pcrel $r4 = @pcrel(.Ltable) - cb.deqz $r24 ? .Lend - ;; - addx8d $r24 = $r24, $r4 - ;; - igoto $r24 - ;; -.Ltable: -0: /* we should never arrive here */ - goto .Lerror - nop - ;; -1: /* Sign extend byte to double */ - sxbd $r0 = $r0 - goto .Lend - ;; -2: /* Sign extend half to double */ - sxhd $r0 = $r0 - goto .Lend - ;; -3: /* Sign extend word to double */ - sxwd $r0 = $r0 - goto .Lend - ;; -4: /* Zero extend byte to double */ - zxbd $r0 = $r0 - goto .Lend - ;; -5: /* Zero extend half to double */ - zxhd $r0 = $r0 - goto .Lend - ;; -6: /* Zero extend word to double */ - zxwd $r0 = $r0 - /* Fallthrough to .Lend */ - ;; -.Lend: - ld $r24 = (0)[$r12] - ;; - set $ra = $r23 - lo $r20r21r22r23 = (32)[$r20] - addd $r12 = $r20, 64 - ;; - ret - ;; -.Lerror: - errop - ;; - -#endif /* __kvx__ */ - -#if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",%progbits -#endif - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/m32r/ffi.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/m32r/ffi.c deleted file mode 100644 index ab8fc4e..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/m32r/ffi.c +++ /dev/null @@ -1,232 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2004 Renesas Technology - Copyright (c) 2008 Red Hat, Inc. - - M32R Foreign Function Interface - - 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 RENESAS TECHNOLOGY 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. - ----------------------------------------------------------------------- */ - -#include -#include - -#include - -/* ffi_prep_args is called by the assembly routine once stack - space has been allocated for the function's arguments. */ - -void ffi_prep_args(char *stack, extended_cif *ecif) -{ - unsigned int i; - int tmp; - unsigned int avn; - void **p_argv; - char *argp; - ffi_type **p_arg; - - tmp = 0; - argp = stack; - - if (ecif->cif->rtype->type == FFI_TYPE_STRUCT && ecif->cif->rtype->size > 8) - { - *(void **) argp = ecif->rvalue; - argp += 4; - } - - avn = ecif->cif->nargs; - p_argv = ecif->avalue; - - for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; - (i != 0) && (avn != 0); - i--, p_arg++) - { - size_t z; - - /* Align if necessary. */ - if (((*p_arg)->alignment - 1) & (unsigned) argp) - argp = (char *) FFI_ALIGN (argp, (*p_arg)->alignment); - - if (avn != 0) - { - avn--; - z = (*p_arg)->size; - if (z < sizeof (int)) - { - z = sizeof (int); - - switch ((*p_arg)->type) - { - case FFI_TYPE_SINT8: - *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); - break; - - case FFI_TYPE_UINT8: - *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); - break; - - case FFI_TYPE_SINT16: - *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); - break; - - case FFI_TYPE_UINT16: - *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); - break; - - case FFI_TYPE_STRUCT: - z = (*p_arg)->size; - if ((*p_arg)->alignment != 1) - memcpy (argp, *p_argv, z); - else - memcpy (argp + 4 - z, *p_argv, z); - z = sizeof (int); - break; - - default: - FFI_ASSERT(0); - } - } - else if (z == sizeof (int)) - { - *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); - } - else - { - if ((*p_arg)->type == FFI_TYPE_STRUCT) - { - if (z > 8) - { - *(unsigned int *) argp = (unsigned int)(void *)(* p_argv); - z = sizeof(void *); - } - else - { - memcpy(argp, *p_argv, z); - z = 8; - } - } - else - { - /* Double or long long 64bit. */ - memcpy (argp, *p_argv, z); - } - } - p_argv++; - argp += z; - } - } - - return; -} - -/* Perform machine dependent cif processing. */ -ffi_status -ffi_prep_cif_machdep(ffi_cif *cif) -{ - /* Set the return type flag. */ - switch (cif->rtype->type) - { - case FFI_TYPE_VOID: - cif->flags = (unsigned) cif->rtype->type; - break; - - case FFI_TYPE_STRUCT: - if (cif->rtype->size <= 4) - cif->flags = FFI_TYPE_INT; - - else if (cif->rtype->size <= 8) - cif->flags = FFI_TYPE_DOUBLE; - - else - cif->flags = (unsigned) cif->rtype->type; - break; - - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - case FFI_TYPE_DOUBLE: - cif->flags = FFI_TYPE_DOUBLE; - break; - - case FFI_TYPE_FLOAT: - default: - cif->flags = FFI_TYPE_INT; - break; - } - - return FFI_OK; -} - -extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, - unsigned, unsigned, unsigned *, void (*fn)(void)); - -void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - extended_cif ecif; - - ecif.cif = cif; - ecif.avalue = avalue; - - /* If the return value is a struct and we don't have - a return value address then we need to make one. */ - if ((rvalue == NULL) && - (cif->rtype->type == FFI_TYPE_STRUCT)) - { - ecif.rvalue = alloca (cif->rtype->size); - } - else - ecif.rvalue = rvalue; - - switch (cif->abi) - { - case FFI_SYSV: - ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, - cif->flags, ecif.rvalue, fn); - if (cif->rtype->type == FFI_TYPE_STRUCT) - { - int size = cif->rtype->size; - int align = cif->rtype->alignment; - - if (size < 4) - { - if (align == 1) - *(unsigned long *)(ecif.rvalue) <<= (4 - size) * 8; - } - else if (4 < size && size < 8) - { - if (align == 1) - { - memcpy (ecif.rvalue, ecif.rvalue + 8-size, size); - } - else if (align == 2) - { - if (size & 1) - size += 1; - - if (size != 8) - memcpy (ecif.rvalue, ecif.rvalue + 8-size, size); - } - } - } - break; - - default: - FFI_ASSERT(0); - break; - } -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/m32r/ffitarget.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/m32r/ffitarget.h deleted file mode 100644 index 6c34801..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/m32r/ffitarget.h +++ /dev/null @@ -1,53 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - Copyright (c) 2004 Renesas Technology. - Target configuration macros for M32R. - - 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 RENESAS TECHNOLOGY 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. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -/* ---- Generic type definitions ----------------------------------------- */ - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi - { - FFI_FIRST_ABI = 0, - FFI_SYSV, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_SYSV - } ffi_abi; -#endif - -#define FFI_CLOSURES 0 -#define FFI_TRAMPOLINE_SIZE 24 -#define FFI_NATIVE_RAW_API 0 - -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/m32r/sysv.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/m32r/sysv.S deleted file mode 100644 index 06b75c2..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/m32r/sysv.S +++ /dev/null @@ -1,121 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.S - Copyright (c) 2004 Renesas Technology - - M32R Foreign Function Interface - - 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 RENESAS TECHNOLOGY 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. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include -#ifdef HAVE_MACHINE_ASM_H -#include -#else -/* XXX these lose for some platforms, I'm sure. */ -#define CNAME(x) x -#define ENTRY(x) .globl CNAME(x)! .type CNAME(x),%function! CNAME(x): -#endif - -.text - - /* R0: ffi_prep_args */ - /* R1: &ecif */ - /* R2: cif->bytes */ - /* R3: fig->flags */ - /* sp+0: ecif.rvalue */ - /* sp+4: fn */ - - /* This assumes we are using gas. */ -ENTRY(ffi_call_SYSV) - /* Save registers. */ - push fp - push lr - push r3 - push r2 - push r1 - push r0 - mv fp, sp - - /* Make room for all of the new args. */ - sub sp, r2 - - /* Place all of the ffi_prep_args in position. */ - mv lr, r0 - mv r0, sp - /* R1 already set. */ - - /* And call. */ - jl lr - - /* Move first 4 parameters in registers... */ - ld r0, @(0,sp) - ld r1, @(4,sp) - ld r2, @(8,sp) - ld r3, @(12,sp) - - /* ...and adjust the stack. */ - ld lr, @(8,fp) - cmpi lr, #16 - bc adjust_stack - ldi lr, #16 -adjust_stack: - add sp, lr - - /* Call the function. */ - ld lr, @(28,fp) - jl lr - - /* Remove the space we pushed for the args. */ - mv sp, fp - - /* Load R2 with the pointer to storage for the return value. */ - ld r2, @(24,sp) - - /* Load R3 with the return type code. */ - ld r3, @(12,sp) - - /* If the return value pointer is NULL, assume no return value. */ - beqz r2, epilogue - - /* Return INT. */ - ldi r4, #FFI_TYPE_INT - bne r3, r4, return_double - st r0, @r2 - bra epilogue - -return_double: - /* Return DOUBLE or LONGDOUBLE. */ - ldi r4, #FFI_TYPE_DOUBLE - bne r3, r4, epilogue - st r0, @r2 - st r1, @(4,r2) - -epilogue: - pop r0 - pop r1 - pop r2 - pop r3 - pop lr - pop fp - jmp lr - -.ffi_call_SYSV_end: - .size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV) diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/m68k/ffi.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/m68k/ffi.c deleted file mode 100644 index 0330184..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/m68k/ffi.c +++ /dev/null @@ -1,362 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - - m68k Foreign Function Interface - ----------------------------------------------------------------------- */ - -#include -#include - -#include -#include -#ifdef __rtems__ -void rtems_cache_flush_multiple_data_lines( const void *, size_t ); -#else -#include -#ifdef __MINT__ -#include -#include -#else -#include -#endif -#endif - -void ffi_call_SYSV (extended_cif *, - unsigned, unsigned, - void *, void (*fn) ()); -void *ffi_prep_args (void *stack, extended_cif *ecif); -void ffi_closure_SYSV (ffi_closure *); -void ffi_closure_struct_SYSV (ffi_closure *); -unsigned int ffi_closure_SYSV_inner (ffi_closure *closure, - void *resp, void *args); - -/* ffi_prep_args is called by the assembly routine once stack space has - been allocated for the function's arguments. */ - -void * -ffi_prep_args (void *stack, extended_cif *ecif) -{ - unsigned int i; - void **p_argv; - char *argp; - ffi_type **p_arg; - void *struct_value_ptr; - - argp = stack; - - if ( -#ifdef __MINT__ - (ecif->cif->rtype->type == FFI_TYPE_LONGDOUBLE) || -#endif - (((ecif->cif->rtype->type == FFI_TYPE_STRUCT) - && !ecif->cif->flags))) - struct_value_ptr = ecif->rvalue; - else - struct_value_ptr = NULL; - - p_argv = ecif->avalue; - - for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; - i != 0; - i--, p_arg++) - { - size_t z = (*p_arg)->size; - int type = (*p_arg)->type; - - if (z < sizeof (int)) - { - switch (type) - { - case FFI_TYPE_SINT8: - *(signed int *) argp = (signed int) *(SINT8 *) *p_argv; - break; - - case FFI_TYPE_UINT8: - *(unsigned int *) argp = (unsigned int) *(UINT8 *) *p_argv; - break; - - case FFI_TYPE_SINT16: - *(signed int *) argp = (signed int) *(SINT16 *) *p_argv; - break; - - case FFI_TYPE_UINT16: - *(unsigned int *) argp = (unsigned int) *(UINT16 *) *p_argv; - break; - - case FFI_TYPE_STRUCT: -#ifdef __MINT__ - if (z == 1 || z == 2) - memcpy (argp + 2, *p_argv, z); - else - memcpy (argp, *p_argv, z); -#else - memcpy (argp + sizeof (int) - z, *p_argv, z); -#endif - break; - - default: - FFI_ASSERT (0); - } - z = sizeof (int); - } - else - { - memcpy (argp, *p_argv, z); - - /* Align if necessary. */ - if ((sizeof(int) - 1) & z) - z = FFI_ALIGN(z, sizeof(int)); - } - - p_argv++; - argp += z; - } - - return struct_value_ptr; -} - -#define CIF_FLAGS_INT 1 -#define CIF_FLAGS_DINT 2 -#define CIF_FLAGS_FLOAT 4 -#define CIF_FLAGS_DOUBLE 8 -#define CIF_FLAGS_LDOUBLE 16 -#define CIF_FLAGS_POINTER 32 -#define CIF_FLAGS_STRUCT1 64 -#define CIF_FLAGS_STRUCT2 128 -#define CIF_FLAGS_SINT8 256 -#define CIF_FLAGS_SINT16 512 - -/* Perform machine dependent cif processing */ -ffi_status -ffi_prep_cif_machdep (ffi_cif *cif) -{ - /* Set the return type flag */ - switch (cif->rtype->type) - { - case FFI_TYPE_VOID: - cif->flags = 0; - break; - - case FFI_TYPE_STRUCT: - if (cif->rtype->elements[0]->type == FFI_TYPE_STRUCT && - cif->rtype->elements[1]) - { - cif->flags = 0; - break; - } - - switch (cif->rtype->size) - { - case 1: -#ifdef __MINT__ - cif->flags = CIF_FLAGS_STRUCT2; -#else - cif->flags = CIF_FLAGS_STRUCT1; -#endif - break; - case 2: - cif->flags = CIF_FLAGS_STRUCT2; - break; -#ifdef __MINT__ - case 3: -#endif - case 4: - cif->flags = CIF_FLAGS_INT; - break; -#ifdef __MINT__ - case 7: -#endif - case 8: - cif->flags = CIF_FLAGS_DINT; - break; - default: - cif->flags = 0; - break; - } - break; - - case FFI_TYPE_FLOAT: - cif->flags = CIF_FLAGS_FLOAT; - break; - - case FFI_TYPE_DOUBLE: - cif->flags = CIF_FLAGS_DOUBLE; - break; - -#if (FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE) - case FFI_TYPE_LONGDOUBLE: -#ifdef __MINT__ - cif->flags = 0; -#else - cif->flags = CIF_FLAGS_LDOUBLE; -#endif - break; -#endif - - case FFI_TYPE_POINTER: - cif->flags = CIF_FLAGS_POINTER; - break; - - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - cif->flags = CIF_FLAGS_DINT; - break; - - case FFI_TYPE_SINT16: - cif->flags = CIF_FLAGS_SINT16; - break; - - case FFI_TYPE_SINT8: - cif->flags = CIF_FLAGS_SINT8; - break; - - default: - cif->flags = CIF_FLAGS_INT; - break; - } - - return FFI_OK; -} - -void -ffi_call (ffi_cif *cif, void (*fn) (), void *rvalue, void **avalue) -{ - extended_cif ecif; - - ecif.cif = cif; - ecif.avalue = avalue; - - /* If the return value is a struct and we don't have a return value - address then we need to make one. */ - - if (rvalue == NULL - && cif->rtype->type == FFI_TYPE_STRUCT - && cif->rtype->size > 8) - ecif.rvalue = alloca (cif->rtype->size); - else - ecif.rvalue = rvalue; - - switch (cif->abi) - { - case FFI_SYSV: - ffi_call_SYSV (&ecif, cif->bytes, cif->flags, - ecif.rvalue, fn); - break; - - default: - FFI_ASSERT (0); - break; - } -} - -static void -ffi_prep_incoming_args_SYSV (char *stack, void **avalue, ffi_cif *cif) -{ - unsigned int i; - void **p_argv; - char *argp; - ffi_type **p_arg; - - argp = stack; - p_argv = avalue; - - for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) - { - size_t z; - - z = (*p_arg)->size; -#ifdef __MINT__ - if (cif->flags && - cif->rtype->type == FFI_TYPE_STRUCT && - (z == 1 || z == 2)) - { - *p_argv = (void *) (argp + 2); - - z = 4; - } - else - if (cif->flags && - cif->rtype->type == FFI_TYPE_STRUCT && - (z == 3 || z == 4)) - { - *p_argv = (void *) (argp); - - z = 4; - } - else -#endif - if (z <= 4) - { - *p_argv = (void *) (argp + 4 - z); - - z = 4; - } - else - { - *p_argv = (void *) argp; - - /* Align if necessary */ - if ((sizeof(int) - 1) & z) - z = FFI_ALIGN(z, sizeof(int)); - } - - p_argv++; - argp += z; - } -} - -unsigned int -ffi_closure_SYSV_inner (ffi_closure *closure, void *resp, void *args) -{ - ffi_cif *cif; - void **arg_area; - - cif = closure->cif; - arg_area = (void**) alloca (cif->nargs * sizeof (void *)); - - ffi_prep_incoming_args_SYSV(args, arg_area, cif); - - (closure->fun) (cif, resp, arg_area, closure->user_data); - - return cif->flags; -} - -ffi_status -ffi_prep_closure_loc (ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*,void*,void**,void*), - void *user_data, - void *codeloc) -{ - if (cif->abi != FFI_SYSV) - return FFI_BAD_ABI; - - *(unsigned short *)closure->tramp = 0x207c; - *(void **)(closure->tramp + 2) = codeloc; - *(unsigned short *)(closure->tramp + 6) = 0x4ef9; - - if ( -#ifdef __MINT__ - (cif->rtype->type == FFI_TYPE_LONGDOUBLE) || -#endif - (((cif->rtype->type == FFI_TYPE_STRUCT) - && !cif->flags))) - *(void **)(closure->tramp + 8) = ffi_closure_struct_SYSV; - else - *(void **)(closure->tramp + 8) = ffi_closure_SYSV; - -#ifdef __rtems__ - rtems_cache_flush_multiple_data_lines( codeloc, FFI_TRAMPOLINE_SIZE ); -#elif defined(__MINT__) - Ssystem(S_FLUSHCACHE, codeloc, FFI_TRAMPOLINE_SIZE); -#else - syscall(SYS_cacheflush, codeloc, FLUSH_SCOPE_LINE, - FLUSH_CACHE_BOTH, FFI_TRAMPOLINE_SIZE); -#endif - - closure->cif = cif; - closure->user_data = user_data; - closure->fun = fun; - - return FFI_OK; -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/m68k/ffitarget.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/m68k/ffitarget.h deleted file mode 100644 index e81dde2..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/m68k/ffitarget.h +++ /dev/null @@ -1,54 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - Copyright (c) 1996-2003 Red Hat, Inc. - Target configuration macros for Motorola 68K. - - 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. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_SYSV, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_SYSV -} ffi_abi; -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_TRAMPOLINE_SIZE 16 -#define FFI_NATIVE_RAW_API 0 - -#endif - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/m68k/sysv.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/m68k/sysv.S deleted file mode 100644 index ea40f11..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/m68k/sysv.S +++ /dev/null @@ -1,357 +0,0 @@ -/* ----------------------------------------------------------------------- - - sysv.S - Copyright (c) 2012 Alan Hourihane - Copyright (c) 1998, 2012 Andreas Schwab - Copyright (c) 2008 Red Hat, Inc. - Copyright (c) 2012, 2016 Thorsten Glaser - - m68k Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include - -#ifdef HAVE_AS_CFI_PSEUDO_OP -#define CFI_STARTPROC() .cfi_startproc -#define CFI_OFFSET(reg,off) .cfi_offset reg,off -#define CFI_DEF_CFA(reg,off) .cfi_def_cfa reg,off -#define CFI_ENDPROC() .cfi_endproc -#else -#define CFI_STARTPROC() -#define CFI_OFFSET(reg,off) -#define CFI_DEF_CFA(reg,off) -#define CFI_ENDPROC() -#endif - -#ifdef __MINT__ -#define CALLFUNC(funcname) _ ## funcname -#else -#define CALLFUNC(funcname) funcname -#endif - - .text - - .globl CALLFUNC(ffi_call_SYSV) - .type CALLFUNC(ffi_call_SYSV),@function - .align 4 - -CALLFUNC(ffi_call_SYSV): - CFI_STARTPROC() - link %fp,#0 - CFI_OFFSET(14,-8) - CFI_DEF_CFA(14,8) - move.l %d2,-(%sp) - CFI_OFFSET(2,-12) - - | Make room for all of the new args. - sub.l 12(%fp),%sp - - | Call ffi_prep_args - move.l 8(%fp),-(%sp) - pea 4(%sp) -#if !defined __PIC__ - jsr CALLFUNC(ffi_prep_args) -#elif defined(__uClinux__) && defined(__ID_SHARED_LIBRARY__) - move.l _current_shared_library_a5_offset_(%a5),%a0 - move.l CALLFUNC(ffi_prep_args@GOT)(%a0),%a0 - jsr (%a0) -#elif defined(__mcoldfire__) && !defined(__mcfisab__) && !defined(__mcfisac__) - move.l #_GLOBAL_OFFSET_TABLE_@GOTPC,%a0 - lea (-6,%pc,%a0),%a0 - move.l CALLFUNC(ffi_prep_args@GOT)(%a0),%a0 - jsr (%a0) -#else - bsr.l CALLFUNC(ffi_prep_args@PLTPC) -#endif - addq.l #8,%sp - - | Pass pointer to struct value, if any -#ifdef __MINT__ - move.l %d0,%a1 -#else - move.l %a0,%a1 -#endif - - | Call the function - move.l 24(%fp),%a0 - jsr (%a0) - - | Remove the space we pushed for the args - add.l 12(%fp),%sp - - | Load the pointer to storage for the return value - move.l 20(%fp),%a1 - - | Load the return type code - move.l 16(%fp),%d2 - - | If the return value pointer is NULL, assume no return value. - | NOTE: On the mc68000, tst on an address register is not supported. -#if !defined(__mc68020__) && !defined(__mc68030__) && !defined(__mc68040__) && !defined(__mc68060__) && !defined(__mcoldfire__) - cmp.w #0, %a1 -#else - tst.l %a1 -#endif - jbeq noretval - - btst #0,%d2 - jbeq retlongint - move.l %d0,(%a1) - jbra epilogue - -retlongint: - btst #1,%d2 - jbeq retfloat - move.l %d0,(%a1) - move.l %d1,4(%a1) - jbra epilogue - -retfloat: - btst #2,%d2 - jbeq retdouble -#if defined(__MC68881__) || defined(__HAVE_68881__) - fmove.s %fp0,(%a1) -#else - move.l %d0,(%a1) -#endif - jbra epilogue - -retdouble: - btst #3,%d2 - jbeq retlongdouble -#if defined(__MC68881__) || defined(__HAVE_68881__) - fmove.d %fp0,(%a1) -#else - move.l %d0,(%a1)+ - move.l %d1,(%a1) -#endif - jbra epilogue - -retlongdouble: - btst #4,%d2 - jbeq retpointer -#if defined(__MC68881__) || defined(__HAVE_68881__) - fmove.x %fp0,(%a1) -#else - move.l %d0,(%a1)+ - move.l %d1,(%a1)+ - move.l %d2,(%a1) -#endif - jbra epilogue - -retpointer: - btst #5,%d2 - jbeq retstruct1 -#ifdef __MINT__ - move.l %d0,(%a1) -#else - move.l %a0,(%a1) -#endif - jbra epilogue - -retstruct1: - btst #6,%d2 - jbeq retstruct2 - move.b %d0,(%a1) - jbra epilogue - -retstruct2: - btst #7,%d2 - jbeq retsint8 - move.w %d0,(%a1) - jbra epilogue - -retsint8: - btst #8,%d2 - jbeq retsint16 - | NOTE: On the mc68000, extb is not supported. 8->16, then 16->32. -#if !defined(__mc68020__) && !defined(__mc68030__) && !defined(__mc68040__) && !defined(__mc68060__) && !defined(__mcoldfire__) - ext.w %d0 - ext.l %d0 -#else - extb.l %d0 -#endif - move.l %d0,(%a1) - jbra epilogue - -retsint16: - btst #9,%d2 - jbeq noretval - ext.l %d0 - move.l %d0,(%a1) - -noretval: -epilogue: - move.l (%sp)+,%d2 - unlk %fp - rts - CFI_ENDPROC() - .size CALLFUNC(ffi_call_SYSV),.-CALLFUNC(ffi_call_SYSV) - - .globl CALLFUNC(ffi_closure_SYSV) - .type CALLFUNC(ffi_closure_SYSV), @function - .align 4 - -CALLFUNC(ffi_closure_SYSV): - CFI_STARTPROC() - link %fp,#-12 - CFI_OFFSET(14,-8) - CFI_DEF_CFA(14,8) - move.l %sp,-12(%fp) - pea 8(%fp) - pea -12(%fp) - move.l %a0,-(%sp) -#if !defined __PIC__ - jsr CALLFUNC(ffi_closure_SYSV_inner) -#elif defined(__uClinux__) && defined(__ID_SHARED_LIBRARY__) - move.l _current_shared_library_a5_offset_(%a5),%a0 - move.l CALLFUNC(ffi_closure_SYSV_inner@GOT)(%a0),%a0 - jsr (%a0) -#elif defined(__mcoldfire__) && !defined(__mcfisab__) && !defined(__mcfisac__) - move.l #_GLOBAL_OFFSET_TABLE_@GOTPC,%a0 - lea (-6,%pc,%a0),%a0 - move.l CALLFUNC(ffi_closure_SYSV_inner@GOT)(%a0),%a0 - jsr (%a0) -#else - bsr.l CALLFUNC(ffi_closure_SYSV_inner@PLTPC) -#endif - - lsr.l #1,%d0 - jne 1f - jcc .Lcls_epilogue - | CIF_FLAGS_INT - move.l -12(%fp),%d0 -.Lcls_epilogue: - | no CIF_FLAGS_* - unlk %fp - rts -1: - lea -12(%fp),%a0 - lsr.l #2,%d0 - jne 1f - jcs .Lcls_ret_float - | CIF_FLAGS_DINT - move.l (%a0)+,%d0 - move.l (%a0),%d1 - jra .Lcls_epilogue -.Lcls_ret_float: -#if defined(__MC68881__) || defined(__HAVE_68881__) - fmove.s (%a0),%fp0 -#else - move.l (%a0),%d0 -#endif - jra .Lcls_epilogue -1: - lsr.l #2,%d0 - jne 1f - jcs .Lcls_ret_ldouble - | CIF_FLAGS_DOUBLE -#if defined(__MC68881__) || defined(__HAVE_68881__) - fmove.d (%a0),%fp0 -#else - move.l (%a0)+,%d0 - move.l (%a0),%d1 -#endif - jra .Lcls_epilogue -.Lcls_ret_ldouble: -#if defined(__MC68881__) || defined(__HAVE_68881__) - fmove.x (%a0),%fp0 -#else - move.l (%a0)+,%d0 - move.l (%a0)+,%d1 - move.l (%a0),%d2 -#endif - jra .Lcls_epilogue -1: - lsr.l #2,%d0 - jne 1f - jcs .Lcls_ret_struct1 - | CIF_FLAGS_POINTER - move.l (%a0),%a0 - move.l %a0,%d0 - jra .Lcls_epilogue -.Lcls_ret_struct1: - move.b (%a0),%d0 - jra .Lcls_epilogue -1: - lsr.l #2,%d0 - jne 1f - jcs .Lcls_ret_sint8 - | CIF_FLAGS_STRUCT2 - move.w (%a0),%d0 - jra .Lcls_epilogue -.Lcls_ret_sint8: - move.l (%a0),%d0 - | NOTE: On the mc68000, extb is not supported. 8->16, then 16->32. -#if !defined(__mc68020__) && !defined(__mc68030__) && !defined(__mc68040__) && !defined(__mc68060__) && !defined(__mcoldfire__) - ext.w %d0 - ext.l %d0 -#else - extb.l %d0 -#endif - jra .Lcls_epilogue -1: - | CIF_FLAGS_SINT16 - move.l (%a0),%d0 - ext.l %d0 - jra .Lcls_epilogue - CFI_ENDPROC() - - .size CALLFUNC(ffi_closure_SYSV),.-CALLFUNC(ffi_closure_SYSV) - - .globl CALLFUNC(ffi_closure_struct_SYSV) - .type CALLFUNC(ffi_closure_struct_SYSV), @function - .align 4 - -CALLFUNC(ffi_closure_struct_SYSV): - CFI_STARTPROC() - link %fp,#0 - CFI_OFFSET(14,-8) - CFI_DEF_CFA(14,8) - move.l %sp,-12(%fp) - pea 8(%fp) - move.l %a1,-(%sp) - move.l %a0,-(%sp) -#if !defined __PIC__ - jsr CALLFUNC(ffi_closure_SYSV_inner) -#elif defined(__uClinux__) && defined(__ID_SHARED_LIBRARY__) - move.l _current_shared_library_a5_offset_(%a5),%a0 - move.l CALLFUNC(ffi_closure_SYSV_inner@GOT)(%a0),%a0 - jsr (%a0) -#elif defined(__mcoldfire__) && !defined(__mcfisab__) && !defined(__mcfisac__) - move.l #_GLOBAL_OFFSET_TABLE_@GOTPC,%a0 - lea (-6,%pc,%a0),%a0 - move.l CALLFUNC(ffi_closure_SYSV_inner@GOT)(%a0),%a0 - jsr (%a0) -#else - bsr.l CALLFUNC(ffi_closure_SYSV_inner@PLTPC) -#endif - unlk %fp - rts - CFI_ENDPROC() - .size CALLFUNC(ffi_closure_struct_SYSV),.-CALLFUNC(ffi_closure_struct_SYSV) - -#if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",@progbits -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/m88k/ffi.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/m88k/ffi.c deleted file mode 100644 index 57b344f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/m88k/ffi.c +++ /dev/null @@ -1,400 +0,0 @@ -/* - * Copyright (c) 2013 Miodrag Vallat. - * - * 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. - */ - -/* - * m88k Foreign Function Interface - * - * This file attempts to provide all the FFI entry points which can reliably - * be implemented in C. - * - * Only OpenBSD/m88k is currently supported; other platforms (such as - * Motorola's SysV/m88k) could be supported with the following tweaks: - * - * - non-OpenBSD systems use an `outgoing parameter area' as part of the - * 88BCS calling convention, which is not supported under OpenBSD from - * release 3.6 onwards. Supporting it should be as easy as taking it - * into account when adjusting the stack, in the assembly code. - * - * - the logic deciding whether a function argument gets passed through - * registers, or on the stack, has changed several times in OpenBSD in - * edge cases (especially for structs larger than 32 bytes being passed - * by value). The code below attemps to match the logic used by the - * system compiler of OpenBSD 5.3, i.e. gcc 3.3.6 with many m88k backend - * fixes. - */ - -#include -#include - -#include -#include - -void ffi_call_OBSD (unsigned int, extended_cif *, unsigned int, void *, - void (*fn) ()); -void *ffi_prep_args (void *, extended_cif *); -void ffi_closure_OBSD (ffi_closure *); -void ffi_closure_struct_OBSD (ffi_closure *); -unsigned int ffi_closure_OBSD_inner (ffi_closure *, void *, unsigned int *, - char *); -void ffi_cacheflush_OBSD (unsigned int, unsigned int); - -#define CIF_FLAGS_INT (1 << 0) -#define CIF_FLAGS_DINT (1 << 1) - -/* - * Foreign Function Interface API - */ - -/* ffi_prep_args is called by the assembly routine once stack space has - been allocated for the function's arguments. */ - -void * -ffi_prep_args (void *stack, extended_cif *ecif) -{ - unsigned int i; - void **p_argv; - char *argp, *stackp; - unsigned int *regp; - unsigned int regused; - ffi_type **p_arg; - void *struct_value_ptr; - - regp = (unsigned int *)stack; - stackp = (char *)(regp + 8); - regused = 0; - - if (ecif->cif->rtype->type == FFI_TYPE_STRUCT - && !ecif->cif->flags) - struct_value_ptr = ecif->rvalue; - else - struct_value_ptr = NULL; - - p_argv = ecif->avalue; - - for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; i != 0; i--, p_arg++) - { - size_t z; - unsigned short t, a; - - z = (*p_arg)->size; - t = (*p_arg)->type; - a = (*p_arg)->alignment; - - /* - * Figure out whether the argument can be passed through registers - * or on the stack. - * The rule is that registers can only receive simple types not larger - * than 64 bits, or structs the exact size of a register and aligned to - * the size of a register. - */ - if (t == FFI_TYPE_STRUCT) - { - if (z == sizeof (int) && a == sizeof (int) && regused < 8) - argp = (char *)regp; - else - argp = stackp; - } - else - { - if (z > sizeof (int) && regused < 8 - 1) - { - /* align to an even register pair */ - if (regused & 1) - { - regp++; - regused++; - } - } - if (regused < 8) - argp = (char *)regp; - else - argp = stackp; - } - - /* Enforce proper stack alignment of 64-bit types */ - if (argp == stackp && a > sizeof (int)) - { - stackp = (char *) FFI_ALIGN(stackp, a); - argp = stackp; - } - - switch (t) - { - case FFI_TYPE_SINT8: - *(signed int *) argp = (signed int) *(SINT8 *) *p_argv; - break; - - case FFI_TYPE_UINT8: - *(unsigned int *) argp = (unsigned int) *(UINT8 *) *p_argv; - break; - - case FFI_TYPE_SINT16: - *(signed int *) argp = (signed int) *(SINT16 *) *p_argv; - break; - - case FFI_TYPE_UINT16: - *(unsigned int *) argp = (unsigned int) *(UINT16 *) *p_argv; - break; - - case FFI_TYPE_INT: - case FFI_TYPE_FLOAT: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - case FFI_TYPE_POINTER: - *(unsigned int *) argp = *(unsigned int *) *p_argv; - break; - - case FFI_TYPE_DOUBLE: - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - case FFI_TYPE_STRUCT: - memcpy (argp, *p_argv, z); - break; - - default: - FFI_ASSERT (0); - } - - /* Align if necessary. */ - if ((sizeof (int) - 1) & z) - z = FFI_ALIGN(z, sizeof (int)); - - p_argv++; - - /* Be careful, once all registers are filled, and about to continue - on stack, regp == stackp. Therefore the check for regused as well. */ - if (argp == (char *)regp && regused < 8) - { - regp += z / sizeof (int); - regused += z / sizeof (int); - } - else - stackp += z; - } - - return struct_value_ptr; -} - -/* Perform machine dependent cif processing */ -ffi_status -ffi_prep_cif_machdep (ffi_cif *cif) -{ - /* Set the return type flag */ - switch (cif->rtype->type) - { - case FFI_TYPE_VOID: - cif->flags = 0; - break; - - case FFI_TYPE_STRUCT: - if (cif->rtype->size == sizeof (int) && - cif->rtype->alignment == sizeof (int)) - cif->flags = CIF_FLAGS_INT; - else - cif->flags = 0; - break; - - case FFI_TYPE_DOUBLE: - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - cif->flags = CIF_FLAGS_DINT; - break; - - default: - cif->flags = CIF_FLAGS_INT; - break; - } - - return FFI_OK; -} - -void -ffi_call (ffi_cif *cif, void (*fn) (), void *rvalue, void **avalue) -{ - extended_cif ecif; - - ecif.cif = cif; - ecif.avalue = avalue; - - /* If the return value is a struct and we don't have a return value - address then we need to make one. */ - - if (rvalue == NULL - && cif->rtype->type == FFI_TYPE_STRUCT - && (cif->rtype->size != sizeof (int) - || cif->rtype->alignment != sizeof (int))) - ecif.rvalue = alloca (cif->rtype->size); - else - ecif.rvalue = rvalue; - - switch (cif->abi) - { - case FFI_OBSD: - ffi_call_OBSD (cif->bytes, &ecif, cif->flags, ecif.rvalue, fn); - break; - - default: - FFI_ASSERT (0); - break; - } -} - -/* - * Closure API - */ - -static void -ffi_prep_closure_args_OBSD (ffi_cif *cif, void **avalue, unsigned int *regp, - char *stackp) -{ - unsigned int i; - void **p_argv; - char *argp; - unsigned int regused; - ffi_type **p_arg; - - regused = 0; - - p_argv = avalue; - - for (i = cif->nargs, p_arg = cif->arg_types; i != 0; i--, p_arg++) - { - size_t z; - unsigned short t, a; - - z = (*p_arg)->size; - t = (*p_arg)->type; - a = (*p_arg)->alignment; - - /* - * Figure out whether the argument has been passed through registers - * or on the stack. - * The rule is that registers can only receive simple types not larger - * than 64 bits, or structs the exact size of a register and aligned to - * the size of a register. - */ - if (t == FFI_TYPE_STRUCT) - { - if (z == sizeof (int) && a == sizeof (int) && regused < 8) - argp = (char *)regp; - else - argp = stackp; - } - else - { - if (z > sizeof (int) && regused < 8 - 1) - { - /* align to an even register pair */ - if (regused & 1) - { - regp++; - regused++; - } - } - if (regused < 8) - argp = (char *)regp; - else - argp = stackp; - } - - /* Enforce proper stack alignment of 64-bit types */ - if (argp == stackp && a > sizeof (int)) - { - stackp = (char *) FFI_ALIGN(stackp, a); - argp = stackp; - } - - if (z < sizeof (int) && t != FFI_TYPE_STRUCT) - *p_argv = (void *) (argp + sizeof (int) - z); - else - *p_argv = (void *) argp; - - /* Align if necessary */ - if ((sizeof (int) - 1) & z) - z = FFI_ALIGN(z, sizeof (int)); - - p_argv++; - - /* Be careful, once all registers are exhausted, and about to fetch from - stack, regp == stackp. Therefore the check for regused as well. */ - if (argp == (char *)regp && regused < 8) - { - regp += z / sizeof (int); - regused += z / sizeof (int); - } - else - stackp += z; - } -} - -unsigned int -ffi_closure_OBSD_inner (ffi_closure *closure, void *resp, unsigned int *regp, - char *stackp) -{ - ffi_cif *cif; - void **arg_area; - - cif = closure->cif; - arg_area = (void**) alloca (cif->nargs * sizeof (void *)); - - ffi_prep_closure_args_OBSD(cif, arg_area, regp, stackp); - - (closure->fun) (cif, resp, arg_area, closure->user_data); - - return cif->flags; -} - -ffi_status -ffi_prep_closure_loc (ffi_closure* closure, ffi_cif* cif, - void (*fun)(ffi_cif*,void*,void**,void*), - void *user_data, void *codeloc) -{ - unsigned int *tramp = (unsigned int *) codeloc; - void *fn; - - FFI_ASSERT (cif->abi == FFI_OBSD); - - if (cif->rtype->type == FFI_TYPE_STRUCT && !cif->flags) - fn = &ffi_closure_struct_OBSD; - else - fn = &ffi_closure_OBSD; - - /* or.u %r10, %r0, %hi16(fn) */ - tramp[0] = 0x5d400000 | (((unsigned int)fn) >> 16); - /* or.u %r13, %r0, %hi16(closure) */ - tramp[1] = 0x5da00000 | ((unsigned int)closure >> 16); - /* or %r10, %r10, %lo16(fn) */ - tramp[2] = 0x594a0000 | (((unsigned int)fn) & 0xffff); - /* jmp.n %r10 */ - tramp[3] = 0xf400c40a; - /* or %r13, %r13, %lo16(closure) */ - tramp[4] = 0x59ad0000 | ((unsigned int)closure & 0xffff); - - ffi_cacheflush_OBSD((unsigned int)codeloc, FFI_TRAMPOLINE_SIZE); - - closure->cif = cif; - closure->user_data = user_data; - closure->fun = fun; - - return FFI_OK; -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/m88k/ffitarget.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/m88k/ffitarget.h deleted file mode 100644 index e52bf9f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/m88k/ffitarget.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 2013 Miodrag Vallat. - * - * 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. - */ - -/* - * m88k Foreign Function Interface - */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_OBSD, - FFI_DEFAULT_ABI = FFI_OBSD, - FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 -} ffi_abi; -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_TRAMPOLINE_SIZE 0x14 -#define FFI_NATIVE_RAW_API 0 - -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/m88k/obsd.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/m88k/obsd.S deleted file mode 100644 index 1944a23..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/m88k/obsd.S +++ /dev/null @@ -1,209 +0,0 @@ -/* - * Copyright (c) 2013 Miodrag Vallat. - * - * 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. - */ - -/* - * m88k Foreign Function Interface - */ - -#define LIBFFI_ASM -#include -#include - - .text - -/* - * ffi_cacheflush_OBSD(unsigned int addr, %r2 - * unsigned int size); %r3 - */ - .align 4 - .globl ffi_cacheflush_OBSD - .type ffi_cacheflush_OBSD,@function -ffi_cacheflush_OBSD: - tb0 0, %r0, 451 - or %r0, %r0, %r0 - jmp %r1 - .size ffi_cacheflush_OBSD, . - ffi_cacheflush_OBSD - -/* - * ffi_call_OBSD(unsigned bytes, %r2 - * extended_cif *ecif, %r3 - * unsigned flags, %r4 - * void *rvalue, %r5 - * void (*fn)()); %r6 - */ - .align 4 - .globl ffi_call_OBSD - .type ffi_call_OBSD,@function -ffi_call_OBSD: - subu %r31, %r31, 32 - st %r30, %r31, 4 - st %r1, %r31, 0 - addu %r30, %r31, 32 - - | Save the few arguments we'll need after ffi_prep_args() - st.d %r4, %r31, 8 - st %r6, %r31, 16 - - | Allocate room for the image of r2-r9, and the stack space for - | the args (rounded to a 16-byte boundary) - addu %r2, %r2, (8 * 4) + 15 - clr %r2, %r2, 4<0> - subu %r31, %r31, %r2 - - | Fill register and stack image - or %r2, %r31, %r0 -#ifdef PIC - bsr ffi_prep_args#plt -#else - bsr ffi_prep_args -#endif - - | Save pointer to return struct address, if any - or %r12, %r2, %r0 - - | Get function pointer - subu %r4, %r30, 32 - ld %r1, %r4, 16 - - | Fetch the register arguments - ld.d %r2, %r31, (0 * 4) - ld.d %r4, %r31, (2 * 4) - ld.d %r6, %r31, (4 * 4) - ld.d %r8, %r31, (6 * 4) - addu %r31, %r31, (8 * 4) - - | Invoke the function - jsr %r1 - - | Restore stack now that we don't need the args anymore - subu %r31, %r30, 32 - - | Figure out what to return as the function's return value - ld %r5, %r31, 12 | rvalue - ld %r4, %r31, 8 | flags - - bcnd eq0, %r5, 9f - - bb0 0, %r4, 1f | CIF_FLAGS_INT - st %r2, %r5, 0 - br 9f - -1: - bb0 1, %r4, 1f | CIF_FLAGS_DINT - st.d %r2, %r5, 0 - br 9f - -1: -9: - ld %r1, %r31, 0 - ld %r30, %r31, 4 - jmp.n %r1 - addu %r31, %r31, 32 - .size ffi_call_OBSD, . - ffi_call_OBSD - -/* - * ffi_closure_OBSD(ffi_closure *closure); %r13 - */ - .align 4 - .globl ffi_closure_OBSD - .type ffi_closure_OBSD, @function -ffi_closure_OBSD: - subu %r31, %r31, 16 - st %r30, %r31, 4 - st %r1, %r31, 0 - addu %r30, %r31, 16 - - | Make room on the stack for saved register arguments and return - | value - subu %r31, %r31, (8 * 4) + (2 * 4) - st.d %r2, %r31, (0 * 4) - st.d %r4, %r31, (2 * 4) - st.d %r6, %r31, (4 * 4) - st.d %r8, %r31, (6 * 4) - - | Invoke the closure function - or %r5, %r30, 0 | calling stack - addu %r4, %r31, 0 | saved registers - addu %r3, %r31, (8 * 4) | return value - or %r2, %r13, %r0 | closure -#ifdef PIC - bsr ffi_closure_OBSD_inner#plt -#else - bsr ffi_closure_OBSD_inner -#endif - - | Figure out what to return as the function's return value - bb0 0, %r2, 1f | CIF_FLAGS_INT - ld %r2, %r31, (8 * 4) - br 9f - -1: - bb0 1, %r2, 1f | CIF_FLAGS_DINT - ld.d %r2, %r31, (8 * 4) - br 9f - -1: -9: - subu %r31, %r30, 16 - ld %r1, %r31, 0 - ld %r30, %r31, 4 - jmp.n %r1 - addu %r31, %r31, 16 - .size ffi_closure_OBSD,.-ffi_closure_OBSD - -/* - * ffi_closure_struct_OBSD(ffi_closure *closure); %r13 - */ - .align 4 - .globl ffi_closure_struct_OBSD - .type ffi_closure_struct_OBSD, @function -ffi_closure_struct_OBSD: - subu %r31, %r31, 16 - st %r30, %r31, 4 - st %r1, %r31, 0 - addu %r30, %r31, 16 - - | Make room on the stack for saved register arguments - subu %r31, %r31, (8 * 4) - st.d %r2, %r31, (0 * 4) - st.d %r4, %r31, (2 * 4) - st.d %r6, %r31, (4 * 4) - st.d %r8, %r31, (6 * 4) - - | Invoke the closure function - or %r5, %r30, 0 | calling stack - addu %r4, %r31, 0 | saved registers - or %r3, %r12, 0 | return value - or %r2, %r13, %r0 | closure -#ifdef PIC - bsr ffi_closure_OBSD_inner#plt -#else - bsr ffi_closure_OBSD_inner -#endif - - subu %r31, %r30, 16 - ld %r1, %r31, 0 - ld %r30, %r31, 4 - jmp.n %r1 - addu %r31, %r31, 16 - .size ffi_closure_struct_OBSD,.-ffi_closure_struct_OBSD diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/metag/ffi.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/metag/ffi.c deleted file mode 100644 index 3aecb0b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/metag/ffi.c +++ /dev/null @@ -1,330 +0,0 @@ -/* ---------------------------------------------------------------------- - ffi.c - Copyright (c) 2013 Imagination Technologies - - Meta Foreign Function Interface - 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 SIMON POSNJAK 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. ------------------------------------------------------------------------ */ - -#include -#include - -#include - -#define MIN(a,b) (((a) < (b)) ? (a) : (b)) - -/* - * ffi_prep_args is called by the assembly routine once stack space has been - * allocated for the function's arguments - */ - -unsigned int ffi_prep_args(char *stack, extended_cif *ecif) -{ - register unsigned int i; - register void **p_argv; - register char *argp; - register ffi_type **p_arg; - - argp = stack; - - /* Store return value */ - if ( ecif->cif->flags == FFI_TYPE_STRUCT ) { - argp -= 4; - *(void **) argp = ecif->rvalue; - } - - p_argv = ecif->avalue; - - /* point to next location */ - for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; (i != 0); i--, p_arg++, p_argv++) - { - size_t z; - - /* Move argp to address of argument */ - z = (*p_arg)->size; - argp -= z; - - /* Align if necessary */ - argp = (char *) FFI_ALIGN_DOWN(FFI_ALIGN_DOWN(argp, (*p_arg)->alignment), 4); - - if (z < sizeof(int)) { - z = sizeof(int); - switch ((*p_arg)->type) - { - case FFI_TYPE_SINT8: - *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); - break; - case FFI_TYPE_UINT8: - *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); - break; - case FFI_TYPE_SINT16: - *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); - break; - case FFI_TYPE_UINT16: - *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); - case FFI_TYPE_STRUCT: - memcpy(argp, *p_argv, (*p_arg)->size); - break; - default: - FFI_ASSERT(0); - } - } else if ( z == sizeof(int)) { - *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); - } else { - memcpy(argp, *p_argv, z); - } - } - - /* return the size of the arguments to be passed in registers, - padded to an 8 byte boundary to preserve stack alignment */ - return FFI_ALIGN(MIN(stack - argp, 6*4), 8); -} - -/* Perform machine dependent cif processing */ -ffi_status ffi_prep_cif_machdep(ffi_cif *cif) -{ - ffi_type **ptr; - unsigned i, bytes = 0; - - for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) { - if ((*ptr)->size == 0) - return FFI_BAD_TYPEDEF; - - /* Perform a sanity check on the argument type, do this - check after the initialization. */ - FFI_ASSERT_VALID_TYPE(*ptr); - - /* Add any padding if necessary */ - if (((*ptr)->alignment - 1) & bytes) - bytes = FFI_ALIGN(bytes, (*ptr)->alignment); - - bytes += FFI_ALIGN((*ptr)->size, 4); - } - - /* Ensure arg space is aligned to an 8-byte boundary */ - bytes = FFI_ALIGN(bytes, 8); - - /* Make space for the return structure pointer */ - if (cif->rtype->type == FFI_TYPE_STRUCT) { - bytes += sizeof(void*); - - /* Ensure stack is aligned to an 8-byte boundary */ - bytes = FFI_ALIGN(bytes, 8); - } - - cif->bytes = bytes; - - /* Set the return type flag */ - switch (cif->rtype->type) { - case FFI_TYPE_VOID: - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - cif->flags = (unsigned) cif->rtype->type; - break; - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - cif->flags = (unsigned) FFI_TYPE_SINT64; - break; - case FFI_TYPE_STRUCT: - /* Meta can store return values which are <= 64 bits */ - if (cif->rtype->size <= 4) - /* Returned to D0Re0 as 32-bit value */ - cif->flags = (unsigned)FFI_TYPE_INT; - else if ((cif->rtype->size > 4) && (cif->rtype->size <= 8)) - /* Returned valued is stored to D1Re0|R0Re0 */ - cif->flags = (unsigned)FFI_TYPE_DOUBLE; - else - /* value stored in memory */ - cif->flags = (unsigned)FFI_TYPE_STRUCT; - break; - default: - cif->flags = (unsigned)FFI_TYPE_INT; - break; - } - return FFI_OK; -} - -extern void ffi_call_SYSV(void (*fn)(void), extended_cif *, unsigned, unsigned, double *); - -/* - * Exported in API. Entry point - * cif -> ffi_cif object - * fn -> function pointer - * rvalue -> pointer to return value - * avalue -> vector of void * pointers pointing to memory locations holding the - * arguments - */ -void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - extended_cif ecif; - - int small_struct = (((cif->flags == FFI_TYPE_INT) || (cif->flags == FFI_TYPE_DOUBLE)) && (cif->rtype->type == FFI_TYPE_STRUCT)); - ecif.cif = cif; - ecif.avalue = avalue; - - double temp; - - /* - * If the return value is a struct and we don't have a return value address - * then we need to make one - */ - - if ((rvalue == NULL ) && (cif->flags == FFI_TYPE_STRUCT)) - ecif.rvalue = alloca(cif->rtype->size); - else if (small_struct) - ecif.rvalue = &temp; - else - ecif.rvalue = rvalue; - - switch (cif->abi) { - case FFI_SYSV: - ffi_call_SYSV(fn, &ecif, cif->bytes, cif->flags, ecif.rvalue); - break; - default: - FFI_ASSERT(0); - break; - } - - if (small_struct) - memcpy (rvalue, &temp, cif->rtype->size); -} - -/* private members */ - -static void ffi_prep_incoming_args_SYSV (char *, void **, void **, - ffi_cif*, float *); - -void ffi_closure_SYSV (ffi_closure *); - -/* Do NOT change that without changing the FFI_TRAMPOLINE_SIZE */ -extern unsigned int ffi_metag_trampoline[10]; /* 10 instructions */ - -/* end of private members */ - -/* - * __tramp: trampoline memory location - * __fun: assembly routine - * __ctx: memory location for wrapper - * - * At this point, tramp[0] == __ctx ! - */ -void ffi_init_trampoline(unsigned char *__tramp, unsigned int __fun, unsigned int __ctx) { - memcpy (__tramp, ffi_metag_trampoline, sizeof(ffi_metag_trampoline)); - *(unsigned int*) &__tramp[40] = __ctx; - *(unsigned int*) &__tramp[44] = __fun; - /* This will flush the instruction cache */ - __builtin_meta2_cachewd(&__tramp[0], 1); - __builtin_meta2_cachewd(&__tramp[47], 1); -} - - - -/* the cif must already be prepared */ - -ffi_status -ffi_prep_closure_loc (ffi_closure *closure, - ffi_cif* cif, - void (*fun)(ffi_cif*,void*,void**,void*), - void *user_data, - void *codeloc) -{ - void (*closure_func)(ffi_closure*) = NULL; - - if (cif->abi == FFI_SYSV) - closure_func = &ffi_closure_SYSV; - else - return FFI_BAD_ABI; - - ffi_init_trampoline( - (unsigned char*)&closure->tramp[0], - (unsigned int)closure_func, - (unsigned int)codeloc); - - closure->cif = cif; - closure->user_data = user_data; - closure->fun = fun; - - return FFI_OK; -} - - -/* This function is jumped to by the trampoline */ -unsigned int ffi_closure_SYSV_inner (closure, respp, args, vfp_args) - ffi_closure *closure; - void **respp; - void *args; - void *vfp_args; -{ - ffi_cif *cif; - void **arg_area; - - cif = closure->cif; - arg_area = (void**) alloca (cif->nargs * sizeof (void*)); - - /* - * This call will initialize ARG_AREA, such that each - * element in that array points to the corresponding - * value on the stack; and if the function returns - * a structure, it will re-set RESP to point to the - * structure return address. - */ - ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif, vfp_args); - - (closure->fun) ( cif, *respp, arg_area, closure->user_data); - - return cif->flags; -} - -static void ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, - void **avalue, ffi_cif *cif, - float *vfp_stack) -{ - register unsigned int i; - register void **p_argv; - register char *argp; - register ffi_type **p_arg; - - /* stack points to original arguments */ - argp = stack; - - /* Store return value */ - if ( cif->flags == FFI_TYPE_STRUCT ) { - argp -= 4; - *rvalue = *(void **) argp; - } - - p_argv = avalue; - - for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) { - size_t z; - size_t alignment; - - alignment = (*p_arg)->alignment; - if (alignment < 4) - alignment = 4; - if ((alignment - 1) & (unsigned)argp) - argp = (char *) FFI_ALIGN(argp, alignment); - - z = (*p_arg)->size; - *p_argv = (void*) argp; - p_argv++; - argp -= z; - } - return; -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/metag/ffitarget.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/metag/ffitarget.h deleted file mode 100644 index 7b9dbeb..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/metag/ffitarget.h +++ /dev/null @@ -1,53 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2013 Imagination Technologies Ltd. - Target configuration macros for Meta - - 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. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_SYSV, - FFI_DEFAULT_ABI = FFI_SYSV, - FFI_LAST_ABI = FFI_DEFAULT_ABI + 1, -} ffi_abi; -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_TRAMPOLINE_SIZE 48 -#define FFI_NATIVE_RAW_API 0 - -#endif - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/metag/sysv.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/metag/sysv.S deleted file mode 100644 index b4b2a3b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/metag/sysv.S +++ /dev/null @@ -1,311 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.S - Copyright (c) 2013 Imagination Technologies Ltd. - - Meta Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include -#ifdef HAVE_MACHINE_ASM_H -#include -#else -#ifdef __USER_LABEL_PREFIX__ -#define CONCAT1(a, b) CONCAT2(a, b) -#define CONCAT2(a, b) a ## b - -/* Use the right prefix for global labels. */ -#define CNAME(x) CONCAT1 (__USER_LABEL_PREFIX__, x) -#else -#define CNAME(x) x -#endif -#define ENTRY(x) .globl CNAME(x); .type CNAME(x), %function; CNAME(x): -#endif - -#ifdef __ELF__ -#define LSYM(x) .x -#else -#define LSYM(x) x -#endif - -.macro call_reg x= - .text - .balign 4 - mov D1RtP, \x - swap D1RtP, PC -.endm - -! Save register arguments -.macro SAVE_ARGS - .text - .balign 4 - setl [A0StP++], D0Ar6, D1Ar5 - setl [A0StP++], D0Ar4, D1Ar3 - setl [A0StP++], D0Ar2, D1Ar1 -.endm - -! Save retrun, frame pointer and other regs -.macro SAVE_REGS regs= - .text - .balign 4 - setl [A0StP++], D0FrT, D1RtP - ! Needs to be a pair of regs - .ifnc "\regs","" - setl [A0StP++], \regs - .endif -.endm - -! Declare a global function -.macro METAG_FUNC_START name - .text - .balign 4 - ENTRY(\name) -.endm - -! Return registers from the stack. Reverse SAVE_REGS operation -.macro RET_REGS regs=, cond= - .ifnc "\regs", "" - getl \regs, [--A0StP] - .endif - getl D0FrT, D1RtP, [--A0StP] -.endm - -! Return arguments -.macro RET_ARGS - getl D0Ar2, D1Ar1, [--A0StP] - getl D0Ar4, D1Ar3, [--A0StP] - getl D0Ar6, D1Ar5, [--A0StP] -.endm - - - ! D1Ar1: fn - ! D0Ar2: &ecif - ! D1Ar3: cif->bytes - ! D0Ar4: fig->flags - ! D1Ar5: ecif.rvalue - - ! This assumes we are using GNU as -METAG_FUNC_START ffi_call_SYSV - ! Save argument registers - - SAVE_ARGS - - ! new frame - mov D0FrT, A0FrP - add A0FrP, A0StP, #0 - - ! Preserve the old frame pointer - SAVE_REGS "D1.5, D0.5" - - ! Make room for new args. cifs->bytes is the total space for input - ! and return arguments - - add A0StP, A0StP, D1Ar3 - - ! Preserve cifs->bytes & fn - mov D0.5, D1Ar3 - mov D1.5, D1Ar1 - - ! Place all of the ffi_prep_args in position - mov D1Ar1, A0StP - - ! Call ffi_prep_args(stack, &ecif) -#ifdef __PIC__ - callr D1RtP, CNAME(ffi_prep_args@PLT) -#else - callr D1RtP, CNAME(ffi_prep_args) -#endif - - ! Restore fn pointer - - ! The foreign stack should look like this - ! XXXXX XXXXXX <--- stack pointer - ! FnArgN rvalue - ! FnArgN+2 FnArgN+1 - ! FnArgN+4 FnArgN+3 - ! .... - ! - - ! A0StP now points to the first (or return) argument + 4 - - ! Preserve cif->bytes - getl D0Ar2, D1Ar1, [--A0StP] - getl D0Ar4, D1Ar3, [--A0StP] - getl D0Ar6, D1Ar5, [--A0StP] - - ! Place A0StP to the first argument again - add A0StP, A0StP, #24 ! That's because we loaded 6 regs x 4 byte each - - ! A0FrP points to the initial stack without the reserved space for the - ! cifs->bytes, whilst A0StP points to the stack after the space allocation - - ! fn was the first argument of ffi_call_SYSV. - ! The stack at this point looks like this: - ! - ! A0StP(on entry to _SYSV) -> Arg6 Arg5 | low - ! Arg4 Arg3 | - ! Arg2 Arg1 | - ! A0FrP ----> D0FrtP D1RtP | - ! D1.5 D0.5 | - ! A0StP(bf prep_args) -> FnArgn FnArgn-1 | - ! FnArgn-2FnArgn-3 | - ! ................ | <= cifs->bytes - ! FnArg4 FnArg3 | - ! A0StP (prv_A0StP+cifs->bytes) FnArg2 FnArg1 | high - ! - ! fn was in Arg1 so it's located in in A0FrP+#-0xC - ! - - ! D0Re0 contains the size of arguments stored in registers - sub A0StP, A0StP, D0Re0 - - ! Arg1 is the function pointer for the foreign call. This has been - ! preserved in D1.5 - - ! Time to call (fn). Arguments should be like this: - ! Arg1-Arg6 are loaded to regs - ! The rest of the arguments are stored in stack pointed by A0StP - - call_reg D1.5 - - ! Reset stack. - - mov A0StP, A0FrP - - ! Load Arg1 with the pointer to storage for the return type - ! This was stored in Arg5 - - getd D1Ar1, [A0FrP+#-20] - - ! Load D0Ar2 with the return type code. This was stored in Arg4 (flags) - - getd D0Ar2, [A0FrP+#-16] - - ! We are ready to start processing the return value - ! D0Re0 (and D1Re0) hold the return value - - ! If the return value is NULL, assume no return value - cmp D1Ar1, #0 - beq LSYM(Lepilogue) - - ! return INT - cmp D0Ar2, #FFI_TYPE_INT - ! Sadly, there is no setd{cc} instruction so we need to workaround that - bne .INT64 - setd [D1Ar1], D0Re0 - b LSYM(Lepilogue) - - ! return INT64 -.INT64: - cmp D0Ar2, #FFI_TYPE_SINT64 - setleq [D1Ar1], D0Re0, D1Re0 - - ! return DOUBLE - cmp D0Ar2, #FFI_TYPE_DOUBLE - setl [D1AR1++], D0Re0, D1Re0 - -LSYM(Lepilogue): - ! At this point, the stack pointer points right after the argument - ! saved area. We need to restore 4 regs, therefore we need to move - ! 16 bytes ahead. - add A0StP, A0StP, #16 - RET_REGS "D1.5, D0.5" - RET_ARGS - getd D0Re0, [A0StP] - mov A0FrP, D0FrT - swap D1RtP, PC - -.ffi_call_SYSV_end: - .size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV) - - -/* - (called by ffi_metag_trampoline) - void ffi_closure_SYSV (ffi_closure*) - - (called by ffi_closure_SYSV) - unsigned int FFI_HIDDEN - ffi_closure_SYSV_inner (closure,respp, args) - ffi_closure *closure; - void **respp; - void *args; -*/ - -METAG_FUNC_START ffi_closure_SYSV - ! We assume that D1Ar1 holds the address of the - ! ffi_closure struct. We will use that to fetch the - ! arguments. The stack pointer points to an empty space - ! and it is ready to store more data. - - ! D1Ar1 is ready - ! Allocate stack space for return value - add A0StP, A0StP, #8 - ! Store it to D0Ar2 - sub D0Ar2, A0StP, #8 - - sub D1Ar3, A0FrP, #4 - - ! D1Ar3 contains the address of the original D1Ar1 argument - ! We need to subtract #4 later on - - ! Preverve D0Ar2 - mov D0.5, D0Ar2 - -#ifdef __PIC__ - callr D1RtP, CNAME(ffi_closure_SYSV_inner@PLT) -#else - callr D1RtP, CNAME(ffi_closure_SYSV_inner) -#endif - - ! Check the return value and store it to D0.5 - cmp D0Re0, #FFI_TYPE_INT - beq .Lretint - cmp D0Re0, #FFI_TYPE_DOUBLE - beq .Lretdouble -.Lclosure_epilogue: - sub A0StP, A0StP, #8 - RET_REGS "D1.5, D0.5" - RET_ARGS - swap D1RtP, PC - -.Lretint: - setd [D0.5], D0Re0 - b .Lclosure_epilogue -.Lretdouble: - setl [D0.5++], D0Re0, D1Re0 - b .Lclosure_epilogue -.ffi_closure_SYSV_end: -.size CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV) - - -ENTRY(ffi_metag_trampoline) - SAVE_ARGS - ! New frame - mov A0FrP, A0StP - SAVE_REGS "D1.5, D0.5" - mov D0.5, PC - ! Load D1Ar1 the value of ffi_metag_trampoline - getd D1Ar1, [D0.5 + #8] - ! Jump to ffi_closure_SYSV - getd PC, [D0.5 + #12] diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/microblaze/ffi.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/microblaze/ffi.c deleted file mode 100644 index df6e33c..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/microblaze/ffi.c +++ /dev/null @@ -1,321 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2012, 2013 Xilinx, Inc - - MicroBlaze Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#include -#include - -extern void ffi_call_SYSV(void (*)(void*, extended_cif*), extended_cif*, - unsigned int, unsigned int, unsigned int*, void (*fn)(void), - unsigned int, unsigned int); - -extern void ffi_closure_SYSV(void); - -#define WORD_SIZE sizeof(unsigned int) -#define ARGS_REGISTER_SIZE (WORD_SIZE * 6) -#define WORD_FFI_ALIGN(x) FFI_ALIGN(x, WORD_SIZE) - -/* ffi_prep_args is called by the assembly routine once stack space - has been allocated for the function's arguments */ -void ffi_prep_args(void* stack, extended_cif* ecif) -{ - unsigned int i; - ffi_type** p_arg; - void** p_argv; - void* stack_args_p = stack; - - if (ecif == NULL || ecif->cif == NULL) { - return; /* no description to prepare */ - } - - p_argv = ecif->avalue; - - if ((ecif->cif->rtype != NULL) && - (ecif->cif->rtype->type == FFI_TYPE_STRUCT)) - { - /* if return type is a struct which is referenced on the stack/reg5, - * by a pointer. Stored the return value pointer in r5. - */ - char* addr = stack_args_p; - memcpy(addr, &(ecif->rvalue), WORD_SIZE); - stack_args_p += WORD_SIZE; - } - - if (ecif->avalue == NULL) { - return; /* no arguments to prepare */ - } - - for (i = 0, p_arg = ecif->cif->arg_types; i < ecif->cif->nargs; - i++, p_arg++) - { - size_t size = (*p_arg)->size; - int type = (*p_arg)->type; - void* value = p_argv[i]; - char* addr = stack_args_p; - int aligned_size = WORD_FFI_ALIGN(size); - - /* force word alignment on the stack */ - stack_args_p += aligned_size; - - switch (type) - { - case FFI_TYPE_UINT8: - *(unsigned int *)addr = (unsigned int)*(UINT8*)(value); - break; - case FFI_TYPE_SINT8: - *(signed int *)addr = (signed int)*(SINT8*)(value); - break; - case FFI_TYPE_UINT16: - *(unsigned int *)addr = (unsigned int)*(UINT16*)(value); - break; - case FFI_TYPE_SINT16: - *(signed int *)addr = (signed int)*(SINT16*)(value); - break; - case FFI_TYPE_STRUCT: -#if __BIG_ENDIAN__ - /* - * MicroBlaze toolchain appears to emit: - * bsrli r5, r5, 8 (caller) - * ... - * - * ... - * bslli r5, r5, 8 (callee) - * - * For structs like "struct a { uint8_t a[3]; };", when passed - * by value. - * - * Structs like "struct b { uint16_t a; };" are also expected - * to be packed strangely in registers. - * - * This appears to be because the microblaze toolchain expects - * "struct b == uint16_t", which is only any issue for big - * endian. - * - * The following is a work around for big-endian only, for the - * above mentioned case, it will re-align the contents of a - * <= 3-byte struct value. - */ - if (size < WORD_SIZE) - { - memcpy (addr + (WORD_SIZE - size), value, size); - break; - } -#endif - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - case FFI_TYPE_FLOAT: - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - case FFI_TYPE_DOUBLE: - default: - memcpy(addr, value, aligned_size); - } - } -} - -ffi_status ffi_prep_cif_machdep(ffi_cif* cif) -{ - /* check ABI */ - switch (cif->abi) - { - case FFI_SYSV: - break; - default: - return FFI_BAD_ABI; - } - return FFI_OK; -} - -void ffi_call(ffi_cif* cif, void (*fn)(void), void* rvalue, void** avalue) -{ - extended_cif ecif; - ecif.cif = cif; - ecif.avalue = avalue; - - /* If the return value is a struct and we don't have a return */ - /* value address then we need to make one */ - if ((rvalue == NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) { - ecif.rvalue = alloca(cif->rtype->size); - } else { - ecif.rvalue = rvalue; - } - - switch (cif->abi) - { - case FFI_SYSV: - ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, - ecif.rvalue, fn, cif->rtype->type, cif->rtype->size); - break; - default: - FFI_ASSERT(0); - break; - } -} - -void ffi_closure_call_SYSV(void* register_args, void* stack_args, - ffi_closure* closure, void* rvalue, - unsigned int* rtype, unsigned int* rsize) -{ - /* prepare arguments for closure call */ - ffi_cif* cif = closure->cif; - ffi_type** arg_types = cif->arg_types; - - /* re-allocate data for the args. This needs to be done in order to keep - * multi-word objects (e.g. structs) in contiguous memory. Callers are not - * required to store the value of args in the lower 6 words in the stack - * (although they are allocated in the stack). - */ - char* stackclone = alloca(cif->bytes); - void** avalue = alloca(cif->nargs * sizeof(void*)); - void* struct_rvalue = NULL; - char* ptr = stackclone; - int i; - - /* copy registers into stack clone */ - int registers_used = cif->bytes; - if (registers_used > ARGS_REGISTER_SIZE) { - registers_used = ARGS_REGISTER_SIZE; - } - memcpy(stackclone, register_args, registers_used); - - /* copy stack allocated args into stack clone */ - if (cif->bytes > ARGS_REGISTER_SIZE) { - int stack_used = cif->bytes - ARGS_REGISTER_SIZE; - memcpy(stackclone + ARGS_REGISTER_SIZE, stack_args, stack_used); - } - - /* preserve struct type return pointer passing */ - if ((cif->rtype != NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) { - struct_rvalue = *((void**)ptr); - ptr += WORD_SIZE; - } - - /* populate arg pointer list */ - for (i = 0; i < cif->nargs; i++) - { - switch (arg_types[i]->type) - { - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: -#ifdef __BIG_ENDIAN__ - avalue[i] = ptr + 3; -#else - avalue[i] = ptr; -#endif - break; - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: -#ifdef __BIG_ENDIAN__ - avalue[i] = ptr + 2; -#else - avalue[i] = ptr; -#endif - break; - case FFI_TYPE_STRUCT: -#if __BIG_ENDIAN__ - /* - * Work around strange ABI behaviour. - * (see info in ffi_prep_args) - */ - if (arg_types[i]->size < WORD_SIZE) - { - memcpy (ptr, ptr + (WORD_SIZE - arg_types[i]->size), arg_types[i]->size); - } -#endif - avalue[i] = (void*)ptr; - break; - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - case FFI_TYPE_DOUBLE: - avalue[i] = ptr; - break; - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - case FFI_TYPE_FLOAT: - default: - /* default 4-byte argument */ - avalue[i] = ptr; - break; - } - ptr += WORD_FFI_ALIGN(arg_types[i]->size); - } - - /* set the return type info passed back to the wrapper */ - *rsize = cif->rtype->size; - *rtype = cif->rtype->type; - if (struct_rvalue != NULL) { - closure->fun(cif, struct_rvalue, avalue, closure->user_data); - /* copy struct return pointer value into function return value */ - *((void**)rvalue) = struct_rvalue; - } else { - closure->fun(cif, rvalue, avalue, closure->user_data); - } -} - -ffi_status ffi_prep_closure_loc( - ffi_closure* closure, ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void* user_data, void* codeloc) -{ - unsigned long* tramp = (unsigned long*)&(closure->tramp[0]); - unsigned long cls = (unsigned long)codeloc; - unsigned long fn = 0; - unsigned long fn_closure_call_sysv = (unsigned long)ffi_closure_call_SYSV; - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - switch (cif->abi) - { - case FFI_SYSV: - fn = (unsigned long)ffi_closure_SYSV; - - /* load r11 (temp) with fn */ - /* imm fn(upper) */ - tramp[0] = 0xb0000000 | ((fn >> 16) & 0xffff); - /* addik r11, r0, fn(lower) */ - tramp[1] = 0x31600000 | (fn & 0xffff); - - /* load r12 (temp) with cls */ - /* imm cls(upper) */ - tramp[2] = 0xb0000000 | ((cls >> 16) & 0xffff); - /* addik r12, r0, cls(lower) */ - tramp[3] = 0x31800000 | (cls & 0xffff); - - /* load r3 (temp) with ffi_closure_call_SYSV */ - /* imm fn_closure_call_sysv(upper) */ - tramp[4] = 0xb0000000 | ((fn_closure_call_sysv >> 16) & 0xffff); - /* addik r3, r0, fn_closure_call_sysv(lower) */ - tramp[5] = 0x30600000 | (fn_closure_call_sysv & 0xffff); - /* branch/jump to address stored in r11 (fn) */ - tramp[6] = 0x98085800; /* bra r11 */ - - break; - default: - return FFI_BAD_ABI; - } - return FFI_OK; -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/microblaze/ffitarget.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/microblaze/ffitarget.h deleted file mode 100644 index c6fa5a4..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/microblaze/ffitarget.h +++ /dev/null @@ -1,53 +0,0 @@ -/* ----------------------------------------------------------------------- - ffitarget.h - Copyright (c) 2012, 2013 Xilinx, Inc - - Target configuration macros for MicroBlaze. - - 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. - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_SYSV, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_SYSV -} ffi_abi; -#endif - -/* Definitions for closures */ - -#define FFI_CLOSURES 1 -#define FFI_NATIVE_RAW_API 0 - -#define FFI_TRAMPOLINE_SIZE (4*8) - -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/microblaze/sysv.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/microblaze/sysv.S deleted file mode 100644 index ea43e9d..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/microblaze/sysv.S +++ /dev/null @@ -1,302 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.S - Copyright (c) 2012, 2013 Xilinx, Inc - - MicroBlaze Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include - - /* - * arg[0] (r5) = ffi_prep_args, - * arg[1] (r6) = &ecif, - * arg[2] (r7) = cif->bytes, - * arg[3] (r8) = cif->flags, - * arg[4] (r9) = ecif.rvalue, - * arg[5] (r10) = fn - * arg[6] (sp[0]) = cif->rtype->type - * arg[7] (sp[4]) = cif->rtype->size - */ - .text - .globl ffi_call_SYSV - .type ffi_call_SYSV, @function -ffi_call_SYSV: - /* push callee saves */ - addik r1, r1, -20 - swi r19, r1, 0 /* Frame Pointer */ - swi r20, r1, 4 /* PIC register */ - swi r21, r1, 8 /* PIC register */ - swi r22, r1, 12 /* save for locals */ - swi r23, r1, 16 /* save for locals */ - - /* save the r5-r10 registers in the stack */ - addik r1, r1, -24 /* increment sp to store 6x 32-bit words */ - swi r5, r1, 0 - swi r6, r1, 4 - swi r7, r1, 8 - swi r8, r1, 12 - swi r9, r1, 16 - swi r10, r1, 20 - - /* save function pointer */ - addik r3, r5, 0 /* copy ffi_prep_args into r3 */ - addik r22, r1, 0 /* save sp for unallocated args into r22 (callee-saved) */ - addik r23, r10, 0 /* save function address into r23 (callee-saved) */ - - /* prepare stack with allocation for n (bytes = r7) args */ - rsub r1, r7, r1 /* subtract bytes from sp */ - - /* prep args for ffi_prep_args call */ - addik r5, r1, 0 /* store stack pointer into arg[0] */ - /* r6 still holds ecif for arg[1] */ - - /* Call ffi_prep_args(stack, &ecif). */ - addik r1, r1, -4 - swi r15, r1, 0 /* store the link register in the frame */ - brald r15, r3 - nop /* branch has delay slot */ - lwi r15, r1, 0 - addik r1, r1, 4 /* restore the link register from the frame */ - /* returns calling stack pointer location */ - - /* prepare args for fn call, prep_args populates them onto the stack */ - lwi r5, r1, 0 /* arg[0] */ - lwi r6, r1, 4 /* arg[1] */ - lwi r7, r1, 8 /* arg[2] */ - lwi r8, r1, 12 /* arg[3] */ - lwi r9, r1, 16 /* arg[4] */ - lwi r10, r1, 20 /* arg[5] */ - - /* call (fn) (...). */ - addik r1, r1, -4 - swi r15, r1, 0 /* store the link register in the frame */ - brald r15, r23 - nop /* branch has delay slot */ - lwi r15, r1, 0 - addik r1, r1, 4 /* restore the link register from the frame */ - - /* Remove the space we pushed for the args. */ - addik r1, r22, 0 /* restore old SP */ - - /* restore this functions parameters */ - lwi r5, r1, 0 /* arg[0] */ - lwi r6, r1, 4 /* arg[1] */ - lwi r7, r1, 8 /* arg[2] */ - lwi r8, r1, 12 /* arg[3] */ - lwi r9, r1, 16 /* arg[4] */ - lwi r10, r1, 20 /* arg[5] */ - addik r1, r1, 24 /* decrement sp to de-allocate 6x 32-bit words */ - - /* If the return value pointer is NULL, assume no return value. */ - beqi r9, ffi_call_SYSV_end - - lwi r22, r1, 48 /* get return type (20 for locals + 28 for arg[6]) */ - lwi r23, r1, 52 /* get return size (20 for locals + 32 for arg[7]) */ - - /* Check if return type is actually a struct, do nothing */ - rsubi r11, r22, FFI_TYPE_STRUCT - beqi r11, ffi_call_SYSV_end - - /* Return 8bit */ - rsubi r11, r23, 1 - beqi r11, ffi_call_SYSV_store8 - - /* Return 16bit */ - rsubi r11, r23, 2 - beqi r11, ffi_call_SYSV_store16 - - /* Return 32bit */ - rsubi r11, r23, 4 - beqi r11, ffi_call_SYSV_store32 - - /* Return 64bit */ - rsubi r11, r23, 8 - beqi r11, ffi_call_SYSV_store64 - - /* Didn't match anything */ - bri ffi_call_SYSV_end - -ffi_call_SYSV_store64: - swi r3, r9, 0 /* store word r3 into return value */ - swi r4, r9, 4 /* store word r4 into return value */ - bri ffi_call_SYSV_end - -ffi_call_SYSV_store32: - swi r3, r9, 0 /* store word r3 into return value */ - bri ffi_call_SYSV_end - -ffi_call_SYSV_store16: -#ifdef __BIG_ENDIAN__ - shi r3, r9, 2 /* store half-word r3 into return value */ -#else - shi r3, r9, 0 /* store half-word r3 into return value */ -#endif - bri ffi_call_SYSV_end - -ffi_call_SYSV_store8: -#ifdef __BIG_ENDIAN__ - sbi r3, r9, 3 /* store byte r3 into return value */ -#else - sbi r3, r9, 0 /* store byte r3 into return value */ -#endif - bri ffi_call_SYSV_end - -ffi_call_SYSV_end: - /* callee restores */ - lwi r19, r1, 0 /* frame pointer */ - lwi r20, r1, 4 /* PIC register */ - lwi r21, r1, 8 /* PIC register */ - lwi r22, r1, 12 - lwi r23, r1, 16 - addik r1, r1, 20 - - /* return from sub-routine (with delay slot) */ - rtsd r15, 8 - nop - - .size ffi_call_SYSV, . - ffi_call_SYSV - -/* ------------------------------------------------------------------------- */ - - /* - * args passed into this function, are passed down to the callee. - * this function is the target of the closure trampoline, as such r12 is - * a pointer to the closure object. - */ - .text - .globl ffi_closure_SYSV - .type ffi_closure_SYSV, @function -ffi_closure_SYSV: - /* push callee saves */ - addik r11, r1, 28 /* save stack args start location (excluding regs/link) */ - addik r1, r1, -12 - swi r19, r1, 0 /* Frame Pointer */ - swi r20, r1, 4 /* PIC register */ - swi r21, r1, 8 /* PIC register */ - - /* store register args on stack */ - addik r1, r1, -24 - swi r5, r1, 0 - swi r6, r1, 4 - swi r7, r1, 8 - swi r8, r1, 12 - swi r9, r1, 16 - swi r10, r1, 20 - - /* setup args */ - addik r5, r1, 0 /* register_args */ - addik r6, r11, 0 /* stack_args */ - addik r7, r12, 0 /* closure object */ - addik r1, r1, -8 /* allocate return value */ - addik r8, r1, 0 /* void* rvalue */ - addik r1, r1, -8 /* allocate for return type/size values */ - addik r9, r1, 0 /* void* rtype */ - addik r10, r1, 4 /* void* rsize */ - - /* call the wrap_call function */ - addik r1, r1, -28 /* allocate args + link reg */ - swi r15, r1, 0 /* store the link register in the frame */ - brald r15, r3 - nop /* branch has delay slot */ - lwi r15, r1, 0 - addik r1, r1, 28 /* restore the link register from the frame */ - -ffi_closure_SYSV_prepare_return: - lwi r9, r1, 0 /* rtype */ - lwi r10, r1, 4 /* rsize */ - addik r1, r1, 8 /* de-allocate return info values */ - - /* Check if return type is actually a struct, store 4 bytes */ - rsubi r11, r9, FFI_TYPE_STRUCT - beqi r11, ffi_closure_SYSV_store32 - - /* Return 8bit */ - rsubi r11, r10, 1 - beqi r11, ffi_closure_SYSV_store8 - - /* Return 16bit */ - rsubi r11, r10, 2 - beqi r11, ffi_closure_SYSV_store16 - - /* Return 32bit */ - rsubi r11, r10, 4 - beqi r11, ffi_closure_SYSV_store32 - - /* Return 64bit */ - rsubi r11, r10, 8 - beqi r11, ffi_closure_SYSV_store64 - - /* Didn't match anything */ - bri ffi_closure_SYSV_end - -ffi_closure_SYSV_store64: - lwi r3, r1, 0 /* store word r3 into return value */ - lwi r4, r1, 4 /* store word r4 into return value */ - /* 64 bits == 2 words, no sign extend occurs */ - bri ffi_closure_SYSV_end - -ffi_closure_SYSV_store32: - lwi r3, r1, 0 /* store word r3 into return value */ - /* 32 bits == 1 word, no sign extend occurs */ - bri ffi_closure_SYSV_end - -ffi_closure_SYSV_store16: -#ifdef __BIG_ENDIAN__ - lhui r3, r1, 2 /* store half-word r3 into return value */ -#else - lhui r3, r1, 0 /* store half-word r3 into return value */ -#endif - rsubi r11, r9, FFI_TYPE_SINT16 - bnei r11, ffi_closure_SYSV_end - sext16 r3, r3 /* fix sign extend of sint8 */ - bri ffi_closure_SYSV_end - -ffi_closure_SYSV_store8: -#ifdef __BIG_ENDIAN__ - lbui r3, r1, 3 /* store byte r3 into return value */ -#else - lbui r3, r1, 0 /* store byte r3 into return value */ -#endif - rsubi r11, r9, FFI_TYPE_SINT8 - bnei r11, ffi_closure_SYSV_end - sext8 r3, r3 /* fix sign extend of sint8 */ - bri ffi_closure_SYSV_end - -ffi_closure_SYSV_end: - addik r1, r1, 8 /* de-allocate return value */ - - /* de-allocate stored args */ - addik r1, r1, 24 - - /* callee restores */ - lwi r19, r1, 0 /* frame pointer */ - lwi r20, r1, 4 /* PIC register */ - lwi r21, r1, 8 /* PIC register */ - addik r1, r1, 12 - - /* return from sub-routine (with delay slot) */ - rtsd r15, 8 - nop - - .size ffi_closure_SYSV, . - ffi_closure_SYSV diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/mips/ffi.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/mips/ffi.c deleted file mode 100644 index 979ca49..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/mips/ffi.c +++ /dev/null @@ -1,1134 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2011 Anthony Green - Copyright (c) 2008 David Daney - Copyright (c) 1996, 2007, 2008, 2011 Red Hat, Inc. - - MIPS Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#include -#include - -#include -#include - -#ifdef __GNUC__ -# if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3)) -# define USE__BUILTIN___CLEAR_CACHE 1 -# endif -#endif - -#ifndef USE__BUILTIN___CLEAR_CACHE -# if defined(__FreeBSD__) -# include -# elif defined(__OpenBSD__) -# include -# else -# include -# endif -#endif - -#ifdef FFI_DEBUG -# define FFI_MIPS_STOP_HERE() ffi_stop_here() -#else -# define FFI_MIPS_STOP_HERE() do {} while(0) -#endif - -#ifdef FFI_MIPS_N32 -#define FIX_ARGP \ -FFI_ASSERT(argp <= &stack[bytes]); \ -if (argp == &stack[bytes]) \ -{ \ - argp = stack; \ - FFI_MIPS_STOP_HERE(); \ -} -#else -#define FIX_ARGP -#endif - - -/* ffi_prep_args is called by the assembly routine once stack space - has been allocated for the function's arguments */ - -static void ffi_prep_args(char *stack, - extended_cif *ecif, - int bytes, - int flags) -{ - int i; - void **p_argv; - char *argp; - ffi_type **p_arg; - -#ifdef FFI_MIPS_N32 - /* If more than 8 double words are used, the remainder go - on the stack. We reorder stuff on the stack here to - support this easily. */ - if (bytes > 8 * sizeof(ffi_arg)) - argp = &stack[bytes - (8 * sizeof(ffi_arg))]; - else - argp = stack; -#else - argp = stack; -#endif - - memset(stack, 0, bytes); - -#ifdef FFI_MIPS_N32 - if ( ecif->cif->rstruct_flag != 0 ) -#else - if ( ecif->cif->rtype->type == FFI_TYPE_STRUCT ) -#endif - { - *(ffi_arg *) argp = (ffi_arg) ecif->rvalue; - argp += sizeof(ffi_arg); - FIX_ARGP; - } - - p_argv = ecif->avalue; - - for (i = 0, p_arg = ecif->cif->arg_types; i < ecif->cif->nargs; i++, p_arg++) - { - size_t z; - unsigned int a; - - /* Align if necessary. */ - a = (*p_arg)->alignment; - if (a < sizeof(ffi_arg)) - a = sizeof(ffi_arg); - - if ((a - 1) & (unsigned long) argp) - { - argp = (char *) FFI_ALIGN(argp, a); - FIX_ARGP; - } - - z = (*p_arg)->size; - if (z <= sizeof(ffi_arg)) - { - int type = (*p_arg)->type; - z = sizeof(ffi_arg); - - /* The size of a pointer depends on the ABI */ - if (type == FFI_TYPE_POINTER) - type = (ecif->cif->abi == FFI_N64 - || ecif->cif->abi == FFI_N64_SOFT_FLOAT) - ? FFI_TYPE_SINT64 : FFI_TYPE_SINT32; - - if (i < 8 && (ecif->cif->abi == FFI_N32_SOFT_FLOAT - || ecif->cif->abi == FFI_N64_SOFT_FLOAT)) - { - switch (type) - { - case FFI_TYPE_FLOAT: - type = FFI_TYPE_UINT32; - break; - case FFI_TYPE_DOUBLE: - type = FFI_TYPE_UINT64; - break; - default: - break; - } - } - switch (type) - { - case FFI_TYPE_SINT8: - *(ffi_arg *)argp = *(SINT8 *)(* p_argv); - break; - - case FFI_TYPE_UINT8: - *(ffi_arg *)argp = *(UINT8 *)(* p_argv); - break; - - case FFI_TYPE_SINT16: - *(ffi_arg *)argp = *(SINT16 *)(* p_argv); - break; - - case FFI_TYPE_UINT16: - *(ffi_arg *)argp = *(UINT16 *)(* p_argv); - break; - - case FFI_TYPE_SINT32: - *(ffi_arg *)argp = *(SINT32 *)(* p_argv); - break; - - case FFI_TYPE_UINT32: -#ifdef FFI_MIPS_N32 - /* The N32 ABI requires that 32-bit integers - be sign-extended to 64-bits, regardless of - whether they are signed or unsigned. */ - *(ffi_arg *)argp = *(SINT32 *)(* p_argv); -#else - *(ffi_arg *)argp = *(UINT32 *)(* p_argv); -#endif - break; - - /* This can only happen with 64bit slots. */ - case FFI_TYPE_FLOAT: - *(float *) argp = *(float *)(* p_argv); - break; - - /* Handle structures. */ - default: - memcpy(argp, *p_argv, (*p_arg)->size); - break; - } - } - else - { -#ifdef FFI_MIPS_O32 - memcpy(argp, *p_argv, z); -#else - { - unsigned long end = (unsigned long) argp + z; - unsigned long cap = (unsigned long) stack + bytes; - - /* Check if the data will fit within the register space. - Handle it if it doesn't. */ - - if (end <= cap) - memcpy(argp, *p_argv, z); - else - { - unsigned long portion = cap - (unsigned long)argp; - - memcpy(argp, *p_argv, portion); - argp = stack; - z -= portion; - memcpy(argp, (void*)((unsigned long)(*p_argv) + portion), - z); - } - } -#endif - } - p_argv++; - argp += z; - FIX_ARGP; - } -} - -#ifdef FFI_MIPS_N32 - -/* The n32 spec says that if "a chunk consists solely of a double - float field (but not a double, which is part of a union), it - is passed in a floating point register. Any other chunk is - passed in an integer register". This code traverses structure - definitions and generates the appropriate flags. */ - -static unsigned -calc_n32_struct_flags(int soft_float, ffi_type *arg, - unsigned *loc, unsigned *arg_reg) -{ - unsigned flags = 0; - unsigned index = 0; - - ffi_type *e; - - if (soft_float) - return 0; - - while ((e = arg->elements[index])) - { - /* Align this object. */ - *loc = FFI_ALIGN(*loc, e->alignment); - if (e->type == FFI_TYPE_DOUBLE) - { - /* Already aligned to FFI_SIZEOF_ARG. */ - *arg_reg = *loc / FFI_SIZEOF_ARG; - if (*arg_reg > 7) - break; - flags += (FFI_TYPE_DOUBLE << (*arg_reg * FFI_FLAG_BITS)); - *loc += e->size; - } - else - *loc += e->size; - index++; - } - /* Next Argument register at alignment of FFI_SIZEOF_ARG. */ - *arg_reg = FFI_ALIGN(*loc, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; - - return flags; -} - -static unsigned -calc_n32_return_struct_flags(int soft_float, ffi_type *arg) -{ - unsigned flags = 0; - unsigned small = FFI_TYPE_SMALLSTRUCT; - ffi_type *e; - - /* Returning structures under n32 is a tricky thing. - A struct with only one or two floating point fields - is returned in $f0 (and $f2 if necessary). Any other - struct results at most 128 bits are returned in $2 - (the first 64 bits) and $3 (remainder, if necessary). - Larger structs are handled normally. */ - - if (arg->size > 16) - return 0; - - if (arg->size > 8) - small = FFI_TYPE_SMALLSTRUCT2; - - e = arg->elements[0]; - - if (e->type == FFI_TYPE_DOUBLE) - flags = FFI_TYPE_DOUBLE; - else if (e->type == FFI_TYPE_FLOAT) - flags = FFI_TYPE_FLOAT; - - if (flags && (e = arg->elements[1])) - { - if (e->type == FFI_TYPE_DOUBLE) - flags += FFI_TYPE_DOUBLE << FFI_FLAG_BITS; - else if (e->type == FFI_TYPE_FLOAT) - flags += FFI_TYPE_FLOAT << FFI_FLAG_BITS; - else - return small; - - if (flags && (arg->elements[2])) - { - /* There are three arguments and the first two are - floats! This must be passed the old way. */ - return small; - } - if (soft_float) - flags += FFI_TYPE_STRUCT_SOFT; - } - else - if (!flags) - return small; - - return flags; -} - -#endif - -/* Perform machine dependent cif processing */ -static ffi_status ffi_prep_cif_machdep_int(ffi_cif *cif, unsigned nfixedargs) -{ - cif->flags = 0; - cif->mips_nfixedargs = nfixedargs; - -#ifdef FFI_MIPS_O32 - /* Set the flags necessary for O32 processing. FFI_O32_SOFT_FLOAT - * does not have special handling for floating point args. - */ - - if (cif->rtype->type != FFI_TYPE_STRUCT && cif->abi == FFI_O32) - { - if (cif->nargs > 0 && cif->nargs == nfixedargs) - { - switch ((cif->arg_types)[0]->type) - { - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - cif->flags += (cif->arg_types)[0]->type; - break; - - default: - break; - } - - if (cif->nargs > 1) - { - /* Only handle the second argument if the first - is a float or double. */ - if (cif->flags) - { - switch ((cif->arg_types)[1]->type) - { - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - cif->flags += (cif->arg_types)[1]->type << FFI_FLAG_BITS; - break; - - default: - break; - } - } - } - } - } - - /* Set the return type flag */ - - if (cif->abi == FFI_O32_SOFT_FLOAT) - { - switch (cif->rtype->type) - { - case FFI_TYPE_VOID: - case FFI_TYPE_STRUCT: - cif->flags += cif->rtype->type << (FFI_FLAG_BITS * 2); - break; - - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - case FFI_TYPE_DOUBLE: - cif->flags += FFI_TYPE_UINT64 << (FFI_FLAG_BITS * 2); - break; - - case FFI_TYPE_FLOAT: - default: - cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 2); - break; - } - } - else - { - /* FFI_O32 */ - switch (cif->rtype->type) - { - case FFI_TYPE_VOID: - case FFI_TYPE_STRUCT: - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - cif->flags += cif->rtype->type << (FFI_FLAG_BITS * 2); - break; - - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - cif->flags += FFI_TYPE_UINT64 << (FFI_FLAG_BITS * 2); - break; - - default: - cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 2); - break; - } - } -#endif - -#ifdef FFI_MIPS_N32 - /* Set the flags necessary for N32 processing */ - { - int type; - unsigned arg_reg = 0; - unsigned loc = 0; - unsigned count = (cif->nargs < 8) ? cif->nargs : 8; - unsigned index = 0; - - unsigned struct_flags = 0; - int soft_float = (cif->abi == FFI_N32_SOFT_FLOAT - || cif->abi == FFI_N64_SOFT_FLOAT); - - if (cif->rtype->type == FFI_TYPE_STRUCT) - { - struct_flags = calc_n32_return_struct_flags(soft_float, cif->rtype); - - if (struct_flags == 0) - { - /* This means that the structure is being passed as - a hidden argument */ - - arg_reg = 1; - count = (cif->nargs < 7) ? cif->nargs : 7; - - cif->rstruct_flag = !0; - } - else - cif->rstruct_flag = 0; - } - else - cif->rstruct_flag = 0; - - while (count-- > 0 && arg_reg < 8) - { - type = (cif->arg_types)[index]->type; - - // Pass variadic arguments in integer registers even if they're floats - if (soft_float || index >= nfixedargs) - { - switch (type) - { - case FFI_TYPE_FLOAT: - type = FFI_TYPE_UINT32; - break; - case FFI_TYPE_DOUBLE: - type = FFI_TYPE_UINT64; - break; - default: - break; - } - } - switch (type) - { - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - cif->flags += - ((cif->arg_types)[index]->type << (arg_reg * FFI_FLAG_BITS)); - arg_reg++; - break; - case FFI_TYPE_LONGDOUBLE: - /* Align it. */ - arg_reg = FFI_ALIGN(arg_reg, 2); - /* Treat it as two adjacent doubles. */ - if (soft_float || index >= nfixedargs) - { - arg_reg += 2; - } - else - { - cif->flags += - (FFI_TYPE_DOUBLE << (arg_reg * FFI_FLAG_BITS)); - arg_reg++; - cif->flags += - (FFI_TYPE_DOUBLE << (arg_reg * FFI_FLAG_BITS)); - arg_reg++; - } - break; - - case FFI_TYPE_STRUCT: - loc = arg_reg * FFI_SIZEOF_ARG; - cif->flags += calc_n32_struct_flags(soft_float || index >= nfixedargs, - (cif->arg_types)[index], - &loc, &arg_reg); - break; - - default: - arg_reg++; - break; - } - - index++; - } - - /* Set the return type flag */ - switch (cif->rtype->type) - { - case FFI_TYPE_STRUCT: - { - if (struct_flags == 0) - { - /* The structure is returned through a hidden - first argument. Do nothing, 'cause FFI_TYPE_VOID - is 0 */ - } - else - { - /* The structure is returned via some tricky - mechanism */ - cif->flags += FFI_TYPE_STRUCT << (FFI_FLAG_BITS * 8); - cif->flags += struct_flags << (4 + (FFI_FLAG_BITS * 8)); - } - break; - } - - case FFI_TYPE_VOID: - /* Do nothing, 'cause FFI_TYPE_VOID is 0 */ - break; - - case FFI_TYPE_POINTER: - if (cif->abi == FFI_N32_SOFT_FLOAT || cif->abi == FFI_N32) - cif->flags += FFI_TYPE_SINT32 << (FFI_FLAG_BITS * 8); - else - cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 8); - break; - - case FFI_TYPE_FLOAT: - if (soft_float) - { - cif->flags += FFI_TYPE_SINT32 << (FFI_FLAG_BITS * 8); - break; - } - /* else fall through */ - case FFI_TYPE_DOUBLE: - if (soft_float) - cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 8); - else - cif->flags += cif->rtype->type << (FFI_FLAG_BITS * 8); - break; - - case FFI_TYPE_LONGDOUBLE: - /* Long double is returned as if it were a struct containing - two doubles. */ - if (soft_float) - { - cif->flags += FFI_TYPE_STRUCT << (FFI_FLAG_BITS * 8); - cif->flags += FFI_TYPE_SMALLSTRUCT2 << (4 + (FFI_FLAG_BITS * 8)); - } - else - { - cif->flags += FFI_TYPE_STRUCT << (FFI_FLAG_BITS * 8); - cif->flags += (FFI_TYPE_DOUBLE - + (FFI_TYPE_DOUBLE << FFI_FLAG_BITS)) - << (4 + (FFI_FLAG_BITS * 8)); - } - break; - default: - cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 8); - break; - } - } -#endif - - return FFI_OK; -} - -ffi_status ffi_prep_cif_machdep(ffi_cif *cif) -{ - return ffi_prep_cif_machdep_int(cif, cif->nargs); -} - -ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif, - unsigned nfixedargs, - unsigned ntotalargs MAYBE_UNUSED) -{ - return ffi_prep_cif_machdep_int(cif, nfixedargs); -} - -/* Low level routine for calling O32 functions */ -extern int ffi_call_O32(void (*)(char *, extended_cif *, int, int), - extended_cif *, unsigned, - unsigned, unsigned *, void (*)(void), void *closure); - -/* Low level routine for calling N32 functions */ -extern int ffi_call_N32(void (*)(char *, extended_cif *, int, int), - extended_cif *, unsigned, - unsigned, void *, void (*)(void), void *closure); - -void ffi_call_int(ffi_cif *cif, void (*fn)(void), void *rvalue, - void **avalue, void *closure) -{ - extended_cif ecif; - - ecif.cif = cif; - ecif.avalue = avalue; - - /* If the return value is a struct and we don't have a return */ - /* value address then we need to make one */ - - if ((rvalue == NULL) && - (cif->rtype->type == FFI_TYPE_STRUCT)) - ecif.rvalue = alloca(cif->rtype->size); - else - ecif.rvalue = rvalue; - - switch (cif->abi) - { -#ifdef FFI_MIPS_O32 - case FFI_O32: - case FFI_O32_SOFT_FLOAT: - ffi_call_O32(ffi_prep_args, &ecif, cif->bytes, - cif->flags, ecif.rvalue, fn, closure); - break; -#endif - -#ifdef FFI_MIPS_N32 - case FFI_N32: - case FFI_N32_SOFT_FLOAT: - case FFI_N64: - case FFI_N64_SOFT_FLOAT: - { - int copy_rvalue = 0; - int copy_offset = 0; - char *rvalue_copy = ecif.rvalue; - if (cif->rtype->type == FFI_TYPE_STRUCT && cif->rtype->size < 16) - { - /* For structures smaller than 16 bytes we clobber memory - in 8 byte increments. Make a copy so we don't clobber - the callers memory outside of the struct bounds. */ - rvalue_copy = alloca(16); - copy_rvalue = 1; - } - else if (cif->rtype->type == FFI_TYPE_FLOAT - && (cif->abi == FFI_N64_SOFT_FLOAT - || cif->abi == FFI_N32_SOFT_FLOAT)) - { - rvalue_copy = alloca (8); - copy_rvalue = 1; -#if defined(__MIPSEB__) || defined(_MIPSEB) - copy_offset = 4; -#endif - } - ffi_call_N32(ffi_prep_args, &ecif, cif->bytes, - cif->flags, rvalue_copy, fn, closure); - if (copy_rvalue) - memcpy(ecif.rvalue, rvalue_copy + copy_offset, cif->rtype->size); - } - break; -#endif - - default: - FFI_ASSERT(0); - break; - } -} - -void -ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - ffi_call_int (cif, fn, rvalue, avalue, NULL); -} - -void -ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue, - void **avalue, void *closure) -{ - ffi_call_int (cif, fn, rvalue, avalue, closure); -} - - -#if FFI_CLOSURES -#if defined(FFI_MIPS_O32) -extern void ffi_closure_O32(void); -extern void ffi_go_closure_O32(void); -#else -extern void ffi_closure_N32(void); -extern void ffi_go_closure_N32(void); -#endif /* FFI_MIPS_O32 */ - -ffi_status -ffi_prep_closure_loc (ffi_closure *closure, - ffi_cif *cif, - void (*fun)(ffi_cif*,void*,void**,void*), - void *user_data, - void *codeloc) -{ - unsigned int *tramp = (unsigned int *) &closure->tramp[0]; - void * fn; - char *clear_location = (char *) codeloc; - -#if defined(FFI_MIPS_O32) - if (cif->abi != FFI_O32 && cif->abi != FFI_O32_SOFT_FLOAT) - return FFI_BAD_ABI; - fn = ffi_closure_O32; -#else -#if _MIPS_SIM ==_ABIN32 - if (cif->abi != FFI_N32 - && cif->abi != FFI_N32_SOFT_FLOAT) - return FFI_BAD_ABI; -#else - if (cif->abi != FFI_N64 - && cif->abi != FFI_N64_SOFT_FLOAT) - return FFI_BAD_ABI; -#endif - fn = ffi_closure_N32; -#endif /* FFI_MIPS_O32 */ - -#if defined(FFI_MIPS_O32) || (_MIPS_SIM ==_ABIN32) - /* lui $25,high(fn) */ - tramp[0] = 0x3c190000 | ((unsigned)fn >> 16); - /* ori $25,low(fn) */ - tramp[1] = 0x37390000 | ((unsigned)fn & 0xffff); - /* lui $12,high(codeloc) */ - tramp[2] = 0x3c0c0000 | ((unsigned)codeloc >> 16); - /* jr $25 */ -#if !defined(__mips_isa_rev) || (__mips_isa_rev<6) - tramp[3] = 0x03200008; -#else - tramp[3] = 0x03200009; -#endif - /* ori $12,low(codeloc) */ - tramp[4] = 0x358c0000 | ((unsigned)codeloc & 0xffff); -#else - /* N64 has a somewhat larger trampoline. */ - /* lui $25,high(fn) */ - tramp[0] = 0x3c190000 | ((unsigned long)fn >> 48); - /* lui $12,high(codeloc) */ - tramp[1] = 0x3c0c0000 | ((unsigned long)codeloc >> 48); - /* ori $25,mid-high(fn) */ - tramp[2] = 0x37390000 | (((unsigned long)fn >> 32 ) & 0xffff); - /* ori $12,mid-high(codeloc) */ - tramp[3] = 0x358c0000 | (((unsigned long)codeloc >> 32) & 0xffff); - /* dsll $25,$25,16 */ - tramp[4] = 0x0019cc38; - /* dsll $12,$12,16 */ - tramp[5] = 0x000c6438; - /* ori $25,mid-low(fn) */ - tramp[6] = 0x37390000 | (((unsigned long)fn >> 16 ) & 0xffff); - /* ori $12,mid-low(codeloc) */ - tramp[7] = 0x358c0000 | (((unsigned long)codeloc >> 16) & 0xffff); - /* dsll $25,$25,16 */ - tramp[8] = 0x0019cc38; - /* dsll $12,$12,16 */ - tramp[9] = 0x000c6438; - /* ori $25,low(fn) */ - tramp[10] = 0x37390000 | ((unsigned long)fn & 0xffff); - /* jr $25 */ -#if !defined(__mips_isa_rev) || (__mips_isa_rev<6) - tramp[11] = 0x03200008; -#else - tramp[11] = 0x03200009; -#endif - /* ori $12,low(codeloc) */ - tramp[12] = 0x358c0000 | ((unsigned long)codeloc & 0xffff); - -#endif - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - -#if !defined(__FreeBSD__) -#ifdef USE__BUILTIN___CLEAR_CACHE - __builtin___clear_cache(clear_location, clear_location + FFI_TRAMPOLINE_SIZE); -#else - cacheflush (clear_location, FFI_TRAMPOLINE_SIZE, ICACHE); -#endif -#endif /* ! __FreeBSD__ */ - return FFI_OK; -} - -/* - * Decodes the arguments to a function, which will be stored on the - * stack. AR is the pointer to the beginning of the integer arguments - * (and, depending upon the arguments, some floating-point arguments - * as well). FPR is a pointer to the area where floating point - * registers have been saved, if any. - * - * RVALUE is the location where the function return value will be - * stored. CLOSURE is the prepared closure to invoke. - * - * This function should only be called from assembly, which is in - * turn called from a trampoline. - * - * Returns the function return type. - * - * Based on the similar routine for sparc. - */ -int -ffi_closure_mips_inner_O32 (ffi_cif *cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, - void *rvalue, ffi_arg *ar, - double *fpr) -{ - void **avaluep; - ffi_arg *avalue; - ffi_type **arg_types; - int i, avn, argn, seen_int; - - avalue = alloca (cif->nargs * sizeof (ffi_arg)); - avaluep = alloca (cif->nargs * sizeof (ffi_arg)); - - seen_int = (cif->abi == FFI_O32_SOFT_FLOAT) || (cif->mips_nfixedargs != cif->nargs); - argn = 0; - - if ((cif->flags >> (FFI_FLAG_BITS * 2)) == FFI_TYPE_STRUCT) - { - rvalue = (void *)(uintptr_t)ar[0]; - argn = 1; - seen_int = 1; - } - - i = 0; - avn = cif->nargs; - arg_types = cif->arg_types; - - while (i < avn) - { - if (arg_types[i]->alignment == 8 && (argn & 0x1)) - argn++; - if (i < 2 && !seen_int && - (arg_types[i]->type == FFI_TYPE_FLOAT || - arg_types[i]->type == FFI_TYPE_DOUBLE || - arg_types[i]->type == FFI_TYPE_LONGDOUBLE)) - { -#if defined(__MIPSEB__) || defined(_MIPSEB) - if (arg_types[i]->type == FFI_TYPE_FLOAT) - avaluep[i] = ((char *) &fpr[i]) + sizeof (float); - else -#endif - avaluep[i] = (char *) &fpr[i]; - } - else - { - switch (arg_types[i]->type) - { - case FFI_TYPE_SINT8: - avaluep[i] = &avalue[i]; - *(SINT8 *) &avalue[i] = (SINT8) ar[argn]; - break; - - case FFI_TYPE_UINT8: - avaluep[i] = &avalue[i]; - *(UINT8 *) &avalue[i] = (UINT8) ar[argn]; - break; - - case FFI_TYPE_SINT16: - avaluep[i] = &avalue[i]; - *(SINT16 *) &avalue[i] = (SINT16) ar[argn]; - break; - - case FFI_TYPE_UINT16: - avaluep[i] = &avalue[i]; - *(UINT16 *) &avalue[i] = (UINT16) ar[argn]; - break; - - default: - avaluep[i] = (char *) &ar[argn]; - break; - } - seen_int = 1; - } - argn += FFI_ALIGN(arg_types[i]->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; - i++; - } - - /* Invoke the closure. */ - fun(cif, rvalue, avaluep, user_data); - - if (cif->abi == FFI_O32_SOFT_FLOAT) - { - switch (cif->rtype->type) - { - case FFI_TYPE_FLOAT: - return FFI_TYPE_INT; - case FFI_TYPE_DOUBLE: - return FFI_TYPE_UINT64; - default: - return cif->rtype->type; - } - } - else - { - return cif->rtype->type; - } -} - -#if defined(FFI_MIPS_N32) - -static void -copy_struct_N32(char *target, unsigned offset, ffi_abi abi, ffi_type *type, - int argn, unsigned arg_offset, ffi_arg *ar, - ffi_arg *fpr, int soft_float) -{ - ffi_type **elt_typep = type->elements; - while(*elt_typep) - { - ffi_type *elt_type = *elt_typep; - unsigned o; - char *tp; - char *argp; - char *fpp; - - o = FFI_ALIGN(offset, elt_type->alignment); - arg_offset += o - offset; - offset = o; - argn += arg_offset / sizeof(ffi_arg); - arg_offset = arg_offset % sizeof(ffi_arg); - - argp = (char *)(ar + argn); - fpp = (char *)(argn >= 8 ? ar + argn : fpr + argn); - - tp = target + offset; - - if (elt_type->type == FFI_TYPE_DOUBLE && !soft_float) - *(double *)tp = *(double *)fpp; - else - memcpy(tp, argp + arg_offset, elt_type->size); - - offset += elt_type->size; - arg_offset += elt_type->size; - elt_typep++; - argn += arg_offset / sizeof(ffi_arg); - arg_offset = arg_offset % sizeof(ffi_arg); - } -} - -/* - * Decodes the arguments to a function, which will be stored on the - * stack. AR is the pointer to the beginning of the integer - * arguments. FPR is a pointer to the area where floating point - * registers have been saved. - * - * RVALUE is the location where the function return value will be - * stored. CLOSURE is the prepared closure to invoke. - * - * This function should only be called from assembly, which is in - * turn called from a trampoline. - * - * Returns the function return flags. - * - */ -int -ffi_closure_mips_inner_N32 (ffi_cif *cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, - void *rvalue, ffi_arg *ar, - ffi_arg *fpr) -{ - void **avaluep; - ffi_arg *avalue; - ffi_type **arg_types; - int i, avn, argn; - int soft_float; - ffi_arg *argp; - - soft_float = cif->abi == FFI_N64_SOFT_FLOAT - || cif->abi == FFI_N32_SOFT_FLOAT; - avalue = alloca (cif->nargs * sizeof (ffi_arg)); - avaluep = alloca (cif->nargs * sizeof (ffi_arg)); - - argn = 0; - - if (cif->rstruct_flag) - { -#if _MIPS_SIM==_ABIN32 - rvalue = (void *)(UINT32)ar[0]; -#else /* N64 */ - rvalue = (void *)ar[0]; -#endif - argn = 1; - } - - i = 0; - avn = cif->nargs; - arg_types = cif->arg_types; - - while (i < avn) - { - if (arg_types[i]->type == FFI_TYPE_FLOAT - || arg_types[i]->type == FFI_TYPE_DOUBLE - || arg_types[i]->type == FFI_TYPE_LONGDOUBLE) - { - argp = (argn >= 8 || i >= cif->mips_nfixedargs || soft_float) ? ar + argn : fpr + argn; - if ((arg_types[i]->type == FFI_TYPE_LONGDOUBLE) && ((uintptr_t)argp & (arg_types[i]->alignment-1))) - { - argp=(ffi_arg*)FFI_ALIGN(argp,arg_types[i]->alignment); - argn++; - } -#if defined(__MIPSEB__) || defined(_MIPSEB) - if (arg_types[i]->type == FFI_TYPE_FLOAT && argn < 8) - avaluep[i] = ((char *) argp) + sizeof (float); - else -#endif - avaluep[i] = (char *) argp; - } - else - { - unsigned type = arg_types[i]->type; - - if (arg_types[i]->alignment > sizeof(ffi_arg)) - argn = FFI_ALIGN(argn, arg_types[i]->alignment / sizeof(ffi_arg)); - - argp = ar + argn; - - /* The size of a pointer depends on the ABI */ - if (type == FFI_TYPE_POINTER) - type = (cif->abi == FFI_N64 || cif->abi == FFI_N64_SOFT_FLOAT) - ? FFI_TYPE_SINT64 : FFI_TYPE_SINT32; - - if (soft_float && type == FFI_TYPE_FLOAT) - type = FFI_TYPE_UINT32; - - switch (type) - { - case FFI_TYPE_SINT8: - avaluep[i] = &avalue[i]; - *(SINT8 *) &avalue[i] = (SINT8) *argp; - break; - - case FFI_TYPE_UINT8: - avaluep[i] = &avalue[i]; - *(UINT8 *) &avalue[i] = (UINT8) *argp; - break; - - case FFI_TYPE_SINT16: - avaluep[i] = &avalue[i]; - *(SINT16 *) &avalue[i] = (SINT16) *argp; - break; - - case FFI_TYPE_UINT16: - avaluep[i] = &avalue[i]; - *(UINT16 *) &avalue[i] = (UINT16) *argp; - break; - - case FFI_TYPE_SINT32: - avaluep[i] = &avalue[i]; - *(SINT32 *) &avalue[i] = (SINT32) *argp; - break; - - case FFI_TYPE_UINT32: - avaluep[i] = &avalue[i]; - *(UINT32 *) &avalue[i] = (UINT32) *argp; - break; - - case FFI_TYPE_STRUCT: - if (argn < 8) - { - /* Allocate space for the struct as at least part of - it was passed in registers. */ - avaluep[i] = alloca(arg_types[i]->size); - copy_struct_N32(avaluep[i], 0, cif->abi, arg_types[i], - argn, 0, ar, fpr, i >= cif->mips_nfixedargs || soft_float); - - break; - } - /* Else fall through. */ - default: - avaluep[i] = (char *) argp; - break; - } - } - argn += FFI_ALIGN(arg_types[i]->size, sizeof(ffi_arg)) / sizeof(ffi_arg); - i++; - } - - /* Invoke the closure. */ - fun (cif, rvalue, avaluep, user_data); - - return cif->flags >> (FFI_FLAG_BITS * 8); -} - -#endif /* FFI_MIPS_N32 */ - -#if defined(FFI_MIPS_O32) -extern void ffi_closure_O32(void); -extern void ffi_go_closure_O32(void); -#else -extern void ffi_closure_N32(void); -extern void ffi_go_closure_N32(void); -#endif /* FFI_MIPS_O32 */ - -ffi_status -ffi_prep_go_closure (ffi_go_closure* closure, ffi_cif* cif, - void (*fun)(ffi_cif*,void*,void**,void*)) -{ - void * fn; - -#if defined(FFI_MIPS_O32) - if (cif->abi != FFI_O32 && cif->abi != FFI_O32_SOFT_FLOAT) - return FFI_BAD_ABI; - fn = ffi_go_closure_O32; -#else -#if _MIPS_SIM ==_ABIN32 - if (cif->abi != FFI_N32 - && cif->abi != FFI_N32_SOFT_FLOAT) - return FFI_BAD_ABI; -#else - if (cif->abi != FFI_N64 - && cif->abi != FFI_N64_SOFT_FLOAT) - return FFI_BAD_ABI; -#endif - fn = ffi_go_closure_N32; -#endif /* FFI_MIPS_O32 */ - - closure->tramp = (void *)fn; - closure->cif = cif; - closure->fun = fun; - - return FFI_OK; -} - -#endif /* FFI_CLOSURES */ diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/mips/ffitarget.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/mips/ffitarget.h deleted file mode 100644 index fdd5ca9..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/mips/ffitarget.h +++ /dev/null @@ -1,244 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - Copyright (c) 1996-2003 Red Hat, Inc. - Target configuration macros for MIPS. - - 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. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#ifdef __linux__ -# include -#elif defined(__rtems__) -/* - * Subprogram calling convention - copied from sgidefs.h - */ -#define _MIPS_SIM_ABI32 1 -#define _MIPS_SIM_NABI32 2 -#define _MIPS_SIM_ABI64 3 -#elif !defined(__OpenBSD__) && !defined(__FreeBSD__) -# include -#endif - -# ifndef _ABIN32 -# define _ABIN32 _MIPS_SIM_NABI32 -# endif -# ifndef _ABI64 -# define _ABI64 _MIPS_SIM_ABI64 -# endif -# ifndef _ABIO32 -# define _ABIO32 _MIPS_SIM_ABI32 -# endif - -#if !defined(_MIPS_SIM) -# error -- something is very wrong -- -#else -# if (_MIPS_SIM==_ABIN32 && defined(_ABIN32)) || (_MIPS_SIM==_ABI64 && defined(_ABI64)) -# define FFI_MIPS_N32 -# else -# if (_MIPS_SIM==_ABIO32 && defined(_ABIO32)) -# define FFI_MIPS_O32 -# else -# error -- this is an unsupported platform -- -# endif -# endif -#endif - -#ifdef FFI_MIPS_O32 -/* O32 stack frames have 32bit integer args */ -# define FFI_SIZEOF_ARG 4 -#else -/* N32 and N64 frames have 64bit integer args */ -# define FFI_SIZEOF_ARG 8 -# if _MIPS_SIM == _ABIN32 -# define FFI_SIZEOF_JAVA_RAW 4 -# endif -#endif - -#define FFI_FLAG_BITS 2 - -/* SGI's strange assembler requires that we multiply by 4 rather - than shift left by FFI_FLAG_BITS */ - -#define FFI_ARGS_D FFI_TYPE_DOUBLE -#define FFI_ARGS_F FFI_TYPE_FLOAT -#define FFI_ARGS_DD FFI_TYPE_DOUBLE * 4 + FFI_TYPE_DOUBLE -#define FFI_ARGS_FF FFI_TYPE_FLOAT * 4 + FFI_TYPE_FLOAT -#define FFI_ARGS_FD FFI_TYPE_DOUBLE * 4 + FFI_TYPE_FLOAT -#define FFI_ARGS_DF FFI_TYPE_FLOAT * 4 + FFI_TYPE_DOUBLE - -/* Needed for N32 structure returns */ -#define FFI_TYPE_SMALLSTRUCT FFI_TYPE_UINT8 -#define FFI_TYPE_SMALLSTRUCT2 FFI_TYPE_SINT8 - -#if 0 -/* The SGI assembler can't handle this.. */ -#define FFI_TYPE_STRUCT_DD (( FFI_ARGS_DD ) << 4) + FFI_TYPE_STRUCT -/* (and so on) */ -#else -/* ...so we calculate these by hand! */ -#define FFI_TYPE_STRUCT_D 61 -#define FFI_TYPE_STRUCT_F 45 -#define FFI_TYPE_STRUCT_DD 253 -#define FFI_TYPE_STRUCT_FF 173 -#define FFI_TYPE_STRUCT_FD 237 -#define FFI_TYPE_STRUCT_DF 189 -#define FFI_TYPE_STRUCT_SMALL 93 -#define FFI_TYPE_STRUCT_SMALL2 109 - -/* and for n32 soft float, add 16 * 2^4 */ -#define FFI_TYPE_STRUCT_D_SOFT 317 -#define FFI_TYPE_STRUCT_F_SOFT 301 -#define FFI_TYPE_STRUCT_DD_SOFT 509 -#define FFI_TYPE_STRUCT_FF_SOFT 429 -#define FFI_TYPE_STRUCT_FD_SOFT 493 -#define FFI_TYPE_STRUCT_DF_SOFT 445 -#define FFI_TYPE_STRUCT_SOFT 16 -#endif - -#ifdef LIBFFI_ASM -#define v0 $2 -#define v1 $3 -#define a0 $4 -#define a1 $5 -#define a2 $6 -#define a3 $7 -#define a4 $8 -#define a5 $9 -#define a6 $10 -#define a7 $11 -#define t0 $8 -#define t1 $9 -#define t2 $10 -#define t3 $11 -#define t4 $12 -#define t5 $13 -#define t6 $14 -#define t7 $15 -#define t8 $24 -#define t9 $25 -#define ra $31 - -#ifdef FFI_MIPS_O32 -# define REG_L lw -# define REG_S sw -# define SUBU subu -# define ADDU addu -# define SRL srl -# define LI li -#else /* !FFI_MIPS_O32 */ -# define REG_L ld -# define REG_S sd -# define SUBU dsubu -# define ADDU daddu -# define SRL dsrl -# define LI dli -# if (_MIPS_SIM==_ABI64) -# define LA dla -# define EH_FRAME_ALIGN 3 -# define FDE_ADDR_BYTES .8byte -# else -# define LA la -# define EH_FRAME_ALIGN 2 -# define FDE_ADDR_BYTES .4byte -# endif /* _MIPS_SIM==_ABI64 */ -#endif /* !FFI_MIPS_O32 */ -#else /* !LIBFFI_ASM */ -# ifdef __GNUC__ -# ifdef FFI_MIPS_O32 -/* O32 stack frames have 32bit integer args */ -typedef unsigned int ffi_arg __attribute__((__mode__(__SI__))); -typedef signed int ffi_sarg __attribute__((__mode__(__SI__))); -#else -/* N32 and N64 frames have 64bit integer args */ -typedef unsigned int ffi_arg __attribute__((__mode__(__DI__))); -typedef signed int ffi_sarg __attribute__((__mode__(__DI__))); -# endif -# else -# ifdef FFI_MIPS_O32 -/* O32 stack frames have 32bit integer args */ -typedef __uint32_t ffi_arg; -typedef __int32_t ffi_sarg; -# else -/* N32 and N64 frames have 64bit integer args */ -typedef __uint64_t ffi_arg; -typedef __int64_t ffi_sarg; -# endif -# endif /* __GNUC__ */ - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_O32, - FFI_N32, - FFI_N64, - FFI_O32_SOFT_FLOAT, - FFI_N32_SOFT_FLOAT, - FFI_N64_SOFT_FLOAT, - FFI_LAST_ABI, - -#ifdef FFI_MIPS_O32 -#ifdef __mips_soft_float - FFI_DEFAULT_ABI = FFI_O32_SOFT_FLOAT -#else - FFI_DEFAULT_ABI = FFI_O32 -#endif -#else -# if _MIPS_SIM==_ABI64 -# ifdef __mips_soft_float - FFI_DEFAULT_ABI = FFI_N64_SOFT_FLOAT -# else - FFI_DEFAULT_ABI = FFI_N64 -# endif -# else -# ifdef __mips_soft_float - FFI_DEFAULT_ABI = FFI_N32_SOFT_FLOAT -# else - FFI_DEFAULT_ABI = FFI_N32 -# endif -# endif -#endif -} ffi_abi; - -#define FFI_EXTRA_CIF_FIELDS unsigned rstruct_flag; unsigned mips_nfixedargs -#define FFI_TARGET_SPECIFIC_VARIADIC -#endif /* !LIBFFI_ASM */ - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_GO_CLOSURES 1 -#define FFI_NATIVE_RAW_API 0 - -#if defined(FFI_MIPS_O32) || (_MIPS_SIM ==_ABIN32) -# define FFI_TRAMPOLINE_SIZE 20 -#else -# define FFI_TRAMPOLINE_SIZE 56 -#endif - -#endif - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/mips/n32.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/mips/n32.S deleted file mode 100644 index 1a940b6..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/mips/n32.S +++ /dev/null @@ -1,663 +0,0 @@ -/* ----------------------------------------------------------------------- - n32.S - Copyright (c) 1996, 1998, 2005, 2007, 2009, 2010 Red Hat, Inc. - - MIPS Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include - -/* Only build this code if we are compiling for n32 */ - -#if defined(FFI_MIPS_N32) - -#define callback a0 -#define bytes a2 -#define flags a3 -#define raddr a4 -#define fn a5 -#define closure a6 - -/* Note: to keep stack 16 byte aligned we need even number slots - used 9 slots here -*/ -#define SIZEOF_FRAME ( 10 * FFI_SIZEOF_ARG ) - -#ifdef __GNUC__ - .abicalls -#endif -#if !defined(__mips_isa_rev) || (__mips_isa_rev<6) - .set mips4 -#endif - .text - .align 2 - .globl ffi_call_N32 - .ent ffi_call_N32 -ffi_call_N32: -.LFB0: - .frame $fp, SIZEOF_FRAME, ra - .mask 0xc0000000,-FFI_SIZEOF_ARG - .fmask 0x00000000,0 - - # Prologue - SUBU $sp, SIZEOF_FRAME # Frame size -.LCFI00: - REG_S $fp, SIZEOF_FRAME - 2*FFI_SIZEOF_ARG($sp) # Save frame pointer - REG_S ra, SIZEOF_FRAME - 1*FFI_SIZEOF_ARG($sp) # Save return address -.LCFI01: - move $fp, $sp -.LCFI02: - move t9, callback # callback function pointer - REG_S bytes, 2*FFI_SIZEOF_ARG($fp) # bytes - REG_S flags, 3*FFI_SIZEOF_ARG($fp) # flags - REG_S raddr, 4*FFI_SIZEOF_ARG($fp) # raddr - REG_S fn, 5*FFI_SIZEOF_ARG($fp) # fn - REG_S closure, 6*FFI_SIZEOF_ARG($fp) # closure - - # Allocate at least 4 words in the argstack - move v0, bytes - bge bytes, 4 * FFI_SIZEOF_ARG, bigger - LI v0, 4 * FFI_SIZEOF_ARG - b sixteen - - bigger: - ADDU t4, v0, 2 * FFI_SIZEOF_ARG -1 # make sure it is aligned - and v0, t4, -2 * FFI_SIZEOF_ARG # to a proper boundry. - -sixteen: - SUBU $sp, $sp, v0 # move the stack pointer to reflect the - # arg space - - move a0, $sp # 4 * FFI_SIZEOF_ARG - ADDU a3, $fp, 3 * FFI_SIZEOF_ARG - - # Call ffi_prep_args - jal t9 - - # Copy the stack pointer to t9 - move t9, $sp - - # Fix the stack if there are more than 8 64bit slots worth - # of arguments. - - # Load the number of bytes - REG_L t6, 2*FFI_SIZEOF_ARG($fp) - - # Is it bigger than 8 * FFI_SIZEOF_ARG? - daddiu t8, t6, -(8 * FFI_SIZEOF_ARG) - bltz t8, loadregs - - ADDU t9, t9, t8 - -loadregs: - - REG_L t6, 3*FFI_SIZEOF_ARG($fp) # load the flags word into t6. - -#ifdef __mips_soft_float - REG_L a0, 0*FFI_SIZEOF_ARG(t9) - REG_L a1, 1*FFI_SIZEOF_ARG(t9) - REG_L a2, 2*FFI_SIZEOF_ARG(t9) - REG_L a3, 3*FFI_SIZEOF_ARG(t9) - REG_L a4, 4*FFI_SIZEOF_ARG(t9) - REG_L a5, 5*FFI_SIZEOF_ARG(t9) - REG_L a6, 6*FFI_SIZEOF_ARG(t9) - REG_L a7, 7*FFI_SIZEOF_ARG(t9) -#else - and t4, t6, ((1< -#include - -/* Only build this code if we are compiling for o32 */ - -#if defined(FFI_MIPS_O32) - -#define callback a0 -#define bytes a2 -#define flags a3 - -#define SIZEOF_FRAME (4 * FFI_SIZEOF_ARG + 2 * FFI_SIZEOF_ARG) -#define A3_OFF (SIZEOF_FRAME + 3 * FFI_SIZEOF_ARG) -#define FP_OFF (SIZEOF_FRAME - 2 * FFI_SIZEOF_ARG) -#define RA_OFF (SIZEOF_FRAME - 1 * FFI_SIZEOF_ARG) - - .abicalls - .text - .align 2 - .globl ffi_call_O32 - .ent ffi_call_O32 -ffi_call_O32: -$LFB0: - # Prologue - SUBU $sp, SIZEOF_FRAME # Frame size -$LCFI00: - REG_S $fp, FP_OFF($sp) # Save frame pointer -$LCFI01: - REG_S ra, RA_OFF($sp) # Save return address -$LCFI02: - move $fp, $sp - -$LCFI03: - move t9, callback # callback function pointer - REG_S flags, A3_OFF($fp) # flags - - # Allocate at least 4 words in the argstack - LI v0, 4 * FFI_SIZEOF_ARG - blt bytes, v0, sixteen - - ADDU v0, bytes, 7 # make sure it is aligned - and v0, -8 # to an 8 byte boundry - -sixteen: - SUBU $sp, v0 # move the stack pointer to reflect the - # arg space - - ADDU a0, $sp, 4 * FFI_SIZEOF_ARG - - jalr t9 - - REG_L t0, A3_OFF($fp) # load the flags word - SRL t2, t0, 4 # shift our arg info - and t0, ((1<<4)-1) # mask out the return type - - ADDU $sp, 4 * FFI_SIZEOF_ARG # adjust $sp to new args - -#ifndef __mips_soft_float - bnez t0, pass_d # make it quick for int -#endif - REG_L a0, 0*FFI_SIZEOF_ARG($sp) # just go ahead and load the - REG_L a1, 1*FFI_SIZEOF_ARG($sp) # four regs. - REG_L a2, 2*FFI_SIZEOF_ARG($sp) - REG_L a3, 3*FFI_SIZEOF_ARG($sp) - b call_it - -#ifndef __mips_soft_float -pass_d: - bne t0, FFI_ARGS_D, pass_f - l.d $f12, 0*FFI_SIZEOF_ARG($sp) # load $fp regs from args - REG_L a2, 2*FFI_SIZEOF_ARG($sp) # passing a double - REG_L a3, 3*FFI_SIZEOF_ARG($sp) - b call_it - -pass_f: - bne t0, FFI_ARGS_F, pass_d_d - l.s $f12, 0*FFI_SIZEOF_ARG($sp) # load $fp regs from args - REG_L a1, 1*FFI_SIZEOF_ARG($sp) # passing a float - REG_L a2, 2*FFI_SIZEOF_ARG($sp) - REG_L a3, 3*FFI_SIZEOF_ARG($sp) - b call_it - -pass_d_d: - bne t0, FFI_ARGS_DD, pass_f_f - l.d $f12, 0*FFI_SIZEOF_ARG($sp) # load $fp regs from args - l.d $f14, 2*FFI_SIZEOF_ARG($sp) # passing two doubles - b call_it - -pass_f_f: - bne t0, FFI_ARGS_FF, pass_d_f - l.s $f12, 0*FFI_SIZEOF_ARG($sp) # load $fp regs from args - l.s $f14, 1*FFI_SIZEOF_ARG($sp) # passing two floats - REG_L a2, 2*FFI_SIZEOF_ARG($sp) - REG_L a3, 3*FFI_SIZEOF_ARG($sp) - b call_it - -pass_d_f: - bne t0, FFI_ARGS_DF, pass_f_d - l.d $f12, 0*FFI_SIZEOF_ARG($sp) # load $fp regs from args - l.s $f14, 2*FFI_SIZEOF_ARG($sp) # passing double and float - REG_L a3, 3*FFI_SIZEOF_ARG($sp) - b call_it - -pass_f_d: - # assume that the only other combination must be float then double - # bne t0, FFI_ARGS_F_D, call_it - l.s $f12, 0*FFI_SIZEOF_ARG($sp) # load $fp regs from args - l.d $f14, 2*FFI_SIZEOF_ARG($sp) # passing double and float -#endif - -call_it: - # Load the static chain pointer - REG_L t7, SIZEOF_FRAME + 6*FFI_SIZEOF_ARG($fp) - - # Load the function pointer - REG_L t9, SIZEOF_FRAME + 5*FFI_SIZEOF_ARG($fp) - - # If the return value pointer is NULL, assume no return value. - REG_L t1, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp) - beqz t1, noretval - - bne t2, FFI_TYPE_INT, retlonglong - jalr t9 - REG_L t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp) - REG_S v0, 0(t0) - b epilogue - -retlonglong: - # Really any 64-bit int, signed or not. - bne t2, FFI_TYPE_UINT64, retfloat - jalr t9 - REG_L t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp) - REG_S v1, 4(t0) - REG_S v0, 0(t0) - b epilogue - -retfloat: - bne t2, FFI_TYPE_FLOAT, retdouble - jalr t9 - REG_L t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp) -#ifndef __mips_soft_float - s.s $f0, 0(t0) -#else - REG_S v0, 0(t0) -#endif - b epilogue - -retdouble: - bne t2, FFI_TYPE_DOUBLE, noretval - jalr t9 - REG_L t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp) -#ifndef __mips_soft_float - s.d $f0, 0(t0) -#else - REG_S v1, 4(t0) - REG_S v0, 0(t0) -#endif - b epilogue - -noretval: - jalr t9 - - # Epilogue -epilogue: - move $sp, $fp - REG_L $fp, FP_OFF($sp) # Restore frame pointer - REG_L ra, RA_OFF($sp) # Restore return address - ADDU $sp, SIZEOF_FRAME # Fix stack pointer - j ra - -$LFE0: - .end ffi_call_O32 - - -/* ffi_closure_O32. Expects address of the passed-in ffi_closure - in t4 ($12). Stores any arguments passed in registers onto the - stack, then calls ffi_closure_mips_inner_O32, which - then decodes them. - - Stack layout: - - 3 - a3 save - 2 - a2 save - 1 - a1 save - 0 - a0 save, original sp - -1 - ra save - -2 - fp save - -3 - $16 (s0) save - -4 - cprestore - -5 - return value high (v1) - -6 - return value low (v0) - -7 - f14 (le high, be low) - -8 - f14 (le low, be high) - -9 - f12 (le high, be low) - -10 - f12 (le low, be high) - -11 - Called function a5 save - -12 - Called function a4 save - -13 - Called function a3 save - -14 - Called function a2 save - -15 - Called function a1 save - -16 - Called function a0 save, our sp and fp point here - */ - -#define SIZEOF_FRAME2 (16 * FFI_SIZEOF_ARG) -#define A3_OFF2 (SIZEOF_FRAME2 + 3 * FFI_SIZEOF_ARG) -#define A2_OFF2 (SIZEOF_FRAME2 + 2 * FFI_SIZEOF_ARG) -#define A1_OFF2 (SIZEOF_FRAME2 + 1 * FFI_SIZEOF_ARG) -#define A0_OFF2 (SIZEOF_FRAME2 + 0 * FFI_SIZEOF_ARG) -#define RA_OFF2 (SIZEOF_FRAME2 - 1 * FFI_SIZEOF_ARG) -#define FP_OFF2 (SIZEOF_FRAME2 - 2 * FFI_SIZEOF_ARG) -#define S0_OFF2 (SIZEOF_FRAME2 - 3 * FFI_SIZEOF_ARG) -#define GP_OFF2 (SIZEOF_FRAME2 - 4 * FFI_SIZEOF_ARG) -#define V1_OFF2 (SIZEOF_FRAME2 - 5 * FFI_SIZEOF_ARG) -#define V0_OFF2 (SIZEOF_FRAME2 - 6 * FFI_SIZEOF_ARG) -#define FA_1_1_OFF2 (SIZEOF_FRAME2 - 7 * FFI_SIZEOF_ARG) -#define FA_1_0_OFF2 (SIZEOF_FRAME2 - 8 * FFI_SIZEOF_ARG) -#define FA_0_1_OFF2 (SIZEOF_FRAME2 - 9 * FFI_SIZEOF_ARG) -#define FA_0_0_OFF2 (SIZEOF_FRAME2 - 10 * FFI_SIZEOF_ARG) -#define CALLED_A5_OFF2 (SIZEOF_FRAME2 - 11 * FFI_SIZEOF_ARG) -#define CALLED_A4_OFF2 (SIZEOF_FRAME2 - 12 * FFI_SIZEOF_ARG) - - .text - - .align 2 - .globl ffi_go_closure_O32 - .ent ffi_go_closure_O32 -ffi_go_closure_O32: -$LFB1: - # Prologue - .frame $fp, SIZEOF_FRAME2, ra - .set noreorder - .cpload t9 - .set reorder - SUBU $sp, SIZEOF_FRAME2 - .cprestore GP_OFF2 -$LCFI10: - - REG_S $16, S0_OFF2($sp) # Save s0 - REG_S $fp, FP_OFF2($sp) # Save frame pointer - REG_S ra, RA_OFF2($sp) # Save return address -$LCFI11: - - move $fp, $sp -$LCFI12: - - REG_S a0, A0_OFF2($fp) - REG_S a1, A1_OFF2($fp) - REG_S a2, A2_OFF2($fp) - REG_S a3, A3_OFF2($fp) - - # Load ABI enum to s0 - REG_L $16, 4($15) # cif - REG_L $16, 0($16) # abi is first member. - - li $13, 1 # FFI_O32 - bne $16, $13, 1f # Skip fp save if FFI_O32_SOFT_FLOAT - -#ifndef __mips_soft_float - # Store all possible float/double registers. - s.d $f12, FA_0_0_OFF2($fp) - s.d $f14, FA_1_0_OFF2($fp) -#endif -1: - # prepare arguments for ffi_closure_mips_inner_O32 - REG_L a0, 4($15) # cif - REG_L a1, 8($15) # fun - move a2, $15 # user_data = go closure - addu a3, $fp, V0_OFF2 # rvalue - - addu t9, $fp, A0_OFF2 # ar - REG_S t9, CALLED_A4_OFF2($fp) - - addu t9, $fp, FA_0_0_OFF2 #fpr - REG_S t9, CALLED_A5_OFF2($fp) - - b $do_closure - -$LFE1: - .end ffi_go_closure_O32 - - .align 2 - .globl ffi_closure_O32 - .ent ffi_closure_O32 -ffi_closure_O32: -$LFB2: - # Prologue - .frame $fp, SIZEOF_FRAME2, ra - .set noreorder - .cpload t9 - .set reorder - SUBU $sp, SIZEOF_FRAME2 - .cprestore GP_OFF2 -$LCFI20: - REG_S $16, S0_OFF2($sp) # Save s0 - REG_S $fp, FP_OFF2($sp) # Save frame pointer - REG_S ra, RA_OFF2($sp) # Save return address -$LCFI21: - move $fp, $sp - -$LCFI22: - # Store all possible argument registers. If there are more than - # four arguments, then they are stored above where we put a3. - REG_S a0, A0_OFF2($fp) - REG_S a1, A1_OFF2($fp) - REG_S a2, A2_OFF2($fp) - REG_S a3, A3_OFF2($fp) - - # Load ABI enum to s0 - REG_L $16, 20($12) # cif pointer follows tramp. - REG_L $16, 0($16) # abi is first member. - - li $13, 1 # FFI_O32 - bne $16, $13, 1f # Skip fp save if FFI_O32_SOFT_FLOAT - -#ifndef __mips_soft_float - # Store all possible float/double registers. - s.d $f12, FA_0_0_OFF2($fp) - s.d $f14, FA_1_0_OFF2($fp) -#endif -1: - # prepare arguments for ffi_closure_mips_inner_O32 - REG_L a0, 20($12) # cif pointer follows tramp. - REG_L a1, 24($12) # fun - REG_L a2, 28($12) # user_data - addu a3, $fp, V0_OFF2 # rvalue - - addu t9, $fp, A0_OFF2 # ar - REG_S t9, CALLED_A4_OFF2($fp) - - addu t9, $fp, FA_0_0_OFF2 #fpr - REG_S t9, CALLED_A5_OFF2($fp) - -$do_closure: - la t9, ffi_closure_mips_inner_O32 - # Call ffi_closure_mips_inner_O32 to do the work. - jalr t9 - - # Load the return value into the appropriate register. - move $8, $2 - li $9, FFI_TYPE_VOID - beq $8, $9, closure_done - - li $13, 1 # FFI_O32 - bne $16, $13, 1f # Skip fp restore if FFI_O32_SOFT_FLOAT - -#ifndef __mips_soft_float - li $9, FFI_TYPE_FLOAT - l.s $f0, V0_OFF2($fp) - beq $8, $9, closure_done - - li $9, FFI_TYPE_DOUBLE - l.d $f0, V0_OFF2($fp) - beq $8, $9, closure_done -#endif -1: - REG_L $3, V1_OFF2($fp) - REG_L $2, V0_OFF2($fp) - -closure_done: - # Epilogue - move $sp, $fp - REG_L $16, S0_OFF2($sp) # Restore s0 - REG_L $fp, FP_OFF2($sp) # Restore frame pointer - REG_L ra, RA_OFF2($sp) # Restore return address - ADDU $sp, SIZEOF_FRAME2 - j ra -$LFE2: - .end ffi_closure_O32 - -/* DWARF-2 unwind info. */ - - .section .eh_frame,"a",@progbits -$Lframe0: - .4byte $LECIE0-$LSCIE0 # Length of Common Information Entry -$LSCIE0: - .4byte 0x0 # CIE Identifier Tag - .byte 0x1 # CIE Version - .ascii "zR\0" # CIE Augmentation - .uleb128 0x1 # CIE Code Alignment Factor - .sleb128 4 # CIE Data Alignment Factor - .byte 0x1f # CIE RA Column - .uleb128 0x1 # Augmentation size - .byte 0x00 # FDE Encoding (absptr) - .byte 0xc # DW_CFA_def_cfa - .uleb128 0x1d - .uleb128 0x0 - .align 2 -$LECIE0: - -$LSFDE0: - .4byte $LEFDE0-$LASFDE0 # FDE Length -$LASFDE0: - .4byte $LASFDE0-$Lframe0 # FDE CIE offset - .4byte $LFB0 # FDE initial location - .4byte $LFE0-$LFB0 # FDE address range - .uleb128 0x0 # Augmentation size - .byte 0x4 # DW_CFA_advance_loc4 - .4byte $LCFI00-$LFB0 - .byte 0xe # DW_CFA_def_cfa_offset - .uleb128 0x18 - .byte 0x4 # DW_CFA_advance_loc4 - .4byte $LCFI01-$LCFI00 - .byte 0x11 # DW_CFA_offset_extended_sf - .uleb128 0x1e # $fp - .sleb128 -2 # SIZEOF_FRAME2 - 2*FFI_SIZEOF_ARG($sp) - .byte 0x11 # DW_CFA_offset_extended_sf - .uleb128 0x1f # $ra - .sleb128 -1 # SIZEOF_FRAME2 - 1*FFI_SIZEOF_ARG($sp) - .byte 0x4 # DW_CFA_advance_loc4 - .4byte $LCFI02-$LCFI01 - .byte 0xc # DW_CFA_def_cfa - .uleb128 0x1e - .uleb128 0x18 - .align 2 -$LEFDE0: - -$LSFDE1: - .4byte $LEFDE1-$LASFDE1 # FDE Length -$LASFDE1: - .4byte $LASFDE1-$Lframe0 # FDE CIE offset - .4byte $LFB1 # FDE initial location - .4byte $LFE1-$LFB1 # FDE address range - .uleb128 0x0 # Augmentation size - .byte 0x4 # DW_CFA_advance_loc4 - .4byte $LCFI10-$LFB1 - .byte 0xe # DW_CFA_def_cfa_offset - .uleb128 SIZEOF_FRAME2 - .byte 0x4 # DW_CFA_advance_loc4 - .4byte $LCFI11-$LCFI10 - .byte 0x11 # DW_CFA_offset_extended_sf - .uleb128 0x10 # $16 - .sleb128 -3 # SIZEOF_FRAME2 - 3*FFI_SIZEOF_ARG($sp) - .byte 0x11 # DW_CFA_offset_extended_sf - .uleb128 0x1e # $fp - .sleb128 -2 # SIZEOF_FRAME2 - 2*FFI_SIZEOF_ARG($sp) - .byte 0x11 # DW_CFA_offset_extended_sf - .uleb128 0x1f # $ra - .sleb128 -1 # SIZEOF_FRAME2 - 1*FFI_SIZEOF_ARG($sp) - .byte 0x4 # DW_CFA_advance_loc4 - .4byte $LCFI12-$LCFI11 - .byte 0xc # DW_CFA_def_cfa - .uleb128 0x1e - .uleb128 SIZEOF_FRAME2 - .align 2 -$LEFDE1: - -$LSFDE2: - .4byte $LEFDE2-$LASFDE2 # FDE Length -$LASFDE2: - .4byte $LASFDE2-$Lframe0 # FDE CIE offset - .4byte $LFB2 # FDE initial location - .4byte $LFE2-$LFB2 # FDE address range - .uleb128 0x0 # Augmentation size - .byte 0x4 # DW_CFA_advance_loc4 - .4byte $LCFI20-$LFB2 - .byte 0xe # DW_CFA_def_cfa_offset - .uleb128 SIZEOF_FRAME2 - .byte 0x4 # DW_CFA_advance_loc4 - .4byte $LCFI21-$LCFI20 - .byte 0x11 # DW_CFA_offset_extended_sf - .uleb128 0x10 # $16 - .sleb128 -3 # SIZEOF_FRAME2 - 3*FFI_SIZEOF_ARG($sp) - .byte 0x11 # DW_CFA_offset_extended_sf - .uleb128 0x1e # $fp - .sleb128 -2 # SIZEOF_FRAME2 - 2*FFI_SIZEOF_ARG($sp) - .byte 0x11 # DW_CFA_offset_extended_sf - .uleb128 0x1f # $ra - .sleb128 -1 # SIZEOF_FRAME2 - 1*FFI_SIZEOF_ARG($sp) - .byte 0x4 # DW_CFA_advance_loc4 - .4byte $LCFI22-$LCFI21 - .byte 0xc # DW_CFA_def_cfa - .uleb128 0x1e - .uleb128 SIZEOF_FRAME2 - .align 2 -$LEFDE2: - -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/moxie/eabi.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/moxie/eabi.S deleted file mode 100644 index 10cfb04..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/moxie/eabi.S +++ /dev/null @@ -1,101 +0,0 @@ -/* ----------------------------------------------------------------------- - eabi.S - Copyright (c) 2012, 2013 Anthony Green - - Moxie Assembly glue. - - 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 AUTHOR 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. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include - - .globl ffi_prep_args_EABI - - .text - .p2align 4 - .globl ffi_call_EABI - .type ffi_call_EABI, @function - - # $r0 : ffi_prep_args - # $r1 : &ecif - # $r2 : cif->bytes - # $r3 : fig->flags - # $r4 : ecif.rvalue - # $r5 : fn - -ffi_call_EABI: - push $sp, $r6 - push $sp, $r7 - push $sp, $r8 - dec $sp, 24 - - /* Store incoming args on stack. */ - sto.l 0($sp), $r0 /* ffi_prep_args */ - sto.l 4($sp), $r1 /* ecif */ - sto.l 8($sp), $r2 /* bytes */ - sto.l 12($sp), $r3 /* flags */ - sto.l 16($sp), $r4 /* &rvalue */ - sto.l 20($sp), $r5 /* fn */ - - /* Call ffi_prep_args. */ - mov $r6, $r4 /* Save result buffer */ - mov $r7, $r5 /* Save the target fn */ - mov $r8, $r3 /* Save the flags */ - sub $sp, $r2 /* Allocate stack space */ - mov $r0, $sp /* We can stomp over $r0 */ - /* $r1 is already set up */ - jsra ffi_prep_args - - /* Load register arguments. */ - ldo.l $r0, 0($sp) - ldo.l $r1, 4($sp) - ldo.l $r2, 8($sp) - ldo.l $r3, 12($sp) - ldo.l $r4, 16($sp) - ldo.l $r5, 20($sp) - - /* Call the target function. */ - jsr $r7 - - ldi.l $r7, 0xffffffff - cmp $r8, $r7 - beq retstruct - - ldi.l $r7, 4 - cmp $r8, $r7 - bgt ret2reg - - st.l ($r6), $r0 - jmpa retdone - -ret2reg: - st.l ($r6), $r0 - sto.l 4($r6), $r1 - -retstruct: -retdone: - /* Return. */ - ldo.l $r6, -4($fp) - ldo.l $r7, -8($fp) - ldo.l $r8, -12($fp) - ret - .size ffi_call_EABI, .-ffi_call_EABI - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/moxie/ffi.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/moxie/ffi.c deleted file mode 100644 index 16d2bb3..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/moxie/ffi.c +++ /dev/null @@ -1,285 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (C) 2012, 2013, 2018 Anthony Green - - Moxie Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#include -#include - -#include - -/* ffi_prep_args is called by the assembly routine once stack space - has been allocated for the function's arguments */ - -void *ffi_prep_args(char *stack, extended_cif *ecif) -{ - register unsigned int i; - register void **p_argv; - register char *argp; - register ffi_type **p_arg; - register int count = 0; - - p_argv = ecif->avalue; - argp = stack; - - if (ecif->cif->rtype->type == FFI_TYPE_STRUCT) - { - *(void **) argp = ecif->rvalue; - argp += 4; - } - - for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; - (i != 0); - i--, p_arg++) - { - size_t z; - - z = (*p_arg)->size; - - if ((*p_arg)->type == FFI_TYPE_STRUCT) - { - z = sizeof(void*); - *(void **) argp = *p_argv; - } - else if (z < sizeof(int)) - { - z = sizeof(int); - switch ((*p_arg)->type) - { - case FFI_TYPE_SINT8: - *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); - break; - - case FFI_TYPE_UINT8: - *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); - break; - - case FFI_TYPE_SINT16: - *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); - break; - - case FFI_TYPE_UINT16: - *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); - break; - - default: - FFI_ASSERT(0); - } - } - else if (z == sizeof(int)) - { - *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); - } - else - { - memcpy(argp, *p_argv, z); - } - p_argv++; - argp += z; - count += z; - } - - return (stack + ((count > 24) ? 24 : FFI_ALIGN_DOWN(count, 8))); -} - -/* Perform machine dependent cif processing */ -ffi_status ffi_prep_cif_machdep(ffi_cif *cif) -{ - if (cif->rtype->type == FFI_TYPE_STRUCT) - cif->flags = -1; - else - cif->flags = cif->rtype->size; - - cif->bytes = FFI_ALIGN (cif->bytes, 8); - - return FFI_OK; -} - -extern void ffi_call_EABI(void *(*)(char *, extended_cif *), - extended_cif *, - unsigned, unsigned, - unsigned *, - void (*fn)(void)); - -void ffi_call(ffi_cif *cif, - void (*fn)(void), - void *rvalue, - void **avalue) -{ - extended_cif ecif; - - ecif.cif = cif; - ecif.avalue = avalue; - - /* If the return value is a struct and we don't have a return */ - /* value address then we need to make one */ - - if ((rvalue == NULL) && - (cif->rtype->type == FFI_TYPE_STRUCT)) - { - ecif.rvalue = alloca(cif->rtype->size); - } - else - ecif.rvalue = rvalue; - - switch (cif->abi) - { - case FFI_EABI: - ffi_call_EABI(ffi_prep_args, &ecif, cif->bytes, - cif->flags, ecif.rvalue, fn); - break; - default: - FFI_ASSERT(0); - break; - } -} - -void ffi_closure_eabi (unsigned arg1, unsigned arg2, unsigned arg3, - unsigned arg4, unsigned arg5, unsigned arg6) -{ - /* This function is called by a trampoline. The trampoline stows a - pointer to the ffi_closure object in $r12. We must save this - pointer in a place that will persist while we do our work. */ - register ffi_closure *creg __asm__ ("$r12"); - ffi_closure *closure = creg; - - /* Arguments that don't fit in registers are found on the stack - at a fixed offset above the current frame pointer. */ - register char *frame_pointer __asm__ ("$fp"); - - /* Pointer to a struct return value. */ - void *struct_rvalue = (void *) arg1; - - /* 6 words reserved for register args + 3 words from jsr */ - char *stack_args = frame_pointer + 9*4; - - /* Lay the register arguments down in a continuous chunk of memory. */ - unsigned register_args[6] = - { arg1, arg2, arg3, arg4, arg5, arg6 }; - char *register_args_ptr = (char *) register_args; - - ffi_cif *cif = closure->cif; - ffi_type **arg_types = cif->arg_types; - void **avalue = alloca (cif->nargs * sizeof(void *)); - char *ptr = (char *) register_args; - int i; - - /* preserve struct type return pointer passing */ - if ((cif->rtype != NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) { - ptr += 4; - register_args_ptr = (char *)®ister_args[1]; - } - - /* Find the address of each argument. */ - for (i = 0; i < cif->nargs; i++) - { - switch (arg_types[i]->type) - { - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: - avalue[i] = ptr + 3; - break; - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: - avalue[i] = ptr + 2; - break; - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - case FFI_TYPE_FLOAT: - case FFI_TYPE_POINTER: - avalue[i] = ptr; - break; - case FFI_TYPE_STRUCT: - avalue[i] = *(void**)ptr; - break; - default: - /* This is an 8-byte value. */ - if (ptr == (char *) ®ister_args[5]) - { - /* The value is split across two locations */ - unsigned *ip = alloca(8); - avalue[i] = ip; - ip[0] = *(unsigned *) ptr; - ip[1] = *(unsigned *) stack_args; - } - else - { - avalue[i] = ptr; - } - ptr += 4; - break; - } - ptr += 4; - - /* If we've handled more arguments than fit in registers, - start looking at the those passed on the stack. */ - if (ptr == (char *) ®ister_args[6]) - ptr = stack_args; - else if (ptr == (char *) ®ister_args[7]) - ptr = stack_args + 4; - } - - /* Invoke the closure. */ - if (cif->rtype && (cif->rtype->type == FFI_TYPE_STRUCT)) - { - (closure->fun) (cif, struct_rvalue, avalue, closure->user_data); - } - else - { - /* Allocate space for the return value and call the function. */ - long long rvalue; - (closure->fun) (cif, &rvalue, avalue, closure->user_data); - asm ("mov $r12, %0\n ld.l $r0, ($r12)\n ldo.l $r1, 4($r12)" : : "r" (&rvalue)); - } -} - -ffi_status -ffi_prep_closure_loc (ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, - void *codeloc) -{ - unsigned short *tramp = (unsigned short *) &closure->tramp[0]; - unsigned long fn = (long) ffi_closure_eabi; - unsigned long cls = (long) codeloc; - - if (cif->abi != FFI_EABI) - return FFI_BAD_ABI; - - fn = (unsigned long) ffi_closure_eabi; - - tramp[0] = 0x01e0; /* ldi.l $r12, .... */ - tramp[1] = cls >> 16; - tramp[2] = cls & 0xffff; - tramp[3] = 0x1a00; /* jmpa .... */ - tramp[4] = fn >> 16; - tramp[5] = fn & 0xffff; - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - return FFI_OK; -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/moxie/ffitarget.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/moxie/ffitarget.h deleted file mode 100644 index 623e3ec..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/moxie/ffitarget.h +++ /dev/null @@ -1,52 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012, 2013 Anthony Green - Target configuration macros for Moxie - - 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. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -/* ---- System specific configurations ----------------------------------- */ - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_EABI, - FFI_DEFAULT_ABI = FFI_EABI, - FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 -} ffi_abi; -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_NATIVE_RAW_API 0 - -/* Trampolines are 12-bytes long. See ffi_prep_closure_loc. */ -#define FFI_TRAMPOLINE_SIZE (12) - -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/nios2/ffi.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/nios2/ffi.c deleted file mode 100644 index 721080d..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/nios2/ffi.c +++ /dev/null @@ -1,304 +0,0 @@ -/* libffi support for Altera Nios II. - - Copyright (c) 2013 Mentor Graphics. - - 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. */ - - -#include -#include - -#include - -/* The Nios II Processor Reference Handbook defines the procedure call - ABI as follows. - - Arguments are passed as if a structure containing the types of - the arguments were constructed. The first 16 bytes are passed in r4 - through r7, the remainder on the stack. The first 16 bytes of a function - taking variable arguments are passed in r4-r7 in the same way. - - Return values of types up to 8 bytes are returned in r2 and r3. For - return values greater than 8 bytes, the caller must allocate memory for - the result and pass the address as if it were argument 0. - - While this isn't specified explicitly in the ABI documentation, GCC - promotes integral arguments smaller than int size to 32 bits. - - Also of note, the ABI specifies that all structure objects are - aligned to 32 bits even if all their fields have a smaller natural - alignment. See FFI_AGGREGATE_ALIGNMENT. */ - - -/* Declare the assembly language hooks. */ - -extern UINT64 ffi_call_sysv (void (*) (char *, extended_cif *), - extended_cif *, - unsigned, - void (*fn) (void)); -extern void ffi_closure_sysv (void); - -/* Perform machine-dependent cif processing. */ - -ffi_status ffi_prep_cif_machdep (ffi_cif *cif) -{ - /* We always want at least 16 bytes in the parameter block since it - simplifies the low-level call function. Also round the parameter - block size up to a multiple of 4 bytes to preserve - 32-bit alignment of the stack pointer. */ - if (cif->bytes < 16) - cif->bytes = 16; - else - cif->bytes = (cif->bytes + 3) & ~3; - - return FFI_OK; -} - - -/* ffi_prep_args is called by the assembly routine to transfer arguments - to the stack using the pointers in the ecif array. - Note that the stack buffer is big enough to fit all the arguments, - but the first 16 bytes will be copied to registers for the actual - call. */ - -void ffi_prep_args (char *stack, extended_cif *ecif) -{ - char *argp = stack; - unsigned int i; - - /* The implicit return value pointer is passed as if it were a hidden - first argument. */ - if (ecif->cif->rtype->type == FFI_TYPE_STRUCT - && ecif->cif->rtype->size > 8) - { - (*(void **) argp) = ecif->rvalue; - argp += 4; - } - - for (i = 0; i < ecif->cif->nargs; i++) - { - void *avalue = ecif->avalue[i]; - ffi_type *atype = ecif->cif->arg_types[i]; - size_t size = atype->size; - size_t alignment = atype->alignment; - - /* Align argp as appropriate for the argument type. */ - if ((alignment - 1) & (unsigned) argp) - argp = (char *) FFI_ALIGN (argp, alignment); - - /* Copy the argument, promoting integral types smaller than a - word to word size. */ - if (size < sizeof (int)) - { - size = sizeof (int); - switch (atype->type) - { - case FFI_TYPE_SINT8: - *(signed int *) argp = (signed int) *(SINT8 *) avalue; - break; - - case FFI_TYPE_UINT8: - *(unsigned int *) argp = (unsigned int) *(UINT8 *) avalue; - break; - - case FFI_TYPE_SINT16: - *(signed int *) argp = (signed int) *(SINT16 *) avalue; - break; - - case FFI_TYPE_UINT16: - *(unsigned int *) argp = (unsigned int) *(UINT16 *) avalue; - break; - - case FFI_TYPE_STRUCT: - memcpy (argp, avalue, atype->size); - break; - - default: - FFI_ASSERT(0); - } - } - else if (size == sizeof (int)) - *(unsigned int *) argp = (unsigned int) *(UINT32 *) avalue; - else - memcpy (argp, avalue, size); - argp += size; - } -} - - -/* Call FN using the prepared CIF. RVALUE points to space allocated by - the caller for the return value, and AVALUE is an array of argument - pointers. */ - -void ffi_call (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue) -{ - - extended_cif ecif; - UINT64 result; - - /* If bigret is true, this is the case where a return value of larger - than 8 bytes is handled by being passed by reference as an implicit - argument. */ - int bigret = (cif->rtype->type == FFI_TYPE_STRUCT - && cif->rtype->size > 8); - - ecif.cif = cif; - ecif.avalue = avalue; - - /* Allocate space for return value if this is the pass-by-reference case - and the caller did not provide a buffer. */ - if (rvalue == NULL && bigret) - ecif.rvalue = alloca (cif->rtype->size); - else - ecif.rvalue = rvalue; - - result = ffi_call_sysv (ffi_prep_args, &ecif, cif->bytes, fn); - - /* Now result contains the 64 bit contents returned from fn in - r2 and r3. Copy the value of the appropriate size to the user-provided - rvalue buffer. */ - if (rvalue && !bigret) - switch (cif->rtype->size) - { - case 1: - *(UINT8 *)rvalue = (UINT8) result; - break; - case 2: - *(UINT16 *)rvalue = (UINT16) result; - break; - case 4: - *(UINT32 *)rvalue = (UINT32) result; - break; - case 8: - *(UINT64 *)rvalue = (UINT64) result; - break; - default: - memcpy (rvalue, (void *)&result, cif->rtype->size); - break; - } -} - -/* This function is invoked from the closure trampoline to invoke - CLOSURE with argument block ARGS. Parse ARGS according to - CLOSURE->cfi and invoke CLOSURE->fun. */ - -static UINT64 -ffi_closure_helper (unsigned char *args, - ffi_closure *closure) -{ - ffi_cif *cif = closure->cif; - unsigned char *argp = args; - void **parsed_args = alloca (cif->nargs * sizeof (void *)); - UINT64 result; - void *retptr; - unsigned int i; - - /* First figure out what to do about the return type. If this is the - big-structure-return case, the first arg is the hidden return buffer - allocated by the caller. */ - if (cif->rtype->type == FFI_TYPE_STRUCT - && cif->rtype->size > 8) - { - retptr = *((void **) argp); - argp += 4; - } - else - retptr = (void *) &result; - - /* Fill in the array of argument pointers. */ - for (i = 0; i < cif->nargs; i++) - { - size_t size = cif->arg_types[i]->size; - size_t alignment = cif->arg_types[i]->alignment; - - /* Align argp as appropriate for the argument type. */ - if ((alignment - 1) & (unsigned) argp) - argp = (char *) FFI_ALIGN (argp, alignment); - - /* Arguments smaller than an int are promoted to int. */ - if (size < sizeof (int)) - size = sizeof (int); - - /* Store the pointer. */ - parsed_args[i] = argp; - argp += size; - } - - /* Call the user-supplied function. */ - (closure->fun) (cif, retptr, parsed_args, closure->user_data); - return result; -} - - -/* Initialize CLOSURE with a trampoline to call FUN with - CIF and USER_DATA. */ -ffi_status -ffi_prep_closure_loc (ffi_closure* closure, - ffi_cif* cif, - void (*fun) (ffi_cif*, void*, void**, void*), - void *user_data, - void *codeloc) -{ - unsigned int *tramp = (unsigned int *) &closure->tramp[0]; - int i; - - if (cif->abi != FFI_SYSV) - return FFI_BAD_ABI; - - /* The trampoline looks like: - movhi r8, %hi(ffi_closure_sysv) - ori r8, r8, %lo(ffi_closure_sysv) - movhi r9, %hi(ffi_closure_helper) - ori r0, r9, %lo(ffi_closure_helper) - movhi r10, %hi(closure) - ori r10, r10, %lo(closure) - jmp r8 - and then ffi_closure_sysv retrieves the closure pointer out of r10 - in addition to the arguments passed in the normal way for the call, - and invokes ffi_closure_helper. We encode the pointer to - ffi_closure_helper in the trampoline because making a PIC call - to it in ffi_closure_sysv would be messy (it would have to indirect - through the GOT). */ - -#define HI(x) ((((unsigned int) (x)) >> 16) & 0xffff) -#define LO(x) (((unsigned int) (x)) & 0xffff) - tramp[0] = (0 << 27) | (8 << 22) | (HI (ffi_closure_sysv) << 6) | 0x34; - tramp[1] = (8 << 27) | (8 << 22) | (LO (ffi_closure_sysv) << 6) | 0x14; - tramp[2] = (0 << 27) | (9 << 22) | (HI (ffi_closure_helper) << 6) | 0x34; - tramp[3] = (9 << 27) | (9 << 22) | (LO (ffi_closure_helper) << 6) | 0x14; - tramp[4] = (0 << 27) | (10 << 22) | (HI (closure) << 6) | 0x34; - tramp[5] = (10 << 27) | (10 << 22) | (LO (closure) << 6) | 0x14; - tramp[6] = (8 << 27) | (0x0d << 11) | 0x3a; -#undef HI -#undef LO - - /* Flush the caches. - See Example 9-4 in the Nios II Software Developer's Handbook. */ - for (i = 0; i < 7; i++) - asm volatile ("flushd 0(%0); flushi %0" :: "r"(tramp + i) : "memory"); - asm volatile ("flushp" ::: "memory"); - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - return FFI_OK; -} - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/nios2/ffitarget.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/nios2/ffitarget.h deleted file mode 100644 index 134d118..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/nios2/ffitarget.h +++ /dev/null @@ -1,52 +0,0 @@ -/* libffi target includes for Altera Nios II. - - Copyright (c) 2013 Mentor Graphics. - - 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. */ - - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_SYSV, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_SYSV -} ffi_abi; -#endif - -/* Structures have a 4-byte alignment even if all the fields have lesser - alignment requirements. */ -#define FFI_AGGREGATE_ALIGNMENT 4 - -#define FFI_CLOSURES 1 -#define FFI_TRAMPOLINE_SIZE 28 /* 7 instructions */ -#define FFI_NATIVE_RAW_API 0 - -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/nios2/sysv.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/nios2/sysv.S deleted file mode 100644 index 75f442b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/nios2/sysv.S +++ /dev/null @@ -1,136 +0,0 @@ -/* Low-level libffi support for Altera Nios II. - - Copyright (c) 2013 Mentor Graphics. - - 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. */ - -/* This function is declared on the C side as - - extern UINT64 ffi_call_sysv (void (*arghook) (char *, extended_cif *), - extended_cif *ecif, - unsigned nbytes, - void (*fn) (void)); - - On input, the arguments appear as - r4 = arghook - r5 = ecif - r6 = nbytes - r7 = fn -*/ - - .section .text - .align 2 - .global ffi_call_sysv - .type ffi_call_sysv, @function - -ffi_call_sysv: - .cfi_startproc - - /* Create the stack frame, saving r16 so we can use it locally. */ - addi sp, sp, -12 - .cfi_def_cfa_offset 12 - stw ra, 8(sp) - stw fp, 4(sp) - stw r16, 0(sp) - .cfi_offset 31, -4 - .cfi_offset 28, -8 - .cfi_offset 16, -12 - mov fp, sp - .cfi_def_cfa_register 28 - mov r16, r7 - - /* Adjust the stack pointer to create the argument buffer - nbytes long. */ - sub sp, sp, r6 - - /* Call the arghook function. */ - mov r2, r4 /* fn */ - mov r4, sp /* argbuffer */ - callr r2 /* r5 already contains ecif */ - - /* Pop off the first 16 bytes of the argument buffer on the stack, - transferring the contents to the argument registers. */ - ldw r4, 0(sp) - ldw r5, 4(sp) - ldw r6, 8(sp) - ldw r7, 12(sp) - addi sp, sp, 16 - - /* Call the user function, which leaves its result in r2 and r3. */ - callr r16 - - /* Pop off the stack frame. */ - mov sp, fp - ldw ra, 8(sp) - ldw fp, 4(sp) - ldw r16, 0(sp) - addi sp, sp, 12 - ret - .cfi_endproc - .size ffi_call_sysv, .-ffi_call_sysv - - -/* Closure trampolines jump here after putting the C helper address - in r9 and the closure pointer in r10. The user-supplied arguments - to the closure are in the normal places, in r4-r7 and on the - stack. Push the register arguments on the stack too and then call the - C helper function to deal with them. */ - - .section .text - .align 2 - .global ffi_closure_sysv - .type ffi_closure_sysv, @function - -ffi_closure_sysv: - .cfi_startproc - - /* Create the stack frame, pushing the register args on the stack - just below the stack args. This is the same trick illustrated - in Figure 7-3 in the Nios II Processor Reference Handbook, used - for variable arguments and structures passed by value. */ - addi sp, sp, -20 - .cfi_def_cfa_offset 20 - stw ra, 0(sp) - .cfi_offset 31, -20 - stw r4, 4(sp) - .cfi_offset 4, -16 - stw r5, 8(sp) - .cfi_offset 5, -12 - stw r6, 12(sp) - .cfi_offset 6, -8 - stw r7, 16(sp) - .cfi_offset 7, -4 - - /* Call the helper. - r4 = pointer to arguments on stack - r5 = closure pointer (loaded in r10 by the trampoline) - r9 = address of helper function (loaded by trampoline) */ - addi r4, sp, 4 - mov r5, r10 - callr r9 - - /* Pop the stack and return. */ - ldw ra, 0(sp) - addi sp, sp, 20 - .cfi_def_cfa_offset -20 - ret - .cfi_endproc - .size ffi_closure_sysv, .-ffi_closure_sysv - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/or1k/ffi.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/or1k/ffi.c deleted file mode 100644 index 2bad938..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/or1k/ffi.c +++ /dev/null @@ -1,328 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2014 Sebastian Macke - - OpenRISC Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#include -#include "ffi_common.h" - -/* ffi_prep_args is called by the assembly routine once stack space - has been allocated for the function's arguments */ - -void* ffi_prep_args(char *stack, extended_cif *ecif) -{ - char *stacktemp = stack; - int i, s; - ffi_type **arg; - int count = 0; - int nfixedargs; - - nfixedargs = ecif->cif->nfixedargs; - arg = ecif->cif->arg_types; - void **argv = ecif->avalue; - - if (ecif->cif->rtype->type == FFI_TYPE_STRUCT) - { - *(void **) stack = ecif->rvalue; - stack += 4; - count = 4; - } - for(i=0; icif->nargs; i++) - { - - /* variadic args are saved on stack */ - if ((nfixedargs == 0) && (count < 24)) - { - count = 24; - stack = stacktemp + 24; - } - nfixedargs--; - - s = 4; - switch((*arg)->type) - { - case FFI_TYPE_STRUCT: - *(void **)stack = *argv; - break; - - case FFI_TYPE_SINT8: - *(signed int *) stack = (signed int)*(SINT8 *)(* argv); - break; - - case FFI_TYPE_UINT8: - *(unsigned int *) stack = (unsigned int)*(UINT8 *)(* argv); - break; - - case FFI_TYPE_SINT16: - *(signed int *) stack = (signed int)*(SINT16 *)(* argv); - break; - - case FFI_TYPE_UINT16: - *(unsigned int *) stack = (unsigned int)*(UINT16 *)(* argv); - break; - - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - case FFI_TYPE_FLOAT: - case FFI_TYPE_POINTER: - *(int *)stack = *(int*)(*argv); - break; - - default: /* 8 byte types */ - if (count == 20) /* never split arguments */ - { - stack += 4; - count += 4; - } - s = (*arg)->size; - memcpy(stack, *argv, s); - break; - } - - stack += s; - count += s; - argv++; - arg++; - } - return stacktemp + ((count>24)?24:0); -} - -extern void ffi_call_SYSV(unsigned, - extended_cif *, - void *(*)(int *, extended_cif *), - unsigned *, - void (*fn)(void), - unsigned); - - -void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - int i; - int size; - ffi_type **arg; - - /* Calculate size to allocate on stack */ - - for(i = 0, arg = cif->arg_types, size=0; i < cif->nargs; i++, arg++) - { - if ((*arg)->type == FFI_TYPE_STRUCT) - size += 4; - else - if ((*arg)->size <= 4) - size += 4; - else - size += 8; - } - - /* for variadic functions more space is needed on the stack */ - if (cif->nargs != cif->nfixedargs) - size += 24; - - if (cif->rtype->type == FFI_TYPE_STRUCT) - size += 4; - - - extended_cif ecif; - ecif.cif = cif; - ecif.avalue = avalue; - ecif.rvalue = rvalue; - - switch (cif->abi) - { - case FFI_SYSV: - ffi_call_SYSV(size, &ecif, ffi_prep_args, rvalue, fn, cif->flags); - break; - default: - FFI_ASSERT(0); - break; - } -} - - -void ffi_closure_SYSV(unsigned long r3, unsigned long r4, unsigned long r5, - unsigned long r6, unsigned long r7, unsigned long r8) -{ - register int *sp __asm__ ("r17"); - register int *r13 __asm__ ("r13"); - - ffi_closure* closure = (ffi_closure*) r13; - char *stack_args = sp; - - /* Lay the register arguments down in a continuous chunk of memory. */ - unsigned register_args[6] = - { r3, r4, r5, r6, r7, r8 }; - - /* Pointer to a struct return value. */ - void *struct_rvalue = (void *) r3; - - ffi_cif *cif = closure->cif; - ffi_type **arg_types = cif->arg_types; - void **avalue = alloca (cif->nargs * sizeof(void *)); - char *ptr = (char *) register_args; - int count = 0; - int nfixedargs = cif->nfixedargs; - int i; - - /* preserve struct type return pointer passing */ - - if ((cif->rtype != NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) - { - ptr += 4; - count = 4; - } - - /* Find the address of each argument. */ - for (i = 0; i < cif->nargs; i++) - { - - /* variadic args are saved on stack */ - if ((nfixedargs == 0) && (count < 24)) - { - ptr = stack_args; - count = 24; - } - nfixedargs--; - - switch (arg_types[i]->type) - { - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: - avalue[i] = ptr + 3; - break; - - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: - avalue[i] = ptr + 2; - break; - - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - case FFI_TYPE_FLOAT: - case FFI_TYPE_POINTER: - avalue[i] = ptr; - break; - - case FFI_TYPE_STRUCT: - avalue[i] = *(void**)ptr; - break; - - default: - /* 8-byte values */ - - /* arguments are never splitted */ - if (ptr == ®ister_args[5]) - ptr = stack_args; - avalue[i] = ptr; - ptr += 4; - count += 4; - break; - } - ptr += 4; - count += 4; - - /* If we've handled more arguments than fit in registers, - start looking at the those passed on the stack. */ - - if (count == 24) - ptr = stack_args; - } - - if (cif->rtype && (cif->rtype->type == FFI_TYPE_STRUCT)) - { - (closure->fun) (cif, struct_rvalue, avalue, closure->user_data); - } else - { - long long rvalue; - (closure->fun) (cif, &rvalue, avalue, closure->user_data); - if (cif->rtype) - asm ("l.ori r12, %0, 0x0\n l.lwz r11, 0(r12)\n l.lwz r12, 4(r12)" : : "r" (&rvalue)); - } -} - - -ffi_status -ffi_prep_closure_loc (ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*,void*,void**,void*), - void *user_data, - void *codeloc) -{ - unsigned short *tramp = (unsigned short *) closure->tramp; - unsigned long fn = (unsigned long) ffi_closure_SYSV; - unsigned long cls = (unsigned long) codeloc; - - if (cif->abi != FFI_SYSV) - return FFI_BAD_ABI; - - closure->cif = cif; - closure->user_data = user_data; - closure->fun = fun; - - /* write pointers to temporary registers */ - tramp[0] = (0x6 << 10) | (13 << 5); /* l.movhi r13, ... */ - tramp[1] = cls >> 16; - tramp[2] = (0x2a << 10) | (13 << 5) | 13; /* l.ori r13, r13, ... */ - tramp[3] = cls & 0xFFFF; - - tramp[4] = (0x6 << 10) | (15 << 5); /* l.movhi r15, ... */ - tramp[5] = fn >> 16; - tramp[6] = (0x2a << 10) | (15 << 5) | 15; /* l.ori r15, r15 ... */ - tramp[7] = fn & 0xFFFF; - - tramp[8] = (0x11 << 10); /* l.jr r15 */ - tramp[9] = 15 << 11; - - tramp[10] = (0x2a << 10) | (17 << 5) | 1; /* l.ori r17, r1, ... */ - tramp[11] = 0x0; - - return FFI_OK; -} - - -ffi_status ffi_prep_cif_machdep (ffi_cif *cif) -{ - cif->flags = 0; - - /* structures are returned as pointers */ - if (cif->rtype->type == FFI_TYPE_STRUCT) - cif->flags = FFI_TYPE_STRUCT; - else - if (cif->rtype->size > 4) - cif->flags = FFI_TYPE_UINT64; - - cif->nfixedargs = cif->nargs; - - return FFI_OK; -} - - -ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif, - unsigned int nfixedargs, unsigned int ntotalargs) -{ - ffi_status status; - - status = ffi_prep_cif_machdep (cif); - cif->nfixedargs = nfixedargs; - return status; -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/or1k/ffitarget.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/or1k/ffitarget.h deleted file mode 100644 index e55da28..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/or1k/ffitarget.h +++ /dev/null @@ -1,58 +0,0 @@ -/* ----------------------------------------------------------------------- - ffitarget.h - Copyright (c) 2014 Sebastian Macke - - OpenRISC Target configuration macros - - 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. - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -/* ---- System specific configurations ----------------------------------- */ - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_SYSV, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_SYSV -} ffi_abi; -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_NATIVE_RAW_API 0 -#define FFI_TRAMPOLINE_SIZE (24) - -#define FFI_TARGET_SPECIFIC_VARIADIC 1 -#define FFI_EXTRA_CIF_FIELDS unsigned nfixedargs; - -#endif - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/or1k/sysv.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/or1k/sysv.S deleted file mode 100644 index df6570b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/or1k/sysv.S +++ /dev/null @@ -1,107 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.S - Copyright (c) 2014 Sebastian Macke - - OpenRISC Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include - -.text - .globl ffi_call_SYSV - .type ffi_call_SYSV, @function -/* - r3: size to allocate on stack - r4: extended cif structure - r5: function pointer ffi_prep_args - r6: ret address - r7: function to call - r8: flag for return type -*/ - -ffi_call_SYSV: - /* Store registers used on stack */ - l.sw -4(r1), r9 /* return address */ - l.sw -8(r1), r1 /* stack address */ - l.sw -12(r1), r14 /* callee saved registers */ - l.sw -16(r1), r16 - l.sw -20(r1), r18 - l.sw -24(r1), r20 - - l.ori r14, r1, 0x0 /* save stack pointer */ - l.addi r1, r1, -24 - - l.ori r16, r7, 0x0 /* save function address */ - l.ori r18, r6, 0x0 /* save ret address */ - l.ori r20, r8, 0x0 /* save flag */ - - l.sub r1, r1, r3 /* reserve space on stack */ - - /* Call ffi_prep_args */ - l.ori r3, r1, 0x0 /* first argument stack address, second already ecif */ - l.jalr r5 - l.nop - - /* Load register arguments and call*/ - - l.lwz r3, 0(r1) - l.lwz r4, 4(r1) - l.lwz r5, 8(r1) - l.lwz r6, 12(r1) - l.lwz r7, 16(r1) - l.lwz r8, 20(r1) - l.ori r1, r11, 0x0 /* new stack pointer */ - l.jalr r16 - l.nop - - /* handle return values */ - - l.sfeqi r20, FFI_TYPE_STRUCT - l.bf ret /* structs don't return an rvalue */ - l.nop - - /* copy ret address */ - - l.sfeqi r20, FFI_TYPE_UINT64 - l.bnf four_byte_ret /* 8 byte value is returned */ - l.nop - - l.sw 4(r18), r12 - -four_byte_ret: - l.sw 0(r18), r11 - -ret: - /* return */ - l.ori r1, r14, 0x0 /* reset stack pointer */ - l.lwz r9, -4(r1) - l.lwz r1, -8(r1) - l.lwz r14, -12(r1) - l.lwz r16, -16(r1) - l.lwz r18, -20(r1) - l.lwz r20, -24(r1) - l.jr r9 - l.nop - -.size ffi_call_SYSV, .-ffi_call_SYSV diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/pa/ffi.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/pa/ffi.c deleted file mode 100644 index 95e6694..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/pa/ffi.c +++ /dev/null @@ -1,674 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - (c) 2011 Anthony Green - (c) 2008 Red Hat, Inc. - (c) 2006 Free Software Foundation, Inc. - (c) 2003-2004 Randolph Chung - - HPPA Foreign Function Interface - HP-UX PA ABI support - - 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. - ----------------------------------------------------------------------- */ - -#include -#include - -#include -#include - -#define ROUND_UP(v, a) (((size_t)(v) + (a) - 1) & ~((a) - 1)) - -#define MIN_STACK_SIZE 64 -#define FIRST_ARG_SLOT 9 -#define DEBUG_LEVEL 0 - -#define fldw(addr, fpreg) \ - __asm__ volatile ("fldw 0(%0), %%" #fpreg "L" : : "r"(addr) : #fpreg) -#define fstw(fpreg, addr) \ - __asm__ volatile ("fstw %%" #fpreg "L, 0(%0)" : : "r"(addr)) -#define fldd(addr, fpreg) \ - __asm__ volatile ("fldd 0(%0), %%" #fpreg : : "r"(addr) : #fpreg) -#define fstd(fpreg, addr) \ - __asm__ volatile ("fstd %%" #fpreg "L, 0(%0)" : : "r"(addr)) - -#define debug(lvl, x...) do { if (lvl <= DEBUG_LEVEL) { printf(x); } } while (0) - -static inline int ffi_struct_type(ffi_type *t) -{ - size_t sz = t->size; - - /* Small structure results are passed in registers, - larger ones are passed by pointer. Note that - small structures of size 2, 4 and 8 differ from - the corresponding integer types in that they have - different alignment requirements. */ - - if (sz <= 1) - return FFI_TYPE_UINT8; - else if (sz == 2) - return FFI_TYPE_SMALL_STRUCT2; - else if (sz == 3) - return FFI_TYPE_SMALL_STRUCT3; - else if (sz == 4) - return FFI_TYPE_SMALL_STRUCT4; - else if (sz == 5) - return FFI_TYPE_SMALL_STRUCT5; - else if (sz == 6) - return FFI_TYPE_SMALL_STRUCT6; - else if (sz == 7) - return FFI_TYPE_SMALL_STRUCT7; - else if (sz <= 8) - return FFI_TYPE_SMALL_STRUCT8; - else - return FFI_TYPE_STRUCT; /* else, we pass it by pointer. */ -} - -/* PA has a downward growing stack, which looks like this: - - Offset - [ Variable args ] - SP = (4*(n+9)) arg word N - ... - SP-52 arg word 4 - [ Fixed args ] - SP-48 arg word 3 - SP-44 arg word 2 - SP-40 arg word 1 - SP-36 arg word 0 - [ Frame marker ] - ... - SP-20 RP - SP-4 previous SP - - The first four argument words on the stack are reserved for use by - the callee. Instead, the general and floating registers replace - the first four argument slots. Non FP arguments are passed solely - in the general registers. FP arguments are passed in both general - and floating registers when using libffi. - - Non-FP 32-bit args are passed in gr26, gr25, gr24 and gr23. - Non-FP 64-bit args are passed in register pairs, starting - on an odd numbered register (i.e. r25+r26 and r23+r24). - FP 32-bit arguments are passed in fr4L, fr5L, fr6L and fr7L. - FP 64-bit arguments are passed in fr5 and fr7. - - The registers are allocated in the same manner as stack slots. - This allows the callee to save its arguments on the stack if - necessary: - - arg word 3 -> gr23 or fr7L - arg word 2 -> gr24 or fr6L or fr7R - arg word 1 -> gr25 or fr5L - arg word 0 -> gr26 or fr4L or fr5R - - Note that fr4R and fr6R are never used for arguments (i.e., - doubles are not passed in fr4 or fr6). - - The rest of the arguments are passed on the stack starting at SP-52, - but 64-bit arguments need to be aligned to an 8-byte boundary - - This means we can have holes either in the register allocation, - or in the stack. */ - -/* ffi_prep_args is called by the assembly routine once stack space - has been allocated for the function's arguments - - The following code will put everything into the stack frame - (which was allocated by the asm routine), and on return - the asm routine will load the arguments that should be - passed by register into the appropriate registers - - NOTE: We load floating point args in this function... that means we - assume gcc will not mess with fp regs in here. */ - -void ffi_prep_args_pa32(UINT32 *stack, extended_cif *ecif, unsigned bytes) -{ - register unsigned int i; - register ffi_type **p_arg; - register void **p_argv; - unsigned int slot = FIRST_ARG_SLOT; - char *dest_cpy; - size_t len; - - debug(1, "%s: stack = %p, ecif = %p, bytes = %u\n", __FUNCTION__, stack, - ecif, bytes); - - p_arg = ecif->cif->arg_types; - p_argv = ecif->avalue; - - for (i = 0; i < ecif->cif->nargs; i++) - { - int type = (*p_arg)->type; - - switch (type) - { - case FFI_TYPE_SINT8: - *(SINT32 *)(stack - slot) = *(SINT8 *)(*p_argv); - break; - - case FFI_TYPE_UINT8: - *(UINT32 *)(stack - slot) = *(UINT8 *)(*p_argv); - break; - - case FFI_TYPE_SINT16: - *(SINT32 *)(stack - slot) = *(SINT16 *)(*p_argv); - break; - - case FFI_TYPE_UINT16: - *(UINT32 *)(stack - slot) = *(UINT16 *)(*p_argv); - break; - - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - case FFI_TYPE_POINTER: - debug(3, "Storing UINT32 %u in slot %u\n", *(UINT32 *)(*p_argv), - slot); - *(UINT32 *)(stack - slot) = *(UINT32 *)(*p_argv); - break; - - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - /* Align slot for 64-bit type. */ - slot += (slot & 1) ? 1 : 2; - *(UINT64 *)(stack - slot) = *(UINT64 *)(*p_argv); - break; - - case FFI_TYPE_FLOAT: - /* First 4 args go in fr4L - fr7L. */ - debug(3, "Storing UINT32(float) in slot %u\n", slot); - *(UINT32 *)(stack - slot) = *(UINT32 *)(*p_argv); - switch (slot - FIRST_ARG_SLOT) - { - /* First 4 args go in fr4L - fr7L. */ - case 0: fldw(stack - slot, fr4); break; - case 1: fldw(stack - slot, fr5); break; - case 2: fldw(stack - slot, fr6); break; - case 3: fldw(stack - slot, fr7); break; - } - break; - - case FFI_TYPE_DOUBLE: - /* Align slot for 64-bit type. */ - slot += (slot & 1) ? 1 : 2; - debug(3, "Storing UINT64(double) at slot %u\n", slot); - *(UINT64 *)(stack - slot) = *(UINT64 *)(*p_argv); - switch (slot - FIRST_ARG_SLOT) - { - /* First 2 args go in fr5, fr7. */ - case 1: fldd(stack - slot, fr5); break; - case 3: fldd(stack - slot, fr7); break; - } - break; - -#ifdef PA_HPUX - case FFI_TYPE_LONGDOUBLE: - /* Long doubles are passed in the same manner as structures - larger than 8 bytes. */ - *(UINT32 *)(stack - slot) = (UINT32)(*p_argv); - break; -#endif - - case FFI_TYPE_STRUCT: - - /* Structs smaller or equal than 4 bytes are passed in one - register. Structs smaller or equal 8 bytes are passed in two - registers. Larger structures are passed by pointer. */ - - len = (*p_arg)->size; - if (len <= 4) - { - dest_cpy = (char *)(stack - slot) + 4 - len; - memcpy(dest_cpy, (char *)*p_argv, len); - } - else if (len <= 8) - { - slot += (slot & 1) ? 1 : 2; - dest_cpy = (char *)(stack - slot) + 8 - len; - memcpy(dest_cpy, (char *)*p_argv, len); - } - else - *(UINT32 *)(stack - slot) = (UINT32)(*p_argv); - break; - - default: - FFI_ASSERT(0); - } - - slot++; - p_arg++; - p_argv++; - } - - /* Make sure we didn't mess up and scribble on the stack. */ - { - unsigned int n; - - debug(5, "Stack setup:\n"); - for (n = 0; n < (bytes + 3) / 4; n++) - { - if ((n%4) == 0) { debug(5, "\n%08x: ", (unsigned int)(stack - n)); } - debug(5, "%08x ", *(stack - n)); - } - debug(5, "\n"); - } - - FFI_ASSERT(slot * 4 <= bytes); - - return; -} - -static void ffi_size_stack_pa32(ffi_cif *cif) -{ - ffi_type **ptr; - int i; - int z = 0; /* # stack slots */ - - for (ptr = cif->arg_types, i = 0; i < cif->nargs; ptr++, i++) - { - int type = (*ptr)->type; - - switch (type) - { - case FFI_TYPE_DOUBLE: - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - z += 2 + (z & 1); /* must start on even regs, so we may waste one */ - break; - -#ifdef PA_HPUX - case FFI_TYPE_LONGDOUBLE: -#endif - case FFI_TYPE_STRUCT: - z += 1; /* pass by ptr, callee will copy */ - break; - - default: /* <= 32-bit values */ - z++; - } - } - - /* We can fit up to 6 args in the default 64-byte stack frame, - if we need more, we need more stack. */ - if (z <= 6) - cif->bytes = MIN_STACK_SIZE; /* min stack size */ - else - cif->bytes = 64 + ROUND_UP((z - 6) * sizeof(UINT32), MIN_STACK_SIZE); - - debug(3, "Calculated stack size is %u bytes\n", cif->bytes); -} - -/* Perform machine dependent cif processing. */ -ffi_status ffi_prep_cif_machdep(ffi_cif *cif) -{ - /* Set the return type flag */ - switch (cif->rtype->type) - { - case FFI_TYPE_VOID: - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - cif->flags = (unsigned) cif->rtype->type; - break; - -#ifdef PA_HPUX - case FFI_TYPE_LONGDOUBLE: - /* Long doubles are treated like a structure. */ - cif->flags = FFI_TYPE_STRUCT; - break; -#endif - - case FFI_TYPE_STRUCT: - /* For the return type we have to check the size of the structures. - If the size is smaller or equal 4 bytes, the result is given back - in one register. If the size is smaller or equal 8 bytes than we - return the result in two registers. But if the size is bigger than - 8 bytes, we work with pointers. */ - cif->flags = ffi_struct_type(cif->rtype); - break; - - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - cif->flags = FFI_TYPE_UINT64; - break; - - default: - cif->flags = FFI_TYPE_INT; - break; - } - - /* Lucky us, because of the unique PA ABI we get to do our - own stack sizing. */ - switch (cif->abi) - { - case FFI_PA32: - ffi_size_stack_pa32(cif); - break; - - default: - FFI_ASSERT(0); - break; - } - - return FFI_OK; -} - -extern void ffi_call_pa32(void (*)(UINT32 *, extended_cif *, unsigned), - extended_cif *, unsigned, unsigned, unsigned *, - void (*fn)(void)); - -void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - extended_cif ecif; - - ecif.cif = cif; - ecif.avalue = avalue; - - /* If the return value is a struct and we don't have a return - value address then we need to make one. */ - - if (rvalue == NULL -#ifdef PA_HPUX - && (cif->rtype->type == FFI_TYPE_STRUCT - || cif->rtype->type == FFI_TYPE_LONGDOUBLE)) -#else - && cif->rtype->type == FFI_TYPE_STRUCT) -#endif - { - ecif.rvalue = alloca(cif->rtype->size); - } - else - ecif.rvalue = rvalue; - - - switch (cif->abi) - { - case FFI_PA32: - debug(3, "Calling ffi_call_pa32: ecif=%p, bytes=%u, flags=%u, rvalue=%p, fn=%p\n", &ecif, cif->bytes, cif->flags, ecif.rvalue, (void *)fn); - ffi_call_pa32(ffi_prep_args_pa32, &ecif, cif->bytes, - cif->flags, ecif.rvalue, fn); - break; - - default: - FFI_ASSERT(0); - break; - } -} - -#if FFI_CLOSURES -/* This is more-or-less an inverse of ffi_call -- we have arguments on - the stack, and we need to fill them into a cif structure and invoke - the user function. This really ought to be in asm to make sure - the compiler doesn't do things we don't expect. */ -ffi_status ffi_closure_inner_pa32(ffi_closure *closure, UINT32 *stack) -{ - ffi_cif *cif; - void **avalue; - void *rvalue; - /* Functions can return up to 64-bits in registers. Return address - must be double word aligned. */ - union { double rd; UINT32 ret[2]; } u; - ffi_type **p_arg; - char *tmp; - int i, avn; - unsigned int slot = FIRST_ARG_SLOT; - register UINT32 r28 asm("r28"); - ffi_closure *c = (ffi_closure *)FFI_RESTORE_PTR (closure); - - cif = closure->cif; - - /* If returning via structure, callee will write to our pointer. */ - if (cif->flags == FFI_TYPE_STRUCT) - rvalue = (void *)r28; - else - rvalue = &u; - - avalue = (void **)alloca(cif->nargs * FFI_SIZEOF_ARG); - avn = cif->nargs; - p_arg = cif->arg_types; - - for (i = 0; i < avn; i++) - { - int type = (*p_arg)->type; - - switch (type) - { - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - case FFI_TYPE_POINTER: - avalue[i] = (char *)(stack - slot) + sizeof(UINT32) - (*p_arg)->size; - break; - - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - slot += (slot & 1) ? 1 : 2; - avalue[i] = (void *)(stack - slot); - break; - - case FFI_TYPE_FLOAT: -#ifdef PA_LINUX - /* The closure call is indirect. In Linux, floating point - arguments in indirect calls with a prototype are passed - in the floating point registers instead of the general - registers. So, we need to replace what was previously - stored in the current slot with the value in the - corresponding floating point register. */ - switch (slot - FIRST_ARG_SLOT) - { - case 0: fstw(fr4, (void *)(stack - slot)); break; - case 1: fstw(fr5, (void *)(stack - slot)); break; - case 2: fstw(fr6, (void *)(stack - slot)); break; - case 3: fstw(fr7, (void *)(stack - slot)); break; - } -#endif - avalue[i] = (void *)(stack - slot); - break; - - case FFI_TYPE_DOUBLE: - slot += (slot & 1) ? 1 : 2; -#ifdef PA_LINUX - /* See previous comment for FFI_TYPE_FLOAT. */ - switch (slot - FIRST_ARG_SLOT) - { - case 1: fstd(fr5, (void *)(stack - slot)); break; - case 3: fstd(fr7, (void *)(stack - slot)); break; - } -#endif - avalue[i] = (void *)(stack - slot); - break; - -#ifdef PA_HPUX - case FFI_TYPE_LONGDOUBLE: - /* Long doubles are treated like a big structure. */ - avalue[i] = (void *) *(stack - slot); - break; -#endif - - case FFI_TYPE_STRUCT: - /* Structs smaller or equal than 4 bytes are passed in one - register. Structs smaller or equal 8 bytes are passed in two - registers. Larger structures are passed by pointer. */ - if((*p_arg)->size <= 4) - { - avalue[i] = (void *)(stack - slot) + sizeof(UINT32) - - (*p_arg)->size; - } - else if ((*p_arg)->size <= 8) - { - slot += (slot & 1) ? 1 : 2; - avalue[i] = (void *)(stack - slot) + sizeof(UINT64) - - (*p_arg)->size; - } - else - avalue[i] = (void *) *(stack - slot); - break; - - default: - FFI_ASSERT(0); - } - - slot++; - p_arg++; - } - - /* Invoke the closure. */ - (c->fun) (cif, rvalue, avalue, c->user_data); - - debug(3, "after calling function, ret[0] = %08x, ret[1] = %08x\n", u.ret[0], - u.ret[1]); - - /* Store the result using the lower 2 bytes of the flags. */ - switch (cif->flags) - { - case FFI_TYPE_UINT8: - *(stack - FIRST_ARG_SLOT) = (UINT8)(u.ret[0] >> 24); - break; - case FFI_TYPE_SINT8: - *(stack - FIRST_ARG_SLOT) = (SINT8)(u.ret[0] >> 24); - break; - case FFI_TYPE_UINT16: - *(stack - FIRST_ARG_SLOT) = (UINT16)(u.ret[0] >> 16); - break; - case FFI_TYPE_SINT16: - *(stack - FIRST_ARG_SLOT) = (SINT16)(u.ret[0] >> 16); - break; - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - *(stack - FIRST_ARG_SLOT) = u.ret[0]; - break; - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - *(stack - FIRST_ARG_SLOT) = u.ret[0]; - *(stack - FIRST_ARG_SLOT - 1) = u.ret[1]; - break; - - case FFI_TYPE_DOUBLE: - fldd(rvalue, fr4); - break; - - case FFI_TYPE_FLOAT: - fldw(rvalue, fr4); - break; - - case FFI_TYPE_STRUCT: - /* Don't need a return value, done by caller. */ - break; - - case FFI_TYPE_SMALL_STRUCT2: - case FFI_TYPE_SMALL_STRUCT3: - case FFI_TYPE_SMALL_STRUCT4: - tmp = (void*)(stack - FIRST_ARG_SLOT); - tmp += 4 - cif->rtype->size; - memcpy((void*)tmp, &u, cif->rtype->size); - break; - - case FFI_TYPE_SMALL_STRUCT5: - case FFI_TYPE_SMALL_STRUCT6: - case FFI_TYPE_SMALL_STRUCT7: - case FFI_TYPE_SMALL_STRUCT8: - { - unsigned int ret2[2]; - int off; - - /* Right justify ret[0] and ret[1] */ - switch (cif->flags) - { - case FFI_TYPE_SMALL_STRUCT5: off = 3; break; - case FFI_TYPE_SMALL_STRUCT6: off = 2; break; - case FFI_TYPE_SMALL_STRUCT7: off = 1; break; - default: off = 0; break; - } - - memset (ret2, 0, sizeof (ret2)); - memcpy ((char *)ret2 + off, &u, 8 - off); - - *(stack - FIRST_ARG_SLOT) = ret2[0]; - *(stack - FIRST_ARG_SLOT - 1) = ret2[1]; - } - break; - - case FFI_TYPE_POINTER: - case FFI_TYPE_VOID: - break; - - default: - debug(0, "assert with cif->flags: %d\n",cif->flags); - FFI_ASSERT(0); - break; - } - return FFI_OK; -} - -/* Fill in a closure to refer to the specified fun and user_data. - cif specifies the argument and result types for fun. - The cif must already be prep'ed. */ - -extern void ffi_closure_pa32(void); - -ffi_status -ffi_prep_closure_loc (ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*,void*,void**,void*), - void *user_data, - void *codeloc) -{ - ffi_closure *c = (ffi_closure *)FFI_RESTORE_PTR (closure); - - /* The layout of a function descriptor. A function pointer with the PLABEL - bit set points to a function descriptor. */ - struct pa32_fd - { - UINT32 code_pointer; - UINT32 gp; - }; - - struct ffi_pa32_trampoline_struct - { - UINT32 code_pointer; /* Pointer to ffi_closure_unix. */ - UINT32 fake_gp; /* Pointer to closure, installed as gp. */ - UINT32 real_gp; /* Real gp value. */ - }; - - struct ffi_pa32_trampoline_struct *tramp; - struct pa32_fd *fd; - - if (cif->abi != FFI_PA32) - return FFI_BAD_ABI; - - /* Get function descriptor address for ffi_closure_pa32. */ - fd = (struct pa32_fd *)((UINT32)ffi_closure_pa32 & ~3); - - /* Setup trampoline. */ - tramp = (struct ffi_pa32_trampoline_struct *)c->tramp; - tramp->code_pointer = fd->code_pointer; - tramp->fake_gp = (UINT32)codeloc & ~3; - tramp->real_gp = fd->gp; - - c->cif = cif; - c->user_data = user_data; - c->fun = fun; - - return FFI_OK; -} -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/pa/ffitarget.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/pa/ffitarget.h deleted file mode 100644 index df1209e..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/pa/ffitarget.h +++ /dev/null @@ -1,80 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - Copyright (c) 1996-2003 Red Hat, Inc. - Target configuration macros for hppa. - - 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. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -/* ---- System specific configurations ----------------------------------- */ - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - -#ifdef PA_LINUX - FFI_PA32, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_PA32 -#endif - -#ifdef PA_HPUX - FFI_PA32, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_PA32 -#endif - -#ifdef PA64_HPUX -#error "PA64_HPUX FFI is not yet implemented" - FFI_PA64, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_PA64 -#endif -} ffi_abi; -#endif - -#define FFI_TARGET_SPECIFIC_STACK_SPACE_ALLOCATION - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_NATIVE_RAW_API 0 -#define FFI_TRAMPOLINE_SIZE 12 - -#define FFI_TYPE_SMALL_STRUCT2 -1 -#define FFI_TYPE_SMALL_STRUCT3 -2 -#define FFI_TYPE_SMALL_STRUCT4 -3 -#define FFI_TYPE_SMALL_STRUCT5 -4 -#define FFI_TYPE_SMALL_STRUCT6 -5 -#define FFI_TYPE_SMALL_STRUCT7 -6 -#define FFI_TYPE_SMALL_STRUCT8 -7 -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/pa/hpux32.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/pa/hpux32.S deleted file mode 100644 index d0e5f69..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/pa/hpux32.S +++ /dev/null @@ -1,370 +0,0 @@ -/* ----------------------------------------------------------------------- - hpux32.S - Copyright (c) 2006 Free Software Foundation, Inc. - (c) 2008 Red Hat, Inc. - based on src/pa/linux.S - - HP-UX PA Foreign Function Interface - - 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 AUTHOR 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. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include - - .LEVEL 1.1 - .SPACE $PRIVATE$ - .IMPORT $global$,DATA - .IMPORT $$dyncall,MILLICODE - .SUBSPA $DATA$ - .align 4 - - /* void ffi_call_pa32(void (*)(char *, extended_cif *), - extended_cif *ecif, - unsigned bytes, - unsigned flags, - unsigned *rvalue, - void (*fn)(void)); - */ - - .export ffi_call_pa32,ENTRY,PRIV_LEV=3 - .import ffi_prep_args_pa32,CODE - - .SPACE $TEXT$ - .SUBSPA $CODE$ - .align 4 - -L$FB1 -ffi_call_pa32 - .proc - .callinfo FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=4 - .entry - stw %rp, -20(%sp) - copy %r3, %r1 -L$CFI11 - copy %sp, %r3 -L$CFI12 - - /* Setup the stack for calling prep_args... - We want the stack to look like this: - - [ Previous stack ] <- %r3 - - [ 64-bytes register save area ] <- %r4 - - [ Stack space for actual call, passed as ] <- %arg0 - [ arg0 to ffi_prep_args_pa32 ] - - [ Stack for calling prep_args ] <- %sp - */ - - stwm %r1, 64(%sp) - stw %r4, 12(%r3) -L$CFI13 - copy %sp, %r4 - - addl %arg2, %r4, %arg0 ; arg stack - stw %arg3, -48(%r3) ; save flags we need it later - - /* Call prep_args: - %arg0(stack) -- set up above - %arg1(ecif) -- same as incoming param - %arg2(bytes) -- same as incoming param */ - bl ffi_prep_args_pa32,%r2 - ldo 64(%arg0), %sp - ldo -64(%sp), %sp - - /* now %sp should point where %arg0 was pointing. */ - - /* Load the arguments that should be passed in registers - The fp args are loaded by the prep_args function. */ - ldw -36(%sp), %arg0 - ldw -40(%sp), %arg1 - ldw -44(%sp), %arg2 - ldw -48(%sp), %arg3 - - /* in case the function is going to return a structure - we need to give it a place to put the result. */ - ldw -52(%r3), %ret0 ; %ret0 <- rvalue - ldw -56(%r3), %r22 ; %r22 <- function to call - bl $$dyncall, %r31 ; Call the user function - copy %r31, %rp - - /* Prepare to store the result; we need to recover flags and rvalue. */ - ldw -48(%r3), %r21 ; r21 <- flags - ldw -52(%r3), %r20 ; r20 <- rvalue - - /* Store the result according to the return type. The most - likely types should come first. */ - -L$checkint - comib,<>,n FFI_TYPE_INT, %r21, L$checkint8 - b L$done - stw %ret0, 0(%r20) - -L$checkint8 - comib,<>,n FFI_TYPE_UINT8, %r21, L$checkint16 - b L$done - stb %ret0, 0(%r20) - -L$checkint16 - comib,<>,n FFI_TYPE_UINT16, %r21, L$checkdbl - b L$done - sth %ret0, 0(%r20) - -L$checkdbl - comib,<>,n FFI_TYPE_DOUBLE, %r21, L$checkfloat - b L$done - fstd %fr4,0(%r20) - -L$checkfloat - comib,<>,n FFI_TYPE_FLOAT, %r21, L$checkll - b L$done - fstw %fr4L,0(%r20) - -L$checkll - comib,<>,n FFI_TYPE_UINT64, %r21, L$checksmst2 - stw %ret0, 0(%r20) - b L$done - stw %ret1, 4(%r20) - -L$checksmst2 - comib,<>,n FFI_TYPE_SMALL_STRUCT2, %r21, L$checksmst3 - /* 2-byte structs are returned in ret0 as ????xxyy. */ - extru %ret0, 23, 8, %r22 - stbs,ma %r22, 1(%r20) - b L$done - stb %ret0, 0(%r20) - -L$checksmst3 - comib,<>,n FFI_TYPE_SMALL_STRUCT3, %r21, L$checksmst4 - /* 3-byte structs are returned in ret0 as ??xxyyzz. */ - extru %ret0, 15, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret0, 23, 8, %r22 - stbs,ma %r22, 1(%r20) - b L$done - stb %ret0, 0(%r20) - -L$checksmst4 - comib,<>,n FFI_TYPE_SMALL_STRUCT4, %r21, L$checksmst5 - /* 4-byte structs are returned in ret0 as wwxxyyzz. */ - extru %ret0, 7, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret0, 15, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret0, 23, 8, %r22 - stbs,ma %r22, 1(%r20) - b L$done - stb %ret0, 0(%r20) - -L$checksmst5 - comib,<>,n FFI_TYPE_SMALL_STRUCT5, %r21, L$checksmst6 - /* 5 byte values are returned right justified: - ret0 ret1 - 5: ??????aa bbccddee */ - stbs,ma %ret0, 1(%r20) - extru %ret1, 7, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret1, 15, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret1, 23, 8, %r22 - stbs,ma %r22, 1(%r20) - b L$done - stb %ret1, 0(%r20) - -L$checksmst6 - comib,<>,n FFI_TYPE_SMALL_STRUCT6, %r21, L$checksmst7 - /* 6 byte values are returned right justified: - ret0 ret1 - 6: ????aabb ccddeeff */ - extru %ret0, 23, 8, %r22 - stbs,ma %r22, 1(%r20) - stbs,ma %ret0, 1(%r20) - extru %ret1, 7, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret1, 15, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret1, 23, 8, %r22 - stbs,ma %r22, 1(%r20) - b L$done - stb %ret1, 0(%r20) - -L$checksmst7 - comib,<>,n FFI_TYPE_SMALL_STRUCT7, %r21, L$checksmst8 - /* 7 byte values are returned right justified: - ret0 ret1 - 7: ??aabbcc ddeeffgg */ - extru %ret0, 15, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret0, 23, 8, %r22 - stbs,ma %r22, 1(%r20) - stbs,ma %ret0, 1(%r20) - extru %ret1, 7, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret1, 15, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret1, 23, 8, %r22 - stbs,ma %r22, 1(%r20) - b L$done - stb %ret1, 0(%r20) - -L$checksmst8 - comib,<>,n FFI_TYPE_SMALL_STRUCT8, %r21, L$done - /* 8 byte values are returned right justified: - ret0 ret1 - 8: aabbccdd eeffgghh */ - extru %ret0, 7, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret0, 15, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret0, 23, 8, %r22 - stbs,ma %r22, 1(%r20) - stbs,ma %ret0, 1(%r20) - extru %ret1, 7, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret1, 15, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret1, 23, 8, %r22 - stbs,ma %r22, 1(%r20) - stb %ret1, 0(%r20) - -L$done - /* all done, return */ - copy %r4, %sp ; pop arg stack - ldw 12(%r3), %r4 - ldwm -64(%sp), %r3 ; .. and pop stack - ldw -20(%sp), %rp - bv %r0(%rp) - nop - .exit - .procend -L$FE1 - - /* void ffi_closure_pa32(void); - Called with closure argument in %r19 */ - - .SPACE $TEXT$ - .SUBSPA $CODE$ - .export ffi_closure_pa32,ENTRY,PRIV_LEV=3,RTNVAL=GR - .import ffi_closure_inner_pa32,CODE - .align 4 -L$FB2 -ffi_closure_pa32 - .proc - .callinfo FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=3 - .entry - - stw %rp, -20(%sp) - copy %r3, %r1 -L$CFI21 - copy %sp, %r3 -L$CFI22 - stwm %r1, 64(%sp) - - /* Put arguments onto the stack and call ffi_closure_inner. */ - stw %arg0, -36(%r3) - stw %arg1, -40(%r3) - stw %arg2, -44(%r3) - stw %arg3, -48(%r3) - - /* Retrieve closure pointer and real gp. */ - copy %r19, %arg0 - ldw 8(%r19), %r19 - bl ffi_closure_inner_pa32, %r2 - copy %r3, %arg1 - ldwm -64(%sp), %r3 - ldw -20(%sp), %rp - ldw -36(%sp), %ret0 - bv %r0(%rp) - ldw -40(%sp), %ret1 - .exit - .procend -L$FE2: - - .SPACE $PRIVATE$ - .SUBSPA $DATA$ - - .align 4 - .EXPORT _GLOBAL__F_ffi_call_pa32,DATA -_GLOBAL__F_ffi_call_pa32 -L$frame1: - .word L$ECIE1-L$SCIE1 ;# Length of Common Information Entry -L$SCIE1: - .word 0x0 ;# CIE Identifier Tag - .byte 0x1 ;# CIE Version - .ascii "\0" ;# CIE Augmentation - .uleb128 0x1 ;# CIE Code Alignment Factor - .sleb128 4 ;# CIE Data Alignment Factor - .byte 0x2 ;# CIE RA Column - .byte 0xc ;# DW_CFA_def_cfa - .uleb128 0x1e - .uleb128 0x0 - .align 4 -L$ECIE1: -L$SFDE1: - .word L$EFDE1-L$ASFDE1 ;# FDE Length -L$ASFDE1: - .word L$ASFDE1-L$frame1 ;# FDE CIE offset - .word L$FB1 ;# FDE initial location - .word L$FE1-L$FB1 ;# FDE address range - - .byte 0x4 ;# DW_CFA_advance_loc4 - .word L$CFI11-L$FB1 - .byte 0x83 ;# DW_CFA_offset, column 0x3 - .uleb128 0x0 - .byte 0x11 ;# DW_CFA_offset_extended_sf; save r2 at [r30-20] - .uleb128 0x2 - .sleb128 -5 - - .byte 0x4 ;# DW_CFA_advance_loc4 - .word L$CFI12-L$CFI11 - .byte 0xd ;# DW_CFA_def_cfa_register = r3 - .uleb128 0x3 - - .byte 0x4 ;# DW_CFA_advance_loc4 - .word L$CFI13-L$CFI12 - .byte 0x84 ;# DW_CFA_offset, column 0x4 - .uleb128 0x3 - - .align 4 -L$EFDE1: - -L$SFDE2: - .word L$EFDE2-L$ASFDE2 ;# FDE Length -L$ASFDE2: - .word L$ASFDE2-L$frame1 ;# FDE CIE offset - .word L$FB2 ;# FDE initial location - .word L$FE2-L$FB2 ;# FDE address range - .byte 0x4 ;# DW_CFA_advance_loc4 - .word L$CFI21-L$FB2 - .byte 0x83 ;# DW_CFA_offset, column 0x3 - .uleb128 0x0 - .byte 0x11 ;# DW_CFA_offset_extended_sf - .uleb128 0x2 - .sleb128 -5 - - .byte 0x4 ;# DW_CFA_advance_loc4 - .word L$CFI22-L$CFI21 - .byte 0xd ;# DW_CFA_def_cfa_register = r3 - .uleb128 0x3 - - .align 4 -L$EFDE2: diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/pa/linux.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/pa/linux.S deleted file mode 100644 index 33ef0b1..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/pa/linux.S +++ /dev/null @@ -1,380 +0,0 @@ -/* ----------------------------------------------------------------------- - linux.S - (c) 2003-2004 Randolph Chung - (c) 2008 Red Hat, Inc. - - HPPA Foreign Function Interface - - 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 RENESAS TECHNOLOGY 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. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include - - .text - .level 1.1 - .align 4 - - /* void ffi_call_pa32(void (*)(char *, extended_cif *), - extended_cif *ecif, - unsigned bytes, - unsigned flags, - unsigned *rvalue, - void (*fn)(void)); - */ - - .export ffi_call_pa32,code - .import ffi_prep_args_pa32,code - - .type ffi_call_pa32, @function -.LFB1: -ffi_call_pa32: - .proc - .callinfo FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=4 - .entry - stw %rp, -20(%sp) - copy %r3, %r1 -.LCFI11: - - copy %sp, %r3 -.LCFI12: - - /* Setup the stack for calling prep_args... - We want the stack to look like this: - - [ Previous stack ] <- %r3 - - [ 64-bytes register save area ] <- %r4 - - [ Stack space for actual call, passed as ] <- %arg0 - [ arg0 to ffi_prep_args_pa32 ] - - [ Stack for calling prep_args ] <- %sp - */ - - stwm %r1, 64(%sp) - stw %r4, 12(%r3) -.LCFI13: - copy %sp, %r4 - - addl %arg2, %r4, %arg0 /* arg stack */ - stw %arg3, -48(%r3) /* save flags; we need it later */ - - /* Call prep_args: - %arg0(stack) -- set up above - %arg1(ecif) -- same as incoming param - %arg2(bytes) -- same as incoming param */ - bl ffi_prep_args_pa32,%r2 - ldo 64(%arg0), %sp - ldo -64(%sp), %sp - - /* now %sp should point where %arg0 was pointing. */ - - /* Load the arguments that should be passed in registers - The fp args were loaded by the prep_args function. */ - ldw -36(%sp), %arg0 - ldw -40(%sp), %arg1 - ldw -44(%sp), %arg2 - ldw -48(%sp), %arg3 - - /* in case the function is going to return a structure - we need to give it a place to put the result. */ - ldw -52(%r3), %ret0 /* %ret0 <- rvalue */ - ldw -56(%r3), %r22 /* %r22 <- function to call */ - bl $$dyncall, %r31 /* Call the user function */ - copy %r31, %rp - - /* Prepare to store the result; we need to recover flags and rvalue. */ - ldw -48(%r3), %r21 /* r21 <- flags */ - ldw -52(%r3), %r20 /* r20 <- rvalue */ - - /* Store the result according to the return type. */ - -.Lcheckint: - comib,<>,n FFI_TYPE_INT, %r21, .Lcheckint8 - b .Ldone - stw %ret0, 0(%r20) - -.Lcheckint8: - comib,<>,n FFI_TYPE_UINT8, %r21, .Lcheckint16 - b .Ldone - stb %ret0, 0(%r20) - -.Lcheckint16: - comib,<>,n FFI_TYPE_UINT16, %r21, .Lcheckdbl - b .Ldone - sth %ret0, 0(%r20) - -.Lcheckdbl: - comib,<>,n FFI_TYPE_DOUBLE, %r21, .Lcheckfloat - b .Ldone - fstd %fr4,0(%r20) - -.Lcheckfloat: - comib,<>,n FFI_TYPE_FLOAT, %r21, .Lcheckll - b .Ldone - fstw %fr4L,0(%r20) - -.Lcheckll: - comib,<>,n FFI_TYPE_UINT64, %r21, .Lchecksmst2 - stw %ret0, 0(%r20) - b .Ldone - stw %ret1, 4(%r20) - -.Lchecksmst2: - comib,<>,n FFI_TYPE_SMALL_STRUCT2, %r21, .Lchecksmst3 - /* 2-byte structs are returned in ret0 as ????xxyy. */ - extru %ret0, 23, 8, %r22 - stbs,ma %r22, 1(%r20) - b .Ldone - stb %ret0, 0(%r20) - -.Lchecksmst3: - comib,<>,n FFI_TYPE_SMALL_STRUCT3, %r21, .Lchecksmst4 - /* 3-byte structs are returned in ret0 as ??xxyyzz. */ - extru %ret0, 15, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret0, 23, 8, %r22 - stbs,ma %r22, 1(%r20) - b .Ldone - stb %ret0, 0(%r20) - -.Lchecksmst4: - comib,<>,n FFI_TYPE_SMALL_STRUCT4, %r21, .Lchecksmst5 - /* 4-byte structs are returned in ret0 as wwxxyyzz. */ - extru %ret0, 7, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret0, 15, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret0, 23, 8, %r22 - stbs,ma %r22, 1(%r20) - b .Ldone - stb %ret0, 0(%r20) - -.Lchecksmst5: - comib,<>,n FFI_TYPE_SMALL_STRUCT5, %r21, .Lchecksmst6 - /* 5 byte values are returned right justified: - ret0 ret1 - 5: ??????aa bbccddee */ - stbs,ma %ret0, 1(%r20) - extru %ret1, 7, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret1, 15, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret1, 23, 8, %r22 - stbs,ma %r22, 1(%r20) - b .Ldone - stb %ret1, 0(%r20) - -.Lchecksmst6: - comib,<>,n FFI_TYPE_SMALL_STRUCT6, %r21, .Lchecksmst7 - /* 6 byte values are returned right justified: - ret0 ret1 - 6: ????aabb ccddeeff */ - extru %ret0, 23, 8, %r22 - stbs,ma %r22, 1(%r20) - stbs,ma %ret0, 1(%r20) - extru %ret1, 7, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret1, 15, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret1, 23, 8, %r22 - stbs,ma %r22, 1(%r20) - b .Ldone - stb %ret1, 0(%r20) - -.Lchecksmst7: - comib,<>,n FFI_TYPE_SMALL_STRUCT7, %r21, .Lchecksmst8 - /* 7 byte values are returned right justified: - ret0 ret1 - 7: ??aabbcc ddeeffgg */ - extru %ret0, 15, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret0, 23, 8, %r22 - stbs,ma %r22, 1(%r20) - stbs,ma %ret0, 1(%r20) - extru %ret1, 7, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret1, 15, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret1, 23, 8, %r22 - stbs,ma %r22, 1(%r20) - b .Ldone - stb %ret1, 0(%r20) - -.Lchecksmst8: - comib,<>,n FFI_TYPE_SMALL_STRUCT8, %r21, .Ldone - /* 8 byte values are returned right justified: - ret0 ret1 - 8: aabbccdd eeffgghh */ - extru %ret0, 7, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret0, 15, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret0, 23, 8, %r22 - stbs,ma %r22, 1(%r20) - stbs,ma %ret0, 1(%r20) - extru %ret1, 7, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret1, 15, 8, %r22 - stbs,ma %r22, 1(%r20) - extru %ret1, 23, 8, %r22 - stbs,ma %r22, 1(%r20) - stb %ret1, 0(%r20) - -.Ldone: - /* all done, return */ - copy %r4, %sp /* pop arg stack */ - ldw 12(%r3), %r4 - ldwm -64(%sp), %r3 /* .. and pop stack */ - ldw -20(%sp), %rp - bv %r0(%rp) - nop - .exit - .procend -.LFE1: - - /* void ffi_closure_pa32(void); - Called with closure argument in %r19 */ - .export ffi_closure_pa32,code - .import ffi_closure_inner_pa32,code - - .type ffi_closure_pa32, @function -.LFB2: -ffi_closure_pa32: - .proc - .callinfo FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=3 - .entry - - stw %rp, -20(%sp) -.LCFI20: - copy %r3, %r1 -.LCFI21: - copy %sp, %r3 -.LCFI22: - stwm %r1, 64(%sp) - - /* Put arguments onto the stack and call ffi_closure_inner. */ - stw %arg0, -36(%r3) - stw %arg1, -40(%r3) - stw %arg2, -44(%r3) - stw %arg3, -48(%r3) - - /* Retrieve closure pointer and real gp. */ - copy %r19, %arg0 - ldw 8(%r19), %r19 - bl ffi_closure_inner_pa32, %r2 - copy %r3, %arg1 - - ldwm -64(%sp), %r3 - ldw -20(%sp), %rp - ldw -36(%sp), %ret0 - bv %r0(%r2) - ldw -40(%sp), %ret1 - - .exit - .procend -.LFE2: - - .section ".eh_frame",EH_FRAME_FLAGS,@progbits -.Lframe1: - .word .LECIE1-.LSCIE1 ;# Length of Common Information Entry -.LSCIE1: - .word 0x0 ;# CIE Identifier Tag - .byte 0x1 ;# CIE Version -#ifdef __PIC__ - .ascii "zR\0" ;# CIE Augmentation: 'z' - data, 'R' - DW_EH_PE_... data -#else - .ascii "\0" ;# CIE Augmentation -#endif - .uleb128 0x1 ;# CIE Code Alignment Factor - .sleb128 4 ;# CIE Data Alignment Factor - .byte 0x2 ;# CIE RA Column -#ifdef __PIC__ - .uleb128 0x1 ;# Augmentation size - .byte 0x1b ;# FDE Encoding (DW_EH_PE_pcrel|DW_EH_PE_sdata4) -#endif - .byte 0xc ;# DW_CFA_def_cfa - .uleb128 0x1e - .uleb128 0x0 - .align 4 -.LECIE1: -.LSFDE1: - .word .LEFDE1-.LASFDE1 ;# FDE Length -.LASFDE1: - .word .LASFDE1-.Lframe1 ;# FDE CIE offset -#ifdef __PIC__ - .word .LFB1-. ;# FDE initial location -#else - .word .LFB1 ;# FDE initial location -#endif - .word .LFE1-.LFB1 ;# FDE address range -#ifdef __PIC__ - .uleb128 0x0 ;# Augmentation size: no data -#endif - .byte 0x4 ;# DW_CFA_advance_loc4 - .word .LCFI11-.LFB1 - .byte 0x83 ;# DW_CFA_offset, column 0x3 - .uleb128 0x0 - .byte 0x11 ;# DW_CFA_offset_extended_sf; save r2 at [r30-20] - .uleb128 0x2 - .sleb128 -5 - - .byte 0x4 ;# DW_CFA_advance_loc4 - .word .LCFI12-.LCFI11 - .byte 0xd ;# DW_CFA_def_cfa_register = r3 - .uleb128 0x3 - - .byte 0x4 ;# DW_CFA_advance_loc4 - .word .LCFI13-.LCFI12 - .byte 0x84 ;# DW_CFA_offset, column 0x4 - .uleb128 0x3 - - .align 4 -.LEFDE1: - -.LSFDE2: - .word .LEFDE2-.LASFDE2 ;# FDE Length -.LASFDE2: - .word .LASFDE2-.Lframe1 ;# FDE CIE offset -#ifdef __PIC__ - .word .LFB2-. ;# FDE initial location -#else - .word .LFB2 ;# FDE initial location -#endif - .word .LFE2-.LFB2 ;# FDE address range -#ifdef __PIC__ - .uleb128 0x0 ;# Augmentation size: no data -#endif - .byte 0x4 ;# DW_CFA_advance_loc4 - .word .LCFI21-.LFB2 - .byte 0x83 ;# DW_CFA_offset, column 0x3 - .uleb128 0x0 - .byte 0x11 ;# DW_CFA_offset_extended_sf - .uleb128 0x2 - .sleb128 -5 - - .byte 0x4 ;# DW_CFA_advance_loc4 - .word .LCFI22-.LCFI21 - .byte 0xd ;# DW_CFA_def_cfa_register = r3 - .uleb128 0x3 - - .align 4 -.LEFDE2: diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/aix.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/aix.S deleted file mode 100644 index 7ba5415..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/aix.S +++ /dev/null @@ -1,566 +0,0 @@ -/* ----------------------------------------------------------------------- - aix.S - Copyright (c) 2002, 2009 Free Software Foundation, Inc. - based on darwin.S by John Hornkvist - - PowerPC Assembly glue. - - 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 AUTHOR 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. - ----------------------------------------------------------------------- */ - - .set r0,0 - .set r1,1 - .set r2,2 - .set r3,3 - .set r4,4 - .set r5,5 - .set r6,6 - .set r7,7 - .set r8,8 - .set r9,9 - .set r10,10 - .set r11,11 - .set r12,12 - .set r13,13 - .set r14,14 - .set r15,15 - .set r16,16 - .set r17,17 - .set r18,18 - .set r19,19 - .set r20,20 - .set r21,21 - .set r22,22 - .set r23,23 - .set r24,24 - .set r25,25 - .set r26,26 - .set r27,27 - .set r28,28 - .set r29,29 - .set r30,30 - .set r31,31 - .set f0,0 - .set f1,1 - .set f2,2 - .set f3,3 - .set f4,4 - .set f5,5 - .set f6,6 - .set f7,7 - .set f8,8 - .set f9,9 - .set f10,10 - .set f11,11 - .set f12,12 - .set f13,13 - .set f14,14 - .set f15,15 - .set f16,16 - .set f17,17 - .set f18,18 - .set f19,19 - .set f20,20 - .set f21,21 - - .extern .ffi_prep_args - -#define LIBFFI_ASM -#include -#include -#define JUMPTARGET(name) name -#define L(x) x - .file "aix.S" - .toc - - /* void ffi_call_AIX(extended_cif *ecif, unsigned long bytes, - * unsigned int flags, unsigned int *rvalue, - * void (*fn)(), - * void (*prep_args)(extended_cif*, unsigned *const)); - * r3=ecif, r4=bytes, r5=flags, r6=rvalue, r7=fn, r8=prep_args - */ - -.csect .text[PR] - .align 2 - .globl ffi_call_AIX - .globl .ffi_call_AIX -.csect ffi_call_AIX[DS] -ffi_call_AIX: -#ifdef __64BIT__ - .llong .ffi_call_AIX, TOC[tc0], 0 - .csect .text[PR] -.ffi_call_AIX: - .function .ffi_call_AIX,.ffi_call_AIX,16,044,LFE..0-LFB..0 - .bf __LINE__ - .line 1 -LFB..0: - /* Save registers we use. */ - mflr r0 - - std r28,-32(r1) - std r29,-24(r1) - std r30,-16(r1) - std r31, -8(r1) - - std r0, 16(r1) -LCFI..0: - mr r28, r1 /* our AP. */ - stdux r1, r1, r4 -LCFI..1: - - /* Save arguments over call... */ - mr r31, r5 /* flags, */ - mr r30, r6 /* rvalue, */ - mr r29, r7 /* function address. */ - std r2, 40(r1) - - /* Call ffi_prep_args. */ - mr r4, r1 - bl .ffi_prep_args - nop - - /* Now do the call. */ - ld r0, 0(r29) - ld r2, 8(r29) - ld r11, 16(r29) - /* Set up cr1 with bits 4-7 of the flags. */ - mtcrf 0x40, r31 - mtctr r0 - /* Load all those argument registers. */ - /* We have set up a nice stack frame, just load it into registers. */ - ld r3, 40+(1*8)(r1) - ld r4, 40+(2*8)(r1) - ld r5, 40+(3*8)(r1) - ld r6, 40+(4*8)(r1) - nop - ld r7, 40+(5*8)(r1) - ld r8, 40+(6*8)(r1) - ld r9, 40+(7*8)(r1) - ld r10,40+(8*8)(r1) - -L1: - /* Load all the FP registers. */ - bf 6,L2 /* 2f + 0x18 */ - lfd f1,-32-(13*8)(r28) - lfd f2,-32-(12*8)(r28) - lfd f3,-32-(11*8)(r28) - lfd f4,-32-(10*8)(r28) - nop - lfd f5,-32-(9*8)(r28) - lfd f6,-32-(8*8)(r28) - lfd f7,-32-(7*8)(r28) - lfd f8,-32-(6*8)(r28) - nop - lfd f9,-32-(5*8)(r28) - lfd f10,-32-(4*8)(r28) - lfd f11,-32-(3*8)(r28) - lfd f12,-32-(2*8)(r28) - nop - lfd f13,-32-(1*8)(r28) - -L2: - /* Make the call. */ - bctrl - ld r2, 40(r1) - - /* Now, deal with the return value. */ - mtcrf 0x01, r31 - - bt 30, L(done_return_value) - bt 29, L(fp_return_value) - std r3, 0(r30) - - /* Fall through... */ - -L(done_return_value): - /* Restore the registers we used and return. */ - mr r1, r28 - ld r0, 16(r28) - ld r28, -32(r1) - mtlr r0 - ld r29, -24(r1) - ld r30, -16(r1) - ld r31, -8(r1) - blr - -L(fp_return_value): - bf 28, L(float_return_value) - stfd f1, 0(r30) - bf 31, L(done_return_value) - stfd f2, 8(r30) - b L(done_return_value) -L(float_return_value): - stfs f1, 0(r30) - b L(done_return_value) -LFE..0: -#else /* ! __64BIT__ */ - - .long .ffi_call_AIX, TOC[tc0], 0 - .csect .text[PR] -.ffi_call_AIX: - .function .ffi_call_AIX,.ffi_call_AIX,16,044,LFE..0-LFB..0 - .bf __LINE__ - .line 1 -LFB..0: - /* Save registers we use. */ - mflr r0 - - stw r28,-16(r1) - stw r29,-12(r1) - stw r30, -8(r1) - stw r31, -4(r1) - - stw r0, 8(r1) -LCFI..0: - mr r28, r1 /* out AP. */ - stwux r1, r1, r4 -LCFI..1: - - /* Save arguments over call... */ - mr r31, r5 /* flags, */ - mr r30, r6 /* rvalue, */ - mr r29, r7 /* function address, */ - stw r2, 20(r1) - - /* Call ffi_prep_args. */ - mr r4, r1 - bl .ffi_prep_args - nop - - /* Now do the call. */ - lwz r0, 0(r29) - lwz r2, 4(r29) - lwz r11, 8(r29) - /* Set up cr1 with bits 4-7 of the flags. */ - mtcrf 0x40, r31 - mtctr r0 - /* Load all those argument registers. */ - /* We have set up a nice stack frame, just load it into registers. */ - lwz r3, 20+(1*4)(r1) - lwz r4, 20+(2*4)(r1) - lwz r5, 20+(3*4)(r1) - lwz r6, 20+(4*4)(r1) - nop - lwz r7, 20+(5*4)(r1) - lwz r8, 20+(6*4)(r1) - lwz r9, 20+(7*4)(r1) - lwz r10,20+(8*4)(r1) - -L1: - /* Load all the FP registers. */ - bf 6,L2 /* 2f + 0x18 */ - lfd f1,-16-(13*8)(r28) - lfd f2,-16-(12*8)(r28) - lfd f3,-16-(11*8)(r28) - lfd f4,-16-(10*8)(r28) - nop - lfd f5,-16-(9*8)(r28) - lfd f6,-16-(8*8)(r28) - lfd f7,-16-(7*8)(r28) - lfd f8,-16-(6*8)(r28) - nop - lfd f9,-16-(5*8)(r28) - lfd f10,-16-(4*8)(r28) - lfd f11,-16-(3*8)(r28) - lfd f12,-16-(2*8)(r28) - nop - lfd f13,-16-(1*8)(r28) - -L2: - /* Make the call. */ - bctrl - lwz r2, 20(r1) - - /* Now, deal with the return value. */ - mtcrf 0x01, r31 - - bt 30, L(done_return_value) - bt 29, L(fp_return_value) - stw r3, 0(r30) - bf 28, L(done_return_value) - stw r4, 4(r30) - - /* Fall through... */ - -L(done_return_value): - /* Restore the registers we used and return. */ - mr r1, r28 - lwz r0, 8(r28) - lwz r28,-16(r1) - mtlr r0 - lwz r29,-12(r1) - lwz r30, -8(r1) - lwz r31, -4(r1) - blr - -L(fp_return_value): - bf 28, L(float_return_value) - stfd f1, 0(r30) - b L(done_return_value) -L(float_return_value): - stfs f1, 0(r30) - b L(done_return_value) -LFE..0: -#endif - .ef __LINE__ - .long 0 - .byte 0,0,0,1,128,4,0,0 -/* END(ffi_call_AIX) */ - - /* void ffi_call_go_AIX(extended_cif *ecif, unsigned long bytes, - * unsigned int flags, unsigned int *rvalue, - * void (*fn)(), - * void (*prep_args)(extended_cif*, unsigned *const), - * void *closure); - * r3=ecif, r4=bytes, r5=flags, r6=rvalue, r7=fn, r8=prep_args, r9=closure - */ - -.csect .text[PR] - .align 2 - .globl ffi_call_go_AIX - .globl .ffi_call_go_AIX -.csect ffi_call_go_AIX[DS] -ffi_call_go_AIX: -#ifdef __64BIT__ - .llong .ffi_call_go_AIX, TOC[tc0], 0 - .csect .text[PR] -.ffi_call_go_AIX: - .function .ffi_call_go_AIX,.ffi_call_go_AIX,16,044,LFE..1-LFB..1 - .bf __LINE__ - .line 1 -LFB..1: - /* Save registers we use. */ - mflr r0 - - std r28,-32(r1) - std r29,-24(r1) - std r30,-16(r1) - std r31, -8(r1) - - std r9, 8(r1) /* closure, saved in cr field. */ - std r0, 16(r1) -LCFI..2: - mr r28, r1 /* our AP. */ - stdux r1, r1, r4 -LCFI..3: - - /* Save arguments over call... */ - mr r31, r5 /* flags, */ - mr r30, r6 /* rvalue, */ - mr r29, r7 /* function address, */ - std r2, 40(r1) - - /* Call ffi_prep_args. */ - mr r4, r1 - bl .ffi_prep_args - nop - - /* Now do the call. */ - ld r0, 0(r29) - ld r2, 8(r29) - ld r11, 8(r28) /* closure */ - /* Set up cr1 with bits 4-7 of the flags. */ - mtcrf 0x40, r31 - mtctr r0 - /* Load all those argument registers. */ - /* We have set up a nice stack frame, just load it into registers. */ - ld r3, 40+(1*8)(r1) - ld r4, 40+(2*8)(r1) - ld r5, 40+(3*8)(r1) - ld r6, 40+(4*8)(r1) - nop - ld r7, 40+(5*8)(r1) - ld r8, 40+(6*8)(r1) - ld r9, 40+(7*8)(r1) - ld r10,40+(8*8)(r1) - - b L1 -LFE..1: -#else /* ! __64BIT__ */ - - .long .ffi_call_go_AIX, TOC[tc0], 0 - .csect .text[PR] -.ffi_call_go_AIX: - .function .ffi_call_go_AIX,.ffi_call_go_AIX,16,044,LFE..1-LFB..1 - .bf __LINE__ - .line 1 - /* Save registers we use. */ -LFB..1: - mflr r0 - - stw r28,-16(r1) - stw r29,-12(r1) - stw r30, -8(r1) - stw r31, -4(r1) - - stw r9, 4(r1) /* closure, saved in cr field. */ - stw r0, 8(r1) -LCFI..2: - mr r28, r1 /* out AP. */ - stwux r1, r1, r4 -LCFI..3: - - /* Save arguments over call... */ - mr r31, r5 /* flags, */ - mr r30, r6 /* rvalue, */ - mr r29, r7 /* function address, */ - stw r2, 20(r1) - - /* Call ffi_prep_args. */ - mr r4, r1 - bl .ffi_prep_args - nop - - /* Now do the call. */ - lwz r0, 0(r29) - lwz r2, 4(r29) - lwz r11, 4(r28) /* closure */ - /* Set up cr1 with bits 4-7 of the flags. */ - mtcrf 0x40, r31 - mtctr r0 - /* Load all those argument registers. */ - /* We have set up a nice stack frame, just load it into registers. */ - lwz r3, 20+(1*4)(r1) - lwz r4, 20+(2*4)(r1) - lwz r5, 20+(3*4)(r1) - lwz r6, 20+(4*4)(r1) - nop - lwz r7, 20+(5*4)(r1) - lwz r8, 20+(6*4)(r1) - lwz r9, 20+(7*4)(r1) - lwz r10,20+(8*4)(r1) - - b L1 -LFE..1: -#endif - .ef __LINE__ - .long 0 - .byte 0,0,0,1,128,4,0,0 -/* END(ffi_call_go_AIX) */ - -.csect .text[PR] - .align 2 - .globl ffi_call_DARWIN - .globl .ffi_call_DARWIN -.csect ffi_call_DARWIN[DS] -ffi_call_DARWIN: -#ifdef __64BIT__ - .llong .ffi_call_DARWIN, TOC[tc0], 0 -#else - .long .ffi_call_DARWIN, TOC[tc0], 0 -#endif - .csect .text[PR] -.ffi_call_DARWIN: - blr - .long 0 - .byte 0,0,0,0,0,0,0,0 -/* END(ffi_call_DARWIN) */ - -/* EH frame stuff. */ - -#define LR_REGNO 0x41 /* Link Register (65), see rs6000.md */ -#ifdef __64BIT__ -#define PTRSIZE 8 -#define LOG2_PTRSIZE 3 -#define FDE_ENCODING 0x1c /* DW_EH_PE_pcrel|DW_EH_PE_sdata8 */ -#define EH_DATA_ALIGN_FACT 0x78 /* LEB128 -8 */ -#else -#define PTRSIZE 4 -#define LOG2_PTRSIZE 2 -#define FDE_ENCODING 0x1b /* DW_EH_PE_pcrel|DW_EH_PE_sdata4 */ -#define EH_DATA_ALIGN_FACT 0x7c /* LEB128 -4 */ -#endif - .csect _unwind.ro_[RO],4 - .align LOG2_PTRSIZE - .globl _GLOBAL__F_libffi_src_powerpc_aix -_GLOBAL__F_libffi_src_powerpc_aix: -Lframe..1: - .vbyte 4,LECIE..1-LSCIE..1 /* CIE Length */ -LSCIE..1: - .vbyte 4,0 /* CIE Identifier Tag */ - .byte 0x3 /* CIE Version */ - .byte "zR" /* CIE Augmentation */ - .byte 0 - .byte 0x1 /* uleb128 0x1; CIE Code Alignment Factor */ - .byte EH_DATA_ALIGN_FACT /* leb128 -4/-8; CIE Data Alignment Factor */ - .byte 0x41 /* CIE RA Column */ - .byte 0x1 /* uleb128 0x1; Augmentation size */ - .byte FDE_ENCODING /* FDE Encoding (pcrel|sdata4/8) */ - .byte 0xc /* DW_CFA_def_cfa */ - .byte 0x1 /* uleb128 0x1; Register r1 */ - .byte 0 /* uleb128 0x0; Offset 0 */ - .align LOG2_PTRSIZE -LECIE..1: -LSFDE..1: - .vbyte 4,LEFDE..1-LASFDE..1 /* FDE Length */ -LASFDE..1: - .vbyte 4,LASFDE..1-Lframe..1 /* FDE CIE offset */ - .vbyte PTRSIZE,LFB..0-$ /* FDE initial location */ - .vbyte PTRSIZE,LFE..0-LFB..0 /* FDE address range */ - .byte 0 /* uleb128 0x0; Augmentation size */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .vbyte 4,LCFI..0-LFB..0 - .byte 0x11 /* DW_CFA_def_offset_extended_sf */ - .byte LR_REGNO /* uleb128 LR_REGNO; Register LR */ - .byte 0x7e /* leb128 -2; Offset -2 (8/16) */ - .byte 0x9f /* DW_CFA_offset Register r31 */ - .byte 0x1 /* uleb128 0x1; Offset 1 (-4/-8) */ - .byte 0x9e /* DW_CFA_offset Register r30 */ - .byte 0x2 /* uleb128 0x2; Offset 2 (-8/-16) */ - .byte 0x9d /* DW_CFA_offset Register r29 */ - .byte 0x3 /* uleb128 0x3; Offset 3 (-12/-24) */ - .byte 0x9c /* DW_CFA_offset Register r28 */ - .byte 0x4 /* uleb128 0x4; Offset 4 (-16/-32) */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .vbyte 4,LCFI..1-LCFI..0 - .byte 0xd /* DW_CFA_def_cfa_register */ - .byte 0x1c /* uleb128 28; Register r28 */ - .align LOG2_PTRSIZE -LEFDE..1: -LSFDE..2: - .vbyte 4,LEFDE..2-LASFDE..2 /* FDE Length */ -LASFDE..2: - .vbyte 4,LASFDE..2-Lframe..1 /* FDE CIE offset */ - .vbyte PTRSIZE,LFB..1-$ /* FDE initial location */ - .vbyte PTRSIZE,LFE..1-LFB..1 /* FDE address range */ - .byte 0 /* uleb128 0x0; Augmentation size */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .vbyte 4,LCFI..2-LFB..1 - .byte 0x11 /* DW_CFA_def_offset_extended_sf */ - .byte LR_REGNO /* uleb128 LR_REGNO; Register LR */ - .byte 0x7e /* leb128 -2; Offset -2 (8/16) */ - .byte 0x9f /* DW_CFA_offset Register r31 */ - .byte 0x1 /* uleb128 0x1; Offset 1 (-4/-8) */ - .byte 0x9e /* DW_CFA_offset Register r30 */ - .byte 0x2 /* uleb128 0x2; Offset 2 (-8/-16) */ - .byte 0x9d /* DW_CFA_offset Register r29 */ - .byte 0x3 /* uleb128 0x3; Offset 3 (-12/-24) */ - .byte 0x9c /* DW_CFA_offset Register r28 */ - .byte 0x4 /* uleb128 0x4; Offset 4 (-16/-32) */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .vbyte 4,LCFI..3-LCFI..2 - .byte 0xd /* DW_CFA_def_cfa_register */ - .byte 0x1c /* uleb128 28; Register r28 */ - .align LOG2_PTRSIZE -LEFDE..2: - .vbyte 4,0 /* End of FDEs */ - - .csect .text[PR] - .ref _GLOBAL__F_libffi_src_powerpc_aix /* Prevents garbage collection by AIX linker */ - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/aix_closure.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/aix_closure.S deleted file mode 100644 index 132c785..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/aix_closure.S +++ /dev/null @@ -1,694 +0,0 @@ -/* ----------------------------------------------------------------------- - aix_closure.S - Copyright (c) 2002, 2003, 2009 Free Software Foundation, Inc. - based on darwin_closure.S - - PowerPC Assembly glue. - - 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 AUTHOR 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. - ----------------------------------------------------------------------- */ - - .set r0,0 - .set r1,1 - .set r2,2 - .set r3,3 - .set r4,4 - .set r5,5 - .set r6,6 - .set r7,7 - .set r8,8 - .set r9,9 - .set r10,10 - .set r11,11 - .set r12,12 - .set r13,13 - .set r14,14 - .set r15,15 - .set r16,16 - .set r17,17 - .set r18,18 - .set r19,19 - .set r20,20 - .set r21,21 - .set r22,22 - .set r23,23 - .set r24,24 - .set r25,25 - .set r26,26 - .set r27,27 - .set r28,28 - .set r29,29 - .set r30,30 - .set r31,31 - .set f0,0 - .set f1,1 - .set f2,2 - .set f3,3 - .set f4,4 - .set f5,5 - .set f6,6 - .set f7,7 - .set f8,8 - .set f9,9 - .set f10,10 - .set f11,11 - .set f12,12 - .set f13,13 - .set f14,14 - .set f15,15 - .set f16,16 - .set f17,17 - .set f18,18 - .set f19,19 - .set f20,20 - .set f21,21 - - .extern .ffi_closure_helper_DARWIN - .extern .ffi_go_closure_helper_DARWIN - -#define LIBFFI_ASM -#define JUMPTARGET(name) name -#define L(x) x - .file "aix_closure.S" - .toc -LC..60: - .tc L..60[TC],L..60 - .csect .text[PR] - .align 2 - -.csect .text[PR] - .align 2 - .globl ffi_closure_ASM - .globl .ffi_closure_ASM -.csect ffi_closure_ASM[DS] -ffi_closure_ASM: -#ifdef __64BIT__ - .llong .ffi_closure_ASM, TOC[tc0], 0 - .csect .text[PR] -.ffi_closure_ASM: - .function .ffi_closure_ASM,.ffi_closure_ASM,16,044,LFE..0-LFB..0 - .bf __LINE__ - .line 1 -LFB..0: -/* we want to build up an area for the parameters passed */ -/* in registers (both floating point and integer) */ - - /* we store gpr 3 to gpr 10 (aligned to 4) - in the parents outgoing area */ - std r3, 48+(0*8)(r1) - std r4, 48+(1*8)(r1) - std r5, 48+(2*8)(r1) - std r6, 48+(3*8)(r1) - mflr r0 - - std r7, 48+(4*8)(r1) - std r8, 48+(5*8)(r1) - std r9, 48+(6*8)(r1) - std r10, 48+(7*8)(r1) - std r0, 16(r1) /* save the return address */ -LCFI..0: - /* 48 Bytes (Linkage Area) */ - /* 64 Bytes (params) */ - /* 16 Bytes (result) */ - /* 104 Bytes (13*8 from FPR) */ - /* 8 Bytes (alignment) */ - /* 240 Bytes */ - - stdu r1, -240(r1) /* skip over caller save area - keep stack aligned to 16 */ -LCFI..1: - - /* next save fpr 1 to fpr 13 (aligned to 8) */ - stfd f1, 128+(0*8)(r1) - stfd f2, 128+(1*8)(r1) - stfd f3, 128+(2*8)(r1) - stfd f4, 128+(3*8)(r1) - stfd f5, 128+(4*8)(r1) - stfd f6, 128+(5*8)(r1) - stfd f7, 128+(6*8)(r1) - stfd f8, 128+(7*8)(r1) - stfd f9, 128+(8*8)(r1) - stfd f10, 128+(9*8)(r1) - stfd f11, 128+(10*8)(r1) - stfd f12, 128+(11*8)(r1) - stfd f13, 128+(12*8)(r1) - - /* set up registers for the routine that actually does the work */ - /* get the context pointer from the trampoline */ - mr r3, r11 - - /* now load up the pointer to the result storage */ - addi r4, r1, 112 - - /* now load up the pointer to the saved gpr registers */ - addi r5, r1, 288 - - /* now load up the pointer to the saved fpr registers */ - addi r6, r1, 128 - - /* make the call */ - bl .ffi_closure_helper_DARWIN - nop - -.Ldoneclosure: - - /* now r3 contains the return type */ - /* so use it to look up in a table */ - /* so we know how to deal with each type */ - - /* look up the proper starting point in table */ - /* by using return type as offset */ - lhz r3, 10(r3) /* load type from return type */ - ld r4, LC..60(2) /* get address of jump table */ - sldi r3, r3, 4 /* now multiply return type by 16 */ - ld r0, 240+16(r1) /* load return address */ - add r3, r3, r4 /* add contents of table to table address */ - mtctr r3 - bctr /* jump to it */ - -/* Each fragment must be exactly 16 bytes long (4 instructions). - Align to 16 byte boundary for cache and dispatch efficiency. */ - .align 4 - -L..60: -/* case FFI_TYPE_VOID */ - mtlr r0 - addi r1, r1, 240 - blr - nop - -/* case FFI_TYPE_INT */ - lwa r3, 112+4(r1) - mtlr r0 - addi r1, r1, 240 - blr - -/* case FFI_TYPE_FLOAT */ - lfs f1, 112+0(r1) - mtlr r0 - addi r1, r1, 240 - blr - -/* case FFI_TYPE_DOUBLE */ - lfd f1, 112+0(r1) - mtlr r0 - addi r1, r1, 240 - blr - -/* case FFI_TYPE_LONGDOUBLE */ - lfd f1, 112+0(r1) - mtlr r0 - lfd f2, 112+8(r1) - b L..finish - -/* case FFI_TYPE_UINT8 */ - lbz r3, 112+7(r1) - mtlr r0 - addi r1, r1, 240 - blr - -/* case FFI_TYPE_SINT8 */ - lbz r3, 112+7(r1) - mtlr r0 - extsb r3, r3 - b L..finish - -/* case FFI_TYPE_UINT16 */ - lhz r3, 112+6(r1) - mtlr r0 -L..finish: - addi r1, r1, 240 - blr - -/* case FFI_TYPE_SINT16 */ - lha r3, 112+6(r1) - mtlr r0 - addi r1, r1, 240 - blr - -/* case FFI_TYPE_UINT32 */ - lwz r3, 112+4(r1) - mtlr r0 - addi r1, r1, 240 - blr - -/* case FFI_TYPE_SINT32 */ - lwa r3, 112+4(r1) - mtlr r0 - addi r1, r1, 240 - blr - -/* case FFI_TYPE_UINT64 */ - ld r3, 112+0(r1) - mtlr r0 - addi r1, r1, 240 - blr - -/* case FFI_TYPE_SINT64 */ - ld r3, 112+0(r1) - mtlr r0 - addi r1, r1, 240 - blr - -/* case FFI_TYPE_STRUCT */ - mtlr r0 - addi r1, r1, 240 - blr - nop - -/* case FFI_TYPE_POINTER */ - ld r3, 112+0(r1) - mtlr r0 - addi r1, r1, 240 - blr -LFE..0: - -#else /* ! __64BIT__ */ - - .long .ffi_closure_ASM, TOC[tc0], 0 - .csect .text[PR] -.ffi_closure_ASM: - .function .ffi_closure_ASM,.ffi_closure_ASM,16,044,LFE..0-LFB..0 - .bf __LINE__ - .line 1 -LFB..0: -/* we want to build up an area for the parameters passed */ -/* in registers (both floating point and integer) */ - - /* we store gpr 3 to gpr 10 (aligned to 4) - in the parents outgoing area */ - stw r3, 24+(0*4)(r1) - stw r4, 24+(1*4)(r1) - stw r5, 24+(2*4)(r1) - stw r6, 24+(3*4)(r1) - mflr r0 - - stw r7, 24+(4*4)(r1) - stw r8, 24+(5*4)(r1) - stw r9, 24+(6*4)(r1) - stw r10, 24+(7*4)(r1) - stw r0, 8(r1) -LCFI..0: - /* 24 Bytes (Linkage Area) */ - /* 32 Bytes (params) */ - /* 16 Bytes (result) */ - /* 104 Bytes (13*8 from FPR) */ - /* 176 Bytes */ - - stwu r1, -176(r1) /* skip over caller save area - keep stack aligned to 16 */ -LCFI..1: - - /* next save fpr 1 to fpr 13 (aligned to 8) */ - stfd f1, 72+(0*8)(r1) - stfd f2, 72+(1*8)(r1) - stfd f3, 72+(2*8)(r1) - stfd f4, 72+(3*8)(r1) - stfd f5, 72+(4*8)(r1) - stfd f6, 72+(5*8)(r1) - stfd f7, 72+(6*8)(r1) - stfd f8, 72+(7*8)(r1) - stfd f9, 72+(8*8)(r1) - stfd f10, 72+(9*8)(r1) - stfd f11, 72+(10*8)(r1) - stfd f12, 72+(11*8)(r1) - stfd f13, 72+(12*8)(r1) - - /* set up registers for the routine that actually does the work */ - /* get the context pointer from the trampoline */ - mr r3, r11 - - /* now load up the pointer to the result storage */ - addi r4, r1, 56 - - /* now load up the pointer to the saved gpr registers */ - addi r5, r1, 200 - - /* now load up the pointer to the saved fpr registers */ - addi r6, r1, 72 - - /* make the call */ - bl .ffi_closure_helper_DARWIN - nop - -.Ldoneclosure: - - /* now r3 contains the return type */ - /* so use it to look up in a table */ - /* so we know how to deal with each type */ - - /* look up the proper starting point in table */ - /* by using return type as offset */ - lhz r3, 6(r3) /* load type from return type */ - lwz r4, LC..60(2) /* get address of jump table */ - slwi r3, r3, 4 /* now multiply return type by 16 */ - lwz r0, 176+8(r1) /* load return address */ - add r3, r3, r4 /* add contents of table to table address */ - mtctr r3 - bctr /* jump to it */ - -/* Each fragment must be exactly 16 bytes long (4 instructions). - Align to 16 byte boundary for cache and dispatch efficiency. */ - .align 4 - -L..60: -/* case FFI_TYPE_VOID */ - mtlr r0 - addi r1, r1, 176 - blr - nop - -/* case FFI_TYPE_INT */ - lwz r3, 56+0(r1) - mtlr r0 - addi r1, r1, 176 - blr - -/* case FFI_TYPE_FLOAT */ - lfs f1, 56+0(r1) - mtlr r0 - addi r1, r1, 176 - blr - -/* case FFI_TYPE_DOUBLE */ - lfd f1, 56+0(r1) - mtlr r0 - addi r1, r1, 176 - blr - -/* case FFI_TYPE_LONGDOUBLE */ - lfd f1, 56+0(r1) - mtlr r0 - lfd f2, 56+8(r1) - b L..finish - -/* case FFI_TYPE_UINT8 */ - lbz r3, 56+3(r1) - mtlr r0 - addi r1, r1, 176 - blr - -/* case FFI_TYPE_SINT8 */ - lbz r3, 56+3(r1) - mtlr r0 - extsb r3, r3 - b L..finish - -/* case FFI_TYPE_UINT16 */ - lhz r3, 56+2(r1) - mtlr r0 - addi r1, r1, 176 - blr - -/* case FFI_TYPE_SINT16 */ - lha r3, 56+2(r1) - mtlr r0 - addi r1, r1, 176 - blr - -/* case FFI_TYPE_UINT32 */ - lwz r3, 56+0(r1) - mtlr r0 - addi r1, r1, 176 - blr - -/* case FFI_TYPE_SINT32 */ - lwz r3, 56+0(r1) - mtlr r0 - addi r1, r1, 176 - blr - -/* case FFI_TYPE_UINT64 */ - lwz r3, 56+0(r1) - mtlr r0 - lwz r4, 56+4(r1) - b L..finish - -/* case FFI_TYPE_SINT64 */ - lwz r3, 56+0(r1) - mtlr r0 - lwz r4, 56+4(r1) - b L..finish - -/* case FFI_TYPE_STRUCT */ - mtlr r0 - addi r1, r1, 176 - blr - nop - -/* case FFI_TYPE_POINTER */ - lwz r3, 56+0(r1) - mtlr r0 -L..finish: - addi r1, r1, 176 - blr -LFE..0: -#endif - .ef __LINE__ -/* END(ffi_closure_ASM) */ - - -.csect .text[PR] - .align 2 - .globl ffi_go_closure_ASM - .globl .ffi_go_closure_ASM -.csect ffi_go_closure_ASM[DS] -ffi_go_closure_ASM: -#ifdef __64BIT__ - .llong .ffi_go_closure_ASM, TOC[tc0], 0 - .csect .text[PR] -.ffi_go_closure_ASM: - .function .ffi_go_closure_ASM,.ffi_go_closure_ASM,16,044,LFE..1-LFB..1 - .bf __LINE__ - .line 1 -LFB..1: -/* we want to build up an area for the parameters passed */ -/* in registers (both floating point and integer) */ - - /* we store gpr 3 to gpr 10 (aligned to 4) - in the parents outgoing area */ - std r3, 48+(0*8)(r1) - std r4, 48+(1*8)(r1) - std r5, 48+(2*8)(r1) - std r6, 48+(3*8)(r1) - mflr r0 - - std r7, 48+(4*8)(r1) - std r8, 48+(5*8)(r1) - std r9, 48+(6*8)(r1) - std r10, 48+(7*8)(r1) - std r0, 16(r1) /* save the return address */ -LCFI..2: - /* 48 Bytes (Linkage Area) */ - /* 64 Bytes (params) */ - /* 16 Bytes (result) */ - /* 104 Bytes (13*8 from FPR) */ - /* 8 Bytes (alignment) */ - /* 240 Bytes */ - - stdu r1, -240(r1) /* skip over caller save area - keep stack aligned to 16 */ -LCFI..3: - - /* next save fpr 1 to fpr 13 (aligned to 8) */ - stfd f1, 128+(0*8)(r1) - stfd f2, 128+(1*8)(r1) - stfd f3, 128+(2*8)(r1) - stfd f4, 128+(3*8)(r1) - stfd f5, 128+(4*8)(r1) - stfd f6, 128+(5*8)(r1) - stfd f7, 128+(6*8)(r1) - stfd f8, 128+(7*8)(r1) - stfd f9, 128+(8*8)(r1) - stfd f10, 128+(9*8)(r1) - stfd f11, 128+(10*8)(r1) - stfd f12, 128+(11*8)(r1) - stfd f13, 128+(12*8)(r1) - - /* set up registers for the routine that actually does the work */ - mr r3, r11 /* go closure */ - - /* now load up the pointer to the result storage */ - addi r4, r1, 112 - - /* now load up the pointer to the saved gpr registers */ - addi r5, r1, 288 - - /* now load up the pointer to the saved fpr registers */ - addi r6, r1, 128 - - /* make the call */ - bl .ffi_go_closure_helper_DARWIN - nop - - b .Ldoneclosure -LFE..1: - -#else /* ! __64BIT__ */ - - .long .ffi_go_closure_ASM, TOC[tc0], 0 - .csect .text[PR] -.ffi_go_closure_ASM: - .function .ffi_go_closure_ASM,.ffi_go_closure_ASM,16,044,LFE..1-LFB..1 - .bf __LINE__ - .line 1 -LFB..1: -/* we want to build up an area for the parameters passed */ -/* in registers (both floating point and integer) */ - - /* we store gpr 3 to gpr 10 (aligned to 4) - in the parents outgoing area */ - stw r3, 24+(0*4)(r1) - stw r4, 24+(1*4)(r1) - stw r5, 24+(2*4)(r1) - stw r6, 24+(3*4)(r1) - mflr r0 - - stw r7, 24+(4*4)(r1) - stw r8, 24+(5*4)(r1) - stw r9, 24+(6*4)(r1) - stw r10, 24+(7*4)(r1) - stw r0, 8(r1) -LCFI..2: - /* 24 Bytes (Linkage Area) */ - /* 32 Bytes (params) */ - /* 16 Bytes (result) */ - /* 104 Bytes (13*8 from FPR) */ - /* 176 Bytes */ - - stwu r1, -176(r1) /* skip over caller save area - keep stack aligned to 16 */ -LCFI..3: - - /* next save fpr 1 to fpr 13 (aligned to 8) */ - stfd f1, 72+(0*8)(r1) - stfd f2, 72+(1*8)(r1) - stfd f3, 72+(2*8)(r1) - stfd f4, 72+(3*8)(r1) - stfd f5, 72+(4*8)(r1) - stfd f6, 72+(5*8)(r1) - stfd f7, 72+(6*8)(r1) - stfd f8, 72+(7*8)(r1) - stfd f9, 72+(8*8)(r1) - stfd f10, 72+(9*8)(r1) - stfd f11, 72+(10*8)(r1) - stfd f12, 72+(11*8)(r1) - stfd f13, 72+(12*8)(r1) - - /* set up registers for the routine that actually does the work */ - mr r3, 11 /* go closure */ - - /* now load up the pointer to the result storage */ - addi r4, r1, 56 - - /* now load up the pointer to the saved gpr registers */ - addi r5, r1, 200 - - /* now load up the pointer to the saved fpr registers */ - addi r6, r1, 72 - - /* make the call */ - bl .ffi_go_closure_helper_DARWIN - nop - - b .Ldoneclosure -LFE..1: -#endif - .ef __LINE__ -/* END(ffi_go_closure_ASM) */ - -/* EH frame stuff. */ - -#define LR_REGNO 0x41 /* Link Register (65), see rs6000.md */ -#ifdef __64BIT__ -#define PTRSIZE 8 -#define LOG2_PTRSIZE 3 -#define CFA_OFFSET 0xf0,0x01 /* LEB128 240 */ -#define FDE_ENCODING 0x1c /* DW_EH_PE_pcrel|DW_EH_PE_sdata8 */ -#define EH_DATA_ALIGN_FACT 0x78 /* LEB128 -8 */ -#else -#define PTRSIZE 4 -#define LOG2_PTRSIZE 2 -#define CFA_OFFSET 0xb0,0x01 /* LEB128 176 */ -#define FDE_ENCODING 0x1b /* DW_EH_PE_pcrel|DW_EH_PE_sdata4 */ -#define EH_DATA_ALIGN_FACT 0x7c /* LEB128 -4 */ -#endif - - .csect _unwind.ro_[RO],4 - .align LOG2_PTRSIZE - .globl _GLOBAL__F_libffi_src_powerpc_aix_closure -_GLOBAL__F_libffi_src_powerpc_aix_closure: -Lframe..1: - .vbyte 4,LECIE..1-LSCIE..1 /* CIE Length */ -LSCIE..1: - .vbyte 4,0 /* CIE Identifier Tag */ - .byte 0x3 /* CIE Version */ - .byte "zR" /* CIE Augmentation */ - .byte 0 - .byte 0x1 /* uleb128 0x1; CIE Code Alignment Factor */ - .byte EH_DATA_ALIGN_FACT /* leb128 -4/-8; CIE Data Alignment Factor */ - .byte LR_REGNO /* CIE RA Column */ - .byte 0x1 /* uleb128 0x1; Augmentation size */ - .byte FDE_ENCODING /* FDE Encoding (pcrel|sdata4/8) */ - .byte 0xc /* DW_CFA_def_cfa */ - .byte 0x1 /* uleb128 0x1; Register r1 */ - .byte 0 /* uleb128 0x0; Offset 0 */ - .align LOG2_PTRSIZE -LECIE..1: -LSFDE..1: - .vbyte 4,LEFDE..1-LASFDE..1 /* FDE Length */ -LASFDE..1: - .vbyte 4,LASFDE..1-Lframe..1 /* FDE CIE offset */ - .vbyte PTRSIZE,LFB..0-$ /* FDE initial location */ - .vbyte PTRSIZE,LFE..0-LFB..0 /* FDE address range */ - .byte 0 /* uleb128 0x0; Augmentation size */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .vbyte 4,LCFI..1-LCFI..0 - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte CFA_OFFSET /* uleb128 176/240 */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .vbyte 4,LCFI..0-LFB..0 - .byte 0x11 /* DW_CFA_offset_extended_sf */ - .byte LR_REGNO /* uleb128 LR_REGNO; Register LR */ - .byte 0x7e /* leb128 -2; Offset -2 (8/16) */ - .align LOG2_PTRSIZE -LEFDE..1: -LSFDE..2: - .vbyte 4,LEFDE..2-LASFDE..2 /* FDE Length */ -LASFDE..2: - .vbyte 4,LASFDE..2-Lframe..1 /* FDE CIE offset */ - .vbyte PTRSIZE,LFB..1-$ /* FDE initial location */ - .vbyte PTRSIZE,LFE..1-LFB..1 /* FDE address range */ - .byte 0 /* uleb128 0x0; Augmentation size */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .vbyte 4,LCFI..3-LCFI..2 - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte CFA_OFFSET /* uleb128 176/240 */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .vbyte 4,LCFI..2-LFB..1 - .byte 0x11 /* DW_CFA_offset_extended_sf */ - .byte LR_REGNO /* uleb128 LR_REGNO; Register LR */ - .byte 0x7e /* leb128 -2; Offset -2 (8/16) */ - .align LOG2_PTRSIZE -LEFDE..2: - .vbyte 4,0 /* End of FDEs */ - - .csect .text[PR] - .ref _GLOBAL__F_libffi_src_powerpc_aix_closure /* Prevents garbage collection by AIX linker */ - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/asm.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/asm.h deleted file mode 100644 index 27b22f6..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/asm.h +++ /dev/null @@ -1,125 +0,0 @@ -/* ----------------------------------------------------------------------- - asm.h - Copyright (c) 1998 Geoffrey Keating - - PowerPC Assembly glue. - - 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 AUTHOR 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. - ----------------------------------------------------------------------- */ - -#define ASM_GLOBAL_DIRECTIVE .globl - - -#define C_SYMBOL_NAME(name) name -/* Macro for a label. */ -#ifdef __STDC__ -#define C_LABEL(name) name##: -#else -#define C_LABEL(name) name/**/: -#endif - -/* This seems to always be the case on PPC. */ -#define ALIGNARG(log2) log2 -/* For ELF we need the `.type' directive to make shared libs work right. */ -#define ASM_TYPE_DIRECTIVE(name,typearg) .type name,typearg; -#define ASM_SIZE_DIRECTIVE(name) .size name,.-name - -/* If compiled for profiling, call `_mcount' at the start of each function. */ -#ifdef PROF -/* The mcount code relies on the return address being on the stack - to locate our caller and so it can restore it; so store one just - for its benefit. */ -#ifdef PIC -#define CALL_MCOUNT \ - .pushsection; \ - .section ".data"; \ - .align ALIGNARG(2); \ -0:.long 0; \ - .previous; \ - mflr %r0; \ - stw %r0,4(%r1); \ - bl _GLOBAL_OFFSET_TABLE_@local-4; \ - mflr %r11; \ - lwz %r0,0b@got(%r11); \ - bl JUMPTARGET(_mcount); -#else /* PIC */ -#define CALL_MCOUNT \ - .section ".data"; \ - .align ALIGNARG(2); \ -0:.long 0; \ - .previous; \ - mflr %r0; \ - lis %r11,0b@ha; \ - stw %r0,4(%r1); \ - addi %r0,%r11,0b@l; \ - bl JUMPTARGET(_mcount); -#endif /* PIC */ -#else /* PROF */ -#define CALL_MCOUNT /* Do nothing. */ -#endif /* PROF */ - -#define ENTRY(name) \ - ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name); \ - ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function) \ - .align ALIGNARG(2); \ - C_LABEL(name) \ - CALL_MCOUNT - -#define EALIGN_W_0 /* No words to insert. */ -#define EALIGN_W_1 nop -#define EALIGN_W_2 nop;nop -#define EALIGN_W_3 nop;nop;nop -#define EALIGN_W_4 EALIGN_W_3;nop -#define EALIGN_W_5 EALIGN_W_4;nop -#define EALIGN_W_6 EALIGN_W_5;nop -#define EALIGN_W_7 EALIGN_W_6;nop - -/* EALIGN is like ENTRY, but does alignment to 'words'*4 bytes - past a 2^align boundary. */ -#ifdef PROF -#define EFFI_ALIGN(name, alignt, words) \ - ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name); \ - ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function) \ - .align ALIGNARG(2); \ - C_LABEL(name) \ - CALL_MCOUNT \ - b 0f; \ - .align ALIGNARG(alignt); \ - EALIGN_W_##words; \ - 0: -#else /* PROF */ -#define EFFI_ALIGN(name, alignt, words) \ - ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name); \ - ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function) \ - .align ALIGNARG(alignt); \ - EALIGN_W_##words; \ - C_LABEL(name) -#endif - -#define END(name) \ - ASM_SIZE_DIRECTIVE(name) - -#ifdef PIC -#define JUMPTARGET(name) name##@plt -#else -#define JUMPTARGET(name) name -#endif - -/* Local labels stripped out by the linker. */ -#define L(x) .L##x diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/darwin.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/darwin.S deleted file mode 100644 index 066eb82..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/darwin.S +++ /dev/null @@ -1,378 +0,0 @@ -/* ----------------------------------------------------------------------- - darwin.S - Copyright (c) 2000 John Hornkvist - Copyright (c) 2004, 2010 Free Software Foundation, Inc. - - PowerPC Assembly glue. - - 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 AUTHOR 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. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#if defined(__ppc64__) -#define MODE_CHOICE(x, y) y -#else -#define MODE_CHOICE(x, y) x -#endif - -#define machine_choice MODE_CHOICE(ppc7400,ppc64) - -; Define some pseudo-opcodes for size-independent load & store of GPRs ... -#define lgu MODE_CHOICE(lwzu, ldu) -#define lg MODE_CHOICE(lwz,ld) -#define sg MODE_CHOICE(stw,std) -#define sgu MODE_CHOICE(stwu,stdu) -#define sgux MODE_CHOICE(stwux,stdux) - -; ... and the size of GPRs and their storage indicator. -#define GPR_BYTES MODE_CHOICE(4,8) -#define LOG2_GPR_BYTES MODE_CHOICE(2,3) /* log2(GPR_BYTES) */ -#define g_long MODE_CHOICE(long, quad) /* usage is ".g_long" */ - -; From the ABI doc: "Mac OS X ABI Function Call Guide" Version 2009-02-04. -#define LINKAGE_SIZE MODE_CHOICE(24,48) -#define PARAM_AREA MODE_CHOICE(32,64) -#define SAVED_LR_OFFSET MODE_CHOICE(8,16) /* save position for lr */ - -/* If there is any FP stuff we make space for all of the regs. */ -#define SAVED_FPR_COUNT 13 -#define FPR_SIZE 8 -#define RESULT_BYTES 16 - -/* This should be kept in step with the same value in ffi_darwin.c. */ -#define ASM_NEEDS_REGISTERS 4 -#define SAVE_REGS_SIZE (ASM_NEEDS_REGISTERS * GPR_BYTES) - -#include -#include - -#define JUMPTARGET(name) name -#define L(x) x - - .text - .align 2 - .globl _ffi_prep_args - - .align 2 - .globl _ffi_call_DARWIN - - /* We arrive here with: - r3 = ptr to extended cif. - r4 = -bytes. - r5 = cif flags. - r6 = ptr to return value. - r7 = fn pointer (user func). - r8 = fn pointer (ffi_prep_args). - r9 = ffi_type* for the ret val. */ - -_ffi_call_DARWIN: -Lstartcode: - mr r12,r8 /* We only need r12 until the call, - so it does not have to be saved. */ -LFB1: - /* Save the old stack pointer as AP. */ - mr r8,r1 -LCFI0: - - /* Save the retval type in parents frame. */ - sg r9,(LINKAGE_SIZE+6*GPR_BYTES)(r8) - - /* Allocate the stack space we need. */ - sgux r1,r1,r4 - - /* Save registers we use. */ - mflr r9 - sg r9,SAVED_LR_OFFSET(r8) - - sg r28,-(4 * GPR_BYTES)(r8) - sg r29,-(3 * GPR_BYTES)(r8) - sg r30,-(2 * GPR_BYTES)(r8) - sg r31,-( GPR_BYTES)(r8) - -#if !defined(POWERPC_DARWIN) - /* The TOC slot is reserved in the Darwin ABI and r2 is volatile. */ - sg r2,(5 * GPR_BYTES)(r1) -#endif - -LCFI1: - - /* Save arguments over call. */ - mr r31,r5 /* flags, */ - mr r30,r6 /* rvalue, */ - mr r29,r7 /* function address, */ - mr r28,r8 /* our AP. */ -LCFI2: - /* Call ffi_prep_args. r3 = extended cif, r4 = stack ptr copy. */ - mr r4,r1 - li r9,0 - - mtctr r12 /* r12 holds address of _ffi_prep_args. */ - bctrl - -#if !defined(POWERPC_DARWIN) - /* The TOC slot is reserved in the Darwin ABI and r2 is volatile. */ - lg r2,(5 * GPR_BYTES)(r1) -#endif - /* Now do the call. - Set up cr1 with bits 4-7 of the flags. */ - mtcrf 0x40,r31 - /* Get the address to call into CTR. */ - mtctr r29 - /* Load all those argument registers. - We have set up a nice stack frame, just load it into registers. */ - lg r3, (LINKAGE_SIZE )(r1) - lg r4, (LINKAGE_SIZE + GPR_BYTES)(r1) - lg r5, (LINKAGE_SIZE + 2 * GPR_BYTES)(r1) - lg r6, (LINKAGE_SIZE + 3 * GPR_BYTES)(r1) - nop - lg r7, (LINKAGE_SIZE + 4 * GPR_BYTES)(r1) - lg r8, (LINKAGE_SIZE + 5 * GPR_BYTES)(r1) - lg r9, (LINKAGE_SIZE + 6 * GPR_BYTES)(r1) - lg r10,(LINKAGE_SIZE + 7 * GPR_BYTES)(r1) - -L1: - /* ... Load all the FP registers. */ - bf 6,L2 /* No floats to load. */ - lfd f1, -SAVE_REGS_SIZE-(13*FPR_SIZE)(r28) - lfd f2, -SAVE_REGS_SIZE-(12*FPR_SIZE)(r28) - lfd f3, -SAVE_REGS_SIZE-(11*FPR_SIZE)(r28) - lfd f4, -SAVE_REGS_SIZE-(10*FPR_SIZE)(r28) - nop - lfd f5, -SAVE_REGS_SIZE-( 9*FPR_SIZE)(r28) - lfd f6, -SAVE_REGS_SIZE-( 8*FPR_SIZE)(r28) - lfd f7, -SAVE_REGS_SIZE-( 7*FPR_SIZE)(r28) - lfd f8, -SAVE_REGS_SIZE-( 6*FPR_SIZE)(r28) - nop - lfd f9, -SAVE_REGS_SIZE-( 5*FPR_SIZE)(r28) - lfd f10,-SAVE_REGS_SIZE-( 4*FPR_SIZE)(r28) - lfd f11,-SAVE_REGS_SIZE-( 3*FPR_SIZE)(r28) - lfd f12,-SAVE_REGS_SIZE-( 2*FPR_SIZE)(r28) - nop - lfd f13,-SAVE_REGS_SIZE-( 1*FPR_SIZE)(r28) - -L2: - mr r12,r29 /* Put the target address in r12 as specified. */ - mtctr r12 - nop - nop - - /* Make the call. */ - bctrl - - /* Now, deal with the return value. */ - - /* m64 structure returns can occupy the same set of registers as - would be used to pass such a structure as arg0 - so take care - not to step on any possibly hot regs. */ - - /* Get the flags.. */ - mtcrf 0x03,r31 ; we need c6 & cr7 now. - ; FLAG_RETURNS_NOTHING also covers struct ret-by-ref. - bt 30,L(done_return_value) ; FLAG_RETURNS_NOTHING - bf 27,L(scalar_return_value) ; not FLAG_RETURNS_STRUCT - - /* OK, so we have a struct. */ -#if defined(__ppc64__) - bt 31,L(maybe_return_128) ; FLAG_RETURNS_128BITS, special case - - /* OK, we have to map the return back to a mem struct. - We are about to trample the parents param area, so recover the - return type. r29 is free, since the call is done. */ - lg r29,(LINKAGE_SIZE + 6 * GPR_BYTES)(r28) - - sg r3, (LINKAGE_SIZE )(r28) - sg r4, (LINKAGE_SIZE + GPR_BYTES)(r28) - sg r5, (LINKAGE_SIZE + 2 * GPR_BYTES)(r28) - sg r6, (LINKAGE_SIZE + 3 * GPR_BYTES)(r28) - nop - sg r7, (LINKAGE_SIZE + 4 * GPR_BYTES)(r28) - sg r8, (LINKAGE_SIZE + 5 * GPR_BYTES)(r28) - sg r9, (LINKAGE_SIZE + 6 * GPR_BYTES)(r28) - sg r10,(LINKAGE_SIZE + 7 * GPR_BYTES)(r28) - /* OK, so do the block move - we trust that memcpy will not trample - the fprs... */ - mr r3,r30 ; dest - addi r4,r28,LINKAGE_SIZE ; source - /* The size is a size_t, should be long. */ - lg r5,0(r29) - /* Figure out small structs */ - cmpi 0,r5,4 - bgt L3 ; 1, 2 and 4 bytes have special rules. - cmpi 0,r5,3 - beq L3 ; not 3 - addi r4,r4,8 - subf r4,r5,r4 -L3: - bl _memcpy - - /* ... do we need the FP registers? - recover the flags.. */ - mtcrf 0x03,r31 ; we need c6 & cr7 now. - bf 29,L(done_return_value) /* No floats in the struct. */ - stfd f1, -SAVE_REGS_SIZE-(13*FPR_SIZE)(r28) - stfd f2, -SAVE_REGS_SIZE-(12*FPR_SIZE)(r28) - stfd f3, -SAVE_REGS_SIZE-(11*FPR_SIZE)(r28) - stfd f4, -SAVE_REGS_SIZE-(10*FPR_SIZE)(r28) - nop - stfd f5, -SAVE_REGS_SIZE-( 9*FPR_SIZE)(r28) - stfd f6, -SAVE_REGS_SIZE-( 8*FPR_SIZE)(r28) - stfd f7, -SAVE_REGS_SIZE-( 7*FPR_SIZE)(r28) - stfd f8, -SAVE_REGS_SIZE-( 6*FPR_SIZE)(r28) - nop - stfd f9, -SAVE_REGS_SIZE-( 5*FPR_SIZE)(r28) - stfd f10,-SAVE_REGS_SIZE-( 4*FPR_SIZE)(r28) - stfd f11,-SAVE_REGS_SIZE-( 3*FPR_SIZE)(r28) - stfd f12,-SAVE_REGS_SIZE-( 2*FPR_SIZE)(r28) - nop - stfd f13,-SAVE_REGS_SIZE-( 1*FPR_SIZE)(r28) - - mr r3,r29 ; ffi_type * - mr r4,r30 ; dest - addi r5,r28,-SAVE_REGS_SIZE-(13*FPR_SIZE) ; fprs - xor r6,r6,r6 - sg r6,(LINKAGE_SIZE + 7 * GPR_BYTES)(r28) - addi r6,r28,(LINKAGE_SIZE + 7 * GPR_BYTES) ; point to a zeroed counter. - bl _darwin64_struct_floats_to_mem - - b L(done_return_value) -#else - stw r3,0(r30) ; m32 the only struct return in reg is 4 bytes. -#endif - b L(done_return_value) - -L(fp_return_value): - /* Do we have long double to store? */ - bf 31,L(fd_return_value) ; FLAG_RETURNS_128BITS - stfd f1,0(r30) - stfd f2,FPR_SIZE(r30) - b L(done_return_value) - -L(fd_return_value): - /* Do we have double to store? */ - bf 28,L(float_return_value) - stfd f1,0(r30) - b L(done_return_value) - -L(float_return_value): - /* We only have a float to store. */ - stfs f1,0(r30) - b L(done_return_value) - -L(scalar_return_value): - bt 29,L(fp_return_value) ; FLAG_RETURNS_FP - ; ffi_arg is defined as unsigned long. - sg r3,0(r30) ; Save the reg. - bf 28,L(done_return_value) ; not FLAG_RETURNS_64BITS - -#if defined(__ppc64__) -L(maybe_return_128): - std r3,0(r30) - bf 31,L(done_return_value) ; not FLAG_RETURNS_128BITS - std r4,8(r30) -#else - stw r4,4(r30) -#endif - - /* Fall through. */ - /* We want this at the end to simplify eh epilog computation. */ - -L(done_return_value): - /* Restore the registers we used and return. */ - lg r29,SAVED_LR_OFFSET(r28) - ; epilog - lg r31,-(1 * GPR_BYTES)(r28) - mtlr r29 - lg r30,-(2 * GPR_BYTES)(r28) - lg r29,-(3 * GPR_BYTES)(r28) - lg r28,-(4 * GPR_BYTES)(r28) - lg r1,0(r1) - blr -LFE1: - .align 1 -/* END(_ffi_call_DARWIN) */ - -/* Provide a null definition of _ffi_call_AIX. */ - .text - .globl _ffi_call_AIX - .align 2 -_ffi_call_AIX: - blr -/* END(_ffi_call_AIX) */ - -/* EH stuff. */ - -#define EH_DATA_ALIGN_FACT MODE_CHOICE(0x7c,0x78) - - .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support -EH_frame1: - .set L$set$0,LECIE1-LSCIE1 - .long L$set$0 ; Length of Common Information Entry -LSCIE1: - .long 0x0 ; CIE Identifier Tag - .byte 0x1 ; CIE Version - .ascii "zR\0" ; CIE Augmentation - .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor - .byte EH_DATA_ALIGN_FACT ; sleb128 -4; CIE Data Alignment Factor - .byte 0x41 ; CIE RA Column - .byte 0x1 ; uleb128 0x1; Augmentation size - .byte 0x10 ; FDE Encoding (pcrel) - .byte 0xc ; DW_CFA_def_cfa - .byte 0x1 ; uleb128 0x1 - .byte 0x0 ; uleb128 0x0 - .align LOG2_GPR_BYTES -LECIE1: - - .globl _ffi_call_DARWIN.eh -_ffi_call_DARWIN.eh: -LSFDE1: - .set L$set$1,LEFDE1-LASFDE1 - .long L$set$1 ; FDE Length -LASFDE1: - .long LASFDE1-EH_frame1 ; FDE CIE offset - .g_long Lstartcode-. ; FDE initial location - .set L$set$3,LFE1-Lstartcode - .g_long L$set$3 ; FDE address range - .byte 0x0 ; uleb128 0x0; Augmentation size - .byte 0x4 ; DW_CFA_advance_loc4 - .set L$set$4,LCFI0-Lstartcode - .long L$set$4 - .byte 0xd ; DW_CFA_def_cfa_register - .byte 0x08 ; uleb128 0x08 - .byte 0x4 ; DW_CFA_advance_loc4 - .set L$set$5,LCFI1-LCFI0 - .long L$set$5 - .byte 0x11 ; DW_CFA_offset_extended_sf - .byte 0x41 ; uleb128 0x41 - .byte 0x7e ; sleb128 -2 - .byte 0x9f ; DW_CFA_offset, column 0x1f - .byte 0x1 ; uleb128 0x1 - .byte 0x9e ; DW_CFA_offset, column 0x1e - .byte 0x2 ; uleb128 0x2 - .byte 0x9d ; DW_CFA_offset, column 0x1d - .byte 0x3 ; uleb128 0x3 - .byte 0x9c ; DW_CFA_offset, column 0x1c - .byte 0x4 ; uleb128 0x4 - .byte 0x4 ; DW_CFA_advance_loc4 - .set L$set$6,LCFI2-LCFI1 - .long L$set$6 - .byte 0xd ; DW_CFA_def_cfa_register - .byte 0x1c ; uleb128 0x1c - .align LOG2_GPR_BYTES -LEFDE1: - .align 1 - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/darwin_closure.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/darwin_closure.S deleted file mode 100644 index 3121e6a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +++ /dev/null @@ -1,571 +0,0 @@ -/* ----------------------------------------------------------------------- - darwin_closure.S - Copyright (c) 2002, 2003, 2004, 2010, - Free Software Foundation, Inc. - based on ppc_closure.S - - PowerPC Assembly glue. - - 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 AUTHOR 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. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#define L(x) x - -#if defined(__ppc64__) -#define MODE_CHOICE(x, y) y -#else -#define MODE_CHOICE(x, y) x -#endif - -#define machine_choice MODE_CHOICE(ppc7400,ppc64) - -; Define some pseudo-opcodes for size-independent load & store of GPRs ... -#define lgu MODE_CHOICE(lwzu, ldu) -#define lg MODE_CHOICE(lwz,ld) -#define sg MODE_CHOICE(stw,std) -#define sgu MODE_CHOICE(stwu,stdu) - -; ... and the size of GPRs and their storage indicator. -#define GPR_BYTES MODE_CHOICE(4,8) -#define LOG2_GPR_BYTES MODE_CHOICE(2,3) /* log2(GPR_BYTES) */ -#define g_long MODE_CHOICE(long, quad) /* usage is ".g_long" */ - -; From the ABI doc: "Mac OS X ABI Function Call Guide" Version 2009-02-04. -#define LINKAGE_SIZE MODE_CHOICE(24,48) -#define PARAM_AREA MODE_CHOICE(32,64) - -#define SAVED_CR_OFFSET MODE_CHOICE(4,8) /* save position for CR */ -#define SAVED_LR_OFFSET MODE_CHOICE(8,16) /* save position for lr */ - -/* WARNING: if ffi_type is changed... here be monsters. - Offsets of items within the result type. */ -#define FFI_TYPE_TYPE MODE_CHOICE(6,10) -#define FFI_TYPE_ELEM MODE_CHOICE(8,16) - -#define SAVED_FPR_COUNT 13 -#define FPR_SIZE 8 -/* biggest m64 struct ret is 8GPRS + 13FPRS = 168 bytes - rounded to 16bytes = 176. */ -#define RESULT_BYTES MODE_CHOICE(16,176) - -; The whole stack frame **MUST** be 16byte-aligned. -#define SAVE_SIZE (((LINKAGE_SIZE+PARAM_AREA+SAVED_FPR_COUNT*FPR_SIZE+RESULT_BYTES)+15) & -16LL) -#define PAD_SIZE (SAVE_SIZE-(LINKAGE_SIZE+PARAM_AREA+SAVED_FPR_COUNT*FPR_SIZE+RESULT_BYTES)) - -#define PARENT_PARM_BASE (SAVE_SIZE+LINKAGE_SIZE) -#define FP_SAVE_BASE (LINKAGE_SIZE+PARAM_AREA) - -#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050 -; We no longer need the pic symbol stub for Darwin >= 9. -#define BLCLS_HELP _ffi_closure_helper_DARWIN -#define STRUCT_RETVALUE_P _darwin64_struct_ret_by_value_p -#define PASS_STR_FLOATS _darwin64_pass_struct_floats -#undef WANT_STUB -#else -#define BLCLS_HELP L_ffi_closure_helper_DARWIN$stub -#define STRUCT_RETVALUE_P L_darwin64_struct_ret_by_value_p$stub -#define PASS_STR_FLOATS L_darwin64_pass_struct_floats$stub -#define WANT_STUB -#endif - -/* m32/m64 - - The stack layout looks like this: - - | Additional params... | | Higher address - ~ ~ ~ - | Parameters (at least 8*4/8=32/64) | | NUM_GPR_ARG_REGISTERS - |--------------------------------------------| | - | TOC=R2 (AIX) Reserved (Darwin) 4/8 | | - |--------------------------------------------| | - | Reserved 2*4/8 | | - |--------------------------------------------| | - | Space for callee`s LR 4/8 | | - |--------------------------------------------| | - | Saved CR [low word for m64] 4/8 | | - |--------------------------------------------| | - | Current backchain pointer 4/8 |-/ Parent`s frame. - |--------------------------------------------| <+ <<< on entry to - | Result Bytes 16/176 | | - |--------------------------------------------| | - ~ padding to 16-byte alignment ~ ~ - |--------------------------------------------| | - | NUM_FPR_ARG_REGISTERS slots | | - | here fp13 .. fp1 13*8 | | - |--------------------------------------------| | - | R3..R10 8*4/8=32/64 | | NUM_GPR_ARG_REGISTERS - |--------------------------------------------| | - | TOC=R2 (AIX) Reserved (Darwin) 4/8 | | - |--------------------------------------------| | stack | - | Reserved [compiler,binder] 2*4/8 | | grows | - |--------------------------------------------| | down V - | Space for callees LR 4/8 | | - |--------------------------------------------| | lower addresses - | Saved CR [low word for m64] 4/8 | | - |--------------------------------------------| | stack pointer here - | Current backchain pointer 4/8 |-/ during - |--------------------------------------------| <<< call. - -*/ - - .file "darwin_closure.S" - - .machine machine_choice - - .text - .globl _ffi_closure_ASM - .align LOG2_GPR_BYTES -_ffi_closure_ASM: -LFB1: -Lstartcode: - mflr r0 /* extract return address */ - sg r0,SAVED_LR_OFFSET(r1) /* save the return address */ -LCFI0: - sgu r1,-SAVE_SIZE(r1) /* skip over caller save area - keep stack aligned to 16. */ -LCFI1: - /* We want to build up an area for the parameters passed - in registers. (both floating point and integer) */ - - /* Put gpr 3 to gpr 10 in the parents outgoing area... - ... the remainder of any params that overflowed the regs will - follow here. */ - sg r3, (PARENT_PARM_BASE )(r1) - sg r4, (PARENT_PARM_BASE + GPR_BYTES )(r1) - sg r5, (PARENT_PARM_BASE + GPR_BYTES * 2)(r1) - sg r6, (PARENT_PARM_BASE + GPR_BYTES * 3)(r1) - sg r7, (PARENT_PARM_BASE + GPR_BYTES * 4)(r1) - sg r8, (PARENT_PARM_BASE + GPR_BYTES * 5)(r1) - sg r9, (PARENT_PARM_BASE + GPR_BYTES * 6)(r1) - sg r10,(PARENT_PARM_BASE + GPR_BYTES * 7)(r1) - - /* We save fpr 1 to fpr 14 in our own save frame. */ - stfd f1, (FP_SAVE_BASE )(r1) - stfd f2, (FP_SAVE_BASE + FPR_SIZE )(r1) - stfd f3, (FP_SAVE_BASE + FPR_SIZE * 2 )(r1) - stfd f4, (FP_SAVE_BASE + FPR_SIZE * 3 )(r1) - stfd f5, (FP_SAVE_BASE + FPR_SIZE * 4 )(r1) - stfd f6, (FP_SAVE_BASE + FPR_SIZE * 5 )(r1) - stfd f7, (FP_SAVE_BASE + FPR_SIZE * 6 )(r1) - stfd f8, (FP_SAVE_BASE + FPR_SIZE * 7 )(r1) - stfd f9, (FP_SAVE_BASE + FPR_SIZE * 8 )(r1) - stfd f10,(FP_SAVE_BASE + FPR_SIZE * 9 )(r1) - stfd f11,(FP_SAVE_BASE + FPR_SIZE * 10)(r1) - stfd f12,(FP_SAVE_BASE + FPR_SIZE * 11)(r1) - stfd f13,(FP_SAVE_BASE + FPR_SIZE * 12)(r1) - - /* Set up registers for the routine that actually does the work - get the context pointer from the trampoline. */ - mr r3,r11 - - /* Now load up the pointer to the result storage. */ - addi r4,r1,(SAVE_SIZE-RESULT_BYTES) - - /* Now load up the pointer to the saved gpr registers. */ - addi r5,r1,PARENT_PARM_BASE - - /* Now load up the pointer to the saved fpr registers. */ - addi r6,r1,FP_SAVE_BASE - - /* Make the call. */ - bl BLCLS_HELP - - /* r3 contains the rtype pointer... save it since we will need - it later. */ - sg r3,LINKAGE_SIZE(r1) ; ffi_type * result_type - lg r0,0(r3) ; size => r0 - lhz r3,FFI_TYPE_TYPE(r3) ; type => r3 - - /* The helper will have intercepted structure returns and inserted - the caller`s destination address for structs returned by ref. */ - - /* r3 contains the return type so use it to look up in a table - so we know how to deal with each type. */ - - addi r5,r1,(SAVE_SIZE-RESULT_BYTES) /* Otherwise, our return is here. */ - bl Lget_ret_type0_addr /* Get pointer to Lret_type0 into LR. */ - mflr r4 /* Move to r4. */ - slwi r3,r3,4 /* Now multiply return type by 16. */ - add r3,r3,r4 /* Add contents of table to table address. */ - mtctr r3 - bctr /* Jump to it. */ -LFE1: -/* Each of the ret_typeX code fragments has to be exactly 16 bytes long - (4 instructions). For cache effectiveness we align to a 16 byte boundary - first. */ - - .align 4 - - nop - nop - nop -Lget_ret_type0_addr: - blrl - -/* case FFI_TYPE_VOID */ -Lret_type0: - b Lfinish - nop - nop - nop - -/* case FFI_TYPE_INT */ -Lret_type1: - lg r3,0(r5) - b Lfinish - nop - nop - -/* case FFI_TYPE_FLOAT */ -Lret_type2: - lfs f1,0(r5) - b Lfinish - nop - nop - -/* case FFI_TYPE_DOUBLE */ -Lret_type3: - lfd f1,0(r5) - b Lfinish - nop - nop - -/* case FFI_TYPE_LONGDOUBLE */ -Lret_type4: - lfd f1,0(r5) - lfd f2,8(r5) - b Lfinish - nop - -/* case FFI_TYPE_UINT8 */ -Lret_type5: -#if defined(__ppc64__) - lbz r3,7(r5) -#else - lbz r3,3(r5) -#endif - b Lfinish - nop - nop - -/* case FFI_TYPE_SINT8 */ -Lret_type6: -#if defined(__ppc64__) - lbz r3,7(r5) -#else - lbz r3,3(r5) -#endif - extsb r3,r3 - b Lfinish - nop - -/* case FFI_TYPE_UINT16 */ -Lret_type7: -#if defined(__ppc64__) - lhz r3,6(r5) -#else - lhz r3,2(r5) -#endif - b Lfinish - nop - nop - -/* case FFI_TYPE_SINT16 */ -Lret_type8: -#if defined(__ppc64__) - lha r3,6(r5) -#else - lha r3,2(r5) -#endif - b Lfinish - nop - nop - -/* case FFI_TYPE_UINT32 */ -Lret_type9: -#if defined(__ppc64__) - lwz r3,4(r5) -#else - lwz r3,0(r5) -#endif - b Lfinish - nop - nop - -/* case FFI_TYPE_SINT32 */ -Lret_type10: -#if defined(__ppc64__) - lwz r3,4(r5) -#else - lwz r3,0(r5) -#endif - b Lfinish - nop - nop - -/* case FFI_TYPE_UINT64 */ -Lret_type11: -#if defined(__ppc64__) - lg r3,0(r5) - b Lfinish - nop -#else - lwz r3,0(r5) - lwz r4,4(r5) - b Lfinish -#endif - nop - -/* case FFI_TYPE_SINT64 */ -Lret_type12: -#if defined(__ppc64__) - lg r3,0(r5) - b Lfinish - nop -#else - lwz r3,0(r5) - lwz r4,4(r5) - b Lfinish -#endif - nop - -/* case FFI_TYPE_STRUCT */ -Lret_type13: -#if defined(__ppc64__) - lg r3,0(r5) ; we need at least this... - cmpi 0,r0,4 - bgt Lstructend ; not a special small case - b Lsmallstruct ; see if we need more. -#else - cmpwi 0,r0,4 - bgt Lfinish ; not by value - lg r3,0(r5) - b Lfinish -#endif -/* case FFI_TYPE_POINTER */ -Lret_type14: - lg r3,0(r5) - b Lfinish - nop - nop - -#if defined(__ppc64__) -Lsmallstruct: - beq Lfour ; continuation of Lret13. - cmpi 0,r0,3 - beq Lfinish ; don`t adjust this - can`t be any floats here... - srdi r3,r3,48 - cmpi 0,r0,2 - beq Lfinish ; .. or here .. - srdi r3,r3,8 - b Lfinish ; .. or here. - -Lfour: - lg r6,LINKAGE_SIZE(r1) ; get the result type - lg r6,FFI_TYPE_ELEM(r6) ; elements array pointer - lg r6,0(r6) ; first element - lhz r0,FFI_TYPE_TYPE(r6) ; OK go the type - cmpi 0,r0,2 ; FFI_TYPE_FLOAT - bne Lfourint - lfs f1,0(r5) ; just one float in the struct. - b Lfinish - -Lfourint: - srdi r3,r3,32 ; four bytes. - b Lfinish - -Lstructend: - lg r3,LINKAGE_SIZE(r1) ; get the result type - bl STRUCT_RETVALUE_P - cmpi 0,r3,0 - beq Lfinish ; nope. - /* Recover a pointer to the results. */ - addi r11,r1,(SAVE_SIZE-RESULT_BYTES) - lg r3,0(r11) ; we need at least this... - lg r4,8(r11) - cmpi 0,r0,16 - beq Lfinish ; special case 16 bytes we don't consider floats. - - /* OK, frustratingly, the process of saving the struct to mem might have - messed with the FPRs, so we have to re-load them :(. - We`ll use our FPRs space again - calling: - void darwin64_pass_struct_floats (ffi_type *s, char *src, - unsigned *nfpr, double **fprs) - We`ll temporarily pinch the first two slots of the param area for local - vars used by the routine. */ - xor r6,r6,r6 - addi r5,r1,PARENT_PARM_BASE ; some space - sg r6,0(r5) ; *nfpr zeroed. - addi r6,r5,8 ; **fprs - addi r3,r1,FP_SAVE_BASE ; pointer to FPRs space - sg r3,0(r6) - mr r4,r11 ; the struct is here... - lg r3,LINKAGE_SIZE(r1) ; ffi_type * result_type. - bl PASS_STR_FLOATS ; get struct floats into FPR save space. - /* See if we used any floats */ - lwz r0,(SAVE_SIZE-RESULT_BYTES)(r1) - cmpi 0,r0,0 - beq Lstructints ; nope. - /* OK load `em up... */ - lfd f1, (FP_SAVE_BASE )(r1) - lfd f2, (FP_SAVE_BASE + FPR_SIZE )(r1) - lfd f3, (FP_SAVE_BASE + FPR_SIZE * 2 )(r1) - lfd f4, (FP_SAVE_BASE + FPR_SIZE * 3 )(r1) - lfd f5, (FP_SAVE_BASE + FPR_SIZE * 4 )(r1) - lfd f6, (FP_SAVE_BASE + FPR_SIZE * 5 )(r1) - lfd f7, (FP_SAVE_BASE + FPR_SIZE * 6 )(r1) - lfd f8, (FP_SAVE_BASE + FPR_SIZE * 7 )(r1) - lfd f9, (FP_SAVE_BASE + FPR_SIZE * 8 )(r1) - lfd f10,(FP_SAVE_BASE + FPR_SIZE * 9 )(r1) - lfd f11,(FP_SAVE_BASE + FPR_SIZE * 10)(r1) - lfd f12,(FP_SAVE_BASE + FPR_SIZE * 11)(r1) - lfd f13,(FP_SAVE_BASE + FPR_SIZE * 12)(r1) - - /* point back at our saved struct. */ -Lstructints: - addi r11,r1,(SAVE_SIZE-RESULT_BYTES) - lg r3,0(r11) ; we end up picking the - lg r4,8(r11) ; first two again. - lg r5,16(r11) - lg r6,24(r11) - lg r7,32(r11) - lg r8,40(r11) - lg r9,48(r11) - lg r10,56(r11) -#endif - -/* case done */ -Lfinish: - addi r1,r1,SAVE_SIZE /* Restore stack pointer. */ - lg r0,SAVED_LR_OFFSET(r1) /* Get return address. */ - mtlr r0 /* Reset link register. */ - blr -Lendcode: - .align 1 - -/* END(ffi_closure_ASM) */ - -/* EH frame stuff. */ -#define EH_DATA_ALIGN_FACT MODE_CHOICE(0x7c,0x78) -/* 176, 400 */ -#define EH_FRAME_OFFSETA MODE_CHOICE(176,0x90) -#define EH_FRAME_OFFSETB MODE_CHOICE(1,3) - - .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support -EH_frame1: - .set L$set$0,LECIE1-LSCIE1 - .long L$set$0 ; Length of Common Information Entry -LSCIE1: - .long 0x0 ; CIE Identifier Tag - .byte 0x1 ; CIE Version - .ascii "zR\0" ; CIE Augmentation - .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor - .byte EH_DATA_ALIGN_FACT ; sleb128 -4; CIE Data Alignment Factor - .byte 0x41 ; CIE RA Column - .byte 0x1 ; uleb128 0x1; Augmentation size - .byte 0x10 ; FDE Encoding (pcrel) - .byte 0xc ; DW_CFA_def_cfa - .byte 0x1 ; uleb128 0x1 - .byte 0x0 ; uleb128 0x0 - .align LOG2_GPR_BYTES -LECIE1: - .globl _ffi_closure_ASM.eh -_ffi_closure_ASM.eh: -LSFDE1: - .set L$set$1,LEFDE1-LASFDE1 - .long L$set$1 ; FDE Length - -LASFDE1: - .long LASFDE1-EH_frame1 ; FDE CIE offset - .g_long Lstartcode-. ; FDE initial location - .set L$set$2,LFE1-Lstartcode - .g_long L$set$2 ; FDE address range - .byte 0x0 ; uleb128 0x0; Augmentation size - .byte 0x4 ; DW_CFA_advance_loc4 - .set L$set$3,LCFI1-LCFI0 - .long L$set$3 - .byte 0xe ; DW_CFA_def_cfa_offset - .byte EH_FRAME_OFFSETA,EH_FRAME_OFFSETB ; uleb128 176,1/190,3 - .byte 0x4 ; DW_CFA_advance_loc4 - .set L$set$4,LCFI0-Lstartcode - .long L$set$4 - .byte 0x11 ; DW_CFA_offset_extended_sf - .byte 0x41 ; uleb128 0x41 - .byte 0x7e ; sleb128 -2 - .align LOG2_GPR_BYTES -LEFDE1: - .align 1 - -#ifdef WANT_STUB - .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 - .align 5 -L_ffi_closure_helper_DARWIN$stub: - .indirect_symbol _ffi_closure_helper_DARWIN - mflr r0 - bcl 20,31,"L1$spb" -"L1$spb": - mflr r11 - addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr-"L1$spb") - mtlr r0 - lwzu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr-"L1$spb")(r11) - mtctr r12 - bctr - .lazy_symbol_pointer -L_ffi_closure_helper_DARWIN$lazy_ptr: - .indirect_symbol _ffi_closure_helper_DARWIN - .g_long dyld_stub_binding_helper - -#if defined(__ppc64__) - .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 - .align 5 -L_darwin64_struct_ret_by_value_p$stub: - .indirect_symbol _darwin64_struct_ret_by_value_p - mflr r0 - bcl 20,31,"L2$spb" -"L2$spb": - mflr r11 - addis r11,r11,ha16(L_darwin64_struct_ret_by_value_p$lazy_ptr-"L2$spb") - mtlr r0 - lwzu r12,lo16(L_darwin64_struct_ret_by_value_p$lazy_ptr-"L2$spb")(r11) - mtctr r12 - bctr - .lazy_symbol_pointer -L_darwin64_struct_ret_by_value_p$lazy_ptr: - .indirect_symbol _darwin64_struct_ret_by_value_p - .g_long dyld_stub_binding_helper - - .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 - .align 5 -L_darwin64_pass_struct_floats$stub: - .indirect_symbol _darwin64_pass_struct_floats - mflr r0 - bcl 20,31,"L3$spb" -"L3$spb": - mflr r11 - addis r11,r11,ha16(L_darwin64_pass_struct_floats$lazy_ptr-"L3$spb") - mtlr r0 - lwzu r12,lo16(L_darwin64_pass_struct_floats$lazy_ptr-"L3$spb")(r11) - mtctr r12 - bctr - .lazy_symbol_pointer -L_darwin64_pass_struct_floats$lazy_ptr: - .indirect_symbol _darwin64_pass_struct_floats - .g_long dyld_stub_binding_helper -# endif -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/ffi.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/ffi.c deleted file mode 100644 index a19bcbb..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/ffi.c +++ /dev/null @@ -1,175 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (C) 2013 IBM - Copyright (C) 2011 Anthony Green - Copyright (C) 2011 Kyle Moffett - Copyright (C) 2008 Red Hat, Inc - Copyright (C) 2007, 2008 Free Software Foundation, Inc - Copyright (c) 1998 Geoffrey Keating - - PowerPC Foreign Function Interface - - 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 AUTHOR 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. - ----------------------------------------------------------------------- */ - -#include "ffi.h" -#include "ffi_common.h" -#include "ffi_powerpc.h" - -#if HAVE_LONG_DOUBLE_VARIANT -/* Adjust ffi_type_longdouble. */ -void FFI_HIDDEN -ffi_prep_types (ffi_abi abi) -{ -# if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE -# ifdef POWERPC64 - ffi_prep_types_linux64 (abi); -# else - ffi_prep_types_sysv (abi); -# endif -# endif -} -#endif - -/* Perform machine dependent cif processing */ -ffi_status FFI_HIDDEN -ffi_prep_cif_machdep (ffi_cif *cif) -{ -#ifdef POWERPC64 - return ffi_prep_cif_linux64 (cif); -#else - return ffi_prep_cif_sysv (cif); -#endif -} - -ffi_status FFI_HIDDEN -ffi_prep_cif_machdep_var (ffi_cif *cif, - unsigned int nfixedargs MAYBE_UNUSED, - unsigned int ntotalargs MAYBE_UNUSED) -{ -#ifdef POWERPC64 - return ffi_prep_cif_linux64_var (cif, nfixedargs, ntotalargs); -#else - return ffi_prep_cif_sysv (cif); -#endif -} - -static void -ffi_call_int (ffi_cif *cif, - void (*fn) (void), - void *rvalue, - void **avalue, - void *closure) -{ - /* The final SYSV ABI says that structures smaller or equal 8 bytes - are returned in r3/r4. A draft ABI used by linux instead returns - them in memory. - - We bounce-buffer SYSV small struct return values so that sysv.S - can write r3 and r4 to memory without worrying about struct size. - - For ELFv2 ABI, use a bounce buffer for homogeneous structs too, - for similar reasons. This bounce buffer must be aligned to 16 - bytes for use with homogeneous structs of vectors (float128). */ - float128 smst_buffer[8]; - extended_cif ecif; - - ecif.cif = cif; - ecif.avalue = avalue; - - ecif.rvalue = rvalue; - if ((cif->flags & FLAG_RETURNS_SMST) != 0) - ecif.rvalue = smst_buffer; - /* Ensure that we have a valid struct return value. - FIXME: Isn't this just papering over a user problem? */ - else if (!rvalue && cif->rtype->type == FFI_TYPE_STRUCT) - ecif.rvalue = alloca (cif->rtype->size); - -#ifdef POWERPC64 - ffi_call_LINUX64 (&ecif, fn, ecif.rvalue, cif->flags, closure, - -(long) cif->bytes); -#else - ffi_call_SYSV (&ecif, fn, ecif.rvalue, cif->flags, closure, -cif->bytes); -#endif - - /* Check for a bounce-buffered return value */ - if (rvalue && ecif.rvalue == smst_buffer) - { - unsigned int rsize = cif->rtype->size; -#ifndef __LITTLE_ENDIAN__ - /* The SYSV ABI returns a structure of up to 4 bytes in size - left-padded in r3. */ -# ifndef POWERPC64 - if (rsize <= 4) - memcpy (rvalue, (char *) smst_buffer + 4 - rsize, rsize); - else -# endif - /* The SYSV ABI returns a structure of up to 8 bytes in size - left-padded in r3/r4, and the ELFv2 ABI similarly returns a - structure of up to 8 bytes in size left-padded in r3. But - note that a structure of a single float is not paddded. */ - if (rsize <= 8 && (cif->flags & FLAG_RETURNS_FP) == 0) - memcpy (rvalue, (char *) smst_buffer + 8 - rsize, rsize); - else -#endif - memcpy (rvalue, smst_buffer, rsize); - } -} - -void -ffi_call (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue) -{ - ffi_call_int (cif, fn, rvalue, avalue, NULL); -} - -void -ffi_call_go (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue, - void *closure) -{ - ffi_call_int (cif, fn, rvalue, avalue, closure); -} - -ffi_status -ffi_prep_closure_loc (ffi_closure *closure, - ffi_cif *cif, - void (*fun) (ffi_cif *, void *, void **, void *), - void *user_data, - void *codeloc) -{ -#ifdef POWERPC64 - return ffi_prep_closure_loc_linux64 (closure, cif, fun, user_data, codeloc); -#else - return ffi_prep_closure_loc_sysv (closure, cif, fun, user_data, codeloc); -#endif -} - -ffi_status -ffi_prep_go_closure (ffi_go_closure *closure, - ffi_cif *cif, - void (*fun) (ffi_cif *, void *, void **, void *)) -{ -#ifdef POWERPC64 - closure->tramp = ffi_go_closure_linux64; -#else - closure->tramp = ffi_go_closure_sysv; -#endif - closure->cif = cif; - closure->fun = fun; - return FFI_OK; -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c deleted file mode 100644 index 64bb94d..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +++ /dev/null @@ -1,1452 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi_darwin.c - - Copyright (C) 1998 Geoffrey Keating - Copyright (C) 2001 John Hornkvist - Copyright (C) 2002, 2006, 2007, 2009, 2010 Free Software Foundation, Inc. - - FFI support for Darwin and AIX. - - 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 AUTHOR 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. - ----------------------------------------------------------------------- */ - -#include -#include - -#include - -extern void ffi_closure_ASM (void); - -#if defined (FFI_GO_CLOSURES) -extern void ffi_go_closure_ASM (void); -#endif - -enum { - /* The assembly depends on these exact flags. - For Darwin64 (when FLAG_RETURNS_STRUCT is set): - FLAG_RETURNS_FP indicates that the structure embeds FP data. - FLAG_RETURNS_128BITS signals a special struct size that is not - expanded for float content. */ - FLAG_RETURNS_128BITS = 1 << (31-31), /* These go in cr7 */ - FLAG_RETURNS_NOTHING = 1 << (31-30), - FLAG_RETURNS_FP = 1 << (31-29), - FLAG_RETURNS_64BITS = 1 << (31-28), - - FLAG_RETURNS_STRUCT = 1 << (31-27), /* This goes in cr6 */ - - FLAG_ARG_NEEDS_COPY = 1 << (31- 7), - FLAG_FP_ARGUMENTS = 1 << (31- 6), /* cr1.eq; specified by ABI */ - FLAG_4_GPR_ARGUMENTS = 1 << (31- 5), - FLAG_RETVAL_REFERENCE = 1 << (31- 4) -}; - -/* About the DARWIN ABI. */ -enum { - NUM_GPR_ARG_REGISTERS = 8, - NUM_FPR_ARG_REGISTERS = 13, - LINKAGE_AREA_GPRS = 6 -}; - -enum { ASM_NEEDS_REGISTERS = 4 }; /* r28-r31 */ - -/* ffi_prep_args is called by the assembly routine once stack space - has been allocated for the function's arguments. - - m32/m64 - - The stack layout we want looks like this: - - | Return address from ffi_call_DARWIN | higher addresses - |--------------------------------------------| - | Previous backchain pointer 4/8 | stack pointer here - |--------------------------------------------|<+ <<< on entry to - | ASM_NEEDS_REGISTERS=r28-r31 4*(4/8) | | ffi_call_DARWIN - |--------------------------------------------| | - | When we have any FP activity... the | | - | FPRs occupy NUM_FPR_ARG_REGISTERS slots | | - | here fp13 .. fp1 from high to low addr. | | - ~ ~ ~ - | Parameters (at least 8*4/8=32/64) | | NUM_GPR_ARG_REGISTERS - |--------------------------------------------| | - | TOC=R2 (AIX) Reserved (Darwin) 4/8 | | - |--------------------------------------------| | stack | - | Reserved 2*4/8 | | grows | - |--------------------------------------------| | down V - | Space for callee's LR 4/8 | | - |--------------------------------------------| | lower addresses - | Saved CR [low word for m64] 4/8 | | - |--------------------------------------------| | stack pointer here - | Current backchain pointer 4/8 |-/ during - |--------------------------------------------| <<< ffi_call_DARWIN - - */ - -#if defined(POWERPC_DARWIN64) -static void -darwin64_pass_struct_by_value - (ffi_type *, char *, unsigned, unsigned *, double **, unsigned long **); -#endif - -/* This depends on GPR_SIZE = sizeof (unsigned long) */ - -void -ffi_prep_args (extended_cif *ecif, unsigned long *const stack) -{ - const unsigned bytes = ecif->cif->bytes; - const unsigned flags = ecif->cif->flags; - const unsigned nargs = ecif->cif->nargs; -#if !defined(POWERPC_DARWIN64) - const ffi_abi abi = ecif->cif->abi; -#endif - - /* 'stacktop' points at the previous backchain pointer. */ - unsigned long *const stacktop = stack + (bytes / sizeof(unsigned long)); - - /* 'fpr_base' points at the space for fpr1, and grows upwards as - we use FPR registers. */ - double *fpr_base = (double *) (stacktop - ASM_NEEDS_REGISTERS) - NUM_FPR_ARG_REGISTERS; - int gp_count = 0, fparg_count = 0; - - /* 'next_arg' grows up as we put parameters in it. */ - unsigned long *next_arg = stack + LINKAGE_AREA_GPRS; /* 6 reserved positions. */ - - int i; - double double_tmp; - void **p_argv = ecif->avalue; - unsigned long gprvalue; - ffi_type** ptr = ecif->cif->arg_types; -#if !defined(POWERPC_DARWIN64) - char *dest_cpy; -#endif - unsigned size_al = 0; - - /* Check that everything starts aligned properly. */ - FFI_ASSERT(((unsigned) (char *) stack & 0xF) == 0); - FFI_ASSERT(((unsigned) (char *) stacktop & 0xF) == 0); - FFI_ASSERT((bytes & 0xF) == 0); - - /* Deal with return values that are actually pass-by-reference. - Rule: - Return values are referenced by r3, so r4 is the first parameter. */ - - if (flags & FLAG_RETVAL_REFERENCE) - *next_arg++ = (unsigned long) (char *) ecif->rvalue; - - /* Now for the arguments. */ - for (i = nargs; i > 0; i--, ptr++, p_argv++) - { - switch ((*ptr)->type) - { - /* If a floating-point parameter appears before all of the general- - purpose registers are filled, the corresponding GPRs that match - the size of the floating-point parameter are skipped. */ - case FFI_TYPE_FLOAT: - double_tmp = *(float *) *p_argv; - if (fparg_count < NUM_FPR_ARG_REGISTERS) - *fpr_base++ = double_tmp; -#if defined(POWERPC_DARWIN) - *(float *)next_arg = *(float *) *p_argv; -#else - *(double *)next_arg = double_tmp; -#endif - next_arg++; - gp_count++; - fparg_count++; - FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); - break; - - case FFI_TYPE_DOUBLE: - double_tmp = *(double *) *p_argv; - if (fparg_count < NUM_FPR_ARG_REGISTERS) - *fpr_base++ = double_tmp; - *(double *)next_arg = double_tmp; -#ifdef POWERPC64 - next_arg++; - gp_count++; -#else - next_arg += 2; - gp_count += 2; -#endif - fparg_count++; - FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); - break; - -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - - case FFI_TYPE_LONGDOUBLE: -# if defined(POWERPC64) && !defined(POWERPC_DARWIN64) - /* ??? This will exceed the regs count when the value starts at fp13 - and it will not put the extra bit on the stack. */ - if (fparg_count < NUM_FPR_ARG_REGISTERS) - *(long double *) fpr_base++ = *(long double *) *p_argv; - else - *(long double *) next_arg = *(long double *) *p_argv; - next_arg += 2; - fparg_count += 2; -# else - double_tmp = ((double *) *p_argv)[0]; - if (fparg_count < NUM_FPR_ARG_REGISTERS) - *fpr_base++ = double_tmp; - *(double *) next_arg = double_tmp; -# if defined(POWERPC_DARWIN64) - next_arg++; - gp_count++; -# else - next_arg += 2; - gp_count += 2; -# endif - fparg_count++; - double_tmp = ((double *) *p_argv)[1]; - if (fparg_count < NUM_FPR_ARG_REGISTERS) - *fpr_base++ = double_tmp; - *(double *) next_arg = double_tmp; -# if defined(POWERPC_DARWIN64) - next_arg++; - gp_count++; -# else - next_arg += 2; - gp_count += 2; -# endif - fparg_count++; -# endif - FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); - break; -#endif - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: -#ifdef POWERPC64 - gprvalue = *(long long *) *p_argv; - goto putgpr; -#else - *(long long *) next_arg = *(long long *) *p_argv; - next_arg += 2; - gp_count += 2; -#endif - break; - case FFI_TYPE_POINTER: - gprvalue = *(unsigned long *) *p_argv; - goto putgpr; - case FFI_TYPE_UINT8: - gprvalue = *(unsigned char *) *p_argv; - goto putgpr; - case FFI_TYPE_SINT8: - gprvalue = *(signed char *) *p_argv; - goto putgpr; - case FFI_TYPE_UINT16: - gprvalue = *(unsigned short *) *p_argv; - goto putgpr; - case FFI_TYPE_SINT16: - gprvalue = *(signed short *) *p_argv; - goto putgpr; - - case FFI_TYPE_STRUCT: - size_al = (*ptr)->size; -#if defined(POWERPC_DARWIN64) - next_arg = (unsigned long *)FFI_ALIGN((char *)next_arg, (*ptr)->alignment); - darwin64_pass_struct_by_value (*ptr, (char *) *p_argv, - (unsigned) size_al, - (unsigned int *) &fparg_count, - &fpr_base, &next_arg); -#else - dest_cpy = (char *) next_arg; - - /* If the first member of the struct is a double, then include enough - padding in the struct size to align it to double-word. */ - if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) - size_al = FFI_ALIGN((*ptr)->size, 8); - -# if defined(POWERPC64) - FFI_ASSERT (abi != FFI_DARWIN); - memcpy ((char *) dest_cpy, (char *) *p_argv, size_al); - next_arg += (size_al + 7) / 8; -# else - /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, - SI 4 bytes) are aligned as if they were those modes. - Structures with 3 byte in size are padded upwards. */ - if (size_al < 3 && abi == FFI_DARWIN) - dest_cpy += 4 - size_al; - - memcpy((char *) dest_cpy, (char *) *p_argv, size_al); - next_arg += (size_al + 3) / 4; -# endif -#endif - break; - - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: - gprvalue = *(signed int *) *p_argv; - goto putgpr; - - case FFI_TYPE_UINT32: - gprvalue = *(unsigned int *) *p_argv; - putgpr: - *next_arg++ = gprvalue; - gp_count++; - break; - default: - break; - } - } - - /* Check that we didn't overrun the stack... */ - /* FFI_ASSERT(gpr_base <= stacktop - ASM_NEEDS_REGISTERS); - FFI_ASSERT((unsigned *)fpr_base - <= stacktop - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS); - FFI_ASSERT(flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4); */ -} - -#if defined(POWERPC_DARWIN64) - -/* See if we can put some of the struct into fprs. - This should not be called for structures of size 16 bytes, since these are not - broken out this way. */ -static void -darwin64_scan_struct_for_floats (ffi_type *s, unsigned *nfpr) -{ - int i; - - FFI_ASSERT (s->type == FFI_TYPE_STRUCT) - - for (i = 0; s->elements[i] != NULL; i++) - { - ffi_type *p = s->elements[i]; - switch (p->type) - { - case FFI_TYPE_STRUCT: - darwin64_scan_struct_for_floats (p, nfpr); - break; - case FFI_TYPE_LONGDOUBLE: - (*nfpr) += 2; - break; - case FFI_TYPE_DOUBLE: - case FFI_TYPE_FLOAT: - (*nfpr) += 1; - break; - default: - break; - } - } -} - -static int -darwin64_struct_size_exceeds_gprs_p (ffi_type *s, char *src, unsigned *nfpr) -{ - unsigned struct_offset=0, i; - - for (i = 0; s->elements[i] != NULL; i++) - { - char *item_base; - ffi_type *p = s->elements[i]; - /* Find the start of this item (0 for the first one). */ - if (i > 0) - struct_offset = FFI_ALIGN(struct_offset, p->alignment); - - item_base = src + struct_offset; - - switch (p->type) - { - case FFI_TYPE_STRUCT: - if (darwin64_struct_size_exceeds_gprs_p (p, item_base, nfpr)) - return 1; - break; - case FFI_TYPE_LONGDOUBLE: - if (*nfpr >= NUM_FPR_ARG_REGISTERS) - return 1; - (*nfpr) += 1; - item_base += 8; - /* FALL THROUGH */ - case FFI_TYPE_DOUBLE: - if (*nfpr >= NUM_FPR_ARG_REGISTERS) - return 1; - (*nfpr) += 1; - break; - case FFI_TYPE_FLOAT: - if (*nfpr >= NUM_FPR_ARG_REGISTERS) - return 1; - (*nfpr) += 1; - break; - default: - /* If we try and place any item, that is non-float, once we've - exceeded the 8 GPR mark, then we can't fit the struct. */ - if ((unsigned long)item_base >= 8*8) - return 1; - break; - } - /* now count the size of what we just used. */ - struct_offset += p->size; - } - return 0; -} - -/* Can this struct be returned by value? */ -int -darwin64_struct_ret_by_value_p (ffi_type *s) -{ - unsigned nfp = 0; - - FFI_ASSERT (s && s->type == FFI_TYPE_STRUCT); - - /* The largest structure we can return is 8long + 13 doubles. */ - if (s->size > 168) - return 0; - - /* We can't pass more than 13 floats. */ - darwin64_scan_struct_for_floats (s, &nfp); - if (nfp > 13) - return 0; - - /* If there are not too many floats, and the struct is - small enough to accommodate in the GPRs, then it must be OK. */ - if (s->size <= 64) - return 1; - - /* Well, we have to look harder. */ - nfp = 0; - if (darwin64_struct_size_exceeds_gprs_p (s, NULL, &nfp)) - return 0; - - return 1; -} - -void -darwin64_pass_struct_floats (ffi_type *s, char *src, - unsigned *nfpr, double **fprs) -{ - int i; - double *fpr_base = *fprs; - unsigned struct_offset = 0; - - /* We don't assume anything about the alignment of the source. */ - for (i = 0; s->elements[i] != NULL; i++) - { - char *item_base; - ffi_type *p = s->elements[i]; - /* Find the start of this item (0 for the first one). */ - if (i > 0) - struct_offset = FFI_ALIGN(struct_offset, p->alignment); - item_base = src + struct_offset; - - switch (p->type) - { - case FFI_TYPE_STRUCT: - darwin64_pass_struct_floats (p, item_base, nfpr, - &fpr_base); - break; - case FFI_TYPE_LONGDOUBLE: - if (*nfpr < NUM_FPR_ARG_REGISTERS) - *fpr_base++ = *(double *)item_base; - (*nfpr) += 1; - item_base += 8; - /* FALL THROUGH */ - case FFI_TYPE_DOUBLE: - if (*nfpr < NUM_FPR_ARG_REGISTERS) - *fpr_base++ = *(double *)item_base; - (*nfpr) += 1; - break; - case FFI_TYPE_FLOAT: - if (*nfpr < NUM_FPR_ARG_REGISTERS) - *fpr_base++ = (double) *(float *)item_base; - (*nfpr) += 1; - break; - default: - break; - } - /* now count the size of what we just used. */ - struct_offset += p->size; - } - /* Update the scores. */ - *fprs = fpr_base; -} - -/* Darwin64 special rules. - Break out a struct into params and float registers. */ -static void -darwin64_pass_struct_by_value (ffi_type *s, char *src, unsigned size, - unsigned *nfpr, double **fprs, unsigned long **arg) -{ - unsigned long *next_arg = *arg; - char *dest_cpy = (char *)next_arg; - - FFI_ASSERT (s->type == FFI_TYPE_STRUCT) - - if (!size) - return; - - /* First... special cases. */ - if (size < 3 - || (size == 4 - && s->elements[0] - && s->elements[0]->type != FFI_TYPE_FLOAT)) - { - /* Must be at least one GPR, padding is unspecified in value, - let's make it zero. */ - *next_arg = 0UL; - dest_cpy += 8 - size; - memcpy ((char *) dest_cpy, src, size); - next_arg++; - } - else if (size == 16) - { - memcpy ((char *) dest_cpy, src, size); - next_arg += 2; - } - else - { - /* now the general case, we consider embedded floats. */ - memcpy ((char *) dest_cpy, src, size); - darwin64_pass_struct_floats (s, src, nfpr, fprs); - next_arg += (size+7)/8; - } - - *arg = next_arg; -} - -double * -darwin64_struct_floats_to_mem (ffi_type *s, char *dest, double *fprs, unsigned *nf) -{ - int i; - unsigned struct_offset = 0; - - /* We don't assume anything about the alignment of the source. */ - for (i = 0; s->elements[i] != NULL; i++) - { - char *item_base; - ffi_type *p = s->elements[i]; - /* Find the start of this item (0 for the first one). */ - if (i > 0) - struct_offset = FFI_ALIGN(struct_offset, p->alignment); - item_base = dest + struct_offset; - - switch (p->type) - { - case FFI_TYPE_STRUCT: - fprs = darwin64_struct_floats_to_mem (p, item_base, fprs, nf); - break; - case FFI_TYPE_LONGDOUBLE: - if (*nf < NUM_FPR_ARG_REGISTERS) - { - *(double *)item_base = *fprs++ ; - (*nf) += 1; - } - item_base += 8; - /* FALL THROUGH */ - case FFI_TYPE_DOUBLE: - if (*nf < NUM_FPR_ARG_REGISTERS) - { - *(double *)item_base = *fprs++ ; - (*nf) += 1; - } - break; - case FFI_TYPE_FLOAT: - if (*nf < NUM_FPR_ARG_REGISTERS) - { - *(float *)item_base = (float) *fprs++ ; - (*nf) += 1; - } - break; - default: - break; - } - /* now count the size of what we just used. */ - struct_offset += p->size; - } - return fprs; -} - -#endif - -/* Adjust the size of S to be correct for Darwin. - On Darwin m32, the first field of a structure has natural alignment. - On Darwin m64, all fields have natural alignment. */ - -static void -darwin_adjust_aggregate_sizes (ffi_type *s) -{ - int i; - - if (s->type != FFI_TYPE_STRUCT) - return; - - s->size = 0; - for (i = 0; s->elements[i] != NULL; i++) - { - ffi_type *p; - int align; - - p = s->elements[i]; - if (p->type == FFI_TYPE_STRUCT) - darwin_adjust_aggregate_sizes (p); -#if defined(POWERPC_DARWIN64) - /* Natural alignment for all items. */ - align = p->alignment; -#else - /* Natural alignment for the first item... */ - if (i == 0) - align = p->alignment; - else if (p->alignment == 16 || p->alignment < 4) - /* .. subsequent items with vector or align < 4 have natural align. */ - align = p->alignment; - else - /* .. or align is 4. */ - align = 4; -#endif - /* Pad, if necessary, before adding the current item. */ - s->size = FFI_ALIGN(s->size, align) + p->size; - } - - s->size = FFI_ALIGN(s->size, s->alignment); - - /* This should not be necessary on m64, but harmless. */ - if (s->elements[0]->type == FFI_TYPE_UINT64 - || s->elements[0]->type == FFI_TYPE_SINT64 - || s->elements[0]->type == FFI_TYPE_DOUBLE - || s->elements[0]->alignment == 8) - s->alignment = s->alignment > 8 ? s->alignment : 8; - /* Do not add additional tail padding. */ -} - -/* Adjust the size of S to be correct for AIX. - Word-align double unless it is the first member of a structure. */ - -static void -aix_adjust_aggregate_sizes (ffi_type *s) -{ - int i; - - if (s->type != FFI_TYPE_STRUCT) - return; - - s->size = 0; - for (i = 0; s->elements[i] != NULL; i++) - { - ffi_type *p; - int align; - - p = s->elements[i]; - aix_adjust_aggregate_sizes (p); - align = p->alignment; - if (i != 0 && p->type == FFI_TYPE_DOUBLE) - align = 4; - s->size = FFI_ALIGN(s->size, align) + p->size; - } - - s->size = FFI_ALIGN(s->size, s->alignment); - - if (s->elements[0]->type == FFI_TYPE_UINT64 - || s->elements[0]->type == FFI_TYPE_SINT64 - || s->elements[0]->type == FFI_TYPE_DOUBLE - || s->elements[0]->alignment == 8) - s->alignment = s->alignment > 8 ? s->alignment : 8; - /* Do not add additional tail padding. */ -} - -/* Perform machine dependent cif processing. */ -ffi_status -ffi_prep_cif_machdep (ffi_cif *cif) -{ - /* All this is for the DARWIN ABI. */ - unsigned i; - ffi_type **ptr; - unsigned bytes; - unsigned fparg_count = 0, intarg_count = 0; - unsigned flags = 0; - unsigned size_al = 0; - - /* All the machine-independent calculation of cif->bytes will be wrong. - All the calculation of structure sizes will also be wrong. - Redo the calculation for DARWIN. */ - - if (cif->abi == FFI_DARWIN) - { - darwin_adjust_aggregate_sizes (cif->rtype); - for (i = 0; i < cif->nargs; i++) - darwin_adjust_aggregate_sizes (cif->arg_types[i]); - } - - if (cif->abi == FFI_AIX) - { - aix_adjust_aggregate_sizes (cif->rtype); - for (i = 0; i < cif->nargs; i++) - aix_adjust_aggregate_sizes (cif->arg_types[i]); - } - - /* Space for the frame pointer, callee's LR, CR, etc, and for - the asm's temp regs. */ - - bytes = (LINKAGE_AREA_GPRS + ASM_NEEDS_REGISTERS) * sizeof(unsigned long); - - /* Return value handling. - The rules m32 are as follows: - - 32-bit (or less) integer values are returned in gpr3; - - structures of size <= 4 bytes also returned in gpr3; - - 64-bit integer values [??? and structures between 5 and 8 bytes] are - returned in gpr3 and gpr4; - - Single/double FP values are returned in fpr1; - - Long double FP (if not equivalent to double) values are returned in - fpr1 and fpr2; - m64: - - 64-bit or smaller integral values are returned in GPR3 - - Single/double FP values are returned in fpr1; - - Long double FP values are returned in fpr1 and fpr2; - m64 Structures: - - If the structure could be accommodated in registers were it to be the - first argument to a routine, then it is returned in those registers. - m32/m64 structures otherwise: - - Larger structures values are allocated space and a pointer is passed - as the first argument. */ - switch (cif->rtype->type) - { - -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - flags |= FLAG_RETURNS_128BITS; - flags |= FLAG_RETURNS_FP; - break; -#endif - - case FFI_TYPE_DOUBLE: - flags |= FLAG_RETURNS_64BITS; - /* Fall through. */ - case FFI_TYPE_FLOAT: - flags |= FLAG_RETURNS_FP; - break; - - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: -#ifdef POWERPC64 - case FFI_TYPE_POINTER: -#endif - flags |= FLAG_RETURNS_64BITS; - break; - - case FFI_TYPE_STRUCT: -#if defined(POWERPC_DARWIN64) - { - /* Can we fit the struct into regs? */ - if (darwin64_struct_ret_by_value_p (cif->rtype)) - { - unsigned nfpr = 0; - flags |= FLAG_RETURNS_STRUCT; - if (cif->rtype->size != 16) - darwin64_scan_struct_for_floats (cif->rtype, &nfpr) ; - else - flags |= FLAG_RETURNS_128BITS; - /* Will be 0 for 16byte struct. */ - if (nfpr) - flags |= FLAG_RETURNS_FP; - } - else /* By ref. */ - { - flags |= FLAG_RETVAL_REFERENCE; - flags |= FLAG_RETURNS_NOTHING; - intarg_count++; - } - } -#elif defined(DARWIN_PPC) - if (cif->rtype->size <= 4) - flags |= FLAG_RETURNS_STRUCT; - else /* else by reference. */ - { - flags |= FLAG_RETVAL_REFERENCE; - flags |= FLAG_RETURNS_NOTHING; - intarg_count++; - } -#else /* assume we pass by ref. */ - flags |= FLAG_RETVAL_REFERENCE; - flags |= FLAG_RETURNS_NOTHING; - intarg_count++; -#endif - break; - case FFI_TYPE_VOID: - flags |= FLAG_RETURNS_NOTHING; - break; - - default: - /* Returns 32-bit integer, or similar. Nothing to do here. */ - break; - } - - /* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the - first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest - goes on the stack. - ??? Structures are passed as a pointer to a copy of the structure. - Stuff on the stack needs to keep proper alignment. - For m64 the count is effectively of half-GPRs. */ - for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) - { - unsigned align_words; - switch ((*ptr)->type) - { - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - fparg_count++; -#if !defined(POWERPC_DARWIN64) - /* If this FP arg is going on the stack, it must be - 8-byte-aligned. */ - if (fparg_count > NUM_FPR_ARG_REGISTERS - && (intarg_count & 0x01) != 0) - intarg_count++; -#endif - break; - -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - fparg_count += 2; - /* If this FP arg is going on the stack, it must be - 16-byte-aligned. */ - if (fparg_count >= NUM_FPR_ARG_REGISTERS) -#if defined (POWERPC64) - intarg_count = FFI_ALIGN(intarg_count, 2); -#else - intarg_count = FFI_ALIGN(intarg_count, 4); -#endif - break; -#endif - - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: -#if defined(POWERPC64) - intarg_count++; -#else - /* 'long long' arguments are passed as two words, but - either both words must fit in registers or both go - on the stack. If they go on the stack, they must - be 8-byte-aligned. */ - if (intarg_count == NUM_GPR_ARG_REGISTERS-1 - || (intarg_count >= NUM_GPR_ARG_REGISTERS - && (intarg_count & 0x01) != 0)) - intarg_count++; - intarg_count += 2; -#endif - break; - - case FFI_TYPE_STRUCT: - size_al = (*ptr)->size; -#if defined(POWERPC_DARWIN64) - align_words = (*ptr)->alignment >> 3; - if (align_words) - intarg_count = FFI_ALIGN(intarg_count, align_words); - /* Base size of the struct. */ - intarg_count += (size_al + 7) / 8; - /* If 16 bytes then don't worry about floats. */ - if (size_al != 16) - /* Scan through for floats to be placed in regs. */ - darwin64_scan_struct_for_floats (*ptr, &fparg_count) ; -#else - align_words = (*ptr)->alignment >> 2; - if (align_words) - intarg_count = FFI_ALIGN(intarg_count, align_words); - /* If the first member of the struct is a double, then align - the struct to double-word. - if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) - size_al = FFI_ALIGN((*ptr)->size, 8); */ -# ifdef POWERPC64 - intarg_count += (size_al + 7) / 8; -# else - intarg_count += (size_al + 3) / 4; -# endif -#endif - break; - - default: - /* Everything else is passed as a 4-byte word in a GPR, either - the object itself or a pointer to it. */ - intarg_count++; - break; - } - } - - if (fparg_count != 0) - flags |= FLAG_FP_ARGUMENTS; - -#if defined(POWERPC_DARWIN64) - /* Space to image the FPR registers, if needed - which includes when they might be - used in a struct return. */ - if (fparg_count != 0 - || ((flags & FLAG_RETURNS_STRUCT) - && (flags & FLAG_RETURNS_FP))) - bytes += NUM_FPR_ARG_REGISTERS * sizeof(double); -#else - /* Space for the FPR registers, if needed. */ - if (fparg_count != 0) - bytes += NUM_FPR_ARG_REGISTERS * sizeof(double); -#endif - - /* Stack space. */ -#ifdef POWERPC64 - if ((intarg_count + fparg_count) > NUM_GPR_ARG_REGISTERS) - bytes += (intarg_count + fparg_count) * sizeof(long); -#else - if ((intarg_count + 2 * fparg_count) > NUM_GPR_ARG_REGISTERS) - bytes += (intarg_count + 2 * fparg_count) * sizeof(long); -#endif - else - bytes += NUM_GPR_ARG_REGISTERS * sizeof(long); - - /* The stack space allocated needs to be a multiple of 16 bytes. */ - bytes = FFI_ALIGN(bytes, 16) ; - - cif->flags = flags; - cif->bytes = bytes; - - return FFI_OK; -} - -extern void ffi_call_AIX(extended_cif *, long, unsigned, unsigned *, - void (*fn)(void), void (*fn2)(void)); - -#if defined (FFI_GO_CLOSURES) -extern void ffi_call_go_AIX(extended_cif *, long, unsigned, unsigned *, - void (*fn)(void), void (*fn2)(void), void *closure); -#endif - -extern void ffi_call_DARWIN(extended_cif *, long, unsigned, unsigned *, - void (*fn)(void), void (*fn2)(void), ffi_type*); - -void -ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - extended_cif ecif; - - ecif.cif = cif; - ecif.avalue = avalue; - - /* If the return value is a struct and we don't have a return - value address then we need to make one. */ - - if ((rvalue == NULL) && - (cif->rtype->type == FFI_TYPE_STRUCT)) - { - ecif.rvalue = alloca (cif->rtype->size); - } - else - ecif.rvalue = rvalue; - - switch (cif->abi) - { - case FFI_AIX: - ffi_call_AIX(&ecif, -(long)cif->bytes, cif->flags, ecif.rvalue, fn, - FFI_FN(ffi_prep_args)); - break; - case FFI_DARWIN: - ffi_call_DARWIN(&ecif, -(long)cif->bytes, cif->flags, ecif.rvalue, fn, - FFI_FN(ffi_prep_args), cif->rtype); - break; - default: - FFI_ASSERT(0); - break; - } -} - -#if defined (FFI_GO_CLOSURES) -void -ffi_call_go (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue, - void *closure) -{ - extended_cif ecif; - - ecif.cif = cif; - ecif.avalue = avalue; - - /* If the return value is a struct and we don't have a return - value address then we need to make one. */ - - if ((rvalue == NULL) && - (cif->rtype->type == FFI_TYPE_STRUCT)) - { - ecif.rvalue = alloca (cif->rtype->size); - } - else - ecif.rvalue = rvalue; - - switch (cif->abi) - { - case FFI_AIX: - ffi_call_go_AIX(&ecif, -(long)cif->bytes, cif->flags, ecif.rvalue, fn, - FFI_FN(ffi_prep_args), closure); - break; - default: - FFI_ASSERT(0); - break; - } -} -#endif - -static void flush_icache(char *); -static void flush_range(char *, int); - -/* The layout of a function descriptor. A C function pointer really - points to one of these. */ - -typedef struct aix_fd_struct { - void *code_pointer; - void *toc; -} aix_fd; - -/* here I'd like to add the stack frame layout we use in darwin_closure.S - and aix_closure.S - - m32/m64 - - The stack layout looks like this: - - | Additional params... | | Higher address - ~ ~ ~ - | Parameters (at least 8*4/8=32/64) | | NUM_GPR_ARG_REGISTERS - |--------------------------------------------| | - | TOC=R2 (AIX) Reserved (Darwin) 4/8 | | - |--------------------------------------------| | - | Reserved 2*4/8 | | - |--------------------------------------------| | - | Space for callee's LR 4/8 | | - |--------------------------------------------| | - | Saved CR [low word for m64] 4/8 | | - |--------------------------------------------| | - | Current backchain pointer 4/8 |-/ Parent's frame. - |--------------------------------------------| <+ <<< on entry to ffi_closure_ASM - | Result Bytes 16 | | - |--------------------------------------------| | - ~ padding to 16-byte alignment ~ ~ - |--------------------------------------------| | - | NUM_FPR_ARG_REGISTERS slots | | - | here fp13 .. fp1 13*8 | | - |--------------------------------------------| | - | R3..R10 8*4/8=32/64 | | NUM_GPR_ARG_REGISTERS - |--------------------------------------------| | - | TOC=R2 (AIX) Reserved (Darwin) 4/8 | | - |--------------------------------------------| | stack | - | Reserved [compiler,binder] 2*4/8 | | grows | - |--------------------------------------------| | down V - | Space for callee's LR 4/8 | | - |--------------------------------------------| | lower addresses - | Saved CR [low word for m64] 4/8 | | - |--------------------------------------------| | stack pointer here - | Current backchain pointer 4/8 |-/ during - |--------------------------------------------| <<< ffi_closure_ASM. - -*/ - -ffi_status -ffi_prep_closure_loc (ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, - void *codeloc) -{ - unsigned int *tramp; - struct ffi_aix_trampoline_struct *tramp_aix; - aix_fd *fd; - - switch (cif->abi) - { - case FFI_DARWIN: - - FFI_ASSERT (cif->abi == FFI_DARWIN); - - tramp = (unsigned int *) &closure->tramp[0]; -#if defined(POWERPC_DARWIN64) - tramp[0] = 0x7c0802a6; /* mflr r0 */ - tramp[1] = 0x429f0015; /* bcl- 20,4*cr7+so, +0x18 (L1) */ - /* We put the addresses here. */ - tramp[6] = 0x7d6802a6; /*L1: mflr r11 */ - tramp[7] = 0xe98b0000; /* ld r12,0(r11) function address */ - tramp[8] = 0x7c0803a6; /* mtlr r0 */ - tramp[9] = 0x7d8903a6; /* mtctr r12 */ - tramp[10] = 0xe96b0008; /* lwz r11,8(r11) static chain */ - tramp[11] = 0x4e800420; /* bctr */ - - *((unsigned long *)&tramp[2]) = (unsigned long) ffi_closure_ASM; /* function */ - *((unsigned long *)&tramp[4]) = (unsigned long) codeloc; /* context */ -#else - tramp[0] = 0x7c0802a6; /* mflr r0 */ - tramp[1] = 0x429f000d; /* bcl- 20,4*cr7+so,0x10 */ - tramp[4] = 0x7d6802a6; /* mflr r11 */ - tramp[5] = 0x818b0000; /* lwz r12,0(r11) function address */ - tramp[6] = 0x7c0803a6; /* mtlr r0 */ - tramp[7] = 0x7d8903a6; /* mtctr r12 */ - tramp[8] = 0x816b0004; /* lwz r11,4(r11) static chain */ - tramp[9] = 0x4e800420; /* bctr */ - tramp[2] = (unsigned long) ffi_closure_ASM; /* function */ - tramp[3] = (unsigned long) codeloc; /* context */ -#endif - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - /* Flush the icache. Only necessary on Darwin. */ - flush_range(codeloc, FFI_TRAMPOLINE_SIZE); - - break; - - case FFI_AIX: - - tramp_aix = (struct ffi_aix_trampoline_struct *) (closure->tramp); - fd = (aix_fd *)(void *)ffi_closure_ASM; - - FFI_ASSERT (cif->abi == FFI_AIX); - - tramp_aix->code_pointer = fd->code_pointer; - tramp_aix->toc = fd->toc; - tramp_aix->static_chain = codeloc; - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - break; - - default: - return FFI_BAD_ABI; - break; - } - return FFI_OK; -} - -#if defined (FFI_GO_CLOSURES) -ffi_status -ffi_prep_go_closure (ffi_go_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*)) -{ - switch (cif->abi) - { - case FFI_AIX: - - FFI_ASSERT (cif->abi == FFI_AIX); - - closure->tramp = (void *)ffi_go_closure_ASM; - closure->cif = cif; - closure->fun = fun; - return FFI_OK; - - // For now, ffi_prep_go_closure is only implemented for AIX, not for Darwin - default: - return FFI_BAD_ABI; - break; - } - return FFI_OK; -} -#endif - -static void -flush_icache(char *addr) -{ -#ifndef _AIX - __asm__ volatile ( - "dcbf 0,%0\n" - "\tsync\n" - "\ticbi 0,%0\n" - "\tsync\n" - "\tisync" - : : "r"(addr) : "memory"); -#endif -} - -static void -flush_range(char * addr1, int size) -{ -#define MIN_LINE_SIZE 32 - int i; - for (i = 0; i < size; i += MIN_LINE_SIZE) - flush_icache(addr1+i); - flush_icache(addr1+size-1); -} - -typedef union -{ - float f; - double d; -} ffi_dblfl; - -ffi_type * -ffi_closure_helper_DARWIN (ffi_closure *, void *, - unsigned long *, ffi_dblfl *); - -#if defined (FFI_GO_CLOSURES) -ffi_type * -ffi_go_closure_helper_DARWIN (ffi_go_closure*, void *, - unsigned long *, ffi_dblfl *); -#endif - -/* Basically the trampoline invokes ffi_closure_ASM, and on - entry, r11 holds the address of the closure. - After storing the registers that could possibly contain - parameters to be passed into the stack frame and setting - up space for a return value, ffi_closure_ASM invokes the - following helper function to do most of the work. */ - -static ffi_type * -ffi_closure_helper_common (ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, void *rvalue, - unsigned long *pgr, ffi_dblfl *pfr) -{ - /* rvalue is the pointer to space for return value in closure assembly - pgr is the pointer to where r3-r10 are stored in ffi_closure_ASM - pfr is the pointer to where f1-f13 are stored in ffi_closure_ASM. */ - - typedef double ldbits[2]; - - union ldu - { - ldbits lb; - long double ld; - }; - - void ** avalue; - ffi_type ** arg_types; - long i, avn; - ffi_dblfl * end_pfr = pfr + NUM_FPR_ARG_REGISTERS; - unsigned size_al; -#if defined(POWERPC_DARWIN64) - unsigned fpsused = 0; -#endif - - avalue = alloca (cif->nargs * sizeof(void *)); - - if (cif->rtype->type == FFI_TYPE_STRUCT) - { -#if defined(POWERPC_DARWIN64) - if (!darwin64_struct_ret_by_value_p (cif->rtype)) - { - /* Won't fit into the regs - return by ref. */ - rvalue = (void *) *pgr; - pgr++; - } -#elif defined(DARWIN_PPC) - if (cif->rtype->size > 4) - { - rvalue = (void *) *pgr; - pgr++; - } -#else /* assume we return by ref. */ - rvalue = (void *) *pgr; - pgr++; -#endif - } - - i = 0; - avn = cif->nargs; - arg_types = cif->arg_types; - - /* Grab the addresses of the arguments from the stack frame. */ - while (i < avn) - { - switch (arg_types[i]->type) - { - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: -#if defined(POWERPC64) - avalue[i] = (char *) pgr + 7; -#else - avalue[i] = (char *) pgr + 3; -#endif - pgr++; - break; - - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: -#if defined(POWERPC64) - avalue[i] = (char *) pgr + 6; -#else - avalue[i] = (char *) pgr + 2; -#endif - pgr++; - break; - - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: -#if defined(POWERPC64) - avalue[i] = (char *) pgr + 4; -#else - case FFI_TYPE_POINTER: - avalue[i] = pgr; -#endif - pgr++; - break; - - case FFI_TYPE_STRUCT: - size_al = arg_types[i]->size; -#if defined(POWERPC_DARWIN64) - pgr = (unsigned long *)FFI_ALIGN((char *)pgr, arg_types[i]->alignment); - if (size_al < 3 || size_al == 4) - { - avalue[i] = ((char *)pgr)+8-size_al; - if (arg_types[i]->elements[0]->type == FFI_TYPE_FLOAT - && fpsused < NUM_FPR_ARG_REGISTERS) - { - *(float *)pgr = (float) *(double *)pfr; - pfr++; - fpsused++; - } - } - else - { - if (size_al != 16) - pfr = (ffi_dblfl *) - darwin64_struct_floats_to_mem (arg_types[i], (char *)pgr, - (double *)pfr, &fpsused); - avalue[i] = pgr; - } - pgr += (size_al + 7) / 8; -#else - /* If the first member of the struct is a double, then align - the struct to double-word. */ - if (arg_types[i]->elements[0]->type == FFI_TYPE_DOUBLE) - size_al = FFI_ALIGN(arg_types[i]->size, 8); -# if defined(POWERPC64) - FFI_ASSERT (cif->abi != FFI_DARWIN); - avalue[i] = pgr; - pgr += (size_al + 7) / 8; -# else - /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, - SI 4 bytes) are aligned as if they were those modes. */ - if (size_al < 3 && cif->abi == FFI_DARWIN) - avalue[i] = (char*) pgr + 4 - size_al; - else - avalue[i] = pgr; - pgr += (size_al + 3) / 4; -# endif -#endif - break; - - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: -#if defined(POWERPC64) - case FFI_TYPE_POINTER: - avalue[i] = pgr; - pgr++; - break; -#else - /* Long long ints are passed in two gpr's. */ - avalue[i] = pgr; - pgr += 2; - break; -#endif - - case FFI_TYPE_FLOAT: - /* A float value consumes a GPR. - There are 13 64bit floating point registers. */ - if (pfr < end_pfr) - { - double temp = pfr->d; - pfr->f = (float) temp; - avalue[i] = pfr; - pfr++; - } - else - { - avalue[i] = pgr; - } - pgr++; - break; - - case FFI_TYPE_DOUBLE: - /* A double value consumes two GPRs. - There are 13 64bit floating point registers. */ - if (pfr < end_pfr) - { - avalue[i] = pfr; - pfr++; - } - else - { - avalue[i] = pgr; - } -#ifdef POWERPC64 - pgr++; -#else - pgr += 2; -#endif - break; - -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - - case FFI_TYPE_LONGDOUBLE: -#ifdef POWERPC64 - if (pfr + 1 < end_pfr) - { - avalue[i] = pfr; - pfr += 2; - } - else - { - if (pfr < end_pfr) - { - *pgr = *(unsigned long *) pfr; - pfr++; - } - avalue[i] = pgr; - } - pgr += 2; -#else /* POWERPC64 */ - /* A long double value consumes four GPRs and two FPRs. - There are 13 64bit floating point registers. */ - if (pfr + 1 < end_pfr) - { - avalue[i] = pfr; - pfr += 2; - } - /* Here we have the situation where one part of the long double - is stored in fpr13 and the other part is already on the stack. - We use a union to pass the long double to avalue[i]. */ - else if (pfr + 1 == end_pfr) - { - union ldu temp_ld; - memcpy (&temp_ld.lb[0], pfr, sizeof(ldbits)); - memcpy (&temp_ld.lb[1], pgr + 2, sizeof(ldbits)); - avalue[i] = &temp_ld.ld; - pfr++; - } - else - { - avalue[i] = pgr; - } - pgr += 4; -#endif /* POWERPC64 */ - break; -#endif - default: - FFI_ASSERT(0); - } - i++; - } - - (fun) (cif, rvalue, avalue, user_data); - - /* Tell ffi_closure_ASM to perform return type promotions. */ - return cif->rtype; -} - -ffi_type * -ffi_closure_helper_DARWIN (ffi_closure *closure, void *rvalue, - unsigned long *pgr, ffi_dblfl *pfr) -{ - return ffi_closure_helper_common (closure->cif, closure->fun, - closure->user_data, rvalue, pgr, pfr); -} - -#if defined (FFI_GO_CLOSURES) -ffi_type * -ffi_go_closure_helper_DARWIN (ffi_go_closure *closure, void *rvalue, - unsigned long *pgr, ffi_dblfl *pfr) -{ - return ffi_closure_helper_common (closure->cif, closure->fun, - closure, rvalue, pgr, pfr); -} -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c deleted file mode 100644 index 4d50878..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +++ /dev/null @@ -1,1153 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi_linux64.c - Copyright (C) 2013 IBM - Copyright (C) 2011 Anthony Green - Copyright (C) 2011 Kyle Moffett - Copyright (C) 2008 Red Hat, Inc - Copyright (C) 2007, 2008 Free Software Foundation, Inc - Copyright (c) 1998 Geoffrey Keating - - PowerPC Foreign Function Interface - - 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 AUTHOR 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. - ----------------------------------------------------------------------- */ - -#include "ffi.h" - -#ifdef POWERPC64 -#include "ffi_common.h" -#include "ffi_powerpc.h" - - -/* About the LINUX64 ABI. */ -enum { - NUM_GPR_ARG_REGISTERS64 = 8, - NUM_FPR_ARG_REGISTERS64 = 13, - NUM_VEC_ARG_REGISTERS64 = 12, -}; -enum { ASM_NEEDS_REGISTERS64 = 4 }; - - -#if HAVE_LONG_DOUBLE_VARIANT && FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE -/* Adjust size of ffi_type_longdouble. */ -void FFI_HIDDEN -ffi_prep_types_linux64 (ffi_abi abi) -{ - if ((abi & (FFI_LINUX | FFI_LINUX_LONG_DOUBLE_128)) == FFI_LINUX) - { - ffi_type_longdouble.size = 8; - ffi_type_longdouble.alignment = 8; - } - else - { - ffi_type_longdouble.size = 16; - ffi_type_longdouble.alignment = 16; - } -} -#endif - - -static unsigned int -discover_homogeneous_aggregate (ffi_abi abi, - const ffi_type *t, - unsigned int *elnum) -{ - switch (t->type) - { -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - /* 64-bit long doubles are equivalent to doubles. */ - if ((abi & FFI_LINUX_LONG_DOUBLE_128) == 0) - { - *elnum = 1; - return FFI_TYPE_DOUBLE; - } - /* IBM extended precision values use unaligned pairs - of FPRs, but according to the ABI must be considered - distinct from doubles. They are also limited to a - maximum of four members in a homogeneous aggregate. */ - else if ((abi & FFI_LINUX_LONG_DOUBLE_IEEE128) == 0) - { - *elnum = 2; - return FFI_TYPE_LONGDOUBLE; - } - /* Fall through. */ -#endif - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - *elnum = 1; - return (int) t->type; - - case FFI_TYPE_STRUCT:; - { - unsigned int base_elt = 0, total_elnum = 0; - ffi_type **el = t->elements; - while (*el) - { - unsigned int el_elt, el_elnum = 0; - el_elt = discover_homogeneous_aggregate (abi, *el, &el_elnum); - if (el_elt == 0 - || (base_elt && base_elt != el_elt)) - return 0; - base_elt = el_elt; - total_elnum += el_elnum; -#if _CALL_ELF == 2 - if (total_elnum > 8) - return 0; -#else - if (total_elnum > 1) - return 0; -#endif - el++; - } - *elnum = total_elnum; - return base_elt; - } - - default: - return 0; - } -} - - -/* Perform machine dependent cif processing */ -static ffi_status -ffi_prep_cif_linux64_core (ffi_cif *cif) -{ - ffi_type **ptr; - unsigned bytes; - unsigned i, fparg_count = 0, intarg_count = 0, vecarg_count = 0; - unsigned flags = cif->flags; - unsigned elt, elnum, rtype; - -#if FFI_TYPE_LONGDOUBLE == FFI_TYPE_DOUBLE - /* If compiled without long double support... */ - if ((cif->abi & FFI_LINUX_LONG_DOUBLE_128) != 0 || - (cif->abi & FFI_LINUX_LONG_DOUBLE_IEEE128) != 0) - return FFI_BAD_ABI; -#elif !defined(__VEC__) - /* If compiled without vector register support (used by assembly)... */ - if ((cif->abi & FFI_LINUX_LONG_DOUBLE_IEEE128) != 0) - return FFI_BAD_ABI; -#else - /* If the IEEE128 flag is set, but long double is only 64 bits wide... */ - if ((cif->abi & FFI_LINUX_LONG_DOUBLE_128) == 0 && - (cif->abi & FFI_LINUX_LONG_DOUBLE_IEEE128) != 0) - return FFI_BAD_ABI; -#endif - - /* The machine-independent calculation of cif->bytes doesn't work - for us. Redo the calculation. */ -#if _CALL_ELF == 2 - /* Space for backchain, CR, LR, TOC and the asm's temp regs. */ - bytes = (4 + ASM_NEEDS_REGISTERS64) * sizeof (long); - - /* Space for the general registers. */ - bytes += NUM_GPR_ARG_REGISTERS64 * sizeof (long); -#else - /* Space for backchain, CR, LR, cc/ld doubleword, TOC and the asm's temp - regs. */ - bytes = (6 + ASM_NEEDS_REGISTERS64) * sizeof (long); - - /* Space for the mandatory parm save area and general registers. */ - bytes += 2 * NUM_GPR_ARG_REGISTERS64 * sizeof (long); -#endif - - /* Return value handling. */ - rtype = cif->rtype->type; -#if _CALL_ELF == 2 -homogeneous: -#endif - switch (rtype) - { -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - if ((cif->abi & FFI_LINUX_LONG_DOUBLE_IEEE128) != 0) - { - flags |= FLAG_RETURNS_VEC; - break; - } - if ((cif->abi & FFI_LINUX_LONG_DOUBLE_128) != 0) - flags |= FLAG_RETURNS_128BITS; - /* Fall through. */ -#endif - case FFI_TYPE_DOUBLE: - flags |= FLAG_RETURNS_64BITS; - /* Fall through. */ - case FFI_TYPE_FLOAT: - flags |= FLAG_RETURNS_FP; - break; - - case FFI_TYPE_UINT128: - flags |= FLAG_RETURNS_128BITS; - /* Fall through. */ - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - case FFI_TYPE_POINTER: - flags |= FLAG_RETURNS_64BITS; - break; - - case FFI_TYPE_STRUCT: -#if _CALL_ELF == 2 - elt = discover_homogeneous_aggregate (cif->abi, cif->rtype, &elnum); - if (elt) - { - flags |= FLAG_RETURNS_SMST; - rtype = elt; - goto homogeneous; - } - if (cif->rtype->size <= 16) - { - flags |= FLAG_RETURNS_SMST; - break; - } -#endif - intarg_count++; - flags |= FLAG_RETVAL_REFERENCE; - /* Fall through. */ - case FFI_TYPE_VOID: - flags |= FLAG_RETURNS_NOTHING; - break; - - default: - /* Returns 32-bit integer, or similar. Nothing to do here. */ - break; - } - - for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) - { - unsigned int align; - - switch ((*ptr)->type) - { -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - if ((cif->abi & FFI_LINUX_LONG_DOUBLE_IEEE128) != 0) - { - vecarg_count++; - /* Align to 16 bytes, plus the 16-byte argument. */ - intarg_count = (intarg_count + 3) & ~0x1; - if (vecarg_count > NUM_VEC_ARG_REGISTERS64) - flags |= FLAG_ARG_NEEDS_PSAVE; - break; - } - if ((cif->abi & FFI_LINUX_LONG_DOUBLE_128) != 0) - { - fparg_count++; - intarg_count++; - } - /* Fall through. */ -#endif - case FFI_TYPE_DOUBLE: - case FFI_TYPE_FLOAT: - fparg_count++; - intarg_count++; - if (fparg_count > NUM_FPR_ARG_REGISTERS64) - flags |= FLAG_ARG_NEEDS_PSAVE; - break; - - case FFI_TYPE_STRUCT: - if ((cif->abi & FFI_LINUX_STRUCT_ALIGN) != 0) - { - align = (*ptr)->alignment; - if (align > 16) - align = 16; - align = align / 8; - if (align > 1) - intarg_count = FFI_ALIGN (intarg_count, align); - } - intarg_count += ((*ptr)->size + 7) / 8; - elt = discover_homogeneous_aggregate (cif->abi, *ptr, &elnum); -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - if (elt == FFI_TYPE_LONGDOUBLE && - (cif->abi & FFI_LINUX_LONG_DOUBLE_IEEE128) != 0) - { - vecarg_count += elnum; - if (vecarg_count > NUM_VEC_ARG_REGISTERS64) - flags |= FLAG_ARG_NEEDS_PSAVE; - break; - } - else -#endif - if (elt) - { - fparg_count += elnum; - if (fparg_count > NUM_FPR_ARG_REGISTERS64) - flags |= FLAG_ARG_NEEDS_PSAVE; - } - else - { - if (intarg_count > NUM_GPR_ARG_REGISTERS64) - flags |= FLAG_ARG_NEEDS_PSAVE; - } - break; - - case FFI_TYPE_POINTER: - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - case FFI_TYPE_INT: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT8: - /* Everything else is passed as a 8-byte word in a GPR, either - the object itself or a pointer to it. */ - intarg_count++; - if (intarg_count > NUM_GPR_ARG_REGISTERS64) - flags |= FLAG_ARG_NEEDS_PSAVE; - break; - default: - FFI_ASSERT (0); - } - } - - if (fparg_count != 0) - flags |= FLAG_FP_ARGUMENTS; - if (intarg_count > 4) - flags |= FLAG_4_GPR_ARGUMENTS; - if (vecarg_count != 0) - flags |= FLAG_VEC_ARGUMENTS; - - /* Space for the FPR registers, if needed. */ - if (fparg_count != 0) - bytes += NUM_FPR_ARG_REGISTERS64 * sizeof (double); - /* Space for the vector registers, if needed, aligned to 16 bytes. */ - if (vecarg_count != 0) { - bytes = (bytes + 15) & ~0xF; - bytes += NUM_VEC_ARG_REGISTERS64 * sizeof (float128); - } - - /* Stack space. */ -#if _CALL_ELF == 2 - if ((flags & FLAG_ARG_NEEDS_PSAVE) != 0) - bytes += intarg_count * sizeof (long); -#else - if (intarg_count > NUM_GPR_ARG_REGISTERS64) - bytes += (intarg_count - NUM_GPR_ARG_REGISTERS64) * sizeof (long); -#endif - - /* The stack space allocated needs to be a multiple of 16 bytes. */ - bytes = (bytes + 15) & ~0xF; - - cif->flags = flags; - cif->bytes = bytes; - - return FFI_OK; -} - -ffi_status FFI_HIDDEN -ffi_prep_cif_linux64 (ffi_cif *cif) -{ - if ((cif->abi & FFI_LINUX) != 0) - cif->nfixedargs = cif->nargs; -#if _CALL_ELF != 2 - else if (cif->abi == FFI_COMPAT_LINUX64) - { - /* This call is from old code. Don't touch cif->nfixedargs - since old code will be using a smaller cif. */ - cif->flags |= FLAG_COMPAT; - /* Translate to new abi value. */ - cif->abi = FFI_LINUX | FFI_LINUX_LONG_DOUBLE_128; - } -#endif - else - return FFI_BAD_ABI; - return ffi_prep_cif_linux64_core (cif); -} - -ffi_status FFI_HIDDEN -ffi_prep_cif_linux64_var (ffi_cif *cif, - unsigned int nfixedargs, - unsigned int ntotalargs MAYBE_UNUSED) -{ - if ((cif->abi & FFI_LINUX) != 0) - cif->nfixedargs = nfixedargs; -#if _CALL_ELF != 2 - else if (cif->abi == FFI_COMPAT_LINUX64) - { - /* This call is from old code. Don't touch cif->nfixedargs - since old code will be using a smaller cif. */ - cif->flags |= FLAG_COMPAT; - /* Translate to new abi value. */ - cif->abi = FFI_LINUX | FFI_LINUX_LONG_DOUBLE_128; - } -#endif - else - return FFI_BAD_ABI; -#if _CALL_ELF == 2 - cif->flags |= FLAG_ARG_NEEDS_PSAVE; -#endif - return ffi_prep_cif_linux64_core (cif); -} - - -/* ffi_prep_args64 is called by the assembly routine once stack space - has been allocated for the function's arguments. - - The stack layout we want looks like this: - - | Ret addr from ffi_call_LINUX64 8bytes | higher addresses - |--------------------------------------------| - | CR save area 8bytes | - |--------------------------------------------| - | Previous backchain pointer 8 | stack pointer here - |--------------------------------------------|<+ <<< on entry to - | Saved r28-r31 4*8 | | ffi_call_LINUX64 - |--------------------------------------------| | - | GPR registers r3-r10 8*8 | | - |--------------------------------------------| | - | FPR registers f1-f13 (optional) 13*8 | | - |--------------------------------------------| | - | VEC registers v2-v13 (optional) 12*16 | | - |--------------------------------------------| | - | Parameter save area | | - |--------------------------------------------| | - | TOC save area 8 | | - |--------------------------------------------| | stack | - | Linker doubleword 8 | | grows | - |--------------------------------------------| | down V - | Compiler doubleword 8 | | - |--------------------------------------------| | lower addresses - | Space for callee's LR 8 | | - |--------------------------------------------| | - | CR save area 8 | | - |--------------------------------------------| | stack pointer here - | Current backchain pointer 8 |-/ during - |--------------------------------------------| <<< ffi_call_LINUX64 - -*/ - -void FFI_HIDDEN -ffi_prep_args64 (extended_cif *ecif, unsigned long *const stack) -{ - const unsigned long bytes = ecif->cif->bytes; - const unsigned long flags = ecif->cif->flags; - - typedef union - { - char *c; - unsigned long *ul; - float *f; - double *d; - float128 *f128; - size_t p; - } valp; - - /* 'stacktop' points at the previous backchain pointer. */ - valp stacktop; - - /* 'next_arg' points at the space for gpr3, and grows upwards as - we use GPR registers, then continues at rest. */ - valp gpr_base; - valp gpr_end; - valp rest; - valp next_arg; - - /* 'fpr_base' points at the space for f1, and grows upwards as - we use FPR registers. */ - valp fpr_base; - unsigned int fparg_count; - - /* 'vec_base' points at the space for v2, and grows upwards as - we use vector registers. */ - valp vec_base; - unsigned int vecarg_count; - - unsigned int i, words, nargs, nfixedargs; - ffi_type **ptr; - double double_tmp; - union - { - void **v; - char **c; - signed char **sc; - unsigned char **uc; - signed short **ss; - unsigned short **us; - signed int **si; - unsigned int **ui; - unsigned long **ul; - float **f; - double **d; - float128 **f128; - } p_argv; - unsigned long gprvalue; - unsigned long align; - - stacktop.c = (char *) stack + bytes; - gpr_base.ul = stacktop.ul - ASM_NEEDS_REGISTERS64 - NUM_GPR_ARG_REGISTERS64; - gpr_end.ul = gpr_base.ul + NUM_GPR_ARG_REGISTERS64; -#if _CALL_ELF == 2 - rest.ul = stack + 4 + NUM_GPR_ARG_REGISTERS64; -#else - rest.ul = stack + 6 + NUM_GPR_ARG_REGISTERS64; -#endif - fpr_base.d = gpr_base.d - NUM_FPR_ARG_REGISTERS64; - fparg_count = 0; - /* Place the vector args below the FPRs, if used, else the GPRs. */ - if (ecif->cif->flags & FLAG_FP_ARGUMENTS) - vec_base.p = fpr_base.p & ~0xF; - else - vec_base.p = gpr_base.p; - vec_base.f128 -= NUM_VEC_ARG_REGISTERS64; - vecarg_count = 0; - next_arg.ul = gpr_base.ul; - - /* Check that everything starts aligned properly. */ - FFI_ASSERT (((unsigned long) (char *) stack & 0xF) == 0); - FFI_ASSERT (((unsigned long) stacktop.c & 0xF) == 0); - FFI_ASSERT (((unsigned long) gpr_base.c & 0xF) == 0); - FFI_ASSERT (((unsigned long) gpr_end.c & 0xF) == 0); - FFI_ASSERT (((unsigned long) vec_base.c & 0xF) == 0); - FFI_ASSERT ((bytes & 0xF) == 0); - - /* Deal with return values that are actually pass-by-reference. */ - if (flags & FLAG_RETVAL_REFERENCE) - *next_arg.ul++ = (unsigned long) (char *) ecif->rvalue; - - /* Now for the arguments. */ - p_argv.v = ecif->avalue; - nargs = ecif->cif->nargs; -#if _CALL_ELF != 2 - nfixedargs = (unsigned) -1; - if ((flags & FLAG_COMPAT) == 0) -#endif - nfixedargs = ecif->cif->nfixedargs; - for (ptr = ecif->cif->arg_types, i = 0; - i < nargs; - i++, ptr++, p_argv.v++) - { - unsigned int elt, elnum; - - switch ((*ptr)->type) - { -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - if ((ecif->cif->abi & FFI_LINUX_LONG_DOUBLE_IEEE128) != 0) - { - next_arg.p = FFI_ALIGN (next_arg.p, 16); - if (next_arg.ul == gpr_end.ul) - next_arg.ul = rest.ul; - if (vecarg_count < NUM_VEC_ARG_REGISTERS64 && i < nfixedargs) - memcpy (vec_base.f128++, *p_argv.f128, sizeof (float128)); - else - memcpy (next_arg.f128, *p_argv.f128, sizeof (float128)); - if (++next_arg.f128 == gpr_end.f128) - next_arg.f128 = rest.f128; - vecarg_count++; - FFI_ASSERT (__LDBL_MANT_DIG__ == 113); - FFI_ASSERT (flags & FLAG_VEC_ARGUMENTS); - break; - } - if ((ecif->cif->abi & FFI_LINUX_LONG_DOUBLE_128) != 0) - { - double_tmp = (*p_argv.d)[0]; - if (fparg_count < NUM_FPR_ARG_REGISTERS64 && i < nfixedargs) - { - *fpr_base.d++ = double_tmp; -# if _CALL_ELF != 2 - if ((flags & FLAG_COMPAT) != 0) - *next_arg.d = double_tmp; -# endif - } - else - *next_arg.d = double_tmp; - if (++next_arg.ul == gpr_end.ul) - next_arg.ul = rest.ul; - fparg_count++; - double_tmp = (*p_argv.d)[1]; - if (fparg_count < NUM_FPR_ARG_REGISTERS64 && i < nfixedargs) - { - *fpr_base.d++ = double_tmp; -# if _CALL_ELF != 2 - if ((flags & FLAG_COMPAT) != 0) - *next_arg.d = double_tmp; -# endif - } - else - *next_arg.d = double_tmp; - if (++next_arg.ul == gpr_end.ul) - next_arg.ul = rest.ul; - fparg_count++; - FFI_ASSERT (__LDBL_MANT_DIG__ == 106); - FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); - break; - } - /* Fall through. */ -#endif - case FFI_TYPE_DOUBLE: -#if _CALL_ELF != 2 - do_double: -#endif - double_tmp = **p_argv.d; - if (fparg_count < NUM_FPR_ARG_REGISTERS64 && i < nfixedargs) - { - *fpr_base.d++ = double_tmp; -#if _CALL_ELF != 2 - if ((flags & FLAG_COMPAT) != 0) - *next_arg.d = double_tmp; -#endif - } - else - *next_arg.d = double_tmp; - if (++next_arg.ul == gpr_end.ul) - next_arg.ul = rest.ul; - fparg_count++; - FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); - break; - - case FFI_TYPE_FLOAT: -#if _CALL_ELF != 2 - do_float: -#endif - double_tmp = **p_argv.f; - if (fparg_count < NUM_FPR_ARG_REGISTERS64 && i < nfixedargs) - { - *fpr_base.d++ = double_tmp; -#if _CALL_ELF != 2 - if ((flags & FLAG_COMPAT) != 0) - { -# ifndef __LITTLE_ENDIAN__ - next_arg.f[1] = (float) double_tmp; -# else - next_arg.f[0] = (float) double_tmp; -# endif - } -#endif - } - else - { -# ifndef __LITTLE_ENDIAN__ - next_arg.f[1] = (float) double_tmp; -# else - next_arg.f[0] = (float) double_tmp; -# endif - } - if (++next_arg.ul == gpr_end.ul) - next_arg.ul = rest.ul; - fparg_count++; - FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); - break; - - case FFI_TYPE_STRUCT: - if ((ecif->cif->abi & FFI_LINUX_STRUCT_ALIGN) != 0) - { - align = (*ptr)->alignment; - if (align > 16) - align = 16; - if (align > 1) - { - next_arg.p = FFI_ALIGN (next_arg.p, align); - if (next_arg.ul == gpr_end.ul) - next_arg.ul = rest.ul; - } - } - elt = discover_homogeneous_aggregate (ecif->cif->abi, *ptr, &elnum); - if (elt) - { -#if _CALL_ELF == 2 - union { - void *v; - float *f; - double *d; - float128 *f128; - } arg; - - arg.v = *p_argv.v; -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - if (elt == FFI_TYPE_LONGDOUBLE && - (ecif->cif->abi & FFI_LINUX_LONG_DOUBLE_IEEE128) != 0) - { - do - { - if (vecarg_count < NUM_VEC_ARG_REGISTERS64 - && i < nfixedargs) - memcpy (vec_base.f128++, arg.f128, sizeof (float128)); - else - memcpy (next_arg.f128, arg.f128++, sizeof (float128)); - if (++next_arg.f128 == gpr_end.f128) - next_arg.f128 = rest.f128; - vecarg_count++; - } - while (--elnum != 0); - } - else -#endif - if (elt == FFI_TYPE_FLOAT) - { - do - { - double_tmp = *arg.f++; - if (fparg_count < NUM_FPR_ARG_REGISTERS64 - && i < nfixedargs) - *fpr_base.d++ = double_tmp; - else - *next_arg.f = (float) double_tmp; - if (++next_arg.f == gpr_end.f) - next_arg.f = rest.f; - fparg_count++; - } - while (--elnum != 0); - if ((next_arg.p & 7) != 0) - if (++next_arg.f == gpr_end.f) - next_arg.f = rest.f; - } - else - do - { - double_tmp = *arg.d++; - if (fparg_count < NUM_FPR_ARG_REGISTERS64 && i < nfixedargs) - *fpr_base.d++ = double_tmp; - else - *next_arg.d = double_tmp; - if (++next_arg.d == gpr_end.d) - next_arg.d = rest.d; - fparg_count++; - } - while (--elnum != 0); -#else - if (elt == FFI_TYPE_FLOAT) - goto do_float; - else - goto do_double; -#endif - } - else - { - words = ((*ptr)->size + 7) / 8; - if (next_arg.ul >= gpr_base.ul && next_arg.ul + words > gpr_end.ul) - { - size_t first = gpr_end.c - next_arg.c; - memcpy (next_arg.c, *p_argv.c, first); - memcpy (rest.c, *p_argv.c + first, (*ptr)->size - first); - next_arg.c = rest.c + words * 8 - first; - } - else - { - char *where = next_arg.c; - -#ifndef __LITTLE_ENDIAN__ - /* Structures with size less than eight bytes are passed - left-padded. */ - if ((*ptr)->size < 8) - where += 8 - (*ptr)->size; -#endif - memcpy (where, *p_argv.c, (*ptr)->size); - next_arg.ul += words; - if (next_arg.ul == gpr_end.ul) - next_arg.ul = rest.ul; - } - } - break; - - case FFI_TYPE_UINT8: - gprvalue = **p_argv.uc; - goto putgpr; - case FFI_TYPE_SINT8: - gprvalue = **p_argv.sc; - goto putgpr; - case FFI_TYPE_UINT16: - gprvalue = **p_argv.us; - goto putgpr; - case FFI_TYPE_SINT16: - gprvalue = **p_argv.ss; - goto putgpr; - case FFI_TYPE_UINT32: - gprvalue = **p_argv.ui; - goto putgpr; - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: - gprvalue = **p_argv.si; - goto putgpr; - - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - case FFI_TYPE_POINTER: - gprvalue = **p_argv.ul; - putgpr: - *next_arg.ul++ = gprvalue; - if (next_arg.ul == gpr_end.ul) - next_arg.ul = rest.ul; - break; - } - } - - FFI_ASSERT (flags & FLAG_4_GPR_ARGUMENTS - || (next_arg.ul >= gpr_base.ul - && next_arg.ul <= gpr_base.ul + 4)); -} - - -#if _CALL_ELF == 2 -#define MIN_CACHE_LINE_SIZE 8 - -static void -flush_icache (char *wraddr, char *xaddr, int size) -{ - int i; - for (i = 0; i < size; i += MIN_CACHE_LINE_SIZE) - __asm__ volatile ("icbi 0,%0;" "dcbf 0,%1;" - : : "r" (xaddr + i), "r" (wraddr + i) : "memory"); - __asm__ volatile ("icbi 0,%0;" "dcbf 0,%1;" "sync;" "isync;" - : : "r"(xaddr + size - 1), "r"(wraddr + size - 1) - : "memory"); -} -#endif - - -ffi_status FFI_HIDDEN -ffi_prep_closure_loc_linux64 (ffi_closure *closure, - ffi_cif *cif, - void (*fun) (ffi_cif *, void *, void **, void *), - void *user_data, - void *codeloc) -{ -#if _CALL_ELF == 2 - unsigned int *tramp = (unsigned int *) &closure->tramp[0]; - - if (cif->abi < FFI_LINUX || cif->abi >= FFI_LAST_ABI) - return FFI_BAD_ABI; - - tramp[0] = 0xe96c0018; /* 0: ld 11,2f-0b(12) */ - tramp[1] = 0xe98c0010; /* ld 12,1f-0b(12) */ - tramp[2] = 0x7d8903a6; /* mtctr 12 */ - tramp[3] = 0x4e800420; /* bctr */ - /* 1: .quad function_addr */ - /* 2: .quad context */ - *(void **) &tramp[4] = (void *) ffi_closure_LINUX64; - *(void **) &tramp[6] = codeloc; - flush_icache ((char *) tramp, (char *) codeloc, 4 * 4); -#else - void **tramp = (void **) &closure->tramp[0]; - - if (cif->abi < FFI_LINUX || cif->abi >= FFI_LAST_ABI) - return FFI_BAD_ABI; - - /* Copy function address and TOC from ffi_closure_LINUX64 OPD. */ - memcpy (&tramp[0], (void **) ffi_closure_LINUX64, sizeof (void *)); - tramp[1] = codeloc; - memcpy (&tramp[2], (void **) ffi_closure_LINUX64 + 1, sizeof (void *)); -#endif - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - return FFI_OK; -} - - -int FFI_HIDDEN -ffi_closure_helper_LINUX64 (ffi_cif *cif, - void (*fun) (ffi_cif *, void *, void **, void *), - void *user_data, - void *rvalue, - unsigned long *pst, - ffi_dblfl *pfr, - float128 *pvec) -{ - /* rvalue is the pointer to space for return value in closure assembly */ - /* pst is the pointer to parameter save area - (r3-r10 are stored into its first 8 slots by ffi_closure_LINUX64) */ - /* pfr is the pointer to where f1-f13 are stored in ffi_closure_LINUX64 */ - /* pvec is the pointer to where v2-v13 are stored in ffi_closure_LINUX64 */ - - void **avalue; - ffi_type **arg_types; - unsigned long i, avn, nfixedargs; - ffi_dblfl *end_pfr = pfr + NUM_FPR_ARG_REGISTERS64; - float128 *end_pvec = pvec + NUM_VEC_ARG_REGISTERS64; - unsigned long align; - - avalue = alloca (cif->nargs * sizeof (void *)); - - /* Copy the caller's structure return value address so that the - closure returns the data directly to the caller. */ - if (cif->rtype->type == FFI_TYPE_STRUCT - && (cif->flags & FLAG_RETURNS_SMST) == 0) - { - rvalue = (void *) *pst; - pst++; - } - - i = 0; - avn = cif->nargs; -#if _CALL_ELF != 2 - nfixedargs = (unsigned) -1; - if ((cif->flags & FLAG_COMPAT) == 0) -#endif - nfixedargs = cif->nfixedargs; - arg_types = cif->arg_types; - - /* Grab the addresses of the arguments from the stack frame. */ - while (i < avn) - { - unsigned int elt, elnum; - - switch (arg_types[i]->type) - { - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: -#ifndef __LITTLE_ENDIAN__ - avalue[i] = (char *) pst + 7; - pst++; - break; -#endif - - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: -#ifndef __LITTLE_ENDIAN__ - avalue[i] = (char *) pst + 6; - pst++; - break; -#endif - - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: -#ifndef __LITTLE_ENDIAN__ - avalue[i] = (char *) pst + 4; - pst++; - break; -#endif - - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - case FFI_TYPE_POINTER: - avalue[i] = pst; - pst++; - break; - - case FFI_TYPE_STRUCT: - if ((cif->abi & FFI_LINUX_STRUCT_ALIGN) != 0) - { - align = arg_types[i]->alignment; - if (align > 16) - align = 16; - if (align > 1) - pst = (unsigned long *) FFI_ALIGN ((size_t) pst, align); - } - elt = discover_homogeneous_aggregate (cif->abi, arg_types[i], &elnum); - if (elt) - { -#if _CALL_ELF == 2 - union { - void *v; - unsigned long *ul; - float *f; - double *d; - float128 *f128; - size_t p; - } to, from; - - /* Repackage the aggregate from its parts. The - aggregate size is not greater than the space taken by - the registers so store back to the register/parameter - save arrays. */ -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - if (elt == FFI_TYPE_LONGDOUBLE && - (cif->abi & FFI_LINUX_LONG_DOUBLE_IEEE128) != 0) - { - if (pvec + elnum <= end_pvec) - to.v = pvec; - else - to.v = pst; - } - else -#endif - if (pfr + elnum <= end_pfr) - to.v = pfr; - else - to.v = pst; - - avalue[i] = to.v; - from.ul = pst; -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - if (elt == FFI_TYPE_LONGDOUBLE && - (cif->abi & FFI_LINUX_LONG_DOUBLE_IEEE128) != 0) - { - do - { - if (pvec < end_pvec && i < nfixedargs) - memcpy (to.f128, pvec++, sizeof (float128)); - else - memcpy (to.f128, from.f128, sizeof (float128)); - to.f128++; - from.f128++; - } - while (--elnum != 0); - } - else -#endif - if (elt == FFI_TYPE_FLOAT) - { - do - { - if (pfr < end_pfr && i < nfixedargs) - { - *to.f = (float) pfr->d; - pfr++; - } - else - *to.f = *from.f; - to.f++; - from.f++; - } - while (--elnum != 0); - } - else - { - do - { - if (pfr < end_pfr && i < nfixedargs) - { - *to.d = pfr->d; - pfr++; - } - else - *to.d = *from.d; - to.d++; - from.d++; - } - while (--elnum != 0); - } -#else - if (elt == FFI_TYPE_FLOAT) - goto do_float; - else - goto do_double; -#endif - } - else - { -#ifndef __LITTLE_ENDIAN__ - /* Structures with size less than eight bytes are passed - left-padded. */ - if (arg_types[i]->size < 8) - avalue[i] = (char *) pst + 8 - arg_types[i]->size; - else -#endif - avalue[i] = pst; - } - pst += (arg_types[i]->size + 7) / 8; - break; - -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - if ((cif->abi & FFI_LINUX_LONG_DOUBLE_IEEE128) != 0) - { - if (((unsigned long) pst & 0xF) != 0) - ++pst; - if (pvec < end_pvec && i < nfixedargs) - avalue[i] = pvec++; - else - avalue[i] = pst; - pst += 2; - break; - } - else if ((cif->abi & FFI_LINUX_LONG_DOUBLE_128) != 0) - { - if (pfr + 1 < end_pfr && i + 1 < nfixedargs) - { - avalue[i] = pfr; - pfr += 2; - } - else - { - if (pfr < end_pfr && i < nfixedargs) - { - /* Passed partly in f13 and partly on the stack. - Move it all to the stack. */ - *pst = *(unsigned long *) pfr; - pfr++; - } - avalue[i] = pst; - } - pst += 2; - break; - } - /* Fall through. */ -#endif - case FFI_TYPE_DOUBLE: -#if _CALL_ELF != 2 - do_double: -#endif - /* On the outgoing stack all values are aligned to 8 */ - /* there are 13 64bit floating point registers */ - - if (pfr < end_pfr && i < nfixedargs) - { - avalue[i] = pfr; - pfr++; - } - else - avalue[i] = pst; - pst++; - break; - - case FFI_TYPE_FLOAT: -#if _CALL_ELF != 2 - do_float: -#endif - if (pfr < end_pfr && i < nfixedargs) - { - /* Float values are stored as doubles in the - ffi_closure_LINUX64 code. Fix them here. */ - pfr->f = (float) pfr->d; - avalue[i] = pfr; - pfr++; - } - else - { -#ifndef __LITTLE_ENDIAN__ - avalue[i] = (char *) pst + 4; -#else - avalue[i] = pst; -#endif - } - pst++; - break; - - default: - FFI_ASSERT (0); - } - - i++; - } - - (*fun) (cif, rvalue, avalue, user_data); - - /* Tell ffi_closure_LINUX64 how to perform return type promotions. */ - if ((cif->flags & FLAG_RETURNS_SMST) != 0) - { - if ((cif->flags & (FLAG_RETURNS_FP | FLAG_RETURNS_VEC)) == 0) - return FFI_V2_TYPE_SMALL_STRUCT + cif->rtype->size - 1; - else if ((cif->flags & FLAG_RETURNS_VEC) != 0) - return FFI_V2_TYPE_VECTOR_HOMOG; - else if ((cif->flags & FLAG_RETURNS_64BITS) != 0) - return FFI_V2_TYPE_DOUBLE_HOMOG; - else - return FFI_V2_TYPE_FLOAT_HOMOG; - } - if ((cif->flags & FLAG_RETURNS_VEC) != 0) - return FFI_V2_TYPE_VECTOR; - return cif->rtype->type; -} -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h deleted file mode 100644 index 960a5c4..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h +++ /dev/null @@ -1,105 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi_powerpc.h - Copyright (C) 2013 IBM - Copyright (C) 2011 Anthony Green - Copyright (C) 2011 Kyle Moffett - Copyright (C) 2008 Red Hat, Inc - Copyright (C) 2007, 2008 Free Software Foundation, Inc - Copyright (c) 1998 Geoffrey Keating - - PowerPC Foreign Function Interface - - 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 AUTHOR 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. - ----------------------------------------------------------------------- */ - -enum { - /* The assembly depends on these exact flags. */ - /* These go in cr7 */ - FLAG_RETURNS_SMST = 1 << (31-31), /* Used for FFI_SYSV small structs. */ - FLAG_RETURNS_NOTHING = 1 << (31-30), - FLAG_RETURNS_FP = 1 << (31-29), - FLAG_RETURNS_VEC = 1 << (31-28), - - /* These go in cr6 */ - FLAG_RETURNS_64BITS = 1 << (31-27), - FLAG_RETURNS_128BITS = 1 << (31-26), - - FLAG_COMPAT = 1 << (31- 8), /* Not used by assembly */ - - /* These go in cr1 */ - FLAG_ARG_NEEDS_COPY = 1 << (31- 7), /* Used by sysv code */ - FLAG_ARG_NEEDS_PSAVE = FLAG_ARG_NEEDS_COPY, /* Used by linux64 code */ - FLAG_FP_ARGUMENTS = 1 << (31- 6), /* cr1.eq; specified by ABI */ - FLAG_4_GPR_ARGUMENTS = 1 << (31- 5), - FLAG_RETVAL_REFERENCE = 1 << (31- 4), - FLAG_VEC_ARGUMENTS = 1 << (31- 3), -}; - -typedef union -{ - float f; - double d; -} ffi_dblfl; - -#if defined(__FLOAT128_TYPE__) && defined(__HAVE_FLOAT128) -typedef _Float128 float128; -#elif defined(__FLOAT128__) -typedef __float128 float128; -#else -typedef char float128[16] __attribute__((aligned(16))); -#endif - -void FFI_HIDDEN ffi_closure_SYSV (void); -void FFI_HIDDEN ffi_go_closure_sysv (void); -void FFI_HIDDEN ffi_call_SYSV(extended_cif *, void (*)(void), void *, - unsigned, void *, int); - -void FFI_HIDDEN ffi_prep_types_sysv (ffi_abi); -ffi_status FFI_HIDDEN ffi_prep_cif_sysv (ffi_cif *); -ffi_status FFI_HIDDEN ffi_prep_closure_loc_sysv (ffi_closure *, - ffi_cif *, - void (*) (ffi_cif *, void *, - void **, void *), - void *, void *); -int FFI_HIDDEN ffi_closure_helper_SYSV (ffi_cif *, - void (*) (ffi_cif *, void *, - void **, void *), - void *, void *, unsigned long *, - ffi_dblfl *, unsigned long *); - -void FFI_HIDDEN ffi_call_LINUX64(extended_cif *, void (*) (void), void *, - unsigned long, void *, long); -void FFI_HIDDEN ffi_closure_LINUX64 (void); -void FFI_HIDDEN ffi_go_closure_linux64 (void); - -void FFI_HIDDEN ffi_prep_types_linux64 (ffi_abi); -ffi_status FFI_HIDDEN ffi_prep_cif_linux64 (ffi_cif *); -ffi_status FFI_HIDDEN ffi_prep_cif_linux64_var (ffi_cif *, unsigned int, - unsigned int); -void FFI_HIDDEN ffi_prep_args64 (extended_cif *, unsigned long *const); -ffi_status FFI_HIDDEN ffi_prep_closure_loc_linux64 (ffi_closure *, ffi_cif *, - void (*) (ffi_cif *, void *, - void **, void *), - void *, void *); -int FFI_HIDDEN ffi_closure_helper_LINUX64 (ffi_cif *, - void (*) (ffi_cif *, void *, - void **, void *), - void *, void *, - unsigned long *, ffi_dblfl *, - float128 *); diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/ffi_sysv.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/ffi_sysv.c deleted file mode 100644 index 4078e75..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/ffi_sysv.c +++ /dev/null @@ -1,923 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi_sysv.c - Copyright (C) 2013 IBM - Copyright (C) 2011 Anthony Green - Copyright (C) 2011 Kyle Moffett - Copyright (C) 2008 Red Hat, Inc - Copyright (C) 2007, 2008 Free Software Foundation, Inc - Copyright (c) 1998 Geoffrey Keating - - PowerPC Foreign Function Interface - - 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 AUTHOR 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. - ----------------------------------------------------------------------- */ - -#include "ffi.h" - -#ifndef POWERPC64 -#include "ffi_common.h" -#include "ffi_powerpc.h" - - -/* About the SYSV ABI. */ -#define ASM_NEEDS_REGISTERS 6 -#define NUM_GPR_ARG_REGISTERS 8 -#define NUM_FPR_ARG_REGISTERS 8 - - -#if HAVE_LONG_DOUBLE_VARIANT && FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE -/* Adjust size of ffi_type_longdouble. */ -void FFI_HIDDEN -ffi_prep_types_sysv (ffi_abi abi) -{ - if ((abi & (FFI_SYSV | FFI_SYSV_LONG_DOUBLE_128)) == FFI_SYSV) - { - ffi_type_longdouble.size = 8; - ffi_type_longdouble.alignment = 8; - } - else - { - ffi_type_longdouble.size = 16; - ffi_type_longdouble.alignment = 16; - } -} -#endif - -/* Transform long double, double and float to other types as per abi. */ -static int -translate_float (int abi, int type) -{ -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - if (type == FFI_TYPE_LONGDOUBLE - && (abi & FFI_SYSV_LONG_DOUBLE_128) == 0) - type = FFI_TYPE_DOUBLE; -#endif - if ((abi & FFI_SYSV_SOFT_FLOAT) != 0) - { - if (type == FFI_TYPE_FLOAT) - type = FFI_TYPE_UINT32; - else if (type == FFI_TYPE_DOUBLE) - type = FFI_TYPE_UINT64; -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - else if (type == FFI_TYPE_LONGDOUBLE) - type = FFI_TYPE_UINT128; - } - else if ((abi & FFI_SYSV_IBM_LONG_DOUBLE) == 0) - { - if (type == FFI_TYPE_LONGDOUBLE) - type = FFI_TYPE_STRUCT; -#endif - } - return type; -} - -/* Perform machine dependent cif processing */ -static ffi_status -ffi_prep_cif_sysv_core (ffi_cif *cif) -{ - ffi_type **ptr; - unsigned bytes; - unsigned i, fpr_count = 0, gpr_count = 0, stack_count = 0; - unsigned flags = cif->flags; - unsigned struct_copy_size = 0; - unsigned type = cif->rtype->type; - unsigned size = cif->rtype->size; - - /* The machine-independent calculation of cif->bytes doesn't work - for us. Redo the calculation. */ - - /* Space for the frame pointer, callee's LR, and the asm's temp regs. */ - bytes = (2 + ASM_NEEDS_REGISTERS) * sizeof (int); - - /* Space for the GPR registers. */ - bytes += NUM_GPR_ARG_REGISTERS * sizeof (int); - - /* Return value handling. The rules for SYSV are as follows: - - 32-bit (or less) integer values are returned in gpr3; - - Structures of size <= 4 bytes also returned in gpr3; - - 64-bit integer values and structures between 5 and 8 bytes are returned - in gpr3 and gpr4; - - Larger structures are allocated space and a pointer is passed as - the first argument. - - Single/double FP values are returned in fpr1; - - long doubles (if not equivalent to double) are returned in - fpr1,fpr2 for Linux and as for large structs for SysV. */ - - type = translate_float (cif->abi, type); - - switch (type) - { -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - flags |= FLAG_RETURNS_128BITS; - /* Fall through. */ -#endif - case FFI_TYPE_DOUBLE: - flags |= FLAG_RETURNS_64BITS; - /* Fall through. */ - case FFI_TYPE_FLOAT: - flags |= FLAG_RETURNS_FP; -#ifdef __NO_FPRS__ - return FFI_BAD_ABI; -#endif - break; - - case FFI_TYPE_UINT128: - flags |= FLAG_RETURNS_128BITS; - /* Fall through. */ - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - flags |= FLAG_RETURNS_64BITS; - break; - - case FFI_TYPE_STRUCT: - /* The final SYSV ABI says that structures smaller or equal 8 bytes - are returned in r3/r4. A draft ABI used by linux instead - returns them in memory. */ - if ((cif->abi & FFI_SYSV_STRUCT_RET) != 0 && size <= 8) - { - flags |= FLAG_RETURNS_SMST; - break; - } - gpr_count++; - flags |= FLAG_RETVAL_REFERENCE; - /* Fall through. */ - case FFI_TYPE_VOID: - flags |= FLAG_RETURNS_NOTHING; - break; - - default: - /* Returns 32-bit integer, or similar. Nothing to do here. */ - break; - } - - /* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the - first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest - goes on the stack. Structures and long doubles (if not equivalent - to double) are passed as a pointer to a copy of the structure. - Stuff on the stack needs to keep proper alignment. */ - for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) - { - unsigned short typenum = (*ptr)->type; - - typenum = translate_float (cif->abi, typenum); - - switch (typenum) - { -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - if (fpr_count >= NUM_FPR_ARG_REGISTERS - 1) - { - fpr_count = NUM_FPR_ARG_REGISTERS; - /* 8-byte align long doubles. */ - stack_count += stack_count & 1; - stack_count += 4; - } - else - fpr_count += 2; -#ifdef __NO_FPRS__ - return FFI_BAD_ABI; -#endif - break; -#endif - - case FFI_TYPE_DOUBLE: - if (fpr_count >= NUM_FPR_ARG_REGISTERS) - { - /* 8-byte align doubles. */ - stack_count += stack_count & 1; - stack_count += 2; - } - else - fpr_count += 1; -#ifdef __NO_FPRS__ - return FFI_BAD_ABI; -#endif - break; - - case FFI_TYPE_FLOAT: - if (fpr_count >= NUM_FPR_ARG_REGISTERS) - /* Yes, we don't follow the ABI, but neither does gcc. */ - stack_count += 1; - else - fpr_count += 1; -#ifdef __NO_FPRS__ - return FFI_BAD_ABI; -#endif - break; - - case FFI_TYPE_UINT128: - /* A long double in FFI_LINUX_SOFT_FLOAT can use only a set - of four consecutive gprs. If we do not have enough, we - have to adjust the gpr_count value. */ - if (gpr_count >= NUM_GPR_ARG_REGISTERS - 3) - gpr_count = NUM_GPR_ARG_REGISTERS; - if (gpr_count >= NUM_GPR_ARG_REGISTERS) - stack_count += 4; - else - gpr_count += 4; - break; - - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - /* 'long long' arguments are passed as two words, but - either both words must fit in registers or both go - on the stack. If they go on the stack, they must - be 8-byte-aligned. - - Also, only certain register pairs can be used for - passing long long int -- specifically (r3,r4), (r5,r6), - (r7,r8), (r9,r10). */ - gpr_count += gpr_count & 1; - if (gpr_count >= NUM_GPR_ARG_REGISTERS) - { - stack_count += stack_count & 1; - stack_count += 2; - } - else - gpr_count += 2; - break; - - case FFI_TYPE_STRUCT: - /* We must allocate space for a copy of these to enforce - pass-by-value. Pad the space up to a multiple of 16 - bytes (the maximum alignment required for anything under - the SYSV ABI). */ - struct_copy_size += ((*ptr)->size + 15) & ~0xF; - /* Fall through (allocate space for the pointer). */ - - case FFI_TYPE_POINTER: - case FFI_TYPE_INT: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT8: - /* Everything else is passed as a 4-byte word in a GPR, either - the object itself or a pointer to it. */ - if (gpr_count >= NUM_GPR_ARG_REGISTERS) - stack_count += 1; - else - gpr_count += 1; - break; - - default: - FFI_ASSERT (0); - } - } - - if (fpr_count != 0) - flags |= FLAG_FP_ARGUMENTS; - if (gpr_count > 4) - flags |= FLAG_4_GPR_ARGUMENTS; - if (struct_copy_size != 0) - flags |= FLAG_ARG_NEEDS_COPY; - - /* Space for the FPR registers, if needed. */ - if (fpr_count != 0) - bytes += NUM_FPR_ARG_REGISTERS * sizeof (double); - - /* Stack space. */ - bytes += stack_count * sizeof (int); - - /* The stack space allocated needs to be a multiple of 16 bytes. */ - bytes = (bytes + 15) & ~0xF; - - /* Add in the space for the copied structures. */ - bytes += struct_copy_size; - - cif->flags = flags; - cif->bytes = bytes; - - return FFI_OK; -} - -ffi_status FFI_HIDDEN -ffi_prep_cif_sysv (ffi_cif *cif) -{ - if ((cif->abi & FFI_SYSV) == 0) - { - /* This call is from old code. Translate to new ABI values. */ - cif->flags |= FLAG_COMPAT; - switch (cif->abi) - { - default: - return FFI_BAD_ABI; - - case FFI_COMPAT_SYSV: - cif->abi = FFI_SYSV | FFI_SYSV_STRUCT_RET | FFI_SYSV_LONG_DOUBLE_128; - break; - - case FFI_COMPAT_GCC_SYSV: - cif->abi = FFI_SYSV | FFI_SYSV_LONG_DOUBLE_128; - break; - - case FFI_COMPAT_LINUX: - cif->abi = (FFI_SYSV | FFI_SYSV_IBM_LONG_DOUBLE - | FFI_SYSV_LONG_DOUBLE_128); - break; - - case FFI_COMPAT_LINUX_SOFT_FLOAT: - cif->abi = (FFI_SYSV | FFI_SYSV_SOFT_FLOAT | FFI_SYSV_IBM_LONG_DOUBLE - | FFI_SYSV_LONG_DOUBLE_128); - break; - } - } - return ffi_prep_cif_sysv_core (cif); -} - -/* ffi_prep_args_SYSV is called by the assembly routine once stack space - has been allocated for the function's arguments. - - The stack layout we want looks like this: - - | Return address from ffi_call_SYSV 4bytes | higher addresses - |--------------------------------------------| - | Previous backchain pointer 4 | stack pointer here - |--------------------------------------------|<+ <<< on entry to - | Saved r28-r31 4*4 | | ffi_call_SYSV - |--------------------------------------------| | - | GPR registers r3-r10 8*4 | | ffi_call_SYSV - |--------------------------------------------| | - | FPR registers f1-f8 (optional) 8*8 | | - |--------------------------------------------| | stack | - | Space for copied structures | | grows | - |--------------------------------------------| | down V - | Parameters that didn't fit in registers | | - |--------------------------------------------| | lower addresses - | Space for callee's LR 4 | | - |--------------------------------------------| | stack pointer here - | Current backchain pointer 4 |-/ during - |--------------------------------------------| <<< ffi_call_SYSV - -*/ - -void FFI_HIDDEN -ffi_prep_args_SYSV (extended_cif *ecif, unsigned *const stack) -{ - const unsigned bytes = ecif->cif->bytes; - const unsigned flags = ecif->cif->flags; - - typedef union - { - char *c; - unsigned *u; - long long *ll; - float *f; - double *d; - } valp; - - /* 'stacktop' points at the previous backchain pointer. */ - valp stacktop; - - /* 'gpr_base' points at the space for gpr3, and grows upwards as - we use GPR registers. */ - valp gpr_base; - valp gpr_end; - -#ifndef __NO_FPRS__ - /* 'fpr_base' points at the space for fpr1, and grows upwards as - we use FPR registers. */ - valp fpr_base; - valp fpr_end; -#endif - - /* 'copy_space' grows down as we put structures in it. It should - stay 16-byte aligned. */ - valp copy_space; - - /* 'next_arg' grows up as we put parameters in it. */ - valp next_arg; - - int i; - ffi_type **ptr; -#ifndef __NO_FPRS__ - double double_tmp; -#endif - union - { - void **v; - char **c; - signed char **sc; - unsigned char **uc; - signed short **ss; - unsigned short **us; - unsigned int **ui; - long long **ll; - float **f; - double **d; - } p_argv; - size_t struct_copy_size; - unsigned gprvalue; - - stacktop.c = (char *) stack + bytes; - gpr_end.u = stacktop.u - ASM_NEEDS_REGISTERS; - gpr_base.u = gpr_end.u - NUM_GPR_ARG_REGISTERS; -#ifndef __NO_FPRS__ - fpr_end.d = gpr_base.d; - fpr_base.d = fpr_end.d - NUM_FPR_ARG_REGISTERS; - copy_space.c = ((flags & FLAG_FP_ARGUMENTS) ? fpr_base.c : gpr_base.c); -#else - copy_space.c = gpr_base.c; -#endif - next_arg.u = stack + 2; - - /* Check that everything starts aligned properly. */ - FFI_ASSERT (((unsigned long) (char *) stack & 0xF) == 0); - FFI_ASSERT (((unsigned long) copy_space.c & 0xF) == 0); - FFI_ASSERT (((unsigned long) stacktop.c & 0xF) == 0); - FFI_ASSERT ((bytes & 0xF) == 0); - FFI_ASSERT (copy_space.c >= next_arg.c); - - /* Deal with return values that are actually pass-by-reference. */ - if (flags & FLAG_RETVAL_REFERENCE) - *gpr_base.u++ = (unsigned) (char *) ecif->rvalue; - - /* Now for the arguments. */ - p_argv.v = ecif->avalue; - for (ptr = ecif->cif->arg_types, i = ecif->cif->nargs; - i > 0; - i--, ptr++, p_argv.v++) - { - unsigned int typenum = (*ptr)->type; - - typenum = translate_float (ecif->cif->abi, typenum); - - /* Now test the translated value */ - switch (typenum) - { -#ifndef __NO_FPRS__ -# if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - double_tmp = (*p_argv.d)[0]; - - if (fpr_base.d >= fpr_end.d - 1) - { - fpr_base.d = fpr_end.d; - if (((next_arg.u - stack) & 1) != 0) - next_arg.u += 1; - *next_arg.d = double_tmp; - next_arg.u += 2; - double_tmp = (*p_argv.d)[1]; - *next_arg.d = double_tmp; - next_arg.u += 2; - } - else - { - *fpr_base.d++ = double_tmp; - double_tmp = (*p_argv.d)[1]; - *fpr_base.d++ = double_tmp; - } - FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); - break; -# endif - case FFI_TYPE_DOUBLE: - double_tmp = **p_argv.d; - - if (fpr_base.d >= fpr_end.d) - { - if (((next_arg.u - stack) & 1) != 0) - next_arg.u += 1; - *next_arg.d = double_tmp; - next_arg.u += 2; - } - else - *fpr_base.d++ = double_tmp; - FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); - break; - - case FFI_TYPE_FLOAT: - double_tmp = **p_argv.f; - if (fpr_base.d >= fpr_end.d) - { - *next_arg.f = (float) double_tmp; - next_arg.u += 1; - } - else - *fpr_base.d++ = double_tmp; - FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); - break; -#endif /* have FPRs */ - - case FFI_TYPE_UINT128: - /* The soft float ABI for long doubles works like this, a long double - is passed in four consecutive GPRs if available. A maximum of 2 - long doubles can be passed in gprs. If we do not have 4 GPRs - left, the long double is passed on the stack, 4-byte aligned. */ - if (gpr_base.u >= gpr_end.u - 3) - { - unsigned int ii; - gpr_base.u = gpr_end.u; - for (ii = 0; ii < 4; ii++) - { - unsigned int int_tmp = (*p_argv.ui)[ii]; - *next_arg.u++ = int_tmp; - } - } - else - { - unsigned int ii; - for (ii = 0; ii < 4; ii++) - { - unsigned int int_tmp = (*p_argv.ui)[ii]; - *gpr_base.u++ = int_tmp; - } - } - break; - - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - if (gpr_base.u >= gpr_end.u - 1) - { - gpr_base.u = gpr_end.u; - if (((next_arg.u - stack) & 1) != 0) - next_arg.u++; - *next_arg.ll = **p_argv.ll; - next_arg.u += 2; - } - else - { - /* The abi states only certain register pairs can be - used for passing long long int specifically (r3,r4), - (r5,r6), (r7,r8), (r9,r10). If next arg is long long - but not correct starting register of pair then skip - until the proper starting register. */ - if (((gpr_end.u - gpr_base.u) & 1) != 0) - gpr_base.u++; - *gpr_base.ll++ = **p_argv.ll; - } - break; - - case FFI_TYPE_STRUCT: - struct_copy_size = ((*ptr)->size + 15) & ~0xF; - copy_space.c -= struct_copy_size; - memcpy (copy_space.c, *p_argv.c, (*ptr)->size); - - gprvalue = (unsigned long) copy_space.c; - - FFI_ASSERT (copy_space.c > next_arg.c); - FFI_ASSERT (flags & FLAG_ARG_NEEDS_COPY); - goto putgpr; - - case FFI_TYPE_UINT8: - gprvalue = **p_argv.uc; - goto putgpr; - case FFI_TYPE_SINT8: - gprvalue = **p_argv.sc; - goto putgpr; - case FFI_TYPE_UINT16: - gprvalue = **p_argv.us; - goto putgpr; - case FFI_TYPE_SINT16: - gprvalue = **p_argv.ss; - goto putgpr; - - case FFI_TYPE_INT: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - case FFI_TYPE_POINTER: - - gprvalue = **p_argv.ui; - - putgpr: - if (gpr_base.u >= gpr_end.u) - *next_arg.u++ = gprvalue; - else - *gpr_base.u++ = gprvalue; - break; - } - } - - /* Check that we didn't overrun the stack... */ - FFI_ASSERT (copy_space.c >= next_arg.c); - FFI_ASSERT (gpr_base.u <= gpr_end.u); -#ifndef __NO_FPRS__ - FFI_ASSERT (fpr_base.u <= fpr_end.u); -#endif - FFI_ASSERT (((flags & FLAG_4_GPR_ARGUMENTS) != 0) - == (gpr_end.u - gpr_base.u < 4)); -} - -#define MIN_CACHE_LINE_SIZE 8 - -static void -flush_icache (char *wraddr, char *xaddr, int size) -{ - int i; - for (i = 0; i < size; i += MIN_CACHE_LINE_SIZE) - __asm__ volatile ("icbi 0,%0;" "dcbf 0,%1;" - : : "r" (xaddr + i), "r" (wraddr + i) : "memory"); - __asm__ volatile ("icbi 0,%0;" "dcbf 0,%1;" "sync;" "isync;" - : : "r"(xaddr + size - 1), "r"(wraddr + size - 1) - : "memory"); -} - -ffi_status FFI_HIDDEN -ffi_prep_closure_loc_sysv (ffi_closure *closure, - ffi_cif *cif, - void (*fun) (ffi_cif *, void *, void **, void *), - void *user_data, - void *codeloc) -{ - unsigned int *tramp; - - if (cif->abi < FFI_SYSV || cif->abi >= FFI_LAST_ABI) - return FFI_BAD_ABI; - - tramp = (unsigned int *) &closure->tramp[0]; - tramp[0] = 0x7c0802a6; /* mflr r0 */ - tramp[1] = 0x429f0005; /* bcl 20,31,.+4 */ - tramp[2] = 0x7d6802a6; /* mflr r11 */ - tramp[3] = 0x7c0803a6; /* mtlr r0 */ - tramp[4] = 0x800b0018; /* lwz r0,24(r11) */ - tramp[5] = 0x816b001c; /* lwz r11,28(r11) */ - tramp[6] = 0x7c0903a6; /* mtctr r0 */ - tramp[7] = 0x4e800420; /* bctr */ - *(void **) &tramp[8] = (void *) ffi_closure_SYSV; /* function */ - *(void **) &tramp[9] = codeloc; /* context */ - - /* Flush the icache. */ - flush_icache ((char *)tramp, (char *)codeloc, 8 * 4); - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - return FFI_OK; -} - -/* Basically the trampoline invokes ffi_closure_SYSV, and on - entry, r11 holds the address of the closure. - After storing the registers that could possibly contain - parameters to be passed into the stack frame and setting - up space for a return value, ffi_closure_SYSV invokes the - following helper function to do most of the work. */ - -int -ffi_closure_helper_SYSV (ffi_cif *cif, - void (*fun) (ffi_cif *, void *, void **, void *), - void *user_data, - void *rvalue, - unsigned long *pgr, - ffi_dblfl *pfr, - unsigned long *pst) -{ - /* rvalue is the pointer to space for return value in closure assembly */ - /* pgr is the pointer to where r3-r10 are stored in ffi_closure_SYSV */ - /* pfr is the pointer to where f1-f8 are stored in ffi_closure_SYSV */ - /* pst is the pointer to outgoing parameter stack in original caller */ - - void ** avalue; - ffi_type ** arg_types; - long i, avn; -#ifndef __NO_FPRS__ - long nf = 0; /* number of floating registers already used */ -#endif - long ng = 0; /* number of general registers already used */ - - unsigned size = cif->rtype->size; - unsigned short rtypenum = cif->rtype->type; - - avalue = alloca (cif->nargs * sizeof (void *)); - - /* First translate for softfloat/nonlinux */ - rtypenum = translate_float (cif->abi, rtypenum); - - /* Copy the caller's structure return value address so that the closure - returns the data directly to the caller. - For FFI_SYSV the result is passed in r3/r4 if the struct size is less - or equal 8 bytes. */ - if (rtypenum == FFI_TYPE_STRUCT - && !((cif->abi & FFI_SYSV_STRUCT_RET) != 0 && size <= 8)) - { - rvalue = (void *) *pgr; - ng++; - pgr++; - } - - i = 0; - avn = cif->nargs; - arg_types = cif->arg_types; - - /* Grab the addresses of the arguments from the stack frame. */ - while (i < avn) { - unsigned short typenum = arg_types[i]->type; - - /* We may need to handle some values depending on ABI. */ - typenum = translate_float (cif->abi, typenum); - - switch (typenum) - { -#ifndef __NO_FPRS__ - case FFI_TYPE_FLOAT: - /* Unfortunately float values are stored as doubles - in the ffi_closure_SYSV code (since we don't check - the type in that routine). */ - if (nf < NUM_FPR_ARG_REGISTERS) - { - /* FIXME? here we are really changing the values - stored in the original calling routines outgoing - parameter stack. This is probably a really - naughty thing to do but... */ - double temp = pfr->d; - pfr->f = (float) temp; - avalue[i] = pfr; - nf++; - pfr++; - } - else - { - avalue[i] = pst; - pst += 1; - } - break; - - case FFI_TYPE_DOUBLE: - if (nf < NUM_FPR_ARG_REGISTERS) - { - avalue[i] = pfr; - nf++; - pfr++; - } - else - { - if (((long) pst) & 4) - pst++; - avalue[i] = pst; - pst += 2; - } - break; - -# if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - if (nf < NUM_FPR_ARG_REGISTERS - 1) - { - avalue[i] = pfr; - pfr += 2; - nf += 2; - } - else - { - if (((long) pst) & 4) - pst++; - avalue[i] = pst; - pst += 4; - nf = 8; - } - break; -# endif -#endif - - case FFI_TYPE_UINT128: - /* Test if for the whole long double, 4 gprs are available. - otherwise the stuff ends up on the stack. */ - if (ng < NUM_GPR_ARG_REGISTERS - 3) - { - avalue[i] = pgr; - pgr += 4; - ng += 4; - } - else - { - avalue[i] = pst; - pst += 4; - ng = 8+4; - } - break; - - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: -#ifndef __LITTLE_ENDIAN__ - if (ng < NUM_GPR_ARG_REGISTERS) - { - avalue[i] = (char *) pgr + 3; - ng++; - pgr++; - } - else - { - avalue[i] = (char *) pst + 3; - pst++; - } - break; -#endif - - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: -#ifndef __LITTLE_ENDIAN__ - if (ng < NUM_GPR_ARG_REGISTERS) - { - avalue[i] = (char *) pgr + 2; - ng++; - pgr++; - } - else - { - avalue[i] = (char *) pst + 2; - pst++; - } - break; -#endif - - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - case FFI_TYPE_POINTER: - if (ng < NUM_GPR_ARG_REGISTERS) - { - avalue[i] = pgr; - ng++; - pgr++; - } - else - { - avalue[i] = pst; - pst++; - } - break; - - case FFI_TYPE_STRUCT: - /* Structs are passed by reference. The address will appear in a - gpr if it is one of the first 8 arguments. */ - if (ng < NUM_GPR_ARG_REGISTERS) - { - avalue[i] = (void *) *pgr; - ng++; - pgr++; - } - else - { - avalue[i] = (void *) *pst; - pst++; - } - break; - - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - /* Passing long long ints are complex, they must - be passed in suitable register pairs such as - (r3,r4) or (r5,r6) or (r6,r7), or (r7,r8) or (r9,r10) - and if the entire pair aren't available then the outgoing - parameter stack is used for both but an alignment of 8 - must will be kept. So we must either look in pgr - or pst to find the correct address for this type - of parameter. */ - if (ng < NUM_GPR_ARG_REGISTERS - 1) - { - if (ng & 1) - { - /* skip r4, r6, r8 as starting points */ - ng++; - pgr++; - } - avalue[i] = pgr; - ng += 2; - pgr += 2; - } - else - { - if (((long) pst) & 4) - pst++; - avalue[i] = pst; - pst += 2; - ng = NUM_GPR_ARG_REGISTERS; - } - break; - - default: - FFI_ASSERT (0); - } - - i++; - } - - (*fun) (cif, rvalue, avalue, user_data); - - /* Tell ffi_closure_SYSV how to perform return type promotions. - Because the FFI_SYSV ABI returns the structures <= 8 bytes in - r3/r4 we have to tell ffi_closure_SYSV how to treat them. We - combine the base type FFI_SYSV_TYPE_SMALL_STRUCT with the size of - the struct less one. We never have a struct with size zero. - See the comment in ffitarget.h about ordering. */ - if (rtypenum == FFI_TYPE_STRUCT - && (cif->abi & FFI_SYSV_STRUCT_RET) != 0 && size <= 8) - return FFI_SYSV_TYPE_SMALL_STRUCT - 1 + size; - return rtypenum; -} -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/ffitarget.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/ffitarget.h deleted file mode 100644 index 7fb9a93..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/ffitarget.h +++ /dev/null @@ -1,204 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - Copyright (C) 2007, 2008, 2010 Free Software Foundation, Inc - Copyright (c) 1996-2003 Red Hat, Inc. - - Target configuration macros for PowerPC. - - 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. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -/* ---- System specific configurations ----------------------------------- */ - -#if defined (POWERPC) && defined (__powerpc64__) /* linux64 */ -#ifndef POWERPC64 -#define POWERPC64 -#endif -#elif defined (POWERPC_DARWIN) && defined (__ppc64__) /* Darwin64 */ -#ifndef POWERPC64 -#define POWERPC64 -#endif -#ifndef POWERPC_DARWIN64 -#define POWERPC_DARWIN64 -#endif -#elif defined (POWERPC_AIX) && defined (__64BIT__) /* AIX64 */ -#ifndef POWERPC64 -#define POWERPC64 -#endif -#endif - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - -#if defined (POWERPC_AIX) - FFI_AIX, - FFI_DARWIN, - FFI_DEFAULT_ABI = FFI_AIX, - FFI_LAST_ABI - -#elif defined (POWERPC_DARWIN) - FFI_AIX, - FFI_DARWIN, - FFI_DEFAULT_ABI = FFI_DARWIN, - FFI_LAST_ABI - -#else - /* The FFI_COMPAT values are used by old code. Since libffi may be - a shared library we have to support old values for backwards - compatibility. */ - FFI_COMPAT_SYSV, - FFI_COMPAT_GCC_SYSV, - FFI_COMPAT_LINUX64, - FFI_COMPAT_LINUX, - FFI_COMPAT_LINUX_SOFT_FLOAT, - -# if defined (POWERPC64) - /* This bit, always set in new code, must not be set in any of the - old FFI_COMPAT values that might be used for 64-bit linux. We - only need worry about FFI_COMPAT_LINUX64, but to be safe avoid - all old values. */ - FFI_LINUX = 8, - /* This and following bits can reuse FFI_COMPAT values. */ - FFI_LINUX_STRUCT_ALIGN = 1, - FFI_LINUX_LONG_DOUBLE_128 = 2, - FFI_LINUX_LONG_DOUBLE_IEEE128 = 4, - FFI_DEFAULT_ABI = (FFI_LINUX -# ifdef __STRUCT_PARM_ALIGN__ - | FFI_LINUX_STRUCT_ALIGN -# endif -# ifdef __LONG_DOUBLE_128__ - | FFI_LINUX_LONG_DOUBLE_128 -# ifdef __LONG_DOUBLE_IEEE128__ - | FFI_LINUX_LONG_DOUBLE_IEEE128 -# endif -# endif - ), - FFI_LAST_ABI = 16 - -# else - /* This bit, always set in new code, must not be set in any of the - old FFI_COMPAT values that might be used for 32-bit linux/sysv/bsd. */ - FFI_SYSV = 8, - /* This and following bits can reuse FFI_COMPAT values. */ - FFI_SYSV_SOFT_FLOAT = 1, - FFI_SYSV_STRUCT_RET = 2, - FFI_SYSV_IBM_LONG_DOUBLE = 4, - FFI_SYSV_LONG_DOUBLE_128 = 16, - - FFI_DEFAULT_ABI = (FFI_SYSV -# ifdef __NO_FPRS__ - | FFI_SYSV_SOFT_FLOAT -# endif -# if (defined (__SVR4_STRUCT_RETURN) \ - || defined (POWERPC_FREEBSD) && !defined (__AIX_STRUCT_RETURN)) - | FFI_SYSV_STRUCT_RET -# endif -# if __LDBL_MANT_DIG__ == 106 - | FFI_SYSV_IBM_LONG_DOUBLE -# endif -# ifdef __LONG_DOUBLE_128__ - | FFI_SYSV_LONG_DOUBLE_128 -# endif - ), - FFI_LAST_ABI = 32 -# endif -#endif - -} ffi_abi; -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_NATIVE_RAW_API 0 -#if defined (POWERPC) || defined (POWERPC_FREEBSD) -# define FFI_GO_CLOSURES 1 -# define FFI_TARGET_SPECIFIC_VARIADIC 1 -# define FFI_EXTRA_CIF_FIELDS unsigned nfixedargs -#endif -#if defined (POWERPC_AIX) -# define FFI_GO_CLOSURES 1 -#endif - -/* ppc_closure.S and linux64_closure.S expect this. */ -#define FFI_PPC_TYPE_LAST FFI_TYPE_POINTER - -/* We define additional types below. If generic types are added that - must be supported by powerpc libffi then it is likely that - FFI_PPC_TYPE_LAST needs increasing *and* the jump tables in - ppc_closure.S and linux64_closure.S be extended. */ - -#if !(FFI_TYPE_LAST == FFI_PPC_TYPE_LAST \ - || (FFI_TYPE_LAST == FFI_TYPE_COMPLEX \ - && !defined FFI_TARGET_HAS_COMPLEX_TYPE)) -# error "You likely have a broken powerpc libffi" -#endif - -/* Needed for soft-float long-double-128 support. */ -#define FFI_TYPE_UINT128 (FFI_PPC_TYPE_LAST + 1) - -/* Needed for FFI_SYSV small structure returns. */ -#define FFI_SYSV_TYPE_SMALL_STRUCT (FFI_PPC_TYPE_LAST + 2) - -/* Used by ELFv2 for homogenous structure returns. */ -#define FFI_V2_TYPE_VECTOR (FFI_PPC_TYPE_LAST + 1) -#define FFI_V2_TYPE_VECTOR_HOMOG (FFI_PPC_TYPE_LAST + 2) -#define FFI_V2_TYPE_FLOAT_HOMOG (FFI_PPC_TYPE_LAST + 3) -#define FFI_V2_TYPE_DOUBLE_HOMOG (FFI_PPC_TYPE_LAST + 4) -#define FFI_V2_TYPE_SMALL_STRUCT (FFI_PPC_TYPE_LAST + 5) - -#if _CALL_ELF == 2 -# define FFI_TRAMPOLINE_SIZE 32 -#else -# if defined(POWERPC64) || defined(POWERPC_AIX) -# if defined(POWERPC_DARWIN64) -# define FFI_TRAMPOLINE_SIZE 48 -# else -# define FFI_TRAMPOLINE_SIZE 24 -# endif -# else /* POWERPC || POWERPC_AIX */ -# define FFI_TRAMPOLINE_SIZE 40 -# endif -#endif - -#ifndef LIBFFI_ASM -#if defined(POWERPC_DARWIN) || defined(POWERPC_AIX) -struct ffi_aix_trampoline_struct { - void * code_pointer; /* Pointer to ffi_closure_ASM */ - void * toc; /* TOC */ - void * static_chain; /* Pointer to closure */ -}; -#endif -#endif - -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/linux64.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/linux64.S deleted file mode 100644 index e92d64a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/linux64.S +++ /dev/null @@ -1,291 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.h - Copyright (c) 2003 Jakub Jelinek - Copyright (c) 2008 Red Hat, Inc. - - PowerPC64 Assembly glue. - - 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. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include - -#ifdef POWERPC64 - .hidden ffi_call_LINUX64 - .globl ffi_call_LINUX64 - .text - .cfi_startproc -# if _CALL_ELF == 2 -ffi_call_LINUX64: -# ifndef __PCREL__ - addis %r2, %r12, .TOC.-ffi_call_LINUX64@ha - addi %r2, %r2, .TOC.-ffi_call_LINUX64@l -# endif - .localentry ffi_call_LINUX64, . - ffi_call_LINUX64 -# else - .section ".opd","aw" - .align 3 -ffi_call_LINUX64: -# ifdef _CALL_LINUX - .quad .L.ffi_call_LINUX64,.TOC.@tocbase,0 - .type ffi_call_LINUX64,@function - .text -.L.ffi_call_LINUX64: -# else - .hidden .ffi_call_LINUX64 - .globl .ffi_call_LINUX64 - .quad .ffi_call_LINUX64,.TOC.@tocbase,0 - .size ffi_call_LINUX64,24 - .type .ffi_call_LINUX64,@function - .text -.ffi_call_LINUX64: -# endif -# endif - mflr %r0 - std %r28, -32(%r1) - std %r29, -24(%r1) - std %r30, -16(%r1) - std %r31, -8(%r1) - std %r7, 8(%r1) /* closure, saved in cr field. */ - std %r0, 16(%r1) - - mr %r28, %r1 /* our AP. */ - .cfi_def_cfa_register 28 - .cfi_offset 65, 16 - .cfi_offset 31, -8 - .cfi_offset 30, -16 - .cfi_offset 29, -24 - .cfi_offset 28, -32 - - stdux %r1, %r1, %r8 - mr %r31, %r6 /* flags, */ - mr %r30, %r5 /* rvalue, */ - mr %r29, %r4 /* function address. */ -/* Save toc pointer, not for the ffi_prep_args64 call, but for the later - bctrl function call. */ -# if _CALL_ELF == 2 - std %r2, 24(%r1) -# else - std %r2, 40(%r1) -# endif - - /* Call ffi_prep_args64. */ - mr %r4, %r1 -# if defined _CALL_LINUX || _CALL_ELF == 2 -# ifdef __PCREL__ - bl ffi_prep_args64@notoc -# else - bl ffi_prep_args64 - nop -# endif -# else - bl .ffi_prep_args64 - nop -# endif - -# if _CALL_ELF == 2 - mr %r12, %r29 -# else - ld %r12, 0(%r29) - ld %r2, 8(%r29) -# endif - /* Now do the call. */ - /* Set up cr1 with bits 3-7 of the flags. */ - mtcrf 0xc0, %r31 - - /* Get the address to call into CTR. */ - mtctr %r12 - /* Load all those argument registers. */ - addi %r29, %r28, -32-(8*8) - ld %r3, (0*8)(%r29) - ld %r4, (1*8)(%r29) - ld %r5, (2*8)(%r29) - ld %r6, (3*8)(%r29) - bf- 5, 1f - ld %r7, (4*8)(%r29) - ld %r8, (5*8)(%r29) - ld %r9, (6*8)(%r29) - ld %r10, (7*8)(%r29) -1: - - /* Load all the FP registers. */ - bf- 6, 2f - addi %r29, %r29, -(14*8) - lfd %f1, ( 1*8)(%r29) - lfd %f2, ( 2*8)(%r29) - lfd %f3, ( 3*8)(%r29) - lfd %f4, ( 4*8)(%r29) - lfd %f5, ( 5*8)(%r29) - lfd %f6, ( 6*8)(%r29) - lfd %f7, ( 7*8)(%r29) - lfd %f8, ( 8*8)(%r29) - lfd %f9, ( 9*8)(%r29) - lfd %f10, (10*8)(%r29) - lfd %f11, (11*8)(%r29) - lfd %f12, (12*8)(%r29) - lfd %f13, (13*8)(%r29) -2: - - /* Load all the vector registers. */ - bf- 3, 3f - addi %r29, %r29, -16 - lvx %v13, 0, %r29 - addi %r29, %r29, -16 - lvx %v12, 0, %r29 - addi %r29, %r29, -16 - lvx %v11, 0, %r29 - addi %r29, %r29, -16 - lvx %v10, 0, %r29 - addi %r29, %r29, -16 - lvx %v9, 0, %r29 - addi %r29, %r29, -16 - lvx %v8, 0, %r29 - addi %r29, %r29, -16 - lvx %v7, 0, %r29 - addi %r29, %r29, -16 - lvx %v6, 0, %r29 - addi %r29, %r29, -16 - lvx %v5, 0, %r29 - addi %r29, %r29, -16 - lvx %v4, 0, %r29 - addi %r29, %r29, -16 - lvx %v3, 0, %r29 - addi %r29, %r29, -16 - lvx %v2, 0, %r29 -3: - - /* Make the call. */ - ld %r11, 8(%r28) - bctrl - - /* This must follow the call immediately, the unwinder - uses this to find out if r2 has been saved or not. */ -# if _CALL_ELF == 2 - ld %r2, 24(%r1) -# else - ld %r2, 40(%r1) -# endif - - /* Now, deal with the return value. */ - mtcrf 0x01, %r31 - bt 31, .Lstruct_return_value - bt 30, .Ldone_return_value - bt 29, .Lfp_return_value - bt 28, .Lvec_return_value - std %r3, 0(%r30) - /* Fall through... */ - -.Ldone_return_value: - /* Restore the registers we used and return. */ - mr %r1, %r28 - .cfi_def_cfa_register 1 - ld %r0, 16(%r28) - ld %r28, -32(%r28) - mtlr %r0 - ld %r29, -24(%r1) - ld %r30, -16(%r1) - ld %r31, -8(%r1) - blr - -.Lvec_return_value: - stvx %v2, 0, %r30 - b .Ldone_return_value - -.Lfp_return_value: - .cfi_def_cfa_register 28 - mtcrf 0x02, %r31 /* cr6 */ - bf 27, .Lfloat_return_value - stfd %f1, 0(%r30) - bf 26, .Ldone_return_value - stfd %f2, 8(%r30) - b .Ldone_return_value -.Lfloat_return_value: - stfs %f1, 0(%r30) - b .Ldone_return_value - -.Lstruct_return_value: - bf 29, .Lvec_homog_or_small_struct - mtcrf 0x02, %r31 /* cr6 */ - bf 27, .Lfloat_homog_return_value - stfd %f1, 0(%r30) - stfd %f2, 8(%r30) - stfd %f3, 16(%r30) - stfd %f4, 24(%r30) - stfd %f5, 32(%r30) - stfd %f6, 40(%r30) - stfd %f7, 48(%r30) - stfd %f8, 56(%r30) - b .Ldone_return_value - -.Lfloat_homog_return_value: - stfs %f1, 0(%r30) - stfs %f2, 4(%r30) - stfs %f3, 8(%r30) - stfs %f4, 12(%r30) - stfs %f5, 16(%r30) - stfs %f6, 20(%r30) - stfs %f7, 24(%r30) - stfs %f8, 28(%r30) - b .Ldone_return_value - -.Lvec_homog_or_small_struct: - bf 28, .Lsmall_struct - stvx %v2, 0, %r30 - addi %r30, %r30, 16 - stvx %v3, 0, %r30 - addi %r30, %r30, 16 - stvx %v4, 0, %r30 - addi %r30, %r30, 16 - stvx %v5, 0, %r30 - addi %r30, %r30, 16 - stvx %v6, 0, %r30 - addi %r30, %r30, 16 - stvx %v7, 0, %r30 - addi %r30, %r30, 16 - stvx %v8, 0, %r30 - addi %r30, %r30, 16 - stvx %v9, 0, %r30 - b .Ldone_return_value - -.Lsmall_struct: - std %r3, 0(%r30) - std %r4, 8(%r30) - b .Ldone_return_value - - .cfi_endproc -# if _CALL_ELF == 2 - .size ffi_call_LINUX64,.-ffi_call_LINUX64 -# else -# ifdef _CALL_LINUX - .size ffi_call_LINUX64,.-.L.ffi_call_LINUX64 -# else - .long 0 - .byte 0,12,0,1,128,4,0,0 - .size .ffi_call_LINUX64,.-.ffi_call_LINUX64 -# endif -# endif - -#endif - -#if (defined __ELF__ && defined __linux__) || _CALL_ELF == 2 - .section .note.GNU-stack,"",@progbits -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/linux64_closure.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/linux64_closure.S deleted file mode 100644 index 3469a2c..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +++ /dev/null @@ -1,564 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.h - Copyright (c) 2003 Jakub Jelinek - Copyright (c) 2008 Red Hat, Inc. - - PowerPC64 Assembly glue. - - 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. - ----------------------------------------------------------------------- */ -#define LIBFFI_ASM -#include -#include - - .file "linux64_closure.S" - -#ifdef POWERPC64 - FFI_HIDDEN (ffi_closure_LINUX64) - .globl ffi_closure_LINUX64 - .text - .cfi_startproc -# if _CALL_ELF == 2 -ffi_closure_LINUX64: -# ifndef __PCREL__ - addis %r2, %r12, .TOC.-ffi_closure_LINUX64@ha - addi %r2, %r2, .TOC.-ffi_closure_LINUX64@l -# endif - .localentry ffi_closure_LINUX64, . - ffi_closure_LINUX64 -# else - .section ".opd","aw" - .align 3 -ffi_closure_LINUX64: -# ifdef _CALL_LINUX - .quad .L.ffi_closure_LINUX64,.TOC.@tocbase,0 - .type ffi_closure_LINUX64,@function - .text -.L.ffi_closure_LINUX64: -# else - FFI_HIDDEN (.ffi_closure_LINUX64) - .globl .ffi_closure_LINUX64 - .quad .ffi_closure_LINUX64,.TOC.@tocbase,0 - .size ffi_closure_LINUX64,24 - .type .ffi_closure_LINUX64,@function - .text -.ffi_closure_LINUX64: -# endif -# endif - -# if _CALL_ELF == 2 -# ifdef __VEC__ -# 32 byte special reg save area + 64 byte parm save area -# + 128 byte retval area + 13*8 fpr save area + 12*16 vec save area + round to 16 -# define STACKFRAME 528 -# else -# 32 byte special reg save area + 64 byte parm save area -# + 64 byte retval area + 13*8 fpr save area + round to 16 -# define STACKFRAME 272 -# endif -# define PARMSAVE 32 -# define RETVAL PARMSAVE+64 -# else -# 48 bytes special reg save area + 64 bytes parm save area -# + 16 bytes retval area + 13*8 bytes fpr save area + round to 16 -# define STACKFRAME 240 -# define PARMSAVE 48 -# define RETVAL PARMSAVE+64 -# endif - -# if _CALL_ELF == 2 - ld %r12, FFI_TRAMPOLINE_SIZE(%r11) # closure->cif - mflr %r0 - lwz %r12, 28(%r12) # cif->flags - mtcrf 0x40, %r12 - addi %r12, %r1, PARMSAVE - bt 7, 0f - # Our caller has not allocated a parameter save area. - # We need to allocate one here and use it to pass gprs to - # ffi_closure_helper_LINUX64. - addi %r12, %r1, -STACKFRAME+PARMSAVE -0: - # Save general regs into parm save area - std %r3, 0(%r12) - std %r4, 8(%r12) - std %r5, 16(%r12) - std %r6, 24(%r12) - std %r7, 32(%r12) - std %r8, 40(%r12) - std %r9, 48(%r12) - std %r10, 56(%r12) - - # load up the pointer to the parm save area - mr %r7, %r12 -# else - # copy r2 to r11 and load TOC into r2 - mr %r11, %r2 - ld %r2, 16(%r2) - - mflr %r0 - # Save general regs into parm save area - # This is the parameter save area set up by our caller. - std %r3, PARMSAVE+0(%r1) - std %r4, PARMSAVE+8(%r1) - std %r5, PARMSAVE+16(%r1) - std %r6, PARMSAVE+24(%r1) - std %r7, PARMSAVE+32(%r1) - std %r8, PARMSAVE+40(%r1) - std %r9, PARMSAVE+48(%r1) - std %r10, PARMSAVE+56(%r1) - - # load up the pointer to the parm save area - addi %r7, %r1, PARMSAVE -# endif - std %r0, 16(%r1) - - # closure->cif - ld %r3, FFI_TRAMPOLINE_SIZE(%r11) - # closure->fun - ld %r4, FFI_TRAMPOLINE_SIZE+8(%r11) - # closure->user_data - ld %r5, FFI_TRAMPOLINE_SIZE+16(%r11) - -.Ldoclosure: - # next save fpr 1 to fpr 13 - stfd %f1, -104+(0*8)(%r1) - stfd %f2, -104+(1*8)(%r1) - stfd %f3, -104+(2*8)(%r1) - stfd %f4, -104+(3*8)(%r1) - stfd %f5, -104+(4*8)(%r1) - stfd %f6, -104+(5*8)(%r1) - stfd %f7, -104+(6*8)(%r1) - stfd %f8, -104+(7*8)(%r1) - stfd %f9, -104+(8*8)(%r1) - stfd %f10, -104+(9*8)(%r1) - stfd %f11, -104+(10*8)(%r1) - stfd %f12, -104+(11*8)(%r1) - stfd %f13, -104+(12*8)(%r1) - - # load up the pointer to the saved fpr registers - addi %r8, %r1, -104 - -# ifdef __VEC__ - # load up the pointer to the saved vector registers - # 8 bytes padding for 16-byte alignment at -112(%r1) - addi %r9, %r8, -24 - stvx %v13, 0, %r9 - addi %r9, %r9, -16 - stvx %v12, 0, %r9 - addi %r9, %r9, -16 - stvx %v11, 0, %r9 - addi %r9, %r9, -16 - stvx %v10, 0, %r9 - addi %r9, %r9, -16 - stvx %v9, 0, %r9 - addi %r9, %r9, -16 - stvx %v8, 0, %r9 - addi %r9, %r9, -16 - stvx %v7, 0, %r9 - addi %r9, %r9, -16 - stvx %v6, 0, %r9 - addi %r9, %r9, -16 - stvx %v5, 0, %r9 - addi %r9, %r9, -16 - stvx %v4, 0, %r9 - addi %r9, %r9, -16 - stvx %v3, 0, %r9 - addi %r9, %r9, -16 - stvx %v2, 0, %r9 -# endif - - # load up the pointer to the result storage - addi %r6, %r1, -STACKFRAME+RETVAL - - stdu %r1, -STACKFRAME(%r1) - .cfi_def_cfa_offset STACKFRAME - .cfi_offset 65, 16 - - # make the call -# if defined _CALL_LINUX || _CALL_ELF == 2 -# ifdef __PCREL__ - bl ffi_closure_helper_LINUX64@notoc -.Lret: -# else - bl ffi_closure_helper_LINUX64 -.Lret: - nop -# endif -# else - bl .ffi_closure_helper_LINUX64 -.Lret: - nop -# endif - - # now r3 contains the return type - # so use it to look up in a table - # so we know how to deal with each type - - # look up the proper starting point in table - # by using return type as offset - ld %r0, STACKFRAME+16(%r1) - cmpldi %r3, FFI_V2_TYPE_SMALL_STRUCT - bge .Lsmall - mflr %r4 # move address of .Lret to r4 - sldi %r3, %r3, 4 # now multiply return type by 16 - addi %r4, %r4, .Lret_type0 - .Lret - add %r3, %r3, %r4 # add contents of table to table address - mtctr %r3 - bctr # jump to it - -# Each of the ret_typeX code fragments has to be exactly 16 bytes long -# (4 instructions). For cache effectiveness we align to a 16 byte boundary -# first. - .align 4 - -.Lret_type0: -# case FFI_TYPE_VOID - mtlr %r0 - addi %r1, %r1, STACKFRAME - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset STACKFRAME - nop -# case FFI_TYPE_INT -# ifdef __LITTLE_ENDIAN__ - lwa %r3, RETVAL+0(%r1) -# else - lwa %r3, RETVAL+4(%r1) -# endif - mtlr %r0 - addi %r1, %r1, STACKFRAME - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset STACKFRAME -# case FFI_TYPE_FLOAT - lfs %f1, RETVAL+0(%r1) - mtlr %r0 - addi %r1, %r1, STACKFRAME - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset STACKFRAME -# case FFI_TYPE_DOUBLE - lfd %f1, RETVAL+0(%r1) - mtlr %r0 - addi %r1, %r1, STACKFRAME - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset STACKFRAME -# case FFI_TYPE_LONGDOUBLE - lfd %f1, RETVAL+0(%r1) - mtlr %r0 - lfd %f2, RETVAL+8(%r1) - b .Lfinish -# case FFI_TYPE_UINT8 -# ifdef __LITTLE_ENDIAN__ - lbz %r3, RETVAL+0(%r1) -# else - lbz %r3, RETVAL+7(%r1) -# endif - mtlr %r0 - addi %r1, %r1, STACKFRAME - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset STACKFRAME -# case FFI_TYPE_SINT8 -# ifdef __LITTLE_ENDIAN__ - lbz %r3, RETVAL+0(%r1) -# else - lbz %r3, RETVAL+7(%r1) -# endif - extsb %r3,%r3 - mtlr %r0 - b .Lfinish -# case FFI_TYPE_UINT16 -# ifdef __LITTLE_ENDIAN__ - lhz %r3, RETVAL+0(%r1) -# else - lhz %r3, RETVAL+6(%r1) -# endif - mtlr %r0 -.Lfinish: - addi %r1, %r1, STACKFRAME - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset STACKFRAME -# case FFI_TYPE_SINT16 -# ifdef __LITTLE_ENDIAN__ - lha %r3, RETVAL+0(%r1) -# else - lha %r3, RETVAL+6(%r1) -# endif - mtlr %r0 - addi %r1, %r1, STACKFRAME - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset STACKFRAME -# case FFI_TYPE_UINT32 -# ifdef __LITTLE_ENDIAN__ - lwz %r3, RETVAL+0(%r1) -# else - lwz %r3, RETVAL+4(%r1) -# endif - mtlr %r0 - addi %r1, %r1, STACKFRAME - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset STACKFRAME -# case FFI_TYPE_SINT32 -# ifdef __LITTLE_ENDIAN__ - lwa %r3, RETVAL+0(%r1) -# else - lwa %r3, RETVAL+4(%r1) -# endif - mtlr %r0 - addi %r1, %r1, STACKFRAME - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset STACKFRAME -# case FFI_TYPE_UINT64 - ld %r3, RETVAL+0(%r1) - mtlr %r0 - addi %r1, %r1, STACKFRAME - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset STACKFRAME -# case FFI_TYPE_SINT64 - ld %r3, RETVAL+0(%r1) - mtlr %r0 - addi %r1, %r1, STACKFRAME - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset STACKFRAME -# case FFI_TYPE_STRUCT - mtlr %r0 - addi %r1, %r1, STACKFRAME - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset STACKFRAME - nop -# case FFI_TYPE_POINTER - ld %r3, RETVAL+0(%r1) - mtlr %r0 - addi %r1, %r1, STACKFRAME - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset STACKFRAME -# case FFI_V2_TYPE_VECTOR - addi %r3, %r1, RETVAL - lvx %v2, 0, %r3 - mtlr %r0 - b .Lfinish -# case FFI_V2_TYPE_VECTOR_HOMOG - addi %r3, %r1, RETVAL - lvx %v2, 0, %r3 - addi %r3, %r3, 16 - b .Lmorevector -# case FFI_V2_TYPE_FLOAT_HOMOG - lfs %f1, RETVAL+0(%r1) - lfs %f2, RETVAL+4(%r1) - lfs %f3, RETVAL+8(%r1) - b .Lmorefloat -# case FFI_V2_TYPE_DOUBLE_HOMOG - lfd %f1, RETVAL+0(%r1) - lfd %f2, RETVAL+8(%r1) - lfd %f3, RETVAL+16(%r1) - lfd %f4, RETVAL+24(%r1) - mtlr %r0 - lfd %f5, RETVAL+32(%r1) - lfd %f6, RETVAL+40(%r1) - lfd %f7, RETVAL+48(%r1) - lfd %f8, RETVAL+56(%r1) - addi %r1, %r1, STACKFRAME - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset STACKFRAME -.Lmorevector: - lvx %v3, 0, %r3 - addi %r3, %r3, 16 - lvx %v4, 0, %r3 - addi %r3, %r3, 16 - lvx %v5, 0, %r3 - mtlr %r0 - addi %r3, %r3, 16 - lvx %v6, 0, %r3 - addi %r3, %r3, 16 - lvx %v7, 0, %r3 - addi %r3, %r3, 16 - lvx %v8, 0, %r3 - addi %r3, %r3, 16 - lvx %v9, 0, %r3 - addi %r1, %r1, STACKFRAME - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset STACKFRAME -.Lmorefloat: - lfs %f4, RETVAL+12(%r1) - mtlr %r0 - lfs %f5, RETVAL+16(%r1) - lfs %f6, RETVAL+20(%r1) - lfs %f7, RETVAL+24(%r1) - lfs %f8, RETVAL+28(%r1) - addi %r1, %r1, STACKFRAME - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset STACKFRAME -.Lsmall: -# ifdef __LITTLE_ENDIAN__ - ld %r3,RETVAL+0(%r1) - mtlr %r0 - ld %r4,RETVAL+8(%r1) - addi %r1, %r1, STACKFRAME - .cfi_def_cfa_offset 0 - blr -# else - # A struct smaller than a dword is returned in the low bits of r3 - # ie. right justified. Larger structs are passed left justified - # in r3 and r4. The return value area on the stack will have - # the structs as they are usually stored in memory. - cmpldi %r3, FFI_V2_TYPE_SMALL_STRUCT + 7 # size 8 bytes? - neg %r5, %r3 - ld %r3,RETVAL+0(%r1) - blt .Lsmalldown - mtlr %r0 - ld %r4,RETVAL+8(%r1) - addi %r1, %r1, STACKFRAME - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset STACKFRAME -.Lsmalldown: - addi %r5, %r5, FFI_V2_TYPE_SMALL_STRUCT + 7 - mtlr %r0 - sldi %r5, %r5, 3 - addi %r1, %r1, STACKFRAME - .cfi_def_cfa_offset 0 - srd %r3, %r3, %r5 - blr -# endif - - .cfi_endproc -# if _CALL_ELF == 2 - .size ffi_closure_LINUX64,.-ffi_closure_LINUX64 -# else -# ifdef _CALL_LINUX - .size ffi_closure_LINUX64,.-.L.ffi_closure_LINUX64 -# else - .long 0 - .byte 0,12,0,1,128,0,0,0 - .size .ffi_closure_LINUX64,.-.ffi_closure_LINUX64 -# endif -# endif - - - FFI_HIDDEN (ffi_go_closure_linux64) - .globl ffi_go_closure_linux64 - .text - .cfi_startproc -# if _CALL_ELF == 2 -ffi_go_closure_linux64: -# ifndef __PCREL__ - addis %r2, %r12, .TOC.-ffi_go_closure_linux64@ha - addi %r2, %r2, .TOC.-ffi_go_closure_linux64@l -# endif - .localentry ffi_go_closure_linux64, . - ffi_go_closure_linux64 -# else - .section ".opd","aw" - .align 3 -ffi_go_closure_linux64: -# ifdef _CALL_LINUX - .quad .L.ffi_go_closure_linux64,.TOC.@tocbase,0 - .type ffi_go_closure_linux64,@function - .text -.L.ffi_go_closure_linux64: -# else - FFI_HIDDEN (.ffi_go_closure_linux64) - .globl .ffi_go_closure_linux64 - .quad .ffi_go_closure_linux64,.TOC.@tocbase,0 - .size ffi_go_closure_linux64,24 - .type .ffi_go_closure_linux64,@function - .text -.ffi_go_closure_linux64: -# endif -# endif - -# if _CALL_ELF == 2 - ld %r12, 8(%r11) # closure->cif - mflr %r0 - lwz %r12, 28(%r12) # cif->flags - mtcrf 0x40, %r12 - addi %r12, %r1, PARMSAVE - bt 7, 0f - # Our caller has not allocated a parameter save area. - # We need to allocate one here and use it to pass gprs to - # ffi_closure_helper_LINUX64. - addi %r12, %r1, -STACKFRAME+PARMSAVE -0: - # Save general regs into parm save area - std %r3, 0(%r12) - std %r4, 8(%r12) - std %r5, 16(%r12) - std %r6, 24(%r12) - std %r7, 32(%r12) - std %r8, 40(%r12) - std %r9, 48(%r12) - std %r10, 56(%r12) - - # load up the pointer to the parm save area - mr %r7, %r12 -# else - mflr %r0 - # Save general regs into parm save area - # This is the parameter save area set up by our caller. - std %r3, PARMSAVE+0(%r1) - std %r4, PARMSAVE+8(%r1) - std %r5, PARMSAVE+16(%r1) - std %r6, PARMSAVE+24(%r1) - std %r7, PARMSAVE+32(%r1) - std %r8, PARMSAVE+40(%r1) - std %r9, PARMSAVE+48(%r1) - std %r10, PARMSAVE+56(%r1) - - # load up the pointer to the parm save area - addi %r7, %r1, PARMSAVE -# endif - std %r0, 16(%r1) - - # closure->cif - ld %r3, 8(%r11) - # closure->fun - ld %r4, 16(%r11) - # user_data - mr %r5, %r11 - b .Ldoclosure - - .cfi_endproc -# if _CALL_ELF == 2 - .size ffi_go_closure_linux64,.-ffi_go_closure_linux64 -# else -# ifdef _CALL_LINUX - .size ffi_go_closure_linux64,.-.L.ffi_go_closure_linux64 -# else - .long 0 - .byte 0,12,0,1,128,0,0,0 - .size .ffi_go_closure_linux64,.-.ffi_go_closure_linux64 -# endif -# endif -#endif - -#if (defined __ELF__ && defined __linux__) || _CALL_ELF == 2 - .section .note.GNU-stack,"",@progbits -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/ppc_closure.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/ppc_closure.S deleted file mode 100644 index b6d209d..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +++ /dev/null @@ -1,397 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.h - Copyright (c) 2003 Jakub Jelinek - Copyright (c) 2008 Red Hat, Inc. - - PowerPC Assembly glue. - - 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. - ----------------------------------------------------------------------- */ -#define LIBFFI_ASM -#include -#include -#include - - .file "ppc_closure.S" - -#ifndef POWERPC64 - -FFI_HIDDEN(ffi_closure_SYSV) -ENTRY(ffi_closure_SYSV) - .cfi_startproc - stwu %r1,-144(%r1) - .cfi_def_cfa_offset 144 - mflr %r0 - stw %r0,148(%r1) - .cfi_offset 65, 4 - -# we want to build up an areas for the parameters passed -# in registers (both floating point and integer) - - # so first save gpr 3 to gpr 10 (aligned to 4) - stw %r3, 16(%r1) - stw %r4, 20(%r1) - stw %r5, 24(%r1) - - # set up registers for the routine that does the work - - # closure->cif - lwz %r3,FFI_TRAMPOLINE_SIZE(%r11) - # closure->fun - lwz %r4,FFI_TRAMPOLINE_SIZE+4(%r11) - # closure->user_data - lwz %r5,FFI_TRAMPOLINE_SIZE+8(%r11) - -.Ldoclosure: - stw %r6, 28(%r1) - stw %r7, 32(%r1) - stw %r8, 36(%r1) - stw %r9, 40(%r1) - stw %r10,44(%r1) - -#ifndef __NO_FPRS__ - # next save fpr 1 to fpr 8 (aligned to 8) - stfd %f1, 48(%r1) - stfd %f2, 56(%r1) - stfd %f3, 64(%r1) - stfd %f4, 72(%r1) - stfd %f5, 80(%r1) - stfd %f6, 88(%r1) - stfd %f7, 96(%r1) - stfd %f8, 104(%r1) -#endif - - # pointer to the result storage - addi %r6,%r1,112 - - # pointer to the saved gpr registers - addi %r7,%r1,16 - - # pointer to the saved fpr registers - addi %r8,%r1,48 - - # pointer to the outgoing parameter save area in the previous frame - # i.e. the previous frame pointer + 8 - addi %r9,%r1,152 - - # make the call - bl ffi_closure_helper_SYSV@local -.Lret: - # now r3 contains the return type - # so use it to look up in a table - # so we know how to deal with each type - - # look up the proper starting point in table - # by using return type as offset - - mflr %r4 # move address of .Lret to r4 - slwi %r3,%r3,4 # now multiply return type by 16 - addi %r4, %r4, .Lret_type0 - .Lret - lwz %r0,148(%r1) - add %r3,%r3,%r4 # add contents of table to table address - mtctr %r3 - bctr # jump to it - -# Each of the ret_typeX code fragments has to be exactly 16 bytes long -# (4 instructions). For cache effectiveness we align to a 16 byte boundary -# first. - .align 4 -# case FFI_TYPE_VOID -.Lret_type0: - mtlr %r0 - addi %r1,%r1,144 - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset 144 - nop - -# case FFI_TYPE_INT - lwz %r3,112+0(%r1) - mtlr %r0 -.Lfinish: - addi %r1,%r1,144 - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset 144 - -# case FFI_TYPE_FLOAT -#ifndef __NO_FPRS__ - lfs %f1,112+0(%r1) -#else - nop -#endif - mtlr %r0 - addi %r1,%r1,144 - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset 144 - -# case FFI_TYPE_DOUBLE -#ifndef __NO_FPRS__ - lfd %f1,112+0(%r1) -#else - nop -#endif - mtlr %r0 - addi %r1,%r1,144 - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset 144 - -# case FFI_TYPE_LONGDOUBLE -#ifndef __NO_FPRS__ - lfd %f1,112+0(%r1) - lfd %f2,112+8(%r1) - mtlr %r0 - b .Lfinish -#else - mtlr %r0 - addi %r1,%r1,144 - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset 144 - nop -#endif - -# case FFI_TYPE_UINT8 -#ifdef __LITTLE_ENDIAN__ - lbz %r3,112+0(%r1) -#else - lbz %r3,112+3(%r1) -#endif - mtlr %r0 - addi %r1,%r1,144 - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset 144 - -# case FFI_TYPE_SINT8 -#ifdef __LITTLE_ENDIAN__ - lbz %r3,112+0(%r1) -#else - lbz %r3,112+3(%r1) -#endif - extsb %r3,%r3 - mtlr %r0 - b .Lfinish - -# case FFI_TYPE_UINT16 -#ifdef __LITTLE_ENDIAN__ - lhz %r3,112+0(%r1) -#else - lhz %r3,112+2(%r1) -#endif - mtlr %r0 - addi %r1,%r1,144 - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset 144 - -# case FFI_TYPE_SINT16 -#ifdef __LITTLE_ENDIAN__ - lha %r3,112+0(%r1) -#else - lha %r3,112+2(%r1) -#endif - mtlr %r0 - addi %r1,%r1,144 - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset 144 - -# case FFI_TYPE_UINT32 - lwz %r3,112+0(%r1) - mtlr %r0 - addi %r1,%r1,144 - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset 144 - -# case FFI_TYPE_SINT32 - lwz %r3,112+0(%r1) - mtlr %r0 - addi %r1,%r1,144 - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset 144 - -# case FFI_TYPE_UINT64 - lwz %r3,112+0(%r1) - lwz %r4,112+4(%r1) - mtlr %r0 - b .Lfinish - -# case FFI_TYPE_SINT64 - lwz %r3,112+0(%r1) - lwz %r4,112+4(%r1) - mtlr %r0 - b .Lfinish - -# case FFI_TYPE_STRUCT - mtlr %r0 - addi %r1,%r1,144 - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset 144 - nop - -# case FFI_TYPE_POINTER - lwz %r3,112+0(%r1) - mtlr %r0 - addi %r1,%r1,144 - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset 144 - -# case FFI_TYPE_UINT128 - lwz %r3,112+0(%r1) - lwz %r4,112+4(%r1) - lwz %r5,112+8(%r1) - b .Luint128 - -# The return types below are only used when the ABI type is FFI_SYSV. -# case FFI_SYSV_TYPE_SMALL_STRUCT + 1. One byte struct. - lbz %r3,112+0(%r1) - mtlr %r0 - addi %r1,%r1,144 - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset 144 - -# case FFI_SYSV_TYPE_SMALL_STRUCT + 2. Two byte struct. - lhz %r3,112+0(%r1) - mtlr %r0 - addi %r1,%r1,144 - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset 144 - -# case FFI_SYSV_TYPE_SMALL_STRUCT + 3. Three byte struct. - lwz %r3,112+0(%r1) -#ifdef __LITTLE_ENDIAN__ - mtlr %r0 - addi %r1,%r1,144 - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset 144 -#else - srwi %r3,%r3,8 - mtlr %r0 - b .Lfinish -#endif - -# case FFI_SYSV_TYPE_SMALL_STRUCT + 4. Four byte struct. - lwz %r3,112+0(%r1) - mtlr %r0 - addi %r1,%r1,144 - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset 144 - -# case FFI_SYSV_TYPE_SMALL_STRUCT + 5. Five byte struct. - lwz %r3,112+0(%r1) - lwz %r4,112+4(%r1) -#ifdef __LITTLE_ENDIAN__ - mtlr %r0 - b .Lfinish -#else - li %r5,24 - b .Lstruct567 -#endif - -# case FFI_SYSV_TYPE_SMALL_STRUCT + 6. Six byte struct. - lwz %r3,112+0(%r1) - lwz %r4,112+4(%r1) -#ifdef __LITTLE_ENDIAN__ - mtlr %r0 - b .Lfinish -#else - li %r5,16 - b .Lstruct567 -#endif - -# case FFI_SYSV_TYPE_SMALL_STRUCT + 7. Seven byte struct. - lwz %r3,112+0(%r1) - lwz %r4,112+4(%r1) -#ifdef __LITTLE_ENDIAN__ - mtlr %r0 - b .Lfinish -#else - li %r5,8 - b .Lstruct567 -#endif - -# case FFI_SYSV_TYPE_SMALL_STRUCT + 8. Eight byte struct. - lwz %r3,112+0(%r1) - lwz %r4,112+4(%r1) - mtlr %r0 - b .Lfinish - -#ifndef __LITTLE_ENDIAN__ -.Lstruct567: - subfic %r6,%r5,32 - srw %r4,%r4,%r5 - slw %r6,%r3,%r6 - srw %r3,%r3,%r5 - or %r4,%r6,%r4 - mtlr %r0 - addi %r1,%r1,144 - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset 144 -#endif - -.Luint128: - lwz %r6,112+12(%r1) - mtlr %r0 - addi %r1,%r1,144 - .cfi_def_cfa_offset 0 - blr - .cfi_endproc -END(ffi_closure_SYSV) - - -FFI_HIDDEN(ffi_go_closure_sysv) -ENTRY(ffi_go_closure_sysv) - .cfi_startproc - stwu %r1,-144(%r1) - .cfi_def_cfa_offset 144 - mflr %r0 - stw %r0,148(%r1) - .cfi_offset 65, 4 - - stw %r3, 16(%r1) - stw %r4, 20(%r1) - stw %r5, 24(%r1) - - # closure->cif - lwz %r3,4(%r11) - # closure->fun - lwz %r4,8(%r11) - # user_data - mr %r5,%r11 - b .Ldoclosure - .cfi_endproc -END(ffi_go_closure_sysv) - -#if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",@progbits -#endif -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/sysv.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/sysv.S deleted file mode 100644 index df97734..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/powerpc/sysv.S +++ /dev/null @@ -1,173 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.S - Copyright (c) 1998 Geoffrey Keating - Copyright (C) 2007 Free Software Foundation, Inc - - PowerPC Assembly glue. - - 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. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include -#include - -#ifndef POWERPC64 -FFI_HIDDEN(ffi_call_SYSV) -ENTRY(ffi_call_SYSV) - .cfi_startproc - /* Save the old stack pointer as AP. */ - mr %r10,%r1 - .cfi_def_cfa_register 10 - - /* Allocate the stack space we need. */ - stwux %r1,%r1,%r8 - /* Save registers we use. */ - mflr %r9 - stw %r28,-16(%r10) - stw %r29,-12(%r10) - stw %r30, -8(%r10) - stw %r31, -4(%r10) - stw %r9, 4(%r10) - .cfi_offset 65, 4 - .cfi_offset 31, -4 - .cfi_offset 30, -8 - .cfi_offset 29, -12 - .cfi_offset 28, -16 - - /* Save arguments over call... */ - stw %r7, -20(%r10) /* closure, */ - mr %r31,%r6 /* flags, */ - mr %r30,%r5 /* rvalue, */ - mr %r29,%r4 /* function address, */ - mr %r28,%r10 /* our AP. */ - .cfi_def_cfa_register 28 - - /* Call ffi_prep_args_SYSV. */ - mr %r4,%r1 - bl ffi_prep_args_SYSV@local - - /* Now do the call. */ - /* Set up cr1 with bits 4-7 of the flags. */ - mtcrf 0x40,%r31 - /* Get the address to call into CTR. */ - mtctr %r29 - /* Load all those argument registers. */ - lwz %r3,-24-(8*4)(%r28) - lwz %r4,-24-(7*4)(%r28) - lwz %r5,-24-(6*4)(%r28) - lwz %r6,-24-(5*4)(%r28) - bf- 5,1f - nop - lwz %r7,-24-(4*4)(%r28) - lwz %r8,-24-(3*4)(%r28) - lwz %r9,-24-(2*4)(%r28) - lwz %r10,-24-(1*4)(%r28) - nop -1: - -#ifndef __NO_FPRS__ - /* Load all the FP registers. */ - bf- 6,2f - lfd %f1,-24-(8*4)-(8*8)(%r28) - lfd %f2,-24-(8*4)-(7*8)(%r28) - lfd %f3,-24-(8*4)-(6*8)(%r28) - lfd %f4,-24-(8*4)-(5*8)(%r28) - nop - lfd %f5,-24-(8*4)-(4*8)(%r28) - lfd %f6,-24-(8*4)-(3*8)(%r28) - lfd %f7,-24-(8*4)-(2*8)(%r28) - lfd %f8,-24-(8*4)-(1*8)(%r28) -#endif -2: - - /* Make the call. */ - lwz %r11, -20(%r28) - bctrl - - /* Now, deal with the return value. */ - mtcrf 0x03,%r31 /* cr6-cr7 */ - bt- 31,L(small_struct_return_value) - bt- 30,L(done_return_value) -#ifndef __NO_FPRS__ - bt- 29,L(fp_return_value) -#endif - stw %r3,0(%r30) - bf+ 27,L(done_return_value) - stw %r4,4(%r30) - bf 26,L(done_return_value) - stw %r5,8(%r30) - stw %r6,12(%r30) - /* Fall through... */ - -L(done_return_value): - /* Restore the registers we used and return. */ - lwz %r9, 4(%r28) - lwz %r31, -4(%r28) - mtlr %r9 - lwz %r30, -8(%r28) - lwz %r29,-12(%r28) - lwz %r28,-16(%r28) - .cfi_remember_state - /* At this point we don't have a cfa register. Say all our - saved regs have been restored. */ - .cfi_same_value 65 - .cfi_same_value 31 - .cfi_same_value 30 - .cfi_same_value 29 - .cfi_same_value 28 - /* Hopefully this works.. */ - .cfi_def_cfa_register 1 - .cfi_offset 1, 0 - lwz %r1,0(%r1) - .cfi_same_value 1 - blr - -#ifndef __NO_FPRS__ -L(fp_return_value): - .cfi_restore_state - bf 27,L(float_return_value) - stfd %f1,0(%r30) - bf 26,L(done_return_value) - stfd %f2,8(%r30) - b L(done_return_value) -L(float_return_value): - stfs %f1,0(%r30) - b L(done_return_value) -#endif - -L(small_struct_return_value): - /* - * The C code always allocates a properly-aligned 8-byte bounce - * buffer to make this assembly code very simple. Just write out - * r3 and r4 to the buffer to allow the C code to handle the rest. - */ - stw %r3, 0(%r30) - stw %r4, 4(%r30) - b L(done_return_value) - .cfi_endproc - -END(ffi_call_SYSV) - -#if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",@progbits -#endif -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/prep_cif.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/prep_cif.c deleted file mode 100644 index 1db3804..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/prep_cif.c +++ /dev/null @@ -1,263 +0,0 @@ -/* ----------------------------------------------------------------------- - prep_cif.c - Copyright (c) 2011, 2012 Anthony Green - Copyright (c) 1996, 1998, 2007 Red Hat, Inc. - - 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. - ----------------------------------------------------------------------- */ - -#include -#include -#include - -/* Round up to FFI_SIZEOF_ARG. */ - -#define STACK_ARG_SIZE(x) FFI_ALIGN(x, FFI_SIZEOF_ARG) - -/* Perform machine independent initialization of aggregate type - specifications. */ - -static ffi_status initialize_aggregate(ffi_type *arg, size_t *offsets) -{ - ffi_type **ptr; - - if (UNLIKELY(arg == NULL || arg->elements == NULL)) - return FFI_BAD_TYPEDEF; - - arg->size = 0; - arg->alignment = 0; - - ptr = &(arg->elements[0]); - - if (UNLIKELY(ptr == 0)) - return FFI_BAD_TYPEDEF; - - while ((*ptr) != NULL) - { - if (UNLIKELY(((*ptr)->size == 0) - && (initialize_aggregate((*ptr), NULL) != FFI_OK))) - return FFI_BAD_TYPEDEF; - - /* Perform a sanity check on the argument type */ - FFI_ASSERT_VALID_TYPE(*ptr); - - arg->size = FFI_ALIGN(arg->size, (*ptr)->alignment); - if (offsets) - *offsets++ = arg->size; - arg->size += (*ptr)->size; - - arg->alignment = (arg->alignment > (*ptr)->alignment) ? - arg->alignment : (*ptr)->alignment; - - ptr++; - } - - /* Structure size includes tail padding. This is important for - structures that fit in one register on ABIs like the PowerPC64 - Linux ABI that right justify small structs in a register. - It's also needed for nested structure layout, for example - struct A { long a; char b; }; struct B { struct A x; char y; }; - should find y at an offset of 2*sizeof(long) and result in a - total size of 3*sizeof(long). */ - arg->size = FFI_ALIGN (arg->size, arg->alignment); - - /* On some targets, the ABI defines that structures have an additional - alignment beyond the "natural" one based on their elements. */ -#ifdef FFI_AGGREGATE_ALIGNMENT - if (FFI_AGGREGATE_ALIGNMENT > arg->alignment) - arg->alignment = FFI_AGGREGATE_ALIGNMENT; -#endif - - if (arg->size == 0) - return FFI_BAD_TYPEDEF; - else - return FFI_OK; -} - -#ifndef __CRIS__ -/* The CRIS ABI specifies structure elements to have byte - alignment only, so it completely overrides this functions, - which assumes "natural" alignment and padding. */ - -/* Perform machine independent ffi_cif preparation, then call - machine dependent routine. */ - -/* For non variadic functions isvariadic should be 0 and - nfixedargs==ntotalargs. - - For variadic calls, isvariadic should be 1 and nfixedargs - and ntotalargs set as appropriate. nfixedargs must always be >=1 */ - - -ffi_status FFI_HIDDEN ffi_prep_cif_core(ffi_cif *cif, ffi_abi abi, - unsigned int isvariadic, - unsigned int nfixedargs, - unsigned int ntotalargs, - ffi_type *rtype, ffi_type **atypes) -{ - unsigned bytes = 0; - unsigned int i; - ffi_type **ptr; - - FFI_ASSERT(cif != NULL); - FFI_ASSERT((!isvariadic) || (nfixedargs >= 1)); - FFI_ASSERT(nfixedargs <= ntotalargs); - - if (! (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI)) - return FFI_BAD_ABI; - - cif->abi = abi; - cif->arg_types = atypes; - cif->nargs = ntotalargs; - cif->rtype = rtype; - - cif->flags = 0; -#if (defined(_M_ARM64) || defined(__aarch64__)) && defined(_WIN32) - cif->is_variadic = isvariadic; -#endif -#if HAVE_LONG_DOUBLE_VARIANT - ffi_prep_types (abi); -#endif - - /* Initialize the return type if necessary */ - if ((cif->rtype->size == 0) - && (initialize_aggregate(cif->rtype, NULL) != FFI_OK)) - return FFI_BAD_TYPEDEF; - -#ifndef FFI_TARGET_HAS_COMPLEX_TYPE - if (rtype->type == FFI_TYPE_COMPLEX) - abort(); -#endif - /* Perform a sanity check on the return type */ - FFI_ASSERT_VALID_TYPE(cif->rtype); - - /* x86, x86-64 and s390 stack space allocation is handled in prep_machdep. */ -#if !defined FFI_TARGET_SPECIFIC_STACK_SPACE_ALLOCATION - /* Make space for the return structure pointer */ - if (cif->rtype->type == FFI_TYPE_STRUCT -#ifdef TILE - && (cif->rtype->size > 10 * FFI_SIZEOF_ARG) -#endif -#ifdef XTENSA - && (cif->rtype->size > 16) -#endif -#ifdef NIOS2 - && (cif->rtype->size > 8) -#endif - ) - bytes = STACK_ARG_SIZE(sizeof(void*)); -#endif - - for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) - { - - /* Initialize any uninitialized aggregate type definitions */ - if (((*ptr)->size == 0) - && (initialize_aggregate((*ptr), NULL) != FFI_OK)) - return FFI_BAD_TYPEDEF; - -#ifndef FFI_TARGET_HAS_COMPLEX_TYPE - if ((*ptr)->type == FFI_TYPE_COMPLEX) - abort(); -#endif - /* Perform a sanity check on the argument type, do this - check after the initialization. */ - FFI_ASSERT_VALID_TYPE(*ptr); - -#if !defined FFI_TARGET_SPECIFIC_STACK_SPACE_ALLOCATION - { - /* Add any padding if necessary */ - if (((*ptr)->alignment - 1) & bytes) - bytes = (unsigned)FFI_ALIGN(bytes, (*ptr)->alignment); - -#ifdef TILE - if (bytes < 10 * FFI_SIZEOF_ARG && - bytes + STACK_ARG_SIZE((*ptr)->size) > 10 * FFI_SIZEOF_ARG) - { - /* An argument is never split between the 10 parameter - registers and the stack. */ - bytes = 10 * FFI_SIZEOF_ARG; - } -#endif -#ifdef XTENSA - if (bytes <= 6*4 && bytes + STACK_ARG_SIZE((*ptr)->size) > 6*4) - bytes = 6*4; -#endif - - bytes += (unsigned int)STACK_ARG_SIZE((*ptr)->size); - } -#endif - } - - cif->bytes = bytes; - - /* Perform machine dependent cif processing */ -#ifdef FFI_TARGET_SPECIFIC_VARIADIC - if (isvariadic) - return ffi_prep_cif_machdep_var(cif, nfixedargs, ntotalargs); -#endif - - return ffi_prep_cif_machdep(cif); -} -#endif /* not __CRIS__ */ - -ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, unsigned int nargs, - ffi_type *rtype, ffi_type **atypes) -{ - return ffi_prep_cif_core(cif, abi, 0, nargs, nargs, rtype, atypes); -} - -ffi_status ffi_prep_cif_var(ffi_cif *cif, - ffi_abi abi, - unsigned int nfixedargs, - unsigned int ntotalargs, - ffi_type *rtype, - ffi_type **atypes) -{ - return ffi_prep_cif_core(cif, abi, 1, nfixedargs, ntotalargs, rtype, atypes); -} - -#if FFI_CLOSURES - -ffi_status -ffi_prep_closure (ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*,void*,void**,void*), - void *user_data) -{ - return ffi_prep_closure_loc (closure, cif, fun, user_data, closure); -} - -#endif - -ffi_status -ffi_get_struct_offsets (ffi_abi abi, ffi_type *struct_type, size_t *offsets) -{ - if (! (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI)) - return FFI_BAD_ABI; - if (struct_type->type != FFI_TYPE_STRUCT) - return FFI_BAD_TYPEDEF; - -#if HAVE_LONG_DOUBLE_VARIANT - ffi_prep_types (abi); -#endif - - return initialize_aggregate(struct_type, offsets); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/raw_api.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/raw_api.c deleted file mode 100644 index be15611..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/raw_api.c +++ /dev/null @@ -1,267 +0,0 @@ -/* ----------------------------------------------------------------------- - raw_api.c - Copyright (c) 1999, 2008 Red Hat, Inc. - - Author: Kresten Krab Thorup - - 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. - ----------------------------------------------------------------------- */ - -/* This file defines generic functions for use with the raw api. */ - -#include -#include - -#if !FFI_NO_RAW_API - -size_t -ffi_raw_size (ffi_cif *cif) -{ - size_t result = 0; - int i; - - ffi_type **at = cif->arg_types; - - for (i = cif->nargs-1; i >= 0; i--, at++) - { -#if !FFI_NO_STRUCTS - if ((*at)->type == FFI_TYPE_STRUCT) - result += FFI_ALIGN (sizeof (void*), FFI_SIZEOF_ARG); - else -#endif - result += FFI_ALIGN ((*at)->size, FFI_SIZEOF_ARG); - } - - return result; -} - - -void -ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args) -{ - unsigned i; - ffi_type **tp = cif->arg_types; - -#if WORDS_BIGENDIAN - - for (i = 0; i < cif->nargs; i++, tp++, args++) - { - switch ((*tp)->type) - { - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT8: - *args = (void*) ((char*)(raw++) + FFI_SIZEOF_ARG - 1); - break; - - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT16: - *args = (void*) ((char*)(raw++) + FFI_SIZEOF_ARG - 2); - break; - -#if FFI_SIZEOF_ARG >= 4 - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - *args = (void*) ((char*)(raw++) + FFI_SIZEOF_ARG - 4); - break; -#endif - -#if !FFI_NO_STRUCTS - case FFI_TYPE_STRUCT: - *args = (raw++)->ptr; - break; -#endif - - case FFI_TYPE_COMPLEX: - *args = (raw++)->ptr; - break; - - case FFI_TYPE_POINTER: - *args = (void*) &(raw++)->ptr; - break; - - default: - *args = raw; - raw += FFI_ALIGN ((*tp)->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; - } - } - -#else /* WORDS_BIGENDIAN */ - -#if !PDP - - /* then assume little endian */ - for (i = 0; i < cif->nargs; i++, tp++, args++) - { -#if !FFI_NO_STRUCTS - if ((*tp)->type == FFI_TYPE_STRUCT) - { - *args = (raw++)->ptr; - } - else -#endif - if ((*tp)->type == FFI_TYPE_COMPLEX) - { - *args = (raw++)->ptr; - } - else - { - *args = (void*) raw; - raw += FFI_ALIGN ((*tp)->size, sizeof (void*)) / sizeof (void*); - } - } - -#else -#error "pdp endian not supported" -#endif /* ! PDP */ - -#endif /* WORDS_BIGENDIAN */ -} - -void -ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw) -{ - unsigned i; - ffi_type **tp = cif->arg_types; - - for (i = 0; i < cif->nargs; i++, tp++, args++) - { - switch ((*tp)->type) - { - case FFI_TYPE_UINT8: - (raw++)->uint = *(UINT8*) (*args); - break; - - case FFI_TYPE_SINT8: - (raw++)->sint = *(SINT8*) (*args); - break; - - case FFI_TYPE_UINT16: - (raw++)->uint = *(UINT16*) (*args); - break; - - case FFI_TYPE_SINT16: - (raw++)->sint = *(SINT16*) (*args); - break; - -#if FFI_SIZEOF_ARG >= 4 - case FFI_TYPE_UINT32: - (raw++)->uint = *(UINT32*) (*args); - break; - - case FFI_TYPE_SINT32: - (raw++)->sint = *(SINT32*) (*args); - break; -#endif - -#if !FFI_NO_STRUCTS - case FFI_TYPE_STRUCT: - (raw++)->ptr = *args; - break; -#endif - - case FFI_TYPE_COMPLEX: - (raw++)->ptr = *args; - break; - - case FFI_TYPE_POINTER: - (raw++)->ptr = **(void***) args; - break; - - default: - memcpy ((void*) raw->data, (void*)*args, (*tp)->size); - raw += FFI_ALIGN ((*tp)->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; - } - } -} - -#if !FFI_NATIVE_RAW_API - - -/* This is a generic definition of ffi_raw_call, to be used if the - * native system does not provide a machine-specific implementation. - * Having this, allows code to be written for the raw API, without - * the need for system-specific code to handle input in that format; - * these following couple of functions will handle the translation forth - * and back automatically. */ - -void ffi_raw_call (ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_raw *raw) -{ - void **avalue = (void**) alloca (cif->nargs * sizeof (void*)); - ffi_raw_to_ptrarray (cif, raw, avalue); - ffi_call (cif, fn, rvalue, avalue); -} - -#if FFI_CLOSURES /* base system provides closures */ - -static void -ffi_translate_args (ffi_cif *cif, void *rvalue, - void **avalue, void *user_data) -{ - ffi_raw *raw = (ffi_raw*)alloca (ffi_raw_size (cif)); - ffi_raw_closure *cl = (ffi_raw_closure*)user_data; - - ffi_ptrarray_to_raw (cif, avalue, raw); - (*cl->fun) (cif, rvalue, raw, cl->user_data); -} - -ffi_status -ffi_prep_raw_closure_loc (ffi_raw_closure* cl, - ffi_cif *cif, - void (*fun)(ffi_cif*,void*,ffi_raw*,void*), - void *user_data, - void *codeloc) -{ - ffi_status status; - - status = ffi_prep_closure_loc ((ffi_closure*) cl, - cif, - &ffi_translate_args, - codeloc, - codeloc); - if (status == FFI_OK) - { - cl->fun = fun; - cl->user_data = user_data; - } - - return status; -} - -#endif /* FFI_CLOSURES */ -#endif /* !FFI_NATIVE_RAW_API */ - -#if FFI_CLOSURES - -/* Again, here is the generic version of ffi_prep_raw_closure, which - * will install an intermediate "hub" for translation of arguments from - * the pointer-array format, to the raw format */ - -ffi_status -ffi_prep_raw_closure (ffi_raw_closure* cl, - ffi_cif *cif, - void (*fun)(ffi_cif*,void*,ffi_raw*,void*), - void *user_data) -{ - return ffi_prep_raw_closure_loc (cl, cif, fun, user_data, cl); -} - -#endif /* FFI_CLOSURES */ - -#endif /* !FFI_NO_RAW_API */ diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/riscv/ffi.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/riscv/ffi.c deleted file mode 100644 index c910858..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/riscv/ffi.c +++ /dev/null @@ -1,481 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2015 Michael Knyszek - 2015 Andrew Waterman - 2018 Stef O'Rear - Based on MIPS N32/64 port - - RISC-V Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#include -#include - -#include -#include - -#if __riscv_float_abi_double -#define ABI_FLEN 64 -#define ABI_FLOAT double -#elif __riscv_float_abi_single -#define ABI_FLEN 32 -#define ABI_FLOAT float -#endif - -#define NARGREG 8 -#define STKALIGN 16 -#define MAXCOPYARG (2 * sizeof(double)) - -typedef struct call_context -{ -#if ABI_FLEN - ABI_FLOAT fa[8]; -#endif - size_t a[8]; - /* used by the assembly code to in-place construct its own stack frame */ - char frame[16]; -} call_context; - -typedef struct call_builder -{ - call_context *aregs; - int used_integer; - int used_float; - size_t *used_stack; -} call_builder; - -/* integer (not pointer) less than ABI XLEN */ -/* FFI_TYPE_INT does not appear to be used */ -#if __SIZEOF_POINTER__ == 8 -#define IS_INT(type) ((type) >= FFI_TYPE_UINT8 && (type) <= FFI_TYPE_SINT64) -#else -#define IS_INT(type) ((type) >= FFI_TYPE_UINT8 && (type) <= FFI_TYPE_SINT32) -#endif - -#if ABI_FLEN -typedef struct { - char as_elements, type1, offset2, type2; -} float_struct_info; - -#if ABI_FLEN >= 64 -#define IS_FLOAT(type) ((type) >= FFI_TYPE_FLOAT && (type) <= FFI_TYPE_DOUBLE) -#else -#define IS_FLOAT(type) ((type) == FFI_TYPE_FLOAT) -#endif - -static ffi_type **flatten_struct(ffi_type *in, ffi_type **out, ffi_type **out_end) { - int i; - if (out == out_end) return out; - if (in->type != FFI_TYPE_STRUCT) { - *(out++) = in; - } else { - for (i = 0; in->elements[i]; i++) - out = flatten_struct(in->elements[i], out, out_end); - } - return out; -} - -/* Structs with at most two fields after flattening, one of which is of - floating point type, are passed in multiple registers if sufficient - registers are available. */ -static float_struct_info struct_passed_as_elements(call_builder *cb, ffi_type *top) { - float_struct_info ret = {0, 0, 0, 0}; - ffi_type *fields[3]; - int num_floats, num_ints; - int num_fields = flatten_struct(top, fields, fields + 3) - fields; - - if (num_fields == 1) { - if (IS_FLOAT(fields[0]->type)) { - ret.as_elements = 1; - ret.type1 = fields[0]->type; - } - } else if (num_fields == 2) { - num_floats = IS_FLOAT(fields[0]->type) + IS_FLOAT(fields[1]->type); - num_ints = IS_INT(fields[0]->type) + IS_INT(fields[1]->type); - if (num_floats == 0 || num_floats + num_ints != 2) - return ret; - if (cb->used_float + num_floats > NARGREG || cb->used_integer + (2 - num_floats) > NARGREG) - return ret; - if (!IS_FLOAT(fields[0]->type) && !IS_FLOAT(fields[1]->type)) - return ret; - - ret.type1 = fields[0]->type; - ret.type2 = fields[1]->type; - ret.offset2 = FFI_ALIGN(fields[0]->size, fields[1]->alignment); - ret.as_elements = 1; - } - - return ret; -} -#endif - -/* allocates a single register, float register, or XLEN-sized stack slot to a datum */ -static void marshal_atom(call_builder *cb, int type, void *data) { - size_t value = 0; - switch (type) { - case FFI_TYPE_UINT8: value = *(uint8_t *)data; break; - case FFI_TYPE_SINT8: value = *(int8_t *)data; break; - case FFI_TYPE_UINT16: value = *(uint16_t *)data; break; - case FFI_TYPE_SINT16: value = *(int16_t *)data; break; - /* 32-bit quantities are always sign-extended in the ABI */ - case FFI_TYPE_UINT32: value = *(int32_t *)data; break; - case FFI_TYPE_SINT32: value = *(int32_t *)data; break; -#if __SIZEOF_POINTER__ == 8 - case FFI_TYPE_UINT64: value = *(uint64_t *)data; break; - case FFI_TYPE_SINT64: value = *(int64_t *)data; break; -#endif - case FFI_TYPE_POINTER: value = *(size_t *)data; break; - - /* float values may be recoded in an implementation-defined way - by hardware conforming to 2.1 or earlier, so use asm to - reinterpret floats as doubles */ -#if ABI_FLEN >= 32 - case FFI_TYPE_FLOAT: - asm("" : "=f"(cb->aregs->fa[cb->used_float++]) : "0"(*(float *)data)); - return; -#endif -#if ABI_FLEN >= 64 - case FFI_TYPE_DOUBLE: - asm("" : "=f"(cb->aregs->fa[cb->used_float++]) : "0"(*(double *)data)); - return; -#endif - default: FFI_ASSERT(0); break; - } - - if (cb->used_integer == NARGREG) { - *cb->used_stack++ = value; - } else { - cb->aregs->a[cb->used_integer++] = value; - } -} - -static void unmarshal_atom(call_builder *cb, int type, void *data) { - size_t value; - switch (type) { -#if ABI_FLEN >= 32 - case FFI_TYPE_FLOAT: - asm("" : "=f"(*(float *)data) : "0"(cb->aregs->fa[cb->used_float++])); - return; -#endif -#if ABI_FLEN >= 64 - case FFI_TYPE_DOUBLE: - asm("" : "=f"(*(double *)data) : "0"(cb->aregs->fa[cb->used_float++])); - return; -#endif - } - - if (cb->used_integer == NARGREG) { - value = *cb->used_stack++; - } else { - value = cb->aregs->a[cb->used_integer++]; - } - - switch (type) { - case FFI_TYPE_UINT8: *(uint8_t *)data = value; break; - case FFI_TYPE_SINT8: *(uint8_t *)data = value; break; - case FFI_TYPE_UINT16: *(uint16_t *)data = value; break; - case FFI_TYPE_SINT16: *(uint16_t *)data = value; break; - case FFI_TYPE_UINT32: *(uint32_t *)data = value; break; - case FFI_TYPE_SINT32: *(uint32_t *)data = value; break; -#if __SIZEOF_POINTER__ == 8 - case FFI_TYPE_UINT64: *(uint64_t *)data = value; break; - case FFI_TYPE_SINT64: *(uint64_t *)data = value; break; -#endif - case FFI_TYPE_POINTER: *(size_t *)data = value; break; - default: FFI_ASSERT(0); break; - } -} - -/* adds an argument to a call, or a not by reference return value */ -static void marshal(call_builder *cb, ffi_type *type, int var, void *data) { - size_t realign[2]; - -#if ABI_FLEN - if (!var && type->type == FFI_TYPE_STRUCT) { - float_struct_info fsi = struct_passed_as_elements(cb, type); - if (fsi.as_elements) { - marshal_atom(cb, fsi.type1, data); - if (fsi.offset2) - marshal_atom(cb, fsi.type2, ((char*)data) + fsi.offset2); - return; - } - } - - if (!var && cb->used_float < NARGREG && IS_FLOAT(type->type)) { - marshal_atom(cb, type->type, data); - return; - } -#endif - - if (type->size > 2 * __SIZEOF_POINTER__) { - /* pass by reference */ - marshal_atom(cb, FFI_TYPE_POINTER, &data); - } else if (IS_INT(type->type) || type->type == FFI_TYPE_POINTER) { - marshal_atom(cb, type->type, data); - } else { - /* overlong integers, soft-float floats, and structs without special - float handling are treated identically from this point on */ - - /* variadics are aligned even in registers */ - if (type->alignment > __SIZEOF_POINTER__) { - if (var) - cb->used_integer = FFI_ALIGN(cb->used_integer, 2); - cb->used_stack = (size_t *)FFI_ALIGN(cb->used_stack, 2*__SIZEOF_POINTER__); - } - - memcpy(realign, data, type->size); - if (type->size > 0) - marshal_atom(cb, FFI_TYPE_POINTER, realign); - if (type->size > __SIZEOF_POINTER__) - marshal_atom(cb, FFI_TYPE_POINTER, realign + 1); - } -} - -/* for arguments passed by reference returns the pointer, otherwise the arg is copied (up to MAXCOPYARG bytes) */ -static void *unmarshal(call_builder *cb, ffi_type *type, int var, void *data) { - size_t realign[2]; - void *pointer; - -#if ABI_FLEN - if (!var && type->type == FFI_TYPE_STRUCT) { - float_struct_info fsi = struct_passed_as_elements(cb, type); - if (fsi.as_elements) { - unmarshal_atom(cb, fsi.type1, data); - if (fsi.offset2) - unmarshal_atom(cb, fsi.type2, ((char*)data) + fsi.offset2); - return data; - } - } - - if (!var && cb->used_float < NARGREG && IS_FLOAT(type->type)) { - unmarshal_atom(cb, type->type, data); - return data; - } -#endif - - if (type->size > 2 * __SIZEOF_POINTER__) { - /* pass by reference */ - unmarshal_atom(cb, FFI_TYPE_POINTER, (char*)&pointer); - return pointer; - } else if (IS_INT(type->type) || type->type == FFI_TYPE_POINTER) { - unmarshal_atom(cb, type->type, data); - return data; - } else { - /* overlong integers, soft-float floats, and structs without special - float handling are treated identically from this point on */ - - /* variadics are aligned even in registers */ - if (type->alignment > __SIZEOF_POINTER__) { - if (var) - cb->used_integer = FFI_ALIGN(cb->used_integer, 2); - cb->used_stack = (size_t *)FFI_ALIGN(cb->used_stack, 2*__SIZEOF_POINTER__); - } - - if (type->size > 0) - unmarshal_atom(cb, FFI_TYPE_POINTER, realign); - if (type->size > __SIZEOF_POINTER__) - unmarshal_atom(cb, FFI_TYPE_POINTER, realign + 1); - memcpy(data, realign, type->size); - return data; - } -} - -static int passed_by_ref(call_builder *cb, ffi_type *type, int var) { -#if ABI_FLEN - if (!var && type->type == FFI_TYPE_STRUCT) { - float_struct_info fsi = struct_passed_as_elements(cb, type); - if (fsi.as_elements) return 0; - } -#endif - - return type->size > 2 * __SIZEOF_POINTER__; -} - -/* Perform machine dependent cif processing */ -ffi_status ffi_prep_cif_machdep(ffi_cif *cif) { - cif->riscv_nfixedargs = cif->nargs; - return FFI_OK; -} - -/* Perform machine dependent cif processing when we have a variadic function */ - -ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif, unsigned int nfixedargs, unsigned int ntotalargs) { - cif->riscv_nfixedargs = nfixedargs; - return FFI_OK; -} - -/* Low level routine for calling functions */ -extern void ffi_call_asm (void *stack, struct call_context *regs, - void (*fn) (void), void *closure) FFI_HIDDEN; - -static void -ffi_call_int (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue, - void *closure) -{ - /* this is a conservative estimate, assuming a complex return value and - that all remaining arguments are long long / __int128 */ - size_t arg_bytes = cif->nargs <= 3 ? 0 : - FFI_ALIGN(2 * sizeof(size_t) * (cif->nargs - 3), STKALIGN); - size_t rval_bytes = 0; - if (rvalue == NULL && cif->rtype->size > 2*__SIZEOF_POINTER__) - rval_bytes = FFI_ALIGN(cif->rtype->size, STKALIGN); - size_t alloc_size = arg_bytes + rval_bytes + sizeof(call_context); - - /* the assembly code will deallocate all stack data at lower addresses - than the argument region, so we need to allocate the frame and the - return value after the arguments in a single allocation */ - size_t alloc_base; - /* Argument region must be 16-byte aligned */ - if (_Alignof(max_align_t) >= STKALIGN) { - /* since sizeof long double is normally 16, the compiler will - guarantee alloca alignment to at least that much */ - alloc_base = (size_t)alloca(alloc_size); - } else { - alloc_base = FFI_ALIGN(alloca(alloc_size + STKALIGN - 1), STKALIGN); - } - - if (rval_bytes) - rvalue = (void*)(alloc_base + arg_bytes); - - call_builder cb; - cb.used_float = cb.used_integer = 0; - cb.aregs = (call_context*)(alloc_base + arg_bytes + rval_bytes); - cb.used_stack = (void*)alloc_base; - - int return_by_ref = passed_by_ref(&cb, cif->rtype, 0); - if (return_by_ref) - marshal(&cb, &ffi_type_pointer, 0, &rvalue); - - int i; - for (i = 0; i < cif->nargs; i++) - marshal(&cb, cif->arg_types[i], i >= cif->riscv_nfixedargs, avalue[i]); - - ffi_call_asm ((void *) alloc_base, cb.aregs, fn, closure); - - cb.used_float = cb.used_integer = 0; - if (!return_by_ref && rvalue) - unmarshal(&cb, cif->rtype, 0, rvalue); -} - -void -ffi_call (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue) -{ - ffi_call_int(cif, fn, rvalue, avalue, NULL); -} - -void -ffi_call_go (ffi_cif *cif, void (*fn) (void), void *rvalue, - void **avalue, void *closure) -{ - ffi_call_int(cif, fn, rvalue, avalue, closure); -} - -extern void ffi_closure_asm(void) FFI_HIDDEN; - -ffi_status ffi_prep_closure_loc(ffi_closure *closure, ffi_cif *cif, void (*fun)(ffi_cif*,void*,void**,void*), void *user_data, void *codeloc) -{ - uint32_t *tramp = (uint32_t *) &closure->tramp[0]; - uint64_t fn = (uint64_t) (uintptr_t) ffi_closure_asm; - - if (cif->abi <= FFI_FIRST_ABI || cif->abi >= FFI_LAST_ABI) - return FFI_BAD_ABI; - - /* we will call ffi_closure_inner with codeloc, not closure, but as long - as the memory is readable it should work */ - - tramp[0] = 0x00000317; /* auipc t1, 0 (i.e. t0 <- codeloc) */ -#if __SIZEOF_POINTER__ == 8 - tramp[1] = 0x01033383; /* ld t2, 16(t1) */ -#else - tramp[1] = 0x01032383; /* lw t2, 16(t1) */ -#endif - tramp[2] = 0x00038067; /* jr t2 */ - tramp[3] = 0x00000013; /* nop */ - tramp[4] = fn; - tramp[5] = fn >> 32; - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - __builtin___clear_cache(codeloc, codeloc + FFI_TRAMPOLINE_SIZE); - - return FFI_OK; -} - -extern void ffi_go_closure_asm (void) FFI_HIDDEN; - -ffi_status -ffi_prep_go_closure (ffi_go_closure *closure, ffi_cif *cif, - void (*fun) (ffi_cif *, void *, void **, void *)) -{ - if (cif->abi <= FFI_FIRST_ABI || cif->abi >= FFI_LAST_ABI) - return FFI_BAD_ABI; - - closure->tramp = (void *) ffi_go_closure_asm; - closure->cif = cif; - closure->fun = fun; - - return FFI_OK; -} - -/* Called by the assembly code with aregs pointing to saved argument registers - and stack pointing to the stacked arguments. Return values passed in - registers will be reloaded from aregs. */ -void FFI_HIDDEN -ffi_closure_inner (ffi_cif *cif, - void (*fun) (ffi_cif *, void *, void **, void *), - void *user_data, - size_t *stack, call_context *aregs) -{ - void **avalue = alloca(cif->nargs * sizeof(void*)); - /* storage for arguments which will be copied by unmarshal(). We could - theoretically avoid the copies in many cases and use at most 128 bytes - of memory, but allocating disjoint storage for each argument is - simpler. */ - char *astorage = alloca(cif->nargs * MAXCOPYARG); - void *rvalue; - call_builder cb; - int return_by_ref; - int i; - - cb.aregs = aregs; - cb.used_integer = cb.used_float = 0; - cb.used_stack = stack; - - return_by_ref = passed_by_ref(&cb, cif->rtype, 0); - if (return_by_ref) - unmarshal(&cb, &ffi_type_pointer, 0, &rvalue); - else - rvalue = alloca(cif->rtype->size); - - for (i = 0; i < cif->nargs; i++) - avalue[i] = unmarshal(&cb, cif->arg_types[i], - i >= cif->riscv_nfixedargs, astorage + i*MAXCOPYARG); - - fun (cif, rvalue, avalue, user_data); - - if (!return_by_ref && cif->rtype->type != FFI_TYPE_VOID) { - cb.used_integer = cb.used_float = 0; - marshal(&cb, cif->rtype, 0, rvalue); - } -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/riscv/ffitarget.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/riscv/ffitarget.h deleted file mode 100644 index 75e6462..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/riscv/ffitarget.h +++ /dev/null @@ -1,69 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - 2014 Michael Knyszek - - Target configuration macros for RISC-V. - - 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. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#ifndef __riscv -#error "libffi was configured for a RISC-V target but this does not appear to be a RISC-V compiler." -#endif - -#ifndef LIBFFI_ASM - -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -/* FFI_UNUSED_NN and riscv_unused are to maintain ABI compatibility with a - distributed Berkeley patch from 2014, and can be removed at SONAME bump */ -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_SYSV, - FFI_UNUSED_1, - FFI_UNUSED_2, - FFI_UNUSED_3, - FFI_LAST_ABI, - - FFI_DEFAULT_ABI = FFI_SYSV -} ffi_abi; - -#endif /* LIBFFI_ASM */ - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_GO_CLOSURES 1 -#define FFI_TRAMPOLINE_SIZE 24 -#define FFI_NATIVE_RAW_API 0 -#define FFI_EXTRA_CIF_FIELDS unsigned riscv_nfixedargs; unsigned riscv_unused; -#define FFI_TARGET_SPECIFIC_VARIADIC - -#endif - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/riscv/sysv.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/riscv/sysv.S deleted file mode 100644 index 522d0b0..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/riscv/sysv.S +++ /dev/null @@ -1,293 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2015 Michael Knyszek - 2015 Andrew Waterman - 2018 Stef O'Rear - - RISC-V Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include - -/* Define aliases so that we can handle all ABIs uniformly */ - -#if __SIZEOF_POINTER__ == 8 -#define PTRS 8 -#define LARG ld -#define SARG sd -#else -#define PTRS 4 -#define LARG lw -#define SARG sw -#endif - -#if __riscv_float_abi_double -#define FLTS 8 -#define FLARG fld -#define FSARG fsd -#elif __riscv_float_abi_single -#define FLTS 4 -#define FLARG flw -#define FSARG fsw -#else -#define FLTS 0 -#endif - -#define fp s0 - - .text - .globl ffi_call_asm - .type ffi_call_asm, @function - .hidden ffi_call_asm -/* - struct call_context { - floatreg fa[8]; - intreg a[8]; - intreg pad[rv32 ? 2 : 0]; - intreg save_fp, save_ra; - } - void ffi_call_asm (size_t *stackargs, struct call_context *regargs, - void (*fn) (void), void *closure); -*/ - -#define FRAME_LEN (8 * FLTS + 8 * PTRS + 16) - -ffi_call_asm: - .cfi_startproc - - /* - We are NOT going to set up an ordinary stack frame. In order to pass - the stacked args to the called function, we adjust our stack pointer to - a0, which is in the _caller's_ alloca area. We establish our own stack - frame at the end of the call_context. - - Anything below the arguments will be freed at this point, although we - preserve the call_context so that it can be read back in the caller. - */ - - .cfi_def_cfa 11, FRAME_LEN # interim CFA based on a1 - SARG fp, FRAME_LEN - 2*PTRS(a1) - .cfi_offset 8, -2*PTRS - SARG ra, FRAME_LEN - 1*PTRS(a1) - .cfi_offset 1, -1*PTRS - - addi fp, a1, FRAME_LEN - mv sp, a0 - .cfi_def_cfa 8, 0 # our frame is fully set up - - # Load arguments - mv t1, a2 - mv t2, a3 - -#if FLTS - FLARG fa0, -FRAME_LEN+0*FLTS(fp) - FLARG fa1, -FRAME_LEN+1*FLTS(fp) - FLARG fa2, -FRAME_LEN+2*FLTS(fp) - FLARG fa3, -FRAME_LEN+3*FLTS(fp) - FLARG fa4, -FRAME_LEN+4*FLTS(fp) - FLARG fa5, -FRAME_LEN+5*FLTS(fp) - FLARG fa6, -FRAME_LEN+6*FLTS(fp) - FLARG fa7, -FRAME_LEN+7*FLTS(fp) -#endif - - LARG a0, -FRAME_LEN+8*FLTS+0*PTRS(fp) - LARG a1, -FRAME_LEN+8*FLTS+1*PTRS(fp) - LARG a2, -FRAME_LEN+8*FLTS+2*PTRS(fp) - LARG a3, -FRAME_LEN+8*FLTS+3*PTRS(fp) - LARG a4, -FRAME_LEN+8*FLTS+4*PTRS(fp) - LARG a5, -FRAME_LEN+8*FLTS+5*PTRS(fp) - LARG a6, -FRAME_LEN+8*FLTS+6*PTRS(fp) - LARG a7, -FRAME_LEN+8*FLTS+7*PTRS(fp) - - /* Call */ - jalr t1 - - /* Save return values - only a0/a1 (fa0/fa1) are used */ -#if FLTS - FSARG fa0, -FRAME_LEN+0*FLTS(fp) - FSARG fa1, -FRAME_LEN+1*FLTS(fp) -#endif - - SARG a0, -FRAME_LEN+8*FLTS+0*PTRS(fp) - SARG a1, -FRAME_LEN+8*FLTS+1*PTRS(fp) - - /* Restore and return */ - addi sp, fp, -FRAME_LEN - .cfi_def_cfa 2, FRAME_LEN - LARG ra, -1*PTRS(fp) - .cfi_restore 1 - LARG fp, -2*PTRS(fp) - .cfi_restore 8 - ret - .cfi_endproc - .size ffi_call_asm, .-ffi_call_asm - - -/* - ffi_closure_asm. Expects address of the passed-in ffi_closure in t1. - void ffi_closure_inner (ffi_cif *cif, - void (*fun) (ffi_cif *, void *, void **, void *), - void *user_data, - size_t *stackargs, struct call_context *regargs) -*/ - - .globl ffi_closure_asm - .hidden ffi_closure_asm - .type ffi_closure_asm, @function -ffi_closure_asm: - .cfi_startproc - - addi sp, sp, -FRAME_LEN - .cfi_def_cfa_offset FRAME_LEN - - /* make a frame */ - SARG fp, FRAME_LEN - 2*PTRS(sp) - .cfi_offset 8, -2*PTRS - SARG ra, FRAME_LEN - 1*PTRS(sp) - .cfi_offset 1, -1*PTRS - addi fp, sp, FRAME_LEN - - /* save arguments */ -#if FLTS - FSARG fa0, 0*FLTS(sp) - FSARG fa1, 1*FLTS(sp) - FSARG fa2, 2*FLTS(sp) - FSARG fa3, 3*FLTS(sp) - FSARG fa4, 4*FLTS(sp) - FSARG fa5, 5*FLTS(sp) - FSARG fa6, 6*FLTS(sp) - FSARG fa7, 7*FLTS(sp) -#endif - - SARG a0, 8*FLTS+0*PTRS(sp) - SARG a1, 8*FLTS+1*PTRS(sp) - SARG a2, 8*FLTS+2*PTRS(sp) - SARG a3, 8*FLTS+3*PTRS(sp) - SARG a4, 8*FLTS+4*PTRS(sp) - SARG a5, 8*FLTS+5*PTRS(sp) - SARG a6, 8*FLTS+6*PTRS(sp) - SARG a7, 8*FLTS+7*PTRS(sp) - - /* enter C */ - LARG a0, FFI_TRAMPOLINE_SIZE+0*PTRS(t1) - LARG a1, FFI_TRAMPOLINE_SIZE+1*PTRS(t1) - LARG a2, FFI_TRAMPOLINE_SIZE+2*PTRS(t1) - addi a3, sp, FRAME_LEN - mv a4, sp - - call ffi_closure_inner - - /* return values */ -#if FLTS - FLARG fa0, 0*FLTS(sp) - FLARG fa1, 1*FLTS(sp) -#endif - - LARG a0, 8*FLTS+0*PTRS(sp) - LARG a1, 8*FLTS+1*PTRS(sp) - - /* restore and return */ - LARG ra, FRAME_LEN-1*PTRS(sp) - .cfi_restore 1 - LARG fp, FRAME_LEN-2*PTRS(sp) - .cfi_restore 8 - addi sp, sp, FRAME_LEN - .cfi_def_cfa_offset 0 - ret - .cfi_endproc - .size ffi_closure_asm, .-ffi_closure_asm - -/* - ffi_go_closure_asm. Expects address of the passed-in ffi_go_closure in t2. - void ffi_closure_inner (ffi_cif *cif, - void (*fun) (ffi_cif *, void *, void **, void *), - void *user_data, - size_t *stackargs, struct call_context *regargs) -*/ - - .globl ffi_go_closure_asm - .hidden ffi_go_closure_asm - .type ffi_go_closure_asm, @function -ffi_go_closure_asm: - .cfi_startproc - - addi sp, sp, -FRAME_LEN - .cfi_def_cfa_offset FRAME_LEN - - /* make a frame */ - SARG fp, FRAME_LEN - 2*PTRS(sp) - .cfi_offset 8, -2*PTRS - SARG ra, FRAME_LEN - 1*PTRS(sp) - .cfi_offset 1, -1*PTRS - addi fp, sp, FRAME_LEN - - /* save arguments */ -#if FLTS - FSARG fa0, 0*FLTS(sp) - FSARG fa1, 1*FLTS(sp) - FSARG fa2, 2*FLTS(sp) - FSARG fa3, 3*FLTS(sp) - FSARG fa4, 4*FLTS(sp) - FSARG fa5, 5*FLTS(sp) - FSARG fa6, 6*FLTS(sp) - FSARG fa7, 7*FLTS(sp) -#endif - - SARG a0, 8*FLTS+0*PTRS(sp) - SARG a1, 8*FLTS+1*PTRS(sp) - SARG a2, 8*FLTS+2*PTRS(sp) - SARG a3, 8*FLTS+3*PTRS(sp) - SARG a4, 8*FLTS+4*PTRS(sp) - SARG a5, 8*FLTS+5*PTRS(sp) - SARG a6, 8*FLTS+6*PTRS(sp) - SARG a7, 8*FLTS+7*PTRS(sp) - - /* enter C */ - LARG a0, 1*PTRS(t2) - LARG a1, 2*PTRS(t2) - mv a2, t2 - addi a3, sp, FRAME_LEN - mv a4, sp - - call ffi_closure_inner - - /* return values */ -#if FLTS - FLARG fa0, 0*FLTS(sp) - FLARG fa1, 1*FLTS(sp) -#endif - - LARG a0, 8*FLTS+0*PTRS(sp) - LARG a1, 8*FLTS+1*PTRS(sp) - - /* restore and return */ - LARG ra, FRAME_LEN-1*PTRS(sp) - .cfi_restore 1 - LARG fp, FRAME_LEN-2*PTRS(sp) - .cfi_restore 8 - addi sp, sp, FRAME_LEN - .cfi_def_cfa_offset 0 - ret - .cfi_endproc - .size ffi_go_closure_asm, .-ffi_go_closure_asm diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/s390/ffi.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/s390/ffi.c deleted file mode 100644 index 4035b6e..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/s390/ffi.c +++ /dev/null @@ -1,756 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2000, 2007 Software AG - Copyright (c) 2008 Red Hat, Inc - - S390 Foreign Function Interface - - 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 AUTHOR 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. - ----------------------------------------------------------------------- */ -/*====================================================================*/ -/* Includes */ -/* -------- */ -/*====================================================================*/ - -#include -#include -#include -#include "internal.h" - -/*====================== End of Includes =============================*/ - -/*====================================================================*/ -/* Defines */ -/* ------- */ -/*====================================================================*/ - -/* Maximum number of GPRs available for argument passing. */ -#define MAX_GPRARGS 5 - -/* Maximum number of FPRs available for argument passing. */ -#ifdef __s390x__ -#define MAX_FPRARGS 4 -#else -#define MAX_FPRARGS 2 -#endif - -/* Round to multiple of 16. */ -#define ROUND_SIZE(size) (((size) + 15) & ~15) - -/*===================== End of Defines ===============================*/ - -/*====================================================================*/ -/* Externals */ -/* --------- */ -/*====================================================================*/ - -struct call_frame -{ - void *back_chain; - void *eos; - unsigned long gpr_args[5]; - unsigned long gpr_save[9]; - unsigned long long fpr_args[4]; -}; - -extern void FFI_HIDDEN ffi_call_SYSV(struct call_frame *, unsigned, void *, - void (*fn)(void), void *); - -extern void ffi_closure_SYSV(void); -extern void ffi_go_closure_SYSV(void); - -/*====================== End of Externals ============================*/ - -/*====================================================================*/ -/* */ -/* Name - ffi_check_struct_type. */ -/* */ -/* Function - Determine if a structure can be passed within a */ -/* general purpose or floating point register. */ -/* */ -/*====================================================================*/ - -static int -ffi_check_struct_type (ffi_type *arg) -{ - size_t size = arg->size; - - /* If the struct has just one element, look at that element - to find out whether to consider the struct as floating point. */ - while (arg->type == FFI_TYPE_STRUCT - && arg->elements[0] && !arg->elements[1]) - arg = arg->elements[0]; - - /* Structs of size 1, 2, 4, and 8 are passed in registers, - just like the corresponding int/float types. */ - switch (size) - { - case 1: - return FFI_TYPE_UINT8; - - case 2: - return FFI_TYPE_UINT16; - - case 4: - if (arg->type == FFI_TYPE_FLOAT) - return FFI_TYPE_FLOAT; - else - return FFI_TYPE_UINT32; - - case 8: - if (arg->type == FFI_TYPE_DOUBLE) - return FFI_TYPE_DOUBLE; - else - return FFI_TYPE_UINT64; - - default: - break; - } - - /* Other structs are passed via a pointer to the data. */ - return FFI_TYPE_POINTER; -} - -/*======================== End of Routine ============================*/ - -/*====================================================================*/ -/* */ -/* Name - ffi_prep_cif_machdep. */ -/* */ -/* Function - Perform machine dependent CIF processing. */ -/* */ -/*====================================================================*/ - -ffi_status FFI_HIDDEN -ffi_prep_cif_machdep(ffi_cif *cif) -{ - size_t struct_size = 0; - int n_gpr = 0; - int n_fpr = 0; - int n_ov = 0; - - ffi_type **ptr; - int i; - - /* Determine return value handling. */ - - switch (cif->rtype->type) - { - /* Void is easy. */ - case FFI_TYPE_VOID: - cif->flags = FFI390_RET_VOID; - break; - - /* Structures and complex are returned via a hidden pointer. */ - case FFI_TYPE_STRUCT: - case FFI_TYPE_COMPLEX: - cif->flags = FFI390_RET_STRUCT; - n_gpr++; /* We need one GPR to pass the pointer. */ - break; - - /* Floating point values are returned in fpr 0. */ - case FFI_TYPE_FLOAT: - cif->flags = FFI390_RET_FLOAT; - break; - - case FFI_TYPE_DOUBLE: - cif->flags = FFI390_RET_DOUBLE; - break; - -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - cif->flags = FFI390_RET_STRUCT; - n_gpr++; - break; -#endif - /* Integer values are returned in gpr 2 (and gpr 3 - for 64-bit values on 31-bit machines). */ - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - cif->flags = FFI390_RET_INT64; - break; - - case FFI_TYPE_POINTER: - case FFI_TYPE_INT: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT8: - /* These are to be extended to word size. */ -#ifdef __s390x__ - cif->flags = FFI390_RET_INT64; -#else - cif->flags = FFI390_RET_INT32; -#endif - break; - - default: - FFI_ASSERT (0); - break; - } - - /* Now for the arguments. */ - - for (ptr = cif->arg_types, i = cif->nargs; - i > 0; - i--, ptr++) - { - int type = (*ptr)->type; - -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - /* 16-byte long double is passed like a struct. */ - if (type == FFI_TYPE_LONGDOUBLE) - type = FFI_TYPE_STRUCT; -#endif - - /* Check how a structure type is passed. */ - if (type == FFI_TYPE_STRUCT || type == FFI_TYPE_COMPLEX) - { - if (type == FFI_TYPE_COMPLEX) - type = FFI_TYPE_POINTER; - else - type = ffi_check_struct_type (*ptr); - - /* If we pass the struct via pointer, we must reserve space - to copy its data for proper call-by-value semantics. */ - if (type == FFI_TYPE_POINTER) - struct_size += ROUND_SIZE ((*ptr)->size); - } - - /* Now handle all primitive int/float data types. */ - switch (type) - { - /* The first MAX_FPRARGS floating point arguments - go in FPRs, the rest overflow to the stack. */ - - case FFI_TYPE_DOUBLE: - if (n_fpr < MAX_FPRARGS) - n_fpr++; - else - n_ov += sizeof (double) / sizeof (long); - break; - - case FFI_TYPE_FLOAT: - if (n_fpr < MAX_FPRARGS) - n_fpr++; - else - n_ov++; - break; - - /* On 31-bit machines, 64-bit integers are passed in GPR pairs, - if one is still available, or else on the stack. If only one - register is free, skip the register (it won't be used for any - subsequent argument either). */ - -#ifndef __s390x__ - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - if (n_gpr == MAX_GPRARGS-1) - n_gpr = MAX_GPRARGS; - if (n_gpr < MAX_GPRARGS) - n_gpr += 2; - else - n_ov += 2; - break; -#endif - - /* Everything else is passed in GPRs (until MAX_GPRARGS - have been used) or overflows to the stack. */ - - default: - if (n_gpr < MAX_GPRARGS) - n_gpr++; - else - n_ov++; - break; - } - } - - /* Total stack space as required for overflow arguments - and temporary structure copies. */ - - cif->bytes = ROUND_SIZE (n_ov * sizeof (long)) + struct_size; - - return FFI_OK; -} - -/*======================== End of Routine ============================*/ - -/*====================================================================*/ -/* */ -/* Name - ffi_call. */ -/* */ -/* Function - Call the FFI routine. */ -/* */ -/*====================================================================*/ - -static void -ffi_call_int(ffi_cif *cif, - void (*fn)(void), - void *rvalue, - void **avalue, - void *closure) -{ - int ret_type = cif->flags; - size_t rsize = 0, bytes = cif->bytes; - unsigned char *stack, *p_struct; - struct call_frame *frame; - unsigned long *p_ov, *p_gpr; - unsigned long long *p_fpr; - int n_fpr, n_gpr, n_ov, i, n; - ffi_type **arg_types; - - FFI_ASSERT (cif->abi == FFI_SYSV); - - /* If we don't have a return value, we need to fake one. */ - if (rvalue == NULL) - { - if (ret_type & FFI390_RET_IN_MEM) - rsize = cif->rtype->size; - else - ret_type = FFI390_RET_VOID; - } - - /* The stack space will be filled with those areas: - - dummy structure return (highest addresses) - FPR argument register save area - GPR argument register save area - stack frame for ffi_call_SYSV - temporary struct copies - overflow argument area (lowest addresses) - - We set up the following pointers: - - p_fpr: bottom of the FPR area (growing upwards) - p_gpr: bottom of the GPR area (growing upwards) - p_ov: bottom of the overflow area (growing upwards) - p_struct: top of the struct copy area (growing downwards) - - All areas are kept aligned to twice the word size. - - Note that we're going to create the stack frame for both - ffi_call_SYSV _and_ the target function right here. This - works because we don't make any function calls with more - than 5 arguments (indeed only memcpy and ffi_call_SYSV), - and thus we don't have any stacked outgoing parameters. */ - - stack = alloca (bytes + sizeof(struct call_frame) + rsize); - frame = (struct call_frame *)(stack + bytes); - if (rsize) - rvalue = frame + 1; - - /* Link the new frame back to the one from this function. */ - frame->back_chain = __builtin_frame_address (0); - - /* Fill in all of the argument stuff. */ - p_ov = (unsigned long *)stack; - p_struct = (unsigned char *)frame; - p_gpr = frame->gpr_args; - p_fpr = frame->fpr_args; - n_fpr = n_gpr = n_ov = 0; - - /* If we returning a structure then we set the first parameter register - to the address of where we are returning this structure. */ - if (cif->flags & FFI390_RET_IN_MEM) - p_gpr[n_gpr++] = (uintptr_t) rvalue; - - /* Now for the arguments. */ - arg_types = cif->arg_types; - for (i = 0, n = cif->nargs; i < n; ++i) - { - ffi_type *ty = arg_types[i]; - void *arg = avalue[i]; - int type = ty->type; - ffi_arg val; - - restart: - switch (type) - { - case FFI_TYPE_SINT8: - val = *(SINT8 *)arg; - goto do_int; - case FFI_TYPE_UINT8: - val = *(UINT8 *)arg; - goto do_int; - case FFI_TYPE_SINT16: - val = *(SINT16 *)arg; - goto do_int; - case FFI_TYPE_UINT16: - val = *(UINT16 *)arg; - goto do_int; - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: - val = *(SINT32 *)arg; - goto do_int; - case FFI_TYPE_UINT32: - val = *(UINT32 *)arg; - goto do_int; - case FFI_TYPE_POINTER: - val = *(uintptr_t *)arg; - do_int: - *(n_gpr < MAX_GPRARGS ? p_gpr + n_gpr++ : p_ov + n_ov++) = val; - break; - - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: -#ifdef __s390x__ - val = *(UINT64 *)arg; - goto do_int; -#else - if (n_gpr == MAX_GPRARGS-1) - n_gpr = MAX_GPRARGS; - if (n_gpr < MAX_GPRARGS) - p_gpr[n_gpr++] = ((UINT32 *) arg)[0], - p_gpr[n_gpr++] = ((UINT32 *) arg)[1]; - else - p_ov[n_ov++] = ((UINT32 *) arg)[0], - p_ov[n_ov++] = ((UINT32 *) arg)[1]; -#endif - break; - - case FFI_TYPE_DOUBLE: - if (n_fpr < MAX_FPRARGS) - p_fpr[n_fpr++] = *(UINT64 *) arg; - else - { -#ifdef __s390x__ - p_ov[n_ov++] = *(UINT64 *) arg; -#else - p_ov[n_ov++] = ((UINT32 *) arg)[0], - p_ov[n_ov++] = ((UINT32 *) arg)[1]; -#endif - } - break; - - case FFI_TYPE_FLOAT: - val = *(UINT32 *)arg; - if (n_fpr < MAX_FPRARGS) - p_fpr[n_fpr++] = (UINT64)val << 32; - else - p_ov[n_ov++] = val; - break; - - case FFI_TYPE_STRUCT: - /* Check how a structure type is passed. */ - type = ffi_check_struct_type (ty); - /* Some structures are passed via a type they contain. */ - if (type != FFI_TYPE_POINTER) - goto restart; - /* ... otherwise, passed by reference. fallthru. */ - -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - /* 16-byte long double is passed via reference. */ -#endif - case FFI_TYPE_COMPLEX: - /* Complex types are passed via reference. */ - p_struct -= ROUND_SIZE (ty->size); - memcpy (p_struct, arg, ty->size); - val = (uintptr_t)p_struct; - goto do_int; - - default: - FFI_ASSERT (0); - break; - } - } - - ffi_call_SYSV (frame, ret_type & FFI360_RET_MASK, rvalue, fn, closure); -} - -void -ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - ffi_call_int(cif, fn, rvalue, avalue, NULL); -} - -void -ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue, - void **avalue, void *closure) -{ - ffi_call_int(cif, fn, rvalue, avalue, closure); -} - -/*======================== End of Routine ============================*/ - -/*====================================================================*/ -/* */ -/* Name - ffi_closure_helper_SYSV. */ -/* */ -/* Function - Call a FFI closure target function. */ -/* */ -/*====================================================================*/ - -void FFI_HIDDEN -ffi_closure_helper_SYSV (ffi_cif *cif, - void (*fun)(ffi_cif*,void*,void**,void*), - void *user_data, - unsigned long *p_gpr, - unsigned long long *p_fpr, - unsigned long *p_ov) -{ - unsigned long long ret_buffer; - - void *rvalue = &ret_buffer; - void **avalue; - void **p_arg; - - int n_gpr = 0; - int n_fpr = 0; - int n_ov = 0; - - ffi_type **ptr; - int i; - - /* Allocate buffer for argument list pointers. */ - p_arg = avalue = alloca (cif->nargs * sizeof (void *)); - - /* If we returning a structure, pass the structure address - directly to the target function. Otherwise, have the target - function store the return value to the GPR save area. */ - if (cif->flags & FFI390_RET_IN_MEM) - rvalue = (void *) p_gpr[n_gpr++]; - - /* Now for the arguments. */ - for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, p_arg++, ptr++) - { - int deref_struct_pointer = 0; - int type = (*ptr)->type; - -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - /* 16-byte long double is passed like a struct. */ - if (type == FFI_TYPE_LONGDOUBLE) - type = FFI_TYPE_STRUCT; -#endif - - /* Check how a structure type is passed. */ - if (type == FFI_TYPE_STRUCT || type == FFI_TYPE_COMPLEX) - { - if (type == FFI_TYPE_COMPLEX) - type = FFI_TYPE_POINTER; - else - type = ffi_check_struct_type (*ptr); - - /* If we pass the struct via pointer, remember to - retrieve the pointer later. */ - if (type == FFI_TYPE_POINTER) - deref_struct_pointer = 1; - } - - /* Pointers are passed like UINTs of the same size. */ - if (type == FFI_TYPE_POINTER) - { -#ifdef __s390x__ - type = FFI_TYPE_UINT64; -#else - type = FFI_TYPE_UINT32; -#endif - } - - /* Now handle all primitive int/float data types. */ - switch (type) - { - case FFI_TYPE_DOUBLE: - if (n_fpr < MAX_FPRARGS) - *p_arg = &p_fpr[n_fpr++]; - else - *p_arg = &p_ov[n_ov], - n_ov += sizeof (double) / sizeof (long); - break; - - case FFI_TYPE_FLOAT: - if (n_fpr < MAX_FPRARGS) - *p_arg = &p_fpr[n_fpr++]; - else - *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 4; - break; - - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: -#ifdef __s390x__ - if (n_gpr < MAX_GPRARGS) - *p_arg = &p_gpr[n_gpr++]; - else - *p_arg = &p_ov[n_ov++]; -#else - if (n_gpr == MAX_GPRARGS-1) - n_gpr = MAX_GPRARGS; - if (n_gpr < MAX_GPRARGS) - *p_arg = &p_gpr[n_gpr], n_gpr += 2; - else - *p_arg = &p_ov[n_ov], n_ov += 2; -#endif - break; - - case FFI_TYPE_INT: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - if (n_gpr < MAX_GPRARGS) - *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 4; - else - *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 4; - break; - - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT16: - if (n_gpr < MAX_GPRARGS) - *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 2; - else - *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 2; - break; - - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT8: - if (n_gpr < MAX_GPRARGS) - *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 1; - else - *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 1; - break; - - default: - FFI_ASSERT (0); - break; - } - - /* If this is a struct passed via pointer, we need to - actually retrieve that pointer. */ - if (deref_struct_pointer) - *p_arg = *(void **)*p_arg; - } - - - /* Call the target function. */ - (fun) (cif, rvalue, avalue, user_data); - - /* Convert the return value. */ - switch (cif->rtype->type) - { - /* Void is easy, and so is struct. */ - case FFI_TYPE_VOID: - case FFI_TYPE_STRUCT: - case FFI_TYPE_COMPLEX: -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: -#endif - break; - - /* Floating point values are returned in fpr 0. */ - case FFI_TYPE_FLOAT: - p_fpr[0] = (long long) *(unsigned int *) rvalue << 32; - break; - - case FFI_TYPE_DOUBLE: - p_fpr[0] = *(unsigned long long *) rvalue; - break; - - /* Integer values are returned in gpr 2 (and gpr 3 - for 64-bit values on 31-bit machines). */ - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: -#ifdef __s390x__ - p_gpr[0] = *(unsigned long *) rvalue; -#else - p_gpr[0] = ((unsigned long *) rvalue)[0], - p_gpr[1] = ((unsigned long *) rvalue)[1]; -#endif - break; - - case FFI_TYPE_POINTER: - case FFI_TYPE_UINT32: - case FFI_TYPE_UINT16: - case FFI_TYPE_UINT8: - p_gpr[0] = *(unsigned long *) rvalue; - break; - - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: - case FFI_TYPE_SINT16: - case FFI_TYPE_SINT8: - p_gpr[0] = *(signed long *) rvalue; - break; - - default: - FFI_ASSERT (0); - break; - } -} - -/*======================== End of Routine ============================*/ - -/*====================================================================*/ -/* */ -/* Name - ffi_prep_closure_loc. */ -/* */ -/* Function - Prepare a FFI closure. */ -/* */ -/*====================================================================*/ - -ffi_status -ffi_prep_closure_loc (ffi_closure *closure, - ffi_cif *cif, - void (*fun) (ffi_cif *, void *, void **, void *), - void *user_data, - void *codeloc) -{ - static unsigned short const template[] = { - 0x0d10, /* basr %r1,0 */ -#ifndef __s390x__ - 0x9801, 0x1006, /* lm %r0,%r1,6(%r1) */ -#else - 0xeb01, 0x100e, 0x0004, /* lmg %r0,%r1,14(%r1) */ -#endif - 0x07f1 /* br %r1 */ - }; - - unsigned long *tramp = (unsigned long *)&closure->tramp; - - if (cif->abi != FFI_SYSV) - return FFI_BAD_ABI; - - memcpy (tramp, template, sizeof(template)); - tramp[2] = (unsigned long)codeloc; - tramp[3] = (unsigned long)&ffi_closure_SYSV; - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - return FFI_OK; -} - -/*======================== End of Routine ============================*/ - -/* Build a Go language closure. */ - -ffi_status -ffi_prep_go_closure (ffi_go_closure *closure, ffi_cif *cif, - void (*fun)(ffi_cif*,void*,void**,void*)) -{ - if (cif->abi != FFI_SYSV) - return FFI_BAD_ABI; - - closure->tramp = ffi_go_closure_SYSV; - closure->cif = cif; - closure->fun = fun; - - return FFI_OK; -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/s390/ffitarget.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/s390/ffitarget.h deleted file mode 100644 index d8a4ee4..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/s390/ffitarget.h +++ /dev/null @@ -1,70 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - Copyright (c) 1996-2003 Red Hat, Inc. - Target configuration macros for S390. - - 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. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#if defined (__s390x__) -#ifndef S390X -#define S390X -#endif -#endif - -/* ---- System specific configurations ----------------------------------- */ - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_SYSV, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_SYSV -} ffi_abi; -#endif - -#define FFI_TARGET_SPECIFIC_STACK_SPACE_ALLOCATION -#define FFI_TARGET_HAS_COMPLEX_TYPE - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_GO_CLOSURES 1 -#ifdef S390X -#define FFI_TRAMPOLINE_SIZE 32 -#else -#define FFI_TRAMPOLINE_SIZE 16 -#endif -#define FFI_NATIVE_RAW_API 0 - -#endif - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/s390/internal.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/s390/internal.h deleted file mode 100644 index b875578..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/s390/internal.h +++ /dev/null @@ -1,11 +0,0 @@ -/* If these values change, sysv.S must be adapted! */ -#define FFI390_RET_DOUBLE 0 -#define FFI390_RET_FLOAT 1 -#define FFI390_RET_INT64 2 -#define FFI390_RET_INT32 3 -#define FFI390_RET_VOID 4 - -#define FFI360_RET_MASK 7 -#define FFI390_RET_IN_MEM 8 - -#define FFI390_RET_STRUCT (FFI390_RET_VOID | FFI390_RET_IN_MEM) diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/s390/sysv.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/s390/sysv.S deleted file mode 100644 index c4b5006..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/s390/sysv.S +++ /dev/null @@ -1,325 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.S - Copyright (c) 2000 Software AG - Copyright (c) 2008 Red Hat, Inc. - - S390 Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include - - .text - -#ifndef __s390x__ - - # r2: frame - # r3: ret_type - # r4: ret_addr - # r5: fun - # r6: closure - - # This assumes we are using gas. - .balign 8 - .globl ffi_call_SYSV - FFI_HIDDEN(ffi_call_SYSV) - .type ffi_call_SYSV,%function -ffi_call_SYSV: - .cfi_startproc - st %r6,44(%r2) # Save registers - stm %r12,%r14,48(%r2) - lr %r13,%r2 # Install frame pointer - .cfi_rel_offset r6, 44 - .cfi_rel_offset r12, 48 - .cfi_rel_offset r13, 52 - .cfi_rel_offset r14, 56 - .cfi_def_cfa_register r13 - st %r2,0(%r15) # Set up back chain - sla %r3,3 # ret_type *= 8 - lr %r12,%r4 # Save ret_addr - lr %r1,%r5 # Save fun - lr %r0,%r6 # Install static chain - - # Set return address, so that there is only one indirect jump. -#ifdef HAVE_AS_S390_ZARCH - larl %r14,.Ltable - ar %r14,%r3 -#else - basr %r14,0 -0: la %r14,.Ltable-0b(%r14,%r3) -#endif - - lm %r2,%r6,8(%r13) # Load arguments - ld %f0,64(%r13) - ld %f2,72(%r13) - br %r1 # ... and call function - - .balign 8 -.Ltable: -# FFI390_RET_DOUBLE - std %f0,0(%r12) - j .Ldone - - .balign 8 -# FFI390_RET_FLOAT - ste %f0,0(%r12) - j .Ldone - - .balign 8 -# FFI390_RET_INT64 - st %r3,4(%r12) - nop - # fallthru - - .balign 8 -# FFI390_RET_INT32 - st %r2,0(%r12) - nop - # fallthru - - .balign 8 -# FFI390_RET_VOID -.Ldone: - l %r14,56(%r13) - l %r12,48(%r13) - l %r6,44(%r13) - l %r13,52(%r13) - .cfi_restore 14 - .cfi_restore 13 - .cfi_restore 12 - .cfi_restore 6 - .cfi_def_cfa r15, 96 - br %r14 - .cfi_endproc - .size ffi_call_SYSV,.-ffi_call_SYSV - - - .balign 8 - .globl ffi_go_closure_SYSV - FFI_HIDDEN(ffi_go_closure_SYSV) - .type ffi_go_closure_SYSV,%function -ffi_go_closure_SYSV: - .cfi_startproc - stm %r2,%r6,8(%r15) # Save arguments - lr %r4,%r0 # Load closure -> user_data - l %r2,4(%r4) # ->cif - l %r3,8(%r4) # ->fun - j .Ldoclosure - .cfi_endproc - - .balign 8 - .globl ffi_closure_SYSV - FFI_HIDDEN(ffi_closure_SYSV) - .type ffi_closure_SYSV,%function -ffi_closure_SYSV: - .cfi_startproc - stm %r2,%r6,8(%r15) # Save arguments - lr %r4,%r0 # Closure - l %r2,16(%r4) # ->cif - l %r3,20(%r4) # ->fun - l %r4,24(%r4) # ->user_data -.Ldoclosure: - stm %r12,%r15,48(%r15) # Save registers - lr %r12,%r15 - .cfi_def_cfa_register r12 - .cfi_rel_offset r6, 24 - .cfi_rel_offset r12, 48 - .cfi_rel_offset r13, 52 - .cfi_rel_offset r14, 56 - .cfi_rel_offset r15, 60 -#ifndef HAVE_AS_S390_ZARCH - basr %r13,0 # Set up base register -.Lcbase: - l %r1,.Lchelper-.Lcbase(%r13) # Get helper function -#endif - ahi %r15,-96-8 # Set up stack frame - st %r12,0(%r15) # Set up back chain - - std %f0,64(%r12) # Save fp arguments - std %f2,72(%r12) - - la %r5,96(%r12) # Overflow - st %r5,96(%r15) - la %r6,64(%r12) # FPRs - la %r5,8(%r12) # GPRs -#ifdef HAVE_AS_S390_ZARCH - brasl %r14,ffi_closure_helper_SYSV -#else - bas %r14,0(%r1,%r13) # Call helper -#endif - - lr %r15,%r12 - .cfi_def_cfa_register r15 - lm %r12,%r14,48(%r12) # Restore saved registers - l %r6,24(%r15) - ld %f0,64(%r15) # Load return registers - lm %r2,%r3,8(%r15) - br %r14 - .cfi_endproc - -#ifndef HAVE_AS_S390_ZARCH - .align 4 -.Lchelper: - .long ffi_closure_helper_SYSV-.Lcbase -#endif - - .size ffi_closure_SYSV,.-ffi_closure_SYSV - -#else - - # r2: frame - # r3: ret_type - # r4: ret_addr - # r5: fun - # r6: closure - - # This assumes we are using gas. - .balign 8 - .globl ffi_call_SYSV - FFI_HIDDEN(ffi_call_SYSV) - .type ffi_call_SYSV,%function -ffi_call_SYSV: - .cfi_startproc - stg %r6,88(%r2) # Save registers - stmg %r12,%r14,96(%r2) - lgr %r13,%r2 # Install frame pointer - .cfi_rel_offset r6, 88 - .cfi_rel_offset r12, 96 - .cfi_rel_offset r13, 104 - .cfi_rel_offset r14, 112 - .cfi_def_cfa_register r13 - stg %r2,0(%r15) # Set up back chain - larl %r14,.Ltable # Set up return address - slag %r3,%r3,3 # ret_type *= 8 - lgr %r12,%r4 # Save ret_addr - lgr %r1,%r5 # Save fun - lgr %r0,%r6 # Install static chain - agr %r14,%r3 - lmg %r2,%r6,16(%r13) # Load arguments - ld %f0,128(%r13) - ld %f2,136(%r13) - ld %f4,144(%r13) - ld %f6,152(%r13) - br %r1 # ... and call function - - .balign 8 -.Ltable: -# FFI390_RET_DOUBLE - std %f0,0(%r12) - j .Ldone - - .balign 8 -# FFI390_RET_DOUBLE - ste %f0,0(%r12) - j .Ldone - - .balign 8 -# FFI390_RET_INT64 - stg %r2,0(%r12) - - .balign 8 -# FFI390_RET_INT32 - # Never used, as we always store type ffi_arg. - # But the stg above is 6 bytes and we cannot - # jump around this case, so fall through. - nop - nop - - .balign 8 -# FFI390_RET_VOID -.Ldone: - lg %r14,112(%r13) - lg %r12,96(%r13) - lg %r6,88(%r13) - lg %r13,104(%r13) - .cfi_restore r14 - .cfi_restore r13 - .cfi_restore r12 - .cfi_restore r6 - .cfi_def_cfa r15, 160 - br %r14 - .cfi_endproc - .size ffi_call_SYSV,.-ffi_call_SYSV - - - .balign 8 - .globl ffi_go_closure_SYSV - FFI_HIDDEN(ffi_go_closure_SYSV) - .type ffi_go_closure_SYSV,%function -ffi_go_closure_SYSV: - .cfi_startproc - stmg %r2,%r6,16(%r15) # Save arguments - lgr %r4,%r0 # Load closure -> user_data - lg %r2,8(%r4) # ->cif - lg %r3,16(%r4) # ->fun - j .Ldoclosure - .cfi_endproc - .size ffi_go_closure_SYSV,.-ffi_go_closure_SYSV - - - .balign 8 - .globl ffi_closure_SYSV - FFI_HIDDEN(ffi_closure_SYSV) - .type ffi_closure_SYSV,%function -ffi_closure_SYSV: - .cfi_startproc - stmg %r2,%r6,16(%r15) # Save arguments - lgr %r4,%r0 # Load closure - lg %r2,32(%r4) # ->cif - lg %r3,40(%r4) # ->fun - lg %r4,48(%r4) # ->user_data -.Ldoclosure: - stmg %r13,%r15,104(%r15) # Save registers - lgr %r13,%r15 - .cfi_def_cfa_register r13 - .cfi_rel_offset r6, 48 - .cfi_rel_offset r13, 104 - .cfi_rel_offset r14, 112 - .cfi_rel_offset r15, 120 - aghi %r15,-160-16 # Set up stack frame - stg %r13,0(%r15) # Set up back chain - - std %f0,128(%r13) # Save fp arguments - std %f2,136(%r13) - std %f4,144(%r13) - std %f6,152(%r13) - la %r5,160(%r13) # Overflow - stg %r5,160(%r15) - la %r6,128(%r13) # FPRs - la %r5,16(%r13) # GPRs - brasl %r14,ffi_closure_helper_SYSV # Call helper - - lgr %r15,%r13 - .cfi_def_cfa_register r15 - lmg %r13,%r14,104(%r13) # Restore saved registers - lg %r6,48(%r15) - ld %f0,128(%r15) # Load return registers - lg %r2,16(%r15) - br %r14 - .cfi_endproc - .size ffi_closure_SYSV,.-ffi_closure_SYSV -#endif /* !s390x */ - -#if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",@progbits -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sh/ffi.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sh/ffi.c deleted file mode 100644 index 9ec86bf..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sh/ffi.c +++ /dev/null @@ -1,717 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2002-2008, 2012 Kaz Kojima - Copyright (c) 2008 Red Hat, Inc. - - SuperH Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#include -#include - -#include - -#define NGREGARG 4 -#if defined(__SH4__) -#define NFREGARG 8 -#endif - -#if defined(__HITACHI__) -#define STRUCT_VALUE_ADDRESS_WITH_ARG 1 -#else -#define STRUCT_VALUE_ADDRESS_WITH_ARG 0 -#endif - -/* If the structure has essentially an unique element, return its type. */ -static int -simple_type (ffi_type *arg) -{ - if (arg->type != FFI_TYPE_STRUCT) - return arg->type; - else if (arg->elements[1]) - return FFI_TYPE_STRUCT; - - return simple_type (arg->elements[0]); -} - -static int -return_type (ffi_type *arg) -{ - unsigned short type; - - if (arg->type != FFI_TYPE_STRUCT) - return arg->type; - - type = simple_type (arg->elements[0]); - if (! arg->elements[1]) - { - switch (type) - { - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - return FFI_TYPE_INT; - - default: - return type; - } - } - - /* gcc uses r0/r1 pair for some kind of structures. */ - if (arg->size <= 2 * sizeof (int)) - { - int i = 0; - ffi_type *e; - - while ((e = arg->elements[i++])) - { - type = simple_type (e); - switch (type) - { - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - case FFI_TYPE_INT: - case FFI_TYPE_FLOAT: - return FFI_TYPE_UINT64; - - default: - break; - } - } - } - - return FFI_TYPE_STRUCT; -} - -/* ffi_prep_args is called by the assembly routine once stack space - has been allocated for the function's arguments */ - -void ffi_prep_args(char *stack, extended_cif *ecif) -{ - register unsigned int i; - register int tmp; - register unsigned int avn; - register void **p_argv; - register char *argp; - register ffi_type **p_arg; - int greg, ireg; -#if defined(__SH4__) - int freg = 0; -#endif - - tmp = 0; - argp = stack; - - if (return_type (ecif->cif->rtype) == FFI_TYPE_STRUCT) - { - *(void **) argp = ecif->rvalue; - argp += 4; - ireg = STRUCT_VALUE_ADDRESS_WITH_ARG ? 1 : 0; - } - else - ireg = 0; - - /* Set arguments for registers. */ - greg = ireg; - avn = ecif->cif->nargs; - p_argv = ecif->avalue; - - for (i = 0, p_arg = ecif->cif->arg_types; i < avn; i++, p_arg++, p_argv++) - { - size_t z; - - z = (*p_arg)->size; - if (z < sizeof(int)) - { - if (greg++ >= NGREGARG) - continue; - - z = sizeof(int); - switch ((*p_arg)->type) - { - case FFI_TYPE_SINT8: - *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); - break; - - case FFI_TYPE_UINT8: - *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); - break; - - case FFI_TYPE_SINT16: - *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); - break; - - case FFI_TYPE_UINT16: - *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); - break; - - case FFI_TYPE_STRUCT: - *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); - break; - - default: - FFI_ASSERT(0); - } - argp += z; - } - else if (z == sizeof(int)) - { -#if defined(__SH4__) - if ((*p_arg)->type == FFI_TYPE_FLOAT) - { - if (freg++ >= NFREGARG) - continue; - } - else -#endif - { - if (greg++ >= NGREGARG) - continue; - } - *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); - argp += z; - } -#if defined(__SH4__) - else if ((*p_arg)->type == FFI_TYPE_DOUBLE) - { - if (freg + 1 >= NFREGARG) - continue; - freg = (freg + 1) & ~1; - freg += 2; - memcpy (argp, *p_argv, z); - argp += z; - } -#endif - else - { - int n = (z + sizeof (int) - 1) / sizeof (int); -#if defined(__SH4__) - if (greg + n - 1 >= NGREGARG) - continue; -#else - if (greg >= NGREGARG) - continue; -#endif - greg += n; - memcpy (argp, *p_argv, z); - argp += n * sizeof (int); - } - } - - /* Set arguments on stack. */ - greg = ireg; -#if defined(__SH4__) - freg = 0; -#endif - p_argv = ecif->avalue; - - for (i = 0, p_arg = ecif->cif->arg_types; i < avn; i++, p_arg++, p_argv++) - { - size_t z; - - z = (*p_arg)->size; - if (z < sizeof(int)) - { - if (greg++ < NGREGARG) - continue; - - z = sizeof(int); - switch ((*p_arg)->type) - { - case FFI_TYPE_SINT8: - *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); - break; - - case FFI_TYPE_UINT8: - *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); - break; - - case FFI_TYPE_SINT16: - *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); - break; - - case FFI_TYPE_UINT16: - *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); - break; - - case FFI_TYPE_STRUCT: - *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); - break; - - default: - FFI_ASSERT(0); - } - argp += z; - } - else if (z == sizeof(int)) - { -#if defined(__SH4__) - if ((*p_arg)->type == FFI_TYPE_FLOAT) - { - if (freg++ < NFREGARG) - continue; - } - else -#endif - { - if (greg++ < NGREGARG) - continue; - } - *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); - argp += z; - } -#if defined(__SH4__) - else if ((*p_arg)->type == FFI_TYPE_DOUBLE) - { - if (freg + 1 < NFREGARG) - { - freg = (freg + 1) & ~1; - freg += 2; - continue; - } - memcpy (argp, *p_argv, z); - argp += z; - } -#endif - else - { - int n = (z + sizeof (int) - 1) / sizeof (int); - if (greg + n - 1 < NGREGARG) - { - greg += n; - continue; - } -#if (! defined(__SH4__)) - else if (greg < NGREGARG) - { - greg = NGREGARG; - continue; - } -#endif - memcpy (argp, *p_argv, z); - argp += n * sizeof (int); - } - } - - return; -} - -/* Perform machine dependent cif processing */ -ffi_status ffi_prep_cif_machdep(ffi_cif *cif) -{ - int i, j; - int size, type; - int n, m; - int greg; -#if defined(__SH4__) - int freg = 0; -#endif - - cif->flags = 0; - - greg = ((return_type (cif->rtype) == FFI_TYPE_STRUCT) && - STRUCT_VALUE_ADDRESS_WITH_ARG) ? 1 : 0; - -#if defined(__SH4__) - for (i = j = 0; i < cif->nargs && j < 12; i++) - { - type = (cif->arg_types)[i]->type; - switch (type) - { - case FFI_TYPE_FLOAT: - if (freg >= NFREGARG) - continue; - freg++; - cif->flags += ((cif->arg_types)[i]->type) << (2 * j); - j++; - break; - - case FFI_TYPE_DOUBLE: - if ((freg + 1) >= NFREGARG) - continue; - freg = (freg + 1) & ~1; - freg += 2; - cif->flags += ((cif->arg_types)[i]->type) << (2 * j); - j++; - break; - - default: - size = (cif->arg_types)[i]->size; - n = (size + sizeof (int) - 1) / sizeof (int); - if (greg + n - 1 >= NGREGARG) - continue; - greg += n; - for (m = 0; m < n; m++) - cif->flags += FFI_TYPE_INT << (2 * j++); - break; - } - } -#else - for (i = j = 0; i < cif->nargs && j < 4; i++) - { - size = (cif->arg_types)[i]->size; - n = (size + sizeof (int) - 1) / sizeof (int); - if (greg >= NGREGARG) - continue; - else if (greg + n - 1 >= NGREGARG) - n = NGREGARG - greg; - greg += n; - for (m = 0; m < n; m++) - cif->flags += FFI_TYPE_INT << (2 * j++); - } -#endif - - /* Set the return type flag */ - switch (cif->rtype->type) - { - case FFI_TYPE_STRUCT: - cif->flags += (unsigned) (return_type (cif->rtype)) << 24; - break; - - case FFI_TYPE_VOID: - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - cif->flags += (unsigned) cif->rtype->type << 24; - break; - - default: - cif->flags += FFI_TYPE_INT << 24; - break; - } - - return FFI_OK; -} - -extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, - unsigned, unsigned, unsigned *, void (*fn)(void)); - -void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - extended_cif ecif; - UINT64 trvalue; - - ecif.cif = cif; - ecif.avalue = avalue; - - /* If the return value is a struct and we don't have a return */ - /* value address then we need to make one */ - - if (cif->rtype->type == FFI_TYPE_STRUCT - && return_type (cif->rtype) != FFI_TYPE_STRUCT) - ecif.rvalue = &trvalue; - else if ((rvalue == NULL) && - (cif->rtype->type == FFI_TYPE_STRUCT)) - { - ecif.rvalue = alloca(cif->rtype->size); - } - else - ecif.rvalue = rvalue; - - switch (cif->abi) - { - case FFI_SYSV: - ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue, - fn); - break; - default: - FFI_ASSERT(0); - break; - } - - if (rvalue - && cif->rtype->type == FFI_TYPE_STRUCT - && return_type (cif->rtype) != FFI_TYPE_STRUCT) - memcpy (rvalue, &trvalue, cif->rtype->size); -} - -extern void ffi_closure_SYSV (void); -#if defined(__SH4__) -extern void __ic_invalidate (void *line); -#endif - -ffi_status -ffi_prep_closure_loc (ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, - void *codeloc) -{ - unsigned int *tramp; - unsigned int insn; - - if (cif->abi != FFI_SYSV) - return FFI_BAD_ABI; - - tramp = (unsigned int *) &closure->tramp[0]; - /* Set T bit if the function returns a struct pointed with R2. */ - insn = (return_type (cif->rtype) == FFI_TYPE_STRUCT - ? 0x0018 /* sett */ - : 0x0008 /* clrt */); - -#ifdef __LITTLE_ENDIAN__ - tramp[0] = 0xd301d102; - tramp[1] = 0x0000412b | (insn << 16); -#else - tramp[0] = 0xd102d301; - tramp[1] = 0x412b0000 | insn; -#endif - *(void **) &tramp[2] = (void *)codeloc; /* ctx */ - *(void **) &tramp[3] = (void *)ffi_closure_SYSV; /* funaddr */ - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - -#if defined(__SH4__) - /* Flush the icache. */ - __ic_invalidate(codeloc); -#endif - - return FFI_OK; -} - -/* Basically the trampoline invokes ffi_closure_SYSV, and on - * entry, r3 holds the address of the closure. - * After storing the registers that could possibly contain - * parameters to be passed into the stack frame and setting - * up space for a return value, ffi_closure_SYSV invokes the - * following helper function to do most of the work. - */ - -#ifdef __LITTLE_ENDIAN__ -#define OFS_INT8 0 -#define OFS_INT16 0 -#else -#define OFS_INT8 3 -#define OFS_INT16 2 -#endif - -int -ffi_closure_helper_SYSV (ffi_closure *closure, void *rvalue, - unsigned long *pgr, unsigned long *pfr, - unsigned long *pst) -{ - void **avalue; - ffi_type **p_arg; - int i, avn; - int ireg, greg = 0; -#if defined(__SH4__) - int freg = 0; -#endif - ffi_cif *cif; - - cif = closure->cif; - avalue = alloca(cif->nargs * sizeof(void *)); - - /* Copy the caller's structure return value address so that the closure - returns the data directly to the caller. */ - if (cif->rtype->type == FFI_TYPE_STRUCT && STRUCT_VALUE_ADDRESS_WITH_ARG) - { - rvalue = (void *) *pgr++; - ireg = 1; - } - else - ireg = 0; - - cif = closure->cif; - greg = ireg; - avn = cif->nargs; - - /* Grab the addresses of the arguments from the stack frame. */ - for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++) - { - size_t z; - - z = (*p_arg)->size; - if (z < sizeof(int)) - { - if (greg++ >= NGREGARG) - continue; - - z = sizeof(int); - switch ((*p_arg)->type) - { - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: - avalue[i] = (((char *)pgr) + OFS_INT8); - break; - - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: - avalue[i] = (((char *)pgr) + OFS_INT16); - break; - - case FFI_TYPE_STRUCT: - avalue[i] = pgr; - break; - - default: - FFI_ASSERT(0); - } - pgr++; - } - else if (z == sizeof(int)) - { -#if defined(__SH4__) - if ((*p_arg)->type == FFI_TYPE_FLOAT) - { - if (freg++ >= NFREGARG) - continue; - avalue[i] = pfr; - pfr++; - } - else -#endif - { - if (greg++ >= NGREGARG) - continue; - avalue[i] = pgr; - pgr++; - } - } -#if defined(__SH4__) - else if ((*p_arg)->type == FFI_TYPE_DOUBLE) - { - if (freg + 1 >= NFREGARG) - continue; - if (freg & 1) - pfr++; - freg = (freg + 1) & ~1; - freg += 2; - avalue[i] = pfr; - pfr += 2; - } -#endif - else - { - int n = (z + sizeof (int) - 1) / sizeof (int); -#if defined(__SH4__) - if (greg + n - 1 >= NGREGARG) - continue; -#else - if (greg >= NGREGARG) - continue; -#endif - greg += n; - avalue[i] = pgr; - pgr += n; - } - } - - greg = ireg; -#if defined(__SH4__) - freg = 0; -#endif - - for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++) - { - size_t z; - - z = (*p_arg)->size; - if (z < sizeof(int)) - { - if (greg++ < NGREGARG) - continue; - - z = sizeof(int); - switch ((*p_arg)->type) - { - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: - avalue[i] = (((char *)pst) + OFS_INT8); - break; - - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: - avalue[i] = (((char *)pst) + OFS_INT16); - break; - - case FFI_TYPE_STRUCT: - avalue[i] = pst; - break; - - default: - FFI_ASSERT(0); - } - pst++; - } - else if (z == sizeof(int)) - { -#if defined(__SH4__) - if ((*p_arg)->type == FFI_TYPE_FLOAT) - { - if (freg++ < NFREGARG) - continue; - } - else -#endif - { - if (greg++ < NGREGARG) - continue; - } - avalue[i] = pst; - pst++; - } -#if defined(__SH4__) - else if ((*p_arg)->type == FFI_TYPE_DOUBLE) - { - if (freg + 1 < NFREGARG) - { - freg = (freg + 1) & ~1; - freg += 2; - continue; - } - avalue[i] = pst; - pst += 2; - } -#endif - else - { - int n = (z + sizeof (int) - 1) / sizeof (int); - if (greg + n - 1 < NGREGARG) - { - greg += n; - continue; - } -#if (! defined(__SH4__)) - else if (greg < NGREGARG) - { - greg += n; - pst += greg - NGREGARG; - continue; - } -#endif - avalue[i] = pst; - pst += n; - } - } - - (closure->fun) (cif, rvalue, avalue, closure->user_data); - - /* Tell ffi_closure_SYSV how to perform return type promotions. */ - return return_type (cif->rtype); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sh/ffitarget.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sh/ffitarget.h deleted file mode 100644 index a36bf42..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sh/ffitarget.h +++ /dev/null @@ -1,54 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - Copyright (c) 1996-2003 Red Hat, Inc. - Target configuration macros for SuperH. - - 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. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -/* ---- Generic type definitions ----------------------------------------- */ - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_SYSV, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_SYSV -} ffi_abi; -#endif - -#define FFI_CLOSURES 1 -#define FFI_TRAMPOLINE_SIZE 16 -#define FFI_NATIVE_RAW_API 0 - -#endif - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sh/sysv.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sh/sysv.S deleted file mode 100644 index 5be7516..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sh/sysv.S +++ /dev/null @@ -1,850 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.S - Copyright (c) 2002, 2003, 2004, 2006, 2008 Kaz Kojima - - SuperH Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include -#ifdef HAVE_MACHINE_ASM_H -#include -#else -/* XXX these lose for some platforms, I'm sure. */ -#define CNAME(x) x -#define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x): -#endif - -#if defined(__HITACHI__) -#define STRUCT_VALUE_ADDRESS_WITH_ARG 1 -#else -#define STRUCT_VALUE_ADDRESS_WITH_ARG 0 -#endif - -.text - - # r4: ffi_prep_args - # r5: &ecif - # r6: bytes - # r7: flags - # sp+0: rvalue - # sp+4: fn - - # This assumes we are using gas. -ENTRY(ffi_call_SYSV) - # Save registers -.LFB1: - mov.l r8,@-r15 -.LCFI0: - mov.l r9,@-r15 -.LCFI1: - mov.l r10,@-r15 -.LCFI2: - mov.l r12,@-r15 -.LCFI3: - mov.l r14,@-r15 -.LCFI4: - sts.l pr,@-r15 -.LCFI5: - mov r15,r14 -.LCFI6: -#if defined(__SH4__) - mov r6,r8 - mov r7,r9 - - sub r6,r15 - add #-16,r15 - mov #~7,r0 - and r0,r15 - - mov r4,r0 - jsr @r0 - mov r15,r4 - - mov r9,r1 - shlr8 r9 - shlr8 r9 - shlr8 r9 - - mov #FFI_TYPE_STRUCT,r2 - cmp/eq r2,r9 - bf 1f -#if STRUCT_VALUE_ADDRESS_WITH_ARG - mov.l @r15+,r4 - bra 2f - mov #5,r2 -#else - mov.l @r15+,r10 -#endif -1: - mov #4,r2 -2: - mov #4,r3 - -L_pass: - cmp/pl r8 - bf L_call_it - - mov r1,r0 - and #3,r0 - -L_pass_d: - cmp/eq #FFI_TYPE_DOUBLE,r0 - bf L_pass_f - - mov r3,r0 - and #1,r0 - tst r0,r0 - bt 1f - add #1,r3 -1: - mov #12,r0 - cmp/hs r0,r3 - bt/s 3f - shlr2 r1 - bsr L_pop_d - nop -3: - add #2,r3 - bra L_pass - add #-8,r8 - -L_pop_d: - mov r3,r0 - add r0,r0 - add r3,r0 - add #-12,r0 - braf r0 - nop -#ifdef __LITTLE_ENDIAN__ - fmov.s @r15+,fr5 - rts - fmov.s @r15+,fr4 - fmov.s @r15+,fr7 - rts - fmov.s @r15+,fr6 - fmov.s @r15+,fr9 - rts - fmov.s @r15+,fr8 - fmov.s @r15+,fr11 - rts - fmov.s @r15+,fr10 -#else - fmov.s @r15+,fr4 - rts - fmov.s @r15+,fr5 - fmov.s @r15+,fr6 - rts - fmov.s @r15+,fr7 - fmov.s @r15+,fr8 - rts - fmov.s @r15+,fr9 - fmov.s @r15+,fr10 - rts - fmov.s @r15+,fr11 -#endif - -L_pass_f: - cmp/eq #FFI_TYPE_FLOAT,r0 - bf L_pass_i - - mov #12,r0 - cmp/hs r0,r3 - bt/s 2f - shlr2 r1 - bsr L_pop_f - nop -2: - add #1,r3 - bra L_pass - add #-4,r8 - -L_pop_f: - mov r3,r0 - shll2 r0 - add #-16,r0 - braf r0 - nop -#ifdef __LITTLE_ENDIAN__ - rts - fmov.s @r15+,fr5 - rts - fmov.s @r15+,fr4 - rts - fmov.s @r15+,fr7 - rts - fmov.s @r15+,fr6 - rts - fmov.s @r15+,fr9 - rts - fmov.s @r15+,fr8 - rts - fmov.s @r15+,fr11 - rts - fmov.s @r15+,fr10 -#else - rts - fmov.s @r15+,fr4 - rts - fmov.s @r15+,fr5 - rts - fmov.s @r15+,fr6 - rts - fmov.s @r15+,fr7 - rts - fmov.s @r15+,fr8 - rts - fmov.s @r15+,fr9 - rts - fmov.s @r15+,fr10 - rts - fmov.s @r15+,fr11 -#endif - -L_pass_i: - cmp/eq #FFI_TYPE_INT,r0 - bf L_call_it - - mov #8,r0 - cmp/hs r0,r2 - bt/s 2f - shlr2 r1 - bsr L_pop_i - nop -2: - add #1,r2 - bra L_pass - add #-4,r8 - -L_pop_i: - mov r2,r0 - shll2 r0 - add #-16,r0 - braf r0 - nop - rts - mov.l @r15+,r4 - rts - mov.l @r15+,r5 - rts - mov.l @r15+,r6 - rts - mov.l @r15+,r7 - -L_call_it: - # call function -#if (! STRUCT_VALUE_ADDRESS_WITH_ARG) - mov r10, r2 -#endif - mov.l @(28,r14),r1 - jsr @r1 - nop - -L_ret_d: - mov #FFI_TYPE_DOUBLE,r2 - cmp/eq r2,r9 - bf L_ret_ll - - mov.l @(24,r14),r1 -#ifdef __LITTLE_ENDIAN__ - fmov.s fr1,@r1 - add #4,r1 - bra L_epilogue - fmov.s fr0,@r1 -#else - fmov.s fr0,@r1 - add #4,r1 - bra L_epilogue - fmov.s fr1,@r1 -#endif - -L_ret_ll: - mov #FFI_TYPE_SINT64,r2 - cmp/eq r2,r9 - bt/s 1f - mov #FFI_TYPE_UINT64,r2 - cmp/eq r2,r9 - bf L_ret_f - -1: - mov.l @(24,r14),r2 - mov.l r0,@r2 - bra L_epilogue - mov.l r1,@(4,r2) - -L_ret_f: - mov #FFI_TYPE_FLOAT,r2 - cmp/eq r2,r9 - bf L_ret_i - - mov.l @(24,r14),r1 - bra L_epilogue - fmov.s fr0,@r1 - -L_ret_i: - mov #FFI_TYPE_INT,r2 - cmp/eq r2,r9 - bf L_epilogue - - mov.l @(24,r14),r1 - bra L_epilogue - mov.l r0,@r1 - -L_epilogue: - # Remove the space we pushed for the args - mov r14,r15 - - lds.l @r15+,pr - mov.l @r15+,r14 - mov.l @r15+,r12 - mov.l @r15+,r10 - mov.l @r15+,r9 - rts - mov.l @r15+,r8 -#else - mov r6,r8 - mov r7,r9 - - sub r6,r15 - add #-16,r15 - mov #~7,r0 - and r0,r15 - - mov r4,r0 - jsr @r0 - mov r15,r4 - - mov r9,r3 - shlr8 r9 - shlr8 r9 - shlr8 r9 - - mov #FFI_TYPE_STRUCT,r2 - cmp/eq r2,r9 - bf 1f -#if STRUCT_VALUE_ADDRESS_WITH_ARG - mov.l @r15+,r4 - bra 2f - mov #5,r2 -#else - mov.l @r15+,r10 -#endif -1: - mov #4,r2 -2: - -L_pass: - cmp/pl r8 - bf L_call_it - - mov r3,r0 - and #3,r0 - -L_pass_d: - cmp/eq #FFI_TYPE_DOUBLE,r0 - bf L_pass_i - - mov r15,r0 - and #7,r0 - tst r0,r0 - bt 1f - add #4,r15 -1: - mov #8,r0 - cmp/hs r0,r2 - bt/s 2f - shlr2 r3 - bsr L_pop_d - nop -2: - add #2,r2 - bra L_pass - add #-8,r8 - -L_pop_d: - mov r2,r0 - add r0,r0 - add r2,r0 - add #-12,r0 - add r0,r0 - braf r0 - nop - mov.l @r15+,r4 - rts - mov.l @r15+,r5 - mov.l @r15+,r5 - rts - mov.l @r15+,r6 - mov.l @r15+,r6 - rts - mov.l @r15+,r7 - rts - mov.l @r15+,r7 - -L_pass_i: - cmp/eq #FFI_TYPE_INT,r0 - bf L_call_it - - mov #8,r0 - cmp/hs r0,r2 - bt/s 2f - shlr2 r3 - bsr L_pop_i - nop -2: - add #1,r2 - bra L_pass - add #-4,r8 - -L_pop_i: - mov r2,r0 - shll2 r0 - add #-16,r0 - braf r0 - nop - rts - mov.l @r15+,r4 - rts - mov.l @r15+,r5 - rts - mov.l @r15+,r6 - rts - mov.l @r15+,r7 - -L_call_it: - # call function -#if (! STRUCT_VALUE_ADDRESS_WITH_ARG) - mov r10, r2 -#endif - mov.l @(28,r14),r1 - jsr @r1 - nop - -L_ret_d: - mov #FFI_TYPE_DOUBLE,r2 - cmp/eq r2,r9 - bf L_ret_ll - - mov.l @(24,r14),r2 - mov.l r0,@r2 - bra L_epilogue - mov.l r1,@(4,r2) - -L_ret_ll: - mov #FFI_TYPE_SINT64,r2 - cmp/eq r2,r9 - bt/s 1f - mov #FFI_TYPE_UINT64,r2 - cmp/eq r2,r9 - bf L_ret_i - -1: - mov.l @(24,r14),r2 - mov.l r0,@r2 - bra L_epilogue - mov.l r1,@(4,r2) - -L_ret_i: - mov #FFI_TYPE_FLOAT,r2 - cmp/eq r2,r9 - bt 1f - mov #FFI_TYPE_INT,r2 - cmp/eq r2,r9 - bf L_epilogue -1: - mov.l @(24,r14),r1 - bra L_epilogue - mov.l r0,@r1 - -L_epilogue: - # Remove the space we pushed for the args - mov r14,r15 - - lds.l @r15+,pr - mov.l @r15+,r14 - mov.l @r15+,r12 - mov.l @r15+,r10 - mov.l @r15+,r9 - rts - mov.l @r15+,r8 -#endif -.LFE1: -.ffi_call_SYSV_end: - .size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV) - -.globl ffi_closure_helper_SYSV - -ENTRY(ffi_closure_SYSV) -.LFB2: - mov.l r7,@-r15 -.LCFI7: - mov.l r6,@-r15 -.LCFI8: - mov.l r5,@-r15 -.LCFI9: - mov.l r4,@-r15 -.LCFIA: - mov.l r14,@-r15 -.LCFIB: - sts.l pr,@-r15 - - /* Stack layout: - xx bytes (on stack parameters) - 16 bytes (register parameters) - 4 bytes (saved frame pointer) - 4 bytes (saved return address) - 32 bytes (floating register parameters, SH-4 only) - 8 bytes (result) - 4 bytes (pad) - 4 bytes (5th arg) - <- new stack pointer - */ -.LCFIC: -#if defined(__SH4__) - add #-48,r15 -#else - add #-16,r15 -#endif -.LCFID: - mov r15,r14 -.LCFIE: - -#if defined(__SH4__) - mov r14,r1 - add #48,r1 -#ifdef __LITTLE_ENDIAN__ - fmov.s fr10,@-r1 - fmov.s fr11,@-r1 - fmov.s fr8,@-r1 - fmov.s fr9,@-r1 - fmov.s fr6,@-r1 - fmov.s fr7,@-r1 - fmov.s fr4,@-r1 - fmov.s fr5,@-r1 -#else - fmov.s fr11,@-r1 - fmov.s fr10,@-r1 - fmov.s fr9,@-r1 - fmov.s fr8,@-r1 - fmov.s fr7,@-r1 - fmov.s fr6,@-r1 - fmov.s fr5,@-r1 - fmov.s fr4,@-r1 -#endif - mov r1,r7 - mov r14,r6 - add #56,r6 -#else - mov r14,r6 - add #24,r6 -#endif - - bt/s 10f - mov r2, r5 - mov r14,r1 - add #8,r1 - mov r1,r5 -10: - - mov r14,r1 -#if defined(__SH4__) - add #72,r1 -#else - add #40,r1 -#endif - mov.l r1,@r14 - -#ifdef PIC - mov.l L_got,r1 - mova L_got,r0 - add r0,r1 - mov.l L_helper,r0 - add r1,r0 -#else - mov.l L_helper,r0 -#endif - jsr @r0 - mov r3,r4 - - shll r0 - mov r0,r1 - mova L_table,r0 - add r1,r0 - mov.w @r0,r0 - mov r14,r2 - braf r0 - add #8,r2 -0: - .align 2 -#ifdef PIC -L_got: - .long _GLOBAL_OFFSET_TABLE_ -L_helper: - .long ffi_closure_helper_SYSV@GOTOFF -#else -L_helper: - .long ffi_closure_helper_SYSV -#endif -L_table: - .short L_case_v - 0b /* FFI_TYPE_VOID */ - .short L_case_i - 0b /* FFI_TYPE_INT */ -#if defined(__SH4__) - .short L_case_f - 0b /* FFI_TYPE_FLOAT */ - .short L_case_d - 0b /* FFI_TYPE_DOUBLE */ - .short L_case_d - 0b /* FFI_TYPE_LONGDOUBLE */ -#else - .short L_case_i - 0b /* FFI_TYPE_FLOAT */ - .short L_case_ll - 0b /* FFI_TYPE_DOUBLE */ - .short L_case_ll - 0b /* FFI_TYPE_LONGDOUBLE */ -#endif - .short L_case_uq - 0b /* FFI_TYPE_UINT8 */ - .short L_case_q - 0b /* FFI_TYPE_SINT8 */ - .short L_case_uh - 0b /* FFI_TYPE_UINT16 */ - .short L_case_h - 0b /* FFI_TYPE_SINT16 */ - .short L_case_i - 0b /* FFI_TYPE_UINT32 */ - .short L_case_i - 0b /* FFI_TYPE_SINT32 */ - .short L_case_ll - 0b /* FFI_TYPE_UINT64 */ - .short L_case_ll - 0b /* FFI_TYPE_SINT64 */ - .short L_case_v - 0b /* FFI_TYPE_STRUCT */ - .short L_case_i - 0b /* FFI_TYPE_POINTER */ - -#if defined(__SH4__) -L_case_d: -#ifdef __LITTLE_ENDIAN__ - fmov.s @r2+,fr1 - bra L_case_v - fmov.s @r2,fr0 -#else - fmov.s @r2+,fr0 - bra L_case_v - fmov.s @r2,fr1 -#endif - -L_case_f: - bra L_case_v - fmov.s @r2,fr0 -#endif - -L_case_ll: - mov.l @r2+,r0 - bra L_case_v - mov.l @r2,r1 - -L_case_i: - bra L_case_v - mov.l @r2,r0 - -L_case_q: -#ifdef __LITTLE_ENDIAN__ -#else - add #3,r2 -#endif - bra L_case_v - mov.b @r2,r0 - -L_case_uq: -#ifdef __LITTLE_ENDIAN__ -#else - add #3,r2 -#endif - mov.b @r2,r0 - bra L_case_v - extu.b r0,r0 - -L_case_h: -#ifdef __LITTLE_ENDIAN__ -#else - add #2,r2 -#endif - bra L_case_v - mov.w @r2,r0 - -L_case_uh: -#ifdef __LITTLE_ENDIAN__ -#else - add #2,r2 -#endif - mov.w @r2,r0 - extu.w r0,r0 - /* fall through */ - -L_case_v: -#if defined(__SH4__) - add #48,r15 -#else - add #16,r15 -#endif - lds.l @r15+,pr - mov.l @r15+,r14 - rts - add #16,r15 -.LFE2: -.ffi_closure_SYSV_end: - .size CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV) - -#if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",@progbits -#endif - - .section ".eh_frame","aw",@progbits -__FRAME_BEGIN__: - .4byte .LECIE1-.LSCIE1 /* Length of Common Information Entry */ -.LSCIE1: - .4byte 0x0 /* CIE Identifier Tag */ - .byte 0x1 /* CIE Version */ -#ifdef PIC - .ascii "zR\0" /* CIE Augmentation */ -#else - .byte 0x0 /* CIE Augmentation */ -#endif - .byte 0x1 /* uleb128 0x1; CIE Code Alignment Factor */ - .byte 0x7c /* sleb128 -4; CIE Data Alignment Factor */ - .byte 0x11 /* CIE RA Column */ -#ifdef PIC - .uleb128 0x1 /* Augmentation size */ - .byte 0x10 /* FDE Encoding (pcrel) */ -#endif - .byte 0xc /* DW_CFA_def_cfa */ - .byte 0xf /* uleb128 0xf */ - .byte 0x0 /* uleb128 0x0 */ - .align 2 -.LECIE1: -.LSFDE1: - .4byte .LEFDE1-.LASFDE1 /* FDE Length */ -.LASFDE1: - .4byte .LASFDE1-__FRAME_BEGIN__ /* FDE CIE offset */ -#ifdef PIC - .4byte .LFB1-. /* FDE initial location */ -#else - .4byte .LFB1 /* FDE initial location */ -#endif - .4byte .LFE1-.LFB1 /* FDE address range */ -#ifdef PIC - .uleb128 0x0 /* Augmentation size */ -#endif - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte .LCFI0-.LFB1 - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte 0x4 /* uleb128 0x4 */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte .LCFI1-.LCFI0 - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte 0x8 /* uleb128 0x4 */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte .LCFI2-.LCFI1 - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte 0xc /* uleb128 0x4 */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte .LCFI3-.LCFI2 - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte 0x10 /* uleb128 0x4 */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte .LCFI4-.LCFI3 - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte 0x14 /* uleb128 0x4 */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte .LCFI5-.LCFI4 - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte 0x18 /* uleb128 0x4 */ - .byte 0x91 /* DW_CFA_offset, column 0x11 */ - .byte 0x6 /* uleb128 0x6 */ - .byte 0x8e /* DW_CFA_offset, column 0xe */ - .byte 0x5 /* uleb128 0x5 */ - .byte 0x8c /* DW_CFA_offset, column 0xc */ - .byte 0x4 /* uleb128 0x4 */ - .byte 0x8a /* DW_CFA_offset, column 0xa */ - .byte 0x3 /* uleb128 0x3 */ - .byte 0x89 /* DW_CFA_offset, column 0x9 */ - .byte 0x2 /* uleb128 0x2 */ - .byte 0x88 /* DW_CFA_offset, column 0x8 */ - .byte 0x1 /* uleb128 0x1 */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte .LCFI6-.LCFI5 - .byte 0xd /* DW_CFA_def_cfa_register */ - .byte 0xe /* uleb128 0xe */ - .align 2 -.LEFDE1: - -.LSFDE3: - .4byte .LEFDE3-.LASFDE3 /* FDE Length */ -.LASFDE3: - .4byte .LASFDE3-__FRAME_BEGIN__ /* FDE CIE offset */ -#ifdef PIC - .4byte .LFB2-. /* FDE initial location */ -#else - .4byte .LFB2 /* FDE initial location */ -#endif - .4byte .LFE2-.LFB2 /* FDE address range */ -#ifdef PIC - .uleb128 0x0 /* Augmentation size */ -#endif - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte .LCFI7-.LFB2 - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte 0x4 /* uleb128 0x4 */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte .LCFI8-.LCFI7 - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte 0x8 /* uleb128 0x4 */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte .LCFI9-.LCFI8 - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte 0xc /* uleb128 0x4 */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte .LCFIA-.LCFI9 - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte 0x10 /* uleb128 0x4 */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte .LCFIB-.LCFIA - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte 0x14 /* uleb128 0x4 */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte .LCFIC-.LCFIB - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte 0x18 /* uleb128 0x4 */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte .LCFID-.LCFIC - .byte 0xe /* DW_CFA_def_cfa_offset */ -#if defined(__SH4__) - .byte 24+48 /* uleb128 24+48 */ -#else - .byte 24+16 /* uleb128 24+16 */ -#endif - .byte 0x91 /* DW_CFA_offset, column 0x11 */ - .byte 0x6 /* uleb128 0x6 */ - .byte 0x8e /* DW_CFA_offset, column 0xe */ - .byte 0x5 /* uleb128 0x5 */ - .byte 0x84 /* DW_CFA_offset, column 0x4 */ - .byte 0x4 /* uleb128 0x4 */ - .byte 0x85 /* DW_CFA_offset, column 0x5 */ - .byte 0x3 /* uleb128 0x3 */ - .byte 0x86 /* DW_CFA_offset, column 0x6 */ - .byte 0x2 /* uleb128 0x2 */ - .byte 0x87 /* DW_CFA_offset, column 0x7 */ - .byte 0x1 /* uleb128 0x1 */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte .LCFIE-.LCFID - .byte 0xd /* DW_CFA_def_cfa_register */ - .byte 0xe /* uleb128 0xe */ - .align 2 -.LEFDE3: diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sh64/ffi.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sh64/ffi.c deleted file mode 100644 index 123b87a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sh64/ffi.c +++ /dev/null @@ -1,469 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2003, 2004, 2006, 2007, 2012 Kaz Kojima - Copyright (c) 2008 Anthony Green - - SuperH SHmedia Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#include -#include - -#include - -#define NGREGARG 8 -#define NFREGARG 12 - -static int -return_type (ffi_type *arg) -{ - - if (arg->type != FFI_TYPE_STRUCT) - return arg->type; - - /* gcc uses r2 if the result can be packed in on register. */ - if (arg->size <= sizeof (UINT8)) - return FFI_TYPE_UINT8; - else if (arg->size <= sizeof (UINT16)) - return FFI_TYPE_UINT16; - else if (arg->size <= sizeof (UINT32)) - return FFI_TYPE_UINT32; - else if (arg->size <= sizeof (UINT64)) - return FFI_TYPE_UINT64; - - return FFI_TYPE_STRUCT; -} - -/* ffi_prep_args is called by the assembly routine once stack space - has been allocated for the function's arguments */ - -void ffi_prep_args(char *stack, extended_cif *ecif) -{ - register unsigned int i; - register unsigned int avn; - register void **p_argv; - register char *argp; - register ffi_type **p_arg; - - argp = stack; - - if (return_type (ecif->cif->rtype) == FFI_TYPE_STRUCT) - { - *(void **) argp = ecif->rvalue; - argp += sizeof (UINT64); - } - - avn = ecif->cif->nargs; - p_argv = ecif->avalue; - - for (i = 0, p_arg = ecif->cif->arg_types; i < avn; i++, p_arg++, p_argv++) - { - size_t z; - int align; - - z = (*p_arg)->size; - align = (*p_arg)->alignment; - if (z < sizeof (UINT32)) - { - switch ((*p_arg)->type) - { - case FFI_TYPE_SINT8: - *(SINT64 *) argp = (SINT64) *(SINT8 *)(*p_argv); - break; - - case FFI_TYPE_UINT8: - *(UINT64 *) argp = (UINT64) *(UINT8 *)(*p_argv); - break; - - case FFI_TYPE_SINT16: - *(SINT64 *) argp = (SINT64) *(SINT16 *)(*p_argv); - break; - - case FFI_TYPE_UINT16: - *(UINT64 *) argp = (UINT64) *(UINT16 *)(*p_argv); - break; - - case FFI_TYPE_STRUCT: - memcpy (argp, *p_argv, z); - break; - - default: - FFI_ASSERT(0); - } - argp += sizeof (UINT64); - } - else if (z == sizeof (UINT32) && align == sizeof (UINT32)) - { - switch ((*p_arg)->type) - { - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: - *(SINT64 *) argp = (SINT64) *(SINT32 *) (*p_argv); - break; - - case FFI_TYPE_FLOAT: - case FFI_TYPE_POINTER: - case FFI_TYPE_UINT32: - case FFI_TYPE_STRUCT: - *(UINT64 *) argp = (UINT64) *(UINT32 *) (*p_argv); - break; - - default: - FFI_ASSERT(0); - break; - } - argp += sizeof (UINT64); - } - else if (z == sizeof (UINT64) - && align == sizeof (UINT64) - && ((int) *p_argv & (sizeof (UINT64) - 1)) == 0) - { - *(UINT64 *) argp = *(UINT64 *) (*p_argv); - argp += sizeof (UINT64); - } - else - { - int n = (z + sizeof (UINT64) - 1) / sizeof (UINT64); - - memcpy (argp, *p_argv, z); - argp += n * sizeof (UINT64); - } - } - - return; -} - -/* Perform machine dependent cif processing */ -ffi_status ffi_prep_cif_machdep(ffi_cif *cif) -{ - int i, j; - int size, type; - int n, m; - int greg; - int freg; - int fpair = -1; - - greg = (return_type (cif->rtype) == FFI_TYPE_STRUCT ? 1 : 0); - freg = 0; - cif->flags2 = 0; - - for (i = j = 0; i < cif->nargs; i++) - { - type = (cif->arg_types)[i]->type; - switch (type) - { - case FFI_TYPE_FLOAT: - greg++; - cif->bytes += sizeof (UINT64) - sizeof (float); - if (freg >= NFREGARG - 1) - continue; - if (fpair < 0) - { - fpair = freg; - freg += 2; - } - else - fpair = -1; - cif->flags2 += ((cif->arg_types)[i]->type) << (2 * j++); - break; - - case FFI_TYPE_DOUBLE: - if (greg++ >= NGREGARG && (freg + 1) >= NFREGARG) - continue; - if ((freg + 1) < NFREGARG) - { - freg += 2; - cif->flags2 += ((cif->arg_types)[i]->type) << (2 * j++); - } - else - cif->flags2 += FFI_TYPE_INT << (2 * j++); - break; - - default: - size = (cif->arg_types)[i]->size; - if (size < sizeof (UINT64)) - cif->bytes += sizeof (UINT64) - size; - n = (size + sizeof (UINT64) - 1) / sizeof (UINT64); - if (greg >= NGREGARG) - continue; - else if (greg + n - 1 >= NGREGARG) - greg = NGREGARG; - else - greg += n; - for (m = 0; m < n; m++) - cif->flags2 += FFI_TYPE_INT << (2 * j++); - break; - } - } - - /* Set the return type flag */ - switch (cif->rtype->type) - { - case FFI_TYPE_STRUCT: - cif->flags = return_type (cif->rtype); - break; - - case FFI_TYPE_VOID: - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - cif->flags = cif->rtype->type; - break; - - default: - cif->flags = FFI_TYPE_INT; - break; - } - - return FFI_OK; -} - -/*@-declundef@*/ -/*@-exportheader@*/ -extern void ffi_call_SYSV(void (*)(char *, extended_cif *), - /*@out@*/ extended_cif *, - unsigned, unsigned, long long, - /*@out@*/ unsigned *, - void (*fn)(void)); -/*@=declundef@*/ -/*@=exportheader@*/ - -void ffi_call(/*@dependent@*/ ffi_cif *cif, - void (*fn)(void), - /*@out@*/ void *rvalue, - /*@dependent@*/ void **avalue) -{ - extended_cif ecif; - UINT64 trvalue; - - ecif.cif = cif; - ecif.avalue = avalue; - - /* If the return value is a struct and we don't have a return */ - /* value address then we need to make one */ - - if (cif->rtype->type == FFI_TYPE_STRUCT - && return_type (cif->rtype) != FFI_TYPE_STRUCT) - ecif.rvalue = &trvalue; - else if ((rvalue == NULL) && - (cif->rtype->type == FFI_TYPE_STRUCT)) - { - ecif.rvalue = alloca(cif->rtype->size); - } - else - ecif.rvalue = rvalue; - - switch (cif->abi) - { - case FFI_SYSV: - ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, cif->flags2, - ecif.rvalue, fn); - break; - default: - FFI_ASSERT(0); - break; - } - - if (rvalue - && cif->rtype->type == FFI_TYPE_STRUCT - && return_type (cif->rtype) != FFI_TYPE_STRUCT) - memcpy (rvalue, &trvalue, cif->rtype->size); -} - -extern void ffi_closure_SYSV (void); -extern void __ic_invalidate (void *line); - -ffi_status -ffi_prep_closure_loc (ffi_closure *closure, - ffi_cif *cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, - void *codeloc) -{ - unsigned int *tramp; - - if (cif->abi != FFI_SYSV) - return FFI_BAD_ABI; - - tramp = (unsigned int *) &closure->tramp[0]; - /* Since ffi_closure is an aligned object, the ffi trampoline is - called as an SHcompact code. Sigh. - SHcompact part: - mova @(1,pc),r0; add #1,r0; jmp @r0; nop; - SHmedia part: - movi fnaddr >> 16,r1; shori fnaddr,r1; ptabs/l r1,tr0 - movi cxt >> 16,r1; shori cxt,r1; blink tr0,r63 */ -#ifdef __LITTLE_ENDIAN__ - tramp[0] = 0x7001c701; - tramp[1] = 0x0009402b; -#else - tramp[0] = 0xc7017001; - tramp[1] = 0x402b0009; -#endif - tramp[2] = 0xcc000010 | (((UINT32) ffi_closure_SYSV) >> 16) << 10; - tramp[3] = 0xc8000010 | (((UINT32) ffi_closure_SYSV) & 0xffff) << 10; - tramp[4] = 0x6bf10600; - tramp[5] = 0xcc000010 | (((UINT32) codeloc) >> 16) << 10; - tramp[6] = 0xc8000010 | (((UINT32) codeloc) & 0xffff) << 10; - tramp[7] = 0x4401fff0; - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - /* Flush the icache. */ - asm volatile ("ocbwb %0,0; synco; icbi %1,0; synci" : : "r" (tramp), - "r"(codeloc)); - - return FFI_OK; -} - -/* Basically the trampoline invokes ffi_closure_SYSV, and on - * entry, r3 holds the address of the closure. - * After storing the registers that could possibly contain - * parameters to be passed into the stack frame and setting - * up space for a return value, ffi_closure_SYSV invokes the - * following helper function to do most of the work. - */ - -int -ffi_closure_helper_SYSV (ffi_closure *closure, UINT64 *rvalue, - UINT64 *pgr, UINT64 *pfr, UINT64 *pst) -{ - void **avalue; - ffi_type **p_arg; - int i, avn; - int greg, freg; - ffi_cif *cif; - int fpair = -1; - - cif = closure->cif; - avalue = alloca (cif->nargs * sizeof (void *)); - - /* Copy the caller's structure return value address so that the closure - returns the data directly to the caller. */ - if (return_type (cif->rtype) == FFI_TYPE_STRUCT) - { - rvalue = (UINT64 *) *pgr; - greg = 1; - } - else - greg = 0; - - freg = 0; - cif = closure->cif; - avn = cif->nargs; - - /* Grab the addresses of the arguments from the stack frame. */ - for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++) - { - size_t z; - void *p; - - z = (*p_arg)->size; - if (z < sizeof (UINT32)) - { - p = pgr + greg++; - - switch ((*p_arg)->type) - { - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: - case FFI_TYPE_STRUCT: -#ifdef __LITTLE_ENDIAN__ - avalue[i] = p; -#else - avalue[i] = ((char *) p) + sizeof (UINT32) - z; -#endif - break; - - default: - FFI_ASSERT(0); - } - } - else if (z == sizeof (UINT32)) - { - if ((*p_arg)->type == FFI_TYPE_FLOAT) - { - if (freg < NFREGARG - 1) - { - if (fpair >= 0) - { - avalue[i] = (UINT32 *) pfr + fpair; - fpair = -1; - } - else - { -#ifdef __LITTLE_ENDIAN__ - fpair = freg; - avalue[i] = (UINT32 *) pfr + (1 ^ freg); -#else - fpair = 1 ^ freg; - avalue[i] = (UINT32 *) pfr + freg; -#endif - freg += 2; - } - } - else -#ifdef __LITTLE_ENDIAN__ - avalue[i] = pgr + greg; -#else - avalue[i] = (UINT32 *) (pgr + greg) + 1; -#endif - } - else -#ifdef __LITTLE_ENDIAN__ - avalue[i] = pgr + greg; -#else - avalue[i] = (UINT32 *) (pgr + greg) + 1; -#endif - greg++; - } - else if ((*p_arg)->type == FFI_TYPE_DOUBLE) - { - if (freg + 1 >= NFREGARG) - avalue[i] = pgr + greg; - else - { - avalue[i] = pfr + (freg >> 1); - freg += 2; - } - greg++; - } - else - { - int n = (z + sizeof (UINT64) - 1) / sizeof (UINT64); - - avalue[i] = pgr + greg; - greg += n; - } - } - - (closure->fun) (cif, rvalue, avalue, closure->user_data); - - /* Tell ffi_closure_SYSV how to perform return type promotions. */ - return return_type (cif->rtype); -} - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sh64/ffitarget.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sh64/ffitarget.h deleted file mode 100644 index 08a6fe9..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sh64/ffitarget.h +++ /dev/null @@ -1,58 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - Copyright (c) 1996-2003 Red Hat, Inc. - Target configuration macros for SuperH - SHmedia. - - 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. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -/* ---- Generic type definitions ----------------------------------------- */ - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_SYSV, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_SYSV -} ffi_abi; - -#define FFI_EXTRA_CIF_FIELDS long long flags2 -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_TRAMPOLINE_SIZE 32 -#define FFI_NATIVE_RAW_API 0 - -#endif - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sh64/sysv.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sh64/sysv.S deleted file mode 100644 index c4587d5..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sh64/sysv.S +++ /dev/null @@ -1,539 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.S - Copyright (c) 2003, 2004, 2006, 2008 Kaz Kojima - - SuperH SHmedia Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include -#ifdef HAVE_MACHINE_ASM_H -#include -#else -/* XXX these lose for some platforms, I'm sure. */ -#define CNAME(x) x -#define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x): -#endif - -#ifdef __LITTLE_ENDIAN__ -#define OFS_FLT 0 -#else -#define OFS_FLT 4 -#endif - - .section .text..SHmedia32,"ax" - - # r2: ffi_prep_args - # r3: &ecif - # r4: bytes - # r5: flags - # r6: flags2 - # r7: rvalue - # r8: fn - - # This assumes we are using gas. - .align 5 -ENTRY(ffi_call_SYSV) - # Save registers -.LFB1: - addi.l r15, -48, r15 -.LCFI0: - st.q r15, 40, r32 - st.q r15, 32, r31 - st.q r15, 24, r30 - st.q r15, 16, r29 - st.q r15, 8, r28 - st.l r15, 4, r18 - st.l r15, 0, r14 -.LCFI1: - add.l r15, r63, r14 -.LCFI2: -# add r4, r63, r28 - add r5, r63, r29 - add r6, r63, r30 - add r7, r63, r31 - add r8, r63, r32 - - addi r4, (64 + 7), r4 - andi r4, ~7, r4 - sub.l r15, r4, r15 - - ptabs/l r2, tr0 - add r15, r63, r2 - blink tr0, r18 - - addi r15, 64, r22 - movi 0, r0 - movi 0, r1 - movi -1, r23 - - pt/l 1f, tr1 - bnei/l r29, FFI_TYPE_STRUCT, tr1 - ld.l r15, 0, r19 - addi r15, 8, r15 - addi r0, 1, r0 -1: - -.L_pass: - andi r30, 3, r20 - shlri r30, 2, r30 - - pt/l .L_call_it, tr0 - pt/l .L_pass_i, tr1 - pt/l .L_pass_f, tr2 - - beqi/l r20, FFI_TYPE_VOID, tr0 - beqi/l r20, FFI_TYPE_INT, tr1 - beqi/l r20, FFI_TYPE_FLOAT, tr2 - -.L_pass_d: - addi r0, 1, r0 - pt/l 3f, tr0 - movi 12, r20 - bge/l r1, r20, tr0 - - pt/l .L_pop_d, tr1 - pt/l 2f, tr0 - blink tr1, r63 -2: - addi.l r15, 8, r15 -3: - pt/l .L_pass, tr0 - addi r1, 2, r1 - blink tr0, r63 - -.L_pop_d: - pt/l .L_pop_d_tbl, tr1 - gettr tr1, r20 - shlli r1, 2, r21 - add r20, r21, r20 - ptabs/l r20, tr1 - blink tr1, r63 - -.L_pop_d_tbl: - fld.d r15, 0, dr0 - blink tr0, r63 - fld.d r15, 0, dr2 - blink tr0, r63 - fld.d r15, 0, dr4 - blink tr0, r63 - fld.d r15, 0, dr6 - blink tr0, r63 - fld.d r15, 0, dr8 - blink tr0, r63 - fld.d r15, 0, dr10 - blink tr0, r63 - -.L_pass_f: - addi r0, 1, r0 - pt/l 3f, tr0 - movi 12, r20 - bge/l r1, r20, tr0 - - pt/l .L_pop_f, tr1 - pt/l 2f, tr0 - blink tr1, r63 -2: - addi.l r15, 8, r15 -3: - pt/l .L_pass, tr0 - blink tr0, r63 - -.L_pop_f: - pt/l .L_pop_f_tbl, tr1 - pt/l 5f, tr2 - gettr tr1, r20 - bge/l r23, r63, tr2 - add r1, r63, r23 - shlli r1, 3, r21 - addi r1, 2, r1 - add r20, r21, r20 - ptabs/l r20, tr1 - blink tr1, r63 -5: - addi r23, 1, r21 - movi -1, r23 - shlli r21, 3, r21 - add r20, r21, r20 - ptabs/l r20, tr1 - blink tr1, r63 - -.L_pop_f_tbl: - fld.s r15, OFS_FLT, fr0 - blink tr0, r63 - fld.s r15, OFS_FLT, fr1 - blink tr0, r63 - fld.s r15, OFS_FLT, fr2 - blink tr0, r63 - fld.s r15, OFS_FLT, fr3 - blink tr0, r63 - fld.s r15, OFS_FLT, fr4 - blink tr0, r63 - fld.s r15, OFS_FLT, fr5 - blink tr0, r63 - fld.s r15, OFS_FLT, fr6 - blink tr0, r63 - fld.s r15, OFS_FLT, fr7 - blink tr0, r63 - fld.s r15, OFS_FLT, fr8 - blink tr0, r63 - fld.s r15, OFS_FLT, fr9 - blink tr0, r63 - fld.s r15, OFS_FLT, fr10 - blink tr0, r63 - fld.s r15, OFS_FLT, fr11 - blink tr0, r63 - -.L_pass_i: - pt/l 3f, tr0 - movi 8, r20 - bge/l r0, r20, tr0 - - pt/l .L_pop_i, tr1 - pt/l 2f, tr0 - blink tr1, r63 -2: - addi.l r15, 8, r15 -3: - pt/l .L_pass, tr0 - addi r0, 1, r0 - blink tr0, r63 - -.L_pop_i: - pt/l .L_pop_i_tbl, tr1 - gettr tr1, r20 - shlli r0, 3, r21 - add r20, r21, r20 - ptabs/l r20, tr1 - blink tr1, r63 - -.L_pop_i_tbl: - ld.q r15, 0, r2 - blink tr0, r63 - ld.q r15, 0, r3 - blink tr0, r63 - ld.q r15, 0, r4 - blink tr0, r63 - ld.q r15, 0, r5 - blink tr0, r63 - ld.q r15, 0, r6 - blink tr0, r63 - ld.q r15, 0, r7 - blink tr0, r63 - ld.q r15, 0, r8 - blink tr0, r63 - ld.q r15, 0, r9 - blink tr0, r63 - -.L_call_it: - # call function - pt/l 1f, tr1 - bnei/l r29, FFI_TYPE_STRUCT, tr1 - add r19, r63, r2 -1: - add r22, r63, r15 - ptabs/l r32, tr0 - blink tr0, r18 - - pt/l .L_ret_i, tr0 - pt/l .L_ret_ll, tr1 - pt/l .L_ret_d, tr2 - pt/l .L_ret_f, tr3 - pt/l .L_epilogue, tr4 - - beqi/l r29, FFI_TYPE_INT, tr0 - beqi/l r29, FFI_TYPE_UINT32, tr0 - beqi/l r29, FFI_TYPE_SINT64, tr1 - beqi/l r29, FFI_TYPE_UINT64, tr1 - beqi/l r29, FFI_TYPE_DOUBLE, tr2 - beqi/l r29, FFI_TYPE_FLOAT, tr3 - - pt/l .L_ret_q, tr0 - pt/l .L_ret_h, tr1 - - beqi/l r29, FFI_TYPE_UINT8, tr0 - beqi/l r29, FFI_TYPE_UINT16, tr1 - blink tr4, r63 - -.L_ret_d: - fst.d r31, 0, dr0 - blink tr4, r63 - -.L_ret_ll: - st.q r31, 0, r2 - blink tr4, r63 - -.L_ret_f: - fst.s r31, OFS_FLT, fr0 - blink tr4, r63 - -.L_ret_q: - st.b r31, 0, r2 - blink tr4, r63 - -.L_ret_h: - st.w r31, 0, r2 - blink tr4, r63 - -.L_ret_i: - st.l r31, 0, r2 - # Fall - -.L_epilogue: - # Remove the space we pushed for the args - add r14, r63, r15 - - ld.l r15, 0, r14 - ld.l r15, 4, r18 - ld.q r15, 8, r28 - ld.q r15, 16, r29 - ld.q r15, 24, r30 - ld.q r15, 32, r31 - ld.q r15, 40, r32 - addi.l r15, 48, r15 - ptabs r18, tr0 - blink tr0, r63 - -.LFE1: -.ffi_call_SYSV_end: - .size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV) - - .align 5 -ENTRY(ffi_closure_SYSV) -.LFB2: - addi.l r15, -136, r15 -.LCFI3: - st.l r15, 12, r18 - st.l r15, 8, r14 - st.l r15, 4, r12 -.LCFI4: - add r15, r63, r14 -.LCFI5: - /* Stack layout: - ... - 64 bytes (register parameters) - 48 bytes (floating register parameters) - 8 bytes (result) - 4 bytes (r18) - 4 bytes (r14) - 4 bytes (r12) - 4 bytes (for align) - <- new stack pointer - */ - fst.d r14, 24, dr0 - fst.d r14, 32, dr2 - fst.d r14, 40, dr4 - fst.d r14, 48, dr6 - fst.d r14, 56, dr8 - fst.d r14, 64, dr10 - st.q r14, 72, r2 - st.q r14, 80, r3 - st.q r14, 88, r4 - st.q r14, 96, r5 - st.q r14, 104, r6 - st.q r14, 112, r7 - st.q r14, 120, r8 - st.q r14, 128, r9 - - add r1, r63, r2 - addi r14, 16, r3 - addi r14, 72, r4 - addi r14, 24, r5 - addi r14, 136, r6 -#ifdef PIC - movi (((datalabel _GLOBAL_OFFSET_TABLE_-(.LPCS0-.)) >> 16) & 65535), r12 - shori ((datalabel _GLOBAL_OFFSET_TABLE_-(.LPCS0-.)) & 65535), r12 -.LPCS0: ptrel/u r12, tr0 - movi ((ffi_closure_helper_SYSV@GOTPLT) & 65535), r1 - gettr tr0, r12 - ldx.l r1, r12, r1 - ptabs r1, tr0 -#else - pt/l ffi_closure_helper_SYSV, tr0 -#endif - blink tr0, r18 - - shlli r2, 1, r1 - movi (((datalabel .L_table) >> 16) & 65535), r2 - shori ((datalabel .L_table) & 65535), r2 - ldx.w r2, r1, r1 - add r1, r2, r1 - pt/l .L_case_v, tr1 - ptabs r1, tr0 - blink tr0, r63 - - .align 2 -.L_table: - .word .L_case_v - datalabel .L_table /* FFI_TYPE_VOID */ - .word .L_case_i - datalabel .L_table /* FFI_TYPE_INT */ - .word .L_case_f - datalabel .L_table /* FFI_TYPE_FLOAT */ - .word .L_case_d - datalabel .L_table /* FFI_TYPE_DOUBLE */ - .word .L_case_d - datalabel .L_table /* FFI_TYPE_LONGDOUBLE */ - .word .L_case_uq - datalabel .L_table /* FFI_TYPE_UINT8 */ - .word .L_case_q - datalabel .L_table /* FFI_TYPE_SINT8 */ - .word .L_case_uh - datalabel .L_table /* FFI_TYPE_UINT16 */ - .word .L_case_h - datalabel .L_table /* FFI_TYPE_SINT16 */ - .word .L_case_i - datalabel .L_table /* FFI_TYPE_UINT32 */ - .word .L_case_i - datalabel .L_table /* FFI_TYPE_SINT32 */ - .word .L_case_ll - datalabel .L_table /* FFI_TYPE_UINT64 */ - .word .L_case_ll - datalabel .L_table /* FFI_TYPE_SINT64 */ - .word .L_case_v - datalabel .L_table /* FFI_TYPE_STRUCT */ - .word .L_case_i - datalabel .L_table /* FFI_TYPE_POINTER */ - - .align 2 -.L_case_d: - fld.d r14, 16, dr0 - blink tr1, r63 -.L_case_f: - fld.s r14, 16, fr0 - blink tr1, r63 -.L_case_ll: - ld.q r14, 16, r2 - blink tr1, r63 -.L_case_i: - ld.l r14, 16, r2 - blink tr1, r63 -.L_case_q: - ld.b r14, 16, r2 - blink tr1, r63 -.L_case_uq: - ld.ub r14, 16, r2 - blink tr1, r63 -.L_case_h: - ld.w r14, 16, r2 - blink tr1, r63 -.L_case_uh: - ld.uw r14, 16, r2 - blink tr1, r63 -.L_case_v: - add.l r14, r63, r15 - ld.l r15, 4, r12 - ld.l r15, 8, r14 - ld.l r15, 12, r18 - addi.l r15, 136, r15 - ptabs r18, tr0 - blink tr0, r63 - -.LFE2: -.ffi_closure_SYSV_end: - .size CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV) - -#if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",@progbits -#endif - - .section ".eh_frame","aw",@progbits -__FRAME_BEGIN__: - .4byte .LECIE1-.LSCIE1 /* Length of Common Information Entry */ -.LSCIE1: - .4byte 0x0 /* CIE Identifier Tag */ - .byte 0x1 /* CIE Version */ -#ifdef PIC - .ascii "zR\0" /* CIE Augmentation */ -#else - .byte 0x0 /* CIE Augmentation */ -#endif - .uleb128 0x1 /* CIE Code Alignment Factor */ - .sleb128 -4 /* CIE Data Alignment Factor */ - .byte 0x12 /* CIE RA Column */ -#ifdef PIC - .uleb128 0x1 /* Augmentation size */ - .byte 0x10 /* FDE Encoding (pcrel) */ -#endif - .byte 0xc /* DW_CFA_def_cfa */ - .uleb128 0xf - .uleb128 0x0 - .align 2 -.LECIE1: -.LSFDE1: - .4byte datalabel .LEFDE1-datalabel .LASFDE1 /* FDE Length */ -.LASFDE1: - .4byte datalabel .LASFDE1-datalabel __FRAME_BEGIN__ -#ifdef PIC - .4byte .LFB1-. /* FDE initial location */ -#else - .4byte .LFB1 /* FDE initial location */ -#endif - .4byte datalabel .LFE1-datalabel .LFB1 /* FDE address range */ -#ifdef PIC - .uleb128 0x0 /* Augmentation size */ -#endif - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte datalabel .LCFI0-datalabel .LFB1 - .byte 0xe /* DW_CFA_def_cfa_offset */ - .uleb128 0x30 - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte datalabel .LCFI1-datalabel .LCFI0 - .byte 0x8e /* DW_CFA_offset, column 0xe */ - .uleb128 0xc - .byte 0x92 /* DW_CFA_offset, column 0x12 */ - .uleb128 0xb - .byte 0x9c /* DW_CFA_offset, column 0x1c */ - .uleb128 0xa - .byte 0x9d /* DW_CFA_offset, column 0x1d */ - .uleb128 0x8 - .byte 0x9e /* DW_CFA_offset, column 0x1e */ - .uleb128 0x6 - .byte 0x9f /* DW_CFA_offset, column 0x1f */ - .uleb128 0x4 - .byte 0xa0 /* DW_CFA_offset, column 0x20 */ - .uleb128 0x2 - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte datalabel .LCFI2-datalabel .LCFI1 - .byte 0xd /* DW_CFA_def_cfa_register */ - .uleb128 0xe - .align 2 -.LEFDE1: - -.LSFDE3: - .4byte datalabel .LEFDE3-datalabel .LASFDE3 /* FDE Length */ -.LASFDE3: - .4byte datalabel .LASFDE3-datalabel __FRAME_BEGIN__ -#ifdef PIC - .4byte .LFB2-. /* FDE initial location */ -#else - .4byte .LFB2 /* FDE initial location */ -#endif - .4byte datalabel .LFE2-datalabel .LFB2 /* FDE address range */ -#ifdef PIC - .uleb128 0x0 /* Augmentation size */ -#endif - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte datalabel .LCFI3-datalabel .LFB2 - .byte 0xe /* DW_CFA_def_cfa_offset */ - .uleb128 0x88 - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte datalabel .LCFI4-datalabel .LCFI3 - .byte 0x8c /* DW_CFA_offset, column 0xc */ - .uleb128 0x21 - .byte 0x8e /* DW_CFA_offset, column 0xe */ - .uleb128 0x20 - .byte 0x92 /* DW_CFA_offset, column 0x12 */ - .uleb128 0x1f - .byte 0x4 /* DW_CFA_advance_loc4 */ - .4byte datalabel .LCFI5-datalabel .LCFI4 - .byte 0xd /* DW_CFA_def_cfa_register */ - .uleb128 0xe - .align 2 -.LEFDE3: diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sparc/ffi.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sparc/ffi.c deleted file mode 100644 index 9e406d0..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sparc/ffi.c +++ /dev/null @@ -1,468 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2011, 2013 Anthony Green - Copyright (c) 1996, 2003-2004, 2007-2008 Red Hat, Inc. - - SPARC Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#include -#include -#include -#include "internal.h" - -#ifndef SPARC64 - -/* Force FFI_TYPE_LONGDOUBLE to be different than FFI_TYPE_DOUBLE; - all further uses in this file will refer to the 128-bit type. */ -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE -# if FFI_TYPE_LONGDOUBLE != 4 -# error FFI_TYPE_LONGDOUBLE out of date -# endif -#else -# undef FFI_TYPE_LONGDOUBLE -# define FFI_TYPE_LONGDOUBLE 4 -#endif - -/* Perform machine dependent cif processing */ -ffi_status FFI_HIDDEN -ffi_prep_cif_machdep(ffi_cif *cif) -{ - ffi_type *rtype = cif->rtype; - int rtt = rtype->type; - size_t bytes; - int i, n, flags; - - /* Set the return type flag */ - switch (rtt) - { - case FFI_TYPE_VOID: - flags = SPARC_RET_VOID; - break; - case FFI_TYPE_FLOAT: - flags = SPARC_RET_F_1; - break; - case FFI_TYPE_DOUBLE: - flags = SPARC_RET_F_2; - break; - case FFI_TYPE_LONGDOUBLE: - case FFI_TYPE_STRUCT: - flags = (rtype->size & 0xfff) << SPARC_SIZEMASK_SHIFT; - flags |= SPARC_RET_STRUCT; - break; - case FFI_TYPE_SINT8: - flags = SPARC_RET_SINT8; - break; - case FFI_TYPE_UINT8: - flags = SPARC_RET_UINT8; - break; - case FFI_TYPE_SINT16: - flags = SPARC_RET_SINT16; - break; - case FFI_TYPE_UINT16: - flags = SPARC_RET_UINT16; - break; - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - case FFI_TYPE_POINTER: - flags = SPARC_RET_UINT32; - break; - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - flags = SPARC_RET_INT64; - break; - case FFI_TYPE_COMPLEX: - rtt = rtype->elements[0]->type; - switch (rtt) - { - case FFI_TYPE_FLOAT: - flags = SPARC_RET_F_2; - break; - case FFI_TYPE_DOUBLE: - flags = SPARC_RET_F_4; - break; - case FFI_TYPE_LONGDOUBLE: - flags = SPARC_RET_F_8; - break; - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - flags = SPARC_RET_INT128; - break; - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - flags = SPARC_RET_INT64; - break; - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: - flags = SP_V8_RET_CPLX16; - break; - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: - flags = SP_V8_RET_CPLX8; - break; - default: - abort(); - } - break; - default: - abort(); - } - cif->flags = flags; - - bytes = 0; - for (i = 0, n = cif->nargs; i < n; ++i) - { - ffi_type *ty = cif->arg_types[i]; - size_t z = ty->size; - int tt = ty->type; - - switch (tt) - { - case FFI_TYPE_STRUCT: - case FFI_TYPE_LONGDOUBLE: - by_reference: - /* Passed by reference. */ - z = 4; - break; - - case FFI_TYPE_COMPLEX: - tt = ty->elements[0]->type; - if (tt == FFI_TYPE_FLOAT || z > 8) - goto by_reference; - /* FALLTHRU */ - - default: - z = FFI_ALIGN(z, 4); - } - bytes += z; - } - - /* Sparc call frames require that space is allocated for 6 args, - even if they aren't used. Make that space if necessary. */ - if (bytes < 6 * 4) - bytes = 6 * 4; - - /* The ABI always requires space for the struct return pointer. */ - bytes += 4; - - /* The stack must be 2 word aligned, so round bytes up appropriately. */ - bytes = FFI_ALIGN(bytes, 2 * 4); - - /* Include the call frame to prep_args. */ - bytes += 4*16 + 4*8; - cif->bytes = bytes; - - return FFI_OK; -} - -extern void ffi_call_v8(ffi_cif *cif, void (*fn)(void), void *rvalue, - void **avalue, size_t bytes, void *closure) FFI_HIDDEN; - -int FFI_HIDDEN -ffi_prep_args_v8(ffi_cif *cif, unsigned long *argp, void *rvalue, void **avalue) -{ - ffi_type **p_arg; - int flags = cif->flags; - int i, nargs; - - if (rvalue == NULL) - { - if ((flags & SPARC_FLAG_RET_MASK) == SPARC_RET_STRUCT) - { - /* Since we pass the pointer to the callee, we need a value. - We allowed for this space in ffi_call, before ffi_call_v8 - alloca'd the space. */ - rvalue = (char *)argp + cif->bytes; - } - else - { - /* Otherwise, we can ignore the return value. */ - flags = SPARC_RET_VOID; - } - } - - /* This could only really be done when we are returning a structure. - However, the space is reserved so we can do it unconditionally. */ - *argp++ = (unsigned long)rvalue; - -#ifdef USING_PURIFY - /* Purify will probably complain in our assembly routine, - unless we zero out this memory. */ - memset(argp, 0, 6*4); -#endif - - p_arg = cif->arg_types; - for (i = 0, nargs = cif->nargs; i < nargs; i++) - { - ffi_type *ty = p_arg[i]; - void *a = avalue[i]; - int tt = ty->type; - size_t z; - - switch (tt) - { - case FFI_TYPE_STRUCT: - case FFI_TYPE_LONGDOUBLE: - by_reference: - *argp++ = (unsigned long)a; - break; - - case FFI_TYPE_DOUBLE: - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - memcpy(argp, a, 8); - argp += 2; - break; - - case FFI_TYPE_INT: - case FFI_TYPE_FLOAT: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - case FFI_TYPE_POINTER: - *argp++ = *(unsigned *)a; - break; - - case FFI_TYPE_UINT8: - *argp++ = *(UINT8 *)a; - break; - case FFI_TYPE_SINT8: - *argp++ = *(SINT8 *)a; - break; - case FFI_TYPE_UINT16: - *argp++ = *(UINT16 *)a; - break; - case FFI_TYPE_SINT16: - *argp++ = *(SINT16 *)a; - break; - - case FFI_TYPE_COMPLEX: - tt = ty->elements[0]->type; - z = ty->size; - if (tt == FFI_TYPE_FLOAT || z > 8) - goto by_reference; - if (z < 4) - { - memcpy((char *)argp + 4 - z, a, z); - argp++; - } - else - { - memcpy(argp, a, z); - argp += z / 4; - } - break; - - default: - abort(); - } - } - - return flags; -} - -static void -ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue, - void **avalue, void *closure) -{ - size_t bytes = cif->bytes; - - FFI_ASSERT (cif->abi == FFI_V8); - - /* If we've not got a return value, we need to create one if we've - got to pass the return value to the callee. Otherwise ignore it. */ - if (rvalue == NULL - && (cif->flags & SPARC_FLAG_RET_MASK) == SPARC_RET_STRUCT) - bytes += FFI_ALIGN (cif->rtype->size, 8); - - ffi_call_v8(cif, fn, rvalue, avalue, -bytes, closure); -} - -void -ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - ffi_call_int (cif, fn, rvalue, avalue, NULL); -} - -void -ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue, - void **avalue, void *closure) -{ - ffi_call_int (cif, fn, rvalue, avalue, closure); -} - -#ifdef __GNUC__ -static inline void -ffi_flush_icache (void *p) -{ - /* SPARC v8 requires 5 instructions for flush to be visible */ - asm volatile ("iflush %0; iflush %0+8; nop; nop; nop; nop; nop" - : : "r" (p) : "memory"); -} -#else -extern void ffi_flush_icache (void *) FFI_HIDDEN; -#endif - -extern void ffi_closure_v8(void) FFI_HIDDEN; -extern void ffi_go_closure_v8(void) FFI_HIDDEN; - -ffi_status -ffi_prep_closure_loc (ffi_closure *closure, - ffi_cif *cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, - void *codeloc) -{ - unsigned int *tramp = (unsigned int *) &closure->tramp[0]; - unsigned long ctx = (unsigned long) closure; - unsigned long fn = (unsigned long) ffi_closure_v8; - - if (cif->abi != FFI_V8) - return FFI_BAD_ABI; - - tramp[0] = 0x03000000 | fn >> 10; /* sethi %hi(fn), %g1 */ - tramp[1] = 0x05000000 | ctx >> 10; /* sethi %hi(ctx), %g2 */ - tramp[2] = 0x81c06000 | (fn & 0x3ff); /* jmp %g1+%lo(fn) */ - tramp[3] = 0x8410a000 | (ctx & 0x3ff);/* or %g2, %lo(ctx) */ - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - ffi_flush_icache (closure); - - return FFI_OK; -} - -ffi_status -ffi_prep_go_closure (ffi_go_closure *closure, ffi_cif *cif, - void (*fun)(ffi_cif*, void*, void**, void*)) -{ - if (cif->abi != FFI_V8) - return FFI_BAD_ABI; - - closure->tramp = ffi_go_closure_v8; - closure->cif = cif; - closure->fun = fun; - - return FFI_OK; -} - -int FFI_HIDDEN -ffi_closure_sparc_inner_v8(ffi_cif *cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, void *rvalue, - unsigned long *argp) -{ - ffi_type **arg_types; - void **avalue; - int i, nargs, flags; - - arg_types = cif->arg_types; - nargs = cif->nargs; - flags = cif->flags; - avalue = alloca(nargs * sizeof(void *)); - - /* Copy the caller's structure return address so that the closure - returns the data directly to the caller. Also install it so we - can return the address in %o0. */ - if ((flags & SPARC_FLAG_RET_MASK) == SPARC_RET_STRUCT) - { - void *new_rvalue = (void *)*argp; - *(void **)rvalue = new_rvalue; - rvalue = new_rvalue; - } - - /* Always skip the structure return address. */ - argp++; - - /* Grab the addresses of the arguments from the stack frame. */ - for (i = 0; i < nargs; i++) - { - ffi_type *ty = arg_types[i]; - int tt = ty->type; - void *a = argp; - size_t z; - - switch (tt) - { - case FFI_TYPE_STRUCT: - case FFI_TYPE_LONGDOUBLE: - by_reference: - /* Straight copy of invisible reference. */ - a = (void *)*argp; - break; - - case FFI_TYPE_DOUBLE: - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - if ((unsigned long)a & 7) - { - /* Align on a 8-byte boundary. */ - UINT64 *tmp = alloca(8); - *tmp = ((UINT64)argp[0] << 32) | argp[1]; - a = tmp; - } - argp++; - break; - - case FFI_TYPE_INT: - case FFI_TYPE_FLOAT: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - case FFI_TYPE_POINTER: - break; - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT16: - a += 2; - break; - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT8: - a += 3; - break; - - case FFI_TYPE_COMPLEX: - tt = ty->elements[0]->type; - z = ty->size; - if (tt == FFI_TYPE_FLOAT || z > 8) - goto by_reference; - if (z < 4) - a += 4 - z; - else if (z > 4) - argp++; - break; - - default: - abort(); - } - argp++; - avalue[i] = a; - } - - /* Invoke the closure. */ - fun (cif, rvalue, avalue, user_data); - - /* Tell ffi_closure_sparc how to perform return type promotions. */ - return flags; -} -#endif /* !SPARC64 */ diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sparc/ffi64.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sparc/ffi64.c deleted file mode 100644 index 9e04061..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sparc/ffi64.c +++ /dev/null @@ -1,608 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2011, 2013 Anthony Green - Copyright (c) 1996, 2003-2004, 2007-2008 Red Hat, Inc. - - SPARC Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#include -#include -#include -#include "internal.h" - -/* Force FFI_TYPE_LONGDOUBLE to be different than FFI_TYPE_DOUBLE; - all further uses in this file will refer to the 128-bit type. */ -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE -# if FFI_TYPE_LONGDOUBLE != 4 -# error FFI_TYPE_LONGDOUBLE out of date -# endif -#else -# undef FFI_TYPE_LONGDOUBLE -# define FFI_TYPE_LONGDOUBLE 4 -#endif - -#ifdef SPARC64 - -/* Flatten the contents of a structure to the parts that are passed in - floating point registers. The return is a bit mask wherein bit N - set means bytes [4*n, 4*n+3] are passed in %fN. - - We encode both the (running) size (maximum 32) and mask (maxumum 255) - into one integer. The size is placed in the low byte, so that align - and addition work correctly. The mask is placed in the second byte. */ - -static int -ffi_struct_float_mask (ffi_type *outer_type, int size_mask) -{ - ffi_type **elts; - ffi_type *t; - - if (outer_type->type == FFI_TYPE_COMPLEX) - { - int m = 0, tt = outer_type->elements[0]->type; - size_t z = outer_type->size; - - if (tt == FFI_TYPE_FLOAT - || tt == FFI_TYPE_DOUBLE - || tt == FFI_TYPE_LONGDOUBLE) - m = (1 << (z / 4)) - 1; - return (m << 8) | z; - } - FFI_ASSERT (outer_type->type == FFI_TYPE_STRUCT); - - for (elts = outer_type->elements; (t = *elts) != NULL; elts++) - { - size_t z = t->size; - int o, m, tt; - - size_mask = FFI_ALIGN(size_mask, t->alignment); - switch (t->type) - { - case FFI_TYPE_STRUCT: - size_mask = ffi_struct_float_mask (t, size_mask); - continue; - case FFI_TYPE_COMPLEX: - tt = t->elements[0]->type; - if (tt != FFI_TYPE_FLOAT - && tt != FFI_TYPE_DOUBLE - && tt != FFI_TYPE_LONGDOUBLE) - break; - /* FALLTHRU */ - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - case FFI_TYPE_LONGDOUBLE: - m = (1 << (z / 4)) - 1; /* compute mask for type */ - o = (size_mask >> 2) & 0x3f; /* extract word offset */ - size_mask |= m << (o + 8); /* insert mask into place */ - break; - } - size_mask += z; - } - - size_mask = FFI_ALIGN(size_mask, outer_type->alignment); - FFI_ASSERT ((size_mask & 0xff) == outer_type->size); - - return size_mask; -} - -/* Merge floating point data into integer data. If the structure is - entirely floating point, simply return a pointer to the fp data. */ - -static void * -ffi_struct_float_merge (int size_mask, void *vi, void *vf) -{ - int size = size_mask & 0xff; - int mask = size_mask >> 8; - int n = size >> 2; - - if (mask == 0) - return vi; - else if (mask == (1 << n) - 1) - return vf; - else - { - unsigned int *wi = vi, *wf = vf; - int i; - - for (i = 0; i < n; ++i) - if ((mask >> i) & 1) - wi[i] = wf[i]; - - return vi; - } -} - -/* Similar, but place the data into VD in the end. */ - -void FFI_HIDDEN -ffi_struct_float_copy (int size_mask, void *vd, void *vi, void *vf) -{ - int size = size_mask & 0xff; - int mask = size_mask >> 8; - int n = size >> 2; - - if (mask == 0) - ; - else if (mask == (1 << n) - 1) - vi = vf; - else - { - unsigned int *wd = vd, *wi = vi, *wf = vf; - int i; - - for (i = 0; i < n; ++i) - wd[i] = ((mask >> i) & 1 ? wf : wi)[i]; - return; - } - memcpy (vd, vi, size); -} - -/* Perform machine dependent cif processing */ - -static ffi_status -ffi_prep_cif_machdep_core(ffi_cif *cif) -{ - ffi_type *rtype = cif->rtype; - int rtt = rtype->type; - size_t bytes = 0; - int i, n, flags; - - /* Set the return type flag */ - switch (rtt) - { - case FFI_TYPE_VOID: - flags = SPARC_RET_VOID; - break; - case FFI_TYPE_FLOAT: - flags = SPARC_RET_F_1; - break; - case FFI_TYPE_DOUBLE: - flags = SPARC_RET_F_2; - break; - case FFI_TYPE_LONGDOUBLE: - flags = SPARC_RET_F_4; - break; - - case FFI_TYPE_COMPLEX: - case FFI_TYPE_STRUCT: - if (rtype->size > 32) - { - flags = SPARC_RET_VOID | SPARC_FLAG_RET_IN_MEM; - bytes = 8; - } - else - { - int size_mask = ffi_struct_float_mask (rtype, 0); - int word_size = (size_mask >> 2) & 0x3f; - int all_mask = (1 << word_size) - 1; - int fp_mask = size_mask >> 8; - - flags = (size_mask << SPARC_SIZEMASK_SHIFT) | SPARC_RET_STRUCT; - - /* For special cases of all-int or all-fp, we can return - the value directly without popping through a struct copy. */ - if (fp_mask == 0) - { - if (rtype->alignment >= 8) - { - if (rtype->size == 8) - flags = SPARC_RET_INT64; - else if (rtype->size == 16) - flags = SPARC_RET_INT128; - } - } - else if (fp_mask == all_mask) - switch (word_size) - { - case 1: flags = SPARC_RET_F_1; break; - case 2: flags = SPARC_RET_F_2; break; - case 3: flags = SP_V9_RET_F_3; break; - case 4: flags = SPARC_RET_F_4; break; - /* 5 word structures skipped; handled via RET_STRUCT. */ - case 6: flags = SPARC_RET_F_6; break; - /* 7 word structures skipped; handled via RET_STRUCT. */ - case 8: flags = SPARC_RET_F_8; break; - } - } - break; - - case FFI_TYPE_SINT8: - flags = SPARC_RET_SINT8; - break; - case FFI_TYPE_UINT8: - flags = SPARC_RET_UINT8; - break; - case FFI_TYPE_SINT16: - flags = SPARC_RET_SINT16; - break; - case FFI_TYPE_UINT16: - flags = SPARC_RET_UINT16; - break; - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: - flags = SP_V9_RET_SINT32; - break; - case FFI_TYPE_UINT32: - flags = SPARC_RET_UINT32; - break; - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - case FFI_TYPE_POINTER: - flags = SPARC_RET_INT64; - break; - - default: - abort(); - } - - bytes = 0; - for (i = 0, n = cif->nargs; i < n; ++i) - { - ffi_type *ty = cif->arg_types[i]; - size_t z = ty->size; - size_t a = ty->alignment; - - switch (ty->type) - { - case FFI_TYPE_COMPLEX: - case FFI_TYPE_STRUCT: - /* Large structs passed by reference. */ - if (z > 16) - { - a = z = 8; - break; - } - /* Small structs may be passed in integer or fp regs or both. */ - if (bytes >= 16*8) - break; - if ((ffi_struct_float_mask (ty, 0) & 0xff00) == 0) - break; - /* FALLTHRU */ - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - case FFI_TYPE_LONGDOUBLE: - flags |= SPARC_FLAG_FP_ARGS; - break; - } - bytes = FFI_ALIGN(bytes, a); - bytes += FFI_ALIGN(z, 8); - } - - /* Sparc call frames require that space is allocated for 6 args, - even if they aren't used. Make that space if necessary. */ - if (bytes < 6 * 8) - bytes = 6 * 8; - - /* The stack must be 2 word aligned, so round bytes up appropriately. */ - bytes = FFI_ALIGN(bytes, 16); - - /* Include the call frame to prep_args. */ - bytes += 8*16 + 8*8; - - cif->bytes = bytes; - cif->flags = flags; - return FFI_OK; -} - -ffi_status FFI_HIDDEN -ffi_prep_cif_machdep(ffi_cif *cif) -{ - cif->nfixedargs = cif->nargs; - return ffi_prep_cif_machdep_core(cif); -} - -ffi_status FFI_HIDDEN -ffi_prep_cif_machdep_var(ffi_cif *cif, unsigned nfixedargs, unsigned ntotalargs) -{ - cif->nfixedargs = nfixedargs; - return ffi_prep_cif_machdep_core(cif); -} - -extern void ffi_call_v9(ffi_cif *cif, void (*fn)(void), void *rvalue, - void **avalue, size_t bytes, void *closure) FFI_HIDDEN; - -/* ffi_prep_args is called by the assembly routine once stack space - has been allocated for the function's arguments */ - -int FFI_HIDDEN -ffi_prep_args_v9(ffi_cif *cif, unsigned long *argp, void *rvalue, void **avalue) -{ - ffi_type **p_arg; - int flags = cif->flags; - int i, nargs; - - if (rvalue == NULL) - { - if (flags & SPARC_FLAG_RET_IN_MEM) - { - /* Since we pass the pointer to the callee, we need a value. - We allowed for this space in ffi_call, before ffi_call_v8 - alloca'd the space. */ - rvalue = (char *)argp + cif->bytes; - } - else - { - /* Otherwise, we can ignore the return value. */ - flags = SPARC_RET_VOID; - } - } - -#ifdef USING_PURIFY - /* Purify will probably complain in our assembly routine, - unless we zero out this memory. */ - memset(argp, 0, 6*8); -#endif - - if (flags & SPARC_FLAG_RET_IN_MEM) - *argp++ = (unsigned long)rvalue; - - p_arg = cif->arg_types; - for (i = 0, nargs = cif->nargs; i < nargs; i++) - { - ffi_type *ty = p_arg[i]; - void *a = avalue[i]; - size_t z; - - switch (ty->type) - { - case FFI_TYPE_SINT8: - *argp++ = *(SINT8 *)a; - break; - case FFI_TYPE_UINT8: - *argp++ = *(UINT8 *)a; - break; - case FFI_TYPE_SINT16: - *argp++ = *(SINT16 *)a; - break; - case FFI_TYPE_UINT16: - *argp++ = *(UINT16 *)a; - break; - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: - *argp++ = *(SINT32 *)a; - break; - case FFI_TYPE_UINT32: - case FFI_TYPE_FLOAT: - *argp++ = *(UINT32 *)a; - break; - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - case FFI_TYPE_POINTER: - case FFI_TYPE_DOUBLE: - *argp++ = *(UINT64 *)a; - break; - - case FFI_TYPE_LONGDOUBLE: - case FFI_TYPE_COMPLEX: - case FFI_TYPE_STRUCT: - z = ty->size; - if (z > 16) - { - /* For structures larger than 16 bytes we pass reference. */ - *argp++ = (unsigned long)a; - break; - } - if (((unsigned long)argp & 15) && ty->alignment > 8) - argp++; - memcpy(argp, a, z); - argp += FFI_ALIGN(z, 8) / 8; - break; - - default: - abort(); - } - } - - return flags; -} - -static void -ffi_call_int(ffi_cif *cif, void (*fn)(void), void *rvalue, - void **avalue, void *closure) -{ - size_t bytes = cif->bytes; - - FFI_ASSERT (cif->abi == FFI_V9); - - if (rvalue == NULL && (cif->flags & SPARC_FLAG_RET_IN_MEM)) - bytes += FFI_ALIGN (cif->rtype->size, 16); - - ffi_call_v9(cif, fn, rvalue, avalue, -bytes, closure); -} - -void -ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - ffi_call_int(cif, fn, rvalue, avalue, NULL); -} - -void -ffi_call_go(ffi_cif *cif, void (*fn)(void), void *rvalue, - void **avalue, void *closure) -{ - ffi_call_int(cif, fn, rvalue, avalue, closure); -} - -#ifdef __GNUC__ -static inline void -ffi_flush_icache (void *p) -{ - asm volatile ("flush %0; flush %0+8" : : "r" (p) : "memory"); -} -#else -extern void ffi_flush_icache (void *) FFI_HIDDEN; -#endif - -extern void ffi_closure_v9(void) FFI_HIDDEN; -extern void ffi_go_closure_v9(void) FFI_HIDDEN; - -ffi_status -ffi_prep_closure_loc (ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, - void *codeloc) -{ - unsigned int *tramp = (unsigned int *) &closure->tramp[0]; - unsigned long fn; - - if (cif->abi != FFI_V9) - return FFI_BAD_ABI; - - /* Trampoline address is equal to the closure address. We take advantage - of that to reduce the trampoline size by 8 bytes. */ - fn = (unsigned long) ffi_closure_v9; - tramp[0] = 0x83414000; /* rd %pc, %g1 */ - tramp[1] = 0xca586010; /* ldx [%g1+16], %g5 */ - tramp[2] = 0x81c14000; /* jmp %g5 */ - tramp[3] = 0x01000000; /* nop */ - *((unsigned long *) &tramp[4]) = fn; - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - ffi_flush_icache (closure); - - return FFI_OK; -} - -ffi_status -ffi_prep_go_closure (ffi_go_closure* closure, ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*)) -{ - if (cif->abi != FFI_V9) - return FFI_BAD_ABI; - - closure->tramp = ffi_go_closure_v9; - closure->cif = cif; - closure->fun = fun; - - return FFI_OK; -} - -int FFI_HIDDEN -ffi_closure_sparc_inner_v9(ffi_cif *cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, void *rvalue, - unsigned long *gpr, unsigned long *fpr) -{ - ffi_type **arg_types; - void **avalue; - int i, argn, argx, nargs, flags, nfixedargs; - - arg_types = cif->arg_types; - nargs = cif->nargs; - flags = cif->flags; - nfixedargs = cif->nfixedargs; - - avalue = alloca(nargs * sizeof(void *)); - - /* Copy the caller's structure return address so that the closure - returns the data directly to the caller. */ - if (flags & SPARC_FLAG_RET_IN_MEM) - { - rvalue = (void *) gpr[0]; - /* Skip the structure return address. */ - argn = 1; - } - else - argn = 0; - - /* Grab the addresses of the arguments from the stack frame. */ - for (i = 0; i < nargs; i++, argn = argx) - { - int named = i < nfixedargs; - ffi_type *ty = arg_types[i]; - void *a = &gpr[argn]; - size_t z; - - argx = argn + 1; - switch (ty->type) - { - case FFI_TYPE_COMPLEX: - case FFI_TYPE_STRUCT: - z = ty->size; - if (z > 16) - a = *(void **)a; - else - { - argx = argn + FFI_ALIGN (z, 8) / 8; - if (named && argn < 16) - { - int size_mask = ffi_struct_float_mask (ty, 0); - int argn_mask = (0xffff00 >> argn) & 0xff00; - - /* Eliminate fp registers off the end. */ - size_mask = (size_mask & 0xff) | (size_mask & argn_mask); - a = ffi_struct_float_merge (size_mask, gpr+argn, fpr+argn); - } - } - break; - - case FFI_TYPE_LONGDOUBLE: - argn = FFI_ALIGN (argn, 2); - a = (named && argn < 16 ? fpr : gpr) + argn; - argx = argn + 2; - break; - case FFI_TYPE_DOUBLE: - if (named && argn < 16) - a = fpr + argn; - break; - case FFI_TYPE_FLOAT: - if (named && argn < 16) - a = fpr + argn; - a += 4; - break; - - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - case FFI_TYPE_POINTER: - break; - case FFI_TYPE_INT: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - a += 4; - break; - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT16: - a += 6; - break; - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT8: - a += 7; - break; - - default: - abort(); - } - avalue[i] = a; - } - - /* Invoke the closure. */ - fun (cif, rvalue, avalue, user_data); - - /* Tell ffi_closure_sparc how to perform return type promotions. */ - return flags; -} -#endif /* SPARC64 */ diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sparc/ffitarget.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sparc/ffitarget.h deleted file mode 100644 index 2f4cd9a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sparc/ffitarget.h +++ /dev/null @@ -1,81 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - Copyright (c) 1996-2003 Red Hat, Inc. - Target configuration macros for SPARC. - - 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. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -/* ---- System specific configurations ----------------------------------- */ - -#if defined(__arch64__) || defined(__sparcv9) -#ifndef SPARC64 -#define SPARC64 -#endif -#endif - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, -#ifdef SPARC64 - FFI_V9, - FFI_DEFAULT_ABI = FFI_V9, -#else - FFI_V8, - FFI_DEFAULT_ABI = FFI_V8, -#endif - FFI_LAST_ABI -} ffi_abi; -#endif - -#define FFI_TARGET_SPECIFIC_STACK_SPACE_ALLOCATION 1 -#define FFI_TARGET_HAS_COMPLEX_TYPE 1 - -#ifdef SPARC64 -# define FFI_TARGET_SPECIFIC_VARIADIC 1 -# define FFI_EXTRA_CIF_FIELDS unsigned int nfixedargs -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_GO_CLOSURES 1 -#define FFI_NATIVE_RAW_API 0 - -#ifdef SPARC64 -#define FFI_TRAMPOLINE_SIZE 24 -#else -#define FFI_TRAMPOLINE_SIZE 16 -#endif - -#endif - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sparc/internal.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sparc/internal.h deleted file mode 100644 index 0a66472..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sparc/internal.h +++ /dev/null @@ -1,26 +0,0 @@ -#define SPARC_RET_VOID 0 -#define SPARC_RET_STRUCT 1 -#define SPARC_RET_UINT8 2 -#define SPARC_RET_SINT8 3 -#define SPARC_RET_UINT16 4 -#define SPARC_RET_SINT16 5 -#define SPARC_RET_UINT32 6 -#define SP_V9_RET_SINT32 7 /* v9 only */ -#define SP_V8_RET_CPLX16 7 /* v8 only */ -#define SPARC_RET_INT64 8 -#define SPARC_RET_INT128 9 - -/* Note that F_7 is missing, and is handled by SPARC_RET_STRUCT. */ -#define SPARC_RET_F_8 10 -#define SPARC_RET_F_6 11 -#define SPARC_RET_F_4 12 -#define SPARC_RET_F_2 13 -#define SP_V9_RET_F_3 14 /* v9 only */ -#define SP_V8_RET_CPLX8 14 /* v8 only */ -#define SPARC_RET_F_1 15 - -#define SPARC_FLAG_RET_MASK 15 -#define SPARC_FLAG_RET_IN_MEM 32 -#define SPARC_FLAG_FP_ARGS 64 - -#define SPARC_SIZEMASK_SHIFT 8 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sparc/v8.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sparc/v8.S deleted file mode 100644 index a2e4908..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sparc/v8.S +++ /dev/null @@ -1,443 +0,0 @@ -/* ----------------------------------------------------------------------- - v8.S - Copyright (c) 2013 The Written Word, Inc. - Copyright (c) 1996, 1997, 2003, 2004, 2008 Red Hat, Inc. - - SPARC Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include -#include "internal.h" - -#ifndef SPARC64 - -#define C2(X, Y) X ## Y -#define C1(X, Y) C2(X, Y) - -#ifdef __USER_LABEL_PREFIX__ -# define C(Y) C1(__USER_LABEL_PREFIX__, Y) -#else -# define C(Y) Y -#endif -#define L(Y) C1(.L, Y) - - .text - -#ifndef __GNUC__ - .align 8 - .globl C(ffi_flush_icache) - .type C(ffi_flush_icache),#function - FFI_HIDDEN(C(ffi_flush_icache)) - -C(ffi_flush_icache): -1: iflush %o0 - iflush %o+8 - nop - nop - nop - nop - nop - retl - nop - .size C(ffi_flush_icache), . - C(ffi_flush_icache) -#endif - -#if defined(__sun__) && defined(__svr4__) -# define E(INDEX) .align 16 -#else -# define E(INDEX) .align 16; .org 2b + INDEX * 16 -#endif - - .align 8 - .globl C(ffi_call_v8) - .type C(ffi_call_v8),#function - FFI_HIDDEN(C(ffi_call_v8)) - -C(ffi_call_v8): -.LUW0: - ! Allocate a stack frame sized by ffi_call. - save %sp, %o4, %sp -.LUW1: - mov %i0, %o0 ! copy cif - add %sp, 64+32, %o1 ! load args area - mov %i2, %o2 ! copy rvalue - call C(ffi_prep_args_v8) - mov %i3, %o3 ! copy avalue - - add %sp, 32, %sp ! deallocate prep frame - and %o0, SPARC_FLAG_RET_MASK, %l0 ! save return type - srl %o0, SPARC_SIZEMASK_SHIFT, %l1 ! save return size - ld [%sp+64+4], %o0 ! load all argument registers - ld [%sp+64+8], %o1 - ld [%sp+64+12], %o2 - ld [%sp+64+16], %o3 - cmp %l0, SPARC_RET_STRUCT ! struct return needs an unimp 4 - ld [%sp+64+20], %o4 - be 8f - ld [%sp+64+24], %o5 - - ! Call foreign function - call %i1 - mov %i5, %g2 ! load static chain - -0: call 1f ! load pc in %o7 - sll %l0, 4, %l0 -1: add %o7, %l0, %o7 ! o7 = 0b + ret_type*16 - jmp %o7+(2f-0b) - nop - - ! Note that each entry is 4 insns, enforced by the E macro. - .align 16 -2: -E(SPARC_RET_VOID) - ret - restore -E(SPARC_RET_STRUCT) - unimp -E(SPARC_RET_UINT8) - and %o0, 0xff, %o0 - st %o0, [%i2] - ret - restore -E(SPARC_RET_SINT8) - sll %o0, 24, %o0 - b 7f - sra %o0, 24, %o0 -E(SPARC_RET_UINT16) - sll %o0, 16, %o0 - b 7f - srl %o0, 16, %o0 -E(SPARC_RET_SINT16) - sll %o0, 16, %o0 - b 7f - sra %o0, 16, %o0 -E(SPARC_RET_UINT32) -7: st %o0, [%i2] - ret - restore -E(SP_V8_RET_CPLX16) - sth %o0, [%i2+2] - b 9f - srl %o0, 16, %o0 -E(SPARC_RET_INT64) - st %o0, [%i2] - st %o1, [%i2+4] - ret - restore -E(SPARC_RET_INT128) - std %o0, [%i2] - std %o2, [%i2+8] - ret - restore -E(SPARC_RET_F_8) - st %f7, [%i2+7*4] - nop - st %f6, [%i2+6*4] - nop -E(SPARC_RET_F_6) - st %f5, [%i2+5*4] - nop - st %f4, [%i2+4*4] - nop -E(SPARC_RET_F_4) - st %f3, [%i2+3*4] - nop - st %f2, [%i2+2*4] - nop -E(SPARC_RET_F_2) - st %f1, [%i2+4] - st %f0, [%i2] - ret - restore -E(SP_V8_RET_CPLX8) - stb %o0, [%i2+1] - b 0f - srl %o0, 8, %o0 -E(SPARC_RET_F_1) - st %f0, [%i2] - ret - restore - - .align 8 -9: sth %o0, [%i2] - ret - restore - .align 8 -0: stb %o0, [%i2] - ret - restore - - ! Struct returning functions expect and skip the unimp here. - ! To make it worse, conforming callees examine the unimp and - ! make sure the low 12 bits of the unimp match the size of - ! the struct being returned. - .align 8 -8: call 1f ! load pc in %o7 - sll %l1, 2, %l0 ! size * 4 -1: sll %l1, 4, %l1 ! size * 16 - add %l0, %l1, %l0 ! size * 20 - add %o7, %l0, %o7 ! o7 = 8b + size*20 - jmp %o7+(2f-8b) - mov %i5, %g2 ! load static chain -2: - -/* The Sun assembler doesn't understand .rept 0x1000. */ -#define rept1 \ - call %i1; \ - nop; \ - unimp (. - 2b) / 20; \ - ret; \ - restore - -#define rept16 \ - rept1; rept1; rept1; rept1; \ - rept1; rept1; rept1; rept1; \ - rept1; rept1; rept1; rept1; \ - rept1; rept1; rept1; rept1 - -#define rept256 \ - rept16; rept16; rept16; rept16; \ - rept16; rept16; rept16; rept16; \ - rept16; rept16; rept16; rept16; \ - rept16; rept16; rept16; rept16 - - rept256; rept256; rept256; rept256 - rept256; rept256; rept256; rept256 - rept256; rept256; rept256; rept256 - rept256; rept256; rept256; rept256 - -.LUW2: - .size C(ffi_call_v8),. - C(ffi_call_v8) - - -/* 16*4 register window + 1*4 struct return + 6*4 args backing store - + 8*4 return storage + 1*4 alignment. */ -#define STACKFRAME (16*4 + 4 + 6*4 + 8*4 + 4) - -/* ffi_closure_v8(...) - - Receives the closure argument in %g2. */ - -#ifdef HAVE_AS_REGISTER_PSEUDO_OP - .register %g2, #scratch -#endif - - .align 8 - .globl C(ffi_go_closure_v8) - .type C(ffi_go_closure_v8),#function - FFI_HIDDEN(C(ffi_go_closure_v8)) - -C(ffi_go_closure_v8): -.LUW3: - save %sp, -STACKFRAME, %sp -.LUW4: - ld [%g2+4], %o0 ! load cif - ld [%g2+8], %o1 ! load fun - b 0f - mov %g2, %o2 ! load user_data -.LUW5: - .size C(ffi_go_closure_v8), . - C(ffi_go_closure_v8) - - .align 8 - .globl C(ffi_closure_v8) - .type C(ffi_closure_v8),#function - FFI_HIDDEN(C(ffi_closure_v8)) - -C(ffi_closure_v8): -.LUW6: - save %sp, -STACKFRAME, %sp -.LUW7: - ld [%g2+FFI_TRAMPOLINE_SIZE], %o0 ! load cif - ld [%g2+FFI_TRAMPOLINE_SIZE+4], %o1 ! load fun - ld [%g2+FFI_TRAMPOLINE_SIZE+8], %o2 ! load user_data -0: - ! Store all of the potential argument registers in va_list format. - st %i0, [%fp+68+0] - st %i1, [%fp+68+4] - st %i2, [%fp+68+8] - st %i3, [%fp+68+12] - st %i4, [%fp+68+16] - st %i5, [%fp+68+20] - - ! Call ffi_closure_sparc_inner to do the bulk of the work. - add %fp, -8*4, %o3 - call ffi_closure_sparc_inner_v8 - add %fp, 64, %o4 - -0: call 1f - and %o0, SPARC_FLAG_RET_MASK, %o0 -1: sll %o0, 4, %o0 ! o0 = o0 * 16 - add %o7, %o0, %o7 ! o7 = 0b + o0*16 - jmp %o7+(2f-0b) - add %fp, -8*4, %i2 - - ! Note that each entry is 4 insns, enforced by the E macro. - .align 16 -2: -E(SPARC_RET_VOID) - ret - restore -E(SPARC_RET_STRUCT) - ld [%i2], %i0 - jmp %i7+12 - restore -E(SPARC_RET_UINT8) - ldub [%i2+3], %i0 - ret - restore -E(SPARC_RET_SINT8) - ldsb [%i2+3], %i0 - ret - restore -E(SPARC_RET_UINT16) - lduh [%i2+2], %i0 - ret - restore -E(SPARC_RET_SINT16) - ldsh [%i2+2], %i0 - ret - restore -E(SPARC_RET_UINT32) - ld [%i2], %i0 - ret - restore -E(SP_V8_RET_CPLX16) - ld [%i2], %i0 - ret - restore -E(SPARC_RET_INT64) - ldd [%i2], %i0 - ret - restore -E(SPARC_RET_INT128) - ldd [%i2], %i0 - ldd [%i2+8], %i2 - ret - restore -E(SPARC_RET_F_8) - ld [%i2+7*4], %f7 - nop - ld [%i2+6*4], %f6 - nop -E(SPARC_RET_F_6) - ld [%i2+5*4], %f5 - nop - ld [%i2+4*4], %f4 - nop -E(SPARC_RET_F_4) - ld [%i2+3*4], %f3 - nop - ld [%i2+2*4], %f2 - nop -E(SPARC_RET_F_2) - ldd [%i2], %f0 - ret - restore -E(SP_V8_RET_CPLX8) - lduh [%i2], %i0 - ret - restore -E(SPARC_RET_F_1) - ld [%i2], %f0 - ret - restore - -.LUW8: - .size C(ffi_closure_v8), . - C(ffi_closure_v8) - -#ifdef HAVE_RO_EH_FRAME - .section ".eh_frame",#alloc -#else - .section ".eh_frame",#alloc,#write -#endif - -#ifdef HAVE_AS_SPARC_UA_PCREL -# define FDE_ADDR(X) %r_disp32(X) -#else -# define FDE_ADDR(X) X -#endif - - .align 4 -.LCIE: - .long .LECIE - .LSCIE ! CIE Length -.LSCIE: - .long 0 ! CIE Identifier Tag - .byte 1 ! CIE Version - .ascii "zR\0" ! CIE Augmentation - .byte 4 ! CIE Code Alignment Factor - .byte 0x7c ! CIE Data Alignment Factor - .byte 15 ! CIE RA Column - .byte 1 ! Augmentation size -#ifdef HAVE_AS_SPARC_UA_PCREL - .byte 0x1b ! FDE Encoding (pcrel sdata4) -#else - .byte 0x50 ! FDE Encoding (aligned absolute) -#endif - .byte 0xc, 14, 0 ! DW_CFA_def_cfa, %o6, offset 0 - .align 4 -.LECIE: - - .long .LEFDE1 - .LSFDE1 ! FDE Length -.LSFDE1: - .long .LSFDE1 - .LCIE ! FDE CIE offset - .long FDE_ADDR(.LUW0) ! Initial location - .long .LUW2 - .LUW0 ! Address range - .byte 0 ! Augmentation size - .byte 0x40+1 ! DW_CFA_advance_loc 4 - .byte 0xd, 30 ! DW_CFA_def_cfa_register, %i6 - .byte 0x2d ! DW_CFA_GNU_window_save - .byte 0x9, 15, 31 ! DW_CFA_register, %o7, %i7 - .align 4 -.LEFDE1: - - .long .LEFDE2 - .LSFDE2 ! FDE Length -.LSFDE2: - .long .LSFDE2 - .LCIE ! FDE CIE offset - .long FDE_ADDR(.LUW3) ! Initial location - .long .LUW5 - .LUW3 ! Address range - .byte 0 ! Augmentation size - .byte 0x40+1 ! DW_CFA_advance_loc 4 - .byte 0xd, 30 ! DW_CFA_def_cfa_register, %i6 - .byte 0x2d ! DW_CFA_GNU_window_save - .byte 0x9, 15, 31 ! DW_CFA_register, %o7, %i7 - .align 4 -.LEFDE2: - - .long .LEFDE3 - .LSFDE3 ! FDE Length -.LSFDE3: - .long .LSFDE3 - .LCIE ! FDE CIE offset - .long FDE_ADDR(.LUW6) ! Initial location - .long .LUW8 - .LUW6 ! Address range - .byte 0 ! Augmentation size - .byte 0x40+1 ! DW_CFA_advance_loc 4 - .byte 0xd, 30 ! DW_CFA_def_cfa_register, %i6 - .byte 0x2d ! DW_CFA_GNU_window_save - .byte 0x9, 15, 31 ! DW_CFA_register, %o7, %i7 - .align 4 -.LEFDE3: - -#endif /* !SPARC64 */ -#if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",@progbits -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sparc/v9.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sparc/v9.S deleted file mode 100644 index 55f8f43..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/sparc/v9.S +++ /dev/null @@ -1,440 +0,0 @@ -/* ----------------------------------------------------------------------- - v9.S - Copyright (c) 2000, 2003, 2004, 2008 Red Hat, Inc. - - SPARC 64-bit Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include -#include "internal.h" - -#ifdef SPARC64 - -#define C2(X, Y) X ## Y -#define C1(X, Y) C2(X, Y) - -#ifdef __USER_LABEL_PREFIX__ -# define C(Y) C1(__USER_LABEL_PREFIX__, Y) -#else -# define C(Y) Y -#endif -#define L(Y) C1(.L, Y) - -#if defined(__sun__) && defined(__svr4__) -# define E(INDEX) .align 16 -#else -# define E(INDEX) .align 16; .org 2b + INDEX * 16 -#endif - -#define STACK_BIAS 2047 - - .text - .align 8 - .globl C(ffi_call_v9) - .type C(ffi_call_v9),#function - FFI_HIDDEN(C(ffi_call_v9)) - -C(ffi_call_v9): -.LUW0: - save %sp, %o4, %sp -.LUW1: - mov %i0, %o0 ! copy cif - add %sp, STACK_BIAS+128+48, %o1 ! load args area - mov %i2, %o2 ! copy rvalue - call C(ffi_prep_args_v9) - mov %i3, %o3 ! copy avalue - - andcc %o0, SPARC_FLAG_FP_ARGS, %g0 ! need fp regs? - add %sp, 48, %sp ! deallocate prep frame - be,pt %xcc, 1f - mov %o0, %l0 ! save flags - - ldd [%sp+STACK_BIAS+128], %f0 ! load all fp arg regs - ldd [%sp+STACK_BIAS+128+8], %f2 - ldd [%sp+STACK_BIAS+128+16], %f4 - ldd [%sp+STACK_BIAS+128+24], %f6 - ldd [%sp+STACK_BIAS+128+32], %f8 - ldd [%sp+STACK_BIAS+128+40], %f10 - ldd [%sp+STACK_BIAS+128+48], %f12 - ldd [%sp+STACK_BIAS+128+56], %f14 - ldd [%sp+STACK_BIAS+128+64], %f16 - ldd [%sp+STACK_BIAS+128+72], %f18 - ldd [%sp+STACK_BIAS+128+80], %f20 - ldd [%sp+STACK_BIAS+128+88], %f22 - ldd [%sp+STACK_BIAS+128+96], %f24 - ldd [%sp+STACK_BIAS+128+104], %f26 - ldd [%sp+STACK_BIAS+128+112], %f28 - ldd [%sp+STACK_BIAS+128+120], %f30 - -1: ldx [%sp+STACK_BIAS+128], %o0 ! load all int arg regs - ldx [%sp+STACK_BIAS+128+8], %o1 - ldx [%sp+STACK_BIAS+128+16], %o2 - ldx [%sp+STACK_BIAS+128+24], %o3 - ldx [%sp+STACK_BIAS+128+32], %o4 - ldx [%sp+STACK_BIAS+128+40], %o5 - call %i1 - mov %i5, %g5 ! load static chain - -0: call 1f ! load pc in %o7 - and %l0, SPARC_FLAG_RET_MASK, %l1 -1: sll %l1, 4, %l1 - add %o7, %l1, %o7 ! o7 = 0b + ret_type*16 - jmp %o7+(2f-0b) - nop - - .align 16 -2: -E(SPARC_RET_VOID) - return %i7+8 - nop -E(SPARC_RET_STRUCT) - add %sp, STACK_BIAS-64+128+48, %l2 - sub %sp, 64, %sp - b 8f - stx %o0, [%l2] -E(SPARC_RET_UINT8) - and %o0, 0xff, %i0 - return %i7+8 - stx %o0, [%o2] -E(SPARC_RET_SINT8) - sll %o0, 24, %o0 - sra %o0, 24, %i0 - return %i7+8 - stx %o0, [%o2] -E(SPARC_RET_UINT16) - sll %o0, 16, %o0 - srl %o0, 16, %i0 - return %i7+8 - stx %o0, [%o2] -E(SPARC_RET_SINT16) - sll %o0, 16, %o0 - sra %o0, 16, %i0 - return %i7+8 - stx %o0, [%o2] -E(SPARC_RET_UINT32) - srl %o0, 0, %i0 - return %i7+8 - stx %o0, [%o2] -E(SP_V9_RET_SINT32) - sra %o0, 0, %i0 - return %i7+8 - stx %o0, [%o2] -E(SPARC_RET_INT64) - stx %o0, [%i2] - return %i7+8 - nop -E(SPARC_RET_INT128) - stx %o0, [%i2] - stx %o1, [%i2+8] - return %i7+8 - nop -E(SPARC_RET_F_8) - st %f7, [%i2+7*4] - nop - st %f6, [%i2+6*4] - nop -E(SPARC_RET_F_6) - st %f5, [%i2+5*4] - nop - st %f4, [%i2+4*4] - nop -E(SPARC_RET_F_4) - std %f2, [%i2+2*4] - return %i7+8 - std %f0, [%o2] -E(SPARC_RET_F_2) - return %i7+8 - std %f0, [%o2] -E(SP_V9_RET_F_3) - st %f2, [%i2+2*4] - nop - st %f1, [%i2+1*4] - nop -E(SPARC_RET_F_1) - return %i7+8 - st %f0, [%o2] - - ! Finish the SPARC_RET_STRUCT sequence. - .align 8 -8: stx %o1, [%l2+8] - stx %o2, [%l2+16] - stx %o3, [%l2+24] - std %f0, [%l2+32] - std %f2, [%l2+40] - std %f4, [%l2+48] - std %f6, [%l2+56] - - ! Copy the structure into place. - srl %l0, SPARC_SIZEMASK_SHIFT, %o0 ! load size_mask - mov %i2, %o1 ! load dst - mov %l2, %o2 ! load src_gp - call C(ffi_struct_float_copy) - add %l2, 32, %o3 ! load src_fp - - return %i7+8 - nop - -.LUW2: - .size C(ffi_call_v9), . - C(ffi_call_v9) - - -#undef STACKFRAME -#define STACKFRAME 336 /* 16*8 register window + - 6*8 args backing store + - 20*8 locals */ -#define FP %fp+STACK_BIAS - -/* ffi_closure_v9(...) - - Receives the closure argument in %g1. */ - - .align 8 - .globl C(ffi_go_closure_v9) - .type C(ffi_go_closure_v9),#function - FFI_HIDDEN(C(ffi_go_closure_v9)) - -C(ffi_go_closure_v9): -.LUW3: - save %sp, -STACKFRAME, %sp -.LUW4: - ldx [%g5+8], %o0 - ldx [%g5+16], %o1 - b 0f - mov %g5, %o2 - -.LUW5: - .size C(ffi_go_closure_v9), . - C(ffi_go_closure_v9) - - .align 8 - .globl C(ffi_closure_v9) - .type C(ffi_closure_v9),#function - FFI_HIDDEN(C(ffi_closure_v9)) - -C(ffi_closure_v9): -.LUW6: - save %sp, -STACKFRAME, %sp -.LUW7: - ldx [%g1+FFI_TRAMPOLINE_SIZE], %o0 - ldx [%g1+FFI_TRAMPOLINE_SIZE+8], %o1 - ldx [%g1+FFI_TRAMPOLINE_SIZE+16], %o2 -0: - ! Store all of the potential argument registers in va_list format. - stx %i0, [FP+128+0] - stx %i1, [FP+128+8] - stx %i2, [FP+128+16] - stx %i3, [FP+128+24] - stx %i4, [FP+128+32] - stx %i5, [FP+128+40] - - ! Store possible floating point argument registers too. - std %f0, [FP-128] - std %f2, [FP-120] - std %f4, [FP-112] - std %f6, [FP-104] - std %f8, [FP-96] - std %f10, [FP-88] - std %f12, [FP-80] - std %f14, [FP-72] - std %f16, [FP-64] - std %f18, [FP-56] - std %f20, [FP-48] - std %f22, [FP-40] - std %f24, [FP-32] - std %f26, [FP-24] - std %f28, [FP-16] - std %f30, [FP-8] - - ! Call ffi_closure_sparc_inner to do the bulk of the work. - add %fp, STACK_BIAS-160, %o3 - add %fp, STACK_BIAS+128, %o4 - call C(ffi_closure_sparc_inner_v9) - add %fp, STACK_BIAS-128, %o5 - -0: call 1f ! load pc in %o7 - and %o0, SPARC_FLAG_RET_MASK, %o0 -1: sll %o0, 4, %o0 ! o2 = i2 * 16 - add %o7, %o0, %o7 ! o7 = 0b + i2*16 - jmp %o7+(2f-0b) - nop - - ! Note that we cannot load the data in the delay slot of - ! the return insn because the data is in the stack frame - ! that is deallocated by the return. - .align 16 -2: -E(SPARC_RET_VOID) - return %i7+8 - nop -E(SPARC_RET_STRUCT) - ldx [FP-160], %i0 - ldd [FP-160], %f0 - b 8f - ldx [FP-152], %i1 -E(SPARC_RET_UINT8) - ldub [FP-160+7], %i0 - return %i7+8 - nop -E(SPARC_RET_SINT8) - ldsb [FP-160+7], %i0 - return %i7+8 - nop -E(SPARC_RET_UINT16) - lduh [FP-160+6], %i0 - return %i7+8 - nop -E(SPARC_RET_SINT16) - ldsh [FP-160+6], %i0 - return %i7+8 - nop -E(SPARC_RET_UINT32) - lduw [FP-160+4], %i0 - return %i7+8 - nop -E(SP_V9_RET_SINT32) - ldsw [FP-160+4], %i0 - return %i7+8 - nop -E(SPARC_RET_INT64) - ldx [FP-160], %i0 - return %i7+8 - nop -E(SPARC_RET_INT128) - ldx [FP-160], %i0 - ldx [FP-160+8], %i1 - return %i7+8 - nop -E(SPARC_RET_F_8) - ld [FP-160+7*4], %f7 - nop - ld [FP-160+6*4], %f6 - nop -E(SPARC_RET_F_6) - ld [FP-160+5*4], %f5 - nop - ld [FP-160+4*4], %f4 - nop -E(SPARC_RET_F_4) - ldd [FP-160], %f0 - ldd [FP-160+8], %f2 - return %i7+8 - nop -E(SPARC_RET_F_2) - ldd [FP-160], %f0 - return %i7+8 - nop -E(SP_V9_RET_F_3) - ld [FP-160+2*4], %f2 - nop - ld [FP-160+1*4], %f1 - nop -E(SPARC_RET_F_1) - ld [FP-160], %f0 - return %i7+8 - nop - - ! Finish the SPARC_RET_STRUCT sequence. - .align 8 -8: ldd [FP-152], %f2 - ldx [FP-144], %i2 - ldd [FP-144], %f4 - ldx [FP-136], %i3 - ldd [FP-136], %f6 - return %i7+8 - nop - -.LUW8: - .size C(ffi_closure_v9), . - C(ffi_closure_v9) - -#ifdef HAVE_RO_EH_FRAME - .section ".eh_frame",#alloc -#else - .section ".eh_frame",#alloc,#write -#endif - -#ifdef HAVE_AS_SPARC_UA_PCREL -# define FDE_RANGE(B, E) .long %r_disp32(B), E - B -#else -# define FDE_RANGE(B, E) .align 8; .xword B, E - B -#endif - - .align 8 -.LCIE: - .long .LECIE - .LSCIE ! CIE Length -.LSCIE: - .long 0 ! CIE Identifier Tag - .byte 1 ! CIE Version - .ascii "zR\0" ! CIE Augmentation - .byte 4 ! CIE Code Alignment Factor - .byte 0x78 ! CIE Data Alignment Factor - .byte 15 ! CIE RA Column - .byte 1 ! Augmentation size -#ifdef HAVE_AS_SPARC_UA_PCREL - .byte 0x1b ! FDE Encoding (pcrel sdata4) -#else - .byte 0x50 ! FDE Encoding (aligned absolute) -#endif - .byte 0xc, 14, 0xff, 0xf ! DW_CFA_def_cfa, %o6, offset 0x7ff - .align 8 -.LECIE: - - .long .LEFDE1 - .LSFDE1 ! FDE Length -.LSFDE1: - .long .LSFDE1 - .LCIE ! FDE CIE offset - FDE_RANGE(.LUW0, .LUW2) - .byte 0 ! Augmentation size - .byte 0x40+1 ! DW_CFA_advance_loc 4 - .byte 0xd, 30 ! DW_CFA_def_cfa_register, %i6 - .byte 0x2d ! DW_CFA_GNU_window_save - .byte 0x9, 15, 31 ! DW_CFA_register, %o7, %i7 - .align 8 -.LEFDE1: - - .long .LEFDE2 - .LSFDE2 ! FDE Length -.LSFDE2: - .long .LSFDE2 - .LCIE ! FDE CIE offset - FDE_RANGE(.LUW3, .LUW5) - .byte 0 ! Augmentation size - .byte 0x40+1 ! DW_CFA_advance_loc 4 - .byte 0xd, 30 ! DW_CFA_def_cfa_register, %i6 - .byte 0x2d ! DW_CFA_GNU_window_save - .byte 0x9, 15, 31 ! DW_CFA_register, %o7, %i7 - .align 8 -.LEFDE2: - - .long .LEFDE3 - .LSFDE3 ! FDE Length -.LSFDE3: - .long .LSFDE3 - .LCIE ! FDE CIE offset - FDE_RANGE(.LUW6, .LUW8) - .byte 0 ! Augmentation size - .byte 0x40+1 ! DW_CFA_advance_loc 4 - .byte 0xd, 30 ! DW_CFA_def_cfa_register, %i6 - .byte 0x2d ! DW_CFA_GNU_window_save - .byte 0x9, 15, 31 ! DW_CFA_register, %o7, %i7 - .align 8 -.LEFDE3: - -#endif /* SPARC64 */ -#ifdef __linux__ - .section .note.GNU-stack,"",@progbits -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/tile/ffi.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/tile/ffi.c deleted file mode 100644 index 3a94469..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/tile/ffi.c +++ /dev/null @@ -1,355 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2012 Tilera Corp. - - TILE Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#include -#include -#include -#include -#include -#include -#include -#include - - -/* The first 10 registers are used to pass arguments and return values. */ -#define NUM_ARG_REGS 10 - -/* Performs a raw function call with the given NUM_ARG_REGS register arguments - and the specified additional stack arguments (if any). */ -extern void ffi_call_tile(ffi_sarg reg_args[NUM_ARG_REGS], - const ffi_sarg *stack_args, - size_t stack_args_bytes, - void (*fnaddr)(void)) - FFI_HIDDEN; - -/* This handles the raw call from the closure stub, cleaning up the - parameters and delegating to ffi_closure_tile_inner. */ -extern void ffi_closure_tile(void) FFI_HIDDEN; - - -ffi_status -ffi_prep_cif_machdep(ffi_cif *cif) -{ - /* We always allocate room for all registers. Even if we don't - use them as parameters, they get returned in the same array - as struct return values so we need to make room. */ - if (cif->bytes < NUM_ARG_REGS * FFI_SIZEOF_ARG) - cif->bytes = NUM_ARG_REGS * FFI_SIZEOF_ARG; - - if (cif->rtype->size > NUM_ARG_REGS * FFI_SIZEOF_ARG) - cif->flags = FFI_TYPE_STRUCT; - else - cif->flags = FFI_TYPE_INT; - - /* Nothing to do. */ - return FFI_OK; -} - - -static long -assign_to_ffi_arg(ffi_sarg *out, void *in, const ffi_type *type, - int write_to_reg) -{ - switch (type->type) - { - case FFI_TYPE_SINT8: - *out = *(SINT8 *)in; - return 1; - - case FFI_TYPE_UINT8: - *out = *(UINT8 *)in; - return 1; - - case FFI_TYPE_SINT16: - *out = *(SINT16 *)in; - return 1; - - case FFI_TYPE_UINT16: - *out = *(UINT16 *)in; - return 1; - - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: -#ifndef __LP64__ - case FFI_TYPE_POINTER: -#endif - /* Note that even unsigned 32-bit quantities are sign extended - on tilegx when stored in a register. */ - *out = *(SINT32 *)in; - return 1; - - case FFI_TYPE_FLOAT: -#ifdef __tilegx__ - if (write_to_reg) - { - /* Properly sign extend the value. */ - union { float f; SINT32 s32; } val; - val.f = *(float *)in; - *out = val.s32; - } - else -#endif - { - *(float *)out = *(float *)in; - } - return 1; - - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - case FFI_TYPE_DOUBLE: -#ifdef __LP64__ - case FFI_TYPE_POINTER: -#endif - *(UINT64 *)out = *(UINT64 *)in; - return sizeof(UINT64) / FFI_SIZEOF_ARG; - - case FFI_TYPE_STRUCT: - memcpy(out, in, type->size); - return (type->size + FFI_SIZEOF_ARG - 1) / FFI_SIZEOF_ARG; - - case FFI_TYPE_VOID: - /* Must be a return type. Nothing to do. */ - return 0; - - default: - FFI_ASSERT(0); - return -1; - } -} - - -void -ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - ffi_sarg * const arg_mem = alloca(cif->bytes); - ffi_sarg * const reg_args = arg_mem; - ffi_sarg * const stack_args = ®_args[NUM_ARG_REGS]; - ffi_sarg *argp = arg_mem; - ffi_type ** const arg_types = cif->arg_types; - const long num_args = cif->nargs; - long i; - - if (cif->flags == FFI_TYPE_STRUCT) - { - /* Pass a hidden pointer to the return value. We make sure there - is scratch space for the callee to store the return value even if - our caller doesn't care about it. */ - *argp++ = (intptr_t)(rvalue ? rvalue : alloca(cif->rtype->size)); - - /* No more work needed to return anything. */ - rvalue = NULL; - } - - for (i = 0; i < num_args; i++) - { - ffi_type *type = arg_types[i]; - void * const arg_in = avalue[i]; - ptrdiff_t arg_word = argp - arg_mem; - -#ifndef __tilegx__ - /* Doubleword-aligned values are always in an even-number register - pair, or doubleword-aligned stack slot if out of registers. */ - long align = arg_word & (type->alignment > FFI_SIZEOF_ARG); - argp += align; - arg_word += align; -#endif - - if (type->type == FFI_TYPE_STRUCT) - { - const size_t arg_size_in_words = - (type->size + FFI_SIZEOF_ARG - 1) / FFI_SIZEOF_ARG; - - if (arg_word < NUM_ARG_REGS && - arg_word + arg_size_in_words > NUM_ARG_REGS) - { - /* Args are not allowed to span registers and the stack. */ - argp = stack_args; - } - - memcpy(argp, arg_in, type->size); - argp += arg_size_in_words; - } - else - { - argp += assign_to_ffi_arg(argp, arg_in, arg_types[i], 1); - } - } - - /* Actually do the call. */ - ffi_call_tile(reg_args, stack_args, - cif->bytes - (NUM_ARG_REGS * FFI_SIZEOF_ARG), fn); - - if (rvalue != NULL) - assign_to_ffi_arg(rvalue, reg_args, cif->rtype, 0); -} - - -/* Template code for closure. */ -extern const UINT64 ffi_template_tramp_tile[] FFI_HIDDEN; - - -ffi_status -ffi_prep_closure_loc (ffi_closure *closure, - ffi_cif *cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, - void *codeloc) -{ -#ifdef __tilegx__ - /* TILE-Gx */ - SINT64 c; - SINT64 h; - int s; - UINT64 *out; - - if (cif->abi != FFI_UNIX) - return FFI_BAD_ABI; - - out = (UINT64 *)closure->tramp; - - c = (intptr_t)closure; - h = (intptr_t)ffi_closure_tile; - s = 0; - - /* Find the smallest shift count that doesn't lose information - (i.e. no need to explicitly insert high bits of the address that - are just the sign extension of the low bits). */ - while ((c >> s) != (SINT16)(c >> s) || (h >> s) != (SINT16)(h >> s)) - s += 16; - -#define OPS(a, b, shift) \ - (create_Imm16_X0((a) >> (shift)) | create_Imm16_X1((b) >> (shift))) - - /* Emit the moveli. */ - *out++ = ffi_template_tramp_tile[0] | OPS(c, h, s); - for (s -= 16; s >= 0; s -= 16) - *out++ = ffi_template_tramp_tile[1] | OPS(c, h, s); - -#undef OPS - - *out++ = ffi_template_tramp_tile[2]; - -#else - /* TILEPro */ - UINT64 *out; - intptr_t delta; - - if (cif->abi != FFI_UNIX) - return FFI_BAD_ABI; - - out = (UINT64 *)closure->tramp; - delta = (intptr_t)ffi_closure_tile - (intptr_t)codeloc; - - *out++ = ffi_template_tramp_tile[0] | create_JOffLong_X1(delta >> 3); -#endif - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - invalidate_icache(closure->tramp, (char *)out - closure->tramp, - getpagesize()); - - return FFI_OK; -} - - -/* This is called by the assembly wrapper for closures. This does - all of the work. On entry reg_args[0] holds the values the registers - had when the closure was invoked. On return reg_args[1] holds the register - values to be returned to the caller (many of which may be garbage). */ -void FFI_HIDDEN -ffi_closure_tile_inner(ffi_closure *closure, - ffi_sarg reg_args[2][NUM_ARG_REGS], - ffi_sarg *stack_args) -{ - ffi_cif * const cif = closure->cif; - void ** const avalue = alloca(cif->nargs * sizeof(void *)); - void *rvalue; - ffi_type ** const arg_types = cif->arg_types; - ffi_sarg * const reg_args_in = reg_args[0]; - ffi_sarg * const reg_args_out = reg_args[1]; - ffi_sarg * argp; - long i, arg_word, nargs = cif->nargs; - /* Use a union to guarantee proper alignment for double. */ - union { ffi_sarg arg[NUM_ARG_REGS]; double d; UINT64 u64; } closure_ret; - - /* Start out reading register arguments. */ - argp = reg_args_in; - - /* Copy the caller's structure return address to that the closure - returns the data directly to the caller. */ - if (cif->flags == FFI_TYPE_STRUCT) - { - /* Return by reference via hidden pointer. */ - rvalue = (void *)(intptr_t)*argp++; - arg_word = 1; - } - else - { - /* Return the value in registers. */ - rvalue = &closure_ret; - arg_word = 0; - } - - /* Grab the addresses of the arguments. */ - for (i = 0; i < nargs; i++) - { - ffi_type * const type = arg_types[i]; - const size_t arg_size_in_words = - (type->size + FFI_SIZEOF_ARG - 1) / FFI_SIZEOF_ARG; - -#ifndef __tilegx__ - /* Doubleword-aligned values are always in an even-number register - pair, or doubleword-aligned stack slot if out of registers. */ - long align = arg_word & (type->alignment > FFI_SIZEOF_ARG); - argp += align; - arg_word += align; -#endif - - if (arg_word == NUM_ARG_REGS || - (arg_word < NUM_ARG_REGS && - arg_word + arg_size_in_words > NUM_ARG_REGS)) - { - /* Switch to reading arguments from the stack. */ - argp = stack_args; - arg_word = NUM_ARG_REGS; - } - - avalue[i] = argp; - argp += arg_size_in_words; - arg_word += arg_size_in_words; - } - - /* Invoke the closure. */ - closure->fun(cif, rvalue, avalue, closure->user_data); - - if (cif->flags != FFI_TYPE_STRUCT) - { - /* Canonicalize for register representation. */ - assign_to_ffi_arg(reg_args_out, &closure_ret, cif->rtype, 1); - } -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/tile/ffitarget.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/tile/ffitarget.h deleted file mode 100644 index 679fb5d..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/tile/ffitarget.h +++ /dev/null @@ -1,65 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Tilera Corp. - Target configuration macros for TILE. - - 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. - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#ifndef LIBFFI_ASM - -#include - -typedef uint_reg_t ffi_arg; -typedef int_reg_t ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_UNIX, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_UNIX -} ffi_abi; -#endif - -/* ---- Definitions for closures ----------------------------------------- */ -#define FFI_CLOSURES 1 - -#ifdef __tilegx__ -/* We always pass 8-byte values, even in -m32 mode. */ -# define FFI_SIZEOF_ARG 8 -# ifdef __LP64__ -# define FFI_TRAMPOLINE_SIZE (8 * 5) /* 5 bundles */ -# else -# define FFI_TRAMPOLINE_SIZE (8 * 3) /* 3 bundles */ -# endif -#else -# define FFI_SIZEOF_ARG 4 -# define FFI_TRAMPOLINE_SIZE 8 /* 1 bundle */ -#endif -#define FFI_NATIVE_RAW_API 0 - -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/tile/tile.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/tile/tile.S deleted file mode 100644 index d1f82cb..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/tile/tile.S +++ /dev/null @@ -1,360 +0,0 @@ -/* ----------------------------------------------------------------------- - tile.S - Copyright (c) 2011 Tilera Corp. - - Tilera TILEPro and TILE-Gx Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include - -/* Number of bytes in a register. */ -#define REG_SIZE FFI_SIZEOF_ARG - -/* Number of bytes in stack linkage area for backtracing. - - A note about the ABI: on entry to a procedure, sp points to a stack - slot where it must spill the return address if it's not a leaf. - REG_SIZE bytes beyond that is a slot owned by the caller which - contains the sp value that the caller had when it was originally - entered (i.e. the caller's frame pointer). */ -#define LINKAGE_SIZE (2 * REG_SIZE) - -/* The first 10 registers are used to pass arguments and return values. */ -#define NUM_ARG_REGS 10 - -#ifdef __tilegx__ -#define SW st -#define LW ld -#define BGZT bgtzt -#else -#define SW sw -#define LW lw -#define BGZT bgzt -#endif - - -/* void ffi_call_tile (int_reg_t reg_args[NUM_ARG_REGS], - const int_reg_t *stack_args, - unsigned long stack_args_bytes, - void (*fnaddr)(void)); - - On entry, REG_ARGS contain the outgoing register values, - and STACK_ARGS contains STACK_ARG_BYTES of additional values - to be passed on the stack. If STACK_ARG_BYTES is zero, then - STACK_ARGS is ignored. - - When the invoked function returns, the values of r0-r9 are - blindly stored back into REG_ARGS for the caller to examine. */ - - .section .text.ffi_call_tile, "ax", @progbits - .align 8 - .globl ffi_call_tile - FFI_HIDDEN(ffi_call_tile) -ffi_call_tile: - -/* Incoming arguments. */ -#define REG_ARGS r0 -#define INCOMING_STACK_ARGS r1 -#define STACK_ARG_BYTES r2 -#define ORIG_FNADDR r3 - -/* Temporary values. */ -#define FRAME_SIZE r10 -#define TMP r11 -#define TMP2 r12 -#define OUTGOING_STACK_ARGS r13 -#define REG_ADDR_PTR r14 -#define RETURN_REG_ADDR r15 -#define FNADDR r16 - - .cfi_startproc - { - /* Save return address. */ - SW sp, lr - .cfi_offset lr, 0 - /* Prepare to spill incoming r52. */ - addi TMP, sp, -REG_SIZE - /* Increase frame size to have room to spill r52 and REG_ARGS. - The +7 is to round up mod 8. */ - addi FRAME_SIZE, STACK_ARG_BYTES, \ - REG_SIZE + REG_SIZE + LINKAGE_SIZE + 7 - } - { - /* Round stack frame size to a multiple of 8 to satisfy ABI. */ - andi FRAME_SIZE, FRAME_SIZE, -8 - /* Compute where to spill REG_ARGS value. */ - addi TMP2, sp, -(REG_SIZE * 2) - } - { - /* Spill incoming r52. */ - SW TMP, r52 - .cfi_offset r52, -REG_SIZE - /* Set up our frame pointer. */ - move r52, sp - .cfi_def_cfa_register r52 - /* Push stack frame. */ - sub sp, sp, FRAME_SIZE - } - { - /* Prepare to set up stack linkage. */ - addi TMP, sp, REG_SIZE - /* Prepare to memcpy stack args. */ - addi OUTGOING_STACK_ARGS, sp, LINKAGE_SIZE - /* Save REG_ARGS which we will need after we call the subroutine. */ - SW TMP2, REG_ARGS - } - { - /* Set up linkage info to hold incoming stack pointer. */ - SW TMP, r52 - } - { - /* Skip stack args memcpy if we don't have any stack args (common). */ - blezt STACK_ARG_BYTES, .Ldone_stack_args_memcpy - } - -.Lmemcpy_stack_args: - { - /* Load incoming argument from stack_args. */ - LW TMP, INCOMING_STACK_ARGS - addi INCOMING_STACK_ARGS, INCOMING_STACK_ARGS, REG_SIZE - } - { - /* Store stack argument into outgoing stack argument area. */ - SW OUTGOING_STACK_ARGS, TMP - addi OUTGOING_STACK_ARGS, OUTGOING_STACK_ARGS, REG_SIZE - addi STACK_ARG_BYTES, STACK_ARG_BYTES, -REG_SIZE - } - { - BGZT STACK_ARG_BYTES, .Lmemcpy_stack_args - } -.Ldone_stack_args_memcpy: - - { - /* Copy aside ORIG_FNADDR so we can overwrite its register. */ - move FNADDR, ORIG_FNADDR - /* Prepare to load argument registers. */ - addi REG_ADDR_PTR, r0, REG_SIZE - /* Load outgoing r0. */ - LW r0, r0 - } - - /* Load up argument registers from the REG_ARGS array. */ -#define LOAD_REG(REG, PTR) \ - { \ - LW REG, PTR ; \ - addi PTR, PTR, REG_SIZE \ - } - - LOAD_REG(r1, REG_ADDR_PTR) - LOAD_REG(r2, REG_ADDR_PTR) - LOAD_REG(r3, REG_ADDR_PTR) - LOAD_REG(r4, REG_ADDR_PTR) - LOAD_REG(r5, REG_ADDR_PTR) - LOAD_REG(r6, REG_ADDR_PTR) - LOAD_REG(r7, REG_ADDR_PTR) - LOAD_REG(r8, REG_ADDR_PTR) - LOAD_REG(r9, REG_ADDR_PTR) - - { - /* Call the subroutine. */ - jalr FNADDR - } - - { - /* Restore original lr. */ - LW lr, r52 - /* Prepare to recover ARGS, which we spilled earlier. */ - addi TMP, r52, -(2 * REG_SIZE) - } - { - /* Restore ARGS, so we can fill it in with the return regs r0-r9. */ - LW RETURN_REG_ADDR, TMP - /* Prepare to restore original r52. */ - addi TMP, r52, -REG_SIZE - } - - { - /* Pop stack frame. */ - move sp, r52 - /* Restore original r52. */ - LW r52, TMP - } - -#define STORE_REG(REG, PTR) \ - { \ - SW PTR, REG ; \ - addi PTR, PTR, REG_SIZE \ - } - - /* Return all register values by reference. */ - STORE_REG(r0, RETURN_REG_ADDR) - STORE_REG(r1, RETURN_REG_ADDR) - STORE_REG(r2, RETURN_REG_ADDR) - STORE_REG(r3, RETURN_REG_ADDR) - STORE_REG(r4, RETURN_REG_ADDR) - STORE_REG(r5, RETURN_REG_ADDR) - STORE_REG(r6, RETURN_REG_ADDR) - STORE_REG(r7, RETURN_REG_ADDR) - STORE_REG(r8, RETURN_REG_ADDR) - STORE_REG(r9, RETURN_REG_ADDR) - - { - jrp lr - } - - .cfi_endproc - .size ffi_call_tile, .-ffi_call_tile - -/* ffi_closure_tile(...) - - On entry, lr points to the closure plus 8 bytes, and r10 - contains the actual return address. - - This function simply dumps all register parameters into a stack array - and passes the closure, the registers array, and the stack arguments - to C code that does all of the actual closure processing. */ - - .section .text.ffi_closure_tile, "ax", @progbits - .align 8 - .globl ffi_closure_tile - FFI_HIDDEN(ffi_closure_tile) - - .cfi_startproc -/* Room to spill all NUM_ARG_REGS incoming registers, plus frame linkage. */ -#define CLOSURE_FRAME_SIZE (((NUM_ARG_REGS * REG_SIZE * 2 + LINKAGE_SIZE) + 7) & -8) -ffi_closure_tile: - { -#ifdef __tilegx__ - st sp, lr - .cfi_offset lr, 0 -#else - /* Save return address (in r10 due to closure stub wrapper). */ - SW sp, r10 - .cfi_return_column r10 - .cfi_offset r10, 0 -#endif - /* Compute address for stack frame linkage. */ - addli r10, sp, -(CLOSURE_FRAME_SIZE - REG_SIZE) - } - { - /* Save incoming stack pointer in linkage area. */ - SW r10, sp - .cfi_offset sp, -(CLOSURE_FRAME_SIZE - REG_SIZE) - /* Push a new stack frame. */ - addli sp, sp, -CLOSURE_FRAME_SIZE - .cfi_adjust_cfa_offset CLOSURE_FRAME_SIZE - } - - { - /* Create pointer to where to start spilling registers. */ - addi r10, sp, LINKAGE_SIZE - } - - /* Spill all the incoming registers. */ - STORE_REG(r0, r10) - STORE_REG(r1, r10) - STORE_REG(r2, r10) - STORE_REG(r3, r10) - STORE_REG(r4, r10) - STORE_REG(r5, r10) - STORE_REG(r6, r10) - STORE_REG(r7, r10) - STORE_REG(r8, r10) - { - /* Save r9. */ - SW r10, r9 -#ifdef __tilegx__ - /* Pointer to closure is passed in r11. */ - move r0, r11 -#else - /* Compute pointer to the closure object. Because the closure - starts with a "jal ffi_closure_tile", we can just take the - value of lr (a phony return address pointing into the closure) - and subtract 8. */ - addi r0, lr, -8 -#endif - /* Compute a pointer to the register arguments we just spilled. */ - addi r1, sp, LINKAGE_SIZE - } - { - /* Compute a pointer to the extra stack arguments (if any). */ - addli r2, sp, CLOSURE_FRAME_SIZE + LINKAGE_SIZE - /* Call C code to deal with all of the grotty details. */ - jal ffi_closure_tile_inner - } - { - addli r10, sp, CLOSURE_FRAME_SIZE - } - { - /* Restore the return address. */ - LW lr, r10 - /* Compute pointer to registers array. */ - addli r10, sp, LINKAGE_SIZE + (NUM_ARG_REGS * REG_SIZE) - } - /* Return all the register values, which C code may have set. */ - LOAD_REG(r0, r10) - LOAD_REG(r1, r10) - LOAD_REG(r2, r10) - LOAD_REG(r3, r10) - LOAD_REG(r4, r10) - LOAD_REG(r5, r10) - LOAD_REG(r6, r10) - LOAD_REG(r7, r10) - LOAD_REG(r8, r10) - LOAD_REG(r9, r10) - { - /* Pop the frame. */ - addli sp, sp, CLOSURE_FRAME_SIZE - jrp lr - } - - .cfi_endproc - .size ffi_closure_tile, . - ffi_closure_tile - - -/* What follows are code template instructions that get copied to the - closure trampoline by ffi_prep_closure_loc. The zeroed operands - get replaced by their proper values at runtime. */ - - .section .text.ffi_template_tramp_tile, "ax", @progbits - .align 8 - .globl ffi_template_tramp_tile - FFI_HIDDEN(ffi_template_tramp_tile) -ffi_template_tramp_tile: -#ifdef __tilegx__ - { - moveli r11, 0 /* backpatched to address of containing closure. */ - moveli r10, 0 /* backpatched to ffi_closure_tile. */ - } - /* Note: the following bundle gets generated multiple times - depending on the pointer value (esp. useful for -m32 mode). */ - { shl16insli r11, r11, 0 ; shl16insli r10, r10, 0 } - { info 2+8 /* for backtracer: -> pc in lr, frame size 0 */ ; jr r10 } -#else - /* 'jal .' yields a PC-relative offset of zero so we can OR in the - right offset at runtime. */ - { move r10, lr ; jal . /* ffi_closure_tile */ } -#endif - - .size ffi_template_tramp_tile, . - ffi_template_tramp_tile diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/types.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/types.c deleted file mode 100644 index 9ec27f6..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/types.c +++ /dev/null @@ -1,108 +0,0 @@ -/* ----------------------------------------------------------------------- - types.c - Copyright (c) 1996, 1998 Red Hat, Inc. - - Predefined ffi_types needed by libffi. - - 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. - ----------------------------------------------------------------------- */ - -/* Hide the basic type definitions from the header file, so that we - can redefine them here as "const". */ -#define LIBFFI_HIDE_BASIC_TYPES - -#include -#include - -/* Type definitions */ - -#define FFI_TYPEDEF(name, type, id, maybe_const)\ -struct struct_align_##name { \ - char c; \ - type x; \ -}; \ -FFI_EXTERN \ -maybe_const ffi_type ffi_type_##name = { \ - sizeof(type), \ - offsetof(struct struct_align_##name, x), \ - id, NULL \ -} - -#define FFI_COMPLEX_TYPEDEF(name, type, maybe_const) \ -static ffi_type *ffi_elements_complex_##name [2] = { \ - (ffi_type *)(&ffi_type_##name), NULL \ -}; \ -struct struct_align_complex_##name { \ - char c; \ - _Complex type x; \ -}; \ -FFI_EXTERN \ -maybe_const ffi_type ffi_type_complex_##name = { \ - sizeof(_Complex type), \ - offsetof(struct struct_align_complex_##name, x), \ - FFI_TYPE_COMPLEX, \ - (ffi_type **)ffi_elements_complex_##name \ -} - -/* Size and alignment are fake here. They must not be 0. */ -FFI_EXTERN const ffi_type ffi_type_void = { - 1, 1, FFI_TYPE_VOID, NULL -}; - -FFI_TYPEDEF(uint8, UINT8, FFI_TYPE_UINT8, const); -FFI_TYPEDEF(sint8, SINT8, FFI_TYPE_SINT8, const); -FFI_TYPEDEF(uint16, UINT16, FFI_TYPE_UINT16, const); -FFI_TYPEDEF(sint16, SINT16, FFI_TYPE_SINT16, const); -FFI_TYPEDEF(uint32, UINT32, FFI_TYPE_UINT32, const); -FFI_TYPEDEF(sint32, SINT32, FFI_TYPE_SINT32, const); -FFI_TYPEDEF(uint64, UINT64, FFI_TYPE_UINT64, const); -FFI_TYPEDEF(sint64, SINT64, FFI_TYPE_SINT64, const); - -FFI_TYPEDEF(pointer, void*, FFI_TYPE_POINTER, const); - -FFI_TYPEDEF(float, float, FFI_TYPE_FLOAT, const); -FFI_TYPEDEF(double, double, FFI_TYPE_DOUBLE, const); - -#if !defined HAVE_LONG_DOUBLE_VARIANT || defined __alpha__ -#define FFI_LDBL_CONST const -#else -#define FFI_LDBL_CONST -#endif - -#ifdef __alpha__ -/* Even if we're not configured to default to 128-bit long double, - maintain binary compatibility, as -mlong-double-128 can be used - at any time. */ -/* Validate the hard-coded number below. */ -# if defined(__LONG_DOUBLE_128__) && FFI_TYPE_LONGDOUBLE != 4 -# error FFI_TYPE_LONGDOUBLE out of date -# endif -const ffi_type ffi_type_longdouble = { 16, 16, 4, NULL }; -#elif FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE -FFI_TYPEDEF(longdouble, long double, FFI_TYPE_LONGDOUBLE, FFI_LDBL_CONST); -#endif - -#ifdef FFI_TARGET_HAS_COMPLEX_TYPE -FFI_COMPLEX_TYPEDEF(float, float, const); -FFI_COMPLEX_TYPEDEF(double, double, const); -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE -FFI_COMPLEX_TYPEDEF(longdouble, long double, FFI_LDBL_CONST); -#endif -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/vax/elfbsd.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/vax/elfbsd.S deleted file mode 100644 index 01ca313..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/vax/elfbsd.S +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Copyright (c) 2013 Miodrag Vallat. - * - * 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. - */ - -/* - * vax Foreign Function Interface - */ - -#define LIBFFI_ASM -#include -#include - - .text - -/* - * void * %r0 - * ffi_call_elfbsd(extended_cif *ecif, 4(%ap) - * unsigned bytes, 8(%ap) - * unsigned flags, 12(%ap) - * void *rvalue, 16(%ap) - * void (*fn)()); 20(%ap) - */ - .globl ffi_call_elfbsd - .type ffi_call_elfbsd,@function - .align 2 -ffi_call_elfbsd: - .word 0x00c # save R2 and R3 - - # Allocate stack space for the args - subl2 8(%ap), %sp - - # Call ffi_prep_args - pushl %sp - pushl 4(%ap) - calls $2, ffi_prep_args - - # Get function pointer - movl 20(%ap), %r1 - - # Build a CALLS frame - ashl $-2, 8(%ap), %r0 - pushl %r0 # argument stack usage - movl %sp, %r0 # future %ap - # saved registers - bbc $11, 0(%r1), 1f - pushl %r11 -1: bbc $10, 0(%r1), 1f - pushl %r10 -1: bbc $9, 0(%r1), 1f - pushl %r9 -1: bbc $8, 0(%r1), 1f - pushl %r8 -1: bbc $7, 0(%r1), 1f - pushl %r7 -1: bbc $6, 0(%r1), 1f - pushl %r6 -1: bbc $5, 0(%r1), 1f - pushl %r5 -1: bbc $4, 0(%r1), 1f - pushl %r4 -1: bbc $3, 0(%r1), 1f - pushl %r3 -1: bbc $2, 0(%r1), 1f - pushl %r2 -1: - pushal 9f - pushl %fp - pushl %ap - movl 16(%ap), %r3 # struct return address, if needed - movl %r0, %ap - movzwl 4(%fp), %r0 # previous PSW, without the saved registers mask - bisl2 $0x20000000, %r0 # calls frame - movzwl 0(%r1), %r2 - bicw2 $0xf003, %r2 # only keep R11-R2 - ashl $16, %r2, %r2 - bisl2 %r2, %r0 # saved register mask of the called function - pushl %r0 - pushl $0 - movl %sp, %fp - - # Invoke the function - pushal 2(%r1) # skip procedure entry mask - movl %r3, %r1 - bicpsw $0x000f - rsb - -9: - # Copy return value if necessary - tstl 16(%ap) - jeql 9f - movl 16(%ap), %r2 - - bbc $0, 12(%ap), 1f # CIF_FLAGS_CHAR - movb %r0, 0(%r2) - brb 9f -1: - bbc $1, 12(%ap), 1f # CIF_FLAGS_SHORT - movw %r0, 0(%r2) - brb 9f -1: - bbc $2, 12(%ap), 1f # CIF_FLAGS_INT - movl %r0, 0(%r2) - brb 9f -1: - bbc $3, 12(%ap), 1f # CIF_FLAGS_DINT - movq %r0, 0(%r2) - brb 9f -1: - movl %r1, %r0 # might have been a struct - #brb 9f - -9: - ret - -/* - * ffi_closure_elfbsd(void); - * invoked with %r0: ffi_closure *closure - */ - .globl ffi_closure_elfbsd - .type ffi_closure_elfbsd, @function - .align 2 -ffi_closure_elfbsd: - .word 0 - - # Allocate room on stack for return value - subl2 $8, %sp - - # Invoke the closure function - pushal 4(%ap) # calling stack - pushal 4(%sp) # return value - pushl %r0 # closure - calls $3, ffi_closure_elfbsd_inner - - # Copy return value if necessary - bitb $1, %r0 # CIF_FLAGS_CHAR - beql 1f - movb 0(%sp), %r0 - brb 9f -1: - bitb $2, %r0 # CIF_FLAGS_SHORT - beql 1f - movw 0(%sp), %r0 - brb 9f -1: - bitb $4, %r0 # CIF_FLAGS_INT - beql 1f - movl 0(%sp), %r0 - brb 9f -1: - bitb $8, %r0 # CIF_FLAGS_DINT - beql 1f - movq 0(%sp), %r0 - #brb 9f -1: - -9: - ret - -/* - * ffi_closure_struct_elfbsd(void); - * invoked with %r0: ffi_closure *closure - * %r1: struct return address - */ - .globl ffi_closure_struct_elfbsd - .type ffi_closure_struct_elfbsd, @function - .align 2 -ffi_closure_struct_elfbsd: - .word 0 - - # Invoke the closure function - pushal 4(%ap) # calling stack - pushl %r1 # return value - pushl %r0 # closure - calls $3, ffi_closure_elfbsd_inner - - ret diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/vax/ffi.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/vax/ffi.c deleted file mode 100644 index e52caec..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/vax/ffi.c +++ /dev/null @@ -1,276 +0,0 @@ -/* - * Copyright (c) 2013 Miodrag Vallat. - * - * 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. - */ - -/* - * vax Foreign Function Interface - * - * This file attempts to provide all the FFI entry points which can reliably - * be implemented in C. - */ - -#include -#include - -#include -#include - -#define CIF_FLAGS_CHAR 1 /* for struct only */ -#define CIF_FLAGS_SHORT 2 /* for struct only */ -#define CIF_FLAGS_INT 4 -#define CIF_FLAGS_DINT 8 - -/* - * Foreign Function Interface API - */ - -void ffi_call_elfbsd (extended_cif *, unsigned, unsigned, void *, - void (*) ()); -void *ffi_prep_args (extended_cif *ecif, void *stack); - -void * -ffi_prep_args (extended_cif *ecif, void *stack) -{ - unsigned int i; - void **p_argv; - char *argp; - ffi_type **p_arg; - void *struct_value_ptr; - - argp = stack; - - if (ecif->cif->rtype->type == FFI_TYPE_STRUCT - && !ecif->cif->flags) - struct_value_ptr = ecif->rvalue; - else - struct_value_ptr = NULL; - - p_argv = ecif->avalue; - - for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; - i != 0; - i--, p_arg++) - { - size_t z; - - z = (*p_arg)->size; - if (z < sizeof (int)) - { - switch ((*p_arg)->type) - { - case FFI_TYPE_SINT8: - *(signed int *) argp = (signed int) *(SINT8 *) *p_argv; - break; - - case FFI_TYPE_UINT8: - *(unsigned int *) argp = (unsigned int) *(UINT8 *) *p_argv; - break; - - case FFI_TYPE_SINT16: - *(signed int *) argp = (signed int) *(SINT16 *) *p_argv; - break; - - case FFI_TYPE_UINT16: - *(unsigned int *) argp = (unsigned int) *(UINT16 *) *p_argv; - break; - - case FFI_TYPE_STRUCT: - memcpy (argp, *p_argv, z); - break; - - default: - FFI_ASSERT (0); - } - z = sizeof (int); - } - else - { - memcpy (argp, *p_argv, z); - - /* Align if necessary. */ - if ((sizeof(int) - 1) & z) - z = FFI_ALIGN(z, sizeof(int)); - } - - p_argv++; - argp += z; - } - - return struct_value_ptr; -} - -ffi_status -ffi_prep_cif_machdep (ffi_cif *cif) -{ - /* Set the return type flag */ - switch (cif->rtype->type) - { - case FFI_TYPE_VOID: - cif->flags = 0; - break; - - case FFI_TYPE_STRUCT: - if (cif->rtype->elements[0]->type == FFI_TYPE_STRUCT && - cif->rtype->elements[1]) - { - cif->flags = 0; - break; - } - - if (cif->rtype->size == sizeof (char)) - cif->flags = CIF_FLAGS_CHAR; - else if (cif->rtype->size == sizeof (short)) - cif->flags = CIF_FLAGS_SHORT; - else if (cif->rtype->size == sizeof (int)) - cif->flags = CIF_FLAGS_INT; - else if (cif->rtype->size == 2 * sizeof (int)) - cif->flags = CIF_FLAGS_DINT; - else - cif->flags = 0; - break; - - default: - if (cif->rtype->size <= sizeof (int)) - cif->flags = CIF_FLAGS_INT; - else - cif->flags = CIF_FLAGS_DINT; - break; - } - - return FFI_OK; -} - -void -ffi_call (ffi_cif *cif, void (*fn) (), void *rvalue, void **avalue) -{ - extended_cif ecif; - - ecif.cif = cif; - ecif.avalue = avalue; - - /* If the return value is a struct and we don't have a return value - address then we need to make one. */ - - if (rvalue == NULL - && cif->rtype->type == FFI_TYPE_STRUCT - && cif->flags == 0) - ecif.rvalue = alloca (cif->rtype->size); - else - ecif.rvalue = rvalue; - - switch (cif->abi) - { - case FFI_ELFBSD: - ffi_call_elfbsd (&ecif, cif->bytes, cif->flags, ecif.rvalue, fn); - break; - - default: - FFI_ASSERT (0); - break; - } -} - -/* - * Closure API - */ - -void ffi_closure_elfbsd (void); -void ffi_closure_struct_elfbsd (void); -unsigned int ffi_closure_elfbsd_inner (ffi_closure *, void *, char *); - -static void -ffi_prep_closure_elfbsd (ffi_cif *cif, void **avalue, char *stackp) -{ - unsigned int i; - void **p_argv; - ffi_type **p_arg; - - p_argv = avalue; - - for (i = cif->nargs, p_arg = cif->arg_types; i != 0; i--, p_arg++) - { - size_t z; - - z = (*p_arg)->size; - *p_argv = stackp; - - /* Align if necessary */ - if ((sizeof (int) - 1) & z) - z = FFI_ALIGN(z, sizeof (int)); - - p_argv++; - stackp += z; - } -} - -unsigned int -ffi_closure_elfbsd_inner (ffi_closure *closure, void *resp, char *stack) -{ - ffi_cif *cif; - void **arg_area; - - cif = closure->cif; - arg_area = (void **) alloca (cif->nargs * sizeof (void *)); - - ffi_prep_closure_elfbsd (cif, arg_area, stack); - - (closure->fun) (cif, resp, arg_area, closure->user_data); - - return cif->flags; -} - -ffi_status -ffi_prep_closure_loc (ffi_closure *closure, ffi_cif *cif, - void (*fun)(ffi_cif *, void *, void **, void *), - void *user_data, void *codeloc) -{ - char *tramp = (char *) codeloc; - void *fn; - - FFI_ASSERT (cif->abi == FFI_ELFBSD); - - /* entry mask */ - *(unsigned short *)(tramp + 0) = 0x0000; - /* movl #closure, r0 */ - tramp[2] = 0xd0; - tramp[3] = 0x8f; - *(unsigned int *)(tramp + 4) = (unsigned int) closure; - tramp[8] = 0x50; - - if (cif->rtype->type == FFI_TYPE_STRUCT - && !cif->flags) - fn = &ffi_closure_struct_elfbsd; - else - fn = &ffi_closure_elfbsd; - - /* jmpl #fn */ - tramp[9] = 0x17; - tramp[10] = 0xef; - *(unsigned int *)(tramp + 11) = (unsigned int)fn + 2 - - (unsigned int)tramp - 9 - 6; - - closure->cif = cif; - closure->user_data = user_data; - closure->fun = fun; - - return FFI_OK; -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/vax/ffitarget.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/vax/ffitarget.h deleted file mode 100644 index 2fc9488..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/vax/ffitarget.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 2013 Miodrag Vallat. - * - * 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. - */ - -/* - * vax Foreign Function Interface - */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_ELFBSD, - FFI_DEFAULT_ABI = FFI_ELFBSD, - FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 -} ffi_abi; -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_TRAMPOLINE_SIZE 15 -#define FFI_NATIVE_RAW_API 0 - -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/asmnames.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/asmnames.h deleted file mode 100644 index 7551021..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/asmnames.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef ASMNAMES_H -#define ASMNAMES_H - -#define C2(X, Y) X ## Y -#define C1(X, Y) C2(X, Y) -#ifdef __USER_LABEL_PREFIX__ -# define C(X) C1(__USER_LABEL_PREFIX__, X) -#else -# define C(X) X -#endif - -#ifdef __APPLE__ -# define L(X) C1(L, X) -#else -# define L(X) C1(.L, X) -#endif - -#if defined(__ELF__) && defined(__PIC__) -# define PLT(X) X@PLT -#else -# define PLT(X) X -#endif - -#ifdef __ELF__ -# define ENDF(X) .type X,@function; .size X, . - X -#else -# define ENDF(X) -#endif - -#endif /* ASMNAMES_H */ diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/ffi.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/ffi.c deleted file mode 100644 index 5f7fd81..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/ffi.c +++ /dev/null @@ -1,770 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2017 Anthony Green - Copyright (c) 1996, 1998, 1999, 2001, 2007, 2008 Red Hat, Inc. - Copyright (c) 2002 Ranjit Mathew - Copyright (c) 2002 Bo Thorsen - Copyright (c) 2002 Roger Sayle - Copyright (C) 2008, 2010 Free Software Foundation, Inc. - - x86 Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#if defined(__i386__) || defined(_M_IX86) -#include -#include -#include -#include -#include "internal.h" - -/* Force FFI_TYPE_LONGDOUBLE to be different than FFI_TYPE_DOUBLE; - all further uses in this file will refer to the 80-bit type. */ -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE -# if FFI_TYPE_LONGDOUBLE != 4 -# error FFI_TYPE_LONGDOUBLE out of date -# endif -#else -# undef FFI_TYPE_LONGDOUBLE -# define FFI_TYPE_LONGDOUBLE 4 -#endif - -#if defined(__GNUC__) && !defined(__declspec) -# define __declspec(x) __attribute__((x)) -#endif - -#if defined(_MSC_VER) && defined(_M_IX86) -/* Stack is not 16-byte aligned on Windows. */ -#define STACK_ALIGN(bytes) (bytes) -#else -#define STACK_ALIGN(bytes) FFI_ALIGN (bytes, 16) -#endif - -/* Perform machine dependent cif processing. */ -ffi_status FFI_HIDDEN -ffi_prep_cif_machdep(ffi_cif *cif) -{ - size_t bytes = 0; - int i, n, flags, cabi = cif->abi; - - switch (cabi) - { - case FFI_SYSV: - case FFI_STDCALL: - case FFI_THISCALL: - case FFI_FASTCALL: - case FFI_MS_CDECL: - case FFI_PASCAL: - case FFI_REGISTER: - break; - default: - return FFI_BAD_ABI; - } - - switch (cif->rtype->type) - { - case FFI_TYPE_VOID: - flags = X86_RET_VOID; - break; - case FFI_TYPE_FLOAT: - flags = X86_RET_FLOAT; - break; - case FFI_TYPE_DOUBLE: - flags = X86_RET_DOUBLE; - break; - case FFI_TYPE_LONGDOUBLE: - flags = X86_RET_LDOUBLE; - break; - case FFI_TYPE_UINT8: - flags = X86_RET_UINT8; - break; - case FFI_TYPE_UINT16: - flags = X86_RET_UINT16; - break; - case FFI_TYPE_SINT8: - flags = X86_RET_SINT8; - break; - case FFI_TYPE_SINT16: - flags = X86_RET_SINT16; - break; - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - case FFI_TYPE_POINTER: - flags = X86_RET_INT32; - break; - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - flags = X86_RET_INT64; - break; - case FFI_TYPE_STRUCT: -#ifndef X86 - /* ??? This should be a different ABI rather than an ifdef. */ - if (cif->rtype->size == 1) - flags = X86_RET_STRUCT_1B; - else if (cif->rtype->size == 2) - flags = X86_RET_STRUCT_2B; - else if (cif->rtype->size == 4) - flags = X86_RET_INT32; - else if (cif->rtype->size == 8) - flags = X86_RET_INT64; - else -#endif - { - do_struct: - switch (cabi) - { - case FFI_THISCALL: - case FFI_FASTCALL: - case FFI_STDCALL: - case FFI_MS_CDECL: - flags = X86_RET_STRUCTARG; - break; - default: - flags = X86_RET_STRUCTPOP; - break; - } - /* Allocate space for return value pointer. */ - bytes += FFI_ALIGN (sizeof(void*), FFI_SIZEOF_ARG); - } - break; - case FFI_TYPE_COMPLEX: - switch (cif->rtype->elements[0]->type) - { - case FFI_TYPE_DOUBLE: - case FFI_TYPE_LONGDOUBLE: - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - goto do_struct; - case FFI_TYPE_FLOAT: - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - flags = X86_RET_INT64; - break; - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: - flags = X86_RET_INT32; - break; - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: - flags = X86_RET_STRUCT_2B; - break; - default: - return FFI_BAD_TYPEDEF; - } - break; - default: - return FFI_BAD_TYPEDEF; - } - cif->flags = flags; - - for (i = 0, n = cif->nargs; i < n; i++) - { - ffi_type *t = cif->arg_types[i]; - - bytes = FFI_ALIGN (bytes, t->alignment); - bytes += FFI_ALIGN (t->size, FFI_SIZEOF_ARG); - } - cif->bytes = bytes; - - return FFI_OK; -} - -static ffi_arg -extend_basic_type(void *arg, int type) -{ - switch (type) - { - case FFI_TYPE_SINT8: - return *(SINT8 *)arg; - case FFI_TYPE_UINT8: - return *(UINT8 *)arg; - case FFI_TYPE_SINT16: - return *(SINT16 *)arg; - case FFI_TYPE_UINT16: - return *(UINT16 *)arg; - - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - case FFI_TYPE_POINTER: - case FFI_TYPE_FLOAT: - return *(UINT32 *)arg; - - default: - abort(); - } -} - -struct call_frame -{ - void *ebp; /* 0 */ - void *retaddr; /* 4 */ - void (*fn)(void); /* 8 */ - int flags; /* 12 */ - void *rvalue; /* 16 */ - unsigned regs[3]; /* 20-28 */ -}; - -struct abi_params -{ - int dir; /* parameter growth direction */ - int static_chain; /* the static chain register used by gcc */ - int nregs; /* number of register parameters */ - int regs[3]; -}; - -static const struct abi_params abi_params[FFI_LAST_ABI] = { - [FFI_SYSV] = { 1, R_ECX, 0 }, - [FFI_THISCALL] = { 1, R_EAX, 1, { R_ECX } }, - [FFI_FASTCALL] = { 1, R_EAX, 2, { R_ECX, R_EDX } }, - [FFI_STDCALL] = { 1, R_ECX, 0 }, - [FFI_PASCAL] = { -1, R_ECX, 0 }, - /* ??? No defined static chain; gcc does not support REGISTER. */ - [FFI_REGISTER] = { -1, R_ECX, 3, { R_EAX, R_EDX, R_ECX } }, - [FFI_MS_CDECL] = { 1, R_ECX, 0 } -}; - -#ifdef HAVE_FASTCALL - #ifdef _MSC_VER - #define FFI_DECLARE_FASTCALL __fastcall - #else - #define FFI_DECLARE_FASTCALL __declspec(fastcall) - #endif -#else - #define FFI_DECLARE_FASTCALL -#endif - -extern void FFI_DECLARE_FASTCALL ffi_call_i386(struct call_frame *, char *) FFI_HIDDEN; - -static void -ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue, - void **avalue, void *closure) -{ - size_t rsize, bytes; - struct call_frame *frame; - char *stack, *argp; - ffi_type **arg_types; - int flags, cabi, i, n, dir, narg_reg; - const struct abi_params *pabi; - - flags = cif->flags; - cabi = cif->abi; - pabi = &abi_params[cabi]; - dir = pabi->dir; - - rsize = 0; - if (rvalue == NULL) - { - switch (flags) - { - case X86_RET_FLOAT: - case X86_RET_DOUBLE: - case X86_RET_LDOUBLE: - case X86_RET_STRUCTPOP: - case X86_RET_STRUCTARG: - /* The float cases need to pop the 387 stack. - The struct cases need to pass a valid pointer to the callee. */ - rsize = cif->rtype->size; - break; - default: - /* We can pretend that the callee returns nothing. */ - flags = X86_RET_VOID; - break; - } - } - - bytes = STACK_ALIGN (cif->bytes); - stack = alloca(bytes + sizeof(*frame) + rsize); - argp = (dir < 0 ? stack + bytes : stack); - frame = (struct call_frame *)(stack + bytes); - if (rsize) - rvalue = frame + 1; - - frame->fn = fn; - frame->flags = flags; - frame->rvalue = rvalue; - frame->regs[pabi->static_chain] = (unsigned)closure; - - narg_reg = 0; - switch (flags) - { - case X86_RET_STRUCTARG: - /* The pointer is passed as the first argument. */ - if (pabi->nregs > 0) - { - frame->regs[pabi->regs[0]] = (unsigned)rvalue; - narg_reg = 1; - break; - } - /* fallthru */ - case X86_RET_STRUCTPOP: - *(void **)argp = rvalue; - argp += sizeof(void *); - break; - } - - arg_types = cif->arg_types; - for (i = 0, n = cif->nargs; i < n; i++) - { - ffi_type *ty = arg_types[i]; - void *valp = avalue[i]; - size_t z = ty->size; - int t = ty->type; - - if (z <= FFI_SIZEOF_ARG && t != FFI_TYPE_STRUCT) - { - ffi_arg val = extend_basic_type (valp, t); - - if (t != FFI_TYPE_FLOAT && narg_reg < pabi->nregs) - frame->regs[pabi->regs[narg_reg++]] = val; - else if (dir < 0) - { - argp -= 4; - *(ffi_arg *)argp = val; - } - else - { - *(ffi_arg *)argp = val; - argp += 4; - } - } - else - { - size_t za = FFI_ALIGN (z, FFI_SIZEOF_ARG); - size_t align = FFI_SIZEOF_ARG; - - /* Issue 434: For thiscall and fastcall, if the paramter passed - as 64-bit integer or struct, all following integer parameters - will be passed on stack. */ - if ((cabi == FFI_THISCALL || cabi == FFI_FASTCALL) - && (t == FFI_TYPE_SINT64 - || t == FFI_TYPE_UINT64 - || t == FFI_TYPE_STRUCT)) - narg_reg = 2; - - /* Alignment rules for arguments are quite complex. Vectors and - structures with 16 byte alignment get it. Note that long double - on Darwin does have 16 byte alignment, and does not get this - alignment if passed directly; a structure with a long double - inside, however, would get 16 byte alignment. Since libffi does - not support vectors, we need non concern ourselves with other - cases. */ - if (t == FFI_TYPE_STRUCT && ty->alignment >= 16) - align = 16; - - if (dir < 0) - { - /* ??? These reverse argument ABIs are probably too old - to have cared about alignment. Someone should check. */ - argp -= za; - memcpy (argp, valp, z); - } - else - { - argp = (char *)FFI_ALIGN (argp, align); - memcpy (argp, valp, z); - argp += za; - } - } - } - FFI_ASSERT (dir > 0 || argp == stack); - - ffi_call_i386 (frame, stack); -} - -void -ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - ffi_call_int (cif, fn, rvalue, avalue, NULL); -} - -#ifdef FFI_GO_CLOSURES -void -ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue, - void **avalue, void *closure) -{ - ffi_call_int (cif, fn, rvalue, avalue, closure); -} -#endif - -/** private members **/ - -void FFI_HIDDEN ffi_closure_i386(void); -void FFI_HIDDEN ffi_closure_STDCALL(void); -void FFI_HIDDEN ffi_closure_REGISTER(void); - -struct closure_frame -{ - unsigned rettemp[4]; /* 0 */ - unsigned regs[3]; /* 16-24 */ - ffi_cif *cif; /* 28 */ - void (*fun)(ffi_cif*,void*,void**,void*); /* 32 */ - void *user_data; /* 36 */ -}; - -int FFI_HIDDEN FFI_DECLARE_FASTCALL -ffi_closure_inner (struct closure_frame *frame, char *stack) -{ - ffi_cif *cif = frame->cif; - int cabi, i, n, flags, dir, narg_reg; - const struct abi_params *pabi; - ffi_type **arg_types; - char *argp; - void *rvalue; - void **avalue; - - cabi = cif->abi; - flags = cif->flags; - narg_reg = 0; - rvalue = frame->rettemp; - pabi = &abi_params[cabi]; - dir = pabi->dir; - argp = (dir < 0 ? stack + STACK_ALIGN (cif->bytes) : stack); - - switch (flags) - { - case X86_RET_STRUCTARG: - if (pabi->nregs > 0) - { - rvalue = (void *)frame->regs[pabi->regs[0]]; - narg_reg = 1; - frame->rettemp[0] = (unsigned)rvalue; - break; - } - /* fallthru */ - case X86_RET_STRUCTPOP: - rvalue = *(void **)argp; - argp += sizeof(void *); - frame->rettemp[0] = (unsigned)rvalue; - break; - } - - n = cif->nargs; - avalue = alloca(sizeof(void *) * n); - - arg_types = cif->arg_types; - for (i = 0; i < n; ++i) - { - ffi_type *ty = arg_types[i]; - size_t z = ty->size; - int t = ty->type; - void *valp; - - if (z <= FFI_SIZEOF_ARG && t != FFI_TYPE_STRUCT) - { - if (t != FFI_TYPE_FLOAT && narg_reg < pabi->nregs) - valp = &frame->regs[pabi->regs[narg_reg++]]; - else if (dir < 0) - { - argp -= 4; - valp = argp; - } - else - { - valp = argp; - argp += 4; - } - } - else - { - size_t za = FFI_ALIGN (z, FFI_SIZEOF_ARG); - size_t align = FFI_SIZEOF_ARG; - - /* See the comment in ffi_call_int. */ - if (t == FFI_TYPE_STRUCT && ty->alignment >= 16) - align = 16; - - /* Issue 434: For thiscall and fastcall, if the paramter passed - as 64-bit integer or struct, all following integer parameters - will be passed on stack. */ - if ((cabi == FFI_THISCALL || cabi == FFI_FASTCALL) - && (t == FFI_TYPE_SINT64 - || t == FFI_TYPE_UINT64 - || t == FFI_TYPE_STRUCT)) - narg_reg = 2; - - if (dir < 0) - { - /* ??? These reverse argument ABIs are probably too old - to have cared about alignment. Someone should check. */ - argp -= za; - valp = argp; - } - else - { - argp = (char *)FFI_ALIGN (argp, align); - valp = argp; - argp += za; - } - } - - avalue[i] = valp; - } - - frame->fun (cif, rvalue, avalue, frame->user_data); - - if (cabi == FFI_STDCALL) - return flags + (cif->bytes << X86_RET_POP_SHIFT); - else - return flags; -} - -ffi_status -ffi_prep_closure_loc (ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*,void*,void**,void*), - void *user_data, - void *codeloc) -{ - char *tramp = closure->tramp; - void (*dest)(void); - int op = 0xb8; /* movl imm, %eax */ - - switch (cif->abi) - { - case FFI_SYSV: - case FFI_THISCALL: - case FFI_FASTCALL: - case FFI_MS_CDECL: - dest = ffi_closure_i386; - break; - case FFI_STDCALL: - case FFI_PASCAL: - dest = ffi_closure_STDCALL; - break; - case FFI_REGISTER: - dest = ffi_closure_REGISTER; - op = 0x68; /* pushl imm */ - break; - default: - return FFI_BAD_ABI; - } - - /* endbr32. */ - *(UINT32 *) tramp = 0xfb1e0ff3; - - /* movl or pushl immediate. */ - tramp[4] = op; - *(void **)(tramp + 5) = codeloc; - - /* jmp dest */ - tramp[9] = 0xe9; - *(unsigned *)(tramp + 10) = (unsigned)dest - ((unsigned)codeloc + 14); - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - return FFI_OK; -} - -#ifdef FFI_GO_CLOSURES - -void FFI_HIDDEN ffi_go_closure_EAX(void); -void FFI_HIDDEN ffi_go_closure_ECX(void); -void FFI_HIDDEN ffi_go_closure_STDCALL(void); - -ffi_status -ffi_prep_go_closure (ffi_go_closure* closure, ffi_cif* cif, - void (*fun)(ffi_cif*,void*,void**,void*)) -{ - void (*dest)(void); - - switch (cif->abi) - { - case FFI_SYSV: - case FFI_MS_CDECL: - dest = ffi_go_closure_ECX; - break; - case FFI_THISCALL: - case FFI_FASTCALL: - dest = ffi_go_closure_EAX; - break; - case FFI_STDCALL: - case FFI_PASCAL: - dest = ffi_go_closure_STDCALL; - break; - case FFI_REGISTER: - default: - return FFI_BAD_ABI; - } - - closure->tramp = dest; - closure->cif = cif; - closure->fun = fun; - - return FFI_OK; -} - -#endif /* FFI_GO_CLOSURES */ - -/* ------- Native raw API support -------------------------------- */ - -#if !FFI_NO_RAW_API - -void FFI_HIDDEN ffi_closure_raw_SYSV(void); -void FFI_HIDDEN ffi_closure_raw_THISCALL(void); - -ffi_status -ffi_prep_raw_closure_loc (ffi_raw_closure *closure, - ffi_cif *cif, - void (*fun)(ffi_cif*,void*,ffi_raw*,void*), - void *user_data, - void *codeloc) -{ - char *tramp = closure->tramp; - void (*dest)(void); - int i; - - /* We currently don't support certain kinds of arguments for raw - closures. This should be implemented by a separate assembly - language routine, since it would require argument processing, - something we don't do now for performance. */ - for (i = cif->nargs-1; i >= 0; i--) - switch (cif->arg_types[i]->type) - { - case FFI_TYPE_STRUCT: - case FFI_TYPE_LONGDOUBLE: - return FFI_BAD_TYPEDEF; - } - - switch (cif->abi) - { - case FFI_THISCALL: - dest = ffi_closure_raw_THISCALL; - break; - case FFI_SYSV: - dest = ffi_closure_raw_SYSV; - break; - default: - return FFI_BAD_ABI; - } - - /* movl imm, %eax. */ - tramp[0] = 0xb8; - *(void **)(tramp + 1) = codeloc; - - /* jmp dest */ - tramp[5] = 0xe9; - *(unsigned *)(tramp + 6) = (unsigned)dest - ((unsigned)codeloc + 10); - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - return FFI_OK; -} - -void -ffi_raw_call(ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_raw *avalue) -{ - size_t rsize, bytes; - struct call_frame *frame; - char *stack, *argp; - ffi_type **arg_types; - int flags, cabi, i, n, narg_reg; - const struct abi_params *pabi; - - flags = cif->flags; - cabi = cif->abi; - pabi = &abi_params[cabi]; - - rsize = 0; - if (rvalue == NULL) - { - switch (flags) - { - case X86_RET_FLOAT: - case X86_RET_DOUBLE: - case X86_RET_LDOUBLE: - case X86_RET_STRUCTPOP: - case X86_RET_STRUCTARG: - /* The float cases need to pop the 387 stack. - The struct cases need to pass a valid pointer to the callee. */ - rsize = cif->rtype->size; - break; - default: - /* We can pretend that the callee returns nothing. */ - flags = X86_RET_VOID; - break; - } - } - - bytes = STACK_ALIGN (cif->bytes); - argp = stack = - (void *)((uintptr_t)alloca(bytes + sizeof(*frame) + rsize + 15) & ~16); - frame = (struct call_frame *)(stack + bytes); - if (rsize) - rvalue = frame + 1; - - frame->fn = fn; - frame->flags = flags; - frame->rvalue = rvalue; - - narg_reg = 0; - switch (flags) - { - case X86_RET_STRUCTARG: - /* The pointer is passed as the first argument. */ - if (pabi->nregs > 0) - { - frame->regs[pabi->regs[0]] = (unsigned)rvalue; - narg_reg = 1; - break; - } - /* fallthru */ - case X86_RET_STRUCTPOP: - *(void **)argp = rvalue; - argp += sizeof(void *); - bytes -= sizeof(void *); - break; - } - - arg_types = cif->arg_types; - for (i = 0, n = cif->nargs; narg_reg < pabi->nregs && i < n; i++) - { - ffi_type *ty = arg_types[i]; - size_t z = ty->size; - int t = ty->type; - - if (z <= FFI_SIZEOF_ARG && t != FFI_TYPE_STRUCT && t != FFI_TYPE_FLOAT) - { - ffi_arg val = extend_basic_type (avalue, t); - frame->regs[pabi->regs[narg_reg++]] = val; - z = FFI_SIZEOF_ARG; - } - else - { - memcpy (argp, avalue, z); - z = FFI_ALIGN (z, FFI_SIZEOF_ARG); - argp += z; - } - avalue += z; - bytes -= z; - } - if (i < n) - memcpy (argp, avalue, bytes); - - ffi_call_i386 (frame, stack); -} -#endif /* !FFI_NO_RAW_API */ -#endif /* __i386__ */ diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/ffi64.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/ffi64.c deleted file mode 100644 index 39f9598..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/ffi64.c +++ /dev/null @@ -1,895 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi64.c - Copyright (c) 2011, 2018 Anthony Green - Copyright (c) 2013 The Written Word, Inc. - Copyright (c) 2008, 2010 Red Hat, Inc. - Copyright (c) 2002, 2007 Bo Thorsen - - x86-64 Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#include -#include - -#include -#include -#include -#include "internal64.h" - -#ifdef __x86_64__ - -#define MAX_GPR_REGS 6 -#define MAX_SSE_REGS 8 - -#if defined(__INTEL_COMPILER) -#include "xmmintrin.h" -#define UINT128 __m128 -#else -#if defined(__SUNPRO_C) -#include -#define UINT128 __m128i -#else -#define UINT128 __int128_t -#endif -#endif - -union big_int_union -{ - UINT32 i32; - UINT64 i64; - UINT128 i128; -}; - -struct register_args -{ - /* Registers for argument passing. */ - UINT64 gpr[MAX_GPR_REGS]; - union big_int_union sse[MAX_SSE_REGS]; - UINT64 rax; /* ssecount */ - UINT64 r10; /* static chain */ -}; - -extern void ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags, - void *raddr, void (*fnaddr)(void)) FFI_HIDDEN; - -/* All reference to register classes here is identical to the code in - gcc/config/i386/i386.c. Do *not* change one without the other. */ - -/* Register class used for passing given 64bit part of the argument. - These represent classes as documented by the PS ABI, with the - exception of SSESF, SSEDF classes, that are basically SSE class, - just gcc will use SF or DFmode move instead of DImode to avoid - reformatting penalties. - - Similary we play games with INTEGERSI_CLASS to use cheaper SImode moves - whenever possible (upper half does contain padding). */ -enum x86_64_reg_class - { - X86_64_NO_CLASS, - X86_64_INTEGER_CLASS, - X86_64_INTEGERSI_CLASS, - X86_64_SSE_CLASS, - X86_64_SSESF_CLASS, - X86_64_SSEDF_CLASS, - X86_64_SSEUP_CLASS, - X86_64_X87_CLASS, - X86_64_X87UP_CLASS, - X86_64_COMPLEX_X87_CLASS, - X86_64_MEMORY_CLASS - }; - -#define MAX_CLASSES 4 - -#define SSE_CLASS_P(X) ((X) >= X86_64_SSE_CLASS && X <= X86_64_SSEUP_CLASS) - -/* x86-64 register passing implementation. See x86-64 ABI for details. Goal - of this code is to classify each 8bytes of incoming argument by the register - class and assign registers accordingly. */ - -/* Return the union class of CLASS1 and CLASS2. - See the x86-64 PS ABI for details. */ - -static enum x86_64_reg_class -merge_classes (enum x86_64_reg_class class1, enum x86_64_reg_class class2) -{ - /* Rule #1: If both classes are equal, this is the resulting class. */ - if (class1 == class2) - return class1; - - /* Rule #2: If one of the classes is NO_CLASS, the resulting class is - the other class. */ - if (class1 == X86_64_NO_CLASS) - return class2; - if (class2 == X86_64_NO_CLASS) - return class1; - - /* Rule #3: If one of the classes is MEMORY, the result is MEMORY. */ - if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS) - return X86_64_MEMORY_CLASS; - - /* Rule #4: If one of the classes is INTEGER, the result is INTEGER. */ - if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS) - || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS)) - return X86_64_INTEGERSI_CLASS; - if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS - || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS) - return X86_64_INTEGER_CLASS; - - /* Rule #5: If one of the classes is X87, X87UP, or COMPLEX_X87 class, - MEMORY is used. */ - if (class1 == X86_64_X87_CLASS - || class1 == X86_64_X87UP_CLASS - || class1 == X86_64_COMPLEX_X87_CLASS - || class2 == X86_64_X87_CLASS - || class2 == X86_64_X87UP_CLASS - || class2 == X86_64_COMPLEX_X87_CLASS) - return X86_64_MEMORY_CLASS; - - /* Rule #6: Otherwise class SSE is used. */ - return X86_64_SSE_CLASS; -} - -/* Classify the argument of type TYPE and mode MODE. - CLASSES will be filled by the register class used to pass each word - of the operand. The number of words is returned. In case the parameter - should be passed in memory, 0 is returned. As a special case for zero - sized containers, classes[0] will be NO_CLASS and 1 is returned. - - See the x86-64 PS ABI for details. -*/ -static size_t -classify_argument (ffi_type *type, enum x86_64_reg_class classes[], - size_t byte_offset) -{ - switch (type->type) - { - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - case FFI_TYPE_POINTER: - do_integer: - { - size_t size = byte_offset + type->size; - - if (size <= 4) - { - classes[0] = X86_64_INTEGERSI_CLASS; - return 1; - } - else if (size <= 8) - { - classes[0] = X86_64_INTEGER_CLASS; - return 1; - } - else if (size <= 12) - { - classes[0] = X86_64_INTEGER_CLASS; - classes[1] = X86_64_INTEGERSI_CLASS; - return 2; - } - else if (size <= 16) - { - classes[0] = classes[1] = X86_64_INTEGER_CLASS; - return 2; - } - else - FFI_ASSERT (0); - } - case FFI_TYPE_FLOAT: - if (!(byte_offset % 8)) - classes[0] = X86_64_SSESF_CLASS; - else - classes[0] = X86_64_SSE_CLASS; - return 1; - case FFI_TYPE_DOUBLE: - classes[0] = X86_64_SSEDF_CLASS; - return 1; -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - classes[0] = X86_64_X87_CLASS; - classes[1] = X86_64_X87UP_CLASS; - return 2; -#endif - case FFI_TYPE_STRUCT: - { - const size_t UNITS_PER_WORD = 8; - size_t words = (type->size + UNITS_PER_WORD - 1) / UNITS_PER_WORD; - ffi_type **ptr; - unsigned int i; - enum x86_64_reg_class subclasses[MAX_CLASSES]; - - /* If the struct is larger than 32 bytes, pass it on the stack. */ - if (type->size > 32) - return 0; - - for (i = 0; i < words; i++) - classes[i] = X86_64_NO_CLASS; - - /* Zero sized arrays or structures are NO_CLASS. We return 0 to - signalize memory class, so handle it as special case. */ - if (!words) - { - case FFI_TYPE_VOID: - classes[0] = X86_64_NO_CLASS; - return 1; - } - - /* Merge the fields of structure. */ - for (ptr = type->elements; *ptr != NULL; ptr++) - { - size_t num; - - byte_offset = FFI_ALIGN (byte_offset, (*ptr)->alignment); - - num = classify_argument (*ptr, subclasses, byte_offset % 8); - if (num == 0) - return 0; - for (i = 0; i < num; i++) - { - size_t pos = byte_offset / 8; - classes[i + pos] = - merge_classes (subclasses[i], classes[i + pos]); - } - - byte_offset += (*ptr)->size; - } - - if (words > 2) - { - /* When size > 16 bytes, if the first one isn't - X86_64_SSE_CLASS or any other ones aren't - X86_64_SSEUP_CLASS, everything should be passed in - memory. */ - if (classes[0] != X86_64_SSE_CLASS) - return 0; - - for (i = 1; i < words; i++) - if (classes[i] != X86_64_SSEUP_CLASS) - return 0; - } - - /* Final merger cleanup. */ - for (i = 0; i < words; i++) - { - /* If one class is MEMORY, everything should be passed in - memory. */ - if (classes[i] == X86_64_MEMORY_CLASS) - return 0; - - /* The X86_64_SSEUP_CLASS should be always preceded by - X86_64_SSE_CLASS or X86_64_SSEUP_CLASS. */ - if (i > 1 && classes[i] == X86_64_SSEUP_CLASS - && classes[i - 1] != X86_64_SSE_CLASS - && classes[i - 1] != X86_64_SSEUP_CLASS) - { - /* The first one should never be X86_64_SSEUP_CLASS. */ - FFI_ASSERT (i != 0); - classes[i] = X86_64_SSE_CLASS; - } - - /* If X86_64_X87UP_CLASS isn't preceded by X86_64_X87_CLASS, - everything should be passed in memory. */ - if (i > 1 && classes[i] == X86_64_X87UP_CLASS - && (classes[i - 1] != X86_64_X87_CLASS)) - { - /* The first one should never be X86_64_X87UP_CLASS. */ - FFI_ASSERT (i != 0); - return 0; - } - } - return words; - } - case FFI_TYPE_COMPLEX: - { - ffi_type *inner = type->elements[0]; - switch (inner->type) - { - case FFI_TYPE_INT: - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - goto do_integer; - - case FFI_TYPE_FLOAT: - classes[0] = X86_64_SSE_CLASS; - if (byte_offset % 8) - { - classes[1] = X86_64_SSESF_CLASS; - return 2; - } - return 1; - case FFI_TYPE_DOUBLE: - classes[0] = classes[1] = X86_64_SSEDF_CLASS; - return 2; -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - classes[0] = X86_64_COMPLEX_X87_CLASS; - return 1; -#endif - } - } - } - abort(); -} - -/* Examine the argument and return set number of register required in each - class. Return zero iff parameter should be passed in memory, otherwise - the number of registers. */ - -static size_t -examine_argument (ffi_type *type, enum x86_64_reg_class classes[MAX_CLASSES], - _Bool in_return, int *pngpr, int *pnsse) -{ - size_t n; - unsigned int i; - int ngpr, nsse; - - n = classify_argument (type, classes, 0); - if (n == 0) - return 0; - - ngpr = nsse = 0; - for (i = 0; i < n; ++i) - switch (classes[i]) - { - case X86_64_INTEGER_CLASS: - case X86_64_INTEGERSI_CLASS: - ngpr++; - break; - case X86_64_SSE_CLASS: - case X86_64_SSESF_CLASS: - case X86_64_SSEDF_CLASS: - nsse++; - break; - case X86_64_NO_CLASS: - case X86_64_SSEUP_CLASS: - break; - case X86_64_X87_CLASS: - case X86_64_X87UP_CLASS: - case X86_64_COMPLEX_X87_CLASS: - return in_return != 0; - default: - abort (); - } - - *pngpr = ngpr; - *pnsse = nsse; - - return n; -} - -/* Perform machine dependent cif processing. */ - -#ifndef __ILP32__ -extern ffi_status -ffi_prep_cif_machdep_efi64(ffi_cif *cif); -#endif - -ffi_status FFI_HIDDEN -ffi_prep_cif_machdep (ffi_cif *cif) -{ - int gprcount, ssecount, i, avn, ngpr, nsse; - unsigned flags; - enum x86_64_reg_class classes[MAX_CLASSES]; - size_t bytes, n, rtype_size; - ffi_type *rtype; - -#ifndef __ILP32__ - if (cif->abi == FFI_EFI64 || cif->abi == FFI_GNUW64) - return ffi_prep_cif_machdep_efi64(cif); -#endif - if (cif->abi != FFI_UNIX64) - return FFI_BAD_ABI; - - gprcount = ssecount = 0; - - rtype = cif->rtype; - rtype_size = rtype->size; - switch (rtype->type) - { - case FFI_TYPE_VOID: - flags = UNIX64_RET_VOID; - break; - case FFI_TYPE_UINT8: - flags = UNIX64_RET_UINT8; - break; - case FFI_TYPE_SINT8: - flags = UNIX64_RET_SINT8; - break; - case FFI_TYPE_UINT16: - flags = UNIX64_RET_UINT16; - break; - case FFI_TYPE_SINT16: - flags = UNIX64_RET_SINT16; - break; - case FFI_TYPE_UINT32: - flags = UNIX64_RET_UINT32; - break; - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: - flags = UNIX64_RET_SINT32; - break; - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - flags = UNIX64_RET_INT64; - break; - case FFI_TYPE_POINTER: - flags = (sizeof(void *) == 4 ? UNIX64_RET_UINT32 : UNIX64_RET_INT64); - break; - case FFI_TYPE_FLOAT: - flags = UNIX64_RET_XMM32; - break; - case FFI_TYPE_DOUBLE: - flags = UNIX64_RET_XMM64; - break; -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - flags = UNIX64_RET_X87; - break; -#endif - case FFI_TYPE_STRUCT: - n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); - if (n == 0) - { - /* The return value is passed in memory. A pointer to that - memory is the first argument. Allocate a register for it. */ - gprcount++; - /* We don't have to do anything in asm for the return. */ - flags = UNIX64_RET_VOID | UNIX64_FLAG_RET_IN_MEM; - } - else - { - _Bool sse0 = SSE_CLASS_P (classes[0]); - - if (rtype_size == 4 && sse0) - flags = UNIX64_RET_XMM32; - else if (rtype_size == 8) - flags = sse0 ? UNIX64_RET_XMM64 : UNIX64_RET_INT64; - else - { - _Bool sse1 = n == 2 && SSE_CLASS_P (classes[1]); - if (sse0 && sse1) - flags = UNIX64_RET_ST_XMM0_XMM1; - else if (sse0) - flags = UNIX64_RET_ST_XMM0_RAX; - else if (sse1) - flags = UNIX64_RET_ST_RAX_XMM0; - else - flags = UNIX64_RET_ST_RAX_RDX; - flags |= rtype_size << UNIX64_SIZE_SHIFT; - } - } - break; - case FFI_TYPE_COMPLEX: - switch (rtype->elements[0]->type) - { - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT16: - case FFI_TYPE_INT: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - flags = UNIX64_RET_ST_RAX_RDX | ((unsigned) rtype_size << UNIX64_SIZE_SHIFT); - break; - case FFI_TYPE_FLOAT: - flags = UNIX64_RET_XMM64; - break; - case FFI_TYPE_DOUBLE: - flags = UNIX64_RET_ST_XMM0_XMM1 | (16 << UNIX64_SIZE_SHIFT); - break; -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - flags = UNIX64_RET_X87_2; - break; -#endif - default: - return FFI_BAD_TYPEDEF; - } - break; - default: - return FFI_BAD_TYPEDEF; - } - - /* Go over all arguments and determine the way they should be passed. - If it's in a register and there is space for it, let that be so. If - not, add it's size to the stack byte count. */ - for (bytes = 0, i = 0, avn = cif->nargs; i < avn; i++) - { - if (examine_argument (cif->arg_types[i], classes, 0, &ngpr, &nsse) == 0 - || gprcount + ngpr > MAX_GPR_REGS - || ssecount + nsse > MAX_SSE_REGS) - { - long align = cif->arg_types[i]->alignment; - - if (align < 8) - align = 8; - - bytes = FFI_ALIGN (bytes, align); - bytes += cif->arg_types[i]->size; - } - else - { - gprcount += ngpr; - ssecount += nsse; - } - } - if (ssecount) - flags |= UNIX64_FLAG_XMM_ARGS; - - cif->flags = flags; - cif->bytes = (unsigned) FFI_ALIGN (bytes, 8); - - return FFI_OK; -} - -static void -ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue, - void **avalue, void *closure) -{ - enum x86_64_reg_class classes[MAX_CLASSES]; - char *stack, *argp; - ffi_type **arg_types; - int gprcount, ssecount, ngpr, nsse, i, avn, flags; - struct register_args *reg_args; - - /* Can't call 32-bit mode from 64-bit mode. */ - FFI_ASSERT (cif->abi == FFI_UNIX64); - - /* If the return value is a struct and we don't have a return value - address then we need to make one. Otherwise we can ignore it. */ - flags = cif->flags; - if (rvalue == NULL) - { - if (flags & UNIX64_FLAG_RET_IN_MEM) - rvalue = alloca (cif->rtype->size); - else - flags = UNIX64_RET_VOID; - } - - /* Allocate the space for the arguments, plus 4 words of temp space. */ - stack = alloca (sizeof (struct register_args) + cif->bytes + 4*8); - reg_args = (struct register_args *) stack; - argp = stack + sizeof (struct register_args); - - reg_args->r10 = (uintptr_t) closure; - - gprcount = ssecount = 0; - - /* If the return value is passed in memory, add the pointer as the - first integer argument. */ - if (flags & UNIX64_FLAG_RET_IN_MEM) - reg_args->gpr[gprcount++] = (unsigned long) rvalue; - - avn = cif->nargs; - arg_types = cif->arg_types; - - for (i = 0; i < avn; ++i) - { - size_t n, size = arg_types[i]->size; - - n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); - if (n == 0 - || gprcount + ngpr > MAX_GPR_REGS - || ssecount + nsse > MAX_SSE_REGS) - { - long align = arg_types[i]->alignment; - - /* Stack arguments are *always* at least 8 byte aligned. */ - if (align < 8) - align = 8; - - /* Pass this argument in memory. */ - argp = (void *) FFI_ALIGN (argp, align); - memcpy (argp, avalue[i], size); - argp += size; - } - else - { - /* The argument is passed entirely in registers. */ - char *a = (char *) avalue[i]; - unsigned int j; - - for (j = 0; j < n; j++, a += 8, size -= 8) - { - switch (classes[j]) - { - case X86_64_NO_CLASS: - case X86_64_SSEUP_CLASS: - break; - case X86_64_INTEGER_CLASS: - case X86_64_INTEGERSI_CLASS: - /* Sign-extend integer arguments passed in general - purpose registers, to cope with the fact that - LLVM incorrectly assumes that this will be done - (the x86-64 PS ABI does not specify this). */ - switch (arg_types[i]->type) - { - case FFI_TYPE_SINT8: - reg_args->gpr[gprcount] = (SINT64) *((SINT8 *) a); - break; - case FFI_TYPE_SINT16: - reg_args->gpr[gprcount] = (SINT64) *((SINT16 *) a); - break; - case FFI_TYPE_SINT32: - reg_args->gpr[gprcount] = (SINT64) *((SINT32 *) a); - break; - default: - reg_args->gpr[gprcount] = 0; - memcpy (®_args->gpr[gprcount], a, size); - } - gprcount++; - break; - case X86_64_SSE_CLASS: - case X86_64_SSEDF_CLASS: - memcpy (®_args->sse[ssecount++].i64, a, sizeof(UINT64)); - break; - case X86_64_SSESF_CLASS: - memcpy (®_args->sse[ssecount++].i32, a, sizeof(UINT32)); - break; - default: - abort(); - } - } - } - } - reg_args->rax = ssecount; - - ffi_call_unix64 (stack, cif->bytes + sizeof (struct register_args), - flags, rvalue, fn); -} - -#ifndef __ILP32__ -extern void -ffi_call_efi64(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue); -#endif - -void -ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ -#ifndef __ILP32__ - if (cif->abi == FFI_EFI64 || cif->abi == FFI_GNUW64) - { - ffi_call_efi64(cif, fn, rvalue, avalue); - return; - } -#endif - ffi_call_int (cif, fn, rvalue, avalue, NULL); -} - -#ifdef FFI_GO_CLOSURES - -#ifndef __ILP32__ -extern void -ffi_call_go_efi64(ffi_cif *cif, void (*fn)(void), void *rvalue, - void **avalue, void *closure); -#endif - -void -ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue, - void **avalue, void *closure) -{ -#ifndef __ILP32__ - if (cif->abi == FFI_EFI64 || cif->abi == FFI_GNUW64) - { - ffi_call_go_efi64(cif, fn, rvalue, avalue, closure); - return; - } -#endif - ffi_call_int (cif, fn, rvalue, avalue, closure); -} - -#endif /* FFI_GO_CLOSURES */ - -extern void ffi_closure_unix64(void) FFI_HIDDEN; -extern void ffi_closure_unix64_sse(void) FFI_HIDDEN; - -#ifndef __ILP32__ -extern ffi_status -ffi_prep_closure_loc_efi64(ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, - void *codeloc); -#endif - -ffi_status -ffi_prep_closure_loc (ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, - void *codeloc) -{ - static const unsigned char trampoline[24] = { - /* endbr64 */ - 0xf3, 0x0f, 0x1e, 0xfa, - /* leaq -0xb(%rip),%r10 # 0x0 */ - 0x4c, 0x8d, 0x15, 0xf5, 0xff, 0xff, 0xff, - /* jmpq *0x7(%rip) # 0x18 */ - 0xff, 0x25, 0x07, 0x00, 0x00, 0x00, - /* nopl 0(%rax) */ - 0x0f, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00 - }; - void (*dest)(void); - char *tramp = closure->tramp; - -#ifndef __ILP32__ - if (cif->abi == FFI_EFI64 || cif->abi == FFI_GNUW64) - return ffi_prep_closure_loc_efi64(closure, cif, fun, user_data, codeloc); -#endif - if (cif->abi != FFI_UNIX64) - return FFI_BAD_ABI; - - if (cif->flags & UNIX64_FLAG_XMM_ARGS) - dest = ffi_closure_unix64_sse; - else - dest = ffi_closure_unix64; - - memcpy (tramp, trampoline, sizeof(trampoline)); - *(UINT64 *)(tramp + sizeof (trampoline)) = (uintptr_t)dest; - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - return FFI_OK; -} - -int FFI_HIDDEN -ffi_closure_unix64_inner(ffi_cif *cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, - void *rvalue, - struct register_args *reg_args, - char *argp) -{ - void **avalue; - ffi_type **arg_types; - long i, avn; - int gprcount, ssecount, ngpr, nsse; - int flags; - - avn = cif->nargs; - flags = cif->flags; - avalue = alloca(avn * sizeof(void *)); - gprcount = ssecount = 0; - - if (flags & UNIX64_FLAG_RET_IN_MEM) - { - /* On return, %rax will contain the address that was passed - by the caller in %rdi. */ - void *r = (void *)(uintptr_t)reg_args->gpr[gprcount++]; - *(void **)rvalue = r; - rvalue = r; - flags = (sizeof(void *) == 4 ? UNIX64_RET_UINT32 : UNIX64_RET_INT64); - } - - arg_types = cif->arg_types; - for (i = 0; i < avn; ++i) - { - enum x86_64_reg_class classes[MAX_CLASSES]; - size_t n; - - n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); - if (n == 0 - || gprcount + ngpr > MAX_GPR_REGS - || ssecount + nsse > MAX_SSE_REGS) - { - long align = arg_types[i]->alignment; - - /* Stack arguments are *always* at least 8 byte aligned. */ - if (align < 8) - align = 8; - - /* Pass this argument in memory. */ - argp = (void *) FFI_ALIGN (argp, align); - avalue[i] = argp; - argp += arg_types[i]->size; - } - /* If the argument is in a single register, or two consecutive - integer registers, then we can use that address directly. */ - else if (n == 1 - || (n == 2 && !(SSE_CLASS_P (classes[0]) - || SSE_CLASS_P (classes[1])))) - { - /* The argument is in a single register. */ - if (SSE_CLASS_P (classes[0])) - { - avalue[i] = ®_args->sse[ssecount]; - ssecount += n; - } - else - { - avalue[i] = ®_args->gpr[gprcount]; - gprcount += n; - } - } - /* Otherwise, allocate space to make them consecutive. */ - else - { - char *a = alloca (16); - unsigned int j; - - avalue[i] = a; - for (j = 0; j < n; j++, a += 8) - { - if (SSE_CLASS_P (classes[j])) - memcpy (a, ®_args->sse[ssecount++], 8); - else - memcpy (a, ®_args->gpr[gprcount++], 8); - } - } - } - - /* Invoke the closure. */ - fun (cif, rvalue, avalue, user_data); - - /* Tell assembly how to perform return type promotions. */ - return flags; -} - -#ifdef FFI_GO_CLOSURES - -extern void ffi_go_closure_unix64(void) FFI_HIDDEN; -extern void ffi_go_closure_unix64_sse(void) FFI_HIDDEN; - -#ifndef __ILP32__ -extern ffi_status -ffi_prep_go_closure_efi64(ffi_go_closure* closure, ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*)); -#endif - -ffi_status -ffi_prep_go_closure (ffi_go_closure* closure, ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*)) -{ -#ifndef __ILP32__ - if (cif->abi == FFI_EFI64 || cif->abi == FFI_GNUW64) - return ffi_prep_go_closure_efi64(closure, cif, fun); -#endif - if (cif->abi != FFI_UNIX64) - return FFI_BAD_ABI; - - closure->tramp = (cif->flags & UNIX64_FLAG_XMM_ARGS - ? ffi_go_closure_unix64_sse - : ffi_go_closure_unix64); - closure->cif = cif; - closure->fun = fun; - - return FFI_OK; -} - -#endif /* FFI_GO_CLOSURES */ - -#endif /* __x86_64__ */ diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/ffitarget.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/ffitarget.h deleted file mode 100644 index a34f3e5..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/ffitarget.h +++ /dev/null @@ -1,160 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012, 2014, 2018 Anthony Green - Copyright (c) 1996-2003, 2010 Red Hat, Inc. - Copyright (C) 2008 Free Software Foundation, Inc. - - Target configuration macros for x86 and x86-64. - - 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. - - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -/* ---- System specific configurations ----------------------------------- */ - -/* For code common to all platforms on x86 and x86_64. */ -#define X86_ANY - -#if defined (X86_64) && defined (__i386__) -#undef X86_64 -#define X86 -#endif - -#ifdef X86_WIN64 -#define FFI_SIZEOF_ARG 8 -#define USE_BUILTIN_FFS 0 /* not yet implemented in mingw-64 */ -#endif - -#define FFI_TARGET_SPECIFIC_STACK_SPACE_ALLOCATION -#ifndef _MSC_VER -#define FFI_TARGET_HAS_COMPLEX_TYPE -#endif - -/* ---- Generic type definitions ----------------------------------------- */ - -#ifndef LIBFFI_ASM -#ifdef X86_WIN64 -#ifdef _MSC_VER -typedef unsigned __int64 ffi_arg; -typedef __int64 ffi_sarg; -#else -typedef unsigned long long ffi_arg; -typedef long long ffi_sarg; -#endif -#else -#if defined __x86_64__ && defined __ILP32__ -#define FFI_SIZEOF_ARG 8 -#define FFI_SIZEOF_JAVA_RAW 4 -typedef unsigned long long ffi_arg; -typedef long long ffi_sarg; -#else -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; -#endif -#endif - -typedef enum ffi_abi { -#if defined(X86_WIN64) - FFI_FIRST_ABI = 0, - FFI_WIN64, /* sizeof(long double) == 8 - microsoft compilers */ - FFI_GNUW64, /* sizeof(long double) == 16 - GNU compilers */ - FFI_LAST_ABI, -#ifdef __GNUC__ - FFI_DEFAULT_ABI = FFI_GNUW64 -#else - FFI_DEFAULT_ABI = FFI_WIN64 -#endif - -#elif defined(X86_64) || (defined (__x86_64__) && defined (X86_DARWIN)) - FFI_FIRST_ABI = 1, - FFI_UNIX64, - FFI_WIN64, - FFI_EFI64 = FFI_WIN64, - FFI_GNUW64, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_UNIX64 - -#elif defined(X86_WIN32) - FFI_FIRST_ABI = 0, - FFI_SYSV = 1, - FFI_STDCALL = 2, - FFI_THISCALL = 3, - FFI_FASTCALL = 4, - FFI_MS_CDECL = 5, - FFI_PASCAL = 6, - FFI_REGISTER = 7, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_MS_CDECL -#else - FFI_FIRST_ABI = 0, - FFI_SYSV = 1, - FFI_THISCALL = 3, - FFI_FASTCALL = 4, - FFI_STDCALL = 5, - FFI_PASCAL = 6, - FFI_REGISTER = 7, - FFI_MS_CDECL = 8, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_SYSV -#endif -} ffi_abi; -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_GO_CLOSURES 1 - -#define FFI_TYPE_SMALL_STRUCT_1B (FFI_TYPE_LAST + 1) -#define FFI_TYPE_SMALL_STRUCT_2B (FFI_TYPE_LAST + 2) -#define FFI_TYPE_SMALL_STRUCT_4B (FFI_TYPE_LAST + 3) -#define FFI_TYPE_MS_STRUCT (FFI_TYPE_LAST + 4) - -#if defined (X86_64) || defined(X86_WIN64) \ - || (defined (__x86_64__) && defined (X86_DARWIN)) -/* 4 bytes of ENDBR64 + 7 bytes of LEA + 6 bytes of JMP + 7 bytes of NOP - + 8 bytes of pointer. */ -# define FFI_TRAMPOLINE_SIZE 32 -# define FFI_NATIVE_RAW_API 0 -#else -/* 4 bytes of ENDBR32 + 5 bytes of MOV + 5 bytes of JMP + 2 unused - bytes. */ -# define FFI_TRAMPOLINE_SIZE 16 -# define FFI_NATIVE_RAW_API 1 /* x86 has native raw api support */ -#endif - -#if !defined(GENERATE_LIBFFI_MAP) && defined(__ASSEMBLER__) \ - && defined(__CET__) -# include -# define _CET_NOTRACK notrack -#else -# define _CET_ENDBR -# define _CET_NOTRACK -#endif - -#endif - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/ffiw64.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/ffiw64.c deleted file mode 100644 index a43a9eb..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/ffiw64.c +++ /dev/null @@ -1,318 +0,0 @@ -/* ----------------------------------------------------------------------- - ffiw64.c - Copyright (c) 2018 Anthony Green - Copyright (c) 2014 Red Hat, Inc. - - x86 win64 Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#if defined(__x86_64__) || defined(_M_AMD64) -#include -#include -#include -#include - -#ifdef X86_WIN64 -#define EFI64(name) name -#else -#define EFI64(name) FFI_HIDDEN name##_efi64 -#endif - -struct win64_call_frame -{ - UINT64 rbp; /* 0 */ - UINT64 retaddr; /* 8 */ - UINT64 fn; /* 16 */ - UINT64 flags; /* 24 */ - UINT64 rvalue; /* 32 */ -}; - -extern void ffi_call_win64 (void *stack, struct win64_call_frame *, - void *closure) FFI_HIDDEN; - -ffi_status FFI_HIDDEN -EFI64(ffi_prep_cif_machdep)(ffi_cif *cif) -{ - int flags, n; - - switch (cif->abi) - { - case FFI_WIN64: - case FFI_GNUW64: - break; - default: - return FFI_BAD_ABI; - } - - flags = cif->rtype->type; - switch (flags) - { - default: - break; - case FFI_TYPE_LONGDOUBLE: - /* GCC returns long double values by reference, like a struct */ - if (cif->abi == FFI_GNUW64) - flags = FFI_TYPE_STRUCT; - break; - case FFI_TYPE_COMPLEX: - flags = FFI_TYPE_STRUCT; - /* FALLTHRU */ - case FFI_TYPE_STRUCT: - switch (cif->rtype->size) - { - case 8: - flags = FFI_TYPE_UINT64; - break; - case 4: - flags = FFI_TYPE_SMALL_STRUCT_4B; - break; - case 2: - flags = FFI_TYPE_SMALL_STRUCT_2B; - break; - case 1: - flags = FFI_TYPE_SMALL_STRUCT_1B; - break; - } - break; - } - cif->flags = flags; - - /* Each argument either fits in a register, an 8 byte slot, or is - passed by reference with the pointer in the 8 byte slot. */ - n = cif->nargs; - n += (flags == FFI_TYPE_STRUCT); - if (n < 4) - n = 4; - cif->bytes = n * 8; - - return FFI_OK; -} - -static void -ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue, - void **avalue, void *closure) -{ - int i, j, n, flags; - UINT64 *stack; - size_t rsize; - struct win64_call_frame *frame; - - FFI_ASSERT(cif->abi == FFI_GNUW64 || cif->abi == FFI_WIN64); - - flags = cif->flags; - rsize = 0; - - /* If we have no return value for a structure, we need to create one. - Otherwise we can ignore the return type entirely. */ - if (rvalue == NULL) - { - if (flags == FFI_TYPE_STRUCT) - rsize = cif->rtype->size; - else - flags = FFI_TYPE_VOID; - } - - stack = alloca(cif->bytes + sizeof(struct win64_call_frame) + rsize); - frame = (struct win64_call_frame *)((char *)stack + cif->bytes); - if (rsize) - rvalue = frame + 1; - - frame->fn = (uintptr_t)fn; - frame->flags = flags; - frame->rvalue = (uintptr_t)rvalue; - - j = 0; - if (flags == FFI_TYPE_STRUCT) - { - stack[0] = (uintptr_t)rvalue; - j = 1; - } - - for (i = 0, n = cif->nargs; i < n; ++i, ++j) - { - switch (cif->arg_types[i]->size) - { - case 8: - stack[j] = *(UINT64 *)avalue[i]; - break; - case 4: - stack[j] = *(UINT32 *)avalue[i]; - break; - case 2: - stack[j] = *(UINT16 *)avalue[i]; - break; - case 1: - stack[j] = *(UINT8 *)avalue[i]; - break; - default: - stack[j] = (uintptr_t)avalue[i]; - break; - } - } - - ffi_call_win64 (stack, frame, closure); -} - -void -EFI64(ffi_call)(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - ffi_call_int (cif, fn, rvalue, avalue, NULL); -} - -void -EFI64(ffi_call_go)(ffi_cif *cif, void (*fn)(void), void *rvalue, - void **avalue, void *closure) -{ - ffi_call_int (cif, fn, rvalue, avalue, closure); -} - - -extern void ffi_closure_win64(void) FFI_HIDDEN; - -#ifdef FFI_GO_CLOSURES -extern void ffi_go_closure_win64(void) FFI_HIDDEN; -#endif - -ffi_status -EFI64(ffi_prep_closure_loc)(ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, - void *codeloc) -{ - static const unsigned char trampoline[FFI_TRAMPOLINE_SIZE - 8] = { - /* endbr64 */ - 0xf3, 0x0f, 0x1e, 0xfa, - /* leaq -0xb(%rip),%r10 # 0x0 */ - 0x4c, 0x8d, 0x15, 0xf5, 0xff, 0xff, 0xff, - /* jmpq *0x7(%rip) # 0x18 */ - 0xff, 0x25, 0x07, 0x00, 0x00, 0x00, - /* nopl 0(%rax) */ - 0x0f, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00 - }; - char *tramp = closure->tramp; - - switch (cif->abi) - { - case FFI_WIN64: - case FFI_GNUW64: - break; - default: - return FFI_BAD_ABI; - } - - memcpy (tramp, trampoline, sizeof(trampoline)); - *(UINT64 *)(tramp + sizeof (trampoline)) = (uintptr_t)ffi_closure_win64; - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - return FFI_OK; -} - -#ifdef FFI_GO_CLOSURES -ffi_status -EFI64(ffi_prep_go_closure)(ffi_go_closure* closure, ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*)) -{ - switch (cif->abi) - { - case FFI_WIN64: - case FFI_GNUW64: - break; - default: - return FFI_BAD_ABI; - } - - closure->tramp = ffi_go_closure_win64; - closure->cif = cif; - closure->fun = fun; - - return FFI_OK; -} -#endif - -struct win64_closure_frame -{ - UINT64 rvalue[2]; - UINT64 fargs[4]; - UINT64 retaddr; - UINT64 args[]; -}; - -/* Force the inner function to use the MS ABI. When compiling on win64 - this is a nop. When compiling on unix, this simplifies the assembly, - and places the burden of saving the extra call-saved registers on - the compiler. */ -int FFI_HIDDEN __attribute__((ms_abi)) -ffi_closure_win64_inner(ffi_cif *cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, - struct win64_closure_frame *frame) -{ - void **avalue; - void *rvalue; - int i, n, nreg, flags; - - avalue = alloca(cif->nargs * sizeof(void *)); - rvalue = frame->rvalue; - nreg = 0; - - /* When returning a structure, the address is in the first argument. - We must also be prepared to return the same address in eax, so - install that address in the frame and pretend we return a pointer. */ - flags = cif->flags; - if (flags == FFI_TYPE_STRUCT) - { - rvalue = (void *)(uintptr_t)frame->args[0]; - frame->rvalue[0] = frame->args[0]; - nreg = 1; - } - - for (i = 0, n = cif->nargs; i < n; ++i, ++nreg) - { - size_t size = cif->arg_types[i]->size; - size_t type = cif->arg_types[i]->type; - void *a; - - if (type == FFI_TYPE_DOUBLE || type == FFI_TYPE_FLOAT) - { - if (nreg < 4) - a = &frame->fargs[nreg]; - else - a = &frame->args[nreg]; - } - else if (size == 1 || size == 2 || size == 4 || size == 8) - a = &frame->args[nreg]; - else - a = (void *)(uintptr_t)frame->args[nreg]; - - avalue[i] = a; - } - - /* Invoke the closure. */ - fun (cif, rvalue, avalue, user_data); - return flags; -} - -#endif /* __x86_64__ */ diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/internal.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/internal.h deleted file mode 100644 index 09771ba..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/internal.h +++ /dev/null @@ -1,29 +0,0 @@ -#define X86_RET_FLOAT 0 -#define X86_RET_DOUBLE 1 -#define X86_RET_LDOUBLE 2 -#define X86_RET_SINT8 3 -#define X86_RET_SINT16 4 -#define X86_RET_UINT8 5 -#define X86_RET_UINT16 6 -#define X86_RET_INT64 7 -#define X86_RET_INT32 8 -#define X86_RET_VOID 9 -#define X86_RET_STRUCTPOP 10 -#define X86_RET_STRUCTARG 11 -#define X86_RET_STRUCT_1B 12 -#define X86_RET_STRUCT_2B 13 -#define X86_RET_UNUSED14 14 -#define X86_RET_UNUSED15 15 - -#define X86_RET_TYPE_MASK 15 -#define X86_RET_POP_SHIFT 4 - -#define R_EAX 0 -#define R_EDX 1 -#define R_ECX 2 - -#ifdef __PCC__ -# define HAVE_FASTCALL 0 -#else -# define HAVE_FASTCALL 1 -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/internal64.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/internal64.h deleted file mode 100644 index 512e955..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/internal64.h +++ /dev/null @@ -1,22 +0,0 @@ -#define UNIX64_RET_VOID 0 -#define UNIX64_RET_UINT8 1 -#define UNIX64_RET_UINT16 2 -#define UNIX64_RET_UINT32 3 -#define UNIX64_RET_SINT8 4 -#define UNIX64_RET_SINT16 5 -#define UNIX64_RET_SINT32 6 -#define UNIX64_RET_INT64 7 -#define UNIX64_RET_XMM32 8 -#define UNIX64_RET_XMM64 9 -#define UNIX64_RET_X87 10 -#define UNIX64_RET_X87_2 11 -#define UNIX64_RET_ST_XMM0_RAX 12 -#define UNIX64_RET_ST_RAX_XMM0 13 -#define UNIX64_RET_ST_XMM0_XMM1 14 -#define UNIX64_RET_ST_RAX_RDX 15 - -#define UNIX64_RET_LAST 15 - -#define UNIX64_FLAG_RET_IN_MEM (1 << 10) -#define UNIX64_FLAG_XMM_ARGS (1 << 11) -#define UNIX64_SIZE_SHIFT 12 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/sysv.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/sysv.S deleted file mode 100644 index d8ab4b0..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/sysv.S +++ /dev/null @@ -1,1138 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.S - Copyright (c) 2017 Anthony Green - - Copyright (c) 2013 The Written Word, Inc. - - Copyright (c) 1996,1998,2001-2003,2005,2008,2010 Red Hat, Inc. - - X86 Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#ifdef __i386__ -#ifndef _MSC_VER - -#define LIBFFI_ASM -#include -#include -#include "internal.h" - -#define C2(X, Y) X ## Y -#define C1(X, Y) C2(X, Y) -#ifdef __USER_LABEL_PREFIX__ -# define C(X) C1(__USER_LABEL_PREFIX__, X) -#else -# define C(X) X -#endif - -#ifdef X86_DARWIN -# define L(X) C1(L, X) -#else -# define L(X) C1(.L, X) -#endif - -#ifdef __ELF__ -# define ENDF(X) .type X,@function; .size X, . - X -#else -# define ENDF(X) -#endif - -/* Handle win32 fastcall name mangling. */ -#ifdef X86_WIN32 -# define ffi_call_i386 "@ffi_call_i386@8" -# define ffi_closure_inner "@ffi_closure_inner@8" -#else -# define ffi_call_i386 C(ffi_call_i386) -# define ffi_closure_inner C(ffi_closure_inner) -#endif - -/* This macro allows the safe creation of jump tables without an - actual table. The entry points into the table are all 8 bytes. - The use of ORG asserts that we're at the correct location. */ -/* ??? The clang assembler doesn't handle .org with symbolic expressions. */ -#if defined(__clang__) || defined(__APPLE__) || (defined (__sun__) && defined(__svr4__)) -# define E(BASE, X) .balign 8 -#else -# define E(BASE, X) .balign 8; .org BASE + X * 8 -#endif - - .text - .balign 16 - .globl ffi_call_i386 - FFI_HIDDEN(ffi_call_i386) - -/* This is declared as - - void ffi_call_i386(struct call_frame *frame, char *argp) - __attribute__((fastcall)); - - Thus the arguments are present in - - ecx: frame - edx: argp -*/ - -ffi_call_i386: -L(UW0): - # cfi_startproc - _CET_ENDBR -#if !HAVE_FASTCALL - movl 4(%esp), %ecx - movl 8(%esp), %edx -#endif - movl (%esp), %eax /* move the return address */ - movl %ebp, (%ecx) /* store %ebp into local frame */ - movl %eax, 4(%ecx) /* store retaddr into local frame */ - - /* New stack frame based off ebp. This is a itty bit of unwind - trickery in that the CFA *has* changed. There is no easy way - to describe it correctly on entry to the function. Fortunately, - it doesn't matter too much since at all points we can correctly - unwind back to ffi_call. Note that the location to which we - moved the return address is (the new) CFA-4, so from the - perspective of the unwind info, it hasn't moved. */ - movl %ecx, %ebp -L(UW1): - # cfi_def_cfa(%ebp, 8) - # cfi_rel_offset(%ebp, 0) - - movl %edx, %esp /* set outgoing argument stack */ - movl 20+R_EAX*4(%ebp), %eax /* set register arguments */ - movl 20+R_EDX*4(%ebp), %edx - movl 20+R_ECX*4(%ebp), %ecx - - call *8(%ebp) - - movl 12(%ebp), %ecx /* load return type code */ - movl %ebx, 8(%ebp) /* preserve %ebx */ -L(UW2): - # cfi_rel_offset(%ebx, 8) - - andl $X86_RET_TYPE_MASK, %ecx -#ifdef __PIC__ - call C(__x86.get_pc_thunk.bx) -L(pc1): - leal L(store_table)-L(pc1)(%ebx, %ecx, 8), %ebx -#else - leal L(store_table)(,%ecx, 8), %ebx -#endif - movl 16(%ebp), %ecx /* load result address */ - _CET_NOTRACK jmp *%ebx - - .balign 8 -L(store_table): -E(L(store_table), X86_RET_FLOAT) - fstps (%ecx) - jmp L(e1) -E(L(store_table), X86_RET_DOUBLE) - fstpl (%ecx) - jmp L(e1) -E(L(store_table), X86_RET_LDOUBLE) - fstpt (%ecx) - jmp L(e1) -E(L(store_table), X86_RET_SINT8) - movsbl %al, %eax - mov %eax, (%ecx) - jmp L(e1) -E(L(store_table), X86_RET_SINT16) - movswl %ax, %eax - mov %eax, (%ecx) - jmp L(e1) -E(L(store_table), X86_RET_UINT8) - movzbl %al, %eax - mov %eax, (%ecx) - jmp L(e1) -E(L(store_table), X86_RET_UINT16) - movzwl %ax, %eax - mov %eax, (%ecx) - jmp L(e1) -E(L(store_table), X86_RET_INT64) - movl %edx, 4(%ecx) - /* fallthru */ -E(L(store_table), X86_RET_INT32) - movl %eax, (%ecx) - /* fallthru */ -E(L(store_table), X86_RET_VOID) -L(e1): - movl 8(%ebp), %ebx - movl %ebp, %esp - popl %ebp -L(UW3): - # cfi_remember_state - # cfi_def_cfa(%esp, 4) - # cfi_restore(%ebx) - # cfi_restore(%ebp) - ret -L(UW4): - # cfi_restore_state - -E(L(store_table), X86_RET_STRUCTPOP) - jmp L(e1) -E(L(store_table), X86_RET_STRUCTARG) - jmp L(e1) -E(L(store_table), X86_RET_STRUCT_1B) - movb %al, (%ecx) - jmp L(e1) -E(L(store_table), X86_RET_STRUCT_2B) - movw %ax, (%ecx) - jmp L(e1) - - /* Fill out the table so that bad values are predictable. */ -E(L(store_table), X86_RET_UNUSED14) - ud2 -E(L(store_table), X86_RET_UNUSED15) - ud2 - -L(UW5): - # cfi_endproc -ENDF(ffi_call_i386) - -/* The inner helper is declared as - - void ffi_closure_inner(struct closure_frame *frame, char *argp) - __attribute_((fastcall)) - - Thus the arguments are placed in - - ecx: frame - edx: argp -*/ - -/* Macros to help setting up the closure_data structure. */ - -#if HAVE_FASTCALL -# define closure_FS (40 + 4) -# define closure_CF 0 -#else -# define closure_FS (8 + 40 + 12) -# define closure_CF 8 -#endif - -#define FFI_CLOSURE_SAVE_REGS \ - movl %eax, closure_CF+16+R_EAX*4(%esp); \ - movl %edx, closure_CF+16+R_EDX*4(%esp); \ - movl %ecx, closure_CF+16+R_ECX*4(%esp) - -#define FFI_CLOSURE_COPY_TRAMP_DATA \ - movl FFI_TRAMPOLINE_SIZE(%eax), %edx; /* copy cif */ \ - movl FFI_TRAMPOLINE_SIZE+4(%eax), %ecx; /* copy fun */ \ - movl FFI_TRAMPOLINE_SIZE+8(%eax), %eax; /* copy user_data */ \ - movl %edx, closure_CF+28(%esp); \ - movl %ecx, closure_CF+32(%esp); \ - movl %eax, closure_CF+36(%esp) - -#if HAVE_FASTCALL -# define FFI_CLOSURE_PREP_CALL \ - movl %esp, %ecx; /* load closure_data */ \ - leal closure_FS+4(%esp), %edx; /* load incoming stack */ -#else -# define FFI_CLOSURE_PREP_CALL \ - leal closure_CF(%esp), %ecx; /* load closure_data */ \ - leal closure_FS+4(%esp), %edx; /* load incoming stack */ \ - movl %ecx, (%esp); \ - movl %edx, 4(%esp) -#endif - -#define FFI_CLOSURE_CALL_INNER(UWN) \ - call ffi_closure_inner - -#define FFI_CLOSURE_MASK_AND_JUMP(N, UW) \ - andl $X86_RET_TYPE_MASK, %eax; \ - leal L(C1(load_table,N))(, %eax, 8), %edx; \ - movl closure_CF(%esp), %eax; /* optimiztic load */ \ - _CET_NOTRACK jmp *%edx - -#ifdef __PIC__ -# if defined X86_DARWIN || defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE -# undef FFI_CLOSURE_MASK_AND_JUMP -# define FFI_CLOSURE_MASK_AND_JUMP(N, UW) \ - andl $X86_RET_TYPE_MASK, %eax; \ - call C(__x86.get_pc_thunk.dx); \ -L(C1(pc,N)): \ - leal L(C1(load_table,N))-L(C1(pc,N))(%edx, %eax, 8), %edx; \ - movl closure_CF(%esp), %eax; /* optimiztic load */ \ - _CET_NOTRACK jmp *%edx -# else -# define FFI_CLOSURE_CALL_INNER_SAVE_EBX -# undef FFI_CLOSURE_CALL_INNER -# define FFI_CLOSURE_CALL_INNER(UWN) \ - movl %ebx, 40(%esp); /* save ebx */ \ -L(C1(UW,UWN)): \ - /* cfi_rel_offset(%ebx, 40); */ \ - call C(__x86.get_pc_thunk.bx); /* load got register */ \ - addl $C(_GLOBAL_OFFSET_TABLE_), %ebx; \ - call ffi_closure_inner@PLT -# undef FFI_CLOSURE_MASK_AND_JUMP -# define FFI_CLOSURE_MASK_AND_JUMP(N, UWN) \ - andl $X86_RET_TYPE_MASK, %eax; \ - leal L(C1(load_table,N))@GOTOFF(%ebx, %eax, 8), %edx; \ - movl 40(%esp), %ebx; /* restore ebx */ \ -L(C1(UW,UWN)): \ - /* cfi_restore(%ebx); */ \ - movl closure_CF(%esp), %eax; /* optimiztic load */ \ - _CET_NOTRACK jmp *%edx -# endif /* DARWIN || HIDDEN */ -#endif /* __PIC__ */ - - .balign 16 - .globl C(ffi_go_closure_EAX) - FFI_HIDDEN(C(ffi_go_closure_EAX)) -C(ffi_go_closure_EAX): -L(UW6): - # cfi_startproc - _CET_ENDBR - subl $closure_FS, %esp -L(UW7): - # cfi_def_cfa_offset(closure_FS + 4) - FFI_CLOSURE_SAVE_REGS - movl 4(%eax), %edx /* copy cif */ - movl 8(%eax), %ecx /* copy fun */ - movl %edx, closure_CF+28(%esp) - movl %ecx, closure_CF+32(%esp) - movl %eax, closure_CF+36(%esp) /* closure is user_data */ - jmp L(do_closure_i386) -L(UW8): - # cfi_endproc -ENDF(C(ffi_go_closure_EAX)) - - .balign 16 - .globl C(ffi_go_closure_ECX) - FFI_HIDDEN(C(ffi_go_closure_ECX)) -C(ffi_go_closure_ECX): -L(UW9): - # cfi_startproc - _CET_ENDBR - subl $closure_FS, %esp -L(UW10): - # cfi_def_cfa_offset(closure_FS + 4) - FFI_CLOSURE_SAVE_REGS - movl 4(%ecx), %edx /* copy cif */ - movl 8(%ecx), %eax /* copy fun */ - movl %edx, closure_CF+28(%esp) - movl %eax, closure_CF+32(%esp) - movl %ecx, closure_CF+36(%esp) /* closure is user_data */ - jmp L(do_closure_i386) -L(UW11): - # cfi_endproc -ENDF(C(ffi_go_closure_ECX)) - -/* The closure entry points are reached from the ffi_closure trampoline. - On entry, %eax contains the address of the ffi_closure. */ - - .balign 16 - .globl C(ffi_closure_i386) - FFI_HIDDEN(C(ffi_closure_i386)) - -C(ffi_closure_i386): -L(UW12): - # cfi_startproc - _CET_ENDBR - subl $closure_FS, %esp -L(UW13): - # cfi_def_cfa_offset(closure_FS + 4) - - FFI_CLOSURE_SAVE_REGS - FFI_CLOSURE_COPY_TRAMP_DATA - - /* Entry point from preceeding Go closures. */ -L(do_closure_i386): - - FFI_CLOSURE_PREP_CALL - FFI_CLOSURE_CALL_INNER(14) - FFI_CLOSURE_MASK_AND_JUMP(2, 15) - - .balign 8 -L(load_table2): -E(L(load_table2), X86_RET_FLOAT) - flds closure_CF(%esp) - jmp L(e2) -E(L(load_table2), X86_RET_DOUBLE) - fldl closure_CF(%esp) - jmp L(e2) -E(L(load_table2), X86_RET_LDOUBLE) - fldt closure_CF(%esp) - jmp L(e2) -E(L(load_table2), X86_RET_SINT8) - movsbl %al, %eax - jmp L(e2) -E(L(load_table2), X86_RET_SINT16) - movswl %ax, %eax - jmp L(e2) -E(L(load_table2), X86_RET_UINT8) - movzbl %al, %eax - jmp L(e2) -E(L(load_table2), X86_RET_UINT16) - movzwl %ax, %eax - jmp L(e2) -E(L(load_table2), X86_RET_INT64) - movl closure_CF+4(%esp), %edx - jmp L(e2) -E(L(load_table2), X86_RET_INT32) - nop - /* fallthru */ -E(L(load_table2), X86_RET_VOID) -L(e2): - addl $closure_FS, %esp -L(UW16): - # cfi_adjust_cfa_offset(-closure_FS) - ret -L(UW17): - # cfi_adjust_cfa_offset(closure_FS) -E(L(load_table2), X86_RET_STRUCTPOP) - addl $closure_FS, %esp -L(UW18): - # cfi_adjust_cfa_offset(-closure_FS) - ret $4 -L(UW19): - # cfi_adjust_cfa_offset(closure_FS) -E(L(load_table2), X86_RET_STRUCTARG) - jmp L(e2) -E(L(load_table2), X86_RET_STRUCT_1B) - movzbl %al, %eax - jmp L(e2) -E(L(load_table2), X86_RET_STRUCT_2B) - movzwl %ax, %eax - jmp L(e2) - - /* Fill out the table so that bad values are predictable. */ -E(L(load_table2), X86_RET_UNUSED14) - ud2 -E(L(load_table2), X86_RET_UNUSED15) - ud2 - -L(UW20): - # cfi_endproc -ENDF(C(ffi_closure_i386)) - - .balign 16 - .globl C(ffi_go_closure_STDCALL) - FFI_HIDDEN(C(ffi_go_closure_STDCALL)) -C(ffi_go_closure_STDCALL): -L(UW21): - # cfi_startproc - _CET_ENDBR - subl $closure_FS, %esp -L(UW22): - # cfi_def_cfa_offset(closure_FS + 4) - FFI_CLOSURE_SAVE_REGS - movl 4(%ecx), %edx /* copy cif */ - movl 8(%ecx), %eax /* copy fun */ - movl %edx, closure_CF+28(%esp) - movl %eax, closure_CF+32(%esp) - movl %ecx, closure_CF+36(%esp) /* closure is user_data */ - jmp L(do_closure_STDCALL) -L(UW23): - # cfi_endproc -ENDF(C(ffi_go_closure_STDCALL)) - -/* For REGISTER, we have no available parameter registers, and so we - enter here having pushed the closure onto the stack. */ - - .balign 16 - .globl C(ffi_closure_REGISTER) - FFI_HIDDEN(C(ffi_closure_REGISTER)) -C(ffi_closure_REGISTER): -L(UW24): - # cfi_startproc - # cfi_def_cfa(%esp, 8) - # cfi_offset(%eip, -8) - _CET_ENDBR - subl $closure_FS-4, %esp -L(UW25): - # cfi_def_cfa_offset(closure_FS + 4) - FFI_CLOSURE_SAVE_REGS - movl closure_FS-4(%esp), %ecx /* load retaddr */ - movl closure_FS(%esp), %eax /* load closure */ - movl %ecx, closure_FS(%esp) /* move retaddr */ - jmp L(do_closure_REGISTER) -L(UW26): - # cfi_endproc -ENDF(C(ffi_closure_REGISTER)) - -/* For STDCALL (and others), we need to pop N bytes of arguments off - the stack following the closure. The amount needing to be popped - is returned to us from ffi_closure_inner. */ - - .balign 16 - .globl C(ffi_closure_STDCALL) - FFI_HIDDEN(C(ffi_closure_STDCALL)) -C(ffi_closure_STDCALL): -L(UW27): - # cfi_startproc - _CET_ENDBR - subl $closure_FS, %esp -L(UW28): - # cfi_def_cfa_offset(closure_FS + 4) - - FFI_CLOSURE_SAVE_REGS - - /* Entry point from ffi_closure_REGISTER. */ -L(do_closure_REGISTER): - - FFI_CLOSURE_COPY_TRAMP_DATA - - /* Entry point from preceeding Go closure. */ -L(do_closure_STDCALL): - - FFI_CLOSURE_PREP_CALL - FFI_CLOSURE_CALL_INNER(29) - - movl %eax, %ecx - shrl $X86_RET_POP_SHIFT, %ecx /* isolate pop count */ - leal closure_FS(%esp, %ecx), %ecx /* compute popped esp */ - movl closure_FS(%esp), %edx /* move return address */ - movl %edx, (%ecx) - - /* From this point on, the value of %esp upon return is %ecx+4, - and we've copied the return address to %ecx to make return easy. - There's no point in representing this in the unwind info, as - there is always a window between the mov and the ret which - will be wrong from one point of view or another. */ - - FFI_CLOSURE_MASK_AND_JUMP(3, 30) - - .balign 8 -L(load_table3): -E(L(load_table3), X86_RET_FLOAT) - flds closure_CF(%esp) - movl %ecx, %esp - ret -E(L(load_table3), X86_RET_DOUBLE) - fldl closure_CF(%esp) - movl %ecx, %esp - ret -E(L(load_table3), X86_RET_LDOUBLE) - fldt closure_CF(%esp) - movl %ecx, %esp - ret -E(L(load_table3), X86_RET_SINT8) - movsbl %al, %eax - movl %ecx, %esp - ret -E(L(load_table3), X86_RET_SINT16) - movswl %ax, %eax - movl %ecx, %esp - ret -E(L(load_table3), X86_RET_UINT8) - movzbl %al, %eax - movl %ecx, %esp - ret -E(L(load_table3), X86_RET_UINT16) - movzwl %ax, %eax - movl %ecx, %esp - ret -E(L(load_table3), X86_RET_INT64) - movl closure_CF+4(%esp), %edx - movl %ecx, %esp - ret -E(L(load_table3), X86_RET_INT32) - movl %ecx, %esp - ret -E(L(load_table3), X86_RET_VOID) - movl %ecx, %esp - ret -E(L(load_table3), X86_RET_STRUCTPOP) - movl %ecx, %esp - ret -E(L(load_table3), X86_RET_STRUCTARG) - movl %ecx, %esp - ret -E(L(load_table3), X86_RET_STRUCT_1B) - movzbl %al, %eax - movl %ecx, %esp - ret -E(L(load_table3), X86_RET_STRUCT_2B) - movzwl %ax, %eax - movl %ecx, %esp - ret - - /* Fill out the table so that bad values are predictable. */ -E(L(load_table3), X86_RET_UNUSED14) - ud2 -E(L(load_table3), X86_RET_UNUSED15) - ud2 - -L(UW31): - # cfi_endproc -ENDF(C(ffi_closure_STDCALL)) - -#if !FFI_NO_RAW_API - -#define raw_closure_S_FS (16+16+12) - - .balign 16 - .globl C(ffi_closure_raw_SYSV) - FFI_HIDDEN(C(ffi_closure_raw_SYSV)) -C(ffi_closure_raw_SYSV): -L(UW32): - # cfi_startproc - _CET_ENDBR - subl $raw_closure_S_FS, %esp -L(UW33): - # cfi_def_cfa_offset(raw_closure_S_FS + 4) - movl %ebx, raw_closure_S_FS-4(%esp) -L(UW34): - # cfi_rel_offset(%ebx, raw_closure_S_FS-4) - - movl FFI_TRAMPOLINE_SIZE+8(%eax), %edx /* load cl->user_data */ - movl %edx, 12(%esp) - leal raw_closure_S_FS+4(%esp), %edx /* load raw_args */ - movl %edx, 8(%esp) - leal 16(%esp), %edx /* load &res */ - movl %edx, 4(%esp) - movl FFI_TRAMPOLINE_SIZE(%eax), %ebx /* load cl->cif */ - movl %ebx, (%esp) - call *FFI_TRAMPOLINE_SIZE+4(%eax) /* call cl->fun */ - - movl 20(%ebx), %eax /* load cif->flags */ - andl $X86_RET_TYPE_MASK, %eax -#ifdef __PIC__ - call C(__x86.get_pc_thunk.bx) -L(pc4): - leal L(load_table4)-L(pc4)(%ebx, %eax, 8), %ecx -#else - leal L(load_table4)(,%eax, 8), %ecx -#endif - movl raw_closure_S_FS-4(%esp), %ebx -L(UW35): - # cfi_restore(%ebx) - movl 16(%esp), %eax /* Optimistic load */ - jmp *%ecx - - .balign 8 -L(load_table4): -E(L(load_table4), X86_RET_FLOAT) - flds 16(%esp) - jmp L(e4) -E(L(load_table4), X86_RET_DOUBLE) - fldl 16(%esp) - jmp L(e4) -E(L(load_table4), X86_RET_LDOUBLE) - fldt 16(%esp) - jmp L(e4) -E(L(load_table4), X86_RET_SINT8) - movsbl %al, %eax - jmp L(e4) -E(L(load_table4), X86_RET_SINT16) - movswl %ax, %eax - jmp L(e4) -E(L(load_table4), X86_RET_UINT8) - movzbl %al, %eax - jmp L(e4) -E(L(load_table4), X86_RET_UINT16) - movzwl %ax, %eax - jmp L(e4) -E(L(load_table4), X86_RET_INT64) - movl 16+4(%esp), %edx - jmp L(e4) -E(L(load_table4), X86_RET_INT32) - nop - /* fallthru */ -E(L(load_table4), X86_RET_VOID) -L(e4): - addl $raw_closure_S_FS, %esp -L(UW36): - # cfi_adjust_cfa_offset(-raw_closure_S_FS) - ret -L(UW37): - # cfi_adjust_cfa_offset(raw_closure_S_FS) -E(L(load_table4), X86_RET_STRUCTPOP) - addl $raw_closure_S_FS, %esp -L(UW38): - # cfi_adjust_cfa_offset(-raw_closure_S_FS) - ret $4 -L(UW39): - # cfi_adjust_cfa_offset(raw_closure_S_FS) -E(L(load_table4), X86_RET_STRUCTARG) - jmp L(e4) -E(L(load_table4), X86_RET_STRUCT_1B) - movzbl %al, %eax - jmp L(e4) -E(L(load_table4), X86_RET_STRUCT_2B) - movzwl %ax, %eax - jmp L(e4) - - /* Fill out the table so that bad values are predictable. */ -E(L(load_table4), X86_RET_UNUSED14) - ud2 -E(L(load_table4), X86_RET_UNUSED15) - ud2 - -L(UW40): - # cfi_endproc -ENDF(C(ffi_closure_raw_SYSV)) - -#define raw_closure_T_FS (16+16+8) - - .balign 16 - .globl C(ffi_closure_raw_THISCALL) - FFI_HIDDEN(C(ffi_closure_raw_THISCALL)) -C(ffi_closure_raw_THISCALL): -L(UW41): - # cfi_startproc - _CET_ENDBR - /* Rearrange the stack such that %ecx is the first argument. - This means moving the return address. */ - popl %edx -L(UW42): - # cfi_def_cfa_offset(0) - # cfi_register(%eip, %edx) - pushl %ecx -L(UW43): - # cfi_adjust_cfa_offset(4) - pushl %edx -L(UW44): - # cfi_adjust_cfa_offset(4) - # cfi_rel_offset(%eip, 0) - subl $raw_closure_T_FS, %esp -L(UW45): - # cfi_adjust_cfa_offset(raw_closure_T_FS) - movl %ebx, raw_closure_T_FS-4(%esp) -L(UW46): - # cfi_rel_offset(%ebx, raw_closure_T_FS-4) - - movl FFI_TRAMPOLINE_SIZE+8(%eax), %edx /* load cl->user_data */ - movl %edx, 12(%esp) - leal raw_closure_T_FS+4(%esp), %edx /* load raw_args */ - movl %edx, 8(%esp) - leal 16(%esp), %edx /* load &res */ - movl %edx, 4(%esp) - movl FFI_TRAMPOLINE_SIZE(%eax), %ebx /* load cl->cif */ - movl %ebx, (%esp) - call *FFI_TRAMPOLINE_SIZE+4(%eax) /* call cl->fun */ - - movl 20(%ebx), %eax /* load cif->flags */ - andl $X86_RET_TYPE_MASK, %eax -#ifdef __PIC__ - call C(__x86.get_pc_thunk.bx) -L(pc5): - leal L(load_table5)-L(pc5)(%ebx, %eax, 8), %ecx -#else - leal L(load_table5)(,%eax, 8), %ecx -#endif - movl raw_closure_T_FS-4(%esp), %ebx -L(UW47): - # cfi_restore(%ebx) - movl 16(%esp), %eax /* Optimistic load */ - jmp *%ecx - - .balign 8 -L(load_table5): -E(L(load_table5), X86_RET_FLOAT) - flds 16(%esp) - jmp L(e5) -E(L(load_table5), X86_RET_DOUBLE) - fldl 16(%esp) - jmp L(e5) -E(L(load_table5), X86_RET_LDOUBLE) - fldt 16(%esp) - jmp L(e5) -E(L(load_table5), X86_RET_SINT8) - movsbl %al, %eax - jmp L(e5) -E(L(load_table5), X86_RET_SINT16) - movswl %ax, %eax - jmp L(e5) -E(L(load_table5), X86_RET_UINT8) - movzbl %al, %eax - jmp L(e5) -E(L(load_table5), X86_RET_UINT16) - movzwl %ax, %eax - jmp L(e5) -E(L(load_table5), X86_RET_INT64) - movl 16+4(%esp), %edx - jmp L(e5) -E(L(load_table5), X86_RET_INT32) - nop - /* fallthru */ -E(L(load_table5), X86_RET_VOID) -L(e5): - addl $raw_closure_T_FS, %esp -L(UW48): - # cfi_adjust_cfa_offset(-raw_closure_T_FS) - /* Remove the extra %ecx argument we pushed. */ - ret $4 -L(UW49): - # cfi_adjust_cfa_offset(raw_closure_T_FS) -E(L(load_table5), X86_RET_STRUCTPOP) - addl $raw_closure_T_FS, %esp -L(UW50): - # cfi_adjust_cfa_offset(-raw_closure_T_FS) - ret $8 -L(UW51): - # cfi_adjust_cfa_offset(raw_closure_T_FS) -E(L(load_table5), X86_RET_STRUCTARG) - jmp L(e5) -E(L(load_table5), X86_RET_STRUCT_1B) - movzbl %al, %eax - jmp L(e5) -E(L(load_table5), X86_RET_STRUCT_2B) - movzwl %ax, %eax - jmp L(e5) - - /* Fill out the table so that bad values are predictable. */ -E(L(load_table5), X86_RET_UNUSED14) - ud2 -E(L(load_table5), X86_RET_UNUSED15) - ud2 - -L(UW52): - # cfi_endproc -ENDF(C(ffi_closure_raw_THISCALL)) - -#endif /* !FFI_NO_RAW_API */ - -#ifdef X86_DARWIN -# define COMDAT(X) \ - .section __TEXT,__text,coalesced,pure_instructions; \ - .weak_definition X; \ - FFI_HIDDEN(X) -#elif defined __ELF__ && !(defined(__sun__) && defined(__svr4__)) -# define COMDAT(X) \ - .section .text.X,"axG",@progbits,X,comdat; \ - .globl X; \ - FFI_HIDDEN(X) -#else -# define COMDAT(X) -#endif - -#if defined(__PIC__) - COMDAT(C(__x86.get_pc_thunk.bx)) -C(__x86.get_pc_thunk.bx): - movl (%esp), %ebx - ret -ENDF(C(__x86.get_pc_thunk.bx)) -# if defined X86_DARWIN || defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE - COMDAT(C(__x86.get_pc_thunk.dx)) -C(__x86.get_pc_thunk.dx): - movl (%esp), %edx - ret -ENDF(C(__x86.get_pc_thunk.dx)) -#endif /* DARWIN || HIDDEN */ -#endif /* __PIC__ */ - -/* Sadly, OSX cctools-as doesn't understand .cfi directives at all. */ - -#ifdef __APPLE__ -.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support -EHFrame0: -#elif defined(X86_WIN32) -.section .eh_frame,"r" -#elif defined(HAVE_AS_X86_64_UNWIND_SECTION_TYPE) -.section .eh_frame,EH_FRAME_FLAGS,@unwind -#else -.section .eh_frame,EH_FRAME_FLAGS,@progbits -#endif - -#ifdef HAVE_AS_X86_PCREL -# define PCREL(X) X - . -#else -# define PCREL(X) X@rel -#endif - -/* Simplify advancing between labels. Assume DW_CFA_advance_loc1 fits. */ -#define ADV(N, P) .byte 2, L(N)-L(P) - - .balign 4 -L(CIE): - .set L(set0),L(ECIE)-L(SCIE) - .long L(set0) /* CIE Length */ -L(SCIE): - .long 0 /* CIE Identifier Tag */ - .byte 1 /* CIE Version */ - .ascii "zR\0" /* CIE Augmentation */ - .byte 1 /* CIE Code Alignment Factor */ - .byte 0x7c /* CIE Data Alignment Factor */ - .byte 0x8 /* CIE RA Column */ - .byte 1 /* Augmentation size */ - .byte 0x1b /* FDE Encoding (pcrel sdata4) */ - .byte 0xc, 4, 4 /* DW_CFA_def_cfa, %esp offset 4 */ - .byte 0x80+8, 1 /* DW_CFA_offset, %eip offset 1*-4 */ - .balign 4 -L(ECIE): - - .set L(set1),L(EFDE1)-L(SFDE1) - .long L(set1) /* FDE Length */ -L(SFDE1): - .long L(SFDE1)-L(CIE) /* FDE CIE offset */ - .long PCREL(L(UW0)) /* Initial location */ - .long L(UW5)-L(UW0) /* Address range */ - .byte 0 /* Augmentation size */ - ADV(UW1, UW0) - .byte 0xc, 5, 8 /* DW_CFA_def_cfa, %ebp 8 */ - .byte 0x80+5, 2 /* DW_CFA_offset, %ebp 2*-4 */ - ADV(UW2, UW1) - .byte 0x80+3, 0 /* DW_CFA_offset, %ebx 0*-4 */ - ADV(UW3, UW2) - .byte 0xa /* DW_CFA_remember_state */ - .byte 0xc, 4, 4 /* DW_CFA_def_cfa, %esp 4 */ - .byte 0xc0+3 /* DW_CFA_restore, %ebx */ - .byte 0xc0+5 /* DW_CFA_restore, %ebp */ - ADV(UW4, UW3) - .byte 0xb /* DW_CFA_restore_state */ - .balign 4 -L(EFDE1): - - .set L(set2),L(EFDE2)-L(SFDE2) - .long L(set2) /* FDE Length */ -L(SFDE2): - .long L(SFDE2)-L(CIE) /* FDE CIE offset */ - .long PCREL(L(UW6)) /* Initial location */ - .long L(UW8)-L(UW6) /* Address range */ - .byte 0 /* Augmentation size */ - ADV(UW7, UW6) - .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ - .balign 4 -L(EFDE2): - - .set L(set3),L(EFDE3)-L(SFDE3) - .long L(set3) /* FDE Length */ -L(SFDE3): - .long L(SFDE3)-L(CIE) /* FDE CIE offset */ - .long PCREL(L(UW9)) /* Initial location */ - .long L(UW11)-L(UW9) /* Address range */ - .byte 0 /* Augmentation size */ - ADV(UW10, UW9) - .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ - .balign 4 -L(EFDE3): - - .set L(set4),L(EFDE4)-L(SFDE4) - .long L(set4) /* FDE Length */ -L(SFDE4): - .long L(SFDE4)-L(CIE) /* FDE CIE offset */ - .long PCREL(L(UW12)) /* Initial location */ - .long L(UW20)-L(UW12) /* Address range */ - .byte 0 /* Augmentation size */ - ADV(UW13, UW12) - .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ -#ifdef FFI_CLOSURE_CALL_INNER_SAVE_EBX - ADV(UW14, UW13) - .byte 0x80+3, (40-(closure_FS+4))/-4 /* DW_CFA_offset %ebx */ - ADV(UW15, UW14) - .byte 0xc0+3 /* DW_CFA_restore %ebx */ - ADV(UW16, UW15) -#else - ADV(UW16, UW13) -#endif - .byte 0xe, 4 /* DW_CFA_def_cfa_offset */ - ADV(UW17, UW16) - .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ - ADV(UW18, UW17) - .byte 0xe, 4 /* DW_CFA_def_cfa_offset */ - ADV(UW19, UW18) - .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ - .balign 4 -L(EFDE4): - - .set L(set5),L(EFDE5)-L(SFDE5) - .long L(set5) /* FDE Length */ -L(SFDE5): - .long L(SFDE5)-L(CIE) /* FDE CIE offset */ - .long PCREL(L(UW21)) /* Initial location */ - .long L(UW23)-L(UW21) /* Address range */ - .byte 0 /* Augmentation size */ - ADV(UW22, UW21) - .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ - .balign 4 -L(EFDE5): - - .set L(set6),L(EFDE6)-L(SFDE6) - .long L(set6) /* FDE Length */ -L(SFDE6): - .long L(SFDE6)-L(CIE) /* FDE CIE offset */ - .long PCREL(L(UW24)) /* Initial location */ - .long L(UW26)-L(UW24) /* Address range */ - .byte 0 /* Augmentation size */ - .byte 0xe, 8 /* DW_CFA_def_cfa_offset */ - .byte 0x80+8, 2 /* DW_CFA_offset %eip, 2*-4 */ - ADV(UW25, UW24) - .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ - .balign 4 -L(EFDE6): - - .set L(set7),L(EFDE7)-L(SFDE7) - .long L(set7) /* FDE Length */ -L(SFDE7): - .long L(SFDE7)-L(CIE) /* FDE CIE offset */ - .long PCREL(L(UW27)) /* Initial location */ - .long L(UW31)-L(UW27) /* Address range */ - .byte 0 /* Augmentation size */ - ADV(UW28, UW27) - .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ -#ifdef FFI_CLOSURE_CALL_INNER_SAVE_EBX - ADV(UW29, UW28) - .byte 0x80+3, (40-(closure_FS+4))/-4 /* DW_CFA_offset %ebx */ - ADV(UW30, UW29) - .byte 0xc0+3 /* DW_CFA_restore %ebx */ -#endif - .balign 4 -L(EFDE7): - -#if !FFI_NO_RAW_API - .set L(set8),L(EFDE8)-L(SFDE8) - .long L(set8) /* FDE Length */ -L(SFDE8): - .long L(SFDE8)-L(CIE) /* FDE CIE offset */ - .long PCREL(L(UW32)) /* Initial location */ - .long L(UW40)-L(UW32) /* Address range */ - .byte 0 /* Augmentation size */ - ADV(UW33, UW32) - .byte 0xe, raw_closure_S_FS+4 /* DW_CFA_def_cfa_offset */ - ADV(UW34, UW33) - .byte 0x80+3, 2 /* DW_CFA_offset %ebx 2*-4 */ - ADV(UW35, UW34) - .byte 0xc0+3 /* DW_CFA_restore %ebx */ - ADV(UW36, UW35) - .byte 0xe, 4 /* DW_CFA_def_cfa_offset */ - ADV(UW37, UW36) - .byte 0xe, raw_closure_S_FS+4 /* DW_CFA_def_cfa_offset */ - ADV(UW38, UW37) - .byte 0xe, 4 /* DW_CFA_def_cfa_offset */ - ADV(UW39, UW38) - .byte 0xe, raw_closure_S_FS+4 /* DW_CFA_def_cfa_offset */ - .balign 4 -L(EFDE8): - - .set L(set9),L(EFDE9)-L(SFDE9) - .long L(set9) /* FDE Length */ -L(SFDE9): - .long L(SFDE9)-L(CIE) /* FDE CIE offset */ - .long PCREL(L(UW41)) /* Initial location */ - .long L(UW52)-L(UW41) /* Address range */ - .byte 0 /* Augmentation size */ - ADV(UW42, UW41) - .byte 0xe, 0 /* DW_CFA_def_cfa_offset */ - .byte 0x9, 8, 2 /* DW_CFA_register %eip, %edx */ - ADV(UW43, UW42) - .byte 0xe, 4 /* DW_CFA_def_cfa_offset */ - ADV(UW44, UW43) - .byte 0xe, 8 /* DW_CFA_def_cfa_offset */ - .byte 0x80+8, 2 /* DW_CFA_offset %eip 2*-4 */ - ADV(UW45, UW44) - .byte 0xe, raw_closure_T_FS+8 /* DW_CFA_def_cfa_offset */ - ADV(UW46, UW45) - .byte 0x80+3, 3 /* DW_CFA_offset %ebx 3*-4 */ - ADV(UW47, UW46) - .byte 0xc0+3 /* DW_CFA_restore %ebx */ - ADV(UW48, UW47) - .byte 0xe, 8 /* DW_CFA_def_cfa_offset */ - ADV(UW49, UW48) - .byte 0xe, raw_closure_T_FS+8 /* DW_CFA_def_cfa_offset */ - ADV(UW50, UW49) - .byte 0xe, 8 /* DW_CFA_def_cfa_offset */ - ADV(UW51, UW50) - .byte 0xe, raw_closure_T_FS+8 /* DW_CFA_def_cfa_offset */ - .balign 4 -L(EFDE9): -#endif /* !FFI_NO_RAW_API */ - -#ifdef _WIN32 - .def @feat.00; - .scl 3; - .type 0; - .endef - .globl @feat.00 -@feat.00 = 1 -#endif - -#ifdef __APPLE__ - .subsections_via_symbols - .section __LD,__compact_unwind,regular,debug - - /* compact unwind for ffi_call_i386 */ - .long C(ffi_call_i386) - .set L1,L(UW5)-L(UW0) - .long L1 - .long 0x04000000 /* use dwarf unwind info */ - .long 0 - .long 0 - - /* compact unwind for ffi_go_closure_EAX */ - .long C(ffi_go_closure_EAX) - .set L2,L(UW8)-L(UW6) - .long L2 - .long 0x04000000 /* use dwarf unwind info */ - .long 0 - .long 0 - - /* compact unwind for ffi_go_closure_ECX */ - .long C(ffi_go_closure_ECX) - .set L3,L(UW11)-L(UW9) - .long L3 - .long 0x04000000 /* use dwarf unwind info */ - .long 0 - .long 0 - - /* compact unwind for ffi_closure_i386 */ - .long C(ffi_closure_i386) - .set L4,L(UW20)-L(UW12) - .long L4 - .long 0x04000000 /* use dwarf unwind info */ - .long 0 - .long 0 - - /* compact unwind for ffi_go_closure_STDCALL */ - .long C(ffi_go_closure_STDCALL) - .set L5,L(UW23)-L(UW21) - .long L5 - .long 0x04000000 /* use dwarf unwind info */ - .long 0 - .long 0 - - /* compact unwind for ffi_closure_REGISTER */ - .long C(ffi_closure_REGISTER) - .set L6,L(UW26)-L(UW24) - .long L6 - .long 0x04000000 /* use dwarf unwind info */ - .long 0 - .long 0 - - /* compact unwind for ffi_closure_STDCALL */ - .long C(ffi_closure_STDCALL) - .set L7,L(UW31)-L(UW27) - .long L7 - .long 0x04000000 /* use dwarf unwind info */ - .long 0 - .long 0 - - /* compact unwind for ffi_closure_raw_SYSV */ - .long C(ffi_closure_raw_SYSV) - .set L8,L(UW40)-L(UW32) - .long L8 - .long 0x04000000 /* use dwarf unwind info */ - .long 0 - .long 0 - - /* compact unwind for ffi_closure_raw_THISCALL */ - .long C(ffi_closure_raw_THISCALL) - .set L9,L(UW52)-L(UW41) - .long L9 - .long 0x04000000 /* use dwarf unwind info */ - .long 0 - .long 0 -#endif /* __APPLE__ */ - -#endif /* ifndef _MSC_VER */ -#endif /* ifdef __i386__ */ - -#if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",@progbits -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/sysv_intel.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/sysv_intel.S deleted file mode 100644 index 3cafd71..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/sysv_intel.S +++ /dev/null @@ -1,995 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.S - Copyright (c) 2017 Anthony Green - - Copyright (c) 2013 The Written Word, Inc. - - Copyright (c) 1996,1998,2001-2003,2005,2008,2010 Red Hat, Inc. - - X86 Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#ifndef __x86_64__ -#ifdef _MSC_VER - -#define LIBFFI_ASM -#include -#include -#include -#include "internal.h" - -#define C2(X, Y) X ## Y -#define C1(X, Y) C2(X, Y) -#define L(X) C1(L, X) -# define ENDF(X) X ENDP - -/* This macro allows the safe creation of jump tables without an - actual table. The entry points into the table are all 8 bytes. - The use of ORG asserts that we're at the correct location. */ -/* ??? The clang assembler doesn't handle .org with symbolic expressions. */ -#if defined(__clang__) || defined(__APPLE__) || (defined (__sun__) && defined(__svr4__)) -# define E(BASE, X) ALIGN 8 -#else -# define E(BASE, X) ALIGN 8; ORG BASE + X * 8 -#endif - - .686P - .MODEL FLAT - -EXTRN @ffi_closure_inner@8:PROC -_TEXT SEGMENT - -/* This is declared as - - void ffi_call_i386(struct call_frame *frame, char *argp) - __attribute__((fastcall)); - - Thus the arguments are present in - - ecx: frame - edx: argp -*/ - -ALIGN 16 -PUBLIC @ffi_call_i386@8 -@ffi_call_i386@8 PROC -L(UW0): - cfi_startproc - #if !HAVE_FASTCALL - mov ecx, [esp+4] - mov edx, [esp+8] - #endif - mov eax, [esp] /* move the return address */ - mov [ecx], ebp /* store ebp into local frame */ - mov [ecx+4], eax /* store retaddr into local frame */ - - /* New stack frame based off ebp. This is a itty bit of unwind - trickery in that the CFA *has* changed. There is no easy way - to describe it correctly on entry to the function. Fortunately, - it doesn't matter too much since at all points we can correctly - unwind back to ffi_call. Note that the location to which we - moved the return address is (the new) CFA-4, so from the - perspective of the unwind info, it hasn't moved. */ - mov ebp, ecx -L(UW1): - // cfi_def_cfa(%ebp, 8) - // cfi_rel_offset(%ebp, 0) - - mov esp, edx /* set outgoing argument stack */ - mov eax, [20+R_EAX*4+ebp] /* set register arguments */ - mov edx, [20+R_EDX*4+ebp] - mov ecx, [20+R_ECX*4+ebp] - - call dword ptr [ebp+8] - - mov ecx, [12+ebp] /* load return type code */ - mov [ebp+8], ebx /* preserve %ebx */ -L(UW2): - // cfi_rel_offset(%ebx, 8) - - and ecx, X86_RET_TYPE_MASK - lea ebx, [L(store_table) + ecx * 8] - mov ecx, [ebp+16] /* load result address */ - jmp ebx - - ALIGN 8 -L(store_table): -E(L(store_table), X86_RET_FLOAT) - fstp DWORD PTR [ecx] - jmp L(e1) -E(L(store_table), X86_RET_DOUBLE) - fstp QWORD PTR [ecx] - jmp L(e1) -E(L(store_table), X86_RET_LDOUBLE) - fstp QWORD PTR [ecx] - jmp L(e1) -E(L(store_table), X86_RET_SINT8) - movsx eax, al - mov [ecx], eax - jmp L(e1) -E(L(store_table), X86_RET_SINT16) - movsx eax, ax - mov [ecx], eax - jmp L(e1) -E(L(store_table), X86_RET_UINT8) - movzx eax, al - mov [ecx], eax - jmp L(e1) -E(L(store_table), X86_RET_UINT16) - movzx eax, ax - mov [ecx], eax - jmp L(e1) -E(L(store_table), X86_RET_INT64) - mov [ecx+4], edx - /* fallthru */ -E(L(store_table), X86_RET_int 32) - mov [ecx], eax - /* fallthru */ -E(L(store_table), X86_RET_VOID) -L(e1): - mov ebx, [ebp+8] - mov esp, ebp - pop ebp -L(UW3): - // cfi_remember_state - // cfi_def_cfa(%esp, 4) - // cfi_restore(%ebx) - // cfi_restore(%ebp) - ret -L(UW4): - // cfi_restore_state - -E(L(store_table), X86_RET_STRUCTPOP) - jmp L(e1) -E(L(store_table), X86_RET_STRUCTARG) - jmp L(e1) -E(L(store_table), X86_RET_STRUCT_1B) - mov [ecx], al - jmp L(e1) -E(L(store_table), X86_RET_STRUCT_2B) - mov [ecx], ax - jmp L(e1) - - /* Fill out the table so that bad values are predictable. */ -E(L(store_table), X86_RET_UNUSED14) - int 3 -E(L(store_table), X86_RET_UNUSED15) - int 3 - -L(UW5): - // cfi_endproc -ENDF(@ffi_call_i386@8) - -/* The inner helper is declared as - - void ffi_closure_inner(struct closure_frame *frame, char *argp) - __attribute_((fastcall)) - - Thus the arguments are placed in - - ecx: frame - edx: argp -*/ - -/* Macros to help setting up the closure_data structure. */ - -#if HAVE_FASTCALL -# define closure_FS (40 + 4) -# define closure_CF 0 -#else -# define closure_FS (8 + 40 + 12) -# define closure_CF 8 -#endif - -FFI_CLOSURE_SAVE_REGS MACRO - mov [esp + closure_CF+16+R_EAX*4], eax - mov [esp + closure_CF+16+R_EDX*4], edx - mov [esp + closure_CF+16+R_ECX*4], ecx -ENDM - -FFI_CLOSURE_COPY_TRAMP_DATA MACRO - mov edx, [eax+FFI_TRAMPOLINE_SIZE] /* copy cif */ - mov ecx, [eax+FFI_TRAMPOLINE_SIZE+4] /* copy fun */ - mov eax, [eax+FFI_TRAMPOLINE_SIZE+8]; /* copy user_data */ - mov [esp+closure_CF+28], edx - mov [esp+closure_CF+32], ecx - mov [esp+closure_CF+36], eax -ENDM - -#if HAVE_FASTCALL -FFI_CLOSURE_PREP_CALL MACRO - mov ecx, esp /* load closure_data */ - lea edx, [esp+closure_FS+4] /* load incoming stack */ -ENDM -#else -FFI_CLOSURE_PREP_CALL MACRO - lea ecx, [esp+closure_CF] /* load closure_data */ - lea edx, [esp+closure_FS+4] /* load incoming stack */ - mov [esp], ecx - mov [esp+4], edx -ENDM -#endif - -FFI_CLOSURE_CALL_INNER MACRO UWN - call @ffi_closure_inner@8 -ENDM - -FFI_CLOSURE_MASK_AND_JUMP MACRO LABEL - and eax, X86_RET_TYPE_MASK - lea edx, [LABEL+eax*8] - mov eax, [esp+closure_CF] /* optimiztic load */ - jmp edx -ENDM - -ALIGN 16 -PUBLIC ffi_go_closure_EAX -ffi_go_closure_EAX PROC C -L(UW6): - // cfi_startproc - sub esp, closure_FS -L(UW7): - // cfi_def_cfa_offset(closure_FS + 4) - FFI_CLOSURE_SAVE_REGS - mov edx, [eax+4] /* copy cif */ - mov ecx, [eax +8] /* copy fun */ - mov [esp+closure_CF+28], edx - mov [esp+closure_CF+32], ecx - mov [esp+closure_CF+36], eax /* closure is user_data */ - jmp L(do_closure_i386) -L(UW8): - // cfi_endproc -ENDF(ffi_go_closure_EAX) - -ALIGN 16 -PUBLIC ffi_go_closure_ECX -ffi_go_closure_ECX PROC C -L(UW9): - // cfi_startproc - sub esp, closure_FS -L(UW10): - // cfi_def_cfa_offset(closure_FS + 4) - FFI_CLOSURE_SAVE_REGS - mov edx, [ecx+4] /* copy cif */ - mov eax, [ecx+8] /* copy fun */ - mov [esp+closure_CF+28], edx - mov [esp+closure_CF+32], eax - mov [esp+closure_CF+36], ecx /* closure is user_data */ - jmp L(do_closure_i386) -L(UW11): - // cfi_endproc -ENDF(ffi_go_closure_ECX) - -/* The closure entry points are reached from the ffi_closure trampoline. - On entry, %eax contains the address of the ffi_closure. */ - -ALIGN 16 -PUBLIC ffi_closure_i386 -ffi_closure_i386 PROC C -L(UW12): - // cfi_startproc - sub esp, closure_FS -L(UW13): - // cfi_def_cfa_offset(closure_FS + 4) - - FFI_CLOSURE_SAVE_REGS - FFI_CLOSURE_COPY_TRAMP_DATA - - /* Entry point from preceeding Go closures. */ -L(do_closure_i386):: - - FFI_CLOSURE_PREP_CALL - FFI_CLOSURE_CALL_INNER(14) - FFI_CLOSURE_MASK_AND_JUMP L(C1(load_table,2)) - - ALIGN 8 -L(load_table2): -E(L(load_table2), X86_RET_FLOAT) - fld dword ptr [esp+closure_CF] - jmp L(e2) -E(L(load_table2), X86_RET_DOUBLE) - fld qword ptr [esp+closure_CF] - jmp L(e2) -E(L(load_table2), X86_RET_LDOUBLE) - fld qword ptr [esp+closure_CF] - jmp L(e2) -E(L(load_table2), X86_RET_SINT8) - movsx eax, al - jmp L(e2) -E(L(load_table2), X86_RET_SINT16) - movsx eax, ax - jmp L(e2) -E(L(load_table2), X86_RET_UINT8) - movzx eax, al - jmp L(e2) -E(L(load_table2), X86_RET_UINT16) - movzx eax, ax - jmp L(e2) -E(L(load_table2), X86_RET_INT64) - mov edx, [esp+closure_CF+4] - jmp L(e2) -E(L(load_table2), X86_RET_INT32) - nop - /* fallthru */ -E(L(load_table2), X86_RET_VOID) -L(e2): - add esp, closure_FS -L(UW16): - // cfi_adjust_cfa_offset(-closure_FS) - ret -L(UW17): - // cfi_adjust_cfa_offset(closure_FS) -E(L(load_table2), X86_RET_STRUCTPOP) - add esp, closure_FS -L(UW18): - // cfi_adjust_cfa_offset(-closure_FS) - ret 4 -L(UW19): - // cfi_adjust_cfa_offset(closure_FS) -E(L(load_table2), X86_RET_STRUCTARG) - jmp L(e2) -E(L(load_table2), X86_RET_STRUCT_1B) - movzx eax, al - jmp L(e2) -E(L(load_table2), X86_RET_STRUCT_2B) - movzx eax, ax - jmp L(e2) - - /* Fill out the table so that bad values are predictable. */ -E(L(load_table2), X86_RET_UNUSED14) - int 3 -E(L(load_table2), X86_RET_UNUSED15) - int 3 - -L(UW20): - // cfi_endproc -ENDF(ffi_closure_i386) - -ALIGN 16 -PUBLIC ffi_go_closure_STDCALL -ffi_go_closure_STDCALL PROC C -L(UW21): - // cfi_startproc - sub esp, closure_FS -L(UW22): - // cfi_def_cfa_offset(closure_FS + 4) - FFI_CLOSURE_SAVE_REGS - mov edx, [ecx+4] /* copy cif */ - mov eax, [ecx+8] /* copy fun */ - mov [esp+closure_CF+28], edx - mov [esp+closure_CF+32], eax - mov [esp+closure_CF+36], ecx /* closure is user_data */ - jmp L(do_closure_STDCALL) -L(UW23): - // cfi_endproc -ENDF(ffi_go_closure_STDCALL) - -/* For REGISTER, we have no available parameter registers, and so we - enter here having pushed the closure onto the stack. */ - -ALIGN 16 -PUBLIC ffi_closure_REGISTER -ffi_closure_REGISTER PROC C -L(UW24): - // cfi_startproc - // cfi_def_cfa(%esp, 8) - // cfi_offset(%eip, -8) - sub esp, closure_FS-4 -L(UW25): - // cfi_def_cfa_offset(closure_FS + 4) - FFI_CLOSURE_SAVE_REGS - mov ecx, [esp+closure_FS-4] /* load retaddr */ - mov eax, [esp+closure_FS] /* load closure */ - mov [esp+closure_FS], ecx /* move retaddr */ - jmp L(do_closure_REGISTER) -L(UW26): - // cfi_endproc -ENDF(ffi_closure_REGISTER) - -/* For STDCALL (and others), we need to pop N bytes of arguments off - the stack following the closure. The amount needing to be popped - is returned to us from ffi_closure_inner. */ - -ALIGN 16 -PUBLIC ffi_closure_STDCALL -ffi_closure_STDCALL PROC C -L(UW27): - // cfi_startproc - sub esp, closure_FS -L(UW28): - // cfi_def_cfa_offset(closure_FS + 4) - - FFI_CLOSURE_SAVE_REGS - - /* Entry point from ffi_closure_REGISTER. */ -L(do_closure_REGISTER):: - - FFI_CLOSURE_COPY_TRAMP_DATA - - /* Entry point from preceeding Go closure. */ -L(do_closure_STDCALL):: - - FFI_CLOSURE_PREP_CALL - FFI_CLOSURE_CALL_INNER(29) - - mov ecx, eax - shr ecx, X86_RET_POP_SHIFT /* isolate pop count */ - lea ecx, [esp+closure_FS+ecx] /* compute popped esp */ - mov edx, [esp+closure_FS] /* move return address */ - mov [ecx], edx - - /* From this point on, the value of %esp upon return is %ecx+4, - and we've copied the return address to %ecx to make return easy. - There's no point in representing this in the unwind info, as - there is always a window between the mov and the ret which - will be wrong from one point of view or another. */ - - FFI_CLOSURE_MASK_AND_JUMP L(C1(load_table,3)) - - ALIGN 8 -L(load_table3): -E(L(load_table3), X86_RET_FLOAT) - fld DWORD PTR [esp+closure_CF] - mov esp, ecx - ret -E(L(load_table3), X86_RET_DOUBLE) - fld QWORD PTR [esp+closure_CF] - mov esp, ecx - ret -E(L(load_table3), X86_RET_LDOUBLE) - fld QWORD PTR [esp+closure_CF] - mov esp, ecx - ret -E(L(load_table3), X86_RET_SINT8) - movsx eax, al - mov esp, ecx - ret -E(L(load_table3), X86_RET_SINT16) - movsx eax, ax - mov esp, ecx - ret -E(L(load_table3), X86_RET_UINT8) - movzx eax, al - mov esp, ecx - ret -E(L(load_table3), X86_RET_UINT16) - movzx eax, ax - mov esp, ecx - ret -E(L(load_table3), X86_RET_INT64) - mov edx, [esp+closure_CF+4] - mov esp, ecx - ret -E(L(load_table3), X86_RET_int 32) - mov esp, ecx - ret -E(L(load_table3), X86_RET_VOID) - mov esp, ecx - ret -E(L(load_table3), X86_RET_STRUCTPOP) - mov esp, ecx - ret -E(L(load_table3), X86_RET_STRUCTARG) - mov esp, ecx - ret -E(L(load_table3), X86_RET_STRUCT_1B) - movzx eax, al - mov esp, ecx - ret -E(L(load_table3), X86_RET_STRUCT_2B) - movzx eax, ax - mov esp, ecx - ret - - /* Fill out the table so that bad values are predictable. */ -E(L(load_table3), X86_RET_UNUSED14) - int 3 -E(L(load_table3), X86_RET_UNUSED15) - int 3 - -L(UW31): - // cfi_endproc -ENDF(ffi_closure_STDCALL) - -#if !FFI_NO_RAW_API - -#define raw_closure_S_FS (16+16+12) - -ALIGN 16 -PUBLIC ffi_closure_raw_SYSV -ffi_closure_raw_SYSV PROC C -L(UW32): - // cfi_startproc - sub esp, raw_closure_S_FS -L(UW33): - // cfi_def_cfa_offset(raw_closure_S_FS + 4) - mov [esp+raw_closure_S_FS-4], ebx -L(UW34): - // cfi_rel_offset(%ebx, raw_closure_S_FS-4) - - mov edx, [eax+FFI_TRAMPOLINE_SIZE+8] /* load cl->user_data */ - mov [esp+12], edx - lea edx, [esp+raw_closure_S_FS+4] /* load raw_args */ - mov [esp+8], edx - lea edx, [esp+16] /* load &res */ - mov [esp+4], edx - mov ebx, [eax+FFI_TRAMPOLINE_SIZE] /* load cl->cif */ - mov [esp], ebx - call DWORD PTR [eax+FFI_TRAMPOLINE_SIZE+4] /* call cl->fun */ - - mov eax, [ebx+20] /* load cif->flags */ - and eax, X86_RET_TYPE_MASK -// #ifdef __PIC__ -// call __x86.get_pc_thunk.bx -// L(pc4): -// lea ecx, L(load_table4)-L(pc4)(%ebx, %eax, 8), %ecx -// #else - lea ecx, [L(load_table4)+eax+8] -// #endif - mov ebx, [esp+raw_closure_S_FS-4] -L(UW35): - // cfi_restore(%ebx) - mov eax, [esp+16] /* Optimistic load */ - jmp dword ptr [ecx] - - ALIGN 8 -L(load_table4): -E(L(load_table4), X86_RET_FLOAT) - fld DWORD PTR [esp +16] - jmp L(e4) -E(L(load_table4), X86_RET_DOUBLE) - fld QWORD PTR [esp +16] - jmp L(e4) -E(L(load_table4), X86_RET_LDOUBLE) - fld QWORD PTR [esp +16] - jmp L(e4) -E(L(load_table4), X86_RET_SINT8) - movsx eax, al - jmp L(e4) -E(L(load_table4), X86_RET_SINT16) - movsx eax, ax - jmp L(e4) -E(L(load_table4), X86_RET_UINT8) - movzx eax, al - jmp L(e4) -E(L(load_table4), X86_RET_UINT16) - movzx eax, ax - jmp L(e4) -E(L(load_table4), X86_RET_INT64) - mov edx, [esp+16+4] - jmp L(e4) -E(L(load_table4), X86_RET_int 32) - nop - /* fallthru */ -E(L(load_table4), X86_RET_VOID) -L(e4): - add esp, raw_closure_S_FS -L(UW36): - // cfi_adjust_cfa_offset(-raw_closure_S_FS) - ret -L(UW37): - // cfi_adjust_cfa_offset(raw_closure_S_FS) -E(L(load_table4), X86_RET_STRUCTPOP) - add esp, raw_closure_S_FS -L(UW38): - // cfi_adjust_cfa_offset(-raw_closure_S_FS) - ret 4 -L(UW39): - // cfi_adjust_cfa_offset(raw_closure_S_FS) -E(L(load_table4), X86_RET_STRUCTARG) - jmp L(e4) -E(L(load_table4), X86_RET_STRUCT_1B) - movzx eax, al - jmp L(e4) -E(L(load_table4), X86_RET_STRUCT_2B) - movzx eax, ax - jmp L(e4) - - /* Fill out the table so that bad values are predictable. */ -E(L(load_table4), X86_RET_UNUSED14) - int 3 -E(L(load_table4), X86_RET_UNUSED15) - int 3 - -L(UW40): - // cfi_endproc -ENDF(ffi_closure_raw_SYSV) - -#define raw_closure_T_FS (16+16+8) - -ALIGN 16 -PUBLIC ffi_closure_raw_THISCALL -ffi_closure_raw_THISCALL PROC C -L(UW41): - // cfi_startproc - /* Rearrange the stack such that %ecx is the first argument. - This means moving the return address. */ - pop edx -L(UW42): - // cfi_def_cfa_offset(0) - // cfi_register(%eip, %edx) - push ecx -L(UW43): - // cfi_adjust_cfa_offset(4) - push edx -L(UW44): - // cfi_adjust_cfa_offset(4) - // cfi_rel_offset(%eip, 0) - sub esp, raw_closure_T_FS -L(UW45): - // cfi_adjust_cfa_offset(raw_closure_T_FS) - mov [esp+raw_closure_T_FS-4], ebx -L(UW46): - // cfi_rel_offset(%ebx, raw_closure_T_FS-4) - - mov edx, [eax+FFI_TRAMPOLINE_SIZE+8] /* load cl->user_data */ - mov [esp+12], edx - lea edx, [esp+raw_closure_T_FS+4] /* load raw_args */ - mov [esp+8], edx - lea edx, [esp+16] /* load &res */ - mov [esp+4], edx - mov ebx, [eax+FFI_TRAMPOLINE_SIZE] /* load cl->cif */ - mov [esp], ebx - call DWORD PTR [eax+FFI_TRAMPOLINE_SIZE+4] /* call cl->fun */ - - mov eax, [ebx+20] /* load cif->flags */ - and eax, X86_RET_TYPE_MASK -// #ifdef __PIC__ -// call __x86.get_pc_thunk.bx -// L(pc5): -// leal L(load_table5)-L(pc5)(%ebx, %eax, 8), %ecx -// #else - lea ecx, [L(load_table5)+eax*8] -//#endif - mov ebx, [esp+raw_closure_T_FS-4] -L(UW47): - // cfi_restore(%ebx) - mov eax, [esp+16] /* Optimistic load */ - jmp DWORD PTR [ecx] - - AlIGN 4 -L(load_table5): -E(L(load_table5), X86_RET_FLOAT) - fld DWORD PTR [esp +16] - jmp L(e5) -E(L(load_table5), X86_RET_DOUBLE) - fld QWORD PTR [esp +16] - jmp L(e5) -E(L(load_table5), X86_RET_LDOUBLE) - fld QWORD PTR [esp+16] - jmp L(e5) -E(L(load_table5), X86_RET_SINT8) - movsx eax, al - jmp L(e5) -E(L(load_table5), X86_RET_SINT16) - movsx eax, ax - jmp L(e5) -E(L(load_table5), X86_RET_UINT8) - movzx eax, al - jmp L(e5) -E(L(load_table5), X86_RET_UINT16) - movzx eax, ax - jmp L(e5) -E(L(load_table5), X86_RET_INT64) - mov edx, [esp+16+4] - jmp L(e5) -E(L(load_table5), X86_RET_int 32) - nop - /* fallthru */ -E(L(load_table5), X86_RET_VOID) -L(e5): - add esp, raw_closure_T_FS -L(UW48): - // cfi_adjust_cfa_offset(-raw_closure_T_FS) - /* Remove the extra %ecx argument we pushed. */ - ret 4 -L(UW49): - // cfi_adjust_cfa_offset(raw_closure_T_FS) -E(L(load_table5), X86_RET_STRUCTPOP) - add esp, raw_closure_T_FS -L(UW50): - // cfi_adjust_cfa_offset(-raw_closure_T_FS) - ret 8 -L(UW51): - // cfi_adjust_cfa_offset(raw_closure_T_FS) -E(L(load_table5), X86_RET_STRUCTARG) - jmp L(e5) -E(L(load_table5), X86_RET_STRUCT_1B) - movzx eax, al - jmp L(e5) -E(L(load_table5), X86_RET_STRUCT_2B) - movzx eax, ax - jmp L(e5) - - /* Fill out the table so that bad values are predictable. */ -E(L(load_table5), X86_RET_UNUSED14) - int 3 -E(L(load_table5), X86_RET_UNUSED15) - int 3 - -L(UW52): - // cfi_endproc -ENDF(ffi_closure_raw_THISCALL) - -#endif /* !FFI_NO_RAW_API */ - -#ifdef X86_DARWIN -# define COMDAT(X) \ - .section __TEXT,__text,coalesced,pure_instructions; \ - .weak_definition X; \ - FFI_HIDDEN(X) -#elif defined __ELF__ && !(defined(__sun__) && defined(__svr4__)) -# define COMDAT(X) \ - .section .text.X,"axG",@progbits,X,comdat; \ - PUBLIC X; \ - FFI_HIDDEN(X) -#else -# define COMDAT(X) -#endif - -// #if defined(__PIC__) -// COMDAT(C(__x86.get_pc_thunk.bx)) -// C(__x86.get_pc_thunk.bx): -// movl (%esp), %ebx -// ret -// ENDF(C(__x86.get_pc_thunk.bx)) -// # if defined X86_DARWIN || defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE -// COMDAT(C(__x86.get_pc_thunk.dx)) -// C(__x86.get_pc_thunk.dx): -// movl (%esp), %edx -// ret -// ENDF(C(__x86.get_pc_thunk.dx)) -// #endif /* DARWIN || HIDDEN */ -// #endif /* __PIC__ */ - -#if 0 -/* Sadly, OSX cctools-as doesn't understand .cfi directives at all. */ - -#ifdef __APPLE__ -.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support -EHFrame0: -#elif defined(X86_WIN32) -.section .eh_frame,"r" -#elif defined(HAVE_AS_X86_64_UNWIND_SECTION_TYPE) -.section .eh_frame,EH_FRAME_FLAGS,@unwind -#else -.section .eh_frame,EH_FRAME_FLAGS,@progbits -#endif - -#ifdef HAVE_AS_X86_PCREL -# define PCREL(X) X - . -#else -# define PCREL(X) X@rel -#endif - -/* Simplify advancing between labels. Assume DW_CFA_advance_loc1 fits. */ -#define ADV(N, P) .byte 2, L(N)-L(P) - - .balign 4 -L(CIE): - .set L(set0),L(ECIE)-L(SCIE) - .long L(set0) /* CIE Length */ -L(SCIE): - .long 0 /* CIE Identifier Tag */ - .byte 1 /* CIE Version */ - .ascii "zR\0" /* CIE Augmentation */ - .byte 1 /* CIE Code Alignment Factor */ - .byte 0x7c /* CIE Data Alignment Factor */ - .byte 0x8 /* CIE RA Column */ - .byte 1 /* Augmentation size */ - .byte 0x1b /* FDE Encoding (pcrel sdata4) */ - .byte 0xc, 4, 4 /* DW_CFA_def_cfa, %esp offset 4 */ - .byte 0x80+8, 1 /* DW_CFA_offset, %eip offset 1*-4 */ - .balign 4 -L(ECIE): - - .set L(set1),L(EFDE1)-L(SFDE1) - .long L(set1) /* FDE Length */ -L(SFDE1): - .long L(SFDE1)-L(CIE) /* FDE CIE offset */ - .long PCREL(L(UW0)) /* Initial location */ - .long L(UW5)-L(UW0) /* Address range */ - .byte 0 /* Augmentation size */ - ADV(UW1, UW0) - .byte 0xc, 5, 8 /* DW_CFA_def_cfa, %ebp 8 */ - .byte 0x80+5, 2 /* DW_CFA_offset, %ebp 2*-4 */ - ADV(UW2, UW1) - .byte 0x80+3, 0 /* DW_CFA_offset, %ebx 0*-4 */ - ADV(UW3, UW2) - .byte 0xa /* DW_CFA_remember_state */ - .byte 0xc, 4, 4 /* DW_CFA_def_cfa, %esp 4 */ - .byte 0xc0+3 /* DW_CFA_restore, %ebx */ - .byte 0xc0+5 /* DW_CFA_restore, %ebp */ - ADV(UW4, UW3) - .byte 0xb /* DW_CFA_restore_state */ - .balign 4 -L(EFDE1): - - .set L(set2),L(EFDE2)-L(SFDE2) - .long L(set2) /* FDE Length */ -L(SFDE2): - .long L(SFDE2)-L(CIE) /* FDE CIE offset */ - .long PCREL(L(UW6)) /* Initial location */ - .long L(UW8)-L(UW6) /* Address range */ - .byte 0 /* Augmentation size */ - ADV(UW7, UW6) - .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ - .balign 4 -L(EFDE2): - - .set L(set3),L(EFDE3)-L(SFDE3) - .long L(set3) /* FDE Length */ -L(SFDE3): - .long L(SFDE3)-L(CIE) /* FDE CIE offset */ - .long PCREL(L(UW9)) /* Initial location */ - .long L(UW11)-L(UW9) /* Address range */ - .byte 0 /* Augmentation size */ - ADV(UW10, UW9) - .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ - .balign 4 -L(EFDE3): - - .set L(set4),L(EFDE4)-L(SFDE4) - .long L(set4) /* FDE Length */ -L(SFDE4): - .long L(SFDE4)-L(CIE) /* FDE CIE offset */ - .long PCREL(L(UW12)) /* Initial location */ - .long L(UW20)-L(UW12) /* Address range */ - .byte 0 /* Augmentation size */ - ADV(UW13, UW12) - .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ -#ifdef FFI_CLOSURE_CALL_INNER_SAVE_EBX - ADV(UW14, UW13) - .byte 0x80+3, (40-(closure_FS+4))/-4 /* DW_CFA_offset %ebx */ - ADV(UW15, UW14) - .byte 0xc0+3 /* DW_CFA_restore %ebx */ - ADV(UW16, UW15) -#else - ADV(UW16, UW13) -#endif - .byte 0xe, 4 /* DW_CFA_def_cfa_offset */ - ADV(UW17, UW16) - .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ - ADV(UW18, UW17) - .byte 0xe, 4 /* DW_CFA_def_cfa_offset */ - ADV(UW19, UW18) - .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ - .balign 4 -L(EFDE4): - - .set L(set5),L(EFDE5)-L(SFDE5) - .long L(set5) /* FDE Length */ -L(SFDE5): - .long L(SFDE5)-L(CIE) /* FDE CIE offset */ - .long PCREL(L(UW21)) /* Initial location */ - .long L(UW23)-L(UW21) /* Address range */ - .byte 0 /* Augmentation size */ - ADV(UW22, UW21) - .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ - .balign 4 -L(EFDE5): - - .set L(set6),L(EFDE6)-L(SFDE6) - .long L(set6) /* FDE Length */ -L(SFDE6): - .long L(SFDE6)-L(CIE) /* FDE CIE offset */ - .long PCREL(L(UW24)) /* Initial location */ - .long L(UW26)-L(UW24) /* Address range */ - .byte 0 /* Augmentation size */ - .byte 0xe, 8 /* DW_CFA_def_cfa_offset */ - .byte 0x80+8, 2 /* DW_CFA_offset %eip, 2*-4 */ - ADV(UW25, UW24) - .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ - .balign 4 -L(EFDE6): - - .set L(set7),L(EFDE7)-L(SFDE7) - .long L(set7) /* FDE Length */ -L(SFDE7): - .long L(SFDE7)-L(CIE) /* FDE CIE offset */ - .long PCREL(L(UW27)) /* Initial location */ - .long L(UW31)-L(UW27) /* Address range */ - .byte 0 /* Augmentation size */ - ADV(UW28, UW27) - .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ -#ifdef FFI_CLOSURE_CALL_INNER_SAVE_EBX - ADV(UW29, UW28) - .byte 0x80+3, (40-(closure_FS+4))/-4 /* DW_CFA_offset %ebx */ - ADV(UW30, UW29) - .byte 0xc0+3 /* DW_CFA_restore %ebx */ -#endif - .balign 4 -L(EFDE7): - -#if !FFI_NO_RAW_API - .set L(set8),L(EFDE8)-L(SFDE8) - .long L(set8) /* FDE Length */ -L(SFDE8): - .long L(SFDE8)-L(CIE) /* FDE CIE offset */ - .long PCREL(L(UW32)) /* Initial location */ - .long L(UW40)-L(UW32) /* Address range */ - .byte 0 /* Augmentation size */ - ADV(UW33, UW32) - .byte 0xe, raw_closure_S_FS+4 /* DW_CFA_def_cfa_offset */ - ADV(UW34, UW33) - .byte 0x80+3, 2 /* DW_CFA_offset %ebx 2*-4 */ - ADV(UW35, UW34) - .byte 0xc0+3 /* DW_CFA_restore %ebx */ - ADV(UW36, UW35) - .byte 0xe, 4 /* DW_CFA_def_cfa_offset */ - ADV(UW37, UW36) - .byte 0xe, raw_closure_S_FS+4 /* DW_CFA_def_cfa_offset */ - ADV(UW38, UW37) - .byte 0xe, 4 /* DW_CFA_def_cfa_offset */ - ADV(UW39, UW38) - .byte 0xe, raw_closure_S_FS+4 /* DW_CFA_def_cfa_offset */ - .balign 4 -L(EFDE8): - - .set L(set9),L(EFDE9)-L(SFDE9) - .long L(set9) /* FDE Length */ -L(SFDE9): - .long L(SFDE9)-L(CIE) /* FDE CIE offset */ - .long PCREL(L(UW41)) /* Initial location */ - .long L(UW52)-L(UW41) /* Address range */ - .byte 0 /* Augmentation size */ - ADV(UW42, UW41) - .byte 0xe, 0 /* DW_CFA_def_cfa_offset */ - .byte 0x9, 8, 2 /* DW_CFA_register %eip, %edx */ - ADV(UW43, UW42) - .byte 0xe, 4 /* DW_CFA_def_cfa_offset */ - ADV(UW44, UW43) - .byte 0xe, 8 /* DW_CFA_def_cfa_offset */ - .byte 0x80+8, 2 /* DW_CFA_offset %eip 2*-4 */ - ADV(UW45, UW44) - .byte 0xe, raw_closure_T_FS+8 /* DW_CFA_def_cfa_offset */ - ADV(UW46, UW45) - .byte 0x80+3, 3 /* DW_CFA_offset %ebx 3*-4 */ - ADV(UW47, UW46) - .byte 0xc0+3 /* DW_CFA_restore %ebx */ - ADV(UW48, UW47) - .byte 0xe, 8 /* DW_CFA_def_cfa_offset */ - ADV(UW49, UW48) - .byte 0xe, raw_closure_T_FS+8 /* DW_CFA_def_cfa_offset */ - ADV(UW50, UW49) - .byte 0xe, 8 /* DW_CFA_def_cfa_offset */ - ADV(UW51, UW50) - .byte 0xe, raw_closure_T_FS+8 /* DW_CFA_def_cfa_offset */ - .balign 4 -L(EFDE9): -#endif /* !FFI_NO_RAW_API */ - -#ifdef _WIN32 - .def @feat.00; - .scl 3; - .type 0; - .endef - PUBLIC @feat.00 -@feat.00 = 1 -#endif - -#endif /* ifndef _MSC_VER */ -#endif /* ifndef __x86_64__ */ - -#if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",@progbits -#endif -#endif - -END \ No newline at end of file diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/unix64.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/unix64.S deleted file mode 100644 index 89d7db1..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/unix64.S +++ /dev/null @@ -1,621 +0,0 @@ -/* ----------------------------------------------------------------------- - unix64.S - Copyright (c) 2013 The Written Word, Inc. - - Copyright (c) 2008 Red Hat, Inc - - Copyright (c) 2002 Bo Thorsen - - x86-64 Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#ifdef __x86_64__ -#define LIBFFI_ASM -#include -#include -#include "internal64.h" -#include "asmnames.h" - - .text - -/* This macro allows the safe creation of jump tables without an - actual table. The entry points into the table are all 8 bytes. - The use of ORG asserts that we're at the correct location. */ -/* ??? The clang assembler doesn't handle .org with symbolic expressions. */ -#if defined(__clang__) || defined(__APPLE__) || (defined (__sun__) && defined(__svr4__)) -# define E(BASE, X) .balign 8 -#else -# ifdef __CET__ -# define E(BASE, X) .balign 8; .org BASE + X * 16 -# else -# define E(BASE, X) .balign 8; .org BASE + X * 8 -# endif -#endif - -/* ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags, - void *raddr, void (*fnaddr)(void)); - - Bit o trickiness here -- ARGS+BYTES is the base of the stack frame - for this function. This has been allocated by ffi_call. We also - deallocate some of the stack that has been alloca'd. */ - - .balign 8 - .globl C(ffi_call_unix64) - FFI_HIDDEN(C(ffi_call_unix64)) - -C(ffi_call_unix64): -L(UW0): - _CET_ENDBR - movq (%rsp), %r10 /* Load return address. */ - leaq (%rdi, %rsi), %rax /* Find local stack base. */ - movq %rdx, (%rax) /* Save flags. */ - movq %rcx, 8(%rax) /* Save raddr. */ - movq %rbp, 16(%rax) /* Save old frame pointer. */ - movq %r10, 24(%rax) /* Relocate return address. */ - movq %rax, %rbp /* Finalize local stack frame. */ - - /* New stack frame based off rbp. This is a itty bit of unwind - trickery in that the CFA *has* changed. There is no easy way - to describe it correctly on entry to the function. Fortunately, - it doesn't matter too much since at all points we can correctly - unwind back to ffi_call. Note that the location to which we - moved the return address is (the new) CFA-8, so from the - perspective of the unwind info, it hasn't moved. */ -L(UW1): - /* cfi_def_cfa(%rbp, 32) */ - /* cfi_rel_offset(%rbp, 16) */ - - movq %rdi, %r10 /* Save a copy of the register area. */ - movq %r8, %r11 /* Save a copy of the target fn. */ - - /* Load up all argument registers. */ - movq (%r10), %rdi - movq 0x08(%r10), %rsi - movq 0x10(%r10), %rdx - movq 0x18(%r10), %rcx - movq 0x20(%r10), %r8 - movq 0x28(%r10), %r9 - movl 0xb0(%r10), %eax /* Set number of SSE registers. */ - testl %eax, %eax - jnz L(load_sse) -L(ret_from_load_sse): - - /* Deallocate the reg arg area, except for r10, then load via pop. */ - leaq 0xb8(%r10), %rsp - popq %r10 - - /* Call the user function. */ - call *%r11 - - /* Deallocate stack arg area; local stack frame in redzone. */ - leaq 24(%rbp), %rsp - - movq 0(%rbp), %rcx /* Reload flags. */ - movq 8(%rbp), %rdi /* Reload raddr. */ - movq 16(%rbp), %rbp /* Reload old frame pointer. */ -L(UW2): - /* cfi_remember_state */ - /* cfi_def_cfa(%rsp, 8) */ - /* cfi_restore(%rbp) */ - - /* The first byte of the flags contains the FFI_TYPE. */ - cmpb $UNIX64_RET_LAST, %cl - movzbl %cl, %r10d - leaq L(store_table)(%rip), %r11 - ja L(sa) -#ifdef __CET__ - /* NB: Originally, each slot is 8 byte. 4 bytes of ENDBR64 + - 4 bytes NOP padding double slot size to 16 bytes. */ - addl %r10d, %r10d -#endif - leaq (%r11, %r10, 8), %r10 - - /* Prep for the structure cases: scratch area in redzone. */ - leaq -20(%rsp), %rsi - jmp *%r10 - - .balign 8 -L(store_table): -E(L(store_table), UNIX64_RET_VOID) - _CET_ENDBR - ret -E(L(store_table), UNIX64_RET_UINT8) - _CET_ENDBR - movzbl %al, %eax - movq %rax, (%rdi) - ret -E(L(store_table), UNIX64_RET_UINT16) - _CET_ENDBR - movzwl %ax, %eax - movq %rax, (%rdi) - ret -E(L(store_table), UNIX64_RET_UINT32) - _CET_ENDBR - movl %eax, %eax - movq %rax, (%rdi) - ret -E(L(store_table), UNIX64_RET_SINT8) - _CET_ENDBR - movsbq %al, %rax - movq %rax, (%rdi) - ret -E(L(store_table), UNIX64_RET_SINT16) - _CET_ENDBR - movswq %ax, %rax - movq %rax, (%rdi) - ret -E(L(store_table), UNIX64_RET_SINT32) - _CET_ENDBR - cltq - movq %rax, (%rdi) - ret -E(L(store_table), UNIX64_RET_INT64) - _CET_ENDBR - movq %rax, (%rdi) - ret -E(L(store_table), UNIX64_RET_XMM32) - _CET_ENDBR - movd %xmm0, (%rdi) - ret -E(L(store_table), UNIX64_RET_XMM64) - _CET_ENDBR - movq %xmm0, (%rdi) - ret -E(L(store_table), UNIX64_RET_X87) - _CET_ENDBR - fstpt (%rdi) - ret -E(L(store_table), UNIX64_RET_X87_2) - _CET_ENDBR - fstpt (%rdi) - fstpt 16(%rdi) - ret -E(L(store_table), UNIX64_RET_ST_XMM0_RAX) - _CET_ENDBR - movq %rax, 8(%rsi) - jmp L(s3) -E(L(store_table), UNIX64_RET_ST_RAX_XMM0) - _CET_ENDBR - movq %xmm0, 8(%rsi) - jmp L(s2) -E(L(store_table), UNIX64_RET_ST_XMM0_XMM1) - _CET_ENDBR - movq %xmm1, 8(%rsi) - jmp L(s3) -E(L(store_table), UNIX64_RET_ST_RAX_RDX) - _CET_ENDBR - movq %rdx, 8(%rsi) -L(s2): - movq %rax, (%rsi) - shrl $UNIX64_SIZE_SHIFT, %ecx - rep movsb - ret - .balign 8 -L(s3): - movq %xmm0, (%rsi) - shrl $UNIX64_SIZE_SHIFT, %ecx - rep movsb - ret - -L(sa): call PLT(C(abort)) - - /* Many times we can avoid loading any SSE registers at all. - It's not worth an indirect jump to load the exact set of - SSE registers needed; zero or all is a good compromise. */ - .balign 2 -L(UW3): - /* cfi_restore_state */ -L(load_sse): - movdqa 0x30(%r10), %xmm0 - movdqa 0x40(%r10), %xmm1 - movdqa 0x50(%r10), %xmm2 - movdqa 0x60(%r10), %xmm3 - movdqa 0x70(%r10), %xmm4 - movdqa 0x80(%r10), %xmm5 - movdqa 0x90(%r10), %xmm6 - movdqa 0xa0(%r10), %xmm7 - jmp L(ret_from_load_sse) - -L(UW4): -ENDF(C(ffi_call_unix64)) - -/* 6 general registers, 8 vector registers, - 32 bytes of rvalue, 8 bytes of alignment. */ -#define ffi_closure_OFS_G 0 -#define ffi_closure_OFS_V (6*8) -#define ffi_closure_OFS_RVALUE (ffi_closure_OFS_V + 8*16) -#define ffi_closure_FS (ffi_closure_OFS_RVALUE + 32 + 8) - -/* The location of rvalue within the red zone after deallocating the frame. */ -#define ffi_closure_RED_RVALUE (ffi_closure_OFS_RVALUE - ffi_closure_FS) - - .balign 2 - .globl C(ffi_closure_unix64_sse) - FFI_HIDDEN(C(ffi_closure_unix64_sse)) - -C(ffi_closure_unix64_sse): -L(UW5): - _CET_ENDBR - subq $ffi_closure_FS, %rsp -L(UW6): - /* cfi_adjust_cfa_offset(ffi_closure_FS) */ - - movdqa %xmm0, ffi_closure_OFS_V+0x00(%rsp) - movdqa %xmm1, ffi_closure_OFS_V+0x10(%rsp) - movdqa %xmm2, ffi_closure_OFS_V+0x20(%rsp) - movdqa %xmm3, ffi_closure_OFS_V+0x30(%rsp) - movdqa %xmm4, ffi_closure_OFS_V+0x40(%rsp) - movdqa %xmm5, ffi_closure_OFS_V+0x50(%rsp) - movdqa %xmm6, ffi_closure_OFS_V+0x60(%rsp) - movdqa %xmm7, ffi_closure_OFS_V+0x70(%rsp) - jmp L(sse_entry1) - -L(UW7): -ENDF(C(ffi_closure_unix64_sse)) - - .balign 2 - .globl C(ffi_closure_unix64) - FFI_HIDDEN(C(ffi_closure_unix64)) - -C(ffi_closure_unix64): -L(UW8): - _CET_ENDBR - subq $ffi_closure_FS, %rsp -L(UW9): - /* cfi_adjust_cfa_offset(ffi_closure_FS) */ -L(sse_entry1): - movq %rdi, ffi_closure_OFS_G+0x00(%rsp) - movq %rsi, ffi_closure_OFS_G+0x08(%rsp) - movq %rdx, ffi_closure_OFS_G+0x10(%rsp) - movq %rcx, ffi_closure_OFS_G+0x18(%rsp) - movq %r8, ffi_closure_OFS_G+0x20(%rsp) - movq %r9, ffi_closure_OFS_G+0x28(%rsp) - -#ifdef __ILP32__ - movl FFI_TRAMPOLINE_SIZE(%r10), %edi /* Load cif */ - movl FFI_TRAMPOLINE_SIZE+4(%r10), %esi /* Load fun */ - movl FFI_TRAMPOLINE_SIZE+8(%r10), %edx /* Load user_data */ -#else - movq FFI_TRAMPOLINE_SIZE(%r10), %rdi /* Load cif */ - movq FFI_TRAMPOLINE_SIZE+8(%r10), %rsi /* Load fun */ - movq FFI_TRAMPOLINE_SIZE+16(%r10), %rdx /* Load user_data */ -#endif -L(do_closure): - leaq ffi_closure_OFS_RVALUE(%rsp), %rcx /* Load rvalue */ - movq %rsp, %r8 /* Load reg_args */ - leaq ffi_closure_FS+8(%rsp), %r9 /* Load argp */ - call PLT(C(ffi_closure_unix64_inner)) - - /* Deallocate stack frame early; return value is now in redzone. */ - addq $ffi_closure_FS, %rsp -L(UW10): - /* cfi_adjust_cfa_offset(-ffi_closure_FS) */ - - /* The first byte of the return value contains the FFI_TYPE. */ - cmpb $UNIX64_RET_LAST, %al - movzbl %al, %r10d - leaq L(load_table)(%rip), %r11 - ja L(la) -#ifdef __CET__ - /* NB: Originally, each slot is 8 byte. 4 bytes of ENDBR64 + - 4 bytes NOP padding double slot size to 16 bytes. */ - addl %r10d, %r10d -#endif - leaq (%r11, %r10, 8), %r10 - leaq ffi_closure_RED_RVALUE(%rsp), %rsi - jmp *%r10 - - .balign 8 -L(load_table): -E(L(load_table), UNIX64_RET_VOID) - _CET_ENDBR - ret -E(L(load_table), UNIX64_RET_UINT8) - _CET_ENDBR - movzbl (%rsi), %eax - ret -E(L(load_table), UNIX64_RET_UINT16) - _CET_ENDBR - movzwl (%rsi), %eax - ret -E(L(load_table), UNIX64_RET_UINT32) - _CET_ENDBR - movl (%rsi), %eax - ret -E(L(load_table), UNIX64_RET_SINT8) - _CET_ENDBR - movsbl (%rsi), %eax - ret -E(L(load_table), UNIX64_RET_SINT16) - _CET_ENDBR - movswl (%rsi), %eax - ret -E(L(load_table), UNIX64_RET_SINT32) - _CET_ENDBR - movl (%rsi), %eax - ret -E(L(load_table), UNIX64_RET_INT64) - _CET_ENDBR - movq (%rsi), %rax - ret -E(L(load_table), UNIX64_RET_XMM32) - _CET_ENDBR - movd (%rsi), %xmm0 - ret -E(L(load_table), UNIX64_RET_XMM64) - _CET_ENDBR - movq (%rsi), %xmm0 - ret -E(L(load_table), UNIX64_RET_X87) - _CET_ENDBR - fldt (%rsi) - ret -E(L(load_table), UNIX64_RET_X87_2) - _CET_ENDBR - fldt 16(%rsi) - fldt (%rsi) - ret -E(L(load_table), UNIX64_RET_ST_XMM0_RAX) - _CET_ENDBR - movq 8(%rsi), %rax - jmp L(l3) -E(L(load_table), UNIX64_RET_ST_RAX_XMM0) - _CET_ENDBR - movq 8(%rsi), %xmm0 - jmp L(l2) -E(L(load_table), UNIX64_RET_ST_XMM0_XMM1) - _CET_ENDBR - movq 8(%rsi), %xmm1 - jmp L(l3) -E(L(load_table), UNIX64_RET_ST_RAX_RDX) - _CET_ENDBR - movq 8(%rsi), %rdx -L(l2): - movq (%rsi), %rax - ret - .balign 8 -L(l3): - movq (%rsi), %xmm0 - ret - -L(la): call PLT(C(abort)) - -L(UW11): -ENDF(C(ffi_closure_unix64)) - - .balign 2 - .globl C(ffi_go_closure_unix64_sse) - FFI_HIDDEN(C(ffi_go_closure_unix64_sse)) - -C(ffi_go_closure_unix64_sse): -L(UW12): - _CET_ENDBR - subq $ffi_closure_FS, %rsp -L(UW13): - /* cfi_adjust_cfa_offset(ffi_closure_FS) */ - - movdqa %xmm0, ffi_closure_OFS_V+0x00(%rsp) - movdqa %xmm1, ffi_closure_OFS_V+0x10(%rsp) - movdqa %xmm2, ffi_closure_OFS_V+0x20(%rsp) - movdqa %xmm3, ffi_closure_OFS_V+0x30(%rsp) - movdqa %xmm4, ffi_closure_OFS_V+0x40(%rsp) - movdqa %xmm5, ffi_closure_OFS_V+0x50(%rsp) - movdqa %xmm6, ffi_closure_OFS_V+0x60(%rsp) - movdqa %xmm7, ffi_closure_OFS_V+0x70(%rsp) - jmp L(sse_entry2) - -L(UW14): -ENDF(C(ffi_go_closure_unix64_sse)) - - .balign 2 - .globl C(ffi_go_closure_unix64) - FFI_HIDDEN(C(ffi_go_closure_unix64)) - -C(ffi_go_closure_unix64): -L(UW15): - _CET_ENDBR - subq $ffi_closure_FS, %rsp -L(UW16): - /* cfi_adjust_cfa_offset(ffi_closure_FS) */ -L(sse_entry2): - movq %rdi, ffi_closure_OFS_G+0x00(%rsp) - movq %rsi, ffi_closure_OFS_G+0x08(%rsp) - movq %rdx, ffi_closure_OFS_G+0x10(%rsp) - movq %rcx, ffi_closure_OFS_G+0x18(%rsp) - movq %r8, ffi_closure_OFS_G+0x20(%rsp) - movq %r9, ffi_closure_OFS_G+0x28(%rsp) - -#ifdef __ILP32__ - movl 4(%r10), %edi /* Load cif */ - movl 8(%r10), %esi /* Load fun */ - movl %r10d, %edx /* Load closure (user_data) */ -#else - movq 8(%r10), %rdi /* Load cif */ - movq 16(%r10), %rsi /* Load fun */ - movq %r10, %rdx /* Load closure (user_data) */ -#endif - jmp L(do_closure) - -L(UW17): -ENDF(C(ffi_go_closure_unix64)) - -/* Sadly, OSX cctools-as doesn't understand .cfi directives at all. */ - -#ifdef __APPLE__ -.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support -EHFrame0: -#elif defined(HAVE_AS_X86_64_UNWIND_SECTION_TYPE) -.section .eh_frame,"a",@unwind -#else -.section .eh_frame,"a",@progbits -#endif - -#ifdef HAVE_AS_X86_PCREL -# define PCREL(X) X - . -#else -# define PCREL(X) X@rel -#endif - -/* Simplify advancing between labels. Assume DW_CFA_advance_loc1 fits. */ -#ifdef __CET__ -/* Use DW_CFA_advance_loc2 when IBT is enabled. */ -# define ADV(N, P) .byte 3; .2byte L(N)-L(P) -#else -# define ADV(N, P) .byte 2, L(N)-L(P) -#endif - - .balign 8 -L(CIE): - .set L(set0),L(ECIE)-L(SCIE) - .long L(set0) /* CIE Length */ -L(SCIE): - .long 0 /* CIE Identifier Tag */ - .byte 1 /* CIE Version */ - .ascii "zR\0" /* CIE Augmentation */ - .byte 1 /* CIE Code Alignment Factor */ - .byte 0x78 /* CIE Data Alignment Factor */ - .byte 0x10 /* CIE RA Column */ - .byte 1 /* Augmentation size */ - .byte 0x1b /* FDE Encoding (pcrel sdata4) */ - .byte 0xc, 7, 8 /* DW_CFA_def_cfa, %rsp offset 8 */ - .byte 0x80+16, 1 /* DW_CFA_offset, %rip offset 1*-8 */ - .balign 8 -L(ECIE): - - .set L(set1),L(EFDE1)-L(SFDE1) - .long L(set1) /* FDE Length */ -L(SFDE1): - .long L(SFDE1)-L(CIE) /* FDE CIE offset */ - .long PCREL(L(UW0)) /* Initial location */ - .long L(UW4)-L(UW0) /* Address range */ - .byte 0 /* Augmentation size */ - ADV(UW1, UW0) - .byte 0xc, 6, 32 /* DW_CFA_def_cfa, %rbp 32 */ - .byte 0x80+6, 2 /* DW_CFA_offset, %rbp 2*-8 */ - ADV(UW2, UW1) - .byte 0xa /* DW_CFA_remember_state */ - .byte 0xc, 7, 8 /* DW_CFA_def_cfa, %rsp 8 */ - .byte 0xc0+6 /* DW_CFA_restore, %rbp */ - ADV(UW3, UW2) - .byte 0xb /* DW_CFA_restore_state */ - .balign 8 -L(EFDE1): - - .set L(set2),L(EFDE2)-L(SFDE2) - .long L(set2) /* FDE Length */ -L(SFDE2): - .long L(SFDE2)-L(CIE) /* FDE CIE offset */ - .long PCREL(L(UW5)) /* Initial location */ - .long L(UW7)-L(UW5) /* Address range */ - .byte 0 /* Augmentation size */ - ADV(UW6, UW5) - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte ffi_closure_FS + 8, 1 /* uleb128, assuming 128 <= FS < 255 */ - .balign 8 -L(EFDE2): - - .set L(set3),L(EFDE3)-L(SFDE3) - .long L(set3) /* FDE Length */ -L(SFDE3): - .long L(SFDE3)-L(CIE) /* FDE CIE offset */ - .long PCREL(L(UW8)) /* Initial location */ - .long L(UW11)-L(UW8) /* Address range */ - .byte 0 /* Augmentation size */ - ADV(UW9, UW8) - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte ffi_closure_FS + 8, 1 /* uleb128, assuming 128 <= FS < 255 */ - ADV(UW10, UW9) - .byte 0xe, 8 /* DW_CFA_def_cfa_offset 8 */ -L(EFDE3): - - .set L(set4),L(EFDE4)-L(SFDE4) - .long L(set4) /* FDE Length */ -L(SFDE4): - .long L(SFDE4)-L(CIE) /* FDE CIE offset */ - .long PCREL(L(UW12)) /* Initial location */ - .long L(UW14)-L(UW12) /* Address range */ - .byte 0 /* Augmentation size */ - ADV(UW13, UW12) - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte ffi_closure_FS + 8, 1 /* uleb128, assuming 128 <= FS < 255 */ - .balign 8 -L(EFDE4): - - .set L(set5),L(EFDE5)-L(SFDE5) - .long L(set5) /* FDE Length */ -L(SFDE5): - .long L(SFDE5)-L(CIE) /* FDE CIE offset */ - .long PCREL(L(UW15)) /* Initial location */ - .long L(UW17)-L(UW15) /* Address range */ - .byte 0 /* Augmentation size */ - ADV(UW16, UW15) - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte ffi_closure_FS + 8, 1 /* uleb128, assuming 128 <= FS < 255 */ - .balign 8 -L(EFDE5): -#ifdef __APPLE__ - .subsections_via_symbols - .section __LD,__compact_unwind,regular,debug - - /* compact unwind for ffi_call_unix64 */ - .quad C(ffi_call_unix64) - .set L1,L(UW4)-L(UW0) - .long L1 - .long 0x04000000 /* use dwarf unwind info */ - .quad 0 - .quad 0 - - /* compact unwind for ffi_closure_unix64_sse */ - .quad C(ffi_closure_unix64_sse) - .set L2,L(UW7)-L(UW5) - .long L2 - .long 0x04000000 /* use dwarf unwind info */ - .quad 0 - .quad 0 - - /* compact unwind for ffi_closure_unix64 */ - .quad C(ffi_closure_unix64) - .set L3,L(UW11)-L(UW8) - .long L3 - .long 0x04000000 /* use dwarf unwind info */ - .quad 0 - .quad 0 - - /* compact unwind for ffi_go_closure_unix64_sse */ - .quad C(ffi_go_closure_unix64_sse) - .set L4,L(UW14)-L(UW12) - .long L4 - .long 0x04000000 /* use dwarf unwind info */ - .quad 0 - .quad 0 - - /* compact unwind for ffi_go_closure_unix64 */ - .quad C(ffi_go_closure_unix64) - .set L5,L(UW17)-L(UW15) - .long L5 - .long 0x04000000 /* use dwarf unwind info */ - .quad 0 - .quad 0 -#endif - -#endif /* __x86_64__ */ -#if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",@progbits -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/win64.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/win64.S deleted file mode 100644 index 8315e8b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/win64.S +++ /dev/null @@ -1,241 +0,0 @@ -#ifdef __x86_64__ -#define LIBFFI_ASM -#include -#include -#include -#include "asmnames.h" - -#if defined(HAVE_AS_CFI_PSEUDO_OP) - .cfi_sections .debug_frame -#endif - -#ifdef X86_WIN64 -#define SEH(...) __VA_ARGS__ -#define arg0 %rcx -#define arg1 %rdx -#define arg2 %r8 -#define arg3 %r9 -#else -#define SEH(...) -#define arg0 %rdi -#define arg1 %rsi -#define arg2 %rdx -#define arg3 %rcx -#endif - -/* This macro allows the safe creation of jump tables without an - actual table. The entry points into the table are all 8 bytes. - The use of ORG asserts that we're at the correct location. */ -/* ??? The clang assembler doesn't handle .org with symbolic expressions. */ -#if defined(__clang__) || defined(__APPLE__) || (defined (__sun__) && defined(__svr4__)) -# define E(BASE, X) .balign 8 -#else -# define E(BASE, X) .balign 8; .org BASE + (X) * 8 -#endif - - .text - -/* ffi_call_win64 (void *stack, struct win64_call_frame *frame, void *r10) - - Bit o trickiness here -- FRAME is the base of the stack frame - for this function. This has been allocated by ffi_call. We also - deallocate some of the stack that has been alloca'd. */ - - .align 8 - .globl C(ffi_call_win64) - FFI_HIDDEN(C(ffi_call_win64)) - - SEH(.seh_proc ffi_call_win64) -C(ffi_call_win64): - cfi_startproc - _CET_ENDBR - /* Set up the local stack frame and install it in rbp/rsp. */ - movq (%rsp), %rax - movq %rbp, (arg1) - movq %rax, 8(arg1) - movq arg1, %rbp - cfi_def_cfa(%rbp, 16) - cfi_rel_offset(%rbp, 0) - SEH(.seh_pushreg %rbp) - SEH(.seh_setframe %rbp, 0) - SEH(.seh_endprologue) - movq arg0, %rsp - - movq arg2, %r10 - - /* Load all slots into both general and xmm registers. */ - movq (%rsp), %rcx - movsd (%rsp), %xmm0 - movq 8(%rsp), %rdx - movsd 8(%rsp), %xmm1 - movq 16(%rsp), %r8 - movsd 16(%rsp), %xmm2 - movq 24(%rsp), %r9 - movsd 24(%rsp), %xmm3 - - call *16(%rbp) - - movl 24(%rbp), %ecx - movq 32(%rbp), %r8 - leaq 0f(%rip), %r10 - cmpl $FFI_TYPE_SMALL_STRUCT_4B, %ecx - leaq (%r10, %rcx, 8), %r10 - ja 99f - _CET_NOTRACK jmp *%r10 - -/* Below, we're space constrained most of the time. Thus we eschew the - modern "mov, pop, ret" sequence (5 bytes) for "leave, ret" (2 bytes). */ -.macro epilogue - leaveq - cfi_remember_state - cfi_def_cfa(%rsp, 8) - cfi_restore(%rbp) - ret - cfi_restore_state -.endm - - .align 8 -0: -E(0b, FFI_TYPE_VOID) - epilogue -E(0b, FFI_TYPE_INT) - movslq %eax, %rax - movq %rax, (%r8) - epilogue -E(0b, FFI_TYPE_FLOAT) - movss %xmm0, (%r8) - epilogue -E(0b, FFI_TYPE_DOUBLE) - movsd %xmm0, (%r8) - epilogue -// FFI_TYPE_LONGDOUBLE may be FFI_TYPE_DOUBLE but we need a different value here. -E(0b, FFI_TYPE_DOUBLE + 1) - call PLT(C(abort)) -E(0b, FFI_TYPE_UINT8) - movzbl %al, %eax - movq %rax, (%r8) - epilogue -E(0b, FFI_TYPE_SINT8) - movsbq %al, %rax - jmp 98f -E(0b, FFI_TYPE_UINT16) - movzwl %ax, %eax - movq %rax, (%r8) - epilogue -E(0b, FFI_TYPE_SINT16) - movswq %ax, %rax - jmp 98f -E(0b, FFI_TYPE_UINT32) - movl %eax, %eax - movq %rax, (%r8) - epilogue -E(0b, FFI_TYPE_SINT32) - movslq %eax, %rax - movq %rax, (%r8) - epilogue -E(0b, FFI_TYPE_UINT64) -98: movq %rax, (%r8) - epilogue -E(0b, FFI_TYPE_SINT64) - movq %rax, (%r8) - epilogue -E(0b, FFI_TYPE_STRUCT) - epilogue -E(0b, FFI_TYPE_POINTER) - movq %rax, (%r8) - epilogue -E(0b, FFI_TYPE_COMPLEX) - call PLT(C(abort)) -E(0b, FFI_TYPE_SMALL_STRUCT_1B) - movb %al, (%r8) - epilogue -E(0b, FFI_TYPE_SMALL_STRUCT_2B) - movw %ax, (%r8) - epilogue -E(0b, FFI_TYPE_SMALL_STRUCT_4B) - movl %eax, (%r8) - epilogue - - .align 8 -99: call PLT(C(abort)) - - epilogue - - cfi_endproc - SEH(.seh_endproc) - - -/* 32 bytes of outgoing register stack space, 8 bytes of alignment, - 16 bytes of result, 32 bytes of xmm registers. */ -#define ffi_clo_FS (32+8+16+32) -#define ffi_clo_OFF_R (32+8) -#define ffi_clo_OFF_X (32+8+16) - - .align 8 - .globl C(ffi_go_closure_win64) - FFI_HIDDEN(C(ffi_go_closure_win64)) - - SEH(.seh_proc ffi_go_closure_win64) -C(ffi_go_closure_win64): - cfi_startproc - _CET_ENDBR - /* Save all integer arguments into the incoming reg stack space. */ - movq %rcx, 8(%rsp) - movq %rdx, 16(%rsp) - movq %r8, 24(%rsp) - movq %r9, 32(%rsp) - - movq 8(%r10), %rcx /* load cif */ - movq 16(%r10), %rdx /* load fun */ - movq %r10, %r8 /* closure is user_data */ - jmp 0f - cfi_endproc - SEH(.seh_endproc) - - .align 8 - .globl C(ffi_closure_win64) - FFI_HIDDEN(C(ffi_closure_win64)) - - SEH(.seh_proc ffi_closure_win64) -C(ffi_closure_win64): - cfi_startproc - _CET_ENDBR - /* Save all integer arguments into the incoming reg stack space. */ - movq %rcx, 8(%rsp) - movq %rdx, 16(%rsp) - movq %r8, 24(%rsp) - movq %r9, 32(%rsp) - - movq FFI_TRAMPOLINE_SIZE(%r10), %rcx /* load cif */ - movq FFI_TRAMPOLINE_SIZE+8(%r10), %rdx /* load fun */ - movq FFI_TRAMPOLINE_SIZE+16(%r10), %r8 /* load user_data */ -0: - subq $ffi_clo_FS, %rsp - cfi_adjust_cfa_offset(ffi_clo_FS) - SEH(.seh_stackalloc ffi_clo_FS) - SEH(.seh_endprologue) - - /* Save all sse arguments into the stack frame. */ - movsd %xmm0, ffi_clo_OFF_X(%rsp) - movsd %xmm1, ffi_clo_OFF_X+8(%rsp) - movsd %xmm2, ffi_clo_OFF_X+16(%rsp) - movsd %xmm3, ffi_clo_OFF_X+24(%rsp) - - leaq ffi_clo_OFF_R(%rsp), %r9 - call PLT(C(ffi_closure_win64_inner)) - - /* Load the result into both possible result registers. */ - movq ffi_clo_OFF_R(%rsp), %rax - movsd ffi_clo_OFF_R(%rsp), %xmm0 - - addq $ffi_clo_FS, %rsp - cfi_adjust_cfa_offset(-ffi_clo_FS) - ret - - cfi_endproc - SEH(.seh_endproc) -#endif /* __x86_64__ */ - -#if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",@progbits -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/win64_intel.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/win64_intel.S deleted file mode 100644 index 970a4f9..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/x86/win64_intel.S +++ /dev/null @@ -1,238 +0,0 @@ -#define LIBFFI_ASM -#include -#include -#include -#include "asmnames.h" - -#if defined(HAVE_AS_CFI_PSEUDO_OP) - .cfi_sections .debug_frame -#endif - -#ifdef X86_WIN64 -#define SEH(...) __VA_ARGS__ -#define arg0 rcx -#define arg1 rdx -#define arg2 r8 -#define arg3 r9 -#else -#define SEH(...) -#define arg0 rdi -#define arg1 rsi -#define arg2 rdx -#define arg3 rcx -#endif - -/* This macro allows the safe creation of jump tables without an - actual table. The entry points into the table are all 8 bytes. - The use of ORG asserts that we're at the correct location. */ -/* ??? The clang assembler doesn't handle .org with symbolic expressions. */ -#if defined(__clang__) || defined(__APPLE__) || (defined (__sun__) && defined(__svr4__)) -# define E(BASE, X) ALIGN 8 -#else -# define E(BASE, X) ALIGN 8; ORG BASE + (X) * 8 -#endif - - .CODE - extern PLT(C(abort)):near - extern C(ffi_closure_win64_inner):near - -/* ffi_call_win64 (void *stack, struct win64_call_frame *frame, void *r10) - - Bit o trickiness here -- FRAME is the base of the stack frame - for this function. This has been allocated by ffi_call. We also - deallocate some of the stack that has been alloca'd. */ - - ALIGN 8 - PUBLIC C(ffi_call_win64) - - ; SEH(.safesh ffi_call_win64) -C(ffi_call_win64) proc SEH(frame) - cfi_startproc - /* Set up the local stack frame and install it in rbp/rsp. */ - mov RAX, [RSP] ; movq (%rsp), %rax - mov [arg1], RBP ; movq %rbp, (arg1) - mov [arg1 + 8], RAX; movq %rax, 8(arg1) - mov RBP, arg1; movq arg1, %rbp - cfi_def_cfa(rbp, 16) - cfi_rel_offset(rbp, 0) - SEH(.pushreg rbp) - SEH(.setframe rbp, 0) - SEH(.endprolog) - mov RSP, arg0 ; movq arg0, %rsp - - mov R10, arg2 ; movq arg2, %r10 - - /* Load all slots into both general and xmm registers. */ - mov RCX, [RSP] ; movq (%rsp), %rcx - movsd XMM0, qword ptr [RSP] ; movsd (%rsp), %xmm0 - mov RDX, [RSP + 8] ;movq 8(%rsp), %rdx - movsd XMM1, qword ptr [RSP + 8]; movsd 8(%rsp), %xmm1 - mov R8, [RSP + 16] ; movq 16(%rsp), %r8 - movsd XMM2, qword ptr [RSP + 16] ; movsd 16(%rsp), %xmm2 - mov R9, [RSP + 24] ; movq 24(%rsp), %r9 - movsd XMM3, qword ptr [RSP + 24] ;movsd 24(%rsp), %xmm3 - - CALL qword ptr [RBP + 16] ; call *16(%rbp) - - mov ECX, [RBP + 24] ; movl 24(%rbp), %ecx - mov R8, [RBP + 32] ; movq 32(%rbp), %r8 - LEA R10, ffi_call_win64_tab ; leaq 0f(%rip), %r10 - CMP ECX, FFI_TYPE_SMALL_STRUCT_4B ; cmpl $FFI_TYPE_SMALL_STRUCT_4B, %ecx - LEA R10, [R10 + RCX*8] ; leaq (%r10, %rcx, 8), %r10 - JA L99 ; ja 99f - JMP R10 ; jmp *%r10 - -/* Below, we're space constrained most of the time. Thus we eschew the - modern "mov, pop, ret" sequence (5 bytes) for "leave, ret" (2 bytes). */ -epilogue macro - LEAVE - cfi_remember_state - cfi_def_cfa(rsp, 8) - cfi_restore(rbp) - RET - cfi_restore_state -endm - - ALIGN 8 -ffi_call_win64_tab LABEL NEAR -E(0b, FFI_TYPE_VOID) - epilogue -E(0b, FFI_TYPE_INT) - movsxd rax, eax ; movslq %eax, %rax - mov qword ptr [r8], rax; movq %rax, (%r8) - epilogue -E(0b, FFI_TYPE_FLOAT) - movss dword ptr [r8], xmm0 ; movss %xmm0, (%r8) - epilogue -E(0b, FFI_TYPE_DOUBLE) - movsd qword ptr[r8], xmm0; movsd %xmm0, (%r8) - epilogue -// FFI_TYPE_LONGDOUBLE may be FFI_TYPE_DOUBLE but we need a different value here. -E(0b, FFI_TYPE_DOUBLE + 1) - call PLT(C(abort)) -E(0b, FFI_TYPE_UINT8) - movzx eax, al ;movzbl %al, %eax - mov qword ptr[r8], rax; movq %rax, (%r8) - epilogue -E(0b, FFI_TYPE_SINT8) - movsx rax, al ; movsbq %al, %rax - jmp L98 -E(0b, FFI_TYPE_UINT16) - movzx eax, ax ; movzwl %ax, %eax - mov qword ptr[r8], rax; movq %rax, (%r8) - epilogue -E(0b, FFI_TYPE_SINT16) - movsx rax, ax; movswq %ax, %rax - jmp L98 -E(0b, FFI_TYPE_UINT32) - mov eax, eax; movl %eax, %eax - mov qword ptr[r8], rax ; movq %rax, (%r8) - epilogue -E(0b, FFI_TYPE_SINT32) - movsxd rax, eax; movslq %eax, %rax - mov qword ptr [r8], rax; movq %rax, (%r8) - epilogue -E(0b, FFI_TYPE_UINT64) -L98 LABEL near - mov qword ptr [r8], rax ; movq %rax, (%r8) - epilogue -E(0b, FFI_TYPE_SINT64) - mov qword ptr [r8], rax;movq %rax, (%r8) - epilogue -E(0b, FFI_TYPE_STRUCT) - epilogue -E(0b, FFI_TYPE_POINTER) - mov qword ptr [r8], rax ;movq %rax, (%r8) - epilogue -E(0b, FFI_TYPE_COMPLEX) - call PLT(C(abort)) -E(0b, FFI_TYPE_SMALL_STRUCT_1B) - mov byte ptr [r8], al ; movb %al, (%r8) - epilogue -E(0b, FFI_TYPE_SMALL_STRUCT_2B) - mov word ptr [r8], ax ; movw %ax, (%r8) - epilogue -E(0b, FFI_TYPE_SMALL_STRUCT_4B) - mov dword ptr [r8], eax ; movl %eax, (%r8) - epilogue - - align 8 -L99 LABEL near - call PLT(C(abort)) - - epilogue - - cfi_endproc - C(ffi_call_win64) endp - - -/* 32 bytes of outgoing register stack space, 8 bytes of alignment, - 16 bytes of result, 32 bytes of xmm registers. */ -#define ffi_clo_FS (32+8+16+32) -#define ffi_clo_OFF_R (32+8) -#define ffi_clo_OFF_X (32+8+16) - - align 8 - PUBLIC C(ffi_go_closure_win64) - -C(ffi_go_closure_win64) proc - cfi_startproc - /* Save all integer arguments into the incoming reg stack space. */ - mov qword ptr [rsp + 8], rcx; movq %rcx, 8(%rsp) - mov qword ptr [rsp + 16], rdx; movq %rdx, 16(%rsp) - mov qword ptr [rsp + 24], r8; movq %r8, 24(%rsp) - mov qword ptr [rsp + 32], r9 ;movq %r9, 32(%rsp) - - mov rcx, qword ptr [r10 + 8]; movq 8(%r10), %rcx /* load cif */ - mov rdx, qword ptr [r10 + 16]; movq 16(%r10), %rdx /* load fun */ - mov r8, r10 ; movq %r10, %r8 /* closure is user_data */ - jmp ffi_closure_win64_2 - cfi_endproc - C(ffi_go_closure_win64) endp - - align 8 - -PUBLIC C(ffi_closure_win64) -C(ffi_closure_win64) PROC FRAME - cfi_startproc - /* Save all integer arguments into the incoming reg stack space. */ - mov qword ptr [rsp + 8], rcx; movq %rcx, 8(%rsp) - mov qword ptr [rsp + 16], rdx; movq %rdx, 16(%rsp) - mov qword ptr [rsp + 24], r8; movq %r8, 24(%rsp) - mov qword ptr [rsp + 32], r9; movq %r9, 32(%rsp) - - mov rcx, qword ptr [FFI_TRAMPOLINE_SIZE + r10] ;movq FFI_TRAMPOLINE_SIZE(%r10), %rcx /* load cif */ - mov rdx, qword ptr [FFI_TRAMPOLINE_SIZE + 8 + r10] ; movq FFI_TRAMPOLINE_SIZE+8(%r10), %rdx /* load fun */ - mov r8, qword ptr [FFI_TRAMPOLINE_SIZE+16+r10] ;movq FFI_TRAMPOLINE_SIZE+16(%r10), %r8 /* load user_data */ -ffi_closure_win64_2 LABEL near - sub rsp, ffi_clo_FS ;subq $ffi_clo_FS, %rsp - cfi_adjust_cfa_offset(ffi_clo_FS) - SEH(.allocstack ffi_clo_FS) - SEH(.endprolog) - - /* Save all sse arguments into the stack frame. */ - movsd qword ptr [ffi_clo_OFF_X + rsp], xmm0 ; movsd %xmm0, ffi_clo_OFF_X(%rsp) - movsd qword ptr [ffi_clo_OFF_X+8+rsp], xmm1 ; movsd %xmm1, ffi_clo_OFF_X+8(%rsp) - movsd qword ptr [ffi_clo_OFF_X+16+rsp], xmm2 ; movsd %xmm2, ffi_clo_OFF_X+16(%rsp) - movsd qword ptr [ffi_clo_OFF_X+24+rsp], xmm3 ; movsd %xmm3, ffi_clo_OFF_X+24(%rsp) - - lea r9, [ffi_clo_OFF_R + rsp] ; leaq ffi_clo_OFF_R(%rsp), %r9 - call C(ffi_closure_win64_inner) - - /* Load the result into both possible result registers. */ - - mov rax, qword ptr [ffi_clo_OFF_R + rsp] ;movq ffi_clo_OFF_R(%rsp), %rax - movsd xmm0, qword ptr [rsp + ffi_clo_OFF_R] ;movsd ffi_clo_OFF_R(%rsp), %xmm0 - - add rsp, ffi_clo_FS ;addq $ffi_clo_FS, %rsp - cfi_adjust_cfa_offset(-ffi_clo_FS) - ret - - cfi_endproc - C(ffi_closure_win64) endp - -#if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",@progbits -#endif -_text ends -end \ No newline at end of file diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/xtensa/ffi.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/xtensa/ffi.c deleted file mode 100644 index 9a0575f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/xtensa/ffi.c +++ /dev/null @@ -1,298 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2013 Tensilica, Inc. - - XTENSA Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#include -#include - -/* - |----------------------------------------| - | | - on entry to ffi_call ----> |----------------------------------------| - | caller stack frame for registers a0-a3 | - |----------------------------------------| - | | - | additional arguments | - entry of the function ---> |----------------------------------------| - | copy of function arguments a2-a7 | - | - - - - - - - - - - - - - | - | | - - The area below the entry line becomes the new stack frame for the function. - -*/ - - -#define FFI_TYPE_STRUCT_REGS FFI_TYPE_LAST - - -extern void ffi_call_SYSV(void *rvalue, unsigned rsize, unsigned flags, - void(*fn)(void), unsigned nbytes, extended_cif*); -extern void ffi_closure_SYSV(void) FFI_HIDDEN; - -ffi_status ffi_prep_cif_machdep(ffi_cif *cif) -{ - switch(cif->rtype->type) { - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: - cif->flags = cif->rtype->type; - break; - case FFI_TYPE_VOID: - case FFI_TYPE_FLOAT: - cif->flags = FFI_TYPE_UINT32; - break; - case FFI_TYPE_DOUBLE: - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - cif->flags = FFI_TYPE_UINT64; // cif->rtype->type; - break; - case FFI_TYPE_STRUCT: - cif->flags = FFI_TYPE_STRUCT; //_REGS; - /* Up to 16 bytes are returned in registers */ - if (cif->rtype->size > 4 * 4) { - /* returned structure is referenced by a register; use 8 bytes - (including 4 bytes for potential additional alignment) */ - cif->flags = FFI_TYPE_STRUCT; - cif->bytes += 8; - } - break; - - default: - cif->flags = FFI_TYPE_UINT32; - break; - } - - /* Round the stack up to a full 4 register frame, just in case - (we use this size in movsp). This way, it's also a multiple of - 8 bytes for 64-bit arguments. */ - cif->bytes = FFI_ALIGN(cif->bytes, 16); - - return FFI_OK; -} - -void ffi_prep_args(extended_cif *ecif, unsigned char* stack) -{ - unsigned int i; - unsigned long *addr; - ffi_type **ptr; - - union { - void **v; - char **c; - signed char **sc; - unsigned char **uc; - signed short **ss; - unsigned short **us; - unsigned int **i; - long long **ll; - float **f; - double **d; - } p_argv; - - /* Verify that everything is aligned up properly */ - FFI_ASSERT (((unsigned long) stack & 0x7) == 0); - - p_argv.v = ecif->avalue; - addr = (unsigned long*)stack; - - /* structures with a size greater than 16 bytes are passed in memory */ - if (ecif->cif->rtype->type == FFI_TYPE_STRUCT && ecif->cif->rtype->size > 16) - { - *addr++ = (unsigned long)ecif->rvalue; - } - - for (i = ecif->cif->nargs, ptr = ecif->cif->arg_types; - i > 0; - i--, ptr++, p_argv.v++) - { - switch ((*ptr)->type) - { - case FFI_TYPE_SINT8: - *addr++ = **p_argv.sc; - break; - case FFI_TYPE_UINT8: - *addr++ = **p_argv.uc; - break; - case FFI_TYPE_SINT16: - *addr++ = **p_argv.ss; - break; - case FFI_TYPE_UINT16: - *addr++ = **p_argv.us; - break; - case FFI_TYPE_FLOAT: - case FFI_TYPE_INT: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - case FFI_TYPE_POINTER: - *addr++ = **p_argv.i; - break; - case FFI_TYPE_DOUBLE: - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - if (((unsigned long)addr & 4) != 0) - addr++; - *(unsigned long long*)addr = **p_argv.ll; - addr += sizeof(unsigned long long) / sizeof (addr); - break; - - case FFI_TYPE_STRUCT: - { - unsigned long offs; - unsigned long size; - - if (((unsigned long)addr & 4) != 0 && (*ptr)->alignment > 4) - addr++; - - offs = (unsigned long) addr - (unsigned long) stack; - size = (*ptr)->size; - - /* Entire structure must fit the argument registers or referenced */ - if (offs < FFI_REGISTER_NARGS * 4 - && offs + size > FFI_REGISTER_NARGS * 4) - addr = (unsigned long*) (stack + FFI_REGISTER_NARGS * 4); - - memcpy((char*) addr, *p_argv.c, size); - addr += (size + 3) / 4; - break; - } - - default: - FFI_ASSERT(0); - } - } -} - - -void ffi_call(ffi_cif* cif, void(*fn)(void), void *rvalue, void **avalue) -{ - extended_cif ecif; - unsigned long rsize = cif->rtype->size; - int flags = cif->flags; - void *alloc = NULL; - - ecif.cif = cif; - ecif.avalue = avalue; - - /* Note that for structures that are returned in registers (size <= 16 bytes) - we allocate a temporary buffer and use memcpy to copy it to the final - destination. The reason is that the target address might be misaligned or - the length not a multiple of 4 bytes. Handling all those cases would be - very complex. */ - - if (flags == FFI_TYPE_STRUCT && (rsize <= 16 || rvalue == NULL)) - { - alloc = alloca(FFI_ALIGN(rsize, 4)); - ecif.rvalue = alloc; - } - else - { - ecif.rvalue = rvalue; - } - - if (cif->abi != FFI_SYSV) - FFI_ASSERT(0); - - ffi_call_SYSV (ecif.rvalue, rsize, cif->flags, fn, cif->bytes, &ecif); - - if (alloc != NULL && rvalue != NULL) - memcpy(rvalue, alloc, rsize); -} - -extern void ffi_trampoline(); -extern void ffi_cacheflush(void* start, void* end); - -ffi_status -ffi_prep_closure_loc (ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, - void *codeloc) -{ - /* copye trampoline to stack and patch 'ffi_closure_SYSV' pointer */ - memcpy(closure->tramp, ffi_trampoline, FFI_TRAMPOLINE_SIZE); - *(unsigned int*)(&closure->tramp[8]) = (unsigned int)ffi_closure_SYSV; - - // Do we have this function? - // __builtin___clear_cache(closer->tramp, closer->tramp + FFI_TRAMPOLINE_SIZE) - ffi_cacheflush(closure->tramp, closure->tramp + FFI_TRAMPOLINE_SIZE); - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - return FFI_OK; -} - - -long FFI_HIDDEN -ffi_closure_SYSV_inner(ffi_closure *closure, void **values, void *rvalue) -{ - ffi_cif *cif; - ffi_type **arg_types; - void **avalue; - int i, areg; - - cif = closure->cif; - if (cif->abi != FFI_SYSV) - return FFI_BAD_ABI; - - areg = 0; - - int rtype = cif->rtype->type; - if (rtype == FFI_TYPE_STRUCT && cif->rtype->size > 4 * 4) - { - rvalue = *values; - areg++; - } - - cif = closure->cif; - arg_types = cif->arg_types; - avalue = alloca(cif->nargs * sizeof(void *)); - - for (i = 0; i < cif->nargs; i++) - { - if (arg_types[i]->alignment == 8 && (areg & 1) != 0) - areg++; - - // skip the entry 16,a1 framework, add 16 bytes (4 registers) - if (areg == FFI_REGISTER_NARGS) - areg += 4; - - if (arg_types[i]->type == FFI_TYPE_STRUCT) - { - int numregs = ((arg_types[i]->size + 3) & ~3) / 4; - if (areg < FFI_REGISTER_NARGS && areg + numregs > FFI_REGISTER_NARGS) - areg = FFI_REGISTER_NARGS + 4; - } - - avalue[i] = &values[areg]; - areg += (arg_types[i]->size + 3) / 4; - } - - (closure->fun)(cif, rvalue, avalue, closure->user_data); - - return rtype; -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/xtensa/ffitarget.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/xtensa/ffitarget.h deleted file mode 100644 index 0ba728b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/xtensa/ffitarget.h +++ /dev/null @@ -1,53 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2013 Tensilica, Inc. - Target configuration macros for XTENSA. - - 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. - ----------------------------------------------------------------------- */ - -#ifndef LIBFFI_TARGET_H -#define LIBFFI_TARGET_H - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_SYSV, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_SYSV -} ffi_abi; -#endif - -#define FFI_REGISTER_NARGS 6 - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_NATIVE_RAW_API 0 -#define FFI_TRAMPOLINE_SIZE 24 - -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/xtensa/sysv.S b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/xtensa/sysv.S deleted file mode 100644 index e942179..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/src/xtensa/sysv.S +++ /dev/null @@ -1,258 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.S - Copyright (c) 2013 Tensilica, Inc. - - XTENSA Foreign Function Interface - - 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. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include - -#define ENTRY(name) .text; .globl name; .type name,@function; .align 4; name: -#define END(name) .size name , . - name - -/* Assert that the table below is in sync with ffi.h. */ - -#if FFI_TYPE_UINT8 != 5 \ - || FFI_TYPE_SINT8 != 6 \ - || FFI_TYPE_UINT16 != 7 \ - || FFI_TYPE_SINT16 != 8 \ - || FFI_TYPE_UINT32 != 9 \ - || FFI_TYPE_SINT32 != 10 \ - || FFI_TYPE_UINT64 != 11 -#error "xtensa/sysv.S out of sync with ffi.h" -#endif - - -/* ffi_call_SYSV (rvalue, rbytes, flags, (*fnaddr)(), bytes, ecif) - void *rvalue; a2 - unsigned long rbytes; a3 - unsigned flags; a4 - void (*fnaddr)(); a5 - unsigned long bytes; a6 - extended_cif* ecif) a7 -*/ - -ENTRY(ffi_call_SYSV) - - entry a1, 32 # 32 byte frame for using call8 below - - mov a10, a7 # a10(->arg0): ecif - sub a11, a1, a6 # a11(->arg1): stack pointer - mov a7, a1 # fp - movsp a1, a11 # set new sp = old_sp - bytes - - movi a8, ffi_prep_args - callx8 a8 # ffi_prep_args(ecif, stack) - - # prepare to move stack pointer back up to 6 arguments - # note that 'bytes' is already aligned - - movi a10, 6*4 - sub a11, a6, a10 - movgez a6, a10, a11 - add a6, a1, a6 - - - # we can pass up to 6 arguments in registers - # for simplicity, just load 6 arguments - # (the stack size is at least 32 bytes, so no risk to cross boundaries) - - l32i a10, a1, 0 - l32i a11, a1, 4 - l32i a12, a1, 8 - l32i a13, a1, 12 - l32i a14, a1, 16 - l32i a15, a1, 20 - - # move stack pointer - - movsp a1, a6 - - callx8 a5 # (*fn)(args...) - - # Handle return value(s) - - beqz a2, .Lexit - - movi a5, FFI_TYPE_STRUCT - bne a4, a5, .Lstore - movi a5, 16 - blt a5, a3, .Lexit - - s32i a10, a2, 0 - blti a3, 5, .Lexit - addi a3, a3, -1 - s32i a11, a2, 4 - blti a3, 8, .Lexit - s32i a12, a2, 8 - blti a3, 12, .Lexit - s32i a13, a2, 12 - -.Lexit: retw - -.Lstore: - addi a4, a4, -FFI_TYPE_UINT8 - bgei a4, 7, .Lexit # should never happen - movi a6, store_calls - add a4, a4, a4 - addx4 a6, a4, a6 # store_table + idx * 8 - jx a6 - - .align 8 -store_calls: - # UINT8 - s8i a10, a2, 0 - retw - - # SINT8 - .align 8 - s8i a10, a2, 0 - retw - - # UINT16 - .align 8 - s16i a10, a2, 0 - retw - - # SINT16 - .align 8 - s16i a10, a2, 0 - retw - - # UINT32 - .align 8 - s32i a10, a2, 0 - retw - - # SINT32 - .align 8 - s32i a10, a2, 0 - retw - - # UINT64 - .align 8 - s32i a10, a2, 0 - s32i a11, a2, 4 - retw - -END(ffi_call_SYSV) - - -/* - * void ffi_cacheflush (unsigned long start, unsigned long end) - */ - -#define EXTRA_ARGS_SIZE 24 - -ENTRY(ffi_cacheflush) - - entry a1, 16 - -1: -#if XCHAL_DCACHE_SIZE - dhwbi a2, 0 -#endif -#if XCHAL_ICACHE_SIZE - ihi a2, 0 -#endif - addi a2, a2, 4 - blt a2, a3, 1b - - retw - -END(ffi_cacheflush) - -/* ffi_trampoline is copied to the stack */ - -ENTRY(ffi_trampoline) - - entry a1, 16 + (FFI_REGISTER_NARGS * 4) + (4 * 4) # [ 0] - j 2f # [ 3] - .align 4 # [ 6] -1: .long 0 # [ 8] -2: l32r a15, 1b # [12] - _mov a14, a0 # [15] - callx0 a15 # [18] - # [21] -END(ffi_trampoline) - -/* - * ffi_closure() - * - * a0: closure + 21 - * a14: return address (a0) - */ - -ENTRY(ffi_closure_SYSV) - - /* intentionally omitting entry here */ - - # restore return address (a0) and move pointer to closure to a10 - addi a10, a0, -21 - mov a0, a14 - - # allow up to 4 arguments as return values - addi a11, a1, 4 * 4 - - # save up to 6 arguments to stack (allocated by entry below) - s32i a2, a11, 0 - s32i a3, a11, 4 - s32i a4, a11, 8 - s32i a5, a11, 12 - s32i a6, a11, 16 - s32i a7, a11, 20 - - movi a8, ffi_closure_SYSV_inner - mov a12, a1 - callx8 a8 # .._inner(*closure, **avalue, *rvalue) - - # load up to four return arguments - l32i a2, a1, 0 - l32i a3, a1, 4 - l32i a4, a1, 8 - l32i a5, a1, 12 - - # (sign-)extend return value - movi a11, FFI_TYPE_UINT8 - bne a10, a11, 1f - extui a2, a2, 0, 8 - retw - -1: movi a11, FFI_TYPE_SINT8 - bne a10, a11, 1f - sext a2, a2, 7 - retw - -1: movi a11, FFI_TYPE_UINT16 - bne a10, a11, 1f - extui a2, a2, 0, 16 - retw - -1: movi a11, FFI_TYPE_SINT16 - bne a10, a11, 1f - sext a2, a2, 15 - -1: retw - -END(ffi_closure_SYSV) diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/stamp-h.in b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/stamp-h.in deleted file mode 100644 index 9788f70..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/stamp-h.in +++ /dev/null @@ -1 +0,0 @@ -timestamp diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/Makefile.am b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/Makefile.am deleted file mode 100644 index bcfea57..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/Makefile.am +++ /dev/null @@ -1,122 +0,0 @@ -## Process this file with automake to produce Makefile.in. - -AUTOMAKE_OPTIONS = foreign dejagnu - -EXTRA_DEJAGNU_SITE_CONFIG=../local.exp - -CLEANFILES = *.exe core* *.log *.sum - -EXTRA_DIST = lib/target-libpath.exp lib/libffi.exp lib/wrapper.exp \ -libffi.call/strlen4.c libffi.call/struct10.c libffi.call/many_mixed.c \ -libffi.call/float.c libffi.call/struct5.c libffi.call/return_fl3.c \ -libffi.call/return_fl1.c libffi.call/call.exp libffi.call/pyobjc-tc.c \ -libffi.call/float_va.c libffi.call/struct8.c libffi.call/pr1172638.c \ -libffi.call/return_sc.c libffi.call/va_struct1.c \ -libffi.call/align_stdcall.c libffi.call/struct9.c libffi.call/va_1.c \ -libffi.call/va_struct2.c libffi.call/return_fl2.c \ -libffi.call/align_mixed.c libffi.call/ffitest.h libffi.call/struct4.c \ -libffi.call/return_ldl.c libffi.call/float3.c libffi.call/return_sl.c \ -libffi.call/return_dbl1.c libffi.call/err_bad_typedef.c \ -libffi.call/return_ll1.c libffi.call/return_dbl2.c \ -libffi.call/negint.c libffi.closures/nested_struct3.c \ -libffi.call/struct2.c libffi.call/struct3.c libffi.call/return_fl.c \ -libffi.call/offsets.c libffi.call/struct7.c libffi.call/va_struct3.c \ -libffi.call/float1.c libffi.call/uninitialized.c libffi.call/many2.c \ -libffi.call/struct6.c libffi.call/strlen2.c libffi.call/float2.c \ -libffi.call/return_ul.c libffi.call/struct1.c libffi.call/strlen3.c \ -libffi.call/return_dbl.c libffi.call/float4.c libffi.call/many.c \ -libffi.call/strlen.c libffi.call/return_uc.c libffi.call/many_double.c \ -libffi.call/return_ll.c libffi.call/promotion.c \ -libffi.complex/complex_defs_longdouble.inc \ -libffi.complex/cls_align_complex_float.c \ -libffi.complex/cls_complex_va_float.c \ -libffi.complex/cls_complex_struct_float.c \ -libffi.complex/return_complex2_longdouble.c \ -libffi.complex/cls_complex_float.c \ -libffi.complex/return_complex_longdouble.c \ -libffi.complex/return_complex2_float.c libffi.complex/cls_complex.inc \ -libffi.complex/cls_complex_va_longdouble.c \ -libffi.complex/return_complex_double.c \ -libffi.complex/return_complex.inc libffi.complex/many_complex.inc \ -libffi.complex/complex_float.c libffi.complex/cls_align_complex.inc \ -libffi.complex/return_complex2_double.c \ -libffi.complex/many_complex_float.c libffi.complex/ffitest.h \ -libffi.complex/return_complex1_double.c \ -libffi.complex/cls_complex_struct_longdouble.c \ -libffi.complex/complex_defs_double.inc \ -libffi.complex/cls_complex_va_double.c \ -libffi.complex/many_complex_double.c \ -libffi.complex/return_complex2.inc \ -libffi.complex/return_complex1_float.c \ -libffi.complex/complex_longdouble.c \ -libffi.complex/complex_defs_float.inc \ -libffi.complex/cls_complex_double.c \ -libffi.complex/cls_align_complex_double.c \ -libffi.complex/cls_align_complex_longdouble.c \ -libffi.complex/complex_double.c libffi.complex/cls_complex_va.inc \ -libffi.complex/many_complex_longdouble.c libffi.complex/complex.inc \ -libffi.complex/return_complex1_longdouble.c \ -libffi.complex/complex_int.c libffi.complex/cls_complex_longdouble.c \ -libffi.complex/cls_complex_struct_double.c \ -libffi.complex/return_complex1.inc libffi.complex/complex.exp \ -libffi.complex/cls_complex_struct.inc \ -libffi.complex/return_complex_float.c libffi.go/closure1.c \ -libffi.go/aa-direct.c libffi.go/ffitest.h libffi.go/go.exp \ -libffi.go/static-chain.h libffi.bhaible/bhaible.exp \ -libffi.bhaible/test-call.c libffi.bhaible/alignof.h \ -libffi.bhaible/testcases.c libffi.bhaible/test-callback.c \ -libffi.bhaible/Makefile libffi.bhaible/README config/default.exp \ -libffi.closures/cls_multi_sshort.c \ -libffi.closures/cls_align_longdouble_split2.c \ -libffi.closures/cls_1_1byte.c libffi.closures/cls_uint_va.c \ -libffi.closures/cls_3_1byte.c libffi.closures/cls_many_mixed_args.c \ -libffi.closures/cls_20byte1.c libffi.closures/cls_pointer_stack.c \ -libffi.closures/cls_align_float.c libffi.closures/cls_5_1_byte.c \ -libffi.closures/cls_9byte1.c libffi.closures/cls_align_uint32.c \ -libffi.closures/stret_medium.c libffi.closures/cls_3byte1.c \ -libffi.closures/cls_align_uint64.c libffi.closures/cls_longdouble_va.c \ -libffi.closures/cls_align_pointer.c libffi.closures/cls_19byte.c \ -libffi.closures/cls_ushort.c libffi.closures/cls_align_sint32.c \ -libffi.closures/cls_ulonglong.c libffi.closures/cls_struct_va1.c \ -libffi.closures/cls_9byte2.c libffi.closures/closure_fn5.c \ -libffi.closures/cls_5byte.c libffi.closures/cls_3float.c \ -libffi.closures/closure.exp libffi.closures/cls_schar.c \ -libffi.closures/closure_fn4.c libffi.closures/cls_uchar_va.c \ -libffi.closures/closure_fn0.c libffi.closures/huge_struct.c \ -libffi.closures/cls_ushort_va.c \ -libffi.closures/cls_64byte.c libffi.closures/cls_longdouble.c \ -libffi.closures/cls_ulong_va.c libffi.closures/cls_6_1_byte.c \ -libffi.closures/cls_align_uint16.c libffi.closures/closure_fn2.c \ -libffi.closures/unwindtest_ffi_call.cc \ -libffi.closures/cls_multi_ushortchar.c libffi.closures/cls_8byte.c \ -libffi.closures/ffitest.h libffi.closures/nested_struct8.c \ -libffi.closures/cls_pointer.c libffi.closures/nested_struct2.c \ -libffi.closures/nested_struct.c libffi.closures/cls_multi_schar.c \ -libffi.closures/cls_align_longdouble_split.c \ -libffi.closures/cls_uchar.c libffi.closures/nested_struct9.c \ -libffi.closures/cls_float.c libffi.closures/stret_medium2.c \ -libffi.closures/closure_loc_fn0.c libffi.closures/cls_6byte.c \ -libffi.closures/closure_simple.c libffi.closures/cls_align_double.c \ -libffi.closures/cls_multi_uchar.c libffi.closures/cls_4_1byte.c \ -libffi.closures/closure_fn3.c libffi.closures/cls_align_sint64.c \ -libffi.closures/nested_struct1.c libffi.closures/unwindtest.cc \ -libffi.closures/nested_struct5.c libffi.closures/cls_multi_ushort.c \ -libffi.closures/nested_struct11.c \ -libffi.closures/cls_multi_sshortchar.c \ -libffi.closures/cls_align_longdouble.c \ -libffi.closures/cls_dbls_struct.c \ -libffi.closures/cls_many_mixed_float_double.c \ -libffi.closures/stret_large.c libffi.closures/stret_large2.c \ -libffi.closures/cls_align_sint16.c libffi.closures/cls_2byte.c \ -libffi.closures/nested_struct4.c libffi.closures/problem1.c \ -libffi.closures/testclosure.c libffi.closures/nested_struct6.c \ -libffi.closures/cls_4byte.c libffi.closures/cls_24byte.c \ -libffi.closures/nested_struct10.c libffi.closures/cls_uint.c \ -libffi.closures/cls_12byte.c libffi.closures/cls_sint.c \ -libffi.closures/cls_7_1_byte.c libffi.closures/cls_sshort.c \ -libffi.closures/cls_16byte.c libffi.closures/nested_struct7.c \ -libffi.closures/cls_double_va.c libffi.closures/cls_3byte2.c \ -libffi.closures/cls_double.c libffi.closures/cls_7byte.c \ -libffi.closures/closure_fn6.c libffi.closures/closure_fn1.c \ -libffi.closures/cls_20byte.c libffi.closures/cls_18byte.c \ -libffi.closures/err_bad_abi.c diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/config/default.exp b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/config/default.exp deleted file mode 100644 index 90967cc..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/config/default.exp +++ /dev/null @@ -1 +0,0 @@ -load_lib "standard.exp" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.bhaible/Makefile b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.bhaible/Makefile deleted file mode 100644 index 3322de9..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.bhaible/Makefile +++ /dev/null @@ -1,28 +0,0 @@ -CC = gcc -CFLAGS = -O2 -Wall -prefix = -includedir = $(prefix)/include -libdir = $(prefix)/lib -CPPFLAGS = -I$(includedir) -LDFLAGS = -L$(libdir) -Wl,-rpath,$(libdir) - -all: check-call check-callback - -test-call: test-call.c testcases.c - $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -o test-call test-call.c -lffi - -test-callback: test-callback.c testcases.c - $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -o test-callback test-callback.c -lffi - -check-call: test-call - ./test-call > test-call.out - LC_ALL=C uniq -u < test-call.out > failed-call - test '!' -s failed-call - -check-callback: test-callback - ./test-callback > test-callback.out - LC_ALL=C uniq -u < test-callback.out > failed-callback - test '!' -s failed-callback - -clean: - rm -f test-call test-callback test-call.out test-callback.out failed-call failed-callback diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.bhaible/README b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.bhaible/README deleted file mode 100644 index be8540b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.bhaible/README +++ /dev/null @@ -1,78 +0,0 @@ -This package contains a test suite for libffi. - -This test suite can be compiled with a C compiler. No need for 'expect' -or some other package that is often not installed. - -The test suite consists of 81 C functions, each with a different signature. -* test-call verifies that calling each function directly produces the same - results as calling the function indirectly through 'ffi_call'. -* test-callback verifies that calling each function directly produces the same - results as calling a function that is a callback (object build by - 'ffi_prep_closure_loc') and simulates the original function. - -Each direct or indirect invocation should produce one line of output to -stdout. A correct output consists of paired lines, such as - -void f(void): -void f(void): -int f(void):->99 -int f(void):->99 -int f(int):(1)->2 -int f(int):(1)->2 -int f(2*int):(1,2)->3 -int f(2*int):(1,2)->3 -... - -The Makefile then creates two files: -* failed-call, which consists of the non-paired lines of output of - 'test-call', -* failed-callback, which consists of the non-paired lines of output of - 'test-callback'. - -The test suite passes if both failed-call and failed-callback come out -as empty. - - -How to use the test suite -------------------------- - -1. Modify the Makefile's variables - prefix = the directory in which libffi was installed - CC = the C compiler, often with options such as "-m32" or "-m64" - that enforce a certain ABI, - CFLAGS = optimization options (need to change them only for non-GCC - compilers) -2. Run "make". If it fails already in "test-call", run also - "make check-callback". -3. If this failed, inspect the output files. - - -How to interpret the results ----------------------------- - -The failed-call and failed-callback files consist of paired lines: -The first line is the result of the direct invocation. -The second line is the result of invocation through libffi. - -For example, this output - -uchar f(uchar,ushort,uint,ulong):(97,2,3,4)->255 -uchar f(uchar,ushort,uint,ulong):(97,2,3,4)->0 - -indicates that the arguments were passed correctly, but the return -value came out wrong. - -And this output - -float f(17*float,3*int,L):(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,6,7,8,561,1105,1729,2465,2821,6601)->15319.1 -float f(17*float,3*int,L):(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,-140443648,10,268042216,-72537980,-140443648,-140443648,-140443648,-140443648,-140443648)->-6.47158e+08 - -indicates that integer arguments that come after 17 floating-point arguments -were not passed correctly. - - -Credits -------- - -The test suite is based on the one of GNU libffcall-2.0. -Authors: Bill Triggs, Bruno Haible diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.bhaible/alignof.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.bhaible/alignof.h deleted file mode 100644 index 00604a5..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.bhaible/alignof.h +++ /dev/null @@ -1,50 +0,0 @@ -/* Determine alignment of types. - Copyright (C) 2003-2004, 2006, 2009-2017 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, see . */ - -#ifndef _ALIGNOF_H -#define _ALIGNOF_H - -#include - -/* alignof_slot (TYPE) - Determine the alignment of a structure slot (field) of a given type, - at compile time. Note that the result depends on the ABI. - This is the same as alignof (TYPE) and _Alignof (TYPE), defined in - if __alignof_is_defined is 1. - Note: The result cannot be used as a value for an 'enum' constant, - due to bugs in HP-UX 10.20 cc and AIX 3.2.5 xlc. */ -#if defined __cplusplus - template struct alignof_helper { char __slot1; type __slot2; }; -# define alignof_slot(type) offsetof (alignof_helper, __slot2) -#else -# define alignof_slot(type) offsetof (struct { char __slot1; type __slot2; }, __slot2) -#endif - -/* alignof_type (TYPE) - Determine the good alignment of an object of the given type at compile time. - Note that this is not necessarily the same as alignof_slot(type). - For example, with GNU C on x86 platforms: alignof_type(double) = 8, but - - when -malign-double is not specified: alignof_slot(double) = 4, - - when -malign-double is specified: alignof_slot(double) = 8. - Note: The result cannot be used as a value for an 'enum' constant, - due to bugs in HP-UX 10.20 cc and AIX 3.2.5 xlc. */ -#if defined __GNUC__ || defined __IBM__ALIGNOF__ -# define alignof_type __alignof__ -#else -# define alignof_type alignof_slot -#endif - -#endif /* _ALIGNOF_H */ diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.bhaible/bhaible.exp b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.bhaible/bhaible.exp deleted file mode 100644 index 44aebc5..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.bhaible/bhaible.exp +++ /dev/null @@ -1,63 +0,0 @@ -# Copyright (C) 2003, 2006, 2009, 2010, 2014, 2018 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; see the file COPYING3. If not see -# . - -dg-init -libffi-init - -global srcdir subdir -global compiler_vendor - -# The conversion of this testsuite into a dejagnu compatible testsuite -# was done in a pretty lazy fashion, and requires the use of compiler -# flags to disable warnings for now. -if { [string match $compiler_vendor "gnu"] } { - set warning_options "-Wno-unused-variable -Wno-unused-parameter -Wno-unused-but-set-variable -Wno-uninitialized"; -} -if { [string match $compiler_vendor "microsoft"] } { - # -wd4996 suggest use of vsprintf_s instead of vsprintf - # -wd4116 unnamed type definition - # -wd4101 unreferenced local variable - # -wd4244 warning about implicit double to float conversion - set warning_options "-wd4996 -wd4116 -wd4101 -wd4244"; -} -if { ![string match $compiler_vendor "microsoft"] && ![string match $compiler_vendor "gnu"] } { - set warning_options "-Wno-unused-variable -Wno-unused-parameter -Wno-uninitialized"; -} - - -set tlist [lsort [glob -nocomplain -- $srcdir/$subdir/test-call.c]] - -for {set i 1} {$i < 82} {incr i} { - run-many-tests $tlist [format "-DDGTEST=%d %s" $i $warning_options] -} - -set tlist [lsort [glob -nocomplain -- $srcdir/$subdir/test-callback.c]] - -for {set i 1} {$i < 81} {incr i} { - if { [libffi_feature_test "#if FFI_CLOSURES"] } { - run-many-tests $tlist [format "-DDGTEST=%d %s" $i $warning_options] - } else { - foreach test $tlist { - unsupported [format "%s -DDGTEST=%d %s" $test $i $warning_options] - } - } -} - -dg-finish - -# Local Variables: -# tcl-indent-level:4 -# End: diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c deleted file mode 100644 index cf9219e..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c +++ /dev/null @@ -1,1745 +0,0 @@ -/** - Copyright 1993 Bill Triggs - Copyright 1995-2017 Bruno Haible - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -**/ - -/* { dg-do run { xfail gccbug } } */ - -#include -#include -#include -#include -#include "alignof.h" -#include - -/* libffi testsuite local changes -------------------------------- */ -#ifdef DGTEST -/* Redefine exit(1) as a test failure */ -#define exit(V) (void)((V) ? (abort(), 1) : exit(0)) -int count = 0; -char rbuf1[2048]; -char rbuf2[2048]; -int _fprintf(FILE *stream, const char *format, ...) -{ - va_list args; - va_start(args, format); - - switch (count++) - { - case 0: - case 1: - vsprintf(&rbuf1[strlen(rbuf1)], format, args); - break; - case 2: - printf("%s", rbuf1); - vsprintf(rbuf2, format, args); - break; - case 3: - vsprintf(&rbuf2[strlen(rbuf2)], format, args); - printf("%s", rbuf2); - if (strcmp (rbuf1, rbuf2)) abort(); - break; - } - - va_end(args); - - return 0; -} -#define fprintf _fprintf -#endif -/* --------------------------------------------------------------- */ - -#include "testcases.c" - -#ifndef ABI_NUM -#define ABI_NUM FFI_DEFAULT_ABI -#endif - -/* Definitions that ought to be part of libffi. */ -static ffi_type ffi_type_char; -#define ffi_type_slonglong ffi_type_sint64 -#define ffi_type_ulonglong ffi_type_uint64 - -/* libffi does not support arrays inside structs. */ -#define SKIP_EXTRA_STRUCTS - -#define FFI_PREP_CIF(cif,argtypes,rettype) \ - if (ffi_prep_cif(&(cif),ABI_NUM,sizeof(argtypes)/sizeof(argtypes[0]),&rettype,argtypes) != FFI_OK) abort() -#define FFI_PREP_CIF_NOARGS(cif,rettype) \ - if (ffi_prep_cif(&(cif),ABI_NUM,0,&rettype,NULL) != FFI_OK) abort() -#define FFI_CALL(cif,fn,args,retaddr) \ - ffi_call(&(cif),(void(*)(void))(fn),retaddr,args) - -long clear_traces_i (long a, long b, long c, long d, long e, long f, long g, long h, - long i, long j, long k, long l, long m, long n, long o, long p) -{ return 0; } -float clear_traces_f (float a, float b, float c, float d, float e, float f, float g, - float h, float i, float j, float k, float l, float m, float n, - float o, float p) -{ return 0.0; } -double clear_traces_d (double a, double b, double c, double d, double e, double f, double g, - double h, double i, double j, double k, double l, double m, double n, - double o, double p) -{ return 0.0; } -J clear_traces_J (void) -{ J j; j.l1 = j.l2 = 0; return j; } -void clear_traces (void) -{ clear_traces_i(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); - clear_traces_f(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.0,0.0,0.0,0.0); - clear_traces_d(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.0,0.0,0.0,0.0); - clear_traces_J(); -} - -void - void_tests (void) -{ -#if (!defined(DGTEST)) || DGTEST == 1 - v_v(); - clear_traces(); - { - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_void); - { - FFI_CALL(cif,v_v,NULL,NULL); - } - } -#endif - return; -} -void - int_tests (void) -{ - int ir; - ffi_arg retvalue; -#if (!defined(DGTEST)) || DGTEST == 2 - ir = i_v(); - fprintf(out,"->%d\n",ir); - fflush(out); - ir = 0; clear_traces(); - { - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_sint); - { - FFI_CALL(cif,i_v,NULL,&retvalue); - ir = retvalue; - } - } - fprintf(out,"->%d\n",ir); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 3 - ir = i_i(i1); - fprintf(out,"->%d\n",ir); - fflush(out); - ir = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_sint); - { - /*const*/ void* args[] = { &i1 }; - FFI_CALL(cif,i_i,args,&retvalue); - ir = retvalue; - } - } - fprintf(out,"->%d\n",ir); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 4 - ir = i_i2(i1,i2); - fprintf(out,"->%d\n",ir); - fflush(out); - ir = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_sint); - { - /*const*/ void* args[] = { &i1, &i2 }; - FFI_CALL(cif,i_i2,args,&retvalue); - ir = retvalue; - } - } - fprintf(out,"->%d\n",ir); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 5 - ir = i_i4(i1,i2,i3,i4); - fprintf(out,"->%d\n",ir); - fflush(out); - ir = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_sint); - { - /*const*/ void* args[] = { &i1, &i2, &i3, &i4 }; - FFI_CALL(cif,i_i4,args,&retvalue); - ir = retvalue; - } - } - fprintf(out,"->%d\n",ir); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 6 - ir = i_i8(i1,i2,i3,i4,i5,i6,i7,i8); - fprintf(out,"->%d\n",ir); - fflush(out); - ir = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_sint); - { - /*const*/ void* args[] = { &i1, &i2, &i3, &i4, &i5, &i6, &i7, &i8 }; - FFI_CALL(cif,i_i8,args,&retvalue); - ir = retvalue; - } - } - fprintf(out,"->%d\n",ir); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 7 - ir = i_i16(i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13,i14,i15,i16); - fprintf(out,"->%d\n",ir); - fflush(out); - ir = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_sint); - { - /*const*/ void* args[] = { &i1, &i2, &i3, &i4, &i5, &i6, &i7, &i8, &i9, &i10, &i11, &i12, &i13, &i14, &i15, &i16 }; - FFI_CALL(cif,i_i16,args,&retvalue); - ir = retvalue; - } - } - fprintf(out,"->%d\n",ir); - fflush(out); -#endif - - return; -} -void - float_tests (void) -{ - float fr; - -#if (!defined(DGTEST)) || DGTEST == 8 - fr = f_f(f1); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_float }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - { - /*const*/ void* args[] = { &f1 }; - FFI_CALL(cif,f_f,args,&fr); - } - } - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 9 - fr = f_f2(f1,f2); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - { - /*const*/ void* args[] = { &f1, &f2 }; - FFI_CALL(cif,f_f2,args,&fr); - } - } - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 10 - fr = f_f4(f1,f2,f3,f4); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - { - /*const*/ void* args[] = { &f1, &f2, &f3, &f4 }; - FFI_CALL(cif,f_f4,args,&fr); - } - } - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 11 - fr = f_f8(f1,f2,f3,f4,f5,f6,f7,f8); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - { - /*const*/ void* args[] = { &f1, &f2, &f3, &f4, &f5, &f6, &f7, &f8 }; - FFI_CALL(cif,f_f8,args,&fr); - } - } - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 12 - fr = f_f16(f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - { - /*const*/ void* args[] = { &f1, &f2, &f3, &f4, &f5, &f6, &f7, &f8, &f9, &f10, &f11, &f12, &f13, &f14, &f15, &f16 }; - FFI_CALL(cif,f_f16,args,&fr); - } - } - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 13 - fr = f_f24(f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - { - /*const*/ void* args[] = { &f1, &f2, &f3, &f4, &f5, &f6, &f7, &f8, &f9, &f10, &f11, &f12, &f13, &f14, &f15, &f16, &f17, &f18, &f19, &f20, &f21, &f22, &f23, &f24 }; - FFI_CALL(cif,f_f24,args,&fr); - } - } - fprintf(out,"->%g\n",fr); - fflush(out); -#endif -} -void - double_tests (void) -{ - double dr; - -#if (!defined(DGTEST)) || DGTEST == 14 - - dr = d_d(d1); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &d1 }; - FFI_CALL(cif,d_d,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 15 - dr = d_d2(d1,d2); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &d1, &d2 }; - FFI_CALL(cif,d_d2,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 16 - dr = d_d4(d1,d2,d3,d4); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &d1, &d2, &d3, &d4 }; - FFI_CALL(cif,d_d4,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 17 - dr = d_d8(d1,d2,d3,d4,d5,d6,d7,d8); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &d1, &d2, &d3, &d4, &d5, &d6, &d7, &d8 }; - FFI_CALL(cif,d_d8,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 18 - dr = d_d16(d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &d1, &d2, &d3, &d4, &d5, &d6, &d7, &d8, &d9, &d10, &d11, &d12, &d13, &d14, &d15, &d16 }; - FFI_CALL(cif,d_d16,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - return; -} -void - pointer_tests (void) -{ - void* vpr; - -#if (!defined(DGTEST)) || DGTEST == 19 - vpr = vp_vpdpcpsp(&uc1,&d2,str3,&I4); - fprintf(out,"->0x%p\n",vpr); - fflush(out); - vpr = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_pointer, &ffi_type_pointer, &ffi_type_pointer, &ffi_type_pointer }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_pointer); - { - void* puc1 = &uc1; - void* pd2 = &d2; - void* pstr3 = str3; - void* pI4 = &I4; - /*const*/ void* args[] = { &puc1, &pd2, &pstr3, &pI4 }; - FFI_CALL(cif,vp_vpdpcpsp,args,&vpr); - } - } - fprintf(out,"->0x%p\n",vpr); - fflush(out); -#endif - return; -} -void - mixed_number_tests (void) -{ - uchar ucr; - ushort usr; - float fr; - double dr; - long long llr; - - /* Unsigned types. - */ -#if (!defined(DGTEST)) || DGTEST == 20 - ucr = uc_ucsil(uc1, us2, ui3, ul4); - fprintf(out,"->%u\n",ucr); - fflush(out); - ucr = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_uchar, &ffi_type_ushort, &ffi_type_uint, &ffi_type_ulong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_uchar); - { - ffi_arg r; - /*const*/ void* args[] = { &uc1, &us2, &ui3, &ul4 }; - FFI_CALL(cif,uc_ucsil,args,&r); - ucr = (uchar) r; - } - } - fprintf(out,"->%u\n",ucr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 21 - /* Mixed int & float types. - */ - dr = d_iidd(i1,i2,d3,d4); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint, &ffi_type_double, &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &i1, &i2, &d3, &d4 }; - FFI_CALL(cif,d_iidd,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 22 - dr = d_iiidi(i1,i2,i3,d4,i5); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_double, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &i1, &i2, &i3, &d4, &i5 }; - FFI_CALL(cif,d_iiidi,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 23 - dr = d_idid(i1,d2,i3,d4); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_double, &ffi_type_sint, &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &i1, &d2, &i3, &d4 }; - FFI_CALL(cif,d_idid,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 24 - dr = d_fdi(f1,d2,i3); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_double, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &f1, &d2, &i3 }; - FFI_CALL(cif,d_fdi,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 25 - usr = us_cdcd(c1,d2,c3,d4); - fprintf(out,"->%u\n",usr); - fflush(out); - usr = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_char, &ffi_type_double, &ffi_type_char, &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_ushort); - { - ffi_arg rint; - /*const*/ void* args[] = { &c1, &d2, &c3, &d4 }; - FFI_CALL(cif,us_cdcd,args,&rint); - usr = (ushort) rint; - } - } - fprintf(out,"->%u\n",usr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 26 - /* Long long types. - */ - llr = ll_iiilli(i1,i2,i3,ll1,i13); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); - llr = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_slonglong, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); - { - /*const*/ void* args[] = { &i1, &i2, &i3, &ll1, &i13 }; - FFI_CALL(cif,ll_iiilli,args,&llr); - } - } - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 27 - llr = ll_flli(f13,ll1,i13); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); - llr = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_slonglong, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); - { - /*const*/ void* args[] = { &f13, &ll1, &i13 }; - FFI_CALL(cif,ll_flli,args,&llr); - } - } - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 28 - fr = f_fi(f1,i9); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - { - /*const*/ void* args[] = { &f1, &i9 }; - FFI_CALL(cif,f_fi,args,&fr); - } - } - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 29 - fr = f_f2i(f1,f2,i9); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - { - /*const*/ void* args[] = { &f1, &f2, &i9 }; - FFI_CALL(cif,f_f2i,args,&fr); - } - } - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 30 - fr = f_f3i(f1,f2,f3,i9); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - { - /*const*/ void* args[] = { &f1, &f2, &f3, &i9 }; - FFI_CALL(cif,f_f3i,args,&fr); - } - } - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 31 - fr = f_f4i(f1,f2,f3,f4,i9); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - { - /*const*/ void* args[] = { &f1, &f2, &f3, &f4, &i9 }; - FFI_CALL(cif,f_f4i,args,&fr); - } - } - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 32 - fr = f_f7i(f1,f2,f3,f4,f5,f6,f7,i9); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - { - /*const*/ void* args[] = { &f1, &f2, &f3, &f4, &f5, &f6, &f7, &i9 }; - FFI_CALL(cif,f_f7i,args,&fr); - } - } - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 33 - fr = f_f8i(f1,f2,f3,f4,f5,f6,f7,f8,i9); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - { - /*const*/ void* args[] = { &f1, &f2, &f3, &f4, &f5, &f6, &f7, &f8, &i9 }; - FFI_CALL(cif,f_f8i,args,&fr); - } - } - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 34 - fr = f_f12i(f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,i9); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - { - /*const*/ void* args[] = { &f1, &f2, &f3, &f4, &f5, &f6, &f7, &f8, &f9, &f10, &f11, &f12, &i9 }; - FFI_CALL(cif,f_f12i,args,&fr); - } - } - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 35 - fr = f_f13i(f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,i9); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - { - /*const*/ void* args[] = { &f1, &f2, &f3, &f4, &f5, &f6, &f7, &f8, &f9, &f10, &f11, &f12, &f13, &i9 }; - FFI_CALL(cif,f_f13i,args,&fr); - } - } - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 36 - dr = d_di(d1,i9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &d1, &i9 }; - FFI_CALL(cif,d_di,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 37 - dr = d_d2i(d1,d2,i9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &d1, &d2, &i9 }; - FFI_CALL(cif,d_d2i,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 38 - dr = d_d3i(d1,d2,d3,i9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &d1, &d2, &d3, &i9 }; - FFI_CALL(cif,d_d3i,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 39 - dr = d_d4i(d1,d2,d3,d4,i9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &d1, &d2, &d3, &d4, &i9 }; - FFI_CALL(cif,d_d4i,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 40 - dr = d_d7i(d1,d2,d3,d4,d5,d6,d7,i9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &d1, &d2, &d3, &d4, &d5, &d6, &d7, &i9 }; - FFI_CALL(cif,d_d7i,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 41 - dr = d_d8i(d1,d2,d3,d4,d5,d6,d7,d8,i9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &d1, &d2, &d3, &d4, &d5, &d6, &d7, &d8, &i9 }; - FFI_CALL(cif,d_d8i,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 42 - dr = d_d12i(d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,i9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &d1, &d2, &d3, &d4, &d5, &d6, &d7, &d8, &d9, &d10, &d11, &d12, &i9 }; - FFI_CALL(cif,d_d12i,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 43 - dr = d_d13i(d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,i9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &d1, &d2, &d3, &d4, &d5, &d6, &d7, &d8, &d9, &d10, &d11, &d12, &d13, &i9 }; - FFI_CALL(cif,d_d13i,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - return; -} -void - small_structure_return_tests (void) -{ -#if (!defined(DGTEST)) || DGTEST == 44 - { - Size1 r = S1_v(); - fprintf(out,"->{%c}\n",r.x1); - fflush(out); - memset(&r,0,sizeof(r)); clear_traces(); - { - ffi_type* ffi_type_Size1_elements[] = { &ffi_type_char, NULL }; - ffi_type ffi_type_Size1; - ffi_type_Size1.type = FFI_TYPE_STRUCT; - ffi_type_Size1.size = sizeof(Size1); - ffi_type_Size1.alignment = alignof_slot(Size1); - ffi_type_Size1.elements = ffi_type_Size1_elements; - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_Size1); - { - FFI_CALL(cif,S1_v,NULL,&r); - } - } - fprintf(out,"->{%c}\n",r.x1); - fflush(out); - } -#endif -#if (!defined(DGTEST)) || DGTEST == 45 - { - Size2 r = S2_v(); - fprintf(out,"->{%c%c}\n",r.x1,r.x2); - fflush(out); - memset(&r,0,sizeof(r)); clear_traces(); - { - ffi_type* ffi_type_Size2_elements[] = { &ffi_type_char, &ffi_type_char, NULL }; - ffi_type ffi_type_Size2; - ffi_type_Size2.type = FFI_TYPE_STRUCT; - ffi_type_Size2.size = sizeof(Size2); - ffi_type_Size2.alignment = alignof_slot(Size2); - ffi_type_Size2.elements = ffi_type_Size2_elements; - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_Size2); - { - FFI_CALL(cif,S2_v,NULL,&r); - } - } - fprintf(out,"->{%c%c}\n",r.x1,r.x2); - fflush(out); - } -#endif -#if (!defined(DGTEST)) || DGTEST == 46 - { - Size3 r = S3_v(); - fprintf(out,"->{%c%c%c}\n",r.x1,r.x2,r.x3); - fflush(out); - memset(&r,0,sizeof(r)); clear_traces(); - { - ffi_type* ffi_type_Size3_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; - ffi_type ffi_type_Size3; - ffi_type_Size3.type = FFI_TYPE_STRUCT; - ffi_type_Size3.size = sizeof(Size3); - ffi_type_Size3.alignment = alignof_slot(Size3); - ffi_type_Size3.elements = ffi_type_Size3_elements; - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_Size3); - { - FFI_CALL(cif,S3_v,NULL,&r); - } - } - fprintf(out,"->{%c%c%c}\n",r.x1,r.x2,r.x3); - fflush(out); - } -#endif -#if (!defined(DGTEST)) || DGTEST == 47 - { - Size4 r = S4_v(); - fprintf(out,"->{%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4); - fflush(out); - memset(&r,0,sizeof(r)); clear_traces(); - { - ffi_type* ffi_type_Size4_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; - ffi_type ffi_type_Size4; - ffi_type_Size4.type = FFI_TYPE_STRUCT; - ffi_type_Size4.size = sizeof(Size4); - ffi_type_Size4.alignment = alignof_slot(Size4); - ffi_type_Size4.elements = ffi_type_Size4_elements; - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_Size4); - { - FFI_CALL(cif,S4_v,NULL,&r); - } - } - fprintf(out,"->{%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4); - fflush(out); - } -#endif -#if (!defined(DGTEST)) || DGTEST == 48 - { - Size7 r = S7_v(); - fprintf(out,"->{%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7); - fflush(out); - memset(&r,0,sizeof(r)); clear_traces(); - { - ffi_type* ffi_type_Size7_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; - ffi_type ffi_type_Size7; - ffi_type_Size7.type = FFI_TYPE_STRUCT; - ffi_type_Size7.size = sizeof(Size7); - ffi_type_Size7.alignment = alignof_slot(Size7); - ffi_type_Size7.elements = ffi_type_Size7_elements; - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_Size7); - { - FFI_CALL(cif,S7_v,NULL,&r); - } - } - fprintf(out,"->{%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7); - fflush(out); - } -#endif -#if (!defined(DGTEST)) || DGTEST == 49 - { - Size8 r = S8_v(); - fprintf(out,"->{%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8); - fflush(out); - memset(&r,0,sizeof(r)); clear_traces(); - { - ffi_type* ffi_type_Size8_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; - ffi_type ffi_type_Size8; - ffi_type_Size8.type = FFI_TYPE_STRUCT; - ffi_type_Size8.size = sizeof(Size8); - ffi_type_Size8.alignment = alignof_slot(Size8); - ffi_type_Size8.elements = ffi_type_Size8_elements; - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_Size8); - { - FFI_CALL(cif,S8_v,NULL,&r); - } - } - fprintf(out,"->{%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8); - fflush(out); - } -#endif -#if (!defined(DGTEST)) || DGTEST == 50 - { - Size12 r = S12_v(); - fprintf(out,"->{%c%c%c%c%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8,r.x9,r.x10,r.x11,r.x12); - fflush(out); - memset(&r,0,sizeof(r)); clear_traces(); - { - ffi_type* ffi_type_Size12_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; - ffi_type ffi_type_Size12; - ffi_type_Size12.type = FFI_TYPE_STRUCT; - ffi_type_Size12.size = sizeof(Size12); - ffi_type_Size12.alignment = alignof_slot(Size12); - ffi_type_Size12.elements = ffi_type_Size12_elements; - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_Size12); - { - FFI_CALL(cif,S12_v,NULL,&r); - } - } - fprintf(out,"->{%c%c%c%c%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8,r.x9,r.x10,r.x11,r.x12); - fflush(out); - } -#endif -#if (!defined(DGTEST)) || DGTEST == 51 - { - Size15 r = S15_v(); - fprintf(out,"->{%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8,r.x9,r.x10,r.x11,r.x12,r.x13,r.x14,r.x15); - fflush(out); - memset(&r,0,sizeof(r)); clear_traces(); - { - ffi_type* ffi_type_Size15_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; - ffi_type ffi_type_Size15; - ffi_type_Size15.type = FFI_TYPE_STRUCT; - ffi_type_Size15.size = sizeof(Size15); - ffi_type_Size15.alignment = alignof_slot(Size15); - ffi_type_Size15.elements = ffi_type_Size15_elements; - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_Size15); - { - FFI_CALL(cif,S15_v,NULL,&r); - } - } - fprintf(out,"->{%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8,r.x9,r.x10,r.x11,r.x12,r.x13,r.x14,r.x15); - fflush(out); - } -#endif -#if (!defined(DGTEST)) || DGTEST == 52 - { - Size16 r = S16_v(); - fprintf(out,"->{%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8,r.x9,r.x10,r.x11,r.x12,r.x13,r.x14,r.x15,r.x16); - fflush(out); - memset(&r,0,sizeof(r)); clear_traces(); - { - ffi_type* ffi_type_Size16_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; - ffi_type ffi_type_Size16; - ffi_type_Size16.type = FFI_TYPE_STRUCT; - ffi_type_Size16.size = sizeof(Size16); - ffi_type_Size16.alignment = alignof_slot(Size16); - ffi_type_Size16.elements = ffi_type_Size16_elements; - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_Size16); - { - FFI_CALL(cif,S16_v,NULL,&r); - } - } - fprintf(out,"->{%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8,r.x9,r.x10,r.x11,r.x12,r.x13,r.x14,r.x15,r.x16); - fflush(out); - } -#endif -} -void - structure_tests (void) -{ - Int Ir; - Char Cr; - Float Fr; - Double Dr; - J Jr; -#ifndef SKIP_EXTRA_STRUCTS - T Tr; - X Xr; -#endif - -#if (!defined(DGTEST)) || DGTEST == 53 - Ir = I_III(I1,I2,I3); - fprintf(out,"->{%d}\n",Ir.x); - fflush(out); - Ir.x = 0; clear_traces(); - { - ffi_type* ffi_type_Int_elements[] = { &ffi_type_sint, NULL }; - ffi_type ffi_type_Int; - ffi_type_Int.type = FFI_TYPE_STRUCT; - ffi_type_Int.size = sizeof(Int); - ffi_type_Int.alignment = alignof_slot(Int); - ffi_type_Int.elements = ffi_type_Int_elements; - ffi_type* argtypes[] = { &ffi_type_Int, &ffi_type_Int, &ffi_type_Int }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_Int); - { - /*const*/ void* args[] = { &I1, &I2, &I3 }; - FFI_CALL(cif,I_III,args,&Ir); - } - } - fprintf(out,"->{%d}\n",Ir.x); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 54 - Cr = C_CdC(C1,d2,C3); - fprintf(out,"->{'%c'}\n",Cr.x); - fflush(out); - Cr.x = '\0'; clear_traces(); - { - ffi_type* ffi_type_Char_elements[] = { &ffi_type_char, NULL }; - ffi_type ffi_type_Char; - ffi_type_Char.type = FFI_TYPE_STRUCT; - ffi_type_Char.size = sizeof(Char); - ffi_type_Char.alignment = alignof_slot(Char); - ffi_type_Char.elements = ffi_type_Char_elements; - ffi_type* argtypes[] = { &ffi_type_Char, &ffi_type_double, &ffi_type_Char }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_Char); - { - /*const*/ void* args[] = { &C1, &d2, &C3 }; - FFI_CALL(cif,C_CdC,args,&Cr); - } - } - fprintf(out,"->{'%c'}\n",Cr.x); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 55 - Fr = F_Ffd(F1,f2,d3); - fprintf(out,"->{%g}\n",Fr.x); - fflush(out); - Fr.x = 0.0; clear_traces(); - { - ffi_type* ffi_type_Float_elements[] = { &ffi_type_float, NULL }; - ffi_type ffi_type_Float; - ffi_type_Float.type = FFI_TYPE_STRUCT; - ffi_type_Float.size = sizeof(Float); - ffi_type_Float.alignment = alignof_slot(Float); - ffi_type_Float.elements = ffi_type_Float_elements; - ffi_type* argtypes[] = { &ffi_type_Float, &ffi_type_float, &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_Float); - { - /*const*/ void* args[] = { &F1, &f2, &d3 }; - FFI_CALL(cif,F_Ffd,args,&Fr); - } - } - fprintf(out,"->{%g}\n",Fr.x); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 56 - Dr = D_fDd(f1,D2,d3); - fprintf(out,"->{%g}\n",Dr.x); - fflush(out); - Dr.x = 0.0; clear_traces(); - { - ffi_type* ffi_type_Double_elements[] = { &ffi_type_double, NULL }; - ffi_type ffi_type_Double; - ffi_type_Double.type = FFI_TYPE_STRUCT; - ffi_type_Double.size = sizeof(Double); - ffi_type_Double.alignment = alignof_slot(Double); - ffi_type_Double.elements = ffi_type_Double_elements; - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_Double, &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_Double); - { - /*const*/ void* args[] = { &f1, &D2, &d3 }; - FFI_CALL(cif,D_fDd,args,&Dr); - } - } - fprintf(out,"->{%g}\n",Dr.x); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 57 - Dr = D_Dfd(D1,f2,d3); - fprintf(out,"->{%g}\n",Dr.x); - fflush(out); - Dr.x = 0.0; clear_traces(); - { - ffi_type* ffi_type_Double_elements[] = { &ffi_type_double, NULL }; - ffi_type ffi_type_Double; - ffi_type_Double.type = FFI_TYPE_STRUCT; - ffi_type_Double.size = sizeof(Double); - ffi_type_Double.alignment = alignof_slot(Double); - ffi_type_Double.elements = ffi_type_Double_elements; - ffi_type* argtypes[] = { &ffi_type_Double, &ffi_type_float, &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_Double); - { - /*const*/ void* args[] = { &D1, &f2, &d3 }; - FFI_CALL(cif,D_Dfd,args,&Dr); - } - } - fprintf(out,"->{%g}\n",Dr.x); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 58 - Jr = J_JiJ(J1,i2,J2); - fprintf(out,"->{%ld,%ld}\n",Jr.l1,Jr.l2); - fflush(out); - Jr.l1 = Jr.l2 = 0; clear_traces(); - { - ffi_type* ffi_type_J_elements[] = { &ffi_type_slong, &ffi_type_slong, NULL }; - ffi_type ffi_type_J; - ffi_type_J.type = FFI_TYPE_STRUCT; - ffi_type_J.size = sizeof(J); - ffi_type_J.alignment = alignof_slot(J); - ffi_type_J.elements = ffi_type_J_elements; - ffi_type* argtypes[] = { &ffi_type_J, &ffi_type_sint, &ffi_type_J }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_J); - { - /*const*/ void* args[] = { &J1, &i2, &J2 }; - FFI_CALL(cif,J_JiJ,args,&Jr); - } - } - fprintf(out,"->{%ld,%ld}\n",Jr.l1,Jr.l2); - fflush(out); -#endif -#ifndef SKIP_EXTRA_STRUCTS -#if (!defined(DGTEST)) || DGTEST == 59 - Tr = T_TcT(T1,' ',T2); - fprintf(out,"->{\"%c%c%c\"}\n",Tr.c[0],Tr.c[1],Tr.c[2]); - fflush(out); - Tr.c[0] = Tr.c[1] = Tr.c[2] = 0; clear_traces(); - { - ffi_type* ffi_type_T_elements[] = { ??, NULL }; - ffi_type ffi_type_T; - ffi_type_T.type = FFI_TYPE_STRUCT; - ffi_type_T.size = sizeof(T); - ffi_type_T.alignment = alignof_slot(T); - ffi_type_T.elements = ffi_type_T_elements; - ffi_type* argtypes[] = { &ffi_type_T, &ffi_type_char, &ffi_type_T }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_T); - { - char space = ' '; - /*const*/ void* args[] = { &T1, &space, &T2 }; - FFI_CALL(cif,T_TcT,args,&Tr); - } - } - fprintf(out,"->{\"%c%c%c\"}\n",Tr.c[0],Tr.c[1],Tr.c[2]); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 60 - Xr = X_BcdB(B1,c2,d3,B2); - fprintf(out,"->{\"%s\",'%c'}\n",Xr.c,Xr.c1); - fflush(out); - Xr.c[0]=Xr.c1='\0'; clear_traces(); - { - ffi_type* ffi_type_X_elements[] = { ??, NULL }; - ffi_type ffi_type_X; - ffi_type_X.type = FFI_TYPE_STRUCT; - ffi_type_X.size = sizeof(X); - ffi_type_X.alignment = alignof_slot(X); - ffi_type_X.elements = ffi_type_X_elements; - ffi_type* argtypes[] = { &ffi_type_X, &ffi_type_char, &ffi_type_double, &ffi_type_X }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_X); - { - /*const*/ void* args[] = { &B1, &c2, &d3, &B2 }; - FFI_CALL(cif,X_BcdB,args,&Xr); - } - } - fprintf(out,"->{\"%s\",'%c'}\n",Xr.c,Xr.c1); - fflush(out); -#endif -#endif - - return; -} - -void - gpargs_boundary_tests (void) -{ - ffi_type* ffi_type_K_elements[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, NULL }; - ffi_type ffi_type_K; - ffi_type* ffi_type_L_elements[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, NULL }; - ffi_type ffi_type_L; - long lr; - long long llr; - float fr; - double dr; - - ffi_type_K.type = FFI_TYPE_STRUCT; - ffi_type_K.size = sizeof(K); - ffi_type_K.alignment = alignof_slot(K); - ffi_type_K.elements = ffi_type_K_elements; - - ffi_type_L.type = FFI_TYPE_STRUCT; - ffi_type_L.size = sizeof(L); - ffi_type_L.alignment = alignof_slot(L); - ffi_type_L.elements = ffi_type_L_elements; - -#if (!defined(DGTEST)) || DGTEST == 61 - lr = l_l0K(K1,l9); - fprintf(out,"->%ld\n",lr); - fflush(out); - lr = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_K, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slong); - { - /*const*/ void* args[] = { &K1, &l9 }; - FFI_CALL(cif,l_l0K,args,&lr); - } - } - fprintf(out,"->%ld\n",lr); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 62 - lr = l_l1K(l1,K1,l9); - fprintf(out,"->%ld\n",lr); - fflush(out); - lr = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_K, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slong); - { - /*const*/ void* args[] = { &l1, &K1, &l9 }; - FFI_CALL(cif,l_l1K,args,&lr); - } - } - fprintf(out,"->%ld\n",lr); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 63 - lr = l_l2K(l1,l2,K1,l9); - fprintf(out,"->%ld\n",lr); - fflush(out); - lr = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_K, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slong); - { - /*const*/ void* args[] = { &l1, &l2, &K1, &l9 }; - FFI_CALL(cif,l_l2K,args,&lr); - } - } - fprintf(out,"->%ld\n",lr); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 64 - lr = l_l3K(l1,l2,l3,K1,l9); - fprintf(out,"->%ld\n",lr); - fflush(out); - lr = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_K, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slong); - { - /*const*/ void* args[] = { &l1, &l2, &l3, &K1, &l9 }; - FFI_CALL(cif,l_l3K,args,&lr); - } - } - fprintf(out,"->%ld\n",lr); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 65 - lr = l_l4K(l1,l2,l3,l4,K1,l9); - fprintf(out,"->%ld\n",lr); - fflush(out); - lr = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_K, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slong); - { - /*const*/ void* args[] = { &l1, &l2, &l3, &l4, &K1, &l9 }; - FFI_CALL(cif,l_l4K,args,&lr); - } - } - fprintf(out,"->%ld\n",lr); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 66 - lr = l_l5K(l1,l2,l3,l4,l5,K1,l9); - fprintf(out,"->%ld\n",lr); - fflush(out); - lr = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_K, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slong); - { - /*const*/ void* args[] = { &l1, &l2, &l3, &l4, &l5, &K1, &l9 }; - FFI_CALL(cif,l_l5K,args,&lr); - } - } - fprintf(out,"->%ld\n",lr); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 67 - lr = l_l6K(l1,l2,l3,l4,l5,l6,K1,l9); - fprintf(out,"->%ld\n",lr); - fflush(out); - lr = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_K, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slong); - { - /*const*/ void* args[] = { &l1, &l2, &l3, &l4, &l5, &l6, &K1, &l9 }; - FFI_CALL(cif,l_l6K,args,&lr); - } - } - fprintf(out,"->%ld\n",lr); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 68 - fr = f_f17l3L(f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,l6,l7,l8,L1); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_L }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - { - /*const*/ void* args[] = { &f1, &f2, &f3, &f4, &f5, &f6, &f7, &f8, &f9, &f10, &f11, &f12, &f13, &f14, &f15, &f16, &f17, &l6, &l7, &l8, &L1 }; - FFI_CALL(cif,f_f17l3L,args,&fr); - } - } - fprintf(out,"->%g\n",fr); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 69 - dr = d_d17l3L(d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,l6,l7,l8,L1); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_L }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &d1, &d2, &d3, &d4, &d5, &d6, &d7, &d8, &d9, &d10, &d11, &d12, &d13, &d14, &d15, &d16, &d17, &l6, &l7, &l8, &L1 }; - FFI_CALL(cif,d_d17l3L,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 70 - llr = ll_l2ll(l1,l2,ll1,l9); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); - llr = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slonglong, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); - { - /*const*/ void* args[] = { &l1, &l2, &ll1, &l9 }; - FFI_CALL(cif,ll_l2ll,args,&llr); - } - } - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 71 - llr = ll_l3ll(l1,l2,l3,ll1,l9); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); - llr = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slonglong, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); - { - /*const*/ void* args[] = { &l1, &l2, &l3, &ll1, &l9 }; - FFI_CALL(cif,ll_l3ll,args,&llr); - } - } - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 72 - llr = ll_l4ll(l1,l2,l3,l4,ll1,l9); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); - llr = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slonglong, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); - { - /*const*/ void* args[] = { &l1, &l2, &l3, &l4, &ll1, &l9 }; - FFI_CALL(cif,ll_l4ll,args,&llr); - } - } - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 73 - llr = ll_l5ll(l1,l2,l3,l4,l5,ll1,l9); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); - llr = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slonglong, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); - { - /*const*/ void* args[] = { &l1, &l2, &l3, &l4, &l5, &ll1, &l9 }; - FFI_CALL(cif,ll_l5ll,args,&llr); - } - } - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 74 - llr = ll_l6ll(l1,l2,l3,l4,l5,l6,ll1,l9); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); - llr = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slonglong, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); - { - /*const*/ void* args[] = { &l1, &l2, &l3, &l4, &l5, &l6, &ll1, &l9 }; - FFI_CALL(cif,ll_l6ll,args,&llr); - } - } - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 75 - llr = ll_l7ll(l1,l2,l3,l4,l5,l6,l7,ll1,l9); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); - llr = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slonglong, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); - { - /*const*/ void* args[] = { &l1, &l2, &l3, &l4, &l5, &l6, &l7, &ll1, &l9 }; - FFI_CALL(cif,ll_l7ll,args,&llr); - } - } - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 76 - dr = d_l2d(l1,l2,d2,l9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_double, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &l1, &l2, &d2, &l9 }; - FFI_CALL(cif,d_l2d,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 77 - dr = d_l3d(l1,l2,l3,d2,l9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_double, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &l1, &l2, &l3, &d2, &l9 }; - FFI_CALL(cif,d_l3d,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 78 - dr = d_l4d(l1,l2,l3,l4,d2,l9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_double, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &l1, &l2, &l3, &l4, &d2, &l9 }; - FFI_CALL(cif,d_l4d,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 79 - dr = d_l5d(l1,l2,l3,l4,l5,d2,l9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_double, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &l1, &l2, &l3, &l4, &l5, &d2, &l9 }; - FFI_CALL(cif,d_l5d,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 80 - dr = d_l6d(l1,l2,l3,l4,l5,l6,d2,l9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_double, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &l1, &l2, &l3, &l4, &l5, &l6, &d2, &l9 }; - FFI_CALL(cif,d_l6d,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 81 - dr = d_l7d(l1,l2,l3,l4,l5,l6,l7,d2,l9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_double, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &l1, &l2, &l3, &l4, &l5, &l6, &l7, &d2, &l9 }; - FFI_CALL(cif,d_l7d,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - return; -} - -int - main (void) -{ - ffi_type_char = (char)(-1) < 0 ? ffi_type_schar : ffi_type_uchar; - out = stdout; - - void_tests(); - int_tests(); - float_tests(); - double_tests(); - pointer_tests(); - mixed_number_tests(); - small_structure_return_tests(); - structure_tests(); - gpargs_boundary_tests(); - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-callback.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-callback.c deleted file mode 100644 index 0b16799..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-callback.c +++ /dev/null @@ -1,2885 +0,0 @@ -/* - * Copyright 1993 Bill Triggs - * Copyright 1995-2017 Bruno Haible - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/* { dg-do run { xfail gccbug } } */ - -#include -#include -#include -#include -#include "alignof.h" -#include - -/* libffi testsuite local changes -------------------------------- */ -#ifdef DGTEST -/* Redefine exit(1) as a test failure */ -#define exit(V) (void)((V) ? (abort(), 1) : exit(0)) -int count = 0; -char rbuf1[2048]; -char rbuf2[2048]; -int _fprintf(FILE *stream, const char *format, ...) -{ - va_list args; - va_start(args, format); - - switch (count++) - { - case 0: - case 1: - vsprintf(&rbuf1[strlen(rbuf1)], format, args); - break; - case 2: - printf("%s", rbuf1); - vsprintf(rbuf2, format, args); - break; - case 3: - vsprintf(&rbuf2[strlen(rbuf2)], format, args); - printf("%s", rbuf2); - if (strcmp (rbuf1, rbuf2)) abort(); - break; - } - - va_end(args); - - return 0; -} -#define fprintf _fprintf -#endif -/* --------------------------------------------------------------- */ - -#include "testcases.c" - -#ifndef ABI_NUM -#define ABI_NUM FFI_DEFAULT_ABI -#endif - -/* Definitions that ought to be part of libffi. */ -static ffi_type ffi_type_char; -#define ffi_type_slonglong ffi_type_sint64 -#define ffi_type_ulonglong ffi_type_uint64 - -/* libffi does not support arrays inside structs. */ -#define SKIP_EXTRA_STRUCTS - -#define FFI_PREP_CIF(cif,argtypes,rettype) \ - if (ffi_prep_cif(&(cif),ABI_NUM,sizeof(argtypes)/sizeof(argtypes[0]),&rettype,argtypes) != FFI_OK) abort() -#define FFI_PREP_CIF_NOARGS(cif,rettype) \ - if (ffi_prep_cif(&(cif),ABI_NUM,0,&rettype,NULL) != FFI_OK) abort() - -#if defined(__sparc__) && defined(__sun) && defined(__SUNPRO_C) /* SUNWspro cc */ -/* SunPRO cc miscompiles the simulator function for X_BcdB: d.i[1] is - * temporarily stored in %l2 and put onto the stack from %l2, but in between - * the copy of X has used %l2 as a counter without saving and restoring its - * value. - */ -#define SKIP_X -#endif -#if defined(__mipsn32__) && !defined(__GNUC__) -/* The X test crashes for an unknown reason. */ -#define SKIP_X -#endif - - -/* These functions simulate the behaviour of the functions defined in testcases.c. */ - -/* void tests */ -void v_v_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&v_v) { fprintf(out,"wrong data for v_v\n"); exit(1); } - fprintf(out,"void f(void):\n"); - fflush(out); -} - -/* int tests */ -void i_v_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&i_v) { fprintf(out,"wrong data for i_v\n"); exit(1); } - {int r=99; - fprintf(out,"int f(void):"); - fflush(out); - *(ffi_arg*)retp = r; -}} -void i_i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&i_i) { fprintf(out,"wrong data for i_i\n"); exit(1); } - int a = *(int*)(*args++); - int r=a+1; - fprintf(out,"int f(int):(%d)",a); - fflush(out); - *(ffi_arg*)retp = r; -} -void i_i2_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&i_i2) { fprintf(out,"wrong data for i_i2\n"); exit(1); } - {int a = *(int*)(*args++); - int b = *(int*)(*args++); - int r=a+b; - fprintf(out,"int f(2*int):(%d,%d)",a,b); - fflush(out); - *(ffi_arg*)retp = r; -}} -void i_i4_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&i_i4) { fprintf(out,"wrong data for i_i4\n"); exit(1); } - {int a = *(int*)(*args++); - int b = *(int*)(*args++); - int c = *(int*)(*args++); - int d = *(int*)(*args++); - int r=a+b+c+d; - fprintf(out,"int f(4*int):(%d,%d,%d,%d)",a,b,c,d); - fflush(out); - *(ffi_arg*)retp = r; -}} -void i_i8_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&i_i8) { fprintf(out,"wrong data for i_i8\n"); exit(1); } - {int a = *(int*)(*args++); - int b = *(int*)(*args++); - int c = *(int*)(*args++); - int d = *(int*)(*args++); - int e = *(int*)(*args++); - int f = *(int*)(*args++); - int g = *(int*)(*args++); - int h = *(int*)(*args++); - int r=a+b+c+d+e+f+g+h; - fprintf(out,"int f(8*int):(%d,%d,%d,%d,%d,%d,%d,%d)",a,b,c,d,e,f,g,h); - fflush(out); - *(ffi_arg*)retp = r; -}} -void i_i16_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&i_i16) { fprintf(out,"wrong data for i_i16\n"); exit(1); } - {int a = *(int*)(*args++); - int b = *(int*)(*args++); - int c = *(int*)(*args++); - int d = *(int*)(*args++); - int e = *(int*)(*args++); - int f = *(int*)(*args++); - int g = *(int*)(*args++); - int h = *(int*)(*args++); - int i = *(int*)(*args++); - int j = *(int*)(*args++); - int k = *(int*)(*args++); - int l = *(int*)(*args++); - int m = *(int*)(*args++); - int n = *(int*)(*args++); - int o = *(int*)(*args++); - int p = *(int*)(*args++); - int r=a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p; - fprintf(out,"int f(16*int):(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)", - a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p); - fflush(out); - *(ffi_arg*)retp = r; -}} - -/* float tests */ -void f_f_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&f_f) { fprintf(out,"wrong data for f_f\n"); exit(1); } - {float a = *(float*)(*args++); - float r=a+1.0; - fprintf(out,"float f(float):(%g)",a); - fflush(out); - *(float*)retp = r; -}} -void f_f2_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&f_f2) { fprintf(out,"wrong data for f_f2\n"); exit(1); } - {float a = *(float*)(*args++); - float b = *(float*)(*args++); - float r=a+b; - fprintf(out,"float f(2*float):(%g,%g)",a,b); - fflush(out); - *(float*)retp = r; -}} -void f_f4_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&f_f4) { fprintf(out,"wrong data for f_f4\n"); exit(1); } - {float a = *(float*)(*args++); - float b = *(float*)(*args++); - float c = *(float*)(*args++); - float d = *(float*)(*args++); - float r=a+b+c+d; - fprintf(out,"float f(4*float):(%g,%g,%g,%g)",a,b,c,d); - fflush(out); - *(float*)retp = r; -}} -void f_f8_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&f_f8) { fprintf(out,"wrong data for f_f8\n"); exit(1); } - {float a = *(float*)(*args++); - float b = *(float*)(*args++); - float c = *(float*)(*args++); - float d = *(float*)(*args++); - float e = *(float*)(*args++); - float f = *(float*)(*args++); - float g = *(float*)(*args++); - float h = *(float*)(*args++); - float r=a+b+c+d+e+f+g+h; - fprintf(out,"float f(8*float):(%g,%g,%g,%g,%g,%g,%g,%g)",a,b,c,d,e,f,g,h); - fflush(out); - *(float*)retp = r; -}} -void f_f16_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&f_f16) { fprintf(out,"wrong data for f_f16\n"); exit(1); } - {float a = *(float*)(*args++); - float b = *(float*)(*args++); - float c = *(float*)(*args++); - float d = *(float*)(*args++); - float e = *(float*)(*args++); - float f = *(float*)(*args++); - float g = *(float*)(*args++); - float h = *(float*)(*args++); - float i = *(float*)(*args++); - float j = *(float*)(*args++); - float k = *(float*)(*args++); - float l = *(float*)(*args++); - float m = *(float*)(*args++); - float n = *(float*)(*args++); - float o = *(float*)(*args++); - float p = *(float*)(*args++); - float r=a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p; - fprintf(out,"float f(16*float):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g)",a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p); - fflush(out); - *(float*)retp = r; -}} -void f_f24_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&f_f24) { fprintf(out,"wrong data for f_f24\n"); exit(1); } - {float a = *(float*)(*args++); - float b = *(float*)(*args++); - float c = *(float*)(*args++); - float d = *(float*)(*args++); - float e = *(float*)(*args++); - float f = *(float*)(*args++); - float g = *(float*)(*args++); - float h = *(float*)(*args++); - float i = *(float*)(*args++); - float j = *(float*)(*args++); - float k = *(float*)(*args++); - float l = *(float*)(*args++); - float m = *(float*)(*args++); - float n = *(float*)(*args++); - float o = *(float*)(*args++); - float p = *(float*)(*args++); - float q = *(float*)(*args++); - float s = *(float*)(*args++); - float t = *(float*)(*args++); - float u = *(float*)(*args++); - float v = *(float*)(*args++); - float w = *(float*)(*args++); - float x = *(float*)(*args++); - float y = *(float*)(*args++); - float r=a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+s+t+u+v+w+x+y; - fprintf(out,"float f(24*float):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g)",a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,s,t,u,v,w,x,y); - fflush(out); - *(float*)retp = r; -}} - -/* double tests */ -void d_d_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_d) { fprintf(out,"wrong data for d_d\n"); exit(1); } - {double a = *(double*)(*args++); - double r=a+1.0; - fprintf(out,"double f(double):(%g)",a); - fflush(out); - *(double*)retp = r; -}} -void d_d2_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_d2) { fprintf(out,"wrong data for d_d2\n"); exit(1); } - {double a = *(double*)(*args++); - double b = *(double*)(*args++); - double r=a+b; - fprintf(out,"double f(2*double):(%g,%g)",a,b); - fflush(out); - *(double*)retp = r; -}} -void d_d4_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_d4) { fprintf(out,"wrong data for d_d4\n"); exit(1); } - {double a = *(double*)(*args++); - double b = *(double*)(*args++); - double c = *(double*)(*args++); - double d = *(double*)(*args++); - double r=a+b+c+d; - fprintf(out,"double f(4*double):(%g,%g,%g,%g)",a,b,c,d); - fflush(out); - *(double*)retp = r; -}} -void d_d8_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_d8) { fprintf(out,"wrong data for d_d8\n"); exit(1); } - {double a = *(double*)(*args++); - double b = *(double*)(*args++); - double c = *(double*)(*args++); - double d = *(double*)(*args++); - double e = *(double*)(*args++); - double f = *(double*)(*args++); - double g = *(double*)(*args++); - double h = *(double*)(*args++); - double r=a+b+c+d+e+f+g+h; - fprintf(out,"double f(8*double):(%g,%g,%g,%g,%g,%g,%g,%g)",a,b,c,d,e,f,g,h); - fflush(out); - *(double*)retp = r; -}} -void d_d16_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_d16) { fprintf(out,"wrong data for d_d16\n"); exit(1); } - {double a = *(double*)(*args++); - double b = *(double*)(*args++); - double c = *(double*)(*args++); - double d = *(double*)(*args++); - double e = *(double*)(*args++); - double f = *(double*)(*args++); - double g = *(double*)(*args++); - double h = *(double*)(*args++); - double i = *(double*)(*args++); - double j = *(double*)(*args++); - double k = *(double*)(*args++); - double l = *(double*)(*args++); - double m = *(double*)(*args++); - double n = *(double*)(*args++); - double o = *(double*)(*args++); - double p = *(double*)(*args++); - double r=a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p; - fprintf(out,"double f(16*double):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g)",a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p); - fflush(out); - *(double*)retp = r; -}} - -/* pointer tests */ -void vp_vpdpcpsp_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&vp_vpdpcpsp) { fprintf(out,"wrong data for vp_vpdpcpsp\n"); exit(1); } - {void* a = *(void* *)(*args++); - double* b = *(double* *)(*args++); - char* c = *(char* *)(*args++); - Int* d = *(Int* *)(*args++); - void* ret = (char*)b + 1; - fprintf(out,"void* f(void*,double*,char*,Int*):(0x%p,0x%p,0x%p,0x%p)",a,b,c,d); - fflush(out); - *(void* *)retp = ret; -}} - -/* mixed number tests */ -void uc_ucsil_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&uc_ucsil) { fprintf(out,"wrong data for uc_ucsil\n"); exit(1); } - {uchar a = *(unsigned char *)(*args++); - ushort b = *(unsigned short *)(*args++); - uint c = *(unsigned int *)(*args++); - ulong d = *(unsigned long *)(*args++); - uchar r = (uchar)-1; - fprintf(out,"uchar f(uchar,ushort,uint,ulong):(%u,%u,%u,%lu)",a,b,c,d); - fflush(out); - *(ffi_arg *)retp = r; -}} -void d_iidd_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_iidd) { fprintf(out,"wrong data for d_iidd\n"); exit(1); } - {int a = *(int*)(*args++); - int b = *(int*)(*args++); - double c = *(double*)(*args++); - double d = *(double*)(*args++); - double r=a+b+c+d; - fprintf(out,"double f(int,int,double,double):(%d,%d,%g,%g)",a,b,c,d); - fflush(out); - *(double*)retp = r; -}} -void d_iiidi_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_iiidi) { fprintf(out,"wrong data for d_iiidi\n"); exit(1); } - {int a = *(int*)(*args++); - int b = *(int*)(*args++); - int c = *(int*)(*args++); - double d = *(double*)(*args++); - int e = *(int*)(*args++); - double r=a+b+c+d+e; - fprintf(out,"double f(int,int,int,double,int):(%d,%d,%d,%g,%d)",a,b,c,d,e); - fflush(out); - *(double*)retp = r; -}} -void d_idid_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_idid) { fprintf(out,"wrong data for d_idid\n"); exit(1); } - {int a = *(int*)(*args++); - double b = *(double*)(*args++); - int c = *(int*)(*args++); - double d = *(double*)(*args++); - double r=a+b+c+d; - fprintf(out,"double f(int,double,int,double):(%d,%g,%d,%g)",a,b,c,d); - fflush(out); - *(double*)retp = r; -}} -void d_fdi_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_fdi) { fprintf(out,"wrong data for d_fdi\n"); exit(1); } - {float a = *(float*)(*args++); - double b = *(double*)(*args++); - int c = *(int*)(*args++); - double r=a+b+c; - fprintf(out,"double f(float,double,int):(%g,%g,%d)",a,b,c); - fflush(out); - *(double*)retp = r; -}} -void us_cdcd_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&us_cdcd) { fprintf(out,"wrong data for us_cdcd\n"); exit(1); } - {char a = *(char*)(*args++); - double b = *(double*)(*args++); - char c = *(char*)(*args++); - double d = *(double*)(*args++); - ushort r = (ushort)(a + b + c + d); - fprintf(out,"ushort f(char,double,char,double):('%c',%g,'%c',%g)",a,b,c,d); - fflush(out); - *(ffi_arg *)retp = r; -}} -void ll_iiilli_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&ll_iiilli) { fprintf(out,"wrong data for ll_iiilli\n"); exit(1); } - {int a = *(int*)(*args++); - int b = *(int*)(*args++); - int c = *(int*)(*args++); - long long d = *(long long *)(*args++); - int e = *(int*)(*args++); - long long r = (long long)(int)a + (long long)(int)b + (long long)(int)c + d + (long long)e; - fprintf(out,"long long f(int,int,int,long long,int):(%d,%d,%d,0x%lx%08lx,%d)",a,b,c,(long)(d>>32),(long)(d&0xffffffff),e); - fflush(out); - *(long long *)retp = r; -}} -void ll_flli_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&ll_flli) { fprintf(out,"wrong data for ll_flli\n"); exit(1); } - {float a = *(float*)(*args++); - long long b = *(long long *)(*args++); - int c = *(int*)(*args++); - long long r = (long long)(int)a + b + (long long)c; - fprintf(out,"long long f(float,long long,int):(%g,0x%lx%08lx,0x%lx)",a,(long)(b>>32),(long)(b&0xffffffff),(long)c); - fflush(out); - *(long long *)retp = r; -}} -void f_fi_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&f_fi) { fprintf(out,"wrong data for f_fi\n"); exit(1); } - {float a = *(float*)(*args++); - int z = *(int*)(*args++); - float r=a+z; - fprintf(out,"float f(float,int):(%g,%d)",a,z); - fflush(out); - *(float*)retp = r; -}} -void f_f2i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&f_f2i) { fprintf(out,"wrong data for f_f2i\n"); exit(1); } - {float a = *(float*)(*args++); - float b = *(float*)(*args++); - int z = *(int*)(*args++); - float r=a+b+z; - fprintf(out,"float f(2*float,int):(%g,%g,%d)",a,b,z); - fflush(out); - *(float*)retp = r; -}} -void f_f3i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&f_f3i) { fprintf(out,"wrong data for f_f3i\n"); exit(1); } - {float a = *(float*)(*args++); - float b = *(float*)(*args++); - float c = *(float*)(*args++); - int z = *(int*)(*args++); - float r=a+b+c+z; - fprintf(out,"float f(3*float,int):(%g,%g,%g,%d)",a,b,c,z); - fflush(out); - *(float*)retp = r; -}} -void f_f4i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&f_f4i) { fprintf(out,"wrong data for f_f4i\n"); exit(1); } - {float a = *(float*)(*args++); - float b = *(float*)(*args++); - float c = *(float*)(*args++); - float d = *(float*)(*args++); - int z = *(int*)(*args++); - float r=a+b+c+d+z; - fprintf(out,"float f(4*float,int):(%g,%g,%g,%g,%d)",a,b,c,d,z); - fflush(out); - *(float*)retp = r; -}} -void f_f7i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&f_f7i) { fprintf(out,"wrong data for f_f7i\n"); exit(1); } - {float a = *(float*)(*args++); - float b = *(float*)(*args++); - float c = *(float*)(*args++); - float d = *(float*)(*args++); - float e = *(float*)(*args++); - float f = *(float*)(*args++); - float g = *(float*)(*args++); - int z = *(int*)(*args++); - float r=a+b+c+d+e+f+g+z; - fprintf(out,"float f(7*float,int):(%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,z); - fflush(out); - *(float*)retp = r; -}} -void f_f8i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&f_f8i) { fprintf(out,"wrong data for f_f8i\n"); exit(1); } - {float a = *(float*)(*args++); - float b = *(float*)(*args++); - float c = *(float*)(*args++); - float d = *(float*)(*args++); - float e = *(float*)(*args++); - float f = *(float*)(*args++); - float g = *(float*)(*args++); - float h = *(float*)(*args++); - int z = *(int*)(*args++); - float r=a+b+c+d+e+f+g+h+z; - fprintf(out,"float f(8*float,int):(%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,z); - fflush(out); - *(float*)retp = r; -}} -void f_f12i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&f_f12i) { fprintf(out,"wrong data for f_f12i\n"); exit(1); } - {float a = *(float*)(*args++); - float b = *(float*)(*args++); - float c = *(float*)(*args++); - float d = *(float*)(*args++); - float e = *(float*)(*args++); - float f = *(float*)(*args++); - float g = *(float*)(*args++); - float h = *(float*)(*args++); - float i = *(float*)(*args++); - float j = *(float*)(*args++); - float k = *(float*)(*args++); - float l = *(float*)(*args++); - int z = *(int*)(*args++); - float r=a+b+c+d+e+f+g+h+i+j+k+l+z; - fprintf(out,"float f(12*float,int):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,i,j,k,l,z); - fflush(out); - *(float*)retp = r; -}} -void f_f13i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&f_f13i) { fprintf(out,"wrong data for f_f13i\n"); exit(1); } - {float a = *(float*)(*args++); - float b = *(float*)(*args++); - float c = *(float*)(*args++); - float d = *(float*)(*args++); - float e = *(float*)(*args++); - float f = *(float*)(*args++); - float g = *(float*)(*args++); - float h = *(float*)(*args++); - float i = *(float*)(*args++); - float j = *(float*)(*args++); - float k = *(float*)(*args++); - float l = *(float*)(*args++); - float m = *(float*)(*args++); - int z = *(int*)(*args++); - float r=a+b+c+d+e+f+g+h+i+j+k+l+m+z; - fprintf(out,"float f(13*float,int):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,i,j,k,l,m,z); - fflush(out); - *(float*)retp = r; -}} -void d_di_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_di) { fprintf(out,"wrong data for d_di\n"); exit(1); } - {double a = *(double*)(*args++); - int z = *(int*)(*args++); - double r=a+z; - fprintf(out,"double f(double,int):(%g,%d)",a,z); - fflush(out); - *(double*)retp = r; -}} -void d_d2i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_d2i) { fprintf(out,"wrong data for d_d2i\n"); exit(1); } - {double a = *(double*)(*args++); - double b = *(double*)(*args++); - int z = *(int*)(*args++); - double r=a+b+z; - fprintf(out,"double f(2*double,int):(%g,%g,%d)",a,b,z); - fflush(out); - *(double*)retp = r; -}} -void d_d3i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_d3i) { fprintf(out,"wrong data for d_d3i\n"); exit(1); } - {double a = *(double*)(*args++); - double b = *(double*)(*args++); - double c = *(double*)(*args++); - int z = *(int*)(*args++); - double r=a+b+c+z; - fprintf(out,"double f(3*double,int):(%g,%g,%g,%d)",a,b,c,z); - fflush(out); - *(double*)retp = r; -}} -void d_d4i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_d4i) { fprintf(out,"wrong data for d_d4i\n"); exit(1); } - {double a = *(double*)(*args++); - double b = *(double*)(*args++); - double c = *(double*)(*args++); - double d = *(double*)(*args++); - int z = *(int*)(*args++); - double r=a+b+c+d+z; - fprintf(out,"double f(4*double,int):(%g,%g,%g,%g,%d)",a,b,c,d,z); - fflush(out); - *(double*)retp = r; -}} -void d_d7i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_d7i) { fprintf(out,"wrong data for d_d7i\n"); exit(1); } - {double a = *(double*)(*args++); - double b = *(double*)(*args++); - double c = *(double*)(*args++); - double d = *(double*)(*args++); - double e = *(double*)(*args++); - double f = *(double*)(*args++); - double g = *(double*)(*args++); - int z = *(int*)(*args++); - double r=a+b+c+d+e+f+g+z; - fprintf(out,"double f(7*double,int):(%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,z); - fflush(out); - *(double*)retp = r; -}} -void d_d8i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_d8i) { fprintf(out,"wrong data for d_d8i\n"); exit(1); } - {double a = *(double*)(*args++); - double b = *(double*)(*args++); - double c = *(double*)(*args++); - double d = *(double*)(*args++); - double e = *(double*)(*args++); - double f = *(double*)(*args++); - double g = *(double*)(*args++); - double h = *(double*)(*args++); - int z = *(int*)(*args++); - double r=a+b+c+d+e+f+g+h+z; - fprintf(out,"double f(8*double,int):(%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,z); - fflush(out); - *(double*)retp = r; -}} -void d_d12i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_d12i) { fprintf(out,"wrong data for d_d12i\n"); exit(1); } - {double a = *(double*)(*args++); - double b = *(double*)(*args++); - double c = *(double*)(*args++); - double d = *(double*)(*args++); - double e = *(double*)(*args++); - double f = *(double*)(*args++); - double g = *(double*)(*args++); - double h = *(double*)(*args++); - double i = *(double*)(*args++); - double j = *(double*)(*args++); - double k = *(double*)(*args++); - double l = *(double*)(*args++); - int z = *(int*)(*args++); - double r=a+b+c+d+e+f+g+h+i+j+k+l+z; - fprintf(out,"double f(12*double,int):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,i,j,k,l,z); - fflush(out); - *(double*)retp = r; -}} -void d_d13i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_d13i) { fprintf(out,"wrong data for d_d13i\n"); exit(1); } - {double a = *(double*)(*args++); - double b = *(double*)(*args++); - double c = *(double*)(*args++); - double d = *(double*)(*args++); - double e = *(double*)(*args++); - double f = *(double*)(*args++); - double g = *(double*)(*args++); - double h = *(double*)(*args++); - double i = *(double*)(*args++); - double j = *(double*)(*args++); - double k = *(double*)(*args++); - double l = *(double*)(*args++); - double m = *(double*)(*args++); - int z = *(int*)(*args++); - double r=a+b+c+d+e+f+g+h+i+j+k+l+m+z; - fprintf(out,"double f(13*double,int):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,i,j,k,l,m,z); - fflush(out); - *(double*)retp = r; -}} - -/* small structure return tests */ -void S1_v_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&S1_v) { fprintf(out,"wrong data for S1_v\n"); exit(1); } - {Size1 r = Size1_1; - fprintf(out,"Size1 f(void):"); - fflush(out); - *(Size1*)retp = r; -}} -void S2_v_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&S2_v) { fprintf(out,"wrong data for S2_v\n"); exit(1); } - {Size2 r = Size2_1; - fprintf(out,"Size2 f(void):"); - fflush(out); - *(Size2*)retp = r; -}} -void S3_v_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&S3_v) { fprintf(out,"wrong data for S3_v\n"); exit(1); } - {Size3 r = Size3_1; - fprintf(out,"Size3 f(void):"); - fflush(out); - *(Size3*)retp = r; -}} -void S4_v_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&S4_v) { fprintf(out,"wrong data for S4_v\n"); exit(1); } - {Size4 r = Size4_1; - fprintf(out,"Size4 f(void):"); - fflush(out); - *(Size4*)retp = r; -}} -void S7_v_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&S7_v) { fprintf(out,"wrong data for S7_v\n"); exit(1); } - {Size7 r = Size7_1; - fprintf(out,"Size7 f(void):"); - fflush(out); - *(Size7*)retp = r; -}} -void S8_v_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&S8_v) { fprintf(out,"wrong data for S8_v\n"); exit(1); } - {Size8 r = Size8_1; - fprintf(out,"Size8 f(void):"); - fflush(out); - *(Size8*)retp = r; -}} -void S12_v_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&S12_v) { fprintf(out,"wrong data for S12_v\n"); exit(1); } - {Size12 r = Size12_1; - fprintf(out,"Size12 f(void):"); - fflush(out); - *(Size12*)retp = r; -}} -void S15_v_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&S15_v) { fprintf(out,"wrong data for S15_v\n"); exit(1); } - {Size15 r = Size15_1; - fprintf(out,"Size15 f(void):"); - fflush(out); - *(Size15*)retp = r; -}} -void S16_v_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&S16_v) { fprintf(out,"wrong data for S16_v\n"); exit(1); } - {Size16 r = Size16_1; - fprintf(out,"Size16 f(void):"); - fflush(out); - *(Size16*)retp = r; -}} - -/* structure tests */ -void I_III_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&I_III) { fprintf(out,"wrong data for I_III\n"); exit(1); } - {Int a = *(Int*)(*args++); - Int b = *(Int*)(*args++); - Int c = *(Int*)(*args++); - Int r; - r.x = a.x + b.x + c.x; - fprintf(out,"Int f(Int,Int,Int):({%d},{%d},{%d})",a.x,b.x,c.x); - fflush(out); - *(Int*)retp = r; -}} -void C_CdC_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&C_CdC) { fprintf(out,"wrong data for C_CdC\n"); exit(1); } - {Char a = *(Char*)(*args++); - double b = *(double*)(*args++); - Char c = *(Char*)(*args++); - Char r; - r.x = (a.x + c.x)/2; - fprintf(out,"Char f(Char,double,Char):({'%c'},%g,{'%c'})",a.x,b,c.x); - fflush(out); - *(Char*)retp = r; -}} -void F_Ffd_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&F_Ffd) { fprintf(out,"wrong data for F_Ffd\n"); exit(1); } - {Float a = *(Float*)(*args++); - float b = *(float*)(*args++); - double c = *(double*)(*args++); - Float r; - r.x = a.x + b + c; - fprintf(out,"Float f(Float,float,double):({%g},%g,%g)",a.x,b,c); - fflush(out); - *(Float*)retp = r; -}} -void D_fDd_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&D_fDd) { fprintf(out,"wrong data for D_fDd\n"); exit(1); } - {float a = *(float*)(*args++); - Double b = *(Double*)(*args++); - double c = *(double*)(*args++); - Double r; - r.x = a + b.x + c; - fprintf(out,"Double f(float,Double,double):(%g,{%g},%g)",a,b.x,c); - fflush(out); - *(Double*)retp = r; -}} -void D_Dfd_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&D_Dfd) { fprintf(out,"wrong data for D_Dfd\n"); exit(1); } - {Double a = *(Double*)(*args++); - float b = *(float*)(*args++); - double c = *(double*)(*args++); - Double r; - r.x = a.x + b + c; - fprintf(out,"Double f(Double,float,double):({%g},%g,%g)",a.x,b,c); - fflush(out); - *(Double*)retp = r; -}} -void J_JiJ_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&J_JiJ) { fprintf(out,"wrong data for J_JiJ\n"); exit(1); } - {J a = *(J*)(*args++); - int b= *(int*)(*args++); - J c = *(J*)(*args++); - J r; - r.l1 = a.l1+c.l1; r.l2 = a.l2+b+c.l2; - fprintf(out,"J f(J,int,J):({%ld,%ld},%d,{%ld,%ld})",a.l1,a.l2,b,c.l1,c.l2); - fflush(out); - *(J*)retp = r; -}} -#ifndef SKIP_EXTRA_STRUCTS -void T_TcT_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&T_TcT) { fprintf(out,"wrong data for T_TcT\n"); exit(1); } - {T a = *(T*)(*args++); - char b = *(char*)(*args++); - T c = *(T*)(*args++); - T r; - r.c[0]='b'; r.c[1]=c.c[1]; r.c[2]=c.c[2]; - fprintf(out,"T f(T,char,T):({\"%c%c%c\"},'%c',{\"%c%c%c\"})",a.c[0],a.c[1],a.c[2],b,c.c[0],c.c[1],c.c[2]); - fflush(out); - *(T*)retp = r; -}} -void X_BcdB_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&X_BcdB) { fprintf(out,"wrong data for X_BcdB\n"); exit(1); } - {B a = *(B*)(*args++); - char b = *(char*)(*args++); - double c = *(double*)(*args++); - B d = *(B*)(*args++); - static X xr={"return val",'R'}; - X r; - r = xr; - r.c1 = b; - fprintf(out,"X f(B,char,double,B):({%g,{%d,%d,%d}},'%c',%g,{%g,{%d,%d,%d}})", - a.d,a.i[0],a.i[1],a.i[2],b,c,d.d,d.i[0],d.i[1],d.i[2]); - fflush(out); - *(X*)retp = r; -}} -#endif - -/* gpargs boundary tests */ -void l_l0K_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&l_l0K) { fprintf(out,"wrong data for l_l0K\n"); exit(1); } - {K b = *(K*)(*args++); - long c = *(long*)(*args++); - long r = b.l1 + b.l2 + b.l3 + b.l4 + c; - fprintf(out,"long f(K,long):(%ld,%ld,%ld,%ld,%ld)",b.l1,b.l2,b.l3,b.l4,c); - fflush(out); - *(ffi_arg*)retp = r; -}} -void l_l1K_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&l_l1K) { fprintf(out,"wrong data for l_l1K\n"); exit(1); } - {long a1 = *(long*)(*args++); - K b = *(K*)(*args++); - long c = *(long*)(*args++); - long r = a1 + b.l1 + b.l2 + b.l3 + b.l4 + c; - fprintf(out,"long f(long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld)",a1,b.l1,b.l2,b.l3,b.l4,c); - fflush(out); - *(ffi_arg*)retp = r; -}} -void l_l2K_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&l_l2K) { fprintf(out,"wrong data for l_l2K\n"); exit(1); } - {long a1 = *(long*)(*args++); - long a2 = *(long*)(*args++); - K b = *(K*)(*args++); - long c = *(long*)(*args++); - long r = a1 + a2 + b.l1 + b.l2 + b.l3 + b.l4 + c; - fprintf(out,"long f(2*long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a1,a2,b.l1,b.l2,b.l3,b.l4,c); - fflush(out); - *(ffi_arg*)retp = r; -}} -void l_l3K_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&l_l3K) { fprintf(out,"wrong data for l_l3K\n"); exit(1); } - {long a1 = *(long*)(*args++); - long a2 = *(long*)(*args++); - long a3 = *(long*)(*args++); - K b = *(K*)(*args++); - long c = *(long*)(*args++); - long r = a1 + a2 + a3 + b.l1 + b.l2 + b.l3 + b.l4 + c; - fprintf(out,"long f(3*long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a1,a2,a3,b.l1,b.l2,b.l3,b.l4,c); - fflush(out); - *(ffi_arg*)retp = r; -}} -void l_l4K_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&l_l4K) { fprintf(out,"wrong data for l_l4K\n"); exit(1); } - {long a1 = *(long*)(*args++); - long a2 = *(long*)(*args++); - long a3 = *(long*)(*args++); - long a4 = *(long*)(*args++); - K b = *(K*)(*args++); - long c = *(long*)(*args++); - long r = a1 + a2 + a3 + a4 + b.l1 + b.l2 + b.l3 + b.l4 + c; - fprintf(out,"long f(4*long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a1,a2,a3,a4,b.l1,b.l2,b.l3,b.l4,c); - fflush(out); - *(ffi_arg*)retp = r; -}} -void l_l5K_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&l_l5K) { fprintf(out,"wrong data for l_l5K\n"); exit(1); } - {long a1 = *(long*)(*args++); - long a2 = *(long*)(*args++); - long a3 = *(long*)(*args++); - long a4 = *(long*)(*args++); - long a5 = *(long*)(*args++); - K b = *(K*)(*args++); - long c = *(long*)(*args++); - long r = a1 + a2 + a3 + a4 + a5 + b.l1 + b.l2 + b.l3 + b.l4 + c; - fprintf(out,"long f(5*long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a1,a2,a3,a4,a5,b.l1,b.l2,b.l3,b.l4,c); - fflush(out); - *(ffi_arg*)retp = r; -}} -void l_l6K_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&l_l6K) { fprintf(out,"wrong data for l_l6K\n"); exit(1); } - {long a1 = *(long*)(*args++); - long a2 = *(long*)(*args++); - long a3 = *(long*)(*args++); - long a4 = *(long*)(*args++); - long a5 = *(long*)(*args++); - long a6 = *(long*)(*args++); - K b = *(K*)(*args++); - long c = *(long*)(*args++); - long r = a1 + a2 + a3 + a4 + a5 + a6 + b.l1 + b.l2 + b.l3 + b.l4 + c; - fprintf(out,"long f(6*long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a1,a2,a3,a4,a5,a6,b.l1,b.l2,b.l3,b.l4,c); - fflush(out); - *(ffi_arg*)retp = r; -}} -void f_f17l3L_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&f_f17l3L) { fprintf(out,"wrong data for f_f17l3L\n"); exit(1); } - {float a = *(float*)(*args++); - float b = *(float*)(*args++); - float c = *(float*)(*args++); - float d = *(float*)(*args++); - float e = *(float*)(*args++); - float f = *(float*)(*args++); - float g = *(float*)(*args++); - float h = *(float*)(*args++); - float i = *(float*)(*args++); - float j = *(float*)(*args++); - float k = *(float*)(*args++); - float l = *(float*)(*args++); - float m = *(float*)(*args++); - float n = *(float*)(*args++); - float o = *(float*)(*args++); - float p = *(float*)(*args++); - float q = *(float*)(*args++); - long s = *(long*)(*args++); - long t = *(long*)(*args++); - long u = *(long*)(*args++); - L z = *(L*)(*args++); - float r = a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+s+t+u+z.l1+z.l2+z.l3+z.l4+z.l5+z.l6; - fprintf(out,"float f(17*float,3*int,L):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,s,t,u,z.l1,z.l2,z.l3,z.l4,z.l5,z.l6); - fflush(out); - *(float*)retp = r; -}} -void d_d17l3L_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_d17l3L) { fprintf(out,"wrong data for d_d17l3L\n"); exit(1); } - {double a = *(double*)(*args++); - double b = *(double*)(*args++); - double c = *(double*)(*args++); - double d = *(double*)(*args++); - double e = *(double*)(*args++); - double f = *(double*)(*args++); - double g = *(double*)(*args++); - double h = *(double*)(*args++); - double i = *(double*)(*args++); - double j = *(double*)(*args++); - double k = *(double*)(*args++); - double l = *(double*)(*args++); - double m = *(double*)(*args++); - double n = *(double*)(*args++); - double o = *(double*)(*args++); - double p = *(double*)(*args++); - double q = *(double*)(*args++); - long s = *(long*)(*args++); - long t = *(long*)(*args++); - long u = *(long*)(*args++); - L z = *(L*)(*args++); - double r = a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+s+t+u+z.l1+z.l2+z.l3+z.l4+z.l5+z.l6; - fprintf(out,"double f(17*double,3*int,L):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,s,t,u,z.l1,z.l2,z.l3,z.l4,z.l5,z.l6); - fflush(out); - *(double*)retp = r; -}} -void ll_l2ll_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&ll_l2ll) { fprintf(out,"wrong data for ll_l2ll\n"); exit(1); } - {long a1 = *(long*)(*args++); - long a2 = *(long*)(*args++); - long long b = *(long long *)(*args++); - long c = *(long*)(*args++); - long long r = (long long) (a1 + a2) + b + c; - fprintf(out,"long long f(2*long,long long,long):(%ld,%ld,0x%lx%08lx,%ld)",a1,a2,(long)(b>>32),(long)(b&0xffffffff),c); - fflush(out); - *(long long *)retp = r; -}} -void ll_l3ll_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&ll_l3ll) { fprintf(out,"wrong data for ll_l3ll\n"); exit(1); } - {long a1 = *(long*)(*args++); - long a2 = *(long*)(*args++); - long a3 = *(long*)(*args++); - long long b = *(long long *)(*args++); - long c = *(long*)(*args++); - long long r = (long long) (a1 + a2 + a3) + b + c; - fprintf(out,"long long f(3*long,long long,long):(%ld,%ld,%ld,0x%lx%08lx,%ld)",a1,a2,a3,(long)(b>>32),(long)(b&0xffffffff),c); - fflush(out); - *(long long *)retp = r; -}} -void ll_l4ll_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&ll_l4ll) { fprintf(out,"wrong data for ll_l4ll\n"); exit(1); } - {long a1 = *(long*)(*args++); - long a2 = *(long*)(*args++); - long a3 = *(long*)(*args++); - long a4 = *(long*)(*args++); - long long b = *(long long *)(*args++); - long c = *(long*)(*args++); - long long r = (long long) (a1 + a2 + a3 + a4) + b + c; - fprintf(out,"long long f(4*long,long long,long):(%ld,%ld,%ld,%ld,0x%lx%08lx,%ld)",a1,a2,a3,a4,(long)(b>>32),(long)(b&0xffffffff),c); - fflush(out); - *(long long *)retp = r; -}} -void ll_l5ll_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&ll_l5ll) { fprintf(out,"wrong data for ll_l5ll\n"); exit(1); } - {long a1 = *(long*)(*args++); - long a2 = *(long*)(*args++); - long a3 = *(long*)(*args++); - long a4 = *(long*)(*args++); - long a5 = *(long*)(*args++); - long long b = *(long long *)(*args++); - long c = *(long*)(*args++); - long long r = (long long) (a1 + a2 + a3 + a4 + a5) + b + c; - fprintf(out,"long long f(5*long,long long,long):(%ld,%ld,%ld,%ld,%ld,0x%lx%08lx,%ld)",a1,a2,a3,a4,a5,(long)(b>>32),(long)(b&0xffffffff),c); - fflush(out); - *(long long *)retp = r; -}} -void ll_l6ll_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&ll_l6ll) { fprintf(out,"wrong data for ll_l6ll\n"); exit(1); } - {long a1 = *(long*)(*args++); - long a2 = *(long*)(*args++); - long a3 = *(long*)(*args++); - long a4 = *(long*)(*args++); - long a5 = *(long*)(*args++); - long a6 = *(long*)(*args++); - long long b = *(long long *)(*args++); - long c = *(long*)(*args++); - long long r = (long long) (a1 + a2 + a3 + a4 + a5 + a6) + b + c; - fprintf(out,"long long f(6*long,long long,long):(%ld,%ld,%ld,%ld,%ld,%ld,0x%lx%08lx,%ld)",a1,a2,a3,a4,a5,a6,(long)(b>>32),(long)(b&0xffffffff),c); - fflush(out); - *(long long *)retp = r; -}} -void ll_l7ll_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&ll_l7ll) { fprintf(out,"wrong data for ll_l7ll\n"); exit(1); } - {long a1 = *(long*)(*args++); - long a2 = *(long*)(*args++); - long a3 = *(long*)(*args++); - long a4 = *(long*)(*args++); - long a5 = *(long*)(*args++); - long a6 = *(long*)(*args++); - long a7 = *(long*)(*args++); - long long b = *(long long *)(*args++); - long c = *(long*)(*args++); - long long r = (long long) (a1 + a2 + a3 + a4 + a5 + a6 + a7) + b + c; - fprintf(out,"long long f(7*long,long long,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,0x%lx%08lx,%ld)",a1,a2,a3,a4,a5,a6,a7,(long)(b>>32),(long)(b&0xffffffff),c); - fflush(out); - *(long long *)retp = r; -}} -void d_l2d_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_l2d) { fprintf(out,"wrong data for d_l2d\n"); exit(1); } - {long a1 = *(long*)(*args++); - long a2 = *(long*)(*args++); - double b = *(double*)(*args++); - long c = *(long*)(*args++); - double r = (double) (a1 + a2) + b + c; - fprintf(out,"double f(2*long,double,long):(%ld,%ld,%g,%ld)",a1,a2,b,c); - fflush(out); - *(double*)retp = r; -}} -void d_l3d_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_l3d) { fprintf(out,"wrong data for d_l3d\n"); exit(1); } - {long a1 = *(long*)(*args++); - long a2 = *(long*)(*args++); - long a3 = *(long*)(*args++); - double b = *(double*)(*args++); - long c = *(long*)(*args++); - double r = (double) (a1 + a2 + a3) + b + c; - fprintf(out,"double f(3*long,double,long):(%ld,%ld,%ld,%g,%ld)",a1,a2,a3,b,c); - fflush(out); - *(double*)retp = r; -}} -void d_l4d_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_l4d) { fprintf(out,"wrong data for d_l4d\n"); exit(1); } - {long a1 = *(long*)(*args++); - long a2 = *(long*)(*args++); - long a3 = *(long*)(*args++); - long a4 = *(long*)(*args++); - double b = *(double*)(*args++); - long c = *(long*)(*args++); - double r = (double) (a1 + a2 + a3 + a4) + b + c; - fprintf(out,"double f(4*long,double,long):(%ld,%ld,%ld,%ld,%g,%ld)",a1,a2,a3,a4,b,c); - fflush(out); - *(double*)retp = r; -}} -void d_l5d_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_l5d) { fprintf(out,"wrong data for d_l5d\n"); exit(1); } - {long a1 = *(long*)(*args++); - long a2 = *(long*)(*args++); - long a3 = *(long*)(*args++); - long a4 = *(long*)(*args++); - long a5 = *(long*)(*args++); - double b = *(double*)(*args++); - long c = *(long*)(*args++); - double r = (double) (a1 + a2 + a3 + a4 + a5) + b + c; - fprintf(out,"double f(5*long,double,long):(%ld,%ld,%ld,%ld,%ld,%g,%ld)",a1,a2,a3,a4,a5,b,c); - fflush(out); - *(double*)retp = r; -}} -void d_l6d_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_l6d) { fprintf(out,"wrong data for d_l6d\n"); exit(1); } - {long a1 = *(long*)(*args++); - long a2 = *(long*)(*args++); - long a3 = *(long*)(*args++); - long a4 = *(long*)(*args++); - long a5 = *(long*)(*args++); - long a6 = *(long*)(*args++); - double b = *(double*)(*args++); - long c = *(long*)(*args++); - double r = (double) (a1 + a2 + a3 + a4 + a5 + a6) + b + c; - fprintf(out,"double f(6*long,double,long):(%ld,%ld,%ld,%ld,%ld,%ld,%g,%ld)",a1,a2,a3,a4,a5,a6,b,c); - fflush(out); - *(double*)retp = r; -}} -void d_l7d_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_l7d) { fprintf(out,"wrong data for d_l7d\n"); exit(1); } - {long a1 = *(long*)(*args++); - long a2 = *(long*)(*args++); - long a3 = *(long*)(*args++); - long a4 = *(long*)(*args++); - long a5 = *(long*)(*args++); - long a6 = *(long*)(*args++); - long a7 = *(long*)(*args++); - double b = *(double*)(*args++); - long c = *(long*)(*args++); - double r = (double) (a1 + a2 + a3 + a4 + a5 + a6 + a7) + b + c; - fprintf(out,"double f(7*long,double,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%g,%ld)",a1,a2,a3,a4,a5,a6,a7,b,c); - fflush(out); - *(double*)retp = r; -}} - - -/* - * The way we run these tests - first call the function directly, then - * through vacall() - there is the danger that arguments or results seem - * to be passed correctly, but what we are seeing are in fact the vestiges - * (traces) or the previous call. This may seriously fake the test. - * Avoid this by clearing the registers between the first and the second call. - */ -long clear_traces_i (long a, long b, long c, long d, long e, long f, long g, long h, - long i, long j, long k, long l, long m, long n, long o, long p) -{ return 0; } -float clear_traces_f (float a, float b, float c, float d, float e, float f, float g, - float h, float i, float j, float k, float l, float m, float n, - float o, float p) -{ return 0.0; } -double clear_traces_d (double a, double b, double c, double d, double e, double f, double g, - double h, double i, double j, double k, double l, double m, double n, - double o, double p) -{ return 0.0; } -J clear_traces_J (void) -{ J j; j.l1 = j.l2 = 0; return j; } -void clear_traces (void) -{ clear_traces_i(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); - clear_traces_f(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.0,0.0,0.0,0.0); - clear_traces_d(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.0,0.0,0.0,0.0); - clear_traces_J(); -} - -int main (void) -{ - void* callback_code; - void* callback_writable; -#define ALLOC_CALLBACK() \ - callback_writable = ffi_closure_alloc(sizeof(ffi_closure),&callback_code); \ - if (!callback_writable) abort() -#define PREP_CALLBACK(cif,simulator,data) \ - if (ffi_prep_closure_loc(callback_writable,&(cif),simulator,data,callback_code) != FFI_OK) abort() -#define FREE_CALLBACK() \ - ffi_closure_free(callback_writable) - - ffi_type_char = (char)(-1) < 0 ? ffi_type_schar : ffi_type_uchar; - out = stdout; - -#if (!defined(DGTEST)) || DGTEST == 1 - /* void tests */ - v_v(); - clear_traces(); - ALLOC_CALLBACK(); - { - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_void); - PREP_CALLBACK(cif,v_v_simulator,(void*)&v_v); - ((void (ABI_ATTR *) (void)) callback_code) (); - } - FREE_CALLBACK(); -#endif - - /* int tests */ - { int ir; - -#if (!defined(DGTEST)) || DGTEST == 2 - ir = i_v(); - fprintf(out,"->%d\n",ir); - fflush(out); - ir = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_sint); - PREP_CALLBACK(cif,i_v_simulator,(void*)&i_v); - ir = ((int (ABI_ATTR *) (void)) callback_code) (); - } - FREE_CALLBACK(); - fprintf(out,"->%d\n",ir); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 3 - ir = i_i(i1); - fprintf(out,"->%d\n",ir); - fflush(out); - ir = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_sint); - PREP_CALLBACK(cif,i_i_simulator,(void*)&i_i); - ir = ((int (ABI_ATTR *) (int)) callback_code) (i1); - } - FREE_CALLBACK(); - fprintf(out,"->%d\n",ir); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 4 - ir = i_i2(i1,i2); - fprintf(out,"->%d\n",ir); - fflush(out); - ir = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_sint); - PREP_CALLBACK(cif,i_i2_simulator,(void*)&i_i2); - ir = ((int (ABI_ATTR *) (int,int)) callback_code) (i1,i2); - } - FREE_CALLBACK(); - fprintf(out,"->%d\n",ir); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 5 - ir = i_i4(i1,i2,i3,i4); - fprintf(out,"->%d\n",ir); - fflush(out); - ir = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_sint); - PREP_CALLBACK(cif,i_i4_simulator,(void*)&i_i4); - ir = ((int (ABI_ATTR *) (int,int,int,int)) callback_code) (i1,i2,i3,i4); - } - FREE_CALLBACK(); - fprintf(out,"->%d\n",ir); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 6 - ir = i_i8(i1,i2,i3,i4,i5,i6,i7,i8); - fprintf(out,"->%d\n",ir); - fflush(out); - ir = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_sint); - PREP_CALLBACK(cif,i_i8_simulator,(void*)&i_i8); - ir = ((int (ABI_ATTR *) (int,int,int,int,int,int,int,int)) callback_code) (i1,i2,i3,i4,i5,i6,i7,i8); - } - FREE_CALLBACK(); - fprintf(out,"->%d\n",ir); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 7 - ir = i_i16(i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13,i14,i15,i16); - fprintf(out,"->%d\n",ir); - fflush(out); - ir = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_sint); - PREP_CALLBACK(cif,i_i16_simulator,(void*)&i_i16); - ir = ((int (ABI_ATTR *) (int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int)) callback_code) (i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13,i14,i15,i16); - } - FREE_CALLBACK(); - fprintf(out,"->%d\n",ir); - fflush(out); -#endif - } - - /* float tests */ - { float fr; - -#if (!defined(DGTEST)) || DGTEST == 8 - fr = f_f(f1); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_float }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - PREP_CALLBACK(cif,f_f_simulator,(void*)&f_f); - fr = ((float (ABI_ATTR *) (float)) callback_code) (f1); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 9 - fr = f_f2(f1,f2); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - PREP_CALLBACK(cif,f_f2_simulator,(void*)&f_f2); - fr = ((float (ABI_ATTR *) (float,float)) callback_code) (f1,f2); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 10 - fr = f_f4(f1,f2,f3,f4); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - PREP_CALLBACK(cif,f_f4_simulator,(void*)&f_f4); - fr = ((float (ABI_ATTR *) (float,float,float,float)) callback_code) (f1,f2,f3,f4); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 11 - fr = f_f8(f1,f2,f3,f4,f5,f6,f7,f8); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - PREP_CALLBACK(cif,f_f8_simulator,(void*)&f_f8); - fr = ((float (ABI_ATTR *) (float,float,float,float,float,float,float,float)) callback_code) (f1,f2,f3,f4,f5,f6,f7,f8); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 12 - fr = f_f16(f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - PREP_CALLBACK(cif,f_f16_simulator,(void*)&f_f16); - fr = ((float (ABI_ATTR *) (float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float)) callback_code) (f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 13 - fr = f_f24(f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - PREP_CALLBACK(cif,f_f24_simulator,(void*)&f_f24); - fr = ((float (ABI_ATTR *) (float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float)) callback_code) (f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - - } - - /* double tests */ - { double dr; - -#if (!defined(DGTEST)) || DGTEST == 14 - dr = d_d(d1); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_d_simulator,(void*)&d_d); - dr = ((double (ABI_ATTR *) (double)) callback_code) (d1); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 15 - dr = d_d2(d1,d2); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_d2_simulator,(void*)&d_d2); - dr = ((double (ABI_ATTR *) (double,double)) callback_code) (d1,d2); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 16 - dr = d_d4(d1,d2,d3,d4); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_d4_simulator,(void*)&d_d4); - dr = ((double (ABI_ATTR *) (double,double,double,double)) callback_code) (d1,d2,d3,d4); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 17 - dr = d_d8(d1,d2,d3,d4,d5,d6,d7,d8); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_d8_simulator,(void*)&d_d8); - dr = ((double (ABI_ATTR *) (double,double,double,double,double,double,double,double)) callback_code) (d1,d2,d3,d4,d5,d6,d7,d8); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 18 - dr = d_d16(d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_d16_simulator,(void*)&d_d16); - dr = ((double (ABI_ATTR *) (double,double,double,double,double,double,double,double,double,double,double,double,double,double,double,double)) callback_code) (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - } - - /* pointer tests */ - { void* vpr; - -#if (!defined(DGTEST)) || DGTEST == 19 - vpr = vp_vpdpcpsp(&uc1,&d2,str3,&I4); - fprintf(out,"->0x%p\n",vpr); - fflush(out); - vpr = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_pointer, &ffi_type_pointer, &ffi_type_pointer, &ffi_type_pointer }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_pointer); - PREP_CALLBACK(cif,vp_vpdpcpsp_simulator,(void*)&vp_vpdpcpsp); - vpr = ((void* (ABI_ATTR *) (void*,double*,char*,Int*)) callback_code) (&uc1,&d2,str3,&I4); - } - FREE_CALLBACK(); - fprintf(out,"->0x%p\n",vpr); - fflush(out); -#endif - } - - /* mixed number tests */ - { uchar ucr; - ushort usr; - float fr; - double dr; - long long llr; - -#if (!defined(DGTEST)) || DGTEST == 20 - ucr = uc_ucsil(uc1,us2,ui3,ul4); - fprintf(out,"->%u\n",ucr); - fflush(out); - ucr = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_uchar, &ffi_type_ushort, &ffi_type_uint, &ffi_type_ulong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_uchar); - PREP_CALLBACK(cif,uc_ucsil_simulator,(void*)&uc_ucsil); - ucr = ((uchar (ABI_ATTR *) (uchar,ushort,uint,ulong)) callback_code) (uc1,us2,ui3,ul4); - } - FREE_CALLBACK(); - fprintf(out,"->%u\n",ucr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 21 - dr = d_iidd(i1,i2,d3,d4); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint, &ffi_type_double, &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_iidd_simulator,(void*)&d_iidd); - dr = ((double (ABI_ATTR *) (int,int,double,double)) callback_code) (i1,i2,d3,d4); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 22 - dr = d_iiidi(i1,i2,i3,d4,i5); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_double, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_iiidi_simulator,(void*)&d_iiidi); - dr = ((double (ABI_ATTR *) (int,int,int,double,int)) callback_code) (i1,i2,i3,d4,i5); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 23 - dr = d_idid(i1,d2,i3,d4); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_double, &ffi_type_sint, &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_idid_simulator,(void*)&d_idid); - dr = ((double (ABI_ATTR *) (int,double,int,double)) callback_code) (i1,d2,i3,d4); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 24 - dr = d_fdi(f1,d2,i3); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_double, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_fdi_simulator,(void*)&d_fdi); - dr = ((double (ABI_ATTR *) (float,double,int)) callback_code) (f1,d2,i3); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 25 - usr = us_cdcd(c1,d2,c3,d4); - fprintf(out,"->%u\n",usr); - fflush(out); - usr = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_char, &ffi_type_double, &ffi_type_char, &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_ushort); - PREP_CALLBACK(cif,us_cdcd_simulator,(void*)&us_cdcd); - usr = ((ushort (ABI_ATTR *) (char,double,char,double)) callback_code) (c1,d2,c3,d4); - } - FREE_CALLBACK(); - fprintf(out,"->%u\n",usr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 26 - llr = ll_iiilli(i1,i2,i3,ll1,i13); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); - llr = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_slonglong, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); - PREP_CALLBACK(cif,ll_iiilli_simulator,(void*)&ll_iiilli); - llr = ((long long (ABI_ATTR *) (int,int,int,long long,int)) callback_code) (i1,i2,i3,ll1,i13); - } - FREE_CALLBACK(); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 27 - llr = ll_flli(f13,ll1,i13); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); - llr = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_slonglong, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); - PREP_CALLBACK(cif,ll_flli_simulator,(void*)&ll_flli); - llr = ((long long (ABI_ATTR *) (float,long long,int)) callback_code) (f13,ll1,i13); - } - FREE_CALLBACK(); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 28 - fr = f_fi(f1,i9); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - PREP_CALLBACK(cif,f_fi_simulator,(void*)&f_fi); - fr = ((float (ABI_ATTR *) (float,int)) callback_code) (f1,i9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 29 - fr = f_f2i(f1,f2,i9); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - PREP_CALLBACK(cif,f_f2i_simulator,(void*)&f_f2i); - fr = ((float (ABI_ATTR *) (float,float,int)) callback_code) (f1,f2,i9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 30 - fr = f_f3i(f1,f2,f3,i9); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - PREP_CALLBACK(cif,f_f3i_simulator,(void*)&f_f3i); - fr = ((float (ABI_ATTR *) (float,float,float,int)) callback_code) (f1,f2,f3,i9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 31 - fr = f_f4i(f1,f2,f3,f4,i9); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - PREP_CALLBACK(cif,f_f4i_simulator,(void*)&f_f4i); - fr = ((float (ABI_ATTR *) (float,float,float,float,int)) callback_code) (f1,f2,f3,f4,i9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 32 - fr = f_f7i(f1,f2,f3,f4,f5,f6,f7,i9); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - PREP_CALLBACK(cif,f_f7i_simulator,(void*)&f_f7i); - fr = ((float (ABI_ATTR *) (float,float,float,float,float,float,float,int)) callback_code) (f1,f2,f3,f4,f5,f6,f7,i9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 33 - fr = f_f8i(f1,f2,f3,f4,f5,f6,f7,f8,i9); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - PREP_CALLBACK(cif,f_f8i_simulator,(void*)&f_f8i); - fr = ((float (ABI_ATTR *) (float,float,float,float,float,float,float,float,int)) callback_code) (f1,f2,f3,f4,f5,f6,f7,f8,i9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 34 - fr = f_f13i(f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,i9); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - PREP_CALLBACK(cif,f_f13i_simulator,(void*)&f_f13i); - fr = ((float (ABI_ATTR *) (float,float,float,float,float,float,float,float,float,float,float,float,float,int)) callback_code) (f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,i9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 35 - dr = d_di(d1,i9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_di_simulator,(void*)&d_di); - dr = ((double (ABI_ATTR *) (double,int)) callback_code) (d1,i9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 36 - dr = d_d2i(d1,d2,i9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_d2i_simulator,(void*)&d_d2i); - dr = ((double (ABI_ATTR *) (double,double,int)) callback_code) (d1,d2,i9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 37 - dr = d_d3i(d1,d2,d3,i9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_d3i_simulator,(void*)&d_d3i); - dr = ((double (ABI_ATTR *) (double,double,double,int)) callback_code) (d1,d2,d3,i9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 38 - dr = d_d4i(d1,d2,d3,d4,i9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_d4i_simulator,(void*)&d_d4i); - dr = ((double (ABI_ATTR *) (double,double,double,double,int)) callback_code) (d1,d2,d3,d4,i9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 39 - dr = d_d7i(d1,d2,d3,d4,d5,d6,d7,i9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_d7i_simulator,(void*)&d_d7i); - dr = ((double (ABI_ATTR *) (double,double,double,double,double,double,double,int)) callback_code) (d1,d2,d3,d4,d5,d6,d7,i9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 40 - dr = d_d8i(d1,d2,d3,d4,d5,d6,d7,d8,i9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_d8i_simulator,(void*)&d_d8i); - dr = ((double (ABI_ATTR *) (double,double,double,double,double,double,double,double,int)) callback_code) (d1,d2,d3,d4,d5,d6,d7,d8,i9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 41 - dr = d_d12i(d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,i9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_d12i_simulator,(void*)&d_d12i); - dr = ((double (ABI_ATTR *) (double,double,double,double,double,double,double,double,double,double,double,double,int)) callback_code) (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,i9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 42 - dr = d_d13i(d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,i9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_d13i_simulator,(void*)&d_d13i); - dr = ((double (ABI_ATTR *) (double,double,double,double,double,double,double,double,double,double,double,double,double,int)) callback_code) (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,i9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - } - - /* small structure return tests */ -#if (!defined(DGTEST)) || DGTEST == 43 - { - Size1 r = S1_v(); - fprintf(out,"->{%c}\n",r.x1); - fflush(out); - memset(&r,0,sizeof(r)); clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* ffi_type_Size1_elements[] = { &ffi_type_char, NULL }; - ffi_type ffi_type_Size1; - ffi_type_Size1.type = FFI_TYPE_STRUCT; - ffi_type_Size1.size = sizeof(Size1); - ffi_type_Size1.alignment = alignof_slot(Size1); - ffi_type_Size1.elements = ffi_type_Size1_elements; - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_Size1); - PREP_CALLBACK(cif,S1_v_simulator,(void*)&S1_v); - r = ((Size1 (ABI_ATTR *) (void)) callback_code) (); - } - FREE_CALLBACK(); - fprintf(out,"->{%c}\n",r.x1); - fflush(out); - } -#endif - -#if (!defined(DGTEST)) || DGTEST == 44 - { - Size2 r = S2_v(); - fprintf(out,"->{%c%c}\n",r.x1,r.x2); - fflush(out); - memset(&r,0,sizeof(r)); clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* ffi_type_Size2_elements[] = { &ffi_type_char, &ffi_type_char, NULL }; - ffi_type ffi_type_Size2; - ffi_type_Size2.type = FFI_TYPE_STRUCT; - ffi_type_Size2.size = sizeof(Size2); - ffi_type_Size2.alignment = alignof_slot(Size2); - ffi_type_Size2.elements = ffi_type_Size2_elements; - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_Size2); - PREP_CALLBACK(cif,S2_v_simulator,(void*)&S2_v); - r = ((Size2 (ABI_ATTR *) (void)) callback_code) (); - } - FREE_CALLBACK(); - fprintf(out,"->{%c%c}\n",r.x1,r.x2); - fflush(out); - } -#endif - -#if (!defined(DGTEST)) || DGTEST == 45 - { - Size3 r = S3_v(); - fprintf(out,"->{%c%c%c}\n",r.x1,r.x2,r.x3); - fflush(out); - memset(&r,0,sizeof(r)); clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* ffi_type_Size3_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; - ffi_type ffi_type_Size3; - ffi_type_Size3.type = FFI_TYPE_STRUCT; - ffi_type_Size3.size = sizeof(Size3); - ffi_type_Size3.alignment = alignof_slot(Size3); - ffi_type_Size3.elements = ffi_type_Size3_elements; - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_Size3); - PREP_CALLBACK(cif,S3_v_simulator,(void*)&S3_v); - r = ((Size3 (ABI_ATTR *) (void)) callback_code) (); - } - FREE_CALLBACK(); - fprintf(out,"->{%c%c%c}\n",r.x1,r.x2,r.x3); - fflush(out); - } -#endif - -#if (!defined(DGTEST)) || DGTEST == 46 - { - Size4 r = S4_v(); - fprintf(out,"->{%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4); - fflush(out); - memset(&r,0,sizeof(r)); clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* ffi_type_Size4_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; - ffi_type ffi_type_Size4; - ffi_type_Size4.type = FFI_TYPE_STRUCT; - ffi_type_Size4.size = sizeof(Size4); - ffi_type_Size4.alignment = alignof_slot(Size4); - ffi_type_Size4.elements = ffi_type_Size4_elements; - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_Size4); - PREP_CALLBACK(cif,S4_v_simulator,(void*)&S4_v); - r = ((Size4 (ABI_ATTR *) (void)) callback_code) (); - } - FREE_CALLBACK(); - fprintf(out,"->{%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4); - fflush(out); - } -#endif - -#if (!defined(DGTEST)) || DGTEST == 47 - { - Size7 r = S7_v(); - fprintf(out,"->{%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7); - fflush(out); - memset(&r,0,sizeof(r)); clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* ffi_type_Size7_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; - ffi_type ffi_type_Size7; - ffi_type_Size7.type = FFI_TYPE_STRUCT; - ffi_type_Size7.size = sizeof(Size7); - ffi_type_Size7.alignment = alignof_slot(Size7); - ffi_type_Size7.elements = ffi_type_Size7_elements; - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_Size7); - PREP_CALLBACK(cif,S7_v_simulator,(void*)&S7_v); - r = ((Size7 (ABI_ATTR *) (void)) callback_code) (); - } - FREE_CALLBACK(); - fprintf(out,"->{%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7); - fflush(out); - } -#endif - -#if (!defined(DGTEST)) || DGTEST == 48 - { - Size8 r = S8_v(); - fprintf(out,"->{%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8); - fflush(out); - memset(&r,0,sizeof(r)); clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* ffi_type_Size8_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; - ffi_type ffi_type_Size8; - ffi_type_Size8.type = FFI_TYPE_STRUCT; - ffi_type_Size8.size = sizeof(Size8); - ffi_type_Size8.alignment = alignof_slot(Size8); - ffi_type_Size8.elements = ffi_type_Size8_elements; - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_Size8); - PREP_CALLBACK(cif,S8_v_simulator,(void*)&S8_v); - r = ((Size8 (ABI_ATTR *) (void)) callback_code) (); - } - FREE_CALLBACK(); - fprintf(out,"->{%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8); - fflush(out); - } -#endif - -#if (!defined(DGTEST)) || DGTEST == 49 - { - Size12 r = S12_v(); - fprintf(out,"->{%c%c%c%c%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8,r.x9,r.x10,r.x11,r.x12); - fflush(out); - memset(&r,0,sizeof(r)); clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* ffi_type_Size12_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; - ffi_type ffi_type_Size12; - ffi_type_Size12.type = FFI_TYPE_STRUCT; - ffi_type_Size12.size = sizeof(Size12); - ffi_type_Size12.alignment = alignof_slot(Size12); - ffi_type_Size12.elements = ffi_type_Size12_elements; - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_Size12); - PREP_CALLBACK(cif,S12_v_simulator,(void*)&S12_v); - r = ((Size12 (ABI_ATTR *) (void)) callback_code) (); - } - FREE_CALLBACK(); - fprintf(out,"->{%c%c%c%c%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8,r.x9,r.x10,r.x11,r.x12); - fflush(out); - } -#endif - -#if (!defined(DGTEST)) || DGTEST == 50 - { - Size15 r = S15_v(); - fprintf(out,"->{%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8,r.x9,r.x10,r.x11,r.x12,r.x13,r.x14,r.x15); - fflush(out); - memset(&r,0,sizeof(r)); clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* ffi_type_Size15_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; - ffi_type ffi_type_Size15; - ffi_type_Size15.type = FFI_TYPE_STRUCT; - ffi_type_Size15.size = sizeof(Size15); - ffi_type_Size15.alignment = alignof_slot(Size15); - ffi_type_Size15.elements = ffi_type_Size15_elements; - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_Size15); - PREP_CALLBACK(cif,S15_v_simulator,(void*)&S15_v); - r = ((Size15 (ABI_ATTR *) (void)) callback_code) (); - } - FREE_CALLBACK(); - fprintf(out,"->{%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8,r.x9,r.x10,r.x11,r.x12,r.x13,r.x14,r.x15); - fflush(out); - } -#endif - -#if (!defined(DGTEST)) || DGTEST == 51 - { - Size16 r = S16_v(); - fprintf(out,"->{%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8,r.x9,r.x10,r.x11,r.x12,r.x13,r.x14,r.x15,r.x16); - fflush(out); - memset(&r,0,sizeof(r)); clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* ffi_type_Size16_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; - ffi_type ffi_type_Size16; - ffi_type_Size16.type = FFI_TYPE_STRUCT; - ffi_type_Size16.size = sizeof(Size16); - ffi_type_Size16.alignment = alignof_slot(Size16); - ffi_type_Size16.elements = ffi_type_Size16_elements; - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_Size16); - PREP_CALLBACK(cif,S16_v_simulator,(void*)&S16_v); - r = ((Size16 (ABI_ATTR *) (void)) callback_code) (); - } - FREE_CALLBACK(); - fprintf(out,"->{%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8,r.x9,r.x10,r.x11,r.x12,r.x13,r.x14,r.x15,r.x16); - fflush(out); - } -#endif - - - /* structure tests */ - { Int Ir; - Char Cr; - Float Fr; - Double Dr; - J Jr; -#ifndef SKIP_EXTRA_STRUCTS - T Tr; - X Xr; -#endif - -#if (!defined(DGTEST)) || DGTEST == 52 - Ir = I_III(I1,I2,I3); - fprintf(out,"->{%d}\n",Ir.x); - fflush(out); - Ir.x = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* ffi_type_Int_elements[] = { &ffi_type_sint, NULL }; - ffi_type ffi_type_Int; - ffi_type_Int.type = FFI_TYPE_STRUCT; - ffi_type_Int.size = sizeof(Int); - ffi_type_Int.alignment = alignof_slot(Int); - ffi_type_Int.elements = ffi_type_Int_elements; - ffi_type* argtypes[] = { &ffi_type_Int, &ffi_type_Int, &ffi_type_Int }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_Int); - PREP_CALLBACK(cif,I_III_simulator,(void*)&I_III); - Ir = ((Int (ABI_ATTR *) (Int,Int,Int)) callback_code) (I1,I2,I3); - } - FREE_CALLBACK(); - fprintf(out,"->{%d}\n",Ir.x); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 53 - Cr = C_CdC(C1,d2,C3); - fprintf(out,"->{'%c'}\n",Cr.x); - fflush(out); - Cr.x = '\0'; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* ffi_type_Char_elements[] = { &ffi_type_char, NULL }; - ffi_type ffi_type_Char; - ffi_type_Char.type = FFI_TYPE_STRUCT; - ffi_type_Char.size = sizeof(Char); - ffi_type_Char.alignment = alignof_slot(Char); - ffi_type_Char.elements = ffi_type_Char_elements; - ffi_type* argtypes[] = { &ffi_type_Char, &ffi_type_double, &ffi_type_Char }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_Char); - PREP_CALLBACK(cif,C_CdC_simulator,(void*)&C_CdC); - Cr = ((Char (ABI_ATTR *) (Char,double,Char)) callback_code) (C1,d2,C3); - } - FREE_CALLBACK(); - fprintf(out,"->{'%c'}\n",Cr.x); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 54 - Fr = F_Ffd(F1,f2,d3); - fprintf(out,"->{%g}\n",Fr.x); - fflush(out); - Fr.x = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* ffi_type_Float_elements[] = { &ffi_type_float, NULL }; - ffi_type ffi_type_Float; - ffi_type_Float.type = FFI_TYPE_STRUCT; - ffi_type_Float.size = sizeof(Float); - ffi_type_Float.alignment = alignof_slot(Float); - ffi_type_Float.elements = ffi_type_Float_elements; - ffi_type* argtypes[] = { &ffi_type_Float, &ffi_type_float, &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_Float); - PREP_CALLBACK(cif,F_Ffd_simulator,(void*)&F_Ffd); - Fr = ((Float (ABI_ATTR *) (Float,float,double)) callback_code) (F1,f2,d3); - } - FREE_CALLBACK(); - fprintf(out,"->{%g}\n",Fr.x); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 55 - Dr = D_fDd(f1,D2,d3); - fprintf(out,"->{%g}\n",Dr.x); - fflush(out); - Dr.x = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* ffi_type_Double_elements[] = { &ffi_type_double, NULL }; - ffi_type ffi_type_Double; - ffi_type_Double.type = FFI_TYPE_STRUCT; - ffi_type_Double.size = sizeof(Double); - ffi_type_Double.alignment = alignof_slot(Double); - ffi_type_Double.elements = ffi_type_Double_elements; - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_Double, &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_Double); - PREP_CALLBACK(cif,D_fDd_simulator,(void*)&D_fDd); - Dr = ((Double (ABI_ATTR *) (float,Double,double)) callback_code) (f1,D2,d3); - } - FREE_CALLBACK(); - fprintf(out,"->{%g}\n",Dr.x); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 56 - Dr = D_Dfd(D1,f2,d3); - fprintf(out,"->{%g}\n",Dr.x); - fflush(out); - Dr.x = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* ffi_type_Double_elements[] = { &ffi_type_double, NULL }; - ffi_type ffi_type_Double; - ffi_type_Double.type = FFI_TYPE_STRUCT; - ffi_type_Double.size = sizeof(Double); - ffi_type_Double.alignment = alignof_slot(Double); - ffi_type_Double.elements = ffi_type_Double_elements; - ffi_type* argtypes[] = { &ffi_type_Double, &ffi_type_float, &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_Double); - PREP_CALLBACK(cif,D_Dfd_simulator,(void*)&D_Dfd); - Dr = ((Double (ABI_ATTR *) (Double,float,double)) callback_code) (D1,f2,d3); - } - FREE_CALLBACK(); - fprintf(out,"->{%g}\n",Dr.x); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 57 - Jr = J_JiJ(J1,i2,J2); - fprintf(out,"->{%ld,%ld}\n",Jr.l1,Jr.l2); - fflush(out); - Jr.l1 = Jr.l2 = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* ffi_type_J_elements[] = { &ffi_type_slong, &ffi_type_slong, NULL }; - ffi_type ffi_type_J; - ffi_type_J.type = FFI_TYPE_STRUCT; - ffi_type_J.size = sizeof(J); - ffi_type_J.alignment = alignof_slot(J); - ffi_type_J.elements = ffi_type_J_elements; - ffi_type* argtypes[] = { &ffi_type_J, &ffi_type_sint, &ffi_type_J }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_J); - PREP_CALLBACK(cif,J_JiJ_simulator,(void*)&J_JiJ); - Jr = ((J (ABI_ATTR *) (J,int,J)) callback_code) (J1,i2,J2); - } - FREE_CALLBACK(); - fprintf(out,"->{%ld,%ld}\n",Jr.l1,Jr.l2); - fflush(out); -#endif - -#ifndef SKIP_EXTRA_STRUCTS -#if (!defined(DGTEST)) || DGTEST == 58 - Tr = T_TcT(T1,' ',T2); - fprintf(out,"->{\"%c%c%c\"}\n",Tr.c[0],Tr.c[1],Tr.c[2]); - fflush(out); - Tr.c[0] = Tr.c[1] = Tr.c[2] = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* ffi_type_T_elements[] = { ??, NULL }; - ffi_type ffi_type_T; - ffi_type_T.type = FFI_TYPE_STRUCT; - ffi_type_T.size = sizeof(T); - ffi_type_T.alignment = alignof_slot(T); - ffi_type_T.elements = ffi_type_T_elements; - ffi_type* argtypes[] = { &ffi_type_T, &ffi_type_char, &ffi_type_T }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_T); - PREP_CALLBACK(cif,T_TcT_simulator,(void*)&T_TcT); - Tr = ((T (ABI_ATTR *) (T,char,T)) callback_code) (T1,' ',T2); - } - FREE_CALLBACK(); - fprintf(out,"->{\"%c%c%c\"}\n",Tr.c[0],Tr.c[1],Tr.c[2]); - fflush(out); -#endif - -#ifndef SKIP_X -#if (!defined(DGTEST)) || DGTEST == 59 - Xr = X_BcdB(B1,c2,d3,B2); - fprintf(out,"->{\"%s\",'%c'}\n",Xr.c,Xr.c1); - fflush(out); - Xr.c[0]=Xr.c1='\0'; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* ffi_type_X_elements[] = { ??, NULL }; - ffi_type ffi_type_X; - ffi_type_X.type = FFI_TYPE_STRUCT; - ffi_type_X.size = sizeof(X); - ffi_type_X.alignment = alignof_slot(X); - ffi_type_X.elements = ffi_type_X_elements; - ffi_type* argtypes[] = { &ffi_type_X, &ffi_type_char, &ffi_type_double, &ffi_type_X }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_X); - PREP_CALLBACK(cif,X_BcdB_simulator,(void*)&X_BcdB); - Xr = ((X (ABI_ATTR *) (B,char,double,B)) callback_code) (B1,c2,d3,B2); - } - FREE_CALLBACK(); - fprintf(out,"->{\"%s\",'%c'}\n",Xr.c,Xr.c1); - fflush(out); -#endif -#endif -#endif - } - - - /* gpargs boundary tests */ - { - ffi_type* ffi_type_K_elements[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, NULL }; - ffi_type ffi_type_K; - ffi_type* ffi_type_L_elements[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, NULL }; - ffi_type ffi_type_L; - long lr; - long long llr; - float fr; - double dr; - - ffi_type_K.type = FFI_TYPE_STRUCT; - ffi_type_K.size = sizeof(K); - ffi_type_K.alignment = alignof_slot(K); - ffi_type_K.elements = ffi_type_K_elements; - - ffi_type_L.type = FFI_TYPE_STRUCT; - ffi_type_L.size = sizeof(L); - ffi_type_L.alignment = alignof_slot(L); - ffi_type_L.elements = ffi_type_L_elements; - -#if (!defined(DGTEST)) || DGTEST == 60 - lr = l_l0K(K1,l9); - fprintf(out,"->%ld\n",lr); - fflush(out); - lr = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_K, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slong); - PREP_CALLBACK(cif,l_l0K_simulator,(void*)l_l0K); - lr = ((long (ABI_ATTR *) (K,long)) callback_code) (K1,l9); - } - FREE_CALLBACK(); - fprintf(out,"->%ld\n",lr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 61 - lr = l_l1K(l1,K1,l9); - fprintf(out,"->%ld\n",lr); - fflush(out); - lr = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_K, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slong); - PREP_CALLBACK(cif,l_l1K_simulator,(void*)l_l1K); - lr = ((long (ABI_ATTR *) (long,K,long)) callback_code) (l1,K1,l9); - } - FREE_CALLBACK(); - fprintf(out,"->%ld\n",lr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 62 - lr = l_l2K(l1,l2,K1,l9); - fprintf(out,"->%ld\n",lr); - fflush(out); - lr = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_K, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slong); - PREP_CALLBACK(cif,l_l2K_simulator,(void*)l_l2K); - lr = ((long (ABI_ATTR *) (long,long,K,long)) callback_code) (l1,l2,K1,l9); - } - FREE_CALLBACK(); - fprintf(out,"->%ld\n",lr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 63 - lr = l_l3K(l1,l2,l3,K1,l9); - fprintf(out,"->%ld\n",lr); - fflush(out); - lr = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_K, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slong); - PREP_CALLBACK(cif,l_l3K_simulator,(void*)l_l3K); - lr = ((long (ABI_ATTR *) (long,long,long,K,long)) callback_code) (l1,l2,l3,K1,l9); - } - FREE_CALLBACK(); - fprintf(out,"->%ld\n",lr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 64 - lr = l_l4K(l1,l2,l3,l4,K1,l9); - fprintf(out,"->%ld\n",lr); - fflush(out); - lr = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_K, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slong); - PREP_CALLBACK(cif,l_l4K_simulator,(void*)l_l4K); - lr = ((long (ABI_ATTR *) (long,long,long,long,K,long)) callback_code) (l1,l2,l3,l4,K1,l9); - } - FREE_CALLBACK(); - fprintf(out,"->%ld\n",lr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 65 - lr = l_l5K(l1,l2,l3,l4,l5,K1,l9); - fprintf(out,"->%ld\n",lr); - fflush(out); - lr = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_K, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slong); - PREP_CALLBACK(cif,l_l5K_simulator,(void*)l_l5K); - lr = ((long (ABI_ATTR *) (long,long,long,long,long,K,long)) callback_code) (l1,l2,l3,l4,l5,K1,l9); - } - FREE_CALLBACK(); - fprintf(out,"->%ld\n",lr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 66 - lr = l_l6K(l1,l2,l3,l4,l5,l6,K1,l9); - fprintf(out,"->%ld\n",lr); - fflush(out); - lr = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_K, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slong); - PREP_CALLBACK(cif,l_l6K_simulator,(void*)l_l6K); - lr = ((long (ABI_ATTR *) (long,long,long,long,long,long,K,long)) callback_code) (l1,l2,l3,l4,l5,l6,K1,l9); - } - FREE_CALLBACK(); - fprintf(out,"->%ld\n",lr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 67 - fr = f_f17l3L(f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,l6,l7,l8,L1); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_L }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - PREP_CALLBACK(cif,f_f17l3L_simulator,(void*)&f_f17l3L); - fr = ((float (ABI_ATTR *) (float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,long,long,long,L)) callback_code) (f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,l6,l7,l8,L1); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 68 - dr = d_d17l3L(d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,l6,l7,l8,L1); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_L }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_d17l3L_simulator,(void*)&d_d17l3L); - dr = ((double (ABI_ATTR *) (double,double,double,double,double,double,double,double,double,double,double,double,double,double,double,double,double,long,long,long,L)) callback_code) (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,l6,l7,l8,L1); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 69 - llr = ll_l2ll(l1,l2,ll1,l9); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); - llr = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slonglong, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); - PREP_CALLBACK(cif,ll_l2ll_simulator,(void*)ll_l2ll); - llr = ((long long (ABI_ATTR *) (long,long,long long,long)) callback_code) (l1,l2,ll1,l9); - } - FREE_CALLBACK(); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 70 - llr = ll_l3ll(l1,l2,l3,ll1,l9); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); - llr = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slonglong, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); - PREP_CALLBACK(cif,ll_l3ll_simulator,(void*)ll_l3ll); - llr = ((long long (ABI_ATTR *) (long,long,long,long long,long)) callback_code) (l1,l2,l3,ll1,l9); - } - FREE_CALLBACK(); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 71 - llr = ll_l4ll(l1,l2,l3,l4,ll1,l9); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); - llr = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slonglong, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); - PREP_CALLBACK(cif,ll_l4ll_simulator,(void*)ll_l4ll); - llr = ((long long (ABI_ATTR *) (long,long,long,long,long long,long)) callback_code) (l1,l2,l3,l4,ll1,l9); - } - FREE_CALLBACK(); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 72 - llr = ll_l5ll(l1,l2,l3,l4,l5,ll1,l9); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); - llr = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slonglong, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); - PREP_CALLBACK(cif,ll_l5ll_simulator,(void*)ll_l5ll); - llr = ((long long (ABI_ATTR *) (long,long,long,long,long,long long,long)) callback_code) (l1,l2,l3,l4,l5,ll1,l9); - } - FREE_CALLBACK(); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 73 - llr = ll_l6ll(l1,l2,l3,l4,l5,l6,ll1,l9); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); - llr = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slonglong, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); - PREP_CALLBACK(cif,ll_l6ll_simulator,(void*)ll_l6ll); - llr = ((long long (ABI_ATTR *) (long,long,long,long,long,long,long long,long)) callback_code) (l1,l2,l3,l4,l5,l6,ll1,l9); - } - FREE_CALLBACK(); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 74 - llr = ll_l7ll(l1,l2,l3,l4,l5,l6,l7,ll1,l9); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); - llr = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slonglong, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); - PREP_CALLBACK(cif,ll_l7ll_simulator,(void*)ll_l7ll); - llr = ((long long (ABI_ATTR *) (long,long,long,long,long,long,long,long long,long)) callback_code) (l1,l2,l3,l4,l5,l6,l7,ll1,l9); - } - FREE_CALLBACK(); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 75 - dr = d_l2d(l1,l2,ll1,l9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_double, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_l2d_simulator,(void*)d_l2d); - dr = ((double (ABI_ATTR *) (long,long,double,long)) callback_code) (l1,l2,ll1,l9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 76 - dr = d_l3d(l1,l2,l3,ll1,l9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_double, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_l3d_simulator,(void*)d_l3d); - dr = ((double (ABI_ATTR *) (long,long,long,double,long)) callback_code) (l1,l2,l3,ll1,l9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 77 - dr = d_l4d(l1,l2,l3,l4,ll1,l9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_double, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_l4d_simulator,(void*)d_l4d); - dr = ((double (ABI_ATTR *) (long,long,long,long,double,long)) callback_code) (l1,l2,l3,l4,ll1,l9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 78 - dr = d_l5d(l1,l2,l3,l4,l5,ll1,l9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_double, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_l5d_simulator,(void*)d_l5d); - dr = ((double (ABI_ATTR *) (long,long,long,long,long,double,long)) callback_code) (l1,l2,l3,l4,l5,ll1,l9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 79 - dr = d_l6d(l1,l2,l3,l4,l5,l6,ll1,l9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_double, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_l6d_simulator,(void*)d_l6d); - dr = ((double (ABI_ATTR *) (long,long,long,long,long,long,double,long)) callback_code) (l1,l2,l3,l4,l5,l6,ll1,l9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 80 - dr = d_l7d(l1,l2,l3,l4,l5,l6,l7,ll1,l9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_double, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_l7d_simulator,(void*)d_l7d); - dr = ((double (ABI_ATTR *) (long,long,long,long,long,long,long,double,long)) callback_code) (l1,l2,l3,l4,l5,l6,l7,ll1,l9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - - } - - exit(0); -} - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.bhaible/testcases.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.bhaible/testcases.c deleted file mode 100644 index d25ebf4..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.bhaible/testcases.c +++ /dev/null @@ -1,743 +0,0 @@ -/* - * Copyright 1993 Bill Triggs - * Copyright 1995-2017 Bruno Haible - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/* This file defines test functions of selected signatures, that exercise - dark corners of the various ABIs. */ - -#include - -FILE* out; - -#define uchar unsigned char -#define ushort unsigned short -#define uint unsigned int -#define ulong unsigned long - -typedef struct { char x; } Char; -typedef struct { short x; } Short; -typedef struct { int x; } Int; -typedef struct { long x; } Long; -typedef struct { float x; } Float; -typedef struct { double x; } Double; -typedef struct { char c; float f; } A; -typedef struct { double d; int i[3]; } B; -typedef struct { long l1; long l2; } J; -typedef struct { long l1; long l2; long l3; long l4; } K; -typedef struct { long l1; long l2; long l3; long l4; long l5; long l6; } L; -typedef struct { char x1; } Size1; -typedef struct { char x1; char x2; } Size2; -typedef struct { char x1; char x2; char x3; } Size3; -typedef struct { char x1; char x2; char x3; char x4; } Size4; -typedef struct { - char x1; char x2; char x3; char x4; char x5; char x6; char x7; -} Size7; -typedef struct { - char x1; char x2; char x3; char x4; char x5; char x6; char x7; char x8; -} Size8; -typedef struct { - char x1; char x2; char x3; char x4; char x5; char x6; char x7; char x8; - char x9; char x10; char x11; char x12; -} Size12; -typedef struct { - char x1; char x2; char x3; char x4; char x5; char x6; char x7; char x8; - char x9; char x10; char x11; char x12; char x13; char x14; char x15; -} Size15; -typedef struct { - char x1; char x2; char x3; char x4; char x5; char x6; char x7; char x8; - char x9; char x10; char x11; char x12; char x13; char x14; char x15; char x16; -} Size16; -typedef struct { char c[3]; } T; -typedef struct { char c[33],c1; } X; - -char c1='a', c2=127, c3=(char)128, c4=(char)255, c5=-1; -short s1=32767, s2=(short)32768, s3=3, s4=4, s5=5, s6=6, s7=7, s8=8, s9=9; -int i1=1, i2=2, i3=3, i4=4, i5=5, i6=6, i7=7, i8=8, i9=9, - i10=11, i11=12, i12=13, i13=14, i14=15, i15=16, i16=17; -long l1=1, l2=2, l3=3, l4=4, l5=5, l6=6, l7=7, l8=8, l9=9; -long long ll1 = 3875056143130689530LL; -float f1=0.1f, f2=0.2f, f3=0.3f, f4=0.4f, f5=0.5f, f6=0.6f, f7=0.7f, f8=0.8f, f9=0.9f, - f10=1.1f, f11=1.2f, f12=1.3f, f13=1.4f, f14=1.5f, f15=1.6f, f16=1.7f, f17=1.8f, - f18=1.9f, f19=2.1f, f20=2.2f, f21=2.3f, f22=2.4f, f23=2.5f, f24=2.6f; -double d1=0.1, d2=0.2, d3=0.3, d4=0.4, d5=0.5, d6=0.6, d7=0.7, d8=0.8, d9=0.9, - d10=1.1, d11=1.2, d12=1.3, d13=1.4, d14=1.5, d15=1.6, d16=1.7, d17=1.8; - -uchar uc1='a', uc2=127, uc3=128, uc4=255, uc5=(uchar)-1; -ushort us1=1, us2=2, us3=3, us4=4, us5=5, us6=6, us7=7, us8=8, us9=9; -uint ui1=1, ui2=2, ui3=3, ui4=4, ui5=5, ui6=6, ui7=7, ui8=8, ui9=9; -ulong ul1=1, ul2=2, ul3=3, ul4=4, ul5=5, ul6=6, ul7=7, ul8=8, ul9=9; - -char *str1="hello",str2[]="goodbye",*str3="still here?"; -Char C1={'A'}, C2={'B'}, C3={'C'}, C4={'\377'}, C5={(char)(-1)}; -Short S1={1}, S2={2}, S3={3}, S4={4}, S5={5}, S6={6}, S7={7}, S8={8}, S9={9}; -Int I1={1}, I2={2}, I3={3}, I4={4}, I5={5}, I6={6}, I7={7}, I8={8}, I9={9}; -Float F1={0.1f}, F2={0.2f}, F3={0.3f}, F4={0.4f}, F5={0.5f}, F6={0.6f}, F7={0.7f}, F8={0.8f}, F9={0.9f}; -Double D1={0.1}, D2={0.2}, D3={0.3}, D4={0.4}, D5={0.5}, D6={0.6}, D7={0.7}, D8={0.8}, D9={0.9}; - -A A1={'a',0.1f},A2={'b',0.2f},A3={'\377',0.3f}; -B B1={0.1,{1,2,3}},B2={0.2,{5,4,3}}; -J J1={47,11},J2={73,55}; -K K1={19,69,12,28}; -L L1={561,1105,1729,2465,2821,6601}; /* A002997 */ -Size1 Size1_1={'a'}; -Size2 Size2_1={'a','b'}; -Size3 Size3_1={'a','b','c'}; -Size4 Size4_1={'a','b','c','d'}; -Size7 Size7_1={'a','b','c','d','e','f','g'}; -Size8 Size8_1={'a','b','c','d','e','f','g','h'}; -Size12 Size12_1={'a','b','c','d','e','f','g','h','i','j','k','l'}; -Size15 Size15_1={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o'}; -Size16 Size16_1={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p'}; -T T1={{'t','h','e'}},T2={{'f','o','x'}}; -X X1={"abcdefghijklmnopqrstuvwxyzABCDEF",'G'}, X2={"123",'9'}, X3={"return-return-return",'R'}; - -#if defined(__GNUC__) -#define __STDCALL__ __attribute__((stdcall)) -#define __THISCALL__ __attribute__((thiscall)) -#define __FASTCALL__ __attribute__((fastcall)) -#define __MSABI__ __attribute__((ms_abi)) -#else -#define __STDCALL__ __stdcall -#define __THISCALL__ __thiscall -#define __FASTCALL__ __fastcall -#endif - -#ifndef ABI_ATTR -#define ABI_ATTR -#endif - -/* void tests */ -void ABI_ATTR v_v (void) -{ - fprintf(out,"void f(void):\n"); - fflush(out); -} - -/* int tests */ -int ABI_ATTR i_v (void) -{ - int r=99; - fprintf(out,"int f(void):"); - fflush(out); - return r; -} -int ABI_ATTR i_i (int a) -{ - int r=a+1; - fprintf(out,"int f(int):(%d)",a); - fflush(out); - return r; -} -int ABI_ATTR i_i2 (int a, int b) -{ - int r=a+b; - fprintf(out,"int f(2*int):(%d,%d)",a,b); - fflush(out); - return r; -} -int ABI_ATTR i_i4 (int a, int b, int c, int d) -{ - int r=a+b+c+d; - fprintf(out,"int f(4*int):(%d,%d,%d,%d)",a,b,c,d); - fflush(out); - return r; -} -int ABI_ATTR i_i8 (int a, int b, int c, int d, int e, int f, int g, int h) -{ - int r=a+b+c+d+e+f+g+h; - fprintf(out,"int f(8*int):(%d,%d,%d,%d,%d,%d,%d,%d)",a,b,c,d,e,f,g,h); - fflush(out); - return r; -} -int ABI_ATTR i_i16 (int a, int b, int c, int d, int e, int f, int g, int h, - int i, int j, int k, int l, int m, int n, int o, int p) -{ - int r=a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p; - fprintf(out,"int f(16*int):(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)", - a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p); - fflush(out); - return r; -} - -/* float tests */ -float ABI_ATTR f_f (float a) -{ - float r=a+1.0f; - fprintf(out,"float f(float):(%g)",a); - fflush(out); - return r; -} -float ABI_ATTR f_f2 (float a, float b) -{ - float r=a+b; - fprintf(out,"float f(2*float):(%g,%g)",a,b); - fflush(out); - return r; -} -float ABI_ATTR f_f4 (float a, float b, float c, float d) -{ - float r=a+b+c+d; - fprintf(out,"float f(4*float):(%g,%g,%g,%g)",a,b,c,d); - fflush(out); - return r; -} -float ABI_ATTR f_f8 (float a, float b, float c, float d, float e, float f, - float g, float h) -{ - float r=a+b+c+d+e+f+g+h; - fprintf(out,"float f(8*float):(%g,%g,%g,%g,%g,%g,%g,%g)",a,b,c,d,e,f,g,h); - fflush(out); - return r; -} -float ABI_ATTR f_f16 (float a, float b, float c, float d, float e, float f, float g, float h, - float i, float j, float k, float l, float m, float n, float o, float p) -{ - float r=a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p; - fprintf(out,"float f(16*float):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g)",a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p); - fflush(out); - return r; -} -float ABI_ATTR f_f24 (float a, float b, float c, float d, float e, float f, float g, float h, - float i, float j, float k, float l, float m, float n, float o, float p, - float q, float s, float t, float u, float v, float w, float x, float y) -{ - float r=a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+s+t+u+v+w+x+y; - fprintf(out,"float f(24*float):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g)",a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,s,t,u,v,w,x,y); - fflush(out); - return r; -} - -/* double tests */ -double ABI_ATTR d_d (double a) -{ - double r=a+1.0; - fprintf(out,"double f(double):(%g)",a); - fflush(out); - return r; -} -double ABI_ATTR d_d2 (double a, double b) -{ - double r=a+b; - fprintf(out,"double f(2*double):(%g,%g)",a,b); - fflush(out); - return r; -} -double ABI_ATTR d_d4 (double a, double b, double c, double d) -{ - double r=a+b+c+d; - fprintf(out,"double f(4*double):(%g,%g,%g,%g)",a,b,c,d); - fflush(out); - return r; -} -double ABI_ATTR d_d8 (double a, double b, double c, double d, double e, double f, - double g, double h) -{ - double r=a+b+c+d+e+f+g+h; - fprintf(out,"double f(8*double):(%g,%g,%g,%g,%g,%g,%g,%g)",a,b,c,d,e,f,g,h); - fflush(out); - return r; -} -double ABI_ATTR d_d16 (double a, double b, double c, double d, double e, double f, - double g, double h, double i, double j, double k, double l, - double m, double n, double o, double p) -{ - double r=a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p; - fprintf(out,"double f(16*double):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g)",a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p); - fflush(out); - return r; -} - -/* pointer tests */ -void* ABI_ATTR vp_vpdpcpsp (void* a, double* b, char* c, Int* d) -{ - void* ret = (char*)b + 1; - fprintf(out,"void* f(void*,double*,char*,Int*):(0x%p,0x%p,0x%p,0x%p)",a,b,c,d); - fflush(out); - return ret; -} - -/* mixed number tests */ -uchar ABI_ATTR uc_ucsil (uchar a, ushort b, uint c, ulong d) -{ - uchar r = (uchar)-1; - fprintf(out,"uchar f(uchar,ushort,uint,ulong):(%u,%u,%u,%lu)",a,b,c,d); - fflush(out); - return r; -} -double ABI_ATTR d_iidd (int a, int b, double c, double d) -{ - double r = a+b+c+d; - fprintf(out,"double f(int,int,double,double):(%d,%d,%g,%g)",a,b,c,d); - fflush(out); - return r; -} -double ABI_ATTR d_iiidi (int a, int b, int c, double d, int e) -{ - double r = a+b+c+d+e; - fprintf(out,"double f(int,int,int,double,int):(%d,%d,%d,%g,%d)",a,b,c,d,e); - fflush(out); - return r; -} -double ABI_ATTR d_idid (int a, double b, int c, double d) -{ - double r = a+b+c+d; - fprintf(out,"double f(int,double,int,double):(%d,%g,%d,%g)",a,b,c,d); - fflush(out); - return r; -} -double ABI_ATTR d_fdi (float a, double b, int c) -{ - double r = a+b+c; - fprintf(out,"double f(float,double,int):(%g,%g,%d)",a,b,c); - fflush(out); - return r; -} -ushort ABI_ATTR us_cdcd (char a, double b, char c, double d) -{ - ushort r = (ushort)(a + b + c + d); - fprintf(out,"ushort f(char,double,char,double):('%c',%g,'%c',%g)",a,b,c,d); - fflush(out); - return r; -} - -long long ABI_ATTR ll_iiilli (int a, int b, int c, long long d, int e) -{ - long long r = (long long)(int)a+(long long)(int)b+(long long)(int)c+d+(long long)(int)e; - fprintf(out,"long long f(int,int,int,long long,int):(%d,%d,%d,0x%lx%08lx,%d)",a,b,c,(long)(d>>32),(long)(d&0xffffffff),e); - fflush(out); - return r; -} -long long ABI_ATTR ll_flli (float a, long long b, int c) -{ - long long r = (long long)(int)a + b + (long long)c; - fprintf(out,"long long f(float,long long,int):(%g,0x%lx%08lx,0x%lx)",a,(long)(b>>32),(long)(b&0xffffffff),(long)c); - fflush(out); - return r; -} - -float ABI_ATTR f_fi (float a, int z) -{ - float r = a+z; - fprintf(out,"float f(float,int):(%g,%d)",a,z); - fflush(out); - return r; -} -float ABI_ATTR f_f2i (float a, float b, int z) -{ - float r = a+b+z; - fprintf(out,"float f(2*float,int):(%g,%g,%d)",a,b,z); - fflush(out); - return r; -} -float ABI_ATTR f_f3i (float a, float b, float c, int z) -{ - float r = a+b+c+z; - fprintf(out,"float f(3*float,int):(%g,%g,%g,%d)",a,b,c,z); - fflush(out); - return r; -} -float ABI_ATTR f_f4i (float a, float b, float c, float d, int z) -{ - float r = a+b+c+d+z; - fprintf(out,"float f(4*float,int):(%g,%g,%g,%g,%d)",a,b,c,d,z); - fflush(out); - return r; -} -float ABI_ATTR f_f7i (float a, float b, float c, float d, float e, float f, float g, - int z) -{ - float r = a+b+c+d+e+f+g+z; - fprintf(out,"float f(7*float,int):(%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,z); - fflush(out); - return r; -} -float ABI_ATTR f_f8i (float a, float b, float c, float d, float e, float f, float g, - float h, int z) -{ - float r = a+b+c+d+e+f+g+h+z; - fprintf(out,"float f(8*float,int):(%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,z); - fflush(out); - return r; -} -float ABI_ATTR f_f12i (float a, float b, float c, float d, float e, float f, float g, - float h, float i, float j, float k, float l, int z) -{ - float r = a+b+c+d+e+f+g+h+i+j+k+l+z; - fprintf(out,"float f(12*float,int):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,i,j,k,l,z); - fflush(out); - return r; -} -float ABI_ATTR f_f13i (float a, float b, float c, float d, float e, float f, float g, - float h, float i, float j, float k, float l, float m, int z) -{ - float r = a+b+c+d+e+f+g+h+i+j+k+l+m+z; - fprintf(out,"float f(13*float,int):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,i,j,k,l,m,z); - fflush(out); - return r; -} - -double ABI_ATTR d_di (double a, int z) -{ - double r = a+z; - fprintf(out,"double f(double,int):(%g,%d)",a,z); - fflush(out); - return r; -} -double ABI_ATTR d_d2i (double a, double b, int z) -{ - double r = a+b+z; - fprintf(out,"double f(2*double,int):(%g,%g,%d)",a,b,z); - fflush(out); - return r; -} -double ABI_ATTR d_d3i (double a, double b, double c, int z) -{ - double r = a+b+c+z; - fprintf(out,"double f(3*double,int):(%g,%g,%g,%d)",a,b,c,z); - fflush(out); - return r; -} -double ABI_ATTR d_d4i (double a, double b, double c, double d, int z) -{ - double r = a+b+c+d+z; - fprintf(out,"double f(4*double,int):(%g,%g,%g,%g,%d)",a,b,c,d,z); - fflush(out); - return r; -} -double ABI_ATTR d_d7i (double a, double b, double c, double d, double e, double f, - double g, int z) -{ - double r = a+b+c+d+e+f+g+z; - fprintf(out,"double f(7*double,int):(%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,z); - fflush(out); - return r; -} -double ABI_ATTR d_d8i (double a, double b, double c, double d, double e, double f, - double g, double h, int z) -{ - double r = a+b+c+d+e+f+g+h+z; - fprintf(out,"double f(8*double,int):(%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,z); - fflush(out); - return r; -} -double ABI_ATTR d_d12i (double a, double b, double c, double d, double e, double f, - double g, double h, double i, double j, double k, double l, - int z) -{ - double r = a+b+c+d+e+f+g+h+i+j+k+l+z; - fprintf(out,"double f(12*double,int):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,i,j,k,l,z); - fflush(out); - return r; -} -double ABI_ATTR d_d13i (double a, double b, double c, double d, double e, double f, - double g, double h, double i, double j, double k, double l, - double m, int z) -{ - double r = a+b+c+d+e+f+g+h+i+j+k+l+m+z; - fprintf(out,"double f(13*double,int):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,i,j,k,l,m,z); - fflush(out); - return r; -} - -/* small structure return tests */ -Size1 ABI_ATTR S1_v (void) -{ - fprintf(out,"Size1 f(void):"); - fflush(out); - return Size1_1; -} -Size2 ABI_ATTR S2_v (void) -{ - fprintf(out,"Size2 f(void):"); - fflush(out); - return Size2_1; -} -Size3 ABI_ATTR S3_v (void) -{ - fprintf(out,"Size3 f(void):"); - fflush(out); - return Size3_1; -} -Size4 ABI_ATTR S4_v (void) -{ - fprintf(out,"Size4 f(void):"); - fflush(out); - return Size4_1; -} -Size7 ABI_ATTR S7_v (void) -{ - fprintf(out,"Size7 f(void):"); - fflush(out); - return Size7_1; -} -Size8 ABI_ATTR S8_v (void) -{ - fprintf(out,"Size8 f(void):"); - fflush(out); - return Size8_1; -} -Size12 ABI_ATTR S12_v (void) -{ - fprintf(out,"Size12 f(void):"); - fflush(out); - return Size12_1; -} -Size15 ABI_ATTR S15_v (void) -{ - fprintf(out,"Size15 f(void):"); - fflush(out); - return Size15_1; -} -Size16 ABI_ATTR S16_v (void) -{ - fprintf(out,"Size16 f(void):"); - fflush(out); - return Size16_1; -} - -/* structure tests */ -Int ABI_ATTR I_III (Int a, Int b, Int c) -{ - Int r; - r.x = a.x + b.x + c.x; - fprintf(out,"Int f(Int,Int,Int):({%d},{%d},{%d})",a.x,b.x,c.x); - fflush(out); - return r; -} -Char ABI_ATTR C_CdC (Char a, double b, Char c) -{ - Char r; - r.x = (a.x + c.x)/2; - fprintf(out,"Char f(Char,double,Char):({'%c'},%g,{'%c'})",a.x,b,c.x); - fflush(out); - return r; -} -Float ABI_ATTR F_Ffd (Float a, float b, double c) -{ - Float r; - r.x = (float) (a.x + b + c); - fprintf(out,"Float f(Float,float,double):({%g},%g,%g)",a.x,b,c); - fflush(out); - return r; -} -Double ABI_ATTR D_fDd (float a, Double b, double c) -{ - Double r; - r.x = a + b.x + c; - fprintf(out,"Double f(float,Double,double):(%g,{%g},%g)",a,b.x,c); - fflush(out); - return r; -} -Double ABI_ATTR D_Dfd (Double a, float b, double c) -{ - Double r; - r.x = a.x + b + c; - fprintf(out,"Double f(Double,float,double):({%g},%g,%g)",a.x,b,c); - fflush(out); - return r; -} -J ABI_ATTR J_JiJ (J a, int b, J c) -{ - J r; - r.l1 = a.l1+c.l1; r.l2 = a.l2+b+c.l2; - fprintf(out,"J f(J,int,J):({%ld,%ld},%d,{%ld,%ld})",a.l1,a.l2,b,c.l1,c.l2); - fflush(out); - return r; -} -T ABI_ATTR T_TcT (T a, char b, T c) -{ - T r; - r.c[0]='b'; r.c[1]=c.c[1]; r.c[2]=c.c[2]; - fprintf(out,"T f(T,char,T):({\"%c%c%c\"},'%c',{\"%c%c%c\"})",a.c[0],a.c[1],a.c[2],b,c.c[0],c.c[1],c.c[2]); - fflush(out); - return r; -} -X ABI_ATTR X_BcdB (B a, char b, double c, B d) -{ - static X xr={"return val",'R'}; - X r; - r = xr; - r.c1 = b; - fprintf(out,"X f(B,char,double,B):({%g,{%d,%d,%d}},'%c',%g,{%g,{%d,%d,%d}})", - a.d,a.i[0],a.i[1],a.i[2],b,c,d.d,d.i[0],d.i[1],d.i[2]); - fflush(out); - return r; -} - -/* Test for cases where some argument (especially structure, 'long long', or - 'double') may be passed partially in general-purpose argument registers - and partially on the stack. Different ABIs pass between 4 and 8 arguments - (or none) in general-purpose argument registers. */ - -long ABI_ATTR l_l0K (K b, long c) -{ - long r = b.l1 + b.l2 + b.l3 + b.l4 + c; - fprintf(out,"long f(K,long):(%ld,%ld,%ld,%ld,%ld)",b.l1,b.l2,b.l3,b.l4,c); - fflush(out); - return r; -} -long ABI_ATTR l_l1K (long a1, K b, long c) -{ - long r = a1 + b.l1 + b.l2 + b.l3 + b.l4 + c; - fprintf(out,"long f(long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld)",a1,b.l1,b.l2,b.l3,b.l4,c); - fflush(out); - return r; -} -long ABI_ATTR l_l2K (long a1, long a2, K b, long c) -{ - long r = a1 + a2 + b.l1 + b.l2 + b.l3 + b.l4 + c; - fprintf(out,"long f(2*long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a1,a2,b.l1,b.l2,b.l3,b.l4,c); - fflush(out); - return r; -} -long ABI_ATTR l_l3K (long a1, long a2, long a3, K b, long c) -{ - long r = a1 + a2 + a3 + b.l1 + b.l2 + b.l3 + b.l4 + c; - fprintf(out,"long f(3*long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a1,a2,a3,b.l1,b.l2,b.l3,b.l4,c); - fflush(out); - return r; -} -long ABI_ATTR l_l4K (long a1, long a2, long a3, long a4, K b, long c) -{ - long r = a1 + a2 + a3 + a4 + b.l1 + b.l2 + b.l3 + b.l4 + c; - fprintf(out,"long f(4*long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a1,a2,a3,a4,b.l1,b.l2,b.l3,b.l4,c); - fflush(out); - return r; -} -long ABI_ATTR l_l5K (long a1, long a2, long a3, long a4, long a5, K b, long c) -{ - long r = a1 + a2 + a3 + a4 + a5 + b.l1 + b.l2 + b.l3 + b.l4 + c; - fprintf(out,"long f(5*long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a1,a2,a3,a4,a5,b.l1,b.l2,b.l3,b.l4,c); - fflush(out); - return r; -} -long ABI_ATTR l_l6K (long a1, long a2, long a3, long a4, long a5, long a6, K b, long c) -{ - long r = a1 + a2 + a3 + a4 + a5 + a6 + b.l1 + b.l2 + b.l3 + b.l4 + c; - fprintf(out,"long f(6*long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a1,a2,a3,a4,a5,a6,b.l1,b.l2,b.l3,b.l4,c); - fflush(out); - return r; -} -/* These tests is crafted on the knowledge that for all known ABIs: - * 17 > number of floating-point argument registers, - * 3 < number of general-purpose argument registers < 3 + 6. */ -float ABI_ATTR f_f17l3L (float a, float b, float c, float d, float e, float f, float g, - float h, float i, float j, float k, float l, float m, float n, - float o, float p, float q, - long s, long t, long u, L z) -{ - float r = a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+s+t+u+z.l1+z.l2+z.l3+z.l4+z.l5+z.l6; - fprintf(out,"float f(17*float,3*int,L):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,s,t,u,z.l1,z.l2,z.l3,z.l4,z.l5,z.l6); - fflush(out); - return r; -} -double ABI_ATTR d_d17l3L (double a, double b, double c, double d, double e, double f, - double g, double h, double i, double j, double k, double l, - double m, double n, double o, double p, double q, - long s, long t, long u, L z) -{ - double r = a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+s+t+u+z.l1+z.l2+z.l3+z.l4+z.l5+z.l6; - fprintf(out,"double f(17*double,3*int,L):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,s,t,u,z.l1,z.l2,z.l3,z.l4,z.l5,z.l6); - fflush(out); - return r; -} - -long long ABI_ATTR ll_l2ll (long a1, long a2, long long b, long c) -{ - long long r = (long long) (a1 + a2) + b + c; - fprintf(out,"long long f(2*long,long long,long):(%ld,%ld,0x%lx%08lx,%ld)",a1,a2,(long)(b>>32),(long)(b&0xffffffff),c); - fflush(out); - return r; -} -long long ABI_ATTR ll_l3ll (long a1, long a2, long a3, long long b, long c) -{ - long long r = (long long) (a1 + a2 + a3) + b + c; - fprintf(out,"long long f(3*long,long long,long):(%ld,%ld,%ld,0x%lx%08lx,%ld)",a1,a2,a3,(long)(b>>32),(long)(b&0xffffffff),c); - fflush(out); - return r; -} -long long ABI_ATTR ll_l4ll (long a1, long a2, long a3, long a4, long long b, long c) -{ - long long r = (long long) (a1 + a2 + a3 + a4) + b + c; - fprintf(out,"long long f(4*long,long long,long):(%ld,%ld,%ld,%ld,0x%lx%08lx,%ld)",a1,a2,a3,a4,(long)(b>>32),(long)(b&0xffffffff),c); - fflush(out); - return r; -} -long long ABI_ATTR ll_l5ll (long a1, long a2, long a3, long a4, long a5, long long b, long c) -{ - long long r = (long long) (a1 + a2 + a3 + a4 + a5) + b + c; - fprintf(out,"long long f(5*long,long long,long):(%ld,%ld,%ld,%ld,%ld,0x%lx%08lx,%ld)",a1,a2,a3,a4,a5,(long)(b>>32),(long)(b&0xffffffff),c); - fflush(out); - return r; -} -long long ABI_ATTR ll_l6ll (long a1, long a2, long a3, long a4, long a5, long a6, long long b, long c) -{ - long long r = (long long) (a1 + a2 + a3 + a4 + a5 + a6) + b + c; - fprintf(out,"long long f(6*long,long long,long):(%ld,%ld,%ld,%ld,%ld,%ld,0x%lx%08lx,%ld)",a1,a2,a3,a4,a5,a6,(long)(b>>32),(long)(b&0xffffffff),c); - fflush(out); - return r; -} -long long ABI_ATTR ll_l7ll (long a1, long a2, long a3, long a4, long a5, long a6, long a7, long long b, long c) -{ - long long r = (long long) (a1 + a2 + a3 + a4 + a5 + a6 + a7) + b + c; - fprintf(out,"long long f(7*long,long long,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,0x%lx%08lx,%ld)",a1,a2,a3,a4,a5,a6,a7,(long)(b>>32),(long)(b&0xffffffff),c); - fflush(out); - return r; -} - -double ABI_ATTR d_l2d (long a1, long a2, double b, long c) -{ - double r = (double) (a1 + a2) + b + c; - fprintf(out,"double f(2*long,double,long):(%ld,%ld,%g,%ld)",a1,a2,b,c); - fflush(out); - return r; -} -double ABI_ATTR d_l3d (long a1, long a2, long a3, double b, long c) -{ - double r = (double) (a1 + a2 + a3) + b + c; - fprintf(out,"double f(3*long,double,long):(%ld,%ld,%ld,%g,%ld)",a1,a2,a3,b,c); - fflush(out); - return r; -} -double ABI_ATTR d_l4d (long a1, long a2, long a3, long a4, double b, long c) -{ - double r = (double) (a1 + a2 + a3 + a4) + b + c; - fprintf(out,"double f(4*long,double,long):(%ld,%ld,%ld,%ld,%g,%ld)",a1,a2,a3,a4,b,c); - fflush(out); - return r; -} -double ABI_ATTR d_l5d (long a1, long a2, long a3, long a4, long a5, double b, long c) -{ - double r = (double) (a1 + a2 + a3 + a4 + a5) + b + c; - fprintf(out,"double f(5*long,double,long):(%ld,%ld,%ld,%ld,%ld,%g,%ld)",a1,a2,a3,a4,a5,b,c); - fflush(out); - return r; -} -double ABI_ATTR d_l6d (long a1, long a2, long a3, long a4, long a5, long a6, double b, long c) -{ - double r = (double) (a1 + a2 + a3 + a4 + a5 + a6) + b + c; - fprintf(out,"double f(6*long,double,long):(%ld,%ld,%ld,%ld,%ld,%ld,%g,%ld)",a1,a2,a3,a4,a5,a6,b,c); - fflush(out); - return r; -} -double ABI_ATTR d_l7d (long a1, long a2, long a3, long a4, long a5, long a6, long a7, double b, long c) -{ - double r = (double) (a1 + a2 + a3 + a4 + a5 + a6 + a7) + b + c; - fprintf(out,"double f(7*long,double,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%g,%ld)",a1,a2,a3,a4,a5,a6,a7,b,c); - fflush(out); - return r; -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/align_mixed.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/align_mixed.c deleted file mode 100644 index 5d4959c..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/align_mixed.c +++ /dev/null @@ -1,46 +0,0 @@ -/* Area: ffi_call - Purpose: Check for proper argument alignment. - Limitations: none. - PR: none. - Originator: (from many_win32.c) */ - -/* { dg-do run } */ - -#include "ffitest.h" - -static float ABI_ATTR align_arguments(int i1, - double f2, - int i3, - double f4) -{ - return i1+f2+i3+f4; -} - -int main(void) -{ - ffi_cif cif; - ffi_type *args[4] = { - &ffi_type_sint, - &ffi_type_double, - &ffi_type_sint, - &ffi_type_double - }; - double fa[2] = {1,2}; - int ia[2] = {1,2}; - void *values[4] = {&ia[0], &fa[0], &ia[1], &fa[1]}; - float f, ff; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 4, - &ffi_type_float, args) == FFI_OK); - - ff = align_arguments(ia[0], fa[0], ia[1], fa[1]); - - ffi_call(&cif, FFI_FN(align_arguments), &f, values); - - if (f == ff) - printf("align arguments tests ok!\n"); - else - CHECK(0); - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/align_stdcall.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/align_stdcall.c deleted file mode 100644 index 5e5cb86..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/align_stdcall.c +++ /dev/null @@ -1,46 +0,0 @@ -/* Area: ffi_call - Purpose: Check for proper argument alignment. - Limitations: none. - PR: none. - Originator: (from many_win32.c) */ - -/* { dg-do run } */ - -#include "ffitest.h" - -static float ABI_ATTR align_arguments(int i1, - double f2, - int i3, - double f4) -{ - return i1+f2+i3+f4; -} - -int main(void) -{ - ffi_cif cif; - ffi_type *args[4] = { - &ffi_type_sint, - &ffi_type_double, - &ffi_type_sint, - &ffi_type_double - }; - double fa[2] = {1,2}; - int ia[2] = {1,2}; - void *values[4] = {&ia[0], &fa[0], &ia[1], &fa[1]}; - float f, ff; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 4, - &ffi_type_float, args) == FFI_OK); - - ff = align_arguments(ia[0], fa[0], ia[1], fa[1]);; - - ffi_call(&cif, FFI_FN(align_arguments), &f, values); - - if (f == ff) - printf("align arguments tests ok!\n"); - else - CHECK(0); - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/call.exp b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/call.exp deleted file mode 100644 index 13ba2bd..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +++ /dev/null @@ -1,54 +0,0 @@ -# Copyright (C) 2003, 2006, 2009, 2010, 2014 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; see the file COPYING3. If not see -# . - -dg-init -libffi-init - -global srcdir subdir - -if { [string match $compiler_vendor "microsoft"] } { - # -wd4005 macro redefinition - # -wd4244 implicit conversion to type of smaller size - # -wd4305 truncation to smaller type - # -wd4477 printf %lu of uintptr_t - # -wd4312 implicit conversion to type of greater size - # -wd4311 pointer truncation to unsigned long - # -EHsc C++ Exception Handling (no SEH exceptions) - set additional_options "-wd4005 -wd4244 -wd4305 -wd4477 -wd4312 -wd4311 -EHsc"; -} else { - set additional_options ""; -} - -set tlist [lsort [glob -nocomplain -- $srcdir/$subdir/*.c]] - -run-many-tests $tlist $additional_options - -set tlist [lsort [glob -nocomplain -- $srcdir/$subdir/*.cc]] - -# No C++ for or1k -if { [istarget "or1k-*-*"] } { - foreach test $tlist { - unsupported "$test" - } -} else { - run-many-tests $tlist $additional_options -} - -dg-finish - -# Local Variables: -# tcl-indent-level:4 -# End: diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c deleted file mode 100644 index bf60161..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +++ /dev/null @@ -1,26 +0,0 @@ -/* Area: ffi_prep_cif - Purpose: Test error return for bad typedefs. - Limitations: none. - PR: none. - Originator: Blake Chaffin 6/6/2007 */ - -/* { dg-do run } */ - -#include "ffitest.h" - -int main (void) -{ - ffi_cif cif; - ffi_type* arg_types[1]; - - ffi_type badType = ffi_type_void; - - arg_types[0] = NULL; - - badType.size = 0; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0, &badType, - arg_types) == FFI_BAD_TYPEDEF); - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h deleted file mode 100644 index cfce1ad..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +++ /dev/null @@ -1,138 +0,0 @@ -#include -#include -#include -#include -#include -#include "fficonfig.h" - -#if defined HAVE_STDINT_H -#include -#endif - -#if defined HAVE_INTTYPES_H -#include -#endif - -#define MAX_ARGS 256 - -#define CHECK(x) (void)(!(x) ? (abort(), 1) : 0) - -/* Define macros so that compilers other than gcc can run the tests. */ -#undef __UNUSED__ -#if defined(__GNUC__) -#define __UNUSED__ __attribute__((__unused__)) -#define __STDCALL__ __attribute__((stdcall)) -#define __THISCALL__ __attribute__((thiscall)) -#define __FASTCALL__ __attribute__((fastcall)) -#define __MSABI__ __attribute__((ms_abi)) -#else -#define __UNUSED__ -#define __STDCALL__ __stdcall -#define __THISCALL__ __thiscall -#define __FASTCALL__ __fastcall -#endif - -#ifndef ABI_NUM -#define ABI_NUM FFI_DEFAULT_ABI -#define ABI_ATTR -#endif - -/* Prefer MAP_ANON(YMOUS) to /dev/zero, since we don't need to keep a - file open. */ -#ifdef HAVE_MMAP_ANON -# undef HAVE_MMAP_DEV_ZERO - -# include -# ifndef MAP_FAILED -# define MAP_FAILED -1 -# endif -# if !defined (MAP_ANONYMOUS) && defined (MAP_ANON) -# define MAP_ANONYMOUS MAP_ANON -# endif -# define USING_MMAP - -#endif - -#ifdef HAVE_MMAP_DEV_ZERO - -# include -# ifndef MAP_FAILED -# define MAP_FAILED -1 -# endif -# define USING_MMAP - -#endif - -/* MinGW kludge. */ -#if defined(_WIN64) | defined(_WIN32) -#define PRIdLL "I64d" -#define PRIuLL "I64u" -#else -#define PRIdLL "lld" -#define PRIuLL "llu" -#endif - -/* Tru64 UNIX kludge. */ -#if defined(__alpha__) && defined(__osf__) -/* Tru64 UNIX V4.0 doesn't support %lld/%lld, but long is 64-bit. */ -#undef PRIdLL -#define PRIdLL "ld" -#undef PRIuLL -#define PRIuLL "lu" -#define PRId8 "hd" -#define PRIu8 "hu" -#define PRId64 "ld" -#define PRIu64 "lu" -#define PRIuPTR "lu" -#endif - -/* PA HP-UX kludge. */ -#if defined(__hppa__) && defined(__hpux__) && !defined(PRIuPTR) -#define PRIuPTR "lu" -#endif - -/* IRIX kludge. */ -#if defined(__sgi) -/* IRIX 6.5 provides all definitions, but only for C99 - compilations. */ -#define PRId8 "hhd" -#define PRIu8 "hhu" -#if (_MIPS_SZLONG == 32) -#define PRId64 "lld" -#define PRIu64 "llu" -#endif -/* This doesn't match , which always has "lld" here, but the - arguments are uint64_t, int64_t, which are unsigned long, long for - 64-bit in . */ -#if (_MIPS_SZLONG == 64) -#define PRId64 "ld" -#define PRIu64 "lu" -#endif -/* This doesn't match , which has "u" here, but the arguments - are uintptr_t, which is always unsigned long. */ -#define PRIuPTR "lu" -#endif - -/* Solaris < 10 kludge. */ -#if defined(__sun__) && defined(__svr4__) && !defined(PRIuPTR) -#if defined(__arch64__) || defined (__x86_64__) -#define PRIuPTR "lu" -#else -#define PRIuPTR "u" -#endif -#endif - -/* MSVC kludge. */ -#if defined _MSC_VER -#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) -#define PRIuPTR "lu" -#define PRIu8 "u" -#define PRId8 "d" -#define PRIu64 "I64u" -#define PRId64 "I64d" -#endif -#endif - -#ifndef PRIuPTR -#define PRIuPTR "u" -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/float.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/float.c deleted file mode 100644 index fbc272d..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/float.c +++ /dev/null @@ -1,59 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value float. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ - -#include "ffitest.h" - -static int floating(int a, float b, double c, long double d) -{ - int i; - - i = (int) ((float)a/b + ((float)c/(float)d)); - - return i; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_arg rint; - - float f; - signed int si1; - double d; - long double ld; - - args[0] = &ffi_type_sint; - values[0] = &si1; - args[1] = &ffi_type_float; - values[1] = &f; - args[2] = &ffi_type_double; - values[2] = &d; - args[3] = &ffi_type_longdouble; - values[3] = &ld; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, - &ffi_type_sint, args) == FFI_OK); - - si1 = 6; - f = 3.14159; - d = (double)1.0/(double)3.0; - ld = 2.71828182846L; - - floating (si1, f, d, ld); - - ffi_call(&cif, FFI_FN(floating), &rint, values); - - printf ("%d vs %d\n", (int)rint, floating (si1, f, d, ld)); - - CHECK((int)rint == floating(si1, f, d, ld)); - - exit (0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/float1.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/float1.c deleted file mode 100644 index c48493c..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/float1.c +++ /dev/null @@ -1,60 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value double. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ -#include "ffitest.h" -#include "float.h" - -#include - -typedef union -{ - double d; - unsigned char c[sizeof (double)]; -} value_type; - -#define CANARY 0xba - -static double dblit(float f) -{ - return f/3.0; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - float f; - value_type result[2]; - unsigned int i; - - args[0] = &ffi_type_float; - values[0] = &f; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_double, args) == FFI_OK); - - f = 3.14159; - - /* Put a canary in the return array. This is a regression test for - a buffer overrun. */ - memset(result[1].c, CANARY, sizeof (double)); - - ffi_call(&cif, FFI_FN(dblit), &result[0].d, values); - - /* These are not always the same!! Check for a reasonable delta */ - - CHECK(fabs(result[0].d - dblit(f)) < DBL_EPSILON); - - /* Check the canary. */ - for (i = 0; i < sizeof (double); ++i) - CHECK(result[1].c[i] == CANARY); - - exit(0); - -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/float2.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/float2.c deleted file mode 100644 index 57cd9e3..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +++ /dev/null @@ -1,61 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value long double. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ -/* { dg-do run } */ - -#include "ffitest.h" -#include "float.h" - -#include - -static long double ldblit(float f) -{ - return (long double) (((long double) f)/ (long double) 3.0); -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - float f; - long double ld; - long double original; - - args[0] = &ffi_type_float; - values[0] = &f; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_longdouble, args) == FFI_OK); - - f = 3.14159; - -#if defined(__sun) && defined(__GNUC__) - /* long double support under SunOS/gcc is pretty much non-existent. - You'll get the odd bus error in library routines like printf() */ -#else - printf ("%Lf\n", ldblit(f)); -#endif - - ld = 666; - ffi_call(&cif, FFI_FN(ldblit), &ld, values); - -#if defined(__sun) && defined(__GNUC__) - /* long double support under SunOS/gcc is pretty much non-existent. - You'll get the odd bus error in library routines like printf() */ -#else - printf ("%Lf, %Lf, %Lf, %Lf\n", ld, ldblit(f), ld - ldblit(f), LDBL_EPSILON); -#endif - - /* These are not always the same!! Check for a reasonable delta */ - original = ldblit(f); - if (((ld > original) ? (ld - original) : (original - ld)) < LDBL_EPSILON) - puts("long double return value tests ok!"); - else - CHECK(0); - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/float3.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/float3.c deleted file mode 100644 index bab3206..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/float3.c +++ /dev/null @@ -1,74 +0,0 @@ -/* Area: ffi_call - Purpose: Check float arguments with different orders. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ - -#include "ffitest.h" -#include "float.h" - -#include - -static double floating_1(float a, double b, long double c) -{ - return (double) a + b + (double) c; -} - -static double floating_2(long double a, double b, float c) -{ - return (double) a + b + (double) c; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - double rd; - - float f; - double d; - long double ld; - - args[0] = &ffi_type_float; - values[0] = &f; - args[1] = &ffi_type_double; - values[1] = &d; - args[2] = &ffi_type_longdouble; - values[2] = &ld; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, - &ffi_type_double, args) == FFI_OK); - - f = 3.14159; - d = (double)1.0/(double)3.0; - ld = 2.71828182846L; - - floating_1 (f, d, ld); - - ffi_call(&cif, FFI_FN(floating_1), &rd, values); - - CHECK(fabs(rd - floating_1(f, d, ld)) < DBL_EPSILON); - - args[0] = &ffi_type_longdouble; - values[0] = &ld; - args[1] = &ffi_type_double; - values[1] = &d; - args[2] = &ffi_type_float; - values[2] = &f; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, - &ffi_type_double, args) == FFI_OK); - - floating_2 (ld, d, f); - - ffi_call(&cif, FFI_FN(floating_2), &rd, values); - - CHECK(fabs(rd - floating_2(ld, d, f)) < DBL_EPSILON); - - exit (0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/float4.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/float4.c deleted file mode 100644 index 0dd6d85..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/float4.c +++ /dev/null @@ -1,62 +0,0 @@ -/* Area: ffi_call - Purpose: Check denorm double value. - Limitations: none. - PR: PR26483. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ -/* { dg-options "-mieee" { target alpha*-*-* } } */ - -#include "ffitest.h" -#include "float.h" - -typedef union -{ - double d; - unsigned char c[sizeof (double)]; -} value_type; - -#define CANARY 0xba - -static double dblit(double d) -{ - return d; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - double d; - value_type result[2]; - unsigned int i; - - args[0] = &ffi_type_double; - values[0] = &d; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_double, args) == FFI_OK); - - d = DBL_MIN / 2; - - /* Put a canary in the return array. This is a regression test for - a buffer overrun. */ - memset(result[1].c, CANARY, sizeof (double)); - - ffi_call(&cif, FFI_FN(dblit), &result[0].d, values); - - /* The standard delta check doesn't work for denorms. Since we didn't do - any arithmetic, we should get the original result back, and hence an - exact check should be OK here. */ - - CHECK(result[0].d == dblit(d)); - - /* Check the canary. */ - for (i = 0; i < sizeof (double); ++i) - CHECK(result[1].c[i] == CANARY); - - exit(0); - -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c deleted file mode 100644 index 5acff91..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c +++ /dev/null @@ -1,107 +0,0 @@ -/* Area: fp and variadics - Purpose: check fp inputs and returns work on variadics, even the fixed params - Limitations: None - PR: none - Originator: 2011-01-25 - - Intended to stress the difference in ABI on ARM vfp -*/ - -/* { dg-do run } */ - -#include - -#include "ffitest.h" - -/* prints out all the parameters, and returns the sum of them all. - * 'x' is the number of variadic parameters all of which are double in this test - */ -double float_va_fn(unsigned int x, double y,...) -{ - double total=0.0; - va_list ap; - unsigned int i; - - total+=(double)x; - total+=y; - - printf("%u: %.1f :", x, y); - - va_start(ap, y); - for(i=0;i -#include -#include - -static float ABI_ATTR many(float f1, float f2, float f3, float f4, float f5, float f6, float f7, float f8, float f9, float f10, float f11, float f12, float f13) -{ -#if 0 - printf("%f %f %f %f %f %f %f %f %f %f %f %f %f\n", - (double) f1, (double) f2, (double) f3, (double) f4, (double) f5, - (double) f6, (double) f7, (double) f8, (double) f9, (double) f10, - (double) f11, (double) f12, (double) f13); -#endif - - return f1+f2+f3+f4+f5+f6+f7+f8+f9+f10+f11+f12+f13; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[13]; - void *values[13]; - float fa[13]; - float f, ff; - int i; - - for (i = 0; i < 13; i++) - { - args[i] = &ffi_type_float; - values[i] = &fa[i]; - fa[i] = (float) i; - } - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 13, - &ffi_type_float, args) == FFI_OK); - - ffi_call(&cif, FFI_FN(many), &f, values); - - ff = many(fa[0], fa[1], - fa[2], fa[3], - fa[4], fa[5], - fa[6], fa[7], - fa[8], fa[9], - fa[10],fa[11],fa[12]); - - if (fabs(f - ff) < FLT_EPSILON) - exit(0); - else - abort(); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/many2.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/many2.c deleted file mode 100644 index 1c85746..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/many2.c +++ /dev/null @@ -1,57 +0,0 @@ -/* Area: ffi_call - Purpose: Check uint8_t arguments. - Limitations: none. - PR: PR45677. - Originator: Dan Witte 20100916 */ - -/* { dg-do run } */ - -#include "ffitest.h" - -#define NARGS 7 - -typedef unsigned char u8; - -#ifdef __GNUC__ -__attribute__((noinline)) -#endif -uint8_t -foo (uint8_t a, uint8_t b, uint8_t c, uint8_t d, - uint8_t e, uint8_t f, uint8_t g) -{ - return a + b + c + d + e + f + g; -} - -uint8_t ABI_ATTR -bar (uint8_t a, uint8_t b, uint8_t c, uint8_t d, - uint8_t e, uint8_t f, uint8_t g) -{ - return foo (a, b, c, d, e, f, g); -} - -int -main (void) -{ - ffi_type *ffitypes[NARGS]; - int i; - ffi_cif cif; - ffi_arg result = 0; - uint8_t args[NARGS]; - void *argptrs[NARGS]; - - for (i = 0; i < NARGS; ++i) - ffitypes[i] = &ffi_type_uint8; - - CHECK (ffi_prep_cif (&cif, ABI_NUM, NARGS, - &ffi_type_uint8, ffitypes) == FFI_OK); - - for (i = 0; i < NARGS; ++i) - { - args[i] = i; - argptrs[i] = &args[i]; - } - ffi_call (&cif, FFI_FN (bar), &result, argptrs); - - CHECK (result == 21); - return 0; -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/many_double.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/many_double.c deleted file mode 100644 index 4ef8c8a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/many_double.c +++ /dev/null @@ -1,70 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value double, with many arguments - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ -#include "ffitest.h" - -#include -#include -#include - -static double many(double f1, - double f2, - double f3, - double f4, - double f5, - double f6, - double f7, - double f8, - double f9, - double f10, - double f11, - double f12, - double f13) -{ -#if 0 - printf("%f %f %f %f %f %f %f %f %f %f %f %f %f\n", - (double) f1, (double) f2, (double) f3, (double) f4, (double) f5, - (double) f6, (double) f7, (double) f8, (double) f9, (double) f10, - (double) f11, (double) f12, (double) f13); -#endif - - return ((f1/f2+f3/f4+f5/f6+f7/f8+f9/f10+f11/f12) * f13); -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[13]; - void *values[13]; - double fa[13]; - double f, ff; - int i; - - for (i = 0; i < 13; i++) - { - args[i] = &ffi_type_double; - values[i] = &fa[i]; - fa[i] = (double) i; - } - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 13, - &ffi_type_double, args) == FFI_OK); - - ffi_call(&cif, FFI_FN(many), &f, values); - - ff = many(fa[0], fa[1], - fa[2], fa[3], - fa[4], fa[5], - fa[6], fa[7], - fa[8], fa[9], - fa[10],fa[11],fa[12]); - if (fabs(f - ff) < FLT_EPSILON) - exit(0); - else - abort(); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/many_mixed.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/many_mixed.c deleted file mode 100644 index 85ec36e..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/many_mixed.c +++ /dev/null @@ -1,78 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value double, with many arguments - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ -#include "ffitest.h" - -#include -#include -#include - -static double many(double f1, - double f2, - long int i1, - double f3, - double f4, - long int i2, - double f5, - double f6, - long int i3, - double f7, - double f8, - long int i4, - double f9, - double f10, - long int i5, - double f11, - double f12, - long int i6, - double f13) -{ - return ((double) (i1 + i2 + i3 + i4 + i5 + i6) + (f1/f2+f3/f4+f5/f6+f7/f8+f9/f10+f11/f12) * f13); -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[19]; - void *values[19]; - double fa[19]; - long int la[19]; - double f, ff; - int i; - - for (i = 0; i < 19; i++) - { - if( (i - 2) % 3 == 0) { - args[i] = &ffi_type_slong; - la[i] = (long int) i; - values[i] = &la[i]; - } - else { - args[i] = &ffi_type_double; - fa[i] = (double) i; - values[i] = &fa[i]; - } - } - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 19, - &ffi_type_double, args) == FFI_OK); - - ffi_call(&cif, FFI_FN(many), &f, values); - - ff = many(fa[0], fa[1], la[2], - fa[3], fa[4], la[5], - fa[6], fa[7], la[8], - fa[9], fa[10], la[11], - fa[12], fa[13], la[14], - fa[15], fa[16], la[17], - fa[18]); - if (fabs(f - ff) < FLT_EPSILON) - exit(0); - else - abort(); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/negint.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/negint.c deleted file mode 100644 index 6e2f26f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/negint.c +++ /dev/null @@ -1,52 +0,0 @@ -/* Area: ffi_call - Purpose: Check that negative integers are passed correctly. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ - -#include "ffitest.h" - -static int checking(int a, short b, signed char c) -{ - - return (a < 0 && b < 0 && c < 0); -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_arg rint; - - signed int si; - signed short ss; - signed char sc; - - args[0] = &ffi_type_sint; - values[0] = &si; - args[1] = &ffi_type_sshort; - values[1] = &ss; - args[2] = &ffi_type_schar; - values[2] = ≻ - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, - &ffi_type_sint, args) == FFI_OK); - - si = -6; - ss = -12; - sc = -1; - - checking (si, ss, sc); - - ffi_call(&cif, FFI_FN(checking), &rint, values); - - printf ("%d vs %d\n", (int)rint, checking (si, ss, sc)); - - CHECK(rint != 0); - - exit (0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/offsets.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/offsets.c deleted file mode 100644 index 23d88b3..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/offsets.c +++ /dev/null @@ -1,46 +0,0 @@ -/* Area: Struct layout - Purpose: Test ffi_get_struct_offsets - Limitations: none. - PR: none. - Originator: Tom Tromey. */ - -/* { dg-do run } */ -#include "ffitest.h" -#include - -struct test_1 -{ - char c; - float f; - char c2; - int i; -}; - -int -main (void) -{ - ffi_type test_1_type; - ffi_type *test_1_elements[5]; - size_t test_1_offsets[4]; - - test_1_elements[0] = &ffi_type_schar; - test_1_elements[1] = &ffi_type_float; - test_1_elements[2] = &ffi_type_schar; - test_1_elements[3] = &ffi_type_sint; - test_1_elements[4] = NULL; - - test_1_type.size = 0; - test_1_type.alignment = 0; - test_1_type.type = FFI_TYPE_STRUCT; - test_1_type.elements = test_1_elements; - - CHECK (ffi_get_struct_offsets (FFI_DEFAULT_ABI, &test_1_type, test_1_offsets) - == FFI_OK); - CHECK (test_1_type.size == sizeof (struct test_1)); - CHECK (offsetof (struct test_1, c) == test_1_offsets[0]); - CHECK (offsetof (struct test_1, f) == test_1_offsets[1]); - CHECK (offsetof (struct test_1, c2) == test_1_offsets[2]); - CHECK (offsetof (struct test_1, i) == test_1_offsets[3]); - - return 0; -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/pr1172638.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/pr1172638.c deleted file mode 100644 index 7da1621..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/pr1172638.c +++ /dev/null @@ -1,127 +0,0 @@ -/* Area: ffi_call - Purpose: Reproduce bug found in python ctypes - Limitations: none. - PR: Fedora 1174037 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct { - long x; - long y; -} POINT; - -typedef struct { - long left; - long top; - long right; - long bottom; -} RECT; - -static RECT ABI_ATTR pr_test(int i __UNUSED__, RECT ar __UNUSED__, - RECT* br __UNUSED__, POINT cp __UNUSED__, - RECT dr __UNUSED__, RECT *er __UNUSED__, - POINT fp, RECT gr __UNUSED__) -{ - RECT result; - - result.left = fp.x; - result.right = fp.y; - result.top = fp.x; - result.bottom = fp.y; - - return result; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_type point_type, rect_type; - ffi_type *point_type_elements[3]; - ffi_type *rect_type_elements[5]; - - int i; - POINT cp, fp; - RECT ar, br, dr, er, gr; - RECT *p1, *p2; - - /* This is a hack to get a properly aligned result buffer */ - RECT *rect_result = - (RECT *) malloc (sizeof(RECT)); - - point_type.size = 0; - point_type.alignment = 0; - point_type.type = FFI_TYPE_STRUCT; - point_type.elements = point_type_elements; - point_type_elements[0] = &ffi_type_slong; - point_type_elements[1] = &ffi_type_slong; - point_type_elements[2] = NULL; - - rect_type.size = 0; - rect_type.alignment = 0; - rect_type.type = FFI_TYPE_STRUCT; - rect_type.elements = rect_type_elements; - rect_type_elements[0] = &ffi_type_slong; - rect_type_elements[1] = &ffi_type_slong; - rect_type_elements[2] = &ffi_type_slong; - rect_type_elements[3] = &ffi_type_slong; - rect_type_elements[4] = NULL; - - args[0] = &ffi_type_sint; - args[1] = &rect_type; - args[2] = &ffi_type_pointer; - args[3] = &point_type; - args[4] = &rect_type; - args[5] = &ffi_type_pointer; - args[6] = &point_type; - args[7] = &rect_type; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 8, &rect_type, args) == FFI_OK); - - i = 1; - ar.left = 2; - ar.right = 3; - ar.top = 4; - ar.bottom = 5; - br.left = 6; - br.right = 7; - br.top = 8; - br.bottom = 9; - cp.x = 10; - cp.y = 11; - dr.left = 12; - dr.right = 13; - dr.top = 14; - dr.bottom = 15; - er.left = 16; - er.right = 17; - er.top = 18; - er.bottom = 19; - fp.x = 20; - fp.y = 21; - gr.left = 22; - gr.right = 23; - gr.top = 24; - gr.bottom = 25; - - values[0] = &i; - values[1] = &ar; - p1 = &br; - values[2] = &p1; - values[3] = &cp; - values[4] = &dr; - p2 = &er; - values[5] = &p2; - values[6] = &fp; - values[7] = &gr; - - ffi_call (&cif, FFI_FN(pr_test), rect_result, values); - - CHECK(rect_result->top == 20); - - free (rect_result); - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/promotion.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/promotion.c deleted file mode 100644 index 4456161..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/promotion.c +++ /dev/null @@ -1,59 +0,0 @@ -/* Area: ffi_call - Purpose: Promotion test. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ -#include "ffitest.h" -static int promotion(signed char sc, signed short ss, - unsigned char uc, unsigned short us) -{ - int r = (int) sc + (int) ss + (int) uc + (int) us; - - return r; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_arg rint; - signed char sc; - unsigned char uc; - signed short ss; - unsigned short us; - unsigned long ul; - - args[0] = &ffi_type_schar; - args[1] = &ffi_type_sshort; - args[2] = &ffi_type_uchar; - args[3] = &ffi_type_ushort; - values[0] = ≻ - values[1] = &ss; - values[2] = &uc; - values[3] = &us; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, - &ffi_type_sint, args) == FFI_OK); - - us = 0; - ul = 0; - - for (sc = (signed char) -127; - sc <= (signed char) 120; sc += 1) - for (ss = -30000; ss <= 30000; ss += 10000) - for (uc = (unsigned char) 0; - uc <= (unsigned char) 200; uc += 20) - for (us = 0; us <= 60000; us += 10000) - { - ul++; - ffi_call(&cif, FFI_FN(promotion), &rint, values); - CHECK((int)rint == (signed char) sc + (signed short) ss + - (unsigned char) uc + (unsigned short) us); - } - printf("%lu promotion tests run\n", ul); - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/pyobjc-tc.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/pyobjc-tc.c deleted file mode 100644 index e29bd6c..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/pyobjc-tc.c +++ /dev/null @@ -1,114 +0,0 @@ -/* Area: ffi_call - Purpose: Check different structures. - Limitations: none. - PR: none. - Originator: Ronald Oussoren 20030824 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct Point { - float x; - float y; -} Point; - -typedef struct Size { - float h; - float w; -} Size; - -typedef struct Rect { - Point o; - Size s; -} Rect; - -int doit(int o, char* s, Point p, Rect r, int last) -{ - printf("CALLED WITH %d %s {%f %f} {{%f %f} {%f %f}} %d\n", - o, s, p.x, p.y, r.o.x, r.o.y, r.s.h, r.s.w, last); - return 42; -} - - -int main(void) -{ - ffi_type point_type; - ffi_type size_type; - ffi_type rect_type; - ffi_cif cif; - ffi_type* arglist[6]; - void* values[6]; - int r; - - /* - * First set up FFI types for the 3 struct types - */ - - point_type.size = 0; /*sizeof(Point);*/ - point_type.alignment = 0; /*__alignof__(Point);*/ - point_type.type = FFI_TYPE_STRUCT; - point_type.elements = malloc(3 * sizeof(ffi_type*)); - point_type.elements[0] = &ffi_type_float; - point_type.elements[1] = &ffi_type_float; - point_type.elements[2] = NULL; - - size_type.size = 0;/* sizeof(Size);*/ - size_type.alignment = 0;/* __alignof__(Size);*/ - size_type.type = FFI_TYPE_STRUCT; - size_type.elements = malloc(3 * sizeof(ffi_type*)); - size_type.elements[0] = &ffi_type_float; - size_type.elements[1] = &ffi_type_float; - size_type.elements[2] = NULL; - - rect_type.size = 0;/*sizeof(Rect);*/ - rect_type.alignment =0;/* __alignof__(Rect);*/ - rect_type.type = FFI_TYPE_STRUCT; - rect_type.elements = malloc(3 * sizeof(ffi_type*)); - rect_type.elements[0] = &point_type; - rect_type.elements[1] = &size_type; - rect_type.elements[2] = NULL; - - /* - * Create a CIF - */ - arglist[0] = &ffi_type_sint; - arglist[1] = &ffi_type_pointer; - arglist[2] = &point_type; - arglist[3] = &rect_type; - arglist[4] = &ffi_type_sint; - arglist[5] = NULL; - - r = ffi_prep_cif(&cif, FFI_DEFAULT_ABI, - 5, &ffi_type_sint, arglist); - if (r != FFI_OK) { - abort(); - } - - - /* And call the function through the CIF */ - - { - Point p = { 1.0, 2.0 }; - Rect r = { { 9.0, 10.0}, { -1.0, -2.0 } }; - int o = 0; - int l = 42; - char* m = "myMethod"; - ffi_arg result; - - values[0] = &o; - values[1] = &m; - values[2] = &p; - values[3] = &r; - values[4] = &l; - values[5] = NULL; - - printf("CALLING WITH %d %s {%f %f} {{%f %f} {%f %f}} %d\n", - o, m, p.x, p.y, r.o.x, r.o.y, r.s.h, r.s.w, l); - - ffi_call(&cif, FFI_FN(doit), &result, values); - - printf ("The result is %d\n", (int)result); - - } - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c deleted file mode 100644 index fd07e50..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c +++ /dev/null @@ -1,36 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value double. - Limitations: none. - PR: none. - Originator: 20050212 */ - -/* { dg-do run } */ -#include "ffitest.h" - -static double return_dbl(double dbl) -{ - printf ("%f\n", dbl); - return 2 * dbl; -} -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - double dbl, rdbl; - - args[0] = &ffi_type_double; - values[0] = &dbl; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_double, args) == FFI_OK); - - for (dbl = -127.3; dbl < 127; dbl++) - { - ffi_call(&cif, FFI_FN(return_dbl), &rdbl, values); - printf ("%f vs %f\n", rdbl, return_dbl(dbl)); - CHECK(rdbl == 2 * dbl); - } - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl1.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl1.c deleted file mode 100644 index 0ea5d50..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl1.c +++ /dev/null @@ -1,43 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value double. - Limitations: none. - PR: none. - Originator: 20050212 */ - -/* { dg-do run } */ -#include "ffitest.h" - -static double return_dbl(double dbl1, float fl2, unsigned int in3, double dbl4) -{ - return dbl1 + fl2 + in3 + dbl4; -} -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - double dbl1, dbl4, rdbl; - float fl2; - unsigned int in3; - args[0] = &ffi_type_double; - args[1] = &ffi_type_float; - args[2] = &ffi_type_uint; - args[3] = &ffi_type_double; - values[0] = &dbl1; - values[1] = &fl2; - values[2] = &in3; - values[3] = &dbl4; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, - &ffi_type_double, args) == FFI_OK); - dbl1 = 127.0; - fl2 = 128.0; - in3 = 255; - dbl4 = 512.7; - - ffi_call(&cif, FFI_FN(return_dbl), &rdbl, values); - printf ("%f vs %f\n", rdbl, return_dbl(dbl1, fl2, in3, dbl4)); - CHECK(rdbl == dbl1 + fl2 + in3 + dbl4); - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl2.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl2.c deleted file mode 100644 index b3818f8..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl2.c +++ /dev/null @@ -1,42 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value double. - Limitations: none. - PR: none. - Originator: 20050212 */ - -/* { dg-do run } */ -#include "ffitest.h" - -static double return_dbl(double dbl1, double dbl2, unsigned int in3, double dbl4) -{ - return dbl1 + dbl2 + in3 + dbl4; -} -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - double dbl1, dbl2, dbl4, rdbl; - unsigned int in3; - args[0] = &ffi_type_double; - args[1] = &ffi_type_double; - args[2] = &ffi_type_uint; - args[3] = &ffi_type_double; - values[0] = &dbl1; - values[1] = &dbl2; - values[2] = &in3; - values[3] = &dbl4; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, - &ffi_type_double, args) == FFI_OK); - dbl1 = 127.0; - dbl2 = 128.0; - in3 = 255; - dbl4 = 512.7; - - ffi_call(&cif, FFI_FN(return_dbl), &rdbl, values); - printf ("%f vs %f\n", rdbl, return_dbl(dbl1, dbl2, in3, dbl4)); - CHECK(rdbl == dbl1 + dbl2 + in3 + dbl4); - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_fl.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_fl.c deleted file mode 100644 index fb8a09e..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_fl.c +++ /dev/null @@ -1,35 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value float. - Limitations: none. - PR: none. - Originator: 20050212 */ - -/* { dg-do run } */ -#include "ffitest.h" - -static float return_fl(float fl) -{ - return 2 * fl; -} -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - float fl, rfl; - - args[0] = &ffi_type_float; - values[0] = &fl; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_float, args) == FFI_OK); - - for (fl = -127.0; fl < 127; fl++) - { - ffi_call(&cif, FFI_FN(return_fl), &rfl, values); - printf ("%f vs %f\n", rfl, return_fl(fl)); - CHECK(rfl == 2 * fl); - } - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_fl1.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_fl1.c deleted file mode 100644 index c3d92c2..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_fl1.c +++ /dev/null @@ -1,36 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value float. - Limitations: none. - PR: none. - Originator: 20050212 */ - -/* { dg-do run } */ -#include "ffitest.h" - -static float return_fl(float fl1, float fl2) -{ - return fl1 + fl2; -} -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - float fl1, fl2, rfl; - - args[0] = &ffi_type_float; - args[1] = &ffi_type_float; - values[0] = &fl1; - values[1] = &fl2; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, - &ffi_type_float, args) == FFI_OK); - fl1 = 127.0; - fl2 = 128.0; - - ffi_call(&cif, FFI_FN(return_fl), &rfl, values); - printf ("%f vs %f\n", rfl, return_fl(fl1, fl2)); - CHECK(rfl == fl1 + fl2); - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_fl2.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_fl2.c deleted file mode 100644 index ddb976c..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_fl2.c +++ /dev/null @@ -1,49 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value float. - Limitations: none. - PR: none. - Originator: 20050212 */ - -/* { dg-do run } */ -#include "ffitest.h" - -/* Use volatile float to avoid false negative on ix86. See PR target/323. */ -static float return_fl(float fl1, float fl2, float fl3, float fl4) -{ - volatile float sum; - - sum = fl1 + fl2 + fl3 + fl4; - return sum; -} -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - float fl1, fl2, fl3, fl4, rfl; - volatile float sum; - - args[0] = &ffi_type_float; - args[1] = &ffi_type_float; - args[2] = &ffi_type_float; - args[3] = &ffi_type_float; - values[0] = &fl1; - values[1] = &fl2; - values[2] = &fl3; - values[3] = &fl4; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, - &ffi_type_float, args) == FFI_OK); - fl1 = 127.0; - fl2 = 128.0; - fl3 = 255.1; - fl4 = 512.7; - - ffi_call(&cif, FFI_FN(return_fl), &rfl, values); - printf ("%f vs %f\n", rfl, return_fl(fl1, fl2, fl3, fl4)); - - sum = fl1 + fl2 + fl3 + fl4; - CHECK(rfl == sum); - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_fl3.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_fl3.c deleted file mode 100644 index c37877b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_fl3.c +++ /dev/null @@ -1,42 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value float. - Limitations: none. - PR: none. - Originator: 20050212 */ - -/* { dg-do run } */ -#include "ffitest.h" - -static float return_fl(float fl1, float fl2, unsigned int in3, float fl4) -{ - return fl1 + fl2 + in3 + fl4; -} -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - float fl1, fl2, fl4, rfl; - unsigned int in3; - args[0] = &ffi_type_float; - args[1] = &ffi_type_float; - args[2] = &ffi_type_uint; - args[3] = &ffi_type_float; - values[0] = &fl1; - values[1] = &fl2; - values[2] = &in3; - values[3] = &fl4; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, - &ffi_type_float, args) == FFI_OK); - fl1 = 127.0; - fl2 = 128.0; - in3 = 255; - fl4 = 512.7; - - ffi_call(&cif, FFI_FN(return_fl), &rfl, values); - printf ("%f vs %f\n", rfl, return_fl(fl1, fl2, in3, fl4)); - CHECK(rfl == fl1 + fl2 + in3 + fl4); - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c deleted file mode 100644 index 52a92fe..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +++ /dev/null @@ -1,34 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value long double. - Limitations: none. - PR: none. - Originator: 20071113 */ -/* { dg-do run } */ - -#include "ffitest.h" - -static long double return_ldl(long double ldl) -{ - return 2*ldl; -} -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - long double ldl, rldl; - - args[0] = &ffi_type_longdouble; - values[0] = &ldl; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_longdouble, args) == FFI_OK); - - for (ldl = -127.0; ldl < 127.0; ldl++) - { - ffi_call(&cif, FFI_FN(return_ldl), &rldl, values); - CHECK(rldl == 2 * ldl); - } - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_ll.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_ll.c deleted file mode 100644 index ea4a1e4..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_ll.c +++ /dev/null @@ -1,41 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value long long. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ -#include "ffitest.h" -static long long return_ll(long long ll) -{ - return ll; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - long long rlonglong; - long long ll; - - args[0] = &ffi_type_sint64; - values[0] = ≪ - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_sint64, args) == FFI_OK); - - for (ll = 0LL; ll < 100LL; ll++) - { - ffi_call(&cif, FFI_FN(return_ll), &rlonglong, values); - CHECK(rlonglong == ll); - } - - for (ll = 55555555555000LL; ll < 55555555555100LL; ll++) - { - ffi_call(&cif, FFI_FN(return_ll), &rlonglong, values); - CHECK(rlonglong == ll); - } - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c deleted file mode 100644 index 593e8a3..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +++ /dev/null @@ -1,43 +0,0 @@ -/* Area: ffi_call - Purpose: Check if long long are passed in the corresponding regs on ppc. - Limitations: none. - PR: 20104. - Originator: 20050222 */ - -/* { dg-do run } */ -/* { dg-options "-Wno-format" { target alpha*-dec-osf* } } */ -#include "ffitest.h" -static long long return_ll(int ll0, long long ll1, int ll2) -{ - return ll0 + ll1 + ll2; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - long long rlonglong; - long long ll1; - unsigned ll0, ll2; - - args[0] = &ffi_type_sint; - args[1] = &ffi_type_sint64; - args[2] = &ffi_type_sint; - values[0] = &ll0; - values[1] = &ll1; - values[2] = &ll2; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, - &ffi_type_sint64, args) == FFI_OK); - - ll0 = 11111111; - ll1 = 11111111111000LL; - ll2 = 11111111; - - ffi_call(&cif, FFI_FN(return_ll), &rlonglong, values); - printf("res: %" PRIdLL ", %" PRIdLL "\n", rlonglong, ll0 + ll1 + ll2); - /* { dg-output "res: 11111133333222, 11111133333222" } */ - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c deleted file mode 100644 index a36cf3e..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c +++ /dev/null @@ -1,36 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value signed char. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ -#include "ffitest.h" - -static signed char return_sc(signed char sc) -{ - return sc; -} -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_arg rint; - signed char sc; - - args[0] = &ffi_type_schar; - values[0] = ≻ - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_schar, args) == FFI_OK); - - for (sc = (signed char) -127; - sc < (signed char) 127; sc++) - { - ffi_call(&cif, FFI_FN(return_sc), &rint, values); - CHECK((signed char)rint == sc); - } - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c deleted file mode 100644 index f0fd345..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c +++ /dev/null @@ -1,38 +0,0 @@ -/* Area: ffi_call - Purpose: Check if long as return type is handled correctly. - Limitations: none. - PR: none. - */ - -/* { dg-do run } */ -#include "ffitest.h" -static long return_sl(long l1, long l2) -{ - return l1 - l2; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_arg res; - unsigned long l1, l2; - - args[0] = &ffi_type_slong; - args[1] = &ffi_type_slong; - values[0] = &l1; - values[1] = &l2; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, - &ffi_type_slong, args) == FFI_OK); - - l1 = 1073741823L; - l2 = 1073741824L; - - ffi_call(&cif, FFI_FN(return_sl), &res, values); - printf("res: %ld, %ld\n", (long)res, l1 - l2); - /* { dg-output "res: -1, -1" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c deleted file mode 100644 index 6fe5546..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c +++ /dev/null @@ -1,38 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value unsigned char. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ -#include "ffitest.h" - -static unsigned char return_uc(unsigned char uc) -{ - return uc; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_arg rint; - - unsigned char uc; - - args[0] = &ffi_type_uchar; - values[0] = &uc; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_uchar, args) == FFI_OK); - - for (uc = (unsigned char) '\x00'; - uc < (unsigned char) '\xff'; uc++) - { - ffi_call(&cif, FFI_FN(return_uc), &rint, values); - CHECK((unsigned char)rint == uc); - } - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c deleted file mode 100644 index 12b266f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c +++ /dev/null @@ -1,38 +0,0 @@ -/* Area: ffi_call - Purpose: Check if unsigned long as return type is handled correctly. - Limitations: none. - PR: none. - Originator: 20060724 */ - -/* { dg-do run } */ -#include "ffitest.h" -static unsigned long return_ul(unsigned long ul1, unsigned long ul2) -{ - return ul1 + ul2; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_arg res; - unsigned long ul1, ul2; - - args[0] = &ffi_type_ulong; - args[1] = &ffi_type_ulong; - values[0] = &ul1; - values[1] = &ul2; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, - &ffi_type_ulong, args) == FFI_OK); - - ul1 = 1073741823L; - ul2 = 1073741824L; - - ffi_call(&cif, FFI_FN(return_ul), &res, values); - printf("res: %lu, %lu\n", (unsigned long)res, ul1 + ul2); - /* { dg-output "res: 2147483647, 2147483647" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c deleted file mode 100644 index 35b70ea..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +++ /dev/null @@ -1,44 +0,0 @@ -/* Area: ffi_call - Purpose: Check strlen function call. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ -#include "ffitest.h" - -static size_t ABI_ATTR my_strlen(char *s) -{ - return (strlen(s)); -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_arg rint; - char *s; - - args[0] = &ffi_type_pointer; - values[0] = (void*) &s; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, - &ffi_type_sint, args) == FFI_OK); - - s = "a"; - ffi_call(&cif, FFI_FN(my_strlen), &rint, values); - CHECK(rint == 1); - - s = "1234567"; - ffi_call(&cif, FFI_FN(my_strlen), &rint, values); - CHECK(rint == 7); - - s = "1234567890123456789012345"; - ffi_call(&cif, FFI_FN(my_strlen), &rint, values); - CHECK(rint == 25); - - exit (0); -} - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c deleted file mode 100644 index 96282bc..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c +++ /dev/null @@ -1,49 +0,0 @@ -/* Area: ffi_call - Purpose: Check strlen function call with additional arguments. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ - -#include "ffitest.h" - -static size_t ABI_ATTR my_f(char *s, float a) -{ - return (size_t) ((int) strlen(s) + (int) a); -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_arg rint; - char *s; - float v2; - args[0] = &ffi_type_pointer; - args[1] = &ffi_type_float; - values[0] = (void*) &s; - values[1] = (void*) &v2; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 2, - &ffi_type_sint, args) == FFI_OK); - - s = "a"; - v2 = 0.0; - ffi_call(&cif, FFI_FN(my_f), &rint, values); - CHECK(rint == 1); - - s = "1234567"; - v2 = -1.0; - ffi_call(&cif, FFI_FN(my_f), &rint, values); - CHECK(rint == 6); - - s = "1234567890123456789012345"; - v2 = 1.0; - ffi_call(&cif, FFI_FN(my_f), &rint, values); - CHECK(rint == 26); - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c deleted file mode 100644 index beba86e..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c +++ /dev/null @@ -1,49 +0,0 @@ -/* Area: ffi_call - Purpose: Check strlen function call with additional arguments. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ - -#include "ffitest.h" - -static size_t ABI_ATTR my_f(float a, char *s) -{ - return (size_t) ((int) strlen(s) + (int) a); -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_arg rint; - char *s; - float v2; - args[1] = &ffi_type_pointer; - args[0] = &ffi_type_float; - values[1] = (void*) &s; - values[0] = (void*) &v2; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 2, - &ffi_type_sint, args) == FFI_OK); - - s = "a"; - v2 = 0.0; - ffi_call(&cif, FFI_FN(my_f), &rint, values); - CHECK(rint == 1); - - s = "1234567"; - v2 = -1.0; - ffi_call(&cif, FFI_FN(my_f), &rint, values); - CHECK(rint == 6); - - s = "1234567890123456789012345"; - v2 = 1.0; - ffi_call(&cif, FFI_FN(my_f), &rint, values); - CHECK(rint == 26); - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c deleted file mode 100644 index d5d42b4..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c +++ /dev/null @@ -1,55 +0,0 @@ -/* Area: ffi_call - Purpose: Check strlen function call with additional arguments. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ - -#include "ffitest.h" - -static size_t ABI_ATTR my_f(float a, char *s, int i) -{ - return (size_t) ((int) strlen(s) + (int) a + i); -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_arg rint; - char *s; - int v1; - float v2; - args[2] = &ffi_type_sint; - args[1] = &ffi_type_pointer; - args[0] = &ffi_type_float; - values[2] = (void*) &v1; - values[1] = (void*) &s; - values[0] = (void*) &v2; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 3, - &ffi_type_sint, args) == FFI_OK); - - s = "a"; - v1 = 1; - v2 = 0.0; - ffi_call(&cif, FFI_FN(my_f), &rint, values); - CHECK(rint == 2); - - s = "1234567"; - v2 = -1.0; - v1 = -2; - ffi_call(&cif, FFI_FN(my_f), &rint, values); - CHECK(rint == 4); - - s = "1234567890123456789012345"; - v2 = 1.0; - v1 = 2; - ffi_call(&cif, FFI_FN(my_f), &rint, values); - CHECK(rint == 28); - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c deleted file mode 100644 index c13e23f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c +++ /dev/null @@ -1,67 +0,0 @@ -/* Area: ffi_call - Purpose: Check structures. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct -{ - unsigned char uc; - double d; - unsigned int ui; -} test_structure_1; - -static test_structure_1 ABI_ATTR struct1(test_structure_1 ts) -{ - ts.uc++; - ts.d--; - ts.ui++; - - return ts; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_type ts1_type; - ffi_type *ts1_type_elements[4]; - - test_structure_1 ts1_arg; - - /* This is a hack to get a properly aligned result buffer */ - test_structure_1 *ts1_result = - (test_structure_1 *) malloc (sizeof(test_structure_1)); - - ts1_type.size = 0; - ts1_type.alignment = 0; - ts1_type.type = FFI_TYPE_STRUCT; - ts1_type.elements = ts1_type_elements; - ts1_type_elements[0] = &ffi_type_uchar; - ts1_type_elements[1] = &ffi_type_double; - ts1_type_elements[2] = &ffi_type_uint; - ts1_type_elements[3] = NULL; - - args[0] = &ts1_type; - values[0] = &ts1_arg; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, - &ts1_type, args) == FFI_OK); - - ts1_arg.uc = '\x01'; - ts1_arg.d = 3.14159; - ts1_arg.ui = 555; - - ffi_call(&cif, FFI_FN(struct1), ts1_result, values); - - CHECK(ts1_result->ui == 556); - CHECK(ts1_result->d == 3.14159 - 1); - - free (ts1_result); - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/struct10.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/struct10.c deleted file mode 100644 index 17b1377..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/struct10.c +++ /dev/null @@ -1,57 +0,0 @@ -/* Area: ffi_call - Purpose: Check structures. - Limitations: none. - PR: none. - Originator: Sergei Trofimovich - - The test originally discovered in ruby's bindings - for ffi in https://bugs.gentoo.org/634190 */ - -/* { dg-do run } */ -#include "ffitest.h" - -struct s { - int s32; - float f32; - signed char s8; -}; - -struct s make_s(void) { - struct s r; - r.s32 = 0x1234; - r.f32 = 7.0; - r.s8 = 0x78; - return r; -} - -int main() { - ffi_cif cif; - struct s r; - ffi_type rtype; - ffi_type* s_fields[] = { - &ffi_type_sint, - &ffi_type_float, - &ffi_type_schar, - NULL, - }; - - rtype.size = 0; - rtype.alignment = 0, - rtype.type = FFI_TYPE_STRUCT, - rtype.elements = s_fields, - - r.s32 = 0xbad; - r.f32 = 999.999; - r.s8 = 0x51; - - // Here we emulate the following call: - //r = make_s(); - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0, &rtype, NULL) == FFI_OK); - ffi_call(&cif, FFI_FN(make_s), &r, NULL); - - CHECK(r.s32 == 0x1234); - CHECK(r.f32 == 7.0); - CHECK(r.s8 == 0x78); - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c deleted file mode 100644 index 5077a5e..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c +++ /dev/null @@ -1,67 +0,0 @@ -/* Area: ffi_call - Purpose: Check structures. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct -{ - double d1; - double d2; -} test_structure_2; - -static test_structure_2 ABI_ATTR struct2(test_structure_2 ts) -{ - ts.d1--; - ts.d2--; - - return ts; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - test_structure_2 ts2_arg; - ffi_type ts2_type; - ffi_type *ts2_type_elements[3]; - - /* This is a hack to get a properly aligned result buffer */ - test_structure_2 *ts2_result = - (test_structure_2 *) malloc (sizeof(test_structure_2)); - - ts2_type.size = 0; - ts2_type.alignment = 0; - ts2_type.type = FFI_TYPE_STRUCT; - ts2_type.elements = ts2_type_elements; - ts2_type_elements[0] = &ffi_type_double; - ts2_type_elements[1] = &ffi_type_double; - ts2_type_elements[2] = NULL; - - args[0] = &ts2_type; - values[0] = &ts2_arg; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts2_type, args) == FFI_OK); - - ts2_arg.d1 = 5.55; - ts2_arg.d2 = 6.66; - - printf ("%g\n", ts2_arg.d1); - printf ("%g\n", ts2_arg.d2); - - ffi_call(&cif, FFI_FN(struct2), ts2_result, values); - - printf ("%g\n", ts2_result->d1); - printf ("%g\n", ts2_result->d2); - - CHECK(ts2_result->d1 == 5.55 - 1); - CHECK(ts2_result->d2 == 6.66 - 1); - - free (ts2_result); - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c deleted file mode 100644 index 7eba0ea..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c +++ /dev/null @@ -1,60 +0,0 @@ -/* Area: ffi_call - Purpose: Check structures. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct -{ - int si; -} test_structure_3; - -static test_structure_3 ABI_ATTR struct3(test_structure_3 ts) -{ - ts.si = -(ts.si*2); - - return ts; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - int compare_value; - ffi_type ts3_type; - ffi_type *ts3_type_elements[2]; - - test_structure_3 ts3_arg; - test_structure_3 *ts3_result = - (test_structure_3 *) malloc (sizeof(test_structure_3)); - - ts3_type.size = 0; - ts3_type.alignment = 0; - ts3_type.type = FFI_TYPE_STRUCT; - ts3_type.elements = ts3_type_elements; - ts3_type_elements[0] = &ffi_type_sint; - ts3_type_elements[1] = NULL; - - args[0] = &ts3_type; - values[0] = &ts3_arg; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, - &ts3_type, args) == FFI_OK); - - ts3_arg.si = -123; - compare_value = ts3_arg.si; - - ffi_call(&cif, FFI_FN(struct3), ts3_result, values); - - printf ("%d %d\n", ts3_result->si, -(compare_value*2)); - - CHECK(ts3_result->si == -(compare_value*2)); - - free (ts3_result); - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c deleted file mode 100644 index 66a9551..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c +++ /dev/null @@ -1,64 +0,0 @@ -/* Area: ffi_call - Purpose: Check structures. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct -{ - unsigned ui1; - unsigned ui2; - unsigned ui3; -} test_structure_4; - -static test_structure_4 ABI_ATTR struct4(test_structure_4 ts) -{ - ts.ui3 = ts.ui1 * ts.ui2 * ts.ui3; - - return ts; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_type ts4_type; - ffi_type *ts4_type_elements[4]; - - test_structure_4 ts4_arg; - - /* This is a hack to get a properly aligned result buffer */ - test_structure_4 *ts4_result = - (test_structure_4 *) malloc (sizeof(test_structure_4)); - - ts4_type.size = 0; - ts4_type.alignment = 0; - ts4_type.type = FFI_TYPE_STRUCT; - ts4_type.elements = ts4_type_elements; - ts4_type_elements[0] = &ffi_type_uint; - ts4_type_elements[1] = &ffi_type_uint; - ts4_type_elements[2] = &ffi_type_uint; - ts4_type_elements[3] = NULL; - - args[0] = &ts4_type; - values[0] = &ts4_arg; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts4_type, args) == FFI_OK); - - ts4_arg.ui1 = 2; - ts4_arg.ui2 = 3; - ts4_arg.ui3 = 4; - - ffi_call (&cif, FFI_FN(struct4), ts4_result, values); - - CHECK(ts4_result->ui3 == 2U * 3U * 4U); - - - free (ts4_result); - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c deleted file mode 100644 index 23e2a3f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c +++ /dev/null @@ -1,66 +0,0 @@ -/* Area: ffi_call - Purpose: Check structures. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ -#include "ffitest.h" -typedef struct -{ - char c1; - char c2; -} test_structure_5; - -static test_structure_5 ABI_ATTR struct5(test_structure_5 ts1, test_structure_5 ts2) -{ - ts1.c1 += ts2.c1; - ts1.c2 -= ts2.c2; - - return ts1; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_type ts5_type; - ffi_type *ts5_type_elements[3]; - - test_structure_5 ts5_arg1, ts5_arg2; - - /* This is a hack to get a properly aligned result buffer */ - test_structure_5 *ts5_result = - (test_structure_5 *) malloc (sizeof(test_structure_5)); - - ts5_type.size = 0; - ts5_type.alignment = 0; - ts5_type.type = FFI_TYPE_STRUCT; - ts5_type.elements = ts5_type_elements; - ts5_type_elements[0] = &ffi_type_schar; - ts5_type_elements[1] = &ffi_type_schar; - ts5_type_elements[2] = NULL; - - args[0] = &ts5_type; - args[1] = &ts5_type; - values[0] = &ts5_arg1; - values[1] = &ts5_arg2; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 2, &ts5_type, args) == FFI_OK); - - ts5_arg1.c1 = 2; - ts5_arg1.c2 = 6; - ts5_arg2.c1 = 5; - ts5_arg2.c2 = 3; - - ffi_call (&cif, FFI_FN(struct5), ts5_result, values); - - CHECK(ts5_result->c1 == 7); - CHECK(ts5_result->c2 == 3); - - - free (ts5_result); - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c deleted file mode 100644 index 173c66e..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c +++ /dev/null @@ -1,64 +0,0 @@ -/* Area: ffi_call - Purpose: Check structures. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ -#include "ffitest.h" -typedef struct -{ - float f; - double d; -} test_structure_6; - -static test_structure_6 ABI_ATTR struct6 (test_structure_6 ts) -{ - ts.f += 1; - ts.d += 1; - - return ts; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_type ts6_type; - ffi_type *ts6_type_elements[3]; - - test_structure_6 ts6_arg; - - /* This is a hack to get a properly aligned result buffer */ - test_structure_6 *ts6_result = - (test_structure_6 *) malloc (sizeof(test_structure_6)); - - ts6_type.size = 0; - ts6_type.alignment = 0; - ts6_type.type = FFI_TYPE_STRUCT; - ts6_type.elements = ts6_type_elements; - ts6_type_elements[0] = &ffi_type_float; - ts6_type_elements[1] = &ffi_type_double; - ts6_type_elements[2] = NULL; - - args[0] = &ts6_type; - values[0] = &ts6_arg; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts6_type, args) == FFI_OK); - - ts6_arg.f = 5.55f; - ts6_arg.d = 6.66; - - printf ("%g\n", ts6_arg.f); - printf ("%g\n", ts6_arg.d); - - ffi_call(&cif, FFI_FN(struct6), ts6_result, values); - - CHECK(ts6_result->f == 5.55f + 1); - CHECK(ts6_result->d == 6.66 + 1); - - free (ts6_result); - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c deleted file mode 100644 index badc7e0..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c +++ /dev/null @@ -1,74 +0,0 @@ -/* Area: ffi_call - Purpose: Check structures. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ -#include "ffitest.h" -typedef struct -{ - float f1; - float f2; - double d; -} test_structure_7; - -static test_structure_7 ABI_ATTR struct7 (test_structure_7 ts) -{ - ts.f1 += 1; - ts.f2 += 1; - ts.d += 1; - - return ts; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_type ts7_type; - ffi_type *ts7_type_elements[4]; - - test_structure_7 ts7_arg; - - /* This is a hack to get a properly aligned result buffer */ - test_structure_7 *ts7_result = - (test_structure_7 *) malloc (sizeof(test_structure_7)); - - ts7_type.size = 0; - ts7_type.alignment = 0; - ts7_type.type = FFI_TYPE_STRUCT; - ts7_type.elements = ts7_type_elements; - ts7_type_elements[0] = &ffi_type_float; - ts7_type_elements[1] = &ffi_type_float; - ts7_type_elements[2] = &ffi_type_double; - ts7_type_elements[3] = NULL; - - args[0] = &ts7_type; - values[0] = &ts7_arg; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts7_type, args) == FFI_OK); - - ts7_arg.f1 = 5.55f; - ts7_arg.f2 = 55.5f; - ts7_arg.d = 6.66; - - printf ("%g\n", ts7_arg.f1); - printf ("%g\n", ts7_arg.f2); - printf ("%g\n", ts7_arg.d); - - ffi_call(&cif, FFI_FN(struct7), ts7_result, values); - - printf ("%g\n", ts7_result->f1); - printf ("%g\n", ts7_result->f2); - printf ("%g\n", ts7_result->d); - - CHECK(ts7_result->f1 == 5.55f + 1); - CHECK(ts7_result->f2 == 55.5f + 1); - CHECK(ts7_result->d == 6.66 + 1); - - free (ts7_result); - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c deleted file mode 100644 index ef204ec..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c +++ /dev/null @@ -1,81 +0,0 @@ -/* Area: ffi_call - Purpose: Check structures. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ -#include "ffitest.h" -typedef struct -{ - float f1; - float f2; - float f3; - float f4; -} test_structure_8; - -static test_structure_8 ABI_ATTR struct8 (test_structure_8 ts) -{ - ts.f1 += 1; - ts.f2 += 1; - ts.f3 += 1; - ts.f4 += 1; - - return ts; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_type ts8_type; - ffi_type *ts8_type_elements[5]; - - test_structure_8 ts8_arg; - - /* This is a hack to get a properly aligned result buffer */ - test_structure_8 *ts8_result = - (test_structure_8 *) malloc (sizeof(test_structure_8)); - - ts8_type.size = 0; - ts8_type.alignment = 0; - ts8_type.type = FFI_TYPE_STRUCT; - ts8_type.elements = ts8_type_elements; - ts8_type_elements[0] = &ffi_type_float; - ts8_type_elements[1] = &ffi_type_float; - ts8_type_elements[2] = &ffi_type_float; - ts8_type_elements[3] = &ffi_type_float; - ts8_type_elements[4] = NULL; - - args[0] = &ts8_type; - values[0] = &ts8_arg; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts8_type, args) == FFI_OK); - - ts8_arg.f1 = 5.55f; - ts8_arg.f2 = 55.5f; - ts8_arg.f3 = -5.55f; - ts8_arg.f4 = -55.5f; - - printf ("%g\n", ts8_arg.f1); - printf ("%g\n", ts8_arg.f2); - printf ("%g\n", ts8_arg.f3); - printf ("%g\n", ts8_arg.f4); - - ffi_call(&cif, FFI_FN(struct8), ts8_result, values); - - printf ("%g\n", ts8_result->f1); - printf ("%g\n", ts8_result->f2); - printf ("%g\n", ts8_result->f3); - printf ("%g\n", ts8_result->f4); - - CHECK(ts8_result->f1 == 5.55f + 1); - CHECK(ts8_result->f2 == 55.5f + 1); - CHECK(ts8_result->f3 == -5.55f + 1); - CHECK(ts8_result->f4 == -55.5f + 1); - - free (ts8_result); - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c deleted file mode 100644 index 4a13b81..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c +++ /dev/null @@ -1,68 +0,0 @@ -/* Area: ffi_call - Purpose: Check structures. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct -{ - float f; - int i; -} test_structure_9; - -static test_structure_9 ABI_ATTR struct9 (test_structure_9 ts) -{ - ts.f += 1; - ts.i += 1; - - return ts; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_type ts9_type; - ffi_type *ts9_type_elements[3]; - - test_structure_9 ts9_arg; - - /* This is a hack to get a properly aligned result buffer */ - test_structure_9 *ts9_result = - (test_structure_9 *) malloc (sizeof(test_structure_9)); - - ts9_type.size = 0; - ts9_type.alignment = 0; - ts9_type.type = FFI_TYPE_STRUCT; - ts9_type.elements = ts9_type_elements; - ts9_type_elements[0] = &ffi_type_float; - ts9_type_elements[1] = &ffi_type_sint; - ts9_type_elements[2] = NULL; - - args[0] = &ts9_type; - values[0] = &ts9_arg; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts9_type, args) == FFI_OK); - - ts9_arg.f = 5.55f; - ts9_arg.i = 5; - - printf ("%g\n", ts9_arg.f); - printf ("%d\n", ts9_arg.i); - - ffi_call(&cif, FFI_FN(struct9), ts9_result, values); - - printf ("%g\n", ts9_result->f); - printf ("%d\n", ts9_result->i); - - CHECK(ts9_result->f == 5.55f + 1); - CHECK(ts9_result->i == 5 + 1); - - free (ts9_result); - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/uninitialized.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/uninitialized.c deleted file mode 100644 index f00d830..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/uninitialized.c +++ /dev/null @@ -1,61 +0,0 @@ -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct -{ - unsigned char uc; - double d; - unsigned int ui; -} test_structure_1; - -static test_structure_1 struct1(test_structure_1 ts) -{ - ts.uc++; - ts.d--; - ts.ui++; - - return ts; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_type ts1_type; - ffi_type *ts1_type_elements[4]; - - memset(&cif, 1, sizeof(cif)); - ts1_type.size = 0; - ts1_type.alignment = 0; - ts1_type.type = FFI_TYPE_STRUCT; - ts1_type.elements = ts1_type_elements; - ts1_type_elements[0] = &ffi_type_uchar; - ts1_type_elements[1] = &ffi_type_double; - ts1_type_elements[2] = &ffi_type_uint; - ts1_type_elements[3] = NULL; - - test_structure_1 ts1_arg; - /* This is a hack to get a properly aligned result buffer */ - test_structure_1 *ts1_result = - (test_structure_1 *) malloc (sizeof(test_structure_1)); - - args[0] = &ts1_type; - values[0] = &ts1_arg; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ts1_type, args) == FFI_OK); - - ts1_arg.uc = '\x01'; - ts1_arg.d = 3.14159; - ts1_arg.ui = 555; - - ffi_call(&cif, FFI_FN(struct1), ts1_result, values); - - CHECK(ts1_result->ui == 556); - CHECK(ts1_result->d == 3.14159 - 1); - - free (ts1_result); - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c deleted file mode 100644 index 59d085c..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +++ /dev/null @@ -1,196 +0,0 @@ -/* Area: ffi_call - Purpose: Test passing struct in variable argument lists. - Limitations: none. - PR: none. - Originator: ARM Ltd. */ - -/* { dg-do run } */ -/* { dg-output "" { xfail avr32*-*-* m68k-*-* alpha-*-* } } */ - -#include "ffitest.h" -#include - -struct small_tag -{ - unsigned char a; - unsigned char b; -}; - -struct large_tag -{ - unsigned a; - unsigned b; - unsigned c; - unsigned d; - unsigned e; -}; - -static int -test_fn (int n, ...) -{ - va_list ap; - struct small_tag s1; - struct small_tag s2; - struct large_tag l; - unsigned char uc; - signed char sc; - unsigned short us; - signed short ss; - unsigned int ui; - signed int si; - unsigned long ul; - signed long sl; - float f; - double d; - - va_start (ap, n); - s1 = va_arg (ap, struct small_tag); - l = va_arg (ap, struct large_tag); - s2 = va_arg (ap, struct small_tag); - - uc = va_arg (ap, unsigned); - sc = va_arg (ap, signed); - - us = va_arg (ap, unsigned); - ss = va_arg (ap, signed); - - ui = va_arg (ap, unsigned int); - si = va_arg (ap, signed int); - - ul = va_arg (ap, unsigned long); - sl = va_arg (ap, signed long); - - f = va_arg (ap, double); /* C standard promotes float->double - when anonymous */ - d = va_arg (ap, double); - - printf ("%u %u %u %u %u %u %u %u %u uc=%u sc=%d %u %d %u %d %lu %ld %f %f\n", - s1.a, s1.b, l.a, l.b, l.c, l.d, l.e, - s2.a, s2.b, - uc, sc, - us, ss, - ui, si, - ul, sl, - f, d); - va_end (ap); - return n + 1; -} - -int -main (void) -{ - ffi_cif cif; - void* args[15]; - ffi_type* arg_types[15]; - - ffi_type s_type; - ffi_type *s_type_elements[3]; - - ffi_type l_type; - ffi_type *l_type_elements[6]; - - struct small_tag s1; - struct small_tag s2; - struct large_tag l1; - - int n; - ffi_arg res; - - unsigned char uc; - signed char sc; - unsigned short us; - signed short ss; - unsigned int ui; - signed int si; - unsigned long ul; - signed long sl; - double d1; - double f1; - - s_type.size = 0; - s_type.alignment = 0; - s_type.type = FFI_TYPE_STRUCT; - s_type.elements = s_type_elements; - - s_type_elements[0] = &ffi_type_uchar; - s_type_elements[1] = &ffi_type_uchar; - s_type_elements[2] = NULL; - - l_type.size = 0; - l_type.alignment = 0; - l_type.type = FFI_TYPE_STRUCT; - l_type.elements = l_type_elements; - - l_type_elements[0] = &ffi_type_uint; - l_type_elements[1] = &ffi_type_uint; - l_type_elements[2] = &ffi_type_uint; - l_type_elements[3] = &ffi_type_uint; - l_type_elements[4] = &ffi_type_uint; - l_type_elements[5] = NULL; - - arg_types[0] = &ffi_type_sint; - arg_types[1] = &s_type; - arg_types[2] = &l_type; - arg_types[3] = &s_type; - arg_types[4] = &ffi_type_uchar; - arg_types[5] = &ffi_type_schar; - arg_types[6] = &ffi_type_ushort; - arg_types[7] = &ffi_type_sshort; - arg_types[8] = &ffi_type_uint; - arg_types[9] = &ffi_type_sint; - arg_types[10] = &ffi_type_ulong; - arg_types[11] = &ffi_type_slong; - arg_types[12] = &ffi_type_double; - arg_types[13] = &ffi_type_double; - arg_types[14] = NULL; - - CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 14, &ffi_type_sint, arg_types) == FFI_OK); - - s1.a = 5; - s1.b = 6; - - l1.a = 10; - l1.b = 11; - l1.c = 12; - l1.d = 13; - l1.e = 14; - - s2.a = 7; - s2.b = 8; - - n = 41; - - uc = 9; - sc = 10; - us = 11; - ss = 12; - ui = 13; - si = 14; - ul = 15; - sl = 16; - f1 = 2.12; - d1 = 3.13; - - args[0] = &n; - args[1] = &s1; - args[2] = &l1; - args[3] = &s2; - args[4] = &uc; - args[5] = ≻ - args[6] = &us; - args[7] = &ss; - args[8] = &ui; - args[9] = &si; - args[10] = &ul; - args[11] = &sl; - args[12] = &f1; - args[13] = &d1; - args[14] = NULL; - - ffi_call(&cif, FFI_FN(test_fn), &res, args); - /* { dg-output "5 6 10 11 12 13 14 7 8 uc=9 sc=10 11 12 13 14 15 16 2.120000 3.130000" } */ - printf("res: %d\n", (int) res); - /* { dg-output "\nres: 42" } */ - - return 0; -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c deleted file mode 100644 index e645206..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c +++ /dev/null @@ -1,121 +0,0 @@ -/* Area: ffi_call - Purpose: Test passing struct in variable argument lists. - Limitations: none. - PR: none. - Originator: ARM Ltd. */ - -/* { dg-do run } */ -/* { dg-output "" { xfail avr32*-*-* } } */ - -#include "ffitest.h" -#include - -struct small_tag -{ - unsigned char a; - unsigned char b; -}; - -struct large_tag -{ - unsigned a; - unsigned b; - unsigned c; - unsigned d; - unsigned e; -}; - -static int -test_fn (int n, ...) -{ - va_list ap; - struct small_tag s1; - struct small_tag s2; - struct large_tag l; - - va_start (ap, n); - s1 = va_arg (ap, struct small_tag); - l = va_arg (ap, struct large_tag); - s2 = va_arg (ap, struct small_tag); - printf ("%u %u %u %u %u %u %u %u %u\n", s1.a, s1.b, l.a, l.b, l.c, l.d, l.e, - s2.a, s2.b); - va_end (ap); - return n + 1; -} - -int -main (void) -{ - ffi_cif cif; - void* args[5]; - ffi_type* arg_types[5]; - - ffi_type s_type; - ffi_type *s_type_elements[3]; - - ffi_type l_type; - ffi_type *l_type_elements[6]; - - struct small_tag s1; - struct small_tag s2; - struct large_tag l1; - - int n; - ffi_arg res; - - s_type.size = 0; - s_type.alignment = 0; - s_type.type = FFI_TYPE_STRUCT; - s_type.elements = s_type_elements; - - s_type_elements[0] = &ffi_type_uchar; - s_type_elements[1] = &ffi_type_uchar; - s_type_elements[2] = NULL; - - l_type.size = 0; - l_type.alignment = 0; - l_type.type = FFI_TYPE_STRUCT; - l_type.elements = l_type_elements; - - l_type_elements[0] = &ffi_type_uint; - l_type_elements[1] = &ffi_type_uint; - l_type_elements[2] = &ffi_type_uint; - l_type_elements[3] = &ffi_type_uint; - l_type_elements[4] = &ffi_type_uint; - l_type_elements[5] = NULL; - - arg_types[0] = &ffi_type_sint; - arg_types[1] = &s_type; - arg_types[2] = &l_type; - arg_types[3] = &s_type; - arg_types[4] = NULL; - - CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 4, &ffi_type_sint, arg_types) == FFI_OK); - - s1.a = 5; - s1.b = 6; - - l1.a = 10; - l1.b = 11; - l1.c = 12; - l1.d = 13; - l1.e = 14; - - s2.a = 7; - s2.b = 8; - - n = 41; - - args[0] = &n; - args[1] = &s1; - args[2] = &l1; - args[3] = &s2; - args[4] = NULL; - - ffi_call(&cif, FFI_FN(test_fn), &res, args); - /* { dg-output "5 6 10 11 12 13 14 7 8" } */ - printf("res: %d\n", (int) res); - /* { dg-output "\nres: 42" } */ - - return 0; -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c deleted file mode 100644 index 56f5b9c..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +++ /dev/null @@ -1,123 +0,0 @@ -/* Area: ffi_call - Purpose: Test passing struct in variable argument lists. - Limitations: none. - PR: none. - Originator: ARM Ltd. */ - -/* { dg-do run } */ -/* { dg-output "" { xfail avr32*-*-* } } */ - -#include "ffitest.h" -#include - -struct small_tag -{ - unsigned char a; - unsigned char b; -}; - -struct large_tag -{ - unsigned a; - unsigned b; - unsigned c; - unsigned d; - unsigned e; -}; - -static struct small_tag -test_fn (int n, ...) -{ - va_list ap; - struct small_tag s1; - struct small_tag s2; - struct large_tag l; - - va_start (ap, n); - s1 = va_arg (ap, struct small_tag); - l = va_arg (ap, struct large_tag); - s2 = va_arg (ap, struct small_tag); - printf ("%u %u %u %u %u %u %u %u %u\n", s1.a, s1.b, l.a, l.b, l.c, l.d, l.e, - s2.a, s2.b); - va_end (ap); - s1.a += s2.a; - s1.b += s2.b; - return s1; -} - -int -main (void) -{ - ffi_cif cif; - void* args[5]; - ffi_type* arg_types[5]; - - ffi_type s_type; - ffi_type *s_type_elements[3]; - - ffi_type l_type; - ffi_type *l_type_elements[6]; - - struct small_tag s1; - struct small_tag s2; - struct large_tag l1; - - int n; - struct small_tag res; - - s_type.size = 0; - s_type.alignment = 0; - s_type.type = FFI_TYPE_STRUCT; - s_type.elements = s_type_elements; - - s_type_elements[0] = &ffi_type_uchar; - s_type_elements[1] = &ffi_type_uchar; - s_type_elements[2] = NULL; - - l_type.size = 0; - l_type.alignment = 0; - l_type.type = FFI_TYPE_STRUCT; - l_type.elements = l_type_elements; - - l_type_elements[0] = &ffi_type_uint; - l_type_elements[1] = &ffi_type_uint; - l_type_elements[2] = &ffi_type_uint; - l_type_elements[3] = &ffi_type_uint; - l_type_elements[4] = &ffi_type_uint; - l_type_elements[5] = NULL; - - arg_types[0] = &ffi_type_sint; - arg_types[1] = &s_type; - arg_types[2] = &l_type; - arg_types[3] = &s_type; - arg_types[4] = NULL; - - CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 4, &s_type, arg_types) == FFI_OK); - - s1.a = 5; - s1.b = 6; - - l1.a = 10; - l1.b = 11; - l1.c = 12; - l1.d = 13; - l1.e = 14; - - s2.a = 7; - s2.b = 8; - - n = 41; - - args[0] = &n; - args[1] = &s1; - args[2] = &l1; - args[3] = &s2; - args[4] = NULL; - - ffi_call(&cif, FFI_FN(test_fn), &res, args); - /* { dg-output "5 6 10 11 12 13 14 7 8" } */ - printf("res: %d %d\n", res.a, res.b); - /* { dg-output "\nres: 12 14" } */ - - return 0; -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c deleted file mode 100644 index 9a27e7f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +++ /dev/null @@ -1,125 +0,0 @@ -/* Area: ffi_call - Purpose: Test passing struct in variable argument lists. - Limitations: none. - PR: none. - Originator: ARM Ltd. */ - -/* { dg-do run } */ -/* { dg-output "" { xfail avr32*-*-* } } */ - -#include "ffitest.h" -#include - -struct small_tag -{ - unsigned char a; - unsigned char b; -}; - -struct large_tag -{ - unsigned a; - unsigned b; - unsigned c; - unsigned d; - unsigned e; -}; - -static struct large_tag -test_fn (int n, ...) -{ - va_list ap; - struct small_tag s1; - struct small_tag s2; - struct large_tag l; - - va_start (ap, n); - s1 = va_arg (ap, struct small_tag); - l = va_arg (ap, struct large_tag); - s2 = va_arg (ap, struct small_tag); - printf ("%u %u %u %u %u %u %u %u %u\n", s1.a, s1.b, l.a, l.b, l.c, l.d, l.e, - s2.a, s2.b); - va_end (ap); - l.a += s1.a; - l.b += s1.b; - l.c += s2.a; - l.d += s2.b; - return l; -} - -int -main (void) -{ - ffi_cif cif; - void* args[5]; - ffi_type* arg_types[5]; - - ffi_type s_type; - ffi_type *s_type_elements[3]; - - ffi_type l_type; - ffi_type *l_type_elements[6]; - - struct small_tag s1; - struct small_tag s2; - struct large_tag l1; - - int n; - struct large_tag res; - - s_type.size = 0; - s_type.alignment = 0; - s_type.type = FFI_TYPE_STRUCT; - s_type.elements = s_type_elements; - - s_type_elements[0] = &ffi_type_uchar; - s_type_elements[1] = &ffi_type_uchar; - s_type_elements[2] = NULL; - - l_type.size = 0; - l_type.alignment = 0; - l_type.type = FFI_TYPE_STRUCT; - l_type.elements = l_type_elements; - - l_type_elements[0] = &ffi_type_uint; - l_type_elements[1] = &ffi_type_uint; - l_type_elements[2] = &ffi_type_uint; - l_type_elements[3] = &ffi_type_uint; - l_type_elements[4] = &ffi_type_uint; - l_type_elements[5] = NULL; - - arg_types[0] = &ffi_type_sint; - arg_types[1] = &s_type; - arg_types[2] = &l_type; - arg_types[3] = &s_type; - arg_types[4] = NULL; - - CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 4, &l_type, arg_types) == FFI_OK); - - s1.a = 5; - s1.b = 6; - - l1.a = 10; - l1.b = 11; - l1.c = 12; - l1.d = 13; - l1.e = 14; - - s2.a = 7; - s2.b = 8; - - n = 41; - - args[0] = &n; - args[1] = &s1; - args[2] = &l1; - args[3] = &s2; - args[4] = NULL; - - ffi_call(&cif, FFI_FN(test_fn), &res, args); - /* { dg-output "5 6 10 11 12 13 14 7 8" } */ - printf("res: %d %d %d %d %d\n", res.a, res.b, res.c, res.d, res.e); - /* { dg-output "\nres: 15 17 19 21 14" } */ - - return 0; -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/closure.exp b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/closure.exp deleted file mode 100644 index ed4145c..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/closure.exp +++ /dev/null @@ -1,67 +0,0 @@ -# Copyright (C) 2003, 2006, 2009, 2010, 2014, 2019 Free Software Foundation, Inc. -# Copyright (C) 2019 Anthony Green - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; see the file COPYING3. If not see -# . - -dg-init -libffi-init - -global srcdir subdir - -if { [string match $compiler_vendor "microsoft"] } { - # -wd4005 macro redefinition - # -wd4244 implicit conversion to type of smaller size - # -wd4305 truncation to smaller type - # -wd4477 printf %lu of uintptr_t - # -wd4312 implicit conversion to type of greater size - # -wd4311 pointer truncation to unsigned long - # -EHsc C++ Exception Handling (no SEH exceptions) - set additional_options "-wd4005 -wd4244 -wd4305 -wd4477 -wd4312 -wd4311 -EHsc"; -} else { - set additional_options ""; -} - -set tlist [lsort [glob -nocomplain -- $srcdir/$subdir/*.c]] - -if { [libffi_feature_test "#if FFI_CLOSURES"] } { - run-many-tests $tlist "" -} else { - foreach test $tlist { - unsupported "$test" - } -} - -set tlist [lsort [glob -nocomplain -- $srcdir/$subdir/*.cc]] - -# No C++ for or1k -if { [istarget "or1k-*-*"] } { - foreach test $tlist { - unsupported "$test" - } -} else { - if { [libffi_feature_test "#if FFI_CLOSURES"] } { - run-many-tests $tlist $additional_options - } else { - foreach test $tlist { - unsupported "$test" - } - } -} - -dg-finish - -# Local Variables: -# tcl-indent-level:4 -# End: diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn0.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn0.c deleted file mode 100644 index a579ff6..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn0.c +++ /dev/null @@ -1,89 +0,0 @@ -/* Area: closure_call - Purpose: Check multiple values passing from different type. - Also, exceed the limit of gpr and fpr registers on PowerPC - Darwin. - Limitations: none. - PR: none. - Originator: 20030828 */ - - - - -/* { dg-do run } */ -#include "ffitest.h" - -static void -closure_test_fn0(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata) -{ - *(ffi_arg*)resp = - (int)*(unsigned long long *)args[0] + (int)(*(int *)args[1]) + - (int)(*(unsigned long long *)args[2]) + (int)*(int *)args[3] + - (int)(*(signed short *)args[4]) + - (int)(*(unsigned long long *)args[5]) + - (int)*(int *)args[6] + (int)(*(int *)args[7]) + - (int)(*(double *)args[8]) + (int)*(int *)args[9] + - (int)(*(int *)args[10]) + (int)(*(float *)args[11]) + - (int)*(int *)args[12] + (int)(*(int *)args[13]) + - (int)(*(int *)args[14]) + *(int *)args[15] + (intptr_t)userdata; - - printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", - (int)*(unsigned long long *)args[0], (int)(*(int *)args[1]), - (int)(*(unsigned long long *)args[2]), - (int)*(int *)args[3], (int)(*(signed short *)args[4]), - (int)(*(unsigned long long *)args[5]), - (int)*(int *)args[6], (int)(*(int *)args[7]), - (int)(*(double *)args[8]), (int)*(int *)args[9], - (int)(*(int *)args[10]), (int)(*(float *)args[11]), - (int)*(int *)args[12], (int)(*(int *)args[13]), - (int)(*(int *)args[14]),*(int *)args[15], - (int)(intptr_t)userdata, (int)*(ffi_arg *)resp); - -} - -typedef int (*closure_test_type0)(unsigned long long, int, unsigned long long, - int, signed short, unsigned long long, int, - int, double, int, int, float, int, int, - int, int); - -int main (void) -{ - ffi_cif cif; - void * code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[17]; - int res; - - cl_arg_types[0] = &ffi_type_uint64; - cl_arg_types[1] = &ffi_type_sint; - cl_arg_types[2] = &ffi_type_uint64; - cl_arg_types[3] = &ffi_type_sint; - cl_arg_types[4] = &ffi_type_sshort; - cl_arg_types[5] = &ffi_type_uint64; - cl_arg_types[6] = &ffi_type_sint; - cl_arg_types[7] = &ffi_type_sint; - cl_arg_types[8] = &ffi_type_double; - cl_arg_types[9] = &ffi_type_sint; - cl_arg_types[10] = &ffi_type_sint; - cl_arg_types[11] = &ffi_type_float; - cl_arg_types[12] = &ffi_type_sint; - cl_arg_types[13] = &ffi_type_sint; - cl_arg_types[14] = &ffi_type_sint; - cl_arg_types[15] = &ffi_type_sint; - cl_arg_types[16] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, - &ffi_type_sint, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn0, - (void *) 3 /* userdata */, code) == FFI_OK); - - res = (*((closure_test_type0)code)) - (1LL, 2, 3LL, 4, 127, 429LL, 7, 8, 9.5, 10, 11, 12, 13, - 19, 21, 1); - /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */ - printf("res: %d\n",res); - /* { dg-output "\nres: 680" } */ - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn1.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn1.c deleted file mode 100644 index 9123173..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn1.c +++ /dev/null @@ -1,81 +0,0 @@ -/* Area: closure_call. - Purpose: Check multiple values passing from different type. - Also, exceed the limit of gpr and fpr registers on PowerPC - Darwin. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - - -static void closure_test_fn1(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata) -{ - *(ffi_arg*)resp = - (int)*(float *)args[0] +(int)(*(float *)args[1]) + - (int)(*(float *)args[2]) + (int)*(float *)args[3] + - (int)(*(signed short *)args[4]) + (int)(*(float *)args[5]) + - (int)*(float *)args[6] + (int)(*(int *)args[7]) + - (int)(*(double*)args[8]) + (int)*(int *)args[9] + - (int)(*(int *)args[10]) + (int)(*(float *)args[11]) + - (int)*(int *)args[12] + (int)(*(int *)args[13]) + - (int)(*(int *)args[14]) + *(int *)args[15] + (intptr_t)userdata; - - printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", - (int)*(float *)args[0], (int)(*(float *)args[1]), - (int)(*(float *)args[2]), (int)*(float *)args[3], - (int)(*(signed short *)args[4]), (int)(*(float *)args[5]), - (int)*(float *)args[6], (int)(*(int *)args[7]), - (int)(*(double *)args[8]), (int)*(int *)args[9], - (int)(*(int *)args[10]), (int)(*(float *)args[11]), - (int)*(int *)args[12], (int)(*(int *)args[13]), - (int)(*(int *)args[14]), *(int *)args[15], - (int)(intptr_t)userdata, (int)*(ffi_arg *)resp); -} - -typedef int (*closure_test_type1)(float, float, float, float, signed short, - float, float, int, double, int, int, float, - int, int, int, int); -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[17]; - int res; - - cl_arg_types[0] = &ffi_type_float; - cl_arg_types[1] = &ffi_type_float; - cl_arg_types[2] = &ffi_type_float; - cl_arg_types[3] = &ffi_type_float; - cl_arg_types[4] = &ffi_type_sshort; - cl_arg_types[5] = &ffi_type_float; - cl_arg_types[6] = &ffi_type_float; - cl_arg_types[7] = &ffi_type_sint; - cl_arg_types[8] = &ffi_type_double; - cl_arg_types[9] = &ffi_type_sint; - cl_arg_types[10] = &ffi_type_sint; - cl_arg_types[11] = &ffi_type_float; - cl_arg_types[12] = &ffi_type_sint; - cl_arg_types[13] = &ffi_type_sint; - cl_arg_types[14] = &ffi_type_sint; - cl_arg_types[15] = &ffi_type_sint; - cl_arg_types[16] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, - &ffi_type_sint, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn1, - (void *) 3 /* userdata */, code) == FFI_OK); - - res = (*((closure_test_type1)code)) - (1.1, 2.2, 3.3, 4.4, 127, 5.5, 6.6, 8, 9, 10, 11, 12.0, 13, - 19, 21, 1); - /* { dg-output "1 2 3 4 127 5 6 8 9 10 11 12 13 19 21 1 3: 255" } */ - printf("res: %d\n",res); - /* { dg-output "\nres: 255" } */ - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn2.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn2.c deleted file mode 100644 index 08ff9d9..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn2.c +++ /dev/null @@ -1,81 +0,0 @@ -/* Area: closure_call - Purpose: Check multiple values passing from different type. - Also, exceed the limit of gpr and fpr registers on PowerPC - Darwin. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -static void closure_test_fn2(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata) -{ - *(ffi_arg*)resp = - (int)*(double *)args[0] +(int)(*(double *)args[1]) + - (int)(*(double *)args[2]) + (int)*(double *)args[3] + - (int)(*(signed short *)args[4]) + (int)(*(double *)args[5]) + - (int)*(double *)args[6] + (int)(*(int *)args[7]) + - (int)(*(double *)args[8]) + (int)*(int *)args[9] + - (int)(*(int *)args[10]) + (int)(*(float *)args[11]) + - (int)*(int *)args[12] + (int)(*(float *)args[13]) + - (int)(*(int *)args[14]) + *(int *)args[15] + (intptr_t)userdata; - - printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", - (int)*(double *)args[0], (int)(*(double *)args[1]), - (int)(*(double *)args[2]), (int)*(double *)args[3], - (int)(*(signed short *)args[4]), (int)(*(double *)args[5]), - (int)*(double *)args[6], (int)(*(int *)args[7]), - (int)(*(double*)args[8]), (int)*(int *)args[9], - (int)(*(int *)args[10]), (int)(*(float *)args[11]), - (int)*(int *)args[12], (int)(*(float *)args[13]), - (int)(*(int *)args[14]), *(int *)args[15], (int)(intptr_t)userdata, - (int)*(ffi_arg *)resp); -} - -typedef int (*closure_test_type2)(double, double, double, double, signed short, - double, double, int, double, int, int, float, - int, float, int, int); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[17]; - int res; - - cl_arg_types[0] = &ffi_type_double; - cl_arg_types[1] = &ffi_type_double; - cl_arg_types[2] = &ffi_type_double; - cl_arg_types[3] = &ffi_type_double; - cl_arg_types[4] = &ffi_type_sshort; - cl_arg_types[5] = &ffi_type_double; - cl_arg_types[6] = &ffi_type_double; - cl_arg_types[7] = &ffi_type_sint; - cl_arg_types[8] = &ffi_type_double; - cl_arg_types[9] = &ffi_type_sint; - cl_arg_types[10] = &ffi_type_sint; - cl_arg_types[11] = &ffi_type_float; - cl_arg_types[12] = &ffi_type_sint; - cl_arg_types[13] = &ffi_type_float; - cl_arg_types[14] = &ffi_type_sint; - cl_arg_types[15] = &ffi_type_sint; - cl_arg_types[16] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, - &ffi_type_sint, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn2, - (void *) 3 /* userdata */, code) == FFI_OK); - - res = (*((closure_test_type2)code)) - (1, 2, 3, 4, 127, 5, 6, 8, 9, 10, 11, 12.0, 13, - 19.0, 21, 1); - /* { dg-output "1 2 3 4 127 5 6 8 9 10 11 12 13 19 21 1 3: 255" } */ - printf("res: %d\n",res); - /* { dg-output "\nres: 255" } */ - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn3.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn3.c deleted file mode 100644 index 9b54d80..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn3.c +++ /dev/null @@ -1,82 +0,0 @@ -/* Area: closure_call - Purpose: Check multiple values passing from different type. - Also, exceed the limit of gpr and fpr registers on PowerPC - Darwin. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -static void closure_test_fn3(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata) - { - *(ffi_arg*)resp = - (int)*(float *)args[0] +(int)(*(float *)args[1]) + - (int)(*(float *)args[2]) + (int)*(float *)args[3] + - (int)(*(float *)args[4]) + (int)(*(float *)args[5]) + - (int)*(float *)args[6] + (int)(*(float *)args[7]) + - (int)(*(double *)args[8]) + (int)*(int *)args[9] + - (int)(*(float *)args[10]) + (int)(*(float *)args[11]) + - (int)*(int *)args[12] + (int)(*(float *)args[13]) + - (int)(*(float *)args[14]) + *(int *)args[15] + (intptr_t)userdata; - - printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", - (int)*(float *)args[0], (int)(*(float *)args[1]), - (int)(*(float *)args[2]), (int)*(float *)args[3], - (int)(*(float *)args[4]), (int)(*(float *)args[5]), - (int)*(float *)args[6], (int)(*(float *)args[7]), - (int)(*(double *)args[8]), (int)*(int *)args[9], - (int)(*(float *)args[10]), (int)(*(float *)args[11]), - (int)*(int *)args[12], (int)(*(float *)args[13]), - (int)(*(float *)args[14]), *(int *)args[15], (int)(intptr_t)userdata, - (int)*(ffi_arg *)resp); - - } - -typedef int (*closure_test_type3)(float, float, float, float, float, float, - float, float, double, int, float, float, int, - float, float, int); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[17]; - int res; - - cl_arg_types[0] = &ffi_type_float; - cl_arg_types[1] = &ffi_type_float; - cl_arg_types[2] = &ffi_type_float; - cl_arg_types[3] = &ffi_type_float; - cl_arg_types[4] = &ffi_type_float; - cl_arg_types[5] = &ffi_type_float; - cl_arg_types[6] = &ffi_type_float; - cl_arg_types[7] = &ffi_type_float; - cl_arg_types[8] = &ffi_type_double; - cl_arg_types[9] = &ffi_type_sint; - cl_arg_types[10] = &ffi_type_float; - cl_arg_types[11] = &ffi_type_float; - cl_arg_types[12] = &ffi_type_sint; - cl_arg_types[13] = &ffi_type_float; - cl_arg_types[14] = &ffi_type_float; - cl_arg_types[15] = &ffi_type_sint; - cl_arg_types[16] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, - &ffi_type_sint, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn3, - (void *) 3 /* userdata */, code) == FFI_OK); - - res = (*((closure_test_type3)code)) - (1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9, 10, 11.11, 12.0, 13, - 19.19, 21.21, 1); - /* { dg-output "1 2 3 4 5 6 7 8 9 10 11 12 13 19 21 1 3: 135" } */ - printf("res: %d\n",res); - /* { dg-output "\nres: 135" } */ - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn4.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn4.c deleted file mode 100644 index d4a1530..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn4.c +++ /dev/null @@ -1,89 +0,0 @@ -/* Area: closure_call - Purpose: Check multiple long long values passing. - Also, exceed the limit of gpr and fpr registers on PowerPC - Darwin. - Limitations: none. - PR: none. - Originator: 20031026 */ - -/* { dg-do run } */ - -#include "ffitest.h" - -static void -closure_test_fn0(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata) -{ - *(ffi_arg*)resp = - (int)*(unsigned long long *)args[0] + (int)*(unsigned long long *)args[1] + - (int)*(unsigned long long *)args[2] + (int)*(unsigned long long *)args[3] + - (int)*(unsigned long long *)args[4] + (int)*(unsigned long long *)args[5] + - (int)*(unsigned long long *)args[6] + (int)*(unsigned long long *)args[7] + - (int)*(unsigned long long *)args[8] + (int)*(unsigned long long *)args[9] + - (int)*(unsigned long long *)args[10] + - (int)*(unsigned long long *)args[11] + - (int)*(unsigned long long *)args[12] + - (int)*(unsigned long long *)args[13] + - (int)*(unsigned long long *)args[14] + - *(int *)args[15] + (intptr_t)userdata; - - printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", - (int)*(unsigned long long *)args[0], - (int)*(unsigned long long *)args[1], - (int)*(unsigned long long *)args[2], - (int)*(unsigned long long *)args[3], - (int)*(unsigned long long *)args[4], - (int)*(unsigned long long *)args[5], - (int)*(unsigned long long *)args[6], - (int)*(unsigned long long *)args[7], - (int)*(unsigned long long *)args[8], - (int)*(unsigned long long *)args[9], - (int)*(unsigned long long *)args[10], - (int)*(unsigned long long *)args[11], - (int)*(unsigned long long *)args[12], - (int)*(unsigned long long *)args[13], - (int)*(unsigned long long *)args[14], - *(int *)args[15], - (int)(intptr_t)userdata, (int)*(ffi_arg *)resp); - -} - -typedef int (*closure_test_type0)(unsigned long long, unsigned long long, - unsigned long long, unsigned long long, - unsigned long long, unsigned long long, - unsigned long long, unsigned long long, - unsigned long long, unsigned long long, - unsigned long long, unsigned long long, - unsigned long long, unsigned long long, - unsigned long long, int); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[17]; - int i, res; - - for (i = 0; i < 15; i++) { - cl_arg_types[i] = &ffi_type_uint64; - } - cl_arg_types[15] = &ffi_type_sint; - cl_arg_types[16] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, - &ffi_type_sint, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn0, - (void *) 3 /* userdata */, code) == FFI_OK); - - res = (*((closure_test_type0)code)) - (1LL, 2LL, 3LL, 4LL, 127LL, 429LL, 7LL, 8LL, 9LL, 10LL, 11LL, 12LL, - 13LL, 19LL, 21LL, 1); - /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */ - printf("res: %d\n",res); - /* { dg-output "\nres: 680" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn5.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn5.c deleted file mode 100644 index 9907442..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn5.c +++ /dev/null @@ -1,92 +0,0 @@ -/* Area: closure_call - Purpose: Check multiple long long values passing. - Exceed the limit of gpr registers on PowerPC - Darwin. - Limitations: none. - PR: none. - Originator: 20031026 */ - -/* { dg-do run } */ -#include "ffitest.h" - -static void -closure_test_fn5(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata) -{ - *(ffi_arg*)resp = - (int)*(unsigned long long *)args[0] + (int)*(unsigned long long *)args[1] + - (int)*(unsigned long long *)args[2] + (int)*(unsigned long long *)args[3] + - (int)*(unsigned long long *)args[4] + (int)*(unsigned long long *)args[5] + - (int)*(unsigned long long *)args[6] + (int)*(unsigned long long *)args[7] + - (int)*(unsigned long long *)args[8] + (int)*(unsigned long long *)args[9] + - (int)*(int *)args[10] + - (int)*(unsigned long long *)args[11] + - (int)*(unsigned long long *)args[12] + - (int)*(unsigned long long *)args[13] + - (int)*(unsigned long long *)args[14] + - *(int *)args[15] + (intptr_t)userdata; - - printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", - (int)*(unsigned long long *)args[0], - (int)*(unsigned long long *)args[1], - (int)*(unsigned long long *)args[2], - (int)*(unsigned long long *)args[3], - (int)*(unsigned long long *)args[4], - (int)*(unsigned long long *)args[5], - (int)*(unsigned long long *)args[6], - (int)*(unsigned long long *)args[7], - (int)*(unsigned long long *)args[8], - (int)*(unsigned long long *)args[9], - (int)*(int *)args[10], - (int)*(unsigned long long *)args[11], - (int)*(unsigned long long *)args[12], - (int)*(unsigned long long *)args[13], - (int)*(unsigned long long *)args[14], - *(int *)args[15], - (int)(intptr_t)userdata, (int)*(ffi_arg *)resp); - -} - -typedef int (*closure_test_type0)(unsigned long long, unsigned long long, - unsigned long long, unsigned long long, - unsigned long long, unsigned long long, - unsigned long long, unsigned long long, - unsigned long long, unsigned long long, - int, unsigned long long, - unsigned long long, unsigned long long, - unsigned long long, int); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[17]; - int i, res; - - for (i = 0; i < 10; i++) { - cl_arg_types[i] = &ffi_type_uint64; - } - cl_arg_types[10] = &ffi_type_sint; - for (i = 11; i < 15; i++) { - cl_arg_types[i] = &ffi_type_uint64; - } - cl_arg_types[15] = &ffi_type_sint; - cl_arg_types[16] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, - &ffi_type_sint, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn5, - (void *) 3 /* userdata */, code) == FFI_OK); - - res = (*((closure_test_type0)code)) - (1LL, 2LL, 3LL, 4LL, 127LL, 429LL, 7LL, 8LL, 9LL, 10LL, 11, 12LL, - 13LL, 19LL, 21LL, 1); - /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */ - printf("res: %d\n",res); - /* { dg-output "\nres: 680" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn6.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn6.c deleted file mode 100644 index 73c54fd..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn6.c +++ /dev/null @@ -1,90 +0,0 @@ -/* Area: closure_call - Purpose: Check multiple values passing from different type. - Also, exceed the limit of gpr and fpr registers on PowerPC. - Limitations: none. - PR: PR23404 - Originator: 20050830 */ - -/* { dg-do run } */ -#include "ffitest.h" - -static void -closure_test_fn0(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata) -{ - *(ffi_arg*)resp = - (int)*(unsigned long long *)args[0] + - (int)(*(unsigned long long *)args[1]) + - (int)(*(unsigned long long *)args[2]) + - (int)*(unsigned long long *)args[3] + - (int)(*(int *)args[4]) + (int)(*(double *)args[5]) + - (int)*(double *)args[6] + (int)(*(float *)args[7]) + - (int)(*(double *)args[8]) + (int)*(double *)args[9] + - (int)(*(int *)args[10]) + (int)(*(float *)args[11]) + - (int)*(int *)args[12] + (int)(*(int *)args[13]) + - (int)(*(double *)args[14]) + (int)*(double *)args[15] + - (intptr_t)userdata; - - printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", - (int)*(unsigned long long *)args[0], - (int)(*(unsigned long long *)args[1]), - (int)(*(unsigned long long *)args[2]), - (int)*(unsigned long long *)args[3], - (int)(*(int *)args[4]), (int)(*(double *)args[5]), - (int)*(double *)args[6], (int)(*(float *)args[7]), - (int)(*(double *)args[8]), (int)*(double *)args[9], - (int)(*(int *)args[10]), (int)(*(float *)args[11]), - (int)*(int *)args[12], (int)(*(int *)args[13]), - (int)(*(double *)args[14]), (int)(*(double *)args[15]), - (int)(intptr_t)userdata, (int)*(ffi_arg *)resp); - -} - -typedef int (*closure_test_type0)(unsigned long long, - unsigned long long, - unsigned long long, - unsigned long long, - int, double, double, float, double, double, - int, float, int, int, double, double); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[17]; - int res; - - cl_arg_types[0] = &ffi_type_uint64; - cl_arg_types[1] = &ffi_type_uint64; - cl_arg_types[2] = &ffi_type_uint64; - cl_arg_types[3] = &ffi_type_uint64; - cl_arg_types[4] = &ffi_type_sint; - cl_arg_types[5] = &ffi_type_double; - cl_arg_types[6] = &ffi_type_double; - cl_arg_types[7] = &ffi_type_float; - cl_arg_types[8] = &ffi_type_double; - cl_arg_types[9] = &ffi_type_double; - cl_arg_types[10] = &ffi_type_sint; - cl_arg_types[11] = &ffi_type_float; - cl_arg_types[12] = &ffi_type_sint; - cl_arg_types[13] = &ffi_type_sint; - cl_arg_types[14] = &ffi_type_double; - cl_arg_types[15] = &ffi_type_double; - cl_arg_types[16] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, - &ffi_type_sint, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn0, - (void *) 3 /* userdata */, code) == FFI_OK); - - res = (*((closure_test_type0)code)) - (1, 2, 3, 4, 127, 429., 7., 8., 9.5, 10., 11, 12., 13, - 19, 21., 1.); - /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */ - printf("res: %d\n",res); - /* { dg-output "\nres: 680" } */ - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/closure_loc_fn0.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/closure_loc_fn0.c deleted file mode 100644 index b3afa0b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/closure_loc_fn0.c +++ /dev/null @@ -1,95 +0,0 @@ -/* Area: closure_call - Purpose: Check multiple values passing from different type. - Also, exceed the limit of gpr and fpr registers on PowerPC - Darwin. - Limitations: none. - PR: none. - Originator: 20030828 */ - - - - -/* { dg-do run } */ -#include "ffitest.h" - -static void -closure_loc_test_fn0(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata) -{ - *(ffi_arg*)resp = - (int)*(unsigned long long *)args[0] + (int)(*(int *)args[1]) + - (int)(*(unsigned long long *)args[2]) + (int)*(int *)args[3] + - (int)(*(signed short *)args[4]) + - (int)(*(unsigned long long *)args[5]) + - (int)*(int *)args[6] + (int)(*(int *)args[7]) + - (int)(*(double *)args[8]) + (int)*(int *)args[9] + - (int)(*(int *)args[10]) + (int)(*(float *)args[11]) + - (int)*(int *)args[12] + (int)(*(int *)args[13]) + - (int)(*(int *)args[14]) + *(int *)args[15] + (intptr_t)userdata; - - printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", - (int)*(unsigned long long *)args[0], (int)(*(int *)args[1]), - (int)(*(unsigned long long *)args[2]), - (int)*(int *)args[3], (int)(*(signed short *)args[4]), - (int)(*(unsigned long long *)args[5]), - (int)*(int *)args[6], (int)(*(int *)args[7]), - (int)(*(double *)args[8]), (int)*(int *)args[9], - (int)(*(int *)args[10]), (int)(*(float *)args[11]), - (int)*(int *)args[12], (int)(*(int *)args[13]), - (int)(*(int *)args[14]),*(int *)args[15], - (int)(intptr_t)userdata, (int)*(ffi_arg *)resp); - -} - -typedef int (*closure_loc_test_type0)(unsigned long long, int, unsigned long long, - int, signed short, unsigned long long, int, - int, double, int, int, float, int, int, - int, int); - -int main (void) -{ - ffi_cif cif; - ffi_closure *pcl; - ffi_type * cl_arg_types[17]; - int res; - void *codeloc; - - cl_arg_types[0] = &ffi_type_uint64; - cl_arg_types[1] = &ffi_type_sint; - cl_arg_types[2] = &ffi_type_uint64; - cl_arg_types[3] = &ffi_type_sint; - cl_arg_types[4] = &ffi_type_sshort; - cl_arg_types[5] = &ffi_type_uint64; - cl_arg_types[6] = &ffi_type_sint; - cl_arg_types[7] = &ffi_type_sint; - cl_arg_types[8] = &ffi_type_double; - cl_arg_types[9] = &ffi_type_sint; - cl_arg_types[10] = &ffi_type_sint; - cl_arg_types[11] = &ffi_type_float; - cl_arg_types[12] = &ffi_type_sint; - cl_arg_types[13] = &ffi_type_sint; - cl_arg_types[14] = &ffi_type_sint; - cl_arg_types[15] = &ffi_type_sint; - cl_arg_types[16] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, - &ffi_type_sint, cl_arg_types) == FFI_OK); - - pcl = ffi_closure_alloc(sizeof(ffi_closure), &codeloc); - CHECK(pcl != NULL); - CHECK(codeloc != NULL); - - CHECK(ffi_prep_closure_loc(pcl, &cif, closure_loc_test_fn0, - (void *) 3 /* userdata */, codeloc) == FFI_OK); - - CHECK(memcmp(pcl, codeloc, sizeof(*pcl)) == 0); - - res = (*((closure_loc_test_type0)codeloc)) - (1LL, 2, 3LL, 4, 127, 429LL, 7, 8, 9.5, 10, 11, 12, 13, - 19, 21, 1); - /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */ - printf("res: %d\n",res); - /* { dg-output "\nres: 680" } */ - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/closure_simple.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/closure_simple.c deleted file mode 100644 index 5a4e728..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/closure_simple.c +++ /dev/null @@ -1,55 +0,0 @@ -/* Area: closure_call - Purpose: Check simple closure handling with all ABIs - Limitations: none. - PR: none. - Originator: */ - -/* { dg-do run } */ -#include "ffitest.h" - -static void -closure_test(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata) -{ - *(ffi_arg*)resp = - (int)*(int *)args[0] + (int)(*(int *)args[1]) - + (int)(*(int *)args[2]) + (int)(*(int *)args[3]) - + (int)(intptr_t)userdata; - - printf("%d %d %d %d: %d\n", - (int)*(int *)args[0], (int)(*(int *)args[1]), - (int)(*(int *)args[2]), (int)(*(int *)args[3]), - (int)*(ffi_arg *)resp); - -} - -typedef int (ABI_ATTR *closure_test_type0)(int, int, int, int); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[17]; - int res; - - cl_arg_types[0] = &ffi_type_uint; - cl_arg_types[1] = &ffi_type_uint; - cl_arg_types[2] = &ffi_type_uint; - cl_arg_types[3] = &ffi_type_uint; - cl_arg_types[4] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 4, - &ffi_type_sint, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test, - (void *) 3 /* userdata */, code) == FFI_OK); - - res = (*(closure_test_type0)code)(0, 1, 2, 3); - /* { dg-output "0 1 2 3: 9" } */ - - printf("res: %d\n",res); - /* { dg-output "\nres: 9" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_12byte.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_12byte.c deleted file mode 100644 index ea0825d..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_12byte.c +++ /dev/null @@ -1,94 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_12byte { - int a; - int b; - int c; -} cls_struct_12byte; - -cls_struct_12byte cls_struct_12byte_fn(struct cls_struct_12byte b1, - struct cls_struct_12byte b2) -{ - struct cls_struct_12byte result; - - result.a = b1.a + b2.a; - result.b = b1.b + b2.b; - result.c = b1.c + b2.c; - - printf("%d %d %d %d %d %d: %d %d %d\n", b1.a, b1.b, b1.c, b2.a, b2.b, b2.c, - result.a, result.b, result.c); - - return result; -} - -static void cls_struct_12byte_gn(ffi_cif* cif __UNUSED__, void* resp, - void** args , void* userdata __UNUSED__) -{ - struct cls_struct_12byte b1, b2; - - b1 = *(struct cls_struct_12byte*)(args[0]); - b2 = *(struct cls_struct_12byte*)(args[1]); - - *(cls_struct_12byte*)resp = cls_struct_12byte_fn(b1, b2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_12byte h_dbl = { 7, 4, 9 }; - struct cls_struct_12byte j_dbl = { 1, 5, 3 }; - struct cls_struct_12byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_sint; - cls_struct_fields[1] = &ffi_type_sint; - cls_struct_fields[2] = &ffi_type_sint; - cls_struct_fields[3] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &h_dbl; - args_dbl[1] = &j_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_12byte_fn), &res_dbl, args_dbl); - /* { dg-output "7 4 9 1 5 3: 8 9 12" } */ - printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 8 9 12" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_12byte_gn, NULL, code) == FFI_OK); - - res_dbl.a = 0; - res_dbl.b = 0; - res_dbl.c = 0; - - res_dbl = ((cls_struct_12byte(*)(cls_struct_12byte, cls_struct_12byte))(code))(h_dbl, j_dbl); - /* { dg-output "\n7 4 9 1 5 3: 8 9 12" } */ - printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 8 9 12" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_16byte.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_16byte.c deleted file mode 100644 index 89a08a2..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_16byte.c +++ /dev/null @@ -1,95 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Depending on the ABI. Check overlapping. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_16byte { - int a; - double b; - int c; -} cls_struct_16byte; - -cls_struct_16byte cls_struct_16byte_fn(struct cls_struct_16byte b1, - struct cls_struct_16byte b2) -{ - struct cls_struct_16byte result; - - result.a = b1.a + b2.a; - result.b = b1.b + b2.b; - result.c = b1.c + b2.c; - - printf("%d %g %d %d %g %d: %d %g %d\n", b1.a, b1.b, b1.c, b2.a, b2.b, b2.c, - result.a, result.b, result.c); - - return result; -} - -static void cls_struct_16byte_gn(ffi_cif* cif __UNUSED__, void* resp, - void** args, void* userdata __UNUSED__) -{ - struct cls_struct_16byte b1, b2; - - b1 = *(struct cls_struct_16byte*)(args[0]); - b2 = *(struct cls_struct_16byte*)(args[1]); - - *(cls_struct_16byte*)resp = cls_struct_16byte_fn(b1, b2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_16byte h_dbl = { 7, 8.0, 9 }; - struct cls_struct_16byte j_dbl = { 1, 9.0, 3 }; - struct cls_struct_16byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_sint; - cls_struct_fields[1] = &ffi_type_double; - cls_struct_fields[2] = &ffi_type_sint; - cls_struct_fields[3] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &h_dbl; - args_dbl[1] = &j_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_16byte_fn), &res_dbl, args_dbl); - /* { dg-output "7 8 9 1 9 3: 8 17 12" } */ - printf("res: %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 8 17 12" } */ - - res_dbl.a = 0; - res_dbl.b = 0.0; - res_dbl.c = 0; - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_16byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_16byte(*)(cls_struct_16byte, cls_struct_16byte))(code))(h_dbl, j_dbl); - /* { dg-output "\n7 8 9 1 9 3: 8 17 12" } */ - printf("res: %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 8 17 12" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_18byte.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_18byte.c deleted file mode 100644 index 9f75da8..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_18byte.c +++ /dev/null @@ -1,96 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Depending on the ABI. Double alignment check on darwin. - Limitations: none. - PR: none. - Originator: 20030915 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_18byte { - double a; - unsigned char b; - unsigned char c; - double d; -} cls_struct_18byte; - -cls_struct_18byte cls_struct_18byte_fn(struct cls_struct_18byte a1, - struct cls_struct_18byte a2) -{ - struct cls_struct_18byte result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - result.d = a1.d + a2.d; - - - printf("%g %d %d %g %g %d %d %g: %g %d %d %g\n", a1.a, a1.b, a1.c, a1.d, - a2.a, a2.b, a2.c, a2.d, - result.a, result.b, result.c, result.d); - return result; -} - -static void -cls_struct_18byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - struct cls_struct_18byte a1, a2; - - a1 = *(struct cls_struct_18byte*)(args[0]); - a2 = *(struct cls_struct_18byte*)(args[1]); - - *(cls_struct_18byte*)resp = cls_struct_18byte_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[3]; - ffi_type* cls_struct_fields[5]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[3]; - - struct cls_struct_18byte g_dbl = { 1.0, 127, 126, 3.0 }; - struct cls_struct_18byte f_dbl = { 4.0, 125, 124, 5.0 }; - struct cls_struct_18byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_double; - cls_struct_fields[1] = &ffi_type_uchar; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = &ffi_type_double; - cls_struct_fields[4] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_18byte_fn), &res_dbl, args_dbl); - /* { dg-output "1 127 126 3 4 125 124 5: 5 252 250 8" } */ - printf("res: %g %d %d %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); - /* { dg-output "\nres: 5 252 250 8" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_18byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_18byte(*)(cls_struct_18byte, cls_struct_18byte))(code))(g_dbl, f_dbl); - /* { dg-output "\n1 127 126 3 4 125 124 5: 5 252 250 8" } */ - printf("res: %g %d %d %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); - /* { dg-output "\nres: 5 252 250 8" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_19byte.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_19byte.c deleted file mode 100644 index 278794b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_19byte.c +++ /dev/null @@ -1,102 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Depending on the ABI. Double alignment check on darwin. - Limitations: none. - PR: none. - Originator: 20030915 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_19byte { - double a; - unsigned char b; - unsigned char c; - double d; - unsigned char e; -} cls_struct_19byte; - -cls_struct_19byte cls_struct_19byte_fn(struct cls_struct_19byte a1, - struct cls_struct_19byte a2) -{ - struct cls_struct_19byte result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - result.d = a1.d + a2.d; - result.e = a1.e + a2.e; - - - printf("%g %d %d %g %d %g %d %d %g %d: %g %d %d %g %d\n", - a1.a, a1.b, a1.c, a1.d, a1.e, - a2.a, a2.b, a2.c, a2.d, a2.e, - result.a, result.b, result.c, result.d, result.e); - return result; -} - -static void -cls_struct_19byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - struct cls_struct_19byte a1, a2; - - a1 = *(struct cls_struct_19byte*)(args[0]); - a2 = *(struct cls_struct_19byte*)(args[1]); - - *(cls_struct_19byte*)resp = cls_struct_19byte_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[3]; - ffi_type* cls_struct_fields[6]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[3]; - - struct cls_struct_19byte g_dbl = { 1.0, 127, 126, 3.0, 120 }; - struct cls_struct_19byte f_dbl = { 4.0, 125, 124, 5.0, 119 }; - struct cls_struct_19byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_double; - cls_struct_fields[1] = &ffi_type_uchar; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = &ffi_type_double; - cls_struct_fields[4] = &ffi_type_uchar; - cls_struct_fields[5] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_19byte_fn), &res_dbl, args_dbl); - /* { dg-output "1 127 126 3 120 4 125 124 5 119: 5 252 250 8 239" } */ - printf("res: %g %d %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c, - res_dbl.d, res_dbl.e); - /* { dg-output "\nres: 5 252 250 8 239" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_19byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_19byte(*)(cls_struct_19byte, cls_struct_19byte))(code))(g_dbl, f_dbl); - /* { dg-output "\n1 127 126 3 120 4 125 124 5 119: 5 252 250 8 239" } */ - printf("res: %g %d %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c, - res_dbl.d, res_dbl.e); - /* { dg-output "\nres: 5 252 250 8 239" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_1_1byte.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_1_1byte.c deleted file mode 100644 index 82492c0..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_1_1byte.c +++ /dev/null @@ -1,89 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Especially with small structures which may fit in one - register. Depending on the ABI. - Limitations: none. - PR: none. - Originator: 20030902 */ - - - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_1_1byte { - unsigned char a; -} cls_struct_1_1byte; - -cls_struct_1_1byte cls_struct_1_1byte_fn(struct cls_struct_1_1byte a1, - struct cls_struct_1_1byte a2) -{ - struct cls_struct_1_1byte result; - - result.a = a1.a + a2.a; - - printf("%d %d: %d\n", a1.a, a2.a, result.a); - - return result; -} - -static void -cls_struct_1_1byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_1_1byte a1, a2; - - a1 = *(struct cls_struct_1_1byte*)(args[0]); - a2 = *(struct cls_struct_1_1byte*)(args[1]); - - *(cls_struct_1_1byte*)resp = cls_struct_1_1byte_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[2]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_1_1byte g_dbl = { 12 }; - struct cls_struct_1_1byte f_dbl = { 178 }; - struct cls_struct_1_1byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_uchar; - cls_struct_fields[1] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_1_1byte_fn), &res_dbl, args_dbl); - /* { dg-output "12 178: 190" } */ - printf("res: %d\n", res_dbl.a); - /* { dg-output "\nres: 190" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_1_1byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_1_1byte(*)(cls_struct_1_1byte, cls_struct_1_1byte))(code))(g_dbl, f_dbl); - /* { dg-output "\n12 178: 190" } */ - printf("res: %d\n", res_dbl.a); - /* { dg-output "\nres: 190" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_20byte.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_20byte.c deleted file mode 100644 index 3f8bb28..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_20byte.c +++ /dev/null @@ -1,91 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Depending on the ABI. Check overlapping. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_20byte { - double a; - double b; - int c; -} cls_struct_20byte; - -cls_struct_20byte cls_struct_20byte_fn(struct cls_struct_20byte a1, - struct cls_struct_20byte a2) -{ - struct cls_struct_20byte result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - - printf("%g %g %d %g %g %d: %g %g %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, - result.a, result.b, result.c); - return result; -} - -static void -cls_struct_20byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - struct cls_struct_20byte a1, a2; - - a1 = *(struct cls_struct_20byte*)(args[0]); - a2 = *(struct cls_struct_20byte*)(args[1]); - - *(cls_struct_20byte*)resp = cls_struct_20byte_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_20byte g_dbl = { 1.0, 2.0, 3 }; - struct cls_struct_20byte f_dbl = { 4.0, 5.0, 7 }; - struct cls_struct_20byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_double; - cls_struct_fields[1] = &ffi_type_double; - cls_struct_fields[2] = &ffi_type_sint; - cls_struct_fields[3] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_20byte_fn), &res_dbl, args_dbl); - /* { dg-output "1 2 3 4 5 7: 5 7 10" } */ - printf("res: %g %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 5 7 10" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_20byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_20byte(*)(cls_struct_20byte, cls_struct_20byte))(code))(g_dbl, f_dbl); - /* { dg-output "\n1 2 3 4 5 7: 5 7 10" } */ - printf("res: %g %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 5 7 10" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_20byte1.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_20byte1.c deleted file mode 100644 index 6562727..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_20byte1.c +++ /dev/null @@ -1,93 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Depending on the ABI. Check overlapping. - Limitations: none. - PR: none. - Originator: 20030828 */ - - - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_20byte { - int a; - double b; - double c; -} cls_struct_20byte; - -cls_struct_20byte cls_struct_20byte_fn(struct cls_struct_20byte a1, - struct cls_struct_20byte a2) -{ - struct cls_struct_20byte result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - - printf("%d %g %g %d %g %g: %d %g %g\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, - result.a, result.b, result.c); - return result; -} - -static void -cls_struct_20byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - struct cls_struct_20byte a1, a2; - - a1 = *(struct cls_struct_20byte*)(args[0]); - a2 = *(struct cls_struct_20byte*)(args[1]); - - *(cls_struct_20byte*)resp = cls_struct_20byte_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[3]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[3]; - - struct cls_struct_20byte g_dbl = { 1, 2.0, 3.0 }; - struct cls_struct_20byte f_dbl = { 4, 5.0, 7.0 }; - struct cls_struct_20byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_sint; - cls_struct_fields[1] = &ffi_type_double; - cls_struct_fields[2] = &ffi_type_double; - cls_struct_fields[3] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_20byte_fn), &res_dbl, args_dbl); - /* { dg-output "1 2 3 4 5 7: 5 7 10" } */ - printf("res: %d %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 5 7 10" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_20byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_20byte(*)(cls_struct_20byte, cls_struct_20byte))(code))(g_dbl, f_dbl); - /* { dg-output "\n1 2 3 4 5 7: 5 7 10" } */ - printf("res: %d %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 5 7 10" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_24byte.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_24byte.c deleted file mode 100644 index 1d82f6e..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_24byte.c +++ /dev/null @@ -1,113 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Depending on the ABI. Check overlapping. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_24byte { - double a; - double b; - int c; - float d; -} cls_struct_24byte; - -cls_struct_24byte cls_struct_24byte_fn(struct cls_struct_24byte b0, - struct cls_struct_24byte b1, - struct cls_struct_24byte b2, - struct cls_struct_24byte b3) -{ - struct cls_struct_24byte result; - - result.a = b0.a + b1.a + b2.a + b3.a; - result.b = b0.b + b1.b + b2.b + b3.b; - result.c = b0.c + b1.c + b2.c + b3.c; - result.d = b0.d + b1.d + b2.d + b3.d; - - printf("%g %g %d %g %g %g %d %g %g %g %d %g %g %g %d %g: %g %g %d %g\n", - b0.a, b0.b, b0.c, b0.d, - b1.a, b1.b, b1.c, b1.d, - b2.a, b2.b, b2.c, b2.d, - b3.a, b3.b, b3.c, b2.d, - result.a, result.b, result.c, result.d); - - return result; -} - -static void -cls_struct_24byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - struct cls_struct_24byte b0, b1, b2, b3; - - b0 = *(struct cls_struct_24byte*)(args[0]); - b1 = *(struct cls_struct_24byte*)(args[1]); - b2 = *(struct cls_struct_24byte*)(args[2]); - b3 = *(struct cls_struct_24byte*)(args[3]); - - *(cls_struct_24byte*)resp = cls_struct_24byte_fn(b0, b1, b2, b3); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[5]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_24byte e_dbl = { 9.0, 2.0, 6, 5.0 }; - struct cls_struct_24byte f_dbl = { 1.0, 2.0, 3, 7.0 }; - struct cls_struct_24byte g_dbl = { 4.0, 5.0, 7, 9.0 }; - struct cls_struct_24byte h_dbl = { 8.0, 6.0, 1, 4.0 }; - struct cls_struct_24byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_double; - cls_struct_fields[1] = &ffi_type_double; - cls_struct_fields[2] = &ffi_type_sint; - cls_struct_fields[3] = &ffi_type_float; - cls_struct_fields[4] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = &cls_struct_type; - dbl_arg_types[3] = &cls_struct_type; - dbl_arg_types[4] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &e_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = &g_dbl; - args_dbl[3] = &h_dbl; - args_dbl[4] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_24byte_fn), &res_dbl, args_dbl); - /* { dg-output "9 2 6 5 1 2 3 7 4 5 7 9 8 6 1 9: 22 15 17 25" } */ - printf("res: %g %g %d %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); - /* { dg-output "\nres: 22 15 17 25" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_24byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_24byte(*)(cls_struct_24byte, - cls_struct_24byte, - cls_struct_24byte, - cls_struct_24byte)) - (code))(e_dbl, f_dbl, g_dbl, h_dbl); - /* { dg-output "\n9 2 6 5 1 2 3 7 4 5 7 9 8 6 1 9: 22 15 17 25" } */ - printf("res: %g %g %d %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); - /* { dg-output "\nres: 22 15 17 25" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_2byte.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_2byte.c deleted file mode 100644 index 81bb0a6..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_2byte.c +++ /dev/null @@ -1,90 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Especially with small structures which may fit in one - register. Depending on the ABI. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_2byte { - unsigned char a; - unsigned char b; -} cls_struct_2byte; - -cls_struct_2byte cls_struct_2byte_fn(struct cls_struct_2byte a1, - struct cls_struct_2byte a2) -{ - struct cls_struct_2byte result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - - printf("%d %d %d %d: %d %d\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b); - - return result; -} - -static void -cls_struct_2byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_2byte a1, a2; - - a1 = *(struct cls_struct_2byte*)(args[0]); - a2 = *(struct cls_struct_2byte*)(args[1]); - - *(cls_struct_2byte*)resp = cls_struct_2byte_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_2byte g_dbl = { 12, 127 }; - struct cls_struct_2byte f_dbl = { 1, 13 }; - struct cls_struct_2byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_uchar; - cls_struct_fields[1] = &ffi_type_uchar; - cls_struct_fields[2] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_2byte_fn), &res_dbl, args_dbl); - /* { dg-output "12 127 1 13: 13 140" } */ - printf("res: %d %d\n", res_dbl.a, res_dbl.b); - /* { dg-output "\nres: 13 140" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_2byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_2byte(*)(cls_struct_2byte, cls_struct_2byte))(code))(g_dbl, f_dbl); - /* { dg-output "\n12 127 1 13: 13 140" } */ - printf("res: %d %d\n", res_dbl.a, res_dbl.b); - /* { dg-output "\nres: 13 140" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3_1byte.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3_1byte.c deleted file mode 100644 index b782746..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3_1byte.c +++ /dev/null @@ -1,95 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Especially with small structures which may fit in one - register. Depending on the ABI. - Limitations: none. - PR: none. - Originator: 20030902 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_3_1byte { - unsigned char a; - unsigned char b; - unsigned char c; -} cls_struct_3_1byte; - -cls_struct_3_1byte cls_struct_3_1byte_fn(struct cls_struct_3_1byte a1, - struct cls_struct_3_1byte a2) -{ - struct cls_struct_3_1byte result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - - printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, - a2.a, a2.b, a2.c, - result.a, result.b, result.c); - - return result; -} - -static void -cls_struct_3_1byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_3_1byte a1, a2; - - a1 = *(struct cls_struct_3_1byte*)(args[0]); - a2 = *(struct cls_struct_3_1byte*)(args[1]); - - *(cls_struct_3_1byte*)resp = cls_struct_3_1byte_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_3_1byte g_dbl = { 12, 13, 14 }; - struct cls_struct_3_1byte f_dbl = { 178, 179, 180 }; - struct cls_struct_3_1byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_uchar; - cls_struct_fields[1] = &ffi_type_uchar; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_3_1byte_fn), &res_dbl, args_dbl); - /* { dg-output "12 13 14 178 179 180: 190 192 194" } */ - printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 190 192 194" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_3_1byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_3_1byte(*)(cls_struct_3_1byte, cls_struct_3_1byte))(code))(g_dbl, f_dbl); - /* { dg-output "\n12 13 14 178 179 180: 190 192 194" } */ - printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 190 192 194" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3byte1.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3byte1.c deleted file mode 100644 index a02c463..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3byte1.c +++ /dev/null @@ -1,90 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Especially with small structures which may fit in one - register. Depending on the ABI. Check overlapping. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_3byte { - unsigned short a; - unsigned char b; -} cls_struct_3byte; - -cls_struct_3byte cls_struct_3byte_fn(struct cls_struct_3byte a1, - struct cls_struct_3byte a2) -{ - struct cls_struct_3byte result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - - printf("%d %d %d %d: %d %d\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b); - - return result; -} - -static void -cls_struct_3byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_3byte a1, a2; - - a1 = *(struct cls_struct_3byte*)(args[0]); - a2 = *(struct cls_struct_3byte*)(args[1]); - - *(cls_struct_3byte*)resp = cls_struct_3byte_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_3byte g_dbl = { 12, 119 }; - struct cls_struct_3byte f_dbl = { 1, 15 }; - struct cls_struct_3byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_ushort; - cls_struct_fields[1] = &ffi_type_uchar; - cls_struct_fields[2] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_3byte_fn), &res_dbl, args_dbl); - /* { dg-output "12 119 1 15: 13 134" } */ - printf("res: %d %d\n", res_dbl.a, res_dbl.b); - /* { dg-output "\nres: 13 134" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_3byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_3byte(*)(cls_struct_3byte, cls_struct_3byte))(code))(g_dbl, f_dbl); - /* { dg-output "\n12 119 1 15: 13 134" } */ - printf("res: %d %d\n", res_dbl.a, res_dbl.b); - /* { dg-output "\nres: 13 134" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3byte2.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3byte2.c deleted file mode 100644 index c7251ce..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3byte2.c +++ /dev/null @@ -1,90 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Especially with small structures which may fit in one - register. Depending on the ABI. Check overlapping. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_3byte_1 { - unsigned char a; - unsigned short b; -} cls_struct_3byte_1; - -cls_struct_3byte_1 cls_struct_3byte_fn1(struct cls_struct_3byte_1 a1, - struct cls_struct_3byte_1 a2) -{ - struct cls_struct_3byte_1 result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - - printf("%d %d %d %d: %d %d\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b); - - return result; -} - -static void -cls_struct_3byte_gn1(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_3byte_1 a1, a2; - - a1 = *(struct cls_struct_3byte_1*)(args[0]); - a2 = *(struct cls_struct_3byte_1*)(args[1]); - - *(cls_struct_3byte_1*)resp = cls_struct_3byte_fn1(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_3byte_1 g_dbl = { 15, 125 }; - struct cls_struct_3byte_1 f_dbl = { 9, 19 }; - struct cls_struct_3byte_1 res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_uchar; - cls_struct_fields[1] = &ffi_type_ushort; - cls_struct_fields[2] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_3byte_fn1), &res_dbl, args_dbl); - /* { dg-output "15 125 9 19: 24 144" } */ - printf("res: %d %d\n", res_dbl.a, res_dbl.b); - /* { dg-output "\nres: 24 144" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_3byte_gn1, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_3byte_1(*)(cls_struct_3byte_1, cls_struct_3byte_1))(code))(g_dbl, f_dbl); - /* { dg-output "\n15 125 9 19: 24 144" } */ - printf("res: %d %d\n", res_dbl.a, res_dbl.b); - /* { dg-output "\nres: 24 144" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3float.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3float.c deleted file mode 100644 index 48888f8..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3float.c +++ /dev/null @@ -1,95 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Depending on the ABI. Check overlapping. - Limitations:>none. - PR: none. - Originator: 20171026 */ - -/* { dg-do run } */ - -#include "ffitest.h" - -typedef struct cls_struct_3float { - float f; - float g; - float h; -} cls_struct_3float; - -cls_struct_3float cls_struct_3float_fn(struct cls_struct_3float a1, - struct cls_struct_3float a2) -{ - struct cls_struct_3float result; - - result.f = a1.f + a2.f; - result.g = a1.g + a2.g; - result.h = a1.h + a2.h; - - printf("%g %g %g %g %g %g: %g %g %g\n", a1.f, a1.g, a1.h, - a2.f, a2.g, a2.h, result.f, result.g, result.h); - - return result; -} - -static void -cls_struct_3float_gn(ffi_cif *cif __UNUSED__, void* resp, void **args, - void* userdata __UNUSED__) -{ - struct cls_struct_3float a1, a2; - - a1 = *(struct cls_struct_3float*)(args[0]); - a2 = *(struct cls_struct_3float*)(args[1]); - - *(cls_struct_3float*)resp = cls_struct_3float_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void *args_dbl[3]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[3]; - - struct cls_struct_3float g_dbl = { 1.0f, 2.0f, 3.0f }; - struct cls_struct_3float f_dbl = { 1.0f, 2.0f, 3.0f }; - struct cls_struct_3float res_dbl; - - cls_struct_fields[0] = &ffi_type_float; - cls_struct_fields[1] = &ffi_type_float; - cls_struct_fields[2] = &ffi_type_float; - cls_struct_fields[3] = NULL; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_3float_fn), &res_dbl, args_dbl); - /* { dg-output "1 2 3 1 2 3: 2 4 6" } */ - printf("res: %g %g %g\n", res_dbl.f, res_dbl.g, res_dbl.h); - /* { dg-output "\nres: 2 4 6" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_3float_gn, NULL, code) == - FFI_OK); - - res_dbl = ((cls_struct_3float(*)(cls_struct_3float, - cls_struct_3float))(code))(g_dbl, f_dbl); - /* { dg-output "\n1 2 3 1 2 3: 2 4 6" } */ - printf("res: %g %g %g\n", res_dbl.f, res_dbl.g, res_dbl.h); - /* { dg-output "\nres: 2 4 6" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_4_1byte.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_4_1byte.c deleted file mode 100644 index 2d6d8b6..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_4_1byte.c +++ /dev/null @@ -1,98 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Especially with small structures which may fit in one - register. Depending on the ABI. - Limitations: none. - PR: none. - Originator: 20030902 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_4_1byte { - unsigned char a; - unsigned char b; - unsigned char c; - unsigned char d; -} cls_struct_4_1byte; - -cls_struct_4_1byte cls_struct_4_1byte_fn(struct cls_struct_4_1byte a1, - struct cls_struct_4_1byte a2) -{ - struct cls_struct_4_1byte result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - result.d = a1.d + a2.d; - - printf("%d %d %d %d %d %d %d %d: %d %d %d %d\n", a1.a, a1.b, a1.c, a1.d, - a2.a, a2.b, a2.c, a2.d, - result.a, result.b, result.c, result.d); - - return result; -} - -static void -cls_struct_4_1byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_4_1byte a1, a2; - - a1 = *(struct cls_struct_4_1byte*)(args[0]); - a2 = *(struct cls_struct_4_1byte*)(args[1]); - - *(cls_struct_4_1byte*)resp = cls_struct_4_1byte_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[5]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_4_1byte g_dbl = { 12, 13, 14, 15 }; - struct cls_struct_4_1byte f_dbl = { 178, 179, 180, 181 }; - struct cls_struct_4_1byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_uchar; - cls_struct_fields[1] = &ffi_type_uchar; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = &ffi_type_uchar; - cls_struct_fields[4] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_4_1byte_fn), &res_dbl, args_dbl); - /* { dg-output "12 13 14 15 178 179 180 181: 190 192 194 196" } */ - printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); - /* { dg-output "\nres: 190 192 194 196" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_4_1byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_4_1byte(*)(cls_struct_4_1byte, cls_struct_4_1byte))(code))(g_dbl, f_dbl); - /* { dg-output "\n12 13 14 15 178 179 180 181: 190 192 194 196" } */ - printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); - /* { dg-output "\nres: 190 192 194 196" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_4byte.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_4byte.c deleted file mode 100644 index 4ac3787..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_4byte.c +++ /dev/null @@ -1,90 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Depending on the ABI. Check overlapping. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ - -#include "ffitest.h" - -typedef struct cls_struct_4byte { - unsigned short a; - unsigned short b; -} cls_struct_4byte; - -cls_struct_4byte cls_struct_4byte_fn(struct cls_struct_4byte a1, - struct cls_struct_4byte a2) -{ - struct cls_struct_4byte result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - - printf("%d %d %d %d: %d %d\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b); - - return result; -} - -static void -cls_struct_4byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_4byte a1, a2; - - a1 = *(struct cls_struct_4byte*)(args[0]); - a2 = *(struct cls_struct_4byte*)(args[1]); - - *(cls_struct_4byte*)resp = cls_struct_4byte_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_4byte g_dbl = { 127, 120 }; - struct cls_struct_4byte f_dbl = { 12, 128 }; - struct cls_struct_4byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_ushort; - cls_struct_fields[1] = &ffi_type_ushort; - cls_struct_fields[2] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_4byte_fn), &res_dbl, args_dbl); - /* { dg-output "127 120 12 128: 139 248" } */ - printf("res: %d %d\n", res_dbl.a, res_dbl.b); - /* { dg-output "\nres: 139 248" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_4byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_4byte(*)(cls_struct_4byte, cls_struct_4byte))(code))(g_dbl, f_dbl); - /* { dg-output "\n127 120 12 128: 139 248" } */ - printf("res: %d %d\n", res_dbl.a, res_dbl.b); - /* { dg-output "\nres: 139 248" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_5_1_byte.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_5_1_byte.c deleted file mode 100644 index ad9d51c..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_5_1_byte.c +++ /dev/null @@ -1,109 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Depending on the ABI. Check overlapping. - Limitations: none. - PR: none. - Originator: 20050708 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_5byte { - unsigned char a; - unsigned char b; - unsigned char c; - unsigned char d; - unsigned char e; -} cls_struct_5byte; - -cls_struct_5byte cls_struct_5byte_fn(struct cls_struct_5byte a1, - struct cls_struct_5byte a2) -{ - struct cls_struct_5byte result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - result.d = a1.d + a2.d; - result.e = a1.e + a2.e; - - printf("%d %d %d %d %d %d %d %d %d %d: %d %d %d %d %d\n", - a1.a, a1.b, a1.c, a1.d, a1.e, - a2.a, a2.b, a2.c, a2.d, a2.e, - result.a, result.b, result.c, result.d, result.e); - - return result; -} - -static void -cls_struct_5byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_5byte a1, a2; - - a1 = *(struct cls_struct_5byte*)(args[0]); - a2 = *(struct cls_struct_5byte*)(args[1]); - - *(cls_struct_5byte*)resp = cls_struct_5byte_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[6]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_5byte g_dbl = { 127, 120, 1, 3, 4 }; - struct cls_struct_5byte f_dbl = { 12, 128, 9, 3, 4 }; - struct cls_struct_5byte res_dbl = { 0, 0, 0, 0, 0 }; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_uchar; - cls_struct_fields[1] = &ffi_type_uchar; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = &ffi_type_uchar; - cls_struct_fields[4] = &ffi_type_uchar; - cls_struct_fields[5] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_5byte_fn), &res_dbl, args_dbl); - /* { dg-output "127 120 1 3 4 12 128 9 3 4: 139 248 10 6 8" } */ - printf("res: %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, - res_dbl.d, res_dbl.e); - /* { dg-output "\nres: 139 248 10 6 8" } */ - - res_dbl.a = 0; - res_dbl.b = 0; - res_dbl.c = 0; - res_dbl.d = 0; - res_dbl.e = 0; - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_5byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_5byte(*)(cls_struct_5byte, cls_struct_5byte))(code))(g_dbl, f_dbl); - /* { dg-output "\n127 120 1 3 4 12 128 9 3 4: 139 248 10 6 8" } */ - printf("res: %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, - res_dbl.d, res_dbl.e); - /* { dg-output "\nres: 139 248 10 6 8" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_5byte.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_5byte.c deleted file mode 100644 index 4e0c000..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_5byte.c +++ /dev/null @@ -1,98 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Depending on the ABI. Check overlapping. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_5byte { - unsigned short a; - unsigned short b; - unsigned char c; -} cls_struct_5byte; - -cls_struct_5byte cls_struct_5byte_fn(struct cls_struct_5byte a1, - struct cls_struct_5byte a2) -{ - struct cls_struct_5byte result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - - printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, - a2.a, a2.b, a2.c, - result.a, result.b, result.c); - - return result; -} - -static void -cls_struct_5byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_5byte a1, a2; - - a1 = *(struct cls_struct_5byte*)(args[0]); - a2 = *(struct cls_struct_5byte*)(args[1]); - - *(cls_struct_5byte*)resp = cls_struct_5byte_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_5byte g_dbl = { 127, 120, 1 }; - struct cls_struct_5byte f_dbl = { 12, 128, 9 }; - struct cls_struct_5byte res_dbl = { 0, 0, 0 }; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_ushort; - cls_struct_fields[1] = &ffi_type_ushort; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_5byte_fn), &res_dbl, args_dbl); - /* { dg-output "127 120 1 12 128 9: 139 248 10" } */ - printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 139 248 10" } */ - - res_dbl.a = 0; - res_dbl.b = 0; - res_dbl.c = 0; - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_5byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_5byte(*)(cls_struct_5byte, cls_struct_5byte))(code))(g_dbl, f_dbl); - /* { dg-output "\n127 120 1 12 128 9: 139 248 10" } */ - printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 139 248 10" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_64byte.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_64byte.c deleted file mode 100644 index a55edc2..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_64byte.c +++ /dev/null @@ -1,124 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Depending on the ABI. Check bigger struct which overlaps - the gp and fp register count on Darwin/AIX/ppc64. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_64byte { - double a; - double b; - double c; - double d; - double e; - double f; - double g; - double h; -} cls_struct_64byte; - -cls_struct_64byte cls_struct_64byte_fn(struct cls_struct_64byte b0, - struct cls_struct_64byte b1, - struct cls_struct_64byte b2, - struct cls_struct_64byte b3) -{ - struct cls_struct_64byte result; - - result.a = b0.a + b1.a + b2.a + b3.a; - result.b = b0.b + b1.b + b2.b + b3.b; - result.c = b0.c + b1.c + b2.c + b3.c; - result.d = b0.d + b1.d + b2.d + b3.d; - result.e = b0.e + b1.e + b2.e + b3.e; - result.f = b0.f + b1.f + b2.f + b3.f; - result.g = b0.g + b1.g + b2.g + b3.g; - result.h = b0.h + b1.h + b2.h + b3.h; - - printf("%g %g %g %g %g %g %g %g\n", result.a, result.b, result.c, - result.d, result.e, result.f, result.g, result.h); - - return result; -} - -static void -cls_struct_64byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - struct cls_struct_64byte b0, b1, b2, b3; - - b0 = *(struct cls_struct_64byte*)(args[0]); - b1 = *(struct cls_struct_64byte*)(args[1]); - b2 = *(struct cls_struct_64byte*)(args[2]); - b3 = *(struct cls_struct_64byte*)(args[3]); - - *(cls_struct_64byte*)resp = cls_struct_64byte_fn(b0, b1, b2, b3); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[9]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_64byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0 }; - struct cls_struct_64byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0 }; - struct cls_struct_64byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0 }; - struct cls_struct_64byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0 }; - struct cls_struct_64byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_double; - cls_struct_fields[1] = &ffi_type_double; - cls_struct_fields[2] = &ffi_type_double; - cls_struct_fields[3] = &ffi_type_double; - cls_struct_fields[4] = &ffi_type_double; - cls_struct_fields[5] = &ffi_type_double; - cls_struct_fields[6] = &ffi_type_double; - cls_struct_fields[7] = &ffi_type_double; - cls_struct_fields[8] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = &cls_struct_type; - dbl_arg_types[3] = &cls_struct_type; - dbl_arg_types[4] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &e_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = &g_dbl; - args_dbl[3] = &h_dbl; - args_dbl[4] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_64byte_fn), &res_dbl, args_dbl); - /* { dg-output "22 15 17 25 6 13 19 18" } */ - printf("res: %g %g %g %g %g %g %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c, - res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h); - /* { dg-output "\nres: 22 15 17 25 6 13 19 18" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_64byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_64byte(*)(cls_struct_64byte, - cls_struct_64byte, - cls_struct_64byte, - cls_struct_64byte)) - (code))(e_dbl, f_dbl, g_dbl, h_dbl); - /* { dg-output "\n22 15 17 25 6 13 19 18" } */ - printf("res: %g %g %g %g %g %g %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c, - res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h); - /* { dg-output "\nres: 22 15 17 25 6 13 19 18" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_6_1_byte.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_6_1_byte.c deleted file mode 100644 index b4dcdba..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_6_1_byte.c +++ /dev/null @@ -1,113 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Depending on the ABI. Check overlapping. - Limitations: none. - PR: none. - Originator: 20050708 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_6byte { - unsigned char a; - unsigned char b; - unsigned char c; - unsigned char d; - unsigned char e; - unsigned char f; -} cls_struct_6byte; - -cls_struct_6byte cls_struct_6byte_fn(struct cls_struct_6byte a1, - struct cls_struct_6byte a2) -{ - struct cls_struct_6byte result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - result.d = a1.d + a2.d; - result.e = a1.e + a2.e; - result.f = a1.f + a2.f; - - printf("%d %d %d %d %d %d %d %d %d %d %d %d: %d %d %d %d %d %d\n", - a1.a, a1.b, a1.c, a1.d, a1.e, a1.f, - a2.a, a2.b, a2.c, a2.d, a2.e, a2.f, - result.a, result.b, result.c, result.d, result.e, result.f); - - return result; -} - -static void -cls_struct_6byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_6byte a1, a2; - - a1 = *(struct cls_struct_6byte*)(args[0]); - a2 = *(struct cls_struct_6byte*)(args[1]); - - *(cls_struct_6byte*)resp = cls_struct_6byte_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[7]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_6byte g_dbl = { 127, 120, 1, 3, 4, 5 }; - struct cls_struct_6byte f_dbl = { 12, 128, 9, 3, 4, 5 }; - struct cls_struct_6byte res_dbl = { 0, 0, 0, 0, 0, 0 }; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_uchar; - cls_struct_fields[1] = &ffi_type_uchar; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = &ffi_type_uchar; - cls_struct_fields[4] = &ffi_type_uchar; - cls_struct_fields[5] = &ffi_type_uchar; - cls_struct_fields[6] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_6byte_fn), &res_dbl, args_dbl); - /* { dg-output "127 120 1 3 4 5 12 128 9 3 4 5: 139 248 10 6 8 10" } */ - printf("res: %d %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, - res_dbl.d, res_dbl.e, res_dbl.f); - /* { dg-output "\nres: 139 248 10 6 8 10" } */ - - res_dbl.a = 0; - res_dbl.b = 0; - res_dbl.c = 0; - res_dbl.d = 0; - res_dbl.e = 0; - res_dbl.f = 0; - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_6byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_6byte(*)(cls_struct_6byte, cls_struct_6byte))(code))(g_dbl, f_dbl); - /* { dg-output "\n127 120 1 3 4 5 12 128 9 3 4 5: 139 248 10 6 8 10" } */ - printf("res: %d %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, - res_dbl.d, res_dbl.e, res_dbl.f); - /* { dg-output "\nres: 139 248 10 6 8 10" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_6byte.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_6byte.c deleted file mode 100644 index 7406780..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_6byte.c +++ /dev/null @@ -1,99 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Depending on the ABI. Check overlapping. - Limitations: none. - PR: none. - Originator: 20030828 */ - - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_6byte { - unsigned short a; - unsigned short b; - unsigned char c; - unsigned char d; -} cls_struct_6byte; - -cls_struct_6byte cls_struct_6byte_fn(struct cls_struct_6byte a1, - struct cls_struct_6byte a2) -{ - struct cls_struct_6byte result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - result.d = a1.d + a2.d; - - printf("%d %d %d %d %d %d %d %d: %d %d %d %d\n", a1.a, a1.b, a1.c, a1.d, - a2.a, a2.b, a2.c, a2.d, - result.a, result.b, result.c, result.d); - - return result; -} - -static void -cls_struct_6byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_6byte a1, a2; - - a1 = *(struct cls_struct_6byte*)(args[0]); - a2 = *(struct cls_struct_6byte*)(args[1]); - - *(cls_struct_6byte*)resp = cls_struct_6byte_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[5]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_6byte g_dbl = { 127, 120, 1, 128 }; - struct cls_struct_6byte f_dbl = { 12, 128, 9, 127 }; - struct cls_struct_6byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_ushort; - cls_struct_fields[1] = &ffi_type_ushort; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = &ffi_type_uchar; - cls_struct_fields[4] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_6byte_fn), &res_dbl, args_dbl); - /* { dg-output "127 120 1 128 12 128 9 127: 139 248 10 255" } */ - printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); - /* { dg-output "\nres: 139 248 10 255" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_6byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_6byte(*)(cls_struct_6byte, cls_struct_6byte))(code))(g_dbl, f_dbl); - /* { dg-output "\n127 120 1 128 12 128 9 127: 139 248 10 255" } */ - printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); - /* { dg-output "\nres: 139 248 10 255" } */ - - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_7_1_byte.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_7_1_byte.c deleted file mode 100644 index 14a7e96..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_7_1_byte.c +++ /dev/null @@ -1,117 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Depending on the ABI. Check overlapping. - Limitations: none. - PR: none. - Originator: 20050708 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_7byte { - unsigned char a; - unsigned char b; - unsigned char c; - unsigned char d; - unsigned char e; - unsigned char f; - unsigned char g; -} cls_struct_7byte; - -cls_struct_7byte cls_struct_7byte_fn(struct cls_struct_7byte a1, - struct cls_struct_7byte a2) -{ - struct cls_struct_7byte result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - result.d = a1.d + a2.d; - result.e = a1.e + a2.e; - result.f = a1.f + a2.f; - result.g = a1.g + a2.g; - - printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d %d %d %d %d %d %d\n", - a1.a, a1.b, a1.c, a1.d, a1.e, a1.f, a1.g, - a2.a, a2.b, a2.c, a2.d, a2.e, a2.f, a2.g, - result.a, result.b, result.c, result.d, result.e, result.f, result.g); - - return result; -} - -static void -cls_struct_7byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_7byte a1, a2; - - a1 = *(struct cls_struct_7byte*)(args[0]); - a2 = *(struct cls_struct_7byte*)(args[1]); - - *(cls_struct_7byte*)resp = cls_struct_7byte_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[8]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_7byte g_dbl = { 127, 120, 1, 3, 4, 5, 6 }; - struct cls_struct_7byte f_dbl = { 12, 128, 9, 3, 4, 5, 6 }; - struct cls_struct_7byte res_dbl = { 0, 0, 0, 0, 0, 0, 0 }; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_uchar; - cls_struct_fields[1] = &ffi_type_uchar; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = &ffi_type_uchar; - cls_struct_fields[4] = &ffi_type_uchar; - cls_struct_fields[5] = &ffi_type_uchar; - cls_struct_fields[6] = &ffi_type_uchar; - cls_struct_fields[7] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_7byte_fn), &res_dbl, args_dbl); - /* { dg-output "127 120 1 3 4 5 6 12 128 9 3 4 5 6: 139 248 10 6 8 10 12" } */ - printf("res: %d %d %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, - res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g); - /* { dg-output "\nres: 139 248 10 6 8 10 12" } */ - - res_dbl.a = 0; - res_dbl.b = 0; - res_dbl.c = 0; - res_dbl.d = 0; - res_dbl.e = 0; - res_dbl.f = 0; - res_dbl.g = 0; - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_7byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_7byte(*)(cls_struct_7byte, cls_struct_7byte))(code))(g_dbl, f_dbl); - /* { dg-output "\n127 120 1 3 4 5 6 12 128 9 3 4 5 6: 139 248 10 6 8 10 12" } */ - printf("res: %d %d %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, - res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g); - /* { dg-output "\nres: 139 248 10 6 8 10 12" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_7byte.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_7byte.c deleted file mode 100644 index 1645cc6..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_7byte.c +++ /dev/null @@ -1,97 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Depending on the ABI. Check overlapping. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_7byte { - unsigned short a; - unsigned short b; - unsigned char c; - unsigned short d; -} cls_struct_7byte; - -cls_struct_7byte cls_struct_7byte_fn(struct cls_struct_7byte a1, - struct cls_struct_7byte a2) -{ - struct cls_struct_7byte result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - result.d = a1.d + a2.d; - - printf("%d %d %d %d %d %d %d %d: %d %d %d %d\n", a1.a, a1.b, a1.c, a1.d, - a2.a, a2.b, a2.c, a2.d, - result.a, result.b, result.c, result.d); - - return result; -} - -static void -cls_struct_7byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_7byte a1, a2; - - a1 = *(struct cls_struct_7byte*)(args[0]); - a2 = *(struct cls_struct_7byte*)(args[1]); - - *(cls_struct_7byte*)resp = cls_struct_7byte_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[5]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_7byte g_dbl = { 127, 120, 1, 254 }; - struct cls_struct_7byte f_dbl = { 12, 128, 9, 255 }; - struct cls_struct_7byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_ushort; - cls_struct_fields[1] = &ffi_type_ushort; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = &ffi_type_ushort; - cls_struct_fields[4] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_7byte_fn), &res_dbl, args_dbl); - /* { dg-output "127 120 1 254 12 128 9 255: 139 248 10 509" } */ - printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); - /* { dg-output "\nres: 139 248 10 509" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_7byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_7byte(*)(cls_struct_7byte, cls_struct_7byte))(code))(g_dbl, f_dbl); - /* { dg-output "\n127 120 1 254 12 128 9 255: 139 248 10 509" } */ - printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); - /* { dg-output "\nres: 139 248 10 509" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_8byte.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_8byte.c deleted file mode 100644 index f6c1ea5..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_8byte.c +++ /dev/null @@ -1,88 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Depending on the ABI. Check overlapping. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_8byte { - int a; - float b; -} cls_struct_8byte; - -cls_struct_8byte cls_struct_8byte_fn(struct cls_struct_8byte a1, - struct cls_struct_8byte a2) -{ - struct cls_struct_8byte result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - - printf("%d %g %d %g: %d %g\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b); - - return result; -} - -static void -cls_struct_8byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_8byte a1, a2; - - a1 = *(struct cls_struct_8byte*)(args[0]); - a2 = *(struct cls_struct_8byte*)(args[1]); - - *(cls_struct_8byte*)resp = cls_struct_8byte_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_8byte g_dbl = { 1, 2.0 }; - struct cls_struct_8byte f_dbl = { 4, 5.0 }; - struct cls_struct_8byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_sint; - cls_struct_fields[1] = &ffi_type_float; - cls_struct_fields[2] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_8byte_fn), &res_dbl, args_dbl); - /* { dg-output "1 2 4 5: 5 7" } */ - printf("res: %d %g\n", res_dbl.a, res_dbl.b); - /* { dg-output "\nres: 5 7" } */ - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_8byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_8byte(*)(cls_struct_8byte, cls_struct_8byte))(code))(g_dbl, f_dbl); - /* { dg-output "\n1 2 4 5: 5 7" } */ - printf("res: %d %g\n", res_dbl.a, res_dbl.b); - /* { dg-output "\nres: 5 7" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_9byte1.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_9byte1.c deleted file mode 100644 index 0b85722..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_9byte1.c +++ /dev/null @@ -1,90 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Depending on the ABI. Darwin/AIX do double-word - alignment of the struct if the first element is a double. - Check that it does not here. - Limitations: none. - PR: none. - Originator: 20030914 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_9byte { - int a; - double b; -} cls_struct_9byte; - -cls_struct_9byte cls_struct_9byte_fn(struct cls_struct_9byte b1, - struct cls_struct_9byte b2) -{ - struct cls_struct_9byte result; - - result.a = b1.a + b2.a; - result.b = b1.b + b2.b; - - printf("%d %g %d %g: %d %g\n", b1.a, b1.b, b2.a, b2.b, - result.a, result.b); - - return result; -} - -static void cls_struct_9byte_gn(ffi_cif* cif __UNUSED__, void* resp, - void** args, void* userdata __UNUSED__) -{ - struct cls_struct_9byte b1, b2; - - b1 = *(struct cls_struct_9byte*)(args[0]); - b2 = *(struct cls_struct_9byte*)(args[1]); - - *(cls_struct_9byte*)resp = cls_struct_9byte_fn(b1, b2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[3]; - ffi_type* cls_struct_fields[3]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[3]; - - struct cls_struct_9byte h_dbl = { 7, 8.0}; - struct cls_struct_9byte j_dbl = { 1, 9.0}; - struct cls_struct_9byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_sint; - cls_struct_fields[1] = &ffi_type_double; - cls_struct_fields[2] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &h_dbl; - args_dbl[1] = &j_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_9byte_fn), &res_dbl, args_dbl); - /* { dg-output "7 8 1 9: 8 17" } */ - printf("res: %d %g\n", res_dbl.a, res_dbl.b); - /* { dg-output "\nres: 8 17" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_9byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_9byte(*)(cls_struct_9byte, cls_struct_9byte))(code))(h_dbl, j_dbl); - /* { dg-output "\n7 8 1 9: 8 17" } */ - printf("res: %d %g\n", res_dbl.a, res_dbl.b); - /* { dg-output "\nres: 8 17" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_9byte2.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_9byte2.c deleted file mode 100644 index edf991d..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_9byte2.c +++ /dev/null @@ -1,91 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Depending on the ABI. Darwin/AIX do double-word - alignment of the struct if the first element is a double. - Check that it does here. - Limitations: none. - PR: none. - Originator: 20030914 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_9byte { - double a; - int b; -} cls_struct_9byte; - -cls_struct_9byte cls_struct_9byte_fn(struct cls_struct_9byte b1, - struct cls_struct_9byte b2) -{ - struct cls_struct_9byte result; - - result.a = b1.a + b2.a; - result.b = b1.b + b2.b; - - printf("%g %d %g %d: %g %d\n", b1.a, b1.b, b2.a, b2.b, - result.a, result.b); - - return result; -} - -static void cls_struct_9byte_gn(ffi_cif* cif __UNUSED__, void* resp, - void** args, void* userdata __UNUSED__) -{ - struct cls_struct_9byte b1, b2; - - b1 = *(struct cls_struct_9byte*)(args[0]); - b2 = *(struct cls_struct_9byte*)(args[1]); - - *(cls_struct_9byte*)resp = cls_struct_9byte_fn(b1, b2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[3]; - ffi_type* cls_struct_fields[3]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[3]; - - struct cls_struct_9byte h_dbl = { 7.0, 8}; - struct cls_struct_9byte j_dbl = { 1.0, 9}; - struct cls_struct_9byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_double; - cls_struct_fields[1] = &ffi_type_sint; - cls_struct_fields[2] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &h_dbl; - args_dbl[1] = &j_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_9byte_fn), &res_dbl, args_dbl); - /* { dg-output "7 8 1 9: 8 17" } */ - printf("res: %g %d\n", res_dbl.a, res_dbl.b); - /* { dg-output "\nres: 8 17" } */ - - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_9byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_9byte(*)(cls_struct_9byte, cls_struct_9byte))(code))(h_dbl, j_dbl); - /* { dg-output "\n7 8 1 9: 8 17" } */ - printf("res: %g %d\n", res_dbl.a, res_dbl.b); - /* { dg-output "\nres: 8 17" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_double.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_double.c deleted file mode 100644 index aad5f3c..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_double.c +++ /dev/null @@ -1,93 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure alignment of double. - Limitations: none. - PR: none. - Originator: 20031203 */ - - - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_align { - unsigned char a; - double b; - unsigned char c; -} cls_struct_align; - -cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, - struct cls_struct_align a2) -{ - struct cls_struct_align result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - - printf("%d %g %d %d %g %d: %d %g %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c); - - return result; -} - -static void -cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_align a1, a2; - - a1 = *(struct cls_struct_align*)(args[0]); - a2 = *(struct cls_struct_align*)(args[1]); - - *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_align g_dbl = { 12, 4951, 127 }; - struct cls_struct_align f_dbl = { 1, 9320, 13 }; - struct cls_struct_align res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_uchar; - cls_struct_fields[1] = &ffi_type_double; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); - /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ - printf("res: %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 13 14271 140" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); - /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ - printf("res: %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 13 14271 140" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_float.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_float.c deleted file mode 100644 index 37e0855..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_float.c +++ /dev/null @@ -1,91 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure alignment of float. - Limitations: none. - PR: none. - Originator: 20031203 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_align { - unsigned char a; - float b; - unsigned char c; -} cls_struct_align; - -cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, - struct cls_struct_align a2) -{ - struct cls_struct_align result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - - printf("%d %g %d %d %g %d: %d %g %d\n", a1.a, (double)a1.b, a1.c, a2.a, (double)a2.b, a2.c, result.a, (double)result.b, result.c); - - return result; -} - -static void -cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_align a1, a2; - - a1 = *(struct cls_struct_align*)(args[0]); - a2 = *(struct cls_struct_align*)(args[1]); - - *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_align g_dbl = { 12, 4951, 127 }; - struct cls_struct_align f_dbl = { 1, 9320, 13 }; - struct cls_struct_align res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_uchar; - cls_struct_fields[1] = &ffi_type_float; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); - /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ - printf("res: %d %g %d\n", res_dbl.a, (double)res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 13 14271 140" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); - /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ - printf("res: %d %g %d\n", res_dbl.a, (double)res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 13 14271 140" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble.c deleted file mode 100644 index b3322d8..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble.c +++ /dev/null @@ -1,92 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure alignment of long double. - Limitations: none. - PR: none. - Originator: 20031203 */ - -/* { dg-do run } */ - -#include "ffitest.h" - -typedef struct cls_struct_align { - unsigned char a; - long double b; - unsigned char c; -} cls_struct_align; - -cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, - struct cls_struct_align a2) -{ - struct cls_struct_align result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - - printf("%d %g %d %d %g %d: %d %g %d\n", a1.a, (double)a1.b, a1.c, a2.a, (double)a2.b, a2.c, result.a, (double)result.b, result.c); - - return result; -} - -static void -cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_align a1, a2; - - a1 = *(struct cls_struct_align*)(args[0]); - a2 = *(struct cls_struct_align*)(args[1]); - - *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_align g_dbl = { 12, 4951, 127 }; - struct cls_struct_align f_dbl = { 1, 9320, 13 }; - struct cls_struct_align res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_uchar; - cls_struct_fields[1] = &ffi_type_longdouble; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); - /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ - printf("res: %d %g %d\n", res_dbl.a, (double)res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 13 14271 140" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); - /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ - printf("res: %d %g %d\n", res_dbl.a, (double)res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 13 14271 140" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble_split.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble_split.c deleted file mode 100644 index cc1c43b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble_split.c +++ /dev/null @@ -1,132 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure alignment of long double. - Limitations: none. - PR: none. - Originator: 20031203 */ - -/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ -/* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */ - -#include "ffitest.h" - -typedef struct cls_struct_align { - long double a; - long double b; - long double c; - long double d; - long double e; - long double f; - long double g; -} cls_struct_align; - -cls_struct_align cls_struct_align_fn( - cls_struct_align a1, - cls_struct_align a2) -{ - struct cls_struct_align r; - - r.a = a1.a + a2.a; - r.b = a1.b + a2.b; - r.c = a1.c + a2.c; - r.d = a1.d + a2.d; - r.e = a1.e + a2.e; - r.f = a1.f + a2.f; - r.g = a1.g + a2.g; - - printf("%Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg: " - "%Lg %Lg %Lg %Lg %Lg %Lg %Lg\n", - a1.a, a1.b, a1.c, a1.d, a1.e, a1.f, a1.g, - a2.a, a2.b, a2.c, a2.d, a2.e, a2.f, a2.g, - r.a, r.b, r.c, r.d, r.e, r.f, r.g); - - return r; -} - -cls_struct_align cls_struct_align_fn2( - cls_struct_align a1) -{ - struct cls_struct_align r; - - r.a = a1.a + 1; - r.b = a1.b + 1; - r.c = a1.c + 1; - r.d = a1.d + 1; - r.e = a1.e + 1; - r.f = a1.f + 1; - r.g = a1.g + 1; - - printf("%Lg %Lg %Lg %Lg %Lg %Lg %Lg: " - "%Lg %Lg %Lg %Lg %Lg %Lg %Lg\n", - a1.a, a1.b, a1.c, a1.d, a1.e, a1.f, a1.g, - r.a, r.b, r.c, r.d, r.e, r.f, r.g); - - return r; -} - -static void -cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - struct cls_struct_align a1, a2; - - a1 = *(struct cls_struct_align*)(args[0]); - a2 = *(struct cls_struct_align*)(args[1]); - - *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[3]; - ffi_type* cls_struct_fields[8]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[3]; - - struct cls_struct_align g_dbl = { 1, 2, 3, 4, 5, 6, 7 }; - struct cls_struct_align f_dbl = { 8, 9, 10, 11, 12, 13, 14 }; - struct cls_struct_align res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_longdouble; - cls_struct_fields[1] = &ffi_type_longdouble; - cls_struct_fields[2] = &ffi_type_longdouble; - cls_struct_fields[3] = &ffi_type_longdouble; - cls_struct_fields[4] = &ffi_type_longdouble; - cls_struct_fields[5] = &ffi_type_longdouble; - cls_struct_fields[6] = &ffi_type_longdouble; - cls_struct_fields[7] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); - /* { dg-output "1 2 3 4 5 6 7 8 9 10 11 12 13 14: 9 11 13 15 17 19 21" } */ - printf("res: %Lg %Lg %Lg %Lg %Lg %Lg %Lg\n", res_dbl.a, res_dbl.b, - res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g); - /* { dg-output "\nres: 9 11 13 15 17 19 21" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); - /* { dg-output "\n1 2 3 4 5 6 7 8 9 10 11 12 13 14: 9 11 13 15 17 19 21" } */ - printf("res: %Lg %Lg %Lg %Lg %Lg %Lg %Lg\n", res_dbl.a, res_dbl.b, - res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g); - /* { dg-output "\nres: 9 11 13 15 17 19 21" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble_split2.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble_split2.c deleted file mode 100644 index 5d3bec0..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble_split2.c +++ /dev/null @@ -1,115 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure alignment of long double. - Limitations: none. - PR: none. - Originator: Blake Chaffin 6/18/2007 -*/ - -/* { dg-do run { xfail strongarm*-*-* } } */ -/* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */ - -#include "ffitest.h" - -typedef struct cls_struct_align { - long double a; - long double b; - long double c; - long double d; - long double e; - double f; - long double g; -} cls_struct_align; - -cls_struct_align cls_struct_align_fn( - cls_struct_align a1, - cls_struct_align a2) -{ - struct cls_struct_align r; - - r.a = a1.a + a2.a; - r.b = a1.b + a2.b; - r.c = a1.c + a2.c; - r.d = a1.d + a2.d; - r.e = a1.e + a2.e; - r.f = a1.f + a2.f; - r.g = a1.g + a2.g; - - printf("%Lg %Lg %Lg %Lg %Lg %g %Lg %Lg %Lg %Lg %Lg %Lg %g %Lg: " - "%Lg %Lg %Lg %Lg %Lg %g %Lg\n", - a1.a, a1.b, a1.c, a1.d, a1.e, a1.f, a1.g, - a2.a, a2.b, a2.c, a2.d, a2.e, a2.f, a2.g, - r.a, r.b, r.c, r.d, r.e, r.f, r.g); - - return r; -} - -static void -cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - struct cls_struct_align a1, a2; - - a1 = *(struct cls_struct_align*)(args[0]); - a2 = *(struct cls_struct_align*)(args[1]); - - *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[3]; - ffi_type* cls_struct_fields[8]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[3]; - - struct cls_struct_align g_dbl = { 1, 2, 3, 4, 5, 6, 7 }; - struct cls_struct_align f_dbl = { 8, 9, 10, 11, 12, 13, 14 }; - struct cls_struct_align res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_longdouble; - cls_struct_fields[1] = &ffi_type_longdouble; - cls_struct_fields[2] = &ffi_type_longdouble; - cls_struct_fields[3] = &ffi_type_longdouble; - cls_struct_fields[4] = &ffi_type_longdouble; - cls_struct_fields[5] = &ffi_type_double; - cls_struct_fields[6] = &ffi_type_longdouble; - cls_struct_fields[7] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); - /* { dg-output "1 2 3 4 5 6 7 8 9 10 11 12 13 14: 9 11 13 15 17 19 21" } */ - printf("res: %Lg %Lg %Lg %Lg %Lg %g %Lg\n", res_dbl.a, res_dbl.b, - res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g); - /* { dg-output "\nres: 9 11 13 15 17 19 21" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); - /* { dg-output "\n1 2 3 4 5 6 7 8 9 10 11 12 13 14: 9 11 13 15 17 19 21" } */ - printf("res: %Lg %Lg %Lg %Lg %Lg %g %Lg\n", res_dbl.a, res_dbl.b, - res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g); - /* { dg-output "\nres: 9 11 13 15 17 19 21" } */ - - exit(0); -} - - - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_pointer.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_pointer.c deleted file mode 100644 index 8fbf36a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_pointer.c +++ /dev/null @@ -1,95 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure alignment of pointer. - Limitations: none. - PR: none. - Originator: 20031203 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_align { - unsigned char a; - void *b; - unsigned char c; -} cls_struct_align; - -cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, - struct cls_struct_align a2) -{ - struct cls_struct_align result; - - result.a = a1.a + a2.a; - result.b = (void *)((uintptr_t)a1.b + (uintptr_t)a2.b); - result.c = a1.c + a2.c; - - printf("%d %" PRIuPTR " %d %d %" PRIuPTR " %d: %d %" PRIuPTR " %d\n", - a1.a, (uintptr_t)a1.b, a1.c, - a2.a, (uintptr_t)a2.b, a2.c, - result.a, (uintptr_t)result.b, - result.c); - - return result; -} - -static void -cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_align a1, a2; - - a1 = *(struct cls_struct_align*)(args[0]); - a2 = *(struct cls_struct_align*)(args[1]); - - *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_align g_dbl = { 12, (void *)4951, 127 }; - struct cls_struct_align f_dbl = { 1, (void *)9320, 13 }; - struct cls_struct_align res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_uchar; - cls_struct_fields[1] = &ffi_type_pointer; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); - /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ - printf("res: %d %" PRIuPTR " %d\n", res_dbl.a, (uintptr_t)res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 13 14271 140" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); - /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ - printf("res: %d %" PRIuPTR " %d\n", res_dbl.a, (uintptr_t)res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 13 14271 140" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint16.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint16.c deleted file mode 100644 index 039b874..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint16.c +++ /dev/null @@ -1,91 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure alignment of sint16. - Limitations: none. - PR: none. - Originator: 20031203 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_align { - unsigned char a; - signed short b; - unsigned char c; -} cls_struct_align; - -cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, - struct cls_struct_align a2) -{ - struct cls_struct_align result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - - printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c); - - return result; -} - -static void -cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_align a1, a2; - - a1 = *(struct cls_struct_align*)(args[0]); - a2 = *(struct cls_struct_align*)(args[1]); - - *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_align g_dbl = { 12, 4951, 127 }; - struct cls_struct_align f_dbl = { 1, 9320, 13 }; - struct cls_struct_align res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_uchar; - cls_struct_fields[1] = &ffi_type_sshort; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); - /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ - printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 13 14271 140" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); - /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ - printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 13 14271 140" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint32.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint32.c deleted file mode 100644 index c96c6d1..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint32.c +++ /dev/null @@ -1,91 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure alignment of sint32. - Limitations: none. - PR: none. - Originator: 20031203 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_align { - unsigned char a; - signed int b; - unsigned char c; -} cls_struct_align; - -cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, - struct cls_struct_align a2) -{ - struct cls_struct_align result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - - printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c); - - return result; -} - -static void -cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_align a1, a2; - - a1 = *(struct cls_struct_align*)(args[0]); - a2 = *(struct cls_struct_align*)(args[1]); - - *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_align g_dbl = { 12, 4951, 127 }; - struct cls_struct_align f_dbl = { 1, 9320, 13 }; - struct cls_struct_align res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_uchar; - cls_struct_fields[1] = &ffi_type_sint; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); - /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ - printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 13 14271 140" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); - /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ - printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 13 14271 140" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint64.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint64.c deleted file mode 100644 index 9aa7bdd..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint64.c +++ /dev/null @@ -1,92 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure alignment of sint64. - Limitations: none. - PR: none. - Originator: 20031203 */ - -/* { dg-do run } */ -/* { dg-options "-Wno-format" { target alpha*-dec-osf* } } */ -#include "ffitest.h" - -typedef struct cls_struct_align { - unsigned char a; - signed long long b; - unsigned char c; -} cls_struct_align; - -cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, - struct cls_struct_align a2) -{ - struct cls_struct_align result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - - printf("%d %" PRIdLL " %d %d %" PRIdLL " %d: %d %" PRIdLL " %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c); - - return result; -} - -static void -cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_align a1, a2; - - a1 = *(struct cls_struct_align*)(args[0]); - a2 = *(struct cls_struct_align*)(args[1]); - - *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_align g_dbl = { 12, 4951, 127 }; - struct cls_struct_align f_dbl = { 1, 9320, 13 }; - struct cls_struct_align res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_uchar; - cls_struct_fields[1] = &ffi_type_sint64; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); - /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ - printf("res: %d %" PRIdLL " %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 13 14271 140" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); - /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ - printf("res: %d %" PRIdLL " %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 13 14271 140" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint16.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint16.c deleted file mode 100644 index 97620b7..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint16.c +++ /dev/null @@ -1,91 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure alignment of uint16. - Limitations: none. - PR: none. - Originator: 20031203 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_align { - unsigned char a; - unsigned short b; - unsigned char c; -} cls_struct_align; - -cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, - struct cls_struct_align a2) -{ - struct cls_struct_align result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - - printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c); - - return result; -} - -static void -cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_align a1, a2; - - a1 = *(struct cls_struct_align*)(args[0]); - a2 = *(struct cls_struct_align*)(args[1]); - - *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_align g_dbl = { 12, 4951, 127 }; - struct cls_struct_align f_dbl = { 1, 9320, 13 }; - struct cls_struct_align res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_uchar; - cls_struct_fields[1] = &ffi_type_ushort; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); - /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ - printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 13 14271 140" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); - /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ - printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 13 14271 140" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint32.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint32.c deleted file mode 100644 index 5766fad..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint32.c +++ /dev/null @@ -1,91 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure alignment of uint32. - Limitations: none. - PR: none. - Originator: 20031203 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_align { - unsigned char a; - unsigned int b; - unsigned char c; -} cls_struct_align; - -cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, - struct cls_struct_align a2) -{ - struct cls_struct_align result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - - printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c); - - return result; -} - -static void -cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_align a1, a2; - - a1 = *(struct cls_struct_align*)(args[0]); - a2 = *(struct cls_struct_align*)(args[1]); - - *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_align g_dbl = { 12, 4951, 127 }; - struct cls_struct_align f_dbl = { 1, 9320, 13 }; - struct cls_struct_align res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_uchar; - cls_struct_fields[1] = &ffi_type_uint; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); - /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ - printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 13 14271 140" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); - /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ - printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 13 14271 140" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint64.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint64.c deleted file mode 100644 index a52cb89..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint64.c +++ /dev/null @@ -1,93 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure alignment of uint64. - Limitations: none. - PR: none. - Originator: 20031203 */ - - -/* { dg-do run } */ -/* { dg-options "-Wno-format" { target alpha*-dec-osf* } } */ -#include "ffitest.h" - -typedef struct cls_struct_align { - unsigned char a; - unsigned long long b; - unsigned char c; -} cls_struct_align; - -cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, - struct cls_struct_align a2) -{ - struct cls_struct_align result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - - printf("%d %" PRIdLL " %d %d %" PRIdLL " %d: %d %" PRIdLL " %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c); - - return result; -} - -static void -cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_align a1, a2; - - a1 = *(struct cls_struct_align*)(args[0]); - a2 = *(struct cls_struct_align*)(args[1]); - - *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_align g_dbl = { 12, 4951, 127 }; - struct cls_struct_align f_dbl = { 1, 9320, 13 }; - struct cls_struct_align res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_uchar; - cls_struct_fields[1] = &ffi_type_uint64; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &g_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); - /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ - printf("res: %d %" PRIdLL " %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 13 14271 140" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); - /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ - printf("res: %d %" PRIdLL " %d\n", res_dbl.a, res_dbl.b, res_dbl.c); - /* { dg-output "\nres: 13 14271 140" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_dbls_struct.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_dbls_struct.c deleted file mode 100644 index e451dea..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_dbls_struct.c +++ /dev/null @@ -1,66 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check double arguments in structs. - Limitations: none. - PR: none. - Originator: Blake Chaffin 6/23/2007 */ - -/* { dg-do run } */ - -#include "ffitest.h" - -typedef struct Dbls { - double x; - double y; -} Dbls; - -void -closure_test_fn(Dbls p) -{ - printf("%.1f %.1f\n", p.x, p.y); -} - -void -closure_test_gn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__, - void** args, void* userdata __UNUSED__) -{ - closure_test_fn(*(Dbls*)args[0]); -} - -int main(int argc __UNUSED__, char** argv __UNUSED__) -{ - ffi_cif cif; - - void *code; - ffi_closure* pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type* cl_arg_types[1]; - - ffi_type ts1_type; - ffi_type* ts1_type_elements[4]; - - Dbls arg = { 1.0, 2.0 }; - - ts1_type.size = 0; - ts1_type.alignment = 0; - ts1_type.type = FFI_TYPE_STRUCT; - ts1_type.elements = ts1_type_elements; - - ts1_type_elements[0] = &ffi_type_double; - ts1_type_elements[1] = &ffi_type_double; - ts1_type_elements[2] = NULL; - - cl_arg_types[0] = &ts1_type; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_void, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_gn, NULL, code) == FFI_OK); - - ((void*(*)(Dbls))(code))(arg); - /* { dg-output "1.0 2.0" } */ - - closure_test_fn(arg); - /* { dg-output "\n1.0 2.0" } */ - - return 0; -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_double.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_double.c deleted file mode 100644 index 84ad4cb..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_double.c +++ /dev/null @@ -1,43 +0,0 @@ -/* Area: closure_call - Purpose: Check return value double. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -static void cls_ret_double_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) - { - *(double *)resp = *(double *)args[0]; - - printf("%f: %f\n",*(double *)args[0], - *(double *)resp); - } -typedef double (*cls_ret_double)(double); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[2]; - double res; - - cl_arg_types[0] = &ffi_type_double; - cl_arg_types[1] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_double, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_double_fn, NULL, code) == FFI_OK); - - res = (*((cls_ret_double)code))(21474.789); - /* { dg-output "21474.789000: 21474.789000" } */ - printf("res: %.6f\n", res); - /* { dg-output "\nres: 21474.789000" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_double_va.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_double_va.c deleted file mode 100644 index e077f92..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_double_va.c +++ /dev/null @@ -1,61 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Test doubles passed in variable argument lists. - Limitations: none. - PR: none. - Originator: Blake Chaffin 6/6/2007 */ - -/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ -/* { dg-output "" { xfail avr32*-*-* } } */ -/* { dg-output "" { xfail mips-sgi-irix6* } } PR libffi/46660 */ - -#include "ffitest.h" - -static void -cls_double_va_fn(ffi_cif* cif __UNUSED__, void* resp, - void** args, void* userdata __UNUSED__) -{ - char* format = *(char**)args[0]; - double doubleValue = *(double*)args[1]; - - *(ffi_arg*)resp = printf(format, doubleValue); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args[3]; - ffi_type* arg_types[3]; - - char* format = "%.1f\n"; - double doubleArg = 7; - ffi_arg res = 0; - - arg_types[0] = &ffi_type_pointer; - arg_types[1] = &ffi_type_double; - arg_types[2] = NULL; - - /* This printf call is variadic */ - CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2, &ffi_type_sint, - arg_types) == FFI_OK); - - args[0] = &format; - args[1] = &doubleArg; - args[2] = NULL; - - ffi_call(&cif, FFI_FN(printf), &res, args); - /* { dg-output "7.0" } */ - printf("res: %d\n", (int) res); - /* { dg-output "\nres: 4" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_double_va_fn, NULL, - code) == FFI_OK); - - res = ((int(*)(char*, ...))(code))(format, doubleArg); - /* { dg-output "\n7.0" } */ - printf("res: %d\n", (int) res); - /* { dg-output "\nres: 4" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_float.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_float.c deleted file mode 100644 index 0090fed..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_float.c +++ /dev/null @@ -1,42 +0,0 @@ -/* Area: closure_call - Purpose: Check return value float. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -static void cls_ret_float_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) - { - *(float *)resp = *(float *)args[0]; - - printf("%g: %g\n",*(float *)args[0], - *(float *)resp); - } - -typedef float (*cls_ret_float)(float); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[2]; - float res; - - cl_arg_types[0] = &ffi_type_float; - cl_arg_types[1] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_float, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_float_fn, NULL, code) == FFI_OK); - res = ((((cls_ret_float)code)(-2122.12))); - /* { dg-output "\\-2122.12: \\-2122.12" } */ - printf("res: %.6f\n", res); - /* { dg-output "\nres: \-2122.120117" } */ - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_longdouble.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_longdouble.c deleted file mode 100644 index d24e72e..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_longdouble.c +++ /dev/null @@ -1,105 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check long double arguments. - Limitations: none. - PR: none. - Originator: Blake Chaffin */ - -/* This test is known to PASS on armv7l-unknown-linux-gnueabihf, so I have - remove the xfail for arm*-*-* below, until we know more. */ -/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ -/* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */ - -#include "ffitest.h" - -long double cls_ldouble_fn( - long double a1, - long double a2, - long double a3, - long double a4, - long double a5, - long double a6, - long double a7, - long double a8) -{ - long double r = a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8; - - printf("%Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg: %Lg\n", - a1, a2, a3, a4, a5, a6, a7, a8, r); - - return r; -} - -static void -cls_ldouble_gn(ffi_cif* cif __UNUSED__, void* resp, - void** args, void* userdata __UNUSED__) -{ - long double a1 = *(long double*)args[0]; - long double a2 = *(long double*)args[1]; - long double a3 = *(long double*)args[2]; - long double a4 = *(long double*)args[3]; - long double a5 = *(long double*)args[4]; - long double a6 = *(long double*)args[5]; - long double a7 = *(long double*)args[6]; - long double a8 = *(long double*)args[7]; - - *(long double*)resp = cls_ldouble_fn( - a1, a2, a3, a4, a5, a6, a7, a8); -} - -int main(void) -{ - ffi_cif cif; - void* code; - ffi_closure* pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args[9]; - ffi_type* arg_types[9]; - long double res = 0; - - long double arg1 = 1; - long double arg2 = 2; - long double arg3 = 3; - long double arg4 = 4; - long double arg5 = 5; - long double arg6 = 6; - long double arg7 = 7; - long double arg8 = 8; - - arg_types[0] = &ffi_type_longdouble; - arg_types[1] = &ffi_type_longdouble; - arg_types[2] = &ffi_type_longdouble; - arg_types[3] = &ffi_type_longdouble; - arg_types[4] = &ffi_type_longdouble; - arg_types[5] = &ffi_type_longdouble; - arg_types[6] = &ffi_type_longdouble; - arg_types[7] = &ffi_type_longdouble; - arg_types[8] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 8, &ffi_type_longdouble, - arg_types) == FFI_OK); - - args[0] = &arg1; - args[1] = &arg2; - args[2] = &arg3; - args[3] = &arg4; - args[4] = &arg5; - args[5] = &arg6; - args[6] = &arg7; - args[7] = &arg8; - args[8] = NULL; - - ffi_call(&cif, FFI_FN(cls_ldouble_fn), &res, args); - /* { dg-output "1 2 3 4 5 6 7 8: 36" } */ - printf("res: %Lg\n", res); - /* { dg-output "\nres: 36" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ldouble_gn, NULL, code) == FFI_OK); - - res = ((long double(*)(long double, long double, long double, long double, - long double, long double, long double, long double))(code))(arg1, arg2, - arg3, arg4, arg5, arg6, arg7, arg8); - /* { dg-output "\n1 2 3 4 5 6 7 8: 36" } */ - printf("res: %Lg\n", res); - /* { dg-output "\nres: 36" } */ - - return 0; -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_longdouble_va.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_longdouble_va.c deleted file mode 100644 index 39b438b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_longdouble_va.c +++ /dev/null @@ -1,61 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Test long doubles passed in variable argument lists. - Limitations: none. - PR: none. - Originator: Blake Chaffin 6/6/2007 */ - -/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ -/* { dg-output "" { xfail avr32*-*-* x86_64-*-mingw* } } */ -/* { dg-output "" { xfail mips-sgi-irix6* } } PR libffi/46660 */ - -#include "ffitest.h" - -static void -cls_longdouble_va_fn(ffi_cif* cif __UNUSED__, void* resp, - void** args, void* userdata __UNUSED__) -{ - char* format = *(char**)args[0]; - long double ldValue = *(long double*)args[1]; - - *(ffi_arg*)resp = printf(format, ldValue); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args[3]; - ffi_type* arg_types[3]; - - char* format = "%.1Lf\n"; - long double ldArg = 7; - ffi_arg res = 0; - - arg_types[0] = &ffi_type_pointer; - arg_types[1] = &ffi_type_longdouble; - arg_types[2] = NULL; - - /* This printf call is variadic */ - CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2, &ffi_type_sint, - arg_types) == FFI_OK); - - args[0] = &format; - args[1] = &ldArg; - args[2] = NULL; - - ffi_call(&cif, FFI_FN(printf), &res, args); - /* { dg-output "7.0" } */ - printf("res: %d\n", (int) res); - /* { dg-output "\nres: 4" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_longdouble_va_fn, NULL, - code) == FFI_OK); - - res = ((int(*)(char*, ...))(code))(format, ldArg); - /* { dg-output "\n7.0" } */ - printf("res: %d\n", (int) res); - /* { dg-output "\nres: 4" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_many_mixed_args.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_many_mixed_args.c deleted file mode 100644 index 7fd6c82..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_many_mixed_args.c +++ /dev/null @@ -1,70 +0,0 @@ -/* Area: closure_call - Purpose: Check closures called with many args of mixed types - Limitations: none. - PR: none. - Originator: */ - -/* { dg-do run } */ -#include "ffitest.h" -#include -#include - -#define NARGS 16 - -static void cls_ret_double_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - int i; - double r = 0; - double t; - for(i = 0; i < NARGS; i++) - { - if(i == 4 || i == 9 || i == 11 || i == 13 || i == 15) - { - t = *(long int *)args[i]; - CHECK(t == i+1); - } - else - { - t = *(double *)args[i]; - CHECK(fabs(t - ((i+1) * 0.1)) < FLT_EPSILON); - } - r += t; - } - *(double *)resp = r; -} -typedef double (*cls_ret_double)(double, double, double, double, long int, -double, double, double, double, long int, double, long int, double, long int, -double, long int); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[NARGS]; - double res; - int i; - double expected = 64.9; - - for(i = 0; i < NARGS; i++) - { - if(i == 4 || i == 9 || i == 11 || i == 13 || i == 15) - cl_arg_types[i] = &ffi_type_slong; - else - cl_arg_types[i] = &ffi_type_double; - } - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, NARGS, - &ffi_type_double, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_double_fn, NULL, code) == FFI_OK); - - res = (((cls_ret_double)code))(0.1, 0.2, 0.3, 0.4, 5, 0.6, 0.7, 0.8, 0.9, 10, - 1.1, 12, 1.3, 14, 1.5, 16); - if (fabs(res - expected) < FLT_EPSILON) - exit(0); - else - abort(); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_many_mixed_float_double.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_many_mixed_float_double.c deleted file mode 100644 index 62b0697..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_many_mixed_float_double.c +++ /dev/null @@ -1,55 +0,0 @@ -/* Area: closure_call - Purpose: Check register allocation for closure calls with many float and double arguments - Limitations: none. - PR: none. - Originator: */ - -/* { dg-do run } */ -#include "ffitest.h" -#include -#include - -#define NARGS 16 - -static void cls_mixed_float_double_fn(ffi_cif* cif , void* ret, void** args, - void* userdata __UNUSED__) -{ - double r = 0; - unsigned int i; - double t; - for(i=0; i < cif->nargs; i++) - { - if(cif->arg_types[i] == &ffi_type_double) { - t = *(((double**)(args))[i]); - } else { - t = *(((float**)(args))[i]); - } - r += t; - } - *((double*)ret) = r; -} -typedef double (*cls_mixed)(double, float, double, double, double, double, double, float, float, double, float, float); - -int main (void) -{ - ffi_cif cif; - ffi_closure *closure; - void* code; - ffi_type *argtypes[12] = {&ffi_type_double, &ffi_type_float, &ffi_type_double, - &ffi_type_double, &ffi_type_double, &ffi_type_double, - &ffi_type_double, &ffi_type_float, &ffi_type_float, - &ffi_type_double, &ffi_type_float, &ffi_type_float}; - - - closure = ffi_closure_alloc(sizeof(ffi_closure), (void**)&code); - if(closure ==NULL) - abort(); - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 12, &ffi_type_double, argtypes) == FFI_OK); - CHECK(ffi_prep_closure_loc(closure, &cif, cls_mixed_float_double_fn, NULL, code) == FFI_OK); - double ret = ((cls_mixed)code)(0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2); - ffi_closure_free(closure); - if(fabs(ret - 7.8) < FLT_EPSILON) - exit(0); - else - abort(); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_schar.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_schar.c deleted file mode 100644 index 71df7b6..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_schar.c +++ /dev/null @@ -1,74 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check passing of multiple signed char values. - Limitations: none. - PR: PR13221. - Originator: 20031129 */ - -/* { dg-do run } */ -#include "ffitest.h" - -signed char test_func_fn(signed char a1, signed char a2) -{ - signed char result; - - result = a1 + a2; - - printf("%d %d: %d\n", a1, a2, result); - - return result; - -} - -static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals, - void *data __UNUSED__) -{ - signed char a1, a2; - - a1 = *(signed char *)avals[0]; - a2 = *(signed char *)avals[1]; - - *(ffi_arg *)rval = test_func_fn(a1, a2); - -} - -typedef signed char (*test_type)(signed char, signed char); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void * args_dbl[3]; - ffi_type * cl_arg_types[3]; - ffi_arg res_call; - signed char a, b, res_closure; - - a = 2; - b = 125; - - args_dbl[0] = &a; - args_dbl[1] = &b; - args_dbl[2] = NULL; - - cl_arg_types[0] = &ffi_type_schar; - cl_arg_types[1] = &ffi_type_schar; - cl_arg_types[2] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, - &ffi_type_schar, cl_arg_types) == FFI_OK); - - ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl); - /* { dg-output "2 125: 127" } */ - printf("res: %d\n", (signed char)res_call); - /* { dg-output "\nres: 127" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code) == FFI_OK); - - res_closure = (*((test_type)code))(2, 125); - /* { dg-output "\n2 125: 127" } */ - printf("res: %d\n", res_closure); - /* { dg-output "\nres: 127" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_sshort.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_sshort.c deleted file mode 100644 index 4c39153..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_sshort.c +++ /dev/null @@ -1,74 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check passing of multiple signed short values. - Limitations: none. - PR: PR13221. - Originator: 20031129 */ - -/* { dg-do run } */ -#include "ffitest.h" - -signed short test_func_fn(signed short a1, signed short a2) -{ - signed short result; - - result = a1 + a2; - - printf("%d %d: %d\n", a1, a2, result); - - return result; - -} - -static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals, - void *data __UNUSED__) -{ - signed short a1, a2; - - a1 = *(signed short *)avals[0]; - a2 = *(signed short *)avals[1]; - - *(ffi_arg *)rval = test_func_fn(a1, a2); - -} - -typedef signed short (*test_type)(signed short, signed short); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void * args_dbl[3]; - ffi_type * cl_arg_types[3]; - ffi_arg res_call; - unsigned short a, b, res_closure; - - a = 2; - b = 32765; - - args_dbl[0] = &a; - args_dbl[1] = &b; - args_dbl[2] = NULL; - - cl_arg_types[0] = &ffi_type_sshort; - cl_arg_types[1] = &ffi_type_sshort; - cl_arg_types[2] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, - &ffi_type_sshort, cl_arg_types) == FFI_OK); - - ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl); - /* { dg-output "2 32765: 32767" } */ - printf("res: %d\n", (unsigned short)res_call); - /* { dg-output "\nres: 32767" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code) == FFI_OK); - - res_closure = (*((test_type)code))(2, 32765); - /* { dg-output "\n2 32765: 32767" } */ - printf("res: %d\n", res_closure); - /* { dg-output "\nres: 32767" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_sshortchar.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_sshortchar.c deleted file mode 100644 index 1c3aeb5..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_sshortchar.c +++ /dev/null @@ -1,86 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check passing of multiple signed short/char values. - Limitations: none. - PR: PR13221. - Originator: 20031129 */ - -/* { dg-do run } */ -#include "ffitest.h" - -signed short test_func_fn(signed char a1, signed short a2, - signed char a3, signed short a4) -{ - signed short result; - - result = a1 + a2 + a3 + a4; - - printf("%d %d %d %d: %d\n", a1, a2, a3, a4, result); - - return result; - -} - -static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals, - void *data __UNUSED__) -{ - signed char a1, a3; - signed short a2, a4; - - a1 = *(signed char *)avals[0]; - a2 = *(signed short *)avals[1]; - a3 = *(signed char *)avals[2]; - a4 = *(signed short *)avals[3]; - - *(ffi_arg *)rval = test_func_fn(a1, a2, a3, a4); - -} - -typedef signed short (*test_type)(signed char, signed short, - signed char, signed short); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void * args_dbl[5]; - ffi_type * cl_arg_types[5]; - ffi_arg res_call; - signed char a, c; - signed short b, d, res_closure; - - a = 1; - b = 32765; - c = 127; - d = -128; - - args_dbl[0] = &a; - args_dbl[1] = &b; - args_dbl[2] = &c; - args_dbl[3] = &d; - args_dbl[4] = NULL; - - cl_arg_types[0] = &ffi_type_schar; - cl_arg_types[1] = &ffi_type_sshort; - cl_arg_types[2] = &ffi_type_schar; - cl_arg_types[3] = &ffi_type_sshort; - cl_arg_types[4] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, - &ffi_type_sshort, cl_arg_types) == FFI_OK); - - ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl); - /* { dg-output "1 32765 127 -128: 32765" } */ - printf("res: %d\n", (signed short)res_call); - /* { dg-output "\nres: 32765" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code) == FFI_OK); - - res_closure = (*((test_type)code))(1, 32765, 127, -128); - /* { dg-output "\n1 32765 127 -128: 32765" } */ - printf("res: %d\n", res_closure); - /* { dg-output "\nres: 32765" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_uchar.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_uchar.c deleted file mode 100644 index 009c02c..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_uchar.c +++ /dev/null @@ -1,91 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check passing of multiple unsigned char values. - Limitations: none. - PR: PR13221. - Originator: 20031129 */ - -/* { dg-do run } */ -#include "ffitest.h" - -unsigned char test_func_fn(unsigned char a1, unsigned char a2, - unsigned char a3, unsigned char a4) -{ - unsigned char result; - - result = a1 + a2 + a3 + a4; - - printf("%d %d %d %d: %d\n", a1, a2, a3, a4, result); - - return result; - -} - -static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals, - void *data __UNUSED__) -{ - unsigned char a1, a2, a3, a4; - - a1 = *(unsigned char *)avals[0]; - a2 = *(unsigned char *)avals[1]; - a3 = *(unsigned char *)avals[2]; - a4 = *(unsigned char *)avals[3]; - - *(ffi_arg *)rval = test_func_fn(a1, a2, a3, a4); - -} - -typedef unsigned char (*test_type)(unsigned char, unsigned char, - unsigned char, unsigned char); - -void test_func(ffi_cif *cif __UNUSED__, void *rval __UNUSED__, void **avals, - void *data __UNUSED__) -{ - printf("%d %d %d %d\n", *(unsigned char *)avals[0], - *(unsigned char *)avals[1], *(unsigned char *)avals[2], - *(unsigned char *)avals[3]); -} -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void * args_dbl[5]; - ffi_type * cl_arg_types[5]; - ffi_arg res_call; - unsigned char a, b, c, d, res_closure; - - a = 1; - b = 2; - c = 127; - d = 125; - - args_dbl[0] = &a; - args_dbl[1] = &b; - args_dbl[2] = &c; - args_dbl[3] = &d; - args_dbl[4] = NULL; - - cl_arg_types[0] = &ffi_type_uchar; - cl_arg_types[1] = &ffi_type_uchar; - cl_arg_types[2] = &ffi_type_uchar; - cl_arg_types[3] = &ffi_type_uchar; - cl_arg_types[4] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, - &ffi_type_uchar, cl_arg_types) == FFI_OK); - - ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl); - /* { dg-output "1 2 127 125: 255" } */ - printf("res: %d\n", (unsigned char)res_call); - /* { dg-output "\nres: 255" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code) == FFI_OK); - - res_closure = (*((test_type)code))(1, 2, 127, 125); - /* { dg-output "\n1 2 127 125: 255" } */ - printf("res: %d\n", res_closure); - /* { dg-output "\nres: 255" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_ushort.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_ushort.c deleted file mode 100644 index dd10ca7..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_ushort.c +++ /dev/null @@ -1,74 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check passing of multiple unsigned short values. - Limitations: none. - PR: PR13221. - Originator: 20031129 */ - -/* { dg-do run } */ -#include "ffitest.h" - -unsigned short test_func_fn(unsigned short a1, unsigned short a2) -{ - unsigned short result; - - result = a1 + a2; - - printf("%d %d: %d\n", a1, a2, result); - - return result; - -} - -static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals, - void *data __UNUSED__) -{ - unsigned short a1, a2; - - a1 = *(unsigned short *)avals[0]; - a2 = *(unsigned short *)avals[1]; - - *(ffi_arg *)rval = test_func_fn(a1, a2); - -} - -typedef unsigned short (*test_type)(unsigned short, unsigned short); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void * args_dbl[3]; - ffi_type * cl_arg_types[3]; - ffi_arg res_call; - unsigned short a, b, res_closure; - - a = 2; - b = 32765; - - args_dbl[0] = &a; - args_dbl[1] = &b; - args_dbl[2] = NULL; - - cl_arg_types[0] = &ffi_type_ushort; - cl_arg_types[1] = &ffi_type_ushort; - cl_arg_types[2] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, - &ffi_type_ushort, cl_arg_types) == FFI_OK); - - ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl); - /* { dg-output "2 32765: 32767" } */ - printf("res: %d\n", (unsigned short)res_call); - /* { dg-output "\nres: 32767" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code) == FFI_OK); - - res_closure = (*((test_type)code))(2, 32765); - /* { dg-output "\n2 32765: 32767" } */ - printf("res: %d\n", res_closure); - /* { dg-output "\nres: 32767" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_ushortchar.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_ushortchar.c deleted file mode 100644 index 2588e97..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_ushortchar.c +++ /dev/null @@ -1,86 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check passing of multiple unsigned short/char values. - Limitations: none. - PR: PR13221. - Originator: 20031129 */ - -/* { dg-do run } */ -#include "ffitest.h" - -unsigned short test_func_fn(unsigned char a1, unsigned short a2, - unsigned char a3, unsigned short a4) -{ - unsigned short result; - - result = a1 + a2 + a3 + a4; - - printf("%d %d %d %d: %d\n", a1, a2, a3, a4, result); - - return result; - -} - -static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals, - void *data __UNUSED__) -{ - unsigned char a1, a3; - unsigned short a2, a4; - - a1 = *(unsigned char *)avals[0]; - a2 = *(unsigned short *)avals[1]; - a3 = *(unsigned char *)avals[2]; - a4 = *(unsigned short *)avals[3]; - - *(ffi_arg *)rval = test_func_fn(a1, a2, a3, a4); - -} - -typedef unsigned short (*test_type)(unsigned char, unsigned short, - unsigned char, unsigned short); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void * args_dbl[5]; - ffi_type * cl_arg_types[5]; - ffi_arg res_call; - unsigned char a, c; - unsigned short b, d, res_closure; - - a = 1; - b = 2; - c = 127; - d = 128; - - args_dbl[0] = &a; - args_dbl[1] = &b; - args_dbl[2] = &c; - args_dbl[3] = &d; - args_dbl[4] = NULL; - - cl_arg_types[0] = &ffi_type_uchar; - cl_arg_types[1] = &ffi_type_ushort; - cl_arg_types[2] = &ffi_type_uchar; - cl_arg_types[3] = &ffi_type_ushort; - cl_arg_types[4] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, - &ffi_type_ushort, cl_arg_types) == FFI_OK); - - ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl); - /* { dg-output "1 2 127 128: 258" } */ - printf("res: %d\n", (unsigned short)res_call); - /* { dg-output "\nres: 258" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code) == FFI_OK); - - res_closure = (*((test_type)code))(1, 2, 127, 128); - /* { dg-output "\n1 2 127 128: 258" } */ - printf("res: %d\n", res_closure); - /* { dg-output "\nres: 258" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_pointer.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_pointer.c deleted file mode 100644 index d82a87a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_pointer.c +++ /dev/null @@ -1,74 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check pointer arguments. - Limitations: none. - PR: none. - Originator: Blake Chaffin 6/6/2007 */ - -/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ -#include "ffitest.h" - -void* cls_pointer_fn(void* a1, void* a2) -{ - void* result = (void*)((intptr_t)a1 + (intptr_t)a2); - - printf("0x%08x 0x%08x: 0x%08x\n", - (unsigned int)(uintptr_t) a1, - (unsigned int)(uintptr_t) a2, - (unsigned int)(uintptr_t) result); - - return result; -} - -static void -cls_pointer_gn(ffi_cif* cif __UNUSED__, void* resp, - void** args, void* userdata __UNUSED__) -{ - void* a1 = *(void**)(args[0]); - void* a2 = *(void**)(args[1]); - - *(void**)resp = cls_pointer_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure* pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args[3]; - /* ffi_type cls_pointer_type; */ - ffi_type* arg_types[3]; - -/* cls_pointer_type.size = sizeof(void*); - cls_pointer_type.alignment = 0; - cls_pointer_type.type = FFI_TYPE_POINTER; - cls_pointer_type.elements = NULL;*/ - - void* arg1 = (void*)0x12345678; - void* arg2 = (void*)0x89abcdef; - ffi_arg res = 0; - - arg_types[0] = &ffi_type_pointer; - arg_types[1] = &ffi_type_pointer; - arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_pointer, - arg_types) == FFI_OK); - - args[0] = &arg1; - args[1] = &arg2; - args[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_pointer_fn), &res, args); - /* { dg-output "0x12345678 0x89abcdef: 0x9be02467" } */ - printf("res: 0x%08x\n", (unsigned int) res); - /* { dg-output "\nres: 0x9be02467" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_pointer_gn, NULL, code) == FFI_OK); - - res = (ffi_arg)(uintptr_t)((void*(*)(void*, void*))(code))(arg1, arg2); - /* { dg-output "\n0x12345678 0x89abcdef: 0x9be02467" } */ - printf("res: 0x%08x\n", (unsigned int) res); - /* { dg-output "\nres: 0x9be02467" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_pointer_stack.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_pointer_stack.c deleted file mode 100644 index 1f1d915..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_pointer_stack.c +++ /dev/null @@ -1,142 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check pointer arguments across multiple hideous stack frames. - Limitations: none. - PR: none. - Originator: Blake Chaffin 6/7/2007 */ - -/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ -#include "ffitest.h" - -static long dummyVar; - -long dummy_func( - long double a1, char b1, - long double a2, char b2, - long double a3, char b3, - long double a4, char b4) -{ - return a1 + b1 + a2 + b2 + a3 + b3 + a4 + b4; -} - -void* cls_pointer_fn2(void* a1, void* a2) -{ - long double trample1 = (intptr_t)a1 + (intptr_t)a2; - char trample2 = ((char*)&a1)[0] + ((char*)&a2)[0]; - long double trample3 = (intptr_t)trample1 + (intptr_t)a1; - char trample4 = trample2 + ((char*)&a1)[1]; - long double trample5 = (intptr_t)trample3 + (intptr_t)a2; - char trample6 = trample4 + ((char*)&a2)[1]; - long double trample7 = (intptr_t)trample5 + (intptr_t)trample1; - char trample8 = trample6 + trample2; - void* result; - - dummyVar = dummy_func(trample1, trample2, trample3, trample4, - trample5, trample6, trample7, trample8); - - result = (void*)((intptr_t)a1 + (intptr_t)a2); - - printf("0x%08x 0x%08x: 0x%08x\n", - (unsigned int)(uintptr_t) a1, - (unsigned int)(uintptr_t) a2, - (unsigned int)(uintptr_t) result); - - return result; -} - -void* cls_pointer_fn1(void* a1, void* a2) -{ - long double trample1 = (intptr_t)a1 + (intptr_t)a2; - char trample2 = ((char*)&a1)[0] + ((char*)&a2)[0]; - long double trample3 = (intptr_t)trample1 + (intptr_t)a1; - char trample4 = trample2 + ((char*)&a1)[1]; - long double trample5 = (intptr_t)trample3 + (intptr_t)a2; - char trample6 = trample4 + ((char*)&a2)[1]; - long double trample7 = (intptr_t)trample5 + (intptr_t)trample1; - char trample8 = trample6 + trample2; - void* result; - - dummyVar = dummy_func(trample1, trample2, trample3, trample4, - trample5, trample6, trample7, trample8); - - result = (void*)((intptr_t)a1 + (intptr_t)a2); - - printf("0x%08x 0x%08x: 0x%08x\n", - (unsigned int)(intptr_t) a1, - (unsigned int)(intptr_t) a2, - (unsigned int)(intptr_t) result); - - result = cls_pointer_fn2(result, a1); - - return result; -} - -static void -cls_pointer_gn(ffi_cif* cif __UNUSED__, void* resp, - void** args, void* userdata __UNUSED__) -{ - void* a1 = *(void**)(args[0]); - void* a2 = *(void**)(args[1]); - - long double trample1 = (intptr_t)a1 + (intptr_t)a2; - char trample2 = ((char*)&a1)[0] + ((char*)&a2)[0]; - long double trample3 = (intptr_t)trample1 + (intptr_t)a1; - char trample4 = trample2 + ((char*)&a1)[1]; - long double trample5 = (intptr_t)trample3 + (intptr_t)a2; - char trample6 = trample4 + ((char*)&a2)[1]; - long double trample7 = (intptr_t)trample5 + (intptr_t)trample1; - char trample8 = trample6 + trample2; - - dummyVar = dummy_func(trample1, trample2, trample3, trample4, - trample5, trample6, trample7, trample8); - - *(void**)resp = cls_pointer_fn1(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure* pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args[3]; - /* ffi_type cls_pointer_type; */ - ffi_type* arg_types[3]; - -/* cls_pointer_type.size = sizeof(void*); - cls_pointer_type.alignment = 0; - cls_pointer_type.type = FFI_TYPE_POINTER; - cls_pointer_type.elements = NULL;*/ - - void* arg1 = (void*)0x01234567; - void* arg2 = (void*)0x89abcdef; - ffi_arg res = 0; - - arg_types[0] = &ffi_type_pointer; - arg_types[1] = &ffi_type_pointer; - arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_pointer, - arg_types) == FFI_OK); - - args[0] = &arg1; - args[1] = &arg2; - args[2] = NULL; - - printf("\n"); - ffi_call(&cif, FFI_FN(cls_pointer_fn1), &res, args); - - printf("res: 0x%08x\n", (unsigned int) res); - /* { dg-output "\n0x01234567 0x89abcdef: 0x8acf1356" } */ - /* { dg-output "\n0x8acf1356 0x01234567: 0x8bf258bd" } */ - /* { dg-output "\nres: 0x8bf258bd" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_pointer_gn, NULL, code) == FFI_OK); - - res = (ffi_arg)(uintptr_t)((void*(*)(void*, void*))(code))(arg1, arg2); - - printf("res: 0x%08x\n", (unsigned int) res); - /* { dg-output "\n0x01234567 0x89abcdef: 0x8acf1356" } */ - /* { dg-output "\n0x8acf1356 0x01234567: 0x8bf258bd" } */ - /* { dg-output "\nres: 0x8bf258bd" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_schar.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_schar.c deleted file mode 100644 index 82986b1..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_schar.c +++ /dev/null @@ -1,44 +0,0 @@ -/* Area: closure_call - Purpose: Check return value schar. - Limitations: none. - PR: none. - Originator: 20031108 */ - - - -/* { dg-do run } */ -#include "ffitest.h" - -static void cls_ret_schar_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - *(ffi_arg*)resp = *(signed char *)args[0]; - printf("%d: %d\n",*(signed char *)args[0], - (int)*(ffi_arg *)(resp)); -} -typedef signed char (*cls_ret_schar)(signed char); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[2]; - signed char res; - - cl_arg_types[0] = &ffi_type_schar; - cl_arg_types[1] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_schar, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_schar_fn, NULL, code) == FFI_OK); - - res = (*((cls_ret_schar)code))(127); - /* { dg-output "127: 127" } */ - printf("res: %d\n", res); - /* { dg-output "\nres: 127" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_sint.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_sint.c deleted file mode 100644 index c7e13b7..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_sint.c +++ /dev/null @@ -1,42 +0,0 @@ -/* Area: closure_call - Purpose: Check return value sint32. - Limitations: none. - PR: none. - Originator: 20031108 */ - -/* { dg-do run } */ -#include "ffitest.h" - -static void cls_ret_sint_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - *(ffi_arg*)resp = *(signed int *)args[0]; - printf("%d: %d\n",*(signed int *)args[0], - (int)*(ffi_arg *)(resp)); -} -typedef signed int (*cls_ret_sint)(signed int); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[2]; - signed int res; - - cl_arg_types[0] = &ffi_type_sint; - cl_arg_types[1] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_sint, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_sint_fn, NULL, code) == FFI_OK); - - res = (*((cls_ret_sint)code))(65534); - /* { dg-output "65534: 65534" } */ - printf("res: %d\n",res); - /* { dg-output "\nres: 65534" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_sshort.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_sshort.c deleted file mode 100644 index 846d57e..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_sshort.c +++ /dev/null @@ -1,42 +0,0 @@ -/* Area: closure_call - Purpose: Check return value sshort. - Limitations: none. - PR: none. - Originator: 20031108 */ - -/* { dg-do run } */ -#include "ffitest.h" - -static void cls_ret_sshort_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - *(ffi_arg*)resp = *(signed short *)args[0]; - printf("%d: %d\n",*(signed short *)args[0], - (int)*(ffi_arg *)(resp)); -} -typedef signed short (*cls_ret_sshort)(signed short); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[2]; - signed short res; - - cl_arg_types[0] = &ffi_type_sshort; - cl_arg_types[1] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_sshort, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_sshort_fn, NULL, code) == FFI_OK); - - res = (*((cls_ret_sshort)code))(255); - /* { dg-output "255: 255" } */ - printf("res: %d\n",res); - /* { dg-output "\nres: 255" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_struct_va1.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_struct_va1.c deleted file mode 100644 index 6d1fdae..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_struct_va1.c +++ /dev/null @@ -1,114 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Test doubles passed in variable argument lists. - Limitations: none. - PR: none. - Originator: Blake Chaffin 6/6/2007 */ - -/* { dg-do run } */ -/* { dg-output "" { xfail avr32*-*-* } } */ -#include "ffitest.h" - -struct small_tag -{ - unsigned char a; - unsigned char b; -}; - -struct large_tag -{ - unsigned a; - unsigned b; - unsigned c; - unsigned d; - unsigned e; -}; - -static void -test_fn (ffi_cif* cif __UNUSED__, void* resp, - void** args, void* userdata __UNUSED__) -{ - int n = *(int*)args[0]; - struct small_tag s1 = * (struct small_tag *) args[1]; - struct large_tag l1 = * (struct large_tag *) args[2]; - struct small_tag s2 = * (struct small_tag *) args[3]; - - printf ("%d %d %d %d %d %d %d %d %d %d\n", n, s1.a, s1.b, - l1.a, l1.b, l1.c, l1.d, l1.e, - s2.a, s2.b); - * (ffi_arg*) resp = 42; -} - -int -main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc (sizeof (ffi_closure), &code); - ffi_type* arg_types[5]; - - ffi_arg res = 0; - - ffi_type s_type; - ffi_type *s_type_elements[3]; - - ffi_type l_type; - ffi_type *l_type_elements[6]; - - struct small_tag s1; - struct small_tag s2; - struct large_tag l1; - - int si; - - s_type.size = 0; - s_type.alignment = 0; - s_type.type = FFI_TYPE_STRUCT; - s_type.elements = s_type_elements; - - s_type_elements[0] = &ffi_type_uchar; - s_type_elements[1] = &ffi_type_uchar; - s_type_elements[2] = NULL; - - l_type.size = 0; - l_type.alignment = 0; - l_type.type = FFI_TYPE_STRUCT; - l_type.elements = l_type_elements; - - l_type_elements[0] = &ffi_type_uint; - l_type_elements[1] = &ffi_type_uint; - l_type_elements[2] = &ffi_type_uint; - l_type_elements[3] = &ffi_type_uint; - l_type_elements[4] = &ffi_type_uint; - l_type_elements[5] = NULL; - - arg_types[0] = &ffi_type_sint; - arg_types[1] = &s_type; - arg_types[2] = &l_type; - arg_types[3] = &s_type; - arg_types[4] = NULL; - - CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 4, &ffi_type_sint, - arg_types) == FFI_OK); - - si = 4; - s1.a = 5; - s1.b = 6; - - s2.a = 20; - s2.b = 21; - - l1.a = 10; - l1.b = 11; - l1.c = 12; - l1.d = 13; - l1.e = 14; - - CHECK(ffi_prep_closure_loc(pcl, &cif, test_fn, NULL, code) == FFI_OK); - - res = ((int (*)(int, ...))(code))(si, s1, l1, s2); - /* { dg-output "4 5 6 10 11 12 13 14 20 21" } */ - printf("res: %d\n", (int) res); - /* { dg-output "\nres: 42" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uchar.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uchar.c deleted file mode 100644 index c1317e7..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uchar.c +++ /dev/null @@ -1,42 +0,0 @@ -/* Area: closure_call - Purpose: Check return value uchar. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -static void cls_ret_uchar_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - *(ffi_arg*)resp = *(unsigned char *)args[0]; - printf("%d: %d\n",*(unsigned char *)args[0], - (int)*(ffi_arg *)(resp)); -} -typedef unsigned char (*cls_ret_uchar)(unsigned char); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[2]; - unsigned char res; - - cl_arg_types[0] = &ffi_type_uchar; - cl_arg_types[1] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_uchar, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_uchar_fn, NULL, code) == FFI_OK); - - res = (*((cls_ret_uchar)code))(127); - /* { dg-output "127: 127" } */ - printf("res: %d\n",res); - /* { dg-output "\nres: 127" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uchar_va.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uchar_va.c deleted file mode 100644 index 6491c5b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uchar_va.c +++ /dev/null @@ -1,44 +0,0 @@ -/* Area: closure_call - Purpose: Test anonymous unsigned char argument. - Limitations: none. - PR: none. - Originator: ARM Ltd. */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef unsigned char T; - -static void cls_ret_T_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) - { - *(ffi_arg *)resp = *(T *)args[0]; - - printf("%d: %d %d\n", (int)(*(ffi_arg *)resp), *(T *)args[0], *(T *)args[1]); - } - -typedef T (*cls_ret_T)(T, ...); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[3]; - T res; - - cl_arg_types[0] = &ffi_type_uchar; - cl_arg_types[1] = &ffi_type_uchar; - cl_arg_types[2] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2, - &ffi_type_uchar, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_T_fn, NULL, code) == FFI_OK); - res = ((((cls_ret_T)code)(67, 4))); - /* { dg-output "67: 67 4" } */ - printf("res: %d\n", res); - /* { dg-output "\nres: 67" } */ - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint.c deleted file mode 100644 index 885cff5..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint.c +++ /dev/null @@ -1,43 +0,0 @@ -/* Area: closure_call - Purpose: Check return value uint. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -static void cls_ret_uint_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - *(ffi_arg *)resp = *(unsigned int *)args[0]; - - printf("%d: %d\n",*(unsigned int *)args[0], - (int)*(ffi_arg *)(resp)); -} -typedef unsigned int (*cls_ret_uint)(unsigned int); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[2]; - unsigned int res; - - cl_arg_types[0] = &ffi_type_uint; - cl_arg_types[1] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_uint, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_uint_fn, NULL, code) == FFI_OK); - - res = (*((cls_ret_uint)code))(2147483647); - /* { dg-output "2147483647: 2147483647" } */ - printf("res: %d\n",res); - /* { dg-output "\nres: 2147483647" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint_va.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint_va.c deleted file mode 100644 index b04cfd1..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint_va.c +++ /dev/null @@ -1,45 +0,0 @@ -/* Area: closure_call - Purpose: Test anonymous unsigned int argument. - Limitations: none. - PR: none. - Originator: ARM Ltd. */ - -/* { dg-do run } */ - -#include "ffitest.h" - -typedef unsigned int T; - -static void cls_ret_T_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) - { - *(ffi_arg *)resp = *(T *)args[0]; - - printf("%d: %d %d\n", (int)*(ffi_arg *)resp, *(T *)args[0], *(T *)args[1]); - } - -typedef T (*cls_ret_T)(T, ...); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[3]; - T res; - - cl_arg_types[0] = &ffi_type_uint; - cl_arg_types[1] = &ffi_type_uint; - cl_arg_types[2] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2, - &ffi_type_uint, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_T_fn, NULL, code) == FFI_OK); - res = ((((cls_ret_T)code)(67, 4))); - /* { dg-output "67: 67 4" } */ - printf("res: %d\n", res); - /* { dg-output "\nres: 67" } */ - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulong_va.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulong_va.c deleted file mode 100644 index 0315082..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulong_va.c +++ /dev/null @@ -1,45 +0,0 @@ -/* Area: closure_call - Purpose: Test anonymous unsigned long argument. - Limitations: none. - PR: none. - Originator: ARM Ltd. */ - -/* { dg-do run } */ - -#include "ffitest.h" - -typedef unsigned long T; - -static void cls_ret_T_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) - { - *(T *)resp = *(T *)args[0]; - - printf("%ld: %ld %ld\n", *(T *)resp, *(T *)args[0], *(T *)args[1]); - } - -typedef T (*cls_ret_T)(T, ...); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[3]; - T res; - - cl_arg_types[0] = &ffi_type_ulong; - cl_arg_types[1] = &ffi_type_ulong; - cl_arg_types[2] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2, - &ffi_type_ulong, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_T_fn, NULL, code) == FFI_OK); - res = ((((cls_ret_T)code)(67, 4))); - /* { dg-output "67: 67 4" } */ - printf("res: %ld\n", res); - /* { dg-output "\nres: 67" } */ - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulonglong.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulonglong.c deleted file mode 100644 index 62f2cae..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulonglong.c +++ /dev/null @@ -1,47 +0,0 @@ -/* Area: closure_call - Purpose: Check return value long long. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -/* { dg-options "-Wno-format" { target alpha*-dec-osf* } } */ -#include "ffitest.h" - -static void cls_ret_ulonglong_fn(ffi_cif* cif __UNUSED__, void* resp, - void** args, void* userdata __UNUSED__) -{ - *(unsigned long long *)resp= 0xfffffffffffffffLL ^ *(unsigned long long *)args[0]; - - printf("%" PRIuLL ": %" PRIuLL "\n",*(unsigned long long *)args[0], - *(unsigned long long *)(resp)); -} -typedef unsigned long long (*cls_ret_ulonglong)(unsigned long long); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[2]; - unsigned long long res; - - cl_arg_types[0] = &ffi_type_uint64; - cl_arg_types[1] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_uint64, cl_arg_types) == FFI_OK); - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_ulonglong_fn, NULL, code) == FFI_OK); - res = (*((cls_ret_ulonglong)code))(214LL); - /* { dg-output "214: 1152921504606846761" } */ - printf("res: %" PRIdLL "\n", res); - /* { dg-output "\nres: 1152921504606846761" } */ - - res = (*((cls_ret_ulonglong)code))(9223372035854775808LL); - /* { dg-output "\n9223372035854775808: 8070450533247928831" } */ - printf("res: %" PRIdLL "\n", res); - /* { dg-output "\nres: 8070450533247928831" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ushort.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ushort.c deleted file mode 100644 index a00100e..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ushort.c +++ /dev/null @@ -1,43 +0,0 @@ -/* Area: closure_call - Purpose: Check return value ushort. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -static void cls_ret_ushort_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - *(ffi_arg*)resp = *(unsigned short *)args[0]; - - printf("%d: %d\n",*(unsigned short *)args[0], - (int)*(ffi_arg *)(resp)); -} -typedef unsigned short (*cls_ret_ushort)(unsigned short); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[2]; - unsigned short res; - - cl_arg_types[0] = &ffi_type_ushort; - cl_arg_types[1] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_ushort, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_ushort_fn, NULL, code) == FFI_OK); - - res = (*((cls_ret_ushort)code))(65535); - /* { dg-output "65535: 65535" } */ - printf("res: %d\n",res); - /* { dg-output "\nres: 65535" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ushort_va.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ushort_va.c deleted file mode 100644 index 37aa106..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ushort_va.c +++ /dev/null @@ -1,44 +0,0 @@ -/* Area: closure_call - Purpose: Test anonymous unsigned short argument. - Limitations: none. - PR: none. - Originator: ARM Ltd. */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef unsigned short T; - -static void cls_ret_T_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) - { - *(ffi_arg *)resp = *(T *)args[0]; - - printf("%d: %d %d\n", (int)(*(ffi_arg *)resp), *(T *)args[0], *(T *)args[1]); - } - -typedef T (*cls_ret_T)(T, ...); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[3]; - T res; - - cl_arg_types[0] = &ffi_type_ushort; - cl_arg_types[1] = &ffi_type_ushort; - cl_arg_types[2] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2, - &ffi_type_ushort, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_T_fn, NULL, code) == FFI_OK); - res = ((((cls_ret_T)code)(67, 4))); - /* { dg-output "67: 67 4" } */ - printf("res: %d\n", res); - /* { dg-output "\nres: 67" } */ - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/err_bad_abi.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/err_bad_abi.c deleted file mode 100644 index f5a7317..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/err_bad_abi.c +++ /dev/null @@ -1,36 +0,0 @@ -/* Area: ffi_prep_cif, ffi_prep_closure - Purpose: Test error return for bad ABIs. - Limitations: none. - PR: none. - Originator: Blake Chaffin 6/6/2007 */ - -/* { dg-do run } */ - -#include "ffitest.h" - -static void -dummy_fn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__, - void** args __UNUSED__, void* userdata __UNUSED__) -{} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type* arg_types[1]; - - arg_types[0] = NULL; - - CHECK(ffi_prep_cif(&cif, 255, 0, &ffi_type_void, - arg_types) == FFI_BAD_ABI); - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0, &ffi_type_void, - arg_types) == FFI_OK); - - cif.abi= 255; - - CHECK(ffi_prep_closure_loc(pcl, &cif, dummy_fn, NULL, code) == FFI_BAD_ABI); - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/ffitest.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/ffitest.h deleted file mode 100644 index cfce1ad..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/ffitest.h +++ /dev/null @@ -1,138 +0,0 @@ -#include -#include -#include -#include -#include -#include "fficonfig.h" - -#if defined HAVE_STDINT_H -#include -#endif - -#if defined HAVE_INTTYPES_H -#include -#endif - -#define MAX_ARGS 256 - -#define CHECK(x) (void)(!(x) ? (abort(), 1) : 0) - -/* Define macros so that compilers other than gcc can run the tests. */ -#undef __UNUSED__ -#if defined(__GNUC__) -#define __UNUSED__ __attribute__((__unused__)) -#define __STDCALL__ __attribute__((stdcall)) -#define __THISCALL__ __attribute__((thiscall)) -#define __FASTCALL__ __attribute__((fastcall)) -#define __MSABI__ __attribute__((ms_abi)) -#else -#define __UNUSED__ -#define __STDCALL__ __stdcall -#define __THISCALL__ __thiscall -#define __FASTCALL__ __fastcall -#endif - -#ifndef ABI_NUM -#define ABI_NUM FFI_DEFAULT_ABI -#define ABI_ATTR -#endif - -/* Prefer MAP_ANON(YMOUS) to /dev/zero, since we don't need to keep a - file open. */ -#ifdef HAVE_MMAP_ANON -# undef HAVE_MMAP_DEV_ZERO - -# include -# ifndef MAP_FAILED -# define MAP_FAILED -1 -# endif -# if !defined (MAP_ANONYMOUS) && defined (MAP_ANON) -# define MAP_ANONYMOUS MAP_ANON -# endif -# define USING_MMAP - -#endif - -#ifdef HAVE_MMAP_DEV_ZERO - -# include -# ifndef MAP_FAILED -# define MAP_FAILED -1 -# endif -# define USING_MMAP - -#endif - -/* MinGW kludge. */ -#if defined(_WIN64) | defined(_WIN32) -#define PRIdLL "I64d" -#define PRIuLL "I64u" -#else -#define PRIdLL "lld" -#define PRIuLL "llu" -#endif - -/* Tru64 UNIX kludge. */ -#if defined(__alpha__) && defined(__osf__) -/* Tru64 UNIX V4.0 doesn't support %lld/%lld, but long is 64-bit. */ -#undef PRIdLL -#define PRIdLL "ld" -#undef PRIuLL -#define PRIuLL "lu" -#define PRId8 "hd" -#define PRIu8 "hu" -#define PRId64 "ld" -#define PRIu64 "lu" -#define PRIuPTR "lu" -#endif - -/* PA HP-UX kludge. */ -#if defined(__hppa__) && defined(__hpux__) && !defined(PRIuPTR) -#define PRIuPTR "lu" -#endif - -/* IRIX kludge. */ -#if defined(__sgi) -/* IRIX 6.5 provides all definitions, but only for C99 - compilations. */ -#define PRId8 "hhd" -#define PRIu8 "hhu" -#if (_MIPS_SZLONG == 32) -#define PRId64 "lld" -#define PRIu64 "llu" -#endif -/* This doesn't match , which always has "lld" here, but the - arguments are uint64_t, int64_t, which are unsigned long, long for - 64-bit in . */ -#if (_MIPS_SZLONG == 64) -#define PRId64 "ld" -#define PRIu64 "lu" -#endif -/* This doesn't match , which has "u" here, but the arguments - are uintptr_t, which is always unsigned long. */ -#define PRIuPTR "lu" -#endif - -/* Solaris < 10 kludge. */ -#if defined(__sun__) && defined(__svr4__) && !defined(PRIuPTR) -#if defined(__arch64__) || defined (__x86_64__) -#define PRIuPTR "lu" -#else -#define PRIuPTR "u" -#endif -#endif - -/* MSVC kludge. */ -#if defined _MSC_VER -#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) -#define PRIuPTR "lu" -#define PRIu8 "u" -#define PRId8 "d" -#define PRIu64 "I64u" -#define PRId64 "I64d" -#endif -#endif - -#ifndef PRIuPTR -#define PRIuPTR "u" -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/huge_struct.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/huge_struct.c deleted file mode 100644 index e8e1d86..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/huge_struct.c +++ /dev/null @@ -1,343 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check large structure returns. - Limitations: none. - PR: none. - Originator: Blake Chaffin 6/18/2007 -*/ - -/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ -/* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */ -/* { dg-options -Wformat=0 { target moxie*-*-elf or1k-*-* } } */ - -#include - -#include "ffitest.h" - -typedef struct BigStruct{ - uint8_t a; - int8_t b; - uint16_t c; - int16_t d; - uint32_t e; - int32_t f; - uint64_t g; - int64_t h; - float i; - double j; - long double k; - char* l; - uint8_t m; - int8_t n; - uint16_t o; - int16_t p; - uint32_t q; - int32_t r; - uint64_t s; - int64_t t; - float u; - double v; - long double w; - char* x; - uint8_t y; - int8_t z; - uint16_t aa; - int16_t bb; - uint32_t cc; - int32_t dd; - uint64_t ee; - int64_t ff; - float gg; - double hh; - long double ii; - char* jj; - uint8_t kk; - int8_t ll; - uint16_t mm; - int16_t nn; - uint32_t oo; - int32_t pp; - uint64_t qq; - int64_t rr; - float ss; - double tt; - long double uu; - char* vv; - uint8_t ww; - int8_t xx; -} BigStruct; - -BigStruct -test_large_fn( - uint8_t ui8_1, - int8_t si8_1, - uint16_t ui16_1, - int16_t si16_1, - uint32_t ui32_1, - int32_t si32_1, - uint64_t ui64_1, - int64_t si64_1, - float f_1, - double d_1, - long double ld_1, - char* p_1, - uint8_t ui8_2, - int8_t si8_2, - uint16_t ui16_2, - int16_t si16_2, - uint32_t ui32_2, - int32_t si32_2, - uint64_t ui64_2, - int64_t si64_2, - float f_2, - double d_2, - long double ld_2, - char* p_2, - uint8_t ui8_3, - int8_t si8_3, - uint16_t ui16_3, - int16_t si16_3, - uint32_t ui32_3, - int32_t si32_3, - uint64_t ui64_3, - int64_t si64_3, - float f_3, - double d_3, - long double ld_3, - char* p_3, - uint8_t ui8_4, - int8_t si8_4, - uint16_t ui16_4, - int16_t si16_4, - uint32_t ui32_4, - int32_t si32_4, - uint64_t ui64_4, - int64_t si64_4, - float f_4, - double d_4, - long double ld_4, - char* p_4, - uint8_t ui8_5, - int8_t si8_5) -{ - BigStruct retVal = { - ui8_1 + 1, si8_1 + 1, ui16_1 + 1, si16_1 + 1, ui32_1 + 1, si32_1 + 1, - ui64_1 + 1, si64_1 + 1, f_1 + 1, d_1 + 1, ld_1 + 1, (char*)((intptr_t)p_1 + 1), - ui8_2 + 2, si8_2 + 2, ui16_2 + 2, si16_2 + 2, ui32_2 + 2, si32_2 + 2, - ui64_2 + 2, si64_2 + 2, f_2 + 2, d_2 + 2, ld_2 + 2, (char*)((intptr_t)p_2 + 2), - ui8_3 + 3, si8_3 + 3, ui16_3 + 3, si16_3 + 3, ui32_3 + 3, si32_3 + 3, - ui64_3 + 3, si64_3 + 3, f_3 + 3, d_3 + 3, ld_3 + 3, (char*)((intptr_t)p_3 + 3), - ui8_4 + 4, si8_4 + 4, ui16_4 + 4, si16_4 + 4, ui32_4 + 4, si32_4 + 4, - ui64_4 + 4, si64_4 + 4, f_4 + 4, d_4 + 4, ld_4 + 4, (char*)((intptr_t)p_4 + 4), - ui8_5 + 5, si8_5 + 5}; - - printf("%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx " - "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx " - "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx " - "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx %" PRIu8 " %" PRId8 ": " - "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx " - "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx " - "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx " - "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx %" PRIu8 " %" PRId8 "\n", - ui8_1, si8_1, ui16_1, si16_1, ui32_1, si32_1, ui64_1, si64_1, f_1, d_1, ld_1, (unsigned long)p_1, - ui8_2, si8_2, ui16_2, si16_2, ui32_2, si32_2, ui64_2, si64_2, f_2, d_2, ld_2, (unsigned long)p_2, - ui8_3, si8_3, ui16_3, si16_3, ui32_3, si32_3, ui64_3, si64_3, f_3, d_3, ld_3, (unsigned long)p_3, - ui8_4, si8_4, ui16_4, si16_4, ui32_4, si32_4, ui64_4, si64_4, f_4, d_4, ld_4, (unsigned long)p_4, ui8_5, si8_5, - retVal.a, retVal.b, retVal.c, retVal.d, retVal.e, retVal.f, - retVal.g, retVal.h, retVal.i, retVal.j, retVal.k, (unsigned long)retVal.l, - retVal.m, retVal.n, retVal.o, retVal.p, retVal.q, retVal.r, - retVal.s, retVal.t, retVal.u, retVal.v, retVal.w, (unsigned long)retVal.x, - retVal.y, retVal.z, retVal.aa, retVal.bb, retVal.cc, retVal.dd, - retVal.ee, retVal.ff, retVal.gg, retVal.hh, retVal.ii, (unsigned long)retVal.jj, - retVal.kk, retVal.ll, retVal.mm, retVal.nn, retVal.oo, retVal.pp, - retVal.qq, retVal.rr, retVal.ss, retVal.tt, retVal.uu, (unsigned long)retVal.vv, retVal.ww, retVal.xx); - - return retVal; -} - -static void -cls_large_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) -{ - uint8_t ui8_1 = *(uint8_t*)args[0]; - int8_t si8_1 = *(int8_t*)args[1]; - uint16_t ui16_1 = *(uint16_t*)args[2]; - int16_t si16_1 = *(int16_t*)args[3]; - uint32_t ui32_1 = *(uint32_t*)args[4]; - int32_t si32_1 = *(int32_t*)args[5]; - uint64_t ui64_1 = *(uint64_t*)args[6]; - int64_t si64_1 = *(int64_t*)args[7]; - float f_1 = *(float*)args[8]; - double d_1 = *(double*)args[9]; - long double ld_1 = *(long double*)args[10]; - char* p_1 = *(char**)args[11]; - uint8_t ui8_2 = *(uint8_t*)args[12]; - int8_t si8_2 = *(int8_t*)args[13]; - uint16_t ui16_2 = *(uint16_t*)args[14]; - int16_t si16_2 = *(int16_t*)args[15]; - uint32_t ui32_2 = *(uint32_t*)args[16]; - int32_t si32_2 = *(int32_t*)args[17]; - uint64_t ui64_2 = *(uint64_t*)args[18]; - int64_t si64_2 = *(int64_t*)args[19]; - float f_2 = *(float*)args[20]; - double d_2 = *(double*)args[21]; - long double ld_2 = *(long double*)args[22]; - char* p_2 = *(char**)args[23]; - uint8_t ui8_3 = *(uint8_t*)args[24]; - int8_t si8_3 = *(int8_t*)args[25]; - uint16_t ui16_3 = *(uint16_t*)args[26]; - int16_t si16_3 = *(int16_t*)args[27]; - uint32_t ui32_3 = *(uint32_t*)args[28]; - int32_t si32_3 = *(int32_t*)args[29]; - uint64_t ui64_3 = *(uint64_t*)args[30]; - int64_t si64_3 = *(int64_t*)args[31]; - float f_3 = *(float*)args[32]; - double d_3 = *(double*)args[33]; - long double ld_3 = *(long double*)args[34]; - char* p_3 = *(char**)args[35]; - uint8_t ui8_4 = *(uint8_t*)args[36]; - int8_t si8_4 = *(int8_t*)args[37]; - uint16_t ui16_4 = *(uint16_t*)args[38]; - int16_t si16_4 = *(int16_t*)args[39]; - uint32_t ui32_4 = *(uint32_t*)args[40]; - int32_t si32_4 = *(int32_t*)args[41]; - uint64_t ui64_4 = *(uint64_t*)args[42]; - int64_t si64_4 = *(int64_t*)args[43]; - float f_4 = *(float*)args[44]; - double d_4 = *(double*)args[45]; - long double ld_4 = *(long double*)args[46]; - char* p_4 = *(char**)args[47]; - uint8_t ui8_5 = *(uint8_t*)args[48]; - int8_t si8_5 = *(int8_t*)args[49]; - - *(BigStruct*)resp = test_large_fn( - ui8_1, si8_1, ui16_1, si16_1, ui32_1, si32_1, ui64_1, si64_1, f_1, d_1, ld_1, p_1, - ui8_2, si8_2, ui16_2, si16_2, ui32_2, si32_2, ui64_2, si64_2, f_2, d_2, ld_2, p_2, - ui8_3, si8_3, ui16_3, si16_3, ui32_3, si32_3, ui64_3, si64_3, f_3, d_3, ld_3, p_3, - ui8_4, si8_4, ui16_4, si16_4, ui32_4, si32_4, ui64_4, si64_4, f_4, d_4, ld_4, p_4, - ui8_5, si8_5); -} - -int -main(int argc __UNUSED__, const char** argv __UNUSED__) -{ - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - - ffi_cif cif; - ffi_type* argTypes[51]; - void* argValues[51]; - - ffi_type ret_struct_type; - ffi_type* st_fields[51]; - BigStruct retVal; - - uint8_t ui8 = 1; - int8_t si8 = 2; - uint16_t ui16 = 3; - int16_t si16 = 4; - uint32_t ui32 = 5; - int32_t si32 = 6; - uint64_t ui64 = 7; - int64_t si64 = 8; - float f = 9; - double d = 10; - long double ld = 11; - char* p = (char*)0x12345678; - - memset (&retVal, 0, sizeof(retVal)); - - ret_struct_type.size = 0; - ret_struct_type.alignment = 0; - ret_struct_type.type = FFI_TYPE_STRUCT; - ret_struct_type.elements = st_fields; - - st_fields[0] = st_fields[12] = st_fields[24] = st_fields[36] = st_fields[48] = &ffi_type_uint8; - st_fields[1] = st_fields[13] = st_fields[25] = st_fields[37] = st_fields[49] = &ffi_type_sint8; - st_fields[2] = st_fields[14] = st_fields[26] = st_fields[38] = &ffi_type_uint16; - st_fields[3] = st_fields[15] = st_fields[27] = st_fields[39] = &ffi_type_sint16; - st_fields[4] = st_fields[16] = st_fields[28] = st_fields[40] = &ffi_type_uint32; - st_fields[5] = st_fields[17] = st_fields[29] = st_fields[41] = &ffi_type_sint32; - st_fields[6] = st_fields[18] = st_fields[30] = st_fields[42] = &ffi_type_uint64; - st_fields[7] = st_fields[19] = st_fields[31] = st_fields[43] = &ffi_type_sint64; - st_fields[8] = st_fields[20] = st_fields[32] = st_fields[44] = &ffi_type_float; - st_fields[9] = st_fields[21] = st_fields[33] = st_fields[45] = &ffi_type_double; - st_fields[10] = st_fields[22] = st_fields[34] = st_fields[46] = &ffi_type_longdouble; - st_fields[11] = st_fields[23] = st_fields[35] = st_fields[47] = &ffi_type_pointer; - - st_fields[50] = NULL; - - argTypes[0] = argTypes[12] = argTypes[24] = argTypes[36] = argTypes[48] = &ffi_type_uint8; - argValues[0] = argValues[12] = argValues[24] = argValues[36] = argValues[48] = &ui8; - argTypes[1] = argTypes[13] = argTypes[25] = argTypes[37] = argTypes[49] = &ffi_type_sint8; - argValues[1] = argValues[13] = argValues[25] = argValues[37] = argValues[49] = &si8; - argTypes[2] = argTypes[14] = argTypes[26] = argTypes[38] = &ffi_type_uint16; - argValues[2] = argValues[14] = argValues[26] = argValues[38] = &ui16; - argTypes[3] = argTypes[15] = argTypes[27] = argTypes[39] = &ffi_type_sint16; - argValues[3] = argValues[15] = argValues[27] = argValues[39] = &si16; - argTypes[4] = argTypes[16] = argTypes[28] = argTypes[40] = &ffi_type_uint32; - argValues[4] = argValues[16] = argValues[28] = argValues[40] = &ui32; - argTypes[5] = argTypes[17] = argTypes[29] = argTypes[41] = &ffi_type_sint32; - argValues[5] = argValues[17] = argValues[29] = argValues[41] = &si32; - argTypes[6] = argTypes[18] = argTypes[30] = argTypes[42] = &ffi_type_uint64; - argValues[6] = argValues[18] = argValues[30] = argValues[42] = &ui64; - argTypes[7] = argTypes[19] = argTypes[31] = argTypes[43] = &ffi_type_sint64; - argValues[7] = argValues[19] = argValues[31] = argValues[43] = &si64; - argTypes[8] = argTypes[20] = argTypes[32] = argTypes[44] = &ffi_type_float; - argValues[8] = argValues[20] = argValues[32] = argValues[44] = &f; - argTypes[9] = argTypes[21] = argTypes[33] = argTypes[45] = &ffi_type_double; - argValues[9] = argValues[21] = argValues[33] = argValues[45] = &d; - argTypes[10] = argTypes[22] = argTypes[34] = argTypes[46] = &ffi_type_longdouble; - argValues[10] = argValues[22] = argValues[34] = argValues[46] = &ld; - argTypes[11] = argTypes[23] = argTypes[35] = argTypes[47] = &ffi_type_pointer; - argValues[11] = argValues[23] = argValues[35] = argValues[47] = &p; - - argTypes[50] = NULL; - argValues[50] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 50, &ret_struct_type, argTypes) == FFI_OK); - - ffi_call(&cif, FFI_FN(test_large_fn), &retVal, argValues); - /* { dg-output "1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2: 2 3 4 5 6 7 8 9 10 11 12 0x12345679 3 4 5 6 7 8 9 10 11 12 13 0x1234567a 4 5 6 7 8 9 10 11 12 13 14 0x1234567b 5 6 7 8 9 10 11 12 13 14 15 0x1234567c 6 7" } */ - printf("res: %" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx " - "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx " - "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx " - "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx %" PRIu8 " %" PRId8 "\n", - retVal.a, retVal.b, retVal.c, retVal.d, retVal.e, retVal.f, - retVal.g, retVal.h, retVal.i, retVal.j, retVal.k, (unsigned long)retVal.l, - retVal.m, retVal.n, retVal.o, retVal.p, retVal.q, retVal.r, - retVal.s, retVal.t, retVal.u, retVal.v, retVal.w, (unsigned long)retVal.x, - retVal.y, retVal.z, retVal.aa, retVal.bb, retVal.cc, retVal.dd, - retVal.ee, retVal.ff, retVal.gg, retVal.hh, retVal.ii, (unsigned long)retVal.jj, - retVal.kk, retVal.ll, retVal.mm, retVal.nn, retVal.oo, retVal.pp, - retVal.qq, retVal.rr, retVal.ss, retVal.tt, retVal.uu, (unsigned long)retVal.vv, retVal.ww, retVal.xx); - /* { dg-output "\nres: 2 3 4 5 6 7 8 9 10 11 12 0x12345679 3 4 5 6 7 8 9 10 11 12 13 0x1234567a 4 5 6 7 8 9 10 11 12 13 14 0x1234567b 5 6 7 8 9 10 11 12 13 14 15 0x1234567c 6 7" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_large_fn, NULL, code) == FFI_OK); - - retVal = ((BigStruct(*)( - uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t, float, double, long double, char*, - uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t, float, double, long double, char*, - uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t, float, double, long double, char*, - uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t, float, double, long double, char*, - uint8_t, int8_t))(code))( - ui8, si8, ui16, si16, ui32, si32, ui64, si64, f, d, ld, p, - ui8, si8, ui16, si16, ui32, si32, ui64, si64, f, d, ld, p, - ui8, si8, ui16, si16, ui32, si32, ui64, si64, f, d, ld, p, - ui8, si8, ui16, si16, ui32, si32, ui64, si64, f, d, ld, p, - ui8, si8); - /* { dg-output "\n1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2: 2 3 4 5 6 7 8 9 10 11 12 0x12345679 3 4 5 6 7 8 9 10 11 12 13 0x1234567a 4 5 6 7 8 9 10 11 12 13 14 0x1234567b 5 6 7 8 9 10 11 12 13 14 15 0x1234567c 6 7" } */ - printf("res: %" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx " - "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx " - "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx " - "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx %" PRIu8 " %" PRId8 "\n", - retVal.a, retVal.b, retVal.c, retVal.d, retVal.e, retVal.f, - retVal.g, retVal.h, retVal.i, retVal.j, retVal.k, (unsigned long)retVal.l, - retVal.m, retVal.n, retVal.o, retVal.p, retVal.q, retVal.r, - retVal.s, retVal.t, retVal.u, retVal.v, retVal.w, (unsigned long)retVal.x, - retVal.y, retVal.z, retVal.aa, retVal.bb, retVal.cc, retVal.dd, - retVal.ee, retVal.ff, retVal.gg, retVal.hh, retVal.ii, (unsigned long)retVal.jj, - retVal.kk, retVal.ll, retVal.mm, retVal.nn, retVal.oo, retVal.pp, - retVal.qq, retVal.rr, retVal.ss, retVal.tt, retVal.uu, (unsigned long)retVal.vv, retVal.ww, retVal.xx); - /* { dg-output "\nres: 2 3 4 5 6 7 8 9 10 11 12 0x12345679 3 4 5 6 7 8 9 10 11 12 13 0x1234567a 4 5 6 7 8 9 10 11 12 13 14 0x1234567b 5 6 7 8 9 10 11 12 13 14 15 0x1234567c 6 7" } */ - - return 0; -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct.c deleted file mode 100644 index c15e3a0..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct.c +++ /dev/null @@ -1,152 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Contains structs as parameter of the struct itself. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_16byte1 { - double a; - float b; - int c; -} cls_struct_16byte1; - -typedef struct cls_struct_16byte2 { - int ii; - double dd; - float ff; -} cls_struct_16byte2; - -typedef struct cls_struct_combined { - cls_struct_16byte1 d; - cls_struct_16byte2 e; -} cls_struct_combined; - -cls_struct_combined cls_struct_combined_fn(struct cls_struct_16byte1 b0, - struct cls_struct_16byte2 b1, - struct cls_struct_combined b2) -{ - struct cls_struct_combined result; - - result.d.a = b0.a + b1.dd + b2.d.a; - result.d.b = b0.b + b1.ff + b2.d.b; - result.d.c = b0.c + b1.ii + b2.d.c; - result.e.ii = b0.c + b1.ii + b2.e.ii; - result.e.dd = b0.a + b1.dd + b2.e.dd; - result.e.ff = b0.b + b1.ff + b2.e.ff; - - printf("%g %g %d %d %g %g %g %g %d %d %g %g: %g %g %d %d %g %g\n", - b0.a, b0.b, b0.c, - b1.ii, b1.dd, b1.ff, - b2.d.a, b2.d.b, b2.d.c, - b2.e.ii, b2.e.dd, b2.e.ff, - result.d.a, result.d.b, result.d.c, - result.e.ii, result.e.dd, result.e.ff); - - return result; -} - -static void -cls_struct_combined_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - struct cls_struct_16byte1 b0; - struct cls_struct_16byte2 b1; - struct cls_struct_combined b2; - - b0 = *(struct cls_struct_16byte1*)(args[0]); - b1 = *(struct cls_struct_16byte2*)(args[1]); - b2 = *(struct cls_struct_combined*)(args[2]); - - - *(cls_struct_combined*)resp = cls_struct_combined_fn(b0, b1, b2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[5]; - ffi_type* cls_struct_fields1[5]; - ffi_type* cls_struct_fields2[5]; - ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_16byte1 e_dbl = { 9.0, 2.0, 6}; - struct cls_struct_16byte2 f_dbl = { 1, 2.0, 3.0}; - struct cls_struct_combined g_dbl = {{4.0, 5.0, 6}, - {3, 1.0, 8.0}}; - struct cls_struct_combined res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_type1.size = 0; - cls_struct_type1.alignment = 0; - cls_struct_type1.type = FFI_TYPE_STRUCT; - cls_struct_type1.elements = cls_struct_fields1; - - cls_struct_type2.size = 0; - cls_struct_type2.alignment = 0; - cls_struct_type2.type = FFI_TYPE_STRUCT; - cls_struct_type2.elements = cls_struct_fields2; - - cls_struct_fields[0] = &ffi_type_double; - cls_struct_fields[1] = &ffi_type_float; - cls_struct_fields[2] = &ffi_type_sint; - cls_struct_fields[3] = NULL; - - cls_struct_fields1[0] = &ffi_type_sint; - cls_struct_fields1[1] = &ffi_type_double; - cls_struct_fields1[2] = &ffi_type_float; - cls_struct_fields1[3] = NULL; - - cls_struct_fields2[0] = &cls_struct_type; - cls_struct_fields2[1] = &cls_struct_type1; - cls_struct_fields2[2] = NULL; - - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type1; - dbl_arg_types[2] = &cls_struct_type2; - dbl_arg_types[3] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &cls_struct_type2, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &e_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = &g_dbl; - args_dbl[3] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_combined_fn), &res_dbl, args_dbl); - /* { dg-output "9 2 6 1 2 3 4 5 6 3 1 8: 15 10 13 10 12 13" } */ - CHECK( res_dbl.d.a == (e_dbl.a + f_dbl.dd + g_dbl.d.a)); - CHECK( res_dbl.d.b == (e_dbl.b + f_dbl.ff + g_dbl.d.b)); - CHECK( res_dbl.d.c == (e_dbl.c + f_dbl.ii + g_dbl.d.c)); - CHECK( res_dbl.e.ii == (e_dbl.c + f_dbl.ii + g_dbl.e.ii)); - CHECK( res_dbl.e.dd == (e_dbl.a + f_dbl.dd + g_dbl.e.dd)); - CHECK( res_dbl.e.ff == (e_dbl.b + f_dbl.ff + g_dbl.e.ff)); - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_combined_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_combined(*)(cls_struct_16byte1, - cls_struct_16byte2, - cls_struct_combined)) - (code))(e_dbl, f_dbl, g_dbl); - /* { dg-output "\n9 2 6 1 2 3 4 5 6 3 1 8: 15 10 13 10 12 13" } */ - CHECK( res_dbl.d.a == (e_dbl.a + f_dbl.dd + g_dbl.d.a)); - CHECK( res_dbl.d.b == (e_dbl.b + f_dbl.ff + g_dbl.d.b)); - CHECK( res_dbl.d.c == (e_dbl.c + f_dbl.ii + g_dbl.d.c)); - CHECK( res_dbl.e.ii == (e_dbl.c + f_dbl.ii + g_dbl.e.ii)); - CHECK( res_dbl.e.dd == (e_dbl.a + f_dbl.dd + g_dbl.e.dd)); - CHECK( res_dbl.e.ff == (e_dbl.b + f_dbl.ff + g_dbl.e.ff)); - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct1.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct1.c deleted file mode 100644 index 477a6b9..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct1.c +++ /dev/null @@ -1,161 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Contains structs as parameter of the struct itself. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_16byte1 { - double a; - float b; - int c; -} cls_struct_16byte1; - -typedef struct cls_struct_16byte2 { - int ii; - double dd; - float ff; -} cls_struct_16byte2; - -typedef struct cls_struct_combined { - cls_struct_16byte1 d; - cls_struct_16byte2 e; -} cls_struct_combined; - -cls_struct_combined cls_struct_combined_fn(struct cls_struct_16byte1 b0, - struct cls_struct_16byte2 b1, - struct cls_struct_combined b2, - struct cls_struct_16byte1 b3) -{ - struct cls_struct_combined result; - - result.d.a = b0.a + b1.dd + b2.d.a; - result.d.b = b0.b + b1.ff + b2.d.b; - result.d.c = b0.c + b1.ii + b2.d.c; - result.e.ii = b0.c + b1.ii + b2.e.ii; - result.e.dd = b0.a + b1.dd + b2.e.dd; - result.e.ff = b0.b + b1.ff + b2.e.ff; - - printf("%g %g %d %d %g %g %g %g %d %d %g %g %g %g %d: %g %g %d %d %g %g\n", - b0.a, b0.b, b0.c, - b1.ii, b1.dd, b1.ff, - b2.d.a, b2.d.b, b2.d.c, - b2.e.ii, b2.e.dd, b2.e.ff, - b3.a, b3.b, b3.c, - result.d.a, result.d.b, result.d.c, - result.e.ii, result.e.dd, result.e.ff); - - return result; -} - -static void -cls_struct_combined_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - struct cls_struct_16byte1 b0; - struct cls_struct_16byte2 b1; - struct cls_struct_combined b2; - struct cls_struct_16byte1 b3; - - b0 = *(struct cls_struct_16byte1*)(args[0]); - b1 = *(struct cls_struct_16byte2*)(args[1]); - b2 = *(struct cls_struct_combined*)(args[2]); - b3 = *(struct cls_struct_16byte1*)(args[3]); - - - *(cls_struct_combined*)resp = cls_struct_combined_fn(b0, b1, b2, b3); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[5]; - ffi_type* cls_struct_fields1[5]; - ffi_type* cls_struct_fields2[5]; - ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_16byte1 e_dbl = { 9.0, 2.0, 6}; - struct cls_struct_16byte2 f_dbl = { 1, 2.0, 3.0}; - struct cls_struct_combined g_dbl = {{4.0, 5.0, 6}, - {3, 1.0, 8.0}}; - struct cls_struct_16byte1 h_dbl = { 3.0, 2.0, 4}; - struct cls_struct_combined res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_type1.size = 0; - cls_struct_type1.alignment = 0; - cls_struct_type1.type = FFI_TYPE_STRUCT; - cls_struct_type1.elements = cls_struct_fields1; - - cls_struct_type2.size = 0; - cls_struct_type2.alignment = 0; - cls_struct_type2.type = FFI_TYPE_STRUCT; - cls_struct_type2.elements = cls_struct_fields2; - - cls_struct_fields[0] = &ffi_type_double; - cls_struct_fields[1] = &ffi_type_float; - cls_struct_fields[2] = &ffi_type_sint; - cls_struct_fields[3] = NULL; - - cls_struct_fields1[0] = &ffi_type_sint; - cls_struct_fields1[1] = &ffi_type_double; - cls_struct_fields1[2] = &ffi_type_float; - cls_struct_fields1[3] = NULL; - - cls_struct_fields2[0] = &cls_struct_type; - cls_struct_fields2[1] = &cls_struct_type1; - cls_struct_fields2[2] = NULL; - - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type1; - dbl_arg_types[2] = &cls_struct_type2; - dbl_arg_types[3] = &cls_struct_type; - dbl_arg_types[4] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type2, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &e_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = &g_dbl; - args_dbl[3] = &h_dbl; - args_dbl[4] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_combined_fn), &res_dbl, args_dbl); - /* { dg-output "9 2 6 1 2 3 4 5 6 3 1 8 3 2 4: 15 10 13 10 12 13" } */ - CHECK( res_dbl.d.a == (e_dbl.a + f_dbl.dd + g_dbl.d.a)); - CHECK( res_dbl.d.b == (e_dbl.b + f_dbl.ff + g_dbl.d.b)); - CHECK( res_dbl.d.c == (e_dbl.c + f_dbl.ii + g_dbl.d.c)); - CHECK( res_dbl.e.ii == (e_dbl.c + f_dbl.ii + g_dbl.e.ii)); - CHECK( res_dbl.e.dd == (e_dbl.a + f_dbl.dd + g_dbl.e.dd)); - CHECK( res_dbl.e.ff == (e_dbl.b + f_dbl.ff + g_dbl.e.ff)); - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_combined_gn, NULL, code) == FFI_OK); - - res_dbl = ((cls_struct_combined(*)(cls_struct_16byte1, - cls_struct_16byte2, - cls_struct_combined, - cls_struct_16byte1)) - (code))(e_dbl, f_dbl, g_dbl, h_dbl); - /* { dg-output "\n9 2 6 1 2 3 4 5 6 3 1 8 3 2 4: 15 10 13 10 12 13" } */ - CHECK( res_dbl.d.a == (e_dbl.a + f_dbl.dd + g_dbl.d.a)); - CHECK( res_dbl.d.b == (e_dbl.b + f_dbl.ff + g_dbl.d.b)); - CHECK( res_dbl.d.c == (e_dbl.c + f_dbl.ii + g_dbl.d.c)); - CHECK( res_dbl.e.ii == (e_dbl.c + f_dbl.ii + g_dbl.e.ii)); - CHECK( res_dbl.e.dd == (e_dbl.a + f_dbl.dd + g_dbl.e.dd)); - CHECK( res_dbl.e.ff == (e_dbl.b + f_dbl.ff + g_dbl.e.ff)); - /* CHECK( 1 == 0); */ - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct10.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct10.c deleted file mode 100644 index 3cf2b44..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct10.c +++ /dev/null @@ -1,134 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Contains structs as parameter of the struct itself. - Sample taken from Alan Modras patch to src/prep_cif.c. - Limitations: none. - PR: none. - Originator: 20051010 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct A { - unsigned long long a; - unsigned char b; -} A; - -typedef struct B { - unsigned char y; - struct A x; - unsigned int z; -} B; - -typedef struct C { - unsigned long long d; - unsigned char e; -} C; - -static B B_fn(struct A b2, struct B b3, struct C b4) -{ - struct B result; - - result.x.a = b2.a + b3.x.a + b3.z + b4.d; - result.x.b = b2.b + b3.x.b + b3.y + b4.e; - result.y = b2.b + b3.x.b + b4.e; - result.z = 0; - - printf("%d %d %d %d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b, - (int)b3.x.a, b3.x.b, b3.y, b3.z, (int)b4.d, b4.e, - (int)result.x.a, result.x.b, result.y); - - return result; -} - -static void -B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - struct A b0; - struct B b1; - struct C b2; - - b0 = *(struct A*)(args[0]); - b1 = *(struct B*)(args[1]); - b2 = *(struct C*)(args[2]); - - *(B*)resp = B_fn(b0, b1, b2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[4]; - ffi_type* cls_struct_fields[3]; - ffi_type* cls_struct_fields1[4]; - ffi_type* cls_struct_fields2[3]; - ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2; - ffi_type* dbl_arg_types[4]; - - struct A e_dbl = { 1LL, 7}; - struct B f_dbl = { 99, {12LL , 127}, 255}; - struct C g_dbl = { 2LL, 9}; - - struct B res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_type1.size = 0; - cls_struct_type1.alignment = 0; - cls_struct_type1.type = FFI_TYPE_STRUCT; - cls_struct_type1.elements = cls_struct_fields1; - - cls_struct_type2.size = 0; - cls_struct_type2.alignment = 0; - cls_struct_type2.type = FFI_TYPE_STRUCT; - cls_struct_type2.elements = cls_struct_fields2; - - cls_struct_fields[0] = &ffi_type_uint64; - cls_struct_fields[1] = &ffi_type_uchar; - cls_struct_fields[2] = NULL; - - cls_struct_fields1[0] = &ffi_type_uchar; - cls_struct_fields1[1] = &cls_struct_type; - cls_struct_fields1[2] = &ffi_type_uint; - cls_struct_fields1[3] = NULL; - - cls_struct_fields2[0] = &ffi_type_uint64; - cls_struct_fields2[1] = &ffi_type_uchar; - cls_struct_fields2[2] = NULL; - - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type1; - dbl_arg_types[2] = &cls_struct_type2; - dbl_arg_types[3] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &cls_struct_type1, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &e_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = &g_dbl; - args_dbl[3] = NULL; - - ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); - /* { dg-output "1 7 12 127 99 255 2 9: 270 242 143" } */ - CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + f_dbl.z + g_dbl.d)); - CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e)); - CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e)); - - CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); - - res_dbl = ((B(*)(A, B, C))(code))(e_dbl, f_dbl, g_dbl); - /* { dg-output "\n1 7 12 127 99 255 2 9: 270 242 143" } */ - CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + f_dbl.z + g_dbl.d)); - CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e)); - CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e)); - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct11.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct11.c deleted file mode 100644 index 3510493..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct11.c +++ /dev/null @@ -1,121 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check parameter passing with nested structs - of a single type. This tests the special cases - for homogeneous floating-point aggregates in the - AArch64 PCS. - Limitations: none. - PR: none. - Originator: ARM Ltd. */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct A { - float a_x; - float a_y; -} A; - -typedef struct B { - float b_x; - float b_y; -} B; - -typedef struct C { - A a; - B b; -} C; - -static C C_fn (int x, int y, int z, C source, int i, int j, int k) -{ - C result; - result.a.a_x = source.a.a_x; - result.a.a_y = source.a.a_y; - result.b.b_x = source.b.b_x; - result.b.b_y = source.b.b_y; - - printf ("%d, %d, %d, %d, %d, %d\n", x, y, z, i, j, k); - - printf ("%.1f, %.1f, %.1f, %.1f, " - "%.1f, %.1f, %.1f, %.1f\n", - source.a.a_x, source.a.a_y, - source.b.b_x, source.b.b_y, - result.a.a_x, result.a.a_y, - result.b.b_x, result.b.b_y); - - return result; -} - -int main (void) -{ - ffi_cif cif; - - ffi_type* struct_fields_source_a[3]; - ffi_type* struct_fields_source_b[3]; - ffi_type* struct_fields_source_c[3]; - ffi_type* arg_types[8]; - - ffi_type struct_type_a, struct_type_b, struct_type_c; - - struct A source_fld_a = {1.0, 2.0}; - struct B source_fld_b = {4.0, 8.0}; - int k = 1; - - struct C result; - struct C source = {source_fld_a, source_fld_b}; - - struct_type_a.size = 0; - struct_type_a.alignment = 0; - struct_type_a.type = FFI_TYPE_STRUCT; - struct_type_a.elements = struct_fields_source_a; - - struct_type_b.size = 0; - struct_type_b.alignment = 0; - struct_type_b.type = FFI_TYPE_STRUCT; - struct_type_b.elements = struct_fields_source_b; - - struct_type_c.size = 0; - struct_type_c.alignment = 0; - struct_type_c.type = FFI_TYPE_STRUCT; - struct_type_c.elements = struct_fields_source_c; - - struct_fields_source_a[0] = &ffi_type_float; - struct_fields_source_a[1] = &ffi_type_float; - struct_fields_source_a[2] = NULL; - - struct_fields_source_b[0] = &ffi_type_float; - struct_fields_source_b[1] = &ffi_type_float; - struct_fields_source_b[2] = NULL; - - struct_fields_source_c[0] = &struct_type_a; - struct_fields_source_c[1] = &struct_type_b; - struct_fields_source_c[2] = NULL; - - arg_types[0] = &ffi_type_sint32; - arg_types[1] = &ffi_type_sint32; - arg_types[2] = &ffi_type_sint32; - arg_types[3] = &struct_type_c; - arg_types[4] = &ffi_type_sint32; - arg_types[5] = &ffi_type_sint32; - arg_types[6] = &ffi_type_sint32; - arg_types[7] = NULL; - - void *args[7]; - args[0] = &k; - args[1] = &k; - args[2] = &k; - args[3] = &source; - args[4] = &k; - args[5] = &k; - args[6] = &k; - CHECK (ffi_prep_cif (&cif, FFI_DEFAULT_ABI, 7, &struct_type_c, - arg_types) == FFI_OK); - - ffi_call (&cif, FFI_FN (C_fn), &result, args); - /* { dg-output "1, 1, 1, 1, 1, 1\n" } */ - /* { dg-output "1.0, 2.0, 4.0, 8.0, 1.0, 2.0, 4.0, 8.0" } */ - CHECK (result.a.a_x == source.a.a_x); - CHECK (result.a.a_y == source.a.a_y); - CHECK (result.b.b_x == source.b.b_x); - CHECK (result.b.b_y == source.b.b_y); - exit (0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct2.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct2.c deleted file mode 100644 index 69268cd..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct2.c +++ /dev/null @@ -1,110 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Contains structs as parameter of the struct itself. - Sample taken from Alan Modras patch to src/prep_cif.c. - Limitations: none. - PR: none. - Originator: 20030911 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct A { - unsigned long a; - unsigned char b; -} A; - -typedef struct B { - struct A x; - unsigned char y; -} B; - -B B_fn(struct A b0, struct B b1) -{ - struct B result; - - result.x.a = b0.a + b1.x.a; - result.x.b = b0.b + b1.x.b + b1.y; - result.y = b0.b + b1.x.b; - - printf("%lu %d %lu %d %d: %lu %d %d\n", b0.a, b0.b, b1.x.a, b1.x.b, b1.y, - result.x.a, result.x.b, result.y); - - return result; -} - -static void -B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - struct A b0; - struct B b1; - - b0 = *(struct A*)(args[0]); - b1 = *(struct B*)(args[1]); - - *(B*)resp = B_fn(b0, b1); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[3]; - ffi_type* cls_struct_fields[3]; - ffi_type* cls_struct_fields1[3]; - ffi_type cls_struct_type, cls_struct_type1; - ffi_type* dbl_arg_types[3]; - - struct A e_dbl = { 1, 7}; - struct B f_dbl = {{12 , 127}, 99}; - - struct B res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_type1.size = 0; - cls_struct_type1.alignment = 0; - cls_struct_type1.type = FFI_TYPE_STRUCT; - cls_struct_type1.elements = cls_struct_fields1; - - cls_struct_fields[0] = &ffi_type_ulong; - cls_struct_fields[1] = &ffi_type_uchar; - cls_struct_fields[2] = NULL; - - cls_struct_fields1[0] = &cls_struct_type; - cls_struct_fields1[1] = &ffi_type_uchar; - cls_struct_fields1[2] = NULL; - - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type1; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type1, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &e_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); - /* { dg-output "1 7 12 127 99: 13 233 134" } */ - CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); - CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); - CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); - - CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); - - res_dbl = ((B(*)(A, B))(code))(e_dbl, f_dbl); - /* { dg-output "\n1 7 12 127 99: 13 233 134" } */ - CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); - CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); - CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct3.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct3.c deleted file mode 100644 index ab18cad..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct3.c +++ /dev/null @@ -1,111 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Contains structs as parameter of the struct itself. - Sample taken from Alan Modras patch to src/prep_cif.c. - Limitations: none. - PR: none. - Originator: 20030911 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct A { - unsigned long long a; - unsigned char b; -} A; - -typedef struct B { - struct A x; - unsigned char y; -} B; - -B B_fn(struct A b0, struct B b1) -{ - struct B result; - - result.x.a = b0.a + b1.x.a; - result.x.b = b0.b + b1.x.b + b1.y; - result.y = b0.b + b1.x.b; - - printf("%d %d %d %d %d: %d %d %d\n", (int)b0.a, b0.b, - (int)b1.x.a, b1.x.b, b1.y, - (int)result.x.a, result.x.b, result.y); - - return result; -} - -static void -B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - struct A b0; - struct B b1; - - b0 = *(struct A*)(args[0]); - b1 = *(struct B*)(args[1]); - - *(B*)resp = B_fn(b0, b1); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[3]; - ffi_type* cls_struct_fields[3]; - ffi_type* cls_struct_fields1[3]; - ffi_type cls_struct_type, cls_struct_type1; - ffi_type* dbl_arg_types[3]; - - struct A e_dbl = { 1LL, 7}; - struct B f_dbl = {{12LL , 127}, 99}; - - struct B res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_type1.size = 0; - cls_struct_type1.alignment = 0; - cls_struct_type1.type = FFI_TYPE_STRUCT; - cls_struct_type1.elements = cls_struct_fields1; - - cls_struct_fields[0] = &ffi_type_uint64; - cls_struct_fields[1] = &ffi_type_uchar; - cls_struct_fields[2] = NULL; - - cls_struct_fields1[0] = &cls_struct_type; - cls_struct_fields1[1] = &ffi_type_uchar; - cls_struct_fields1[2] = NULL; - - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type1; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type1, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &e_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); - /* { dg-output "1 7 12 127 99: 13 233 134" } */ - CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); - CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); - CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); - - - CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); - - res_dbl = ((B(*)(A, B))(code))(e_dbl, f_dbl); - /* { dg-output "\n1 7 12 127 99: 13 233 134" } */ - CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); - CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); - CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct4.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct4.c deleted file mode 100644 index 2ffb4d6..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct4.c +++ /dev/null @@ -1,111 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Contains structs as parameter of the struct itself. - Sample taken from Alan Modras patch to src/prep_cif.c. - Limitations: none. - PR: PR 25630. - Originator: 20051010 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct A { - double a; - unsigned char b; -} A; - -typedef struct B { - struct A x; - unsigned char y; -} B; - -static B B_fn(struct A b2, struct B b3) -{ - struct B result; - - result.x.a = b2.a + b3.x.a; - result.x.b = b2.b + b3.x.b + b3.y; - result.y = b2.b + b3.x.b; - - printf("%d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b, - (int)b3.x.a, b3.x.b, b3.y, - (int)result.x.a, result.x.b, result.y); - - return result; -} - -static void -B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - struct A b0; - struct B b1; - - b0 = *(struct A*)(args[0]); - b1 = *(struct B*)(args[1]); - - *(B*)resp = B_fn(b0, b1); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[3]; - ffi_type* cls_struct_fields[3]; - ffi_type* cls_struct_fields1[3]; - ffi_type cls_struct_type, cls_struct_type1; - ffi_type* dbl_arg_types[3]; - - struct A e_dbl = { 1.0, 7}; - struct B f_dbl = {{12.0 , 127}, 99}; - - struct B res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_type1.size = 0; - cls_struct_type1.alignment = 0; - cls_struct_type1.type = FFI_TYPE_STRUCT; - cls_struct_type1.elements = cls_struct_fields1; - - cls_struct_fields[0] = &ffi_type_double; - cls_struct_fields[1] = &ffi_type_uchar; - cls_struct_fields[2] = NULL; - - cls_struct_fields1[0] = &cls_struct_type; - cls_struct_fields1[1] = &ffi_type_uchar; - cls_struct_fields1[2] = NULL; - - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type1; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type1, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &e_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); - /* { dg-output "1 7 12 127 99: 13 233 134" } */ - CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); - CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); - CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); - - CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); - - res_dbl = ((B(*)(A, B))(code))(e_dbl, f_dbl); - /* { dg-output "\n1 7 12 127 99: 13 233 134" } */ - CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); - CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); - CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct5.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct5.c deleted file mode 100644 index 6c79845..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct5.c +++ /dev/null @@ -1,112 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Contains structs as parameter of the struct itself. - Sample taken from Alan Modras patch to src/prep_cif.c. - Limitations: none. - PR: none. - Originator: 20051010 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct A { - long double a; - unsigned char b; -} A; - -typedef struct B { - struct A x; - unsigned char y; -} B; - -static B B_fn(struct A b2, struct B b3) -{ - struct B result; - - result.x.a = b2.a + b3.x.a; - result.x.b = b2.b + b3.x.b + b3.y; - result.y = b2.b + b3.x.b; - - printf("%d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b, - (int)b3.x.a, b3.x.b, b3.y, - (int)result.x.a, result.x.b, result.y); - - return result; -} - -static void -B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - struct A b0; - struct B b1; - - b0 = *(struct A*)(args[0]); - b1 = *(struct B*)(args[1]); - - *(B*)resp = B_fn(b0, b1); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[3]; - ffi_type* cls_struct_fields[3]; - ffi_type* cls_struct_fields1[3]; - ffi_type cls_struct_type, cls_struct_type1; - ffi_type* dbl_arg_types[3]; - - struct A e_dbl = { 1.0, 7}; - struct B f_dbl = {{12.0 , 127}, 99}; - - struct B res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_type1.size = 0; - cls_struct_type1.alignment = 0; - cls_struct_type1.type = FFI_TYPE_STRUCT; - cls_struct_type1.elements = cls_struct_fields1; - - cls_struct_fields[0] = &ffi_type_longdouble; - cls_struct_fields[1] = &ffi_type_uchar; - cls_struct_fields[2] = NULL; - - cls_struct_fields1[0] = &cls_struct_type; - cls_struct_fields1[1] = &ffi_type_uchar; - cls_struct_fields1[2] = NULL; - - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type1; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type1, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &e_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); - /* { dg-output "1 7 12 127 99: 13 233 134" } */ - CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); - CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); - CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); - - - CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); - - res_dbl = ((B(*)(A, B))(code))(e_dbl, f_dbl); - /* { dg-output "\n1 7 12 127 99: 13 233 134" } */ - CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); - CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); - CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct6.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct6.c deleted file mode 100644 index 59d3579..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct6.c +++ /dev/null @@ -1,131 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Contains structs as parameter of the struct itself. - Sample taken from Alan Modras patch to src/prep_cif.c. - Limitations: none. - PR: PR 25630. - Originator: 20051010 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct A { - double a; - unsigned char b; -} A; - -typedef struct B { - struct A x; - unsigned char y; -} B; - -typedef struct C { - long d; - unsigned char e; -} C; - -static B B_fn(struct A b2, struct B b3, struct C b4) -{ - struct B result; - - result.x.a = b2.a + b3.x.a + b4.d; - result.x.b = b2.b + b3.x.b + b3.y + b4.e; - result.y = b2.b + b3.x.b + b4.e; - - printf("%d %d %d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b, - (int)b3.x.a, b3.x.b, b3.y, (int)b4.d, b4.e, - (int)result.x.a, result.x.b, result.y); - - return result; -} - -static void -B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - struct A b0; - struct B b1; - struct C b2; - - b0 = *(struct A*)(args[0]); - b1 = *(struct B*)(args[1]); - b2 = *(struct C*)(args[2]); - - *(B*)resp = B_fn(b0, b1, b2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[4]; - ffi_type* cls_struct_fields[3]; - ffi_type* cls_struct_fields1[3]; - ffi_type* cls_struct_fields2[3]; - ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2; - ffi_type* dbl_arg_types[4]; - - struct A e_dbl = { 1.0, 7}; - struct B f_dbl = {{12.0 , 127}, 99}; - struct C g_dbl = { 2, 9}; - - struct B res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_type1.size = 0; - cls_struct_type1.alignment = 0; - cls_struct_type1.type = FFI_TYPE_STRUCT; - cls_struct_type1.elements = cls_struct_fields1; - - cls_struct_type2.size = 0; - cls_struct_type2.alignment = 0; - cls_struct_type2.type = FFI_TYPE_STRUCT; - cls_struct_type2.elements = cls_struct_fields2; - - cls_struct_fields[0] = &ffi_type_double; - cls_struct_fields[1] = &ffi_type_uchar; - cls_struct_fields[2] = NULL; - - cls_struct_fields1[0] = &cls_struct_type; - cls_struct_fields1[1] = &ffi_type_uchar; - cls_struct_fields1[2] = NULL; - - cls_struct_fields2[0] = &ffi_type_slong; - cls_struct_fields2[1] = &ffi_type_uchar; - cls_struct_fields2[2] = NULL; - - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type1; - dbl_arg_types[2] = &cls_struct_type2; - dbl_arg_types[3] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &cls_struct_type1, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &e_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = &g_dbl; - args_dbl[3] = NULL; - - ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); - /* { dg-output "1 7 12 127 99 2 9: 15 242 143" } */ - CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d)); - CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e)); - CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e)); - - CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); - - res_dbl = ((B(*)(A, B, C))(code))(e_dbl, f_dbl, g_dbl); - /* { dg-output "\n1 7 12 127 99 2 9: 15 242 143" } */ - CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d)); - CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e)); - CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e)); - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct7.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct7.c deleted file mode 100644 index 27595e6..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct7.c +++ /dev/null @@ -1,111 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Contains structs as parameter of the struct itself. - Sample taken from Alan Modras patch to src/prep_cif.c. - Limitations: none. - PR: none. - Originator: 20051010 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct A { - unsigned long long a; - unsigned char b; -} A; - -typedef struct B { - struct A x; - unsigned char y; -} B; - -static B B_fn(struct A b2, struct B b3) -{ - struct B result; - - result.x.a = b2.a + b3.x.a; - result.x.b = b2.b + b3.x.b + b3.y; - result.y = b2.b + b3.x.b; - - printf("%d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b, - (int)b3.x.a, b3.x.b, b3.y, - (int)result.x.a, result.x.b, result.y); - - return result; -} - -static void -B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - struct A b0; - struct B b1; - - b0 = *(struct A*)(args[0]); - b1 = *(struct B*)(args[1]); - - *(B*)resp = B_fn(b0, b1); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[3]; - ffi_type* cls_struct_fields[3]; - ffi_type* cls_struct_fields1[3]; - ffi_type cls_struct_type, cls_struct_type1; - ffi_type* dbl_arg_types[3]; - - struct A e_dbl = { 1LL, 7}; - struct B f_dbl = {{12.0 , 127}, 99}; - - struct B res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_type1.size = 0; - cls_struct_type1.alignment = 0; - cls_struct_type1.type = FFI_TYPE_STRUCT; - cls_struct_type1.elements = cls_struct_fields1; - - cls_struct_fields[0] = &ffi_type_uint64; - cls_struct_fields[1] = &ffi_type_uchar; - cls_struct_fields[2] = NULL; - - cls_struct_fields1[0] = &cls_struct_type; - cls_struct_fields1[1] = &ffi_type_uchar; - cls_struct_fields1[2] = NULL; - - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type1; - dbl_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type1, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &e_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = NULL; - - ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); - /* { dg-output "1 7 12 127 99: 13 233 134" } */ - CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); - CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); - CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); - - CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); - - res_dbl = ((B(*)(A, B))(code))(e_dbl, f_dbl); - /* { dg-output "\n1 7 12 127 99: 13 233 134" } */ - CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); - CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); - CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct8.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct8.c deleted file mode 100644 index 0e6c682..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct8.c +++ /dev/null @@ -1,131 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Contains structs as parameter of the struct itself. - Sample taken from Alan Modras patch to src/prep_cif.c. - Limitations: none. - PR: none. - Originator: 20051010 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct A { - unsigned long long a; - unsigned char b; -} A; - -typedef struct B { - struct A x; - unsigned char y; -} B; - -typedef struct C { - unsigned long long d; - unsigned char e; -} C; - -static B B_fn(struct A b2, struct B b3, struct C b4) -{ - struct B result; - - result.x.a = b2.a + b3.x.a + b4.d; - result.x.b = b2.b + b3.x.b + b3.y + b4.e; - result.y = b2.b + b3.x.b + b4.e; - - printf("%d %d %d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b, - (int)b3.x.a, b3.x.b, b3.y, (int)b4.d, b4.e, - (int)result.x.a, result.x.b, result.y); - - return result; -} - -static void -B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - struct A b0; - struct B b1; - struct C b2; - - b0 = *(struct A*)(args[0]); - b1 = *(struct B*)(args[1]); - b2 = *(struct C*)(args[2]); - - *(B*)resp = B_fn(b0, b1, b2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[4]; - ffi_type* cls_struct_fields[3]; - ffi_type* cls_struct_fields1[3]; - ffi_type* cls_struct_fields2[3]; - ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2; - ffi_type* dbl_arg_types[4]; - - struct A e_dbl = { 1LL, 7}; - struct B f_dbl = {{12LL , 127}, 99}; - struct C g_dbl = { 2LL, 9}; - - struct B res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_type1.size = 0; - cls_struct_type1.alignment = 0; - cls_struct_type1.type = FFI_TYPE_STRUCT; - cls_struct_type1.elements = cls_struct_fields1; - - cls_struct_type2.size = 0; - cls_struct_type2.alignment = 0; - cls_struct_type2.type = FFI_TYPE_STRUCT; - cls_struct_type2.elements = cls_struct_fields2; - - cls_struct_fields[0] = &ffi_type_uint64; - cls_struct_fields[1] = &ffi_type_uchar; - cls_struct_fields[2] = NULL; - - cls_struct_fields1[0] = &cls_struct_type; - cls_struct_fields1[1] = &ffi_type_uchar; - cls_struct_fields1[2] = NULL; - - cls_struct_fields2[0] = &ffi_type_uint64; - cls_struct_fields2[1] = &ffi_type_uchar; - cls_struct_fields2[2] = NULL; - - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type1; - dbl_arg_types[2] = &cls_struct_type2; - dbl_arg_types[3] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &cls_struct_type1, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &e_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = &g_dbl; - args_dbl[3] = NULL; - - ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); - /* { dg-output "1 7 12 127 99 2 9: 15 242 143" } */ - CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d)); - CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e)); - CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e)); - - CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); - - res_dbl = ((B(*)(A, B, C))(code))(e_dbl, f_dbl, g_dbl); - /* { dg-output "\n1 7 12 127 99 2 9: 15 242 143" } */ - CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d)); - CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e)); - CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e)); - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct9.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct9.c deleted file mode 100644 index 5f7ac67..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct9.c +++ /dev/null @@ -1,131 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Contains structs as parameter of the struct itself. - Sample taken from Alan Modras patch to src/prep_cif.c. - Limitations: none. - PR: none. - Originator: 20051010 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct A { - unsigned char a; - unsigned long long b; -} A; - -typedef struct B { - struct A x; - unsigned char y; -} B; - -typedef struct C { - unsigned long d; - unsigned char e; -} C; - -static B B_fn(struct A b2, struct B b3, struct C b4) -{ - struct B result; - - result.x.a = b2.a + b3.x.a + b4.d; - result.x.b = b2.b + b3.x.b + b3.y + b4.e; - result.y = b2.b + b3.x.b + b4.e; - - printf("%d %d %d %d %d %d %d: %d %d %d\n", b2.a, (int)b2.b, - b3.x.a, (int)b3.x.b, b3.y, (int)b4.d, b4.e, - result.x.a, (int)result.x.b, result.y); - - return result; -} - -static void -B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - struct A b0; - struct B b1; - struct C b2; - - b0 = *(struct A*)(args[0]); - b1 = *(struct B*)(args[1]); - b2 = *(struct C*)(args[2]); - - *(B*)resp = B_fn(b0, b1, b2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[4]; - ffi_type* cls_struct_fields[3]; - ffi_type* cls_struct_fields1[3]; - ffi_type* cls_struct_fields2[3]; - ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2; - ffi_type* dbl_arg_types[4]; - - struct A e_dbl = { 1, 7LL}; - struct B f_dbl = {{12.0 , 127}, 99}; - struct C g_dbl = { 2, 9}; - - struct B res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_type1.size = 0; - cls_struct_type1.alignment = 0; - cls_struct_type1.type = FFI_TYPE_STRUCT; - cls_struct_type1.elements = cls_struct_fields1; - - cls_struct_type2.size = 0; - cls_struct_type2.alignment = 0; - cls_struct_type2.type = FFI_TYPE_STRUCT; - cls_struct_type2.elements = cls_struct_fields2; - - cls_struct_fields[0] = &ffi_type_uchar; - cls_struct_fields[1] = &ffi_type_uint64; - cls_struct_fields[2] = NULL; - - cls_struct_fields1[0] = &cls_struct_type; - cls_struct_fields1[1] = &ffi_type_uchar; - cls_struct_fields1[2] = NULL; - - cls_struct_fields2[0] = &ffi_type_ulong; - cls_struct_fields2[1] = &ffi_type_uchar; - cls_struct_fields2[2] = NULL; - - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type1; - dbl_arg_types[2] = &cls_struct_type2; - dbl_arg_types[3] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &cls_struct_type1, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &e_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = &g_dbl; - args_dbl[3] = NULL; - - ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); - /* { dg-output "1 7 12 127 99 2 9: 15 242 143" } */ - CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d)); - CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e)); - CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e)); - - CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); - - res_dbl = ((B(*)(A, B, C))(code))(e_dbl, f_dbl, g_dbl); - /* { dg-output "\n1 7 12 127 99 2 9: 15 242 143" } */ - CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d)); - CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e)); - CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e)); - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/problem1.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/problem1.c deleted file mode 100644 index 6a91555..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/problem1.c +++ /dev/null @@ -1,90 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Limitations: none. - PR: none. - Originator: 20030828 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct my_ffi_struct { - double a; - double b; - double c; -} my_ffi_struct; - -my_ffi_struct callee(struct my_ffi_struct a1, struct my_ffi_struct a2) -{ - struct my_ffi_struct result; - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - - - printf("%g %g %g %g %g %g: %g %g %g\n", a1.a, a1.b, a1.c, - a2.a, a2.b, a2.c, result.a, result.b, result.c); - - return result; -} - -void stub(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - struct my_ffi_struct a1; - struct my_ffi_struct a2; - - a1 = *(struct my_ffi_struct*)(args[0]); - a2 = *(struct my_ffi_struct*)(args[1]); - - *(my_ffi_struct *)resp = callee(a1, a2); -} - - -int main(void) -{ - ffi_type* my_ffi_struct_fields[4]; - ffi_type my_ffi_struct_type; - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args[4]; - ffi_type* arg_types[3]; - - struct my_ffi_struct g = { 1.0, 2.0, 3.0 }; - struct my_ffi_struct f = { 1.0, 2.0, 3.0 }; - struct my_ffi_struct res; - - my_ffi_struct_type.size = 0; - my_ffi_struct_type.alignment = 0; - my_ffi_struct_type.type = FFI_TYPE_STRUCT; - my_ffi_struct_type.elements = my_ffi_struct_fields; - - my_ffi_struct_fields[0] = &ffi_type_double; - my_ffi_struct_fields[1] = &ffi_type_double; - my_ffi_struct_fields[2] = &ffi_type_double; - my_ffi_struct_fields[3] = NULL; - - arg_types[0] = &my_ffi_struct_type; - arg_types[1] = &my_ffi_struct_type; - arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &my_ffi_struct_type, - arg_types) == FFI_OK); - - args[0] = &g; - args[1] = &f; - args[2] = NULL; - ffi_call(&cif, FFI_FN(callee), &res, args); - /* { dg-output "1 2 3 1 2 3: 2 4 6" } */ - printf("res: %g %g %g\n", res.a, res.b, res.c); - /* { dg-output "\nres: 2 4 6" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, stub, NULL, code) == FFI_OK); - - res = ((my_ffi_struct(*)(struct my_ffi_struct, struct my_ffi_struct))(code))(g, f); - /* { dg-output "\n1 2 3 1 2 3: 2 4 6" } */ - printf("res: %g %g %g\n", res.a, res.b, res.c); - /* { dg-output "\nres: 2 4 6" } */ - - exit(0);; -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/stret_large.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/stret_large.c deleted file mode 100644 index 71c2469..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/stret_large.c +++ /dev/null @@ -1,145 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure returning with different structure size. - Depending on the ABI. Check bigger struct which overlaps - the gp and fp register count on Darwin/AIX/ppc64. - Limitations: none. - PR: none. - Originator: Blake Chaffin 6/21/2007 */ - -/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ -#include "ffitest.h" - -/* 13 FPRs: 104 bytes */ -/* 14 FPRs: 112 bytes */ - -typedef struct struct_108byte { - double a; - double b; - double c; - double d; - double e; - double f; - double g; - double h; - double i; - double j; - double k; - double l; - double m; - int n; -} struct_108byte; - -struct_108byte cls_struct_108byte_fn( - struct_108byte b0, - struct_108byte b1, - struct_108byte b2, - struct_108byte b3) -{ - struct_108byte result; - - result.a = b0.a + b1.a + b2.a + b3.a; - result.b = b0.b + b1.b + b2.b + b3.b; - result.c = b0.c + b1.c + b2.c + b3.c; - result.d = b0.d + b1.d + b2.d + b3.d; - result.e = b0.e + b1.e + b2.e + b3.e; - result.f = b0.f + b1.f + b2.f + b3.f; - result.g = b0.g + b1.g + b2.g + b3.g; - result.h = b0.h + b1.h + b2.h + b3.h; - result.i = b0.i + b1.i + b2.i + b3.i; - result.j = b0.j + b1.j + b2.j + b3.j; - result.k = b0.k + b1.k + b2.k + b3.k; - result.l = b0.l + b1.l + b2.l + b3.l; - result.m = b0.m + b1.m + b2.m + b3.m; - result.n = b0.n + b1.n + b2.n + b3.n; - - printf("%g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", result.a, result.b, result.c, - result.d, result.e, result.f, result.g, result.h, result.i, - result.j, result.k, result.l, result.m, result.n); - - return result; -} - -static void -cls_struct_108byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) -{ - struct_108byte b0, b1, b2, b3; - - b0 = *(struct_108byte*)(args[0]); - b1 = *(struct_108byte*)(args[1]); - b2 = *(struct_108byte*)(args[2]); - b3 = *(struct_108byte*)(args[3]); - - *(struct_108byte*)resp = cls_struct_108byte_fn(b0, b1, b2, b3); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[15]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct_108byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0, 1.0, 2.0, 3.0, 7.0, 2.0, 7 }; - struct_108byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0, 4.0, 5.0, 7.0, 9.0, 1.0, 4 }; - struct_108byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0, 8.0, 6.0, 1.0, 4.0, 0.0, 3 }; - struct_108byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0, 9.0, 2.0, 6.0, 5.0, 3.0, 2 }; - struct_108byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_double; - cls_struct_fields[1] = &ffi_type_double; - cls_struct_fields[2] = &ffi_type_double; - cls_struct_fields[3] = &ffi_type_double; - cls_struct_fields[4] = &ffi_type_double; - cls_struct_fields[5] = &ffi_type_double; - cls_struct_fields[6] = &ffi_type_double; - cls_struct_fields[7] = &ffi_type_double; - cls_struct_fields[8] = &ffi_type_double; - cls_struct_fields[9] = &ffi_type_double; - cls_struct_fields[10] = &ffi_type_double; - cls_struct_fields[11] = &ffi_type_double; - cls_struct_fields[12] = &ffi_type_double; - cls_struct_fields[13] = &ffi_type_sint32; - cls_struct_fields[14] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = &cls_struct_type; - dbl_arg_types[3] = &cls_struct_type; - dbl_arg_types[4] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &e_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = &g_dbl; - args_dbl[3] = &h_dbl; - args_dbl[4] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_108byte_fn), &res_dbl, args_dbl); - /* { dg-output "22 15 17 25 6 13 19 18 22 15 17 25 6 16" } */ - printf("res: %g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", res_dbl.a, res_dbl.b, - res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i, - res_dbl.j, res_dbl.k, res_dbl.l, res_dbl.m, res_dbl.n); - /* { dg-output "\nres: 22 15 17 25 6 13 19 18 22 15 17 25 6 16" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_108byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((struct_108byte(*)(struct_108byte, struct_108byte, - struct_108byte, struct_108byte))(code))(e_dbl, f_dbl, g_dbl, h_dbl); - /* { dg-output "\n22 15 17 25 6 13 19 18 22 15 17 25 6 16" } */ - printf("res: %g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", res_dbl.a, res_dbl.b, - res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i, - res_dbl.j, res_dbl.k, res_dbl.l, res_dbl.m, res_dbl.n); - /* { dg-output "\nres: 22 15 17 25 6 13 19 18 22 15 17 25 6 16" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/stret_large2.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/stret_large2.c deleted file mode 100644 index d9c750e..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/stret_large2.c +++ /dev/null @@ -1,148 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure returning with different structure size. - Depending on the ABI. Check bigger struct which overlaps - the gp and fp register count on Darwin/AIX/ppc64. - Limitations: none. - PR: none. - Originator: Blake Chaffin 6/21/2007 */ - -/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ -#include "ffitest.h" - -/* 13 FPRs: 104 bytes */ -/* 14 FPRs: 112 bytes */ - -typedef struct struct_116byte { - double a; - double b; - double c; - double d; - double e; - double f; - double g; - double h; - double i; - double j; - double k; - double l; - double m; - double n; - int o; -} struct_116byte; - -struct_116byte cls_struct_116byte_fn( - struct_116byte b0, - struct_116byte b1, - struct_116byte b2, - struct_116byte b3) -{ - struct_116byte result; - - result.a = b0.a + b1.a + b2.a + b3.a; - result.b = b0.b + b1.b + b2.b + b3.b; - result.c = b0.c + b1.c + b2.c + b3.c; - result.d = b0.d + b1.d + b2.d + b3.d; - result.e = b0.e + b1.e + b2.e + b3.e; - result.f = b0.f + b1.f + b2.f + b3.f; - result.g = b0.g + b1.g + b2.g + b3.g; - result.h = b0.h + b1.h + b2.h + b3.h; - result.i = b0.i + b1.i + b2.i + b3.i; - result.j = b0.j + b1.j + b2.j + b3.j; - result.k = b0.k + b1.k + b2.k + b3.k; - result.l = b0.l + b1.l + b2.l + b3.l; - result.m = b0.m + b1.m + b2.m + b3.m; - result.n = b0.n + b1.n + b2.n + b3.n; - result.o = b0.o + b1.o + b2.o + b3.o; - - printf("%g %g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", result.a, result.b, result.c, - result.d, result.e, result.f, result.g, result.h, result.i, - result.j, result.k, result.l, result.m, result.n, result.o); - - return result; -} - -static void -cls_struct_116byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) -{ - struct_116byte b0, b1, b2, b3; - - b0 = *(struct_116byte*)(args[0]); - b1 = *(struct_116byte*)(args[1]); - b2 = *(struct_116byte*)(args[2]); - b3 = *(struct_116byte*)(args[3]); - - *(struct_116byte*)resp = cls_struct_116byte_fn(b0, b1, b2, b3); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[16]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct_116byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0, 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 7 }; - struct_116byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0, 4.0, 5.0, 7.0, 9.0, 1.0, 6.0, 4 }; - struct_116byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0, 8.0, 6.0, 1.0, 4.0, 0.0, 7.0, 3 }; - struct_116byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0, 9.0, 2.0, 6.0, 5.0, 3.0, 8.0, 2 }; - struct_116byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_double; - cls_struct_fields[1] = &ffi_type_double; - cls_struct_fields[2] = &ffi_type_double; - cls_struct_fields[3] = &ffi_type_double; - cls_struct_fields[4] = &ffi_type_double; - cls_struct_fields[5] = &ffi_type_double; - cls_struct_fields[6] = &ffi_type_double; - cls_struct_fields[7] = &ffi_type_double; - cls_struct_fields[8] = &ffi_type_double; - cls_struct_fields[9] = &ffi_type_double; - cls_struct_fields[10] = &ffi_type_double; - cls_struct_fields[11] = &ffi_type_double; - cls_struct_fields[12] = &ffi_type_double; - cls_struct_fields[13] = &ffi_type_double; - cls_struct_fields[14] = &ffi_type_sint32; - cls_struct_fields[15] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = &cls_struct_type; - dbl_arg_types[3] = &cls_struct_type; - dbl_arg_types[4] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &e_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = &g_dbl; - args_dbl[3] = &h_dbl; - args_dbl[4] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_116byte_fn), &res_dbl, args_dbl); - /* { dg-output "22 15 17 25 6 13 19 18 22 15 17 25 6 26 16" } */ - printf("res: %g %g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", res_dbl.a, res_dbl.b, - res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i, - res_dbl.j, res_dbl.k, res_dbl.l, res_dbl.m, res_dbl.n, res_dbl.o); - /* { dg-output "\nres: 22 15 17 25 6 13 19 18 22 15 17 25 6 26 16" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_116byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((struct_116byte(*)(struct_116byte, struct_116byte, - struct_116byte, struct_116byte))(code))(e_dbl, f_dbl, g_dbl, h_dbl); - /* { dg-output "\n22 15 17 25 6 13 19 18 22 15 17 25 6 26 16" } */ - printf("res: %g %g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", res_dbl.a, res_dbl.b, - res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i, - res_dbl.j, res_dbl.k, res_dbl.l, res_dbl.m, res_dbl.n, res_dbl.o); - /* { dg-output "\nres: 22 15 17 25 6 13 19 18 22 15 17 25 6 26 16" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/stret_medium.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/stret_medium.c deleted file mode 100644 index 973ee02..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/stret_medium.c +++ /dev/null @@ -1,124 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure returning with different structure size. - Depending on the ABI. Check bigger struct which overlaps - the gp and fp register count on Darwin/AIX/ppc64. - Limitations: none. - PR: none. - Originator: Blake Chaffin 6/21/2007 */ - -/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ -#include "ffitest.h" - -typedef struct struct_72byte { - double a; - double b; - double c; - double d; - double e; - double f; - double g; - double h; - double i; -} struct_72byte; - -struct_72byte cls_struct_72byte_fn( - struct_72byte b0, - struct_72byte b1, - struct_72byte b2, - struct_72byte b3) -{ - struct_72byte result; - - result.a = b0.a + b1.a + b2.a + b3.a; - result.b = b0.b + b1.b + b2.b + b3.b; - result.c = b0.c + b1.c + b2.c + b3.c; - result.d = b0.d + b1.d + b2.d + b3.d; - result.e = b0.e + b1.e + b2.e + b3.e; - result.f = b0.f + b1.f + b2.f + b3.f; - result.g = b0.g + b1.g + b2.g + b3.g; - result.h = b0.h + b1.h + b2.h + b3.h; - result.i = b0.i + b1.i + b2.i + b3.i; - - printf("%g %g %g %g %g %g %g %g %g\n", result.a, result.b, result.c, - result.d, result.e, result.f, result.g, result.h, result.i); - - return result; -} - -static void -cls_struct_72byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) -{ - struct_72byte b0, b1, b2, b3; - - b0 = *(struct_72byte*)(args[0]); - b1 = *(struct_72byte*)(args[1]); - b2 = *(struct_72byte*)(args[2]); - b3 = *(struct_72byte*)(args[3]); - - *(struct_72byte*)resp = cls_struct_72byte_fn(b0, b1, b2, b3); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[10]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct_72byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0, 7.0 }; - struct_72byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0, 4.0 }; - struct_72byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0, 3.0 }; - struct_72byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0, 2.0 }; - struct_72byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_double; - cls_struct_fields[1] = &ffi_type_double; - cls_struct_fields[2] = &ffi_type_double; - cls_struct_fields[3] = &ffi_type_double; - cls_struct_fields[4] = &ffi_type_double; - cls_struct_fields[5] = &ffi_type_double; - cls_struct_fields[6] = &ffi_type_double; - cls_struct_fields[7] = &ffi_type_double; - cls_struct_fields[8] = &ffi_type_double; - cls_struct_fields[9] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = &cls_struct_type; - dbl_arg_types[3] = &cls_struct_type; - dbl_arg_types[4] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &e_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = &g_dbl; - args_dbl[3] = &h_dbl; - args_dbl[4] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_72byte_fn), &res_dbl, args_dbl); - /* { dg-output "22 15 17 25 6 13 19 18 16" } */ - printf("res: %g %g %g %g %g %g %g %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c, - res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i); - /* { dg-output "\nres: 22 15 17 25 6 13 19 18 16" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_72byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((struct_72byte(*)(struct_72byte, struct_72byte, - struct_72byte, struct_72byte))(code))(e_dbl, f_dbl, g_dbl, h_dbl); - /* { dg-output "\n22 15 17 25 6 13 19 18 16" } */ - printf("res: %g %g %g %g %g %g %g %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c, - res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i); - /* { dg-output "\nres: 22 15 17 25 6 13 19 18 16" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/stret_medium2.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/stret_medium2.c deleted file mode 100644 index 84323d1..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/stret_medium2.c +++ /dev/null @@ -1,125 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure returning with different structure size. - Depending on the ABI. Check bigger struct which overlaps - the gp and fp register count on Darwin/AIX/ppc64. - Limitations: none. - PR: none. - Originator: Blake Chaffin 6/21/2007 */ - -/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ -/* { dg-options "-Wno-format" { target alpha*-dec-osf* } } */ -#include "ffitest.h" - -typedef struct struct_72byte { - double a; - double b; - double c; - double d; - double e; - double f; - double g; - double h; - long long i; -} struct_72byte; - -struct_72byte cls_struct_72byte_fn( - struct_72byte b0, - struct_72byte b1, - struct_72byte b2, - struct_72byte b3) -{ - struct_72byte result; - - result.a = b0.a + b1.a + b2.a + b3.a; - result.b = b0.b + b1.b + b2.b + b3.b; - result.c = b0.c + b1.c + b2.c + b3.c; - result.d = b0.d + b1.d + b2.d + b3.d; - result.e = b0.e + b1.e + b2.e + b3.e; - result.f = b0.f + b1.f + b2.f + b3.f; - result.g = b0.g + b1.g + b2.g + b3.g; - result.h = b0.h + b1.h + b2.h + b3.h; - result.i = b0.i + b1.i + b2.i + b3.i; - - printf("%g %g %g %g %g %g %g %g %" PRIdLL "\n", result.a, result.b, result.c, - result.d, result.e, result.f, result.g, result.h, result.i); - - return result; -} - -static void -cls_struct_72byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) -{ - struct_72byte b0, b1, b2, b3; - - b0 = *(struct_72byte*)(args[0]); - b1 = *(struct_72byte*)(args[1]); - b2 = *(struct_72byte*)(args[2]); - b3 = *(struct_72byte*)(args[3]); - - *(struct_72byte*)resp = cls_struct_72byte_fn(b0, b1, b2, b3); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_dbl[5]; - ffi_type* cls_struct_fields[10]; - ffi_type cls_struct_type; - ffi_type* dbl_arg_types[5]; - - struct_72byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0, 7 }; - struct_72byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0, 4 }; - struct_72byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0, 3 }; - struct_72byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0, 2 }; - struct_72byte res_dbl; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_double; - cls_struct_fields[1] = &ffi_type_double; - cls_struct_fields[2] = &ffi_type_double; - cls_struct_fields[3] = &ffi_type_double; - cls_struct_fields[4] = &ffi_type_double; - cls_struct_fields[5] = &ffi_type_double; - cls_struct_fields[6] = &ffi_type_double; - cls_struct_fields[7] = &ffi_type_double; - cls_struct_fields[8] = &ffi_type_sint64; - cls_struct_fields[9] = NULL; - - dbl_arg_types[0] = &cls_struct_type; - dbl_arg_types[1] = &cls_struct_type; - dbl_arg_types[2] = &cls_struct_type; - dbl_arg_types[3] = &cls_struct_type; - dbl_arg_types[4] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type, - dbl_arg_types) == FFI_OK); - - args_dbl[0] = &e_dbl; - args_dbl[1] = &f_dbl; - args_dbl[2] = &g_dbl; - args_dbl[3] = &h_dbl; - args_dbl[4] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_72byte_fn), &res_dbl, args_dbl); - /* { dg-output "22 15 17 25 6 13 19 18 16" } */ - printf("res: %g %g %g %g %g %g %g %g %" PRIdLL "\n", res_dbl.a, res_dbl.b, res_dbl.c, - res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i); - /* { dg-output "\nres: 22 15 17 25 6 13 19 18 16" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_72byte_gn, NULL, code) == FFI_OK); - - res_dbl = ((struct_72byte(*)(struct_72byte, struct_72byte, - struct_72byte, struct_72byte))(code))(e_dbl, f_dbl, g_dbl, h_dbl); - /* { dg-output "\n22 15 17 25 6 13 19 18 16" } */ - printf("res: %g %g %g %g %g %g %g %g %" PRIdLL "\n", res_dbl.a, res_dbl.b, res_dbl.c, - res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i); - /* { dg-output "\nres: 22 15 17 25 6 13 19 18 16" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/testclosure.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/testclosure.c deleted file mode 100644 index ca31056..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/testclosure.c +++ /dev/null @@ -1,70 +0,0 @@ -/* Area: closure_call - Purpose: Check return value float. - Limitations: none. - PR: 41908. - Originator: 20091102 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct cls_struct_combined { - float a; - float b; - float c; - float d; -} cls_struct_combined; - -void cls_struct_combined_fn(struct cls_struct_combined arg) -{ - printf("%g %g %g %g\n", - arg.a, arg.b, - arg.c, arg.d); - fflush(stdout); -} - -static void -cls_struct_combined_gn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__, - void** args, void* userdata __UNUSED__) -{ - struct cls_struct_combined a0; - - a0 = *(struct cls_struct_combined*)(args[0]); - - cls_struct_combined_fn(a0); -} - - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type* cls_struct_fields0[5]; - ffi_type cls_struct_type0; - ffi_type* dbl_arg_types[5]; - - struct cls_struct_combined g_dbl = {4.0, 5.0, 1.0, 8.0}; - - cls_struct_type0.size = 0; - cls_struct_type0.alignment = 0; - cls_struct_type0.type = FFI_TYPE_STRUCT; - cls_struct_type0.elements = cls_struct_fields0; - - cls_struct_fields0[0] = &ffi_type_float; - cls_struct_fields0[1] = &ffi_type_float; - cls_struct_fields0[2] = &ffi_type_float; - cls_struct_fields0[3] = &ffi_type_float; - cls_struct_fields0[4] = NULL; - - dbl_arg_types[0] = &cls_struct_type0; - dbl_arg_types[1] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ffi_type_void, - dbl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_combined_gn, NULL, code) == FFI_OK); - - ((void(*)(cls_struct_combined)) (code))(g_dbl); - /* { dg-output "4 5 1 8" } */ - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/unwindtest.cc b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/unwindtest.cc deleted file mode 100644 index e114565..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/unwindtest.cc +++ /dev/null @@ -1,117 +0,0 @@ -/* Area: ffi_closure, unwind info - Purpose: Check if the unwind information is passed correctly. - Limitations: none. - PR: none. - Originator: Jeff Sturm */ - -/* { dg-do run { xfail x86_64-apple-darwin* moxie*-*-* } } */ - -#include "ffitest.h" - -void ABI_ATTR -closure_test_fn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__, - void** args __UNUSED__, void* userdata __UNUSED__) -{ - throw 9; -} - -typedef void (*closure_test_type)(); - -void closure_test_fn1(ffi_cif* cif __UNUSED__, void* resp, - void** args, void* userdata __UNUSED__) - { - *(ffi_arg*)resp = - (int)*(float *)args[0] +(int)(*(float *)args[1]) + - (int)(*(float *)args[2]) + (int)*(float *)args[3] + - (int)(*(signed short *)args[4]) + (int)(*(float *)args[5]) + - (int)*(float *)args[6] + (int)(*(int *)args[7]) + - (int)(*(double*)args[8]) + (int)*(int *)args[9] + - (int)(*(int *)args[10]) + (int)(*(float *)args[11]) + - (int)*(int *)args[12] + (int)(*(int *)args[13]) + - (int)(*(int *)args[14]) + *(int *)args[15] + (int)(intptr_t)userdata; - - printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", - (int)*(float *)args[0], (int)(*(float *)args[1]), - (int)(*(float *)args[2]), (int)*(float *)args[3], - (int)(*(signed short *)args[4]), (int)(*(float *)args[5]), - (int)*(float *)args[6], (int)(*(int *)args[7]), - (int)(*(double *)args[8]), (int)*(int *)args[9], - (int)(*(int *)args[10]), (int)(*(float *)args[11]), - (int)*(int *)args[12], (int)(*(int *)args[13]), - (int)(*(int *)args[14]), *(int *)args[15], - (int)(intptr_t)userdata, (int)*(ffi_arg*)resp); - - throw (int)*(ffi_arg*)resp; -} - -typedef int (*closure_test_type1)(float, float, float, float, signed short, - float, float, int, double, int, int, float, - int, int, int, int); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = (ffi_closure *)ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[17]; - - { - cl_arg_types[1] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0, - &ffi_type_void, cl_arg_types) == FFI_OK); - CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn, NULL, code) == FFI_OK); - - try - { - (*((closure_test_type)(code)))(); - } catch (int exception_code) - { - CHECK(exception_code == 9); - } - - printf("part one OK\n"); - /* { dg-output "part one OK" } */ - } - - { - - cl_arg_types[0] = &ffi_type_float; - cl_arg_types[1] = &ffi_type_float; - cl_arg_types[2] = &ffi_type_float; - cl_arg_types[3] = &ffi_type_float; - cl_arg_types[4] = &ffi_type_sshort; - cl_arg_types[5] = &ffi_type_float; - cl_arg_types[6] = &ffi_type_float; - cl_arg_types[7] = &ffi_type_uint; - cl_arg_types[8] = &ffi_type_double; - cl_arg_types[9] = &ffi_type_uint; - cl_arg_types[10] = &ffi_type_uint; - cl_arg_types[11] = &ffi_type_float; - cl_arg_types[12] = &ffi_type_uint; - cl_arg_types[13] = &ffi_type_uint; - cl_arg_types[14] = &ffi_type_uint; - cl_arg_types[15] = &ffi_type_uint; - cl_arg_types[16] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, - &ffi_type_sint, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn1, - (void *) 3 /* userdata */, code) == FFI_OK); - try - { - (*((closure_test_type1)code)) - (1.1, 2.2, 3.3, 4.4, 127, 5.5, 6.6, 8, 9, 10, 11, 12.0, 13, - 19, 21, 1); - /* { dg-output "\n1 2 3 4 127 5 6 8 9 10 11 12 13 19 21 1 3: 255" } */ - } catch (int exception_code) - { - CHECK(exception_code == 255); - } - printf("part two OK\n"); - /* { dg-output "\npart two OK" } */ - } - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/unwindtest_ffi_call.cc b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/unwindtest_ffi_call.cc deleted file mode 100644 index 153d240..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.closures/unwindtest_ffi_call.cc +++ /dev/null @@ -1,54 +0,0 @@ -/* Area: ffi_call, unwind info - Purpose: Check if the unwind information is passed correctly. - Limitations: none. - PR: none. - Originator: Andreas Tobler 20061213 */ - -/* { dg-do run { xfail moxie*-*-* } } */ - -#include "ffitest.h" - -static int checking(int a __UNUSED__, short b __UNUSED__, - signed char c __UNUSED__) -{ - throw 9; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_arg rint; - - signed int si; - signed short ss; - signed char sc; - - args[0] = &ffi_type_sint; - values[0] = &si; - args[1] = &ffi_type_sshort; - values[1] = &ss; - args[2] = &ffi_type_schar; - values[2] = ≻ - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, - &ffi_type_sint, args) == FFI_OK); - - si = -6; - ss = -12; - sc = -1; - { - try - { - ffi_call(&cif, FFI_FN(checking), &rint, values); - } catch (int exception_code) - { - CHECK(exception_code == 9); - } - printf("part one OK\n"); - /* { dg-output "part one OK" } */ - } - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex.inc b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex.inc deleted file mode 100644 index 4a812ed..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex.inc +++ /dev/null @@ -1,91 +0,0 @@ -/* -*-c-*- */ -#include "ffitest.h" -#include - -typedef struct cls_struct_align { - unsigned char a; - _Complex T_C_TYPE b; - unsigned char c; -} cls_struct_align; - -cls_struct_align cls_struct_align_fn( - struct cls_struct_align a1, struct cls_struct_align a2) -{ - struct cls_struct_align result; - - result.a = a1.a + a2.a; - result.b = a1.b + a2.b; - result.c = a1.c + a2.c; - - printf("%d %f,%fi %d %d %f,%fi %d: %d %f,%fi %d\n", - a1.a, T_CONV creal (a1.b), T_CONV cimag (a1.b), a1.c, - a2.a, T_CONV creal (a2.b), T_CONV cimag (a2.b), a2.c, - result.a, T_CONV creal (result.b), T_CONV cimag (result.b), result.c); - - return result; -} - -static void -cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - - struct cls_struct_align a1, a2; - - a1 = *(struct cls_struct_align*)(args[0]); - a2 = *(struct cls_struct_align*)(args[1]); - - *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args_c[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* c_arg_types[5]; - - struct cls_struct_align g_c = { 12, 4951 + 7 * I, 127 }; - struct cls_struct_align f_c = { 1, 9320 + 1 * I, 13 }; - struct cls_struct_align res_c; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - cls_struct_fields[0] = &ffi_type_uchar; - cls_struct_fields[1] = &T_FFI_TYPE; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = NULL; - - c_arg_types[0] = &cls_struct_type; - c_arg_types[1] = &cls_struct_type; - c_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - c_arg_types) == FFI_OK); - - args_c[0] = &g_c; - args_c[1] = &f_c; - args_c[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_c, args_c); - /* { dg-output "12 4951,7i 127 1 9320,1i 13: 13 14271,8i 140" } */ - printf("res: %d %f,%fi %d\n", - res_c.a, T_CONV creal (res_c.b), T_CONV cimag (res_c.b), res_c.c); - /* { dg-output "\nres: 13 14271,8i 140" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); - - res_c = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_c, f_c); - /* { dg-output "\n12 4951,7i 127 1 9320,1i 13: 13 14271,8i 140" } */ - printf("res: %d %f,%fi %d\n", - res_c.a, T_CONV creal (res_c.b), T_CONV cimag (res_c.b), res_c.c); - /* { dg-output "\nres: 13 14271,8i 140" } */ - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_double.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_double.c deleted file mode 100644 index 0dff23a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_double.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure alignment of complex. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_double.inc" -#include "cls_align_complex.inc" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_float.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_float.c deleted file mode 100644 index 0affbd0..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_float.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure alignment of complex. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_float.inc" -#include "cls_align_complex.inc" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_longdouble.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_longdouble.c deleted file mode 100644 index 7889ba8..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_longdouble.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure alignment of complex. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_longdouble.inc" -#include "cls_align_complex.inc" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex.inc b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex.inc deleted file mode 100644 index f937404..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex.inc +++ /dev/null @@ -1,42 +0,0 @@ -/* -*-c-*- */ -#include "ffitest.h" -#include - -static void cls_ret_complex_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) - { - _Complex T_C_TYPE *pa; - _Complex T_C_TYPE *pr; - pa = (_Complex T_C_TYPE *)args[0]; - pr = (_Complex T_C_TYPE *)resp; - *pr = *pa; - - printf("%.6f,%.6fi: %.6f,%.6fi\n", - T_CONV creal (*pa), T_CONV cimag (*pa), - T_CONV creal (*pr), T_CONV cimag (*pr)); - } -typedef _Complex T_C_TYPE (*cls_ret_complex)(_Complex T_C_TYPE); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[2]; - _Complex T_C_TYPE res; - - cl_arg_types[0] = &T_FFI_TYPE; - cl_arg_types[1] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &T_FFI_TYPE, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_complex_fn, NULL, code) == FFI_OK); - - res = (*((cls_ret_complex)code))(0.125 + 128.0 * I); - printf("res: %.6f,%.6fi\n", T_CONV creal (res), T_CONV cimag (res)); - CHECK (res == (0.125 + 128.0 * I)); - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_double.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_double.c deleted file mode 100644 index 05e3534..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_double.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: closure_call - Purpose: Check return value complex. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_double.inc" -#include "cls_complex.inc" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_float.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_float.c deleted file mode 100644 index 5df7849..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_float.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: closure_call - Purpose: Check return value complex. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_float.inc" -#include "cls_complex.inc" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_longdouble.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_longdouble.c deleted file mode 100644 index 2b1c320..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_longdouble.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: closure_call - Purpose: Check return value complex. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_longdouble.inc" -#include "cls_complex.inc" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct.inc b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct.inc deleted file mode 100644 index df8708d..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct.inc +++ /dev/null @@ -1,71 +0,0 @@ -/* -*-c-*- */ -#include "ffitest.h" -#include - -typedef struct Cs { - _Complex T_C_TYPE x; - _Complex T_C_TYPE y; -} Cs; - -Cs gc; - -void -closure_test_fn(Cs p) -{ - printf("%.1f,%.1fi %.1f,%.1fi\n", - T_CONV creal (p.x), T_CONV cimag (p.x), - T_CONV creal (p.y), T_CONV cimag (p.y)); - gc = p; -} - -void -closure_test_gn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__, - void** args, void* userdata __UNUSED__) -{ - closure_test_fn(*(Cs*)args[0]); -} - -int main(int argc __UNUSED__, char** argv __UNUSED__) -{ - ffi_cif cif; - - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type *cl_arg_types[1]; - - ffi_type ts1_type; - ffi_type* ts1_type_elements[4]; - - Cs arg = { 1.0 + 11.0 * I, 2.0 + 22.0 * I}; - - ts1_type.size = 0; - ts1_type.alignment = 0; - ts1_type.type = FFI_TYPE_STRUCT; - ts1_type.elements = ts1_type_elements; - - ts1_type_elements[0] = &T_FFI_TYPE; - ts1_type_elements[1] = &T_FFI_TYPE; - ts1_type_elements[2] = NULL; - - cl_arg_types[0] = &ts1_type; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &ffi_type_void, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_gn, NULL, code) == FFI_OK); - - gc.x = 0.0 + 0.0 * I; - gc.y = 0.0 + 0.0 * I; - ((void*(*)(Cs))(code))(arg); - /* { dg-output "1.0,11.0i 2.0,22.0i\n" } */ - CHECK (gc.x == arg.x && gc.y == arg.y); - - gc.x = 0.0 + 0.0 * I; - gc.y = 0.0 + 0.0 * I; - closure_test_fn(arg); - /* { dg-output "1.0,11.0i 2.0,22.0i\n" } */ - CHECK (gc.x == arg.x && gc.y == arg.y); - - return 0; -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_double.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_double.c deleted file mode 100644 index ec71346..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_double.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check complex arguments in structs. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_double.inc" -#include "cls_complex_struct.inc" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_float.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_float.c deleted file mode 100644 index 96fdf75..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_float.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check complex arguments in structs. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_float.inc" -#include "cls_complex_struct.inc" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_longdouble.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_longdouble.c deleted file mode 100644 index 005b467..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_longdouble.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check complex arguments in structs. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_longdouble.inc" -#include "cls_complex_struct.inc" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va.inc b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va.inc deleted file mode 100644 index 8a3e15f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va.inc +++ /dev/null @@ -1,80 +0,0 @@ -/* -*-c-*- */ -#include "ffitest.h" -#include -#include -#include -#include - -static _Complex T_C_TYPE gComplexValue1 = 1 + 2 * I; -static _Complex T_C_TYPE gComplexValue2 = 3 + 4 * I; - -static int cls_variadic(const char *format, ...) -{ - va_list ap; - _Complex T_C_TYPE p1, p2; - - va_start (ap, format); - p1 = va_arg (ap, _Complex T_C_TYPE); - p2 = va_arg (ap, _Complex T_C_TYPE); - va_end (ap); - - return printf(format, T_CONV creal (p1), T_CONV cimag (p1), - T_CONV creal (p2), T_CONV cimag (p2)); -} - -static void -cls_complex_va_fn(ffi_cif* cif __UNUSED__, void* resp, - void** args, void* userdata __UNUSED__) -{ - char* format = *(char**)args[0]; - gComplexValue1 = *(_Complex T_C_TYPE*)args[1]; - gComplexValue2 = *(_Complex T_C_TYPE*)args[2]; - - *(ffi_arg*)resp = - printf(format, - T_CONV creal (gComplexValue1), T_CONV cimag (gComplexValue1), - T_CONV creal (gComplexValue2), T_CONV cimag (gComplexValue2)); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args[4]; - ffi_type* arg_types[4]; - char *format = "%.1f,%.1fi %.1f,%.1fi\n"; - - _Complex T_C_TYPE complexArg1 = 1.0 + 22.0 *I; - _Complex T_C_TYPE complexArg2 = 333.0 + 4444.0 *I; - ffi_arg res = 0; - - arg_types[0] = &ffi_type_pointer; - arg_types[1] = &T_FFI_TYPE; - arg_types[2] = &T_FFI_TYPE; - arg_types[3] = NULL; - - /* This printf call is variadic */ - CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 3, &ffi_type_sint, - arg_types) == FFI_OK); - - args[0] = &format; - args[1] = &complexArg1; - args[2] = &complexArg2; - args[3] = NULL; - - ffi_call(&cif, FFI_FN(cls_variadic), &res, args); - printf("res: %d\n", (int) res); - CHECK (res == 24); - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_complex_va_fn, NULL, code) - == FFI_OK); - - res = ((int(*)(char *, ...))(code))(format, complexArg1, complexArg2); - CHECK (gComplexValue1 == complexArg1); - CHECK (gComplexValue2 == complexArg2); - printf("res: %d\n", (int) res); - CHECK (res == 24); - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_double.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_double.c deleted file mode 100644 index 879ccf3..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_double.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Test complex' passed in variable argument lists. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_double.inc" -#include "cls_complex_va.inc" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_float.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_float.c deleted file mode 100644 index 2b17826..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_float.c +++ /dev/null @@ -1,16 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Test complex' passed in variable argument lists. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -/* Alpha splits _Complex into two arguments. It's illegal to pass - float through varargs, so _Complex float goes badly. In sort of - gets passed as _Complex double, but the compiler doesn't agree - with itself on this issue. */ -/* { dg-do run { xfail alpha*-*-* } } */ - -#include "complex_defs_float.inc" -#include "cls_complex_va.inc" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_longdouble.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_longdouble.c deleted file mode 100644 index 6eca965..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_longdouble.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Test complex' passed in variable argument lists. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_longdouble.inc" -#include "cls_complex_va.inc" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/complex.exp b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/complex.exp deleted file mode 100644 index 4631db2..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/complex.exp +++ /dev/null @@ -1,36 +0,0 @@ -# Copyright (C) 2003, 2006, 2009, 2010, 2014 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; see the file COPYING3. If not see -# . - -dg-init -libffi-init - -global srcdir subdir - -set tlist [lsort [glob -nocomplain -- $srcdir/$subdir/*.{c,cc}]] - -if { [libffi_feature_test "#ifdef FFI_TARGET_HAS_COMPLEX_TYPE"] } { - run-many-tests $tlist "" -} else { - foreach test $tlist { - unsupported "$test" - } -} - -dg-finish - -# Local Variables: -# tcl-indent-level:4 -# End: diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/complex.inc b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/complex.inc deleted file mode 100644 index 515ae3e..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/complex.inc +++ /dev/null @@ -1,51 +0,0 @@ -/* -*-c-*-*/ -#include "ffitest.h" -#include - -static _Complex T_C_TYPE f_complex(_Complex T_C_TYPE c, int x, int *py) -{ - c = -(2 * creal (c)) + (cimag (c) + 1)* I; - *py += x; - - return c; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - - _Complex T_C_TYPE tc_arg; - _Complex T_C_TYPE tc_result; - int tc_int_arg_x; - int tc_y; - int *tc_ptr_arg_y = &tc_y; - - args[0] = &T_FFI_TYPE; - args[1] = &ffi_type_sint; - args[2] = &ffi_type_pointer; - values[0] = &tc_arg; - values[1] = &tc_int_arg_x; - values[2] = &tc_ptr_arg_y; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, - &T_FFI_TYPE, args) == FFI_OK); - - tc_arg = 1 + 7 * I; - tc_int_arg_x = 1234; - tc_y = 9876; - ffi_call(&cif, FFI_FN(f_complex), &tc_result, values); - - printf ("%f,%fi %f,%fi, x %d 1234, y %d 11110\n", - T_CONV creal (tc_result), T_CONV cimag (tc_result), - T_CONV creal (2.0), T_CONV creal (8.0), tc_int_arg_x, tc_y); - - CHECK (creal (tc_result) == -2); - CHECK (cimag (tc_result) == 8); - CHECK (tc_int_arg_x == 1234); - CHECK (*tc_ptr_arg_y == 11110); - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_double.inc b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_double.inc deleted file mode 100644 index 3583e16..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_double.inc +++ /dev/null @@ -1,7 +0,0 @@ -/* -*-c-*- */ -/* Complex base type. */ -#define T_FFI_TYPE ffi_type_complex_double -/* C type corresponding to the base type. */ -#define T_C_TYPE double -/* C cast for a value of type T_C_TYPE that is passed to printf. */ -#define T_CONV diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_float.inc b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_float.inc deleted file mode 100644 index bbd9375..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_float.inc +++ /dev/null @@ -1,7 +0,0 @@ -/* -*-c-*- */ -/* Complex base type. */ -#define T_FFI_TYPE ffi_type_complex_float -/* C type corresponding to the base type. */ -#define T_C_TYPE float -/* C cast for a value of type T_C_TYPE that is passed to printf. */ -#define T_CONV (double) diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_longdouble.inc b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_longdouble.inc deleted file mode 100644 index 14b9f24..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_longdouble.inc +++ /dev/null @@ -1,7 +0,0 @@ -/* -*-c-*- */ -/* Complex base type. */ -#define T_FFI_TYPE ffi_type_complex_longdouble -/* C type corresponding to the base type. */ -#define T_C_TYPE long double -/* C cast for a value of type T_C_TYPE that is passed to printf. */ -#define T_CONV diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/complex_double.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/complex_double.c deleted file mode 100644 index 8a3297b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/complex_double.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call - Purpose: Check complex types. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_double.inc" -#include "complex.inc" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/complex_float.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/complex_float.c deleted file mode 100644 index 5044ebb..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/complex_float.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call - Purpose: Check complex types. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_float.inc" -#include "complex.inc" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/complex_int.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/complex_int.c deleted file mode 100644 index bac3190..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/complex_int.c +++ /dev/null @@ -1,86 +0,0 @@ -/* Area: ffi_call - Purpose: Check non-standard complex types. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "ffitest.h" -#include "ffi.h" -#include - -_Complex int f_complex(_Complex int c, int x, int *py) -{ - __real__ c = -2 * __real__ c; - __imag__ c = __imag__ c + 1; - *py += x; - return c; -} - -/* - * This macro can be used to define new complex type descriptors - * in a platform independent way. - * - * name: Name of the new descriptor is ffi_type_complex_. - * type: The C base type of the complex type. - */ -#define FFI_COMPLEX_TYPEDEF(name, type, ffitype) \ - static ffi_type *ffi_elements_complex_##name [2] = { \ - (ffi_type *)(&ffitype), NULL \ - }; \ - struct struct_align_complex_##name { \ - char c; \ - _Complex type x; \ - }; \ - ffi_type ffi_type_complex_##name = { \ - sizeof(_Complex type), \ - offsetof(struct struct_align_complex_##name, x), \ - FFI_TYPE_COMPLEX, \ - (ffi_type **)ffi_elements_complex_##name \ - } - -/* Define new complex type descriptors using the macro: */ -/* ffi_type_complex_sint */ -FFI_COMPLEX_TYPEDEF(sint, int, ffi_type_sint); -/* ffi_type_complex_uchar */ -FFI_COMPLEX_TYPEDEF(uchar, unsigned char, ffi_type_uint8); - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - - _Complex int tc_arg; - _Complex int tc_result; - int tc_int_arg_x; - int tc_y; - int *tc_ptr_arg_y = &tc_y; - - args[0] = &ffi_type_complex_sint; - args[1] = &ffi_type_sint; - args[2] = &ffi_type_pointer; - values[0] = &tc_arg; - values[1] = &tc_int_arg_x; - values[2] = &tc_ptr_arg_y; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &ffi_type_complex_sint, args) - == FFI_OK); - - tc_arg = 1 + 7 * I; - tc_int_arg_x = 1234; - tc_y = 9876; - ffi_call(&cif, FFI_FN(f_complex), &tc_result, values); - - printf ("%d,%di %d,%di, x %d 1234, y %d 11110\n", - (int)tc_result, (int)(tc_result * -I), 2, 8, tc_int_arg_x, tc_y); - /* dg-output "-2,8i 2,8i, x 1234 1234, y 11110 11110" */ - CHECK (creal (tc_result) == -2); - CHECK (cimag (tc_result) == 8); - CHECK (tc_int_arg_x == 1234); - CHECK (*tc_ptr_arg_y == 11110); - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/complex_longdouble.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/complex_longdouble.c deleted file mode 100644 index 7e78366..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/complex_longdouble.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call - Purpose: Check complex types. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_longdouble.inc" -#include "complex.inc" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/ffitest.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/ffitest.h deleted file mode 100644 index d27d362..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/ffitest.h +++ /dev/null @@ -1 +0,0 @@ -#include "../libffi.call/ffitest.h" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex.inc b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex.inc deleted file mode 100644 index e37a774..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex.inc +++ /dev/null @@ -1,78 +0,0 @@ -/* -*-c-*- */ -#include "ffitest.h" - -#include -#include - -static _Complex T_C_TYPE many(_Complex T_C_TYPE c1, - _Complex T_C_TYPE c2, - _Complex T_C_TYPE c3, - _Complex T_C_TYPE c4, - _Complex T_C_TYPE c5, - _Complex T_C_TYPE c6, - _Complex T_C_TYPE c7, - _Complex T_C_TYPE c8, - _Complex T_C_TYPE c9, - _Complex T_C_TYPE c10, - _Complex T_C_TYPE c11, - _Complex T_C_TYPE c12, - _Complex T_C_TYPE c13) -{ - printf("0 :%f,%fi\n" - "1 :%f,%fi\n" - "2 :%f,%fi\n" - "3 :%f,%fi\n" - "4 :%f,%fi\n" - "5 :%f,%fi\n" - "6 :%f,%fi\n" - "7 :%f,%fi\n" - "8 :%f,%fi\n" - "9 :%f,%fi\n" - "10:%f,%fi\n" - "11:%f,%fi\n" - "12:%f,%fi\n", - T_CONV creal (c1), T_CONV cimag (c1), - T_CONV creal (c2), T_CONV cimag (c2), - T_CONV creal (c3), T_CONV cimag (c3), - T_CONV creal (c4), T_CONV cimag (c4), - T_CONV creal (c5), T_CONV cimag (c5), - T_CONV creal (c6), T_CONV cimag (c6), - T_CONV creal (c7), T_CONV cimag (c7), - T_CONV creal (c8), T_CONV cimag (c8), - T_CONV creal (c9), T_CONV cimag (c9), - T_CONV creal (c10), T_CONV cimag (c10), - T_CONV creal (c11), T_CONV cimag (c11), - T_CONV creal (c12), T_CONV cimag (c12), - T_CONV creal (c13), T_CONV cimag (c13)); - - return (c1+c2-c3-c4+c5+c6+c7-c8-c9-c10-c11+c12+c13); -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[13]; - void *values[13]; - _Complex T_C_TYPE ca[13]; - _Complex T_C_TYPE c, cc; - int i; - - for (i = 0; i < 13; i++) - { - args[i] = &T_FFI_TYPE; - values[i] = &ca[i]; - ca[i] = i + (-20 - i) * I; - } - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 13, &T_FFI_TYPE, args) == FFI_OK); - - ffi_call(&cif, FFI_FN(many), &c, values); - - cc = many(ca[0], ca[1], ca[2], ca[3], ca[4], ca[5], ca[6], ca[7], ca[8], - ca[9], ca[10], ca[11], ca[12]); - CHECK(creal (cc) == creal (c)); - CHECK(cimag (cc) == cimag (c)); - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_double.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_double.c deleted file mode 100644 index 3fd53c3..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_double.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value complex, with many arguments - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_double.inc" -#include "many_complex.inc" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_float.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_float.c deleted file mode 100644 index c43d21c..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_float.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value complex, with many arguments - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_float.inc" -#include "many_complex.inc" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_longdouble.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_longdouble.c deleted file mode 100644 index dbab723..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_longdouble.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value complex, with many arguments - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_longdouble.inc" -#include "many_complex.inc" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex.inc b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex.inc deleted file mode 100644 index 8bf0c1f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex.inc +++ /dev/null @@ -1,37 +0,0 @@ -/* -*-c-*- */ -#include "ffitest.h" -#include - -static _Complex T_C_TYPE return_c(_Complex T_C_TYPE c) -{ - printf ("%f,%fi\n", T_CONV creal (c), T_CONV cimag (c)); - return 2 * c; -} -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - _Complex T_C_TYPE c, rc, rc2; - T_C_TYPE cr, ci; - - args[0] = &T_FFI_TYPE; - values[0] = &c; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &T_FFI_TYPE, args) == FFI_OK); - - for (cr = -127.0; cr < 127; cr++) - { - ci = 1000.0 - cr; - c = cr + ci * I; - ffi_call(&cif, FFI_FN(return_c), &rc, values); - rc2 = return_c(c); - printf ("%f,%fi vs %f,%fi\n", - T_CONV creal (rc), T_CONV cimag (rc), - T_CONV creal (rc2), T_CONV cimag (rc2)); - CHECK(rc == 2 * c); - } - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1.inc b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1.inc deleted file mode 100644 index 7cecc0f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1.inc +++ /dev/null @@ -1,41 +0,0 @@ -/* -*-c-*- */ -#include "ffitest.h" -#include - -static _Complex T_C_TYPE return_c(_Complex T_C_TYPE c1, float fl2, unsigned int in3, _Complex T_C_TYPE c4) -{ - return c1 + fl2 + in3 + c4; -} -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - _Complex T_C_TYPE c1, c4, rc, rc2; - float fl2; - unsigned int in3; - args[0] = &T_FFI_TYPE; - args[1] = &ffi_type_float; - args[2] = &ffi_type_uint; - args[3] = &T_FFI_TYPE; - values[0] = &c1; - values[1] = &fl2; - values[2] = &in3; - values[3] = &c4; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, - &T_FFI_TYPE, args) == FFI_OK); - c1 = 127.0 + 255.0 * I; - fl2 = 128.0; - in3 = 255; - c4 = 512.7 + 1024.1 * I; - - ffi_call(&cif, FFI_FN(return_c), &rc, values); - rc2 = return_c(c1, fl2, in3, c4); - printf ("%f,%fi vs %f,%fi\n", - T_CONV creal (rc), T_CONV cimag (rc), - T_CONV creal (rc2), T_CONV cimag (rc2)); - CHECK(rc == rc2); - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_double.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_double.c deleted file mode 100644 index 727410d..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_double.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value complex. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_double.inc" -#include "return_complex1.inc" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_float.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_float.c deleted file mode 100644 index a2aeada..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_float.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value complex. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_float.inc" -#include "return_complex1.inc" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_longdouble.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_longdouble.c deleted file mode 100644 index 103504b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_longdouble.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value complex. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_longdouble.inc" -#include "return_complex1.inc" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2.inc b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2.inc deleted file mode 100644 index 265170b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2.inc +++ /dev/null @@ -1,44 +0,0 @@ -/* -*-c-*- */ -#include "ffitest.h" -#include - -_Complex T_C_TYPE -return_c(_Complex T_C_TYPE c1, _Complex T_C_TYPE c2, - unsigned int in3, _Complex T_C_TYPE c4) -{ - volatile _Complex T_C_TYPE r = c1 + c2 + in3 + c4; - return r; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - _Complex T_C_TYPE c1, c2, c4, rc, rc2; - unsigned int in3; - args[0] = &T_FFI_TYPE; - args[1] = &T_FFI_TYPE; - args[2] = &ffi_type_uint; - args[3] = &T_FFI_TYPE; - values[0] = &c1; - values[1] = &c2; - values[2] = &in3; - values[3] = &c4; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, - &T_FFI_TYPE, args) == FFI_OK); - c1 = 127.0 + 255.0 * I; - c2 = 128.0 + 256.0; - in3 = 255; - c4 = 512.7 + 1024.1 * I; - - ffi_call(&cif, FFI_FN(return_c), &rc, values); - rc2 = return_c(c1, c2, in3, c4); - printf ("%f,%fi vs %f,%fi\n", - T_CONV creal (rc), T_CONV cimag (rc), - T_CONV creal (rc2), T_CONV cimag (rc2)); - CHECK(rc == rc2); - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_double.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_double.c deleted file mode 100644 index ab9efac..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_double.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value complex. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_double.inc" -#include "return_complex2.inc" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_float.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_float.c deleted file mode 100644 index d7f22c2..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_float.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value complex. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_float.inc" -#include "return_complex2.inc" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_longdouble.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_longdouble.c deleted file mode 100644 index 3edea62..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_longdouble.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value complex. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_longdouble.inc" -#include "return_complex2.inc" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_double.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_double.c deleted file mode 100644 index e2497cc..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_double.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value complex. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_double.inc" -#include "return_complex.inc" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_float.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_float.c deleted file mode 100644 index a35528f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_float.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value complex. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_float.inc" -#include "return_complex.inc" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_longdouble.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_longdouble.c deleted file mode 100644 index 142d7be..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_longdouble.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value complex. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_longdouble.inc" -#include "return_complex.inc" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.go/aa-direct.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.go/aa-direct.c deleted file mode 100644 index b00c404..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.go/aa-direct.c +++ /dev/null @@ -1,34 +0,0 @@ -/* { dg-do run } */ - -#include "static-chain.h" - -#if defined(__GNUC__) && !defined(__clang__) && defined(STATIC_CHAIN_REG) - -#include "ffitest.h" - -/* Blatent assumption here that the prologue doesn't clobber the - static chain for trivial functions. If this is not true, don't - define STATIC_CHAIN_REG, and we'll test what we can via other tests. */ -void *doit(void) -{ - register void *chain __asm__(STATIC_CHAIN_REG); - return chain; -} - -int main() -{ - ffi_cif cif; - void *result; - - CHECK(ffi_prep_cif(&cif, ABI_NUM, 0, &ffi_type_pointer, NULL) == FFI_OK); - - ffi_call_go(&cif, FFI_FN(doit), &result, NULL, &result); - - CHECK(result == &result); - - return 0; -} - -#else /* UNSUPPORTED */ -int main() { return 0; } -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.go/closure1.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.go/closure1.c deleted file mode 100644 index 7b34afc..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.go/closure1.c +++ /dev/null @@ -1,28 +0,0 @@ -/* { dg-do run } */ - -#include "ffitest.h" - -void doit(ffi_cif *cif, void *rvalue, void **avalue, void *closure) -{ - (void)cif; - (void)avalue; - *(void **)rvalue = closure; -} - -typedef void * (*FN)(void); - -int main() -{ - ffi_cif cif; - ffi_go_closure cl; - void *result; - - CHECK(ffi_prep_cif(&cif, ABI_NUM, 0, &ffi_type_pointer, NULL) == FFI_OK); - CHECK(ffi_prep_go_closure(&cl, &cif, doit) == FFI_OK); - - ffi_call_go(&cif, FFI_FN(*(FN *)&cl), &result, NULL, &cl); - - CHECK(result == &cl); - - exit(0); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.go/ffitest.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.go/ffitest.h deleted file mode 100644 index d27d362..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.go/ffitest.h +++ /dev/null @@ -1 +0,0 @@ -#include "../libffi.call/ffitest.h" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.go/go.exp b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.go/go.exp deleted file mode 100644 index 100c5e7..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.go/go.exp +++ /dev/null @@ -1,36 +0,0 @@ -# Copyright (C) 2003, 2006, 2009, 2010, 2014 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; see the file COPYING3. If not see -# . - -dg-init -libffi-init - -global srcdir subdir - -set tlist [lsort [glob -nocomplain -- $srcdir/$subdir/*.{c,cc}]] - -if { [libffi_feature_test "#ifdef FFI_GO_CLOSURES"] } { - run-many-tests $tlist "" -} else { - foreach test $tlist { - unsupported "$test" - } -} - -dg-finish - -# Local Variables: -# tcl-indent-level:4 -# End: diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.go/static-chain.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.go/static-chain.h deleted file mode 100644 index 3675b40..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi/testsuite/libffi.go/static-chain.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifdef __aarch64__ -# define STATIC_CHAIN_REG "x18" -#elif defined(__alpha__) -# define STATIC_CHAIN_REG "$1" -#elif defined(__arm__) -# define STATIC_CHAIN_REG "ip" -#elif defined(__sparc__) -# if defined(__arch64__) || defined(__sparcv9) -# define STATIC_CHAIN_REG "g5" -# else -# define STATIC_CHAIN_REG "g2" -# endif -#elif defined(__x86_64__) -# define STATIC_CHAIN_REG "r10" -#elif defined(__i386__) -# ifndef ABI_NUM -# define STATIC_CHAIN_REG "ecx" /* FFI_DEFAULT_ABI only */ -# endif -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/rbffi.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/rbffi.h deleted file mode 100644 index 89b3e32..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/rbffi.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2008, 2009, Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * 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 the Ruby FFI project 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 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. - */ - -#ifndef RBFFI_RBFFI_H -#define RBFFI_RBFFI_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#define MAX_PARAMETERS (32) - -extern VALUE rbffi_FFIModule; - -extern void rbffi_Type_Init(VALUE ffiModule); -extern void rbffi_Buffer_Init(VALUE ffiModule); -extern void rbffi_Invoker_Init(VALUE ffiModule); -extern void rbffi_Variadic_Init(VALUE ffiModule); -extern VALUE rbffi_AbstractMemoryClass, rbffi_InvokerClass; -extern int rbffi_type_size(VALUE type); -extern void rbffi_Thread_Init(VALUE moduleFFI); - -#ifdef __cplusplus -} -#endif - -#endif /* RBFFI_RBFFI_H */ diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/rbffi_endian.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/rbffi_endian.h deleted file mode 100644 index ebb8420..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/rbffi_endian.h +++ /dev/null @@ -1,59 +0,0 @@ -#ifndef JFFI_ENDIAN_H -#define JFFI_ENDIAN_H - -#ifndef _MSC_VER -#include -#endif - -#include - -#if defined(__linux__) || defined(__CYGWIN__) || defined(__GNU__) || defined(__GLIBC__) || defined(__HAIKU__) -# include -# if !defined(LITTLE_ENDIAN) && defined(__LITTLE_ENDIAN) -# define LITTLE_ENDIAN __LITTLE_ENDIAN -# endif -# if !defined(BIG_ENDIAN) && defined(__BIG_ENDIAN) -# define BIG_ENDIAN __BIG_ENDIAN -# endif -# if !defined(BYTE_ORDER) && defined(__BYTE_ORDER) -# define BYTE_ORDER __BYTE_ORDER -# endif -#endif - -#ifdef __sun -# include -# define LITTLE_ENDIAN 1234 -# define BIG_ENDIAN 4321 -# if defined(_BIG_ENDIAN) -# define BYTE_ORDER BIG_ENDIAN -# elif defined(_LITTLE_ENDIAN) -# define BYTE_ORDER LITTLE_ENDIAN -# else -# error "Cannot determine endian-ness" -# endif -#endif - -#if defined(_AIX) && !defined(BYTE_ORDER) -# define LITTLE_ENDIAN 1234 -# define BIG_ENDIAN 4321 -# if defined(__BIG_ENDIAN__) -# define BYTE_ORDER BIG_ENDIAN -# elif defined(__LITTLE_ENDIAN__) -# define BYTE_ORDER LITTLE_ENDIAN -# else -# error "Cannot determine endian-ness" -# endif -#endif - -#if defined(_WIN32) -# define LITTLE_ENDIAN 1234 -# define BIG_ENDIAN 4321 -# define BYTE_ORDER LITTLE_ENDIAN -#endif - -#if !defined(BYTE_ORDER) || !defined(LITTLE_ENDIAN) || !defined(BIG_ENDIAN) -# error "Cannot determine the endian-ness of this platform" -#endif - -#endif /* JFFI_ENDIAN_H */ - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ffi.gemspec b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ffi.gemspec deleted file mode 100644 index eaae515..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ffi.gemspec +++ /dev/null @@ -1,42 +0,0 @@ -require File.expand_path("../lib/#{File.basename(__FILE__, '.gemspec')}/version", __FILE__) - -Gem::Specification.new do |s| - s.name = 'ffi' - s.version = FFI::VERSION - s.author = 'Wayne Meissner' - s.email = 'wmeissner@gmail.com' - s.homepage = 'https://github.com/ffi/ffi/wiki' - s.summary = 'Ruby FFI' - s.description = 'Ruby FFI library' - if s.respond_to?(:metadata) - s.metadata['bug_tracker_uri'] = 'https://github.com/ffi/ffi/issues' - s.metadata['changelog_uri'] = 'https://github.com/ffi/ffi/blob/master/CHANGELOG.md' - s.metadata['documentation_uri'] = 'https://github.com/ffi/ffi/wiki' - s.metadata['wiki_uri'] = 'https://github.com/ffi/ffi/wiki' - s.metadata['source_code_uri'] = 'https://github.com/ffi/ffi/' - s.metadata['mailing_list_uri'] = 'http://groups.google.com/group/ruby-ffi' - end - s.files = `git ls-files -z`.split("\x0").reject do |f| - f =~ /^(\.|bench|gen|libtest|nbproject|spec)/ - end - - # Add libffi git files - lfs = `git --git-dir ext/ffi_c/libffi/.git ls-files -z`.split("\x0") - # Add autoconf generated files of libffi - lfs += %w[ configure config.guess config.sub install-sh ltmain.sh missing fficonfig.h.in ] - # Add automake generated files of libffi - lfs += `git --git-dir ext/ffi_c/libffi/.git ls-files -z *.am */*.am`.gsub(".am\0", ".in\0").split("\x0") - s.files += lfs.map do |f| - File.join("ext/ffi_c/libffi", f) - end - - s.extensions << 'ext/ffi_c/extconf.rb' - s.rdoc_options = %w[--exclude=ext/ffi_c/.*\.o$ --exclude=ffi_c\.(bundle|so)$] - s.license = 'BSD-3-Clause' - s.require_paths << 'ext/ffi_c' - s.required_ruby_version = '>= 2.3' - s.add_development_dependency 'rake', '~> 13.0' - s.add_development_dependency 'rake-compiler', '~> 1.0' - s.add_development_dependency 'rake-compiler-dock', '~> 1.0' - s.add_development_dependency 'rspec', '~> 2.14.1' -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/rakelib/ffi_gem_helper.rb b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/rakelib/ffi_gem_helper.rb deleted file mode 100644 index 74be131..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/rakelib/ffi_gem_helper.rb +++ /dev/null @@ -1,65 +0,0 @@ -require 'bundler' -require 'bundler/gem_helper' - -class FfiGemHelper < Bundler::GemHelper - attr_accessor :cross_platforms - - def install - super - - task "release:guard_clean" => ["release:update_history"] - - task "release:update_history" do - update_history - end - - task "release:rubygem_push" => ["gem:native", "gem:java"] - end - - def hfile - "CHANGELOG.md" - end - - def headline - '([^\w]*)(\d+\.\d+\.\d+(?:\.\w+)?)([^\w]+)([2Y][0Y][0-9Y][0-9Y]-[0-1M][0-9M]-[0-3D][0-9D])([^\w]*|$)' - end - - def reldate - Time.now.strftime("%Y-%m-%d") - end - - def update_history - hin = File.read(hfile) - hout = hin.sub(/#{headline}/) do - raise "#{hfile} isn't up-to-date for version #{version}" unless $2==version.to_s - $1 + $2 + $3 + reldate + $5 - end - if hout != hin - Bundler.ui.confirm "Updating #{hfile} for release." - File.write(hfile, hout) - Rake::FileUtilsExt.sh "git", "commit", hfile, "-m", "Update release date in #{hfile}" - end - end - - def tag_version - Bundler.ui.confirm "Tag release with annotation:" - m = File.read(hfile).match(/(?#{headline}.*?)#{headline}/m) || raise("Unable to find release notes in #{hfile}") - Bundler.ui.info(m[:annotation].gsub(/^/, " ")) - IO.popen(["git", "tag", "--file=-", version_tag], "w") do |fd| - fd.write m[:annotation] - end - yield if block_given? - rescue - Bundler.ui.error "Untagging #{version_tag} due to error." - sh_with_code "git tag -d #{version_tag}" - raise - end - - def rubygem_push(path) - cross_platforms.each do |ruby_platform| - super(path.gsub(/\.gem\z/, "-#{ruby_platform}.gem")) - end - super(path.gsub(/\.gem\z/, "-java.gem")) - super(path) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/samples/getlogin.rb b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/samples/getlogin.rb deleted file mode 100644 index 6713021..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/samples/getlogin.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'ffi' - -module Foo - extend FFI::Library - ffi_lib FFI::Library::LIBC - attach_function :getlogin, [ ], :string -end -puts "getlogin=#{Foo.getlogin}" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/samples/getpid.rb b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/samples/getpid.rb deleted file mode 100644 index 1720635..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/samples/getpid.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'ffi' - -module Foo - extend FFI::Library - ffi_lib FFI::Library::LIBC - attach_function :getpid, [ ], :int -end -puts "My pid=#{Foo.getpid}" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/samples/gettimeofday.rb b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/samples/gettimeofday.rb deleted file mode 100644 index 864bbb6..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/samples/gettimeofday.rb +++ /dev/null @@ -1,18 +0,0 @@ -require 'ffi' -require 'rbconfig' - -class Timeval < FFI::Struct - layout tv_sec: :ulong, tv_usec: :ulong -end -module LibC - extend FFI::Library - if FFI::Platform.windows? - ffi_lib RbConfig::CONFIG["LIBRUBY_SO"] - else - ffi_lib FFI::Library::LIBC - end - attach_function :gettimeofday, [ :pointer, :pointer ], :int -end -t = Timeval.new -LibC.gettimeofday(t.pointer, nil) -puts "t.tv_sec=#{t[:tv_sec]} t.tv_usec=#{t[:tv_usec]}" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/samples/hello.rb b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/samples/hello.rb deleted file mode 100644 index f2ccf37..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/samples/hello.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'ffi' - -module Foo - extend FFI::Library - ffi_lib FFI::Library::LIBC - attach_function("cputs", "puts", [ :string ], :int) -end -Foo.cputs("Hello, World via libc puts using FFI on MRI ruby") diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/samples/inotify.rb b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/samples/inotify.rb deleted file mode 100644 index 018d78c..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/samples/inotify.rb +++ /dev/null @@ -1,60 +0,0 @@ -require 'ffi' - -module Inotify - extend FFI::Library - ffi_lib FFI::Library::LIBC - class Event < FFI::Struct - layout \ - :wd, :int, - :mask, :uint, - :cookie, :uint, - :len, :uint - end - attach_function :init, :inotify_init, [ ], :int - attach_function :add_watch, :inotify_add_watch, [ :int, :string, :uint ], :int - attach_function :rm_watch, :inotify_rm_watch, [ :int, :uint ], :int - attach_function :read, [ :int, :buffer_out, :uint ], :int - IN_ACCESS=0x00000001 - IN_MODIFY=0x00000002 - IN_ATTRIB=0x00000004 - IN_CLOSE_WRITE=0x00000008 - IN_CLOSE_NOWRITE=0x00000010 - IN_CLOSE=(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE) - IN_OPEN=0x00000020 - IN_MOVED_FROM=0x00000040 - IN_MOVED_TO=0x00000080 - IN_MOVE= (IN_MOVED_FROM | IN_MOVED_TO) - IN_CREATE=0x00000100 - IN_DELETE=0x00000200 - IN_DELETE_SELF=0x00000400 - IN_MOVE_SELF=0x00000800 - # Events sent by the kernel. - IN_UNMOUNT=0x00002000 - IN_Q_OVERFLOW=0x00004000 - IN_IGNORED=0x00008000 - IN_ONLYDIR=0x01000000 - IN_DONT_FOLLOW=0x02000000 - IN_MASK_ADD=0x20000000 - IN_ISDIR=0x40000000 - IN_ONESHOT=0x80000000 - IN_ALL_EVENTS=(IN_ACCESS | IN_MODIFY | IN_ATTRIB | IN_CLOSE_WRITE \ - | IN_CLOSE_NOWRITE | IN_OPEN | IN_MOVED_FROM \ - | IN_MOVED_TO | IN_CREATE | IN_DELETE \ - | IN_DELETE_SELF | IN_MOVE_SELF) - -end -if $0 == __FILE__ - fd = Inotify.init - puts "fd=#{fd}" - wd = Inotify.add_watch(fd, "/tmp/", Inotify::IN_ALL_EVENTS) - fp = FFI::IO.for_fd(fd) - puts "wfp=#{fp}" - while true - buf = FFI::Buffer.alloc_out(Inotify::Event.size + 4096, 1, false) - ev = Inotify::Event.new buf - ready = IO.select([ fp ], nil, nil, nil) - n = Inotify.read(fd, buf, buf.total) - puts "Read #{n} bytes from inotify fd" - puts "event.wd=#{ev[:wd]} mask=#{ev[:mask]} len=#{ev[:len]} name=#{ev[:len] > 0 ? buf.get_string(16) : 'unknown'}" - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/samples/pty.rb b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/samples/pty.rb deleted file mode 100644 index 8b6b885..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/samples/pty.rb +++ /dev/null @@ -1,75 +0,0 @@ -require 'ffi' - -module PTY - private - module LibC - extend FFI::Library - ffi_lib FFI::Library::LIBC - attach_function :forkpty, [ :buffer_out, :buffer_out, :buffer_in, :buffer_in ], :int - attach_function :openpty, [ :buffer_out, :buffer_out, :buffer_out, :buffer_in, :buffer_in ], :int - attach_function :login_tty, [ :int ], :int - attach_function :close, [ :int ], :int - attach_function :strerror, [ :int ], :string - attach_function :fork, [], :int - attach_function :execv, [ :string, :buffer_in ], :int - attach_function :execvp, [ :string, :buffer_in ], :int - attach_function :dup2, [ :int, :int ], :int - attach_function :dup, [ :int ], :int - end - Buffer = FFI::Buffer - def self.build_args(args) - cmd = args.shift - cmd_args = args.map do |arg| - MemoryPointer.from_string(arg) - end - exec_args = MemoryPointer.new(:pointer, 1 + cmd_args.length + 1) - exec_cmd = MemoryPointer.from_string(cmd) - exec_args[0].put_pointer(0, exec_cmd) - cmd_args.each_with_index do |arg, i| - exec_args[i + 1].put_pointer(0, arg) - end - [ cmd, exec_args ] - end - public - def self.getpty(*args) - mfdp = Buffer.new :int - name = Buffer.new 1024 - # - # All the execv setup is done in the parent, since doing anything other than - # execv in the child after fork is really flakey - # - exec_cmd, exec_args = build_args(args) - pid = LibC.forkpty(mfdp, name, nil, nil) - raise "forkpty failed: #{LibC.strerror(FFI.errno)}" if pid < 0 - if pid == 0 - LibC.execvp(exec_cmd, exec_args) - exit 1 - end - masterfd = mfdp.get_int(0) - rfp = FFI::IO.for_fd(masterfd, "r") - wfp = FFI::IO.for_fd(LibC.dup(masterfd), "w") - if block_given? - yield rfp, wfp, pid - rfp.close unless rfp.closed? - wfp.close unless wfp.closed? - else - [ rfp, wfp, pid ] - end - end - def self.spawn(*args, &block) - self.getpty("/bin/sh", "-c", args[0], &block) - end -end -module LibC - extend FFI::Library - attach_function :close, [ :int ], :int - attach_function :write, [ :int, :buffer_in, :ulong ], :long - attach_function :read, [ :int, :buffer_out, :ulong ], :long -end -PTY.getpty("/bin/ls", "-alR", "/") { |rfd, wfd, pid| -#PTY.spawn("ls -laR /") { |rfd, wfd, pid| - puts "child pid=#{pid}" - while !rfd.eof? && (buf = rfd.gets) - puts "child: '#{buf.strip}'" - end -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/samples/qsort.rb b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/samples/qsort.rb deleted file mode 100644 index 58622c1..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/samples/qsort.rb +++ /dev/null @@ -1,20 +0,0 @@ -require 'ffi' - -module LibC - extend FFI::Library - ffi_lib FFI::Library::LIBC - callback :qsort_cmp, [ :pointer, :pointer ], :int - attach_function :qsort, [ :pointer, :ulong, :ulong, :qsort_cmp ], :int -end - -p = FFI::MemoryPointer.new(:int, 2) -p.put_array_of_int32(0, [ 2, 1 ]) -puts "ptr=#{p.inspect}" -puts "Before qsort #{p.get_array_of_int32(0, 2).join(', ')}" -LibC.qsort(p, 2, 4) do |p1, p2| - i1 = p1.get_int32(0) - i2 = p2.get_int32(0) - puts "In block: comparing #{i1} and #{i2}" - i1 < i2 ? -1 : i1 > i2 ? 1 : 0 -end -puts "After qsort #{p.get_array_of_int32(0, 2).join(', ')}" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/.gitignore b/example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/.gitignore deleted file mode 100644 index 9106b2a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -/.bundle/ -/.yardoc -/_yardoc/ -/coverage/ -/doc/ -/pkg/ -/spec/reports/ -/tmp/ diff --git a/example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/.rubocop.yml b/example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/.rubocop.yml deleted file mode 100644 index a91c832..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/.rubocop.yml +++ /dev/null @@ -1,30 +0,0 @@ -Metrics/AbcSize: - Max: 35 - -Metrics/CyclomaticComplexity: - Max: 10 - -Metrics/LineLength: - Max: 105 - -Metrics/MethodLength: - Max: 30 - -Style/AsciiComments: - Exclude: - - 'lib/fourflusher/executable.rb' - -Style/ClassVars: - Exclude: - - 'lib/fourflusher/find.rb' - -Style/Documentation: - Exclude: - - 'spec/**/*' - - 'test/**/*' - - 'lib/fourflusher/version.rb' - - 'lib/fourflusher/compat.rb' - -Lint/Void: - Exclude: - - 'spec/unit_spec.rb' diff --git a/example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/.travis.yml b/example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/.travis.yml deleted file mode 100644 index 5163910..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/.travis.yml +++ /dev/null @@ -1,8 +0,0 @@ -language: ruby -rvm: - - 2.0.0-p648 - - 2.5.1 -cache: bundler -before_install: gem install bundler -v "~> 1.17" -script: - - bundle exec rake diff --git a/example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/CHANGELOG.md b/example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/CHANGELOG.md deleted file mode 100644 index eaee477..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/CHANGELOG.md +++ /dev/null @@ -1,142 +0,0 @@ - -## 2.3.1 (2019-06-18) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Fixed crash with very long devices list/slow computers. - [Martin Fiebig](https://github.com/mfiebig) - [#17](https://github.com/CocoaPods/fourflusher/issues/17) - - -## 2.3.0 (2019-06-05) - -##### Enhancements - -* Update simctl interface for Xcode 11. - [Colin Humber](https://github.com/colinhumber) - [#22](https://github.com/CocoaPods/fourflusher/pull/22) - -##### Bug Fixes - -* None. - - -## 2.2.0 (2019-01-28) - -##### Enhancements - -* Update simctl interface for Xcode 10.2. - [Jeff Kelley](https://github.com/SlaunchaMan) - [CocoaPods#8458](https://github.com/CocoaPods/CocoaPods/issues/8458) - -##### Bug Fixes - -* None. - - -## 2.1.0 (2018-10-17) - -##### Enhancements - -* Support Xcode 10.1. - -##### Bug Fixes - -* None. - - -## 2.0.1 (2016-10-16) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Fixed crash with simulators comparison, when device model is undefined - [Roman Truba](https://github.com/dreddik) - [#9](https://github.com/CocoaPods/fourflusher/pull/9) - - -## v2.0.0 (2016-10-02) - -##### Breaking - -* Use JSON output from `xcrun simctl list`. Drop support for Xcode 6 (doesn't support JSON output) - [Ben Asher](https://github.com/benasher44) - [#6](https://github.com/CocoaPods/fourflusher/pull/6) - -##### Enhancements - -* Update simulator count for Travis - [Boris Bügling](https://github.com/neonichu) - [#5](https://github.com/CocoaPods/fourflusher/pull/5) - -* A more helpful error message for missing simulators - [Radek Pietruszewski](https://github.com/radex) - [#4](https://github.com/CocoaPods/fourflusher/pull/4) - -##### Bug Fixes - -* None - -## v1.0.1 (2016-06-25) - -##### Enhancements - -* Show better error for `:oldest` simulator search - [Boris Bügling](https://github.com/neonichu) - -## v1.0.0 (2016-06-24) - -##### Enhancements - -* Improve finding simulators - [Boris Bügling](https://github.com/neonichu) - -## v0.3.2 (2016-06-16) - -##### Enhancements - -* Support for parsing iOS 10.0 and tvOS 10.0 - [Boris Bügling](https://github.com/neonichu) - -##### Bug Fixes - -* Rubocop fixes - [Boris Bügling](https://github.com/neonichu) - -## v0.3.1 (2016-05-30) - -##### Enhancements - -* Travis CI improvements - [Boris Bügling](https://github.com/neonichu) - [#1](https://github.com/CocoaPods/fourflusher/pull/1) - -* Handle missing Xcode more gracefully - [Boris Bügling](https://github.com/neonichu) - -## v0.3.0 (2015-12-29) - -##### Enhancements - -* Allow specifying constraints for `destination()` - [Boris Bügling](https://github.com/neonichu) - -## v0.2.0 (2015-12-29) - -##### Enhancements - -* Allow constraining simulators by OS version - [Boris Bügling](https://github.com/neonichu) - -## v0.1.0 (2015-12-18) - -* List usable simulators. Find simulators by name. Get the destination setting for the simulator to pass to Xcodebuild - [Boris Bügling](https://github.com/neonichu) - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/Gemfile b/example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/Gemfile deleted file mode 100644 index fa75df1..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/Gemfile +++ /dev/null @@ -1,3 +0,0 @@ -source 'https://rubygems.org' - -gemspec diff --git a/example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/Gemfile.lock b/example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/Gemfile.lock deleted file mode 100644 index 76a65ad..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/Gemfile.lock +++ /dev/null @@ -1,47 +0,0 @@ -PATH - remote: . - specs: - fourflusher (2.3.1) - -GEM - remote: https://rubygems.org/ - specs: - ast (2.3.0) - astrolabe (1.3.1) - parser (~> 2.2) - diff-lcs (1.2.5) - parser (2.3.1.4) - ast (~> 2.2) - powerpack (0.1.1) - rainbow (2.1.0) - rake (10.5.0) - rspec (2.99.0) - rspec-core (~> 2.99.0) - rspec-expectations (~> 2.99.0) - rspec-mocks (~> 2.99.0) - rspec-core (2.99.2) - rspec-expectations (2.99.2) - diff-lcs (>= 1.1.3, < 2.0) - rspec-mocks (2.99.4) - rubocop (0.35.1) - astrolabe (~> 1.3) - parser (>= 2.2.3.0, < 3.0) - powerpack (~> 0.1) - rainbow (>= 1.99.1, < 3.0) - ruby-progressbar (~> 1.7) - tins (<= 1.6.0) - ruby-progressbar (1.8.1) - tins (1.6.0) - -PLATFORMS - ruby - -DEPENDENCIES - bundler (~> 1.11) - fourflusher! - rake (~> 10.0) - rspec (~> 2) - rubocop (~> 0.35.0) - -BUNDLED WITH - 1.17.3 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/LICENSE.txt b/example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/LICENSE.txt deleted file mode 100644 index 0d5eb7a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015 Boris Bügling - -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/example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/README.md b/example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/README.md deleted file mode 100644 index d4dd384..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# four-flusher - -A library for interacting with Xcode simulators. - -## Installation - -Add this line to your application's Gemfile: - -```ruby -gem 'fourflusher' -``` - -And then execute: - - $ bundle - -Or install it yourself as: - - $ gem install fourflusher - -## Development - -After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment. - -To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org). - -## Contributing - -Bug reports and pull requests are welcome on GitHub at https://github.com/CocoaPods/fourflusher. - -## License - -The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT). diff --git a/example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/Rakefile b/example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/Rakefile deleted file mode 100644 index 05f4f23..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/Rakefile +++ /dev/null @@ -1,9 +0,0 @@ -require 'bundler/gem_tasks' - -require 'rspec/core/rake_task' -RSpec::Core::RakeTask.new - -require 'rubocop/rake_task' -RuboCop::RakeTask.new(:rubocop) - -task default: [:spec, :rubocop] diff --git a/example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/bin/console b/example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/bin/console deleted file mode 100755 index 7124d1b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/bin/console +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env ruby - -require 'bundler/setup' -require 'fourflusher' - -# You can add fixtures and/or initialization code here to make experimenting -# with your gem easier. You can also use a different console, if you like. - -# (If you use this, don't forget to add pry to your Gemfile!) -# require "pry" -# Pry.start - -require 'irb' -IRB.start diff --git a/example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/bin/setup b/example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/bin/setup deleted file mode 100755 index dce67d8..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/bin/setup +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail -IFS=$'\n\t' -set -vx - -bundle install - -# Do any other automated setup that you need to do here diff --git a/example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/fourflusher.gemspec b/example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/fourflusher.gemspec deleted file mode 100644 index b3003eb..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/fourflusher-2.3.1/fourflusher.gemspec +++ /dev/null @@ -1,27 +0,0 @@ -# coding: utf-8 -lib = File.expand_path('../lib', __FILE__) -$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) -require 'fourflusher/version' - -Gem::Specification.new do |spec| - spec.name = 'fourflusher' - spec.version = Fourflusher::VERSION - spec.authors = ['Boris Bügling'] - spec.email = ['boris@icculus.org'] - - spec.summary = 'A library for interacting with Xcode simulators.' - spec.homepage = 'https://github.com/neonichu/fourflusher' - spec.license = 'MIT' - - spec.files = `git ls-files -z`.split("\x0").reject { |f| - f.match(%r{^(test|spec|features)/}) - } - spec.bindir = 'exe' - spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) } - spec.require_paths = ['lib'] - - spec.add_development_dependency 'bundler', '~> 1.11' - spec.add_development_dependency 'rake', '~> 10.0' - spec.add_development_dependency 'rspec', '~> 2' - spec.add_development_dependency 'rubocop', '~> 0.35.0' -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/.gitignore b/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/.gitignore deleted file mode 100644 index ee73f85..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -## MAC OS -.DS_Store - -## TEXTMATE -*.tmproj -tmtags - -## EMACS -*~ -\#* -.\#* - -## VIM -*.swp - -## PROJECT::GENERAL -coverage -doc -.yardoc -pkg - -## PROJECT::SPECIFIC -Gemfile.lock -*.gem diff --git a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/.rspec b/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/.rspec deleted file mode 100644 index 5f16476..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/.rspec +++ /dev/null @@ -1,2 +0,0 @@ ---color ---format progress diff --git a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/CHANGELOG b/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/CHANGELOG deleted file mode 100644 index a1d6c74..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/CHANGELOG +++ /dev/null @@ -1,93 +0,0 @@ -2.0.4 / 2013-09-19 - -* Bug fixes - - * Restore 1.8 compatibility per @zhaocai in #6 - -2.0.3 / 2013-08-11 - -* Enhancements - - * If you pass a non-String to #find, the :read will be automatically applied - -2.0.2 / 2013-08-11 - -* Enhancements - - * You can pass identity rules as procs that take record1 and record2 in their original forms (note they should return nil if not sure) - -2.0.1 / 2013-06-06 - -* Bug fixes - - * Fix Ruby 1.8 compatibility - thanks @trishume @fuzzy76 ! https://github.com/seamusabshere/fuzzy_match/issues/5 - -2.0.0 / 2013-05-22 - -* Breaking changes - - * normalizers removed - use groupings instead - * first_grouping_decides removed - * FuzzyMatch#free gone - -* Enhancements - - * chained groupings! - * faster and simpler structure - * FuzzyMatch#find_with_score returns [record, dice_score, lev_score] - -1.5.0 / 2013-04-03 - -* Breaking changes - - * No longer automatically calls to_regexp on rules - you must pass Regexps to normalizers, groupings, etc. - -* Enhancements - - * FuzzyMatch#find_best returns all top results with the same score - thanks @ihough ! - * Doesn't require to_regexp gem for you - you can still use it if you want to convert strings into regexps safely, if you want, tho - -1.4.1 / 2013-01-17 - -* Bug fixes - - * Don't die when you're comparing a string of length 1 and another string of length less than three (thanks @ihough !) - -* Enhancements - - * '2A' is allowed to match '2 A'... funky stuff with pair distance and short strings - * FuzzyMatch#find_all_with_score returns a sorted array of records with their scores - thanks @brycesenz! (https://github.com/seamusabshere/fuzzy_match/issues/3) - -1.4.0 / 2012-09-07 - -* Breaking changes - - * Option keys are no longer symbolized automatically - make sure you do that if there's any chance they'll be strings - * active_record_inline_schema is no longer a runtime dependency - add it to your Gemfile if you use FuzzyMatch::CachedResult - -* Enhancements - - * Tiny bit better #explain(needle) - * Remove dependency on ActiveSupport - -1.3.3 / 2012-04-13 - -* Enhancements - - * Now you must require 'fuzzy_match/cached_result' if you want to use it. - * Use active_record_inline_schema to create the FuzzyMatch::CachedResult table - * Test against CohortAnalysis, the replacement for CohortScope - * Fix some other random deprecations (like set_primary_key) - -1.3.2 / 2012-02-24 - -* Enhancements - - * Start keeping a changelog! - * renamed blockings to groupings - * cleaned up tests - -* Bug fixes - - * better handling for one-letter similiarities like 'X foo' vs 'X bar' which couldn't be detected by pair distance - * take deprecated option :tighteners as :normalizers diff --git a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/Gemfile b/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/Gemfile deleted file mode 100644 index e3e0762..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/Gemfile +++ /dev/null @@ -1,11 +0,0 @@ -source :rubygems - -gemspec - -# bin/fuzzy_match development -gem 'activesupport' -gem 'remote_table' -gem 'thor' -gem 'to_regexp' -gem 'perftools.rb' -gem 'pry' diff --git a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/LICENSE b/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/LICENSE deleted file mode 100644 index 968ab96..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -Copyright 2011 Brighter Planet, Inc. - -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/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/README.markdown b/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/README.markdown deleted file mode 100644 index 03d29c3..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/README.markdown +++ /dev/null @@ -1,191 +0,0 @@ -## Top 3 reasons you should use FuzzyMatch - -1. *intelligent defaults*: it uses a combination of Pair Distance (2-gram) and Levenshtein Edit Distance to effectively match many examples with no configuration -2. *all-vs-all*: it takes care of finding the optimal match by comparing everything against everything else (when that's necessary) -3. *refinable*: you might get to 90% with no configuration, but if you need to go beyond you can use regexps, grouping, and stop words - -It solves many mid-range matching problems — if your haystack is ~10k records — if you can winnow down the initial possibilities at the database level and only bring good contenders into app memory — why not give it a shot? - -# FuzzyMatch - -Find a needle in a haystack based on string similarity and regular expression rules. - -Replaces [`loose_tight_dictionary`](https://github.com/seamusabshere/loose_tight_dictionary) because that was a confusing name. - -Warning! `normalizers` are gone in version 2 and above! See the CHANGELOG and check out enhanced (and hopefully more intuitive) `groupings`. - -![diagram of matching process](https://raw.github.com/seamusabshere/fuzzy_match/master/highlevel.png) - -## Quickstart - - >> require 'fuzzy_match' - => true - >> FuzzyMatch.new(['seamus', 'andy', 'ben']).find('Shamus') - => "seamus" - -See also the blog post [Fuzzy match in Ruby](http://numbers.brighterplanet.com/2012/01/18/fuzzy-match-in-ruby/). - -## Default matching (string similarity) - -At the core, and even if you configure nothing else, string similarity (calculated by "pair distance" aka Dice's Coefficient) is used to compare records. - -You can tell `FuzzyMatch` what field or method to use via the `:read` option... for example, let's say you want to match a `Country` object like `#` - - >> fz = FuzzyMatch.new(Country.all, :read => :name) - => # - >> fz.find('youruguay') - => # - -## Optional rules (regular expressions) - -You can improve the default matchings with rules. There are 3 different kinds of rules. Each rule is a regular expression. - -We suggest that you **first try without any rules** and only define them to improve matching, prevent false positives, etc. - -### Groupings - -Group records together. The two laws of groupings: - -1. If a needle matches a grouping, only compare it with straws in the same grouping; (the "buddies vs buddies" rule) -2. If a needle doesn't match any grouping, only compare it with straws that also don't match ANY grouping (the "misfits vs misfits" rule) - -The two laws of chained groupings: (new in v2.0 and rather important) - -1. Sub-groupings (e.g., `/plaza/i` below) only match if their primary (e.g., `/ramada/i`) does -2. In final grouping decisions, sub-groupings win over primaries (so "Ramada Inn" is NOT grouped with "Ramada Plaza", but if you removed `/plaza/i` sub-grouping, then they would be grouped together) - -Hopefully they are rather intuitive once you start using them. - -[![screenshot of spreadsheet of groupings](https://raw.github.com/seamusabshere/fuzzy_match/master/groupings-screenshot.png)](https://docs.google.com/spreadsheet/pub?key=0AkCJNpm9Ks6JdG4xSWhfWFlOV1RsZ2NCeU9seGx6cnc&single=true&gid=0&output=html) - -That will... - -* separate "Orient Express Hotel" and "Ramada Conference Center Mandarin" from real Mandarin Oriental hotels -* keep "Trump Hotel Collection" away from "Luxury Collection" (another real hotel brand) without messing with the word "Luxury" -* make sure that "Ramada Plaza" are always grouped with other RPs—and not with plain old Ramadas—and vice versa -* splits out Hyatts into their different brands -* and more - -You specify chained groupings as arrays of regexps: - - groupings = [ - /mandarin/i, - /trump/i, - [ /ramada/i, /plaza/i ], - ... - ] - fz = FuzzyMatch.new(haystack, groupings: groupings) - -This way of specifying groupings is meant to be easy to load from a CSV, like `bin/fuzzy_match` does. - -Formerly called "blockings," but that was jargon that confused people. - -### Identities - -Prevent impossible matches. Can be very confusing—see if you can make things work with groupings first. - -Adding an identity like `/(f)-?(\d50)/i` ensures that "Ford F-150" and "Ford F-250" never match. - -Note that identities do not establish certainty. They just say whether two records **could** be identical... then string similarity takes over. - -### Stop words - -Ignore common and/or meaningless words when doing string similarity. - -Adding a stop word like `THE` ensures that it is not taken into account when comparing "THE CAT", "THE DAT", and "THE CATT" - -Stop words are NOT removed when checking `:must_match_at_least_one_word` and when doing identities and groupings. - -## Find options - -* `read`: how to interpret each record in the 'haystack', either a Proc or a symbol -* `must_match_grouping`: don't return a match unless the needle fits into one of the groupings you specified -* `must_match_at_least_one_word`: don't return a match unless the needle shares at least one word with the match. Note that "Foo's" is treated like one word (so that it won't match "'s") and "Bolivia," is treated as just "bolivia" -* `gather_last_result`: enable `last_result` - -## Case sensitivity - -String similarity is case-insensitive. Everything is downcased before scoring. This is a change from previous versions. - -Be careful with uppercase letters in your rules; in general, things are downcased before comparing. - -## String similarity algorithm - -The algorithm is [Dice's Coefficient](http://en.wikipedia.org/wiki/Dice's_coefficient) (aka Pair Distance) because it seemed to work better than Longest Substring, Hamming, Jaro Winkler, Levenshtein (although see edge case below) etc. - -Here's a great explanation copied from [the wikipedia entry](http://en.wikipedia.org/wiki/Dice%27s_coefficient): - - to calculate the similarity between: - - night - nacht - - We would find the set of bigrams in each word: - - {ni,ig,gh,ht} - {na,ac,ch,ht} - - Each set has four elements, and the intersection of these two sets has only one element: ht. - - Inserting these numbers into the formula, we calculate, s = (2 · 1) / (4 + 4) = 0.25. - -### Edge case: when Dice's fails, use Levenshtein - -In edge cases where Dice's finds that two strings are equally similar to a third string, then Levenshtein distance is used. For example, pair distance considers "RATZ" and "CATZ" to be equally similar to "RITZ" so we invoke Levenshtein. - - >> 'RITZ'.pair_distance_similar 'RATZ' - => 0.3333333333333333 - >> 'RITZ'.pair_distance_similar 'CATZ' - => 0.3333333333333333 # pair distance can't tell the difference, so we fall back to levenshtein... - >> 'RITZ'.levenshtein_similar 'RATZ' - => 0.75 - >> 'RITZ'.levenshtein_similar 'CATZ' - => 0.5 # which properly shows that RATZ should win - -## Cached results - -Make sure you add active\_record\_inline\_schema to your gemfile. - -TODO write documentation. For now, please see how [we manually cache matches between aircraft and flight segments](https://github.com/brighterplanet/earth/blob/master/lib/earth/air/aircraft.rb). - -## Glossary - -The admittedly imperfect metaphor is "look for a needle in a haystack" - -* needle: the search term -* haystack: the records you are searching (your result will be an object from here) - -## Using amatch to make it faster - -You can optionally use [`amatch`](http://flori.github.com/amatch/) by [Florian Frank](https://github.com/flori) (thanks Flori!) to make string similarity calculations in a C extension. - - require 'fuzzy_match' - require 'amatch' # note that you have to require this... fuzzy_match won't require it for you - FuzzyMatch.engine = :amatch - -Otherwise, pure ruby versions of the string similarity algorithms derived from the [answer to a StackOverflow question](http://stackoverflow.com/questions/653157/a-better-similarity-ranking-algorithm-for-variable-length-strings) and [the text gem](https://github.com/threedaymonk/text/blob/master/lib/text/levenshtein.rb) are used. Thanks [marzagao](http://stackoverflow.com/users/10997/marzagao) and [threedaymonk](https://github.com/threedaymonk)! - -## Real-world usage - -

    Brighter Planet logo

    - -We use `fuzzy_match` for [data science at Brighter Planet](http://brighterplanet.com/research) and in production at - -* [Brighter Planet's impact estimate web service](http://impact.brighterplanet.com) -* [Brighter Planet's reference data web service](http://data.brighterplanet.com) - -We often combine it with [`remote_table`](https://github.com/seamusabshere/remote_table) and [`errata`](https://github.com/seamusabshere/errata): - -- download table with `remote_table` -- correct serious or repeated errors with `errata` -- `fuzzy_match` the rest - -## Authors - -* Seamus Abshere -* Ian Hough -* Andy Rossmeissl - -## Copyright - -Copyright 2013 Seamus Abshere diff --git a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/Rakefile b/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/Rakefile deleted file mode 100644 index 7ed4815..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/Rakefile +++ /dev/null @@ -1,5 +0,0 @@ -require 'bundler' -Bundler::GemHelper.install_tasks - -require 'yard' -YARD::Rake::YardocTask.new diff --git a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/THANKS-WILLIAM-JAMES.rb b/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/THANKS-WILLIAM-JAMES.rb deleted file mode 100644 index 57ac8c2..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/THANKS-WILLIAM-JAMES.rb +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env ruby - -# Thanks William James! -# http://www.ruby-forum.com/topic/95519#200484 -def cart_prod(*args) - args.inject([[]]){|old,lst| - new = [] - lst.each{|e| new += old.map{|c| c.dup << e }} - new - } -end - -require 'benchmark' - -a = [1,2,3] -b = [4,5] -Benchmark.bmbm do |x| - x.report("native") do - 500_000.times { a.product(b) } - end - x.report("william-james") do |x| - 500_000.times { cart_prod(a, b) } - end -end - -# results: -# $ ruby foo.rb -# Rehearsal ------------------------------------------------- -# native 0.720000 0.000000 0.720000 ( 0.729319) -# william-james 3.620000 0.010000 3.630000 ( 3.629198) -# ---------------------------------------- total: 4.350000sec -# -# user system total real -# native 0.710000 0.000000 0.710000 ( 0.708620) -# william-james 3.800000 0.000000 3.800000 ( 3.792538) - -# thanks for all the fish! diff --git a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/benchmark/before-with-free.txt b/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/benchmark/before-with-free.txt deleted file mode 100644 index b5729bb..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/benchmark/before-with-free.txt +++ /dev/null @@ -1,283 +0,0 @@ - 1962 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/activesupport-3.0.5/lib/active_support/core_ext/object/blank.rb:68:String - 1957 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/fastercsv-1.5.4/lib/faster_csv.rb:1632:String - 342 ./benchmark/../lib/fuzzy_match/wrapper.rb:29:String - 326 ./benchmark/../lib/fuzzy_match/wrapper.rb:29:Array - 325 benchmark/memory.rb:21:String - 325 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table/hasher.rb:20:String - 325 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table/format/delimited.rb:22:ActiveSupport::OrderedHash - 325 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table.rb:65:String - 325 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/activesupport-3.0.5/lib/active_support/ordered_hash.rb:39:Array - 325 ./benchmark/../lib/fuzzy_match/wrapper.rb:25:FuzzyMatch::Similarity - 325 ./benchmark/../lib/fuzzy_match/similarity.rb:57:Array - 325 ./benchmark/../lib/fuzzy_match/similarity.rb:25:FuzzyMatch::Score - 325 ./benchmark/../lib/fuzzy_match/score.rb:13:Float - 325 ./benchmark/../lib/fuzzy_match.rb:35:FuzzyMatch::Wrapper - 320 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table/format/delimited.rb:28:String - 303 ./benchmark/../lib/fuzzy_match/similarity.rb:21:Float - 201 ./benchmark/../lib/fuzzy_match/normalizer.rb:20:String - 184 ./benchmark/../lib/fuzzy_match/normalizer.rb:14:String - 140 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch.bundle:0:__node__ - 41 ./benchmark/../lib/fuzzy_match/similarity.rb:49:__node__ - 31 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:27:Regexp - 28 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:19:__node__ - 22 ./benchmark/../lib/fuzzy_match/similarity.rb:57:__node__ - 22 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:20:__node__ - 21 ./benchmark/../lib/fuzzy_match.rb:199:FuzzyMatch::Grouping - 17 ./benchmark/../lib/fuzzy_match/similarity.rb:21:__node__ - 16 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch.bundle:0:Class - 14 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:4:__node__ - 14 ./benchmark/../lib/fuzzy_match/similarity.rb:37:__node__ - 13 ./benchmark/../lib/fuzzy_match/wrapper.rb:15:__node__ - 13 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:27:__node__ - 12 ./benchmark/../lib/fuzzy_match/wrapper.rb:29:__node__ - 12 ./benchmark/../lib/fuzzy_match/wrapper.rb:19:__node__ - 11 ./benchmark/../lib/fuzzy_match/identity.rb:18:__node__ - 11 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:26:__node__ - 11 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:25:__node__ - 11 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:24:__node__ - 10 ./benchmark/../lib/fuzzy_match/similarity.rb:55:__node__ - 10 ./benchmark/../lib/fuzzy_match/similarity.rb:39:__node__ - 10 ./benchmark/../lib/fuzzy_match/similarity.rb:25:__node__ - 10 ./benchmark/../lib/fuzzy_match.rb:193:FuzzyMatch::Identity - 9 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch.bundle:0:String - 9 ./benchmark/../lib/fuzzy_match/wrapper.rb:10:__node__ - 9 ./benchmark/../lib/fuzzy_match/similarity.rb:49:String - 9 ./benchmark/../lib/fuzzy_match/similarity.rb:42:__node__ - 9 ./benchmark/../lib/fuzzy_match/similarity.rb:41:__node__ - 8 ./benchmark/../lib/fuzzy_match/wrapper.rb:31:__node__ - 8 ./benchmark/../lib/fuzzy_match/normalizer.rb:27:__node__ - 8 ./benchmark/../lib/fuzzy_match/normalizer.rb:14:__node__ - 8 ./benchmark/../lib/fuzzy_match/similarity.rb:38:__node__ - 8 ./benchmark/../lib/fuzzy_match/score.rb:13:__node__ - 8 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:23:__node__ - 8 ./benchmark/../lib/fuzzy_match/grouping.rb:24:__node__ - 7 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:7:__node__ - 7 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:6:__node__ - 7 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:5:__node__ - 7 ./benchmark/../lib/fuzzy_match/wrapper.rb:9:__node__ - 7 ./benchmark/../lib/fuzzy_match/wrapper.rb:25:__node__ - 7 ./benchmark/../lib/fuzzy_match/similarity.rb:45:__node__ - 7 ./benchmark/../lib/fuzzy_match/score.rb:17:__node__ - 7 ./benchmark/../lib/fuzzy_match/identity.rb:19:__node__ - 7 ./benchmark/../lib/fuzzy_match/grouping.rb:27:__node__ - 7 ./benchmark/../lib/fuzzy_match.rb:209:String - 6 ./benchmark/../lib/fuzzy_match/wrapper.rb:8:__node__ - 6 ./benchmark/../lib/fuzzy_match/similarity.rb:44:__node__ - 6 ./benchmark/../lib/fuzzy_match/similarity.rb:15:__node__ - 6 ./benchmark/../lib/fuzzy_match/similarity.rb:13:__node__ - 6 ./benchmark/../lib/fuzzy_match/score.rb:25:__node__ - 6 ./benchmark/../lib/fuzzy_match/score.rb:21:__node__ - 6 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:10:__node__ - 6 ./benchmark/../lib/fuzzy_match/grouping.rb:22:__node__ - 5 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/fastercsv-1.5.4/lib/faster_csv.rb:1640:String - 5 ./benchmark/../lib/fuzzy_match/wrapper.rb:34:__node__ - 5 ./benchmark/../lib/fuzzy_match/normalizer.rb:9:__node__ - 5 ./benchmark/../lib/fuzzy_match/normalizer.rb:19:__node__ - 5 ./benchmark/../lib/fuzzy_match/similarity.rb:8:__node__ - 5 ./benchmark/../lib/fuzzy_match/similarity.rb:33:__node__ - 5 ./benchmark/../lib/fuzzy_match/similarity.rb:29:__node__ - 5 ./benchmark/../lib/fuzzy_match/similarity.rb:12:__node__ - 5 ./benchmark/../lib/fuzzy_match/score.rb:9:__node__ - 5 ./benchmark/../lib/fuzzy_match/result.rb:16:__node__ - 5 ./benchmark/../lib/fuzzy_match/identity.rb:10:__node__ - 5 ./benchmark/../lib/fuzzy_match/grouping.rb:26:__node__ - 5 ./benchmark/../lib/fuzzy_match/grouping.rb:25:__node__ - 5 ./benchmark/../lib/fuzzy_match/grouping.rb:15:__node__ - 4 ./benchmark/../lib/fuzzy_match/wrapper.rb:33:__node__ - 4 ./benchmark/../lib/fuzzy_match/wrapper.rb:30:__node__ - 4 ./benchmark/../lib/fuzzy_match/normalizer.rb:20:__node__ - 4 ./benchmark/../lib/fuzzy_match/similarity.rb:59:__node__ - 4 ./benchmark/../lib/fuzzy_match/similarity.rb:54:__node__ - 4 ./benchmark/../lib/fuzzy_match/score.rb:5:__node__ - 4 ./benchmark/../lib/fuzzy_match/result.rb:9:__node__ - 4 ./benchmark/../lib/fuzzy_match/result.rb:8:__node__ - 4 ./benchmark/../lib/fuzzy_match/result.rb:7:__node__ - 4 ./benchmark/../lib/fuzzy_match/result.rb:6:__node__ - 4 ./benchmark/../lib/fuzzy_match/result.rb:5:__node__ - 4 ./benchmark/../lib/fuzzy_match/result.rb:4:__node__ - 4 ./benchmark/../lib/fuzzy_match/result.rb:3:__node__ - 4 ./benchmark/../lib/fuzzy_match/result.rb:13:__node__ - 4 ./benchmark/../lib/fuzzy_match/result.rb:12:__node__ - 4 ./benchmark/../lib/fuzzy_match/result.rb:11:__node__ - 4 ./benchmark/../lib/fuzzy_match/result.rb:10:__node__ - 4 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:8:__node__ - 4 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:22:__node__ - 4 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:21:__node__ - 4 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:20:String - 4 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:11:__node__ - 3 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:8:__node__ - 3 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:3:__node__ - 3 ./benchmark/../lib/fuzzy_match/wrapper.rb:28:__node__ - 3 ./benchmark/../lib/fuzzy_match/wrapper.rb:24:__node__ - 3 ./benchmark/../lib/fuzzy_match/wrapper.rb:18:__node__ - 3 ./benchmark/../lib/fuzzy_match/wrapper.rb:15:String - 3 ./benchmark/../lib/fuzzy_match/wrapper.rb:14:__node__ - 3 ./benchmark/../lib/fuzzy_match/normalizer.rb:8:__node__ - 3 ./benchmark/../lib/fuzzy_match/normalizer.rb:26:__node__ - 3 ./benchmark/../lib/fuzzy_match/normalizer.rb:18:__node__ - 3 ./benchmark/../lib/fuzzy_match/normalizer.rb:13:__node__ - 3 ./benchmark/../lib/fuzzy_match/similarity.rb:7:__node__ - 3 ./benchmark/../lib/fuzzy_match/similarity.rb:6:__node__ - 3 ./benchmark/../lib/fuzzy_match/similarity.rb:58:__node__ - 3 ./benchmark/../lib/fuzzy_match/similarity.rb:56:__node__ - 3 ./benchmark/../lib/fuzzy_match/similarity.rb:48:__node__ - 3 ./benchmark/../lib/fuzzy_match/similarity.rb:36:__node__ - 3 ./benchmark/../lib/fuzzy_match/similarity.rb:32:__node__ - 3 ./benchmark/../lib/fuzzy_match/similarity.rb:28:__node__ - 3 ./benchmark/../lib/fuzzy_match/similarity.rb:24:__node__ - 3 ./benchmark/../lib/fuzzy_match/similarity.rb:20:__node__ - 3 ./benchmark/../lib/fuzzy_match/similarity.rb:11:__node__ - 3 ./benchmark/../lib/fuzzy_match/score.rb:8:__node__ - 3 ./benchmark/../lib/fuzzy_match/score.rb:7:__node__ - 3 ./benchmark/../lib/fuzzy_match/score.rb:24:__node__ - 3 ./benchmark/../lib/fuzzy_match/score.rb:20:__node__ - 3 ./benchmark/../lib/fuzzy_match/score.rb:16:__node__ - 3 ./benchmark/../lib/fuzzy_match/score.rb:12:__node__ - 3 ./benchmark/../lib/fuzzy_match/result.rb:21:__node__ - 3 ./benchmark/../lib/fuzzy_match/result.rb:19:__node__ - 3 ./benchmark/../lib/fuzzy_match/result.rb:15:__node__ - 3 ./benchmark/../lib/fuzzy_match/identity.rb:9:__node__ - 3 ./benchmark/../lib/fuzzy_match/identity.rb:17:__node__ - 3 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:3:__node__ - 3 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:18:__node__ - 3 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:16:String - 3 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:15:String - 3 ./benchmark/../lib/fuzzy_match/grouping.rb:33:__node__ - 3 ./benchmark/../lib/fuzzy_match/grouping.rb:14:__node__ - 3 ./benchmark/../lib/fuzzy_match.rb:77:Array - 2 /Users/seamus/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/uri/common.rb:387:String - 2 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:3:String - 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:6:__node__ - 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:5:__node__ - 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:4:__node__ - 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:3:Class - 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:35:__node__ - 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:32:__node__ - 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:26:__node__ - 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:22:__node__ - 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:20:__node__ - 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:16:__node__ - 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:12:__node__ - 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:11:__node__ - 2 ./benchmark/../lib/fuzzy_match/normalizer.rb:6:__node__ - 2 ./benchmark/../lib/fuzzy_match/normalizer.rb:3:Class - 2 ./benchmark/../lib/fuzzy_match/normalizer.rb:28:__node__ - 2 ./benchmark/../lib/fuzzy_match/normalizer.rb:27:String - 2 ./benchmark/../lib/fuzzy_match/normalizer.rb:24:__node__ - 2 ./benchmark/../lib/fuzzy_match/normalizer.rb:23:__node__ - 2 ./benchmark/../lib/fuzzy_match/normalizer.rb:22:__node__ - 2 ./benchmark/../lib/fuzzy_match/normalizer.rb:15:__node__ - 2 ./benchmark/../lib/fuzzy_match/normalizer.rb:10:__node__ - 2 ./benchmark/../lib/fuzzy_match/similarity.rb:60:__node__ - 2 ./benchmark/../lib/fuzzy_match/similarity.rb:50:__node__ - 2 ./benchmark/../lib/fuzzy_match/similarity.rb:4:__node__ - 2 ./benchmark/../lib/fuzzy_match/similarity.rb:46:__node__ - 2 ./benchmark/../lib/fuzzy_match/similarity.rb:3:__node__ - 2 ./benchmark/../lib/fuzzy_match/similarity.rb:34:__node__ - 2 ./benchmark/../lib/fuzzy_match/similarity.rb:30:__node__ - 2 ./benchmark/../lib/fuzzy_match/similarity.rb:2:Class - 2 ./benchmark/../lib/fuzzy_match/similarity.rb:26:__node__ - 2 ./benchmark/../lib/fuzzy_match/similarity.rb:22:__node__ - 2 ./benchmark/../lib/fuzzy_match/similarity.rb:17:__node__ - 2 ./benchmark/../lib/fuzzy_match/similarity.rb:16:__node__ - 2 ./benchmark/../lib/fuzzy_match/score.rb:4:Class - 2 ./benchmark/../lib/fuzzy_match/score.rb:26:__node__ - 2 ./benchmark/../lib/fuzzy_match/score.rb:22:__node__ - 2 ./benchmark/../lib/fuzzy_match/score.rb:18:__node__ - 2 ./benchmark/../lib/fuzzy_match/score.rb:17:String - 2 ./benchmark/../lib/fuzzy_match/score.rb:14:__node__ - 2 ./benchmark/../lib/fuzzy_match/score.rb:13:String - 2 ./benchmark/../lib/fuzzy_match/result.rb:2:Class - 2 ./benchmark/../lib/fuzzy_match/result.rb:17:__node__ - 2 ./benchmark/../lib/fuzzy_match/identity.rb:7:__node__ - 2 ./benchmark/../lib/fuzzy_match/identity.rb:4:Class - 2 ./benchmark/../lib/fuzzy_match/identity.rb:23:__node__ - 2 ./benchmark/../lib/fuzzy_match/identity.rb:22:__node__ - 2 ./benchmark/../lib/fuzzy_match/identity.rb:21:__node__ - 2 ./benchmark/../lib/fuzzy_match/identity.rb:11:__node__ - 2 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:7:__node__ - 2 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:6:__node__ - 2 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:5:__node__ - 2 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:23:String - 2 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:12:__node__ - 2 ./benchmark/../lib/fuzzy_match/grouping.rb:9:Class - 2 ./benchmark/../lib/fuzzy_match/grouping.rb:34:__node__ - 2 ./benchmark/../lib/fuzzy_match/grouping.rb:32:__node__ - 2 ./benchmark/../lib/fuzzy_match/grouping.rb:30:__node__ - 2 ./benchmark/../lib/fuzzy_match/grouping.rb:29:__node__ - 2 ./benchmark/../lib/fuzzy_match/grouping.rb:23:__node__ - 2 ./benchmark/../lib/fuzzy_match/grouping.rb:16:__node__ - 2 ./benchmark/../lib/fuzzy_match/grouping.rb:12:__node__ - 2 ./benchmark/../lib/fuzzy_match.rb:86:Array - 1 benchmark/memory.rb:50:String - 1 benchmark/memory.rb:49:FuzzyMatch - 1 /Users/seamus/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/uri/common.rb:492:URI::Generic - 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table/executor.rb:19:Process::Status - 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table/executor.rb:10:Bignum - 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table.rb:63:Array - 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table.rb:121:RemoteTable::Transformer - 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table.rb:116:RemoteTable::Format::Delimited - 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table.rb:111:RemoteTable::Properties - 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table.rb:106:RemoteTable::LocalFile - 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:4:Regexp - 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:4:Array - 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:1:__node__ - 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:1:String - 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:1:Module - 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/activesupport-3.0.5/lib/active_support/core_ext/hash/keys.rb:18:Hash - 1 ./benchmark/../lib/fuzzy_match/wrapper.rb:3:__node__ - 1 ./benchmark/../lib/fuzzy_match/wrapper.rb:3:String - 1 ./benchmark/../lib/fuzzy_match/wrapper.rb:25:String - 1 ./benchmark/../lib/fuzzy_match/wrapper.rb:1:__node__ - 1 ./benchmark/../lib/fuzzy_match/wrapper.rb:10:String - 1 ./benchmark/../lib/fuzzy_match/normalizer.rb:4:String - 1 ./benchmark/../lib/fuzzy_match/normalizer.rb:4:FuzzyMatch::ExtractRegexp - 1 ./benchmark/../lib/fuzzy_match/normalizer.rb:3:__node__ - 1 ./benchmark/../lib/fuzzy_match/normalizer.rb:3:String - 1 ./benchmark/../lib/fuzzy_match/normalizer.rb:1:__node__ - 1 ./benchmark/../lib/fuzzy_match/similarity.rb:9:__node__ - 1 ./benchmark/../lib/fuzzy_match/similarity.rb:2:__node__ - 1 ./benchmark/../lib/fuzzy_match/similarity.rb:2:String - 1 ./benchmark/../lib/fuzzy_match/similarity.rb:25:String - 1 ./benchmark/../lib/fuzzy_match/similarity.rb:1:__node__ - 1 ./benchmark/../lib/fuzzy_match/score.rb:4:__node__ - 1 ./benchmark/../lib/fuzzy_match/score.rb:4:String - 1 ./benchmark/../lib/fuzzy_match/score.rb:3:__node__ - 1 ./benchmark/../lib/fuzzy_match/score.rb:1:String - 1 ./benchmark/../lib/fuzzy_match/score.rb:13:Array - 1 ./benchmark/../lib/fuzzy_match/score.rb:10:__node__ - 1 ./benchmark/../lib/fuzzy_match/result.rb:2:__node__ - 1 ./benchmark/../lib/fuzzy_match/result.rb:2:String - 1 ./benchmark/../lib/fuzzy_match/result.rb:1:__node__ - 1 ./benchmark/../lib/fuzzy_match/identity.rb:5:FuzzyMatch::ExtractRegexp - 1 ./benchmark/../lib/fuzzy_match/identity.rb:4:__node__ - 1 ./benchmark/../lib/fuzzy_match/identity.rb:4:String - 1 ./benchmark/../lib/fuzzy_match/identity.rb:1:__node__ - 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:4:__node__ - 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:2:__node__ - 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:2:String - 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:2:Module - 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:28:__node__ - 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:26:String - 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:25:String - 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:24:String - 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:23:Regexp - 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:1:__node__ - 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:17:Hash - 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:10:String - 1 ./benchmark/../lib/fuzzy_match/grouping.rb:9:__node__ - 1 ./benchmark/../lib/fuzzy_match/grouping.rb:9:String - 1 ./benchmark/../lib/fuzzy_match/grouping.rb:1:__node__ - 1 ./benchmark/../lib/fuzzy_match/grouping.rb:10:FuzzyMatch::ExtractRegexp - 1 ./benchmark/../lib/fuzzy_match.rb:62:FuzzyMatch::Wrapper - 1 ./benchmark/../lib/fuzzy_match.rb:39:String - 1 ./benchmark/../lib/fuzzy_match.rb:39:FuzzyMatch::Result - 1 ./benchmark/../lib/fuzzy_match.rb:35:String - 1 ./benchmark/../lib/fuzzy_match.rb:209:Array - 1 ./benchmark/../lib/fuzzy_match.rb:199:String - 1 ./benchmark/../lib/fuzzy_match.rb:198:Array - 1 ./benchmark/../lib/fuzzy_match.rb:193:String - 1 ./benchmark/../lib/fuzzy_match.rb:192:Array - 1 ./benchmark/../lib/fuzzy_match.rb:187:String - 1 ./benchmark/../lib/fuzzy_match.rb:186:Array - 1 ./benchmark/../lib/fuzzy_match.rb:101:Array diff --git a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/benchmark/before-without-last-result.txt b/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/benchmark/before-without-last-result.txt deleted file mode 100644 index d6a7bb8..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/benchmark/before-without-last-result.txt +++ /dev/null @@ -1,257 +0,0 @@ - 8393 ./benchmark/../lib/fuzzy_match/score.rb:13:String - 3349 ./benchmark/../lib/fuzzy_match/score.rb:13:Array - 3276 ./benchmark/../lib/fuzzy_match.rb:187:Array - 3042 ./benchmark/../lib/fuzzy_match/wrapper.rb:29:__varmap__ - 2752 ./benchmark/../lib/fuzzy_match/similarity.rb:57:Array - 1962 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/activesupport-3.0.5/lib/active_support/core_ext/object/blank.rb:68:String - 1957 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/fastercsv-1.5.4/lib/faster_csv.rb:1632:String - 1883 ./benchmark/../lib/fuzzy_match/score.rb:13:Float - 1674 ./benchmark/../lib/fuzzy_match/score.rb:13:Amatch::PairDistance - 1017 ./benchmark/../lib/fuzzy_match/similarity.rb:37:Array - 779 ./benchmark/../lib/fuzzy_match/similarity.rb:42:FuzzyMatch::Score - 779 ./benchmark/../lib/fuzzy_match/similarity.rb:41:FuzzyMatch::Score - 676 benchmark/memory.rb:21:String - 607 ./benchmark/../lib/fuzzy_match/normalizer.rb:20:String - 444 ./benchmark/../lib/fuzzy_match/wrapper.rb:29:Array - 342 ./benchmark/../lib/fuzzy_match/wrapper.rb:29:String - 325 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table/hasher.rb:20:String - 325 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table/format/delimited.rb:22:ActiveSupport::OrderedHash - 325 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table.rb:65:String - 325 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/activesupport-3.0.5/lib/active_support/ordered_hash.rb:39:Array - 325 ./benchmark/../lib/fuzzy_match/wrapper.rb:25:FuzzyMatch::Similarity - 325 ./benchmark/../lib/fuzzy_match/similarity.rb:25:FuzzyMatch::Score - 325 ./benchmark/../lib/fuzzy_match.rb:35:FuzzyMatch::Wrapper - 320 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table/format/delimited.rb:28:String - 303 ./benchmark/../lib/fuzzy_match/similarity.rb:21:Float - 234 ./benchmark/../lib/fuzzy_match/similarity.rb:56:Array - 234 ./benchmark/../lib/fuzzy_match/similarity.rb:55:Array - 184 ./benchmark/../lib/fuzzy_match/normalizer.rb:14:String - 140 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch.bundle:0:__node__ - 129 ./benchmark/../lib/fuzzy_match/wrapper.rb:29:__node__ - 127 ./benchmark/../lib/fuzzy_match/similarity.rb:55:__node__ - 119 ./benchmark/../lib/fuzzy_match.rb:101:__scope__ - 118 ./benchmark/../lib/fuzzy_match/wrapper.rb:29:Hash - 118 ./benchmark/../lib/fuzzy_match/similarity.rb:37:__scope__ - 118 ./benchmark/../lib/fuzzy_match/similarity.rb:29:__scope__ - 118 ./benchmark/../lib/fuzzy_match/similarity.rb:25:__scope__ - 118 ./benchmark/../lib/fuzzy_match/similarity.rb:12:__scope__ - 117 ./benchmark/../lib/fuzzy_match/wrapper.rb:29:__scope__ - 117 ./benchmark/../lib/fuzzy_match/wrapper.rb:19:Array - 102 ./benchmark/../lib/fuzzy_match/normalizer.rb:20:Array - 102 ./benchmark/../lib/fuzzy_match/normalizer.rb:19:MatchData - 101 ./benchmark/../lib/fuzzy_match/normalizer.rb:14:MatchData - 41 ./benchmark/../lib/fuzzy_match/similarity.rb:49:__node__ - 36 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:27:Regexp - 28 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:19:__node__ - 26 ./benchmark/../lib/fuzzy_match.rb:187:FuzzyMatch::Normalizer - 22 ./benchmark/../lib/fuzzy_match/similarity.rb:57:__node__ - 22 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:20:__node__ - 17 ./benchmark/../lib/fuzzy_match/similarity.rb:21:__node__ - 16 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch.bundle:0:Class - 14 ./benchmark/../lib/fuzzy_match/similarity.rb:37:__node__ - 13 ./benchmark/../lib/fuzzy_match/wrapper.rb:15:__node__ - 13 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:27:__node__ - 12 ./benchmark/../lib/fuzzy_match/wrapper.rb:19:__node__ - 11 ./benchmark/../lib/fuzzy_match/identity.rb:18:__node__ - 11 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:26:__node__ - 11 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:25:__node__ - 11 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:24:__node__ - 10 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch.bundle:0:String - 10 ./benchmark/../lib/fuzzy_match/similarity.rb:39:__node__ - 10 ./benchmark/../lib/fuzzy_match/similarity.rb:25:__node__ - 10 ./benchmark/../lib/fuzzy_match.rb:193:FuzzyMatch::Identity - 9 ./benchmark/../lib/fuzzy_match/wrapper.rb:10:__node__ - 9 ./benchmark/../lib/fuzzy_match/similarity.rb:49:String - 9 ./benchmark/../lib/fuzzy_match/similarity.rb:42:__node__ - 9 ./benchmark/../lib/fuzzy_match/similarity.rb:41:__node__ - 8 ./benchmark/../lib/fuzzy_match/wrapper.rb:31:__node__ - 8 ./benchmark/../lib/fuzzy_match/normalizer.rb:6:__node__ - 8 ./benchmark/../lib/fuzzy_match/normalizer.rb:27:__node__ - 8 ./benchmark/../lib/fuzzy_match/normalizer.rb:14:__node__ - 8 ./benchmark/../lib/fuzzy_match/similarity.rb:38:__node__ - 8 ./benchmark/../lib/fuzzy_match/score.rb:13:__node__ - 8 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:23:__node__ - 7 ./benchmark/../lib/fuzzy_match/wrapper.rb:9:__node__ - 7 ./benchmark/../lib/fuzzy_match/wrapper.rb:25:__node__ - 7 ./benchmark/../lib/fuzzy_match/similarity.rb:45:__node__ - 7 ./benchmark/../lib/fuzzy_match/score.rb:17:__node__ - 7 ./benchmark/../lib/fuzzy_match/identity.rb:19:__node__ - 6 ./benchmark/../lib/fuzzy_match/wrapper.rb:8:__node__ - 6 ./benchmark/../lib/fuzzy_match/normalizer.rb:28:__node__ - 6 ./benchmark/../lib/fuzzy_match/normalizer.rb:24:__node__ - 6 ./benchmark/../lib/fuzzy_match/normalizer.rb:15:__node__ - 6 ./benchmark/../lib/fuzzy_match/normalizer.rb:10:__node__ - 6 ./benchmark/../lib/fuzzy_match/similarity.rb:44:__node__ - 6 ./benchmark/../lib/fuzzy_match/similarity.rb:15:__node__ - 6 ./benchmark/../lib/fuzzy_match/similarity.rb:13:__node__ - 6 ./benchmark/../lib/fuzzy_match/score.rb:25:__node__ - 6 ./benchmark/../lib/fuzzy_match/score.rb:21:__node__ - 6 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:10:__node__ - 5 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/fastercsv-1.5.4/lib/faster_csv.rb:1640:String - 5 ./benchmark/../lib/fuzzy_match/wrapper.rb:34:__node__ - 5 ./benchmark/../lib/fuzzy_match/normalizer.rb:9:__node__ - 5 ./benchmark/../lib/fuzzy_match/normalizer.rb:19:__node__ - 5 ./benchmark/../lib/fuzzy_match/similarity.rb:8:__node__ - 5 ./benchmark/../lib/fuzzy_match/similarity.rb:33:__node__ - 5 ./benchmark/../lib/fuzzy_match/similarity.rb:29:__node__ - 5 ./benchmark/../lib/fuzzy_match/similarity.rb:12:__node__ - 5 ./benchmark/../lib/fuzzy_match/score.rb:9:__node__ - 5 ./benchmark/../lib/fuzzy_match/identity.rb:10:__node__ - 4 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:7:__node__ - 4 ./benchmark/../lib/fuzzy_match/wrapper.rb:33:__node__ - 4 ./benchmark/../lib/fuzzy_match/wrapper.rb:30:__node__ - 4 ./benchmark/../lib/fuzzy_match/normalizer.rb:4:__node__ - 4 ./benchmark/../lib/fuzzy_match/normalizer.rb:20:__node__ - 4 ./benchmark/../lib/fuzzy_match/similarity.rb:59:__node__ - 4 ./benchmark/../lib/fuzzy_match/similarity.rb:54:__node__ - 4 ./benchmark/../lib/fuzzy_match/score.rb:5:__node__ - 4 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:8:__node__ - 4 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:22:__node__ - 4 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:21:__node__ - 4 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:20:String - 4 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:11:__node__ - 4 ./benchmark/../lib/fuzzy_match.rb:77:Array - 3 ./benchmark/../lib/fuzzy_match/wrapper.rb:28:__node__ - 3 ./benchmark/../lib/fuzzy_match/wrapper.rb:24:__node__ - 3 ./benchmark/../lib/fuzzy_match/wrapper.rb:18:__node__ - 3 ./benchmark/../lib/fuzzy_match/wrapper.rb:15:String - 3 ./benchmark/../lib/fuzzy_match/wrapper.rb:14:__node__ - 3 ./benchmark/../lib/fuzzy_match/normalizer.rb:8:__node__ - 3 ./benchmark/../lib/fuzzy_match/normalizer.rb:30:__node__ - 3 ./benchmark/../lib/fuzzy_match/normalizer.rb:29:__node__ - 3 ./benchmark/../lib/fuzzy_match/normalizer.rb:26:__node__ - 3 ./benchmark/../lib/fuzzy_match/normalizer.rb:18:__node__ - 3 ./benchmark/../lib/fuzzy_match/normalizer.rb:13:__node__ - 3 ./benchmark/../lib/fuzzy_match/similarity.rb:7:__node__ - 3 ./benchmark/../lib/fuzzy_match/similarity.rb:6:__node__ - 3 ./benchmark/../lib/fuzzy_match/similarity.rb:58:__node__ - 3 ./benchmark/../lib/fuzzy_match/similarity.rb:56:__node__ - 3 ./benchmark/../lib/fuzzy_match/similarity.rb:48:__node__ - 3 ./benchmark/../lib/fuzzy_match/similarity.rb:36:__node__ - 3 ./benchmark/../lib/fuzzy_match/similarity.rb:32:__node__ - 3 ./benchmark/../lib/fuzzy_match/similarity.rb:28:__node__ - 3 ./benchmark/../lib/fuzzy_match/similarity.rb:24:__node__ - 3 ./benchmark/../lib/fuzzy_match/similarity.rb:20:__node__ - 3 ./benchmark/../lib/fuzzy_match/similarity.rb:11:__node__ - 3 ./benchmark/../lib/fuzzy_match/score.rb:8:__node__ - 3 ./benchmark/../lib/fuzzy_match/score.rb:7:__node__ - 3 ./benchmark/../lib/fuzzy_match/score.rb:24:__node__ - 3 ./benchmark/../lib/fuzzy_match/score.rb:20:__node__ - 3 ./benchmark/../lib/fuzzy_match/score.rb:16:__node__ - 3 ./benchmark/../lib/fuzzy_match/score.rb:12:__node__ - 3 ./benchmark/../lib/fuzzy_match/identity.rb:9:__node__ - 3 ./benchmark/../lib/fuzzy_match/identity.rb:17:__node__ - 3 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:3:__node__ - 3 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:18:__node__ - 3 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:16:String - 3 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:15:String - 3 ./benchmark/../lib/fuzzy_match.rb:86:Array - 2 /Users/seamus/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/uri/common.rb:387:String - 2 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:3:String - 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:6:__node__ - 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:5:__node__ - 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:4:__node__ - 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:3:Class - 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:35:__node__ - 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:32:__node__ - 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:26:__node__ - 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:22:__node__ - 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:20:__node__ - 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:16:__node__ - 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:12:__node__ - 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:11:__node__ - 2 ./benchmark/../lib/fuzzy_match/normalizer.rb:3:__node__ - 2 ./benchmark/../lib/fuzzy_match/normalizer.rb:3:Class - 2 ./benchmark/../lib/fuzzy_match/normalizer.rb:27:String - 2 ./benchmark/../lib/fuzzy_match/normalizer.rb:23:__node__ - 2 ./benchmark/../lib/fuzzy_match/normalizer.rb:22:__node__ - 2 ./benchmark/../lib/fuzzy_match/normalizer.rb:1:__node__ - 2 ./benchmark/../lib/fuzzy_match/similarity.rb:60:__node__ - 2 ./benchmark/../lib/fuzzy_match/similarity.rb:50:__node__ - 2 ./benchmark/../lib/fuzzy_match/similarity.rb:4:__node__ - 2 ./benchmark/../lib/fuzzy_match/similarity.rb:46:__node__ - 2 ./benchmark/../lib/fuzzy_match/similarity.rb:3:__node__ - 2 ./benchmark/../lib/fuzzy_match/similarity.rb:34:__node__ - 2 ./benchmark/../lib/fuzzy_match/similarity.rb:30:__node__ - 2 ./benchmark/../lib/fuzzy_match/similarity.rb:2:Class - 2 ./benchmark/../lib/fuzzy_match/similarity.rb:26:__node__ - 2 ./benchmark/../lib/fuzzy_match/similarity.rb:22:__node__ - 2 ./benchmark/../lib/fuzzy_match/similarity.rb:17:__node__ - 2 ./benchmark/../lib/fuzzy_match/similarity.rb:16:__node__ - 2 ./benchmark/../lib/fuzzy_match/score.rb:4:Class - 2 ./benchmark/../lib/fuzzy_match/score.rb:26:__node__ - 2 ./benchmark/../lib/fuzzy_match/score.rb:22:__node__ - 2 ./benchmark/../lib/fuzzy_match/score.rb:18:__node__ - 2 ./benchmark/../lib/fuzzy_match/score.rb:17:String - 2 ./benchmark/../lib/fuzzy_match/score.rb:14:__node__ - 2 ./benchmark/../lib/fuzzy_match/identity.rb:7:__node__ - 2 ./benchmark/../lib/fuzzy_match/identity.rb:4:Class - 2 ./benchmark/../lib/fuzzy_match/identity.rb:23:__node__ - 2 ./benchmark/../lib/fuzzy_match/identity.rb:22:__node__ - 2 ./benchmark/../lib/fuzzy_match/identity.rb:21:__node__ - 2 ./benchmark/../lib/fuzzy_match/identity.rb:11:__node__ - 2 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:7:__node__ - 2 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:6:__node__ - 2 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:5:__node__ - 2 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:23:String - 2 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:12:__node__ - 2 ./benchmark/../lib/fuzzy_match.rb:101:Array - 1 benchmark/memory.rb:50:__scope__ - 1 benchmark/memory.rb:50:String - 1 benchmark/memory.rb:49:FuzzyMatch - 1 /Users/seamus/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/uri/common.rb:492:URI::Generic - 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table/executor.rb:19:Process::Status - 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table/executor.rb:10:Bignum - 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table.rb:63:Array - 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table.rb:121:RemoteTable::Transformer - 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table.rb:116:RemoteTable::Format::Delimited - 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table.rb:111:RemoteTable::Properties - 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table.rb:106:RemoteTable::LocalFile - 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:4:Array - 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:1:__scope__ - 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:1:__node__ - 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:1:String - 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:1:Module - 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/activesupport-3.0.5/lib/active_support/core_ext/hash/keys.rb:18:Hash - 1 ./benchmark/../lib/fuzzy_match/wrapper.rb:3:__node__ - 1 ./benchmark/../lib/fuzzy_match/wrapper.rb:3:String - 1 ./benchmark/../lib/fuzzy_match/wrapper.rb:25:String - 1 ./benchmark/../lib/fuzzy_match/wrapper.rb:1:__node__ - 1 ./benchmark/../lib/fuzzy_match/wrapper.rb:10:String - 1 ./benchmark/../lib/fuzzy_match/normalizer.rb:4:FuzzyMatch::ExtractRegexp - 1 ./benchmark/../lib/fuzzy_match/normalizer.rb:3:String - 1 ./benchmark/../lib/fuzzy_match/similarity.rb:9:__node__ - 1 ./benchmark/../lib/fuzzy_match/similarity.rb:2:__node__ - 1 ./benchmark/../lib/fuzzy_match/similarity.rb:2:String - 1 ./benchmark/../lib/fuzzy_match/similarity.rb:25:String - 1 ./benchmark/../lib/fuzzy_match/similarity.rb:1:__node__ - 1 ./benchmark/../lib/fuzzy_match/score.rb:4:__node__ - 1 ./benchmark/../lib/fuzzy_match/score.rb:4:String - 1 ./benchmark/../lib/fuzzy_match/score.rb:3:__node__ - 1 ./benchmark/../lib/fuzzy_match/score.rb:1:String - 1 ./benchmark/../lib/fuzzy_match/score.rb:10:__node__ - 1 ./benchmark/../lib/fuzzy_match/identity.rb:5:String - 1 ./benchmark/../lib/fuzzy_match/identity.rb:5:FuzzyMatch::ExtractRegexp - 1 ./benchmark/../lib/fuzzy_match/identity.rb:4:__node__ - 1 ./benchmark/../lib/fuzzy_match/identity.rb:4:String - 1 ./benchmark/../lib/fuzzy_match/identity.rb:1:__node__ - 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:4:__node__ - 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:2:__node__ - 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:2:String - 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:2:Module - 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:28:__node__ - 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:26:String - 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:25:String - 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:24:String - 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:23:Regexp - 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:1:__node__ - 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:17:Hash - 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:10:String - 1 ./benchmark/../lib/fuzzy_match.rb:62:FuzzyMatch::Wrapper - 1 ./benchmark/../lib/fuzzy_match.rb:62:Hash - 1 ./benchmark/../lib/fuzzy_match.rb:35:String - 1 ./benchmark/../lib/fuzzy_match.rb:35:Array - 1 ./benchmark/../lib/fuzzy_match.rb:193:String - 1 ./benchmark/../lib/fuzzy_match.rb:192:Array - 1 ./benchmark/../lib/fuzzy_match.rb:187:String - 1 ./benchmark/../lib/fuzzy_match.rb:186:Array diff --git a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/benchmark/before.txt b/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/benchmark/before.txt deleted file mode 100644 index 85a142b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/benchmark/before.txt +++ /dev/null @@ -1,304 +0,0 @@ - 8642 ./benchmark/../lib/fuzzy_match/score.rb:13:String - 3465 ./benchmark/../lib/fuzzy_match/score.rb:13:Array - 3388 ./benchmark/../lib/fuzzy_match/similarity.rb:25:Array - 3146 ./benchmark/../lib/fuzzy_match/wrapper.rb:29:__varmap__ - 2842 ./benchmark/../lib/fuzzy_match/similarity.rb:57:Array - 1962 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/activesupport-3.0.5/lib/active_support/core_ext/object/blank.rb:68:String - 1957 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/fastercsv-1.5.4/lib/faster_csv.rb:1632:String - 1936 ./benchmark/../lib/fuzzy_match/score.rb:13:Float - 1732 ./benchmark/../lib/fuzzy_match/score.rb:13:Amatch::PairDistance - 1054 ./benchmark/../lib/fuzzy_match/similarity.rb:37:Array - 806 ./benchmark/../lib/fuzzy_match/similarity.rb:41:FuzzyMatch::Score - 805 ./benchmark/../lib/fuzzy_match/similarity.rb:42:FuzzyMatch::Score - 688 benchmark/memory.rb:21:String - 639 ./benchmark/../lib/fuzzy_match/normalizer.rb:20:String - 448 ./benchmark/../lib/fuzzy_match/wrapper.rb:29:Array - 342 ./benchmark/../lib/fuzzy_match/wrapper.rb:29:String - 325 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table/hasher.rb:20:String - 325 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table/format/delimited.rb:22:ActiveSupport::OrderedHash - 325 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table.rb:65:String - 325 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/activesupport-3.0.5/lib/active_support/ordered_hash.rb:39:Array - 325 ./benchmark/../lib/fuzzy_match/wrapper.rb:25:FuzzyMatch::Similarity - 325 ./benchmark/../lib/fuzzy_match/similarity.rb:25:FuzzyMatch::Score - 325 ./benchmark/../lib/fuzzy_match.rb:35:FuzzyMatch::Wrapper - 320 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table/format/delimited.rb:28:String - 303 ./benchmark/../lib/fuzzy_match/similarity.rb:21:Float - 242 ./benchmark/../lib/fuzzy_match/similarity.rb:56:Array - 242 ./benchmark/../lib/fuzzy_match/similarity.rb:55:Array - 184 ./benchmark/../lib/fuzzy_match/normalizer.rb:14:String - 140 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch.bundle:0:__node__ - 133 ./benchmark/../lib/fuzzy_match/wrapper.rb:29:__node__ - 131 ./benchmark/../lib/fuzzy_match/similarity.rb:55:__node__ - 123 ./benchmark/../lib/fuzzy_match.rb:101:__scope__ - 122 ./benchmark/../lib/fuzzy_match/wrapper.rb:29:Hash - 122 ./benchmark/../lib/fuzzy_match/similarity.rb:37:__scope__ - 122 ./benchmark/../lib/fuzzy_match/similarity.rb:29:__scope__ - 122 ./benchmark/../lib/fuzzy_match/similarity.rb:25:__scope__ - 122 ./benchmark/../lib/fuzzy_match/similarity.rb:12:__scope__ - 121 ./benchmark/../lib/fuzzy_match/wrapper.rb:29:__scope__ - 121 ./benchmark/../lib/fuzzy_match/wrapper.rb:19:Array - 110 ./benchmark/../lib/fuzzy_match/normalizer.rb:20:Array - 110 ./benchmark/../lib/fuzzy_match/normalizer.rb:19:MatchData - 109 ./benchmark/../lib/fuzzy_match/normalizer.rb:14:MatchData - 57 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:27:Regexp - 41 ./benchmark/../lib/fuzzy_match/similarity.rb:49:__node__ - 28 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:19:__node__ - 26 ./benchmark/../lib/fuzzy_match.rb:187:FuzzyMatch::Normalizer - 22 ./benchmark/../lib/fuzzy_match/similarity.rb:57:__node__ - 22 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:20:__node__ - 21 ./benchmark/../lib/fuzzy_match.rb:199:FuzzyMatch::Grouping - 17 ./benchmark/../lib/fuzzy_match/similarity.rb:21:__node__ - 16 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch.bundle:0:Class - 14 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:4:__node__ - 14 ./benchmark/../lib/fuzzy_match/similarity.rb:37:__node__ - 13 ./benchmark/../lib/fuzzy_match/wrapper.rb:15:__node__ - 13 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:27:__node__ - 12 ./benchmark/../lib/fuzzy_match/wrapper.rb:19:__node__ - 11 ./benchmark/../lib/fuzzy_match/identity.rb:18:__node__ - 11 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:26:__node__ - 11 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:25:__node__ - 11 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:24:__node__ - 10 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch.bundle:0:String - 10 ./benchmark/../lib/fuzzy_match/similarity.rb:39:__node__ - 10 ./benchmark/../lib/fuzzy_match/similarity.rb:25:__node__ - 10 ./benchmark/../lib/fuzzy_match.rb:193:FuzzyMatch::Identity - 9 ./benchmark/../lib/fuzzy_match/wrapper.rb:10:__node__ - 9 ./benchmark/../lib/fuzzy_match/similarity.rb:49:String - 9 ./benchmark/../lib/fuzzy_match/similarity.rb:42:__node__ - 9 ./benchmark/../lib/fuzzy_match/similarity.rb:41:__node__ - 8 ./benchmark/../lib/fuzzy_match/wrapper.rb:31:__node__ - 8 ./benchmark/../lib/fuzzy_match/normalizer.rb:27:__node__ - 8 ./benchmark/../lib/fuzzy_match/normalizer.rb:14:__node__ - 8 ./benchmark/../lib/fuzzy_match/similarity.rb:38:__node__ - 8 ./benchmark/../lib/fuzzy_match/score.rb:13:__node__ - 8 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:23:__node__ - 8 ./benchmark/../lib/fuzzy_match/grouping.rb:24:__node__ - 7 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:7:__node__ - 7 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:6:__node__ - 7 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:5:__node__ - 7 ./benchmark/../lib/fuzzy_match/wrapper.rb:9:__node__ - 7 ./benchmark/../lib/fuzzy_match/wrapper.rb:25:__node__ - 7 ./benchmark/../lib/fuzzy_match/similarity.rb:45:__node__ - 7 ./benchmark/../lib/fuzzy_match/score.rb:17:__node__ - 7 ./benchmark/../lib/fuzzy_match/identity.rb:19:__node__ - 7 ./benchmark/../lib/fuzzy_match/grouping.rb:27:__node__ - 6 ./benchmark/../lib/fuzzy_match/wrapper.rb:8:__node__ - 6 ./benchmark/../lib/fuzzy_match/similarity.rb:44:__node__ - 6 ./benchmark/../lib/fuzzy_match/similarity.rb:15:__node__ - 6 ./benchmark/../lib/fuzzy_match/similarity.rb:13:__node__ - 6 ./benchmark/../lib/fuzzy_match/score.rb:25:__node__ - 6 ./benchmark/../lib/fuzzy_match/score.rb:21:__node__ - 6 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:10:__node__ - 6 ./benchmark/../lib/fuzzy_match/grouping.rb:22:__node__ - 5 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/fastercsv-1.5.4/lib/faster_csv.rb:1640:String - 5 ./benchmark/../lib/fuzzy_match/wrapper.rb:34:__node__ - 5 ./benchmark/../lib/fuzzy_match/normalizer.rb:9:__node__ - 5 ./benchmark/../lib/fuzzy_match/normalizer.rb:19:__node__ - 5 ./benchmark/../lib/fuzzy_match/similarity.rb:8:__node__ - 5 ./benchmark/../lib/fuzzy_match/similarity.rb:33:__node__ - 5 ./benchmark/../lib/fuzzy_match/similarity.rb:29:__node__ - 5 ./benchmark/../lib/fuzzy_match/similarity.rb:12:__node__ - 5 ./benchmark/../lib/fuzzy_match/score.rb:9:__node__ - 5 ./benchmark/../lib/fuzzy_match/result.rb:16:__node__ - 5 ./benchmark/../lib/fuzzy_match/identity.rb:10:__node__ - 5 ./benchmark/../lib/fuzzy_match/grouping.rb:26:__node__ - 5 ./benchmark/../lib/fuzzy_match/grouping.rb:25:__node__ - 5 ./benchmark/../lib/fuzzy_match/grouping.rb:15:__node__ - 4 ./benchmark/../lib/fuzzy_match/wrapper.rb:33:__node__ - 4 ./benchmark/../lib/fuzzy_match/wrapper.rb:30:__node__ - 4 ./benchmark/../lib/fuzzy_match/normalizer.rb:20:__node__ - 4 ./benchmark/../lib/fuzzy_match/similarity.rb:59:__node__ - 4 ./benchmark/../lib/fuzzy_match/similarity.rb:54:__node__ - 4 ./benchmark/../lib/fuzzy_match/score.rb:5:__node__ - 4 ./benchmark/../lib/fuzzy_match/result.rb:9:__node__ - 4 ./benchmark/../lib/fuzzy_match/result.rb:8:__node__ - 4 ./benchmark/../lib/fuzzy_match/result.rb:7:__node__ - 4 ./benchmark/../lib/fuzzy_match/result.rb:6:__node__ - 4 ./benchmark/../lib/fuzzy_match/result.rb:5:__node__ - 4 ./benchmark/../lib/fuzzy_match/result.rb:4:__node__ - 4 ./benchmark/../lib/fuzzy_match/result.rb:3:__node__ - 4 ./benchmark/../lib/fuzzy_match/result.rb:13:__node__ - 4 ./benchmark/../lib/fuzzy_match/result.rb:12:__node__ - 4 ./benchmark/../lib/fuzzy_match/result.rb:11:__node__ - 4 ./benchmark/../lib/fuzzy_match/result.rb:10:__node__ - 4 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:8:__node__ - 4 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:22:__node__ - 4 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:21:__node__ - 4 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:20:String - 4 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:11:__node__ - 3 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:8:__node__ - 3 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:3:__node__ - 3 ./benchmark/../lib/fuzzy_match/wrapper.rb:28:__node__ - 3 ./benchmark/../lib/fuzzy_match/wrapper.rb:24:__node__ - 3 ./benchmark/../lib/fuzzy_match/wrapper.rb:18:__node__ - 3 ./benchmark/../lib/fuzzy_match/wrapper.rb:15:String - 3 ./benchmark/../lib/fuzzy_match/wrapper.rb:14:__node__ - 3 ./benchmark/../lib/fuzzy_match/normalizer.rb:8:__node__ - 3 ./benchmark/../lib/fuzzy_match/normalizer.rb:26:__node__ - 3 ./benchmark/../lib/fuzzy_match/normalizer.rb:18:__node__ - 3 ./benchmark/../lib/fuzzy_match/normalizer.rb:13:__node__ - 3 ./benchmark/../lib/fuzzy_match/similarity.rb:7:__node__ - 3 ./benchmark/../lib/fuzzy_match/similarity.rb:6:__node__ - 3 ./benchmark/../lib/fuzzy_match/similarity.rb:58:__node__ - 3 ./benchmark/../lib/fuzzy_match/similarity.rb:56:__node__ - 3 ./benchmark/../lib/fuzzy_match/similarity.rb:48:__node__ - 3 ./benchmark/../lib/fuzzy_match/similarity.rb:36:__node__ - 3 ./benchmark/../lib/fuzzy_match/similarity.rb:32:__node__ - 3 ./benchmark/../lib/fuzzy_match/similarity.rb:28:__node__ - 3 ./benchmark/../lib/fuzzy_match/similarity.rb:24:__node__ - 3 ./benchmark/../lib/fuzzy_match/similarity.rb:20:__node__ - 3 ./benchmark/../lib/fuzzy_match/similarity.rb:11:__node__ - 3 ./benchmark/../lib/fuzzy_match/score.rb:8:__node__ - 3 ./benchmark/../lib/fuzzy_match/score.rb:7:__node__ - 3 ./benchmark/../lib/fuzzy_match/score.rb:24:__node__ - 3 ./benchmark/../lib/fuzzy_match/score.rb:20:__node__ - 3 ./benchmark/../lib/fuzzy_match/score.rb:16:__node__ - 3 ./benchmark/../lib/fuzzy_match/score.rb:12:__node__ - 3 ./benchmark/../lib/fuzzy_match/result.rb:21:__node__ - 3 ./benchmark/../lib/fuzzy_match/result.rb:19:__node__ - 3 ./benchmark/../lib/fuzzy_match/result.rb:15:__node__ - 3 ./benchmark/../lib/fuzzy_match/identity.rb:9:__node__ - 3 ./benchmark/../lib/fuzzy_match/identity.rb:17:__node__ - 3 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:3:__node__ - 3 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:18:__node__ - 3 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:16:String - 3 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:15:String - 3 ./benchmark/../lib/fuzzy_match/grouping.rb:33:__node__ - 3 ./benchmark/../lib/fuzzy_match/grouping.rb:14:__node__ - 3 ./benchmark/../lib/fuzzy_match.rb:86:Array - 3 ./benchmark/../lib/fuzzy_match.rb:77:Array - 2 /Users/seamus/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/uri/common.rb:387:String - 2 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:3:String - 2 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:1:__node__ - 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:6:__node__ - 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:5:__node__ - 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:4:__node__ - 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:3:Class - 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:35:__node__ - 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:32:__node__ - 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:26:__node__ - 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:22:__node__ - 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:20:__node__ - 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:16:__node__ - 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:12:__node__ - 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:11:__node__ - 2 ./benchmark/../lib/fuzzy_match/normalizer.rb:6:__node__ - 2 ./benchmark/../lib/fuzzy_match/normalizer.rb:3:Class - 2 ./benchmark/../lib/fuzzy_match/normalizer.rb:28:__node__ - 2 ./benchmark/../lib/fuzzy_match/normalizer.rb:27:String - 2 ./benchmark/../lib/fuzzy_match/normalizer.rb:24:__node__ - 2 ./benchmark/../lib/fuzzy_match/normalizer.rb:23:__node__ - 2 ./benchmark/../lib/fuzzy_match/normalizer.rb:22:__node__ - 2 ./benchmark/../lib/fuzzy_match/normalizer.rb:15:__node__ - 2 ./benchmark/../lib/fuzzy_match/normalizer.rb:10:__node__ - 2 ./benchmark/../lib/fuzzy_match/similarity.rb:60:__node__ - 2 ./benchmark/../lib/fuzzy_match/similarity.rb:50:__node__ - 2 ./benchmark/../lib/fuzzy_match/similarity.rb:4:__node__ - 2 ./benchmark/../lib/fuzzy_match/similarity.rb:46:__node__ - 2 ./benchmark/../lib/fuzzy_match/similarity.rb:3:__node__ - 2 ./benchmark/../lib/fuzzy_match/similarity.rb:34:__node__ - 2 ./benchmark/../lib/fuzzy_match/similarity.rb:30:__node__ - 2 ./benchmark/../lib/fuzzy_match/similarity.rb:2:Class - 2 ./benchmark/../lib/fuzzy_match/similarity.rb:26:__node__ - 2 ./benchmark/../lib/fuzzy_match/similarity.rb:22:__node__ - 2 ./benchmark/../lib/fuzzy_match/similarity.rb:17:__node__ - 2 ./benchmark/../lib/fuzzy_match/similarity.rb:16:__node__ - 2 ./benchmark/../lib/fuzzy_match/score.rb:4:Class - 2 ./benchmark/../lib/fuzzy_match/score.rb:26:__node__ - 2 ./benchmark/../lib/fuzzy_match/score.rb:22:__node__ - 2 ./benchmark/../lib/fuzzy_match/score.rb:18:__node__ - 2 ./benchmark/../lib/fuzzy_match/score.rb:17:String - 2 ./benchmark/../lib/fuzzy_match/score.rb:14:__node__ - 2 ./benchmark/../lib/fuzzy_match/result.rb:2:Class - 2 ./benchmark/../lib/fuzzy_match/result.rb:17:__node__ - 2 ./benchmark/../lib/fuzzy_match/identity.rb:7:__node__ - 2 ./benchmark/../lib/fuzzy_match/identity.rb:4:Class - 2 ./benchmark/../lib/fuzzy_match/identity.rb:23:__node__ - 2 ./benchmark/../lib/fuzzy_match/identity.rb:22:__node__ - 2 ./benchmark/../lib/fuzzy_match/identity.rb:21:__node__ - 2 ./benchmark/../lib/fuzzy_match/identity.rb:11:__node__ - 2 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:7:__node__ - 2 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:6:__node__ - 2 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:5:__node__ - 2 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:23:String - 2 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:12:__node__ - 2 ./benchmark/../lib/fuzzy_match/grouping.rb:9:Class - 2 ./benchmark/../lib/fuzzy_match/grouping.rb:34:__node__ - 2 ./benchmark/../lib/fuzzy_match/grouping.rb:32:__node__ - 2 ./benchmark/../lib/fuzzy_match/grouping.rb:30:__node__ - 2 ./benchmark/../lib/fuzzy_match/grouping.rb:29:__node__ - 2 ./benchmark/../lib/fuzzy_match/grouping.rb:23:__node__ - 2 ./benchmark/../lib/fuzzy_match/grouping.rb:16:__node__ - 2 ./benchmark/../lib/fuzzy_match/grouping.rb:12:__node__ - 2 ./benchmark/../lib/fuzzy_match.rb:101:Array - 1 benchmark/memory.rb:50:__scope__ - 1 benchmark/memory.rb:50:String - 1 benchmark/memory.rb:49:FuzzyMatch - 1 /Users/seamus/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/uri/common.rb:492:URI::Generic - 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table/executor.rb:19:Process::Status - 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table/executor.rb:10:Bignum - 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table.rb:63:Array - 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table.rb:121:RemoteTable::Transformer - 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table.rb:116:RemoteTable::Format::Delimited - 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table.rb:111:RemoteTable::Properties - 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table.rb:106:RemoteTable::LocalFile - 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:4:Regexp - 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:4:Array - 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:1:__scope__ - 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:1:String - 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:1:Module - 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/activesupport-3.0.5/lib/active_support/core_ext/hash/keys.rb:18:Hash - 1 ./benchmark/../lib/fuzzy_match/wrapper.rb:3:__node__ - 1 ./benchmark/../lib/fuzzy_match/wrapper.rb:3:String - 1 ./benchmark/../lib/fuzzy_match/wrapper.rb:25:String - 1 ./benchmark/../lib/fuzzy_match/wrapper.rb:1:__node__ - 1 ./benchmark/../lib/fuzzy_match/wrapper.rb:10:String - 1 ./benchmark/../lib/fuzzy_match/normalizer.rb:4:String - 1 ./benchmark/../lib/fuzzy_match/normalizer.rb:4:FuzzyMatch::ExtractRegexp - 1 ./benchmark/../lib/fuzzy_match/normalizer.rb:3:__node__ - 1 ./benchmark/../lib/fuzzy_match/normalizer.rb:3:String - 1 ./benchmark/../lib/fuzzy_match/normalizer.rb:1:__node__ - 1 ./benchmark/../lib/fuzzy_match/similarity.rb:9:__node__ - 1 ./benchmark/../lib/fuzzy_match/similarity.rb:2:__node__ - 1 ./benchmark/../lib/fuzzy_match/similarity.rb:2:String - 1 ./benchmark/../lib/fuzzy_match/similarity.rb:25:String - 1 ./benchmark/../lib/fuzzy_match/similarity.rb:1:__node__ - 1 ./benchmark/../lib/fuzzy_match/score.rb:4:__node__ - 1 ./benchmark/../lib/fuzzy_match/score.rb:4:String - 1 ./benchmark/../lib/fuzzy_match/score.rb:3:__node__ - 1 ./benchmark/../lib/fuzzy_match/score.rb:1:String - 1 ./benchmark/../lib/fuzzy_match/score.rb:10:__node__ - 1 ./benchmark/../lib/fuzzy_match/result.rb:2:__node__ - 1 ./benchmark/../lib/fuzzy_match/result.rb:2:String - 1 ./benchmark/../lib/fuzzy_match/result.rb:1:__node__ - 1 ./benchmark/../lib/fuzzy_match/identity.rb:5:FuzzyMatch::ExtractRegexp - 1 ./benchmark/../lib/fuzzy_match/identity.rb:4:__node__ - 1 ./benchmark/../lib/fuzzy_match/identity.rb:4:String - 1 ./benchmark/../lib/fuzzy_match/identity.rb:1:__node__ - 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:4:__node__ - 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:2:__node__ - 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:2:String - 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:2:Module - 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:28:__node__ - 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:26:String - 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:25:String - 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:24:String - 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:23:Regexp - 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:1:__node__ - 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:17:Hash - 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:10:String - 1 ./benchmark/../lib/fuzzy_match/grouping.rb:9:__node__ - 1 ./benchmark/../lib/fuzzy_match/grouping.rb:9:String - 1 ./benchmark/../lib/fuzzy_match/grouping.rb:1:__node__ - 1 ./benchmark/../lib/fuzzy_match/grouping.rb:10:FuzzyMatch::ExtractRegexp - 1 ./benchmark/../lib/fuzzy_match.rb:62:FuzzyMatch::Wrapper - 1 ./benchmark/../lib/fuzzy_match.rb:39:String - 1 ./benchmark/../lib/fuzzy_match.rb:39:FuzzyMatch::Result - 1 ./benchmark/../lib/fuzzy_match.rb:35:String - 1 ./benchmark/../lib/fuzzy_match.rb:35:Array - 1 ./benchmark/../lib/fuzzy_match.rb:199:String - 1 ./benchmark/../lib/fuzzy_match.rb:198:Array - 1 ./benchmark/../lib/fuzzy_match.rb:193:String - 1 ./benchmark/../lib/fuzzy_match.rb:192:Array - 1 ./benchmark/../lib/fuzzy_match.rb:187:String - 1 ./benchmark/../lib/fuzzy_match.rb:186:Array diff --git a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/benchmark/memory.rb b/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/benchmark/memory.rb deleted file mode 100644 index 4514d9a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/benchmark/memory.rb +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env ruby - -require 'rubygems' -require 'memprof' -require 'bundler' -Bundler.setup -require 'remote_table' -$LOAD_PATH.unshift(File.dirname(__FILE__)) -$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib')) -require 'fuzzy_match' - -# messily stolen from the bts example - -# The records that your dictionary will return. -# (Example) A table of aircraft as defined by the U.S. Bureau of Transportation Statistics -HAYSTACK = RemoteTable.new :url => "file://#{File.expand_path('../../examples/bts_aircraft/number_260.csv', __FILE__)}", :select => lambda { |record| record['Aircraft Type'].to_i.between?(1, 998) and record['Manufacturer'].present? } - -# A reader used to convert every record (which could be an object of any type) into a string that will be used for similarity. -# (Example) Combine the make and model into something like "boeing 747" -# Note the downcase! -HAYSTACK_READER = lambda { |record| "#{record['Manufacturer']} #{record['Long Name']}".downcase } - -# Whether to even bother trying to find a match for something without an explicit group -# (Example) False, which is the default, which means we have more work to do -MUST_MATCH_GROUPING = false - -# Groupings -# (Example) We made these by trial and error -GROUPINGS = RemoteTable.new(:url => "file://#{File.expand_path("../../examples/bts_aircraft/groupings.csv", __FILE__)}", :headers => :first_row).map { |row| row['regexp'] } - -# Normalizers -# (Example) We made these by trial and error -NORMALIZERS = RemoteTable.new(:url => "file://#{File.expand_path("../../examples/bts_aircraft/normalizers.csv", __FILE__)}", :headers => :first_row).map { |row| row['regexp'] } - -# Identities -# (Example) We made these by trial and error -IDENTITIES = RemoteTable.new(:url => "file://#{File.expand_path("../../examples/bts_aircraft/identities.csv", __FILE__)}", :headers => :first_row).map { |row| row['regexp'] } - -FINAL_OPTIONS = { - :read => HAYSTACK_READER, - :must_match_grouping => MUST_MATCH_GROUPING, - :normalizers => NORMALIZERS, - :identities => IDENTITIES, - :groupings => GROUPINGS -} - -Memprof.start - -d = FuzzyMatch.new HAYSTACK, FINAL_OPTIONS -record = d.find('boeing 707(100)', :gather_last_result => false) - -Memprof.stats -Memprof.stop diff --git a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/bin/fuzzy_match b/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/bin/fuzzy_match deleted file mode 100755 index b6a6b34..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/bin/fuzzy_match +++ /dev/null @@ -1,106 +0,0 @@ -#!/usr/bin/env ruby - -if File.exist?('Gemfile') - require 'bundler/setup' -end -if ENV['PROFILE'] == 'true' - require 'perftools' -end -# PerfTools::CpuProfiler.start("profile_data") do -require 'fuzzy_match' -require 'fuzzy_match/version' - -require 'active_support/core_ext' -require 'remote_table' -require 'thor' -require 'to_regexp' - -class FuzzyMatch - class Cli < ::Thor - desc :match, "Print out matches between A and B, where A is haystack and B is a bunch of needles." - method_option :csv, :default => false, :type => :boolean, :desc => "CSV output" - method_option :a_col, :default => 0, :type => :string, :desc => "Column name in A. Defaults to first column." - method_option :b_col, :default => 0, :type => :string, :desc => "Column name in B. Defaults to first column." - method_option :downcase, :default => true, :type => :boolean, :desc => "Whether to downcase everything (except regexes, where you have to do /foo/i)" - method_option :groupings, :default => nil, :type => :string, :desc => "Spreadsheet with groupings - no headers, multi-part groupings on the same row" - method_option :rules, :default => nil, :type => :string, :desc => "Spreadsheet with headers: stop_words, identities, find_options. Listing a find_option like must_match_grouping makes it true." - method_option :explain, :default => false, :type => :boolean - method_option :grep, :default => nil, :type => :string - method_option :limit, :default => 1.0/0, :type => :numeric - def match(a_url, b_url) - puts "Checking matches using fuzzy_match version #{FuzzyMatch::VERSION}..." - fz = mkfz a_url - b = load_b b_url - if ENV['PROFILE'] == 'true' - require 'perftools' - PerfTools::CpuProfiler.start("profile.bin") { report(fz, b) } - system "pprof.rb --text profile.bin" - `pprof.rb --gif profile.bin > profile.gif` - else - report fz, b - end - end - - private - - def report(fz, b) - b.each do |b_val| - if options.explain - fz.explain - else - a_val = fz.find b_val - if options.csv - # puts [ b_val.ljust(50), a_val ].join('-> ') - puts [ b_val, a_val ].to_csv - else - puts %{\nB: #{b_val}\nA: #{a_val}} - end - end - end - end - - def load_b(b_url) - b_options = options.b_col.is_a?(String) ? { headers: :first_row } : { headers: false } - if options[:grep] - regexp = options[:grep].to_regexp(detect: true) - b_options[:select] = lambda { |row| regexp =~ row[options.b_col] } - end - b = RemoteTable.new(b_url, b_options).to_a - limit = [options.limit, b.length].min - b.first(limit).map do |row| - b_val = row[options.b_col] - b_val.downcase! if options.downcase - b_val - end - end - - def mkfz(a_url) - a_options = options.a_col.is_a?(String) ? { headers: :first_row } : { headers: false } - a = RemoteTable.new(a_url, a_options).map { |row| row[options.a_col] } - a.map!(&:downcase) if options.downcase - FuzzyMatch.new a, fz_options - end - - def fz_options - memo = {} - if options.groupings - memo[:groupings] = RemoteTable.new(options.groupings, :headers => false).map do |row| - row.to_a.select(&:present?).map { |v| v.to_regexp(detect: true) } - end - end - if options.rules - t = RemoteTable.new(options.rules, :headers => :first_row) - find_options = t.rows.map { |row| row['find_options'] } - memo.merge!( - identities: t.rows.map { |row| row['identities'] }.select(&:present?).map { |v| v.to_regexp(detect: true) }, - stop_words: t.rows.map { |row| row['stop_words'] }.select(&:present?).map { |v| v.to_regexp(detect: true) }, - must_match_grouping: find_options.include?('must_match_grouping'), - must_match_at_least_one_word: find_options.include?('must_match_at_least_one_word'), - ) - end - memo - end - end -end - -FuzzyMatch::Cli.start diff --git a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/fuzzy_match.gemspec b/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/fuzzy_match.gemspec deleted file mode 100644 index 5f782d6..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/fuzzy_match.gemspec +++ /dev/null @@ -1,34 +0,0 @@ -# -*- encoding: utf-8 -*- -require File.expand_path("../lib/fuzzy_match/version", __FILE__) - -Gem::Specification.new do |s| - s.name = "fuzzy_match" - s.version = FuzzyMatch::VERSION - s.authors = ["Seamus Abshere"] - s.email = ["seamus@abshere.net"] - s.homepage = "https://github.com/seamusabshere/fuzzy_match" - s.summary = %Q{Find a needle in a haystack using string similarity and (optionally) regexp rules. Replaces loose_tight_dictionary.} - s.description = %Q{Find a needle in a haystack using string similarity and (optionally) regexp rules. Replaces loose_tight_dictionary.} - - s.rubyforge_project = "fuzzy_match" - - s.files = `git ls-files`.split("\n") - s.test_files = `git ls-files -- test/*`.split("\n") - s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) } - s.require_paths = ["lib"] - - # needed if you use FuzzyMatch::CachedResult - s.add_development_dependency 'active_record_inline_schema', '>=0.4.0' - - # development dependencies - s.add_development_dependency 'pry' - s.add_development_dependency 'rspec-core' - s.add_development_dependency 'rspec-expectations' - s.add_development_dependency 'rspec-mocks' - s.add_development_dependency 'activerecord', '>=3' - s.add_development_dependency 'mysql2' - s.add_development_dependency 'cohort_analysis' - s.add_development_dependency 'weighted_average' - s.add_development_dependency 'yard' - s.add_development_dependency 'amatch' -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/groupings-screenshot.png b/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/groupings-screenshot.png deleted file mode 100644 index 23e68bdd1413d36d312c09f1372db815a3334ba0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18097 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 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/highlevel.graffle b/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/highlevel.graffle deleted file mode 100644 index 6f974a5a9d5adc7cdfdb512d51f543bb3ca36de4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3932 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 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/highlevel.png b/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/highlevel.png deleted file mode 100644 index b39970eb18e08dc3bab3b24c55856a9539368108..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61213 zcmcG$bySp5_dhzrz)(X7A~PTxAs{6&ba(d*X&@n`lpx(m2$BN`BAwD9 zAp?jYEqR~u{l@R!weElSx|TXTv(GvE?0wFT&)yF&v^10{$QZ~#AP|MB$^&f>2s{Y_ zLEe!-fhUhu9S(s1NZnKnJwYIHTKr!yC@ljHP)*qD8h9C~KbEp|b>=s>a<#DL_j7gw zs6ilUKPlj&v$dBwtDm!zi>H*I4EsL{Dd02yu>d>kKN2rT8FmA8EmlQW4{KI2ej$Eg zc3Co3R#s^bD;p{82TK1n9Qa9w-OkI)O-ew(*VmWdSA^fy!&X2@Qc_YtP*^}%m=B=f z^YnM|GWX+i@x1k)N&b7D2iBgJ9`*( zc>dS6fDH=ZzY!4P7ZmuPxq+e5_@`2euFh^A)}Efg{IX)w|0w@&&;ECv|IlmMxq7(* zQt+_1RCV#P_5cQZnd7;W75=Z$|L+w4&$%=`?5%-a{~ImzU!(ueXa7YnEr8$n{~?I~ zNcrDWK+Lja(gOdZGFdWbBJwN{2nkYsAg}8O{*_7GF!A8D`{DJEtS^}uS&tT)EGFxY zTTz`8b-yZtw_h&LoS8Xs`IrP&8c+u+U%yWGt3_YyvhDco+<;6*;Lhjc+mfn-XEH;9 zHp1`vgZ4Fq7ysT)%TkAt|4CKl-&JlW%Lf3$(->#8^%I_Yy)0o-~&TDgN0YNcB}y)0o-y zbI>Eh_o;WfKdNW$Ri}bn!}-Ve-Nn{C=Ga%64AmF*q;HnK!>VJumTvY+7E8y~Z$*PM z(Kqn2L_UNH!q=-;9#lznTL{`En^TZwCc5o|hNyp2f1zhBGa6niDG|BaFsxJwK^#7P z=03+)-ZRU^Gxr!&pHOsnAB;N#?ZRiD=buiyeVx=aYs$CDehNduW7p6Z?HzE6c^#)j zoPpaLBv=kJ7Jj0#2`Au(*b=CVr$(GyVb<7Zg?DEYeZ=10ymY0ds(r2l{laQ4w2Cb7}_hv#v-*)M}EhNnTM}TXQM-{Kru9p9 z^B3*XCD~zg_lEpYdHDryHWA7Ei)zLtyeP{%d_|A#*IblvnhfFmr9e-%y^mU^ATZAz zrfr)v3^!sbF^Jxh+Tw7jq&Qt_O)?gm)_U=|L#Pt@iVeP;J~!spBfN>JQWtC z{o7h5?3!NvL+IXNh?#$Oc)NkyEv}ZZcsH3{20tdJ!bhY{m?kWvlg6GM`GyQuYnO7k zZ@<&lQZdt(b2M@FWn;uU8d%rIhELZsz>Je&zE$bA&=Mu!-wO^Hfl)>s`xL_iYo&W$#yX7; z_HSRi3RAGv_<%}%#|L#Xu9;x@-VGan38pwx zp9SMbCLYatWBupa#vN%ZK~EA=OXzp|+_)F*SZ^&P>5k?XH@oN0dcJ=3Ehg1+CG8Jo zb$|^kCvfKT%=o&>XObs>6pnI47;oKYe(#ZQjzV~^H9p!viMdpJ zNA_EJit!iP{XD_hzqFI|Q23%yH88#5_oTz0vG$07XJb^X+=U-=h%^^zdS6YfZ&Y&} z8P|+6l5Q@is&J@Oyt)VRHwRhfZRpL1XXNWidS5+B{ znf*0Vi_&jsyOqHFi-lHwNa5!EVGibEc>5hM&XVbkCAM2k(#5120a!NJxe=(A4s!L} z_-+=h^$*_w-9yGSk5RMjr(?&)vwhid;*c)$CDpVK%Er9k1hXdwhxXSW9*6M}*2g9#oj+Ry4z1nOKl3F%3wzk!vV<6>@9+A( z-!Az@AMz^vD|$gSs3bO-db0G!BGC{=Y3OTp3&n}t@QTuf*zWQ4H>HOA2^pYiBD&M<(9{E9BkOH)Yd2;hU#9a44uQ0Pc8rf|y3JEGz zVPzpQ*H=Kah7!+ygyQbe5t$P6V{}^Rr?r)V%lG|>ZBwyLwh>eini_u$-4#?)P~uWG zOz1GnAG9Q0lkfG+_u|F)&cOC`FE`Pn25+UjzS;OTT&oQJE^+$j7 zl2!KppP?{6{f^Nj!Hq`xv&7NPm1Wr7P_o|H>o5Z0vO7;wcWM+K$h>^*D09>}>jX9W z28vQ#Sow=Wu&(@(@FQ-{%>MXB`7_uYJ>vlvCxL)}w6Oq@BcMuPyx1LBm86@rJ$A6*! zUN_c;E2xsfaiOt1EJ{8tIr#IN zd_}&G89R&SvtjjwO?eI&ry8&Uk**O6b?b<##@rdhxl?f$h~C8V7n9S$BEwLqH0K<2 zG)Scp=4T{f(rS_pq#N5P^j&iqoil_1eCROI=lYuB0P+Jcn|hKdy$cXE_rnfyn#G+B zENv#by6|52S5hMqScS$4tJ6XHX6wU>CBWAo_l-Be7FFW$jPWm0VU7GMa%szYAEsk` zL{LL@^Vb_ez#wf4l;q~$!6-4#PbTV3z^!to50;&Ry~SKd>?XOrv}!6j0?y=&>}60b zz}g1zIgNR;qBs-pkP?wBcz*U^ZcW}H4)3l>rw2J#w8LuO10MUx6GwwzJ`3z$UhmoF zZL#K<%srF0g=g`4H%_k0?Yx49gdC>ITjX1l7G)}iA8Xc zK^~Ky&6Yph=$CSemYJ0L_36Rn^5o}Ub+kBezKn0sTz`*T)p3)|J0CqB4?p!cPY=Z&zz_S#|~(acIZB)NK@QAd!ZI5QZj>aMr%X%;6_&;;-qj$&QBwDVKJKZ(vNBM;J4p zvR&8;RXZWbXZ%IcpSQLiK$;`s-6vMWpClv%lS(7hz2;!6cqXL}-gt{bx@?i%bwSdj z81IF=wmlK=-wAV&RGF{ zjcJ%=Vb+zIyLMU9-){+(Wl{3GgwnTKhg_KdXquuBh5SXKBh`$CIi%6%6P^_>$h~{B zhi)Kw5<43@_O{;*m)_dAAu`Mk+!{XZq#!8&u4VCB!>S{<7sXehT_!W!jT_DG#>BMt z%h4$LQ|$%E^aziFHSDzfXZNyN8K%FYhrB^IUg*zU61Mcxo47ykf<5jTtxYqG-T^Z2ZI+k-a0NIv zJK|X2nQ+QXW%E;n+Fo#M`+2yaxW!6ZdPQ%3lIE!UL6F8E*g=xFNqZa@ATkk@JPA0*}) zaGR8RdIGP9*Rwe{P?SM#5bG!Su$$A2rYq>H00F%{p04LUu%Q1=J2EuJ&h`U+xbyDq zD~dt(Ryx1;!I{`o;o2qADqaJIW|}3l)v*7__7^zF%9Xz=}a+8{;+y3}uf) zB1J$5^%sK_$#)GYVhGeg6kes_i1rL*{S6-wJvje3x6GbIpTHB6d?tf~a6r(~jvF3a zRoA02YWBSs2W^8dw4x#td?M-zzdGnCt*3Ostg?VZ)bIObg3Mt!;h3TK`vV_HxV%Jg zpg8k(u#@9%diaS6Qb4l};Y6B7v-UZynUIh=4&Y+g~G(f33alon<0h07K9ZYM5;?^;pT? z8+>uKFRdT$OSnKC1^```2eP)FF6I)bt^6kFK#VczeR;(__1#xAcPD1TpZf4# zQn~2K-LP{7!?tq--&(rR^XPU>^9U^^-8DXv5GV~_$s6;O9-JKP63k4HVj<*4G%&*V z{BK`c9qnvdy8#SGm13jCVMHrPVpm}OFnj-&u}BrepE%@!v6W|aLGP&SD?|?=a4O#6 zqKG@zO^(0DG)ra!XjB@p2P=3Zso|(7{h1?NLSw9W69+-~Uj%&ABlBtpk zuKc46)eZgS6&nLBC3YVOu;Xlm?d-5}CnnL&Z!{o!2q0?1I~2gMz*Bn`%HQw>tKa* zacCdQG&2>m?U~3fwfz&SG!C@|M7HMp!nj4ECgmAn@jt1^dRF!I{O<%fA0-Lez1x2h zvIXE|9BFh2vzHe;h1!N!vs-TwJs?PkdniGOygsc@TsL!{e%P~EfVN<#Z#D_#{H__uj(7I&O}P$7d*ZUDa0}LR z6WU)Dll%n_n;#q3GiO0XKFUC5?@)(kHe8hW`oV+S}l#x-?#6+s(lc7`s9`&C9N}>Tr(LQSW!HhsbLKRvFPg1{$0H$ zDqJQNd!X8^I%>sLDqO}5d4ljI@aG8y-w%JImGs&{MM+-q^u#k}WLne}HT;DwBK6Jp zxGM1}u!?B72mJ;#B~Q#XT{he~J$u9Ou9l3$VO)G=<`s;l1eX^{T8#@wVpwa`S&C)WQld zp-RFgN&hjKZ^3{s-`xKPHv>i!2mz-Wx*r$e;otu}TiNvd|K!V)`3@o4nUrO}{l1Sk zeT|>R9tu&wZhkG@h;^Ov_<}d@T8dD>+B3X)Us&=N;zoa30sal13_BCFIn~YNB!&%# zo(5$vzM5@q9c_w~nVpoS-1=$9IN7+dc_f|$Hd%H^@nz=h$>15Q8 z^oF@3zqo?WOeO;-C%1Jx=<42+D!j=>NFLLqI8pKNCEHpE4)J3C4dKW z?7w+24*N#?F3*juukqSsQv*V|@qy8CmIV5ZXau=X#+o1=ND;nPG@26Hk3>K+L`35A zp21whWF+;a_n&kpi0|XAQ|p<4=ZuIQf3)_VO{6B~_mJt=rN7`DAWrC(6ebsyCW-Pe zJs(SYi($t@m|si>km+z_-L4{e_UeEOL`1MDtgu&e zAIyHj`GBV)S_AHt1{ev5#9s%PQ5D+qu(U?EO9j;`ljn%KwNb8)Y>s3JknkbQ(XBHS zPc;Y_hs7(cAMll$L$$4eYw@(v#PB9e&~Ixbivle@^SV6|8Fh3Iy3azwCuV_el|+|N zLAQqKT_;p1^c|rN_zY>F2}@QR4TkR9OPIzT^$a`w=?_Ngd_5LyxKgrHeE~jQ<|^4F z{~mRAtW)xR;w|Pepz5@5E+4g>&C%^L0B1U1)iApwSvjzy(AxaREILdOw@_}$I<&n> z!*@pkKAY?c1Q4=s{T6UpLHueOYup`SZt)NZs{Q)P(c+hn-}jbX@^)e5vB6;^padWl zaWdYzyv`*HhNJ)5=NG(=yo&^M!1#sF*$QOZwMK^wHLc~II&Na?uz&(#bm>rdqXj6O zl}b%XPv`6VaA5YuTM;o1M9hWkJFk(i`aX43U21QC9JGaQ;-mHeoOQiB4OEblNoAa% z2;e*6i?yBW7p;>K=I3^gvNd+1TbXcMO7}Y_BMSDU=3(PJfFcfO_Fa4-5CCm3V+0Ph zI@T?_*fO~8t4=2MH8SH!7Rkw^Q`6m*NDDSe$^m2qunY+zHVqsT&AdGgv)gQ-`giEO zuk5Ji`U$A0Fv@}@mpzgX4Em8ez{R}R6*IP#1&;X^6JJFUpF_d2Ju?0=M$N?E$t~xh zS{&NZ?(9zlzABUk1dnwHkLEsD1Po=|NIMCfX{jt?+z2xwtwU}`aW-&FFL?FbX=W=f zLouQYR*O$F)L{N?2rf%j!Fzi)zR*T9M%kI%hfgADW*9kHk{-lk>el+SrffVUvXKpDr-DqI3 z+cbzfI)C)`uKc3&6CA-(T!w9lZQ0`mATJzv7H7CPCyf3vN)GQ(4)m%#(qoM~GKV=2 zux!h>%@40}0Mv?MfMBA*!6U%==?Ab!6tWGR8dg{Aa&4C(Ug!+o=|gFd;K!|CvL5yV z88`h{$&VG2WoANqk(Y|!w~rtI5HPL&)e@m5hF~yb3S2p~@#3YncC`Mr(WeEu=W$5- zT_!l_6cW06lZMxZl@i$Y3TnjqE#@s8yKCQQaBORB*GAANSE?M?O{15DHPBGXV&S&o zQscP#!NEjyKoFv?97kO0aZdhE=@xiU21;WRfq0${hM|aijVXG191=#jSQSevk8nEv zoNVc>#U+tXj3S$@Je3TH<3k<7G_eOWl&ii9GW@l$uYI}y&(tSu7kGPV-LUWZp8|v( z58(7?do$uhAYv%c%H1IyGyF-tp%e_d0nIsoU}YAwmu#*8_xPpzWv$L(!h@@Ey`=bu zXZyFCcLb*J(!LKI8s|G0**SbkA;#KwGlbrYdrTgBWZ_2LUH#)4%ifOi%w43?k+>ik zj43}k1emL9_+l2ayVC6y<5c=weP#PS^h-0h{nIJ zFj4kH?HUVkS1bU~Tg>N?Nj5?y8VvinGM+cll`~oVP>UwgNHgcG%7`vV5=UkOuC&l? z0}uhQNIWZW(eV(`0P+oRyXr_(S==XcMfV;>3Rbw$Rq+^r?MB9)Em^pcL-qXmfY^cq zf4daEG#cQmK!OdPT06h9*YLt$V@LsV$4Bz#gETphM*^X;$V*syTHo<*pxt^$TnjN4Q@uLB!FQS zpHrpoOo;Dkmp&!FB`v!=u$c?a5x<`l;6r$1Q_4B^7w`X%jQdCc4fn7^;Eg{1#S@=i z1OOhKa&^Fg)5FizN7Nm!hNr^7(SP(IV*sy)C=Jt1CD!KD85@B*qj`wyQCq~8XH4_- zpCwW+k`}`j^uOyx4!~5-7}lM85PK0c+m=SA(Vx=5;`anHvbh2)y50iG%^%55aVwx7 zErx+LAFH=IUgEd<;izmjnFlI}dLr=DRfDW$oKCPLpRTRWf%?!f-yJuw`EGhRJ@|Ty zx9j%>r*f&Uhc+od!Kuzl%8U(PsqAs_&aLhNLGPrR zI@B4DwhpIHJX*1qZy22dh&ZIo%;5mh+X^qme?-RsQL|F>G=+qXBy~VdTzh!Sw8IOp zRt3Dtpq|GmS-l3wsN(W_UyTv>IyNrX>z!l6n+=2KOpa~V1~wOdu`Z@Z5~=0jSH}JJ zUKzClDQbUHo4>B8y-(L>zeiopvukrmmo=Pz@$Mq7J-JF`w`H2kJeEER*nQ;2Bk?>v z7>e~*{->~@6S5XV|HCxd6!FsJZr4vA;I?9rcQ)88$AYG>z1GQK*aKYtLR9Pz&tmWG ze7#xyYpyomMje>3x>ib3J$eJ$hiI6oO^?rm4iUIsbm z31ZW}mg!P1wPTy@fltZ0Ec!YC0P#I3L_dod3O`BT*A@Uk-B1BNfMwf<3%^!S^h<#? z+lAAdc|CxNuYdD-`qu&tHZgTLY0)h|sY^|>pzmmFo>s^F9^j{1#fyUxuz&IPfcX@e zm(k;QhQf!%(sPr`1H;9zhsd$SN@^pAFQALj@RDP~rto?Uv-9X#Y$zLm?)Br*z0dp~ z73xq}QwKf+*Wk<}n`cAs;)*CBt?NdN3nq?Gczi0^B|!&Wn`gFO!}8>@w#cyZ8aLsw zjVtHe^WcEHk-rCIAG2(x*EEXHem;l0relooYP?a_G?*rg1>I~(Jr(M;dpW`r;yA-ZHI@F4*&SJ#xqnthq%B1U|O`=l(syM?dWz1cpt^AMs2!y15cqZ10PFbT~4! zubupRz=3TBo-L;#{&#_w*WiCbxEa`#ntJ*lr*Y*r-v^0q`F~!1=}hiEvZ)z)7&+O| zUAJpu97@5vuRR%o*+Q1;pKA|3zFBxy^=9W!NcSaT;7A}~=w(zWdJ!v%EC2djoBrVK zn@539u8PKa;&h)g?^k`Mj~73q9KQAR$cC-`%}v1YeRJP>qho`XuN`d}--6GDI=tde zI@XMxy*Wo^L$Z5gEmK3fCTxND!(8POc@@nmb4F72xVNbFB9bY$Z;RwqQORjyFSu?> ziN(JLxXb>4)Jo+{j%*x9*oZ2}N+Zb^+8??yLu|adcD8DLDYNO?cnHc*oDL-s)SuXu{r;1|dD8<@@`=hVVo+ZE+MhjL~#u4!jS&{0v-y8*f7r)z60{_aj=xjZcX4NssQm|=D7;z(9Vjd ziAi;WKh%~gQDjw+29h$$Q}D)t47KJPruLeA1ICad*P9YiitErq%r@o{lmU4Znl$z4 zE#{s`Htlx{s7E^}+>}$m+YM?3@KVqAvm!xI- z^<9s9T7OOKYxsz!A&g(Gzcsm-lc_8&D% zG*txgwr7Mm!dS>e&!JUgM75Q~A|xGCiqv7x4dC*tE{3@mbS5_Y^C{fNXm#sdltnsC zQg8BU-6G+$LD2vexr zrRnxq*MD@K&DmJAJl{{m`rG~Ukdc!uai$;N;s zB0fsr{dvu}5F|rDWGrZYwqk}y;}yTxv*(Sm;Ks-iw(UEwCAC!mM5@KM_`2!Z}shA z8U6Cd!TCRX=?uVr@8ADyp%_Y&w@Y>_`z@x~og>WU%~@+g{>_WW(l?uK9>_Y@!$R?8 zJ{lmf4Q3zD07LWTures}B*W`=*w#dO-UFM$^3QL&bW!)yCN}Rtaj7+u8pplI93l2X z#rAXDGl+mIF0-nV$H!7DaqfQCdrWvFuG+5&n&Pwk-lA$X58cE4s@io+jP%V6-U0_M; zXiMfxJi4|ty=ZoR8 z$WcaKB1#Ak$p3Gz2zAe{>J8A3u(atHzC<4R_CDOM_*x<$-g-`UN zMnrF^+`aYi7J1v#wfk;-?k{>rzFs4KvWfVV-R@`CwE^cqO zEYUKcswB=GK7A+GUEnP-&RLb}%@M*c;)G|3D?MSN)14F(2YakL2j=!wRIKvL!9J2e> z{_ZOO(!wLSR{^ zV-2!Xj0a$GP)q5Fbw@w>sX)XV;Skqw(@xGKaeT&Z0V)kwB{X0@<>9cEg z+y-$2xZp28l0?#zBQ0&L;tCd`A^zf>$dGQs=g#nQZW}sN{$UOiOX?15`G-Fo zG69Qq=T&>#uByXcXT-=?sr>6Fb8x*=Bh!ta*>VPCFmPk4RNAlwl*SgwewME{h4Bhv zQTHVSfQ%V6OFTz%FjodM_{lL`FaGlNL*?>i=NhdPX~P!v;twOv6{y(l_DffZPhwG@ zKeN-$N4K^V0SUzi-lkm#d>cX(=lb32_|X2*JQDz%c5So9d%NDC<4XoY`drfzW~xRS z+_TanZJujCYjuGE>XA13ZyrM7N%yl;n+@mFO~?T*TBaWd)ZlDh2qKT4?r9&!E-tc9 z-xPz0;jzBkwN0aCLRh5CeW`Eh$vHrJ7FZKt>y)xH@WCRO^ukJ@uC-CRzP!$Tz0-P&T^dJ;GW$j%SZ1u>IE{{VpaC*?@XI}KO7w8Etc?g0@%b2 z05Te|s5B@v7D8hHpe^#Aa4m59leO49{h%lgz|pztRZ=Fg72kKg!Q9(2 z&a)&RD$%@5&(7NgK9G-x5r*C@}OIERjS5WfXyFHuDiGcKn_Xd zLRrkO0M=&lGvn7!9d!;xZDlFv$Z>IGu%T;e^ zz-A`>;m+L=kpt~iju6f&U}rZ(Sb=OgnE5RRCW!tBlp_MG8^w8C?=_33-*vqqww*sJ z3ABsQ04(qctzOu$S_2Tvo{d;niM=Jjw@pi<-U9FGlv+Lns2GXiwI9W|E(W=hW0}_>!VUm#=~W+`KIAYa2~Bi08|2lVZyP zYSa#by5FddKDG&EWnM@x?@eDjd1P7wJDe@o>NFex`XaD^%!#x!tbk4$kdpSouNmaA zjW}o^pvI~`l}r_Y4LE?wRI9hD2avrmlmt&eP0=6PDH`09_ng>dtSL7hCZhouyWL*W zCkhd>VO<`$WO`aVdg8mwAVD?PJHF%k4}7JuK}G%W`I53=m?b}2s~HCr^wEX@~>OQ{KQ@pJD~p z??K)H__+j21I*f#a1l);_?9?av-D|vvsu`!9)VkDoPG(y0#KRf&w%z2J7Pd?+pI&; zX_#6Bc9)N^;=_V1Rzi>ky0^IW>eFV&M>EVVNmC`g?!QEv4c8AG9N)rhB+K0jjO;}XKFfxwO}>0i|WZ+62tY=!>eiO&#o ziY@i%XteZ%2v*a6L&0P*Y^Au89uA4h9iy&78c8)Ui^S^#cVd6W^LtY~4AtI@as-3q@`bgbdxZHhj)Q^H#_eMmKKJ?t>N5Hm!{e4;hio7R( zjgLKz5(W}SVJ}(xo3qbqxr%-1x4Nz?w!gqttUCiJ(Qn`qm7nQg2?119sTktzLS&`O zndZ?#)G7M0Ho1l+EmvG&o7~E3E%-fBXLTBnW8w{1y~$2gAuvLv-ux4>GKK{$-O@xt z&Q|N{z)(#kK?oxjt_Bb?fEWP7jC@UgL-EA6WSesc+(U}@1c;|HMmj2_F=efcfn0vj zo}O0Sp6zu9EBz))6FPn6_#U9*)9t#ny9%gA#sGVSd`vyb6&R904I ztU!p}A+j{l5xHX_F6a!k(#3|1^Mp4NO@VW(HDnNa?izui;B}gbThdfvvp?1}s%`>6 zGM6Zz`N-d<;{57RL54AOc+tK|75@~$${zi$S6YBoIseQRj|5ALmDLVWefyXUDza?D zA-ErD45*~LE3dEk8B~zQ1l`KN5A>rLuvoHpZr;`EAt90tfzVf%uUokiUq#lRVIP?@ zN84m`0fTPj-e>YGNjivsWtRvmhBRC9CoG%p zW)FUgD3S!kA+|%n6YmX$udWjq9ZJ#Q-c57~LeIk74JTzZPl=R#1f}|VOi2&gkCfYu z{2ijb#US{UZXJWL17gs_EaWlNjOdhmKmm>pMaQK{eEB9M2x@DCAoPR1m6^9$Pvu!i z4emrO14Sg2NMLWec0Qc`7HIjP5LT*9$z8;-?II=7%V*jatb*10Pcmc5E?13_Z7|4I zeqI>xMvXJj$zC@w{ulc}2%FtP(vadqL2Ohe$^tnbSt|WdC#JcLxspTw?s9l|M6_gl zx^cHkK5NF@Wa|~U?Xs%%bhf-4096jOIkv1%jq(Ga4e{;90^jSc;=!k-5C>=SSfb6s zm5s_kAe&|t0rX{4z*D9&0~1sd(9Bd0w{EvbQHLK4MWoymq=rwIKRJZ&^28^!@DP_g z>ypBUGL%x&>Q4Qj@I8mTo+5srX+Kqn%hB!AYCHzp!rqc|42Um z&gIcQOpv5fof7f1<>ZHzV1&G%bWT19MyTZDnf77B;@h7kpHn{z`#w1v)`!3l9gf+j z6H#F3{OcmaV_jQ)Has&8 z7tWCO6fJxKoe}2%Zz3#7Pel~;_Gl1US-E~n0KoobV86FDKJus}f}uJxrUeiA_jK=| zX)%RRww$cU{bhk#GbJA*)>~(0S0iCWY8H5MrE+o&fLv4kYMUe$u;{c1=?g#T1B1)2 zp!IK2PTzWbh=i-f|8e63aAR3GPE_y>6uy=;4#0*_f?0ZsWFG?^uIj>A{~G4|agau; z%IVizlCD84%fHa?hDvqDi8VbMZP37$CCIKhXK)Kyi0){*l!TQ%yzFYe?2!(lCKN@LQ21iOy|Q;ZjmBI({-W0pf~!Gon=+h=O^pgy*{H`W)Kk;g}X zZFK*0Z5Zfe8PO6(kI!W=ufpX z-F19rf8Txq0_rp(TyUFf_;mXo%;N%!`@-$rj<=B#J5k|>(=CwU{V_`kxhv>_1r5-8 z^9JDZcJZHBpy8xylXCEb24Z9bO9OMb!2JFQm|}Irl5`LQ4l(VFEkG*ym@!VL`KT4} z)VmLO9bY$-gckZ^iE6zFhf7K6ZK!9df`+xXBsENbH;)9(K#iU_2|+#r^8d>_^)~E~ zj=81g)MT*!0?kZO^A-aI_Q_b}#-R>{#{^*1iuXBpnGDeKTdcdPJO@+h&6QdjLp?(D z*UUt#w~G+ZGr@yn>lkSRd4at61R0Q5Y>P1cTQy(~&uQnsPt)3M*#skQNE5FDWs`U* zf}oLZJ(I8Q>q#tXOo`zl!0T#|s&>9R#Y?jXe??L4b|TYR1iVnG2V=7g>&?N}a3a0| zz8|xalM^n8cYmoqQ|0S%zgI!D(NiWK-frXWCKDhFT_BW!C&fa{>UDfuGB+rC7xK$8 z=%!NSO&EZ(uMj%F6%N<*tX!X)k{ESrxxFtq*z_Wy)<^m7Z|m&hWeV)(64T}d{o8{1 z$R@NgzDuCbr7vz2#@`qAY~%#ID~;=7^%6dj?bhpYV^)v}&~)N53i2R23?e#s?4)_5 z$@tsLAP9={Md-^^27rSrm75MSyyU9n{v2W*m%OW(>=Uo?ll>+d0x?ZGD=qEdW*%Je?< zm2`D^D(H(a9sKUtNQ?;f^B->RP1$BQ&Z%_KV6hDtYi=VCyyvsj{U7a1*Q+R}GHP+} z#om{aHRXQ8IEnK!CFE#q>%0I0Vk<bg@mRPY6OQwGFxuq_F6-AdWL&x-8UD>?%zg2J0wDvtv~Bmz=9|XkwOaPnCwvcO zjtVP=XB$!*3jQ+R4x-GU;PvhStuO6}K3m6*$?vb<)-|dJ)lk*i3)Bsy$z+dQ5bfm zy#Dt_W=L;@g5HPQFgIpnWS0Q&uSSs3avX-vtD-ts$bDW<;^r^SnV~!rh4Z#AJ9lDC zxI#n7CcJZ>b{lPn@OuZV+1(`p@IUg=1p9m882M^CzZU_T(8BPCh?^Be?}W;h34>*! z_sZBiwJp&5^2Zlz<&^6;L*DIDjUF@(+-cXzGf|%+mnNXOwi!r%p4_2Nun%tevtdA; zUZ3%NnZMQnD0k|qCyRLe*cy6!19Owes_KAm;yzIKWA%l($vQszM83YOoU@mwt{RkL zXVf6@Ek3}y-`m6)x@!IYHKiG?kq6Lh@2GK~U%l@0Zeez7CN^QolQlQ3#|vTo3?JlS z>k7Jj8wU^ie?>0wR@7CJ@JZs|UXk3Y5}jC6*daXnFj$Y2+ZE^c3O*f(q7w$1O^#!MlTizo+?`U z^BI&~)~xmX0MZn`WW-2*np?@dm|)H{AXdEYZab*PxM`vZ^iRn_*tgd^CYlVc9**8e z1y|A0pC~OAtK3rt@-med;EERaC0E`0>o_tiD@~%BJRpFuzXe1%&Kwmg(e61u-~iYU zne2&Ij2`l?ln0If`a8sI(2jqCs{|Z)DG#225YuDrWny{*6XN(rN7^srio*0iVN38C zZcT5YDk%M~&(cJIUE3`18bvo~@@F(sK+TZQ&br3bC#Ocf+%K^KAKL>rv94sjp6Y>mOY27n{F_+ty^TMUvJ51dZF z8q8Rct0)ed@`GTW$?nG+{IComY~2~@$sLEjp3UUg)83)as6jiOsVqig(njSmCe2vD z_^&n$JpN{^!7>)xLo8x;J7r}S8QREUY&(ilVWD$s9^ zZwRS46u_G6O3LAg4pPKkD3l8_cf)hyoDFF3FTAi>I6mQ}@9S7%*!=EUyn`_{Mk!+i zUf>h9B01;*#mX91G@)SY`*8D;c{jO#O$s3%)gAyNbnl(HNN-TYuN3)jn1V`AZ6SP z#U76Y#R6}DY1PAwANRQuF|aHUF)&_&8d*xc;eC+pnlJt6wwJUbIqvk)e~e!Uvk+vW zTT^G^YM;K?QtUfj_a|#e@+zms_w)=?0{6kn?_jPdKLn0C$$&TI+OMSjpnXmrtUAsJ zEg&C1kJNgVbWk?)ZRwH5%l~xQS)kC48j$kWjxgh&`OouCrH$oN=$SW_G^K*%8P4Eu z?~U4BG`)!~nP>|@;gfp&ufafAvHIvsggf_VK7xN|=DOg(5q!A%ASTuu)S90yr9mI`y z2*&Haw;l1EnBGoo5-fD-qxiold+VquyDw~*VPF6m8iA26QMx+@5fPA*ltw_hLAnv7 zK?x;CxrXy1To1Z=UD*t@W+-z5l#_4$OV#oOAE9&pvx!*L8-vXC2ws|M{Jj z5RfPKMMgnjUYq_OG`Turn1pyz?o5qG(qmk+2c(H z`PV%SR`;OU4h)q4sc|lGX>MKK8PF$4)Ip!(wuK}?{^ zRW5+432v#{Q@W|3nJ;N`MGX(|Z013fo_%ULBWc4!b@l6q*Uq5KVSp#uu?~-f$)k+Z z#m&Dw|LM@D=Bfn)z+sO4$fb>YUa}~o27%!Op3l8`dygRRp(hSesmOCfE>7GOG=@Tu zLU<1uJE{hT%H}{vp`qjfd(6+_tM8OZY53)}N(j{CSt-$9*2&2f4TF|x*>+MZ>`I_`RORIR>XQQO2GWN5#KT8 zUtInsa3}jr?tUrn&w`XQ6gb*a>SAzt6-|G~lx2W0k9LQ!fa0~Yhq~}QrtZ* z8fCM1b6+`_@Gp9vO)K)FA=FffVU+g}rHqP98peaq&v@m8ALf=^|6RD%>pM1i*Fee# z8|BZq8=xFqJVtT)!EQC4A9q6V#H8ngJz+yGa%F}rcupSy1GzJSQx&XOb5c%XbZvB@ z==-G#McX^jWIEuHJmM8Bt4}nxAo4Jj@UIu2w+Fs@wCk*7wI(X{N1ALn>u?p)WlX*5RlXlIKsWEP8(y ziv@d3)oSk-jE}G0d_ZhK4PQPT?6_NCpcyzO;Y``yF>R5UEZyvsEq_x8t93q)N(;ZZkH>c5eJPFMZDSHYP2_x6(ZV_3w}9MtbUAI z>3bEYI3D=!JE#buIDN7>8G<}Q;3=D(;r7xsQn}%5yt?}+CzAsS^v|Jne(#EY400*I zn{7a=!t2G98s?>R6d(hi>?=(FLQP$%HSF;Bm!w=LnrL{O%|Vd0iHBS$tEW-$g*eA< zX6<0Fq3#FbHCw{(h0nnS#!nF8r#SW^-*8VrxoD=F26;KTm~!E0&URTUm!>XuKy}J* zFZ=}6@*D?#iig>gueKh#bC0uer<^=M8?}B=MZIs_r>DCP|FTYJ>I$lr_`9J^Ta59I z`3=(@)dtE3ybuPIwfD}mV>l@6Ng(=Qkg2eWjYPd zRKjw_+Hy1m+zJuYKGh3PoOxbh%9AEVk$v}r&XKJ9+y?)3XTW@>g+eLB&Ts~1Uo*uMEMThfsiuVBp9&;A*y#@Q{||97O36?9J~PH7d>rr)I~ zXFrFuF#a9yu7k!%4r5ht$8cSdb!{|Ym=H5^3>#^?pR+l@wkqSuVsS#5erns%toDRk zTk_3fZJZDcN;^vIPKDUp#B^9T$ZlonKWzVpJO~G7TlWCe`<6)+aY}MmF?J3^!y{Dg zpLk3$dn#R4Vo%NIXM(OmayNA(RSW3-hxych@G7)+)y12K@e;dd)tV8;?^%0MGJKX= zjlDTBQ@*+loQL=fZL(D*>lSx5jv!GGo7*`WBi`-evr2au&F=7f5^B^RP)0hAw>IRE zmHf_1?b3YV{C|MEx=>DyxRT@Q9#x^ZOYr9?B?prIa%Rp!&I`@S#EC3>kJWu%!+E4t z{7@{Y=ws#F7YZh+$ynnnKLQ$NX1hol$&Q1?js6cyzklvi*js%Py^`XL!-lK=sXecK zACvo*+NQk`-2H$Tk`zb3()2(f!!^;p$9gfF#GKBG^ESW4-b~eHODU9*5hBP`=Xcs% z^jv+@(y;|)J!mdKZS3@Ql{-AKiZ^mO2gND?otaYUss*vA@#N6Lf9{cbk}NdZ$Wxp% zw+f3Ct%s=n#Ar@5xDO}C-C8NIpDgXC^~PNQbdY0#M0wXzY}FT~9>v-2*t8`N`hM9> zF$e=oy;FTCwXe@-}JGL=qp?auK^iXg-nUah0g->gFDHA^{e`G4-bAv|6WqnB@mb=E28C&*) zRAx>##wdeTEem_p4XC8oaotEZbhqM0_$x*Su146IGBO7DfMCUNT_uP`{mO%hmBHtRMwdO^r= z6<{Wivd_ZZ8&ZF-a{0S0`G!6GhAqWf+WjID*pb7Q)j20d_w_VYV;*sQjOJO?)2e~p zy)HBgs((G$BMr+-Rd{7<-o*?D6T8&;a8E@~6f>WqvqgY-llvQDLF(u4P9hHFbl7 zPb-}0thhO&om0=26&trB^oo)^kjMXOg|Un>=FpueNQu~5N!NET9it8fmSir$(R*eE z@7!TZjU6&XA;aE7%RZ#F#+!~tt-Pm(?@CZdpp^y;e|;RZ4T>*x$~jS!cJos1jL))C zc)cmi&?pFG-o!ucHU*f`TL>$eirPhI<@e$F$;St8-0TwWDe+|K7lbzr@CYa~jtyFN zXWo5rDCYOAynN@5TYbuQ=k0r zX0`@&Gduk!^{Kkxc<3R1LaoA|UD1+2*rx^zdGa0V>p!-(NwRJetNYjU9L6FLQ`8wJ zvZG};SueISH!iMq0Y)~@0VG*OKrzg88%yrcvSBU%CSbNRfXYxx>MkdLWWg}Skb>&D`N$Yuqdz}^gCHG!gFIS0tIY6Q+Q-+k+Lse7yB;iKozka_g94n{14;1v zC_WS)42B`>(}B3F%iD;Yt$3$wr_ai|8&^0&`Oa*1ZFdZFAo-s)Ut_3K<%M&dZHx1r z*aX*25ao0%8C``NF04Q9D*A|2tR06t%fe`kD@hjEV~8{bx~$ znuBqyt+>S*@iO>5R4=bA0-bM1>L`n_D{2*~U)^zRycD(hp72OOsctx7Yx%`!xair_ zbV#HRd_+3kua>y_+w0Z=$Zz|!8970y`PDxA0e4D=J>k_wBivjqO06`P(L22|L_jNE3hLqbJ} z)~V8kUAG-_f$374&V z_WBD!TIj`N1jYr&1vmw-A5`0U#9Ynn7g3=&148f!#+QGjRTG*Z+5z)^IwqQYB8rif z=`5UD@72JBV-ZFMa zYxv`~$qc$LBxcImAL( zwlenx7$@--Nm9+K+Em^Dz31v`FpA9m&78>XzPj=vyUJZ%AK3y4n%K-@h~xUA@|9QH z;@s@*vO!c$BJr%wF414rtKYD{xS8CJM}(OfwH(4ixY;8)5XDM!Yvntn>v(D+KoxJ2z3vul|=<>*E|uQ88aD zYuV9`P2jCz<}hEC3QD4iPr(}JXfL>FUM80s7xAmtSLp5XYeYL6uR@cm6ZManJe`XA z4E-5VVv;ElDC-mQg>da%^hGP&7v)3tOccE1HwLEkNd1?}=Isalip{UiozmF#;WwQq>YMA^9(Q-NfP=~2h9HGP=AZ( zX2;)p3Tnwp+`W4}{1^OmuyXUR7FM_|cOzE#ITfBKj8Q}0yQ_W&iT+UZxKcL2Q1(dY zFp}X+-IA$5$P{kL&ES`A-8LBAS-$8=p#%=+`e)trsi4=T4M^I)l~m2kjO)Mbm5gtU zby%Vj!3Dp6*eu@3(O#0E9u;J_-oSfzjl~R}eWhDw8(IB6P?Z8M79;I$g1Qlif*=8r z{@<}*!Sb$Nx`b2@k;foK=gJ~^PNDz@TA-%7>d4+GByUvvoQk+VXphB`0vqwR>ELT zcs!PwEod5(&1K+VEq_=`@-xhffe@3WqzC)Vn_NI;^c-tYdN|J6xN~+v+x}TKt{QO< zjO8{{}0XYzB?a)!1D zN51PZ3|>rkwZ^-YQoM0cXUx-97fwOO*CW4fc?dYLmIEVhS`9UqB<{a!bAJpcNEEk< z@fCjoTYT&XMRern@n)A+$EGpMFVD-u9q9(&%rF~Dm+{3kdUzP|9T03h${1FAHzdjz z8tyFr3Wlk8;G(kstc+%wx3p99?26}~0a`5AMFLKFtUexD-*lbzrGRR*cgIo>`rA` zuq87k`m?M&iONU>G5>&tQQfnTs!VB2UuK3sl}&mH`6~135Qg~99iRWv4pSIZeEcnz zlR5rm%z-+v59w*>67`ks3n*SPL6QQ4I=9W#t=&xR>2sFaUkMK66WZkl(z7XQ z9wobMgBt<)OM|lI${nt7Qk%k;E`dV}6B?8oe?A~4pJo6tn!OJ}rhiG`Gn1A27ugXUIU+sO5n$=Kb0)BA}cbN!(4FGmKzNDugY zU8;YXP^@HP7czgY#$VL1uMF!5-WiyuHmup%eLcn{dbFNTs%aXZ zXpqlZKBf<7napF11KK10Ufi6xm82cd6sXRjTQu(6)Nb1nW(t474flUM%3h!WX zKBxMQ3Rvk8 zR#eiI(!vAE#c4}~Gw8q{aj)&@;uh6!>o68ovwHmoKvW9K$)*>)T!g*>)pL5q zXXj|(1%|C|nR5OxT%+x`QQHr)swfOgviqzFKjKO2Xk#4iSu6_VsV@JMmr?y%tzV$^ zH7vP+m~c$uD#R?G2r{$oGCU+?{=sTM`e?gxQ4bE@9D|oCct@4R#wd*-JUGs;hbXhG zr0?;Jo=oo(B>qT>bcXeid@?4X`?}>zeu6q|WZVLwjqXsJy=L>({CQ$|BsNTubN*If zJMxPef6qm{*HK3yNz}IFTC|X&?=!g<+A?%vuSck(AhZo4{4k6o>n zUzO)PDdsczFr5DAt~3$Vqurr?%z-M1=@b|uD!uikW3yTLOUAfYy+XMjn*G+oUR?&Q zSk+zm_MJA12eKP@Mkw`e_8F5dRNcjaB6m|&;b+w91w^TA3w2A-Sm&z#Ni6_&G3s_F zG^NS^Dx#9D=SB-VsL|@OwW(5(J*~Oh)%tfIf3Qe00Jjqv`-ar?-wM$Gqij2%udYwg zt}wb)EcnO~R%3*`O-(K-&j9K{YOV0K2$li!v0{O~^f2&dMP{@5f?)Na6d+UwjmtY<-Thm&y7u!G-&w!o&--p-(pyQQ}gGomoqa(}>~> zxi)qSnRpDcErR8Nz`CxwmWNGdRS*S-cy(@|&^2AH@fTFt^Qv?I_3V{)Tjqi?`%N?e zCj&_ONcdZ@4QfGc*Eh1)1p{KMWU3g9>d=l8;hypE=6P_b104k@hYsKz0bg!wK{1vC zPVh7D-oFRf0&iaCs6d&T#HC%H4tB=fhb}hIM|$Xm!172T)g32#W0MjR8XPyP6{*nd zLyjx}gunO~iBiUHnT~y8(*+jdn)_qKQ&bM*_V`Tv98A~>B=Ec*;Tlr7Hw14Hmsl!c zub0W!U{bxXaW6ghGty-+3n&q?4pZj`3UELvkHy0;IsYT4VA7!pCHeS;NOK3DkD}`H z*l;6MOzPS1QF1a4%^O3MN*39};F31zN;oJu*a8`9ev9fxz}iLTXw|44OKk(l+l^>G z=38C5Ks_;Ae`V-;AWAye^O#3u2(W=#6F)9VCCYkq4}V579!1os#ab$KU-;U<)35ID1(n4dFL5CFhaWT3=V|lZI`8wUdwHUOjoT(f^lM`rNox#`WWR z#!03K`i6nPk2|u3;a$`Uw?o*0pw>65o4qSzx@5L0hrSO@3^|WU4Nitq#qztN_ZT{= zu=yXdxe{%!4dliv_Wu|Xlx&Y6FD|T{LTyZufKqdhu4L3Q-6_!Uro2Gr1=PNwmO?-3 z;%>JlPi?_vN;T}$>TeU7`ra;`(R-sAVBK7ppZ@}0301NC;~Q+xtEkX!JODxi*igPj zkMs>q{HN$W(QauU$Tx95blq53o-w3)oCJag_t!u@U-y`43Fh-<3W~J4yJCGDS@R8; zL6V#ou<;??10QFm$7g!7V%*5nvBw(@HB3l7Lx&P6u}s@;S^ym)v{S*WzP5Bnu_K-8 z3-WMY7lNS7CO*iPJRlyFzJm3P?fm-zhRgsu(fem}(xab2^G?MChwjA*l7?o^6V79; z3!D(Y=;JApZ5u#Y4`pIxYXfnLBY`5OeJoe(;&=<-8VC5OsJ3&6+3&2(cTnLhq_-Q2 zvnTcBPnf`DV>QjEarxVu#3hAeHd@Oj)n}%EtH&Gh9CJZ|e!vP42$P|n{mbBr^Rwk2 z+C*MzGnd*mw;Pf9ql@6UF?*NioPdTl@oRRE$54{(p;uy)C8Z8Gfz2%jv(G(p>%5CU z_-&hz;|hZ}^pF@%sS#E#wBj@Z4`ue8!t&y0;7(%mY6(F?U92dxgTZqK0J&HKTbLR& zwz)d~i?cJ}a;T+8^p+{|yuv=!*?G9n1PNHbnTir%8?$6uH)E+;-L9A4P5e}w$gA;J zsX(<&wQ)FBPwSWovaNNAepLEkn;v`?uN|R&db6Q;n}+N1*AZ$dQ$`&*p=os@*mt8# zN(ySQo`1{qpwy};T&vM%5_6a-Qb{*|n$wT6em$jD@Z3-=<0GJ4VzMPy-SXyPGKprD zbs5QYd#GoHB0ychKy4EzOnU`$JyE=Wu5sHltl!r17rD4I^YQ|4O8-YPUjV@I)2oes z=24z6{tqify1G{(64bwJ(Tu|EMX)hlfbGyYpOA!F^6b}xl;{}wT)tFrwUHVWUmDq!i4B6g#5VN+_ zxN$rHavyN*8bhmpEVz+~GXQTWe2#9$xiJeSd98{up-v68*O$E-(pI?s2*!5WOU3OV z0`R&Tz_klgmOWkoO@k9D22Z^z|Gd{K-VWRZ^iAAGOxJ)5wxBzVT5Hxk@0a6yj*|ZP zSEa4GHelL0?G@V=q~IeO_h@ic&gp{mg-Ob2&FDM_;-MlV3P(a$0!HA zt$PaaOhx_W>no)(tuXN?7r77tGw!E=GM|S|Iw1&T}};qd>{ctv-mMOc7|= zh+in^L%wTC*tpNt=?cQ`y1=H53F9^txRaxMFn6IJOayRm;7iaqv2HjeNN5(oq}#ZK z76Ch#FK5by;frGCJFGWYR5Ui|N0%@_;e9Plxv^-QKs31c4ByW(cdFdfVj z^91bk+ul;GE<>9W2^ZPE|K&=h>`1IhN);0n)Fn#;r*Vwo6v7Bi;rT|PaAJr2W*yNC ziNJxp;coWp8e#ww%6?`5Jq?SH1QEQ9BBTkLyssU0qYPL>w>Y6YG&719$m-&PZf^%CipNx7{eab#!48AdfW`L{%ypZjQHIU#Acd z1(_jRTljKk(8s@kgtcrSi1YW$1GU0Sl$+o9ysTxPgD2ULEl79gg9HU5R@)W*E-1Vj{wfhvL&N2hjj08<7Wa6I(z6&GH_;GI))+W*e z9gP6qbdt($z*d`|=)^fdq(&VS)zup1rtfqeQ8{O<$O;GbWo~cF8s!=67Zlj=Mc?5J zh8@0pkZfUxy7gDGSJVw^^T1^aslS8=+_{^BA5n5Z(@Zbi)L+OyB15nVyimZw=tWpc zeKzwC_BS9f?=5|JwgfQX@%XzPV#N?Q?n*I65xx>Rh10_e9+voD(^+rdRDD;Ho-Xbi zPN5+HzWFo*_D{s~5bzR$)0}Lw#+~*44bcBD|K~4>98D_u@9f4901WUYZ(uy9uN-XybaGiuVdTqcmV(>A4whdlWw~`e+&(mB@577p;TmN0DL(kNt=F7ksL1KM zcv_U!+HP&AKZx-M(*sl)UgqZMzL;i;y-%y?-j9>P|Ezv)O6WW<(hM@hGo-C;zyqdy zAjZ-cU8ZGm*@GXkVfJVIisSO4BKAqzwOoRLyE!B$Hu4tm&h6wzT?|Re*kX((Np{*C zxHe^1Rt-H7UTmr`GPphG1-2F%MS{d!ioNDVJ@)5cj;m*MSg!PnyWB*|I+Zd}PY>l5 zI?iTRDn1}|f${a4_5hmkNWr*k3a@z0Bc2w<&3dyzAtSqhr231x9 zL7h;$U%DVst1HgMO@;igeE zzz{=*sAf9WA;-!o20-IzR;$a23=t7bi(ZBlllZI{jcYbT{ybh*(Iov((5C7P{+_dfgFF>IW@Chb+9OyFjbQ&RLO#$>x2m zq1w1`Q)!33AZVxe$&@-x+?S?ZH0gXJgULHWVvqO-`bo# zBZB6I*@$8M86ZxCJzOgE&>2E9#E2J`Si+Cic$s6$n8dfw%m`>X%#9D8T9|RXQC{(q zSqcuA4+sg| z`z~3tMtZDq=u6X^r~-^AoY6^R&rn-d{Y2+lG0hkhThEUYq#7vz5{e7iU?4!{iR|$c zC3VT0j?Y`LUrNt9_Wo2R;6}EC{%BR2t^{?fp6Tly*NeV(@s}ZD{)2C+z}jz|8D#7H z4;K(OHtYCvU|xZ1cX3Eh9<~X%s)s)oyeOEn~p%7~Dx!R%c`!$ez zhz0x@^Ox2-1+8p@v4ZC(R7gAjKMvB83YTsW9XPvO$db|oS=@G*76+=8N%ko zy;ikZuA=YyX*-nRA?(Te9dlav9PGT*tBMdWD;emfd@WOg=d82UhO+x3zpyEgt$EEh zT9_{=+(zJGD-tkm{1FR798<~OYJjh_&Uu{oWCGbEb=R}Tapq2E$Lsuj4vK7BlSUKD z_1l5nfUP5JnY#}q^@7-*pP>kqAAFykX+S%YHClaiFdIS_5_o8+I@L;@Q|droUETk% zoe14|xq^A%A>t70mybD6@CFy}AD@^nFf(OX+SfCOiQ<$5-v=V2LzVx?{iC_LJcV1H z!kY{otTB-8yAEtzP#3-j1tlR-I9zOEr>enfP8Pz6X%+iPf7+e$=1C@^T_E8jCrXG@ ztS(D{1gdAtqU&z;tZX0r{X^rEIX~aanxRN>qEh;T^iesCpW&j8FzW4RZD6R&XZG?e zsFZ!hv3jfB;h`1)i0#E24!Hvg^-yVv*VU+RP%#Xj&Gm>rFUChP(Ej8N7JO1tV!@ct z@!eky5Mtzu@B5JbwF3pRr0zV-d1$lnJfaf|VKsd6CP4fkqZnF>Au?6=^oMkj6yJkL zA&y3>Sq=>8#)<~gR;fpsqy`^Z=U{bfQt6)<&*{LfjQ*8?H~*knP6ai5^D%eEso7sNKSC1aB0dQr2 zN&|UH0bEZ|VU6$QK7 zDJCn`gK?V=8Yj%Nlso5DbETR!MhA3Y{Mz6;ahnIRN`%vkiB+GEw(G!h z%2$h=|2K`fuxDRE5u3>jdZfBIX-N1jfiuhTSsR0tnVspkZ{uZjvWCDxj!?T<_~D)k zc%PCzmKH@<_*j|45_-dFSnO}^H(v7ZnzbLijeM0}0_<5JC?Z~*%t!n}KoCSP@*`q; z>kFD*W&C13oP1wGpOjHI5B8b{Ohuw-n5mU*&Epqa`xtUE1zcz~Y$c+@5J>zm2M-2C=PDtXYVPwqa@uIOm?PPL^*n|lO8N| zZT#0B&Hze>GgpWRnlYZ_74EF=cwu;|~(*Y=$Y=krqkdvi7VC~rZjd*(B8n+DC!f{qjM*PF1 zFlsqdeL!?T4R=mzqt@P=p?cV?uUh8A-_7-uX|D*+2b&_EHhGXIh-v zgnX;*&>i04*o;5%>VmZ79_6l8%!&XPT^m--G2lOV$ zo$JYFaCl8_$i9IhP@9l&MLJgIndxZkD+Ds)5^bJvt5?k9HupL8`om_y{UFl$zlZq` zBsQv{gQOo%ZnbcTwgXX)bUDz9LxU4dKL>8O@gO2uALttu4;#uy!nKtTG~K|OXnNK3 zTM`fduE~_fwNqp^*8T~t4-wsIQZ&>dri6kOdc!u3{4DiAVG(7W0i56HgDZ!c8aPv^ zz8DB?;|KxSHY$3+7KY%#yj{^0UKnvc0>ct7{uvr2bYsGzJ;+xLM+QBVIz%ue-q=rk zz{w~+^OuohQee^zS_P-9Q;~KIvFKa(UxAkbdTBB;6O0&sHIhUZkd6DZr}pR;6{{H! zv?pB7L5l&t56Y)X&x3yC*_Uv>z7cE_V(s%2u79D@nSUYZ=o}OV#NrGBSl76|6U}Jwp_P-n0O+nb5C^#v=CZAvz+fcXJ4XB_=0j8 z8TRRjkxXTl09x4M_nbn;!rBlhiI9PBO1FHKAs<~1*av#RaxyoTXr&HmlLJ$-O5w2A z3?g9mQrF-|i+;rhnZqKRLMd6JjN)i^e0zOGB1|Ln#PmMzq-v*Drm4YDj zZgRI|=!Jh9<{i|xx38pZ97f$MD@A=6Z-WwZ4jL`@NMzoLfKQOU)gN!SI@3$OnT9mD zrrp_T4yYiUoxC8g>$Sm-kwd*49jz*>R9Gy zXH?Al-h1!u{;sqqY_I*;$5ylQrDikN?y~9K*4#!8?w$K?<%DA|I}6jI+2zG@bY}T_ zn$Cz$>eqC|$^B)l-+C@0HO^p5FwS{*-qvKtV?s;TD;4@ZHgyv}_RfKik1t)u<4qB* ztu5}$Q`TxK@|51^%O0y9_ojO#^f|sJx&t$!4J;YE-siK4o_jUxj?~^KDtqHPc73;N z0!^Vuvu5euj)53>{dz8A>NPGCdIAFLDNbv_c+_dhM!_&gff;+Ly)jLLKAXDTsv0Rg zFr(b`#<@d^gF}Rl=ZRB+!n+`k3*=!~D>yI60>s$vY z9lL1RmZrUrHbZK1{IL~oT4laYT=(YIxYih8tD5NYDdo^ErJo$94FVTNjBWyDoOJ7B zUGFHp7w9l$i5UV!fKPt!@fiLAE1dl=s$nQs_-e`B;;0zr3M48vulI4E04?()OdnjbbUSVD(=i?0X{Q0P6~^_gZj;bRy?~Fsi>uN z@3X%-@fzCs7L{WfR#P^=XX#S4O~(DdQb$d%kNgZ@EBUnE-W&jzYF#p5k>vBhzcr-W z#;q*ex00~4FG=8?S6@SlUc=-^?%(xty-l0L{d|N;RRpz(p7;4u=YG{J(Esh)#0#UG zJz!7uBk+q0TP1E0(F&yxhfTu)xGug@v)|7CdcF={qViLTl^vu%^EslG!x-8!)Kc3~k5X zncZG~h~kYCHEIc(saa1;Cg-zM!yVvfTCP2x^ITs`b)B1O#-L8w9?q7>wG%$y%uQc2 z*&x+-Tbuz5c9t$ZD#gon&B36N*WoDew{Pl5W9gIM2}Y0CmzsXr$dde5TFgTOr|!lq zJ9#?LPoI8{b~<;a^m014^eBb4uBCY$b(_KgADnc>(az@bjtaI9G8w|Q**nqOcS!d31-yKdIg81GO{ zyjcflmuYX=W+*?y>({?$2InaMK_SAA2n9Op-uo( zUej~}?9IaIZb0<-&0e3t{GZ+0?UFu+MR<6IZR6$I4F9w>5p2F{kCNxZo0Y}j>s7|y zZ@_zBtzoO0q&o-vgiIp;tnNx^yNZR)7uh{@#^ky}{x);#KDH;ae$tQCy4TxgvFW~(c*~Utfgc4h9 z>leevMJ?wWy)#d=CF>W1$=9l89D7rO(*)++mS^HM^}p9`WQ03T=sGD>ynk1E^M_|( z^mj~@*xBSvl2r+;SUJI#lB9loFVHS&(KUUAiUIG|k6^%m8|l5!(As{{F~x~2m|%SV zoKU%L)e)x9<_ZN|*97C-Ad{AK7H* z#7jT9AHB=bZWo^L_I9i*tvse;>32MH;c?LCy9AbY=H!Kn~TlRAoun`;xa}&5z z*;ZEW;P*`z3V9qDqTxrw&AG0u#FNts-_j{Xr?upb6wy0bt*V#-@|j=Ge+6P^ z%J_cqthkOzu3J55EO-t$JcAPYV0Gb2p!aymDrl_*UKLtlxbTp^jQBsP0MES`(s3-|wG(_s6~<6$YmSe=!T#&0-xGa9mJ1;8w0*szS>R zltGe}eO(H)Z)6w@zPVDFW=%;)dlkTfY*|oa-+SRkIr(yZ!2yt!)!1WeI|uQgtd3}Y zC&KLyVLQ^)^)FJK(ri{n82@m`4OtFv9{q%kE^svp%}Vvh1=JJTTa`^Vc1)GWE_=hn z4tmaOl&G)PI@g=-dWVimSa(epwwtJU95yDt8n|s<&zQ|zc~dQEh+;^wfLXMLTahGW z3A@ccc{doG&q}WrgF5|Io0)a@W%7n-*ytv4C>}*YV(l9QFn$LRag9Fd`y6y3ElBn{ z<*0^er}I!Yh?-zeHqZ0`!+)e%9-&p^k!Y(>MyEwqq|hi&c&E(jyM%3OO1Bb!|2PFl zA4SK>&eeap82K7t@#1vC%_0jiV}CQ`IVC!%cXH6v7&CkM&g9mFc+R*wO;~!C#*Jxx zIoDoP(l4wY72pTA{kj;(OYSnx9vO|Mlouu=^Go6u1vkHdOWhK}>c0bkF)o_r=a+bW zfOM&ZmNLQTJKufqxuZfb3wzSGE-L*;$f96LI$_f{iE;09keEz+kN39=zN6|OdxbJw zvPV7L_lie8)S|CF*n|h`{`NT0DBn_dC-wow9$pe~DtF0^abDzs56SY6V+A?w8ZRL^fy`5wQ z%^`Og(t16WnOAfOcCUAozQb_FHiSyTaFZ1ySv@@RU(?# z4${vZ(r+QOS-PLUzZ1{|v=T%M9E$sDC#{MhyRv=9(!|L`U_tPY`c^Q&x?nd~@IiLz zy$oRSUsFx~R6o9Cf>C1i`XhGPySogiF7|VE_H&=_N`f4n+-FzKGttI>)D#x{1I@4NJ>iIYCr|0iT8jNelG;~%QulMR^e6DvBM{+LjFFGY0k4Q|l z!rS9}RFm)RfGt7gQq#cOMNRQ0y6PPTry<<7W;LOAbBsJxA6@vcjmQa%fg7QJjU|C8 zH^!J|AXqi=XgWr1J_Pa?6rFWMu1t%33+b0u z+TTt}ZybmZIEqwa-mXS1Oo?2cC=o>UP$%|C_zFE*%Vb?G6q+?3<23CC-&4DNGKN_J z1AhZCAs4~^HdJZ^v%Eb@gZ%-MfVAIm;qPGLZqC!YUS*lqDq3D;t$w(On}1P}-^gE= zXegR&3j{GaKaD&2*?zVW4y~QLAyh=A+7x!Cr-O{bhqr_~Dnlm>lK3YL19NDlf_W`6 zz4^U9m;CzmmIzX2uA4718T_U4+Y>E+>iiFdMU!xwfq_w+}?rl4h3r9ye zy(Z7wWFCjC2v84Nv7*)d75*x4K7d!-e!Sq7bKx%dv~hNoq*r1k7ymoXA6{+uVe1SF)xS-z6je8k%7^^x?KEJ`gxk?UTD3BcbKAniRds#;{{zo$k|z{ zMb39RJI9%72h)jSwX`d*87!uhn7ZSB5vK`#PaE5k8tpeWk7up4K3S4JYd9{LO$KB; z-nu-`K{SlNFEU|@y3fV)uh)7<)c5_PR`orYQz#9zPPDwf`0e6jq7LhQO!|uwUv%Dk za;&r+8r+k>#n^nVJ1fYOul`|V6J&f__(9L%_k-GP2V#TDF@q)Xt-u}RKX2XVz0dV- zM_%b*TY5_3G+Rm-gr1$nZ-|Yi`-ENPZqye`WFM{kavVyuq4GLt-k{$x@PXz0$XU~} zE;Z7_@)-R75=(x})RO&YQ<_y|>|!g#1dd(9OK1$Z%RYE}1j{|=6ELC4kan`?m}e=6 zmv;vjcU7@m{;hjuX(_*%;7(a<#--}+Hj7B3Ylf`Z&3HQ?RtM`7kFIeV*lG`FI@0&v;*I2^&73IDS?k?9#PWhZC&h@cn z^xWQTolLv=fWat51uHZ^pI z^fD3i5c^y+6QjW1IB^gqvNu^jVeb?W5cuB3BDPK63S0QeV$ixH`=CVhr)3v9TYf}* zg(>!?X8?L{4Q={Il*Jr`jLJFPczyL`H=Hu<&BiqG(=e2!g8tq=A0J}64` zNqy~Z5ukaZ%`_Twt#mnripzFt;wPi8pmH)n3EUIhRs}Cj{gc+IlXWjLp|R%W6Se=8 zRleFxnsDoOGElpYHvL>E%bm*nQ>g~Ml@x}}?}y+eg@Fp!2j>LOnPQNxuDIEBWkNK) z$DLv37d8fm!|thYUAr>MvQv+qT+RWBof((NlV`OzC zNHm&OZZ!hswkF4M54F>OXn~58ekjn-?Xq|ns9;UO@~RzH)2p%G28H!Coy2$@7VnC7c)!|6gr$U$XzxY6I1FE0X)gu0eE|)RYYud}d;)x9~d#AzAcj3p2WC-uL|r?l15I zhZB46v(H-3de-w8Dpvf(U)($=wueRknh$Fn!4KH-Rc1dmZ44bSdzx94zLU z4E?5eqk(mkcYaVos_&lhOv86=sc|-Csliqj83`7qB*!QN0?%9hlmKOy;!&Xhph|>K z0^ucdW&hwxZB>O>46~wImUi2$HAhw{Opev~@^u-f_oGPamxv{CB#^Yg)Xj)-9)$%= zwD&G6hEM-o!T#%W`PqxKjQsnp*bPYbTY;gg!0$IsAcx4WY|55la)} z2ECU823=OIersQgpG?ZA=hF{v?gIhWK$MllT{gx8=P|mP=dG8$3 z-$uTiVoYr?IZ9fiHx^ng7hQ+UbS_m=i-h2DaW#*aJ#dfRu?mqk2 z4p(8iqkQez{`J*<*2Lgqqeax~dadxB(?zd+ny;+VeZllT?tA48i-WBPokU|h;-2dO z`k8cFb0if#KIAX?@_JO?N6nGgI_N! zLV(?Lq@nq>*s;V-g1&vH18#Sktq!p`VFaUCvMxRomsV-l(gQeedH{2iEA2`S@~rO} zX{o3ohdb31cky%DXg$K~r@sT<75ZC$VTm$%_AKbH`(Z4~fW|^xFl0MdD+cUV*xvq1 z-jX~B#kG%lV%f9L`chDnJlW>0x_)qCf&sq~tmDP6qJ}rKFEUU_TE#gp60YW-9~GB; zu58G^QVCYKW?w6(%`z6h=laH9{Xy!*XP-Z*+*XP|b0%vC*-H6;5h{}JX9*hdr@5aL z{OBa°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 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/spec/amatch_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/spec/amatch_spec.rb deleted file mode 100644 index 19cd465..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/spec/amatch_spec.rb +++ /dev/null @@ -1,17 +0,0 @@ -unless RUBY_PLATFORM == 'java' - require 'spec_helper' - require 'amatch' - - describe FuzzyMatch do - describe %{when using the :amatch string similarity engine} do - before do - $testing_amatch = true - FuzzyMatch.engine = :amatch - end - after do - $testing_amatch = false - FuzzyMatch.engine = nil - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/spec/cache_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/spec/cache_spec.rb deleted file mode 100644 index dfa4c25..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/spec/cache_spec.rb +++ /dev/null @@ -1,132 +0,0 @@ -require 'spec_helper' - -require 'active_record' -require 'cohort_analysis' -require 'weighted_average' - -ActiveRecord::Base.establish_connection( - 'adapter' => 'mysql2', - 'database' => 'fuzzy_match_test', - 'username' => 'root', - 'password' => 'password' -) - -# require 'logger' -# ActiveRecord::Base.logger = Logger.new $stderr -# ActiveRecord::Base.logger.level = Logger::DEBUG - -ActiveSupport::Inflector.inflections do |inflect| - inflect.uncountable 'aircraft' -end - -require 'fuzzy_match/cached_result' - -::FuzzyMatch::CachedResult.setup(true) - -class Aircraft < ActiveRecord::Base - MUTEX = ::Mutex.new - self.primary_key = 'icao_code' - - cache_fuzzy_match_with :flight_segments, :primary_key => :aircraft_description, :foreign_key => :aircraft_description - - def aircraft_description - [manufacturer_name, model_name].compact.join(' ') - end - - def self.fuzzy_match - @fuzzy_match || MUTEX.synchronize do - @fuzzy_match||= FuzzyMatch.new(all, :read => ::Proc.new { |straw| straw.aircraft_description }) - end - end - - def self.create_table - connection.drop_table(:aircraft) rescue nil - connection.execute %{ -CREATE TABLE `aircraft` ( - `icao_code` varchar(255) DEFAULT NULL, - `manufacturer_name` varchar(255) DEFAULT NULL, - `model_name` varchar(255) DEFAULT NULL, - PRIMARY KEY (`icao_code`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - } - reset_column_information - end -end - -class FlightSegment < ActiveRecord::Base - self.primary_key = 'row_hash' - - cache_fuzzy_match_with :aircraft, :primary_key => :aircraft_description, :foreign_key => :aircraft_description - - def self.create_table - connection.drop_table(:flight_segments) rescue nil - connection.execute %{ -CREATE TABLE `flight_segments` ( - `row_hash` varchar(255) NOT NULL DEFAULT '', - `aircraft_description` varchar(255) DEFAULT NULL, - `passengers` int(11) DEFAULT NULL, - `seats` int(11) DEFAULT NULL, - PRIMARY KEY (`row_hash`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - } - end -end - -FlightSegment.create_table -Aircraft.create_table - -a = Aircraft.new -a.icao_code = 'B742' -a.manufacturer_name = 'Boeing' -a.model_name = '747-200' -a.save! - -fs = FlightSegment.new -fs.row_hash = 'madison to chicago' -fs.aircraft_description = 'BORING 747200' -fs.passengers = 10 -fs.seats = 10 -fs.save! - -fs = FlightSegment.new -fs.row_hash = 'madison to minneapolis' -fs.aircraft_description = 'bing 747' -fs.passengers = 100 -fs.seats = 5 -fs.save! - -FlightSegment.all.each do |fs| - fs.cache_aircraft! -end - -describe FuzzyMatch::CachedResult do - it %{joins aircraft to flight segments} do - aircraft = Aircraft.find('B742') - aircraft.flight_segments.count.should == 2 - end - - it %{allow simple SQL operations} do - aircraft = Aircraft.find('B742') - aircraft.flight_segments.sum(:passengers).should == 110 - end - - it %{works with weighted_average} do - aircraft = Aircraft.find('B742') - aircraft.flight_segments.weighted_average(:seats, :weighted_by => :passengers).should == 5.45455 - end - - it %{works with cohort_scope (albeit rather clumsily)} do - aircraft = Aircraft.find('B742') - cohort = FlightSegment.cohort({:aircraft_description => aircraft.flight_segments_foreign_keys}, :minimum_size => 2) - FlightSegment.connection.select_value(cohort.project('COUNT(*)').to_sql).should == 2 - # FlightSegment.cohort(:aircraft_description => aircraft.flight_segments_foreign_keys).should == [] - end - - # def test_006_you_can_get_aircraft_from_flight_segments - # fs = FlightSegment.first - # # you need to add an aircraft_description column - # lambda do - # fs.aircraft.count.should == 2 - # end.must_raise ActiveRecord::StatementInvalid - # end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/spec/foo.rb b/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/spec/foo.rb deleted file mode 100644 index b948eda..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/spec/foo.rb +++ /dev/null @@ -1,9 +0,0 @@ -require 'fileutils' -Dir['test*.rb'].each do |f| - n = File.basename(f, '.rb') - n.sub! 'test_', '' - n += '_spec.rb' - puts f - puts n - FileUtils.cp f, n -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/spec/fuzzy_match_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/spec/fuzzy_match_spec.rb deleted file mode 100644 index 9339c87..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/spec/fuzzy_match_spec.rb +++ /dev/null @@ -1,367 +0,0 @@ -# -*- encoding: utf-8 -*- -require 'spec_helper' - -describe FuzzyMatch do - describe '#find' do - it %{finds the best match using string similarity} do - d = FuzzyMatch.new %w{ RATZ CATZ } - d.find('RITZ').should == 'RATZ' - end - - it %{doesn't mind crazy characters} do - d = FuzzyMatch.new %w{ RATZ CATZ } - d.find('RíTZ').should == 'RATZ' - end - - it %{not return any result if the maximum score is zero} do - FuzzyMatch.new(['a']).find('b').should be_nil - end - - it %{finds exact matches} do - d = FuzzyMatch.new [ 'X' ] - d.find('X').should == 'X' - end - end - - describe '#find_all' do - it %{return all records in sorted order} do - d = FuzzyMatch.new [ 'X', 'X22', 'Y', 'Y4' ], :groupings => [ /X/, /Y/ ], :must_match_grouping => true - d.find_all('X').should == ['X', 'X22' ] - d.find_all('A').should == [] - end - end - - describe '#find_best' do - it %{returns one or more records with the best score} do - d = FuzzyMatch.new [ 'X', 'X', 'X22', 'Y', 'Y', 'Y4' ], :groupings => [ /X/, /Y/ ], :must_match_grouping => true - d.find_best('X').should == ['X', 'X' ] - d.find_best('A').should == [] - end - end - - describe '#find_all_with_score' do - it %{return records with 2 scores} do - d = FuzzyMatch.new [ 'X', 'X22', 'Y', 'Y4' ], :groupings => [ /X/, /Y/ ], :must_match_grouping => true - d.find_all_with_score('X').should == [ ['X', 1, 1], ['X22', 0, 0.33333333333333337] ] - d.find_all_with_score('A').should == [] - end - end - - describe '#find_with_score' do - it %{return record with dice's and lev's scores} do - d = FuzzyMatch.new [ 'X', 'X22', 'Y', 'Y4' ], :groupings => [ /X/, /Y/ ], :must_match_grouping => true - d.find_with_score('X').should == ['X', 1, 1] - d.find_with_score('A').should be_nil - end - end - - describe '#explain' do - before do - require 'stringio' - @capture = StringIO.new - @old_stdout = $stdout - $stdout = @capture - end - after do - $stdout = @old_stdout - end - - it %{print a basic explanation to stdout} do - d = FuzzyMatch.new %w{ RATZ CATZ } - d.explain('RITZ') - @capture.rewind - @capture.read.should include('CATZ') - end - - it %{explains match failures} do - FuzzyMatch.new(['aaa']).explain('bbb') - @capture.rewind - @capture.read.should =~ %r{No winner assigned.*aaa.*bbb} - end - end - - describe "groupings replacings normalizers" do - it %{sometimes gets false results without them} do - d = FuzzyMatch.new ['BOEING 737-100/200', 'BOEING 737-900'] - d.find('BOEING 737100 number 900').should == 'BOEING 737-900' - end - - it %{can be used to improve results} do - d = FuzzyMatch.new ['BOEING 737-100/200', 'BOEING 737-900'], :groupings => [ [/boeing/i, /7(\d\d)-?(\d\d\d)?/]] - d.find('BOEING 737100 number 900').should == 'BOEING 737-100/200' - end - end - - describe "identities" do - it %{sometimes gets false results without them} do - # false positive without identity - d = FuzzyMatch.new %w{ foo bar } - d.find('bar').should == 'bar' - d.find('bare').should == 'bar' - d.find('baz').should == 'bar' - end - - it %{can be used to improve results} do - d = FuzzyMatch.new %w{ foo bar }, :identities => [ /ba(.)/ ] - d.find('bar').should == 'bar' - d.find('bare').should == 'bar' - d.find('baz').should be_nil - d.find('baze').should be_nil - end - - it %{is sort of like backreferences} do - one = '1 sauk ONEONEONEONEONE' - two = '2 sauk TWOTWOTWOTWO' - d = FuzzyMatch.new([one, two]) - d.find('1 sauk TWOTWOTWOTWO').should == two # wrong - d = FuzzyMatch.new([one, two], :identities => [/\A(\d+)\s+(\w+)/]) - d.find('1 sauk TWOTWOTWOTWO').should == one # correct - end - - it %{has a proc form} do - d = FuzzyMatch.new %w{ foo bar }, :identities => [ lambda { |a, b| (a.start_with?('ba') and b.start_with?('ba') ? a[2] == b[2] : nil) } ] - d.find('bar').should == 'bar' - d.find('bare').should == 'bar' - d.find('baz').should be_nil - d.find('baze').should be_nil - end - end - - describe 'groupings' do - it %{sometimes gets false results without them} do - d = FuzzyMatch.new [ 'Barack Obama', 'George Bush' ] - d.find('Barack Bush').should == 'Barack Obama' # luke i am your father - d.find('George Obama').should == 'George Bush' # nooooooooooooooooooo - end - - it %{can be used to improve results} do - d = FuzzyMatch.new [ 'Barack Obama', 'George Bush' ], :groupings => [ /Obama/, /Bush/ ] - d.find('Barack Bush').should == 'George Bush' - d.find('George Obama').should == 'Barack Obama' - end - - it %{stays within the group} do - d = FuzzyMatch.new [ 'AB', 'CD' ] - d.find('ABCDCD').should == 'CD' - d = FuzzyMatch.new [ 'AB', 'CD' ], :groupings => [/A/] - d.find('ABCDCD').should == 'AB' - end - - describe 'with chains' do - describe 'hotel example' do - before do - @grandh = 'Grand Hyatt' - @h = 'Hyatt' - @hgarden = 'Hyatt Garden' - @grandhotel = 'Grand Hotel' - @fz = FuzzyMatch.new([@grandh, @h, @hgarden, @grandhotel], :groupings => [ [ /hyatt/i, /garden/i, /grand/i ] ], :stop_words => [ /hotel/i ]) - end - - it %{works as expected} do - @fz.find('Grand Hyatt').should == @grandh - @fz.find('Grand Hyatt Foobar').should == @grandh - @fz.find('Hyatt Garden').should == @hgarden - @fz.find('Hyatt Garden Foobar').should == @hgarden - end - - it %{enforces some stuff} do - # nope - @fz.find('Grund Hyatt').should == @h - @fz.find('Grund Hyatt Foobar').should == @h - @fz.find('Hyatt Gurden').should == @h - @fz.find('Hyatt Gurden Foobar').should == @h - # hmm - hyatt misspelled, so totally prevented from matching hyatt - @fz.find('Grund Hyutt').should == @grandhotel - @fz.find('Grund Hyutt Foobar').should == @grandhotel - # precedence - @fz.find('Grand Hyatt Garden').should == @hgarden - @fz.find('Grand Hyatt Garden Foobar').should == @hgarden - # sanity - @fz.find('Grund Hyatt Garden').should == @hgarden - @fz.find('Grund Hyatt Garden Foobar').should == @hgarden - @fz.find('Grand Hyatt Gurden').should == @grandh - @fz.find('Grand Hyatt Gurden Foobar').should == @grandh - end - - it %{is sticky} do - @fz.find('Grand Hotel').should == @grandhotel - @fz.find('Hotel Garden').should be_nil - @fz.find('Grand Hotel Garden').should == @grandhotel - end - end - - it "helps with subgroups" do - d = FuzzyMatch.new [ 'Boeing 747', 'Boeing 747SR', 'Boeing ER6' ], :groupings => [ [/boeing/i, /(7\d{2})/] ] - d.find_all('Boeing 747').should == [ 'Boeing 747', 'Boeing 747SR' ] - - d = FuzzyMatch.new [ 'Boeing 747', 'Boeing 747SR', 'Boeing ER6' ], :groupings => [ [/boeing/i, /(7\d{2})/] ] - d.find_all('Boeing ER6').should == ["Boeing ER6"] - - d = FuzzyMatch.new [ 'Boeing 747', 'Boeing 747SR', 'Boeing ER6' ], :groupings => [ [/boeing/i, /(7|E\d{2})/i] ] - d.find_all('Boeing ER6').should == [ 'Boeing ER6' ] - d.find_all('Boeing 747').should == [ 'Boeing 747', 'Boeing 747SR' ] - end - end - end - - describe "the :must_match_grouping option" do - it %{optionally only attempt matches with records that fit into a grouping} do - d = FuzzyMatch.new [ 'Barack Obama', 'George Bush' ], :groupings => [ /Obama/, /Bush/ ], :must_match_grouping => true - d.find('George Clinton').should be_nil - - d = FuzzyMatch.new [ 'Barack Obama', 'George Bush' ], :groupings => [ /Obama/, /Bush/ ] - d.find('George Clinton', :must_match_grouping => true).should be_nil - end - end - - describe "the :read option" do - it %{interpret a Numeric as an array index} do - ab = ['a', 'b'] - ba = ['b', 'a'] - haystack = [ab, ba] - by_first = FuzzyMatch.new haystack, :read => 0 - by_last = FuzzyMatch.new haystack, :read => 1 - by_first.find('a').should == ab - by_last.find('b').should == ab - by_first.find('b').should == ba - by_last.find('a').should == ba - end - - it %{interpret a Symbol, etc. as hash key} do - ab = { :one => 'a', :two => 'b' } - ba = { :one => 'b', :two => 'a' } - haystack = [ab, ba] - by_first = FuzzyMatch.new haystack, :read => :one - by_last = FuzzyMatch.new haystack, :read => :two - by_first.find('a').should == ab - by_last.find('b').should == ab - by_first.find('b').should == ba - by_last.find('a').should == ba - end - - MyStruct = Struct.new(:one, :two) - it %{interpret a Symbol as a method id (if the object responds to it)} do - ab = MyStruct.new('a', 'b') - ba = MyStruct.new('b', 'a') - haystack = [ab, ba] - by_first = FuzzyMatch.new haystack, :read => :one - by_last = FuzzyMatch.new haystack, :read => :two - by_first.read.should == :one - by_last.read.should == :two - by_first.find('a').should == ab - by_last.find('b').should == ab - by_first.find('b').should == ba - by_last.find('a').should == ba - end - end - - describe 'the :must_match_at_least_one_word option' do - it %{optionally require that the matching record share at least one word with the needle} do - d = FuzzyMatch.new %w{ RATZ CATZ }, :must_match_at_least_one_word => true - d.find('RITZ').should be_nil - - d = FuzzyMatch.new ["Foo's Bar"], :must_match_at_least_one_word => true - d.find("Foo's").should == "Foo's Bar" - d.find("'s").should be_nil - d.find("Foo").should be_nil - - d = FuzzyMatch.new ["Bolivia, Plurinational State of"], :must_match_at_least_one_word => true - d.find("Bolivia").should == "Bolivia, Plurinational State of" - end - - it %{use STOP WORDS} do - d = FuzzyMatch.new [ 'A HOTEL', 'B HTL' ] - d.find('A HTL', :must_match_at_least_one_word => true).should == 'B HTL' - - d = FuzzyMatch.new [ 'A HOTEL', 'B HTL' ], :must_match_at_least_one_word => true - d.find('A HTL').should == 'B HTL' - - d = FuzzyMatch.new [ 'A HOTEL', 'B HTL' ], :must_match_at_least_one_word => true, :stop_words => [ %r{HO?TE?L} ] - d.find('A HTL').should == 'A HOTEL' - end - - it %{not be fooled by substrings (but rather compare whole words to whole words)} do - d = FuzzyMatch.new [ 'PENINSULA HOTELS' ], :must_match_at_least_one_word => true - d.find('DOLCE LA HULPE BXL FI').should be_nil - end - - it %{not be case-sensitive when checking for sharing of words} do - d = FuzzyMatch.new [ 'A', 'B' ] - d.find('a', :must_match_at_least_one_word => true).should == 'A' - end - end - - describe "the :gather_last_result option" do - it %{not gather metadata about the last result by default} do - d = FuzzyMatch.new %w{ NISSAN HONDA } - d.find('MISSAM') - lambda do - d.last_result - end.should raise_error(::RuntimeError, /gather_last_result/) - end - - it %{optionally gather metadata about the last result} do - d = FuzzyMatch.new %w{ NISSAN HONDA } - d.find 'MISSAM', :gather_last_result => true - d.last_result.score.should == 0.6 - d.last_result.winner.should == 'NISSAN' - end - end - - describe 'quirks' do - it %{should not return false negatives because of one-letter similarities} do - # dices coefficient doesn't think these two are similar at all because it looks at pairs - FuzzyMatch.score_class.new('X foo', 'X bar').dices_coefficient_similar.should == 0 - # so we must compensate for that somewhere - d = FuzzyMatch.new ['X foo', 'randomness'] - d.find('X bar').should == 'X foo' - # without making false positives - d.find('Y bar').should be_nil - end - - it %{finds possible matches even when pair distance fails} do - d = FuzzyMatch.new ['XX', '2 A'] - d.find('2A').should == '2 A' - d = FuzzyMatch.new ['XX', '2A'] - d.find('2 A').should == '2A' - end - - it %{weird blow ups} do - d = FuzzyMatch.new ['XX', '2 A'] - d.find('A').should == '2 A' - d = FuzzyMatch.new ['XX', 'A'] - d.find('2 A').should == 'A' - end - - it %{from the wild 1} do - d = FuzzyMatch.new ["Doyle Collection", "Trump Collection", "Luxury Collection", "Autograph Collection"] - d.find("Algonquin Autograph Collection").should == "Autograph Collection" - end - - end - - describe 'deprecations' do - it %{takes :must_match_blocking as :must_match_grouping} do - d = FuzzyMatch.new [], :must_match_blocking => :a - d.default_options[:must_match_grouping].should == :a - end - - it %{takes :haystack_reader as :read} do - d = FuzzyMatch.new [], :haystack_reader => :c - d.read.should == :c - end - - it %{takes :blockings as :groupings} do - d = FuzzyMatch.new [], :blockings => [ /X/, /Y/ ] - d.groupings.should == [ FuzzyMatch::Rule::Grouping.new(/X/), FuzzyMatch::Rule::Grouping.new(/Y/) ] - end - end - - it %{defaults to a pure-ruby engine, but also has amatch} do - if defined?($testing_amatch) and $testing_amatch - FuzzyMatch.engine.should == :amatch - else - FuzzyMatch.engine.should == :pure_ruby - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/spec/grouping_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/spec/grouping_spec.rb deleted file mode 100644 index 76b4165..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/spec/grouping_spec.rb +++ /dev/null @@ -1,60 +0,0 @@ -require 'spec_helper' - -describe FuzzyMatch::Rule::Grouping do - it %{matches a single string argument} do - b = FuzzyMatch::Rule::Grouping.new %r{apple} - b.xmatch?(r('2 apples')).should == true - end - - it %{embraces case insensitivity} do - b = FuzzyMatch::Rule::Grouping.new %r{apple}i - b.xmatch?(r('2 Apples')).should == true - end - - it %{xjoins two string arguments} do - b = FuzzyMatch::Rule::Grouping.new %r{apple} - b.xjoin?(r('apple'), r('2 apples')).should == true - end - - it %{fails to xjoin two string arguments} do - b = FuzzyMatch::Rule::Grouping.new %r{apple} - b.xjoin?(r('orange'), r('2 apples')).should == false - end - - it %{returns nil instead of false when it has no information} do - b = FuzzyMatch::Rule::Grouping.new %r{apple} - b.xjoin?(r('orange'), r('orange')).should be_nil - end - - it %{has chains} do - h, gr, ga = FuzzyMatch::Rule::Grouping.make([/hyatt/, /grand/, /garden/]) - h.xjoin?(r('hyatt'), r('hyatt')).should == true - - h.xjoin?(r('grund hyatt'), r('grand hyatt')).should == true - gr.xjoin?(r('grund hyatt'), r('grand hyatt')).should == false - ga.xjoin?(r('grund hyatt'), r('grand hyatt')).should be_nil - - h.xjoin?(r('hyatt gurden'), r('hyatt garden')).should == true - gr.xjoin?(r('hyatt gurden'), r('hyatt garden')).should be_nil - ga.xjoin?(r('hyatt gurden'), r('hyatt garden')).should == false - - h.xjoin?(r('grand hyatt'), r('grand hyatt')).should == false # sacrificing itself - gr.xjoin?(r('grand hyatt'), r('grand hyatt')).should == true - ga.xjoin?(r('grand hyatt'), r('grand hyatt')).should be_nil - - h.xjoin?(r('hyatt garden'), r('hyatt garden')).should == false # sacrificing itself - gr.xjoin?(r('hyatt garden'), r('hyatt garden')).should be_nil - ga.xjoin?(r('hyatt garden'), r('hyatt garden')).should == true - - h.xjoin?(r('grand hyatt garden'), r('grand hyatt garden')).should == false # sacrificing itself - gr.xjoin?(r('grand hyatt garden'), r('grand hyatt garden')).should == true - ga.xjoin?(r('grand hyatt garden'), r('grand hyatt garden')).should == true # NOT sacrificing itself? - end - - private - - def r(str) - FuzzyMatch::Record.new str - end - -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/spec/identity_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/spec/identity_spec.rb deleted file mode 100644 index d1e5f2f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/spec/identity_spec.rb +++ /dev/null @@ -1,29 +0,0 @@ -require 'spec_helper' - -describe FuzzyMatch::Rule::Identity do - it %{determines whether two records COULD be identical} do - i = FuzzyMatch::Rule::Identity.new %r{(A)[ ]*(\d)} - i.identical?(r('A1'), r('A 1foobar')).should == true - end - - it %{determines that two records MUST NOT be identical} do - i = FuzzyMatch::Rule::Identity.new %r{(A)[ ]*(\d)} - i.identical?(r('A1'), r('A 2foobar')).should == false - end - - it %{returns nil indicating no information} do - i = FuzzyMatch::Rule::Identity.new %r{(A)[ ]*(\d)} - i.identical?(r('B1'), r('A 2foobar')).should == nil - end - - it %{embraces case insensitivity} do - i = FuzzyMatch::Rule::Identity.new %r{(A)[ ]*(\d)}i - i.identical?(r('A1'), r('a 1foobar')).should == true - end - - private - - def r(str) - FuzzyMatch::Record.new str - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/spec/record_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/spec/record_spec.rb deleted file mode 100644 index 0958ea3..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/spec/record_spec.rb +++ /dev/null @@ -1,25 +0,0 @@ -require 'spec_helper' - -describe FuzzyMatch::Record do - it %{does not treat "'s" as a word} do - assert_split ["foo's", "bar"], "Foo's Bar" - end - - it %{treats "bolivia," as just "bolivia"} do - assert_split ["bolivia", "plurinational", "state"], "Bolivia, Plurinational State" - end - - it %{does not split up hyphenated words} do - assert_split ['north-west'], "north-west" - end - - it %{splits up words as expected} do - assert_split ['the', 'quick', "fox's", 'mouth', 'is', 'always', 'full'], "the quick fox's mouth -- is always full." - end - - private - - def assert_split(ary, str) - FuzzyMatch::Record.new(str).words.should == ary - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/spec/spec_helper.rb b/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/spec/spec_helper.rb deleted file mode 100644 index 847a213..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/fuzzy_match-2.0.4/spec/spec_helper.rb +++ /dev/null @@ -1,21 +0,0 @@ -# This file was generated by the `rspec --init` command. Conventionally, all -# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. -# Require this file using `require "spec_helper"` to ensure that it is only -# loaded once. -# -# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration -RSpec.configure do |config| - config.treat_symbols_as_metadata_keys_with_true_values = true - config.run_all_when_everything_filtered = true - config.filter_run :focus - - # Run specs in random order to surface order dependencies. If you find an - # order dependency and want to debug it, you can fix the order by providing - # the seed, which is printed after each run. - # --seed 1234 - config.order = 'random' -end - -require 'pry' - -require 'fuzzy_match' diff --git a/example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/.gitignore b/example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/.gitignore deleted file mode 100644 index b473272..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -/.bundle/ -/.yardoc -/Gemfile.lock -/_yardoc/ -/coverage/ -/doc/ -/pkg/ -/spec/reports/ -/tmp/ -/.idea diff --git a/example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/.rspec b/example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/.rspec deleted file mode 100644 index 8c18f1a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/.rspec +++ /dev/null @@ -1,2 +0,0 @@ ---format documentation ---color diff --git a/example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/.rubocop.yml b/example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/.rubocop.yml deleted file mode 100644 index 8587014..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/.rubocop.yml +++ /dev/null @@ -1,134 +0,0 @@ -# That looks wrong -Layout/AlignHash: - Enabled: false - -Layout/DotPosition: - Enabled: false - -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles. -Layout/IndentHash: - Enabled: false - -Lint/HandleExceptions: - Enabled: false - -# the let(:key) { ... } should be allowed in tests -Lint/ParenthesesAsGroupedExpression: - Exclude: - - 'spec/**/*' - -# Cop supports --auto-correct. -Lint/UnusedBlockArgument: - Enabled: false - -# Needed for $verbose -Style/GlobalVars: - Enabled: false - -Lint/UnusedMethodArgument: - Enabled: false - -# https://stackoverflow.com/a/13059657/865175 -Lint/UriEscapeUnescape: - Enabled: false - -Lint/UselessAssignment: - Exclude: - - 'spec/**/*' - -# Offense count: 20 -Metrics/AbcSize: - Max: 60 - -Metrics/BlockLength: - Enabled: false - -# Configuration parameters: CountComments. -Metrics/ClassLength: - Max: 320 - -Metrics/CyclomaticComplexity: - Max: 17 - -# Configuration parameters: AllowURI, URISchemes. -Metrics/LineLength: - Max: 370 - -# options.rb might be large, we know that -Metrics/MethodLength: - Max: 60 - Exclude: - - 'lib/*/options.rb' - -# Configuration parameters: CountKeywordArgs. -Metrics/ParameterLists: - Max: 17 - -Metrics/PerceivedComplexity: - Max: 18 - -Naming/FileName: - Enabled: false - -# and and or is okay -Style/AndOr: - Enabled: false - -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles. -Style/BracesAroundHashParameters: - Enabled: false - -Style/ClassCheck: - EnforcedStyle: kind_of? - -Style/ClassVars: - Enabled: false - -Style/Documentation: - Enabled: false - -Style/DoubleNegation: - Enabled: false - -# Needed for $verbose -Style/GlobalVars: - Enabled: false - -Style/GuardClause: - Enabled: false - -# Having if in the same line might not always be good -Style/IfUnlessModifier: - Enabled: false - -Style/RaiseArgs: - EnforcedStyle: exploded - -# Better too much 'return' than one missing -Style/RedundantReturn: - Enabled: false - -# Not a good thing -Style/RedundantSelf: - Enabled: false - -# raise and fail are both okay -Style/SignalException: - Enabled: false - -# $? Exit -Style/SpecialGlobalVars: - Enabled: false - -# Both string notations are okay -Style/StringLiterals: - Enabled: false - -# The %w might be confusing for new users -Style/WordArray: - MinSize: 19 - -Style/ZeroLengthPredicate: - Enabled: false diff --git a/example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/.travis.yml b/example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/.travis.yml deleted file mode 100644 index 40b07ac..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/.travis.yml +++ /dev/null @@ -1,9 +0,0 @@ -language: ruby -rvm: - - 2.1 - - 2.2 - - 2.3 - - 2.4 - - 2.5 - -before_install: gem install bundler -v 1.11.2 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/CHANGELOG.md b/example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/CHANGELOG.md deleted file mode 100644 index b11624e..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/CHANGELOG.md +++ /dev/null @@ -1,26 +0,0 @@ -### Master - -### 1.1.3 - -* Require IRB early in the lib's lifecycle - segiddins - -### 1.1.2 - -* URL escape the query for GH issues - revolter - -### 1.1.1 - -* Allow either all typoes, or all no typoes in the delegate call - revolter - -### 1.1.0 - -* Fixes typos in the delegate methods - revolter -* Adds support for showing how to click on a link in terminal - 0xced - -### 1.0.3 - -* Fixes for URLs with spaces - orta - -### 1.0.0 - -* Initial major release - orta + krausefx diff --git a/example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/Gemfile b/example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/Gemfile deleted file mode 100644 index 962bb5b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/Gemfile +++ /dev/null @@ -1,4 +0,0 @@ -source 'https://rubygems.org' - -# Specify your gem's dependencies in gh-issues-inspector.gemspec -gemspec diff --git a/example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/LICENSE b/example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/LICENSE deleted file mode 100644 index aaa005a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2017 Orta Therox and Felix Krause - -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/example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/README.md b/example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/README.md deleted file mode 100644 index 3d0adbd..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/README.md +++ /dev/null @@ -1,102 +0,0 @@ -# The Issues Inspector - -## Installation - -Add this line to your application's Gemfile: - -```ruby -gem 'gh_inspector' -``` - -And then execute: - - $ bundle - -## Usage - -#### The Inspector - -To get started using The Issues Inspector, you will need to -create an inspector instance. This class is main public API for querying issues. - -#### Getting Started - -Create an instance of `GhInspector::Inspector`, you can then ask it to search -based on your raised exception, or as a direct query yourself. - -``` ruby -require 'gh_inspector' -inspector = GhInspector::Inspector.new "orta", "eigen" -# Either use an error: -inspector.search_exception an_error, ArtsyUI.new -# Or use a specific query: -inspector.search_query "Someone set us up the bomb" -``` - -By default this would output: - -``` -Looking for related issues on CocoaPods/CocoaPods... - - - undefined method `to_ary' for #Did you mean? to_query - https://github.com/CocoaPods/CocoaPods/issues/4748 [closed] [1 comment] - - - NoMethodError - undefined method `to_ary' for Pod EAIntroView - https://github.com/CocoaPods/CocoaPods/issues/4391 [closed] [15 comments] - - - Do a search on GitHub for issues relating to a crash? - https://github.com/CocoaPods/CocoaPods/issues/4391 [open] [3 comments] - -and 10 more at: -https://github.com/CocoaPods/CocoaPods/search?q=undefined+method+%60to_ary%27&type=Issues -``` -#### Presenting Your Report - -The default user interface for the inspector, its public API should be -considered the protocol for other classes wanting to provide a user interface. - -Your custom objects will be verified at runtime that they conform to the protocol. - -You can see the default implementation at -[lib/evidence.rb](/orta/gh-issues-inspector/tree/master/lib/evidence.rb). - -Both `search_query` and `search_exception` take your custom delegate as a 2nd optional parameter. - -``` ruby -require 'gh_inspector' -inspector = GhInspector::Inspector.new "orta", "eigen" -inspector.search_exception an_error, ArtsyUI.new -``` - -or - -``` ruby -require 'gh_inspector' -inspector = GhInspector::Inspector.new "fastlane", "fastlane" -inspector.search_query "Someone set us up the bomb", FastlaneUI.new -``` - -Protocol for custom objects: - - - `inspector_started_query(query, inspector)` - Called just as the investigation has begun. - - `inspector_successfully_recieved_report(report, inspector)` - Deprecated: Please use `inspector_successfully_received_report` instead. - - `inspector_successfully_received_report(report, inspector)` - Called once the inspector has received a report with more than one issue. - - `inspector_recieved_empty_report(report, inspector)` - Deprecated: Please use `inspector_received_empty_report` instead. - - `inspector_received_empty_report(report, inspector)` - Called once the report has been received, but when there are no issues found. - - `inspector_could_not_create_report(error, query, inspector)` - Called when there have been networking issues in creating the report. - -## Development - -After checking out the repo, run `bin/setup` to install dependencies. Then, run `bundle exec rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment. - -The usage section of this README is generated from inline documentation inside the classes, to update it run `bundle exec rake readme`. - -To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org). - -## Vision - -I don't expect this project to grow too much, there's space around improving the search query for an exception, mainly. Other than that the project is effectively done and just needs some production usage to iron out any kinks. This project is well tested, and has zero dependencies. - -## Contributing - -Bug reports and pull requests are welcome on GitHub at https://github.com/orta/gh-issues-inspector. diff --git a/example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/Rakefile b/example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/Rakefile deleted file mode 100644 index a2adb88..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/Rakefile +++ /dev/null @@ -1,62 +0,0 @@ -require 'bundler' -require 'bundler/gem_tasks' -begin - Bundler.setup(:default, :development) -rescue Bundler::BundlerError => e - warn e.message - warn 'Run `bundle install` to install missing gems' - exit e.status_code -end - -require 'rspec/core/rake_task' -require 'rubocop/rake_task' - -RSpec::Core::RakeTask.new(:specs) - -task default: :spec - -task :spec do - Rake::Task['specs'].invoke - Rake::Task['rubocop'].invoke -end - -desc 'Run RuboCop on the lib/specs directory' -RuboCop::RakeTask.new(:rubocop) do |task| - task.patterns = ['lib/**/*.rb', 'spec/**/*.rb'] -end - -task :readme do - readme = File.open("README.md", 'rb', &:read) - - start_split = "## Usage" - end_split = "## Development" - - start = readme.split(start_split)[0] - rest = readme.split(start_split)[1] - finale = rest.split(end_split)[1] - - require 'yard' - files = ["lib/gh_inspector/inspector.rb", "lib/gh_inspector/sidekick.rb", "lib/gh_inspector/evidence.rb"] - docs = YARD::Registry.load(files, true) - - usage = "\n\n" - usage << "#### The Inspector\n\n" - usage << docs.at("GhInspector::Inspector").docstring - usage << "\n" - - usage << "#### Presenting Your Report \n\n" - evidence = docs.at("GhInspector::Evidence") - usage << evidence.docstring - usage << "\n" - - usage << "\nProtocol for custom objects:\n\n" - evidence.children.each do |method| - next unless method.name.to_s.start_with? "inspector" - params = method.parameters.flatten.compact - usage << " - `#{method.name}(#{params.join ', '})` - #{method.docstring}\n" - end - usage << "\n" - - new_file = start + start_split + usage + end_split + finale - File.open("README.md", 'w') { |f| f.write new_file } -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/bin/console b/example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/bin/console deleted file mode 100755 index ba7bd4d..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/bin/console +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env ruby - -require 'bundler/setup' -require 'gh_inspector' - -# You can add fixtures and/or initialization code here to make experimenting -# with your gem easier. You can also use a different console, if you like. - -require 'pry' -Pry.start diff --git a/example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/bin/setup b/example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/bin/setup deleted file mode 100644 index dce67d8..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/bin/setup +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail -IFS=$'\n\t' -set -vx - -bundle install - -# Do any other automated setup that you need to do here diff --git a/example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/gh_inspector.gemspec b/example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/gh_inspector.gemspec deleted file mode 100644 index 4377281..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/gh_inspector-1.1.3/gh_inspector.gemspec +++ /dev/null @@ -1,27 +0,0 @@ - -lib = File.expand_path('../lib', __FILE__) -$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) -require 'gh_inspector/version' - -Gem::Specification.new do |spec| - spec.name = 'gh_inspector' - spec.version = GhInspector::VERSION - spec.authors = ['Orta Therox', 'Felix Krause'] - spec.email = ['orta.therox@gmail.com', 'gh_inspector@krausefx.com'] - - spec.license = 'MIT' - spec.summary = 'Search through GitHub issues for your project for existing issues about a Ruby Error.' - spec.description = spec.summary - - spec.homepage = 'https://github.com/orta/gh_inspector' - - spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) } - spec.require_paths = ['lib'] - - spec.add_development_dependency 'bundler', '~> 1.11' - spec.add_development_dependency 'pry', '~> 0.6' - spec.add_development_dependency 'rake', '~> 10.0' - spec.add_development_dependency 'rspec', '~> 3.0' - spec.add_development_dependency 'rubocop', '~> 0', '> 0' - spec.add_development_dependency 'yard', '~> 0', '> 0' -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/README.md b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/README.md deleted file mode 100644 index 0296264..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/README.md +++ /dev/null @@ -1,85 +0,0 @@ -httpclient - HTTP accessing library. [![Gem Version](https://badge.fury.io/rb/httpclient.svg)](http://badge.fury.io/rb/httpclient) - -Copyright (C) 2000-2015 NAKAMURA, Hiroshi . - -'httpclient' gives something like the functionality of libwww-perl (LWP) in -Ruby. 'httpclient' formerly known as 'http-access2'. - -See [HTTPClient](http://www.rubydoc.info/gems/httpclient/frames) for documentation. - - -## Features - -* methods like GET/HEAD/POST/* via HTTP/1.1. -* HTTPS(SSL), Cookies, proxy, authentication(Digest, NTLM, Basic), etc. -* asynchronous HTTP request, streaming HTTP request. -* debug mode CLI. -* by contrast with net/http in standard distribution; - * Cookies support - * MT-safe - * streaming POST (POST with File/IO) - * Digest auth - * Negotiate/NTLM auth for WWW-Authenticate (requires net/ntlm module; rubyntlm gem) - * NTLM auth for Proxy-Authenticate (requires 'win32/sspi' module; rubysspi gem) - * extensible with filter interface - * you don't have to care HTTP/1.1 persistent connection - (httpclient cares instead of you) -* Not supported now - * Cache - * Rather advanced HTTP/1.1 usage such as Range, deflate, etc. - (of course you can set it in header by yourself) - -## httpclient command - -Usage: 1) `httpclient get https://www.google.co.jp/?q=ruby` -Usage: 2) `httpclient` - -For 1) it issues a GET request to the given URI and shows the wiredump and -the parsed result. For 2) it invokes irb shell with the binding that has a -HTTPClient as 'self'. You can call HTTPClient instance methods like; - -```ruby -get "https://www.google.co.jp/", :q => :ruby -``` - -## Author - - * Name:: Hiroshi Nakamura - * E-mail:: nahi@ruby-lang.org - * Project web site:: http://github.com/nahi/httpclient - - -## License - -This program is copyrighted free software by NAKAMURA, Hiroshi. You can -redistribute it and/or modify it under the same terms of Ruby's license; -either the dual license version in 2003, or any later version. - -httpclient/session.rb is based on http-access.rb in http-access/0.0.4. Some -part of it is copyrighted by Maebashi-san who made and published -http-access/0.0.4. http-access/0.0.4 did not include license notice but when -I asked Maebashi-san he agreed that I can redistribute it under the same terms -of Ruby. Many thanks to Maebashi-san. - - -## Install - -You can install httpclient via rubygems: `gem install httpclient` - - -## Usage - -See [HTTPClient](http://www.rubydoc.info/gems/httpclient/frames) for documentation. -You can also check sample/howto.rb how to use APIs. - -## Bug report or Feature request - -Please file a ticket at the project web site. - -1. find a similar ticket from https://github.com/nahi/httpclient/issues -2. create a new ticket by clicking 'Create Issue' button. -3. you can use github features such as pull-request if you like. - -## Changes - -See [ChangeLog](https://github.com/nahi/httpclient/blob/master/CHANGELOG.md) diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/bin/httpclient b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/bin/httpclient deleted file mode 100755 index 57d3f3e..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/bin/httpclient +++ /dev/null @@ -1,77 +0,0 @@ -#!/usr/bin/env ruby - -# httpclient shell command. -# -# Usage: 1) % httpclient get https://www.google.co.jp/ q=ruby -# Usage: 2) % httpclient -# -# For 1) it issues a GET request to the given URI and shows the wiredump and -# the parsed result. For 2) it invokes irb shell with the binding that has a -# HTTPClient as 'self'. You can call HTTPClient instance methods like; -# > get "https://www.google.co.jp/", :q => :ruby -require 'httpclient' - -method = ARGV.shift -if method == 'version' - puts HTTPClient::VERSION - exit -end - -url = ARGV.shift -if method && url - client = HTTPClient.new - client.strict_response_size_check = true - if method == 'download' - print client.get_content(url) - else - client.debug_dev = STDERR - $DEBUG = true - require 'pp' - pp client.send(method, url, *ARGV) - end - exit -end - -require 'irb' -require 'irb/completion' - -class Runner - def initialize - @httpclient = HTTPClient.new - @httpclient.strict_response_size_check = true - end - - def method_missing(msg, *a, &b) - debug, $DEBUG = $DEBUG, true - begin - @httpclient.send(msg, *a, &b) - ensure - $DEBUG = debug - end - end - - def run - IRB.setup(nil) - ws = IRB::WorkSpace.new(binding) - irb = IRB::Irb.new(ws) - IRB.conf[:MAIN_CONTEXT] = irb.context - - trap("SIGINT") do - irb.signal_handle - end - - begin - catch(:IRB_EXIT) do - irb.eval_input - end - ensure - IRB.irb_at_exit - end - end - - def to_s - 'HTTPClient' - end -end - -Runner.new.run diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/bin/jsonclient b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/bin/jsonclient deleted file mode 100755 index 8f9af3a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/bin/jsonclient +++ /dev/null @@ -1,85 +0,0 @@ -#!/usr/bin/env ruby - -# jsonclient shell command. -# -# Usage: 1) % jsonclient post https://www.example.com/ content.json -# Usage: 2) % jsonclient -# -# For 1) it issues a GET request to the given URI and shows the wiredump and -# the parsed result. For 2) it invokes irb shell with the binding that has a -# JSONClient as 'self'. You can call JSONClient instance methods like; -# > post "https://www.example.com/resource", {'hello' => 'world'} -require 'jsonclient' - -method = ARGV.shift -url = ARGV.shift -body = [] -if ['post', 'put'].include?(method) - if ARGV.size == 1 && File.exist?(ARGV[0]) - body << File.read(ARGV[0]) - else - body << ARGF.read - end -end -if method && url - require 'pp' - client = JSONClient.new - client.debug_dev = STDERR if $DEBUG - res = client.send(method, url, *body) - STDERR.puts('RESPONSE HEADER: ') - PP.pp(res.headers, STDERR) - if res.ok? - begin - puts JSON.pretty_generate(res.content) - rescue JSON::GeneratorError - puts res.content - end - exit 0 - else - STDERR.puts res.content - exit 1 - end -end - -require 'irb' -require 'irb/completion' - -class Runner - def initialize - @httpclient = JSONClient.new - end - - def method_missing(msg, *a, &b) - debug, $DEBUG = $DEBUG, true - begin - @httpclient.send(msg, *a, &b) - ensure - $DEBUG = debug - end - end - - def run - IRB.setup(nil) - ws = IRB::WorkSpace.new(binding) - irb = IRB::Irb.new(ws) - IRB.conf[:MAIN_CONTEXT] = irb.context - - trap("SIGINT") do - irb.signal_handle - end - - begin - catch(:IRB_EXIT) do - irb.eval_input - end - ensure - IRB.irb_at_exit - end - end - - def to_s - 'JSONClient' - end -end - -Runner.new.run diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/async.rb b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/async.rb deleted file mode 100644 index 283ddc8..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/async.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'httpclient' - -c = HTTPClient.new -conn = c.get_async("http://dev.ctor.org/") -io = conn.pop.content -while str = io.read(40) - p str -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/auth.rb b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/auth.rb deleted file mode 100644 index 7ec9ab8..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/auth.rb +++ /dev/null @@ -1,11 +0,0 @@ -require 'httpclient' - -c = HTTPClient.new -c.debug_dev = STDOUT - -# for Proxy authentication: supports Basic, Negotiate and NTLM. -#c.set_proxy_auth("admin", "admin") - -# for WWW authentication: supports Basic, Digest and Negotiate. -c.set_auth("http://dev.ctor.org/http-access2/", "user", "user") -p c.get("http://dev.ctor.org/http-access2/login") diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/cookie.rb b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/cookie.rb deleted file mode 100644 index 606bfd3..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/cookie.rb +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env ruby - -$:.unshift(File.join('..', 'lib')) -require 'httpclient' - -proxy = ENV['HTTP_PROXY'] -clnt = HTTPClient.new(proxy) -clnt.set_cookie_store("cookie.dat") -clnt.debug_dev = STDOUT if $DEBUG - -while urlstr = ARGV.shift - response = clnt.get(urlstr){ |data| - print data - } - p response.contenttype -end - -clnt.save_cookie_store diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/dav.rb b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/dav.rb deleted file mode 100644 index 61862cf..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/dav.rb +++ /dev/null @@ -1,103 +0,0 @@ -require 'uri' -require 'httpclient' - -class DAV - attr_reader :headers - - def initialize(uri = nil) - @uri = nil - @headers = {} - open(uri) if uri - proxy = ENV['HTTP_PROXY'] || ENV['http_proxy'] || nil - @client = HTTPClient.new(proxy) - end - - def open(uri) - @uri = if uri.is_a?(URI) - uri - else - URI.parse(uri) - end - end - - def set_basic_auth(user_id, passwd) - @client.set_basic_auth(@uri, user_id, passwd) - end - - # TODO: propget/propset support - - def propfind(target) - target_uri = @uri + target - res = @client.propfind(target_uri) - res.body.content - end - - def get(target, local = nil) - local ||= target - target_uri = @uri + target - if FileTest.exist?(local) - raise RuntimeError.new("File #{ local } exists.") - end - f = File.open(local, "wb") - res = @client.get(target_uri, nil, @headers) do |data| - f << data - end - f.close - STDOUT.puts("#{ res.header['content-length'][0] } bytes saved to file #{ target }.") - end - - def debug_dev=(dev) - @client.debug_dev = dev - end - - def get_content(target) - target_uri = @uri + target - @client.get_content(target_uri, nil, @headers) - end - - def put_content(target, content) - target_uri = @uri + target - res = @client.put(target_uri, content, @headers) - if res.status < 200 or res.status >= 300 - raise "HTTP PUT failed: #{res.inspect}" - end - end - - class Mock - attr_reader :headers - - def initialize(uri = nil) - @uri = nil - @headers = {} - open(uri) if uri - - @cache = {} - end - - def open(uri) - @uri = uri.is_a?(URI) ? uri : URI.parse(uri) - end - - def set_basic_auth(user_id, passwd) - # ignore - end - - def propfind(target) - # not found - nil - end - - def get(target, local = nil) - # ignore - end - - def get_content(target) - @cache[target] - end - - def put_content(target, content) - @cache[target] = content - nil - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/howto.rb b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/howto.rb deleted file mode 100644 index c5e24ee..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/howto.rb +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env ruby - -$:.unshift(File.join('..', 'lib')) -require 'httpclient' - -proxy = ENV['HTTP_PROXY'] -clnt = HTTPClient.new(proxy) -clnt.set_cookie_store("cookie.dat") -target = ARGV.shift || "http://localhost/foo.cgi" - -puts -puts '= GET content directly' -puts clnt.get_content(target) - -puts '= GET result object' -result = clnt.get(target) -puts '== Header object' -p result.header -puts "== Content-type" -p result.contenttype -puts '== Body object' -p result.body -puts '== Content' -print result.content -puts '== GET with Block' -clnt.get(target) do |str| - puts str -end - -puts -puts '= GET with query' -puts clnt.get(target, { "foo" => "bar", "baz" => "quz" }).content - -puts -puts '= GET with query 2' -puts clnt.get(target, [["foo", "bar1"], ["foo", "bar2"]]).content - -clnt.debug_dev = STDERR -puts -puts '= GET with extra header' -puts clnt.get(target, nil, { "SOAPAction" => "HelloWorld" }).content - -puts -puts '= GET with extra header 2' -puts clnt.get(target, nil, [["Accept", "text/plain"], ["Accept", "text/html"]]).content - -clnt.debug_dev = nil - -clnt.save_cookie_store diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/jsonclient.rb b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/jsonclient.rb deleted file mode 100644 index 4a12f3f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/jsonclient.rb +++ /dev/null @@ -1,67 +0,0 @@ -require 'httpclient' -require 'json' - -module HTTP - class Message - # Returns JSON object of message body - alias original_content content - def content - if JSONClient::CONTENT_TYPE_JSON_REGEX =~ content_type - JSON.parse(original_content) - else - original_content - end - end - end -end - - -# JSONClient provides JSON related methods in addition to HTTPClient. -class JSONClient < HTTPClient - CONTENT_TYPE_JSON_REGEX = /(application|text)\/(x-)?json/i - - attr_accessor :content_type_json - - class JSONRequestHeaderFilter - attr_accessor :replace - - def initialize(client) - @client = client - @replace = false - end - - def filter_request(req) - req.header['content-type'] = @client.content_type_json if @replace - end - - def filter_response(req, res) - @replace = false - end - end - - def initialize(*args) - super - @header_filter = JSONRequestHeaderFilter.new(self) - @request_filter << @header_filter - @content_type_json = 'application/json; charset=utf-8' - end - - def post(uri, *args, &block) - @header_filter.replace = true - request(:post, uri, jsonify(argument_to_hash(args, :body, :header, :follow_redirect)), &block) - end - - def put(uri, *args, &block) - @header_filter.replace = true - request(:put, uri, jsonify(argument_to_hash(args, :body, :header)), &block) - end - -private - - def jsonify(hash) - if hash[:body] && hash[:body].is_a?(Hash) - hash[:body] = JSON.generate(hash[:body]) - end - hash - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/oauth_buzz.rb b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/oauth_buzz.rb deleted file mode 100644 index 15205e3..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/oauth_buzz.rb +++ /dev/null @@ -1,57 +0,0 @@ -require 'oauthclient' -require 'zlib' -require 'stringio' - -# Get your own consumer token from http://code.google.com/apis/accounts/docs/RegistrationForWebAppsAuto.html -consumer_key = nil -consumer_secret = nil - -callback = 'http://localhost/' # should point somewhere else... -scope = 'https://www.googleapis.com/auth/buzz' -request_token_url = 'https://www.google.com/accounts/OAuthGetRequestToken' -access_token_url = 'https://www.google.com/accounts/OAuthGetAccessToken' - -STDOUT.sync = true - -# create OAuth client. -client = OAuthClient.new -client.oauth_config.consumer_key = consumer_key -client.oauth_config.consumer_secret = consumer_secret -client.oauth_config.signature_method = 'HMAC-SHA1' -client.oauth_config.http_method = :get # Twitter does not allow :post -client.debug_dev = STDERR if $DEBUG - -# Get request token. -res = client.get_request_token(request_token_url, callback, :scope => scope) -p res.status -p res.oauth_params -p res.content -p client.oauth_config -token = res.oauth_params['oauth_token'] -secret = res.oauth_params['oauth_token_secret'] -raise if token.nil? or secret.nil? - -# You need to confirm authorization out of band. -puts -puts "Go here and do confirm: https://www.google.com/buzz/api/auth/OAuthAuthorizeToken?oauth_token=#{token}&domain=#{consumer_key}&scope=#{scope}" -puts "Type oauth_verifier (if given) and hit [enter] to go" -require 'cgi' -verifier = CGI.unescape(gets.chomp) -verifier = nil if verifier.empty? - -# Get access token. -res = client.get_access_token(access_token_url, token, secret, verifier) -p res.status -p res.oauth_params -p res.content -p client.oauth_config -id = res.oauth_params['user_id'] - -puts -puts "Access token usage example" -puts "Hit [enter] to go" -gets - -# Access to a protected resource. -# @consumption requires Buzz API -puts client.get_content("https://www.googleapis.com/buzz/v1/activities/@me/@consumption", :alt => :json, :prettyprint => true) diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/oauth_friendfeed.rb b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/oauth_friendfeed.rb deleted file mode 100644 index 02d3496..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/oauth_friendfeed.rb +++ /dev/null @@ -1,59 +0,0 @@ -require 'oauthclient' - -# Get your own consumer token from http://friendfeed.com/api/applications -consumer_key = 'EDIT HERE' -consumer_secret = 'EDIT HERE' - -request_token_url = 'https://friendfeed.com/account/oauth/request_token' -oob_authorize_url = 'https://friendfeed.com/account/oauth/authorize' -access_token_url = 'https://friendfeed.com/account/oauth/access_token' - -STDOUT.sync = true - -# create OAuth client. -client = OAuthClient.new -client.oauth_config.consumer_key = consumer_key -client.oauth_config.consumer_secret = consumer_secret -client.oauth_config.signature_method = 'HMAC-SHA1' -client.oauth_config.http_method = :get # FriendFeed does not allow :post -client.debug_dev = STDERR if $DEBUG - -# Get request token. -res = client.get_request_token(request_token_url) -p res.status -p res.oauth_params -p res.content -p client.oauth_config -token = res.oauth_params['oauth_token'] -secret = res.oauth_params['oauth_token_secret'] -raise if token.nil? or secret.nil? - -# You need to confirm authorization out of band. -puts -puts "Go here and do confirm: #{oob_authorize_url}?oauth_token=#{token}" -puts "Hit [enter] to go" -gets - -# Get access token. -# FYI: You may need to re-construct OAuthClient instance here. -# In normal web app flow, getting access token and getting request token -# must be done in different HTTP requests. -# client = OAuthClient.new -# client.oauth_config.consumer_key = consumer_key -# client.oauth_config.consumer_secret = consumer_secret -# client.oauth_config.signature_method = 'HMAC-SHA1' -# client.oauth_config.http_method = :get # Twitter does not allow :post -res = client.get_access_token(access_token_url, token, secret) -p res.status -p res.oauth_params -p res.content -p client.oauth_config -username = res.oauth_params['username'] - -puts -puts "Access token usage example" -puts "Hit [enter] to go" -gets - -# Access to a protected resource. (user profile) -puts client.get("http://friendfeed-api.com/v2/feedinfo/#{username}?format=json") diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/oauth_twitter.rb b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/oauth_twitter.rb deleted file mode 100644 index 731645b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/oauth_twitter.rb +++ /dev/null @@ -1,61 +0,0 @@ -require 'oauthclient' - -# Get your own consumer token from http://twitter.com/apps -consumer_key = 'EDIT HERE' -consumer_secret = 'EDIT HERE' - -callback = ARGV.shift # can be nil for OAuth 1.0. (not 1.0a) -request_token_url = 'https://api.twitter.com/oauth/request_token' -oob_authorize_url = 'https://api.twitter.com/oauth/authorize' -access_token_url = 'https://api.twitter.com/oauth/access_token' - -STDOUT.sync = true - -# create OAuth client. -client = OAuthClient.new -client.oauth_config.consumer_key = consumer_key -client.oauth_config.consumer_secret = consumer_secret -client.oauth_config.signature_method = 'HMAC-SHA1' -client.oauth_config.http_method = :get # Twitter does not allow :post -client.debug_dev = STDERR if $DEBUG - -# Get request token. -res = client.get_request_token(request_token_url, callback) -p res.status -p res.oauth_params -p res.content -p client.oauth_config -token = res.oauth_params['oauth_token'] -secret = res.oauth_params['oauth_token_secret'] -raise if token.nil? or secret.nil? - -# You need to confirm authorization out of band. -puts -puts "Go here and do confirm: #{oob_authorize_url}?oauth_token=#{token}" -puts "Type oauth_verifier/PIN (if given) and hit [enter] to go" -verifier = gets.chomp -verifier = nil if verifier.empty? - -# Get access token. -# FYI: You may need to re-construct OAuthClient instance here. -# In normal web app flow, getting access token and getting request token -# must be done in different HTTP requests. -# client = OAuthClient.new -# client.oauth_config.consumer_key = consumer_key -# client.oauth_config.consumer_secret = consumer_secret -# client.oauth_config.signature_method = 'HMAC-SHA1' -# client.oauth_config.http_method = :get # Twitter does not allow :post -res = client.get_access_token(access_token_url, token, secret, verifier) -p res.status -p res.oauth_params -p res.content -p client.oauth_config -id = res.oauth_params['user_id'] - -puts -puts "Access token usage example" -puts "Hit [enter] to go" -gets - -# Access to a protected resource. (DM) -puts client.get("https://api.twitter.com/1.1/direct_messages.json") diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/ssl/0cert.pem b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/ssl/0cert.pem deleted file mode 100644 index 9dfce02..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/ssl/0cert.pem +++ /dev/null @@ -1,22 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDjzCCAnegAwIBAgIBADANBgkqhkiG9w0BAQUFADAtMQswCQYDVQQGEwJDWjEN -MAsGA1UEChMEUnVieTEPMA0GA1UEAxMGUnVieUNBMB4XDTAzMDUzMTAyNDcyOFoX -DTA1MDUzMDAyNDcyOFowLTELMAkGA1UEBhMCQ1oxDTALBgNVBAoTBFJ1YnkxDzAN -BgNVBAMTBlJ1YnlDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANfw -JSR2OxME6WBRYekhvN1M7uZwJLC3qHhRtBm583x7MS3yzF/HwFNH1oAmOmzUcDSz -Y9OmTDVIMU9b0bSYHuu8KswrRWmx/iEhgU/hODS1MQKi+uHoMTtY/dVXwTLAfw5d -UMPQ9F5EhiV57sKWrS7vIVBtpxUNgfJW61FP+Ru3Lr8uhUgXPECHck8fjFu8w2Sw -JQBQ8ePrfKBiTHpOzKmDVXXWzVYzIQN0zQfpu/FSjOJ4xWV3wmfltN4FK+UkpALW -3RKsNFx+Pmji0fr2/PeEPhzKkhWk5b+pYrIlTNkagS7u8EoeLtY1y3LSZvopbcPI -l0QFQHCMtxS7ngC6wsECAwEAAaOBuTCBtjAPBgNVHRMECDAGAQH/AgEAMC0GCWCG -SAGG+EIBDQQgFh5HZW5lcmF0ZWQgYnkgT3BlblNTTCBmb3IgUnVieS4wHQYDVR0O -BBYEFA2IpXrgDnpJ9p6bfBmtM6j0IejmMFUGA1UdIwROMEyAFA2IpXrgDnpJ9p6b -fBmtM6j0IejmoTGkLzAtMQswCQYDVQQGEwJDWjENMAsGA1UEChMEUnVieTEPMA0G -A1UEAxMGUnVieUNBggEAMA0GCSqGSIb3DQEBBQUAA4IBAQB1b4iTezqgZj6FhcAc -0AtleAc8TpUn8YOX6zSlHG6I7tKcLfnWen9eFs4Jx73Bup5wHvcrHF6U+/nAdpb5 -R7lkNbjWFWwoi5cQC36mh4ym8GWhUZUf8362yPzimbdKMBIiDoIBY8NyIBBORU2m -BlXsHr0dqGpeTmNnFhgi1FCN+F/VitplOUP9E8NzsgLS/GY9HO160HbPXoZc4yp5 -KFweqmyhbxZvkrrD6LanvB23cJP+TeHzA5mLJtIBciFq+AJe+cDTlJYjtLcsxkAy -Evojd//5gePjgSz3gbzU5Zq0/tI2T0rQYnmySoSQ1u2+i5FrMvEjh/H6tZtQ6nO0 -ROTL ------END CERTIFICATE----- diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/ssl/0key.pem b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/ssl/0key.pem deleted file mode 100644 index 71b7fe6..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/ssl/0key.pem +++ /dev/null @@ -1,30 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -Proc-Type: 4,ENCRYPTED -DEK-Info: DES-EDE3-CBC,BC9A85421E11A052 - -dlFN8woboqu1mLWHSe6HnBCzrJUFw1NLv4sJM8MFPcSGkPEJoqceRQ5XFFlwnhwT -WStidVQLAaCqWxPlQbvKs/eW2yEZRX3JhNHlGkuZUbAuqC7FGcIPCFtXmshmR3/K -wSxM3DuEBA31kHoyH/DGPEOcp/L9M95fU2w/1Zz895nXgECdlYfMB7KEXJ7S0TVD -NvcH6dcNS2I56ikUfRd9MA+tTtJTDsolBii3HpNkI+i8GeAAznfuyhCa+RasbMnR -3SRHSgiZpK01JkepKEumG1iyGXBE4GMlF3dK9TL4UTfK7PjbW1BRGVdmGayA5L8X -vpn9uIMbpFUD7nU/cSs6+ECYy9Fdq/d8oE7YRVpqGA2mX+Vvjzc6ZByiW8eH8uYW -d1YCySAzttQUcDFx4YlpbQN+NSE67amGY/nkXn3CnQuB2uDiUm6818p1jjhEbIj6 -SQpNgpuhHPhyawMuC98BvxEXoSTFRmXx5h+Qgo8nfCBUpGUCA8STuJG+EebIXMHH -yNdZGYMdkkuzow1G+bcHaIV4pgD0hOX6D+AzhO8/11gsJNiZHWAkxRtXres0B7JQ -BTv6mrpmRsr1TbY7K55y5QePkvroiqI4BX2//RgAcUw+aBzPCSt87YU55pPxxDCv -KnoMQJapUIlXgYBs+2GBiFQlr3dAnzduXrXkZa/TuE0853QDDnKWN3aWapW0EieH -sDxYz6kZ6c/vjDJtNjjgysKvi2ZFnJMk92fi1sNd2MrH9w1vSmjHw6+b9REH+r6K -YCcMzCUnIV5Y5jgbnrY5jWlB5Jt5PlU+QDFTBNsdctyoES3h5yQh48hcpnJOy4YT -tn9jEmIAYM7QZtGZrY5yiZRZbM5tLL7VeXA0M7N0ivjZUVP4NBUV1IFhLpeus3Yo -yXB99Sib/M8fqlmnRlyKKaRseB9a80/LJdLJC7Q1aJG9JYTTpumydppDzvwwUFV/ -yHQibPzWhnHTElyXSGeWWQ/4gKJXJFkSyrBeKt/DcDggEnpsVw7kAeo0KJLWvBq2 -0CwnWxPsseIYSLdwE0wOZTnWvHC6viCCqxaFwROa+bHsgCtRR8xwOKVg0RQRexQi -SKsCEyq4hfKH3Kd7KkI5c4iCHrNDxQiYVAHGo0kuVWPNP9PH8XrRuP7f2Aq6ObEU -cGLN+OKlzChKJQZZzdthGTjO52cZERokS7etLs5yPNM27CUZIy2gUsWwANG700ov -DYi4S9j4y2fK9qVFGuNmZ7nNQ6juHIN8ZpZObmzGz/GEsVy8zYGV7jH2bC8fhCg1 -wiTn0CHyfI0AfJ5zQMQ48z/ATI5+/pP5DuJ4kPLYU90EdIlIQ/9zQDRxVPvUalas -kskX8qdsbILaLqKzqvPa6jkhncV7SVQPhxIrs6vU2RWrsU1Qw9wHhzaITu9yb1l1 -s8uialiJWnWOwkhIAUULOoGRnBB7U6sseFh7LcYHc2sZYJzQQO3g14ANvtsu/ILT -abUPXtGHSUlI4kUjI82NEkyQz/pDD9VkhTefiFHNymIkUaZBulmR5QdcEcQn6bku -J/P3M/T7CtsCPdBUrzDI71eAYqXPjikg+8unKWk9c/p+V7wXtvsdgJf3+xht/YUQ ------END RSA PRIVATE KEY----- diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/ssl/1000cert.pem b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/ssl/1000cert.pem deleted file mode 100644 index d7eeea6..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/ssl/1000cert.pem +++ /dev/null @@ -1,19 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDCTCCAfGgAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwLTELMAkGA1UEBhMCQ1ox -DTALBgNVBAoTBFJ1YnkxDzANBgNVBAMTBlJ1YnlDQTAeFw0wMzA1MzEwMzUwNDFa -Fw0wNDA1MzAwMzUwNDFaMDAxCzAJBgNVBAYTAkNaMQ0wCwYDVQQKEwRSdWJ5MRIw -EAYDVQQDEwlsb2NhbGhvc3QwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALhs -fh4i1c+K57vFG7SUDfdxuSlbPUqaV0sbiuvWb0f7B2T7bHicaIRsDYW7PQRLLwwR -Pd+aKg3KuwhWN47faRam19Z3yWCD7Tg+BhXDqlXnz6snnr4APpAxc22kJKjzuil6 -sp+QTkl/EFKI3+ocDur1UB+kSOmTzsDmepaWUZwTAgMBAAGjgbMwgbAwCQYDVR0T -BAIwADAtBglghkgBhvhCAQ0EIBYeR2VuZXJhdGVkIGJ5IE9wZW5TU0wgZm9yIFJ1 -YnkuMB0GA1UdDgQWBBQlYESgTYdkTOYy02+/jGSqa+OpzjBVBgNVHSMETjBMgBQN -iKV64A56Sfaem3wZrTOo9CHo5qExpC8wLTELMAkGA1UEBhMCQ1oxDTALBgNVBAoT -BFJ1YnkxDzANBgNVBAMTBlJ1YnlDQYIBADANBgkqhkiG9w0BAQUFAAOCAQEAJh9v -ehhUv69oilVWGvGB6xCr8LgErnO9QdAyqJE2xBhbNaB3crjWDdQTz4UNvCQoJG/4 -Oa9Vp10vM8E0ZMVHer87WM9tPEOg09r38U/1c7gSYBkPSGQfeWtZNjQ1YOm6RDx4 -JJp9sp9v/CdBlVXaBQQd+MQFny7E+EkMHRfiv89KTfOs0wYdirLrM1C90CZUEj0i -cMcBdHzH5XcNpWB1ag4cNiUn2ljsaWlUpEg48gLe2FLJVPBio+iZnOm/C6KIwBMO -BCVxkZ6oIR87JT4xbr8SxRS9d/irhVU9MtGYwMe4MPSztefASdmEyj59ZFCLKQHV -+ltGb7/b7DetoT1spA== ------END CERTIFICATE----- diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/ssl/1000key.pem b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/ssl/1000key.pem deleted file mode 100644 index 34261ad..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/ssl/1000key.pem +++ /dev/null @@ -1,18 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -Proc-Type: 4,ENCRYPTED -DEK-Info: DES-EDE3-CBC,5E9A9AC8F0F62A4A - -3/VDlc8E13xKZr+MXt+HVZCiuWN1gsVx1bTZE5fN5FVoJ45Bgy2zAegnqZiP1NNy -j/76Vy9Ru/G9HPh5QPbIPl+md+tOyJV2M23a+5jESk1tLuWt5lRqmTtHN000844l -uCgZPPhRV7nhYPC5f6Gqw/xDl/EZsElqJM/hl2JbqiVKfT5/1i0STU8LNkoaLWrJ -kQhc7hOR5ihmDPeD8mA99bmGD+UyyqzzLTtKvRbBObyi9dy7cQ5Q+iptQWTUuEKI -+W7b8f8/Iiin4JJZGpFuhQSx0ARjT0fuYNXddmz1L3Gu3sjzN1GvT2T3GlpiF4/7 -ERS8Q43zjoCP8nC2MTSvdNRRoPMBg2SDS2ZIq4GSiKsKjeN+GnPCycAMeZSr5yG6 -VMBJLoAJ7XIcl3se8gF6hH1AfhCzDaK/2pKLP9jH/W4g6VvUBazKEQCNbZXSTpQ4 -8EfvJBPpplFs3Zid6iwC/WjKhFBuBBfycwNJjXG9x1fMPkBM8HeiZXgrXoUXJMEP -RF05Beo0HPPEOPIxcG6EVmnpDvs8uC+xIQ6UE6DrLGK5TnR6kdz3BDpeAehujSss -wfZiOvuJQZQl+oovOH54pcwAwhicgRcNdIX47kHrXNL1vQMYTXte+ZzDGyoOXd0W -qf1CZbrjULT9nfJFWMMicTnLM/6iQx+3bTkXXvk0qP0qAoIPqtY4rwt6yHgq937A -LubDxudMWV0hqcnH8cBCPHfWdE4HELw4RcVXmQH43yHs1gwShyG9rTS+PCKoRr8u -bpssW6J0xJmilf1KprbNWJyof9i0CtSVOlUt6ttoinwqj8Me01dHqQ== ------END RSA PRIVATE KEY----- diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/ssl/htdocs/index.html b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/ssl/htdocs/index.html deleted file mode 100644 index 6e871d1..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/ssl/htdocs/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - SSL test - - -

    - Verification succeeded? -

    - - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/ssl/ssl_client.rb b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/ssl/ssl_client.rb deleted file mode 100644 index 0c47520..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/ssl/ssl_client.rb +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env ruby - -$:.unshift(File.join('..', '..', 'lib')) -require 'httpclient' - -url = ARGV.shift || 'https://localhost:8808/' -uri = URI.parse(url) - -#ca_file = "0cert.pem" -#crl_file = '0crl.pem' - -# create CA's cert in pem format and run 'c_rehash' in trust_certs dir. before -# using this. -ca_path = File.join(File.dirname(File.expand_path(__FILE__)), "trust_certs") - -proxy = ENV['HTTP_PROXY'] || ENV['http_proxy'] || nil -h = HTTPClient.new(proxy) -#h.ssl_config.add_trust_ca(ca_file) -#h.ssl_config.add_crl(crl_file) -h.ssl_config.add_trust_ca(ca_path) - -print h.get_content(url) diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/ssl/webrick_httpsd.rb b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/ssl/webrick_httpsd.rb deleted file mode 100644 index 1994f58..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/ssl/webrick_httpsd.rb +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env ruby - -require 'webrick/https' -require 'getopts' - -getopts nil, 'r:', 'p:8808' - -dir = File::dirname(File::expand_path(__FILE__)) - -# Pass phrase of '1000key.pem' is '1000'. -data = open(File::join(dir, "1000key.pem")){|io| io.read } -pkey = OpenSSL::PKey::RSA.new(data) -data = open(File::join(dir, "1000cert.pem")){|io| io.read } -cert = OpenSSL::X509::Certificate.new(data) - -s = WEBrick::HTTPServer.new( - :BindAddress => "localhost", - :Port => $OPT_p.to_i, - :Logger => nil, - :DocumentRoot => $OPT_r || File::join(dir, "/htdocs"), - :SSLEnable => true, - :SSLVerifyClient => ::OpenSSL::SSL::VERIFY_NONE, - :SSLCertificate => cert, - :SSLPrivateKey => pkey, - :SSLCertName => nil, - :SSLCACertificateFile => "all.pem" -) -trap("INT"){ s.shutdown } -s.start diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/stream.rb b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/stream.rb deleted file mode 100644 index 3d1478b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/stream.rb +++ /dev/null @@ -1,21 +0,0 @@ -$:.unshift(File.join('..', 'lib')) -require "httpclient" - -c = HTTPClient.new - -piper, pipew = IO.pipe -conn = c.post_async("http://localhost:8080/stream", piper) - -Thread.new do - res = conn.pop - while str = res.content.read(10) - p str - end -end - -p "type here" -while line = STDIN.gets - pipew << line -end -pipew.close -sleep 5 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/thread.rb b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/thread.rb deleted file mode 100644 index 594cc97..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/thread.rb +++ /dev/null @@ -1,27 +0,0 @@ -$:.unshift(File.join('..', 'lib')) -require 'httpclient' - -urlstr = ARGV.shift - -proxy = ENV['HTTP_PROXY'] || ENV['http_proxy'] -h = HTTPClient.new(proxy) - -count = 20 - -res = [] -g = [] -for i in 0..count - g << Thread.new { - res[i] = h.get(urlstr) - } -end - -g.each do |th| - th.join -end - -for i in 0..(count - 1) - raise unless (res[i].content == res[i + 1].content) -end - -puts 'ok' diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/wcat.rb b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/wcat.rb deleted file mode 100644 index 0781b6e..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/sample/wcat.rb +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env ruby - -# wcat for http-access2 -# Copyright (C) 2001 TAKAHASHI Masayoshi - -$:.unshift(File.join('..', 'lib')) -require 'httpclient' - -if ENV['HTTP_PROXY'] - h = HTTPClient.new(ENV['HTTP_PROXY']) -else - h = HTTPClient.new() -end - -while urlstr = ARGV.shift - response = h.get(urlstr){ |data| - print data - } - p response.contenttype - p response.peer_cert if /^https/i =~ urlstr -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/ca-chain.pem b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/ca-chain.pem deleted file mode 100644 index c642a41..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/ca-chain.pem +++ /dev/null @@ -1,44 +0,0 @@ ------BEGIN CERTIFICATE----- -MIID0DCCArigAwIBAgIBADANBgkqhkiG9w0BAQUFADA8MQswCQYDVQQGDAJKUDES -MBAGA1UECgwJSklOLkdSLkpQMQwwCgYDVQQLDANSUlIxCzAJBgNVBAMMAkNBMB4X -DTA0MDEzMDAwNDIzMloXDTM2MDEyMjAwNDIzMlowPDELMAkGA1UEBgwCSlAxEjAQ -BgNVBAoMCUpJTi5HUi5KUDEMMAoGA1UECwwDUlJSMQswCQYDVQQDDAJDQTCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANbv0x42BTKFEQOE+KJ2XmiSdZpR -wjzQLAkPLRnLB98tlzs4xo+y4RyY/rd5TT9UzBJTIhP8CJi5GbS1oXEerQXB3P0d -L5oSSMwGGyuIzgZe5+vZ1kgzQxMEKMMKlzA73rbMd4Jx3u5+jdbP0EDrPYfXSvLY -bS04n2aX7zrN3x5KdDrNBfwBio2/qeaaj4+9OxnwRvYP3WOvqdW0h329eMfHw0pi -JI0drIVdsEqClUV4pebT/F+CPUPkEh/weySgo9wANockkYu5ujw2GbLFcO5LXxxm -dEfcVr3r6t6zOA4bJwL0W/e6LBcrwiG/qPDFErhwtgTLYf6Er67SzLyA66UCAwEA -AaOB3DCB2TAPBgNVHRMBAf8EBTADAQH/MDEGCWCGSAGG+EIBDQQkFiJSdWJ5L09w -ZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBRJ7Xd380KzBV7f -USKIQ+O/vKbhDzAOBgNVHQ8BAf8EBAMCAQYwZAYDVR0jBF0wW4AUSe13d/NCswVe -31EiiEPjv7ym4Q+hQKQ+MDwxCzAJBgNVBAYMAkpQMRIwEAYDVQQKDAlKSU4uR1Iu -SlAxDDAKBgNVBAsMA1JSUjELMAkGA1UEAwwCQ0GCAQAwDQYJKoZIhvcNAQEFBQAD -ggEBAIu/mfiez5XN5tn2jScgShPgHEFJBR0BTJBZF6xCk0jyqNx/g9HMj2ELCuK+ -r/Y7KFW5c5M3AQ+xWW0ZSc4kvzyTcV7yTVIwj2jZ9ddYMN3nupZFgBK1GB4Y05GY -MJJFRkSu6d/Ph5ypzBVw2YMT/nsOo5VwMUGLgS7YVjU+u/HNWz80J3oO17mNZllj -PvORJcnjwlroDnS58KoJ7GDgejv3ESWADvX1OHLE4cRkiQGeLoEU4pxdCxXRqX0U -PbwIkZN9mXVcrmPHq8MWi4eC/V7hnbZETMHuWhUoiNdOEfsAXr3iP4KjyyRdwc7a -d/xgcK06UVQRL/HbEYGiQL056mc= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDaDCCAlCgAwIBAgIBATANBgkqhkiG9w0BAQUFADA8MQswCQYDVQQGDAJKUDES -MBAGA1UECgwJSklOLkdSLkpQMQwwCgYDVQQLDANSUlIxCzAJBgNVBAMMAkNBMB4X -DTA0MDEzMDAwNDMyN1oXDTM1MDEyMjAwNDMyN1owPzELMAkGA1UEBgwCSlAxEjAQ -BgNVBAoMCUpJTi5HUi5KUDEMMAoGA1UECwwDUlJSMQ4wDAYDVQQDDAVTdWJDQTCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJ0Ou7AyRcRXnB/kVHv/6kwe -ANzgg/DyJfsAUqW90m7Lu1nqyug8gK0RBd77yU0w5HOAMHTVSdpjZK0g2sgx4Mb1 -d/213eL9TTl5MRVEChTvQr8q5DVG/8fxPPE7fMI8eOAzd98/NOAChk+80r4Sx7fC -kGVEE1bKwY1MrUsUNjOY2d6t3M4HHV3HX1V8ShuKfsHxgCmLzdI8U+5CnQedFgkm -3e+8tr8IX5RR1wA1Ifw9VadF7OdI/bGMzog/Q8XCLf+WPFjnK7Gcx6JFtzF6Gi4x -4dp1Xl45JYiVvi9zQ132wu8A1pDHhiNgQviyzbP+UjcB/tsOpzBQF8abYzgEkWEC -AwEAAaNyMHAwDwYDVR0TAQH/BAUwAwEB/zAxBglghkgBhvhCAQ0EJBYiUnVieS9P -cGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUlCjXWLsReYzH -LzsxwVnCXmKoB/owCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQCJ/OyN -rT8Cq2Y+G2yA/L1EMRvvxwFBqxavqaqHl/6rwsIBFlB3zbqGA/0oec6MAVnYynq4 -c4AcHTjx3bQ/S4r2sNTZq0DH4SYbQzIobx/YW8PjQUJt8KQdKMcwwi7arHP7A/Ha -LKu8eIC2nsUBnP4NhkYSGhbmpJK+PFD0FVtD0ZIRlY/wsnaZNjWWcnWF1/FNuQ4H -ySjIblqVQkPuzebv3Ror6ZnVDukn96Mg7kP4u6zgxOeqlJGRe1M949SS9Vudjl8X -SF4aZUUB9pQGhsqQJVqaz2OlhGOp9D0q54xko/rekjAIcuDjl1mdX4F2WRrzpUmZ -uY/bPeOBYiVsOYVe ------END CERTIFICATE----- diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/ca.cert b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/ca.cert deleted file mode 100644 index bcabbee..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/ca.cert +++ /dev/null @@ -1,23 +0,0 @@ ------BEGIN CERTIFICATE----- -MIID0DCCArigAwIBAgIBADANBgkqhkiG9w0BAQUFADA8MQswCQYDVQQGDAJKUDES -MBAGA1UECgwJSklOLkdSLkpQMQwwCgYDVQQLDANSUlIxCzAJBgNVBAMMAkNBMB4X -DTA0MDEzMDAwNDIzMloXDTM2MDEyMjAwNDIzMlowPDELMAkGA1UEBgwCSlAxEjAQ -BgNVBAoMCUpJTi5HUi5KUDEMMAoGA1UECwwDUlJSMQswCQYDVQQDDAJDQTCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANbv0x42BTKFEQOE+KJ2XmiSdZpR -wjzQLAkPLRnLB98tlzs4xo+y4RyY/rd5TT9UzBJTIhP8CJi5GbS1oXEerQXB3P0d -L5oSSMwGGyuIzgZe5+vZ1kgzQxMEKMMKlzA73rbMd4Jx3u5+jdbP0EDrPYfXSvLY -bS04n2aX7zrN3x5KdDrNBfwBio2/qeaaj4+9OxnwRvYP3WOvqdW0h329eMfHw0pi -JI0drIVdsEqClUV4pebT/F+CPUPkEh/weySgo9wANockkYu5ujw2GbLFcO5LXxxm -dEfcVr3r6t6zOA4bJwL0W/e6LBcrwiG/qPDFErhwtgTLYf6Er67SzLyA66UCAwEA -AaOB3DCB2TAPBgNVHRMBAf8EBTADAQH/MDEGCWCGSAGG+EIBDQQkFiJSdWJ5L09w -ZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBRJ7Xd380KzBV7f -USKIQ+O/vKbhDzAOBgNVHQ8BAf8EBAMCAQYwZAYDVR0jBF0wW4AUSe13d/NCswVe -31EiiEPjv7ym4Q+hQKQ+MDwxCzAJBgNVBAYMAkpQMRIwEAYDVQQKDAlKSU4uR1Iu -SlAxDDAKBgNVBAsMA1JSUjELMAkGA1UEAwwCQ0GCAQAwDQYJKoZIhvcNAQEFBQAD -ggEBAIu/mfiez5XN5tn2jScgShPgHEFJBR0BTJBZF6xCk0jyqNx/g9HMj2ELCuK+ -r/Y7KFW5c5M3AQ+xWW0ZSc4kvzyTcV7yTVIwj2jZ9ddYMN3nupZFgBK1GB4Y05GY -MJJFRkSu6d/Ph5ypzBVw2YMT/nsOo5VwMUGLgS7YVjU+u/HNWz80J3oO17mNZllj -PvORJcnjwlroDnS58KoJ7GDgejv3ESWADvX1OHLE4cRkiQGeLoEU4pxdCxXRqX0U -PbwIkZN9mXVcrmPHq8MWi4eC/V7hnbZETMHuWhUoiNdOEfsAXr3iP4KjyyRdwc7a -d/xgcK06UVQRL/HbEYGiQL056mc= ------END CERTIFICATE----- diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/client-pass.key b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/client-pass.key deleted file mode 100644 index c332d2a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/client-pass.key +++ /dev/null @@ -1,18 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -Proc-Type: 4,ENCRYPTED -DEK-Info: DES-EDE3-CBC,DE0F454B166A4941 - -Kub+uiaDkZAmUP2P1VKKB1tPcoJ/ZSs5sLckVv156XDfH+6OilEh+E4vXuKkJnW7 -KFVM/nKrKPxLtNmKha0yx2bqZeUfUdpwq1GqTve84v/oJDTOhBXPlKlkMvzzVhdC -IeJ61BgSt4ZVWSAcorae8yvDtUCtVoc0YonuiEno5bjEOWMuOu9iwviDIO+IePdY -mgIPkEyPQOY6/Ir3ImLdqmpPfVPnNxx5fIw9VXDfTqWfY3qHnGECx17ko4PCxhkN -IwnXU8E6r6XRpHV58t7JkM88eD0crpQpZ8Ki1zVPtHq8DfQLwQI+FGt6PBmeneVl -Dne6UPIaEDpd9f5X+Q7+2jZCBOsGntNh4+E7AwnG+G4IpleUG308DWsXZZpYhfLy -12WMzDlsaQ68qgO1a7rD+nOpIgUfIl7bdB242g7gWvXyVzZOGJIg/P3Fl6ydR7Al -afAQFH2L1YH7u9zJLIonMmVRz7VNUHwlVaPE18VGBbzwFOmZHj2THUUB3cOGfsC8 -FgQz0JVZT5t7fAS53KRXhH/mWEimcrKSvZJxOBwoknQDtHS517wMhyUco63UYEQq -2nkW6BD08Qc92xu14hWuWrActTtsJ3wyGSPMYbqo5QRvlnpaEzaQlMRXdBHYbSFJ -D5Eo2nXXqNPX7YbyIHh+cda80r9OwmH/gvXThQd79pMvNHPZ2TWnrlZF7YAdVxHH -etLrAVas2AxXs2LdhwFTI6dmxMv92gYz/WwMeZaNV7SJ4JIKHxGCmajv12cnGVh9 -qCxMIFcpISr3EMwEAnF0npfQ6Xp6rKFUXuEml036vE8= ------END RSA PRIVATE KEY----- diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/client.cert b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/client.cert deleted file mode 100644 index ad13c4b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/client.cert +++ /dev/null @@ -1,19 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDKDCCAhCgAwIBAgIBAjANBgkqhkiG9w0BAQUFADA8MQswCQYDVQQGDAJKUDES -MBAGA1UECgwJSklOLkdSLkpQMQwwCgYDVQQLDANSUlIxCzAJBgNVBAMMAkNBMB4X -DTA0MDEzMTAzMTQ1OFoXDTM1MDEyMzAzMTQ1OFowZTELMAkGA1UEBgwCSlAxEjAQ -BgNVBAoMCUpJTi5HUi5KUDEMMAoGA1UECwwDUlJSMRAwDgYDVQQDDAdleGFtcGxl -MSIwIAYJKoZIhvcNAQkBDBNleGFtcGxlQGV4YW1wbGUub3JnMIGfMA0GCSqGSIb3 -DQEBAQUAA4GNADCBiQKBgQDRWssrK8Gyr+500hpLjCGR3+AHL8/hEJM5zKi/MgLW -jTkvsgOwbYwXOiNtAbR9y4/ucDq7EY+cMUMHES4uFaPTcOaAV0aZRmk8AgslN1tQ -gNS6ew7/Luq3DcVeWkX8PYgR9VG0mD1MPfJ6+IFA5d3vKpdBkBgN4l46jjO0/2Xf -ewIDAQABo4GPMIGMMAwGA1UdEwEB/wQCMAAwMQYJYIZIAYb4QgENBCQWIlJ1Ynkv -T3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFOFvay0H7lr2 -xUx6waYEV2bVDYQhMAsGA1UdDwQEAwIF4DAdBgNVHSUEFjAUBggrBgEFBQcDAgYI -KwYBBQUHAwQwDQYJKoZIhvcNAQEFBQADggEBABd2dYWqbDIWf5sWFvslezxJv8gI -w64KCJBuyJAiDuf+oazr3016kMzAlt97KecLZDusGNagPrq02UX7YMoQFsWJBans -cDtHrkM0al5r6/WGexNMgtYbNTYzt/IwodISGBgZ6dsOuhznwms+IBsTNDAvWeLP -lt2tOqD8kEmjwMgn0GDRuKjs4EoboA3kMULb1p9akDV9ZESU3eOtpS5/G5J5msLI -9WXbYBjcjvkLuJH9VsJhb+R58Vl0ViemvAHhPilSl1SPWVunGhv6FcIkdBEi1k9F -e8BNMmsEjFiANiIRvpdLRbiGBt0KrKTndVfsmoKCvY48oCOvnzxtahFxfs8= ------END CERTIFICATE----- diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/client.key b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/client.key deleted file mode 100644 index 37bc62f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/client.key +++ /dev/null @@ -1,15 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIICWwIBAAKBgQDRWssrK8Gyr+500hpLjCGR3+AHL8/hEJM5zKi/MgLWjTkvsgOw -bYwXOiNtAbR9y4/ucDq7EY+cMUMHES4uFaPTcOaAV0aZRmk8AgslN1tQgNS6ew7/ -Luq3DcVeWkX8PYgR9VG0mD1MPfJ6+IFA5d3vKpdBkBgN4l46jjO0/2XfewIDAQAB -AoGAZcz8llWErtsV3QB9gNb3S/PNADGjqBFjReva8n3jG2k4sZSibpwWTwUaTNtT -ZQgjSRKRvH1hk9XwffNAvXAQZNNkuj/16gO2oO45nyLj4dO365ujLptWnVIWDHOE -uN0GeiZO+VzcCisT0WCq4tvtLeH8svrxzA8cbXIEyOK7NiECQQDwo2zPFyKAZ/Cu -lDJ6zKT+RjfWwW7DgWzirAlTrt4ViMaW+IaDH29TmQpb4V4NuR3Xi+2Xl4oicu6S -36TW9+/FAkEA3rgfOQJuLlWSnw1RTGwvnC816a/W7iYYY7B+0U4cDbfWl7IoXT4y -M8nV/HESooviZLqBwzAYSoj3fFKYBKpGPwJAUO8GN5iWWA2dW3ooiDiv/X1sZmRk -dojfMFWgRW747tEzya8Ivq0h6kH8w+5GjeMG8Gn1nRiwsulo6Ckj7dEx6QJACyui -7UIQ8qP6GZ4aYMHgVW4Mvy7Bkeo5OO7GPYs0Xv/EdJFL8vlGnVBXOjUVoS9w6Gpu -TbLg1QQvnX2rADjmEwJANxZO2GUkaWGsEif8aGW0x5g/IdaMGG27pTWk5zqix7P3 -1UDrdo/JOXhptovhRi06EppIxAxYmbh9vd9VN8Itlw== ------END RSA PRIVATE KEY----- diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/helper.rb b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/helper.rb deleted file mode 100644 index 26bc4f9..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/helper.rb +++ /dev/null @@ -1,131 +0,0 @@ -# -*- encoding: utf-8 -*- -begin - require 'simplecov' - require 'simplecov-rcov' - SimpleCov.formatter = SimpleCov::Formatter::RcovFormatter - SimpleCov.start -rescue LoadError -end -require 'test/unit' - -require 'httpclient' -require 'webrick' -require 'webrick/httpproxy.rb' -require 'logger' -require 'stringio' -require 'cgi' -require 'webrick/httputils' - - -module Helper - Port = 17171 - ProxyPort = 17172 - - def serverport - @serverport - end - - def proxyport - @proxyport - end - - def serverurl - "http://localhost:#{serverport}/" - end - - def proxyurl - "http://localhost:#{proxyport}/" - end - - def setup - @logger = Logger.new(STDERR) - @logger.level = Logger::Severity::FATAL - @proxyio = StringIO.new - @proxylogger = Logger.new(@proxyio) - @proxylogger.level = Logger::Severity::DEBUG - @server = @proxyserver = @client = nil - @server_thread = @proxyserver_thread = nil - @serverport = Port - @proxyport = ProxyPort - end - - def teardown - teardown_client if @client - teardown_proxyserver if @proxyserver - teardown_server if @server - end - - def setup_client - @client = HTTPClient.new - end - - def escape_noproxy - backup = HTTPClient::NO_PROXY_HOSTS.dup - HTTPClient::NO_PROXY_HOSTS.clear - yield - ensure - HTTPClient::NO_PROXY_HOSTS.replace(backup) - end - - def setup_proxyserver - @proxyserver = WEBrick::HTTPProxyServer.new( - :BindAddress => "localhost", - :Logger => @proxylogger, - :Port => 0, - :AccessLog => [] - ) - @proxyport = @proxyserver.config[:Port] - @proxyserver_thread = start_server_thread(@proxyserver) - end - - def teardown_client - @client.reset_all - end - - def teardown_server - @server.shutdown - #@server_thread.kill - end - - def teardown_proxyserver - @proxyserver.shutdown - #@proxyserver_thread.kill - end - - def start_server_thread(server) - t = Thread.new { - Thread.current.abort_on_exception = true - server.start - } - while server.status != :Running - Thread.pass - unless t.alive? - t.join - raise - end - end - t - end - - def params(str) - HTTP::Message.parse(str).inject({}) { |r, (k, v)| r[k] = v.first; r } - end - - def silent - begin - back, $VERBOSE = $VERBOSE, nil - yield - ensure - $VERBOSE = back - end - end - - def escape_env - env = {} - env.update(ENV) - yield - ensure - ENV.clear - ENV.update(env) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/htdigest b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/htdigest deleted file mode 100644 index 0a125d9..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/htdigest +++ /dev/null @@ -1 +0,0 @@ -admin:auth:4302fe65caa32f27721949149ccd3083 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/htpasswd b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/htpasswd deleted file mode 100644 index 70df50c..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/htpasswd +++ /dev/null @@ -1,2 +0,0 @@ -admin:Qg266hq/YYKe2 -guest:gbPc4vPCH.h12 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/jruby_ssl_socket/test_pemutils.rb b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/jruby_ssl_socket/test_pemutils.rb deleted file mode 100644 index 560a1c6..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/jruby_ssl_socket/test_pemutils.rb +++ /dev/null @@ -1,32 +0,0 @@ -require File.expand_path('helper', File.join(File.dirname(__FILE__), "..")) - - -class PEMUtilsTest < Test::Unit::TestCase - include Helper - - def setup - @raw_cert = "-----BEGIN CERTIFICATE-----\nMIIDOTCCAiGgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBCMRMwEQYKCZImiZPyLGQB\nGRYDb3JnMRkwFwYKCZImiZPyLGQBGRYJcnVieS1sYW5nMRAwDgYDVQQDDAdSdWJ5\nIENBMB4XDTE2MDgxMDE3MjEzNFoXDTE3MDgxMDE3MjEzNFowSzETMBEGCgmSJomT\n8ixkARkWA29yZzEZMBcGCgmSJomT8ixkARkWCXJ1YnktbGFuZzEZMBcGA1UEAwwQ\nUnVieSBjZXJ0aWZpY2F0ZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\nAJCfsSXpSMpmZCVa+ZCM+QDgomnhDlvnrGDq6pasTaIspGTXgws+7r8Dt/cNe6EH\nHJpRH2cGRiO4yPcfcT9eS4X7k8OC4f33wHfACOmLu6LeoNE8ujmSk6L6WzLUI+sE\nnLZbFrXxoAo4XHsm8vEG9C+jEoXZ1p+47wrAGaDwDQTnzlMy4dT9pRQEJP2G/Rry\nUkuZn8SUWmh3/YS78iaSzsNF1cgE1ealHOrPPFDjiCGDaH/LHyUPYlbFSLZ/B7Qx\nLxi5sePLcywWq/EJrmWpgeVTDjtNijsdKv/A3qkY+fm/oD0pzt7XsfJaP9YKNyJO\nQFdxWZeiPcDF+Hwf+IwSr+kCAwEAAaMxMC8wDgYDVR0PAQH/BAQDAgeAMB0GA1Ud\nDgQWBBQNvzYzJyXemGhxbA8NMXLolDnPyjANBgkqhkiG9w0BAQsFAAOCAQEARIJV\noKejGlOTn71QutnNnu07UtTu0IHs6YqjYzzND+m4JXLN+wvYm72AFUG0b1L7dRg0\niK8XjQrlNQNVqP1Mc6tffchy20neOPOHeiO6qTdRU8P2S8D3Uwe+1qhgxjfE+cWc\nwZmWxYK4HA8c58PxWMqrkr2QqXDplG9KWLvOgrtPGiLLZcQSKhvvB63QzItHBDU6\nRayiJY3oPkK/HrIvFlySqFqzWmuyknkciOFywEHQMz/tcSFJ2QFpPj/tBz9VXohH\nZ8KscmfhZrTPBjo+ky1lz/WraWoz4LMiLnkC2ABczWLRSawu+v3Irx1NFJngt05e\npqwtqIUeg7j+JLiTaA==\n-----END CERTIFICATE-----" - end - - def test_read_certificate - assert_nothing_raised do - binary = HTTPClient::JRubySSLSocket::PEMUtils.read_certificate(@raw_cert) - end - end - - def test_read_certificate_works_with_random_ascii_text_outside_begin_end - raw_cert_with_ascii = "some text before begin\n" + @raw_cert + "\nsome text after end" - assert_nothing_raised do - binary = HTTPClient::JRubySSLSocket::PEMUtils.read_certificate(raw_cert_with_ascii) - end - end - - def test_read_certificate_uses_all_content_if_missing_begin_end - cert = @raw_cert.sub(/-----BEGIN CERTIFICATE-----/, '').sub(/-----END CERTIFICATE-----/, '') - assert_nothing_raised do - binary = HTTPClient::JRubySSLSocket::PEMUtils.read_certificate(cert) - end - end - - -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/runner.rb b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/runner.rb deleted file mode 100644 index a07c28e..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/runner.rb +++ /dev/null @@ -1,2 +0,0 @@ -require 'test/unit' -exit Test::Unit::AutoRunner.run(true, File.dirname($0)) diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/server.cert b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/server.cert deleted file mode 100644 index 998ccc5..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/server.cert +++ /dev/null @@ -1,19 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIC/zCCAeegAwIBAgIBATANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQGDAJKUDES -MBAGA1UECgwJSklOLkdSLkpQMQwwCgYDVQQLDANSUlIxDjAMBgNVBAMMBVN1YkNB -MB4XDTA0MDEzMTAzMTMxNloXDTMzMDEyMzAzMTMxNlowQzELMAkGA1UEBgwCSlAx -EjAQBgNVBAoMCUpJTi5HUi5KUDEMMAoGA1UECwwDUlJSMRIwEAYDVQQDDAlsb2Nh -bGhvc3QwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANFJTxWqup3nV9dsJAku -p+WaXnPNIzcpAA3qMGZDJTJsfa8Du7ZxTP0XJK5mETttBrn711cJxAuP3KjqnW9S -vtZ9lY2sXJ6Zj62sN5LwG3VVe25dI28yR1EsbHjJ5Zjf9tmggMC6am52dxuHbt5/ -vHo4ngJuKE/U+eeGRivMn6gFAgMBAAGjgYUwgYIwDAYDVR0TAQH/BAIwADAxBglg -hkgBhvhCAQ0EJBYiUnVieS9PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAd -BgNVHQ4EFgQUpZIyygD9JxFYHHOTEuWOLbCKfckwCwYDVR0PBAQDAgWgMBMGA1Ud -JQQMMAoGCCsGAQUFBwMBMA0GCSqGSIb3DQEBBQUAA4IBAQBwAIj5SaBHaA5X31IP -CFCJiep96awfp7RANO0cuUj+ZpGoFn9d6FXY0g+Eg5wAkCNIzZU5NHN9xsdOpnUo -zIBbyTfQEPrge1CMWMvL6uGaoEXytq84VTitF/xBTky4KtTn6+es4/e7jrrzeUXQ -RC46gkHObmDT91RkOEGjHLyld2328jo3DIN/VTHIryDeVHDWjY5dENwpwdkhhm60 -DR9IrNBbXWEe9emtguNXeN0iu1ux0lG1Hc6pWGQxMlRKNvGh0yZB9u5EVe38tOV0 -jQaoNyL7qzcQoXD3Dmbi1p0iRmg/+HngISsz8K7k7MBNVsSclztwgCzTZOBiVtkM -rRlQ ------END CERTIFICATE----- diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/server.key b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/server.key deleted file mode 100644 index 9ba2218..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/server.key +++ /dev/null @@ -1,15 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIICXQIBAAKBgQDRSU8Vqrqd51fXbCQJLqflml5zzSM3KQAN6jBmQyUybH2vA7u2 -cUz9FySuZhE7bQa5+9dXCcQLj9yo6p1vUr7WfZWNrFyemY+trDeS8Bt1VXtuXSNv -MkdRLGx4yeWY3/bZoIDAumpudncbh27ef7x6OJ4CbihP1PnnhkYrzJ+oBQIDAQAB -AoGBAIf4CstW2ltQO7+XYGoex7Hh8s9lTSW/G2vu5Hbr1LTHy3fzAvdq8MvVR12O -rk9fa+lU9vhzPc0NMB0GIDZ9GcHuhW5hD1Wg9OSCbTOkZDoH3CAFqonjh4Qfwv5W -IPAFn9KHukdqGXkwEMdErsUaPTy9A1V/aROVEaAY+HJgq/eZAkEA/BP1QMV04WEZ -Oynzz7/lLizJGGxp2AOvEVtqMoycA/Qk+zdKP8ufE0wbmCE3Qd6GoynavsHb6aGK -gQobb8zDZwJBANSK6MrXlrZTtEaeZuyOB4mAmRzGzOUVkUyULUjEx2GDT93ujAma -qm/2d3E+wXAkNSeRpjUmlQXy/2oSqnGvYbMCQQDRM+cYyEcGPUVpWpnj0shrF/QU -9vSot/X1G775EMTyaw6+BtbyNxVgOIu2J+rqGbn3c+b85XqTXOPL0A2RLYkFAkAm -syhSDtE9X55aoWsCNZY/vi+i4rvaFoQ/WleogVQAeGVpdo7/DK9t9YWoFBIqth0L -mGSYFu9ZhvZkvQNV8eYrAkBJ+rOIaLDsmbrgkeDruH+B/9yrm4McDtQ/rgnOGYnH -LjLpLLOrgUxqpzLWe++EwSLwK2//dHO+SPsQJ4xsyQJy ------END RSA PRIVATE KEY----- diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/sslsvr.rb b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/sslsvr.rb deleted file mode 100644 index b1f4614..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/sslsvr.rb +++ /dev/null @@ -1,65 +0,0 @@ -require 'webrick/https' -require 'logger' -require 'rbconfig' - -PORT = 17171 -DIR = File.dirname(File.expand_path(__FILE__)) - -def cert(filename) - OpenSSL::X509::Certificate.new(File.open(File.join(DIR, filename)) { |f| - f.read - }) -end - -def key(filename) - OpenSSL::PKey::RSA.new(File.open(File.join(DIR, filename)) { |f| - f.read - }) -end - -def do_hello(req, res) - res['content-type'] = 'text/html' - res.body = "hello" -end - -logger = Logger.new(STDERR) -logger.level = Logger::Severity::FATAL # avoid logging SSLError (ERROR level) - -server = WEBrick::HTTPServer.new( - :BindAddress => "localhost", - :Logger => logger, - :Port => PORT, - :AccessLog => [], - :DocumentRoot => DIR, - :SSLEnable => true, - :SSLCACertificateFile => File.join(DIR, 'ca.cert'), - :SSLCertificate => cert('server.cert'), - :SSLPrivateKey => key('server.key'), - :SSLVerifyClient => nil, #OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT|OpenSSL::SSL::VERIFY_PEER, - :SSLClientCA => cert('ca.cert'), - :SSLCertName => nil -) -trap(:INT) do - server.shutdown -end -[:hello].each do |sym| - server.mount( - "/#{sym}", - WEBrick::HTTPServlet::ProcHandler.new(method("do_#{sym}").to_proc) - ) -end - -t = Thread.new { - Thread.current.abort_on_exception = true - server.start -} -while server.status != :Running - sleep 0.1 - unless t.alive? - t.join - raise - end -end -STDOUT.sync = true -puts $$ -t.join diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/subca.cert b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/subca.cert deleted file mode 100644 index 1e47185..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/subca.cert +++ /dev/null @@ -1,21 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDaDCCAlCgAwIBAgIBATANBgkqhkiG9w0BAQUFADA8MQswCQYDVQQGDAJKUDES -MBAGA1UECgwJSklOLkdSLkpQMQwwCgYDVQQLDANSUlIxCzAJBgNVBAMMAkNBMB4X -DTA0MDEzMDAwNDMyN1oXDTM1MDEyMjAwNDMyN1owPzELMAkGA1UEBgwCSlAxEjAQ -BgNVBAoMCUpJTi5HUi5KUDEMMAoGA1UECwwDUlJSMQ4wDAYDVQQDDAVTdWJDQTCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJ0Ou7AyRcRXnB/kVHv/6kwe -ANzgg/DyJfsAUqW90m7Lu1nqyug8gK0RBd77yU0w5HOAMHTVSdpjZK0g2sgx4Mb1 -d/213eL9TTl5MRVEChTvQr8q5DVG/8fxPPE7fMI8eOAzd98/NOAChk+80r4Sx7fC -kGVEE1bKwY1MrUsUNjOY2d6t3M4HHV3HX1V8ShuKfsHxgCmLzdI8U+5CnQedFgkm -3e+8tr8IX5RR1wA1Ifw9VadF7OdI/bGMzog/Q8XCLf+WPFjnK7Gcx6JFtzF6Gi4x -4dp1Xl45JYiVvi9zQ132wu8A1pDHhiNgQviyzbP+UjcB/tsOpzBQF8abYzgEkWEC -AwEAAaNyMHAwDwYDVR0TAQH/BAUwAwEB/zAxBglghkgBhvhCAQ0EJBYiUnVieS9P -cGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUlCjXWLsReYzH -LzsxwVnCXmKoB/owCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQCJ/OyN -rT8Cq2Y+G2yA/L1EMRvvxwFBqxavqaqHl/6rwsIBFlB3zbqGA/0oec6MAVnYynq4 -c4AcHTjx3bQ/S4r2sNTZq0DH4SYbQzIobx/YW8PjQUJt8KQdKMcwwi7arHP7A/Ha -LKu8eIC2nsUBnP4NhkYSGhbmpJK+PFD0FVtD0ZIRlY/wsnaZNjWWcnWF1/FNuQ4H -ySjIblqVQkPuzebv3Ror6ZnVDukn96Mg7kP4u6zgxOeqlJGRe1M949SS9Vudjl8X -SF4aZUUB9pQGhsqQJVqaz2OlhGOp9D0q54xko/rekjAIcuDjl1mdX4F2WRrzpUmZ -uY/bPeOBYiVsOYVe ------END CERTIFICATE----- diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/test_auth.rb b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/test_auth.rb deleted file mode 100644 index ab5cd62..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/test_auth.rb +++ /dev/null @@ -1,492 +0,0 @@ -require File.expand_path('helper', File.dirname(__FILE__)) -require 'digest/md5' -require 'rack' -require 'rack/lint' -require 'rack-ntlm' - -class TestAuth < Test::Unit::TestCase - include Helper - - def setup - super - setup_server - end - - def teardown - super - end - - def setup_server - @server = WEBrick::HTTPServer.new( - :BindAddress => "localhost", - :Logger => @logger, - :Port => 0, - :AccessLog => [], - :DocumentRoot => File.dirname(File.expand_path(__FILE__)) - ) - @serverport = @server.config[:Port] - @server.mount( - '/basic_auth', - WEBrick::HTTPServlet::ProcHandler.new(method(:do_basic_auth).to_proc) - ) - @server.mount( - '/digest_auth', - WEBrick::HTTPServlet::ProcHandler.new(method(:do_digest_auth).to_proc) - ) - @server.mount( - '/digest_sess_auth', - WEBrick::HTTPServlet::ProcHandler.new(method(:do_digest_sess_auth).to_proc) - ) - # NTLM endpoint - ntlm_handler = Rack::Handler::WEBrick.new(@server, - Rack::Builder.app do - use Rack::ShowExceptions - use Rack::ContentLength - use Rack::Ntlm, {:uri_pattern => /.*/, :auth => {:username => "admin", :password => "admin"}} - run lambda { |env| [200, { 'Content-Type' => 'text/html' }, ['ntlm_auth OK']] } - end - ) - @server.mount( - '/ntlm_auth', - WEBrick::HTTPServlet::ProcHandler.new(Proc.new do |req, res| - ntlm_handler.service(req, res) - end) - ) - # Htpasswd - htpasswd = File.join(File.dirname(__FILE__), 'htpasswd') - htpasswd_userdb = WEBrick::HTTPAuth::Htpasswd.new(htpasswd) - htdigest = File.join(File.dirname(__FILE__), 'htdigest') - htdigest_userdb = WEBrick::HTTPAuth::Htdigest.new(htdigest) - @basic_auth = WEBrick::HTTPAuth::BasicAuth.new( - :Logger => @logger, - :Realm => 'auth', - :UserDB => htpasswd_userdb - ) - @digest_auth = WEBrick::HTTPAuth::DigestAuth.new( - :Logger => @logger, - :Algorithm => 'MD5', - :Realm => 'auth', - :UserDB => htdigest_userdb - ) - @digest_sess_auth = WEBrick::HTTPAuth::DigestAuth.new( - :Logger => @logger, - :Algorithm => 'MD5-sess', - :Realm => 'auth', - :UserDB => htdigest_userdb - ) - @server_thread = start_server_thread(@server) - - @proxy_digest_auth = WEBrick::HTTPAuth::ProxyDigestAuth.new( - :Logger => @proxylogger, - :Algorithm => 'MD5', - :Realm => 'auth', - :UserDB => htdigest_userdb - ) - - @proxyserver = WEBrick::HTTPProxyServer.new( - :ProxyAuthProc => @proxy_digest_auth.method(:authenticate).to_proc, - :BindAddress => "localhost", - :Logger => @proxylogger, - :Port => 0, - :AccessLog => [] - ) - @proxyport = @proxyserver.config[:Port] - @proxyserver_thread = start_server_thread(@proxyserver) - end - - def do_basic_auth(req, res) - @basic_auth.authenticate(req, res) - res['content-type'] = 'text/plain' - res.body = 'basic_auth OK' - end - - def do_digest_auth(req, res) - @digest_auth.authenticate(req, res) - res['content-type'] = 'text/plain' - res['x-query'] = req.body - res.body = 'digest_auth OK' + req.query_string.to_s - end - - def do_digest_sess_auth(req, res) - @digest_sess_auth.authenticate(req, res) - res['content-type'] = 'text/plain' - res['x-query'] = req.body - res.body = 'digest_sess_auth OK' + req.query_string.to_s - end - - # TODO: monkey patching for rack-ntlm-test-services's incompat. - module ::Net - module NTLM - # ruby-ntlm 0.3.0 -> 0.4.0 - def self.decode_utf16le(*arg) - EncodeUtil.decode_utf16le(*arg) - end - # Make it work if @value == nil - class SecurityBuffer < FieldSet - remove_method(:data_size) if method_defined?(:data_size) - def data_size - @active && @value ? @value.size : 0 - end - end - end - end - def test_ntlm_auth - c = HTTPClient.new - c.set_auth("http://localhost:#{serverport}/ntlm_auth", 'admin', 'admin') - assert_equal('ntlm_auth OK', c.get_content("http://localhost:#{serverport}/ntlm_auth")) - end - - def test_basic_auth - c = HTTPClient.new - c.set_auth("http://localhost:#{serverport}/", 'admin', 'admin') - assert_equal('basic_auth OK', c.get_content("http://localhost:#{serverport}/basic_auth")) - end - - def test_basic_auth_compat - c = HTTPClient.new - c.set_basic_auth("http://localhost:#{serverport}/", 'admin', 'admin') - assert_equal('basic_auth OK', c.get_content("http://localhost:#{serverport}/basic_auth")) - end - - def test_BASIC_auth - c = HTTPClient.new - webrick_backup = @basic_auth.instance_eval { @auth_scheme } - begin - # WEBrick in ruby 1.8.7 uses 'BASIC' instead of 'Basic' - @basic_auth.instance_eval { @auth_scheme = "BASIC" } - c.www_auth.basic_auth.instance_eval { @scheme = "BASIC" } - # - c.set_auth("http://localhost:#{serverport}/", 'admin', 'admin') - res = c.get("http://localhost:#{serverport}/basic_auth") - assert_equal('basic_auth OK', res.content) - assert_equal(200, res.status) - assert_equal(401, res.previous.status) - assert_equal(nil, res.previous.previous) - ensure - @basic_auth.instance_eval { @auth_scheme = webrick_backup } - end - end - - def test_BASIC_auth_force - c = HTTPClient.new - webrick_backup = @basic_auth.instance_eval { @auth_scheme } - begin - # WEBrick in ruby 1.8.7 uses 'BASIC' instead of 'Basic' - @basic_auth.instance_eval { @auth_scheme = "BASIC" } - c.www_auth.basic_auth.instance_eval { @scheme = "BASIC" } - # - c.force_basic_auth = true - c.debug_dev = str = '' - c.set_auth("http://localhost:#{serverport}/", 'admin', 'admin') - assert_equal('basic_auth OK', c.get_content("http://localhost:#{serverport}/basic_auth")) - assert_equal('Authorization: Basic YWRtaW46YWRtaW4='.upcase, str.split(/\r?\n/)[5].upcase) - ensure - @basic_auth.instance_eval { @auth_scheme = webrick_backup } - end - end - - def test_BASIC_auth_async - # async methods don't issure retry call so for successful authentication you need to set force_basic_auth flag - c = HTTPClient.new(:force_basic_auth => true) - webrick_backup = @basic_auth.instance_eval { @auth_scheme } - begin - # WEBrick in ruby 1.8.7 uses 'BASIC' instead of 'Basic' - @basic_auth.instance_eval { @auth_scheme = "BASIC" } - c.www_auth.basic_auth.instance_eval { @scheme = "BASIC" } - # - c.set_auth("http://localhost:#{serverport}/", 'admin', 'admin') - conn = c.get_async("http://localhost:#{serverport}/basic_auth") - assert_equal('basic_auth OK', conn.pop.body.read) - ensure - @basic_auth.instance_eval { @auth_scheme = webrick_backup } - end - end - - def test_BASIC_auth_nil_uri - c = HTTPClient.new - webrick_backup = @basic_auth.instance_eval { @auth_scheme } - begin - @basic_auth.instance_eval { @auth_scheme = "BASIC" } - c.www_auth.basic_auth.instance_eval { @scheme = "BASIC" } - c.set_auth(nil, 'admin', 'admin') - assert_equal('basic_auth OK', c.get_content("http://localhost:#{serverport}/basic_auth")) - ensure - @basic_auth.instance_eval { @auth_scheme = webrick_backup } - end - end - - # To work this test consistently on CRuby you can to add 'Thread.pass' in - # @challenge iteration at BasicAuth#get like; - # - # return nil unless @challenge.find { |uri, ok| - # Thread.pass - # Util.uri_part_of(target_uri, uri) and ok - # } - def test_BASIC_auth_multi_thread - c = HTTPClient.new - webrick_backup = @basic_auth.instance_eval { @auth_scheme } - begin - @basic_auth.instance_eval { @auth_scheme = "BASIC" } - c.www_auth.basic_auth.instance_eval { @scheme = "BASIC" } - c.set_auth("http://localhost:#{serverport}/", 'admin', 'admin') - - 100.times.map { |idx| - Thread.new(idx) { |idx2| - Thread.abort_on_exception = true - Thread.pass - c.get("http://localhost:#{serverport}/basic_auth?#{idx2}") - } - }.map { |t| - t.join - } - ensure - @basic_auth.instance_eval { @auth_scheme = webrick_backup } - end - end - - def test_basic_auth_reuses_credentials - c = HTTPClient.new - c.set_auth("http://localhost:#{serverport}/", 'admin', 'admin') - assert_equal('basic_auth OK', c.get_content("http://localhost:#{serverport}/basic_auth/")) - c.test_loopback_http_response << "HTTP/1.0 200 OK\nContent-Length: 2\n\nOK" - c.debug_dev = str = '' - c.get_content("http://localhost:#{serverport}/basic_auth/sub/dir/") - assert_match(/Authorization: Basic YWRtaW46YWRtaW4=/, str) - end - - def test_digest_auth - c = HTTPClient.new - c.set_auth("http://localhost:#{serverport}/", 'admin', 'admin') - assert_equal('digest_auth OK', c.get_content("http://localhost:#{serverport}/digest_auth")) - end - - def test_digest_auth_reuses_credentials - c = HTTPClient.new - c.set_auth("http://localhost:#{serverport}/", 'admin', 'admin') - assert_equal('digest_auth OK', c.get_content("http://localhost:#{serverport}/digest_auth/")) - c.test_loopback_http_response << "HTTP/1.0 200 OK\nContent-Length: 2\n\nOK" - c.debug_dev = str = '' - c.get_content("http://localhost:#{serverport}/digest_auth/sub/dir/") - assert_match(/Authorization: Digest/, str) - end - - def test_digest_auth_with_block - c = HTTPClient.new - c.set_auth("http://localhost:#{serverport}/", 'admin', 'admin') - called = false - c.get_content("http://localhost:#{serverport}/digest_auth") do |str| - assert_equal('digest_auth OK', str) - called = true - end - assert(called) - # - called = false - c.get("http://localhost:#{serverport}/digest_auth") do |str| - assert_equal('digest_auth OK', str) - called = true - end - assert(called) - end - - def test_digest_auth_with_post_io - c = HTTPClient.new - c.set_auth("http://localhost:#{serverport}/", 'admin', 'admin') - post_body = StringIO.new("1234567890") - assert_equal('1234567890', c.post("http://localhost:#{serverport}/digest_auth", post_body).header['x-query'][0]) - # - post_body = StringIO.new("1234567890") - post_body.read(5) - assert_equal('67890', c.post("http://localhost:#{serverport}/digest_auth", post_body).header['x-query'][0]) - end - - def test_digest_auth_with_querystring - c = HTTPClient.new - c.debug_dev = STDERR if $DEBUG - c.set_auth("http://localhost:#{serverport}/", 'admin', 'admin') - assert_equal('digest_auth OKbar=baz', c.get_content("http://localhost:#{serverport}/digest_auth/foo?bar=baz")) - end - - def test_perfer_digest - c = HTTPClient.new - c.set_auth('http://example.com/', 'admin', 'admin') - c.test_loopback_http_response << "HTTP/1.0 401 Unauthorized\nWWW-Authenticate: Basic realm=\"foo\"\nWWW-Authenticate: Digest realm=\"foo\", nonce=\"nonce\", stale=false\nContent-Length: 2\n\nNG" - c.test_loopback_http_response << "HTTP/1.0 200 OK\nContent-Length: 2\n\nOK" - c.debug_dev = str = '' - c.get_content('http://example.com/') - assert_match(/^Authorization: Digest/, str) - end - - def test_digest_sess_auth - c = HTTPClient.new - c.set_auth("http://localhost:#{serverport}/", 'admin', 'admin') - assert_equal('digest_sess_auth OK', c.get_content("http://localhost:#{serverport}/digest_sess_auth")) - end - - def test_proxy_auth - c = HTTPClient.new - c.set_proxy_auth('admin', 'admin') - c.test_loopback_http_response << "HTTP/1.0 407 Unauthorized\nProxy-Authenticate: Basic realm=\"foo\"\nContent-Length: 2\n\nNG" - c.test_loopback_http_response << "HTTP/1.0 200 OK\nContent-Length: 2\n\nOK" - c.debug_dev = str = '' - c.get_content('http://example.com/') - assert_match(/Proxy-Authorization: Basic YWRtaW46YWRtaW4=/, str) - end - - def test_proxy_auth_force - c = HTTPClient.new - c.set_proxy_auth('admin', 'admin') - c.force_basic_auth = true - c.test_loopback_http_response << "HTTP/1.0 200 OK\nContent-Length: 2\n\nOK" - c.debug_dev = str = '' - c.get_content('http://example.com/') - assert_match(/Proxy-Authorization: Basic YWRtaW46YWRtaW4=/, str) - end - - def test_proxy_auth_reuses_credentials - c = HTTPClient.new - c.set_proxy_auth('admin', 'admin') - c.test_loopback_http_response << "HTTP/1.0 407 Unauthorized\nProxy-Authenticate: Basic realm=\"foo\"\nContent-Length: 2\n\nNG" - c.test_loopback_http_response << "HTTP/1.0 200 OK\nContent-Length: 2\n\nOK" - c.test_loopback_http_response << "HTTP/1.0 200 OK\nContent-Length: 2\n\nOK" - c.get_content('http://www1.example.com/') - c.debug_dev = str = '' - c.get_content('http://www2.example.com/') - assert_match(/Proxy-Authorization: Basic YWRtaW46YWRtaW4=/, str) - end - - def test_digest_proxy_auth_loop - c = HTTPClient.new - c.set_proxy_auth('admin', 'admin') - c.test_loopback_http_response << "HTTP/1.0 407 Unauthorized\nProxy-Authenticate: Digest realm=\"foo\", nonce=\"nonce\", stale=false\nContent-Length: 2\n\nNG" - c.test_loopback_http_response << "HTTP/1.0 200 OK\nContent-Length: 2\n\nOK" - md5 = Digest::MD5.new - ha1 = md5.hexdigest("admin:foo:admin") - ha2 = md5.hexdigest("GET:/") - response = md5.hexdigest("#{ha1}:nonce:#{ha2}") - c.debug_dev = str = '' - c.get_content('http://example.com/') - assert_match(/Proxy-Authorization: Digest/, str) - assert_match(%r"response=\"#{response}\"", str) - end - - def test_digest_proxy_auth - c=HTTPClient.new("http://localhost:#{proxyport}/") - c.set_proxy_auth('admin', 'admin') - c.set_auth("http://127.0.0.1:#{serverport}/", 'admin', 'admin') - assert_equal('basic_auth OK', c.get_content("http://127.0.0.1:#{serverport}/basic_auth")) - end - - def test_digest_proxy_invalid_auth - c=HTTPClient.new("http://localhost:#{proxyport}/") - c.set_proxy_auth('admin', 'wrong') - c.set_auth("http://127.0.0.1:#{serverport}/", 'admin', 'admin') - assert_raises(HTTPClient::BadResponseError) do - c.get_content("http://127.0.0.1:#{serverport}/basic_auth") - end - end - - def test_prefer_digest_to_basic_proxy_auth - c = HTTPClient.new - c.set_proxy_auth('admin', 'admin') - c.test_loopback_http_response << "HTTP/1.0 407 Unauthorized\nProxy-Authenticate: Digest realm=\"foo\", nonce=\"nonce\", stale=false\nProxy-Authenticate: Basic realm=\"bar\"\nContent-Length: 2\n\nNG" - c.test_loopback_http_response << "HTTP/1.0 200 OK\nContent-Length: 2\n\nOK" - md5 = Digest::MD5.new - ha1 = md5.hexdigest("admin:foo:admin") - ha2 = md5.hexdigest("GET:/") - response = md5.hexdigest("#{ha1}:nonce:#{ha2}") - c.debug_dev = str = '' - c.get_content('http://example.com/') - assert_match(/Proxy-Authorization: Digest/, str) - assert_match(%r"response=\"#{response}\"", str) - end - - def test_digest_proxy_auth_reuses_credentials - c = HTTPClient.new - c.set_proxy_auth('admin', 'admin') - c.test_loopback_http_response << "HTTP/1.0 407 Unauthorized\nProxy-Authenticate: Digest realm=\"foo\", nonce=\"nonce\", stale=false\nContent-Length: 2\n\nNG" - c.test_loopback_http_response << "HTTP/1.0 200 OK\nContent-Length: 2\n\nOK" - c.test_loopback_http_response << "HTTP/1.0 200 OK\nContent-Length: 2\n\nOK" - md5 = Digest::MD5.new - ha1 = md5.hexdigest("admin:foo:admin") - ha2 = md5.hexdigest("GET:/") - response = md5.hexdigest("#{ha1}:nonce:#{ha2}") - c.get_content('http://www1.example.com/') - c.debug_dev = str = '' - c.get_content('http://www2.example.com/') - assert_match(/Proxy-Authorization: Digest/, str) - assert_match(%r"response=\"#{response}\"", str) - end - - def test_oauth - c = HTTPClient.new - config = HTTPClient::OAuth::Config.new( - :realm => 'http://photos.example.net/', - :consumer_key => 'dpf43f3p2l4k3l03', - :consumer_secret => 'kd94hf93k423kf44', - :token => 'nnch734d00sl2jdk', - :secret => 'pfkkdhi9sl3r4s00', - :version => '1.0', - :signature_method => 'HMAC-SHA1' - ) - config.debug_timestamp = '1191242096' - config.debug_nonce = 'kllo9940pd9333jh' - c.www_auth.oauth.set_config('http://photos.example.net/', config) - c.www_auth.oauth.challenge('http://photos.example.net/') - c.test_loopback_http_response << "HTTP/1.0 200 OK\nContent-Length: 2\n\nOK" - c.debug_dev = str = '' - c.get_content('http://photos.example.net/photos', [[:file, 'vacation.jpg'], [:size, 'original']]) - assert(str.index(%q(GET /photos?file=vacation.jpg&size=original))) - assert(str.index(%q(Authorization: OAuth realm="http://photos.example.net/", oauth_consumer_key="dpf43f3p2l4k3l03", oauth_nonce="kllo9940pd9333jh", oauth_signature="tR3%2BTy81lMeYAr%2FFid0kMTYa%2FWM%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1191242096", oauth_token="nnch734d00sl2jdk", oauth_version="1.0"))) - # - c.test_loopback_http_response << "HTTP/1.0 200 OK\nContent-Length: 2\n\nOK" - c.debug_dev = str = '' - c.get_content('http://photos.example.net/photos?file=vacation.jpg&size=original') - assert(str.index(%q(GET /photos?file=vacation.jpg&size=original))) - assert(str.index(%q(Authorization: OAuth realm="http://photos.example.net/", oauth_consumer_key="dpf43f3p2l4k3l03", oauth_nonce="kllo9940pd9333jh", oauth_signature="tR3%2BTy81lMeYAr%2FFid0kMTYa%2FWM%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1191242096", oauth_token="nnch734d00sl2jdk", oauth_version="1.0"))) - # - c.test_loopback_http_response << "HTTP/1.0 200 OK\nContent-Length: 2\n\nOK" - c.debug_dev = str = '' - c.post_content('http://photos.example.net/photos', [[:file, 'vacation.jpg'], [:size, 'original']]) - assert(str.index(%q(POST /photos))) - assert(str.index(%q(Authorization: OAuth realm="http://photos.example.net/", oauth_consumer_key="dpf43f3p2l4k3l03", oauth_nonce="kllo9940pd9333jh", oauth_signature="wPkvxykrw%2BBTdCcGqKr%2B3I%2BPsiM%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1191242096", oauth_token="nnch734d00sl2jdk", oauth_version="1.0"))) - end - - def test_basic_auth_post_with_multipart - retry_times = 0 - begin - c = HTTPClient.new - c.set_auth("http://localhost:#{serverport}/", 'admin', 'admin') - File.open(__FILE__) do |f| - # read 'f' twice for authorization negotiation - assert_equal('basic_auth OK', c.post("http://localhost:#{serverport}/basic_auth", :file => f).content) - end - rescue Errno::ECONNRESET, HTTPClient::KeepAliveDisconnected - # TODO: WEBrick server returns ECONNRESET/EPIPE before sending Unauthorized response to client? - raise if retry_times > 5 - retry_times += 1 - sleep 1 - retry - end - end - - def test_negotiate_and_basic - c = HTTPClient.new - c.test_loopback_http_response << %Q(HTTP/1.1 401 Unauthorized\r\nWWW-Authenticate: NTLM\r\nWWW-Authenticate: Basic realm="foo"\r\nConnection: Keep-Alive\r\nContent-Length: 0\r\n\r\n) - c.test_loopback_http_response << %Q(HTTP/1.1 401 Unauthorized\r\nWWW-Authenticate: NTLM TlRMTVNTUAACAAAAAAAAACgAAAABAAAAAAAAAAAAAAA=\r\nConnection: Keep-Alive\r\nContent-Length: 0\r\n\r\n) - c.test_loopback_http_response << %Q(HTTP/1.0 200 OK\r\nConnection: Keep-Alive\r\nContent-Length: 1\r\n\r\na) - c.test_loopback_http_response << %Q(HTTP/1.0 200 OK\r\nConnection: Keep-Alive\r\nContent-Length: 1\r\n\r\nb) - c.debug_dev = str = '' - c.set_auth('http://www.example.org/', 'admin', 'admin') - # Do NTLM negotiation - c.get('http://www.example.org/foo') - # BasicAuth authenticator should not respond to it because NTLM - # negotiation has been finished. - assert_match(%r(Authorization: NTLM), str) - assert_not_match(%r(Authorization: Basic), str) - # ditto for other resource that is protected with NTLM - c.debug_dev = str = '' - c.get('http://www.example.org/foo/subdir') - assert_not_match(%r(Authorization: NTLM), str) - assert_not_match(%r(Authorization: Basic), str) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/test_cookie.rb b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/test_cookie.rb deleted file mode 100644 index 57be1e0..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/test_cookie.rb +++ /dev/null @@ -1,309 +0,0 @@ -require 'test/unit' -require 'uri' -require 'tempfile' - -require 'httpclient/util' -require 'httpclient/cookie' - -class TestCookie < Test::Unit::TestCase - include HTTPClient::Util - - def setup() - @c = WebAgent::Cookie.new('hoge', 'funi') - end - - def test_s_new() - assert_instance_of(WebAgent::Cookie, @c) - end -end - -class TestCookieManager < Test::Unit::TestCase - include HTTPClient::Util - - def setup() - @cm = WebAgent::CookieManager.new() - end - - def teardown() - end - - def test_parse() - str = "inkid=n92b0ADOgACIgUb9lsjHqAAAHu2a; expires=Wed, 01-Dec-2999 00:00:00 GMT; path=/" - @cm.parse(str, urify('http://www.test.jp')) - cookie = @cm.cookies[0] - assert_instance_of(WebAgent::Cookie, cookie) - assert_equal("inkid", cookie.name) - assert_equal("n92b0ADOgACIgUb9lsjHqAAAHu2a", cookie.value) - assert_equal(Time.gm(2999, 12, 1, 0,0,0), cookie.expires) - assert_equal("/", cookie.path) - end - - def test_parse2() - str = "xmen=off,0,0,1; path=/; domain=.excite.co.jp; expires=Wednesday, 31-Dec-2037 12:00:00 GMT" - @cm.parse(str, urify('http://www.excite.co.jp')) - cookie = @cm.cookies[0] - assert_instance_of(WebAgent::Cookie, cookie) - assert_equal("xmen", cookie.name) - assert_equal("off,0,0,1", cookie.value) - assert_equal("/", cookie.path) - assert_equal("excite.co.jp", cookie.domain) - assert_equal(".excite.co.jp", cookie.dot_domain) - assert_equal(Time.gm(2037,12,31,12,0,0), cookie.expires) - end - - def test_parse3() - str = "xmen=off,0,0,1; path=/; domain=.excite.co.jp; expires=Wednesday, 31-Dec-2037 12:00:00 GMT;Secure;HTTPOnly" - @cm.parse(str, urify('http://www.excite.co.jp')) - cookie = @cm.cookies[0] - assert_instance_of(WebAgent::Cookie, cookie) - assert_equal("xmen", cookie.name) - assert_equal("off,0,0,1", cookie.value) - assert_equal("/", cookie.path) - assert_equal("excite.co.jp", cookie.domain) - assert_equal(".excite.co.jp", cookie.dot_domain) - assert_equal(Time.gm(2037,12,31,12,0,0), cookie.expires) - assert_equal(true, cookie.secure?) - assert_equal(true, cookie.http_only?) - end - - def test_parse_double_semicolon() - str = "xmen=off,0,0,1;; path=\"/;;\"; domain=.excite.co.jp; expires=Wednesday, 31-Dec-2037 12:00:00 GMT" - @cm.parse(str, urify('http://www.excite.co.jp')) - cookie = @cm.cookies[0] - assert_instance_of(WebAgent::Cookie, cookie) - assert_equal("xmen", cookie.name) - assert_equal("off,0,0,1", cookie.value) - assert_equal("/;;", cookie.path) - assert_equal("excite.co.jp", cookie.domain) - assert_equal(".excite.co.jp", cookie.dot_domain) - assert_equal(Time.gm(2037,12,31,12,0,0), cookie.expires) - end - -# def test_make_portlist() -# assert_equal([80,8080], @cm.instance_eval{make_portlist("80,8080")}) -# assert_equal([80], @cm.instance_eval{make_portlist("80")}) -# assert_equal([80,8080,10080], @cm.instance_eval{make_portlist(" 80, 8080, 10080 \n")}) -# end - - def test_check_expired_cookies() - format = "%a, %d-%b-%Y %H:%M:%S GMT" - c1 = WebAgent::Cookie.new('hoge1', 'funi', :domain => 'http://www.example.com/', :path => '/') - c2 = WebAgent::Cookie.new('hoge2', 'funi', :domain => 'http://www.example.com/', :path => '/') - c3 = WebAgent::Cookie.new('hoge3', 'funi', :domain => 'http://www.example.com/', :path => '/') - c4 = WebAgent::Cookie.new('hoge4', 'funi', :domain => 'http://www.example.com/', :path => '/') - c1.expires = (Time.now - 100).gmtime.strftime(format) - c2.expires = (Time.now + 100).gmtime.strftime(format) - c3.expires = (Time.now - 10).gmtime.strftime(format) - c4.expires = nil - cookies = [c1,c2,c3,c4] - @cm.cookies = cookies - assert_equal(c2.name, @cm.cookies[0].name) - assert_equal(c2.expires, @cm.cookies[0].expires) - assert_equal(c4.name, @cm.cookies[1].name) - assert_equal(c4.expires, @cm.cookies[1].expires) - end - - def test_parse_expires - str = "inkid=n92b0ADOgACIgUb9lsjHqAAAHu2a; expires=; path=/" - @cm.parse(str, urify('http://www.test.jp')) - cookie = @cm.cookies[0] - assert_equal("inkid", cookie.name) - assert_equal("n92b0ADOgACIgUb9lsjHqAAAHu2a", cookie.value) - assert_equal(nil, cookie.expires) - assert_equal("/", cookie.path) - # - str = "inkid=n92b0ADOgACIgUb9lsjHqAAAHu2a; path=/; expires=" - @cm.parse(str, urify('http://www.test.jp')) - cookie = @cm.cookies[0] - assert_equal("inkid", cookie.name) - assert_equal("n92b0ADOgACIgUb9lsjHqAAAHu2a", cookie.value) - assert_equal(nil, cookie.expires) - assert_equal("/", cookie.path) - # - str = "inkid=n92b0ADOgACIgUb9lsjHqAAAHu2a; path=/; expires=\"\"" - @cm.parse(str, urify('http://www.test.jp')) - cookie = @cm.cookies[0] - assert_equal("inkid", cookie.name) - assert_equal("n92b0ADOgACIgUb9lsjHqAAAHu2a", cookie.value) - assert_equal(nil, cookie.expires) - assert_equal("/", cookie.path) - end - - def test_parse_after_expiration - str = "inkid=n92b0ADOgACIgUb9lsjHqAAAHu2a; expires=Wed, 01-Dec-2999 00:00:00 GMT; path=/" - @cm.parse(str, urify('http://www.test.jp')) - cookie = @cm.cookies[0] - assert_instance_of(WebAgent::Cookie, cookie) - assert_equal("inkid", cookie.name) - assert_equal("n92b0ADOgACIgUb9lsjHqAAAHu2a", cookie.value) - assert_equal(Time.gm(2999, 12, 1, 0,0,0), cookie.expires) - assert_equal("/", cookie.path) - - time = Time.at(Time.now.to_i + 60).utc - expires = time.strftime("%a, %d-%b-%Y %H:%M:%S GMT") - str = "inkid=n92b0ADOgACIgUb9lsjHqAAAHu2a; expires=#{expires}; path=/" - @cm.parse(str, urify('http://www.test.jp')) - cookie = @cm.cookies[0] - assert_equal("inkid", cookie.name) - assert_equal("n92b0ADOgACIgUb9lsjHqAAAHu2a", cookie.value) - assert_equal(time, cookie.expires) - assert_equal("/", cookie.path) - end - - def test_find_cookie() - str = "xmen=off,0,0,1; path=/; domain=.excite2.co.jp; expires=Wednesday, 31-Dec-2037 12:00:00 GMT" - @cm.parse(str, urify("http://www.excite2.co.jp/")) - - str = "xmen=off,0,0,2; path=/; domain=.excite.co.jp; expires=Wednesday, 31-Dec-2037 12:00:00 GMT" - @cm.parse(str, urify("http://www.excite.co.jp/")) - - url = urify('http://www.excite.co.jp/hoge/funi/') - cookie_str = @cm.find(url) - assert_equal("xmen=\"off,0,0,2\"", cookie_str) - end - - def test_load_cookies() - cookiefile = Tempfile.new('test_cookie') - File.open(cookiefile.path, 'w') do |f| - f.write < same as URL - c.url = urify("http://www.inac.co.jp/hoge/hoge2/hoge3") - @cm.add(c) - # - c1, c2 = @cm.cookies - assert_equal('/hoge/hoge2/', c1.path) - assert_equal('/', c2.path) - end - - def test_keep_escaped - uri = urify('http://www.example.org') - - @cm.parse("bar=2; path=/", uri) - c = @cm.cookies.first - assert_equal('2', c.value) - assert_equal('bar=2', @cm.find(uri)) - - @cm.parse("bar=\"2\"; path=/", uri) - c = @cm.cookies.first - assert_equal('2', c.value) - assert_equal('bar=2', @cm.find(uri)) - - @cm.parse("bar=; path=/", uri) - c = @cm.cookies.first - assert_equal('', c.value) - assert_equal('bar=', @cm.find(uri)) - - @cm.parse("bar=\"\"; path=/", uri) - c = @cm.cookies.first - assert_equal('', c.value) - assert_equal('bar=', @cm.find(uri)) - end - - def test_load_cookies_escaped - uri = urify('http://example.org/') - f = Tempfile.new('test_cookie') - File.open(f.path, 'w') do |out| - out.write <= "1.9.0" -# Rubinius 1.8 mode does not support Regexp.quote(raw, 'n') I don't want put -# a pressure on supporting it because 1.9 mode works fine. diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/test_http-access2.rb b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/test_http-access2.rb deleted file mode 100644 index 732c044..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/test_http-access2.rb +++ /dev/null @@ -1,508 +0,0 @@ -# -*- encoding: utf-8 -*- -require 'http-access2' -require File.expand_path('helper', File.dirname(__FILE__)) -require 'tempfile' - - -module HTTPAccess2 - - -class TestClient < Test::Unit::TestCase - include Helper - include HTTPClient::Util - - def setup - super - setup_server - setup_client - end - - def teardown - super - end - - def test_initialize - setup_proxyserver - escape_noproxy do - @proxyio.string = "" - @client = HTTPAccess2::Client.new(proxyurl) - assert_equal(urify(proxyurl), @client.proxy) - assert_equal(200, @client.head(serverurl).status) - assert(!@proxyio.string.empty?) - end - end - - def test_agent_name - @client = HTTPAccess2::Client.new(nil, "agent_name_foo") - str = "" - @client.debug_dev = str - @client.get(serverurl) - lines = str.split(/(?:\r?\n)+/) - assert_equal("= Request", lines[0]) - assert_match(/^User-Agent: agent_name_foo/, lines[4]) - end - - def test_from - @client = HTTPAccess2::Client.new(nil, nil, "from_bar") - str = "" - @client.debug_dev = str - @client.get(serverurl) - lines = str.split(/(?:\r?\n)+/) - assert_equal("= Request", lines[0]) - assert_match(/^From: from_bar/, lines[5]) - end - - def test_debug_dev - str = "" - @client.debug_dev = str - assert(str.empty?) - @client.get(serverurl) - assert(!str.empty?) - end - - def _test_protocol_version_http09 - @client.protocol_version = 'HTTP/0.9' - str = "" - @client.debug_dev = str - @client.get(serverurl + 'hello') - lines = str.split(/(?:\r?\n)+/) - assert_equal("= Request", lines[0]) - assert_equal("! CONNECTION ESTABLISHED", lines[2]) - assert_equal("GET /hello HTTP/0.9", lines[3]) - assert_equal("Connection: close", lines[5]) - assert_equal("= Response", lines[6]) - assert_match(/^hello/, lines[7]) - end - - def test_protocol_version_http10 - @client.protocol_version = 'HTTP/1.0' - str = "" - @client.debug_dev = str - @client.get(serverurl + 'hello') - lines = str.split(/(?:\r?\n)+/) - assert_equal("= Request", lines[0]) - assert_equal("! CONNECTION ESTABLISHED", lines[2]) - assert_equal("GET /hello HTTP/1.0", lines[3]) - assert_equal("Connection: close", lines[7]) - assert_equal("= Response", lines[8]) - end - - def test_protocol_version_http11 - str = "" - @client.debug_dev = str - @client.get(serverurl) - lines = str.split(/(?:\r?\n)+/) - assert_equal("= Request", lines[0]) - assert_equal("! CONNECTION ESTABLISHED", lines[2]) - assert_equal("GET / HTTP/1.1", lines[3]) - assert_equal("Host: localhost:#{serverport}", lines[7]) - @client.protocol_version = 'HTTP/1.1' - str = "" - @client.debug_dev = str - @client.get(serverurl) - lines = str.split(/(?:\r?\n)+/) - assert_equal("= Request", lines[0]) - assert_equal("! CONNECTION ESTABLISHED", lines[2]) - assert_equal("GET / HTTP/1.1", lines[3]) - @client.protocol_version = 'HTTP/1.0' - str = "" - @client.debug_dev = str - @client.get(serverurl) - lines = str.split(/(?:\r?\n)+/) - assert_equal("= Request", lines[0]) - assert_equal("! CONNECTION ESTABLISHED", lines[2]) - assert_equal("GET / HTTP/1.0", lines[3]) - end - - def test_proxy - setup_proxyserver - escape_noproxy do - begin - @client.proxy = "http://あ" - rescue => e - assert_match(/InvalidURIError/, e.class.to_s) - end - @client.proxy = "" - assert_nil(@client.proxy) - @client.proxy = "http://foo:1234" - assert_equal(urify("http://foo:1234"), @client.proxy) - uri = urify("http://bar:2345") - @client.proxy = uri - assert_equal(uri, @client.proxy) - # - @proxyio.string = "" - @client.proxy = nil - assert_equal(200, @client.head(serverurl).status) - assert(@proxyio.string.empty?) - # - @proxyio.string = "" - @client.proxy = proxyurl - assert_equal(200, @client.head(serverurl).status) - assert(!@proxyio.string.empty?) - end - end - - def test_noproxy_for_localhost - @proxyio.string = "" - @client.proxy = proxyurl - assert_equal(200, @client.head(serverurl).status) - assert(@proxyio.string.empty?) - end - - def test_no_proxy - setup_proxyserver - escape_noproxy do - # proxy is not set. - @client.no_proxy = 'localhost' - @proxyio.string = "" - @client.proxy = nil - assert_equal(200, @client.head(serverurl).status) - assert(/accept/ !~ @proxyio.string) - # - @proxyio.string = "" - @client.proxy = proxyurl - assert_equal(200, @client.head(serverurl).status) - assert(/accept/ !~ @proxyio.string) - # - @client.no_proxy = 'foobar' - @proxyio.string = "" - @client.proxy = proxyurl - assert_equal(200, @client.head(serverurl).status) - assert(/accept/ =~ @proxyio.string) - # - @client.no_proxy = 'foobar,localhost:baz' - @proxyio.string = "" - @client.proxy = proxyurl - assert_equal(200, @client.head(serverurl).status) - assert(/accept/ !~ @proxyio.string) - # - @client.no_proxy = 'foobar,localhost:443' - @proxyio.string = "" - @client.proxy = proxyurl - assert_equal(200, @client.head(serverurl).status) - assert(/accept/ =~ @proxyio.string) - # - @client.no_proxy = "foobar,localhost:443:localhost:#{serverport},baz" - @proxyio.string = "" - @client.proxy = proxyurl - assert_equal(200, @client.head(serverurl).status) - assert(/accept/ !~ @proxyio.string) - end - end - - def test_get_content - assert_equal('hello', @client.get_content(serverurl + 'hello')) - assert_equal('hello', @client.get_content(serverurl + 'redirect1')) - assert_equal('hello', @client.get_content(serverurl + 'redirect2')) - assert_raises(HTTPClient::Session::BadResponse) do - @client.get_content(serverurl + 'notfound') - end - assert_raises(HTTPClient::Session::BadResponse) do - @client.get_content(serverurl + 'redirect_self') - end - called = false - @client.redirect_uri_callback = lambda { |uri, res| - newuri = res.header['location'][0] - called = true - newuri - } - assert_equal('hello', @client.get_content(serverurl + 'relative_redirect')) - assert(called) - end - - def test_post_content - assert_equal('hello', @client.post_content(serverurl + 'hello')) - assert_equal('hello', @client.post_content(serverurl + 'redirect1')) - assert_equal('hello', @client.post_content(serverurl + 'redirect2')) - assert_raises(HTTPClient::Session::BadResponse) do - @client.post_content(serverurl + 'notfound') - end - assert_raises(HTTPClient::Session::BadResponse) do - @client.post_content(serverurl + 'redirect_self') - end - called = false - @client.redirect_uri_callback = lambda { |uri, res| - newuri = res.header['location'][0] - called = true - newuri - } - assert_equal('hello', @client.post_content(serverurl + 'relative_redirect')) - assert(called) - end - - def test_head - assert_equal("head", @client.head(serverurl + 'servlet').header["x-head"][0]) - param = {'1'=>'2', '3'=>'4'} - res = @client.head(serverurl + 'servlet', param) - assert_equal(param, params(res.header["x-query"][0])) - end - - def test_get - assert_equal("get", @client.get(serverurl + 'servlet').content) - param = {'1'=>'2', '3'=>'4'} - res = @client.get(serverurl + 'servlet', param) - assert_equal(param, params(res.header["x-query"][0])) - end - - def test_post - assert_equal("post", @client.post(serverurl + 'servlet', '').content) - param = {'1'=>'2', '3'=>'4'} - res = @client.get(serverurl + 'servlet', param) - assert_equal(param, params(res.header["x-query"][0])) - end - - def test_put - assert_equal("put", @client.put(serverurl + 'servlet').content) - param = {'1'=>'2', '3'=>'4'} - res = @client.get(serverurl + 'servlet', param) - assert_equal(param, params(res.header["x-query"][0])) - end - - def test_delete - assert_equal("delete", @client.delete(serverurl + 'servlet').content) - param = {'1'=>'2', '3'=>'4'} - res = @client.get(serverurl + 'servlet', param) - assert_equal(param, params(res.header["x-query"][0])) - end - - def test_options - assert_equal("options", @client.options(serverurl + 'servlet').content) - param = {'1'=>'2', '3'=>'4'} - res = @client.get(serverurl + 'servlet', param) - assert_equal(param, params(res.header["x-query"][0])) - end - - def test_trace - assert_equal("trace", @client.trace(serverurl + 'servlet').content) - param = {'1'=>'2', '3'=>'4'} - res = @client.get(serverurl + 'servlet', param) - assert_equal(param, params(res.header["x-query"][0])) - end - - def test_get_query - assert_equal({'1'=>'2'}, check_query_get({1=>2})) - assert_equal({'a'=>'A', 'B'=>'b'}, check_query_get({"a"=>"A", "B"=>"b"})) - assert_equal({'&'=>'&'}, check_query_get({"&"=>"&"})) - assert_equal({'= '=>' =+'}, check_query_get({"= "=>" =+"})) - assert_equal( - ['=', '&'].sort, - check_query_get([["=", "="], ["=", "&"]])['='].to_ary.sort - ) - assert_equal({'123'=>'45'}, check_query_get('123=45')) - assert_equal({'12 3'=>'45', ' '=>' '}, check_query_get('12+3=45&+=+')) - assert_equal({}, check_query_get('')) - end - - def test_post_body - assert_equal({'1'=>'2'}, check_query_post({1=>2})) - assert_equal({'a'=>'A', 'B'=>'b'}, check_query_post({"a"=>"A", "B"=>"b"})) - assert_equal({'&'=>'&'}, check_query_post({"&"=>"&"})) - assert_equal({'= '=>' =+'}, check_query_post({"= "=>" =+"})) - assert_equal( - ['=', '&'].sort, - check_query_post([["=", "="], ["=", "&"]])['='].to_ary.sort - ) - assert_equal({'123'=>'45'}, check_query_post('123=45')) - assert_equal({'12 3'=>'45', ' '=>' '}, check_query_post('12+3=45&+=+')) - assert_equal({}, check_query_post('')) - # - post_body = StringIO.new("foo=bar&foo=baz") - assert_equal( - ["bar", "baz"], - check_query_post(post_body)["foo"].to_ary.sort - ) - end - - def test_extra_headers - str = "" - @client.debug_dev = str - @client.head(serverurl, nil, {"ABC" => "DEF"}) - lines = str.split(/(?:\r?\n)+/) - assert_equal("= Request", lines[0]) - assert_match("ABC: DEF", lines[4]) - # - str = "" - @client.debug_dev = str - @client.get(serverurl, nil, [["ABC", "DEF"], ["ABC", "DEF"]]) - lines = str.split(/(?:\r?\n)+/) - assert_equal("= Request", lines[0]) - assert_match("ABC: DEF", lines[4]) - assert_match("ABC: DEF", lines[5]) - end - - def test_timeout - assert_equal(60, @client.connect_timeout) - assert_equal(120, @client.send_timeout) - assert_equal(60, @client.receive_timeout) - end - - def test_connect_timeout - # ToDo - end - - def test_send_timeout - # ToDo - end - - def test_receive_timeout - # this test takes 2 sec - assert_equal('hello', @client.get_content(serverurl + 'sleep?sec=2')) - @client.reset_all - @client.receive_timeout = 1 - assert_equal('hello', @client.get_content(serverurl + 'sleep?sec=0')) - assert_raise(HTTPClient::ReceiveTimeoutError) do - @client.get_content(serverurl + 'sleep?sec=2') - end - @client.reset_all - @client.receive_timeout = 3 - assert_equal('hello', @client.get_content(serverurl + 'sleep?sec=2')) - end - - def test_cookies - cookiefile = Tempfile.new('test_cookies_file') - # from [ruby-talk:164079] - File.open(cookiefile.path, "wb") do |f| - f << "http://rubyforge.org//account/login.php session_ser LjEwMy45Ni40Ni0q%2A-fa0537de8cc31 2131676286 .rubyforge.org / 13\n" - end - cm = WebAgent::CookieManager::new(cookiefile.path) - cm.load_cookies - assert_equal(1, cm.cookies.size) - end - -private - - def check_query_get(query) - WEBrick::HTTPUtils.parse_query( - @client.get(serverurl + 'servlet', query).header["x-query"][0] - ) - end - - def check_query_post(query) - WEBrick::HTTPUtils.parse_query( - @client.post(serverurl + 'servlet', query).header["x-query"][0] - ) - end - - def setup_server - @server = WEBrick::HTTPServer.new( - :BindAddress => "localhost", - :Logger => @logger, - :Port => 0, - :AccessLog => [], - :DocumentRoot => File.dirname(File.expand_path(__FILE__)) - ) - @serverport = @server.config[:Port] - [:hello, :sleep, :redirect1, :redirect2, :redirect3, :redirect_self, :relative_redirect].each do |sym| - @server.mount( - "/#{sym}", - WEBrick::HTTPServlet::ProcHandler.new(method("do_#{sym}").to_proc) - ) - end - @server.mount('/servlet', TestServlet.new(@server)) - @server_thread = start_server_thread(@server) - end - - def escape_noproxy - backup = HTTPAccess2::Client::NO_PROXY_HOSTS.dup - HTTPAccess2::Client::NO_PROXY_HOSTS.clear - yield - ensure - HTTPAccess2::Client::NO_PROXY_HOSTS.replace(backup) - end - - def do_hello(req, res) - res['content-type'] = 'text/html' - res.body = "hello" - end - - def do_sleep(req, res) - sec = req.query['sec'].to_i - sleep sec - res['content-type'] = 'text/html' - res.body = "hello" - end - - def do_redirect1(req, res) - res.set_redirect(WEBrick::HTTPStatus::MovedPermanently, serverurl + "hello") - end - - def do_redirect2(req, res) - res.set_redirect(WEBrick::HTTPStatus::TemporaryRedirect, serverurl + "redirect3") - end - - def do_redirect3(req, res) - res.set_redirect(WEBrick::HTTPStatus::Found, serverurl + "hello") - end - - def do_redirect_self(req, res) - res.set_redirect(WEBrick::HTTPStatus::Found, serverurl + "redirect_self") - end - - def do_relative_redirect(req, res) - res.set_redirect(WEBrick::HTTPStatus::Found, "hello") - end - - class TestServlet < WEBrick::HTTPServlet::AbstractServlet - def get_instance(*arg) - self - end - - def do_HEAD(req, res) - res["x-head"] = 'head' # use this for test purpose only. - res["x-query"] = query_response(req) - end - - def do_GET(req, res) - res.body = 'get' - res["x-query"] = query_response(req) - end - - def do_POST(req, res) - res.body = 'post' - res["x-query"] = body_response(req) - end - - def do_PUT(req, res) - res.body = 'put' - end - - def do_DELETE(req, res) - res.body = 'delete' - end - - def do_OPTIONS(req, res) - # check RFC for legal response. - res.body = 'options' - end - - def do_TRACE(req, res) - # client SHOULD reflect the message received back to the client as the - # entity-body of a 200 (OK) response. [RFC2616] - res.body = 'trace' - res["x-query"] = query_response(req) - end - - private - - def query_response(req) - query_escape(WEBrick::HTTPUtils.parse_query(req.query_string)) - end - - def body_response(req) - query_escape(WEBrick::HTTPUtils.parse_query(req.body)) - end - - def query_escape(query) - escaped = [] - query.collect do |k, v| - v.to_ary.each do |ve| - escaped << CGI.escape(k) + '=' + CGI.escape(ve) - end - end - escaped.join('&') - end - end -end - - -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/test_httpclient.rb b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/test_httpclient.rb deleted file mode 100644 index c8e5330..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/test_httpclient.rb +++ /dev/null @@ -1,2145 +0,0 @@ -# -*- encoding: utf-8 -*- -require File.expand_path('helper', File.dirname(__FILE__)) -require 'tempfile' - - -class TestHTTPClient < Test::Unit::TestCase - include Helper - include HTTPClient::Util - - def setup - super - setup_server - setup_client - end - - def teardown - super - end - - def test_initialize - setup_proxyserver - escape_noproxy do - @proxyio.string = "" - @client = HTTPClient.new(proxyurl) - assert_equal(urify(proxyurl), @client.proxy) - assert_equal(200, @client.head(serverurl).status) - assert(/accept/ =~ @proxyio.string) - end - end - - def test_agent_name - @client = HTTPClient.new(nil, "agent_name_foo") - str = "" - @client.debug_dev = str - @client.get(serverurl) - lines = str.split(/(?:\r?\n)+/) - assert_equal("= Request", lines[0]) - assert_match(/^User-Agent: agent_name_foo \(#{HTTPClient::VERSION}/, lines[4]) - end - - def test_from - @client = HTTPClient.new(nil, nil, "from_bar") - str = "" - @client.debug_dev = str - @client.get(serverurl) - lines = str.split(/(?:\r?\n)+/) - assert_equal("= Request", lines[0]) - assert_match(/^From: from_bar/, lines[5]) - end - - def test_debug_dev - str = "" - @client.debug_dev = str - assert_equal(str.object_id, @client.debug_dev.object_id) - assert(str.empty?) - @client.get(serverurl) - assert(!str.empty?) - end - - def test_debug_dev_stream - str = "" - @client.debug_dev = str - conn = @client.get_async(serverurl) - Thread.pass while !conn.finished? - assert(!str.empty?) - end - - def test_protocol_version_http09 - @client.protocol_version = 'HTTP/0.9' - @client.debug_dev = str = '' - @client.test_loopback_http_response << "hello\nworld\n" - res = @client.get(serverurl + 'hello') - assert_equal('0.9', res.http_version) - assert_equal(nil, res.status) - assert_equal(nil, res.reason) - assert_equal("hello\nworld\n", res.content) - lines = str.split(/(?:\r?\n)+/) - assert_equal("= Request", lines[0]) - assert_equal("! CONNECTION ESTABLISHED", lines[2]) - assert_equal("GET /hello HTTP/0.9", lines[3]) - assert_equal("Connection: close", lines[7]) - assert_equal("= Response", lines[8]) - assert_match(/^hello$/, lines[9]) - assert_match(/^world$/, lines[10]) - end - - def test_protocol_version_http10 - assert_equal(nil, @client.protocol_version) - @client.protocol_version = 'HTTP/1.0' - assert_equal('HTTP/1.0', @client.protocol_version) - str = "" - @client.debug_dev = str - @client.get(serverurl + 'hello') - lines = str.split(/(?:\r?\n)+/) - assert_equal("= Request", lines[0]) - assert_equal("! CONNECTION ESTABLISHED", lines[2]) - assert_equal("GET /hello HTTP/1.0", lines[3]) - assert_equal("Connection: close", lines[7]) - assert_equal("= Response", lines[8]) - end - - def test_header_accept_by_default - str = "" - @client.debug_dev = str - @client.get(serverurl) - lines = str.split(/(?:\r?\n)+/) - assert_equal("Accept: */*", lines[5]) - end - - def test_header_accept - str = "" - @client.debug_dev = str - @client.get(serverurl, :header => {:Accept => 'text/html'}) - lines = str.split(/(?:\r?\n)+/) - assert_equal("Accept: text/html", lines[4]) - end - - def test_header_symbol - str = "" - @client.debug_dev = str - @client.post(serverurl + 'servlet', :header => {:'Content-Type' => 'application/json'}, :body => 'hello') - lines = str.split(/(?:\r?\n)+/).grep(/^Content-Type/) - assert_equal(2, lines.size) # 1 for both request and response - end - - def test_host_given - str = "" - @client.debug_dev = str - @client.get(serverurl) - lines = str.split(/(?:\r?\n)+/) - assert_equal("= Request", lines[0]) - assert_equal("! CONNECTION ESTABLISHED", lines[2]) - assert_equal("GET / HTTP/1.1", lines[3]) - assert_equal("Host: localhost:#{serverport}", lines[7]) - # - @client.reset_all - str = "" - @client.debug_dev = str - @client.get(serverurl, nil, {'Host' => 'foo'}) - lines = str.split(/(?:\r?\n)+/) - assert_equal("= Request", lines[0]) - assert_equal("! CONNECTION ESTABLISHED", lines[2]) - assert_equal("GET / HTTP/1.1", lines[3]) - assert_equal("Host: foo", lines[4]) # use given param - end - - def test_redirect_returns_not_modified - assert_nothing_raised do - ::Timeout.timeout(2) do - @client.get(serverurl + 'status', {:status => 306}, {:follow_redirect => true}) - end - end - end - - class LocationRemoveFilter - def filter_request(req); end - def filter_response(req, res); res.header.delete('Location'); end - end - - def test_redirect_without_location_should_gracefully_fail - @client.request_filter << LocationRemoveFilter.new - assert_raises(HTTPClient::BadResponseError) do - @client.get(serverurl + 'redirect1', :follow_redirect => true) - end - end - - def test_protocol_version_http11 - assert_equal(nil, @client.protocol_version) - str = "" - @client.debug_dev = str - @client.get(serverurl) - lines = str.split(/(?:\r?\n)+/) - assert_equal("= Request", lines[0]) - assert_equal("! CONNECTION ESTABLISHED", lines[2]) - assert_equal("GET / HTTP/1.1", lines[3]) - assert_equal("Host: localhost:#{serverport}", lines[7]) - @client.protocol_version = 'HTTP/1.1' - assert_equal('HTTP/1.1', @client.protocol_version) - str = "" - @client.debug_dev = str - @client.get(serverurl) - lines = str.split(/(?:\r?\n)+/) - assert_equal("= Request", lines[0]) - assert_equal("! CONNECTION ESTABLISHED", lines[2]) - assert_equal("GET / HTTP/1.1", lines[3]) - @client.protocol_version = 'HTTP/1.0' - str = "" - @client.debug_dev = str - @client.get(serverurl) - lines = str.split(/(?:\r?\n)+/) - assert_equal("= Request", lines[0]) - assert_equal("! CONNECTION ESTABLISHED", lines[2]) - assert_equal("GET / HTTP/1.0", lines[3]) - end - - def test_proxy - setup_proxyserver - escape_noproxy do - begin - @client.proxy = "http://あ" - rescue => e - assert_match(/InvalidURIError/, e.class.to_s) - end - @client.proxy = "" - assert_nil(@client.proxy) - @client.proxy = "http://admin:admin@foo:1234" - assert_equal(urify("http://admin:admin@foo:1234"), @client.proxy) - uri = urify("http://bar:2345") - @client.proxy = uri - assert_equal(uri, @client.proxy) - # - @proxyio.string = "" - @client.proxy = nil - assert_equal(200, @client.head(serverurl).status) - assert(/accept/ !~ @proxyio.string) - # - @proxyio.string = "" - @client.proxy = proxyurl - @client.debug_dev = str = "" - assert_equal(200, @client.head(serverurl).status) - assert(/accept/ =~ @proxyio.string) - assert(/Host: localhost:#{serverport}/ =~ str) - end - end - - def test_host_header - @client.proxy = proxyurl - @client.debug_dev = str = "" - @client.test_loopback_http_response << "HTTP/1.0 200 OK\r\n\r\n" - assert_equal(200, @client.head('http://www.example.com/foo').status) - # ensure no ':80' is added. some servers dislike that. - assert(/\r\nHost: www\.example\.com\r\n/ =~ str) - # - @client.debug_dev = str = "" - @client.test_loopback_http_response << "HTTP/1.0 200 OK\r\n\r\n" - assert_equal(200, @client.head('http://www.example.com:12345/foo').status) - # ensure ':12345' exists. - assert(/\r\nHost: www\.example\.com:12345\r\n/ =~ str) - end - - def test_proxy_env - setup_proxyserver - escape_env do - ENV['http_proxy'] = "http://admin:admin@foo:1234" - ENV['NO_PROXY'] = "foobar" - client = HTTPClient.new - assert_equal(urify("http://admin:admin@foo:1234"), client.proxy) - assert_equal('foobar', client.no_proxy) - end - end - - def test_proxy_env_cgi - setup_proxyserver - escape_env do - ENV['REQUEST_METHOD'] = 'GET' # CGI environment emulation - ENV['http_proxy'] = "http://admin:admin@foo:1234" - ENV['no_proxy'] = "foobar" - client = HTTPClient.new - assert_equal(nil, client.proxy) - ENV['CGI_HTTP_PROXY'] = "http://admin:admin@foo:1234" - client = HTTPClient.new - assert_equal(urify("http://admin:admin@foo:1234"), client.proxy) - end - end - - def test_empty_proxy_env - setup_proxyserver - escape_env do - ENV['http_proxy'] = "" - client = HTTPClient.new - assert_equal(nil, client.proxy) - end - end - - def test_noproxy_for_localhost - @proxyio.string = "" - @client.proxy = proxyurl - assert_equal(200, @client.head(serverurl).status) - assert(/accept/ !~ @proxyio.string) - end - - def test_no_proxy - setup_proxyserver - escape_noproxy do - # proxy is not set. - assert_equal(nil, @client.no_proxy) - @client.no_proxy = 'localhost' - assert_equal('localhost', @client.no_proxy) - @proxyio.string = "" - @client.proxy = nil - assert_equal(200, @client.head(serverurl).status) - assert(/accept/ !~ @proxyio.string) - # - @proxyio.string = "" - @client.proxy = proxyurl - assert_equal(200, @client.head(serverurl).status) - assert(/accept/ !~ @proxyio.string) - # - @client.no_proxy = 'foobar' - @proxyio.string = "" - @client.proxy = proxyurl - assert_equal(200, @client.head(serverurl).status) - assert(/accept/ =~ @proxyio.string) - # - @client.no_proxy = 'foobar,localhost:baz' - @proxyio.string = "" - @client.proxy = proxyurl - assert_equal(200, @client.head(serverurl).status) - assert(/accept/ !~ @proxyio.string) - # - @client.no_proxy = 'foobar,localhost:443' - @proxyio.string = "" - @client.proxy = proxyurl - assert_equal(200, @client.head(serverurl).status) - assert(/accept/ =~ @proxyio.string) - # - @client.no_proxy = "foobar,localhost:443:localhost:#{serverport},baz" - @proxyio.string = "" - @client.proxy = proxyurl - assert_equal(200, @client.head(serverurl).status) - assert(/accept/ !~ @proxyio.string) - end - end - - def test_no_proxy_with_initial_dot - @client.debug_dev = str = "" - @client.test_loopback_http_response << "HTTP/1.0 200 OK\r\n\r\n" - @client.no_proxy = '' - @client.proxy = proxyurl - @client.head('http://www.foo.com') - assert(/CONNECT TO localhost/ =~ str, 'via proxy') - # - @client.debug_dev = str = "" - @client.test_loopback_http_response << "HTTP/1.0 200 OK\r\n\r\n" - @client.no_proxy = '.foo.com' - @client.proxy = proxyurl - @client.head('http://www.foo.com') - assert(/CONNECT TO www.foo.com/ =~ str, 'no proxy because .foo.com matches with www.foo.com') - # - @client.debug_dev = str = "" - @client.test_loopback_http_response << "HTTP/1.0 200 OK\r\n\r\n" - @client.no_proxy = '.foo.com' - @client.proxy = proxyurl - @client.head('http://foo.com') - assert(/CONNECT TO localhost/ =~ str, 'via proxy because .foo.com does not matche with foo.com') - # - @client.debug_dev = str = "" - @client.test_loopback_http_response << "HTTP/1.0 200 OK\r\n\r\n" - @client.no_proxy = 'foo.com' - @client.proxy = proxyurl - @client.head('http://foo.com') - assert(/CONNECT TO foo.com/ =~ str, 'no proxy because foo.com matches with foo.com') - end - - def test_cookie_update_while_authentication - escape_noproxy do - @client.test_loopback_http_response << < true).header.request_uri) - assert_equal(expected, @client.get(serverurl + 'redirect2', :follow_redirect => true).header.request_uri) - end - - def test_redirect_non_https - url = serverurl + 'redirect1' - https_url = urify(url) - https_url.scheme = 'https' - # - redirect_to_http = "HTTP/1.0 302 OK\nLocation: #{url}\n\n" - redirect_to_https = "HTTP/1.0 302 OK\nLocation: #{https_url}\n\n" - # - # https -> http is denied - @client.test_loopback_http_response << redirect_to_http - assert_raises(HTTPClient::BadResponseError) do - @client.get_content(https_url) - end - # - # http -> http is OK - @client.reset_all - @client.test_loopback_http_response << redirect_to_http - assert_equal('hello', @client.get_content(url)) - # - # http -> https is OK - @client.reset_all - @client.test_loopback_http_response << redirect_to_https - assert_raises(OpenSSL::SSL::SSLError) do - # trying to normal endpoint with SSL -> SSL negotiation failure - @client.get_content(url) - end - # - # https -> https is OK - @client.reset_all - @client.test_loopback_http_response << redirect_to_https - assert_raises(OpenSSL::SSL::SSLError) do - # trying to normal endpoint with SSL -> SSL negotiation failure - @client.get_content(https_url) - end - # - # https -> http with strict_redirect_uri_callback - @client.redirect_uri_callback = @client.method(:strict_redirect_uri_callback) - @client.test_loopback_http_response << redirect_to_http - assert_raises(HTTPClient::BadResponseError) do - @client.get_content(https_url) - end - end - - def test_redirect_see_other - assert_equal('hello', @client.post_content(serverurl + 'redirect_see_other')) - end - - def test_redirect_relative - @client.test_loopback_http_response << "HTTP/1.0 302 OK\nLocation: hello\n\n" - silent do - assert_equal('hello', @client.get_content(serverurl + 'redirect1')) - end - # - @client.reset_all - @client.redirect_uri_callback = @client.method(:strict_redirect_uri_callback) - assert_equal('hello', @client.get_content(serverurl + 'redirect1')) - @client.reset_all - @client.test_loopback_http_response << "HTTP/1.0 302 OK\nLocation: hello\n\n" - begin - @client.get_content(serverurl + 'redirect1') - assert(false) - rescue HTTPClient::BadResponseError => e - assert_equal(302, e.res.status) - end - end - - def test_redirect_https_relative - url = serverurl + 'redirect1' - https_url = urify(url) - https_url.scheme = 'https' - @client.test_loopback_http_response << "HTTP/1.0 302 OK\nLocation: /foo\n\n" - @client.test_loopback_http_response << "HTTP/1.0 200 OK\n\nhello" - silent do - assert_equal('hello', @client.get_content(https_url)) - end - end - - def test_no_content - assert_nothing_raised do - ::Timeout.timeout(2) do - @client.get(serverurl + 'status', :status => 101) - @client.get(serverurl + 'status', :status => 204) - @client.get(serverurl + 'status', :status => 304) - end - end - end - - def test_get_content - assert_equal('hello', @client.get_content(serverurl + 'hello')) - assert_equal('hello', @client.get_content(serverurl + 'redirect1')) - assert_equal('hello', @client.get_content(serverurl + 'redirect2')) - url = serverurl.sub(/localhost/, '127.0.0.1') - assert_equal('hello', @client.get_content(url + 'hello')) - assert_equal('hello', @client.get_content(url + 'redirect1')) - assert_equal('hello', @client.get_content(url + 'redirect2')) - @client.reset(serverurl) - @client.reset(url) - @client.reset(serverurl) - @client.reset(url) - assert_raises(HTTPClient::BadResponseError) do - @client.get_content(serverurl + 'notfound') - end - assert_raises(HTTPClient::BadResponseError) do - @client.get_content(serverurl + 'redirect_self') - end - called = false - @client.redirect_uri_callback = lambda { |uri, res| - newuri = res.header['location'][0] - called = true - newuri - } - assert_equal('hello', @client.get_content(serverurl + 'relative_redirect')) - assert(called) - end - - def test_get_content_with_base_url - @client = HTTPClient.new(:base_url => serverurl) - assert_equal('hello', @client.get_content('/hello')) - assert_equal('hello', @client.get_content('/redirect1')) - assert_equal('hello', @client.get_content('/redirect2')) - @client.reset('/') - assert_raises(HTTPClient::BadResponseError) do - @client.get_content('/notfound') - end - assert_raises(HTTPClient::BadResponseError) do - @client.get_content('/redirect_self') - end - called = false - @client.redirect_uri_callback = lambda { |uri, res| - newuri = res.header['location'][0] - called = true - newuri - } - assert_equal('hello', @client.get_content('/relative_redirect')) - assert(called) - end - - GZIP_CONTENT = "\x1f\x8b\x08\x00\x1a\x96\xe0\x4c\x00\x03\xcb\x48\xcd\xc9\xc9\x07\x00\x86\xa6\x10\x36\x05\x00\x00\x00" - DEFLATE_CONTENT = "\x78\x9c\xcb\x48\xcd\xc9\xc9\x07\x00\x06\x2c\x02\x15" - DEFLATE_NOHEADER_CONTENT = "x\x9C\xCBH\xCD\xC9\xC9\a\x00\x06,\x02\x15" - [GZIP_CONTENT, DEFLATE_CONTENT, DEFLATE_NOHEADER_CONTENT].each do |content| - content.force_encoding('BINARY') if content.respond_to?(:force_encoding) - end - def test_get_gzipped_content - @client.transparent_gzip_decompression = false - content = @client.get_content(serverurl + 'compressed?enc=gzip') - assert_not_equal('hello', content) - assert_equal(GZIP_CONTENT, content) - @client.transparent_gzip_decompression = true - @client.reset_all - assert_equal('hello', @client.get_content(serverurl + 'compressed?enc=gzip')) - assert_equal('hello', @client.get_content(serverurl + 'compressed?enc=deflate')) - assert_equal('hello', @client.get_content(serverurl + 'compressed?enc=deflate_noheader')) - @client.transparent_gzip_decompression = false - @client.reset_all - end - - def test_get_content_with_block - @client.get_content(serverurl + 'hello') do |str| - assert_equal('hello', str) - end - @client.get_content(serverurl + 'redirect1') do |str| - assert_equal('hello', str) - end - @client.get_content(serverurl + 'redirect2') do |str| - assert_equal('hello', str) - end - end - - def test_post_content - assert_equal('hello', @client.post_content(serverurl + 'hello')) - assert_equal('hello', @client.post_content(serverurl + 'redirect1')) - assert_equal('hello', @client.post_content(serverurl + 'redirect2')) - assert_raises(HTTPClient::BadResponseError) do - @client.post_content(serverurl + 'notfound') - end - assert_raises(HTTPClient::BadResponseError) do - @client.post_content(serverurl + 'redirect_self') - end - called = false - @client.redirect_uri_callback = lambda { |uri, res| - newuri = res.header['location'][0] - called = true - newuri - } - assert_equal('hello', @client.post_content(serverurl + 'relative_redirect')) - assert(called) - end - - def test_post_content_io - post_body = StringIO.new("1234567890") - assert_equal('post,1234567890', @client.post_content(serverurl + 'servlet', post_body)) - post_body = StringIO.new("1234567890") - assert_equal('post,1234567890', @client.post_content(serverurl + 'servlet_redirect', post_body)) - # - post_body = StringIO.new("1234567890") - post_body.read(5) - assert_equal('post,67890', @client.post_content(serverurl + 'servlet_redirect', post_body)) - end - - def test_head - assert_equal("head", @client.head(serverurl + 'servlet').header["x-head"][0]) - param = {'1'=>'2', '3'=>'4'} - res = @client.head(serverurl + 'servlet', param) - assert_equal(param, params(res.header["x-query"][0])) - end - - def test_head_async - param = {'1'=>'2', '3'=>'4'} - conn = @client.head_async(serverurl + 'servlet', param) - Thread.pass while !conn.finished? - res = conn.pop - assert_equal(param, params(res.header["x-query"][0])) - end - - def test_get - assert_equal("get", @client.get(serverurl + 'servlet').content) - param = {'1'=>'2', '3'=>'4'} - res = @client.get(serverurl + 'servlet', param) - assert_equal(param, params(res.header["x-query"][0])) - assert_nil(res.contenttype) - # - url = serverurl.to_s + 'servlet?5=6&7=8' - res = @client.get(url, param) - assert_equal(param.merge("5"=>"6", "7"=>"8"), params(res.header["x-query"][0])) - assert_nil(res.contenttype) - end - - def test_get_with_base_url - @client = HTTPClient.new(:base_url => serverurl) - assert_equal("get", @client.get('/servlet').content) - param = {'1'=>'2', '3'=>'4'} - res = @client.get('/servlet', param) - assert_equal(param, params(res.header["x-query"][0])) - assert_nil(res.contenttype) - # - @client.base_url = serverurl[0...-1] + '/servlet' - url = '?5=6&7=8' - res = @client.get(url, param) - assert_equal(param.merge("5"=>"6", "7"=>"8"), params(res.header["x-query"][0])) - assert_nil(res.contenttype) - end - - def test_get_with_default_header - @client = HTTPClient.new(:base_url => serverurl, :default_header => {'x-header' => 'custom'}) - assert_equal('custom', @client.get('/servlet').headers['X-Header']) - @client.default_header = {'x-header' => 'custom2'} - assert_equal('custom2', @client.get('/servlet').headers['X-Header']) - # passing Hash overrides - assert_equal('custom3', @client.get('/servlet', :header => {'x-header' => 'custom3'}).headers['X-Header']) - # passing Array does not override - assert_equal('custom2, custom4', @client.get('/servlet', :header => [['x-header', 'custom4']]).headers['X-Header']) - end - - def test_head_follow_redirect - expected = urify(serverurl + 'hello') - assert_equal(expected, @client.head(serverurl + 'hello', :follow_redirect => true).header.request_uri) - assert_equal(expected, @client.head(serverurl + 'redirect1', :follow_redirect => true).header.request_uri) - assert_equal(expected, @client.head(serverurl + 'redirect2', :follow_redirect => true).header.request_uri) - end - - def test_get_follow_redirect - assert_equal('hello', @client.get(serverurl + 'hello', :follow_redirect => true).body) - assert_equal('hello', @client.get(serverurl + 'redirect1', :follow_redirect => true).body) - - res = @client.get(serverurl + 'redirect2', :follow_redirect => true) - assert_equal('hello', res.body) - assert_equal("http://localhost:#{@serverport}/hello", res.header.request_uri.to_s) - assert_equal("http://localhost:#{@serverport}/redirect3", res.previous.header.request_uri.to_s) - assert_equal("http://localhost:#{@serverport}/redirect2", res.previous.previous.header.request_uri.to_s) - assert_equal(nil, res.previous.previous.previous) - end - - def test_get_follow_redirect_with_query - assert_equal('hello?1=2&3=4', @client.get(serverurl + 'redirect1', :query => {1 => 2, 3 => 4}, :follow_redirect => true).body) - end - - def test_get_async - param = {'1'=>'2', '3'=>'4'} - conn = @client.get_async(serverurl + 'servlet', param) - Thread.pass while !conn.finished? - res = conn.pop - assert_equal(param, params(res.header["x-query"][0])) - end - - def test_get_async_with_base_url - param = {'1'=>'2', '3'=>'4'} - @client = HTTPClient.new(:base_url => serverurl) - - # Use preconfigured :base_url - conn = @client.get_async('servlet', param) - Thread.pass while !conn.finished? - res = conn.pop - assert_equal(param, params(res.header["x-query"][0])) - # full URL still works - conn = @client.get_async(serverurl + 'servlet', param) - Thread.pass while !conn.finished? - res = conn.pop - assert_equal(param, params(res.header["x-query"][0])) - end - - def test_get_async_for_largebody - conn = @client.get_async(serverurl + 'largebody') - res = conn.pop - assert_equal(1000*1000, res.content.read.length) - end - - if RUBY_VERSION > "1.9" - def test_post_async_with_default_internal - original_encoding = Encoding.default_internal - Encoding.default_internal = Encoding::UTF_8 - begin - post_body = StringIO.new("こんにちは") - conn = @client.post_async(serverurl + 'servlet', post_body) - Thread.pass while !conn.finished? - res = conn.pop - assert_equal 'post,こんにちは', res.content.read - ensure - Encoding.default_internal = original_encoding - end - end - end - - def test_get_with_block - called = false - res = @client.get(serverurl + 'servlet') { |str| - assert_equal('get', str) - called = true - } - assert(called) - # res does not have a content - assert_nil(res.content) - end - - def test_get_with_block_arity_2 - called = false - res = @client.get(serverurl + 'servlet') { |blk_res, str| - assert_equal(200, blk_res.status) - assert_equal('get', str) - called = true - } - assert(called) - # res does not have a content - assert_nil(res.content) - end - - def test_get_with_block_and_redirects - called = false - res = @client.get(serverurl + 'servlet', :follow_redirect => true) { |str| - assert_equal('get', str) - called = true - } - assert(called) - # res does not have a content - assert_nil(res.content) - end - - def test_get_with_block_arity_2_and_redirects - called = false - res = @client.get(serverurl + 'servlet', :follow_redirect => true) { |blk_res, str| - assert_equal(200, blk_res.status) - assert_equal('get', str) - called = true - } - assert(called) - # res does not have a content - assert_nil(res.content) - end - - def test_get_with_block_string_recycle - @client.read_block_size = 2 - body = [] - _res = @client.get(serverurl + 'servlet') { |str| - body << str - } - assert_equal(2, body.size) - assert_equal("get", body.join) # Was "tt" by String object recycle... - end - - def test_get_with_block_chunked_string_recycle - server = TCPServer.open('localhost', 0) - server_thread = Thread.new { - Thread.abort_on_exception = true - sock = server.accept - create_keepalive_thread(1, sock) - } - url = "http://localhost:#{server.addr[1]}/" - body = [] - begin - _res = @client.get(url + 'chunked') { |str| - body << str - } - ensure - server.close - server_thread.join - end - assert_equal('abcdefghijklmnopqrstuvwxyz1234567890abcdef', body.join) - end - - def test_post - assert_equal("post", @client.post(serverurl + 'servlet', '').content[0, 4]) - param = {'1'=>'2', '3'=>'4'} - res = @client.post(serverurl + 'servlet', param) - assert_equal(param, params(res.header["x-query"][0])) - end - - def test_post_empty - @client.debug_dev = str = '' - # nil body means 'no content' that is allowed but WEBrick cannot handle it. - @client.post(serverurl + 'servlet', :body => nil) - # request does not have 'Content-Type' - assert_equal(1, str.scan(/content-type/i).size) - end - - def test_post_with_query - # this {:query => 'query'} recognized as body - res = @client.post(serverurl + 'servlet', :query => 'query') - assert_equal("post", res.content[0, 4]) - assert_equal("query=query", res.headers["X-Query"]) - assert_equal("", res.headers["X-Request-Query"]) - end - - def test_post_with_query_and_body - res = @client.post(serverurl + 'servlet', :query => {:query => 'query'}, :body => {:body => 'body'}) - assert_equal("post", res.content[0, 4]) - assert_equal("body=body", res.headers["X-Query"]) - assert_equal("query=query", res.headers["X-Request-Query"]) - end - - def test_post_follow_redirect - assert_equal('hello', @client.post(serverurl + 'hello', :follow_redirect => true).body) - assert_equal('hello', @client.post(serverurl + 'redirect1', :follow_redirect => true).body) - assert_equal('hello', @client.post(serverurl + 'redirect2', :follow_redirect => true).body) - end - - def test_post_with_content_type - param = [['1', '2'], ['3', '4']] - ext = {'content-type' => 'application/x-www-form-urlencoded', 'hello' => 'world'} - assert_equal("post", @client.post(serverurl + 'servlet', '').content[0, 4], ext) - res = @client.post(serverurl + 'servlet', param, ext) - assert_equal(Hash[param], params(res.header["x-query"][0])) - # - ext = [['content-type', 'multipart/form-data'], ['hello', 'world']] - assert_equal("post", @client.post(serverurl + 'servlet', '').content[0, 4], ext) - res = @client.post(serverurl + 'servlet', param, ext) - assert_match(/Content-Disposition: form-data; name="1"/, res.content) - assert_match(/Content-Disposition: form-data; name="3"/, res.content) - # - ext = {'content-type' => 'multipart/form-data; boundary=hello'} - assert_equal("post", @client.post(serverurl + 'servlet', '').content[0, 4], ext) - res = @client.post(serverurl + 'servlet', param, ext) - assert_match(/Content-Disposition: form-data; name="1"/, res.content) - assert_match(/Content-Disposition: form-data; name="3"/, res.content) - assert_equal("post,--hello\r\nContent-Disposition: form-data; name=\"1\"\r\n\r\n2\r\n--hello\r\nContent-Disposition: form-data; name=\"3\"\r\n\r\n4\r\n--hello--\r\n\r\n", res.content) - end - - def test_post_with_custom_multipart_and_boolean_params - param = [['boolean_true', true]] - ext = { 'content-type' => 'multipart/form-data' } - assert_equal("post", @client.post(serverurl + 'servlet', '').content[0, 4], ext) - res = @client.post(serverurl + 'servlet', param, ext) - assert_match(/Content-Disposition: form-data; name="boolean_true"\r\n\r\ntrue\r\n/, res.content) - # - param = [['boolean_false', false]] - res = @client.post(serverurl + 'servlet', param, ext) - assert_match(/Content-Disposition: form-data; name="boolean_false"\r\n\r\nfalse\r\n/, res.content) - # - param = [['nil', nil]] - res = @client.post(serverurl + 'servlet', param, ext) - assert_match(/Content-Disposition: form-data; name="nil"\r\n\r\n\r\n/, res.content) - end - - def test_post_with_file - STDOUT.sync = true - File.open(__FILE__) do |file| - res = @client.post(serverurl + 'servlet', {1=>2, 3=>file}) - assert_match(/^Content-Disposition: form-data; name="1"\r\n/nm, res.content) - assert_match(/^Content-Disposition: form-data; name="3";/, res.content) - assert_match(/FIND_TAG_IN_THIS_FILE/, res.content) - end - end - - def test_post_with_file_without_size - STDOUT.sync = true - File.open(__FILE__) do |file| - def file.size - # Simulates some strange Windows behaviour - raise SystemCallError.new "Unknown Error (20047)" - end - assert_nothing_raised do - @client.post(serverurl + 'servlet', {1=>2, 3=>file}) - end - end - end - - def test_post_with_io # streaming, but not chunked - myio = StringIO.new("X" * (HTTP::Message::Body::DEFAULT_CHUNK_SIZE + 1)) - def myio.read(*args) - @called ||= 0 - @called += 1 - super - end - def myio.called - @called - end - @client.debug_dev = str = StringIO.new - res = @client.post(serverurl + 'servlet', {1=>2, 3=>myio}) - assert_match(/\r\nContent-Disposition: form-data; name="1"\r\n/m, res.content) - assert_match(/\r\n2\r\n/m, res.content) - assert_match(/\r\nContent-Disposition: form-data; name="3"; filename=""\r\n/m, res.content) - assert_match(/\r\nContent-Length:/m, str.string) - # HTTPClient reads from head to 'size'; CHUNK_SIZE bytes then 1 byte, that's all. - assert_equal(2, myio.called) - end - - def test_post_with_io_nosize # streaming + chunked post - myio = StringIO.new("4") - def myio.size - nil - end - @client.debug_dev = str = StringIO.new - res = @client.post(serverurl + 'servlet', {1=>2, 3=>myio}) - assert_match(/\r\nContent-Disposition: form-data; name="1"\r\n/m, res.content) - assert_match(/\r\n2\r\n/m, res.content) - assert_match(/\r\nContent-Disposition: form-data; name="3"; filename=""\r\n/m, res.content) - assert_match(/\r\n4\r\n/m, res.content) - assert_match(/\r\nTransfer-Encoding: chunked\r\n/m, str.string) - end - - def test_post_with_sized_io - myio = StringIO.new("45") - def myio.size - 1 - end - res = @client.post(serverurl + 'servlet', myio) - assert_equal('post,4', res.content) - end - - def test_post_with_sized_io_part - myio = StringIO.new("45") - def myio.size - 1 - end - @client.debug_dev = str = StringIO.new - _res = @client.post(serverurl + 'servlet', { :file => myio }) - assert_match(/\r\n4\r\n/, str.string, 'should send "4" not "45"') - end - - def test_post_with_unknown_sized_io_part - myio1 = StringIO.new("123") - myio2 = StringIO.new("45") - class << myio1 - undef :size - end - class << myio2 - # This does not work because other file is 'unknown sized' - def size - 1 - end - end - @client.debug_dev = str = StringIO.new - _res = @client.post(serverurl + 'servlet', { :file1 => myio1, :file2 => myio2 }) - assert_match(/\r\n45\r\n/, str.string) - end - - def test_post_async - param = {'1'=>'2', '3'=>'4'} - conn = @client.post_async(serverurl + 'servlet', param) - Thread.pass while !conn.finished? - res = conn.pop - assert_equal(param, params(res.header["x-query"][0])) - end - - def test_post_with_block - called = false - res = @client.post(serverurl + 'servlet', '') { |str| - assert_equal('post,', str) - called = true - } - assert(called) - assert_nil(res.content) - # - called = false - param = [['1', '2'], ['3', '4']] - res = @client.post(serverurl + 'servlet', param) { |str| - assert_equal('post,1=2&3=4', str) - called = true - } - assert(called) - assert_equal('1=2&3=4', res.header["x-query"][0]) - assert_nil(res.content) - end - - def test_post_with_custom_multipart - ext = {'content-type' => 'multipart/form-data'} - assert_equal("post", @client.post(serverurl + 'servlet', '').content[0, 4], ext) - body = [{ 'Content-Disposition' => 'form-data; name="1"', :content => "2"}, - { 'Content-Disposition' => 'form-data; name="3"', :content => "4"}] - res = @client.post(serverurl + 'servlet', body, ext) - assert_match(/Content-Disposition: form-data; name="1"/, res.content) - assert_match(/Content-Disposition: form-data; name="3"/, res.content) - # - ext = {'content-type' => 'multipart/form-data; boundary=hello'} - assert_equal("post", @client.post(serverurl + 'servlet', '').content[0, 4], ext) - res = @client.post(serverurl + 'servlet', body, ext) - assert_match(/Content-Disposition: form-data; name="1"/, res.content) - assert_match(/Content-Disposition: form-data; name="3"/, res.content) - assert_equal("post,--hello\r\nContent-Disposition: form-data; name=\"1\"\r\n\r\n2\r\n--hello\r\nContent-Disposition: form-data; name=\"3\"\r\n\r\n4\r\n--hello--\r\n\r\n", res.content) - end - - def test_post_with_custom_multipart_and_file - STDOUT.sync = true - File.open(__FILE__) do |file| - def file.original_filename - 'file.txt' - end - - ext = { 'Content-Type' => 'multipart/alternative' } - body = [{ 'Content-Type' => 'text/plain', :content => "this is only a test" }, - { 'Content-Type' => 'application/x-ruby', :content => file }] - res = @client.post(serverurl + 'servlet', body, ext) - assert_match(/^Content-Type: text\/plain\r\n/m, res.content) - assert_match(/^this is only a test\r\n/m, res.content) - assert_match(/^Content-Type: application\/x-ruby\r\n/m, res.content) - assert_match(/Content-Disposition: form-data; name="3"; filename="file.txt"/, res.content) - assert_match(/FIND_TAG_IN_THIS_FILE/, res.content) - end - end - - def test_patch - assert_equal("patch", @client.patch(serverurl + 'servlet', '').content) - param = {'1'=>'2', '3'=>'4'} - @client.debug_dev = str = '' - res = @client.patch(serverurl + 'servlet', param) - assert_equal(param, params(res.header["x-query"][0])) - assert_equal('Content-Type: application/x-www-form-urlencoded', str.split(/\r?\n/)[5]) - end - - def test_patch_with_query_and_body - res = @client.patch(serverurl + 'servlet', :query => {:query => 'query'}, :body => {:body => 'body'}) - assert_equal("patch", res.content) - assert_equal("body=body", res.headers["X-Query"]) - assert_equal("query=query", res.headers["X-Request-Query"]) - end - - def test_patch_bytesize - res = @client.patch(serverurl + 'servlet', 'txt' => 'あいうえお') - assert_equal('txt=%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A', res.header["x-query"][0]) - assert_equal('15', res.header["x-size"][0]) - end - - def test_patch_async - param = {'1'=>'2', '3'=>'4'} - conn = @client.patch_async(serverurl + 'servlet', param) - Thread.pass while !conn.finished? - res = conn.pop - assert_equal(param, params(res.header["x-query"][0])) - end - - def test_put - assert_equal("put", @client.put(serverurl + 'servlet', '').content) - param = {'1'=>'2', '3'=>'4'} - @client.debug_dev = str = '' - res = @client.put(serverurl + 'servlet', param) - assert_equal(param, params(res.header["x-query"][0])) - assert_equal('Content-Type: application/x-www-form-urlencoded', str.split(/\r?\n/)[5]) - end - - def test_put_with_query_and_body - res = @client.put(serverurl + 'servlet', :query => {:query => 'query'}, :body => {:body => 'body'}) - assert_equal("put", res.content) - assert_equal("body=body", res.headers["X-Query"]) - assert_equal("query=query", res.headers["X-Request-Query"]) - end - - def test_put_bytesize - res = @client.put(serverurl + 'servlet', 'txt' => 'あいうえお') - assert_equal('txt=%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A', res.header["x-query"][0]) - assert_equal('15', res.header["x-size"][0]) - end - - def test_put_async - param = {'1'=>'2', '3'=>'4'} - conn = @client.put_async(serverurl + 'servlet', param) - Thread.pass while !conn.finished? - res = conn.pop - assert_equal(param, params(res.header["x-query"][0])) - end - - def test_delete - assert_equal("delete", @client.delete(serverurl + 'servlet').content) - end - - def test_delete_with_query - res = @client.delete(serverurl + 'servlet', :query => {:query => 'query'}) - assert_equal("delete", res.content) - assert_equal('query=query', res.headers['X-Request-Query']) - end - - def test_delete_with_query_and_body - res = @client.delete(serverurl + 'servlet', :query => {:query => 'query'}, :body => {:body => 'body'}) - assert_equal("delete", res.content) - assert_equal('query=query', res.headers['X-Request-Query']) - assert_equal('body=body', res.headers['X-Query']) - end - - # Not prohibited by spec, but normally it's ignored - def test_delete_with_body - param = {'1'=>'2', '3'=>'4'} - @client.debug_dev = str = '' - assert_equal("delete", @client.delete(serverurl + 'servlet', param).content) - assert_equal({'1' => ['2'], '3' => ['4']}, HTTP::Message.parse(str.split(/\r?\n\r?\n/)[2])) - end - - def test_delete_async - conn = @client.delete_async(serverurl + 'servlet') - Thread.pass while !conn.finished? - res = conn.pop - assert_equal('delete', res.content.read) - end - - def test_options - assert_equal('options', @client.options(serverurl + 'servlet').content) - end - - def test_options_with_header - res = @client.options(serverurl + 'servlet', {'x-header' => 'header'}) - assert_equal('header', res.headers['X-Header']) - end - - def test_options_with_body - res = @client.options(serverurl + 'servlet', :body => 'body') - assert_equal('body', res.headers['X-Body']) - end - - def test_options_with_body_and_header - res = @client.options(serverurl + 'servlet', :body => 'body', :header => {'x-header' => 'header'}) - assert_equal('header', res.headers['X-Header']) - assert_equal('body', res.headers['X-Body']) - end - - def test_options_async - conn = @client.options_async(serverurl + 'servlet') - Thread.pass while !conn.finished? - res = conn.pop - assert_equal('options', res.content.read) - end - - def test_propfind - assert_equal("propfind", @client.propfind(serverurl + 'servlet').content) - end - - def test_propfind_async - conn = @client.propfind_async(serverurl + 'servlet') - Thread.pass while !conn.finished? - res = conn.pop - assert_equal('propfind', res.content.read) - end - - def test_proppatch - assert_equal("proppatch", @client.proppatch(serverurl + 'servlet').content) - param = {'1'=>'2', '3'=>'4'} - res = @client.proppatch(serverurl + 'servlet', param) - assert_equal('proppatch', res.content) - assert_equal(param, params(res.header["x-query"][0])) - end - - def test_proppatch_async - param = {'1'=>'2', '3'=>'4'} - conn = @client.proppatch_async(serverurl + 'servlet', param) - Thread.pass while !conn.finished? - res = conn.pop - assert_equal('proppatch', res.content.read) - assert_equal(param, params(res.header["x-query"][0])) - end - - def test_trace - assert_equal("trace", @client.trace(serverurl + 'servlet').content) - param = {'1'=>'2', '3'=>'4'} - res = @client.trace(serverurl + 'servlet', param) - assert_equal(param, params(res.header["x-query"][0])) - end - - def test_trace_async - param = {'1'=>'2', '3'=>'4'} - conn = @client.trace_async(serverurl + 'servlet', param) - Thread.pass while !conn.finished? - res = conn.pop - assert_equal(param, params(res.header["x-query"][0])) - end - - def test_chunked - assert_equal('chunked', @client.get_content(serverurl + 'chunked', { 'msg' => 'chunked' })) - assert_equal('あいうえお', @client.get_content(serverurl + 'chunked', { 'msg' => 'あいうえお' })) - end - - def test_chunked_empty - assert_equal('', @client.get_content(serverurl + 'chunked', { 'msg' => '' })) - end - - def test_get_query - assert_equal({'1'=>'2'}, check_query_get({1=>2})) - assert_equal({'a'=>'A', 'B'=>'b'}, check_query_get({"a"=>"A", "B"=>"b"})) - assert_equal({'&'=>'&'}, check_query_get({"&"=>"&"})) - assert_equal({'= '=>' =+'}, check_query_get({"= "=>" =+"})) - assert_equal( - ['=', '&'].sort, - check_query_get([["=", "="], ["=", "&"]])['='].to_ary.sort - ) - assert_equal({'123'=>'45'}, check_query_get('123=45')) - assert_equal({'12 3'=>'45', ' '=>' '}, check_query_get('12+3=45&+=+')) - assert_equal({}, check_query_get('')) - assert_equal({'1'=>'2'}, check_query_get({1=>StringIO.new('2')})) - assert_equal({'1'=>'2', '3'=>'4'}, check_query_get(StringIO.new('3=4&1=2'))) - - hash = check_query_get({"a"=>["A","a"], "B"=>"b"}) - assert_equal({'a'=>'A', 'B'=>'b'}, hash) - assert_equal(['A','a'], hash['a'].to_ary) - - hash = check_query_get({"a"=>WEBrick::HTTPUtils::FormData.new("A","a"), "B"=>"b"}) - assert_equal({'a'=>'A', 'B'=>'b'}, hash) - assert_equal(['A','a'], hash['a'].to_ary) - - hash = check_query_get({"a"=>[StringIO.new("A"),StringIO.new("a")], "B"=>StringIO.new("b")}) - assert_equal({'a'=>'A', 'B'=>'b'}, hash) - assert_equal(['A','a'], hash['a'].to_ary) - end - - def test_post_body - assert_equal({'1'=>'2'}, check_query_post({1=>2})) - assert_equal({'a'=>'A', 'B'=>'b'}, check_query_post({"a"=>"A", "B"=>"b"})) - assert_equal({'&'=>'&'}, check_query_post({"&"=>"&"})) - assert_equal({'= '=>' =+'}, check_query_post({"= "=>" =+"})) - assert_equal( - ['=', '&'].sort, - check_query_post([["=", "="], ["=", "&"]])['='].to_ary.sort - ) - assert_equal({'123'=>'45'}, check_query_post('123=45')) - assert_equal({'12 3'=>'45', ' '=>' '}, check_query_post('12+3=45&+=+')) - assert_equal({}, check_query_post('')) - # - post_body = StringIO.new("foo=bar&foo=baz") - assert_equal( - ["bar", "baz"], - check_query_post(post_body)["foo"].to_ary.sort - ) - end - - def test_extra_headers - str = "" - @client.debug_dev = str - @client.head(serverurl, nil, {"ABC" => "DEF"}) - lines = str.split(/(?:\r?\n)+/) - assert_equal("= Request", lines[0]) - assert_match("ABC: DEF", lines[4]) - # - str = "" - @client.debug_dev = str - @client.get(serverurl, nil, [["ABC", "DEF"], ["ABC", "DEF"]]) - lines = str.split(/(?:\r?\n)+/) - assert_equal("= Request", lines[0]) - assert_match("ABC: DEF", lines[4]) - assert_match("ABC: DEF", lines[5]) - end - - def test_http_custom_date_header - @client.debug_dev = (str = "") - _res = @client.get(serverurl + 'hello', :header => {'Date' => 'foo'}) - lines = str.split(/(?:\r?\n)+/) - assert_equal('Date: foo', lines[4]) - end - - def test_timeout - assert_equal(60, @client.connect_timeout) - assert_equal(120, @client.send_timeout) - assert_equal(60, @client.receive_timeout) - # - @client.connect_timeout = 1 - @client.send_timeout = 2 - @client.receive_timeout = 3 - assert_equal(1, @client.connect_timeout) - assert_equal(2, @client.send_timeout) - assert_equal(3, @client.receive_timeout) - end - - def test_connect_timeout - # ToDo - end - - def test_send_timeout - # ToDo - end - - def test_receive_timeout - # this test takes 2 sec - assert_equal('hello?sec=2', @client.get_content(serverurl + 'sleep?sec=2')) - @client.receive_timeout = 1 - @client.reset_all - assert_equal('hello?sec=0', @client.get_content(serverurl + 'sleep?sec=0')) - assert_raise(HTTPClient::ReceiveTimeoutError) do - @client.get_content(serverurl + 'sleep?sec=2') - end - @client.receive_timeout = 3 - @client.reset_all - assert_equal('hello?sec=2', @client.get_content(serverurl + 'sleep?sec=2')) - end - - def test_receive_timeout_post - # this test takes 2 sec - assert_equal('hello', @client.post(serverurl + 'sleep', :sec => 2).content) - @client.receive_timeout = 1 - @client.reset_all - assert_equal('hello', @client.post(serverurl + 'sleep', :sec => 0).content) - assert_raise(HTTPClient::ReceiveTimeoutError) do - @client.post(serverurl + 'sleep', :sec => 2) - end - @client.receive_timeout = 3 - @client.reset_all - assert_equal('hello', @client.post(serverurl + 'sleep', :sec => 2).content) - end - - def test_reset - url = serverurl + 'servlet' - assert_nothing_raised do - 5.times do - @client.get(url) - @client.reset(url) - end - end - end - - def test_reset_all - assert_nothing_raised do - 5.times do - @client.get(serverurl + 'servlet') - @client.reset_all - end - end - end - - def test_cookies - cookiefile = Tempfile.new('test_cookies_file') - File.open(cookiefile.path, "wb") do |f| - f << "http://rubyforge.org/account/login.php\tsession_ser\tLjEwMy45Ni40Ni0q%2A-fa0537de8cc31\t2000000000\trubyforge.org\t/account/\t9\n" - end - @client.set_cookie_store(cookiefile.path) - # - @client.reset_all - @client.test_loopback_http_response << "HTTP/1.0 200 OK\nSet-Cookie: session_ser=bar; expires=#{Time.at(1924873200).gmtime.httpdate}\n\nOK" - @client.get_content('http://rubyforge.org/account/login.php') - @client.save_cookie_store - str = File.read(cookiefile.path) - assert_match(%r(http://rubyforge.org/account/login.php\tsession_ser\tbar\t1924873200\trubyforge.org\t/account/\t9), str) - end - - def test_eof_error_length - io = StringIO.new('') - def io.gets(*arg) - @buf ||= ["HTTP/1.0 200 OK\n", "content-length: 123\n", "\n"] - @buf.shift - end - def io.readpartial(size, buf) - @second ||= false - if !@second - @second = '1st' - buf << "abc" - buf - elsif @second == '1st' - @second = '2nd' - raise EOFError.new - else - raise Exception.new - end - end - def io.eof? - true - end - @client.test_loopback_http_response << io - assert_nothing_raised do - @client.get('http://foo/bar') - end - end - - def test_eof_error_rest - io = StringIO.new('') - def io.gets(*arg) - @buf ||= ["HTTP/1.0 200 OK\n", "\n"] - @buf.shift - end - def io.readpartial(size, buf) - @second ||= false - if !@second - @second = '1st' - buf << "abc" - buf - elsif @second == '1st' - @second = '2nd' - raise EOFError.new - else - raise Exception.new - end - end - def io.eof? - true - end - @client.test_loopback_http_response << io - assert_nothing_raised do - @client.get('http://foo/bar') - end - end - - def test_urify - extend HTTPClient::Util - assert_nil(urify(nil)) - uri = 'http://foo' - assert_equal(urify(uri), urify(uri)) - assert_equal(urify(uri), urify(urify(uri))) - end - - def test_connection - c = HTTPClient::Connection.new - assert(c.finished?) - assert_nil(c.join) - end - - def test_site - site = HTTPClient::Site.new - assert_equal('tcp', site.scheme) - assert_equal('0.0.0.0', site.host) - assert_equal(0, site.port) - assert_equal('tcp://0.0.0.0:0', site.addr) - assert_equal('tcp://0.0.0.0:0', site.to_s) - assert_nothing_raised do - site.inspect - end - # - site = HTTPClient::Site.new(urify('http://localhost:12345/foo')) - assert_equal('http', site.scheme) - assert_equal('localhost', site.host) - assert_equal(12345, site.port) - assert_equal('http://localhost:12345', site.addr) - assert_equal('http://localhost:12345', site.to_s) - assert_nothing_raised do - site.inspect - end - # - site1 = HTTPClient::Site.new(urify('http://localhost:12341/')) - site2 = HTTPClient::Site.new(urify('http://localhost:12342/')) - site3 = HTTPClient::Site.new(urify('http://localhost:12342/')) - assert(!(site1 == site2)) - h = { site1 => 'site1', site2 => 'site2' } - h[site3] = 'site3' - assert_equal('site1', h[site1]) - assert_equal('site3', h[site2]) - end - - def test_http_header - res = @client.get(serverurl + 'hello') - assert_equal('text/html', res.contenttype) - assert_equal(5, res.header.get(nil).size) - # - res.header.delete('connection') - assert_equal(4, res.header.get(nil).size) - # - res.header['foo'] = 'bar' - assert_equal(['bar'], res.header['foo']) - # - assert_equal([['foo', 'bar']], res.header.get('foo')) - res.header['foo'] = ['bar', 'bar2'] - assert_equal([['foo', 'bar'], ['foo', 'bar2']], res.header.get('foo')) - end - - def test_mime_type - assert_equal('text/plain', HTTP::Message.mime_type('foo.txt')) - assert_equal('text/html', HTTP::Message.mime_type('foo.html')) - assert_equal('text/html', HTTP::Message.mime_type('foo.htm')) - assert_equal('text/xml', HTTP::Message.mime_type('foo.xml')) - assert_equal('application/msword', HTTP::Message.mime_type('foo.doc')) - assert_equal('image/png', HTTP::Message.mime_type('foo.png')) - assert_equal('image/gif', HTTP::Message.mime_type('foo.gif')) - assert_equal('image/jpeg', HTTP::Message.mime_type('foo.jpg')) - assert_equal('image/jpeg', HTTP::Message.mime_type('foo.jpeg')) - assert_equal('application/octet-stream', HTTP::Message.mime_type('foo.unknown')) - # - handler = lambda { |path| 'hello/world' } - assert_nil(HTTP::Message.mime_type_handler) - assert_nil(HTTP::Message.get_mime_type_func) - HTTP::Message.mime_type_handler = handler - assert_not_nil(HTTP::Message.mime_type_handler) - assert_not_nil(HTTP::Message.get_mime_type_func) - assert_equal('hello/world', HTTP::Message.mime_type('foo.txt')) - HTTP::Message.mime_type_handler = nil - assert_equal('text/plain', HTTP::Message.mime_type('foo.txt')) - HTTP::Message.set_mime_type_func(nil) - assert_equal('text/plain', HTTP::Message.mime_type('foo.txt')) - # - handler = lambda { |path| nil } - HTTP::Message.mime_type_handler = handler - assert_equal('application/octet-stream', HTTP::Message.mime_type('foo.txt')) - end - - def test_connect_request - req = HTTP::Message.new_connect_request(urify('https://foo/bar')) - assert_equal("CONNECT foo:443 HTTP/1.0\r\n\r\n", req.dump) - req = HTTP::Message.new_connect_request(urify('https://example.com/')) - assert_equal("CONNECT example.com:443 HTTP/1.0\r\n\r\n", req.dump) - end - - def test_response - res = HTTP::Message.new_response('response') - res.contenttype = 'text/plain' - res.header.body_date = Time.at(946652400) - assert_equal( - [ - "", - "Content-Length: 8", - "Content-Type: text/plain", - "Last-Modified: Fri, 31 Dec 1999 15:00:00 GMT", - "Status: 200 OK", - "response" - ], - res.dump.split(/\r\n/).sort - ) - assert_equal(['8'], res.header['Content-Length']) - assert_equal('8', res.headers['Content-Length']) - res.header.set('foo', 'bar') - assert_equal( - [ - "", - "Content-Length: 8", - "Content-Type: text/plain", - "Last-Modified: Fri, 31 Dec 1999 15:00:00 GMT", - "Status: 200 OK", - "foo: bar", - "response" - ], - res.dump.split(/\r\n/).sort - ) - # nil body - res = HTTP::Message.new_response(nil) - assert_equal( - [ - "Content-Length: 0", - "Content-Type: text/html; charset=us-ascii", - "Status: 200 OK" - ], - res.dump.split(/\r\n/).sort - ) - # for mod_ruby env - Object.const_set('Apache', nil) - begin - res = HTTP::Message.new_response('response') - assert(res.dump.split(/\r\n/).any? { |line| /^Date/ =~ line }) - # - res = HTTP::Message.new_response('response') - res.contenttype = 'text/plain' - res.header.body_date = Time.at(946652400) - res.header['Date'] = Time.at(946652400).httpdate - assert_equal( - [ - "", - "Content-Length: 8", - "Content-Type: text/plain", - "Date: Fri, 31 Dec 1999 15:00:00 GMT", - "HTTP/1.1 200 OK", - "Last-Modified: Fri, 31 Dec 1999 15:00:00 GMT", - "response" - ], - res.dump.split(/\r\n/).sort - ) - ensure - Object.instance_eval { remove_const('Apache') } - end - end - - def test_response_cookies - res = HTTP::Message.new_response('response') - res.contenttype = 'text/plain' - res.header.body_date = Time.at(946652400) - res.header.request_uri = 'http://www.example.com/' - assert_nil(res.cookies) - # - res.header['Set-Cookie'] = [ - 'CUSTOMER=WILE_E_COYOTE; path=/; expires=Wednesday, 09-Nov-99 23:12:40 GMT', - 'PART_NUMBER=ROCKET_LAUNCHER_0001; path=/' - ] - assert_equal( - [ - "", - "Content-Length: 8", - "Content-Type: text/plain", - "Last-Modified: Fri, 31 Dec 1999 15:00:00 GMT", - "Set-Cookie: CUSTOMER=WILE_E_COYOTE; path=/; expires=Wednesday, 09-Nov-99 23:12:40 GMT", - "Set-Cookie: PART_NUMBER=ROCKET_LAUNCHER_0001; path=/", - "Status: 200 OK", - "response" - ], - res.dump.split(/\r\n/).sort - ) - assert_equal(2, res.cookies.size) - assert_equal('CUSTOMER', res.cookies[0].name) - assert_equal('PART_NUMBER', res.cookies[1].name) - end - - def test_ok_response_success - res = HTTP::Message.new_response('response') - assert_equal(true, res.ok?) - res.status = 404 - assert_equal(false, res.ok?) - res.status = 500 - assert_equal(false, res.ok?) - res.status = 302 - assert_equal(false, res.ok?) - end - - if !defined?(JRUBY_VERSION) and RUBY_VERSION < '1.9' - def test_timeout_scheduler - assert_equal('hello', @client.get_content(serverurl + 'hello')) - status = HTTPClient.timeout_scheduler.instance_eval { @thread.kill; @thread.join; @thread.status } - assert(!status) # dead - assert_equal('hello', @client.get_content(serverurl + 'hello')) - end - end - - def test_session_manager - mgr = HTTPClient::SessionManager.new(@client) - assert_nil(mgr.instance_eval { @proxy }) - assert_nil(mgr.debug_dev) - @client.debug_dev = Object.new - @client.proxy = 'http://myproxy:12345' - mgr = HTTPClient::SessionManager.new(@client) - assert_equal('http://myproxy:12345', mgr.instance_eval { @proxy }.to_s) - assert_equal(@client.debug_dev, mgr.debug_dev) - end - - def create_keepalive_disconnected_thread(idx, sock) - Thread.new { - # return "12345" for the first connection - sock.gets - sock.gets - sock.write("HTTP/1.1 200 OK\r\n") - sock.write("Content-Length: 5\r\n") - sock.write("\r\n") - sock.write("12345") - # for the next connection, close while reading the request for emulating - # KeepAliveDisconnected - sock.gets - sock.close - } - end - - def test_keepalive_disconnected - client = HTTPClient.new - server = TCPServer.open('127.0.0.1', 0) - server.listen(30) # set enough backlogs - endpoint = "http://127.0.0.1:#{server.addr[1]}/" - queue = Queue.new - Thread.new(queue) { |qs| - Thread.abort_on_exception = true - # want 5 requests issued - 5.times { qs.pop } - # emulate 10 keep-alive connections - 10.times do |idx| - sock = server.accept - create_keepalive_disconnected_thread(idx, sock) - end - # return "23456" for the request which gets KeepAliveDisconnected - 5.times do - sock = server.accept - sock.gets - sock.gets - sock.write("HTTP/1.1 200 OK\r\n") - sock.write("\r\n") - sock.write("23456") - sock.close - end - # return "34567" for the rest requests - while true - sock = server.accept - sock.gets - sock.gets - sock.write("HTTP/1.1 200 OK\r\n") - sock.write("Connection: close\r\n") - sock.write("Content-Length: 5\r\n") - sock.write("\r\n") - sock.write("34567") - sock.close - end - } - # try to allocate 10 keep-alive connections; it's a race so some - # threads can reuse the connection so actual number of keep-alive - # connections should be smaller than 10. - (0...10).to_a.map { - Thread.new(queue) { |qc| - Thread.abort_on_exception = true - conn = client.get_async(endpoint) - qc.push(true) - assert_equal("12345", conn.pop.content.read) - } - }.each { |th| th.join } - # send 5 requests, some of these should get KeepAliveDesconnected - # but should retry with new connection. - (0...5).to_a.map { - Thread.new { - Thread.abort_on_exception = true - assert_equal("23456", client.get(endpoint).content) - } - }.each { |th| th.join } - # rest requests won't get KeepAliveDisconnected - (0...10).to_a.map { - Thread.new { - Thread.abort_on_exception = true - assert_equal("34567", client.get(endpoint).content) - } - }.each { |th| th.join } - end - - def create_keepalive_thread(count, sock) - Thread.new { - Thread.abort_on_exception = true - count.times do - req = sock.gets - while line = sock.gets - break if line.chomp.empty? - end - case req - when /chunked/ - sock.write("HTTP/1.1 200 OK\r\n") - sock.write("Transfer-Encoding: chunked\r\n") - sock.write("\r\n") - sock.write("1a\r\n") - sock.write("abcdefghijklmnopqrstuvwxyz\r\n") - sock.write("10\r\n") - sock.write("1234567890abcdef\r\n") - sock.write("0\r\n") - sock.write("\r\n") - else - sock.write("HTTP/1.1 200 OK\r\n") - sock.write("Content-Length: 5\r\n") - sock.write("\r\n") - sock.write("12345") - end - end - sock.close - } - end - - def test_keepalive - server = TCPServer.open('localhost', 0) - server_thread = Thread.new { - Thread.abort_on_exception = true - sock = server.accept - create_keepalive_thread(10, sock) - } - url = "http://localhost:#{server.addr[1]}/" - begin - # content-length - 5.times do - assert_equal('12345', @client.get(url).body) - end - # chunked - 5.times do - assert_equal('abcdefghijklmnopqrstuvwxyz1234567890abcdef', @client.get(url + 'chunked').body) - end - ensure - server.close - server_thread.join - end - end - - def test_strict_response_size_check - @client.strict_response_size_check = false - @client.test_loopback_http_response << "HTTP/1.0 200 OK\r\nContent-Length: 12345\r\n\r\nhello world" - assert_equal('hello world', @client.get_content('http://dummy')) - - @client.reset_all - @client.strict_response_size_check = true - @client.test_loopback_http_response << "HTTP/1.0 200 OK\r\nContent-Length: 12345\r\n\r\nhello world" - assert_raise(HTTPClient::BadResponseError) do - @client.get_content('http://dummy') - end - end - - def test_socket_local - @client.socket_local.host = '127.0.0.1' - assert_equal('hello', @client.get_content(serverurl + 'hello')) - @client.reset_all - @client.socket_local.port = serverport - begin - @client.get_content(serverurl + 'hello') - rescue Errno::EADDRINUSE, SocketError - assert(true) - end - end - - def test_body_param_order - ary = ('b'..'d').map { |k| ['key2', k] } << ['key1', 'a'] << ['key3', 'z'] - assert_equal("key2=b&key2=c&key2=d&key1=a&key3=z", HTTP::Message.escape_query(ary)) - end - - if RUBY_VERSION > "1.9" - def test_charset - body = @client.get(serverurl + 'charset').body - assert_equal(Encoding::EUC_JP, body.encoding) - assert_equal('あいうえお'.encode(Encoding::EUC_JP), body) - end - end - - if RUBY_VERSION >= "1.9.3" - def test_continue - @client.debug_dev = str = '' - res = @client.get(serverurl + 'continue', :header => {:Expect => '100-continue'}) - assert_equal(200, res.status) - assert_equal('done!', res.body) - assert_match(/Expect: 100-continue/, str) - end - end - - def test_ipv6literaladdress_in_uri - server = TCPServer.open('::1', 0) rescue return # Skip if IPv6 is unavailable. - server_thread = Thread.new { - Thread.abort_on_exception = true - sock = server.accept - while line = sock.gets - break if line.chomp.empty? - end - sock.write("HTTP/1.1 200 OK\r\n") - sock.write("Content-Length: 5\r\n") - sock.write("\r\n") - sock.write("12345") - sock.close - } - uri = "http://[::1]:#{server.addr[1]}/" - begin - assert_equal('12345', @client.get(uri).body) - ensure - server.close - server_thread.kill - server_thread.join - end - end - - def test_uri_no_schema - assert_raise(ArgumentError) do - @client.get_content("www.example.com") - end - end - - def test_tcp_keepalive - @client.tcp_keepalive = true - @client.get(serverurl) - - # expecting HTTP keepalive caches the socket - session = @client.instance_variable_get(:@session_manager).send(:get_cached_session, HTTPClient::Site.new(URI.parse(serverurl))) - socket = session.instance_variable_get(:@socket) - - assert_true(session.tcp_keepalive) - assert_equal(Socket::SO_KEEPALIVE, socket.getsockopt(Socket::SOL_SOCKET, Socket::SO_KEEPALIVE).optname) - end - -private - - def check_query_get(query) - WEBrick::HTTPUtils.parse_query( - @client.get(serverurl + 'servlet', query).header["x-query"][0] - ) - end - - def check_query_post(query) - WEBrick::HTTPUtils.parse_query( - @client.post(serverurl + 'servlet', query).header["x-query"][0] - ) - end - - def setup_server - @server = WEBrick::HTTPServer.new( - :BindAddress => "localhost", - :Logger => @logger, - :Port => 0, - :AccessLog => [], - :DocumentRoot => File.dirname(File.expand_path(__FILE__)) - ) - @serverport = @server.config[:Port] - [ - :hello, :sleep, :servlet_redirect, :redirect1, :redirect2, :redirect3, - :redirect_self, :relative_redirect, :redirect_see_other, :chunked, - :largebody, :status, :compressed, :charset, :continue - ].each do |sym| - @server.mount( - "/#{sym}", - WEBrick::HTTPServlet::ProcHandler.new(method("do_#{sym}").to_proc) - ) - end - @server.mount('/servlet', TestServlet.new(@server)) - @server_thread = start_server_thread(@server) - end - - def add_query_string(req) - if req.query_string - '?' + req.query_string - else - '' - end - end - - def do_hello(req, res) - res['content-type'] = 'text/html' - res.body = "hello" + add_query_string(req) - end - - def do_sleep(req, res) - sec = req.query['sec'].to_i - sleep sec - res['content-type'] = 'text/html' - res.body = "hello" + add_query_string(req) - end - - def do_servlet_redirect(req, res) - res.set_redirect(WEBrick::HTTPStatus::Found, serverurl + "servlet" + add_query_string(req)) - end - - def do_redirect1(req, res) - res.set_redirect(WEBrick::HTTPStatus::MovedPermanently, serverurl + "hello" + add_query_string(req)) - end - - def do_redirect2(req, res) - res.set_redirect(WEBrick::HTTPStatus::TemporaryRedirect, serverurl + "redirect3" + add_query_string(req)) - end - - def do_redirect3(req, res) - res.set_redirect(WEBrick::HTTPStatus::Found, serverurl + "hello" + add_query_string(req)) - end - - def do_redirect_self(req, res) - res.set_redirect(WEBrick::HTTPStatus::Found, serverurl + "redirect_self" + add_query_string(req)) - end - - def do_relative_redirect(req, res) - res.set_redirect(WEBrick::HTTPStatus::Found, "hello" + add_query_string(req)) - end - - def do_redirect_see_other(req, res) - if req.request_method == 'POST' - res.set_redirect(WEBrick::HTTPStatus::SeeOther, serverurl + "redirect_see_other" + add_query_string(req)) # self - else - res.body = 'hello' - end - end - - def do_chunked(req, res) - res.chunked = true - res['content-type'] = 'text/plain; charset=UTF-8' - piper, pipew = IO.pipe - res.body = piper - pipew << req.query['msg'] - pipew.close - end - - def do_largebody(req, res) - res['content-type'] = 'text/html' - res.body = "a" * 1000 * 1000 - end - - def do_compressed(req, res) - res['content-type'] = 'application/octet-stream' - if req.query['enc'] == 'gzip' - res['content-encoding'] = 'gzip' - res.body = GZIP_CONTENT - elsif req.query['enc'] == 'deflate' - res['content-encoding'] = 'deflate' - res.body = DEFLATE_CONTENT - elsif req.query['enc'] == 'deflate_noheader' - res['content-encoding'] = 'deflate' - res.body = DEFLATE_NOHEADER_CONTENT - end - end - - def do_charset(req, res) - if RUBY_VERSION > "1.9" - res.body = 'あいうえお'.encode("euc-jp") - res['Content-Type'] = 'text/plain; charset=euc-jp' - else - res.body = 'this endpoint is for 1.9 or later' - end - end - - def do_status(req, res) - res.status = req.query['status'].to_i - end - - def do_continue(req, res) - req.continue - res.body = 'done!' - end - - class TestServlet < WEBrick::HTTPServlet::AbstractServlet - def get_instance(*arg) - self - end - - def do_HEAD(req, res) - res["x-head"] = 'head' # use this for test purpose only. - res["x-query"] = query_response(req) - end - - def do_GET(req, res) - res.body = 'get' - res['x-header'] = req['X-Header'] - res["x-query"] = query_response(req) - end - - def do_POST(req, res) - res["content-type"] = "text/plain" # iso-8859-1, not US-ASCII - res.body = 'post,' + req.body.to_s - res["x-query"] = body_response(req) - res["x-request-query"] = req.query_string - end - - def do_PATCH(req, res) - res["x-query"] = body_response(req) - param = WEBrick::HTTPUtils.parse_query(req.body) || {} - res["x-size"] = (param['txt'] || '').size - res.body = param['txt'] || 'patch' - res["x-request-query"] = req.query_string - end - - def do_PUT(req, res) - res["x-query"] = body_response(req) - param = WEBrick::HTTPUtils.parse_query(req.body) || {} - res["x-size"] = (param['txt'] || '').size - res.body = param['txt'] || 'put' - res["x-request-query"] = req.query_string - end - - def do_DELETE(req, res) - res.body = 'delete' - res["x-query"] = body_response(req) - res["x-request-query"] = req.query_string - end - - def do_OPTIONS(req, res) - res.body = 'options' - res['x-header'] = req['X-Header'] - res['x-body'] = req.body - end - - def do_PROPFIND(req, res) - res.body = 'propfind' - end - - def do_PROPPATCH(req, res) - res.body = 'proppatch' - res["x-query"] = body_response(req) - end - - def do_TRACE(req, res) - # client SHOULD reflect the message received back to the client as the - # entity-body of a 200 (OK) response. [RFC2616] - res.body = 'trace' - res["x-query"] = query_response(req) - end - - private - - def query_response(req) - query_escape(WEBrick::HTTPUtils.parse_query(req.query_string)) - end - - def body_response(req) - query_escape(WEBrick::HTTPUtils.parse_query(req.body)) - end - - def query_escape(query) - escaped = [] - query.sort_by { |k, v| k }.collect do |k, v| - v.to_ary.each do |ve| - escaped << CGI.escape(k) + '=' + CGI.escape(ve) - end - end - escaped.join('&') - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/test_include_client.rb b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/test_include_client.rb deleted file mode 100644 index 8cd05c4..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/test_include_client.rb +++ /dev/null @@ -1,52 +0,0 @@ -# -*- encoding: utf-8 -*- -require File.expand_path('helper', File.dirname(__FILE__)) - -require 'httpclient/include_client' -class TestIncludeClient < Test::Unit::TestCase - class Widget - extend HTTPClient::IncludeClient - - include_http_client("http://example.com") do |client| - client.cookie_manager = nil - client.agent_name = "iMonkey 4k" - end - end - - class OtherWidget - extend HTTPClient::IncludeClient - - include_http_client - include_http_client(:method_name => :other_http_client) - end - - class UnrelatedBlankClass ; end - - def test_client_class_level_singleton - assert_equal Widget.http_client.object_id, Widget.http_client.object_id - - assert_equal Widget.http_client.object_id, Widget.new.http_client.object_id - - assert_not_equal Widget.http_client.object_id, OtherWidget.http_client.object_id - end - - def test_configured - assert_equal Widget.http_client.agent_name, "iMonkey 4k" - assert_nil Widget.http_client.cookie_manager - assert_equal Widget.http_client.proxy.to_s, "http://example.com" - end - - def test_two_includes - assert_not_equal OtherWidget.http_client.object_id, OtherWidget.other_http_client.object_id - - assert_equal OtherWidget.other_http_client.object_id, OtherWidget.new.other_http_client.object_id - end - - # meta-programming gone wrong sometimes accidentally - # adds the class method to _everyone_, a mistake we've made before. - def test_not_infected_class_hieararchy - assert ! Class.respond_to?(:http_client) - assert ! UnrelatedBlankClass.respond_to?(:http_client) - end - - -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/test_jsonclient.rb b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/test_jsonclient.rb deleted file mode 100644 index 839aa54..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/test_jsonclient.rb +++ /dev/null @@ -1,80 +0,0 @@ -# -*- encoding: utf-8 -*- -require File.expand_path('helper', File.dirname(__FILE__)) -require 'jsonclient' - - -class TestJSONClient < Test::Unit::TestCase - include Helper - - def setup - super - setup_server - @client = JSONClient.new - end - - def teardown - super - end - - def test_post - res = @client.post(serverurl + 'json', {'a' => 1, 'b' => {'c' => 2}}) - assert_equal(2, res.content['b']['c']) - assert_equal('application/json; charset=utf-8', res.content_type) - # #previous contains the original response - assert_equal(1, JSON.parse(res.previous.content)['a']) - end - - def test_post_with_header - res = @client.post(serverurl + 'json', :header => {'X-foo' => 'bar'}, :body => {'a' => 1, 'b' => {'c' => 2}}) - assert_equal(2, res.content['b']['c']) - assert_equal('application/json; charset=utf-8', res.content_type) - end - - def test_post_with_array_header - res = @client.post(serverurl + 'json', :header => [['X-foo', 'bar']], :body => {'a' => 1, 'b' => {'c' => 2}}) - assert_equal(2, res.content['b']['c']) - assert_equal('application/json; charset=utf-8', res.content_type) - end - - def test_post_non_json_body - res = @client.post(serverurl + 'json', 'a=b&c=d') - assert_equal('a=b&c=d', res.content) - assert_equal('application/x-www-form-urlencoded', res.content_type) - end - - def test_put - res = @client.put(serverurl + 'json', {'a' => 1, 'b' => {'c' => 2}}) - assert_equal(2, res.content['b']['c']) - assert_equal('application/json; charset=utf-8', res.content_type) - end - - def test_get_not_affected - res = @client.get(serverurl + 'json', {'a' => 1, 'b' => {'c' => 2}}) - assert_equal('', res.content) - assert_equal('', res.content_type) - end - - class JSONServlet < WEBrick::HTTPServlet::AbstractServlet - def get_instance(*arg) - self - end - - def service(req, res) - res['content-type'] = req['content-type'] - res.body = req.body - end - end - - def setup_server - @server = WEBrick::HTTPServer.new( - :BindAddress => "localhost", - :Logger => @logger, - :Port => 0, - :AccessLog => [], - :DocumentRoot => File.dirname(File.expand_path(__FILE__)) - ) - @serverport = @server.config[:Port] - @server.mount('/json', JSONServlet.new(@server)) - @server_thread = start_server_thread(@server) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/test_ssl.rb b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/test_ssl.rb deleted file mode 100644 index 2e634d7..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/test_ssl.rb +++ /dev/null @@ -1,559 +0,0 @@ -require File.expand_path('helper', File.dirname(__FILE__)) -require 'webrick/https' - - -class TestSSL < Test::Unit::TestCase - include Helper - - DIR = File.dirname(File.expand_path(__FILE__)) - - def setup - super - @serverpid = @client = nil - @verify_callback_called = false - setup_server - setup_client - @url = "https://localhost:#{serverport}/hello" - end - - def teardown - super - end - - def path(filename) - File.expand_path(filename, DIR) - end - - def test_proxy_ssl - setup_proxyserver - escape_noproxy do - @client.proxy = proxyurl - @client.ssl_config.set_client_cert_file(path('client.cert'), path('client.key')) - @client.ssl_config.add_trust_ca(path('ca.cert')) - @client.ssl_config.add_trust_ca(path('subca.cert')) - @client.debug_dev = str = "" - assert_equal(200, @client.get(@url).status) - assert(/accept/ =~ @proxyio.string, 'proxy is not used') - assert(/Host: localhost:#{serverport}/ =~ str) - end - end - - def test_options - cfg = @client.ssl_config - assert_nil(cfg.client_cert) - assert_nil(cfg.client_key) - assert_nil(cfg.client_ca) - assert_equal(OpenSSL::SSL::VERIFY_PEER | OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT, cfg.verify_mode) - assert_nil(cfg.verify_callback) - assert_nil(cfg.timeout) - expected_options = OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_SSLv2 | OpenSSL::SSL::OP_NO_SSLv3 - expected_options &= ~OpenSSL::SSL::OP_DONT_INSERT_EMPTY_FRAGMENTS if defined?(OpenSSL::SSL::OP_DONT_INSERT_EMPTY_FRAGMENTS) - expected_options |= OpenSSL::SSL::OP_NO_COMPRESSION if defined?(OpenSSL::SSL::OP_NO_COMPRESSION) - assert_equal(expected_options, cfg.options) - assert_equal("ALL:!aNULL:!eNULL:!SSLv2", cfg.ciphers) - assert_instance_of(OpenSSL::X509::Store, cfg.cert_store) - end - -unless defined?(HTTPClient::JRubySSLSocket) - # JRubySSLSocket does not support sync mode. - def test_sync - cfg = @client.ssl_config - cfg.set_client_cert_file(path('client.cert'), path('client.key')) - cfg.add_trust_ca(path('ca.cert')) - cfg.add_trust_ca(path('subca.cert')) - assert_equal("hello", @client.get_content(@url)) - - @client.socket_sync = false - @client.reset_all - assert_equal("hello", @client.get_content(@url)) - end -end - - def test_debug_dev - str = @client.debug_dev = '' - cfg = @client.ssl_config - cfg.client_cert = path("client.cert") - cfg.client_key = path("client.key") - cfg.add_trust_ca(path('ca.cert')) - cfg.add_trust_ca(path('subca.cert')) - assert_equal("hello", @client.get_content(@url)) - assert(str.scan(/^hello$/)[0]) - end - - def test_verification_without_httpclient - raw_cert = "-----BEGIN CERTIFICATE-----\nMIIDOTCCAiGgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBCMRMwEQYKCZImiZPyLGQB\nGRYDb3JnMRkwFwYKCZImiZPyLGQBGRYJcnVieS1sYW5nMRAwDgYDVQQDDAdSdWJ5\nIENBMB4XDTE2MDgxMDE3MjEzNFoXDTE3MDgxMDE3MjEzNFowSzETMBEGCgmSJomT\n8ixkARkWA29yZzEZMBcGCgmSJomT8ixkARkWCXJ1YnktbGFuZzEZMBcGA1UEAwwQ\nUnVieSBjZXJ0aWZpY2F0ZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\nAJCfsSXpSMpmZCVa+ZCM+QDgomnhDlvnrGDq6pasTaIspGTXgws+7r8Dt/cNe6EH\nHJpRH2cGRiO4yPcfcT9eS4X7k8OC4f33wHfACOmLu6LeoNE8ujmSk6L6WzLUI+sE\nnLZbFrXxoAo4XHsm8vEG9C+jEoXZ1p+47wrAGaDwDQTnzlMy4dT9pRQEJP2G/Rry\nUkuZn8SUWmh3/YS78iaSzsNF1cgE1ealHOrPPFDjiCGDaH/LHyUPYlbFSLZ/B7Qx\nLxi5sePLcywWq/EJrmWpgeVTDjtNijsdKv/A3qkY+fm/oD0pzt7XsfJaP9YKNyJO\nQFdxWZeiPcDF+Hwf+IwSr+kCAwEAAaMxMC8wDgYDVR0PAQH/BAQDAgeAMB0GA1Ud\nDgQWBBQNvzYzJyXemGhxbA8NMXLolDnPyjANBgkqhkiG9w0BAQsFAAOCAQEARIJV\noKejGlOTn71QutnNnu07UtTu0IHs6YqjYzzND+m4JXLN+wvYm72AFUG0b1L7dRg0\niK8XjQrlNQNVqP1Mc6tffchy20neOPOHeiO6qTdRU8P2S8D3Uwe+1qhgxjfE+cWc\nwZmWxYK4HA8c58PxWMqrkr2QqXDplG9KWLvOgrtPGiLLZcQSKhvvB63QzItHBDU6\nRayiJY3oPkK/HrIvFlySqFqzWmuyknkciOFywEHQMz/tcSFJ2QFpPj/tBz9VXohH\nZ8KscmfhZrTPBjo+ky1lz/WraWoz4LMiLnkC2ABczWLRSawu+v3Irx1NFJngt05e\npqwtqIUeg7j+JLiTaA==\n-----END CERTIFICATE-----" - raw_ca_cert = "-----BEGIN CERTIFICATE-----\nMIIDYjCCAkqgAwIBAgIBATANBgkqhkiG9w0BAQsFADBCMRMwEQYKCZImiZPyLGQB\nGRYDb3JnMRkwFwYKCZImiZPyLGQBGRYJcnVieS1sYW5nMRAwDgYDVQQDDAdSdWJ5\nIENBMB4XDTE2MDgxMDE3MjA1NFoXDTE4MDgxMDE3MjA1NFowQjETMBEGCgmSJomT\n8ixkARkWA29yZzEZMBcGCgmSJomT8ixkARkWCXJ1YnktbGFuZzEQMA4GA1UEAwwH\nUnVieSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALKGwyM3Ejtl\npo7CqaDlS71gDZn3gm6IwWpmRMLJofSI9LCwAbjijSC2HvO0xUWoYW40FbzjnnEi\ngszsWyPwuQIx9t0bhuAyllNIfImmkaQkrikXKBKzia4jPnbc4iXPnfjuThjESFWl\ntfbN6y1B5TjKhD1KelfakUO+iMu8WlIA9NKQZYfJ/F3QSpP5Iqb3KN/jVifFbDV8\nbAl3Ln4rT2kTCKrZZcl1jmWsJv8jBw6+P7hk0/Mu0JeHAITsjbNbpHd8UXpCfbVs\nsNGZrBU4uJdZ2YTG+Y27/t25jFNQwb+TWbvig7rfdX2sjssuxa00BBxarC08tIVj\nZprM37KcNn8CAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\nAQYwHQYDVR0OBBYEFA2/NjMnJd6YaHFsDw0xcuiUOc/KMB8GA1UdIwQYMBYEFA2/\nNjMnJd6YaHFsDw0xcuiUOc/KMA0GCSqGSIb3DQEBCwUAA4IBAQAJSOw49XqvUll0\n3vU9EAO6yUdeZSsQENIfYbRMQgapbnN1vTyrUjPZkGC5hIE1pVdoHtEoUEICxIwy\nr6BKxiSLBDLp+rvIuDdzMkXIWdUVvTZguVRyKtM2gfnpsPLpVnv+stBmAW2SMyxm\nkymhOpkjdv3He+45uorB3tdfBS9VVomDEUJdg38UE1b5eXRQ3D6gG0iCPFzKszXg\nLoAYhGxtjCJaKlbzduMK0YO6aelgW1+XnVIKcA7DJ9egk5d/dFZBPFfwumwr9hTH\nh7/fp3Fr87weI+CkfmFyJZrsEBlXJBVuvPesMVHTh3Whm5kmCdWcBJU0QmSq42ZL\n72U0PXLR\n-----END CERTIFICATE-----" - ca_cert = ::OpenSSL::X509::Certificate.new(raw_ca_cert) - cert = ::OpenSSL::X509::Certificate.new(raw_cert) - store = ::OpenSSL::X509::Store.new - store.add_cert(ca_cert) - assert(store.verify(cert)) - end - - def test_verification - cfg = @client.ssl_config - cfg.verify_callback = method(:verify_callback).to_proc - begin - @verify_callback_called = false - @client.get(@url) - assert(false) - rescue OpenSSL::SSL::SSLError => ssle - assert_match(/(certificate verify failed|unable to find valid certification path to requested target)/, ssle.message) - assert(@verify_callback_called) - end - # - cfg.client_cert = path("client.cert") - cfg.client_key = path("client.key") - @verify_callback_called = false - begin - @client.get(@url) - assert(false) - rescue OpenSSL::SSL::SSLError => ssle - assert_match(/(certificate verify failed|unable to find valid certification path to requested target)/, ssle.message) - assert(@verify_callback_called) - end - # - cfg.add_trust_ca(path('ca.cert')) - @verify_callback_called = false - begin - @client.get(@url) - assert(false) - rescue OpenSSL::SSL::SSLError => ssle - assert_match(/(certificate verify failed|unable to find valid certification path to requested target)/, ssle.message) - assert(@verify_callback_called) - end - # - cfg.add_trust_ca(path('subca.cert')) - @verify_callback_called = false - assert_equal("hello", @client.get_content(@url)) - assert(@verify_callback_called) - # -if false - # JRubySSLSocket does not support depth. - # Also on travis environment, verify_depth seems to not work properly. - cfg.verify_depth = 1 # 2 required: root-sub - @verify_callback_called = false - begin - @client.get(@url) - assert(false, "verify_depth is not supported? #{OpenSSL::OPENSSL_VERSION}") - rescue OpenSSL::SSL::SSLError => ssle - assert_match(/(certificate verify failed|unable to find valid certification path to requested target)/, ssle.message) - assert(@verify_callback_called) - end - # - cfg.verify_depth = 2 # 2 required: root-sub - @verify_callback_called = false - @client.get(@url) - assert(@verify_callback_called) - # -end - cfg.verify_depth = nil - cfg.cert_store = OpenSSL::X509::Store.new - cfg.verify_mode = OpenSSL::SSL::VERIFY_PEER - begin - @client.get_content(@url) - assert(false) - rescue OpenSSL::SSL::SSLError => ssle - assert_match(/(certificate verify failed|unable to find valid certification path to requested target)/, ssle.message) - end - # - cfg.verify_mode = nil - assert_equal("hello", @client.get_content(@url)) - cfg.verify_mode = OpenSSL::SSL::VERIFY_NONE - assert_equal("hello", @client.get_content(@url)) - end - - def test_cert_store - cfg = @client.ssl_config - cfg.cert_store.add_cert(cert('ca.cert')) - begin - @client.get(@url) - assert(false) - rescue OpenSSL::SSL::SSLError => ssle - assert_match(/(certificate verify failed|unable to find valid certification path to requested target)/, ssle.message) - end - # - cfg.cert_store.add_cert(cert('subca.cert')) - assert_equal("hello", @client.get_content(@url)) - cfg.clear_cert_store - begin - @client.get(@url) - assert(false) - rescue OpenSSL::SSL::SSLError => ssle - assert_match(/(certificate verify failed|unable to find valid certification path to requested target)/, ssle.message) - end - end - -if defined?(HTTPClient::JRubySSLSocket) - def test_ciphers - cfg = @client.ssl_config - cfg.set_client_cert_file(path('client.cert'), path('client-pass.key'), 'pass4key') - cfg.add_trust_ca(path('ca.cert')) - cfg.add_trust_ca(path('subca.cert')) - cfg.timeout = 123 - assert_equal("hello", @client.get_content(@url)) - # - cfg.ciphers = [] - begin - @client.get(@url) - assert(false) - rescue OpenSSL::SSL::SSLError => ssle - assert_match(/No appropriate protocol/, ssle.message) - end - # - cfg.ciphers = %w(TLS_RSA_WITH_AES_128_CBC_SHA) - assert_equal("hello", @client.get_content(@url)) - # - cfg.ciphers = HTTPClient::SSLConfig::CIPHERS_DEFAULT - assert_equal("hello", @client.get_content(@url)) - end - -else - - def test_ciphers - cfg = @client.ssl_config - cfg.set_client_cert_file(path('client.cert'), path('client-pass.key'), 'pass4key') - cfg.add_trust_ca(path('ca.cert')) - cfg.add_trust_ca(path('subca.cert')) - cfg.timeout = 123 - assert_equal("hello", @client.get_content(@url)) - # - cfg.ciphers = "!ALL" - begin - @client.get(@url) - assert(false) - rescue OpenSSL::SSL::SSLError => ssle - assert_match(/no cipher match/, ssle.message) - end - # - cfg.ciphers = "ALL" - assert_equal("hello", @client.get_content(@url)) - # - cfg.ciphers = "DEFAULT" - assert_equal("hello", @client.get_content(@url)) - end -end - - def test_set_default_paths - assert_raise(OpenSSL::SSL::SSLError) do - @client.get(@url) - end - escape_env do - ENV['SSL_CERT_FILE'] = File.join(DIR, 'ca-chain.pem') - @client.ssl_config.set_default_paths - @client.get(@url) - end - end - - def test_no_sslv3 - teardown_server - setup_server_with_ssl_version(:SSLv3) - assert_raise(OpenSSL::SSL::SSLError) do - @client.ssl_config.verify_mode = nil - @client.get("https://localhost:#{serverport}/hello") - end - end - - def test_allow_tlsv1 - teardown_server - setup_server_with_ssl_version(:TLSv1) - assert_nothing_raised do - @client.ssl_config.verify_mode = nil - @client.get("https://localhost:#{serverport}/hello") - end - end - - def test_use_higher_TLS - omit('TODO: it does not pass with Java 7 or old openssl ') - teardown_server - setup_server_with_ssl_version('TLSv1_2') - assert_nothing_raised do - @client.ssl_config.verify_mode = nil - @client.get("https://localhost:#{serverport}/hello") - # TODO: should check JRubySSLSocket.ssl_socket.getSession.getProtocol - # but it's not thread safe. How can I return protocol version to the caller? - end - end - - VERIFY_TEST_CERT_LOCALHOST = OpenSSL::X509::Certificate.new(<<-EOS) ------BEGIN CERTIFICATE----- -MIIB9jCCAV+gAwIBAgIJAIH8Gsm4PcNKMA0GCSqGSIb3DQEBCwUAMBQxEjAQBgNV -BAMMCWxvY2FsaG9zdDAeFw0xNjA4MTgxMDI2MDVaFw00NDAxMDMxMDI2MDVaMBQx -EjAQBgNVBAMMCWxvY2FsaG9zdDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA -p7D8q0lcx5EZEV5+zPnQsxrbft5xyhH/MCStbH46DRATGPNSOaLRCG5r8gTKQzpD -4swGrQFYe2ienQ+7o4aEHErsXp4O/EmDKeiXWWrMqPr23r3HOBDebuynC/sCwy7N -epnX9u1VLB03eo+suj4d86OoOF+o11t9ZP+GA29Rsf8CAwEAAaNQME4wHQYDVR0O -BBYEFIxsJuPVvd5KKFcAvHGSeKSsWiUJMB8GA1UdIwQYMBaAFIxsJuPVvd5KKFcA -vHGSeKSsWiUJMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADgYEAMJaVCrrM -SM2I06Vr4BL+jtDFhZh3HmJFEDpwEFQ5Y9hduwdUGRBGCpkuea3fE2FKwWW9gLM1 -w7rFMzYFtCEqm78dJWIU79MRy0wjO4LgtYfoikgBh6JKWuV5ed/+L3sLyLG0ZTtv -lrD7lzDtXgwvj007PxDoYRp3JwYzKRmTbH8= ------END CERTIFICATE----- - EOS - - VERIFY_TEST_CERT_FOO_DOMAIN = OpenSSL::X509::Certificate.new(<<-EOS) ------BEGIN CERTIFICATE----- -MIIB8jCCAVugAwIBAgIJAL/od7Whx7VTMA0GCSqGSIb3DQEBCwUAMBIxEDAOBgNV -BAMMB2Zvby5jb20wHhcNMTYwODE4MTAyMzUyWhcNNDQwMTAzMTAyMzUyWjASMRAw -DgYDVQQDDAdmb28uY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCnsPyr -SVzHkRkRXn7M+dCzGtt+3nHKEf8wJK1sfjoNEBMY81I5otEIbmvyBMpDOkPizAat -AVh7aJ6dD7ujhoQcSuxeng78SYMp6JdZasyo+vbevcc4EN5u7KcL+wLDLs16mdf2 -7VUsHTd6j6y6Ph3zo6g4X6jXW31k/4YDb1Gx/wIDAQABo1AwTjAdBgNVHQ4EFgQU -jGwm49W93kooVwC8cZJ4pKxaJQkwHwYDVR0jBBgwFoAUjGwm49W93kooVwC8cZJ4 -pKxaJQkwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOBgQCVKTvfxx+yezuR -5WpVKw1E9qabKOYFB5TqdHMHreRubMJTaoZC+YzhcCwtyLlAA9+axKINAiMM8T+z -jjfOHQSa2GS2TaaVDJWmXIgsAlEbjd2BEiQF0LZYGJRG9pyq0WbTV+CyFdrghjcO -xX/t7OG7NfOG9dhv3J+5SX10S5V5Dg== ------END CERTIFICATE----- - EOS - - VERIFY_TEST_CERT_ALT_NAME = OpenSSL::X509::Certificate.new(<<-EOS) ------BEGIN CERTIFICATE----- -MIICDDCCAXWgAwIBAgIJAOxXY4nOwxhGMA0GCSqGSIb3DQEBCwUAMBQxEjAQBgNV -BAMMCWxvY2FsaG9zdDAeFw0xNjA4MTgxMDM0NTJaFw00NDAxMDMxMDM0NTJaMBQx -EjAQBgNVBAMMCWxvY2FsaG9zdDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA -p7D8q0lcx5EZEV5+zPnQsxrbft5xyhH/MCStbH46DRATGPNSOaLRCG5r8gTKQzpD -4swGrQFYe2ienQ+7o4aEHErsXp4O/EmDKeiXWWrMqPr23r3HOBDebuynC/sCwy7N -epnX9u1VLB03eo+suj4d86OoOF+o11t9ZP+GA29Rsf8CAwEAAaNmMGQwFAYDVR0R -BA0wC4IJKi5mb28uY29tMB0GA1UdDgQWBBSMbCbj1b3eSihXALxxknikrFolCTAf -BgNVHSMEGDAWgBSMbCbj1b3eSihXALxxknikrFolCTAMBgNVHRMEBTADAQH/MA0G -CSqGSIb3DQEBCwUAA4GBADJlKNFuOnsDIhHGW72HuQw4naN6lM3eZE9JJ+UF/XIF -ghGtgqw+00Yy5wMFc1K2Wm4p5NymmDfC/P1FOe34bpxt9/IWm6mEoIWoodC3N4Cm -PtnSS1/CRWzVIPGMglTGGDcUc70tfeAWgyTxgcNQd4vTFtnN0f0RDdaXa8kfKMTw ------END CERTIFICATE----- - EOS - - VERIFY_TEST_PKEY = OpenSSL::PKey::RSA.new(<<-EOS) ------BEGIN RSA PRIVATE KEY----- -MIICXQIBAAKBgQCnsPyrSVzHkRkRXn7M+dCzGtt+3nHKEf8wJK1sfjoNEBMY81I5 -otEIbmvyBMpDOkPizAatAVh7aJ6dD7ujhoQcSuxeng78SYMp6JdZasyo+vbevcc4 -EN5u7KcL+wLDLs16mdf27VUsHTd6j6y6Ph3zo6g4X6jXW31k/4YDb1Gx/wIDAQAB -AoGAe0RHx+WKtQx8/96VmTl951qzxMPho2etTYd4kAsNwzJwx2N9qu57eBYrdWF+ -CQMYievucFhP4Y+bINtC1Eb6btz9TCUwjCfeIxfGRoFf3cxVmxlsRJJmN1kSZlu1 -yYlcMVuP4noeFIMQBRrt5pyLCx2Z9A01NCQT4Y6VoREBIeECQQDWeNhsL6xkrmdB -M9+zl+SqHdNKhgKwMdp74+UNnAV9I8GB7bGlOWhc83aqMLgS+JBDFXcmNF/KawTR -zcnkod5xAkEAyClFgr3lZQSnwUwoA/AOcyW0+H63taaaXS/g8n3H8ENK6kL4ldUx -IgCk2ekbQ5Y3S2WScIGXNxMOza9MlsOvbwJAPUtoPvMZB+U4KVBT/JXKijvf6QqH -tidpU8L78XnHr84KPcHa5WeUxgvmvBkUYoebYzC9TrPlNIqFZBi2PJtuYQJBAMda -E5j7eJT75fhm2RPS6xFT5MH5sw6AOA3HucrJ63AoFVzsBpl0E9NBwO4ndLgDzF6T -cx4Kc4iuunewuB8QFpECQQCfvsHCjIJ/X4kiqeBzxDq2GR/oDgQkOzY+4H9U7Lwl -e61RBaxk5OHOA0bLtvJblV6NL72ZEZhX60wAWbrOPhpT ------END RSA PRIVATE KEY----- - EOS - - def test_post_connection_check - teardown_server - setup_server_with_server_cert(nil, VERIFY_TEST_CERT_LOCALHOST, VERIFY_TEST_PKEY) - file = Tempfile.new('cert') - File.write(file.path, VERIFY_TEST_CERT_LOCALHOST.to_pem) - @client.ssl_config.add_trust_ca(file.path) - assert_nothing_raised do - @client.get("https://localhost:#{serverport}/hello") - end - @client.ssl_config.verify_mode = OpenSSL::SSL::VERIFY_NONE - assert_nothing_raised do - @client.get("https://localhost:#{serverport}/hello") - end - @client.ssl_config.verify_mode = OpenSSL::SSL::VERIFY_PEER - - teardown_server - setup_server_with_server_cert(nil, VERIFY_TEST_CERT_FOO_DOMAIN, VERIFY_TEST_PKEY) - File.write(file.path, VERIFY_TEST_CERT_FOO_DOMAIN.to_pem) - @client.ssl_config.add_trust_ca(file.path) - assert_raises(OpenSSL::SSL::SSLError) do - @client.get("https://localhost:#{serverport}/hello") - end - @client.ssl_config.verify_mode = OpenSSL::SSL::VERIFY_NONE - assert_nothing_raised do - @client.get("https://localhost:#{serverport}/hello") - end - @client.ssl_config.verify_mode = OpenSSL::SSL::VERIFY_PEER - - teardown_server - setup_server_with_server_cert(nil, VERIFY_TEST_CERT_ALT_NAME, VERIFY_TEST_PKEY) - File.write(file.path, VERIFY_TEST_CERT_ALT_NAME.to_pem) - @client.ssl_config.add_trust_ca(file.path) - assert_raises(OpenSSL::SSL::SSLError) do - @client.get("https://localhost:#{serverport}/hello") - end - @client.ssl_config.verify_mode = OpenSSL::SSL::VERIFY_NONE - assert_nothing_raised do - @client.get("https://localhost:#{serverport}/hello") - end - @client.ssl_config.verify_mode = OpenSSL::SSL::VERIFY_PEER - end - - def test_x509_store_add_cert_prepend - store = OpenSSL::X509::Store.new - assert_equal(store, store.add_cert(OpenSSL::X509::Certificate.new(VERIFY_TEST_CERT_LOCALHOST))) - end - - def test_tcp_keepalive - @client.tcp_keepalive = true - @client.ssl_config.add_trust_ca(path('ca-chain.pem')) - @client.get_content(@url) - - # expecting HTTP keepalive caches the socket - session = @client.instance_variable_get(:@session_manager).send(:get_cached_session, HTTPClient::Site.new(URI.parse(@url))) - socket = session.instance_variable_get(:@socket).instance_variable_get(:@socket) - - assert_true(session.tcp_keepalive) - if RUBY_ENGINE == 'jruby' - assert_true(socket.getKeepAlive()) - else - assert_equal(Socket::SO_KEEPALIVE, socket.getsockopt(Socket::SOL_SOCKET, Socket::SO_KEEPALIVE).optname) - end - end - - def test_timeout - url = "https://localhost:#{serverport}/" - @client.ssl_config.add_trust_ca(path('ca-chain.pem')) - assert_equal('sleep', @client.get_content(url + 'sleep?sec=2')) - @client.receive_timeout = 1 - @client.reset_all - assert_equal('sleep', @client.get_content(url + 'sleep?sec=0')) - - start = Time.now - assert_raise(HTTPClient::ReceiveTimeoutError) do - @client.get_content(url + 'sleep?sec=5') - end - if Time.now - start > 3 - # before #342 it detected timeout when IO was freed - fail 'timeout does not work' - end - - @client.receive_timeout = 3 - @client.reset_all - assert_equal('sleep', @client.get_content(url + 'sleep?sec=2')) - end - -private - - def cert(filename) - OpenSSL::X509::Certificate.new(File.read(File.join(DIR, filename))) - end - - def key(filename) - OpenSSL::PKey::RSA.new(File.read(File.join(DIR, filename))) - end - - def q(str) - %Q["#{str}"] - end - - def setup_server - logger = Logger.new(STDERR) - logger.level = Logger::Severity::FATAL # avoid logging SSLError (ERROR level) - @server = WEBrick::HTTPServer.new( - :BindAddress => "localhost", - :Logger => logger, - :Port => 0, - :AccessLog => [], - :DocumentRoot => DIR, - :SSLEnable => true, - :SSLCACertificateFile => File.join(DIR, 'ca.cert'), - :SSLCertificate => cert('server.cert'), - :SSLPrivateKey => key('server.key'), - :SSLVerifyClient => nil, #OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT|OpenSSL::SSL::VERIFY_PEER, - :SSLClientCA => cert('ca.cert'), - :SSLCertName => nil - ) - @serverport = @server.config[:Port] - [:hello, :sleep].each do |sym| - @server.mount( - "/#{sym}", - WEBrick::HTTPServlet::ProcHandler.new(method("do_#{sym}").to_proc) - ) - end - @server_thread = start_server_thread(@server) - end - - def setup_server_with_ssl_version(ssl_version) - # JRubyOpenSSL does not support "TLSv1_2" as an known version, and some JCE provides TLS v1.2 as "TLSv1.2" not "TLSv1_2" - if RUBY_ENGINE == 'jruby' && ['TLSv1_1', 'TLSv1_2'].include?(ssl_version) - ssl_version = ssl_version.tr('_', '.') - end - logger = Logger.new(STDERR) - logger.level = Logger::Severity::FATAL # avoid logging SSLError (ERROR level) - @server = WEBrick::HTTPServer.new( - :BindAddress => "localhost", - :Logger => logger, - :Port => 0, - :AccessLog => [], - :DocumentRoot => DIR, - :SSLEnable => true, - :SSLCACertificateFile => File.join(DIR, 'ca.cert'), - :SSLCertificate => cert('server.cert'), - :SSLPrivateKey => key('server.key') - ) - @server.ssl_context.ssl_version = ssl_version - @serverport = @server.config[:Port] - [:hello].each do |sym| - @server.mount( - "/#{sym}", - WEBrick::HTTPServlet::ProcHandler.new(method("do_#{sym}").to_proc) - ) - end - @server_thread = start_server_thread(@server) - end - - def setup_server_with_server_cert(ca_cert, server_cert, server_key) - logger = Logger.new(STDERR) - logger.level = Logger::Severity::FATAL # avoid logging SSLError (ERROR level) - @server = WEBrick::HTTPServer.new( - :BindAddress => "localhost", - :Logger => logger, - :Port => 0, - :AccessLog => [], - :DocumentRoot => DIR, - :SSLEnable => true, - :SSLCACertificateFile => ca_cert, - :SSLCertificate => server_cert, - :SSLPrivateKey => server_key, - :SSLVerifyClient => nil, - :SSLClientCA => nil, - :SSLCertName => nil - ) - @serverport = @server.config[:Port] - [:hello].each do |sym| - @server.mount( - "/#{sym}", - WEBrick::HTTPServlet::ProcHandler.new(method("do_#{sym}").to_proc) - ) - end - @server_thread = start_server_thread(@server) - end - - def do_hello(req, res) - res['content-type'] = 'text/html' - res.body = "hello" - end - - def do_sleep(req, res) - sec = req.query['sec'].to_i - sleep sec - res['content-type'] = 'text/html' - res.body = "sleep" - end - - def start_server_thread(server) - t = Thread.new { - Thread.current.abort_on_exception = true - server.start - } - while server.status != :Running - sleep 0.1 - unless t.alive? - t.join - raise - end - end - t - end - - def verify_callback(ok, cert) - @verify_callback_called = true - p ["client", ok, cert] if $DEBUG - ok - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/test_webagent-cookie.rb b/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/test_webagent-cookie.rb deleted file mode 100644 index 29a415b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/httpclient-2.8.3/test/test_webagent-cookie.rb +++ /dev/null @@ -1,465 +0,0 @@ -require 'test/unit' -require 'uri' -require 'tempfile' - -# This testcase is located for reference, not for running. -if false - -require 'httpclient/webagent-cookie' - -class TestCookie < Test::Unit::TestCase - include HTTPClient::Util - - def setup() - @c = WebAgent::Cookie.new() - end - - def test_s_new() - assert_instance_of(WebAgent::Cookie, @c) - end - - def test_discard? - assert_equal(false, !!(@c.discard?)) - @c.discard = true - assert_equal(true, !!(@c.discard?)) - end - - def test_match() - url = urify('http://www.rubycolor.org/hoge/funi/#919191') - - @c.domain = 'www.rubycolor.org' - assert_equal(true, @c.match?(url)) - - @c.domain = '.rubycolor.org' - assert_equal(true, @c.match?(url)) - - @c.domain = 'aaa.www.rubycolor.org' - assert_equal(false, @c.match?(url)) - - @c.domain = 'aaa.www.rubycolor.org' - assert_equal(false, @c.match?(url)) - - @c.domain = 'www.rubycolor.org' - @c.path = '/' - assert_equal(true, @c.match?(url)) - - @c.domain = 'www.rubycolor.org' - @c.path = '/hoge' - assert_equal(true, @c.match?(url)) - - @c.domain = 'www.rubycolor.org' - @c.path = '/hoge/hoge' - assert_equal(false, @c.match?(url)) - - @c.domain = 'www.rubycolor.org' - @c.path = '/hoge' - @c.secure = true - assert_equal(false, @c.match?(url)) - - url2 = urify('https://www.rubycolor.org/hoge/funi/#919191') - @c.domain = 'www.rubycolor.org' - @c.path = '/hoge' - @c.secure = true - assert_equal(true, @c.match?(url2)) - - @c.domain = 'www.rubycolor.org' - @c.path = '/hoge' - @c.secure = nil - assert_equal(true, @c.match?(url2)) ## not false! - - url.port = 80 - @c.domain = 'www.rubycolor.org' - @c.path = '/hoge' -# @c.port = [80,8080] - assert_equal(true, @c.match?(url)) - - url_nopath = URI.parse('http://www.rubycolor.org') - @c.domain = 'www.rubycolor.org' - @c.path = '/' - assert_equal(true, @c.match?(url_nopath)) - - end - - def test_head_match?() - assert_equal(true, @c.head_match?("","")) - assert_equal(false, @c.head_match?("a","")) - assert_equal(true, @c.head_match?("","a")) - assert_equal(true, @c.head_match?("abcde","abcde")) - assert_equal(true, @c.head_match?("abcde","abcdef")) - assert_equal(false, @c.head_match?("abcdef","abcde")) - assert_equal(false, @c.head_match?("abcde","bcde")) - assert_equal(false, @c.head_match?("bcde","abcde")) - end - - def test_tail_match?() - assert_equal(true, @c.tail_match?("","")) - assert_equal(false, @c.tail_match?("a","")) - assert_equal(true, @c.tail_match?("","a")) - assert_equal(true, @c.tail_match?("abcde","abcde")) - assert_equal(false, @c.tail_match?("abcde","abcdef")) - assert_equal(false, @c.tail_match?("abcdef","abcde")) - assert_equal(false, @c.tail_match?("abcde","bcde")) - assert_equal(true, @c.tail_match?("bcde","abcde")) - end - - - def test_domain_match() - extend WebAgent::CookieUtils - assert_equal(true, !!domain_match("hoge.co.jp",".")) -# assert_equal(true, !!domain_match("locahost",".local")) - assert_equal(true, !!domain_match("192.168.10.1","192.168.10.1")) - assert_equal(false, !!domain_match("192.168.10.1","192.168.10.2")) -# assert_equal(false, !!domain_match("hoge.co.jp",".hoge.co.jp")) - # allows; host == rubyforge.org, domain == .rubyforge.org - assert_equal(true, !!domain_match("hoge.co.jp",".hoge.co.jp")) - assert_equal(true, !!domain_match("www.hoge.co.jp", "www.hoge.co.jp")) - assert_equal(false, !!domain_match("www.hoge.co.jp", "www2.hoge.co.jp")) - assert_equal(true, !!domain_match("www.hoge.co.jp", ".hoge.co.jp")) - assert_equal(true, !!domain_match("www.aa.hoge.co.jp", ".hoge.co.jp")) - assert_equal(false, !!domain_match("www.hoge.co.jp", "hoge.co.jp")) - end - - def test_join_quotedstr() - arr1 = ['hoge=funi', 'hoge2=funi2'] - assert_equal(arr1, @c.instance_eval{join_quotedstr(arr1,';')}) - arr2 = ['hoge="fu', 'ni"', 'funi=funi'] - assert_equal(['hoge="fu;ni"','funi=funi'], - @c.instance_eval{join_quotedstr(arr2,';')}) - arr3 = ['hoge="funi";hoge2="fu','ni2";hoge3="hoge"', 'funi="funi"'] - assert_equal(['hoge="funi";hoge2="fu,ni2";hoge3="hoge"', 'funi="funi"'], - @c.instance_eval{join_quotedstr(arr3,',')}) - end - -end - -class TestCookieManager < Test::Unit::TestCase - include HTTPClient::Util - - def setup() - @cm = WebAgent::CookieManager.new() - end - - def teardown() - end - - def test_parse() - str = "inkid=n92b0ADOgACIgUb9lsjHqAAAHu2a; expires=Wed, 01-Dec-2010 00:00:00 GMT; path=/" - @cm.parse(str, urify('http://www.test.jp')) - cookie = @cm.cookies[0] - assert_instance_of(WebAgent::Cookie, cookie) - assert_equal("inkid", cookie.name) - assert_equal("n92b0ADOgACIgUb9lsjHqAAAHu2a", cookie.value) - assert_equal(Time.gm(2010, 12, 1, 0,0,0), cookie.expires) - assert_equal("/", cookie.path) - end - - def test_parse2() - str = "xmen=off,0,0,1; path=/; domain=.excite.co.jp; expires=Wednesday, 31-Dec-2037 12:00:00 GMT" - @cm.parse(str, urify('http://www.excite.co.jp')) - cookie = @cm.cookies[0] - assert_instance_of(WebAgent::Cookie, cookie) - assert_equal("xmen", cookie.name) - assert_equal("off,0,0,1", cookie.value) - assert_equal("/", cookie.path) - assert_equal(".excite.co.jp", cookie.domain) - assert_equal(Time.gm(2037,12,31,12,0,0), cookie.expires) - end - - def test_parse3() - str = "xmen=off,0,0,1; path=/; domain=.excite.co.jp; expires=Wednesday, 31-Dec-2037 12:00:00 GMT;Secure;HTTPOnly" - @cm.parse(str, urify('http://www.excite.co.jp')) - cookie = @cm.cookies[0] - assert_instance_of(WebAgent::Cookie, cookie) - assert_equal("xmen", cookie.name) - assert_equal("off,0,0,1", cookie.value) - assert_equal("/", cookie.path) - assert_equal(".excite.co.jp", cookie.domain) - assert_equal(Time.gm(2037,12,31,12,0,0), cookie.expires) - assert_equal(true, cookie.secure?) - assert_equal(true, cookie.http_only?) - end - - def test_parse_double_semicolon() - str = "xmen=off,0,0,1;; path=\"/;;\"; domain=.excite.co.jp; expires=Wednesday, 31-Dec-2037 12:00:00 GMT" - @cm.parse(str, urify('http://www.excite.co.jp')) - cookie = @cm.cookies[0] - assert_instance_of(WebAgent::Cookie, cookie) - assert_equal("xmen", cookie.name) - assert_equal("off,0,0,1", cookie.value) - assert_equal("/;;", cookie.path) - assert_equal(".excite.co.jp", cookie.domain) - assert_equal(Time.gm(2037,12,31,12,0,0), cookie.expires) - end - -# def test_make_portlist() -# assert_equal([80,8080], @cm.instance_eval{make_portlist("80,8080")}) -# assert_equal([80], @cm.instance_eval{make_portlist("80")}) -# assert_equal([80,8080,10080], @cm.instance_eval{make_portlist(" 80, 8080, 10080 \n")}) -# end - - def test_check_expired_cookies() - c1 = WebAgent::Cookie.new() - c2 = c1.dup - c3 = c1.dup - c4 = c1.dup - c1.expires = Time.now - 100 - c2.expires = Time.now + 100 - c3.expires = Time.now - 10 - c4.expires = nil - cookies = [c1,c2,c3,c4] - @cm.cookies = cookies - @cm.check_expired_cookies() - # expires == nil cookies (session cookie) exists. - assert_equal([c2,c4], @cm.cookies) - end - - def test_parse_expires - str = "inkid=n92b0ADOgACIgUb9lsjHqAAAHu2a; expires=; path=/" - @cm.parse(str, urify('http://www.test.jp')) - cookie = @cm.cookies[0] - assert_equal("inkid", cookie.name) - assert_equal("n92b0ADOgACIgUb9lsjHqAAAHu2a", cookie.value) - assert_equal(nil, cookie.expires) - assert_equal("/", cookie.path) - # - str = "inkid=n92b0ADOgACIgUb9lsjHqAAAHu2a; path=/; expires=" - @cm.parse(str, urify('http://www.test.jp')) - cookie = @cm.cookies[0] - assert_equal("inkid", cookie.name) - assert_equal("n92b0ADOgACIgUb9lsjHqAAAHu2a", cookie.value) - assert_equal(nil, cookie.expires) - assert_equal("/", cookie.path) - # - str = "inkid=n92b0ADOgACIgUb9lsjHqAAAHu2a; path=/; expires=\"\"" - @cm.parse(str, urify('http://www.test.jp')) - cookie = @cm.cookies[0] - assert_equal("inkid", cookie.name) - assert_equal("n92b0ADOgACIgUb9lsjHqAAAHu2a", cookie.value) - assert_equal(nil, cookie.expires) - assert_equal("/", cookie.path) - end - - def test_parse_after_expiration - str = "inkid=n92b0ADOgACIgUb9lsjHqAAAHu2a; expires=Wed, 01-Dec-2010 00:00:00 GMT; path=/" - @cm.parse(str, urify('http://www.test.jp')) - cookie = @cm.cookies[0] - assert_instance_of(WebAgent::Cookie, cookie) - assert_equal("inkid", cookie.name) - assert_equal("n92b0ADOgACIgUb9lsjHqAAAHu2a", cookie.value) - assert_equal(Time.gm(2010, 12, 1, 0,0,0), cookie.expires) - assert_equal("/", cookie.path) - - time = Time.at(Time.now.to_i + 60).utc - expires = time.strftime("%a, %d-%b-%Y %H:%M:%S GMT") - str = "inkid=n92b0ADOgACIgUb9lsjHqAAAHu2a; expires=#{expires}; path=/" - @cm.parse(str, urify('http://www.test.jp')) - cookie = @cm.cookies[0] - assert_equal("inkid", cookie.name) - assert_equal("n92b0ADOgACIgUb9lsjHqAAAHu2a", cookie.value) - assert_equal(time, cookie.expires) - assert_equal("/", cookie.path) - end - - def test_find_cookie() - str = "xmen=off,0,0,1; path=/; domain=.excite2.co.jp; expires=Wednesday, 31-Dec-2037 12:00:00 GMT" - @cm.parse(str, urify("http://www.excite2.co.jp/")) - - str = "xmen=off,0,0,2; path=/; domain=.excite.co.jp; expires=Wednesday, 31-Dec-2037 12:00:00 GMT" - @cm.parse(str, urify("http://www.excite.co.jp/")) - - @cm.cookies[0].use = true - @cm.cookies[1].use = true - - url = urify('http://www.excite.co.jp/hoge/funi/') - cookie_str = @cm.find(url) - assert_equal("xmen=off,0,0,2", cookie_str) - end - - def test_load_cookies() - begin - File.open("tmp_test.tmp","w") {|f| - f.write < same as URL - c.url = urify("http://www.inac.co.jp/hoge/hoge2/hoge3") - @cm.add(c) - # - c1, c2 = @cm.cookies - assert_equal('', c1.path) - assert_equal('/hoge/hoge2', c2.path) - end - - def test_check_cookie_accept_domain() - @cm.accept_domains = [".example1.co.jp", "www1.example.jp"] - @cm.reject_domains = [".example2.co.jp", "www2.example.jp"] - check1 = @cm.check_cookie_accept_domain("www.example1.co.jp") - assert_equal(true, check1) - check2 = @cm.check_cookie_accept_domain("www.example2.co.jp") - assert_equal(false, check2) - check3 = @cm.check_cookie_accept_domain("www1.example.jp") - assert_equal(true, check3) - check4 = @cm.check_cookie_accept_domain("www2.example.jp") - assert_equal(false, check4) - check5 = @cm.check_cookie_accept_domain("aa.www2.example.jp") - assert_equal(true, check5) - check6 = @cm.check_cookie_accept_domain("aa.www2.example.jp") - assert_equal(true, check6) - assert_equal(false, @cm.check_cookie_accept_domain(nil)) - end - - def test_escaped - uri = urify('http://www.example.org') - - @cm.parse("bar=2; path=/", uri) - c = @cm.cookies.first - assert_equal('2', c.value) - assert_equal('bar=2', @cm.find(uri)) - - @cm.parse("bar=2; path=/", uri) - c = @cm.cookies.first - assert_equal('2', c.value) - assert_equal('bar=2', @cm.find(uri)) - - @cm.parse("bar=; path=/", uri) - c = @cm.cookies.first - assert_equal(nil, c.value) - assert_equal('bar=', @cm.find(uri)) - - @cm.parse("bar=; path=/", uri) - c = @cm.cookies.first - assert_equal(nil, c.value) - assert_equal('bar=', @cm.find(uri)) - end - - def test_load_cookies_escaped - uri = urify('http://example.org/') - f = Tempfile.new('test_cookie') - File.open(f.path, 'w') do |out| - out.write < "Dies ist ein Test" -``` - -## Features - -* Translation and localization -* Interpolation of values to translations -* Pluralization (CLDR compatible) -* Customizable transliteration to ASCII -* Flexible defaults -* Bulk lookup -* Lambdas as translation data -* Custom key/scope separator -* Custom exception handlers -* Extensible architecture with a swappable backend - -## Pluggable Features - -* Cache -* Pluralization: lambda pluralizers stored as translation data -* Locale fallbacks, RFC4647 compliant (optionally: RFC4646 locale validation) -* [Gettext support](https://github.com/ruby-i18n/i18n/wiki/Gettext) -* Translation metadata - -## Alternative Backend - -* Chain -* ActiveRecord (optionally: ActiveRecord::Missing and ActiveRecord::StoreProcs) -* KeyValue (uses active_support/json and cannot store procs) - -For more information and lots of resources see [the 'Resources' page on the wiki](https://github.com/ruby-i18n/i18n/wiki/Resources). - -## Tests - -You can run tests both with - -* `rake test` or just `rake` -* run any test file directly, e.g. `ruby -Ilib:test test/api/simple_test.rb` - -You can run all tests against all Gemfiles with - -* `ruby test/run_all.rb` - -The structure of the test suite is a bit unusual as it uses modules to reuse -particular tests in different test cases. - -The reason for this is that we need to enforce the I18n API across various -combinations of extensions. E.g. the Simple backend alone needs to support -the same API as any combination of feature and/or optimization modules included -to the Simple backend. We test this by reusing the same API definition (implemented -as test methods) in test cases with different setups. - -You can find the test cases that enforce the API in test/api. And you can find -the API definition test methods in test/api/tests. - -All other test cases (e.g. as defined in test/backend, test/core_ext) etc. -follow the usual test setup and should be easy to grok. - -## More Documentation - -Additional documentation can be found here: https://github.com/ruby-i18n/i18n/wiki - -## Contributors - -* @radar -* @carlosantoniodasilva -* @josevalim -* @knapo -* @tigrish -* [and many more](https://github.com/ruby-i18n/i18n/graphs/contributors) - -## License - -MIT License. See the included MIT-LICENSE file. diff --git a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/CHANGES.md b/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/CHANGES.md deleted file mode 100644 index ba66514..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/CHANGES.md +++ /dev/null @@ -1,457 +0,0 @@ -# Changes - -### 2021-10-24 (2.6.1) - -* Restore version.rb with 2.6.1 - -### 2021-10-14 (2.6.0) - -* Use `rb_enc_interned_str` if available to reduce allocations in `freeze: true` mode. #451. -* Bump required_ruby_version to 2.3. -* Fix compatibility with `GC.compact`. -* Fix some compilation warnings. #469 - -## 2020-12-22 (2.5.1) - -* Restore the compatibility for constants of JSON class. - -## 2020-12-22 (2.5.0) - -* Ready to Ractor-safe at Ruby 3.0. - -## 2020-12-17 (2.4.1) - -* Restore version.rb with 2.4.1 - -## 2020-12-15 (2.4.0) - -* Implement a freeze: parser option #447 -* Fix an issue with generate_pretty and empty objects in the Ruby and Java implementations #449 -* Fix JSON.load_file doc #448 -* Fix pure parser with unclosed arrays / objects #425 -* bundle the LICENSE file in the gem #444 -* Add an option to escape forward slash character #405 -* RDoc for JSON #439 #446 #442 #434 #433 #430 - -## 2020-06-30 (2.3.1) - -* Spelling and grammar fixes for comments. Pull request #191 by Josh - Kline. -* Enhance generic JSON and #generate docs. Pull request #347 by Victor - Shepelev. -* Add :nodoc: for GeneratorMethods. Pull request #349 by Victor Shepelev. -* Baseline changes to help (JRuby) development. Pull request #371 by Karol - Bucek. -* Add metadata for rubygems.org. Pull request #379 by Alexandre ZANNI. -* Remove invalid JSON.generate description from JSON module rdoc. Pull - request #384 by Jeremy Evans. -* Test with TruffleRuby in CI. Pull request #402 by Benoit Daloze. -* Rdoc enhancements. Pull request #413 by Burdette Lamar. -* Fixtures/ are not being tested... Pull request #416 by Marc-André - Lafortune. -* Use frozen string for hash key. Pull request #420 by Marc-André - Lafortune. -* Added :call-seq: to RDoc for some methods. Pull request #422 by Burdette - Lamar. -* Small typo fix. Pull request #423 by Marc-André Lafortune. - -## 2019-12-11 (2.3.0) - * Fix default of `create_additions` to always be `false` for `JSON(user_input)` - and `JSON.parse(user_input, nil)`. - Note that `JSON.load` remains with default `true` and is meant for internal - serialization of trusted data. [CVE-2020-10663] - * Fix passing args all #to_json in json/add/*. - * Fix encoding issues - * Fix issues of keyword vs positional parameter - * Fix JSON::Parser against bigdecimal updates - * Bug fixes to JRuby port - -## 2019-02-21 (2.2.0) - * Adds support for 2.6 BigDecimal and ruby standard library Set datetype. - -## 2017-04-18 (2.1.0) - * Allow passing of `decimal_class` option to specify a class as which to parse - JSON float numbers. -## 2017-03-23 (2.0.4) - * Raise exception for incomplete unicode surrogates/character escape - sequences. This problem was reported by Daniel Gollahon (dgollahon). - * Fix arbitrary heap exposure problem. This problem was reported by Ahmad - Sherif (ahmadsherif). - -## 2017-01-12 (2.0.3) - * Set `required_ruby_version` to 1.9 - * Some small fixes - -## 2016-07-26 (2.0.2) - * Specify `required_ruby_version` for json\_pure. - * Fix issue #295 failure when parsing frozen strings. - -## 2016-07-01 (2.0.1) - * Fix problem when requiring json\_pure and Parser constant was defined top - level. - * Add `RB_GC_GUARD` to avoid possible GC problem via Pete Johns. - * Store `current_nesting` on stack by Aaron Patterson. - -## 2015-09-11 (2.0.0) - * Now complies to newest JSON RFC 7159. - * Implements compatibility to ruby 2.4 integer unification. - * Drops support for old rubies whose life has ended, that is rubies < 2.0. - Also see https://www.ruby-lang.org/en/news/2014/07/01/eol-for-1-8-7-and-1-9-2/ - * There were still some mentions of dual GPL licensing in the source, but JSON - has just the Ruby license that itself includes an explicit dual-licensing - clause that allows covered software to be distributed under the terms of - the Simplified BSD License instead for all ruby versions >= 1.9.3. This is - however a GPL compatible license according to the Free Software Foundation. - I changed these mentions to be consistent with the Ruby license setting in - the gemspec files which were already correct now. - -## 2015-06-01 (1.8.3) - * Fix potential memory leak, thx to nobu. - -## 2015-01-08 (1.8.2) - * Some performance improvements by Vipul A M . - * Fix by Jason R. Clark to avoid mutation of - `JSON.dump_default_options`. - * More tests by Michael Mac-Vicar and fixing - `space_before` accessor in generator. - * Performance on Jruby improved by Ben Browning . - * Some fixes to be compatible with the new Ruby 2.2 by Zachary Scott - and SHIBATA Hiroshi . - -## 2013-05-13 (1.8.1) - * Remove Rubinius exception since transcoding should be working now. - -## 2013-05-13 (1.8.0) - * Fix https://github.com/flori/json/issues/162 reported by Marc-Andre - Lafortune . Thanks! - * Applied patches by Yui NARUSE to suppress warning with - -Wchar-subscripts and better validate UTF-8 strings. - * Applied patch by ginriki@github to remove unnecessary if. - * Add load/dump interface to `JSON::GenericObject` to make - serialize :some_attribute, `JSON::GenericObject` - work in Rails active models for convenient `SomeModel#some_attribute.foo.bar` - access to serialised JSON data. - -## 2013-02-04 (1.7.7) - * Security fix for JSON create_additions default value and - `JSON::GenericObject`. It should not be possible to create additions unless - explicitly requested by setting the create_additions argument to true or - using the JSON.load/dump interface. If `JSON::GenericObject` is supposed to - be automatically deserialised, this has to be explicitly enabled by - setting - JSON::GenericObject.json_creatable = true - as well. - * Remove useless assert in fbuffer implementation. - * Apply patch attached to https://github.com/flori/json/issues#issue/155 - provided by John Shahid , Thx! - * Add license information to rubygems spec data, reported by Jordi Massaguer Pla . - * Improve documentation, thx to Zachary Scott . - -## 2012-11-29 (1.7.6) - * Add `GeneratorState#merge` alias for JRuby, fix state accessor methods. Thx to - jvshahid@github. - * Increase hash likeness of state objects. - -## 2012-08-17 (1.7.5) - * Fix compilation of extension on older rubies. - -## 2012-07-26 (1.7.4) - * Fix compilation problem on AIX, see https://github.com/flori/json/issues/142 - -## 2012-05-12 (1.7.3) - * Work around Rubinius encoding issues using iconv for conversion instead. - -## 2012-05-11 (1.7.2) - * Fix some encoding issues, that cause problems for the pure and the - extension variant in jruby 1.9 mode. - -## 2012-04-28 (1.7.1) - * Some small fixes for building - -## 2012-04-28 (1.7.0) - * Add `JSON::GenericObject` for method access to objects transmitted via JSON. - -## 2012-04-27 (1.6.7) - * Fix possible crash when trying to parse nil value. - -## 2012-02-11 (1.6.6) - * Propagate src encoding to values made from it (fixes 1.9 mode converting - everything to ascii-8bit; harmless for 1.8 mode too) (Thomas E. Enebo - ), should fix - https://github.com/flori/json/issues#issue/119. - * Fix https://github.com/flori/json/issues#issue/124 Thx to Jason Hutchens. - * Fix https://github.com/flori/json/issues#issue/117 - -## 2012-01-15 (1.6.5) - * Vit Ondruch reported a bug that shows up when using - optimisation under GCC 4.7. Thx to him, Bohuslav Kabrda - and Yui NARUSE for debugging and - developing a patch fix. - -## 2011-12-24 (1.6.4) - * Patches that improve speed on JRuby contributed by Charles Oliver Nutter - . - * Support `object_class`/`array_class` with duck typed hash/array. - -## 2011-12-01 (1.6.3) - * Let `JSON.load('')` return nil as well to make mysql text columns (default to - `''`) work better for serialization. - -## 2011-11-21 (1.6.2) - * Add support for OpenStruct and BigDecimal. - * Fix bug when parsing nil in `quirks_mode`. - * Make JSON.dump and JSON.load methods better cooperate with Rails' serialize - method. Just use: - serialize :value, JSON - * Fix bug with time serialization concerning nanoseconds. Thanks for the - patch go to Josh Partlow (jpartlow@github). - * Improve parsing speed for JSON numbers (integers and floats) in a similar way to - what Evan Phoenix suggested in: - https://github.com/flori/json/pull/103 - -## 2011-09-18 (1.6.1) - * Using -target 1.5 to force Java bits to compile with 1.5. - -## 2011-09-12 (1.6.0) - * Extract utilities (prettifier and GUI-editor) in its own gem json-utils. - * Split json/add/core into different files for classes to be serialised. - -## 2011-08-31 (1.5.4) - * Fix memory leak when used from multiple JRuby. (Patch by - jfirebaugh@github). - * Apply patch by Eric Wong that fixes garbage collection problem - reported in https://github.com/flori/json/issues/46. - * Add :quirks_mode option to parser and generator. - * Add support for Rational and Complex number additions via json/add/complex - and json/add/rational requires. - -## 2011-06-20 (1.5.3) - * Alias State#configure method as State#merge to increase duck type synonymy with Hash. - * Add `as_json` methods in json/add/core, so rails can create its json objects - the new way. - -## 2011-05-11 (1.5.2) - * Apply documentation patch by Cory Monty . - * Add gemspecs for json and json\_pure. - * Fix bug in jruby pretty printing. - * Fix bug in `object_class` and `array_class` when inheriting from Hash or - Array. - -## 2011-01-24 (1.5.1) - * Made rake-compiler build a fat binary gem. This should fix issue - https://github.com/flori/json/issues#issue/54. - -## 2011-01-22 (1.5.0) - * Included Java source codes for the Jruby extension made by Daniel Luz - . - * Output full exception message of `deep_const_get` to aid debugging. - * Fixed an issue with ruby 1.9 `Module#const_defined?` method, that was - reported by Riley Goodside. - -## 2010-08-09 (1.4.6) - * Fixed oversight reported in http://github.com/flori/json/issues/closed#issue/23, - always create a new object from the state prototype. - * Made pure and ext api more similar again. - -## 2010-08-07 (1.4.5) - * Manage data structure nesting depth in state object during generation. This - should reduce problems with `to_json` method definіtions that only have one - argument. - * Some fixes in the state objects and additional tests. -## 2010-08-06 (1.4.4) - * Fixes build problem for rubinius under OS X, http://github.com/flori/json/issues/closed#issue/25 - * Fixes crashes described in http://github.com/flori/json/issues/closed#issue/21 and - http://github.com/flori/json/issues/closed#issue/23 -## 2010-05-05 (1.4.3) - * Fixed some test assertions, from Ruby r27587 and r27590, patch by nobu. - * Fixed issue http://github.com/flori/json/issues/#issue/20 reported by - electronicwhisper@github. Thx! - -## 2010-04-26 (1.4.2) - * Applied patch from naruse Yui NARUSE to make building with - Microsoft Visual C possible again. - * Applied patch from devrandom in order to allow building of - json_pure if extensiontask is not present. - * Thanks to Dustin Schneider , who reported a memory - leak, which is fixed in this release. - * Applied 993f261ccb8f911d2ae57e9db48ec7acd0187283 patch from josh@github. - -## 2010-04-25 (1.4.1) - * Fix for a bug reported by Dan DeLeo , caused by T_FIXNUM - being different on 32bit/64bit architectures. - -## 2010-04-23 (1.4.0) - * Major speed improvements and building with simplified - directory/file-structure. - * Extension should at least be compatible with MRI, YARV and Rubinius. - -## 2010-04-07 (1.2.4) - * Triger const_missing callback to make Rails' dynamic class loading work. - -## 2010-03-11 (1.2.3) - * Added a `State#[]` method which returns an attribute's value in order to - increase duck type compatibility to Hash. - -## 2010-02-27 (1.2.2) - * Made some changes to make the building of the parser/generator compatible - to Rubinius. - -## 2009-11-25 (1.2.1) - * Added `:symbolize_names` option to Parser, which returns symbols instead of - strings in object names/keys. - -## 2009-10-01 (1.2.0) - * `fast_generate` now raises an exception for nan and infinite floats. - * On Ruby 1.8 json supports parsing of UTF-8, UTF-16BE, UTF-16LE, UTF-32BE, - and UTF-32LE JSON documents now. Under Ruby 1.9 the M17n conversion - functions are used to convert from all supported encodings. ASCII-8BIT - encoded strings are handled like all strings under Ruby 1.8 were. - * Better documentation - -## 2009-08-23 (1.1.9) - * Added forgotten main doc file `extra_rdoc_files`. - -## 2009-08-23 (1.1.8) - * Applied a patch by OZAWA Sakuro to make json/pure - work in environments that don't provide iconv. - * Applied patch by okkez_ in order to fix Ruby Bug #1768: - http://redmine.ruby-lang.org/issues/show/1768. - * Finally got around to avoid the rather paranoid escaping of ?/ characters - in the generator's output. The parsers aren't affected by this change. - Thanks to Rich Apodaca for the suggestion. - -## 2009-06-29 (1.1.7) - * Security Fix for JSON::Pure::Parser. A specially designed string could - cause catastrophic backtracking in one of the parser's regular expressions - in earlier 1.1.x versions. JSON::Ext::Parser isn't affected by this issue. - Thanks to Bartosz Blimke for reporting this - problem. - * This release also uses a less strict ruby version requirement for the - creation of the mswin32 native gem. - -## 2009-05-10 (1.1.6) - * No changes. І tested native linux gems in the last release and they don't - play well with different ruby versions other than the one the gem was built - with. This release is just to bump the version number in order to skip the - native gem on rubyforge. - -## 2009-05-10 (1.1.5) - * Started to build gems with rake-compiler gem. - * Applied patch object/array class patch from Brian Candler - and fixes. - -## 2009-04-01 (1.1.4) - * Fixed a bug in the creation of serialized generic rails objects reported by - Friedrich Graeter . - * Deleted tests/runner.rb, we're using testrb instead. - * Editor supports Infinity in numbers now. - * Made some changes in order to get the library to compile/run under Ruby - 1.9. - * Improved speed of the code path for the fast_generate method in the pure - variant. - -## 2008-07-10 (1.1.3) - * Wesley Beary reported a bug in json/add/core's DateTime - handling: If the nominator and denominator of the offset were divisible by - each other Ruby's Rational#to_s returns them as an integer not a fraction - with '/'. This caused a ZeroDivisionError during parsing. - * Use Date#start and DateTime#start instead of sg method, while - remaining backwards compatible. - * Supports ragel >= 6.0 now. - * Corrected some tests. - * Some minor changes. - -## 2007-11-27 (1.1.2) - * Remember default dir (last used directory) in editor. - * JSON::Editor.edit method added, the editor can now receive json texts from - the clipboard via C-v. - * Load json texts from an URL pasted via middle button press. - * Added :create_additions option to Parser. This makes it possible to disable - the creation of additions by force, in order to treat json texts as data - while having additions loaded. - * Jacob Maine reported, that JSON(:foo) outputs a JSON - object if the rails addition is enabled, which is wrong. It now outputs a - JSON string "foo" instead, like suggested by Jacob Maine. - * Discovered a bug in the Ruby Bugs Tracker on rubyforge, that was reported - by John Evans lgastako@gmail.com. He could produce a crash in the JSON - generator by returning something other than a String instance from a - to_json method. I now guard against this by doing a rather crude type - check, which raises an exception instead of crashing. - -## 2007-07-06 (1.1.1) - * Yui NARUSE sent some patches to fix tests for Ruby - 1.9. I applied them and adapted some of them a bit to run both on 1.8 and - 1.9. - * Introduced a `JSON.parse!` method without depth checking for people who - like danger. - * Made generate and `pretty_generate` methods configurable by an options hash. - * Added :allow_nan option to parser and generator in order to handle NaN, - Infinity, and -Infinity correctly - if requested. Floats, which aren't numbers, - aren't valid JSON according to RFC4627, so by default an exception will be - raised if any of these symbols are encountered. Thanks to Andrea Censi - for his hint about this. - * Fixed some more tests for Ruby 1.9. - * Implemented dump/load interface of Marshal as suggested in ruby-core:11405 - by murphy . - * Implemented the `max_nesting` feature for generate methods, too. - * Added some implementations for ruby core's custom objects for - serialisation/deserialisation purposes. - -## 2007-05-21 (1.1.0) - * Implemented max_nesting feature for parser to avoid stack overflows for - data from untrusted sources. If you trust the source, you can disable it - with the option max_nesting => false. - * Piers Cawley reported a bug, that not every - character can be escaped by `\` as required by RFC4627. There's a - contradiction between David Crockford's JSON checker test vectors (in - tests/fixtures) and RFC4627, though. I decided to stick to the RFC, because - the JSON checker seems to be a bit older than the RFC. - * Extended license to Ruby License, which includes the GPL. - * Added keyboard shortcuts, and 'Open location' menu item to edit_json.rb. - -## 2007-05-09 (1.0.4) - * Applied a patch from Yui NARUSE to make JSON compile - under Ruby 1.9. Thank you very much for mailing it to me! - * Made binary variants of JSON fail early, instead of falling back to the - pure version. This should avoid overshadowing of eventual problems while - loading of the binary. - -## 2007-03-24 (1.0.3) - * Improved performance of pure variant a bit. - * The ext variant of this release supports the mswin32 platform. Ugh! - -## 2007-03-24 (1.0.2) - * Ext Parser didn't parse 0e0 correctly into 0.0: Fixed! - -## 2007-03-24 (1.0.1) - * Forgot some object files in the build dir. I really like that - not! - -## 2007-03-24 (1.0.0) - * Added C implementations for the JSON generator and a ragel based JSON - parser in C. - * Much more tests, especially fixtures from json.org. - * Further improved conformance to RFC4627. - -## 2007-02-09 (0.4.3) - * Conform more to RFC4627 for JSON: This means JSON strings - now always must contain exactly one object `"{ ... }"` or array `"[ ... ]"` in - order to be parsed without raising an exception. The definition of what - constitutes a whitespace is narrower in JSON than in Ruby ([ \t\r\n]), and - there are differences in floats and integers (no octals or hexadecimals) as - well. - * Added aliases generate and `pretty_generate` of unparse and `pretty_unparse`. - * Fixed a test case. - * Catch an `Iconv::InvalidEncoding` exception, that seems to occur on some Sun - boxes with SunOS 5.8, if iconv doesn't support utf16 conversions. This was - reported by Andrew R Jackson , thanks a bunch! - -## 2006-08-25 (0.4.2) - * Fixed a bug in handling solidi (/-characters), that was reported by - Kevin Gilpin . - -## 2006-02-06 (0.4.1) - * Fixed a bug related to escaping with backslashes. Thanks for the report go - to Florian Munz . - -## 2005-09-23 (0.4.0) - * Initial Rubyforge Version diff --git a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/LICENSE b/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/LICENSE deleted file mode 100644 index 426810a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/LICENSE +++ /dev/null @@ -1,56 +0,0 @@ -Ruby is copyrighted free software by Yukihiro Matsumoto . -You can redistribute it and/or modify it under either the terms of the -2-clause BSDL (see the file BSDL), or the conditions below: - - 1. You may make and give away verbatim copies of the source form of the - software without restriction, provided that you duplicate all of the - original copyright notices and associated disclaimers. - - 2. You may modify your copy of the software in any way, provided that - you do at least ONE of the following: - - a) place your modifications in the Public Domain or otherwise - make them Freely Available, such as by posting said - modifications to Usenet or an equivalent medium, or by allowing - the author to include your modifications in the software. - - b) use the modified software only within your corporation or - organization. - - c) give non-standard binaries non-standard names, with - instructions on where to get the original software distribution. - - d) make other distribution arrangements with the author. - - 3. You may distribute the software in object code or binary form, - provided that you do at least ONE of the following: - - a) distribute the binaries and library files of the software, - together with instructions (in the manual page or equivalent) - on where to get the original distribution. - - b) accompany the distribution with the machine-readable source of - the software. - - c) give non-standard binaries non-standard names, with - instructions on where to get the original software distribution. - - d) make other distribution arrangements with the author. - - 4. You may modify and include the part of the software into any other - software (possibly commercial). But some files in the distribution - are not written by the author, so that they are not under these terms. - - For the list of those files and their copying conditions, see the - file LEGAL. - - 5. The scripts and library files supplied as input to or produced as - output from the software do not automatically fall under the - copyright of the software, but belong to whomever generated them, - and may be sold commercially, and may be aggregated with this - software. - - 6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR - IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE. diff --git a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/README.md b/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/README.md deleted file mode 100644 index 288ccdf..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/README.md +++ /dev/null @@ -1,425 +0,0 @@ -# JSON implementation for Ruby - -[![CI](https://github.com/flori/json/actions/workflows/ci.yml/badge.svg)](https://github.com/flori/json/actions/workflows/ci.yml) - -## Description - -This is a implementation of the JSON specification according to RFC 7159 -http://www.ietf.org/rfc/rfc7159.txt . Starting from version 1.0.0 on there -will be two variants available: - -* A pure ruby variant, that relies on the iconv and the stringscan - extensions, which are both part of the ruby standard library. -* The quite a bit faster native extension variant, which is in parts - implemented in C or Java and comes with its own unicode conversion - functions and a parser generated by the ragel state machine compiler - http://www.complang.org/ragel/ . - -Both variants of the JSON generator generate UTF-8 character sequences by -default. If an :ascii\_only option with a true value is given, they escape all -non-ASCII and control characters with \uXXXX escape sequences, and support -UTF-16 surrogate pairs in order to be able to generate the whole range of -unicode code points. - -All strings, that are to be encoded as JSON strings, should be UTF-8 byte -sequences on the Ruby side. To encode raw binary strings, that aren't UTF-8 -encoded, please use the to\_json\_raw\_object method of String (which produces -an object, that contains a byte array) and decode the result on the receiving -endpoint. - -## Installation - -It's recommended to use the extension variant of JSON, because it's faster than -the pure ruby variant. If you cannot build it on your system, you can settle -for the latter. - -Just type into the command line as root: - -``` -# rake install -``` - -The above command will build the extensions and install them on your system. - -``` -# rake install_pure -``` - -or - -``` -# ruby install.rb -``` - -will just install the pure ruby implementation of JSON. - -If you use Rubygems you can type - -``` -# gem install json -``` - -instead, to install the newest JSON version. - -There is also a pure ruby json only variant of the gem, that can be installed -with: - -``` -# gem install json_pure -``` - -## Compiling the extensions yourself - -If you want to create the `parser.c` file from its `parser.rl` file or draw nice -graphviz images of the state machines, you need ragel from: -http://www.complang.org/ragel/ - -## Usage - -To use JSON you can - -```ruby -require 'json' -``` - -to load the installed variant (either the extension `'json'` or the pure -variant `'json_pure'`). If you have installed the extension variant, you can -pick either the extension variant or the pure variant by typing - -```ruby -require 'json/ext' -``` - -or - -```ruby -require 'json/pure' -``` - -Now you can parse a JSON document into a ruby data structure by calling - -```ruby -JSON.parse(document) -``` - -If you want to generate a JSON document from a ruby data structure call -```ruby -JSON.generate(data) -``` - -You can also use the `pretty_generate` method (which formats the output more -verbosely and nicely) or `fast_generate` (which doesn't do any of the security -checks generate performs, e. g. nesting deepness checks). - -There are also the JSON and JSON[] methods which use parse on a String or -generate a JSON document from an array or hash: - -```ruby -document = JSON 'test' => 23 # => "{\"test\":23}" -document = JSON['test' => 23] # => "{\"test\":23}" -``` - -and - -```ruby -data = JSON '{"test":23}' # => {"test"=>23} -data = JSON['{"test":23}'] # => {"test"=>23} -``` - -You can choose to load a set of common additions to ruby core's objects if -you - -```ruby -require 'json/add/core' -``` - -After requiring this you can, e. g., serialise/deserialise Ruby ranges: - -```ruby -JSON JSON(1..10) # => 1..10 -``` - -To find out how to add JSON support to other or your own classes, read the -section "More Examples" below. - -To get the best compatibility to rails' JSON implementation, you can - -```ruby -require 'json/add/rails' -``` - -Both of the additions attempt to require `'json'` (like above) first, if it has -not been required yet. - -## Serializing exceptions - -The JSON module doesn't extend `Exception` by default. If you convert an `Exception` -object to JSON, it will by default only include the exception message. - -To include the full details, you must either load the `json/add/core` mentioned -above, or specifically load the exception addition: - -```ruby -require 'json/add/exception' -``` - -## More Examples - -To create a JSON document from a ruby data structure, you can call -`JSON.generate` like that: - -```ruby -json = JSON.generate [1, 2, {"a"=>3.141}, false, true, nil, 4..10] -# => "[1,2,{\"a\":3.141},false,true,null,\"4..10\"]" -``` - -To get back a ruby data structure from a JSON document, you have to call -JSON.parse on it: - -```ruby -JSON.parse json -# => [1, 2, {"a"=>3.141}, false, true, nil, "4..10"] -``` - -Note, that the range from the original data structure is a simple -string now. The reason for this is, that JSON doesn't support ranges -or arbitrary classes. In this case the json library falls back to call -`Object#to_json`, which is the same as `#to_s.to_json`. - -It's possible to add JSON support serialization to arbitrary classes by -simply implementing a more specialized version of the `#to_json method`, that -should return a JSON object (a hash converted to JSON with `#to_json`) like -this (don't forget the `*a` for all the arguments): - -```ruby -class Range - def to_json(*a) - { - 'json_class' => self.class.name, # = 'Range' - 'data' => [ first, last, exclude_end? ] - }.to_json(*a) - end -end -``` - -The hash key `json_class` is the class, that will be asked to deserialise the -JSON representation later. In this case it's `Range`, but any namespace of -the form `A::B` or `::A::B` will do. All other keys are arbitrary and can be -used to store the necessary data to configure the object to be deserialised. - -If the key `json_class` is found in a JSON object, the JSON parser checks -if the given class responds to the `json_create` class method. If so, it is -called with the JSON object converted to a Ruby hash. So a range can -be deserialised by implementing `Range.json_create` like this: - -```ruby -class Range - def self.json_create(o) - new(*o['data']) - end -end -``` - -Now it possible to serialise/deserialise ranges as well: - -```ruby -json = JSON.generate [1, 2, {"a"=>3.141}, false, true, nil, 4..10] -# => "[1,2,{\"a\":3.141},false,true,null,{\"json_class\":\"Range\",\"data\":[4,10,false]}]" -JSON.parse json -# => [1, 2, {"a"=>3.141}, false, true, nil, 4..10] -json = JSON.generate [1, 2, {"a"=>3.141}, false, true, nil, 4..10] -# => "[1,2,{\"a\":3.141},false,true,null,{\"json_class\":\"Range\",\"data\":[4,10,false]}]" -JSON.parse json, :create_additions => true -# => [1, 2, {"a"=>3.141}, false, true, nil, 4..10] -``` - -`JSON.generate` always creates the shortest possible string representation of a -ruby data structure in one line. This is good for data storage or network -protocols, but not so good for humans to read. Fortunately there's also -`JSON.pretty_generate` (or `JSON.pretty_generate`) that creates a more readable -output: - -```ruby - puts JSON.pretty_generate([1, 2, {"a"=>3.141}, false, true, nil, 4..10]) - [ - 1, - 2, - { - "a": 3.141 - }, - false, - true, - null, - { - "json_class": "Range", - "data": [ - 4, - 10, - false - ] - } - ] -``` - -There are also the methods `Kernel#j` for generate, and `Kernel#jj` for -`pretty_generate` output to the console, that work analogous to Core Ruby's `p` and -the `pp` library's `pp` methods. - -The script `tools/server.rb` contains a small example if you want to test, how -receiving a JSON object from a webrick server in your browser with the -JavaScript prototype library http://www.prototypejs.org works. - -## Speed Comparisons - -I have created some benchmark results (see the benchmarks/data-p4-3Ghz -subdir of the package) for the JSON-parser to estimate the speed up in the C -extension: - -``` - Comparing times (call_time_mean): - 1 ParserBenchmarkExt#parser 900 repeats: - 553.922304770 ( real) -> 21.500x - 0.001805307 - 2 ParserBenchmarkYAML#parser 1000 repeats: - 224.513358139 ( real) -> 8.714x - 0.004454078 - 3 ParserBenchmarkPure#parser 1000 repeats: - 26.755020642 ( real) -> 1.038x - 0.037376163 - 4 ParserBenchmarkRails#parser 1000 repeats: - 25.763381731 ( real) -> 1.000x - 0.038814780 - calls/sec ( time) -> speed covers - secs/call -``` - -In the table above 1 is `JSON::Ext::Parser`, 2 is `YAML.load` with YAML -compatible JSON document, 3 is is `JSON::Pure::Parser`, and 4 is -`ActiveSupport::JSON.decode`. The ActiveSupport JSON-decoder converts the -input first to YAML and then uses the YAML-parser, the conversion seems to -slow it down so much that it is only as fast as the `JSON::Pure::Parser`! - -If you look at the benchmark data you can see that this is mostly caused by -the frequent high outliers - the median of the Rails-parser runs is still -overall smaller than the median of the `JSON::Pure::Parser` runs: - -``` - Comparing times (call_time_median): - 1 ParserBenchmarkExt#parser 900 repeats: - 800.592479481 ( real) -> 26.936x - 0.001249075 - 2 ParserBenchmarkYAML#parser 1000 repeats: - 271.002390644 ( real) -> 9.118x - 0.003690004 - 3 ParserBenchmarkRails#parser 1000 repeats: - 30.227910865 ( real) -> 1.017x - 0.033082008 - 4 ParserBenchmarkPure#parser 1000 repeats: - 29.722384421 ( real) -> 1.000x - 0.033644676 - calls/sec ( time) -> speed covers - secs/call -``` - -I have benchmarked the `JSON-Generator` as well. This generated a few more -values, because there are different modes that also influence the achieved -speed: - -``` - Comparing times (call_time_mean): - 1 GeneratorBenchmarkExt#generator_fast 1000 repeats: - 547.354332608 ( real) -> 15.090x - 0.001826970 - 2 GeneratorBenchmarkExt#generator_safe 1000 repeats: - 443.968212317 ( real) -> 12.240x - 0.002252414 - 3 GeneratorBenchmarkExt#generator_pretty 900 repeats: - 375.104545883 ( real) -> 10.341x - 0.002665923 - 4 GeneratorBenchmarkPure#generator_fast 1000 repeats: - 49.978706968 ( real) -> 1.378x - 0.020008521 - 5 GeneratorBenchmarkRails#generator 1000 repeats: - 38.531868759 ( real) -> 1.062x - 0.025952543 - 6 GeneratorBenchmarkPure#generator_safe 1000 repeats: - 36.927649925 ( real) -> 1.018x 7 (>=3859) - 0.027079979 - 7 GeneratorBenchmarkPure#generator_pretty 1000 repeats: - 36.272134441 ( real) -> 1.000x 6 (>=3859) - 0.027569373 - calls/sec ( time) -> speed covers - secs/call -``` - -In the table above 1-3 are `JSON::Ext::Generator` methods. 4, 6, and 7 are -`JSON::Pure::Generator` methods and 5 is the Rails JSON generator. It is now a -bit faster than the `generator_safe` and `generator_pretty` methods of the pure -variant but slower than the others. - -To achieve the fastest JSON document output, you can use the `fast_generate` -method. Beware, that this will disable the checking for circular Ruby data -structures, which may cause JSON to go into an infinite loop. - -Here are the median comparisons for completeness' sake: - -``` - Comparing times (call_time_median): - 1 GeneratorBenchmarkExt#generator_fast 1000 repeats: - 708.258020939 ( real) -> 16.547x - 0.001411915 - 2 GeneratorBenchmarkExt#generator_safe 1000 repeats: - 569.105020353 ( real) -> 13.296x - 0.001757145 - 3 GeneratorBenchmarkExt#generator_pretty 900 repeats: - 482.825371244 ( real) -> 11.280x - 0.002071142 - 4 GeneratorBenchmarkPure#generator_fast 1000 repeats: - 62.717626652 ( real) -> 1.465x - 0.015944481 - 5 GeneratorBenchmarkRails#generator 1000 repeats: - 43.965681162 ( real) -> 1.027x - 0.022745013 - 6 GeneratorBenchmarkPure#generator_safe 1000 repeats: - 43.929073409 ( real) -> 1.026x 7 (>=3859) - 0.022763968 - 7 GeneratorBenchmarkPure#generator_pretty 1000 repeats: - 42.802514491 ( real) -> 1.000x 6 (>=3859) - 0.023363113 - calls/sec ( time) -> speed covers - secs/call -``` - -## Development - -### Release - -Update the json.gemspec and json-java.gemspec. - -``` -rbenv shell 2.6.5 -rake build -gem push pkg/json-2.3.0.gem - -rbenv shell jruby-9.2.9.0 -rake build -gem push pkg/json-2.3.0-java.gem -``` - -## Author - -Florian Frank - -## License - -Ruby License, see https://www.ruby-lang.org/en/about/license.txt. - -## Download - -The latest version of this library can be downloaded at - -* https://rubygems.org/gems/json - -Online Documentation should be located at - -* https://www.rubydoc.info/gems/json diff --git a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/VERSION b/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/VERSION deleted file mode 100644 index ec1cf33..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/VERSION +++ /dev/null @@ -1 +0,0 @@ -2.6.3 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/Makefile b/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/Makefile deleted file mode 100644 index 0e1f096..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/Makefile +++ /dev/null @@ -1,202 +0,0 @@ - -SHELL = /bin/sh - -# V=0 quiet, V=1 verbose. other values don't work. -V = 0 -Q1 = $(V:1=) -Q = $(Q1:0=@) -ECHO1 = $(V:1=@ :) -ECHO = $(ECHO1:0=@ echo) -NULLCMD = : - -#### Start of system configuration section. #### - -srcdir = . -topdir = /Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0 -hdrdir = $(topdir) -arch_hdrdir = /Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0/arm64-darwin22 -PATH_SEPARATOR = : -VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby -prefix = $(DESTDIR)/Users/penguin/.rvm/rubies/ruby-2.7.6 -rubysitearchprefix = $(rubylibprefix)/$(sitearch) -rubyarchprefix = $(rubylibprefix)/$(arch) -rubylibprefix = $(libdir)/$(RUBY_BASE_NAME) -exec_prefix = $(prefix) -vendorarchhdrdir = $(vendorhdrdir)/$(sitearch) -sitearchhdrdir = $(sitehdrdir)/$(sitearch) -rubyarchhdrdir = $(rubyhdrdir)/$(arch) -vendorhdrdir = $(rubyhdrdir)/vendor_ruby -sitehdrdir = $(rubyhdrdir)/site_ruby -rubyhdrdir = $(includedir)/$(RUBY_VERSION_NAME) -vendorarchdir = $(vendorlibdir)/$(sitearch) -vendorlibdir = $(vendordir)/$(ruby_version) -vendordir = $(rubylibprefix)/vendor_ruby -sitearchdir = $(DESTDIR)./.gem.20230521-58859-1k1i8f9 -sitelibdir = $(DESTDIR)./.gem.20230521-58859-1k1i8f9 -sitedir = $(rubylibprefix)/site_ruby -rubyarchdir = $(rubylibdir)/$(arch) -rubylibdir = $(rubylibprefix)/$(ruby_version) -sitearchincludedir = $(includedir)/$(sitearch) -archincludedir = $(includedir)/$(arch) -sitearchlibdir = $(libdir)/$(sitearch) -archlibdir = $(libdir)/$(arch) -ridir = $(datarootdir)/$(RI_BASE_NAME) -mandir = $(datarootdir)/man -localedir = $(datarootdir)/locale -libdir = $(exec_prefix)/lib -psdir = $(docdir) -pdfdir = $(docdir) -dvidir = $(docdir) -htmldir = $(docdir) -infodir = $(datarootdir)/info -docdir = $(datarootdir)/doc/$(PACKAGE) -oldincludedir = $(SDKROOT)/usr/include -includedir = $(prefix)/include -runstatedir = $(localstatedir)/run -localstatedir = $(prefix)/var -sharedstatedir = $(prefix)/com -sysconfdir = $(prefix)/etc -datadir = $(datarootdir) -datarootdir = $(prefix)/share -libexecdir = $(exec_prefix)/libexec -sbindir = $(exec_prefix)/sbin -bindir = $(exec_prefix)/bin -archdir = $(rubyarchdir) - - -CC_WRAPPER = -CC = gcc -CXX = g++ -LIBRUBY = $(LIBRUBY_SO) -LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a -LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME) -LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static -framework Security -framework Foundation $(MAINLIBS) -empty = -OUTFLAG = -o $(empty) -COUTFLAG = -o $(empty) -CSRCFLAG = $(empty) - -RUBY_EXTCONF_H = -cflags = $(optflags) $(debugflags) $(warnflags) -cxxflags = -optflags = -O3 -debugflags = -ggdb3 -warnflags = -Wall -Wextra -Wdeprecated-declarations -Wdivision-by-zero -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wshorten-64-to-32 -Wwrite-strings -Wmissing-noreturn -Wno-cast-function-type -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wunused-variable -Wextra-tokens -cppflags = -CCDLFLAGS = -fno-common -CFLAGS = $(CCDLFLAGS) -g -O2 -fno-common -pipe $(ARCH_FLAG) -INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir) -DEFS = -CPPFLAGS = -I/opt/homebrew/opt/libyaml/include -I/opt/homebrew/opt/libksba/include -I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/zlib/include -I/opt/homebrew/opt/openssl@1.1/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT $(DEFS) $(cppflags) -CXXFLAGS = $(CCDLFLAGS) -g -O2 $(ARCH_FLAG) -ldflags = -L. -fstack-protector-strong -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -dldflags = -Wl,-multiply_defined,suppress -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -ARCH_FLAG = -m64 -DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG) -LDSHARED = $(CC) -dynamic -bundle -LDSHAREDXX = $(CXX) -dynamic -bundle -AR = libtool -static -EXEEXT = - -RUBY_INSTALL_NAME = $(RUBY_BASE_NAME) -RUBY_SO_NAME = ruby.2.7 -RUBYW_INSTALL_NAME = -RUBY_VERSION_NAME = $(RUBY_BASE_NAME)-$(ruby_version) -RUBYW_BASE_NAME = rubyw -RUBY_BASE_NAME = ruby - -arch = arm64-darwin22 -sitearch = $(arch) -ruby_version = 2.7.0 -ruby = $(bindir)/$(RUBY_BASE_NAME) -RUBY = $(ruby) -ruby_headers = $(hdrdir)/ruby.h $(hdrdir)/ruby/backward.h $(hdrdir)/ruby/ruby.h $(hdrdir)/ruby/defines.h $(hdrdir)/ruby/missing.h $(hdrdir)/ruby/intern.h $(hdrdir)/ruby/st.h $(hdrdir)/ruby/subst.h $(arch_hdrdir)/ruby/config.h - -RM = rm -f -RM_RF = $(RUBY) -run -e rm -- -rf -RMDIRS = rmdir -p -MAKEDIRS = /opt/homebrew/opt/coreutils/bin/gmkdir -p -INSTALL = /opt/homebrew/opt/coreutils/bin/ginstall -c -INSTALL_PROG = $(INSTALL) -m 0755 -INSTALL_DATA = $(INSTALL) -m 644 -COPY = cp -TOUCH = exit > - -#### End of system configuration section. #### - -preload = -libpath = . $(libdir) /opt/homebrew/opt/libyaml/lib /opt/homebrew/opt/libksba/lib /opt/homebrew/opt/readline/lib /opt/homebrew/opt/zlib/lib /opt/homebrew/opt/openssl@1.1/lib -LIBPATH = -L. -L$(libdir) -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -DEFFILE = - -CLEANFILES = mkmf.log -DISTCLEANFILES = -DISTCLEANDIRS = - -extout = -extout_prefix = -target_prefix = -LOCAL_LIBS = -LIBS = $(LIBRUBYARG_SHARED) -ORIG_SRCS = -SRCS = $(ORIG_SRCS) -OBJS = -HDRS = -LOCAL_HDRS = -TARGET = -TARGET_NAME = -TARGET_ENTRY = Init_$(TARGET_NAME) -DLLIB = -EXTSTATIC = -STATIC_LIB = - -TIMESTAMP_DIR = . -BINDIR = $(bindir) -RUBYCOMMONDIR = $(sitedir)$(target_prefix) -RUBYLIBDIR = $(sitelibdir)$(target_prefix) -RUBYARCHDIR = $(sitearchdir)$(target_prefix) -HDRDIR = $(rubyhdrdir)/ruby$(target_prefix) -ARCHHDRDIR = $(rubyhdrdir)/$(arch)/ruby$(target_prefix) -TARGET_SO_DIR = -TARGET_SO = $(TARGET_SO_DIR)$(DLLIB) -CLEANLIBS = -CLEANOBJS = *.o *.bak - -all: Makefile -static: $(STATIC_LIB) -.PHONY: all install static install-so install-rb -.PHONY: clean clean-so clean-static clean-rb - -clean-static:: -clean-rb-default:: -clean-rb:: -clean-so:: -clean: clean-so clean-static clean-rb-default clean-rb - -$(Q)$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) .*.time - -distclean-rb-default:: -distclean-rb:: -distclean-so:: -distclean-static:: -distclean: clean distclean-so distclean-static distclean-rb-default distclean-rb - -$(Q)$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log - -$(Q)$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES) - -$(Q)$(RMDIRS) $(DISTCLEANDIRS) 2> /dev/null || true - -realclean: distclean -install: install-so install-rb - -install-so: Makefile -install-rb: pre-install-rb do-install-rb install-rb-default -install-rb-default: pre-install-rb-default do-install-rb-default -pre-install-rb: Makefile -pre-install-rb-default: Makefile -do-install-rb: -do-install-rb-default: -pre-install-rb-default: - @$(NULLCMD) - -site-install: site-install-so site-install-rb -site-install-so: install-so -site-install-rb: install-rb - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/fbuffer/fbuffer.h b/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/fbuffer/fbuffer.h deleted file mode 100644 index dc8f406..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/fbuffer/fbuffer.h +++ /dev/null @@ -1,187 +0,0 @@ - -#ifndef _FBUFFER_H_ -#define _FBUFFER_H_ - -#include "ruby.h" - -#ifndef RHASH_SIZE -#define RHASH_SIZE(hsh) (RHASH(hsh)->tbl->num_entries) -#endif - -#ifndef RFLOAT_VALUE -#define RFLOAT_VALUE(val) (RFLOAT(val)->value) -#endif - -#ifndef RARRAY_LEN -#define RARRAY_LEN(ARRAY) RARRAY(ARRAY)->len -#endif -#ifndef RSTRING_PTR -#define RSTRING_PTR(string) RSTRING(string)->ptr -#endif -#ifndef RSTRING_LEN -#define RSTRING_LEN(string) RSTRING(string)->len -#endif - -#ifdef PRIsVALUE -# define RB_OBJ_CLASSNAME(obj) rb_obj_class(obj) -# define RB_OBJ_STRING(obj) (obj) -#else -# define PRIsVALUE "s" -# define RB_OBJ_CLASSNAME(obj) rb_obj_classname(obj) -# define RB_OBJ_STRING(obj) StringValueCStr(obj) -#endif - -#ifdef HAVE_RUBY_ENCODING_H -#include "ruby/encoding.h" -#define FORCE_UTF8(obj) rb_enc_associate((obj), rb_utf8_encoding()) -#else -#define FORCE_UTF8(obj) -#endif - -/* We don't need to guard objects for rbx, so let's do nothing at all. */ -#ifndef RB_GC_GUARD -#define RB_GC_GUARD(object) -#endif - -typedef struct FBufferStruct { - unsigned long initial_length; - char *ptr; - unsigned long len; - unsigned long capa; -} FBuffer; - -#define FBUFFER_INITIAL_LENGTH_DEFAULT 1024 - -#define FBUFFER_PTR(fb) (fb->ptr) -#define FBUFFER_LEN(fb) (fb->len) -#define FBUFFER_CAPA(fb) (fb->capa) -#define FBUFFER_PAIR(fb) FBUFFER_PTR(fb), FBUFFER_LEN(fb) - -static FBuffer *fbuffer_alloc(unsigned long initial_length); -static void fbuffer_free(FBuffer *fb); -static void fbuffer_clear(FBuffer *fb); -static void fbuffer_append(FBuffer *fb, const char *newstr, unsigned long len); -#ifdef JSON_GENERATOR -static void fbuffer_append_long(FBuffer *fb, long number); -#endif -static void fbuffer_append_char(FBuffer *fb, char newchr); -#ifdef JSON_GENERATOR -static FBuffer *fbuffer_dup(FBuffer *fb); -static VALUE fbuffer_to_s(FBuffer *fb); -#endif - -static FBuffer *fbuffer_alloc(unsigned long initial_length) -{ - FBuffer *fb; - if (initial_length <= 0) initial_length = FBUFFER_INITIAL_LENGTH_DEFAULT; - fb = ALLOC(FBuffer); - memset((void *) fb, 0, sizeof(FBuffer)); - fb->initial_length = initial_length; - return fb; -} - -static void fbuffer_free(FBuffer *fb) -{ - if (fb->ptr) ruby_xfree(fb->ptr); - ruby_xfree(fb); -} - -static void fbuffer_clear(FBuffer *fb) -{ - fb->len = 0; -} - -static void fbuffer_inc_capa(FBuffer *fb, unsigned long requested) -{ - unsigned long required; - - if (!fb->ptr) { - fb->ptr = ALLOC_N(char, fb->initial_length); - fb->capa = fb->initial_length; - } - - for (required = fb->capa; requested > required - fb->len; required <<= 1); - - if (required > fb->capa) { - REALLOC_N(fb->ptr, char, required); - fb->capa = required; - } -} - -static void fbuffer_append(FBuffer *fb, const char *newstr, unsigned long len) -{ - if (len > 0) { - fbuffer_inc_capa(fb, len); - MEMCPY(fb->ptr + fb->len, newstr, char, len); - fb->len += len; - } -} - -#ifdef JSON_GENERATOR -static void fbuffer_append_str(FBuffer *fb, VALUE str) -{ - const char *newstr = StringValuePtr(str); - unsigned long len = RSTRING_LEN(str); - - RB_GC_GUARD(str); - - fbuffer_append(fb, newstr, len); -} -#endif - -static void fbuffer_append_char(FBuffer *fb, char newchr) -{ - fbuffer_inc_capa(fb, 1); - *(fb->ptr + fb->len) = newchr; - fb->len++; -} - -#ifdef JSON_GENERATOR -static void freverse(char *start, char *end) -{ - char c; - - while (end > start) { - c = *end, *end-- = *start, *start++ = c; - } -} - -static long fltoa(long number, char *buf) -{ - static char digits[] = "0123456789"; - long sign = number; - char* tmp = buf; - - if (sign < 0) number = -number; - do *tmp++ = digits[number % 10]; while (number /= 10); - if (sign < 0) *tmp++ = '-'; - freverse(buf, tmp - 1); - return tmp - buf; -} - -static void fbuffer_append_long(FBuffer *fb, long number) -{ - char buf[20]; - unsigned long len = fltoa(number, buf); - fbuffer_append(fb, buf, len); -} - -static FBuffer *fbuffer_dup(FBuffer *fb) -{ - unsigned long len = fb->len; - FBuffer *result; - - result = fbuffer_alloc(len); - fbuffer_append(result, FBUFFER_PAIR(fb)); - return result; -} - -static VALUE fbuffer_to_s(FBuffer *fb) -{ - VALUE result = rb_str_new(FBUFFER_PTR(fb), FBUFFER_LEN(fb)); - fbuffer_free(fb); - FORCE_UTF8(result); - return result; -} -#endif -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/generator/.sitearchdir.-.json.-.ext.time b/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/generator/.sitearchdir.-.json.-.ext.time deleted file mode 100644 index e69de29..0000000 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/generator/Makefile b/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/generator/Makefile deleted file mode 100644 index f6a621d..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/generator/Makefile +++ /dev/null @@ -1,268 +0,0 @@ - -SHELL = /bin/sh - -# V=0 quiet, V=1 verbose. other values don't work. -V = 0 -Q1 = $(V:1=) -Q = $(Q1:0=@) -ECHO1 = $(V:1=@ :) -ECHO = $(ECHO1:0=@ echo) -NULLCMD = : - -#### Start of system configuration section. #### - -srcdir = . -topdir = /Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0 -hdrdir = $(topdir) -arch_hdrdir = /Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0/arm64-darwin22 -PATH_SEPARATOR = : -VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby -prefix = $(DESTDIR)/Users/penguin/.rvm/rubies/ruby-2.7.6 -rubysitearchprefix = $(rubylibprefix)/$(sitearch) -rubyarchprefix = $(rubylibprefix)/$(arch) -rubylibprefix = $(libdir)/$(RUBY_BASE_NAME) -exec_prefix = $(prefix) -vendorarchhdrdir = $(vendorhdrdir)/$(sitearch) -sitearchhdrdir = $(sitehdrdir)/$(sitearch) -rubyarchhdrdir = $(rubyhdrdir)/$(arch) -vendorhdrdir = $(rubyhdrdir)/vendor_ruby -sitehdrdir = $(rubyhdrdir)/site_ruby -rubyhdrdir = $(includedir)/$(RUBY_VERSION_NAME) -vendorarchdir = $(vendorlibdir)/$(sitearch) -vendorlibdir = $(vendordir)/$(ruby_version) -vendordir = $(rubylibprefix)/vendor_ruby -sitearchdir = $(DESTDIR)./.gem.20230521-58859-107vl8 -sitelibdir = $(DESTDIR)./.gem.20230521-58859-107vl8 -sitedir = $(rubylibprefix)/site_ruby -rubyarchdir = $(rubylibdir)/$(arch) -rubylibdir = $(rubylibprefix)/$(ruby_version) -sitearchincludedir = $(includedir)/$(sitearch) -archincludedir = $(includedir)/$(arch) -sitearchlibdir = $(libdir)/$(sitearch) -archlibdir = $(libdir)/$(arch) -ridir = $(datarootdir)/$(RI_BASE_NAME) -mandir = $(datarootdir)/man -localedir = $(datarootdir)/locale -libdir = $(exec_prefix)/lib -psdir = $(docdir) -pdfdir = $(docdir) -dvidir = $(docdir) -htmldir = $(docdir) -infodir = $(datarootdir)/info -docdir = $(datarootdir)/doc/$(PACKAGE) -oldincludedir = $(SDKROOT)/usr/include -includedir = $(prefix)/include -runstatedir = $(localstatedir)/run -localstatedir = $(prefix)/var -sharedstatedir = $(prefix)/com -sysconfdir = $(prefix)/etc -datadir = $(datarootdir) -datarootdir = $(prefix)/share -libexecdir = $(exec_prefix)/libexec -sbindir = $(exec_prefix)/sbin -bindir = $(exec_prefix)/bin -archdir = $(rubyarchdir) - - -CC_WRAPPER = -CC = gcc -CXX = g++ -LIBRUBY = $(LIBRUBY_SO) -LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a -LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME) -LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static -framework Security -framework Foundation $(MAINLIBS) -empty = -OUTFLAG = -o $(empty) -COUTFLAG = -o $(empty) -CSRCFLAG = $(empty) - -RUBY_EXTCONF_H = -cflags = $(optflags) $(debugflags) $(warnflags) -cxxflags = -optflags = -O3 -debugflags = -ggdb3 -warnflags = -Wall -Wextra -Wdeprecated-declarations -Wdivision-by-zero -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wshorten-64-to-32 -Wwrite-strings -Wmissing-noreturn -Wno-cast-function-type -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wunused-variable -Wextra-tokens -cppflags = -CCDLFLAGS = -fno-common -CFLAGS = $(CCDLFLAGS) -g -O2 -fno-common -pipe $(ARCH_FLAG) -INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir) -DEFS = -CPPFLAGS = -DJSON_GENERATOR -I/opt/homebrew/opt/libyaml/include -I/opt/homebrew/opt/libksba/include -I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/zlib/include -I/opt/homebrew/opt/openssl@1.1/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT $(DEFS) $(cppflags) -CXXFLAGS = $(CCDLFLAGS) -g -O2 $(ARCH_FLAG) -ldflags = -L. -fstack-protector-strong -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -dldflags = -Wl,-multiply_defined,suppress -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -ARCH_FLAG = -m64 -DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG) -LDSHARED = $(CC) -dynamic -bundle -LDSHAREDXX = $(CXX) -dynamic -bundle -AR = libtool -static -EXEEXT = - -RUBY_INSTALL_NAME = $(RUBY_BASE_NAME) -RUBY_SO_NAME = ruby.2.7 -RUBYW_INSTALL_NAME = -RUBY_VERSION_NAME = $(RUBY_BASE_NAME)-$(ruby_version) -RUBYW_BASE_NAME = rubyw -RUBY_BASE_NAME = ruby - -arch = arm64-darwin22 -sitearch = $(arch) -ruby_version = 2.7.0 -ruby = $(bindir)/$(RUBY_BASE_NAME) -RUBY = $(ruby) -ruby_headers = $(hdrdir)/ruby.h $(hdrdir)/ruby/backward.h $(hdrdir)/ruby/ruby.h $(hdrdir)/ruby/defines.h $(hdrdir)/ruby/missing.h $(hdrdir)/ruby/intern.h $(hdrdir)/ruby/st.h $(hdrdir)/ruby/subst.h $(arch_hdrdir)/ruby/config.h - -RM = rm -f -RM_RF = $(RUBY) -run -e rm -- -rf -RMDIRS = rmdir -p -MAKEDIRS = /opt/homebrew/opt/coreutils/bin/gmkdir -p -INSTALL = /opt/homebrew/opt/coreutils/bin/ginstall -c -INSTALL_PROG = $(INSTALL) -m 0755 -INSTALL_DATA = $(INSTALL) -m 644 -COPY = cp -TOUCH = exit > - -#### End of system configuration section. #### - -preload = -libpath = . $(libdir) /opt/homebrew/opt/libyaml/lib /opt/homebrew/opt/libksba/lib /opt/homebrew/opt/readline/lib /opt/homebrew/opt/zlib/lib /opt/homebrew/opt/openssl@1.1/lib -LIBPATH = -L. -L$(libdir) -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -DEFFILE = - -CLEANFILES = mkmf.log -DISTCLEANFILES = -DISTCLEANDIRS = - -extout = -extout_prefix = -target_prefix = /json/ext -LOCAL_LIBS = -LIBS = $(LIBRUBYARG_SHARED) -ORIG_SRCS = generator.c -SRCS = $(ORIG_SRCS) -OBJS = generator.o -HDRS = $(srcdir)/generator.h -LOCAL_HDRS = -TARGET = generator -TARGET_NAME = generator -TARGET_ENTRY = Init_$(TARGET_NAME) -DLLIB = $(TARGET).bundle -EXTSTATIC = -STATIC_LIB = - -TIMESTAMP_DIR = . -BINDIR = $(bindir) -RUBYCOMMONDIR = $(sitedir)$(target_prefix) -RUBYLIBDIR = $(sitelibdir)$(target_prefix) -RUBYARCHDIR = $(sitearchdir)$(target_prefix) -HDRDIR = $(rubyhdrdir)/ruby$(target_prefix) -ARCHHDRDIR = $(rubyhdrdir)/$(arch)/ruby$(target_prefix) -TARGET_SO_DIR = -TARGET_SO = $(TARGET_SO_DIR)$(DLLIB) -CLEANLIBS = $(TARGET_SO) -CLEANOBJS = *.o *.bak - -all: $(DLLIB) -static: $(STATIC_LIB) -.PHONY: all install static install-so install-rb -.PHONY: clean clean-so clean-static clean-rb - -clean-static:: -clean-rb-default:: -clean-rb:: -clean-so:: -clean: clean-so clean-static clean-rb-default clean-rb - -$(Q)$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) .*.time - -distclean-rb-default:: -distclean-rb:: -distclean-so:: -distclean-static:: -distclean: clean distclean-so distclean-static distclean-rb-default distclean-rb - -$(Q)$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log - -$(Q)$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES) - -$(Q)$(RMDIRS) $(DISTCLEANDIRS) 2> /dev/null || true - -realclean: distclean -install: install-so install-rb - -install-so: $(DLLIB) $(TIMESTAMP_DIR)/.sitearchdir.-.json.-.ext.time - $(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR) -clean-static:: - -$(Q)$(RM) $(STATIC_LIB) -install-rb: pre-install-rb do-install-rb install-rb-default -install-rb-default: pre-install-rb-default do-install-rb-default -pre-install-rb: Makefile -pre-install-rb-default: Makefile -do-install-rb: -do-install-rb-default: -pre-install-rb-default: - @$(NULLCMD) -$(TIMESTAMP_DIR)/.sitearchdir.-.json.-.ext.time: - $(Q) $(MAKEDIRS) $(@D) $(RUBYARCHDIR) - $(Q) $(TOUCH) $@ - -site-install: site-install-so site-install-rb -site-install-so: install-so -site-install-rb: install-rb - -.SUFFIXES: .c .m .cc .mm .cxx .cpp .o .S - -.cc.o: - $(ECHO) compiling $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.cc.S: - $(ECHO) translating $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.mm.o: - $(ECHO) compiling $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.mm.S: - $(ECHO) translating $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.cxx.o: - $(ECHO) compiling $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.cxx.S: - $(ECHO) translating $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.cpp.o: - $(ECHO) compiling $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.cpp.S: - $(ECHO) translating $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.c.o: - $(ECHO) compiling $(<) - $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.c.S: - $(ECHO) translating $(<) - $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.m.o: - $(ECHO) compiling $(<) - $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.m.S: - $(ECHO) translating $(<) - $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -$(TARGET_SO): $(OBJS) Makefile - $(ECHO) linking shared-object json/ext/$(DLLIB) - -$(Q)$(RM) $(@) - $(Q) $(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS) - $(Q) $(POSTLINK) - - - -### -generator.o: generator.c generator.h $(srcdir)/../fbuffer/fbuffer.h diff --git a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/generator/depend b/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/generator/depend deleted file mode 100644 index 1a042a2..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/generator/depend +++ /dev/null @@ -1 +0,0 @@ -generator.o: generator.c generator.h $(srcdir)/../fbuffer/fbuffer.h diff --git a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/generator/extconf.rb b/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/generator/extconf.rb deleted file mode 100644 index 8627c5f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/generator/extconf.rb +++ /dev/null @@ -1,4 +0,0 @@ -require 'mkmf' - -$defs << "-DJSON_GENERATOR" -create_makefile 'json/ext/generator' diff --git a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/generator/generator.bundle b/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/generator/generator.bundle deleted file mode 100755 index 6afc94e89926508af748d8cd34488a74a2181cf1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63885 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 4, this returns 0. The Unicode - * definition of UTF-8 goes up to 4-byte sequences. - */ -static unsigned char isLegalUTF8(const UTF8 *source, unsigned long length) -{ - UTF8 a; - const UTF8 *srcptr = source+length; - switch (length) { - default: return 0; - /* Everything else falls through when "1"... */ - case 4: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return 0; - case 3: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return 0; - case 2: if ((a = (*--srcptr)) > 0xBF) return 0; - - switch (*source) { - /* no fall-through in this inner switch */ - case 0xE0: if (a < 0xA0) return 0; break; - case 0xED: if (a > 0x9F) return 0; break; - case 0xF0: if (a < 0x90) return 0; break; - case 0xF4: if (a > 0x8F) return 0; break; - default: if (a < 0x80) return 0; - } - - case 1: if (*source >= 0x80 && *source < 0xC2) return 0; - } - if (*source > 0xF4) return 0; - return 1; -} - -/* Escapes the UTF16 character and stores the result in the buffer buf. */ -static void unicode_escape(char *buf, UTF16 character) -{ - const char *digits = "0123456789abcdef"; - - buf[2] = digits[character >> 12]; - buf[3] = digits[(character >> 8) & 0xf]; - buf[4] = digits[(character >> 4) & 0xf]; - buf[5] = digits[character & 0xf]; -} - -/* Escapes the UTF16 character and stores the result in the buffer buf, then - * the buffer buf is appended to the FBuffer buffer. */ -static void unicode_escape_to_buffer(FBuffer *buffer, char buf[6], UTF16 - character) -{ - unicode_escape(buf, character); - fbuffer_append(buffer, buf, 6); -} - -/* Converts string to a JSON string in FBuffer buffer, where all but the ASCII - * and control characters are JSON escaped. */ -static void convert_UTF8_to_JSON_ASCII(FBuffer *buffer, VALUE string, char escape_slash) -{ - const UTF8 *source = (UTF8 *) RSTRING_PTR(string); - const UTF8 *sourceEnd = source + RSTRING_LEN(string); - char buf[6] = { '\\', 'u' }; - - while (source < sourceEnd) { - UTF32 ch = 0; - unsigned short extraBytesToRead = trailingBytesForUTF8[*source]; - if (source + extraBytesToRead >= sourceEnd) { - rb_raise(rb_path2class("JSON::GeneratorError"), - "partial character in source, but hit end"); - } - if (!isLegalUTF8(source, extraBytesToRead+1)) { - rb_raise(rb_path2class("JSON::GeneratorError"), - "source sequence is illegal/malformed utf-8"); - } - /* - * The cases all fall through. See "Note A" below. - */ - switch (extraBytesToRead) { - case 5: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */ - case 4: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */ - case 3: ch += *source++; ch <<= 6; - case 2: ch += *source++; ch <<= 6; - case 1: ch += *source++; ch <<= 6; - case 0: ch += *source++; - } - ch -= offsetsFromUTF8[extraBytesToRead]; - - if (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */ - /* UTF-16 surrogate values are illegal in UTF-32 */ - if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) { -#if UNI_STRICT_CONVERSION - source -= (extraBytesToRead+1); /* return to the illegal value itself */ - rb_raise(rb_path2class("JSON::GeneratorError"), - "source sequence is illegal/malformed utf-8"); -#else - unicode_escape_to_buffer(buffer, buf, UNI_REPLACEMENT_CHAR); -#endif - } else { - /* normal case */ - if (ch >= 0x20 && ch <= 0x7f) { - switch (ch) { - case '\\': - fbuffer_append(buffer, "\\\\", 2); - break; - case '"': - fbuffer_append(buffer, "\\\"", 2); - break; - case '/': - if(escape_slash) { - fbuffer_append(buffer, "\\/", 2); - break; - } - default: - fbuffer_append_char(buffer, (char)ch); - break; - } - } else { - switch (ch) { - case '\n': - fbuffer_append(buffer, "\\n", 2); - break; - case '\r': - fbuffer_append(buffer, "\\r", 2); - break; - case '\t': - fbuffer_append(buffer, "\\t", 2); - break; - case '\f': - fbuffer_append(buffer, "\\f", 2); - break; - case '\b': - fbuffer_append(buffer, "\\b", 2); - break; - default: - unicode_escape_to_buffer(buffer, buf, (UTF16) ch); - break; - } - } - } - } else if (ch > UNI_MAX_UTF16) { -#if UNI_STRICT_CONVERSION - source -= (extraBytesToRead+1); /* return to the start */ - rb_raise(rb_path2class("JSON::GeneratorError"), - "source sequence is illegal/malformed utf8"); -#else - unicode_escape_to_buffer(buffer, buf, UNI_REPLACEMENT_CHAR); -#endif - } else { - /* target is a character in range 0xFFFF - 0x10FFFF. */ - ch -= halfBase; - unicode_escape_to_buffer(buffer, buf, (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START)); - unicode_escape_to_buffer(buffer, buf, (UTF16)((ch & halfMask) + UNI_SUR_LOW_START)); - } - } - RB_GC_GUARD(string); -} - -/* Converts string to a JSON string in FBuffer buffer, where only the - * characters required by the JSON standard are JSON escaped. The remaining - * characters (should be UTF8) are just passed through and appended to the - * result. */ -static void convert_UTF8_to_JSON(FBuffer *buffer, VALUE string, char escape_slash) -{ - const char *ptr = RSTRING_PTR(string), *p; - unsigned long len = RSTRING_LEN(string), start = 0, end = 0; - const char *escape = NULL; - int escape_len; - unsigned char c; - char buf[6] = { '\\', 'u' }; - int ascii_only = rb_enc_str_asciionly_p(string); - - for (start = 0, end = 0; end < len;) { - p = ptr + end; - c = (unsigned char) *p; - if (c < 0x20) { - switch (c) { - case '\n': - escape = "\\n"; - escape_len = 2; - break; - case '\r': - escape = "\\r"; - escape_len = 2; - break; - case '\t': - escape = "\\t"; - escape_len = 2; - break; - case '\f': - escape = "\\f"; - escape_len = 2; - break; - case '\b': - escape = "\\b"; - escape_len = 2; - break; - default: - unicode_escape(buf, (UTF16) *p); - escape = buf; - escape_len = 6; - break; - } - } else { - switch (c) { - case '\\': - escape = "\\\\"; - escape_len = 2; - break; - case '"': - escape = "\\\""; - escape_len = 2; - break; - case '/': - if(escape_slash) { - escape = "\\/"; - escape_len = 2; - break; - } - default: - { - unsigned short clen = 1; - if (!ascii_only) { - clen += trailingBytesForUTF8[c]; - if (end + clen > len) { - rb_raise(rb_path2class("JSON::GeneratorError"), - "partial character in source, but hit end"); - } - if (!isLegalUTF8((UTF8 *) p, clen)) { - rb_raise(rb_path2class("JSON::GeneratorError"), - "source sequence is illegal/malformed utf-8"); - } - } - end += clen; - } - continue; - break; - } - } - fbuffer_append(buffer, ptr + start, end - start); - fbuffer_append(buffer, escape, escape_len); - start = ++end; - escape = NULL; - } - fbuffer_append(buffer, ptr + start, end - start); -} - -static char *fstrndup(const char *ptr, unsigned long len) { - char *result; - if (len <= 0) return NULL; - result = ALLOC_N(char, len); - memcpy(result, ptr, len); - return result; -} - -/* - * Document-module: JSON::Ext::Generator - * - * This is the JSON generator implemented as a C extension. It can be - * configured to be used by setting - * - * JSON.generator = JSON::Ext::Generator - * - * with the method generator= in JSON. - * - */ - -/* Explanation of the following: that's the only way to not pollute - * standard library's docs with GeneratorMethods:: which - * are uninformative and take a large place in a list of classes - */ - -/* - * Document-module: JSON::Ext::Generator::GeneratorMethods - * :nodoc: - */ - -/* - * Document-module: JSON::Ext::Generator::GeneratorMethods::Array - * :nodoc: - */ - -/* - * Document-module: JSON::Ext::Generator::GeneratorMethods::Bignum - * :nodoc: - */ - -/* - * Document-module: JSON::Ext::Generator::GeneratorMethods::FalseClass - * :nodoc: - */ - -/* - * Document-module: JSON::Ext::Generator::GeneratorMethods::Fixnum - * :nodoc: - */ - -/* - * Document-module: JSON::Ext::Generator::GeneratorMethods::Float - * :nodoc: - */ - -/* - * Document-module: JSON::Ext::Generator::GeneratorMethods::Hash - * :nodoc: - */ - -/* - * Document-module: JSON::Ext::Generator::GeneratorMethods::Integer - * :nodoc: - */ - -/* - * Document-module: JSON::Ext::Generator::GeneratorMethods::NilClass - * :nodoc: - */ - -/* - * Document-module: JSON::Ext::Generator::GeneratorMethods::Object - * :nodoc: - */ - -/* - * Document-module: JSON::Ext::Generator::GeneratorMethods::String - * :nodoc: - */ - -/* - * Document-module: JSON::Ext::Generator::GeneratorMethods::String::Extend - * :nodoc: - */ - -/* - * Document-module: JSON::Ext::Generator::GeneratorMethods::TrueClass - * :nodoc: - */ - -/* - * call-seq: to_json(state = nil) - * - * Returns a JSON string containing a JSON object, that is generated from - * this Hash instance. - * _state_ is a JSON::State object, that can also be used to configure the - * produced JSON string output further. - */ -static VALUE mHash_to_json(int argc, VALUE *argv, VALUE self) -{ - GENERATE_JSON(object); -} - -/* - * call-seq: to_json(state = nil) - * - * Returns a JSON string containing a JSON array, that is generated from - * this Array instance. - * _state_ is a JSON::State object, that can also be used to configure the - * produced JSON string output further. - */ -static VALUE mArray_to_json(int argc, VALUE *argv, VALUE self) { - GENERATE_JSON(array); -} - -#ifdef RUBY_INTEGER_UNIFICATION -/* - * call-seq: to_json(*) - * - * Returns a JSON string representation for this Integer number. - */ -static VALUE mInteger_to_json(int argc, VALUE *argv, VALUE self) -{ - GENERATE_JSON(integer); -} - -#else -/* - * call-seq: to_json(*) - * - * Returns a JSON string representation for this Integer number. - */ -static VALUE mFixnum_to_json(int argc, VALUE *argv, VALUE self) -{ - GENERATE_JSON(fixnum); -} - -/* - * call-seq: to_json(*) - * - * Returns a JSON string representation for this Integer number. - */ -static VALUE mBignum_to_json(int argc, VALUE *argv, VALUE self) -{ - GENERATE_JSON(bignum); -} -#endif - -/* - * call-seq: to_json(*) - * - * Returns a JSON string representation for this Float number. - */ -static VALUE mFloat_to_json(int argc, VALUE *argv, VALUE self) -{ - GENERATE_JSON(float); -} - -/* - * call-seq: String.included(modul) - * - * Extends _modul_ with the String::Extend module. - */ -static VALUE mString_included_s(VALUE self, VALUE modul) { - VALUE result = rb_funcall(modul, i_extend, 1, mString_Extend); - return result; -} - -/* - * call-seq: to_json(*) - * - * This string should be encoded with UTF-8 A call to this method - * returns a JSON string encoded with UTF16 big endian characters as - * \u????. - */ -static VALUE mString_to_json(int argc, VALUE *argv, VALUE self) -{ - GENERATE_JSON(string); -} - -/* - * call-seq: to_json_raw_object() - * - * This method creates a raw object hash, that can be nested into - * other data structures and will be generated as a raw string. This - * method should be used, if you want to convert raw strings to JSON - * instead of UTF-8 strings, e. g. binary data. - */ -static VALUE mString_to_json_raw_object(VALUE self) -{ - VALUE ary; - VALUE result = rb_hash_new(); - rb_hash_aset(result, rb_funcall(mJSON, i_create_id, 0), rb_class_name(rb_obj_class(self))); - ary = rb_funcall(self, i_unpack, 1, rb_str_new2("C*")); - rb_hash_aset(result, rb_str_new2("raw"), ary); - return result; -} - -/* - * call-seq: to_json_raw(*args) - * - * This method creates a JSON text from the result of a call to - * to_json_raw_object of this String. - */ -static VALUE mString_to_json_raw(int argc, VALUE *argv, VALUE self) -{ - VALUE obj = mString_to_json_raw_object(self); - Check_Type(obj, T_HASH); - return mHash_to_json(argc, argv, obj); -} - -/* - * call-seq: json_create(o) - * - * Raw Strings are JSON Objects (the raw bytes are stored in an array for the - * key "raw"). The Ruby String can be created by this module method. - */ -static VALUE mString_Extend_json_create(VALUE self, VALUE o) -{ - VALUE ary; - Check_Type(o, T_HASH); - ary = rb_hash_aref(o, rb_str_new2("raw")); - return rb_funcall(ary, i_pack, 1, rb_str_new2("C*")); -} - -/* - * call-seq: to_json(*) - * - * Returns a JSON string for true: 'true'. - */ -static VALUE mTrueClass_to_json(int argc, VALUE *argv, VALUE self) -{ - GENERATE_JSON(true); -} - -/* - * call-seq: to_json(*) - * - * Returns a JSON string for false: 'false'. - */ -static VALUE mFalseClass_to_json(int argc, VALUE *argv, VALUE self) -{ - GENERATE_JSON(false); -} - -/* - * call-seq: to_json(*) - * - * Returns a JSON string for nil: 'null'. - */ -static VALUE mNilClass_to_json(int argc, VALUE *argv, VALUE self) -{ - GENERATE_JSON(null); -} - -/* - * call-seq: to_json(*) - * - * Converts this object to a string (calling #to_s), converts - * it to a JSON string, and returns the result. This is a fallback, if no - * special method #to_json was defined for some object. - */ -static VALUE mObject_to_json(int argc, VALUE *argv, VALUE self) -{ - VALUE state; - VALUE string = rb_funcall(self, i_to_s, 0); - rb_scan_args(argc, argv, "01", &state); - Check_Type(string, T_STRING); - state = cState_from_state_s(cState, state); - return cState_partial_generate(state, string); -} - -static void State_free(void *ptr) -{ - JSON_Generator_State *state = ptr; - if (state->indent) ruby_xfree(state->indent); - if (state->space) ruby_xfree(state->space); - if (state->space_before) ruby_xfree(state->space_before); - if (state->object_nl) ruby_xfree(state->object_nl); - if (state->array_nl) ruby_xfree(state->array_nl); - if (state->array_delim) fbuffer_free(state->array_delim); - if (state->object_delim) fbuffer_free(state->object_delim); - if (state->object_delim2) fbuffer_free(state->object_delim2); - ruby_xfree(state); -} - -static size_t State_memsize(const void *ptr) -{ - const JSON_Generator_State *state = ptr; - size_t size = sizeof(*state); - if (state->indent) size += state->indent_len + 1; - if (state->space) size += state->space_len + 1; - if (state->space_before) size += state->space_before_len + 1; - if (state->object_nl) size += state->object_nl_len + 1; - if (state->array_nl) size += state->array_nl_len + 1; - if (state->array_delim) size += FBUFFER_CAPA(state->array_delim); - if (state->object_delim) size += FBUFFER_CAPA(state->object_delim); - if (state->object_delim2) size += FBUFFER_CAPA(state->object_delim2); - return size; -} - -#ifndef HAVE_RB_EXT_RACTOR_SAFE -# undef RUBY_TYPED_FROZEN_SHAREABLE -# define RUBY_TYPED_FROZEN_SHAREABLE 0 -#endif - -#ifdef NEW_TYPEDDATA_WRAPPER -static const rb_data_type_t JSON_Generator_State_type = { - "JSON/Generator/State", - {NULL, State_free, State_memsize,}, -#ifdef RUBY_TYPED_FREE_IMMEDIATELY - 0, 0, - RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_FROZEN_SHAREABLE, -#endif -}; -#endif - -static VALUE cState_s_allocate(VALUE klass) -{ - JSON_Generator_State *state; - return TypedData_Make_Struct(klass, JSON_Generator_State, - &JSON_Generator_State_type, state); -} - -/* - * call-seq: configure(opts) - * - * Configure this State instance with the Hash _opts_, and return - * itself. - */ -static VALUE cState_configure(VALUE self, VALUE opts) -{ - VALUE tmp; - GET_STATE(self); - tmp = rb_check_convert_type(opts, T_HASH, "Hash", "to_hash"); - if (NIL_P(tmp)) tmp = rb_convert_type(opts, T_HASH, "Hash", "to_h"); - opts = tmp; - tmp = rb_hash_aref(opts, ID2SYM(i_indent)); - if (RTEST(tmp)) { - unsigned long len; - Check_Type(tmp, T_STRING); - len = RSTRING_LEN(tmp); - state->indent = fstrndup(RSTRING_PTR(tmp), len + 1); - state->indent_len = len; - } - tmp = rb_hash_aref(opts, ID2SYM(i_space)); - if (RTEST(tmp)) { - unsigned long len; - Check_Type(tmp, T_STRING); - len = RSTRING_LEN(tmp); - state->space = fstrndup(RSTRING_PTR(tmp), len + 1); - state->space_len = len; - } - tmp = rb_hash_aref(opts, ID2SYM(i_space_before)); - if (RTEST(tmp)) { - unsigned long len; - Check_Type(tmp, T_STRING); - len = RSTRING_LEN(tmp); - state->space_before = fstrndup(RSTRING_PTR(tmp), len + 1); - state->space_before_len = len; - } - tmp = rb_hash_aref(opts, ID2SYM(i_array_nl)); - if (RTEST(tmp)) { - unsigned long len; - Check_Type(tmp, T_STRING); - len = RSTRING_LEN(tmp); - state->array_nl = fstrndup(RSTRING_PTR(tmp), len + 1); - state->array_nl_len = len; - } - tmp = rb_hash_aref(opts, ID2SYM(i_object_nl)); - if (RTEST(tmp)) { - unsigned long len; - Check_Type(tmp, T_STRING); - len = RSTRING_LEN(tmp); - state->object_nl = fstrndup(RSTRING_PTR(tmp), len + 1); - state->object_nl_len = len; - } - tmp = ID2SYM(i_max_nesting); - state->max_nesting = 100; - if (option_given_p(opts, tmp)) { - VALUE max_nesting = rb_hash_aref(opts, tmp); - if (RTEST(max_nesting)) { - Check_Type(max_nesting, T_FIXNUM); - state->max_nesting = FIX2LONG(max_nesting); - } else { - state->max_nesting = 0; - } - } - tmp = ID2SYM(i_depth); - state->depth = 0; - if (option_given_p(opts, tmp)) { - VALUE depth = rb_hash_aref(opts, tmp); - if (RTEST(depth)) { - Check_Type(depth, T_FIXNUM); - state->depth = FIX2LONG(depth); - } else { - state->depth = 0; - } - } - tmp = ID2SYM(i_buffer_initial_length); - if (option_given_p(opts, tmp)) { - VALUE buffer_initial_length = rb_hash_aref(opts, tmp); - if (RTEST(buffer_initial_length)) { - long initial_length; - Check_Type(buffer_initial_length, T_FIXNUM); - initial_length = FIX2LONG(buffer_initial_length); - if (initial_length > 0) state->buffer_initial_length = initial_length; - } - } - tmp = rb_hash_aref(opts, ID2SYM(i_allow_nan)); - state->allow_nan = RTEST(tmp); - tmp = rb_hash_aref(opts, ID2SYM(i_ascii_only)); - state->ascii_only = RTEST(tmp); - tmp = rb_hash_aref(opts, ID2SYM(i_escape_slash)); - state->escape_slash = RTEST(tmp); - return self; -} - -static void set_state_ivars(VALUE hash, VALUE state) -{ - VALUE ivars = rb_obj_instance_variables(state); - int i = 0; - for (i = 0; i < RARRAY_LEN(ivars); i++) { - VALUE key = rb_funcall(rb_ary_entry(ivars, i), i_to_s, 0); - long key_len = RSTRING_LEN(key); - VALUE value = rb_iv_get(state, StringValueCStr(key)); - rb_hash_aset(hash, rb_str_intern(rb_str_substr(key, 1, key_len - 1)), value); - } -} - -/* - * call-seq: to_h - * - * Returns the configuration instance variables as a hash, that can be - * passed to the configure method. - */ -static VALUE cState_to_h(VALUE self) -{ - VALUE result = rb_hash_new(); - GET_STATE(self); - set_state_ivars(result, self); - rb_hash_aset(result, ID2SYM(i_indent), rb_str_new(state->indent, state->indent_len)); - rb_hash_aset(result, ID2SYM(i_space), rb_str_new(state->space, state->space_len)); - rb_hash_aset(result, ID2SYM(i_space_before), rb_str_new(state->space_before, state->space_before_len)); - rb_hash_aset(result, ID2SYM(i_object_nl), rb_str_new(state->object_nl, state->object_nl_len)); - rb_hash_aset(result, ID2SYM(i_array_nl), rb_str_new(state->array_nl, state->array_nl_len)); - rb_hash_aset(result, ID2SYM(i_allow_nan), state->allow_nan ? Qtrue : Qfalse); - rb_hash_aset(result, ID2SYM(i_ascii_only), state->ascii_only ? Qtrue : Qfalse); - rb_hash_aset(result, ID2SYM(i_max_nesting), LONG2FIX(state->max_nesting)); - rb_hash_aset(result, ID2SYM(i_escape_slash), state->escape_slash ? Qtrue : Qfalse); - rb_hash_aset(result, ID2SYM(i_depth), LONG2FIX(state->depth)); - rb_hash_aset(result, ID2SYM(i_buffer_initial_length), LONG2FIX(state->buffer_initial_length)); - return result; -} - -/* -* call-seq: [](name) -* -* Returns the value returned by method +name+. -*/ -static VALUE cState_aref(VALUE self, VALUE name) -{ - name = rb_funcall(name, i_to_s, 0); - if (RTEST(rb_funcall(self, i_respond_to_p, 1, name))) { - return rb_funcall(self, i_send, 1, name); - } else { - return rb_attr_get(self, rb_intern_str(rb_str_concat(rb_str_new2("@"), name))); - } -} - -/* -* call-seq: []=(name, value) -* -* Sets the attribute name to value. -*/ -static VALUE cState_aset(VALUE self, VALUE name, VALUE value) -{ - VALUE name_writer; - - name = rb_funcall(name, i_to_s, 0); - name_writer = rb_str_cat2(rb_str_dup(name), "="); - if (RTEST(rb_funcall(self, i_respond_to_p, 1, name_writer))) { - return rb_funcall(self, i_send, 2, name_writer, value); - } else { - rb_ivar_set(self, rb_intern_str(rb_str_concat(rb_str_new2("@"), name)), value); - } - return Qnil; -} - -struct hash_foreach_arg { - FBuffer *buffer; - JSON_Generator_State *state; - VALUE Vstate; - int iter; -}; - -static int -json_object_i(VALUE key, VALUE val, VALUE _arg) -{ - struct hash_foreach_arg *arg = (struct hash_foreach_arg *)_arg; - FBuffer *buffer = arg->buffer; - JSON_Generator_State *state = arg->state; - VALUE Vstate = arg->Vstate; - - char *object_nl = state->object_nl; - long object_nl_len = state->object_nl_len; - char *indent = state->indent; - long indent_len = state->indent_len; - char *delim = FBUFFER_PTR(state->object_delim); - long delim_len = FBUFFER_LEN(state->object_delim); - char *delim2 = FBUFFER_PTR(state->object_delim2); - long delim2_len = FBUFFER_LEN(state->object_delim2); - long depth = state->depth; - int j; - VALUE klass, key_to_s; - - if (arg->iter > 0) fbuffer_append(buffer, delim, delim_len); - if (object_nl) { - fbuffer_append(buffer, object_nl, object_nl_len); - } - if (indent) { - for (j = 0; j < depth; j++) { - fbuffer_append(buffer, indent, indent_len); - } - } - - klass = CLASS_OF(key); - if (klass == rb_cString) { - key_to_s = key; - } else if (klass == rb_cSymbol) { - key_to_s = rb_id2str(SYM2ID(key)); - } else { - key_to_s = rb_funcall(key, i_to_s, 0); - } - Check_Type(key_to_s, T_STRING); - generate_json(buffer, Vstate, state, key_to_s); - fbuffer_append(buffer, delim2, delim2_len); - generate_json(buffer, Vstate, state, val); - - arg->iter++; - return ST_CONTINUE; -} - -static void generate_json_object(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj) -{ - char *object_nl = state->object_nl; - long object_nl_len = state->object_nl_len; - char *indent = state->indent; - long indent_len = state->indent_len; - long max_nesting = state->max_nesting; - long depth = ++state->depth; - int j; - struct hash_foreach_arg arg; - - if (max_nesting != 0 && depth > max_nesting) { - fbuffer_free(buffer); - rb_raise(eNestingError, "nesting of %ld is too deep", --state->depth); - } - fbuffer_append_char(buffer, '{'); - - arg.buffer = buffer; - arg.state = state; - arg.Vstate = Vstate; - arg.iter = 0; - rb_hash_foreach(obj, json_object_i, (VALUE)&arg); - - depth = --state->depth; - if (object_nl) { - fbuffer_append(buffer, object_nl, object_nl_len); - if (indent) { - for (j = 0; j < depth; j++) { - fbuffer_append(buffer, indent, indent_len); - } - } - } - fbuffer_append_char(buffer, '}'); -} - -static void generate_json_array(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj) -{ - char *array_nl = state->array_nl; - long array_nl_len = state->array_nl_len; - char *indent = state->indent; - long indent_len = state->indent_len; - long max_nesting = state->max_nesting; - char *delim = FBUFFER_PTR(state->array_delim); - long delim_len = FBUFFER_LEN(state->array_delim); - long depth = ++state->depth; - int i, j; - if (max_nesting != 0 && depth > max_nesting) { - fbuffer_free(buffer); - rb_raise(eNestingError, "nesting of %ld is too deep", --state->depth); - } - fbuffer_append_char(buffer, '['); - if (array_nl) fbuffer_append(buffer, array_nl, array_nl_len); - for(i = 0; i < RARRAY_LEN(obj); i++) { - if (i > 0) fbuffer_append(buffer, delim, delim_len); - if (indent) { - for (j = 0; j < depth; j++) { - fbuffer_append(buffer, indent, indent_len); - } - } - generate_json(buffer, Vstate, state, rb_ary_entry(obj, i)); - } - state->depth = --depth; - if (array_nl) { - fbuffer_append(buffer, array_nl, array_nl_len); - if (indent) { - for (j = 0; j < depth; j++) { - fbuffer_append(buffer, indent, indent_len); - } - } - } - fbuffer_append_char(buffer, ']'); -} - -#ifdef HAVE_RUBY_ENCODING_H -static int enc_utf8_compatible_p(rb_encoding *enc) -{ - if (enc == rb_usascii_encoding()) return 1; - if (enc == rb_utf8_encoding()) return 1; - return 0; -} -#endif - -static void generate_json_string(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj) -{ - fbuffer_append_char(buffer, '"'); -#ifdef HAVE_RUBY_ENCODING_H - if (!enc_utf8_compatible_p(rb_enc_get(obj))) { - obj = rb_str_export_to_enc(obj, rb_utf8_encoding()); - } -#endif - if (state->ascii_only) { - convert_UTF8_to_JSON_ASCII(buffer, obj, state->escape_slash); - } else { - convert_UTF8_to_JSON(buffer, obj, state->escape_slash); - } - fbuffer_append_char(buffer, '"'); -} - -static void generate_json_null(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj) -{ - fbuffer_append(buffer, "null", 4); -} - -static void generate_json_false(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj) -{ - fbuffer_append(buffer, "false", 5); -} - -static void generate_json_true(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj) -{ - fbuffer_append(buffer, "true", 4); -} - -static void generate_json_fixnum(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj) -{ - fbuffer_append_long(buffer, FIX2LONG(obj)); -} - -static void generate_json_bignum(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj) -{ - VALUE tmp = rb_funcall(obj, i_to_s, 0); - fbuffer_append_str(buffer, tmp); -} - -#ifdef RUBY_INTEGER_UNIFICATION -static void generate_json_integer(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj) -{ - if (FIXNUM_P(obj)) - generate_json_fixnum(buffer, Vstate, state, obj); - else - generate_json_bignum(buffer, Vstate, state, obj); -} -#endif -static void generate_json_float(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj) -{ - double value = RFLOAT_VALUE(obj); - char allow_nan = state->allow_nan; - VALUE tmp = rb_funcall(obj, i_to_s, 0); - if (!allow_nan) { - if (isinf(value)) { - fbuffer_free(buffer); - rb_raise(eGeneratorError, "%"PRIsVALUE" not allowed in JSON", RB_OBJ_STRING(tmp)); - } else if (isnan(value)) { - fbuffer_free(buffer); - rb_raise(eGeneratorError, "%"PRIsVALUE" not allowed in JSON", RB_OBJ_STRING(tmp)); - } - } - fbuffer_append_str(buffer, tmp); -} - -static void generate_json(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj) -{ - VALUE tmp; - VALUE klass = CLASS_OF(obj); - if (klass == rb_cHash) { - generate_json_object(buffer, Vstate, state, obj); - } else if (klass == rb_cArray) { - generate_json_array(buffer, Vstate, state, obj); - } else if (klass == rb_cString) { - generate_json_string(buffer, Vstate, state, obj); - } else if (obj == Qnil) { - generate_json_null(buffer, Vstate, state, obj); - } else if (obj == Qfalse) { - generate_json_false(buffer, Vstate, state, obj); - } else if (obj == Qtrue) { - generate_json_true(buffer, Vstate, state, obj); - } else if (FIXNUM_P(obj)) { - generate_json_fixnum(buffer, Vstate, state, obj); - } else if (RB_TYPE_P(obj, T_BIGNUM)) { - generate_json_bignum(buffer, Vstate, state, obj); - } else if (klass == rb_cFloat) { - generate_json_float(buffer, Vstate, state, obj); - } else if (rb_respond_to(obj, i_to_json)) { - tmp = rb_funcall(obj, i_to_json, 1, Vstate); - Check_Type(tmp, T_STRING); - fbuffer_append_str(buffer, tmp); - } else { - tmp = rb_funcall(obj, i_to_s, 0); - Check_Type(tmp, T_STRING); - generate_json_string(buffer, Vstate, state, tmp); - } -} - -static FBuffer *cState_prepare_buffer(VALUE self) -{ - FBuffer *buffer; - GET_STATE(self); - buffer = fbuffer_alloc(state->buffer_initial_length); - - if (state->object_delim) { - fbuffer_clear(state->object_delim); - } else { - state->object_delim = fbuffer_alloc(16); - } - fbuffer_append_char(state->object_delim, ','); - if (state->object_delim2) { - fbuffer_clear(state->object_delim2); - } else { - state->object_delim2 = fbuffer_alloc(16); - } - if (state->space_before) fbuffer_append(state->object_delim2, state->space_before, state->space_before_len); - fbuffer_append_char(state->object_delim2, ':'); - if (state->space) fbuffer_append(state->object_delim2, state->space, state->space_len); - - if (state->array_delim) { - fbuffer_clear(state->array_delim); - } else { - state->array_delim = fbuffer_alloc(16); - } - fbuffer_append_char(state->array_delim, ','); - if (state->array_nl) fbuffer_append(state->array_delim, state->array_nl, state->array_nl_len); - return buffer; -} - -static VALUE cState_partial_generate(VALUE self, VALUE obj) -{ - FBuffer *buffer = cState_prepare_buffer(self); - GET_STATE(self); - generate_json(buffer, self, state, obj); - return fbuffer_to_s(buffer); -} - -/* - * call-seq: generate(obj) - * - * Generates a valid JSON document from object +obj+ and returns the - * result. If no valid JSON document can be created this method raises a - * GeneratorError exception. - */ -static VALUE cState_generate(VALUE self, VALUE obj) -{ - VALUE result = cState_partial_generate(self, obj); - GET_STATE(self); - (void)state; - return result; -} - -/* - * call-seq: new(opts = {}) - * - * Instantiates a new State object, configured by _opts_. - * - * _opts_ can have the following keys: - * - * * *indent*: a string used to indent levels (default: ''), - * * *space*: a string that is put after, a : or , delimiter (default: ''), - * * *space_before*: a string that is put before a : pair delimiter (default: ''), - * * *object_nl*: a string that is put at the end of a JSON object (default: ''), - * * *array_nl*: a string that is put at the end of a JSON array (default: ''), - * * *allow_nan*: true if NaN, Infinity, and -Infinity should be - * generated, otherwise an exception is thrown, if these values are - * encountered. This options defaults to false. - * * *ascii_only*: true if only ASCII characters should be generated. This - * option defaults to false. - * * *buffer_initial_length*: sets the initial length of the generator's - * internal buffer. - */ -static VALUE cState_initialize(int argc, VALUE *argv, VALUE self) -{ - VALUE opts; - GET_STATE(self); - state->max_nesting = 100; - state->buffer_initial_length = FBUFFER_INITIAL_LENGTH_DEFAULT; - rb_scan_args(argc, argv, "01", &opts); - if (!NIL_P(opts)) cState_configure(self, opts); - return self; -} - -/* - * call-seq: initialize_copy(orig) - * - * Initializes this object from orig if it can be duplicated/cloned and returns - * it. -*/ -static VALUE cState_init_copy(VALUE obj, VALUE orig) -{ - JSON_Generator_State *objState, *origState; - - if (obj == orig) return obj; - GET_STATE_TO(obj, objState); - GET_STATE_TO(orig, origState); - if (!objState) rb_raise(rb_eArgError, "unallocated JSON::State"); - - MEMCPY(objState, origState, JSON_Generator_State, 1); - objState->indent = fstrndup(origState->indent, origState->indent_len); - objState->space = fstrndup(origState->space, origState->space_len); - objState->space_before = fstrndup(origState->space_before, origState->space_before_len); - objState->object_nl = fstrndup(origState->object_nl, origState->object_nl_len); - objState->array_nl = fstrndup(origState->array_nl, origState->array_nl_len); - if (origState->array_delim) objState->array_delim = fbuffer_dup(origState->array_delim); - if (origState->object_delim) objState->object_delim = fbuffer_dup(origState->object_delim); - if (origState->object_delim2) objState->object_delim2 = fbuffer_dup(origState->object_delim2); - return obj; -} - -/* - * call-seq: from_state(opts) - * - * Creates a State object from _opts_, which ought to be Hash to create a - * new State instance configured by _opts_, something else to create an - * unconfigured instance. If _opts_ is a State object, it is just returned. - */ -static VALUE cState_from_state_s(VALUE self, VALUE opts) -{ - if (rb_obj_is_kind_of(opts, self)) { - return opts; - } else if (rb_obj_is_kind_of(opts, rb_cHash)) { - return rb_funcall(self, i_new, 1, opts); - } else { - return rb_class_new_instance(0, NULL, cState); - } -} - -/* - * call-seq: indent() - * - * Returns the string that is used to indent levels in the JSON text. - */ -static VALUE cState_indent(VALUE self) -{ - GET_STATE(self); - return state->indent ? rb_str_new(state->indent, state->indent_len) : rb_str_new2(""); -} - -/* - * call-seq: indent=(indent) - * - * Sets the string that is used to indent levels in the JSON text. - */ -static VALUE cState_indent_set(VALUE self, VALUE indent) -{ - unsigned long len; - GET_STATE(self); - Check_Type(indent, T_STRING); - len = RSTRING_LEN(indent); - if (len == 0) { - if (state->indent) { - ruby_xfree(state->indent); - state->indent = NULL; - state->indent_len = 0; - } - } else { - if (state->indent) ruby_xfree(state->indent); - state->indent = fstrndup(RSTRING_PTR(indent), len); - state->indent_len = len; - } - return Qnil; -} - -/* - * call-seq: space() - * - * Returns the string that is used to insert a space between the tokens in a JSON - * string. - */ -static VALUE cState_space(VALUE self) -{ - GET_STATE(self); - return state->space ? rb_str_new(state->space, state->space_len) : rb_str_new2(""); -} - -/* - * call-seq: space=(space) - * - * Sets _space_ to the string that is used to insert a space between the tokens in a JSON - * string. - */ -static VALUE cState_space_set(VALUE self, VALUE space) -{ - unsigned long len; - GET_STATE(self); - Check_Type(space, T_STRING); - len = RSTRING_LEN(space); - if (len == 0) { - if (state->space) { - ruby_xfree(state->space); - state->space = NULL; - state->space_len = 0; - } - } else { - if (state->space) ruby_xfree(state->space); - state->space = fstrndup(RSTRING_PTR(space), len); - state->space_len = len; - } - return Qnil; -} - -/* - * call-seq: space_before() - * - * Returns the string that is used to insert a space before the ':' in JSON objects. - */ -static VALUE cState_space_before(VALUE self) -{ - GET_STATE(self); - return state->space_before ? rb_str_new(state->space_before, state->space_before_len) : rb_str_new2(""); -} - -/* - * call-seq: space_before=(space_before) - * - * Sets the string that is used to insert a space before the ':' in JSON objects. - */ -static VALUE cState_space_before_set(VALUE self, VALUE space_before) -{ - unsigned long len; - GET_STATE(self); - Check_Type(space_before, T_STRING); - len = RSTRING_LEN(space_before); - if (len == 0) { - if (state->space_before) { - ruby_xfree(state->space_before); - state->space_before = NULL; - state->space_before_len = 0; - } - } else { - if (state->space_before) ruby_xfree(state->space_before); - state->space_before = fstrndup(RSTRING_PTR(space_before), len); - state->space_before_len = len; - } - return Qnil; -} - -/* - * call-seq: object_nl() - * - * This string is put at the end of a line that holds a JSON object (or - * Hash). - */ -static VALUE cState_object_nl(VALUE self) -{ - GET_STATE(self); - return state->object_nl ? rb_str_new(state->object_nl, state->object_nl_len) : rb_str_new2(""); -} - -/* - * call-seq: object_nl=(object_nl) - * - * This string is put at the end of a line that holds a JSON object (or - * Hash). - */ -static VALUE cState_object_nl_set(VALUE self, VALUE object_nl) -{ - unsigned long len; - GET_STATE(self); - Check_Type(object_nl, T_STRING); - len = RSTRING_LEN(object_nl); - if (len == 0) { - if (state->object_nl) { - ruby_xfree(state->object_nl); - state->object_nl = NULL; - } - } else { - if (state->object_nl) ruby_xfree(state->object_nl); - state->object_nl = fstrndup(RSTRING_PTR(object_nl), len); - state->object_nl_len = len; - } - return Qnil; -} - -/* - * call-seq: array_nl() - * - * This string is put at the end of a line that holds a JSON array. - */ -static VALUE cState_array_nl(VALUE self) -{ - GET_STATE(self); - return state->array_nl ? rb_str_new(state->array_nl, state->array_nl_len) : rb_str_new2(""); -} - -/* - * call-seq: array_nl=(array_nl) - * - * This string is put at the end of a line that holds a JSON array. - */ -static VALUE cState_array_nl_set(VALUE self, VALUE array_nl) -{ - unsigned long len; - GET_STATE(self); - Check_Type(array_nl, T_STRING); - len = RSTRING_LEN(array_nl); - if (len == 0) { - if (state->array_nl) { - ruby_xfree(state->array_nl); - state->array_nl = NULL; - } - } else { - if (state->array_nl) ruby_xfree(state->array_nl); - state->array_nl = fstrndup(RSTRING_PTR(array_nl), len); - state->array_nl_len = len; - } - return Qnil; -} - - -/* -* call-seq: check_circular? -* -* Returns true, if circular data structures should be checked, -* otherwise returns false. -*/ -static VALUE cState_check_circular_p(VALUE self) -{ - GET_STATE(self); - return state->max_nesting ? Qtrue : Qfalse; -} - -/* - * call-seq: max_nesting - * - * This integer returns the maximum level of data structure nesting in - * the generated JSON, max_nesting = 0 if no maximum is checked. - */ -static VALUE cState_max_nesting(VALUE self) -{ - GET_STATE(self); - return LONG2FIX(state->max_nesting); -} - -/* - * call-seq: max_nesting=(depth) - * - * This sets the maximum level of data structure nesting in the generated JSON - * to the integer depth, max_nesting = 0 if no maximum should be checked. - */ -static VALUE cState_max_nesting_set(VALUE self, VALUE depth) -{ - GET_STATE(self); - Check_Type(depth, T_FIXNUM); - return state->max_nesting = FIX2LONG(depth); -} - -/* - * call-seq: escape_slash - * - * If this boolean is true, the forward slashes will be escaped in - * the json output. - */ -static VALUE cState_escape_slash(VALUE self) -{ - GET_STATE(self); - return state->escape_slash ? Qtrue : Qfalse; -} - -/* - * call-seq: escape_slash=(depth) - * - * This sets whether or not the forward slashes will be escaped in - * the json output. - */ -static VALUE cState_escape_slash_set(VALUE self, VALUE enable) -{ - GET_STATE(self); - state->escape_slash = RTEST(enable); - return Qnil; -} - -/* - * call-seq: allow_nan? - * - * Returns true, if NaN, Infinity, and -Infinity should be generated, otherwise - * returns false. - */ -static VALUE cState_allow_nan_p(VALUE self) -{ - GET_STATE(self); - return state->allow_nan ? Qtrue : Qfalse; -} - -/* - * call-seq: ascii_only? - * - * Returns true, if only ASCII characters should be generated. Otherwise - * returns false. - */ -static VALUE cState_ascii_only_p(VALUE self) -{ - GET_STATE(self); - return state->ascii_only ? Qtrue : Qfalse; -} - -/* - * call-seq: depth - * - * This integer returns the current depth of data structure nesting. - */ -static VALUE cState_depth(VALUE self) -{ - GET_STATE(self); - return LONG2FIX(state->depth); -} - -/* - * call-seq: depth=(depth) - * - * This sets the maximum level of data structure nesting in the generated JSON - * to the integer depth, max_nesting = 0 if no maximum should be checked. - */ -static VALUE cState_depth_set(VALUE self, VALUE depth) -{ - GET_STATE(self); - Check_Type(depth, T_FIXNUM); - state->depth = FIX2LONG(depth); - return Qnil; -} - -/* - * call-seq: buffer_initial_length - * - * This integer returns the current initial length of the buffer. - */ -static VALUE cState_buffer_initial_length(VALUE self) -{ - GET_STATE(self); - return LONG2FIX(state->buffer_initial_length); -} - -/* - * call-seq: buffer_initial_length=(length) - * - * This sets the initial length of the buffer to +length+, if +length+ > 0, - * otherwise its value isn't changed. - */ -static VALUE cState_buffer_initial_length_set(VALUE self, VALUE buffer_initial_length) -{ - long initial_length; - GET_STATE(self); - Check_Type(buffer_initial_length, T_FIXNUM); - initial_length = FIX2LONG(buffer_initial_length); - if (initial_length > 0) { - state->buffer_initial_length = initial_length; - } - return Qnil; -} - -/* - * - */ -void Init_generator(void) -{ -#ifdef HAVE_RB_EXT_RACTOR_SAFE - rb_ext_ractor_safe(true); -#endif - -#undef rb_intern - rb_require("json/common"); - - mJSON = rb_define_module("JSON"); - mExt = rb_define_module_under(mJSON, "Ext"); - mGenerator = rb_define_module_under(mExt, "Generator"); - - eGeneratorError = rb_path2class("JSON::GeneratorError"); - eNestingError = rb_path2class("JSON::NestingError"); - rb_gc_register_mark_object(eGeneratorError); - rb_gc_register_mark_object(eNestingError); - - cState = rb_define_class_under(mGenerator, "State", rb_cObject); - rb_define_alloc_func(cState, cState_s_allocate); - rb_define_singleton_method(cState, "from_state", cState_from_state_s, 1); - rb_define_method(cState, "initialize", cState_initialize, -1); - rb_define_method(cState, "initialize_copy", cState_init_copy, 1); - rb_define_method(cState, "indent", cState_indent, 0); - rb_define_method(cState, "indent=", cState_indent_set, 1); - rb_define_method(cState, "space", cState_space, 0); - rb_define_method(cState, "space=", cState_space_set, 1); - rb_define_method(cState, "space_before", cState_space_before, 0); - rb_define_method(cState, "space_before=", cState_space_before_set, 1); - rb_define_method(cState, "object_nl", cState_object_nl, 0); - rb_define_method(cState, "object_nl=", cState_object_nl_set, 1); - rb_define_method(cState, "array_nl", cState_array_nl, 0); - rb_define_method(cState, "array_nl=", cState_array_nl_set, 1); - rb_define_method(cState, "max_nesting", cState_max_nesting, 0); - rb_define_method(cState, "max_nesting=", cState_max_nesting_set, 1); - rb_define_method(cState, "escape_slash", cState_escape_slash, 0); - rb_define_method(cState, "escape_slash?", cState_escape_slash, 0); - rb_define_method(cState, "escape_slash=", cState_escape_slash_set, 1); - rb_define_method(cState, "check_circular?", cState_check_circular_p, 0); - rb_define_method(cState, "allow_nan?", cState_allow_nan_p, 0); - rb_define_method(cState, "ascii_only?", cState_ascii_only_p, 0); - rb_define_method(cState, "depth", cState_depth, 0); - rb_define_method(cState, "depth=", cState_depth_set, 1); - rb_define_method(cState, "buffer_initial_length", cState_buffer_initial_length, 0); - rb_define_method(cState, "buffer_initial_length=", cState_buffer_initial_length_set, 1); - rb_define_method(cState, "configure", cState_configure, 1); - rb_define_alias(cState, "merge", "configure"); - rb_define_method(cState, "to_h", cState_to_h, 0); - rb_define_alias(cState, "to_hash", "to_h"); - rb_define_method(cState, "[]", cState_aref, 1); - rb_define_method(cState, "[]=", cState_aset, 2); - rb_define_method(cState, "generate", cState_generate, 1); - - mGeneratorMethods = rb_define_module_under(mGenerator, "GeneratorMethods"); - mObject = rb_define_module_under(mGeneratorMethods, "Object"); - rb_define_method(mObject, "to_json", mObject_to_json, -1); - mHash = rb_define_module_under(mGeneratorMethods, "Hash"); - rb_define_method(mHash, "to_json", mHash_to_json, -1); - mArray = rb_define_module_under(mGeneratorMethods, "Array"); - rb_define_method(mArray, "to_json", mArray_to_json, -1); -#ifdef RUBY_INTEGER_UNIFICATION - mInteger = rb_define_module_under(mGeneratorMethods, "Integer"); - rb_define_method(mInteger, "to_json", mInteger_to_json, -1); -#else - mFixnum = rb_define_module_under(mGeneratorMethods, "Fixnum"); - rb_define_method(mFixnum, "to_json", mFixnum_to_json, -1); - mBignum = rb_define_module_under(mGeneratorMethods, "Bignum"); - rb_define_method(mBignum, "to_json", mBignum_to_json, -1); -#endif - mFloat = rb_define_module_under(mGeneratorMethods, "Float"); - rb_define_method(mFloat, "to_json", mFloat_to_json, -1); - mString = rb_define_module_under(mGeneratorMethods, "String"); - rb_define_singleton_method(mString, "included", mString_included_s, 1); - rb_define_method(mString, "to_json", mString_to_json, -1); - rb_define_method(mString, "to_json_raw", mString_to_json_raw, -1); - rb_define_method(mString, "to_json_raw_object", mString_to_json_raw_object, 0); - mString_Extend = rb_define_module_under(mString, "Extend"); - rb_define_method(mString_Extend, "json_create", mString_Extend_json_create, 1); - mTrueClass = rb_define_module_under(mGeneratorMethods, "TrueClass"); - rb_define_method(mTrueClass, "to_json", mTrueClass_to_json, -1); - mFalseClass = rb_define_module_under(mGeneratorMethods, "FalseClass"); - rb_define_method(mFalseClass, "to_json", mFalseClass_to_json, -1); - mNilClass = rb_define_module_under(mGeneratorMethods, "NilClass"); - rb_define_method(mNilClass, "to_json", mNilClass_to_json, -1); - - i_to_s = rb_intern("to_s"); - i_to_json = rb_intern("to_json"); - i_new = rb_intern("new"); - i_indent = rb_intern("indent"); - i_space = rb_intern("space"); - i_space_before = rb_intern("space_before"); - i_object_nl = rb_intern("object_nl"); - i_array_nl = rb_intern("array_nl"); - i_max_nesting = rb_intern("max_nesting"); - i_escape_slash = rb_intern("escape_slash"); - i_allow_nan = rb_intern("allow_nan"); - i_ascii_only = rb_intern("ascii_only"); - i_depth = rb_intern("depth"); - i_buffer_initial_length = rb_intern("buffer_initial_length"); - i_pack = rb_intern("pack"); - i_unpack = rb_intern("unpack"); - i_create_id = rb_intern("create_id"); - i_extend = rb_intern("extend"); - i_key_p = rb_intern("key?"); - i_aref = rb_intern("[]"); - i_send = rb_intern("__send__"); - i_respond_to_p = rb_intern("respond_to?"); - i_match = rb_intern("match"); - i_keys = rb_intern("keys"); - i_dup = rb_intern("dup"); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/generator/generator.h b/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/generator/generator.h deleted file mode 100644 index 3ebd622..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/generator/generator.h +++ /dev/null @@ -1,174 +0,0 @@ -#ifndef _GENERATOR_H_ -#define _GENERATOR_H_ - -#include -#include - -#include "ruby.h" - -#ifdef HAVE_RUBY_RE_H -#include "ruby/re.h" -#else -#include "re.h" -#endif - -#ifndef rb_intern_str -#define rb_intern_str(string) SYM2ID(rb_str_intern(string)) -#endif - -#ifndef rb_obj_instance_variables -#define rb_obj_instance_variables(object) rb_funcall(object, rb_intern("instance_variables"), 0) -#endif - -#define option_given_p(opts, key) RTEST(rb_funcall(opts, i_key_p, 1, key)) - -/* unicode definitions */ - -#define UNI_STRICT_CONVERSION 1 - -typedef unsigned long UTF32; /* at least 32 bits */ -typedef unsigned short UTF16; /* at least 16 bits */ -typedef unsigned char UTF8; /* typically 8 bits */ - -#define UNI_REPLACEMENT_CHAR (UTF32)0x0000FFFD -#define UNI_MAX_BMP (UTF32)0x0000FFFF -#define UNI_MAX_UTF16 (UTF32)0x0010FFFF -#define UNI_MAX_UTF32 (UTF32)0x7FFFFFFF -#define UNI_MAX_LEGAL_UTF32 (UTF32)0x0010FFFF - -#define UNI_SUR_HIGH_START (UTF32)0xD800 -#define UNI_SUR_HIGH_END (UTF32)0xDBFF -#define UNI_SUR_LOW_START (UTF32)0xDC00 -#define UNI_SUR_LOW_END (UTF32)0xDFFF - -static const int halfShift = 10; /* used for shifting by 10 bits */ - -static const UTF32 halfBase = 0x0010000UL; -static const UTF32 halfMask = 0x3FFUL; - -static unsigned char isLegalUTF8(const UTF8 *source, unsigned long length); -static void unicode_escape(char *buf, UTF16 character); -static void unicode_escape_to_buffer(FBuffer *buffer, char buf[6], UTF16 character); -static void convert_UTF8_to_JSON_ASCII(FBuffer *buffer, VALUE string, char escape_slash); -static void convert_UTF8_to_JSON(FBuffer *buffer, VALUE string, char escape_slash); -static char *fstrndup(const char *ptr, unsigned long len); - -/* ruby api and some helpers */ - -typedef struct JSON_Generator_StateStruct { - char *indent; - long indent_len; - char *space; - long space_len; - char *space_before; - long space_before_len; - char *object_nl; - long object_nl_len; - char *array_nl; - long array_nl_len; - FBuffer *array_delim; - FBuffer *object_delim; - FBuffer *object_delim2; - long max_nesting; - char allow_nan; - char ascii_only; - char escape_slash; - long depth; - long buffer_initial_length; -} JSON_Generator_State; - -#define GET_STATE_TO(self, state) \ - TypedData_Get_Struct(self, JSON_Generator_State, &JSON_Generator_State_type, state) - -#define GET_STATE(self) \ - JSON_Generator_State *state; \ - GET_STATE_TO(self, state) - -#define GENERATE_JSON(type) \ - FBuffer *buffer; \ - VALUE Vstate; \ - JSON_Generator_State *state; \ - \ - rb_scan_args(argc, argv, "01", &Vstate); \ - Vstate = cState_from_state_s(cState, Vstate); \ - TypedData_Get_Struct(Vstate, JSON_Generator_State, &JSON_Generator_State_type, state); \ - buffer = cState_prepare_buffer(Vstate); \ - generate_json_##type(buffer, Vstate, state, self); \ - return fbuffer_to_s(buffer) - -static VALUE mHash_to_json(int argc, VALUE *argv, VALUE self); -static VALUE mArray_to_json(int argc, VALUE *argv, VALUE self); -#ifdef RUBY_INTEGER_UNIFICATION -static VALUE mInteger_to_json(int argc, VALUE *argv, VALUE self); -#else -static VALUE mFixnum_to_json(int argc, VALUE *argv, VALUE self); -static VALUE mBignum_to_json(int argc, VALUE *argv, VALUE self); -#endif -static VALUE mFloat_to_json(int argc, VALUE *argv, VALUE self); -static VALUE mString_included_s(VALUE self, VALUE modul); -static VALUE mString_to_json(int argc, VALUE *argv, VALUE self); -static VALUE mString_to_json_raw_object(VALUE self); -static VALUE mString_to_json_raw(int argc, VALUE *argv, VALUE self); -static VALUE mString_Extend_json_create(VALUE self, VALUE o); -static VALUE mTrueClass_to_json(int argc, VALUE *argv, VALUE self); -static VALUE mFalseClass_to_json(int argc, VALUE *argv, VALUE self); -static VALUE mNilClass_to_json(int argc, VALUE *argv, VALUE self); -static VALUE mObject_to_json(int argc, VALUE *argv, VALUE self); -static void State_free(void *state); -static VALUE cState_s_allocate(VALUE klass); -static VALUE cState_configure(VALUE self, VALUE opts); -static VALUE cState_to_h(VALUE self); -static void generate_json(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj); -static void generate_json_object(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj); -static void generate_json_array(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj); -static void generate_json_string(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj); -static void generate_json_null(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj); -static void generate_json_false(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj); -static void generate_json_true(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj); -#ifdef RUBY_INTEGER_UNIFICATION -static void generate_json_integer(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj); -#endif -static void generate_json_fixnum(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj); -static void generate_json_bignum(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj); -static void generate_json_float(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj); -static VALUE cState_partial_generate(VALUE self, VALUE obj); -static VALUE cState_generate(VALUE self, VALUE obj); -static VALUE cState_initialize(int argc, VALUE *argv, VALUE self); -static VALUE cState_from_state_s(VALUE self, VALUE opts); -static VALUE cState_indent(VALUE self); -static VALUE cState_indent_set(VALUE self, VALUE indent); -static VALUE cState_space(VALUE self); -static VALUE cState_space_set(VALUE self, VALUE space); -static VALUE cState_space_before(VALUE self); -static VALUE cState_space_before_set(VALUE self, VALUE space_before); -static VALUE cState_object_nl(VALUE self); -static VALUE cState_object_nl_set(VALUE self, VALUE object_nl); -static VALUE cState_array_nl(VALUE self); -static VALUE cState_array_nl_set(VALUE self, VALUE array_nl); -static VALUE cState_max_nesting(VALUE self); -static VALUE cState_max_nesting_set(VALUE self, VALUE depth); -static VALUE cState_allow_nan_p(VALUE self); -static VALUE cState_ascii_only_p(VALUE self); -static VALUE cState_depth(VALUE self); -static VALUE cState_depth_set(VALUE self, VALUE depth); -static VALUE cState_escape_slash(VALUE self); -static VALUE cState_escape_slash_set(VALUE self, VALUE depth); -static FBuffer *cState_prepare_buffer(VALUE self); -#ifndef ZALLOC -#define ZALLOC(type) ((type *)ruby_zalloc(sizeof(type))) -static inline void *ruby_zalloc(size_t n) -{ - void *p = ruby_xmalloc(n); - memset(p, 0, n); - return p; -} -#endif -#ifdef TypedData_Make_Struct -static const rb_data_type_t JSON_Generator_State_type; -#define NEW_TYPEDDATA_WRAPPER 1 -#else -#define TypedData_Make_Struct(klass, type, ignore, json) Data_Make_Struct(klass, type, NULL, State_free, json) -#define TypedData_Get_Struct(self, JSON_Generator_State, ignore, json) Data_Get_Struct(self, JSON_Generator_State, json) -#endif - -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/generator/generator.o b/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/generator/generator.o deleted file mode 100644 index 455e14f7bc2ab0ffdcd1f552590cba0da9607bb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 155968 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 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/parser/.sitearchdir.-.json.-.ext.time b/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/parser/.sitearchdir.-.json.-.ext.time deleted file mode 100644 index e69de29..0000000 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/parser/Makefile b/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/parser/Makefile deleted file mode 100644 index 29dcf92..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/parser/Makefile +++ /dev/null @@ -1,268 +0,0 @@ - -SHELL = /bin/sh - -# V=0 quiet, V=1 verbose. other values don't work. -V = 0 -Q1 = $(V:1=) -Q = $(Q1:0=@) -ECHO1 = $(V:1=@ :) -ECHO = $(ECHO1:0=@ echo) -NULLCMD = : - -#### Start of system configuration section. #### - -srcdir = . -topdir = /Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0 -hdrdir = $(topdir) -arch_hdrdir = /Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0/arm64-darwin22 -PATH_SEPARATOR = : -VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby -prefix = $(DESTDIR)/Users/penguin/.rvm/rubies/ruby-2.7.6 -rubysitearchprefix = $(rubylibprefix)/$(sitearch) -rubyarchprefix = $(rubylibprefix)/$(arch) -rubylibprefix = $(libdir)/$(RUBY_BASE_NAME) -exec_prefix = $(prefix) -vendorarchhdrdir = $(vendorhdrdir)/$(sitearch) -sitearchhdrdir = $(sitehdrdir)/$(sitearch) -rubyarchhdrdir = $(rubyhdrdir)/$(arch) -vendorhdrdir = $(rubyhdrdir)/vendor_ruby -sitehdrdir = $(rubyhdrdir)/site_ruby -rubyhdrdir = $(includedir)/$(RUBY_VERSION_NAME) -vendorarchdir = $(vendorlibdir)/$(sitearch) -vendorlibdir = $(vendordir)/$(ruby_version) -vendordir = $(rubylibprefix)/vendor_ruby -sitearchdir = $(DESTDIR)./.gem.20230521-58859-12wvx5j -sitelibdir = $(DESTDIR)./.gem.20230521-58859-12wvx5j -sitedir = $(rubylibprefix)/site_ruby -rubyarchdir = $(rubylibdir)/$(arch) -rubylibdir = $(rubylibprefix)/$(ruby_version) -sitearchincludedir = $(includedir)/$(sitearch) -archincludedir = $(includedir)/$(arch) -sitearchlibdir = $(libdir)/$(sitearch) -archlibdir = $(libdir)/$(arch) -ridir = $(datarootdir)/$(RI_BASE_NAME) -mandir = $(datarootdir)/man -localedir = $(datarootdir)/locale -libdir = $(exec_prefix)/lib -psdir = $(docdir) -pdfdir = $(docdir) -dvidir = $(docdir) -htmldir = $(docdir) -infodir = $(datarootdir)/info -docdir = $(datarootdir)/doc/$(PACKAGE) -oldincludedir = $(SDKROOT)/usr/include -includedir = $(prefix)/include -runstatedir = $(localstatedir)/run -localstatedir = $(prefix)/var -sharedstatedir = $(prefix)/com -sysconfdir = $(prefix)/etc -datadir = $(datarootdir) -datarootdir = $(prefix)/share -libexecdir = $(exec_prefix)/libexec -sbindir = $(exec_prefix)/sbin -bindir = $(exec_prefix)/bin -archdir = $(rubyarchdir) - - -CC_WRAPPER = -CC = gcc -CXX = g++ -LIBRUBY = $(LIBRUBY_SO) -LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a -LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME) -LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static -framework Security -framework Foundation $(MAINLIBS) -empty = -OUTFLAG = -o $(empty) -COUTFLAG = -o $(empty) -CSRCFLAG = $(empty) - -RUBY_EXTCONF_H = -cflags = $(optflags) $(debugflags) $(warnflags) -cxxflags = -optflags = -O3 -debugflags = -ggdb3 -warnflags = -Wall -Wextra -Wdeprecated-declarations -Wdivision-by-zero -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wshorten-64-to-32 -Wwrite-strings -Wmissing-noreturn -Wno-cast-function-type -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wunused-variable -Wextra-tokens -cppflags = -CCDLFLAGS = -fno-common -CFLAGS = $(CCDLFLAGS) -g -O2 -fno-common -pipe -DSTR_UMINUS_DEDUPE=1 -DSTR_UMINUS_DEDUPE_FROZEN=0 $(ARCH_FLAG) -INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir) -DEFS = -CPPFLAGS = -DHAVE_RB_ENC_RAISE -I/opt/homebrew/opt/libyaml/include -I/opt/homebrew/opt/libksba/include -I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/zlib/include -I/opt/homebrew/opt/openssl@1.1/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT $(DEFS) $(cppflags) -CXXFLAGS = $(CCDLFLAGS) -g -O2 $(ARCH_FLAG) -ldflags = -L. -fstack-protector-strong -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -dldflags = -Wl,-multiply_defined,suppress -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -ARCH_FLAG = -m64 -DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG) -LDSHARED = $(CC) -dynamic -bundle -LDSHAREDXX = $(CXX) -dynamic -bundle -AR = libtool -static -EXEEXT = - -RUBY_INSTALL_NAME = $(RUBY_BASE_NAME) -RUBY_SO_NAME = ruby.2.7 -RUBYW_INSTALL_NAME = -RUBY_VERSION_NAME = $(RUBY_BASE_NAME)-$(ruby_version) -RUBYW_BASE_NAME = rubyw -RUBY_BASE_NAME = ruby - -arch = arm64-darwin22 -sitearch = $(arch) -ruby_version = 2.7.0 -ruby = $(bindir)/$(RUBY_BASE_NAME) -RUBY = $(ruby) -ruby_headers = $(hdrdir)/ruby.h $(hdrdir)/ruby/backward.h $(hdrdir)/ruby/ruby.h $(hdrdir)/ruby/defines.h $(hdrdir)/ruby/missing.h $(hdrdir)/ruby/intern.h $(hdrdir)/ruby/st.h $(hdrdir)/ruby/subst.h $(arch_hdrdir)/ruby/config.h - -RM = rm -f -RM_RF = $(RUBY) -run -e rm -- -rf -RMDIRS = rmdir -p -MAKEDIRS = /opt/homebrew/opt/coreutils/bin/gmkdir -p -INSTALL = /opt/homebrew/opt/coreutils/bin/ginstall -c -INSTALL_PROG = $(INSTALL) -m 0755 -INSTALL_DATA = $(INSTALL) -m 644 -COPY = cp -TOUCH = exit > - -#### End of system configuration section. #### - -preload = -libpath = . $(libdir) /opt/homebrew/opt/libyaml/lib /opt/homebrew/opt/libksba/lib /opt/homebrew/opt/readline/lib /opt/homebrew/opt/zlib/lib /opt/homebrew/opt/openssl@1.1/lib -LIBPATH = -L. -L$(libdir) -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -DEFFILE = - -CLEANFILES = mkmf.log -DISTCLEANFILES = -DISTCLEANDIRS = - -extout = -extout_prefix = -target_prefix = /json/ext -LOCAL_LIBS = -LIBS = $(LIBRUBYARG_SHARED) -ORIG_SRCS = parser.c -SRCS = $(ORIG_SRCS) -OBJS = parser.o -HDRS = $(srcdir)/parser.h -LOCAL_HDRS = -TARGET = parser -TARGET_NAME = parser -TARGET_ENTRY = Init_$(TARGET_NAME) -DLLIB = $(TARGET).bundle -EXTSTATIC = -STATIC_LIB = - -TIMESTAMP_DIR = . -BINDIR = $(bindir) -RUBYCOMMONDIR = $(sitedir)$(target_prefix) -RUBYLIBDIR = $(sitelibdir)$(target_prefix) -RUBYARCHDIR = $(sitearchdir)$(target_prefix) -HDRDIR = $(rubyhdrdir)/ruby$(target_prefix) -ARCHHDRDIR = $(rubyhdrdir)/$(arch)/ruby$(target_prefix) -TARGET_SO_DIR = -TARGET_SO = $(TARGET_SO_DIR)$(DLLIB) -CLEANLIBS = $(TARGET_SO) -CLEANOBJS = *.o *.bak - -all: $(DLLIB) -static: $(STATIC_LIB) -.PHONY: all install static install-so install-rb -.PHONY: clean clean-so clean-static clean-rb - -clean-static:: -clean-rb-default:: -clean-rb:: -clean-so:: -clean: clean-so clean-static clean-rb-default clean-rb - -$(Q)$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) .*.time - -distclean-rb-default:: -distclean-rb:: -distclean-so:: -distclean-static:: -distclean: clean distclean-so distclean-static distclean-rb-default distclean-rb - -$(Q)$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log - -$(Q)$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES) - -$(Q)$(RMDIRS) $(DISTCLEANDIRS) 2> /dev/null || true - -realclean: distclean -install: install-so install-rb - -install-so: $(DLLIB) $(TIMESTAMP_DIR)/.sitearchdir.-.json.-.ext.time - $(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR) -clean-static:: - -$(Q)$(RM) $(STATIC_LIB) -install-rb: pre-install-rb do-install-rb install-rb-default -install-rb-default: pre-install-rb-default do-install-rb-default -pre-install-rb: Makefile -pre-install-rb-default: Makefile -do-install-rb: -do-install-rb-default: -pre-install-rb-default: - @$(NULLCMD) -$(TIMESTAMP_DIR)/.sitearchdir.-.json.-.ext.time: - $(Q) $(MAKEDIRS) $(@D) $(RUBYARCHDIR) - $(Q) $(TOUCH) $@ - -site-install: site-install-so site-install-rb -site-install-so: install-so -site-install-rb: install-rb - -.SUFFIXES: .c .m .cc .mm .cxx .cpp .o .S - -.cc.o: - $(ECHO) compiling $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.cc.S: - $(ECHO) translating $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.mm.o: - $(ECHO) compiling $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.mm.S: - $(ECHO) translating $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.cxx.o: - $(ECHO) compiling $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.cxx.S: - $(ECHO) translating $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.cpp.o: - $(ECHO) compiling $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.cpp.S: - $(ECHO) translating $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.c.o: - $(ECHO) compiling $(<) - $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.c.S: - $(ECHO) translating $(<) - $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.m.o: - $(ECHO) compiling $(<) - $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.m.S: - $(ECHO) translating $(<) - $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -$(TARGET_SO): $(OBJS) Makefile - $(ECHO) linking shared-object json/ext/$(DLLIB) - -$(Q)$(RM) $(@) - $(Q) $(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS) - $(Q) $(POSTLINK) - - - -### -parser.o: parser.c parser.h $(srcdir)/../fbuffer/fbuffer.h diff --git a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/parser/depend b/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/parser/depend deleted file mode 100644 index 498ffa9..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/parser/depend +++ /dev/null @@ -1 +0,0 @@ -parser.o: parser.c parser.h $(srcdir)/../fbuffer/fbuffer.h diff --git a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/parser/extconf.rb b/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/parser/extconf.rb deleted file mode 100644 index feb586e..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/parser/extconf.rb +++ /dev/null @@ -1,32 +0,0 @@ -# frozen_string_literal: false -require 'mkmf' - -have_func("rb_enc_raise", "ruby.h") -have_func("rb_enc_interned_str", "ruby.h") - -# checking if String#-@ (str_uminus) dedupes... ' -begin - a = -(%w(t e s t).join) - b = -(%w(t e s t).join) - if a.equal?(b) - $CFLAGS << ' -DSTR_UMINUS_DEDUPE=1 ' - else - $CFLAGS << ' -DSTR_UMINUS_DEDUPE=0 ' - end -rescue NoMethodError - $CFLAGS << ' -DSTR_UMINUS_DEDUPE=0 ' -end - -# checking if String#-@ (str_uminus) directly interns frozen strings... ' -begin - s = rand.to_s.freeze - if (-s).equal?(s) && (-s.dup).equal?(s) - $CFLAGS << ' -DSTR_UMINUS_DEDUPE_FROZEN=1 ' - else - $CFLAGS << ' -DSTR_UMINUS_DEDUPE_FROZEN=0 ' - end -rescue NoMethodError - $CFLAGS << ' -DSTR_UMINUS_DEDUPE_FROZEN=0 ' -end - -create_makefile 'json/ext/parser' diff --git a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/parser/parser.bundle b/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/parser/parser.bundle deleted file mode 100755 index 0e1ce69d56c5e2fb041c2a730d95ac4742d95741..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41338 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

    Oa3+uZ#+2UIjJE993!rQV^(7m7WxV!CrL+UF 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 MHGkOV>b4#K0fQZ{L;wH) diff --git a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/parser/parser.c b/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/parser/parser.c deleted file mode 100644 index 9bd7f19..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/parser/parser.c +++ /dev/null @@ -1,3347 +0,0 @@ -/* This file is automatically generated from parser.rl by using ragel */ -#line 1 "parser.rl" -#include "../fbuffer/fbuffer.h" -#include "parser.h" - -#if defined HAVE_RUBY_ENCODING_H -# define EXC_ENCODING rb_utf8_encoding(), -# ifndef HAVE_RB_ENC_RAISE -static void -enc_raise(rb_encoding *enc, VALUE exc, const char *fmt, ...) -{ - va_list args; - VALUE mesg; - - va_start(args, fmt); - mesg = rb_enc_vsprintf(enc, fmt, args); - va_end(args); - - rb_exc_raise(rb_exc_new3(exc, mesg)); -} -# define rb_enc_raise enc_raise -# endif -#else -# define EXC_ENCODING /* nothing */ -# define rb_enc_raise rb_raise -#endif - -/* unicode */ - -static const signed char digit_values[256] = { - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, - -1, -1, -1, -1, -1, -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1 -}; - -static UTF32 unescape_unicode(const unsigned char *p) -{ - signed char b; - UTF32 result = 0; - b = digit_values[p[0]]; - if (b < 0) return UNI_REPLACEMENT_CHAR; - result = (result << 4) | (unsigned char)b; - b = digit_values[p[1]]; - if (b < 0) return UNI_REPLACEMENT_CHAR; - result = (result << 4) | (unsigned char)b; - b = digit_values[p[2]]; - if (b < 0) return UNI_REPLACEMENT_CHAR; - result = (result << 4) | (unsigned char)b; - b = digit_values[p[3]]; - if (b < 0) return UNI_REPLACEMENT_CHAR; - result = (result << 4) | (unsigned char)b; - return result; -} - -static int convert_UTF32_to_UTF8(char *buf, UTF32 ch) -{ - int len = 1; - if (ch <= 0x7F) { - buf[0] = (char) ch; - } else if (ch <= 0x07FF) { - buf[0] = (char) ((ch >> 6) | 0xC0); - buf[1] = (char) ((ch & 0x3F) | 0x80); - len++; - } else if (ch <= 0xFFFF) { - buf[0] = (char) ((ch >> 12) | 0xE0); - buf[1] = (char) (((ch >> 6) & 0x3F) | 0x80); - buf[2] = (char) ((ch & 0x3F) | 0x80); - len += 2; - } else if (ch <= 0x1fffff) { - buf[0] =(char) ((ch >> 18) | 0xF0); - buf[1] =(char) (((ch >> 12) & 0x3F) | 0x80); - buf[2] =(char) (((ch >> 6) & 0x3F) | 0x80); - buf[3] =(char) ((ch & 0x3F) | 0x80); - len += 3; - } else { - buf[0] = '?'; - } - return len; -} - -static VALUE mJSON, mExt, cParser, eParserError, eNestingError; -static VALUE CNaN, CInfinity, CMinusInfinity; - -static ID i_json_creatable_p, i_json_create, i_create_id, i_create_additions, -i_chr, i_max_nesting, i_allow_nan, i_symbolize_names, -i_object_class, i_array_class, i_decimal_class, i_key_p, -i_deep_const_get, i_match, i_match_string, i_aset, i_aref, -i_leftshift, i_new, i_try_convert, i_freeze, i_uminus; - - -#line 125 "parser.rl" - - - -enum {JSON_object_start = 1}; -enum {JSON_object_first_final = 27}; -enum {JSON_object_error = 0}; - -enum {JSON_object_en_main = 1}; - -static const char MAYBE_UNUSED(_JSON_object_nfa_targs)[] = { - 0, 0 -}; - -static const char MAYBE_UNUSED(_JSON_object_nfa_offsets)[] = { - 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, 0, 0, 0, 0 -}; - -static const char MAYBE_UNUSED(_JSON_object_nfa_push_actions)[] = { - 0, 0 -}; - -static const char MAYBE_UNUSED(_JSON_object_nfa_pop_trans)[] = { - 0, 0 -}; - - -#line 167 "parser.rl" - - -static char *JSON_parse_object(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting) -{ - int cs = EVIL; - VALUE last_name = Qnil; - VALUE object_class = json->object_class; - - if (json->max_nesting && current_nesting > json->max_nesting) { - rb_raise(eNestingError, "nesting of %d is too deep", current_nesting); - } - - *result = NIL_P(object_class) ? rb_hash_new() : rb_class_new_instance(0, 0, object_class); - - - { - cs = (int)JSON_object_start; - } - - #line 182 "parser.rl" - - - { - if ( p == pe ) - goto _test_eof; - switch ( cs ) - { - case 1: - goto st_case_1; - case 0: - goto st_case_0; - case 2: - goto st_case_2; - case 3: - goto st_case_3; - case 4: - goto st_case_4; - case 5: - goto st_case_5; - case 6: - goto st_case_6; - case 7: - goto st_case_7; - case 8: - goto st_case_8; - case 9: - goto st_case_9; - case 10: - goto st_case_10; - case 11: - goto st_case_11; - case 12: - goto st_case_12; - case 13: - goto st_case_13; - case 14: - goto st_case_14; - case 15: - goto st_case_15; - case 16: - goto st_case_16; - case 17: - goto st_case_17; - case 18: - goto st_case_18; - case 27: - goto st_case_27; - case 19: - goto st_case_19; - case 20: - goto st_case_20; - case 21: - goto st_case_21; - case 22: - goto st_case_22; - case 23: - goto st_case_23; - case 24: - goto st_case_24; - case 25: - goto st_case_25; - case 26: - goto st_case_26; - } - goto st_out; - st_case_1: - if ( ( (*( p))) == 123 ) { - goto st2; - } - { - goto st0; - } - st_case_0: - st0: - cs = 0; - goto _out; - st2: - p+= 1; - if ( p == pe ) - goto _test_eof2; - st_case_2: - switch( ( (*( p))) ) { - case 13: { - goto st2; - } - case 32: { - goto st2; - } - case 34: { - goto ctr2; - } - case 47: { - goto st23; - } - case 125: { - goto ctr4; - } - } - if ( 9 <= ( (*( p))) && ( (*( p))) <= 10 ) { - goto st2; - } - { - goto st0; - } - ctr2: - { - #line 149 "parser.rl" - - char *np; - json->parsing_name = 1; - np = JSON_parse_string(json, p, pe, &last_name); - json->parsing_name = 0; - if (np == NULL) { {p = p - 1; } {p+= 1; cs = 3; goto _out;} } else {p = (( np))-1;} - - } - - goto st3; - st3: - p+= 1; - if ( p == pe ) - goto _test_eof3; - st_case_3: - switch( ( (*( p))) ) { - case 13: { - goto st3; - } - case 32: { - goto st3; - } - case 47: { - goto st4; - } - case 58: { - goto st8; - } - } - if ( 9 <= ( (*( p))) && ( (*( p))) <= 10 ) { - goto st3; - } - { - goto st0; - } - st4: - p+= 1; - if ( p == pe ) - goto _test_eof4; - st_case_4: - switch( ( (*( p))) ) { - case 42: { - goto st5; - } - case 47: { - goto st7; - } - } - { - goto st0; - } - st5: - p+= 1; - if ( p == pe ) - goto _test_eof5; - st_case_5: - if ( ( (*( p))) == 42 ) { - goto st6; - } - { - goto st5; - } - st6: - p+= 1; - if ( p == pe ) - goto _test_eof6; - st_case_6: - switch( ( (*( p))) ) { - case 42: { - goto st6; - } - case 47: { - goto st3; - } - } - { - goto st5; - } - st7: - p+= 1; - if ( p == pe ) - goto _test_eof7; - st_case_7: - if ( ( (*( p))) == 10 ) { - goto st3; - } - { - goto st7; - } - st8: - p+= 1; - if ( p == pe ) - goto _test_eof8; - st_case_8: - switch( ( (*( p))) ) { - case 13: { - goto st8; - } - case 32: { - goto st8; - } - case 34: { - goto ctr11; - } - case 45: { - goto ctr11; - } - case 47: { - goto st19; - } - case 73: { - goto ctr11; - } - case 78: { - goto ctr11; - } - case 91: { - goto ctr11; - } - case 102: { - goto ctr11; - } - case 110: { - goto ctr11; - } - case 116: { - goto ctr11; - } - case 123: { - goto ctr11; - } - } - if ( ( (*( p))) > 10 ) { - if ( 48 <= ( (*( p))) && ( (*( p))) <= 57 ) { - goto ctr11; - } - } else if ( ( (*( p))) >= 9 ) { - goto st8; - } - { - goto st0; - } - ctr11: - { - #line 133 "parser.rl" - - VALUE v = Qnil; - char *np = JSON_parse_value(json, p, pe, &v, current_nesting); - if (np == NULL) { - {p = p - 1; } {p+= 1; cs = 9; goto _out;} - } else { - if (NIL_P(json->object_class)) { - OBJ_FREEZE(last_name); - rb_hash_aset(*result, last_name, v); - } else { - rb_funcall(*result, i_aset, 2, last_name, v); - } - {p = (( np))-1;} - - } - } - - goto st9; - st9: - p+= 1; - if ( p == pe ) - goto _test_eof9; - st_case_9: - switch( ( (*( p))) ) { - case 13: { - goto st9; - } - case 32: { - goto st9; - } - case 44: { - goto st10; - } - case 47: { - goto st15; - } - case 125: { - goto ctr4; - } - } - if ( 9 <= ( (*( p))) && ( (*( p))) <= 10 ) { - goto st9; - } - { - goto st0; - } - st10: - p+= 1; - if ( p == pe ) - goto _test_eof10; - st_case_10: - switch( ( (*( p))) ) { - case 13: { - goto st10; - } - case 32: { - goto st10; - } - case 34: { - goto ctr2; - } - case 47: { - goto st11; - } - } - if ( 9 <= ( (*( p))) && ( (*( p))) <= 10 ) { - goto st10; - } - { - goto st0; - } - st11: - p+= 1; - if ( p == pe ) - goto _test_eof11; - st_case_11: - switch( ( (*( p))) ) { - case 42: { - goto st12; - } - case 47: { - goto st14; - } - } - { - goto st0; - } - st12: - p+= 1; - if ( p == pe ) - goto _test_eof12; - st_case_12: - if ( ( (*( p))) == 42 ) { - goto st13; - } - { - goto st12; - } - st13: - p+= 1; - if ( p == pe ) - goto _test_eof13; - st_case_13: - switch( ( (*( p))) ) { - case 42: { - goto st13; - } - case 47: { - goto st10; - } - } - { - goto st12; - } - st14: - p+= 1; - if ( p == pe ) - goto _test_eof14; - st_case_14: - if ( ( (*( p))) == 10 ) { - goto st10; - } - { - goto st14; - } - st15: - p+= 1; - if ( p == pe ) - goto _test_eof15; - st_case_15: - switch( ( (*( p))) ) { - case 42: { - goto st16; - } - case 47: { - goto st18; - } - } - { - goto st0; - } - st16: - p+= 1; - if ( p == pe ) - goto _test_eof16; - st_case_16: - if ( ( (*( p))) == 42 ) { - goto st17; - } - { - goto st16; - } - st17: - p+= 1; - if ( p == pe ) - goto _test_eof17; - st_case_17: - switch( ( (*( p))) ) { - case 42: { - goto st17; - } - case 47: { - goto st9; - } - } - { - goto st16; - } - st18: - p+= 1; - if ( p == pe ) - goto _test_eof18; - st_case_18: - if ( ( (*( p))) == 10 ) { - goto st9; - } - { - goto st18; - } - ctr4: - { - #line 157 "parser.rl" - {p = p - 1; } {p+= 1; cs = 27; goto _out;} } - - goto st27; - st27: - p+= 1; - if ( p == pe ) - goto _test_eof27; - st_case_27: - { - goto st0; - } - st19: - p+= 1; - if ( p == pe ) - goto _test_eof19; - st_case_19: - switch( ( (*( p))) ) { - case 42: { - goto st20; - } - case 47: { - goto st22; - } - } - { - goto st0; - } - st20: - p+= 1; - if ( p == pe ) - goto _test_eof20; - st_case_20: - if ( ( (*( p))) == 42 ) { - goto st21; - } - { - goto st20; - } - st21: - p+= 1; - if ( p == pe ) - goto _test_eof21; - st_case_21: - switch( ( (*( p))) ) { - case 42: { - goto st21; - } - case 47: { - goto st8; - } - } - { - goto st20; - } - st22: - p+= 1; - if ( p == pe ) - goto _test_eof22; - st_case_22: - if ( ( (*( p))) == 10 ) { - goto st8; - } - { - goto st22; - } - st23: - p+= 1; - if ( p == pe ) - goto _test_eof23; - st_case_23: - switch( ( (*( p))) ) { - case 42: { - goto st24; - } - case 47: { - goto st26; - } - } - { - goto st0; - } - st24: - p+= 1; - if ( p == pe ) - goto _test_eof24; - st_case_24: - if ( ( (*( p))) == 42 ) { - goto st25; - } - { - goto st24; - } - st25: - p+= 1; - if ( p == pe ) - goto _test_eof25; - st_case_25: - switch( ( (*( p))) ) { - case 42: { - goto st25; - } - case 47: { - goto st2; - } - } - { - goto st24; - } - st26: - p+= 1; - if ( p == pe ) - goto _test_eof26; - st_case_26: - if ( ( (*( p))) == 10 ) { - goto st2; - } - { - goto st26; - } - st_out: - _test_eof2: cs = 2; goto _test_eof; - _test_eof3: cs = 3; goto _test_eof; - _test_eof4: cs = 4; goto _test_eof; - _test_eof5: cs = 5; goto _test_eof; - _test_eof6: cs = 6; goto _test_eof; - _test_eof7: cs = 7; goto _test_eof; - _test_eof8: cs = 8; goto _test_eof; - _test_eof9: cs = 9; goto _test_eof; - _test_eof10: cs = 10; goto _test_eof; - _test_eof11: cs = 11; goto _test_eof; - _test_eof12: cs = 12; goto _test_eof; - _test_eof13: cs = 13; goto _test_eof; - _test_eof14: cs = 14; goto _test_eof; - _test_eof15: cs = 15; goto _test_eof; - _test_eof16: cs = 16; goto _test_eof; - _test_eof17: cs = 17; goto _test_eof; - _test_eof18: cs = 18; goto _test_eof; - _test_eof27: cs = 27; goto _test_eof; - _test_eof19: cs = 19; goto _test_eof; - _test_eof20: cs = 20; goto _test_eof; - _test_eof21: cs = 21; goto _test_eof; - _test_eof22: cs = 22; goto _test_eof; - _test_eof23: cs = 23; goto _test_eof; - _test_eof24: cs = 24; goto _test_eof; - _test_eof25: cs = 25; goto _test_eof; - _test_eof26: cs = 26; goto _test_eof; - - _test_eof: {} - _out: {} - } - - #line 183 "parser.rl" - - - if (cs >= JSON_object_first_final) { - if (json->create_additions) { - VALUE klassname; - if (NIL_P(json->object_class)) { - klassname = rb_hash_aref(*result, json->create_id); - } else { - klassname = rb_funcall(*result, i_aref, 1, json->create_id); - } - if (!NIL_P(klassname)) { - VALUE klass = rb_funcall(mJSON, i_deep_const_get, 1, klassname); - if (RTEST(rb_funcall(klass, i_json_creatable_p, 0))) { - *result = rb_funcall(klass, i_json_create, 1, *result); - } - } - } - return p + 1; - } else { - return NULL; - } -} - - - -enum {JSON_value_start = 1}; -enum {JSON_value_first_final = 29}; -enum {JSON_value_error = 0}; - -enum {JSON_value_en_main = 1}; - -static const char MAYBE_UNUSED(_JSON_value_nfa_targs)[] = { - 0, 0 -}; - -static const char MAYBE_UNUSED(_JSON_value_nfa_offsets)[] = { - 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, 0, 0, 0, 0, 0, 0 -}; - -static const char MAYBE_UNUSED(_JSON_value_nfa_push_actions)[] = { - 0, 0 -}; - -static const char MAYBE_UNUSED(_JSON_value_nfa_pop_trans)[] = { - 0, 0 -}; - - -#line 283 "parser.rl" - - -static char *JSON_parse_value(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting) -{ - int cs = EVIL; - - - { - cs = (int)JSON_value_start; - } - - #line 290 "parser.rl" - - - { - if ( p == pe ) - goto _test_eof; - switch ( cs ) - { - case 1: - goto st_case_1; - case 0: - goto st_case_0; - case 29: - goto st_case_29; - case 2: - goto st_case_2; - case 3: - goto st_case_3; - case 4: - goto st_case_4; - case 5: - goto st_case_5; - case 6: - goto st_case_6; - case 7: - goto st_case_7; - case 8: - goto st_case_8; - case 9: - goto st_case_9; - case 10: - goto st_case_10; - case 11: - goto st_case_11; - case 12: - goto st_case_12; - case 13: - goto st_case_13; - case 14: - goto st_case_14; - case 15: - goto st_case_15; - case 16: - goto st_case_16; - case 17: - goto st_case_17; - case 18: - goto st_case_18; - case 19: - goto st_case_19; - case 20: - goto st_case_20; - case 21: - goto st_case_21; - case 22: - goto st_case_22; - case 23: - goto st_case_23; - case 24: - goto st_case_24; - case 25: - goto st_case_25; - case 26: - goto st_case_26; - case 27: - goto st_case_27; - case 28: - goto st_case_28; - } - goto st_out; - st1: - p+= 1; - if ( p == pe ) - goto _test_eof1; - st_case_1: - switch( ( (*( p))) ) { - case 13: { - goto st1; - } - case 32: { - goto st1; - } - case 34: { - goto ctr2; - } - case 45: { - goto ctr3; - } - case 47: { - goto st6; - } - case 73: { - goto st10; - } - case 78: { - goto st17; - } - case 91: { - goto ctr7; - } - case 102: { - goto st19; - } - case 110: { - goto st23; - } - case 116: { - goto st26; - } - case 123: { - goto ctr11; - } - } - if ( ( (*( p))) > 10 ) { - if ( 48 <= ( (*( p))) && ( (*( p))) <= 57 ) { - goto ctr3; - } - } else if ( ( (*( p))) >= 9 ) { - goto st1; - } - { - goto st0; - } - st_case_0: - st0: - cs = 0; - goto _out; - ctr2: - { - #line 235 "parser.rl" - - char *np = JSON_parse_string(json, p, pe, result); - if (np == NULL) { {p = p - 1; } {p+= 1; cs = 29; goto _out;} } else {p = (( np))-1;} - - } - - goto st29; - ctr3: - { - #line 240 "parser.rl" - - char *np; - if(pe > p + 8 && !strncmp(MinusInfinity, p, 9)) { - if (json->allow_nan) { - *result = CMinusInfinity; - {p = (( p + 10))-1;} - - {p = p - 1; } {p+= 1; cs = 29; goto _out;} - } else { - rb_enc_raise(EXC_ENCODING eParserError, "unexpected token at '%s'", p); - } - } - np = JSON_parse_float(json, p, pe, result); - if (np != NULL) {p = (( np))-1;} - - np = JSON_parse_integer(json, p, pe, result); - if (np != NULL) {p = (( np))-1;} - - {p = p - 1; } {p+= 1; cs = 29; goto _out;} - } - - goto st29; - ctr7: - { - #line 258 "parser.rl" - - char *np; - np = JSON_parse_array(json, p, pe, result, current_nesting + 1); - if (np == NULL) { {p = p - 1; } {p+= 1; cs = 29; goto _out;} } else {p = (( np))-1;} - - } - - goto st29; - ctr11: - { - #line 264 "parser.rl" - - char *np; - np = JSON_parse_object(json, p, pe, result, current_nesting + 1); - if (np == NULL) { {p = p - 1; } {p+= 1; cs = 29; goto _out;} } else {p = (( np))-1;} - - } - - goto st29; - ctr25: - { - #line 228 "parser.rl" - - if (json->allow_nan) { - *result = CInfinity; - } else { - rb_enc_raise(EXC_ENCODING eParserError, "unexpected token at '%s'", p - 8); - } - } - - goto st29; - ctr27: - { - #line 221 "parser.rl" - - if (json->allow_nan) { - *result = CNaN; - } else { - rb_enc_raise(EXC_ENCODING eParserError, "unexpected token at '%s'", p - 2); - } - } - - goto st29; - ctr31: - { - #line 215 "parser.rl" - - *result = Qfalse; - } - - goto st29; - ctr34: - { - #line 212 "parser.rl" - - *result = Qnil; - } - - goto st29; - ctr37: - { - #line 218 "parser.rl" - - *result = Qtrue; - } - - goto st29; - st29: - p+= 1; - if ( p == pe ) - goto _test_eof29; - st_case_29: - { - #line 270 "parser.rl" - {p = p - 1; } {p+= 1; cs = 29; goto _out;} } - switch( ( (*( p))) ) { - case 13: { - goto st29; - } - case 32: { - goto st29; - } - case 47: { - goto st2; - } - } - if ( 9 <= ( (*( p))) && ( (*( p))) <= 10 ) { - goto st29; - } - { - goto st0; - } - st2: - p+= 1; - if ( p == pe ) - goto _test_eof2; - st_case_2: - switch( ( (*( p))) ) { - case 42: { - goto st3; - } - case 47: { - goto st5; - } - } - { - goto st0; - } - st3: - p+= 1; - if ( p == pe ) - goto _test_eof3; - st_case_3: - if ( ( (*( p))) == 42 ) { - goto st4; - } - { - goto st3; - } - st4: - p+= 1; - if ( p == pe ) - goto _test_eof4; - st_case_4: - switch( ( (*( p))) ) { - case 42: { - goto st4; - } - case 47: { - goto st29; - } - } - { - goto st3; - } - st5: - p+= 1; - if ( p == pe ) - goto _test_eof5; - st_case_5: - if ( ( (*( p))) == 10 ) { - goto st29; - } - { - goto st5; - } - st6: - p+= 1; - if ( p == pe ) - goto _test_eof6; - st_case_6: - switch( ( (*( p))) ) { - case 42: { - goto st7; - } - case 47: { - goto st9; - } - } - { - goto st0; - } - st7: - p+= 1; - if ( p == pe ) - goto _test_eof7; - st_case_7: - if ( ( (*( p))) == 42 ) { - goto st8; - } - { - goto st7; - } - st8: - p+= 1; - if ( p == pe ) - goto _test_eof8; - st_case_8: - switch( ( (*( p))) ) { - case 42: { - goto st8; - } - case 47: { - goto st1; - } - } - { - goto st7; - } - st9: - p+= 1; - if ( p == pe ) - goto _test_eof9; - st_case_9: - if ( ( (*( p))) == 10 ) { - goto st1; - } - { - goto st9; - } - st10: - p+= 1; - if ( p == pe ) - goto _test_eof10; - st_case_10: - if ( ( (*( p))) == 110 ) { - goto st11; - } - { - goto st0; - } - st11: - p+= 1; - if ( p == pe ) - goto _test_eof11; - st_case_11: - if ( ( (*( p))) == 102 ) { - goto st12; - } - { - goto st0; - } - st12: - p+= 1; - if ( p == pe ) - goto _test_eof12; - st_case_12: - if ( ( (*( p))) == 105 ) { - goto st13; - } - { - goto st0; - } - st13: - p+= 1; - if ( p == pe ) - goto _test_eof13; - st_case_13: - if ( ( (*( p))) == 110 ) { - goto st14; - } - { - goto st0; - } - st14: - p+= 1; - if ( p == pe ) - goto _test_eof14; - st_case_14: - if ( ( (*( p))) == 105 ) { - goto st15; - } - { - goto st0; - } - st15: - p+= 1; - if ( p == pe ) - goto _test_eof15; - st_case_15: - if ( ( (*( p))) == 116 ) { - goto st16; - } - { - goto st0; - } - st16: - p+= 1; - if ( p == pe ) - goto _test_eof16; - st_case_16: - if ( ( (*( p))) == 121 ) { - goto ctr25; - } - { - goto st0; - } - st17: - p+= 1; - if ( p == pe ) - goto _test_eof17; - st_case_17: - if ( ( (*( p))) == 97 ) { - goto st18; - } - { - goto st0; - } - st18: - p+= 1; - if ( p == pe ) - goto _test_eof18; - st_case_18: - if ( ( (*( p))) == 78 ) { - goto ctr27; - } - { - goto st0; - } - st19: - p+= 1; - if ( p == pe ) - goto _test_eof19; - st_case_19: - if ( ( (*( p))) == 97 ) { - goto st20; - } - { - goto st0; - } - st20: - p+= 1; - if ( p == pe ) - goto _test_eof20; - st_case_20: - if ( ( (*( p))) == 108 ) { - goto st21; - } - { - goto st0; - } - st21: - p+= 1; - if ( p == pe ) - goto _test_eof21; - st_case_21: - if ( ( (*( p))) == 115 ) { - goto st22; - } - { - goto st0; - } - st22: - p+= 1; - if ( p == pe ) - goto _test_eof22; - st_case_22: - if ( ( (*( p))) == 101 ) { - goto ctr31; - } - { - goto st0; - } - st23: - p+= 1; - if ( p == pe ) - goto _test_eof23; - st_case_23: - if ( ( (*( p))) == 117 ) { - goto st24; - } - { - goto st0; - } - st24: - p+= 1; - if ( p == pe ) - goto _test_eof24; - st_case_24: - if ( ( (*( p))) == 108 ) { - goto st25; - } - { - goto st0; - } - st25: - p+= 1; - if ( p == pe ) - goto _test_eof25; - st_case_25: - if ( ( (*( p))) == 108 ) { - goto ctr34; - } - { - goto st0; - } - st26: - p+= 1; - if ( p == pe ) - goto _test_eof26; - st_case_26: - if ( ( (*( p))) == 114 ) { - goto st27; - } - { - goto st0; - } - st27: - p+= 1; - if ( p == pe ) - goto _test_eof27; - st_case_27: - if ( ( (*( p))) == 117 ) { - goto st28; - } - { - goto st0; - } - st28: - p+= 1; - if ( p == pe ) - goto _test_eof28; - st_case_28: - if ( ( (*( p))) == 101 ) { - goto ctr37; - } - { - goto st0; - } - st_out: - _test_eof1: cs = 1; goto _test_eof; - _test_eof29: cs = 29; goto _test_eof; - _test_eof2: cs = 2; goto _test_eof; - _test_eof3: cs = 3; goto _test_eof; - _test_eof4: cs = 4; goto _test_eof; - _test_eof5: cs = 5; goto _test_eof; - _test_eof6: cs = 6; goto _test_eof; - _test_eof7: cs = 7; goto _test_eof; - _test_eof8: cs = 8; goto _test_eof; - _test_eof9: cs = 9; goto _test_eof; - _test_eof10: cs = 10; goto _test_eof; - _test_eof11: cs = 11; goto _test_eof; - _test_eof12: cs = 12; goto _test_eof; - _test_eof13: cs = 13; goto _test_eof; - _test_eof14: cs = 14; goto _test_eof; - _test_eof15: cs = 15; goto _test_eof; - _test_eof16: cs = 16; goto _test_eof; - _test_eof17: cs = 17; goto _test_eof; - _test_eof18: cs = 18; goto _test_eof; - _test_eof19: cs = 19; goto _test_eof; - _test_eof20: cs = 20; goto _test_eof; - _test_eof21: cs = 21; goto _test_eof; - _test_eof22: cs = 22; goto _test_eof; - _test_eof23: cs = 23; goto _test_eof; - _test_eof24: cs = 24; goto _test_eof; - _test_eof25: cs = 25; goto _test_eof; - _test_eof26: cs = 26; goto _test_eof; - _test_eof27: cs = 27; goto _test_eof; - _test_eof28: cs = 28; goto _test_eof; - - _test_eof: {} - _out: {} - } - - #line 291 "parser.rl" - - - if (json->freeze) { - OBJ_FREEZE(*result); - } - - if (cs >= JSON_value_first_final) { - return p; - } else { - return NULL; - } -} - - -enum {JSON_integer_start = 1}; -enum {JSON_integer_first_final = 3}; -enum {JSON_integer_error = 0}; - -enum {JSON_integer_en_main = 1}; - -static const char MAYBE_UNUSED(_JSON_integer_nfa_targs)[] = { - 0, 0 -}; - -static const char MAYBE_UNUSED(_JSON_integer_nfa_offsets)[] = { - 0, 0, 0, 0, 0, 0, 0 -}; - -static const char MAYBE_UNUSED(_JSON_integer_nfa_push_actions)[] = { - 0, 0 -}; - -static const char MAYBE_UNUSED(_JSON_integer_nfa_pop_trans)[] = { - 0, 0 -}; - - -#line 311 "parser.rl" - - -static char *JSON_parse_integer(JSON_Parser *json, char *p, char *pe, VALUE *result) -{ - int cs = EVIL; - - - { - cs = (int)JSON_integer_start; - } - - #line 318 "parser.rl" - - json->memo = p; - - { - if ( p == pe ) - goto _test_eof; - switch ( cs ) - { - case 1: - goto st_case_1; - case 0: - goto st_case_0; - case 2: - goto st_case_2; - case 3: - goto st_case_3; - case 4: - goto st_case_4; - case 5: - goto st_case_5; - } - goto st_out; - st_case_1: - switch( ( (*( p))) ) { - case 45: { - goto st2; - } - case 48: { - goto st3; - } - } - if ( 49 <= ( (*( p))) && ( (*( p))) <= 57 ) { - goto st5; - } - { - goto st0; - } - st_case_0: - st0: - cs = 0; - goto _out; - st2: - p+= 1; - if ( p == pe ) - goto _test_eof2; - st_case_2: - if ( ( (*( p))) == 48 ) { - goto st3; - } - if ( 49 <= ( (*( p))) && ( (*( p))) <= 57 ) { - goto st5; - } - { - goto st0; - } - st3: - p+= 1; - if ( p == pe ) - goto _test_eof3; - st_case_3: - if ( 48 <= ( (*( p))) && ( (*( p))) <= 57 ) { - goto st0; - } - { - goto ctr4; - } - ctr4: - { - #line 308 "parser.rl" - {p = p - 1; } {p+= 1; cs = 4; goto _out;} } - - goto st4; - st4: - p+= 1; - if ( p == pe ) - goto _test_eof4; - st_case_4: - { - goto st0; - } - st5: - p+= 1; - if ( p == pe ) - goto _test_eof5; - st_case_5: - if ( 48 <= ( (*( p))) && ( (*( p))) <= 57 ) { - goto st5; - } - { - goto ctr4; - } - st_out: - _test_eof2: cs = 2; goto _test_eof; - _test_eof3: cs = 3; goto _test_eof; - _test_eof4: cs = 4; goto _test_eof; - _test_eof5: cs = 5; goto _test_eof; - - _test_eof: {} - _out: {} - } - - #line 320 "parser.rl" - - - if (cs >= JSON_integer_first_final) { - long len = p - json->memo; - fbuffer_clear(json->fbuffer); - fbuffer_append(json->fbuffer, json->memo, len); - fbuffer_append_char(json->fbuffer, '\0'); - *result = rb_cstr2inum(FBUFFER_PTR(json->fbuffer), 10); - return p + 1; - } else { - return NULL; - } -} - - -enum {JSON_float_start = 1}; -enum {JSON_float_first_final = 8}; -enum {JSON_float_error = 0}; - -enum {JSON_float_en_main = 1}; - -static const char MAYBE_UNUSED(_JSON_float_nfa_targs)[] = { - 0, 0 -}; - -static const char MAYBE_UNUSED(_JSON_float_nfa_offsets)[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0 -}; - -static const char MAYBE_UNUSED(_JSON_float_nfa_push_actions)[] = { - 0, 0 -}; - -static const char MAYBE_UNUSED(_JSON_float_nfa_pop_trans)[] = { - 0, 0 -}; - - -#line 345 "parser.rl" - - -static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *result) -{ - int cs = EVIL; - - - { - cs = (int)JSON_float_start; - } - - #line 352 "parser.rl" - - json->memo = p; - - { - if ( p == pe ) - goto _test_eof; - switch ( cs ) - { - case 1: - goto st_case_1; - case 0: - goto st_case_0; - case 2: - goto st_case_2; - case 3: - goto st_case_3; - case 4: - goto st_case_4; - case 8: - goto st_case_8; - case 9: - goto st_case_9; - case 5: - goto st_case_5; - case 6: - goto st_case_6; - case 10: - goto st_case_10; - case 7: - goto st_case_7; - } - goto st_out; - st_case_1: - switch( ( (*( p))) ) { - case 45: { - goto st2; - } - case 48: { - goto st3; - } - } - if ( 49 <= ( (*( p))) && ( (*( p))) <= 57 ) { - goto st7; - } - { - goto st0; - } - st_case_0: - st0: - cs = 0; - goto _out; - st2: - p+= 1; - if ( p == pe ) - goto _test_eof2; - st_case_2: - if ( ( (*( p))) == 48 ) { - goto st3; - } - if ( 49 <= ( (*( p))) && ( (*( p))) <= 57 ) { - goto st7; - } - { - goto st0; - } - st3: - p+= 1; - if ( p == pe ) - goto _test_eof3; - st_case_3: - switch( ( (*( p))) ) { - case 46: { - goto st4; - } - case 69: { - goto st5; - } - case 101: { - goto st5; - } - } - { - goto st0; - } - st4: - p+= 1; - if ( p == pe ) - goto _test_eof4; - st_case_4: - if ( 48 <= ( (*( p))) && ( (*( p))) <= 57 ) { - goto st8; - } - { - goto st0; - } - st8: - p+= 1; - if ( p == pe ) - goto _test_eof8; - st_case_8: - switch( ( (*( p))) ) { - case 69: { - goto st5; - } - case 101: { - goto st5; - } - } - if ( ( (*( p))) > 46 ) { - if ( 48 <= ( (*( p))) && ( (*( p))) <= 57 ) { - goto st8; - } - } else if ( ( (*( p))) >= 45 ) { - goto st0; - } - { - goto ctr9; - } - ctr9: - { - #line 339 "parser.rl" - {p = p - 1; } {p+= 1; cs = 9; goto _out;} } - - goto st9; - st9: - p+= 1; - if ( p == pe ) - goto _test_eof9; - st_case_9: - { - goto st0; - } - st5: - p+= 1; - if ( p == pe ) - goto _test_eof5; - st_case_5: - switch( ( (*( p))) ) { - case 43: { - goto st6; - } - case 45: { - goto st6; - } - } - if ( 48 <= ( (*( p))) && ( (*( p))) <= 57 ) { - goto st10; - } - { - goto st0; - } - st6: - p+= 1; - if ( p == pe ) - goto _test_eof6; - st_case_6: - if ( 48 <= ( (*( p))) && ( (*( p))) <= 57 ) { - goto st10; - } - { - goto st0; - } - st10: - p+= 1; - if ( p == pe ) - goto _test_eof10; - st_case_10: - switch( ( (*( p))) ) { - case 69: { - goto st0; - } - case 101: { - goto st0; - } - } - if ( ( (*( p))) > 46 ) { - if ( 48 <= ( (*( p))) && ( (*( p))) <= 57 ) { - goto st10; - } - } else if ( ( (*( p))) >= 45 ) { - goto st0; - } - { - goto ctr9; - } - st7: - p+= 1; - if ( p == pe ) - goto _test_eof7; - st_case_7: - switch( ( (*( p))) ) { - case 46: { - goto st4; - } - case 69: { - goto st5; - } - case 101: { - goto st5; - } - } - if ( 48 <= ( (*( p))) && ( (*( p))) <= 57 ) { - goto st7; - } - { - goto st0; - } - st_out: - _test_eof2: cs = 2; goto _test_eof; - _test_eof3: cs = 3; goto _test_eof; - _test_eof4: cs = 4; goto _test_eof; - _test_eof8: cs = 8; goto _test_eof; - _test_eof9: cs = 9; goto _test_eof; - _test_eof5: cs = 5; goto _test_eof; - _test_eof6: cs = 6; goto _test_eof; - _test_eof10: cs = 10; goto _test_eof; - _test_eof7: cs = 7; goto _test_eof; - - _test_eof: {} - _out: {} - } - - #line 354 "parser.rl" - - - if (cs >= JSON_float_first_final) { - VALUE mod = Qnil; - ID method_id = 0; - if (rb_respond_to(json->decimal_class, i_try_convert)) { - mod = json->decimal_class; - method_id = i_try_convert; - } else if (rb_respond_to(json->decimal_class, i_new)) { - mod = json->decimal_class; - method_id = i_new; - } else if (RB_TYPE_P(json->decimal_class, T_CLASS)) { - VALUE name = rb_class_name(json->decimal_class); - const char *name_cstr = RSTRING_PTR(name); - const char *last_colon = strrchr(name_cstr, ':'); - if (last_colon) { - const char *mod_path_end = last_colon - 1; - VALUE mod_path = rb_str_substr(name, 0, mod_path_end - name_cstr); - mod = rb_path_to_class(mod_path); - - const char *method_name_beg = last_colon + 1; - long before_len = method_name_beg - name_cstr; - long len = RSTRING_LEN(name) - before_len; - VALUE method_name = rb_str_substr(name, before_len, len); - method_id = SYM2ID(rb_str_intern(method_name)); - } else { - mod = rb_mKernel; - method_id = SYM2ID(rb_str_intern(name)); - } - } - - long len = p - json->memo; - fbuffer_clear(json->fbuffer); - fbuffer_append(json->fbuffer, json->memo, len); - fbuffer_append_char(json->fbuffer, '\0'); - - if (method_id) { - VALUE text = rb_str_new2(FBUFFER_PTR(json->fbuffer)); - *result = rb_funcallv(mod, method_id, 1, &text); - } else { - *result = DBL2NUM(rb_cstr_to_dbl(FBUFFER_PTR(json->fbuffer), 1)); - } - - return p + 1; - } else { - return NULL; - } -} - - - -enum {JSON_array_start = 1}; -enum {JSON_array_first_final = 17}; -enum {JSON_array_error = 0}; - -enum {JSON_array_en_main = 1}; - -static const char MAYBE_UNUSED(_JSON_array_nfa_targs)[] = { - 0, 0 -}; - -static const char MAYBE_UNUSED(_JSON_array_nfa_offsets)[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0 -}; - -static const char MAYBE_UNUSED(_JSON_array_nfa_push_actions)[] = { - 0, 0 -}; - -static const char MAYBE_UNUSED(_JSON_array_nfa_pop_trans)[] = { - 0, 0 -}; - - -#line 432 "parser.rl" - - -static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting) -{ - int cs = EVIL; - VALUE array_class = json->array_class; - - if (json->max_nesting && current_nesting > json->max_nesting) { - rb_raise(eNestingError, "nesting of %d is too deep", current_nesting); - } - *result = NIL_P(array_class) ? rb_ary_new() : rb_class_new_instance(0, 0, array_class); - - - { - cs = (int)JSON_array_start; - } - - #line 445 "parser.rl" - - - { - if ( p == pe ) - goto _test_eof; - switch ( cs ) - { - case 1: - goto st_case_1; - case 0: - goto st_case_0; - case 2: - goto st_case_2; - case 3: - goto st_case_3; - case 4: - goto st_case_4; - case 5: - goto st_case_5; - case 6: - goto st_case_6; - case 7: - goto st_case_7; - case 8: - goto st_case_8; - case 9: - goto st_case_9; - case 10: - goto st_case_10; - case 11: - goto st_case_11; - case 12: - goto st_case_12; - case 17: - goto st_case_17; - case 13: - goto st_case_13; - case 14: - goto st_case_14; - case 15: - goto st_case_15; - case 16: - goto st_case_16; - } - goto st_out; - st_case_1: - if ( ( (*( p))) == 91 ) { - goto st2; - } - { - goto st0; - } - st_case_0: - st0: - cs = 0; - goto _out; - st2: - p+= 1; - if ( p == pe ) - goto _test_eof2; - st_case_2: - switch( ( (*( p))) ) { - case 13: { - goto st2; - } - case 32: { - goto st2; - } - case 34: { - goto ctr2; - } - case 45: { - goto ctr2; - } - case 47: { - goto st13; - } - case 73: { - goto ctr2; - } - case 78: { - goto ctr2; - } - case 91: { - goto ctr2; - } - case 93: { - goto ctr4; - } - case 102: { - goto ctr2; - } - case 110: { - goto ctr2; - } - case 116: { - goto ctr2; - } - case 123: { - goto ctr2; - } - } - if ( ( (*( p))) > 10 ) { - if ( 48 <= ( (*( p))) && ( (*( p))) <= 57 ) { - goto ctr2; - } - } else if ( ( (*( p))) >= 9 ) { - goto st2; - } - { - goto st0; - } - ctr2: - { - #line 409 "parser.rl" - - VALUE v = Qnil; - char *np = JSON_parse_value(json, p, pe, &v, current_nesting); - if (np == NULL) { - {p = p - 1; } {p+= 1; cs = 3; goto _out;} - } else { - if (NIL_P(json->array_class)) { - rb_ary_push(*result, v); - } else { - rb_funcall(*result, i_leftshift, 1, v); - } - {p = (( np))-1;} - - } - } - - goto st3; - st3: - p+= 1; - if ( p == pe ) - goto _test_eof3; - st_case_3: - switch( ( (*( p))) ) { - case 13: { - goto st3; - } - case 32: { - goto st3; - } - case 44: { - goto st4; - } - case 47: { - goto st9; - } - case 93: { - goto ctr4; - } - } - if ( 9 <= ( (*( p))) && ( (*( p))) <= 10 ) { - goto st3; - } - { - goto st0; - } - st4: - p+= 1; - if ( p == pe ) - goto _test_eof4; - st_case_4: - switch( ( (*( p))) ) { - case 13: { - goto st4; - } - case 32: { - goto st4; - } - case 34: { - goto ctr2; - } - case 45: { - goto ctr2; - } - case 47: { - goto st5; - } - case 73: { - goto ctr2; - } - case 78: { - goto ctr2; - } - case 91: { - goto ctr2; - } - case 102: { - goto ctr2; - } - case 110: { - goto ctr2; - } - case 116: { - goto ctr2; - } - case 123: { - goto ctr2; - } - } - if ( ( (*( p))) > 10 ) { - if ( 48 <= ( (*( p))) && ( (*( p))) <= 57 ) { - goto ctr2; - } - } else if ( ( (*( p))) >= 9 ) { - goto st4; - } - { - goto st0; - } - st5: - p+= 1; - if ( p == pe ) - goto _test_eof5; - st_case_5: - switch( ( (*( p))) ) { - case 42: { - goto st6; - } - case 47: { - goto st8; - } - } - { - goto st0; - } - st6: - p+= 1; - if ( p == pe ) - goto _test_eof6; - st_case_6: - if ( ( (*( p))) == 42 ) { - goto st7; - } - { - goto st6; - } - st7: - p+= 1; - if ( p == pe ) - goto _test_eof7; - st_case_7: - switch( ( (*( p))) ) { - case 42: { - goto st7; - } - case 47: { - goto st4; - } - } - { - goto st6; - } - st8: - p+= 1; - if ( p == pe ) - goto _test_eof8; - st_case_8: - if ( ( (*( p))) == 10 ) { - goto st4; - } - { - goto st8; - } - st9: - p+= 1; - if ( p == pe ) - goto _test_eof9; - st_case_9: - switch( ( (*( p))) ) { - case 42: { - goto st10; - } - case 47: { - goto st12; - } - } - { - goto st0; - } - st10: - p+= 1; - if ( p == pe ) - goto _test_eof10; - st_case_10: - if ( ( (*( p))) == 42 ) { - goto st11; - } - { - goto st10; - } - st11: - p+= 1; - if ( p == pe ) - goto _test_eof11; - st_case_11: - switch( ( (*( p))) ) { - case 42: { - goto st11; - } - case 47: { - goto st3; - } - } - { - goto st10; - } - st12: - p+= 1; - if ( p == pe ) - goto _test_eof12; - st_case_12: - if ( ( (*( p))) == 10 ) { - goto st3; - } - { - goto st12; - } - ctr4: - { - #line 424 "parser.rl" - {p = p - 1; } {p+= 1; cs = 17; goto _out;} } - - goto st17; - st17: - p+= 1; - if ( p == pe ) - goto _test_eof17; - st_case_17: - { - goto st0; - } - st13: - p+= 1; - if ( p == pe ) - goto _test_eof13; - st_case_13: - switch( ( (*( p))) ) { - case 42: { - goto st14; - } - case 47: { - goto st16; - } - } - { - goto st0; - } - st14: - p+= 1; - if ( p == pe ) - goto _test_eof14; - st_case_14: - if ( ( (*( p))) == 42 ) { - goto st15; - } - { - goto st14; - } - st15: - p+= 1; - if ( p == pe ) - goto _test_eof15; - st_case_15: - switch( ( (*( p))) ) { - case 42: { - goto st15; - } - case 47: { - goto st2; - } - } - { - goto st14; - } - st16: - p+= 1; - if ( p == pe ) - goto _test_eof16; - st_case_16: - if ( ( (*( p))) == 10 ) { - goto st2; - } - { - goto st16; - } - st_out: - _test_eof2: cs = 2; goto _test_eof; - _test_eof3: cs = 3; goto _test_eof; - _test_eof4: cs = 4; goto _test_eof; - _test_eof5: cs = 5; goto _test_eof; - _test_eof6: cs = 6; goto _test_eof; - _test_eof7: cs = 7; goto _test_eof; - _test_eof8: cs = 8; goto _test_eof; - _test_eof9: cs = 9; goto _test_eof; - _test_eof10: cs = 10; goto _test_eof; - _test_eof11: cs = 11; goto _test_eof; - _test_eof12: cs = 12; goto _test_eof; - _test_eof17: cs = 17; goto _test_eof; - _test_eof13: cs = 13; goto _test_eof; - _test_eof14: cs = 14; goto _test_eof; - _test_eof15: cs = 15; goto _test_eof; - _test_eof16: cs = 16; goto _test_eof; - - _test_eof: {} - _out: {} - } - - #line 446 "parser.rl" - - - if(cs >= JSON_array_first_final) { - return p + 1; - } else { - rb_enc_raise(EXC_ENCODING eParserError, "unexpected token at '%s'", p); - return NULL; - } -} - -static const size_t MAX_STACK_BUFFER_SIZE = 128; -static VALUE json_string_unescape(char *string, char *stringEnd, int intern, int symbolize) -{ - VALUE result = Qnil; - size_t bufferSize = stringEnd - string; - char *p = string, *pe = string, *unescape, *bufferStart, *buffer; - int unescape_len; - char buf[4]; - - if (bufferSize > MAX_STACK_BUFFER_SIZE) { -# ifdef HAVE_RB_ENC_INTERNED_STR - bufferStart = buffer = ALLOC_N(char, bufferSize ? bufferSize : 1); -# else - bufferStart = buffer = ALLOC_N(char, bufferSize); -# endif - } else { -# ifdef HAVE_RB_ENC_INTERNED_STR - bufferStart = buffer = ALLOCA_N(char, bufferSize ? bufferSize : 1); -# else - bufferStart = buffer = ALLOCA_N(char, bufferSize); -# endif - } - - while (pe < stringEnd) { - if (*pe == '\\') { - unescape = (char *) "?"; - unescape_len = 1; - if (pe > p) { - MEMCPY(buffer, p, char, pe - p); - buffer += pe - p; - } - switch (*++pe) { - case 'n': - unescape = (char *) "\n"; - break; - case 'r': - unescape = (char *) "\r"; - break; - case 't': - unescape = (char *) "\t"; - break; - case '"': - unescape = (char *) "\""; - break; - case '\\': - unescape = (char *) "\\"; - break; - case 'b': - unescape = (char *) "\b"; - break; - case 'f': - unescape = (char *) "\f"; - break; - case 'u': - if (pe > stringEnd - 4) { - if (bufferSize > MAX_STACK_BUFFER_SIZE) { - free(bufferStart); - } - rb_enc_raise( - EXC_ENCODING eParserError, - "incomplete unicode character escape sequence at '%s'", p - ); - } else { - UTF32 ch = unescape_unicode((unsigned char *) ++pe); - pe += 3; - if (UNI_SUR_HIGH_START == (ch & 0xFC00)) { - pe++; - if (pe > stringEnd - 6) { - if (bufferSize > MAX_STACK_BUFFER_SIZE) { - free(bufferStart); - } - rb_enc_raise( - EXC_ENCODING eParserError, - "incomplete surrogate pair at '%s'", p - ); - } - if (pe[0] == '\\' && pe[1] == 'u') { - UTF32 sur = unescape_unicode((unsigned char *) pe + 2); - ch = (((ch & 0x3F) << 10) | ((((ch >> 6) & 0xF) + 1) << 16) - | (sur & 0x3FF)); - pe += 5; - } else { - unescape = (char *) "?"; - break; - } - } - unescape_len = convert_UTF32_to_UTF8(buf, ch); - unescape = buf; - } - break; - default: - p = pe; - continue; - } - MEMCPY(buffer, unescape, char, unescape_len); - buffer += unescape_len; - p = ++pe; - } else { - pe++; - } - } - - if (pe > p) { - MEMCPY(buffer, p, char, pe - p); - buffer += pe - p; - } - - # ifdef HAVE_RB_ENC_INTERNED_STR - if (intern) { - result = rb_enc_interned_str(bufferStart, (long)(buffer - bufferStart), rb_utf8_encoding()); - } else { - result = rb_utf8_str_new(bufferStart, (long)(buffer - bufferStart)); - } - if (bufferSize > MAX_STACK_BUFFER_SIZE) { - free(bufferStart); - } - # else - result = rb_utf8_str_new(bufferStart, (long)(buffer - bufferStart)); - - if (bufferSize > MAX_STACK_BUFFER_SIZE) { - free(bufferStart); - } - - if (intern) { - # if STR_UMINUS_DEDUPE_FROZEN - // Starting from MRI 2.8 it is preferable to freeze the string - // before deduplication so that it can be interned directly - // otherwise it would be duplicated first which is wasteful. - result = rb_funcall(rb_str_freeze(result), i_uminus, 0); - # elif STR_UMINUS_DEDUPE - // MRI 2.5 and older do not deduplicate strings that are already - // frozen. - result = rb_funcall(result, i_uminus, 0); - # else - result = rb_str_freeze(result); - # endif - } - # endif - - if (symbolize) { - result = rb_str_intern(result); - } - - return result; -} - - -enum {JSON_string_start = 1}; -enum {JSON_string_first_final = 8}; -enum {JSON_string_error = 0}; - -enum {JSON_string_en_main = 1}; - -static const char MAYBE_UNUSED(_JSON_string_nfa_targs)[] = { - 0, 0 -}; - -static const char MAYBE_UNUSED(_JSON_string_nfa_offsets)[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0 -}; - -static const char MAYBE_UNUSED(_JSON_string_nfa_push_actions)[] = { - 0, 0 -}; - -static const char MAYBE_UNUSED(_JSON_string_nfa_pop_trans)[] = { - 0, 0 -}; - - -#line 612 "parser.rl" - - -static int -match_i(VALUE regexp, VALUE klass, VALUE memo) -{ - if (regexp == Qundef) return ST_STOP; - if (RTEST(rb_funcall(klass, i_json_creatable_p, 0)) && - RTEST(rb_funcall(regexp, i_match, 1, rb_ary_entry(memo, 0)))) { - rb_ary_push(memo, klass); - return ST_STOP; - } - return ST_CONTINUE; -} - -static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *result) -{ - int cs = EVIL; - VALUE match_string; - - - { - cs = (int)JSON_string_start; - } - - #line 632 "parser.rl" - - json->memo = p; - - { - if ( p == pe ) - goto _test_eof; - switch ( cs ) - { - case 1: - goto st_case_1; - case 0: - goto st_case_0; - case 2: - goto st_case_2; - case 8: - goto st_case_8; - case 3: - goto st_case_3; - case 4: - goto st_case_4; - case 5: - goto st_case_5; - case 6: - goto st_case_6; - case 7: - goto st_case_7; - } - goto st_out; - st_case_1: - if ( ( (*( p))) == 34 ) { - goto st2; - } - { - goto st0; - } - st_case_0: - st0: - cs = 0; - goto _out; - st2: - p+= 1; - if ( p == pe ) - goto _test_eof2; - st_case_2: - switch( ( (*( p))) ) { - case 34: { - goto ctr2; - } - case 92: { - goto st3; - } - } - if ( 0 <= (signed char)(*(p)) && (*(p)) <= 31 ) { - goto st0; - } - { - goto st2; - } - ctr2: - { - #line 599 "parser.rl" - - *result = json_string_unescape(json->memo + 1, p, json->parsing_name || json-> freeze, json->parsing_name && json->symbolize_names); - if (NIL_P(*result)) { - {p = p - 1; } - {p+= 1; cs = 8; goto _out;} - } else { - {p = (( p + 1))-1;} - - } - } - { - #line 609 "parser.rl" - {p = p - 1; } {p+= 1; cs = 8; goto _out;} } - - goto st8; - st8: - p+= 1; - if ( p == pe ) - goto _test_eof8; - st_case_8: - { - goto st0; - } - st3: - p+= 1; - if ( p == pe ) - goto _test_eof3; - st_case_3: - if ( ( (*( p))) == 117 ) { - goto st4; - } - if ( 0 <= (signed char)(*(p)) && (*(p)) <= 31 ) { - goto st0; - } - { - goto st2; - } - st4: - p+= 1; - if ( p == pe ) - goto _test_eof4; - st_case_4: - if ( ( (*( p))) < 65 ) { - if ( 48 <= ( (*( p))) && ( (*( p))) <= 57 ) { - goto st5; - } - } else if ( ( (*( p))) > 70 ) { - if ( 97 <= ( (*( p))) && ( (*( p))) <= 102 ) { - goto st5; - } - } else { - goto st5; - } - { - goto st0; - } - st5: - p+= 1; - if ( p == pe ) - goto _test_eof5; - st_case_5: - if ( ( (*( p))) < 65 ) { - if ( 48 <= ( (*( p))) && ( (*( p))) <= 57 ) { - goto st6; - } - } else if ( ( (*( p))) > 70 ) { - if ( 97 <= ( (*( p))) && ( (*( p))) <= 102 ) { - goto st6; - } - } else { - goto st6; - } - { - goto st0; - } - st6: - p+= 1; - if ( p == pe ) - goto _test_eof6; - st_case_6: - if ( ( (*( p))) < 65 ) { - if ( 48 <= ( (*( p))) && ( (*( p))) <= 57 ) { - goto st7; - } - } else if ( ( (*( p))) > 70 ) { - if ( 97 <= ( (*( p))) && ( (*( p))) <= 102 ) { - goto st7; - } - } else { - goto st7; - } - { - goto st0; - } - st7: - p+= 1; - if ( p == pe ) - goto _test_eof7; - st_case_7: - if ( ( (*( p))) < 65 ) { - if ( 48 <= ( (*( p))) && ( (*( p))) <= 57 ) { - goto st2; - } - } else if ( ( (*( p))) > 70 ) { - if ( 97 <= ( (*( p))) && ( (*( p))) <= 102 ) { - goto st2; - } - } else { - goto st2; - } - { - goto st0; - } - st_out: - _test_eof2: cs = 2; goto _test_eof; - _test_eof8: cs = 8; goto _test_eof; - _test_eof3: cs = 3; goto _test_eof; - _test_eof4: cs = 4; goto _test_eof; - _test_eof5: cs = 5; goto _test_eof; - _test_eof6: cs = 6; goto _test_eof; - _test_eof7: cs = 7; goto _test_eof; - - _test_eof: {} - _out: {} - } - - #line 634 "parser.rl" - - - if (json->create_additions && RTEST(match_string = json->match_string)) { - VALUE klass; - VALUE memo = rb_ary_new2(2); - rb_ary_push(memo, *result); - rb_hash_foreach(match_string, match_i, memo); - klass = rb_ary_entry(memo, 1); - if (RTEST(klass)) { - *result = rb_funcall(klass, i_json_create, 1, *result); - } - } - - if (cs >= JSON_string_first_final) { - return p + 1; - } else { - return NULL; - } -} - -/* -* Document-class: JSON::Ext::Parser -* -* This is the JSON parser implemented as a C extension. It can be configured -* to be used by setting -* -* JSON.parser = JSON::Ext::Parser -* -* with the method parser= in JSON. -* -*/ - -static VALUE convert_encoding(VALUE source) -{ - #ifdef HAVE_RUBY_ENCODING_H - rb_encoding *enc = rb_enc_get(source); - if (enc == rb_ascii8bit_encoding()) { - if (OBJ_FROZEN(source)) { - source = rb_str_dup(source); - } - FORCE_UTF8(source); - } else { - source = rb_str_conv_enc(source, rb_enc_get(source), rb_utf8_encoding()); - } - #endif - return source; -} - -/* -* call-seq: new(source, opts => {}) -* -* Creates a new JSON::Ext::Parser instance for the string _source_. -* -* Creates a new JSON::Ext::Parser instance for the string _source_. -* -* It will be configured by the _opts_ hash. _opts_ can have the following -* keys: -* -* _opts_ can have the following keys: -* * *max_nesting*: The maximum depth of nesting allowed in the parsed data -* structures. Disable depth checking with :max_nesting => false|nil|0, it -* defaults to 100. -* * *allow_nan*: If set to true, allow NaN, Infinity and -Infinity in -* defiance of RFC 4627 to be parsed by the Parser. This option defaults to -* false. -* * *symbolize_names*: If set to true, returns symbols for the names -* (keys) in a JSON object. Otherwise strings are returned, which is -* also the default. It's not possible to use this option in -* conjunction with the *create_additions* option. -* * *create_additions*: If set to false, the Parser doesn't create -* additions even if a matching class and create_id was found. This option -* defaults to false. -* * *object_class*: Defaults to Hash -* * *array_class*: Defaults to Array -*/ -static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self) -{ - VALUE source, opts; - GET_PARSER_INIT; - - if (json->Vsource) { - rb_raise(rb_eTypeError, "already initialized instance"); - } - #ifdef HAVE_RB_SCAN_ARGS_OPTIONAL_HASH - rb_scan_args(argc, argv, "1:", &source, &opts); - #else - rb_scan_args(argc, argv, "11", &source, &opts); - #endif - if (!NIL_P(opts)) { - #ifndef HAVE_RB_SCAN_ARGS_OPTIONAL_HASH - opts = rb_convert_type(opts, T_HASH, "Hash", "to_hash"); - if (NIL_P(opts)) { - rb_raise(rb_eArgError, "opts needs to be like a hash"); - } else { - #endif - VALUE tmp = ID2SYM(i_max_nesting); - if (option_given_p(opts, tmp)) { - VALUE max_nesting = rb_hash_aref(opts, tmp); - if (RTEST(max_nesting)) { - Check_Type(max_nesting, T_FIXNUM); - json->max_nesting = FIX2INT(max_nesting); - } else { - json->max_nesting = 0; - } - } else { - json->max_nesting = 100; - } - tmp = ID2SYM(i_allow_nan); - if (option_given_p(opts, tmp)) { - json->allow_nan = RTEST(rb_hash_aref(opts, tmp)) ? 1 : 0; - } else { - json->allow_nan = 0; - } - tmp = ID2SYM(i_symbolize_names); - if (option_given_p(opts, tmp)) { - json->symbolize_names = RTEST(rb_hash_aref(opts, tmp)) ? 1 : 0; - } else { - json->symbolize_names = 0; - } - tmp = ID2SYM(i_freeze); - if (option_given_p(opts, tmp)) { - json->freeze = RTEST(rb_hash_aref(opts, tmp)) ? 1 : 0; - } else { - json->freeze = 0; - } - tmp = ID2SYM(i_create_additions); - if (option_given_p(opts, tmp)) { - json->create_additions = RTEST(rb_hash_aref(opts, tmp)); - } else { - json->create_additions = 0; - } - if (json->symbolize_names && json->create_additions) { - rb_raise(rb_eArgError, - "options :symbolize_names and :create_additions cannot be " - " used in conjunction"); - } - tmp = ID2SYM(i_create_id); - if (option_given_p(opts, tmp)) { - json->create_id = rb_hash_aref(opts, tmp); - } else { - json->create_id = rb_funcall(mJSON, i_create_id, 0); - } - tmp = ID2SYM(i_object_class); - if (option_given_p(opts, tmp)) { - json->object_class = rb_hash_aref(opts, tmp); - } else { - json->object_class = Qnil; - } - tmp = ID2SYM(i_array_class); - if (option_given_p(opts, tmp)) { - json->array_class = rb_hash_aref(opts, tmp); - } else { - json->array_class = Qnil; - } - tmp = ID2SYM(i_decimal_class); - if (option_given_p(opts, tmp)) { - json->decimal_class = rb_hash_aref(opts, tmp); - } else { - json->decimal_class = Qnil; - } - tmp = ID2SYM(i_match_string); - if (option_given_p(opts, tmp)) { - VALUE match_string = rb_hash_aref(opts, tmp); - json->match_string = RTEST(match_string) ? match_string : Qnil; - } else { - json->match_string = Qnil; - } - #ifndef HAVE_RB_SCAN_ARGS_OPTIONAL_HASH - } - #endif - } else { - json->max_nesting = 100; - json->allow_nan = 0; - json->create_additions = 0; - json->create_id = rb_funcall(mJSON, i_create_id, 0); - json->object_class = Qnil; - json->array_class = Qnil; - json->decimal_class = Qnil; - } - source = convert_encoding(StringValue(source)); - StringValue(source); - json->len = RSTRING_LEN(source); - json->source = RSTRING_PTR(source);; - json->Vsource = source; - return self; -} - - -enum {JSON_start = 1}; -enum {JSON_first_final = 10}; -enum {JSON_error = 0}; - -enum {JSON_en_main = 1}; - -static const char MAYBE_UNUSED(_JSON_nfa_targs)[] = { - 0, 0 -}; - -static const char MAYBE_UNUSED(_JSON_nfa_offsets)[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0 -}; - -static const char MAYBE_UNUSED(_JSON_nfa_push_actions)[] = { - 0, 0 -}; - -static const char MAYBE_UNUSED(_JSON_nfa_pop_trans)[] = { - 0, 0 -}; - - -#line 835 "parser.rl" - - -/* -* call-seq: parse() -* -* Parses the current JSON text _source_ and returns the complete data -* structure as a result. -* It raises JSON::ParseError if fail to parse. -*/ -static VALUE cParser_parse(VALUE self) -{ - char *p, *pe; - int cs = EVIL; - VALUE result = Qnil; - GET_PARSER; - - - { - cs = (int)JSON_start; - } - - #line 851 "parser.rl" - - p = json->source; - pe = p + json->len; - - { - if ( p == pe ) - goto _test_eof; - switch ( cs ) - { - case 1: - goto st_case_1; - case 0: - goto st_case_0; - case 10: - goto st_case_10; - case 2: - goto st_case_2; - case 3: - goto st_case_3; - case 4: - goto st_case_4; - case 5: - goto st_case_5; - case 6: - goto st_case_6; - case 7: - goto st_case_7; - case 8: - goto st_case_8; - case 9: - goto st_case_9; - } - goto st_out; - st1: - p+= 1; - if ( p == pe ) - goto _test_eof1; - st_case_1: - switch( ( (*( p))) ) { - case 13: { - goto st1; - } - case 32: { - goto st1; - } - case 34: { - goto ctr2; - } - case 45: { - goto ctr2; - } - case 47: { - goto st6; - } - case 73: { - goto ctr2; - } - case 78: { - goto ctr2; - } - case 91: { - goto ctr2; - } - case 102: { - goto ctr2; - } - case 110: { - goto ctr2; - } - case 116: { - goto ctr2; - } - case 123: { - goto ctr2; - } - } - if ( ( (*( p))) > 10 ) { - if ( 48 <= ( (*( p))) && ( (*( p))) <= 57 ) { - goto ctr2; - } - } else if ( ( (*( p))) >= 9 ) { - goto st1; - } - { - goto st0; - } - st_case_0: - st0: - cs = 0; - goto _out; - ctr2: - { - #line 827 "parser.rl" - - char *np = JSON_parse_value(json, p, pe, &result, 0); - if (np == NULL) { {p = p - 1; } {p+= 1; cs = 10; goto _out;} } else {p = (( np))-1;} - - } - - goto st10; - st10: - p+= 1; - if ( p == pe ) - goto _test_eof10; - st_case_10: - switch( ( (*( p))) ) { - case 13: { - goto st10; - } - case 32: { - goto st10; - } - case 47: { - goto st2; - } - } - if ( 9 <= ( (*( p))) && ( (*( p))) <= 10 ) { - goto st10; - } - { - goto st0; - } - st2: - p+= 1; - if ( p == pe ) - goto _test_eof2; - st_case_2: - switch( ( (*( p))) ) { - case 42: { - goto st3; - } - case 47: { - goto st5; - } - } - { - goto st0; - } - st3: - p+= 1; - if ( p == pe ) - goto _test_eof3; - st_case_3: - if ( ( (*( p))) == 42 ) { - goto st4; - } - { - goto st3; - } - st4: - p+= 1; - if ( p == pe ) - goto _test_eof4; - st_case_4: - switch( ( (*( p))) ) { - case 42: { - goto st4; - } - case 47: { - goto st10; - } - } - { - goto st3; - } - st5: - p+= 1; - if ( p == pe ) - goto _test_eof5; - st_case_5: - if ( ( (*( p))) == 10 ) { - goto st10; - } - { - goto st5; - } - st6: - p+= 1; - if ( p == pe ) - goto _test_eof6; - st_case_6: - switch( ( (*( p))) ) { - case 42: { - goto st7; - } - case 47: { - goto st9; - } - } - { - goto st0; - } - st7: - p+= 1; - if ( p == pe ) - goto _test_eof7; - st_case_7: - if ( ( (*( p))) == 42 ) { - goto st8; - } - { - goto st7; - } - st8: - p+= 1; - if ( p == pe ) - goto _test_eof8; - st_case_8: - switch( ( (*( p))) ) { - case 42: { - goto st8; - } - case 47: { - goto st1; - } - } - { - goto st7; - } - st9: - p+= 1; - if ( p == pe ) - goto _test_eof9; - st_case_9: - if ( ( (*( p))) == 10 ) { - goto st1; - } - { - goto st9; - } - st_out: - _test_eof1: cs = 1; goto _test_eof; - _test_eof10: cs = 10; goto _test_eof; - _test_eof2: cs = 2; goto _test_eof; - _test_eof3: cs = 3; goto _test_eof; - _test_eof4: cs = 4; goto _test_eof; - _test_eof5: cs = 5; goto _test_eof; - _test_eof6: cs = 6; goto _test_eof; - _test_eof7: cs = 7; goto _test_eof; - _test_eof8: cs = 8; goto _test_eof; - _test_eof9: cs = 9; goto _test_eof; - - _test_eof: {} - _out: {} - } - - #line 854 "parser.rl" - - - if (cs >= JSON_first_final && p == pe) { - return result; - } else { - rb_enc_raise(EXC_ENCODING eParserError, "unexpected token at '%s'", p); - return Qnil; - } -} - -static void JSON_mark(void *ptr) -{ - JSON_Parser *json = ptr; - rb_gc_mark_maybe(json->Vsource); - rb_gc_mark_maybe(json->create_id); - rb_gc_mark_maybe(json->object_class); - rb_gc_mark_maybe(json->array_class); - rb_gc_mark_maybe(json->decimal_class); - rb_gc_mark_maybe(json->match_string); -} - -static void JSON_free(void *ptr) -{ - JSON_Parser *json = ptr; - fbuffer_free(json->fbuffer); - ruby_xfree(json); -} - -static size_t JSON_memsize(const void *ptr) -{ - const JSON_Parser *json = ptr; - return sizeof(*json) + FBUFFER_CAPA(json->fbuffer); -} - -#ifdef NEW_TYPEDDATA_WRAPPER -static const rb_data_type_t JSON_Parser_type = { - "JSON/Parser", - {JSON_mark, JSON_free, JSON_memsize,}, - #ifdef RUBY_TYPED_FREE_IMMEDIATELY - 0, 0, - RUBY_TYPED_FREE_IMMEDIATELY, - #endif -}; -#endif - -static VALUE cJSON_parser_s_allocate(VALUE klass) -{ - JSON_Parser *json; - VALUE obj = TypedData_Make_Struct(klass, JSON_Parser, &JSON_Parser_type, json); - json->fbuffer = fbuffer_alloc(0); - return obj; -} - -/* -* call-seq: source() -* -* Returns a copy of the current _source_ string, that was used to construct -* this Parser. -*/ -static VALUE cParser_source(VALUE self) -{ - GET_PARSER; - return rb_str_dup(json->Vsource); -} - -void Init_parser(void) -{ - #ifdef HAVE_RB_EXT_RACTOR_SAFE - rb_ext_ractor_safe(true); - #endif - - #undef rb_intern - rb_require("json/common"); - mJSON = rb_define_module("JSON"); - mExt = rb_define_module_under(mJSON, "Ext"); - cParser = rb_define_class_under(mExt, "Parser", rb_cObject); - eParserError = rb_path2class("JSON::ParserError"); - eNestingError = rb_path2class("JSON::NestingError"); - rb_gc_register_mark_object(eParserError); - rb_gc_register_mark_object(eNestingError); - rb_define_alloc_func(cParser, cJSON_parser_s_allocate); - rb_define_method(cParser, "initialize", cParser_initialize, -1); - rb_define_method(cParser, "parse", cParser_parse, 0); - rb_define_method(cParser, "source", cParser_source, 0); - - CNaN = rb_const_get(mJSON, rb_intern("NaN")); - rb_gc_register_mark_object(CNaN); - - CInfinity = rb_const_get(mJSON, rb_intern("Infinity")); - rb_gc_register_mark_object(CInfinity); - - CMinusInfinity = rb_const_get(mJSON, rb_intern("MinusInfinity")); - rb_gc_register_mark_object(CMinusInfinity); - - i_json_creatable_p = rb_intern("json_creatable?"); - i_json_create = rb_intern("json_create"); - i_create_id = rb_intern("create_id"); - i_create_additions = rb_intern("create_additions"); - i_chr = rb_intern("chr"); - i_max_nesting = rb_intern("max_nesting"); - i_allow_nan = rb_intern("allow_nan"); - i_symbolize_names = rb_intern("symbolize_names"); - i_object_class = rb_intern("object_class"); - i_array_class = rb_intern("array_class"); - i_decimal_class = rb_intern("decimal_class"); - i_match = rb_intern("match"); - i_match_string = rb_intern("match_string"); - i_key_p = rb_intern("key?"); - i_deep_const_get = rb_intern("deep_const_get"); - i_aset = rb_intern("[]="); - i_aref = rb_intern("[]"); - i_leftshift = rb_intern("<<"); - i_new = rb_intern("new"); - i_try_convert = rb_intern("try_convert"); - i_freeze = rb_intern("freeze"); - i_uminus = rb_intern("-@"); -} - -/* -* Local variables: -* mode: c -* c-file-style: ruby -* indent-tabs-mode: nil -* End: -*/ diff --git a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/parser/parser.h b/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/parser/parser.h deleted file mode 100644 index 92ed3fd..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/parser/parser.h +++ /dev/null @@ -1,96 +0,0 @@ -#ifndef _PARSER_H_ -#define _PARSER_H_ - -#include "ruby.h" - -#ifndef HAVE_RUBY_RE_H -#include "re.h" -#endif - -#ifdef HAVE_RUBY_ST_H -#include "ruby/st.h" -#else -#include "st.h" -#endif - -#ifndef MAYBE_UNUSED -# define MAYBE_UNUSED(x) x -#endif - -#define option_given_p(opts, key) RTEST(rb_funcall(opts, i_key_p, 1, key)) - -/* unicode */ - -typedef unsigned long UTF32; /* at least 32 bits */ -typedef unsigned short UTF16; /* at least 16 bits */ -typedef unsigned char UTF8; /* typically 8 bits */ - -#define UNI_REPLACEMENT_CHAR (UTF32)0x0000FFFD -#define UNI_SUR_HIGH_START (UTF32)0xD800 -#define UNI_SUR_HIGH_END (UTF32)0xDBFF -#define UNI_SUR_LOW_START (UTF32)0xDC00 -#define UNI_SUR_LOW_END (UTF32)0xDFFF - -typedef struct JSON_ParserStruct { - VALUE Vsource; - char *source; - long len; - char *memo; - VALUE create_id; - int max_nesting; - int allow_nan; - int parsing_name; - int symbolize_names; - int freeze; - VALUE object_class; - VALUE array_class; - VALUE decimal_class; - int create_additions; - VALUE match_string; - FBuffer *fbuffer; -} JSON_Parser; - -#define GET_PARSER \ - GET_PARSER_INIT; \ - if (!json->Vsource) rb_raise(rb_eTypeError, "uninitialized instance") -#define GET_PARSER_INIT \ - JSON_Parser *json; \ - TypedData_Get_Struct(self, JSON_Parser, &JSON_Parser_type, json) - -#define MinusInfinity "-Infinity" -#define EVIL 0x666 - -static UTF32 unescape_unicode(const unsigned char *p); -static int convert_UTF32_to_UTF8(char *buf, UTF32 ch); -static char *JSON_parse_object(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting); -static char *JSON_parse_value(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting); -static char *JSON_parse_integer(JSON_Parser *json, char *p, char *pe, VALUE *result); -static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *result); -static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting); -static VALUE json_string_unescape(char *string, char *stringEnd, int intern, int symbolize); -static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *result); -static VALUE convert_encoding(VALUE source); -static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self); -static VALUE cParser_parse(VALUE self); -static void JSON_mark(void *json); -static void JSON_free(void *json); -static VALUE cJSON_parser_s_allocate(VALUE klass); -static VALUE cParser_source(VALUE self); -#ifndef ZALLOC -#define ZALLOC(type) ((type *)ruby_zalloc(sizeof(type))) -static inline void *ruby_zalloc(size_t n) -{ - void *p = ruby_xmalloc(n); - memset(p, 0, n); - return p; -} -#endif -#ifdef TypedData_Make_Struct -static const rb_data_type_t JSON_Parser_type; -#define NEW_TYPEDDATA_WRAPPER 1 -#else -#define TypedData_Make_Struct(klass, type, ignore, json) Data_Make_Struct(klass, type, NULL, JSON_free, json) -#define TypedData_Get_Struct(self, JSON_Parser, ignore, json) Data_Get_Struct(self, JSON_Parser, json) -#endif - -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/parser/parser.o b/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/parser/parser.o deleted file mode 100644 index 68e2b4046ff26e3ca4f736e73a727b813744b627..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81344 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 CP}>&( diff --git a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/parser/parser.rl b/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/parser/parser.rl deleted file mode 100644 index 2dbdc7e..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/ext/parser/parser.rl +++ /dev/null @@ -1,986 +0,0 @@ -#include "../fbuffer/fbuffer.h" -#include "parser.h" - -#if defined HAVE_RUBY_ENCODING_H -# define EXC_ENCODING rb_utf8_encoding(), -# ifndef HAVE_RB_ENC_RAISE -static void -enc_raise(rb_encoding *enc, VALUE exc, const char *fmt, ...) -{ - va_list args; - VALUE mesg; - - va_start(args, fmt); - mesg = rb_enc_vsprintf(enc, fmt, args); - va_end(args); - - rb_exc_raise(rb_exc_new3(exc, mesg)); -} -# define rb_enc_raise enc_raise -# endif -#else -# define EXC_ENCODING /* nothing */ -# define rb_enc_raise rb_raise -#endif - -/* unicode */ - -static const signed char digit_values[256] = { - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, - -1, -1, -1, -1, -1, -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1 -}; - -static UTF32 unescape_unicode(const unsigned char *p) -{ - signed char b; - UTF32 result = 0; - b = digit_values[p[0]]; - if (b < 0) return UNI_REPLACEMENT_CHAR; - result = (result << 4) | (unsigned char)b; - b = digit_values[p[1]]; - if (b < 0) return UNI_REPLACEMENT_CHAR; - result = (result << 4) | (unsigned char)b; - b = digit_values[p[2]]; - if (b < 0) return UNI_REPLACEMENT_CHAR; - result = (result << 4) | (unsigned char)b; - b = digit_values[p[3]]; - if (b < 0) return UNI_REPLACEMENT_CHAR; - result = (result << 4) | (unsigned char)b; - return result; -} - -static int convert_UTF32_to_UTF8(char *buf, UTF32 ch) -{ - int len = 1; - if (ch <= 0x7F) { - buf[0] = (char) ch; - } else if (ch <= 0x07FF) { - buf[0] = (char) ((ch >> 6) | 0xC0); - buf[1] = (char) ((ch & 0x3F) | 0x80); - len++; - } else if (ch <= 0xFFFF) { - buf[0] = (char) ((ch >> 12) | 0xE0); - buf[1] = (char) (((ch >> 6) & 0x3F) | 0x80); - buf[2] = (char) ((ch & 0x3F) | 0x80); - len += 2; - } else if (ch <= 0x1fffff) { - buf[0] =(char) ((ch >> 18) | 0xF0); - buf[1] =(char) (((ch >> 12) & 0x3F) | 0x80); - buf[2] =(char) (((ch >> 6) & 0x3F) | 0x80); - buf[3] =(char) ((ch & 0x3F) | 0x80); - len += 3; - } else { - buf[0] = '?'; - } - return len; -} - -static VALUE mJSON, mExt, cParser, eParserError, eNestingError; -static VALUE CNaN, CInfinity, CMinusInfinity; - -static ID i_json_creatable_p, i_json_create, i_create_id, i_create_additions, - i_chr, i_max_nesting, i_allow_nan, i_symbolize_names, - i_object_class, i_array_class, i_decimal_class, i_key_p, - i_deep_const_get, i_match, i_match_string, i_aset, i_aref, - i_leftshift, i_new, i_try_convert, i_freeze, i_uminus; - -%%{ - machine JSON_common; - - cr = '\n'; - cr_neg = [^\n]; - ws = [ \t\r\n]; - c_comment = '/*' ( any* - (any* '*/' any* ) ) '*/'; - cpp_comment = '//' cr_neg* cr; - comment = c_comment | cpp_comment; - ignore = ws | comment; - name_separator = ':'; - value_separator = ','; - Vnull = 'null'; - Vfalse = 'false'; - Vtrue = 'true'; - VNaN = 'NaN'; - VInfinity = 'Infinity'; - VMinusInfinity = '-Infinity'; - begin_value = [nft\"\-\[\{NI] | digit; - begin_object = '{'; - end_object = '}'; - begin_array = '['; - end_array = ']'; - begin_string = '"'; - begin_name = begin_string; - begin_number = digit | '-'; -}%% - -%%{ - machine JSON_object; - include JSON_common; - - write data; - - action parse_value { - VALUE v = Qnil; - char *np = JSON_parse_value(json, fpc, pe, &v, current_nesting); - if (np == NULL) { - fhold; fbreak; - } else { - if (NIL_P(json->object_class)) { - OBJ_FREEZE(last_name); - rb_hash_aset(*result, last_name, v); - } else { - rb_funcall(*result, i_aset, 2, last_name, v); - } - fexec np; - } - } - - action parse_name { - char *np; - json->parsing_name = 1; - np = JSON_parse_string(json, fpc, pe, &last_name); - json->parsing_name = 0; - if (np == NULL) { fhold; fbreak; } else fexec np; - } - - action exit { fhold; fbreak; } - - pair = ignore* begin_name >parse_name ignore* name_separator ignore* begin_value >parse_value; - next_pair = ignore* value_separator pair; - - main := ( - begin_object - (pair (next_pair)*)? ignore* - end_object - ) @exit; -}%% - -static char *JSON_parse_object(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting) -{ - int cs = EVIL; - VALUE last_name = Qnil; - VALUE object_class = json->object_class; - - if (json->max_nesting && current_nesting > json->max_nesting) { - rb_raise(eNestingError, "nesting of %d is too deep", current_nesting); - } - - *result = NIL_P(object_class) ? rb_hash_new() : rb_class_new_instance(0, 0, object_class); - - %% write init; - %% write exec; - - if (cs >= JSON_object_first_final) { - if (json->create_additions) { - VALUE klassname; - if (NIL_P(json->object_class)) { - klassname = rb_hash_aref(*result, json->create_id); - } else { - klassname = rb_funcall(*result, i_aref, 1, json->create_id); - } - if (!NIL_P(klassname)) { - VALUE klass = rb_funcall(mJSON, i_deep_const_get, 1, klassname); - if (RTEST(rb_funcall(klass, i_json_creatable_p, 0))) { - *result = rb_funcall(klass, i_json_create, 1, *result); - } - } - } - return p + 1; - } else { - return NULL; - } -} - - -%%{ - machine JSON_value; - include JSON_common; - - write data; - - action parse_null { - *result = Qnil; - } - action parse_false { - *result = Qfalse; - } - action parse_true { - *result = Qtrue; - } - action parse_nan { - if (json->allow_nan) { - *result = CNaN; - } else { - rb_enc_raise(EXC_ENCODING eParserError, "unexpected token at '%s'", p - 2); - } - } - action parse_infinity { - if (json->allow_nan) { - *result = CInfinity; - } else { - rb_enc_raise(EXC_ENCODING eParserError, "unexpected token at '%s'", p - 8); - } - } - action parse_string { - char *np = JSON_parse_string(json, fpc, pe, result); - if (np == NULL) { fhold; fbreak; } else fexec np; - } - - action parse_number { - char *np; - if(pe > fpc + 8 && !strncmp(MinusInfinity, fpc, 9)) { - if (json->allow_nan) { - *result = CMinusInfinity; - fexec p + 10; - fhold; fbreak; - } else { - rb_enc_raise(EXC_ENCODING eParserError, "unexpected token at '%s'", p); - } - } - np = JSON_parse_float(json, fpc, pe, result); - if (np != NULL) fexec np; - np = JSON_parse_integer(json, fpc, pe, result); - if (np != NULL) fexec np; - fhold; fbreak; - } - - action parse_array { - char *np; - np = JSON_parse_array(json, fpc, pe, result, current_nesting + 1); - if (np == NULL) { fhold; fbreak; } else fexec np; - } - - action parse_object { - char *np; - np = JSON_parse_object(json, fpc, pe, result, current_nesting + 1); - if (np == NULL) { fhold; fbreak; } else fexec np; - } - - action exit { fhold; fbreak; } - -main := ignore* ( - Vnull @parse_null | - Vfalse @parse_false | - Vtrue @parse_true | - VNaN @parse_nan | - VInfinity @parse_infinity | - begin_number >parse_number | - begin_string >parse_string | - begin_array >parse_array | - begin_object >parse_object - ) ignore* %*exit; -}%% - -static char *JSON_parse_value(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting) -{ - int cs = EVIL; - - %% write init; - %% write exec; - - if (json->freeze) { - OBJ_FREEZE(*result); - } - - if (cs >= JSON_value_first_final) { - return p; - } else { - return NULL; - } -} - -%%{ - machine JSON_integer; - - write data; - - action exit { fhold; fbreak; } - - main := '-'? ('0' | [1-9][0-9]*) (^[0-9]? @exit); -}%% - -static char *JSON_parse_integer(JSON_Parser *json, char *p, char *pe, VALUE *result) -{ - int cs = EVIL; - - %% write init; - json->memo = p; - %% write exec; - - if (cs >= JSON_integer_first_final) { - long len = p - json->memo; - fbuffer_clear(json->fbuffer); - fbuffer_append(json->fbuffer, json->memo, len); - fbuffer_append_char(json->fbuffer, '\0'); - *result = rb_cstr2inum(FBUFFER_PTR(json->fbuffer), 10); - return p + 1; - } else { - return NULL; - } -} - -%%{ - machine JSON_float; - include JSON_common; - - write data; - - action exit { fhold; fbreak; } - - main := '-'? ( - (('0' | [1-9][0-9]*) '.' [0-9]+ ([Ee] [+\-]?[0-9]+)?) - | (('0' | [1-9][0-9]*) ([Ee] [+\-]?[0-9]+)) - ) (^[0-9Ee.\-]? @exit ); -}%% - -static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *result) -{ - int cs = EVIL; - - %% write init; - json->memo = p; - %% write exec; - - if (cs >= JSON_float_first_final) { - VALUE mod = Qnil; - ID method_id = 0; - if (rb_respond_to(json->decimal_class, i_try_convert)) { - mod = json->decimal_class; - method_id = i_try_convert; - } else if (rb_respond_to(json->decimal_class, i_new)) { - mod = json->decimal_class; - method_id = i_new; - } else if (RB_TYPE_P(json->decimal_class, T_CLASS)) { - VALUE name = rb_class_name(json->decimal_class); - const char *name_cstr = RSTRING_PTR(name); - const char *last_colon = strrchr(name_cstr, ':'); - if (last_colon) { - const char *mod_path_end = last_colon - 1; - VALUE mod_path = rb_str_substr(name, 0, mod_path_end - name_cstr); - mod = rb_path_to_class(mod_path); - - const char *method_name_beg = last_colon + 1; - long before_len = method_name_beg - name_cstr; - long len = RSTRING_LEN(name) - before_len; - VALUE method_name = rb_str_substr(name, before_len, len); - method_id = SYM2ID(rb_str_intern(method_name)); - } else { - mod = rb_mKernel; - method_id = SYM2ID(rb_str_intern(name)); - } - } - - long len = p - json->memo; - fbuffer_clear(json->fbuffer); - fbuffer_append(json->fbuffer, json->memo, len); - fbuffer_append_char(json->fbuffer, '\0'); - - if (method_id) { - VALUE text = rb_str_new2(FBUFFER_PTR(json->fbuffer)); - *result = rb_funcallv(mod, method_id, 1, &text); - } else { - *result = DBL2NUM(rb_cstr_to_dbl(FBUFFER_PTR(json->fbuffer), 1)); - } - - return p + 1; - } else { - return NULL; - } -} - - -%%{ - machine JSON_array; - include JSON_common; - - write data; - - action parse_value { - VALUE v = Qnil; - char *np = JSON_parse_value(json, fpc, pe, &v, current_nesting); - if (np == NULL) { - fhold; fbreak; - } else { - if (NIL_P(json->array_class)) { - rb_ary_push(*result, v); - } else { - rb_funcall(*result, i_leftshift, 1, v); - } - fexec np; - } - } - - action exit { fhold; fbreak; } - - next_element = value_separator ignore* begin_value >parse_value; - - main := begin_array ignore* - ((begin_value >parse_value ignore*) - (ignore* next_element ignore*)*)? - end_array @exit; -}%% - -static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting) -{ - int cs = EVIL; - VALUE array_class = json->array_class; - - if (json->max_nesting && current_nesting > json->max_nesting) { - rb_raise(eNestingError, "nesting of %d is too deep", current_nesting); - } - *result = NIL_P(array_class) ? rb_ary_new() : rb_class_new_instance(0, 0, array_class); - - %% write init; - %% write exec; - - if(cs >= JSON_array_first_final) { - return p + 1; - } else { - rb_enc_raise(EXC_ENCODING eParserError, "unexpected token at '%s'", p); - return NULL; - } -} - -static const size_t MAX_STACK_BUFFER_SIZE = 128; -static VALUE json_string_unescape(char *string, char *stringEnd, int intern, int symbolize) -{ - VALUE result = Qnil; - size_t bufferSize = stringEnd - string; - char *p = string, *pe = string, *unescape, *bufferStart, *buffer; - int unescape_len; - char buf[4]; - - if (bufferSize > MAX_STACK_BUFFER_SIZE) { -# ifdef HAVE_RB_ENC_INTERNED_STR - bufferStart = buffer = ALLOC_N(char, bufferSize ? bufferSize : 1); -# else - bufferStart = buffer = ALLOC_N(char, bufferSize); -# endif - } else { -# ifdef HAVE_RB_ENC_INTERNED_STR - bufferStart = buffer = ALLOCA_N(char, bufferSize ? bufferSize : 1); -# else - bufferStart = buffer = ALLOCA_N(char, bufferSize); -# endif - } - - while (pe < stringEnd) { - if (*pe == '\\') { - unescape = (char *) "?"; - unescape_len = 1; - if (pe > p) { - MEMCPY(buffer, p, char, pe - p); - buffer += pe - p; - } - switch (*++pe) { - case 'n': - unescape = (char *) "\n"; - break; - case 'r': - unescape = (char *) "\r"; - break; - case 't': - unescape = (char *) "\t"; - break; - case '"': - unescape = (char *) "\""; - break; - case '\\': - unescape = (char *) "\\"; - break; - case 'b': - unescape = (char *) "\b"; - break; - case 'f': - unescape = (char *) "\f"; - break; - case 'u': - if (pe > stringEnd - 4) { - if (bufferSize > MAX_STACK_BUFFER_SIZE) { - free(bufferStart); - } - rb_enc_raise( - EXC_ENCODING eParserError, - "incomplete unicode character escape sequence at '%s'", p - ); - } else { - UTF32 ch = unescape_unicode((unsigned char *) ++pe); - pe += 3; - if (UNI_SUR_HIGH_START == (ch & 0xFC00)) { - pe++; - if (pe > stringEnd - 6) { - if (bufferSize > MAX_STACK_BUFFER_SIZE) { - free(bufferStart); - } - rb_enc_raise( - EXC_ENCODING eParserError, - "incomplete surrogate pair at '%s'", p - ); - } - if (pe[0] == '\\' && pe[1] == 'u') { - UTF32 sur = unescape_unicode((unsigned char *) pe + 2); - ch = (((ch & 0x3F) << 10) | ((((ch >> 6) & 0xF) + 1) << 16) - | (sur & 0x3FF)); - pe += 5; - } else { - unescape = (char *) "?"; - break; - } - } - unescape_len = convert_UTF32_to_UTF8(buf, ch); - unescape = buf; - } - break; - default: - p = pe; - continue; - } - MEMCPY(buffer, unescape, char, unescape_len); - buffer += unescape_len; - p = ++pe; - } else { - pe++; - } - } - - if (pe > p) { - MEMCPY(buffer, p, char, pe - p); - buffer += pe - p; - } - -# ifdef HAVE_RB_ENC_INTERNED_STR - if (intern) { - result = rb_enc_interned_str(bufferStart, (long)(buffer - bufferStart), rb_utf8_encoding()); - } else { - result = rb_utf8_str_new(bufferStart, (long)(buffer - bufferStart)); - } - if (bufferSize > MAX_STACK_BUFFER_SIZE) { - free(bufferStart); - } -# else - result = rb_utf8_str_new(bufferStart, (long)(buffer - bufferStart)); - - if (bufferSize > MAX_STACK_BUFFER_SIZE) { - free(bufferStart); - } - - if (intern) { - # if STR_UMINUS_DEDUPE_FROZEN - // Starting from MRI 2.8 it is preferable to freeze the string - // before deduplication so that it can be interned directly - // otherwise it would be duplicated first which is wasteful. - result = rb_funcall(rb_str_freeze(result), i_uminus, 0); - # elif STR_UMINUS_DEDUPE - // MRI 2.5 and older do not deduplicate strings that are already - // frozen. - result = rb_funcall(result, i_uminus, 0); - # else - result = rb_str_freeze(result); - # endif - } -# endif - - if (symbolize) { - result = rb_str_intern(result); - } - - return result; -} - -%%{ - machine JSON_string; - include JSON_common; - - write data; - - action parse_string { - *result = json_string_unescape(json->memo + 1, p, json->parsing_name || json-> freeze, json->parsing_name && json->symbolize_names); - if (NIL_P(*result)) { - fhold; - fbreak; - } else { - fexec p + 1; - } - } - - action exit { fhold; fbreak; } - - main := '"' ((^([\"\\] | 0..0x1f) | '\\'[\"\\/bfnrt] | '\\u'[0-9a-fA-F]{4} | '\\'^([\"\\/bfnrtu]|0..0x1f))* %parse_string) '"' @exit; -}%% - -static int -match_i(VALUE regexp, VALUE klass, VALUE memo) -{ - if (regexp == Qundef) return ST_STOP; - if (RTEST(rb_funcall(klass, i_json_creatable_p, 0)) && - RTEST(rb_funcall(regexp, i_match, 1, rb_ary_entry(memo, 0)))) { - rb_ary_push(memo, klass); - return ST_STOP; - } - return ST_CONTINUE; -} - -static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *result) -{ - int cs = EVIL; - VALUE match_string; - - %% write init; - json->memo = p; - %% write exec; - - if (json->create_additions && RTEST(match_string = json->match_string)) { - VALUE klass; - VALUE memo = rb_ary_new2(2); - rb_ary_push(memo, *result); - rb_hash_foreach(match_string, match_i, memo); - klass = rb_ary_entry(memo, 1); - if (RTEST(klass)) { - *result = rb_funcall(klass, i_json_create, 1, *result); - } - } - - if (cs >= JSON_string_first_final) { - return p + 1; - } else { - return NULL; - } -} - -/* - * Document-class: JSON::Ext::Parser - * - * This is the JSON parser implemented as a C extension. It can be configured - * to be used by setting - * - * JSON.parser = JSON::Ext::Parser - * - * with the method parser= in JSON. - * - */ - -static VALUE convert_encoding(VALUE source) -{ -#ifdef HAVE_RUBY_ENCODING_H - rb_encoding *enc = rb_enc_get(source); - if (enc == rb_ascii8bit_encoding()) { - if (OBJ_FROZEN(source)) { - source = rb_str_dup(source); - } - FORCE_UTF8(source); - } else { - source = rb_str_conv_enc(source, rb_enc_get(source), rb_utf8_encoding()); - } -#endif - return source; -} - -/* - * call-seq: new(source, opts => {}) - * - * Creates a new JSON::Ext::Parser instance for the string _source_. - * - * Creates a new JSON::Ext::Parser instance for the string _source_. - * - * It will be configured by the _opts_ hash. _opts_ can have the following - * keys: - * - * _opts_ can have the following keys: - * * *max_nesting*: The maximum depth of nesting allowed in the parsed data - * structures. Disable depth checking with :max_nesting => false|nil|0, it - * defaults to 100. - * * *allow_nan*: If set to true, allow NaN, Infinity and -Infinity in - * defiance of RFC 4627 to be parsed by the Parser. This option defaults to - * false. - * * *symbolize_names*: If set to true, returns symbols for the names - * (keys) in a JSON object. Otherwise strings are returned, which is - * also the default. It's not possible to use this option in - * conjunction with the *create_additions* option. - * * *create_additions*: If set to false, the Parser doesn't create - * additions even if a matching class and create_id was found. This option - * defaults to false. - * * *object_class*: Defaults to Hash - * * *array_class*: Defaults to Array - */ -static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self) -{ - VALUE source, opts; - GET_PARSER_INIT; - - if (json->Vsource) { - rb_raise(rb_eTypeError, "already initialized instance"); - } -#ifdef HAVE_RB_SCAN_ARGS_OPTIONAL_HASH - rb_scan_args(argc, argv, "1:", &source, &opts); -#else - rb_scan_args(argc, argv, "11", &source, &opts); -#endif - if (!NIL_P(opts)) { -#ifndef HAVE_RB_SCAN_ARGS_OPTIONAL_HASH - opts = rb_convert_type(opts, T_HASH, "Hash", "to_hash"); - if (NIL_P(opts)) { - rb_raise(rb_eArgError, "opts needs to be like a hash"); - } else { -#endif - VALUE tmp = ID2SYM(i_max_nesting); - if (option_given_p(opts, tmp)) { - VALUE max_nesting = rb_hash_aref(opts, tmp); - if (RTEST(max_nesting)) { - Check_Type(max_nesting, T_FIXNUM); - json->max_nesting = FIX2INT(max_nesting); - } else { - json->max_nesting = 0; - } - } else { - json->max_nesting = 100; - } - tmp = ID2SYM(i_allow_nan); - if (option_given_p(opts, tmp)) { - json->allow_nan = RTEST(rb_hash_aref(opts, tmp)) ? 1 : 0; - } else { - json->allow_nan = 0; - } - tmp = ID2SYM(i_symbolize_names); - if (option_given_p(opts, tmp)) { - json->symbolize_names = RTEST(rb_hash_aref(opts, tmp)) ? 1 : 0; - } else { - json->symbolize_names = 0; - } - tmp = ID2SYM(i_freeze); - if (option_given_p(opts, tmp)) { - json->freeze = RTEST(rb_hash_aref(opts, tmp)) ? 1 : 0; - } else { - json->freeze = 0; - } - tmp = ID2SYM(i_create_additions); - if (option_given_p(opts, tmp)) { - json->create_additions = RTEST(rb_hash_aref(opts, tmp)); - } else { - json->create_additions = 0; - } - if (json->symbolize_names && json->create_additions) { - rb_raise(rb_eArgError, - "options :symbolize_names and :create_additions cannot be " - " used in conjunction"); - } - tmp = ID2SYM(i_create_id); - if (option_given_p(opts, tmp)) { - json->create_id = rb_hash_aref(opts, tmp); - } else { - json->create_id = rb_funcall(mJSON, i_create_id, 0); - } - tmp = ID2SYM(i_object_class); - if (option_given_p(opts, tmp)) { - json->object_class = rb_hash_aref(opts, tmp); - } else { - json->object_class = Qnil; - } - tmp = ID2SYM(i_array_class); - if (option_given_p(opts, tmp)) { - json->array_class = rb_hash_aref(opts, tmp); - } else { - json->array_class = Qnil; - } - tmp = ID2SYM(i_decimal_class); - if (option_given_p(opts, tmp)) { - json->decimal_class = rb_hash_aref(opts, tmp); - } else { - json->decimal_class = Qnil; - } - tmp = ID2SYM(i_match_string); - if (option_given_p(opts, tmp)) { - VALUE match_string = rb_hash_aref(opts, tmp); - json->match_string = RTEST(match_string) ? match_string : Qnil; - } else { - json->match_string = Qnil; - } -#ifndef HAVE_RB_SCAN_ARGS_OPTIONAL_HASH - } -#endif - } else { - json->max_nesting = 100; - json->allow_nan = 0; - json->create_additions = 0; - json->create_id = rb_funcall(mJSON, i_create_id, 0); - json->object_class = Qnil; - json->array_class = Qnil; - json->decimal_class = Qnil; - } - source = convert_encoding(StringValue(source)); - StringValue(source); - json->len = RSTRING_LEN(source); - json->source = RSTRING_PTR(source);; - json->Vsource = source; - return self; -} - -%%{ - machine JSON; - - write data; - - include JSON_common; - - action parse_value { - char *np = JSON_parse_value(json, fpc, pe, &result, 0); - if (np == NULL) { fhold; fbreak; } else fexec np; - } - - main := ignore* ( - begin_value >parse_value - ) ignore*; -}%% - -/* - * call-seq: parse() - * - * Parses the current JSON text _source_ and returns the complete data - * structure as a result. - * It raises JSON::ParseError if fail to parse. - */ -static VALUE cParser_parse(VALUE self) -{ - char *p, *pe; - int cs = EVIL; - VALUE result = Qnil; - GET_PARSER; - - %% write init; - p = json->source; - pe = p + json->len; - %% write exec; - - if (cs >= JSON_first_final && p == pe) { - return result; - } else { - rb_enc_raise(EXC_ENCODING eParserError, "unexpected token at '%s'", p); - return Qnil; - } -} - -static void JSON_mark(void *ptr) -{ - JSON_Parser *json = ptr; - rb_gc_mark_maybe(json->Vsource); - rb_gc_mark_maybe(json->create_id); - rb_gc_mark_maybe(json->object_class); - rb_gc_mark_maybe(json->array_class); - rb_gc_mark_maybe(json->decimal_class); - rb_gc_mark_maybe(json->match_string); -} - -static void JSON_free(void *ptr) -{ - JSON_Parser *json = ptr; - fbuffer_free(json->fbuffer); - ruby_xfree(json); -} - -static size_t JSON_memsize(const void *ptr) -{ - const JSON_Parser *json = ptr; - return sizeof(*json) + FBUFFER_CAPA(json->fbuffer); -} - -#ifdef NEW_TYPEDDATA_WRAPPER -static const rb_data_type_t JSON_Parser_type = { - "JSON/Parser", - {JSON_mark, JSON_free, JSON_memsize,}, -#ifdef RUBY_TYPED_FREE_IMMEDIATELY - 0, 0, - RUBY_TYPED_FREE_IMMEDIATELY, -#endif -}; -#endif - -static VALUE cJSON_parser_s_allocate(VALUE klass) -{ - JSON_Parser *json; - VALUE obj = TypedData_Make_Struct(klass, JSON_Parser, &JSON_Parser_type, json); - json->fbuffer = fbuffer_alloc(0); - return obj; -} - -/* - * call-seq: source() - * - * Returns a copy of the current _source_ string, that was used to construct - * this Parser. - */ -static VALUE cParser_source(VALUE self) -{ - GET_PARSER; - return rb_str_dup(json->Vsource); -} - -void Init_parser(void) -{ -#ifdef HAVE_RB_EXT_RACTOR_SAFE - rb_ext_ractor_safe(true); -#endif - -#undef rb_intern - rb_require("json/common"); - mJSON = rb_define_module("JSON"); - mExt = rb_define_module_under(mJSON, "Ext"); - cParser = rb_define_class_under(mExt, "Parser", rb_cObject); - eParserError = rb_path2class("JSON::ParserError"); - eNestingError = rb_path2class("JSON::NestingError"); - rb_gc_register_mark_object(eParserError); - rb_gc_register_mark_object(eNestingError); - rb_define_alloc_func(cParser, cJSON_parser_s_allocate); - rb_define_method(cParser, "initialize", cParser_initialize, -1); - rb_define_method(cParser, "parse", cParser_parse, 0); - rb_define_method(cParser, "source", cParser_source, 0); - - CNaN = rb_const_get(mJSON, rb_intern("NaN")); - rb_gc_register_mark_object(CNaN); - - CInfinity = rb_const_get(mJSON, rb_intern("Infinity")); - rb_gc_register_mark_object(CInfinity); - - CMinusInfinity = rb_const_get(mJSON, rb_intern("MinusInfinity")); - rb_gc_register_mark_object(CMinusInfinity); - - i_json_creatable_p = rb_intern("json_creatable?"); - i_json_create = rb_intern("json_create"); - i_create_id = rb_intern("create_id"); - i_create_additions = rb_intern("create_additions"); - i_chr = rb_intern("chr"); - i_max_nesting = rb_intern("max_nesting"); - i_allow_nan = rb_intern("allow_nan"); - i_symbolize_names = rb_intern("symbolize_names"); - i_object_class = rb_intern("object_class"); - i_array_class = rb_intern("array_class"); - i_decimal_class = rb_intern("decimal_class"); - i_match = rb_intern("match"); - i_match_string = rb_intern("match_string"); - i_key_p = rb_intern("key?"); - i_deep_const_get = rb_intern("deep_const_get"); - i_aset = rb_intern("[]="); - i_aref = rb_intern("[]"); - i_leftshift = rb_intern("<<"); - i_new = rb_intern("new"); - i_try_convert = rb_intern("try_convert"); - i_freeze = rb_intern("freeze"); - i_uminus = rb_intern("-@"); -} - -/* - * Local variables: - * mode: c - * c-file-style: ruby - * indent-tabs-mode: nil - * End: - */ diff --git a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/extconf.rb b/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/extconf.rb deleted file mode 100644 index 8a99b6a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json/extconf.rb +++ /dev/null @@ -1,3 +0,0 @@ -require 'mkmf' - -create_makefile('json') diff --git a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/json.gemspec b/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/json.gemspec deleted file mode 100644 index 948e92c..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/json.gemspec +++ /dev/null @@ -1,67 +0,0 @@ -# -*- encoding: utf-8 -*- - -Gem::Specification.new do |s| - s.name = "json" - s.version = File.read(File.expand_path('../VERSION', __FILE__)).chomp - - s.summary = "JSON Implementation for Ruby" - s.description = "This is a JSON implementation as a Ruby extension in C." - s.licenses = ["Ruby"] - s.authors = ["Florian Frank"] - s.email = "flori@ping.de" - - s.extensions = ["ext/json/ext/generator/extconf.rb", "ext/json/ext/parser/extconf.rb", "ext/json/extconf.rb"] - s.extra_rdoc_files = ["README.md"] - s.rdoc_options = ["--title", "JSON implementation for Ruby", "--main", "README.md"] - s.files = [ - "CHANGES.md", - "LICENSE", - "README.md", - "VERSION", - "ext/json/ext/fbuffer/fbuffer.h", - "ext/json/ext/generator/depend", - "ext/json/ext/generator/extconf.rb", - "ext/json/ext/generator/generator.c", - "ext/json/ext/generator/generator.h", - "ext/json/ext/parser/depend", - "ext/json/ext/parser/extconf.rb", - "ext/json/ext/parser/parser.c", - "ext/json/ext/parser/parser.h", - "ext/json/ext/parser/parser.rl", - "ext/json/extconf.rb", - "json.gemspec", - "lib/json.rb", - "lib/json/add/bigdecimal.rb", - "lib/json/add/complex.rb", - "lib/json/add/core.rb", - "lib/json/add/date.rb", - "lib/json/add/date_time.rb", - "lib/json/add/exception.rb", - "lib/json/add/ostruct.rb", - "lib/json/add/range.rb", - "lib/json/add/rational.rb", - "lib/json/add/regexp.rb", - "lib/json/add/set.rb", - "lib/json/add/struct.rb", - "lib/json/add/symbol.rb", - "lib/json/add/time.rb", - "lib/json/common.rb", - "lib/json/ext.rb", - "lib/json/generic_object.rb", - "lib/json/pure.rb", - "lib/json/pure/generator.rb", - "lib/json/pure/parser.rb", - "lib/json/version.rb", - ] - s.homepage = "http://flori.github.com/json" - s.metadata = { - 'bug_tracker_uri' => 'https://github.com/flori/json/issues', - 'changelog_uri' => 'https://github.com/flori/json/blob/master/CHANGES.md', - 'documentation_uri' => 'http://flori.github.io/json/doc/index.html', - 'homepage_uri' => 'http://flori.github.io/json/', - 'source_code_uri' => 'https://github.com/flori/json', - 'wiki_uri' => 'https://github.com/flori/json/wiki' - } - - s.required_ruby_version = Gem::Requirement.new(">= 2.3") -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/.autotest b/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/.autotest deleted file mode 100644 index b6fbce5..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/.autotest +++ /dev/null @@ -1,34 +0,0 @@ -# -*- ruby -*- - -require 'autotest/restart' -require 'autotest/rcov' if ENV['RCOV'] - -Autotest.add_hook :initialize do |at| - at.testlib = 'minitest/autorun' - - bench_tests = %w(TestMinitestBenchmark) - mock_tests = %w(TestMinitestMock TestMinitestStub) - spec_tests = %w(TestMinitestReporter TestMetaStatic TestMeta - TestSpecInTestCase) - unit_tests = %w(TestMinitestGuard TestMinitestRunnable - TestMinitestRunner TestMinitestTest TestMinitestUnit - TestMinitestUnitInherited TestMinitestUnitOrder - TestMinitestUnitRecording TestMinitestUnitTestCase) - - { - bench_tests => "test/minitest/test_minitest_benchmark.rb", - mock_tests => "test/minitest/test_minitest_mock.rb", - spec_tests => "test/minitest/test_minitest_reporter.rb", - unit_tests => "test/minitest/test_minitest_unit.rb", - }.each do |klasses, file| - klasses.each do |klass| - at.extra_class_map[klass] = file - end - end - - at.add_exception 'coverage.info' - at.add_exception 'coverage' -end - -# require 'autotest/rcov' -# Autotest::RCov.command = 'rcov_info' diff --git a/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/History.rdoc b/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/History.rdoc deleted file mode 100644 index 7630158..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/History.rdoc +++ /dev/null @@ -1,1504 +0,0 @@ -=== 5.18.0 / 2023-03-04 - -* 2 major enhancements: - - * Added assert_pattern & refute_pattern for pattern matching. (flavorjones) - * Added matching must_pattern_match & wont_pattern_match to minitest/spec. - -* 1 bug fix: - - * Support the new message format of NameError in Ruby 3.3 (mame) - -=== 5.17.0 / 2022-12-31 - -* 1 minor enhancement: - - * Refactor setup hooks into a SETUP_METHODS constant. (MSP-Greg) - -* 3 bug fixes: - - * Fix kwargs for Mock calls to delegator. (blowmage) - * Fix kwargs for expectations. (bobmazanec, blowmage) - * Remove check for .b method. (tenderlove) - -=== 5.16.3 / 2022-08-17 - -* 2 bug fixes: - - * Fixed exception sanitization by removing TypeError restriction on rescue. - * Use A instead of deprecated TESTOPTS in rake test:slow. (davidstosik) - -=== 5.16.2 / 2022-07-03 - -* 4 bug fixes: - - * Added MT_KWARGS_HACK kludge for stub to deal with ruby 2.7 kwargs nastiness. (tsugimoto) - * In #expect, pop Hash class from args if $MT_KWARGS_HACK. (casperisfine) - * In above scenario, set expected kwargs (as Objects) based on actual kwargs. - * Nuke ivars if exception fails to marshal twice (eg better_errors). (irphilli) - -=== 5.16.1 / 2022-06-20 - -* 2 bug fixes: - - * Apparently adding real kwarg support to mocks/stubs broke some code. Fixed. - * Use `MT_KWARGS_HACK=1` to activate the kludgy kwargs support w/ caveats. - * Clarified some doco wrt the block on #stub. - -=== 5.16.0 / 2022-06-14 - -* 2 major enhancements: - - * Added Minitest::TestTask. - * Dropping ruby 2.2 - 2.5. 2.6 is DTM soon too. - -* 11 minor enhancements: - - * Added --show-skips option to show skips at end of run but not require --verbose. (MSP-Greg) - * Added Minitest.seed, the random seed used by the run. - * Calling `srand Minitest.seed` before all shuffles to ensure determinism. - * Extended #stub to handle kwargs for both block and call args. (SampsonCrowley) - * Extended Mock#__call to display kwargs. - * Extended Mock#expect to record kwargs. - * Extended Mock#method_missing to take kwargs & compare them against expected. - * Mock#method_missing displays better errors on arity mismatch. - * Removed minor optimization removing empty suites before run. - * Simplified test randomization (test order will change even with fixed seed). - * assert_match now returns the MatchData on success. (Nakilon) - -* 3 bug fixes: - - * (Re)Fixed marshalling of exceptions, neutering them in 2 passes. - * Fixed more problems with rdoc. - * Had to patch up mock and stub to deal with <=2.7 kwargs oddities - -=== 5.15.0 / 2021-12-14 - -* 1 major enhancement: - - * assert_throws returns the value returned, if any. (volmer) - -* 3 minor enhancements: - - * Added -S option to skip reporting of certain types of output - * Enable Ruby deprecation warnings by default. (casperisfine) - * Use Etc.nprocessors by default in order to maximize cpu usage. (tonytonyjan) - -* 6 bug fixes: - - * Close then unlink tempfiles on Windows. (nobu) - * Fixed #skip_until for windows paths. (MSP-Greg) - * Fixed a bunch of tests for jruby and windows. (MSP-Greg) - * Fixed marshalling of specs if they error. (tenderlove, jeremyevans, et al) - * Updated deprecation message for block expectations. (blowmage) - * Use Kernel.warn directly in expectations in case CUT defines their own warn. (firien) - -=== 5.14.4 / 2021-02-23 - -* 1 bug fix: - - * Fixed deprecation warning using stub with methods using keyword arguments. (Nakilon) - -=== 5.14.3 / 2021-01-05 - -* 1 bug fix: - - * Bumped require_ruby_version to < 4 (trunk = 3.1). - -=== 5.14.2 / 2020-08-31 - -* 1 bug fix: - - * Bumped ruby version to include 3.0 (trunk). - -=== 5.14.1 / 2020-05-15 - -* 3 minor enhancements: - - * Minitest.filter_backtrace returns original backtrace if filter comes back empty. - * Minitest::BacktraceFilter now returns entire backtrace if $MT_DEBUG set in env. - * Return true on a successful refute. (jusleg) - -* 1 bug fix: - - * Fixed expectation doco to not use global expectations. - -=== 5.14.0 / 2020-01-11 - -* 2 minor enhancements: - - * Block-assertions (eg assert_output) now error if raised inside the block. (casperisfine) - * Changed assert_raises to only catch Assertion since that covers Skip and friends. - -* 3 bug fixes: - - * Added example for value wrapper with block to Expectations module. (stomar) - * Fixed use of must/wont_be_within_delta on Expectation instance. (stomar) - * Renamed UnexpectedError#exception to #error to avoid problems with reraising. (casperisfine) - -=== 5.13.0 / 2019-10-29 - -* 9 minor enhancements: - - * Added Minitest::Guard#osx? - * Added examples to documentation for assert_raises. (lxxxvi) - * Added expectations #path_must_exist and #path_wont_exist. Not thrilled with the names. - * Added fail_after(year, month, day, msg) to allow time-bombing after a deadline. - * Added skip_until(year, month, day, msg) to allow deferring until a deadline. - * Deprecated Minitest::Guard#maglev? - * Deprecated Minitest::Guard#rubinius? - * Finally added assert_path_exists and refute_path_exists. (deivid-rodriguez) - * Refactored and pulled Assertions#things_to_diff out of #diff. (BurdetteLamar) - -* 3 bug fixes: - - * Fix autorun bug that affects fork exit status in tests. (dylanahsmith/jhawthorn) - * Improved documentation for _/value/expect, especially for blocks. (svoop) - * Support new Proc#to_s format. (ko1) - -=== 5.12.2 / 2019-09-28 - -* 1 bug fix: - - * After chatting w/ @y-yagi and others, decided to lower support to include ruby 2.2. - -=== 5.12.1 / 2019-09-28 - -* 1 minor enhancement: - - * Added documentation for Reporter classes. (sshaw) - -* 3 bug fixes: - - * Avoid using 'match?' to support older ruby versions. (y-yagi) - * Fixed broken link to reference on goodness-of-fit testing. (havenwood) - * Update requirements in readme and Rakefile/hoe spec. - -=== 5.12.0 / 2019-09-22 - -* 8 minor enhancements: - - * Added a descriptive error if assert_output or assert_raises called without a block. (okuramasafumi) - * Changed mu_pp_for_diff to make having both \n and \\n easier to debug. - * Deprecated $N for specifying number of parallel test runners. Use MT_CPU. - * Deprecated use of global expectations. To be removed from MT6. - * Extended Assertions#mu_pp to encoding validity output for strings to improve diffs. - * Extended Assertions#mu_pp to output encoding and validity if invalid to improve diffs. - * Extended Assertions#mu_pp_for_diff to make escaped newlines more obvious in diffs. - * Fail gracefully when expectation used outside of `it`. - -* 3 bug fixes: - - * Check `option[:filter]` klass before match. Fixes 2.6 warning. (y-yagi) - * Fixed Assertions#diff from recalculating if set to nil - * Fixed spec section of readme to not use deprecated global expectations. (CheezItMan) - -=== 5.11.3 / 2018-01-26 - -* 1 bug fix: - - * Pushed #error? up to Reportable module. (composerinteralia) - -=== 5.11.2 / 2018-01-25 - -* 1 minor enhancement: - - * Reversed Test < Result. Back to < Runnable and using Reportable for shared code. - -* 2 bug fixes: - - * Fixed Result#location for instances of Test. (alexisbernard) - * Fixed deprecation message for Runnable#marshal_dump. (y-yagi) - -=== 5.11.1 / 2018-01-02 - -* 1 bug fix: - - * Fixed Result (a superclass of Test) overriding Runnable's name accessors. (y-yagi, MSP-Greg) - -=== 5.11.0 / 2018-01-01 - -* 2 major enhancements: - - * Added Minitest::Result and Minitest::Result.from(runnable). - * Changed Minitest::Test to subclass Result and refactored methods up. - -* 7 minor enhancements: - - * Added --no-plugins and MT_NO_PLUGINS to bypass MT plugin autoloading. Helps with bad actors installed globally. - * Added bench_performance_{logarithmic,power} for spec-style benchmarks. (rickhull) - * Added deprecation warning for Runnable#marshal_dump. - * Minitest.run_one_method now checks for instance of Result, not exact same class. - * Minitest::Test.run returns a Result version of self, not self. - * ProgressReporter#prerecord now explicitly prints klass.name. Allows for fakers. - -* 4 bug fixes: - - * Object.stub no longer calls the passed block if stubbed with a callable. - * Object.stub now passes blocks down to the callable result. - * Pushed Minitest::Test#time & #time_it up to Runnable. - * Test nil equality directly in assert_equal. Fixes #679. (voxik) - -=== 5.11.0b1 / 2017-12-20 - -* 2 major enhancements: - - * Added Minitest::Result and Minitest::Result.from(runnable). - * Changed Minitest::Test to subclass Result and refactored methods up. - -* 6 minor enhancements: - - * Added --no-plugins and MT_NO_PLUGINS to bypass MT plugin autoloading. Helps with bad actors installed globally. - * Added bench_performance_{logarithmic,power} for spec-style benchmarks. (rickhull) - * Minitest.run_one_method now checks for instance of Result, not exact same class. - * Minitest::Test.run returns a Result version of self, not self. - * ProgressReporter#prerecord now explicitly prints klass.name. Allows for fakers. - * Removed Runnable.marshal_dump/load. - -* 4 bug fixes: - - * Object.stub no longer calls the passed block if stubbed with a callable. - * Object.stub now passes blocks down to the callable result. - * Pushed Minitest::Test#time & #time_it up to Runnable. - * Test nil equality directly in assert_equal. Fixes #679. (voxik) - -=== 5.10.3 / 2017-07-21 - -* 1 minor enhancement: - - * Extended documentation for Mock#expect for multiple calls to mock object. (insti) - -* 2 bug fixes: - - * Finished off missing doco. - * Fixed verbose output on parallelize_me! classes. (chanks) - -=== 5.10.2 / 2017-05-09 - -* 1 minor enhancement: - - * Added suggestion in minitest/hell to install minitest/proveit. - -* 7 bug fixes: - - * Expand MT6 to Minitest 6. (xaviershay) - * Fixed location of assert_send deprecation. (rab) - * Fixed location of nil assert_equal deprecation to work with expectations. (jeremyevans) - * Fixed minitest/hell to use parallelize_me! (azul) - * Made deprecation use warn so -W0 will silence it. - * Workaround for rdoc nodoc generation bug that totally f'd up minitest doco. (Paxa) - * Write aggregated_results directly to the IO object to avoid mixed encoding errors. (tenderlove) - -=== 5.10.1 / 2016-12-01 - -* 1 bug fix: - - * Added a hack/kludge to deal with missing #prerecord on reporters that aren't properly subclassing AbstractReporter (I'm looking at you minitest-reporters) - -=== 5.10.0 / 2016-11-30 - -* 1 major enhancement: - - * Deprecated ruby 1.8, 1.9, possibly 2.0, assert_send, & old MiniTest namespace. - -* 3 minor enhancements: - - * Warn if assert_equal expects a nil. This will fail in minitest 6+. (tenderlove) - * Added AbstractReporter#prerecord and extended ProgressReporter and CompositeReporter to use it. - * Minor optimization: remove runnables with no runnable methods before run. - -* 3 bug fixes: - - * Fix assert_throw rescuing any NameError and ArgumentError. (waldyr) - * Clean up (most of the) last remaining vestiges of minitest/unit. - * 2.4: removed deprecation warnings when referring to Fixnum. - -=== 5.9.1 / 2016-09-25 - -* 2 bug fixes: - - * Re-release to refresh gem certificate signing. ugh. - * Fixed hoe/minitest to not augment load path if we're actually testing minitest. - -=== 5.9.0 / 2016-05-16 - -* 8 minor enhancements: - - * Added Minitest.info_signal accessors to customize signal for test run info. (nate) - * Added assert_mock to make it more clear that you're testing w/ them. - * Added negative filter by test name. (utilum) - * Added warning to README that 1.8 and 1.9 support will be dropped in minitest 6. - * Automatically activate minitest/hell if $MT_HELL is defined. - * Improved default error messages for assert and refute. (bhenderson) - * minitest/hell now tries to require minitest/proveit - * mu_pp for strings prints out non-standard encodings to improve assert_equal diffs. - -* 1 bug fix: - - * Removed Interrupt from PASSTHROUGH_EXCEPTIONS (already handled). (waldyr) - -=== 5.8.5 / 2016-09-25 - -* 2 bug fixes: - - * Re-release to refresh gem certificate signing. ugh. - * Fixed hoe/minitest to not augment load path if we're actually testing minitest. - -=== 5.8.4 / 2016-01-21 - -* 1 bug fix: - - * Allow Minitest::Assertion to pass through assert_raises so inner failures are dealt with first. - -=== 5.8.3 / 2015-11-17 - -* 1 minor enhancement: - - * Added extra note about mocks and threads to readme. (zamith) - -* 1 bug fix: - - * Fixed bug in Mock#verify. (pithub/zamith) - -=== 5.8.2 / 2015-10-26 - -* 1 bug fix: - - * Fixed using parallelize_me! and capture_io (or any locking io). (arlt/tenderlove) - -=== 5.8.1 / 2015-09-23 - -* 1 minor enhancement: - - * Refactor assert_raises to be cleaner and to pass SystemExit and SignalException. (bhenderson) - -=== 5.8.0 / 2015-08-06 - -* 2 minor enhancements: - - * Add optional delegation mechanism to extend object with a mock. (zamith) - * Return early if there are no filtered methods. (jeremyevans) - -* 1 bug fix: - - * Don't extend io with pride if io is not a tty. (toy) - -=== 5.7.0 / 2015-05-27 - -* 1 major enhancement: - - * assert_raises now matches subclasses of the expected exception types. (jeremyevans) - -* 3 minor enhancements: - - * Added :block type for minitest/spec's #infect_an_assertion. (jeremyevans) - * Inline verification error messages in minitest/mock for GC performance. (zamith) - * assert_raises defaults to RuntimeError if not specified. (jeremyevans) - -* 4 bug fixes: - - * Added 'class' to minitest/mock's overridden_methods list. (zamith) - * Added file/line to infect_an_assertion's class_eval call. (jeremyevans) - * Cleared UnexpectedError's mesg w/ generic string. - * Fixed non-proc-oriented expectations when used on proc target. (jeremyevans) - -=== 5.6.1 / 2015-04-27 - -* 2 bug fixes: - - * Added Minitest.clock_time and switched all Time.now to it. (tenderlove) - * Moved Minitest::Expectations#_ into Minitest::Spec::DSL. - -=== 5.6.0 / 2015-04-13 - -* 4 major enhancements: - - * Added Minitest::Expectation value monad. - * Added Minitest::Expectations#_ that returns an Expectation. Aliased to value. - * All expectations are added to Minitest::Expectation. - * At some point, the methods on Object will be deprecated and then removed. - -* 4 minor enhancements: - - * Added a note about bundle exec pitfall in ruby 2.2+. (searls) - * Lazily start the parallel executor. (tenderlove) - * Make mocks more debugger-friendly (edward) - * Print out the current test run on interrupt. (riffraff) - -* 3 bug fixes: - - * Fix failing test under Windows. (kimhmadsen) - * Record mocked calls before they happen so mocks can raise exceptions easier (tho I'm not a fan). (corecode) - * Tried to clarify mocks vs stubs terminology better. (kkirsche) - -=== 5.5.1 / 2015-01-09 - -* 1 bug fix: - - * Fixed doco problems. (zzak) - -=== 5.5.0 / 2014-12-12 // mri 2.2.0 (as a real gem) - -* 1 minor enhancement: - - * Allow seed to be given via ENV for rake test loader sadness: eg rake SEED=42. - -=== 5.4.3 / 2014-11-11 - -* 2 bug fixes: - - * Clarified requirements for ruby are now 1.8.7 or better. - * Force encode error output in case mal-encoded exception is raised. (jasonrclark) - -=== 5.4.2 / 2014-09-26 - -* 2 minor enhancements: - - * Extract teardown method list. - * Thanks to minitest-gcstats got a 5-10% speedup via reduced GC! - -=== 5.4.1 / 2014-08-28 - -* 1 bug fix: - - * Fixed specs hidden by nesting/ordering bug (blowmage/apotonick) - -=== 5.4.0 / 2014-07-07 - -* 2 minor enhancements: - - * Kernel#describe extended to splat additional_desc. - * Spec#spec_type extended to take a splat of additional items, passed to matcher procs. - -* 1 bug fix: - - * minitest/spec should require minitest/test, not minitest/unit. (doudou) - -=== 5.3.5 / 2014-06-17 - -* 1 minor enhancement: - - * Spit and polish (mostly spit). - -=== 5.3.4 / 2014-05-15 - -* 1 minor enhancement: - - * Test classes are randomized before running. (judofyr) - -=== 5.3.3 / 2014-04-14 - -* 1 bug fix: - - * Fixed using expectations w/ DSL in Test class w/o describe. (blowmage+others) - -=== 5.3.2 / 2014-04-02 - -* 1 bug fix: - - * Fixed doco on Assertions.assertions. (xaviershay) - -=== 5.3.1 / 2014-03-14 - -* 1 minor enhancement: - - * Modified verbage on bad 'let' names to be more helpful. (Archytaus) - -* 1 bug fix: - - * Fixed 2 cases still using MiniTest. (mikesea) - -=== 5.3.0 / 2014-02-25 - -* 1 minor enhancement: - - * Mocked methods can take a block to verify state. Seattle.rb 12 bday present from ernie! Thanks!! - -=== 5.2.3 / 2014-02-10 - -* 1 bug fix: - - * Fixed Spec#let check to allow overriding of other lets. (mvz) - -=== 5.2.2 / 2014-01-22 - -* 1 minor enhancement: - - * Spec#let raises ArgumentError if you override _any_ instance method (except subject). (rynr) - -* 1 bug fix: - - * Fixed up benchmark spec doco and added a test to demonstrate. (bhenderson) - -=== 5.2.1 / 2014-01-07 - -* 1 bug fix: - - * Properly deal with horrible mix of runtime load errors + other at_exit handlers. (dougo/chqr) - -=== 5.2.0 / 2013-12-13 - -* 1 minor enhancement: - - * Change expectations to allow calling most on procs (but not calling the proc). (bhenderson+others) - -=== 5.1.0 / 2013-12-05 - -* 1 minor enhancement: - - * Use a Queue for scheduling parallel tests. (tenderlove) - -* 1 bug fix: - - * Fixed misspelling in doco. (amatsuda) - -=== 5.0.8 / 2013-09-20 - -* 1 bug fix: - - * Fixed siginfo handler by rearranging reporters and fixing to_s. (tenderlove) - -=== 5.0.7 / 2013-09-05 - -* 2 minor enhancements: - - * Added clarification about the use of thread local variables in expectations. (jemc) - * Added extra message about skipped tests, if any. Disable globally with $MT_NO_SKIP_MSG. - -* 2 bug fixes: - - * Only require minitest, not minitest/autorun in pride_plugin. (judofyr) - * Require rubygems in load_plugins in case you're not using minitest/autorun. - -=== 5.0.6 / 2013-06-28 - -* 3 minor enhancements: - - * Allow stub to pass args to blocks. (swindsor) - * Improved warning message about minitest/autorun to address 1.9's minitest/autorun. - * Made minitest/test require minitest as needed. For lib writers. (erikh) - -* 1 bug fix: - - * Fixed missing require in minitest/test. (erikh) - -=== 4.7.5 / 2013-06-21 // mri 2.1.1 - -* 2 bug fixes: - - * Fix Spec#describe_stack to be thread local. - * Fix multithreaded test failures by defining Time local to mock test namespace - -=== 5.0.5 / 2013-06-20 - -* 6 bug fixes: - - * DOH! Fixed the rest of the new casing on Minitest. (splattael) - * Fixed typo on minitest/mock rdoc. (mrgilman/guiceolin) - * Make Spec::DSL.describe_stack thread local to avoid failing on my own tests. - * Make a fake Time.now local to the tests so they won't interfere with real reporter timings. - * Make everything mockable by wrapping all 'special' methods in a smarter wrapper. (bestie) - * Raise ArgumentError if let name starts with 'test'. (johnmaxwell) - -=== 5.0.4 / 2013-06-07 - -* 5 minor enhancements: - - * Added AbstractReporter, defining required Reporter API to quack properly. - * Added doco for writing reporters. - * Refactored Reporter into ProgressReporter and SummaryReporter. (idea: phiggins, code:me+scotch) - * Refactored SummaryReporter pushing up to StatisticsReporter. (phiggins) - * Removed Reporter#run_and_report... cleaner, but doesn't "fit" in the API. - -=== 5.0.3 / 2013-05-29 - -* 4 minor enhancements: - - * Added Runnable.with_info_handler and Runnable.on_signal. - * Moved io.sync restore to Reporter#run_and_report. - * Refactored inner loop of Reporter#report to #to_s. Callable for status updates. - * Restored MT4's mid-run report (^t). (tenderlove). - -=== 5.0.2 / 2013-05-20 - -* 3 bug fixes: - - * Gem.find_files is smarter than I remember... cause I wrote it that way. *sigh* I'm getting old. - * Pride wasn't doing puts through its #io. (tmiller/tenderlove) - * Replaced Runnable#dup and Test#dup with marshal_dump/load. Too many problems cropping up on untested rails code. (tenderlove/rubys) - -=== 5.0.1 / 2013-05-14 - -* 2 bug fixes: - - * Documented Assertions' need for @assertions to be defined by the includer. - * Only load one plugin version per name. Tries for latest. - -=== 5.0.0 / 2013-05-10 - -Oh god... here we go... - -Minitest 5: - -* 4 deaths in the family: - - * MiniTest.runner is dead. No more manager objects. - * MiniTest::Unit#record is dead. Use a Reporter instance instead. - * MiniTest::Unit._run_* is dead. Runnable things are responsible for their own runs. - * MiniTest::Unit.output is dead. No more centralized IO. - -* 12 major (oft incompatible) changes: - - * Renamed MiniTest to Minitest. Your pinkies will thank me. (aliased to MiniTest) - * Removed MiniTest::Unit entirely. No more manager objects. - * Added Minitest::Runnable. Everything minitest can run subclasses this. - * Renamed MiniTest::Unit::TestCase to Minitest::Test (subclassing Runnable). - * Added Minitest::Benchmark. - * Your benchmarks need to move to their own subclass. - * Benchmarks using the spec DSL have to have "Bench" somewhere in their describe. - * MiniTest::Unit.after_tests moved to Minitest.after_run - * MiniTest::Unit.autorun is now Minitest.autorun. Just require minitest/autorun pls. - * Removed ParallelEach#grep since it isn't used anywhere. - * Renamed Runnable#__name__ to Runnable#name (but uses @NAME internally). - * Runnable#run needs to return self. Allows for swapping of results as needed. - -* 8 minor moves: - - * Moved Assertions module to minitest/assertions.rb - * Moved Expectations module to minitest/expectations.rb - * Moved Test to minitest/test.rb - * Moved everything else in minitest/unit.rb to minitest.rb - * minitest/unit.rb is now just a small (user-test only) compatibility layer. - * Moved most of minitest/pride into minitest/pride_plugin. - * minitest/pride now just activates pride. - * Moved ParallelEach under Minitest. - -* 9 additions: - - * Added a plugin system that can extend command-line options. - * Added Minitest.extensions. - * Added Minitest.reporter (only available during startup). - * Added Minitest.run(args). This is the very top of any Minitest run. - * Added Minitest::Reporter. Everything minitest can report goes through here. - * Minitest.reporter is a composite so you can add your own. - * Added Minitest::CompositeReporter. Much easier to extend with your own reporters. - * Added UnexpectedError, an Assertion subclass, to wrap up errors. - * Minitest::Test#run is now freakin' beautiful. 47 -> 17 loc - -* 11 other: - - * Removed Object.infect_with_assertions (it was already dead code). - * Runnables are responsible for knowing their result_code (eg "." or "F"). - * Minitest.autorun now returns boolean, not exit code. - * Added FAQ entry for extending via modules. (phiggins) - * Implement Runnable#dup to cleanse state back to test results. Helps with serialization. pair:tenderlove - * Moved ParallelEach under Minitest. - * Runnable#run needs to return self. Allows for swapping of results as needed. - * Minitest.init_plugins passes down options. - * Minitest.load_plugins only loads once. - * Fixed minitest/pride to work with rake test loader again. (tmiller) - * Added count/size to ParallelEach to fix use w/in stdlib's test/unit. :( (btaitelb) - -* 5 voodoo: - - * Removed mutex from minitest.rb (phiggins) - * Removed mutex from test.rb (phiggins) - * Removed Minitest::Reporter.synchronize (phiggins) - * Removed Minitest::Test.synchronize (phiggins) - * Upon loading minitest/parallel_each, record, capture_io and capture_subprocess_io are doped with synchronization code. (phiggins) - -=== 4.7.4 / 2013-05-01 - -This is probably the last release of the 4.x series. It will be merged -to ruby and will be put into maintenance mode there. - -I'm not set in stone on this, but at this point further development of -minitest (5+) will be gem-only. It is just too hard to work w/in -ruby-core w/ test-unit compatibility holding minitest development -back. - -* 2 minor enhancements: - - * Added count/size to ParallelEach to fix use w/in stdlib's test/unit. :( (btaitelb) - * Allow disabling of info_signal handler in runner. (erikh) - -=== 4.7.3 / 2013-04-20 - -* 1 bug fix: - - * Reverted stubbing of module methods change. Stub the user, not the impl. (ab9/tyabe) - -=== 4.7.2 / 2013-04-18 - -* 2 bug fixes: - - * Fixed inconsistency in refute_in_delta/epsilon. I double negatived my logic. (nettsundere) - * Fixed stubbing of module methods (eg Kernel#sleep). (steveklabnik) - -=== 4.7.1 / 2013-04-09 - -* 1 minor enhancement: - - * Added FAQ section to README - -* 1 bug fix: - - * Fixed bug where guard runs tests bypassing minitest/autorun and an ivar isn't set right. (darrencauthon) - -=== 4.7.0 / 2013-03-18 - -* 1 major enhancement: - - * Refactored MiniTest::Spec into MiniTest::Spec::DSL. - -* 1 bug fix: - - * Removed $DEBUG handler that detected when test/unit and minitest were both loaded. (tenderlove) - -=== 4.6.2 / 2013-02-27 - -* 1 minor enhancement: - - * Change error output to match Class#method, making it easier to use -n filter. - -=== 4.6.1 / 2013-02-14 - -* 1 bug fix: - - * Fixed an option processing bug caused by test/unit's irresponsibly convoluted code. (floehopper) - -=== 4.6.0 / 2013-02-07 - -* 3 major enhancements: - - * Removed ::reset_setup_teardown_hooks - * Removed the long deprecated assert_block - * Removed the long deprecated lifecycle hooks: add_(setup|teardown)_hook - -* 1 minor enhancement: - - * Allow filtering tests by suite name as well as test name. (lazyatom) - -* 2 bug fixes: - - * Made hex handling (eg object_ids) in mu_pp_for_diff more specific. (maxim) - * nodoc top-level module. (zzak) - -=== 4.5.0 / 2013-01-22 - -* 1 major enhancement: - - * Rearranged minitest/unit.rb so NO parallelization code is loaded/used until you opt-in. - -* 4 minor enhancements: - - * Added TestCase#skipped? for teardown guards - * Added maglev? guard - * Document that record can be sent twice if teardown fails or errors (randycoulman) - * Errors in teardown are now recorded. (randycoulman) - -* 3 bug fixes: - - * Added hacks and skips to get clean test runs on maglev - * Modified float tests for maglev float output differences. Not sure this is right. Not sure I care. - * Test for existance of diff.exe instead of assuming they have devkit. (blowmage/Cumbayah) - -=== 4.4.0 / 2013-01-07 - -* 3 minor enhancements: - - * Added fit_logarithic and assert_performance_logarithmic. (ktheory) - * Merge processed options so others can mess with defaults. (tenderlove) - * TestCase#message can now take another proc to defer custom message cost. (ordinaryzelig/bhenderson) - -* 1 bug fix: - - * TestCase#passed? now true if test is skipped. (qanhd) - -=== 4.3.3 / 2012-12-06 - -* 1 bug fix: - - * Updated information about stubbing. (daviddavis) - -=== 4.3.2 / 2012-11-27 // mri 2.0.0 - -* 1 minor enhancement: - - * Improved assert_equals error message to point you at #== of member objects. (kcurtin) - -=== 4.3.1 / 2012-11-23 - -* 1 bug fix: - - * Moved test_children to serial testcase to prevent random failures. - -=== 4.3.0 / 2012-11-17 - -* 4 minor enhancements: - - * Allow #autorun to run even if loaded with other test libs that call exit. (sunaku) - * Do not include Expectations in Object if $MT_NO_EXPECTATIONS is set (experimental?) - * Gave some much needed love to assert_raises. - * Mock#expect can take a block to custom-validate args. (gmoothart) - -=== 4.2.0 / 2012-11-02 - -* 4 major enhancements: - - * Added minitest/hell - run all your tests through the ringer! - * Added support for :parallel test_order to run test cases in parallel. - * Removed last_error and refactored runner code to be threadsafe. - * _run_suites now runs suites in parallel if they opt-in. - -* 4 minor enhancements: - - * Added TestCase#synchronize - * Added TestCase.make_my_diffs_pretty! - * Added TestCase.parallelize_me! - * Lock on capture_io for thread safety (tenderlove) - -=== 4.1.0 / 2012-10-05 - -* 2 minor enhancements: - - * Added skip example to readme. (dissolved) - * Extracted backtrace filter to object. (tenderlove) - -* 1 bug fix: - - * OMG I'm so dumb. Fixed access to deprecated hook class methods. I hate ruby modules. (route) - -=== 4.0.0 / 2012-09-28 - -* 1 major enhancement: - - * The names of a privately-used undocumented constants are Super Important™. - -* 1 minor enhancement: - - * Support stubbing methods that would be handled via method_missing. (jhsu) - -* 3 bug fixes: - - * Add include_private param to MiniTest::Mock#respond_to? (rf-) - * Fixed use of minitest/pride with --help. (zw963) - * Made 'No visible difference.' message more clear. (ckrailo) - -=== 3.5.0 / 2012-09-21 - -* 1 minor enhancement: - - * Added #capture_subprocess_io. (route) - -=== 3.4.0 / 2012-09-05 - -* 2 minor enhancements: - - * assert_output can now take regexps for expected values. (suggested by stomar) - * Clarified that ruby 1.9/2.0's phony gems cause serious confusion for rubygems. - -=== 3.3.0 / 2012-07-26 - -* 1 major enhancement: - - * Deprecated add_(setup|teardown)_hook in favor of (before|after)_(setup|teardown) [2013-01-01] - -* 4 minor enhancements: - - * Refactored deprecated hook system into a module. - * Refactored lifecycle hooks into a module. - * Removed after_setup/before_teardown + run_X_hooks from Spec. - * Spec#before/after now do a simple define_method and call super. DUR. - -* 2 bug fixes: - - * Fixed #passed? when used against a test that called flunk. (floehopper) - * Fixed rdoc bug preventing doco for some expectations. (stomar). - -=== 3.2.0 / 2012-06-26 - -* 1 minor enhancement: - - * Stubs now yield self. (peterhellberg) - -* 1 bug fix: - - * Fixed verbose test that only fails when run in verbose mode. mmmm irony. - -=== 3.1.0 / 2012-06-13 - -* 2 minor enhancements: - - * Removed LONG deprecated Unit.out accessor - * Removed generated method name munging from minitest/spec. (ordinaryzelig/tenderlove) - -=== 3.0.1 / 2012-05-24 - -* 1 bug fix: - - * I'm a dumbass and refactored into Mock#call. Renamed to #__call so you can mock #call. (mschuerig) - -=== 3.0.0 / 2012-05-08 - -* 3 major enhancements: - - * Added Object#stub (in minitest/mock.rb). - * Mock#expect mocks are used in the order they're given. - * Mock#verify now strictly compares against expect calls. - -* 3 minor enhancements: - - * Added caller to deprecation message. - * Mock error messages are much prettier. - * Removed String check for RHS of assert/refute_match. This lets #to_str work properly. - -* 1 bug fix: - - * Support drive letter on Windows. Patch provided from MRI by Usaku NAKAMURA. (ayumin) - -=== 2.12.1 / 2012-04-10 - -* 1 minor enhancement: - - * Added ruby releases to History.txt to make it easier to see what you're missing - -* 1 bug fix: - - * Rolled my own deprecate msg to allow MT to work with rubygems < 1.7 - -=== 2.12.0 / 2012-04-03 - -* 4 minor enhancements: - - * ::it returns test method name (wojtekmach) - * Added #record method to runner so runner subclasses can cleanly gather data. - * Added Minitest alias for MiniTest because even I forget. - * Deprecated assert_block!! Yay!!! - -* 1 bug fix: - - * Fixed warning in i_suck_and_my_tests_are_order_dependent! (phiggins) - -=== 2.11.4 / 2012-03-20 - -* 2 minor enhancements: - - * Updated known extensions - * You got your unicode in my tests! You got your tests in my unicode! (fl00r) - -* 1 bug fix: - - * Fixed MiniTest::Mock example in the readme. (conradwt) - -=== 2.11.3 / 2012-02-29 - -* 2 bug fixes: - - * Clarified that assert_raises returns the exception for further testing - * Fixed assert_in_epsilon when both args are negative. (tamc) - -=== 2.11.2 / 2012-02-14 - -* 1 minor enhancement: - - * Display failures/errors on SIGINFO. (tenderlove) - -* 1 bug fix: - - * Fixed MiniTest::Unit.after_tests for Ruby 1.9.3. (ysbaddaden) - -=== 2.11.1 / 2012-02-01 - -* 3 bug fixes: - - * Improved description for --name argument. (drd) - * Ensure Mock#expect's expected args is an Array. (mperham) - * Ensure Mock#verify verifies multiple expects of the same method. (chastell) - -=== 2.11.0 / 2012-01-25 - -* 2 minor enhancements: - - * Added before / after hooks for setup and teardown. (tenderlove) - * Pushed run_setup_hooks down to Spec. (tenderlove) - -=== 2.10.1 / 2012-01-17 - -* 1 bug fix: - - * Fixed stupid 1.9 path handling grumble grumble. (graaff) - -=== 2.10.0 / 2011-12-20 - -* 3 minor enhancements: - - * Added specs for must/wont be_empty/respond_to/be_kind_of and others. - * Added tests for assert/refute predicate. - * Split minitest/excludes.rb out to its own gem. - -* 1 bug fix: - - * Fixed must_be_empty and wont_be_empty argument handling. (mrsimo) - -=== 2.9.1 / 2011-12-13 - -* 4 minor enhancements: - - * Added a ton of tests on spec error message output. - * Cleaned up consistency of msg handling on unary expectations. - * Improved error messages on assert/refute_in_delta. - * infect_an_assertion no longer checks arity and better handles args. - -* 1 bug fix: - - * Fixed error message on specs when 2+ args and custom message provided. (chastell) - -=== 2.9.0 / 2011-12-07 - -* 4 minor enhancements: - - * Added TestCase.exclude and load_excludes for programmatic filtering of tests. - * Added guard methods so you can cleanly skip based on platform/impl - * Holy crap! 100% doco! `rdoc -C` ftw - * Switch assert_output to test stderr before stdout to possibly improve debugging - -=== 2.8.1 / 2011-11-17 - -* 1 bug fix: - - * Ugh. 1.9's test/unit violates my internals. Added const_missing. - -=== 2.8.0 / 2011-11-08 - -* 2 minor enhancements: - - * Add a method so that code can be run around a particular test case (tenderlove) - * Turn off backtrace filtering if we're running inside a ruby checkout. (drbrain) - -* 2 bug fixes: - - * Fixed 2 typos and 2 doc glitches. (splattael) - * Remove unused block arguments to avoid creating Proc objects. (k-tsj) - -=== 2.7.0 / 2011-10-25 - -* 2 minor enhancements: - - * Include failed values in the expected arg output in MockExpectationError. (nono) - * Make minitest/pride work with other 256 color capable terms. (sunaku) - -* 2 bug fixes: - - * Clarified the documentation of minitest/benchmark (eregon) - * Fixed using expectations in regular unit tests. (sunaku) - -=== 2.6.2 / 2011-10-19 - -* 1 minor enhancement: - - * Added link to vim bundle. (sunaku) - -* 2 bug fixes: - - * Force gem activation in hoe minitest plugin - * Support RUBY_VERSION='2.0.0' (nagachika) - -=== 2.6.1 / 2011-09-27 - -* 2 bug fixes: - - * Alias Spec.name from Spec.to_s so it works when @name is nil (nathany) - * Fixed assert and refute_operator where second object has a bad == method. - -=== 2.6.0 / 2011-09-13 - -* 2 minor enhancements: - - * Added specify alias for it and made desc optional. - * Spec#must_be and #wont_be can be used with predicates (metaskills) - -* 1 bug fix: - - * Fixed Mock.respond_to?(var) to work with strings. (holli) - -=== 2.5.1 / 2011-08-27 // ruby 1.9.3: p0, p125, p34579 - -* 2 minor enhancements: - - * Added gem activation for minitest in minitest/autoload to help out 1.9 users - * Extended Spec.register_spec_type to allow for procs instead of just regexps. - -=== 2.5.0 / 2011-08-18 - -* 4 minor enhancements: - - * Added 2 more arguments against rspec: let & subject in 9 loc! (emmanuel/luis) - * Added TestCase.i_suck_and_my_tests_are_order_dependent! - * Extended describe to take an optional method name (2 line change!). (emmanuel) - * Refactored and extended minitest/pride to do full 256 color support. (lolcat) - -* 1 bug fix: - - * Doc fixes. (chastell) - -=== 2.4.0 / 2011-08-09 - -* 4 minor enhancements: - - * Added simple examples for all expectations. - * Improved Mock error output when args mismatch. - * Moved all expectations from Object to MiniTest::Expectations. - * infect_with_assertions has been removed due to excessive clever - -* 4 bug fixes: - - * Fix Assertions#mu_pp to deal with immutable encoded strings. (ferrous26) - * Fix minitest/pride for MacRuby (ferrous26) - * Made error output less fancy so it is more readable - * Mock shouldn't undef === and inspect. (dgraham) - -=== 2.3.1 / 2011-06-22 - -* 1 bug fix: - - * Fixed minitest hoe plugin to be a spermy dep and not depend on itself. - -=== 2.3.0 / 2011-06-15 - -* 5 minor enhancements: - - * Add setup and teardown hooks to MiniTest::TestCase. (phiggins) - * Added nicer error messages for MiniTest::Mock. (phiggins) - * Allow for less specific expected arguments in Mock. (bhenderson/phiggins) - * Made MiniTest::Mock a blank slate. (phiggins) - * Refactored minitest/spec to use the hooks instead of define_inheritable_method. (phiggins) - -* 2 bug fixes: - - * Fixed TestCase's inherited hook. (dchelimsky/phiggins/jamis, the 'good' neighbor) - * MiniTest::Assertions#refute_empty should use mu_pp in the default message. (whatthejeff) - -=== 2.2.2 / 2011-06-01 - -* 2 bug fixes: - - * Got rid of the trailing period in message for assert_equal. (tenderlove) - * Windows needs more flushing. (Akio Tajima) - -=== 2.2.1 / 2011-05-31 - -* 1 bug fix: - - * My _ONE_ non-rubygems-using minitest user goes to Seattle.rb! - -=== 2.2.0 / 2011-05-29 - -* 6 minor enhancements: - - * assert_equal (and must_equal) now tries to diff output where it makes sense. - * Added Assertions#diff(exp, act) to be used by assert_equal. - * Added Assertions#mu_pp_for_diff - * Added Assertions.diff and diff= - * Moved minitest hoe-plugin from hoe-seattlerb. (erikh) - * Skipped tests only output details in verbose mode. (tenderlove+zenspider=xoxo) - -=== 2.1.0 / 2011-04-11 - -* 5 minor enhancements: - - * Added MiniTest::Spec.register_spec_type(matcher, klass) and spec_type(desc) - * Added ability for specs to share code via subclassing of Spec. (metaskills) - * Clarified (or tried to) bench_performance_linear's use of threshold. - * MiniTest::Unit.runner=(runner) provides an easy way of creating custom test runners for specialized needs. (justinweiss) - * Reverse order of inheritance in teardowns of specs. (deepfryed) - -* 3 bug fixes: - - * FINALLY fixed problems of inheriting specs in describe/it/describe scenario. (MGPalmer) - * Fixed a new warning in 1.9.3. - * Fixed assert_block's message handling. (nobu) - -=== 2.0.2 / 2010-12-24 - -* 1 minor enhancement: - - * Completed doco on minitest/benchmark for specs. - -* 1 bug fix: - - * Benchmarks in specs that didn't call bench_range would die. (zzak). - -=== 2.0.1 / 2010-12-15 - -* 4 minor enhancements: - - * Do not filter backtrace if $DEBUG - * Exit autorun via nested at_exit handler, in case other libs call exit - * Make options accesor lazy. - * Split printing of test name and its time. (nurse) - -* 1 bug fix: - - * Fix bug when ^T is hit before runner start - -=== 2.0.0 / 2010-11-11 - -* 3 major enhancements: - - * Added minitest/benchmark! Assert your performance! YAY! - * Refactored runner to allow for more extensibility. See minitest/benchmark. - * This makes the runner backwards incompatible in some ways! - -* 9 minor enhancements: - - * Added MiniTest::Unit.after_tests { ... } - * Improved output by adding test rates and a more sortable verbose format - * Improved readme based on feedback from others - * Added io method to TestCase. If used, it'll supplant '.EF' output. - * Refactored IO in MiniTest::Unit. - * Refactored _run_anything to _run_suite to make it easier to wrap (ngauthier) - * Spec class names are now the unmunged descriptions (btakita) - * YAY for not having redundant rdoc/readmes! - * Help output is now generated from the flags you passed straight up. - -* 4 bug fixes: - - * Fixed scoping issue on minitest/mock (srbaker/prosperity) - * Fixed some of the assertion default messages - * Fixes autorun when on windows with ruby install on different drive (larsch) - * Fixed rdoc output bug in spec.rb - -=== 1.7.2 / 2010-09-23 - -* 3 bug fixes: - - * Fixed doco for expectations and Spec. - * Fixed test_capture_io on 1.9.3+ (sora_h) - * assert_raises now lets MiniTest::Skip through. (shyouhei) - -=== 1.7.1 / 2010-09-01 - -* 1 bug fix: - - * 1.9.2 fixes for spec tests - -=== 1.7.0 / 2010-07-15 - -* 5 minor enhancements: - - * Added assert_output (mapped to must_output). - * Added assert_silent (mapped to must_be_silent). - * Added examples to readme (Mike Dalessio) - * Added options output at the top of the run, for fatal run debugging (tenderlove) - * Spec's describe method returns created class - -=== 1.6.0 / 2010-03-27 // ruby 1.9.2-p290 - -* 10 minor enhancements: - - * Added --seed argument so you can reproduce a random order for debugging. - * Added documentation for assertions - * Added more rdoc and tons of :nodoc: - * Added output to give you all the options you need to reproduce that run. - * Added proper argument parsing to minitest. - * Added unique serial # to spec names so order can be preserved (needs tests). (phrogz) - * Empty 'it' fails with default msg. (phrogz) - * Remove previous method on expect to remove 1.9 warnings - * Spec#it is now order-proof wrt subclasses/nested describes. - * assert_same error message now reports in decimal, eg: oid=123. (mattkent) - -* 2 bug fixes: - - * Fixed message on refute_same to be consistent with assert_same. - * Fixed method randomization to be stable for testing. - -=== 1.5.0 / 2010-01-06 - -* 4 minor enhancements: - - * Added ability to specify what assertions should have their args flipped. - * Don't flip arguments on *include and *respond_to assertions. - * Refactored Module.infect_an_assertion from Module.infect_with_assertions. - * before/after :all now bitches and acts like :each - -* 3 bug fixes: - - * Nested describes now map to nested test classes to avoid namespace collision. - * Using undef_method instead of remove_method to clean out inherited specs. - * assert_raises was ignoring passed in message. - -=== 1.4.2 / 2009-06-25 - -* 1 bug fix: - - * Fixed info handler for systems that don't have siginfo. - -=== 1.4.1 / 2009-06-23 - -* 1 major enhancement: - - * Handle ^C and other fatal exceptions by failing - -* 1 minor enhancement: - - * Added something to catch mixed use of test/unit and minitest if $DEBUG - -* 1 bug fix: - - * Added SIGINFO handler for finding slow tests without verbose - -=== 1.4.0 / 2009-06-18 - -* 5 minor enhancement: - - * Added clarification doco. - * Added specs and mocks to autorun. - * Changed spec test class creation to be non-destructive. - * Updated rakefile for new hoe capabilities. - * describes are nestable (via subclass). before/after/def inherits, specs don't. - -* 3 bug fixes: - - * Fixed location on must/wont. - * Switched to __name__ to avoid common ivar name. - * Fixed indentation in test file (1.9). - -=== 1.3.1 / 2009-01-20 // ruby 1.9.1-p431 - -* 1 minor enhancement: - - * Added miniunit/autorun.rb as replacement for test/unit.rb's autorun. - -* 16 bug fixes: - - * 1.9 test fixes. - * Bug fixes from nobu and akira for really odd scenarios. They run ruby funny. - * Fixed (assert|refute)_match's argument order. - * Fixed LocalJumpError in autorun if exception thrown before at_exit. - * Fixed assert_in_delta (should be >=, not >). - * Fixed assert_raises to match Modules. - * Fixed capture_io to not dup IOs. - * Fixed indentation of capture_io for ruby 1.9 warning. - * Fixed location to deal better with custom assertions and load paths. (Yuki) - * Fixed order of (must|wont)_include in MiniTest::Spec. - * Fixed skip's backtrace. - * Got arg order wrong in *_match in tests, message wrong as a result. - * Made describe private. For some reason I thought that an attribute of Kernel. - * Removed disable_autorun method, added autorun.rb instead. - * assert_match escapes if passed string for pattern. - * instance_of? is different from ===, use instance_of. - -=== 1.3.0 / 2008-10-09 - -* 2 major enhancements: - - * renamed to minitest and pulled out test/unit compatibility. - * mini/test.rb is now minitest/unit.rb, everything else maps directly. - -* 12 minor enhancements: - - * assert_match now checks that act can call =~ and converts exp to a - regexp only if needed. - * Added assert_send... seems useless to me tho. - * message now forces to string... ruby-core likes to pass classes and arrays :( - * Added -v handling and switched to @verbose from $DEBUG. - * Verbose output now includes test class name and adds a sortable running time! - * Switched message generation into procs for message deferment. - * Added skip and renamed fail to flunk. - * Improved output failure messages for assert_instance_of, assert_kind_of - * Improved output for assert_respond_to, assert_same. - * at_exit now exits false instead of errors+failures. - * Made the tests happier and more readable imhfo. - * Switched index(s) == 0 to rindex(s, 0) on nobu's suggestion. Faster. - -* 5 bug fixes: - - * 1.9: Added encoding normalization in mu_pp. - * 1.9: Fixed backtrace filtering (BTs are expanded now) - * Added back exception_details to assert_raises. DOH. - * Fixed shadowed variable in mock.rb - * Fixed stupid muscle memory message bug in assert_send. - -=== 1.2.1 / 2008-06-10 - -* 7 minor enhancements: - - * Added deprecations everywhere in test/unit. - * Added test_order to TestCase. :random on mini, :sorted on test/unit (for now). - * Big cleanup in test/unit for rails. Thanks Jeremy Kemper! - * Minor readability cleanup. - * Pushed setup/run/teardown down to testcase allowing specialized testcases. - * Removed pp. Tests run 2x faster. :/ - * Renamed deprecation methods and moved to test/unit/deprecate.rb. - -=== 1.2.0 / 2008-06-09 - -* 2 major enhancements: - - * Added Mini::Spec. - * Added Mini::Mock. Thanks Steven Baker!! - -* 23 minor enhancements: - - * Added bin/use_miniunit to make it easy to test out miniunit. - * Added -n filtering, thanks to Phil Hagelberg! - * Added args argument to #run, takes ARGV from at_exit. - * Added test name output if $DEBUG. - * Added a refute (was deny) for every assert. - * Added capture_io and a bunch of nice assertions from zentest. - * Added deprecation mechanism for assert_no/not methods to test/unit/assertions. - * Added pp output when available. - * Added tests for all assertions. Pretty much maxed out coverage. - * Added tests to verify consistency and good naming. - * Aliased and deprecated all ugly assertions. - * Cleaned out test/unit. Moved autorun there. - * Code cleanup to make extensions easier. Thanks Chad! - * Got spec args reversed in all but a couple assertions. Much more readable. - * Improved error messages across the board. Adds your message to the default. - * Moved into Mini namespace, renamed to Mini::Test and Mini::Spec. - * Pulled the assertions into their own module... - * Removed as much code as I could while still maintaining full functionality. - * Moved filter_backtrace into MiniTest. - * Removed MiniTest::Unit::run. Unnecessary. - * Removed location_of_failure. Unnecessary. - * Rewrote test/unit's filter_backtrace. Flog from 37.0 to 18.1 - * Removed assert_send. Google says it is never used. - * Renamed MiniTest::Unit.autotest to #run. - * Renamed deny to refute. - * Rewrote some ugly/confusing default assertion messages. - * assert_in_delta now defaults to 0.001 precision. Makes specs prettier. - -* 9 bug fixes: - - * Fixed assert_raises to raise outside of the inner-begin/rescue. - * Fixed for ruby 1.9 and rubinius. - * No longer exits 0 if exception in code PRE-test run causes early exit. - * Removed implementors method list from mini/test.rb - too stale. - * assert_nothing_raised takes a class as an arg. wtf? STUPID - * ".EF" output is now unbuffered. - * Bunch of changes to get working with rails... UGH. - * Added stupid hacks to deal with rails not requiring their dependencies. - * Now bitch loudly if someone defines one of my classes instead of requiring. - * Fixed infect method to work better on 1.9. - * Fixed all shadowed variable warnings in 1.9. - -=== 1.1.0 / 2007-11-08 - -* 4 major enhancements: - - * Finished writing all missing assertions. - * Output matches original test/unit. - * Documented every method needed by language implementor. - * Fully switched over to self-testing setup. - -* 2 minor enhancements: - - * Added deny (assert ! test), our favorite extension to test/unit. - * Added .autotest and fairly complete unit tests. (thanks Chad for help here) - -=== 1.0.0 / 2006-10-30 - -* 1 major enhancement - - * Birthday! diff --git a/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/Manifest.txt b/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/Manifest.txt deleted file mode 100644 index 5c9dd1e..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/Manifest.txt +++ /dev/null @@ -1,29 +0,0 @@ -.autotest -History.rdoc -Manifest.txt -README.rdoc -Rakefile -design_rationale.rb -lib/hoe/minitest.rb -lib/minitest.rb -lib/minitest/assertions.rb -lib/minitest/autorun.rb -lib/minitest/benchmark.rb -lib/minitest/expectations.rb -lib/minitest/hell.rb -lib/minitest/mock.rb -lib/minitest/parallel.rb -lib/minitest/pride.rb -lib/minitest/pride_plugin.rb -lib/minitest/spec.rb -lib/minitest/test.rb -lib/minitest/test_task.rb -lib/minitest/unit.rb -test/minitest/metametameta.rb -test/minitest/test_minitest_assertions.rb -test/minitest/test_minitest_benchmark.rb -test/minitest/test_minitest_mock.rb -test/minitest/test_minitest_reporter.rb -test/minitest/test_minitest_spec.rb -test/minitest/test_minitest_test.rb -test/minitest/test_minitest_test_task.rb diff --git a/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/README.rdoc b/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/README.rdoc deleted file mode 100644 index 9123436..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/README.rdoc +++ /dev/null @@ -1,831 +0,0 @@ -= minitest/{test,spec,mock,benchmark} - -home :: https://github.com/seattlerb/minitest -bugs :: https://github.com/seattlerb/minitest/issues -rdoc :: https://docs.seattlerb.org/minitest -vim :: https://github.com/sunaku/vim-ruby-minitest -emacs:: https://github.com/arthurnn/minitest-emacs - -== DESCRIPTION: - -minitest provides a complete suite of testing facilities supporting -TDD, BDD, mocking, and benchmarking. - - "I had a class with Jim Weirich on testing last week and we were - allowed to choose our testing frameworks. Kirk Haines and I were - paired up and we cracked open the code for a few test - frameworks... - - I MUST say that minitest is *very* readable / understandable - compared to the 'other two' options we looked at. Nicely done and - thank you for helping us keep our mental sanity." - - -- Wayne E. Seguin - -minitest/test is a small and incredibly fast unit testing framework. -It provides a rich set of assertions to make your tests clean and -readable. - -minitest/spec is a functionally complete spec engine. It hooks onto -minitest/test and seamlessly bridges test assertions over to spec -expectations. - -minitest/benchmark is an awesome way to assert the performance of your -algorithms in a repeatable manner. Now you can assert that your newb -co-worker doesn't replace your linear algorithm with an exponential -one! - -minitest/mock by Steven Baker, is a beautifully tiny mock (and stub) -object framework. - -minitest/pride shows pride in testing and adds coloring to your test -output. I guess it is an example of how to write IO pipes too. :P - -minitest/test is meant to have a clean implementation for language -implementors that need a minimal set of methods to bootstrap a working -test suite. For example, there is no magic involved for test-case -discovery. - - "Again, I can't praise enough the idea of a testing/specing - framework that I can actually read in full in one sitting!" - - -- Piotr Szotkowski - -Comparing to rspec: - - rspec is a testing DSL. minitest is ruby. - - -- Adam Hawkins, "Bow Before MiniTest" - -minitest doesn't reinvent anything that ruby already provides, like: -classes, modules, inheritance, methods. This means you only have to -learn ruby to use minitest and all of your regular OO practices like -extract-method refactorings still apply. - -== FEATURES/PROBLEMS: - -* minitest/autorun - the easy and explicit way to run all your tests. -* minitest/test - a very fast, simple, and clean test system. -* minitest/spec - a very fast, simple, and clean spec system. -* minitest/mock - a simple and clean mock/stub system. -* minitest/benchmark - an awesome way to assert your algorithm's performance. -* minitest/pride - show your pride in testing! -* minitest/test_task - a full-featured and clean rake task generator. -* Incredibly small and fast runner, but no bells and whistles. -* Written by squishy human beings. Software can never be perfect. We will all eventually die. - -== RATIONALE: - -See design_rationale.rb to see how specs and tests work in minitest. - -== SYNOPSIS: - -Given that you'd like to test the following class: - - class Meme - def i_can_has_cheezburger? - "OHAI!" - end - - def will_it_blend? - "YES!" - end - end - -=== Unit tests - -Define your tests as methods beginning with +test_+. - - require "minitest/autorun" - - class TestMeme < Minitest::Test - def setup - @meme = Meme.new - end - - def test_that_kitty_can_eat - assert_equal "OHAI!", @meme.i_can_has_cheezburger? - end - - def test_that_it_will_not_blend - refute_match /^no/i, @meme.will_it_blend? - end - - def test_that_will_be_skipped - skip "test this later" - end - end - -=== Specs - - require "minitest/autorun" - - describe Meme do - before do - @meme = Meme.new - end - - describe "when asked about cheeseburgers" do - it "must respond positively" do - _(@meme.i_can_has_cheezburger?).must_equal "OHAI!" - end - end - - describe "when asked about blending possibilities" do - it "won't say no" do - _(@meme.will_it_blend?).wont_match /^no/i - end - end - end - -For matchers support check out: - -* https://github.com/wojtekmach/minitest-matchers -* https://github.com/rmm5t/minitest-matchers_vaccine - -=== Benchmarks - -Add benchmarks to your tests. - - # optionally run benchmarks, good for CI-only work! - require "minitest/benchmark" if ENV["BENCH"] - - class TestMeme < Minitest::Benchmark - # Override self.bench_range or default range is [1, 10, 100, 1_000, 10_000] - def bench_my_algorithm - assert_performance_linear 0.9999 do |n| # n is a range value - @obj.my_algorithm(n) - end - end - end - -Or add them to your specs. If you make benchmarks optional, you'll -need to wrap your benchmarks in a conditional since the methods won't -be defined. In minitest 5, the describe name needs to match -/Bench(mark)?$/. - - describe "Meme Benchmark" do - if ENV["BENCH"] then - bench_performance_linear "my_algorithm", 0.9999 do |n| - 100.times do - @obj.my_algorithm(n) - end - end - end - end - -outputs something like: - - # Running benchmarks: - - TestBlah 100 1000 10000 - bench_my_algorithm 0.006167 0.079279 0.786993 - bench_other_algorithm 0.061679 0.792797 7.869932 - -Output is tab-delimited to make it easy to paste into a spreadsheet. - -=== Mocks - -Mocks and stubs defined using terminology by Fowler & Meszaros at -https://www.martinfowler.com/bliki/TestDouble.html: - -"Mocks are pre-programmed with expectations which form a specification -of the calls they are expected to receive. They can throw an exception -if they receive a call they don't expect and are checked during -verification to ensure they got all the calls they were expecting." - - class MemeAsker - def initialize(meme) - @meme = meme - end - - def ask(question) - method = question.tr(" ", "_") + "?" - @meme.__send__(method) - end - end - - require "minitest/autorun" - - describe MemeAsker, :ask do - describe "when passed an unpunctuated question" do - it "should invoke the appropriate predicate method on the meme" do - @meme = Minitest::Mock.new - @meme_asker = MemeAsker.new @meme - @meme.expect :will_it_blend?, :return_value - - @meme_asker.ask "will it blend" - - @meme.verify - end - end - end - -==== Multi-threading and Mocks - -Minitest mocks do not support multi-threading. If it works, fine, if it doesn't -you can use regular ruby patterns and facilities like local variables. Here's -an example of asserting that code inside a thread is run: - - def test_called_inside_thread - called = false - pr = Proc.new { called = true } - thread = Thread.new(&pr) - thread.join - assert called, "proc not called" - end - -=== Stubs - -Mocks and stubs are defined using terminology by Fowler & Meszaros at -https://www.martinfowler.com/bliki/TestDouble.html: - -"Stubs provide canned answers to calls made during the test". - -Minitest's stub method overrides a single method for the duration of -the block. - - def test_stale_eh - obj_under_test = Something.new - - refute obj_under_test.stale? - - Time.stub :now, Time.at(0) do # stub goes away once the block is done - assert obj_under_test.stale? - end - end - -A note on stubbing: In order to stub a method, the method must -actually exist prior to stubbing. Use a singleton method to create a -new non-existing method: - - def obj_under_test.fake_method - ... - end - -=== Running Your Tests - -Ideally, you'll use a rake task to run your tests (see below), either -piecemeal or all at once. BUT! You don't have to: - - % ruby -Ilib:test test/minitest/test_minitest_test.rb - Run options: --seed 37685 - - # Running: - - ...................................................................... (etc) - - Finished in 0.107130s, 1446.8403 runs/s, 2959.0217 assertions/s. - - 155 runs, 317 assertions, 0 failures, 0 errors, 0 skips - -There are runtime options available, both from minitest itself, and also -provided via plugins. To see them, simply run with +--help+: - - % ruby -Ilib:test test/minitest/test_minitest_test.rb --help - minitest options: - -h, --help Display this help. - -s, --seed SEED Sets random seed. Also via env. Eg: SEED=n rake - -v, --verbose Verbose. Show progress processing files. - -n, --name PATTERN Filter run on /regexp/ or string. - -e, --exclude PATTERN Exclude /regexp/ or string from run. - - Known extensions: pride, autotest - -p, --pride Pride. Show your testing pride! - -a, --autotest Connect to autotest server. - -=== Rake Tasks - -You can set up a rake task to run all your tests by adding this to your Rakefile: - - require "minitest/test_task" - - Minitest::TestTask.create # named test, sensible defaults - - # or more explicitly: - - Minitest::TestTask.create(:test) do |t| - t.libs << "test" - t.libs << "lib" - t.warning = false - t.test_globs = ["test/**/*_test.rb"] - end - - task :default => :test - -Each of these will generate 4 tasks: - - rake test :: Run the test suite. - rake test:cmd :: Print out the test command. - rake test:isolated :: Show which test files fail when run separately. - rake test:slow :: Show bottom 25 tests sorted by time. - -=== Rake Task Variables - -There are a bunch of variables you can supply to rake to modify the run. - - MT_LIB_EXTRAS :: Extra libs to dynamically override/inject for custom runs. - N :: -n: Tests to run (string or /regexp/). - X :: -x: Tests to exclude (string or /regexp/). - A :: Any extra arguments. Honors shell quoting. - MT_CPU :: How many threads to use for parallel test runs - SEED :: -s --seed Sets random seed. - TESTOPTS :: Deprecated, same as A - FILTER :: Deprecated, same as A - -== Writing Extensions - -To define a plugin, add a file named minitest/XXX_plugin.rb to your -project/gem. That file must be discoverable via ruby's LOAD_PATH (via -rubygems or otherwise). Minitest will find and require that file using -Gem.find_files. It will then try to call +plugin_XXX_init+ during -startup. The option processor will also try to call +plugin_XXX_options+ -passing the OptionParser instance and the current options hash. This -lets you register your own command-line options. Here's a totally -bogus example: - - # minitest/bogus_plugin.rb: - - module Minitest - def self.plugin_bogus_options(opts, options) - opts.on "--myci", "Report results to my CI" do - options[:myci] = true - options[:myci_addr] = get_myci_addr - options[:myci_port] = get_myci_port - end - end - - def self.plugin_bogus_init(options) - self.reporter << MyCI.new(options) if options[:myci] - end - end - -=== Adding custom reporters - -Minitest uses composite reporter to output test results using multiple -reporter instances. You can add new reporters to the composite during -the init_plugins phase. As we saw in +plugin_bogus_init+ above, you -simply add your reporter instance to the composite via <<. - -+AbstractReporter+ defines the API for reporters. You may subclass it -and override any method you want to achieve your desired behavior. - -start :: Called when the run has started. -record :: Called for each result, passed or otherwise. -report :: Called at the end of the run. -passed? :: Called to see if you detected any problems. - -Using our example above, here is how we might implement MyCI: - - # minitest/bogus_plugin.rb - - module Minitest - class MyCI < AbstractReporter - attr_accessor :results, :addr, :port - - def initialize options - self.results = [] - self.addr = options[:myci_addr] - self.port = options[:myci_port] - end - - def record result - self.results << result - end - - def report - CI.connect(addr, port).send_results self.results - end - end - - # code from above... - end - -== FAQ - -=== What versions are compatible with what? Or what versions are supported? - -Minitest is a dependency of rails, which until fairly recently had an -overzealous backwards compatibility policy. As such, I'm stuck -supporting versions of ruby that are long past EOL. Hopefully I'll be -able to support only current versions of ruby sometime in the near -future. - -(As of 2022-11-29) - -Current versions of rails: (https://endoflife.date/rails) - - | rails | min ruby | rec ruby | minitest | status | EOL Date | - |-------+----------+----------+----------+----------+------------| - | 7.0 | >= 2.7 | 3.1 | >= 5.1 | Current | 2025-06-01?| - | 6.1 | >= 2.5 | 3.0 | >= 5.1 | Maint | 2024-06-01?| - | 6.0 | >= 2.5 | 2.6 | >= 5.1 | Security | 2023-06-01 | - | 5.2 | >= 2.2.2 | 2.5 | ~> 5.1 | EOL | 2022-06-01 | - -Current versions of ruby: (https://endoflife.date/ruby) - - | ruby | Status | EOL Date | - |------+---------+------------| - | 3.1 | Current | 2025-12-25 | - | 3.0 | Maint | 2024-03-31 | - | 2.7 | Maint* | 2023-03-31 | - | 2.6 | EOL | 2022-03-31 | - | 2.5 | EOL | 2021-03-31 | - -See also: - -* https://www.fastruby.io/blog/ruby/rails/versions/compatibility-table.html - -=== How to test SimpleDelegates? - -The following implementation and test: - - class Worker < SimpleDelegator - def work - end - end - - describe Worker do - before do - @worker = Worker.new(Object.new) - end - - it "must respond to work" do - _(@worker).must_respond_to :work - end - end - -outputs a failure: - - 1) Failure: - Worker#test_0001_must respond to work [bug11.rb:16]: - Expected # (Object) to respond to #work. - -Worker is a SimpleDelegate which in 1.9+ is a subclass of BasicObject. -Expectations are put on Object (one level down) so the Worker -(SimpleDelegate) hits +method_missing+ and delegates down to the -+Object.new+ instance. That object doesn't respond to work so the test -fails. - -You can bypass SimpleDelegate#method_missing by extending the worker -with Minitest::Expectations. You can either do that in your setup at -the instance level, like: - - before do - @worker = Worker.new(Object.new) - @worker.extend Minitest::Expectations - end - -or you can extend the Worker class (within the test file!), like: - - class Worker - include ::Minitest::Expectations - end - -=== How to share code across test classes? - -Use a module. That's exactly what they're for: - - module UsefulStuff - def useful_method - # ... - end - end - - describe Blah do - include UsefulStuff - - def test_whatever - # useful_method available here - end - end - -Remember, +describe+ simply creates test classes. It's just ruby at -the end of the day and all your normal Good Ruby Rules (tm) apply. If -you want to extend your test using setup/teardown via a module, just -make sure you ALWAYS call super. before/after automatically call super -for you, so make sure you don't do it twice. - -=== How to run code before a group of tests? - -Use a constant with begin...end like this: - - describe Blah do - SETUP = begin - # ... this runs once when describe Blah starts - end - # ... - end - -This can be useful for expensive initializations or sharing state. -Remember, this is just ruby code, so you need to make sure this -technique and sharing state doesn't interfere with your tests. - -=== Why am I seeing uninitialized constant MiniTest::Test (NameError)? - -Are you running the test with Bundler (e.g. via bundle exec )? If so, -in order to require minitest, you must first add the gem 'minitest' -to your Gemfile and run +bundle+. Once it's installed, you should be -able to require minitest and run your tests. - -== Prominent Projects using Minitest: - -* arel -* journey -* mime-types -* nokogiri -* rails (active_support et al) -* rake -* rdoc -* ...and of course, everything from seattle.rb... - -== Developing Minitest: - -Minitest requires {Hoe}[https://rubygems.org/gems/hoe]. - -=== Minitest's own tests require UTF-8 external encoding. - -This is a common problem in Windows, where the default external Encoding is -often CP850, but can affect any platform. -Minitest can run test suites using any Encoding, but to run Minitest's -own tests you must have a default external Encoding of UTF-8. - -If your encoding is wrong, you'll see errors like: - - --- expected - +++ actual - @@ -1,2 +1,3 @@ - # encoding: UTF-8 - -"Expected /\\w+/ to not match \"blah blah blah\"." - +"Expected /\\w+/ to not match # encoding: UTF-8 - +\"blah blah blah\"." - -To check your current encoding, run: - - ruby -e 'puts Encoding.default_external' - -If your output is something other than UTF-8, you can set the RUBYOPTS -env variable to a value of '-Eutf-8'. Something like: - - RUBYOPT='-Eutf-8' ruby -e 'puts Encoding.default_external' - -Check your OS/shell documentation for the precise syntax (the above -will not work on a basic Windows CMD prompt, look for the SET command). -Once you've got it successfully outputing UTF-8, use the same setting -when running rake in Minitest. - -=== Minitest's own tests require GNU (or similar) diff. - -This is also a problem primarily affecting Windows developers. PowerShell -has a command called diff, but it is not suitable for use with Minitest. - -If you see failures like either of these, you are probably missing diff tool: - - 4) Failure: - TestMinitestUnitTestCase#test_assert_equal_different_long [D:/ruby/seattlerb/minitest/test/minitest/test_minitest_test.rb:936]: - Expected: "--- expected\n+++ actual\n@@ -1 +1 @@\n-\"hahahahahahahahahahahahahahahahahahahaha\"\n+\"blahblahblahblahblahblahblahblahblahblah\"\n" - Actual: "Expected: \"hahahahahahahahahahahahahahahahahahahaha\"\n Actual: \"blahblahblahblahblahblahblahblahblahblah\"" - - - 5) Failure: - TestMinitestUnitTestCase#test_assert_equal_different_collection_hash_hex_invisible [D:/ruby/seattlerb/minitest/test/minitest/test_minitest_test.rb:845]: - Expected: "No visible difference in the Hash#inspect output.\nYou should look at the implementation of #== on Hash or its members.\n - {1=>#}" - Actual: "Expected: {1=>#}\n Actual: {1=>#}" - - -If you use Cygwin or MSYS2 or similar there are packages that include a -GNU diff for Windows. If you don't, you can download GNU diffutils from -http://gnuwin32.sourceforge.net/packages/diffutils.htm -(make sure to add it to your PATH). - -You can make sure it's installed and path is configured properly with: - - diff.exe -v - -There are multiple lines of output, the first should be something like: - - diff (GNU diffutils) 2.8.1 - -If you are using PowerShell make sure you run diff.exe, not just diff, -which will invoke the PowerShell built in function. - -== Known Extensions: - -capybara_minitest_spec :: Bridge between Capybara RSpec matchers and - Minitest::Spec expectations (e.g. - page.must_have_content("Title")). -color_pound_spec_reporter :: Test names print Ruby Object types in color with - your Minitest Spec style tests. -minispec-metadata :: Metadata for describe/it blocks & CLI tag filter. - E.g. it "requires JS driver", js: true do & - ruby test.rb --tag js runs tests tagged :js. -minispec-rails :: Minimal support to use Spec style in Rails 5+. -mini-apivore :: for swagger based automated API testing. -minitest-around :: Around block for minitest. An alternative to - setup/teardown dance. -minitest-assert_errors :: Adds Minitest assertions to test for errors raised - or not raised by Minitest itself. -minitest-autotest :: autotest is a continuous testing facility meant to - be used during development. -minitest-bacon :: minitest-bacon extends minitest with bacon-like - functionality. -minitest-bang :: Adds support for RSpec-style let! to immediately - invoke let statements before each test. -minitest-bisect :: Helps you isolate and debug random test failures. -minitest-blink1_reporter :: Display test results with a Blink1. -minitest-capistrano :: Assertions and expectations for testing - Capistrano recipes. -minitest-capybara :: Capybara matchers support for minitest unit and - spec. -minitest-cc :: It provides minimal information about code coverage. -minitest-chef-handler :: Run Minitest suites as Chef report handlers -minitest-ci :: CI reporter plugin for Minitest. -minitest-context :: Defines contexts for code reuse in Minitest - specs that share common expectations. -minitest-debugger :: Wraps assert so failed assertions drop into - the ruby debugger. -minitest-display :: Patches Minitest to allow for an easily - configurable output. -minitest-documentation :: Minimal documentation format inspired by rspec's. -minitest-doc_reporter :: Detailed output inspired by rspec's documentation - format. -minitest-emoji :: Print out emoji for your test passes, fails, and - skips. -minitest-english :: Semantically symmetric aliases for assertions and - expectations. -minitest-excludes :: Clean API for excluding certain tests you - don't want to run under certain conditions. -minitest-fail-fast :: Reimplements RSpec's "fail fast" feature -minitest-filecontent :: Support unit tests with expectation results in files. - Differing results will be stored again in files. -minitest-filesystem :: Adds assertion and expectation to help testing - filesystem contents. -minitest-firemock :: Makes your Minitest mocks more resilient. -minitest-focus :: Focus on one test at a time. -minitest-gcstats :: A minitest plugin that adds a report of the top - tests by number of objects allocated. -minitest-global_expectations:: Support minitest expectation methods for all objects -minitest-great_expectations :: Generally useful additions to minitest's - assertions and expectations. -minitest-growl :: Test notifier for minitest via growl. -minitest-happy :: GLOBALLY ACTIVATE MINITEST PRIDE! RAWR! -minitest-have_tag :: Adds Minitest assertions to test for the existence of - HTML tags, including contents, within a provided string. -minitest-heat :: Reporting that builds a heat map of failure locations -minitest-hooks :: Around and before_all/after_all/around_all hooks -minitest-hyper :: Pretty, single-page HTML reports for your Minitest runs -minitest-implicit-subject :: Implicit declaration of the test subject. -minitest-instrument :: Instrument ActiveSupport::Notifications when - test method is executed. -minitest-instrument-db :: Store information about speed of test execution - provided by minitest-instrument in database. -minitest-junit :: JUnit-style XML reporter for minitest. -minitest-keyword :: Use Minitest assertions with keyword arguments. -minitest-libnotify :: Test notifier for minitest via libnotify. -minitest-line :: Run test at line number. -minitest-logger :: Define assert_log and enable minitest to test log messages. - Supports Logger and Log4r::Logger. -minitest-macruby :: Provides extensions to minitest for macruby UI - testing. -minitest-matchers :: Adds support for RSpec-style matchers to - minitest. -minitest-matchers_vaccine :: Adds assertions that adhere to the matcher spec, - but without any expectation infections. -minitest-metadata :: Annotate tests with metadata (key-value). -minitest-mock_expectations :: Provides method call assertions for minitest. -minitest-mongoid :: Mongoid assertion matchers for Minitest. -minitest-must_not :: Provides must_not as an alias for wont in - Minitest. -minitest-optional_retry :: Automatically retry failed test to help with flakiness. -minitest-osx :: Reporter for the Mac OS X notification center. -minitest-parallel_fork :: Fork-based parallelization -minitest-parallel-db :: Run tests in parallel with a single database. -minitest-power_assert :: PowerAssert for Minitest. -minitest-predicates :: Adds support for .predicate? methods. -minitest-profile :: List the 10 slowest tests in your suite. -minitest-rails :: Minitest integration for Rails 3.x. -minitest-rails-capybara :: Capybara integration for Minitest::Rails. -minitest-reporters :: Create customizable Minitest output formats. -minitest-rg :: Colored red/green output for Minitest. -minitest-rspec_mocks :: Use RSpec Mocks with Minitest. -minitest-server :: minitest-server provides a client/server setup - with your minitest process, allowing your test - run to send its results directly to a handler. -minitest-sequel :: Minitest assertions to speed-up development and - testing of Ruby Sequel database setups. -minitest-shared_description :: Support for shared specs and shared spec - subclasses -minitest-should_syntax :: RSpec-style x.should == y assertions for - Minitest. -minitest-shouldify :: Adding all manner of shoulds to Minitest (bad - idea) -minitest-snail :: Print a list of tests that take too long -minitest-spec-context :: Provides rspec-ish context method to - Minitest::Spec. -minitest-spec-expect :: Expect syntax for Minitest::Spec (e.g. - expect(sequences).to_include :celery_man). -minitest-spec-magic :: Minitest::Spec extensions for Rails and beyond. -minitest-spec-rails :: Drop in Minitest::Spec superclass for - ActiveSupport::TestCase. -minitest-sprint :: Runs (Get it? It's fast!) your tests and makes - it easier to rerun individual failures. -minitest-stately :: Find leaking state between tests -minitest-stub_any_instance :: Stub any instance of a method on the given class - for the duration of a block. -minitest-stub-const :: Stub constants for the duration of a block. -minitest-tags :: Add tags for minitest. -minitest-unordered :: Adds a new assertion to minitest for checking the - contents of a collection, ignoring element order. -minitest-vcr :: Automatic cassette management with Minitest::Spec - and VCR. -minitest_log :: Adds structured logging, data explication, and verdicts. -minitest_owrapper :: Get tests results as a TestResult object. -minitest_should :: Shoulda style syntax for minitest test::unit. -minitest_tu_shim :: Bridges between test/unit and minitest. -mongoid-minitest :: Minitest matchers for Mongoid. -mutant-minitest :: Minitest integration for mutant. -pry-rescue :: A pry plugin w/ minitest support. See - pry-rescue/minitest.rb. -rematch :: Declutter your test files from large hardcoded data - and update them automatically when your code changes. -rspec2minitest :: Easily translate any RSpec matchers to Minitest - assertions and expectations. -stubberry :: Multiple stubbing 'berries', sweet and useful - stub helpers and assertions. ( stub_must, - assert_method_called, stubbing ORM objects by id ) - -== Unknown Extensions: - -Authors... Please send me a pull request with a description of your minitest extension. - -* assay-minitest -* detroit-minitest -* em-minitest-spec -* flexmock-minitest -* guard-minitest -* guard-minitest-decisiv -* minitest-activemodel -* minitest-ar-assertions -* minitest-capybara-unit -* minitest-colorer -* minitest-deluxe -* minitest-extra-assertions -* minitest-rails-shoulda -* minitest-spec -* minitest-spec-should -* minitest-sugar -* spork-minitest - -== Minitest related goods - -* minitest/pride fabric: https://www.spoonflower.com/fabric/3928730-again-by-katie_allen - -== REQUIREMENTS: - -* Ruby 2.3+. No magic is involved. I hope. - -== INSTALL: - - sudo gem install minitest - -On 1.9, you already have it. To get newer candy you can still install -the gem, and then requiring "minitest/autorun" should automatically -pull it in. If not, you'll need to do it yourself: - - gem "minitest" # ensures you"re using the gem, and not the built-in MT - require "minitest/autorun" - - # ... usual testing stuffs ... - -DO NOTE: There is a serious problem with the way that ruby 1.9/2.0 -packages their own gems. They install a gem specification file, but -don't install the gem contents in the gem path. This messes up -Gem.find_files and many other things (gem which, gem contents, etc). - -Just install minitest as a gem for real and you'll be happier. - -== LICENSE: - -(The MIT License) - -Copyright (c) Ryan Davis, seattle.rb - -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/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/Rakefile b/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/Rakefile deleted file mode 100644 index 5494d84..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/Rakefile +++ /dev/null @@ -1,75 +0,0 @@ -# -*- ruby -*- - -require "rubygems" -require "hoe" -$:.unshift "lib" # to pick up lib/minitest/test_task.rb when minitest not installed - -Hoe.plugin :seattlerb -Hoe.plugin :rdoc - -Hoe.spec "minitest" do - developer "Ryan Davis", "ryand-ruby@zenspider.com" - - license "MIT" - - require_ruby_version [">= 2.6", "< 4.0"] -end - -desc "Find missing expectations" -task :specs do - $:.unshift "lib" - require "minitest/test" - require "minitest/spec" - - pos_prefix, neg_prefix = "must", "wont" - skip_re = /^(must|wont)$|wont_(throw)|must_(block|not?_|nothing|send|raise$)/x - dont_flip_re = /(must|wont)_(include|respond_to)/ - - map = { - /(must_throw)s/ => '\1', - /(?!not)_same/ => "_be_same_as", - /_in_/ => "_be_within_", - /_operator/ => "_be", - /_includes/ => "_include", - /(must|wont)_(.*_of|nil|silent|empty)/ => '\1_be_\2', - /must_raises/ => "must_raise", - /(must|wont)_predicate/ => '\1_be', - /(must|wont)_path_exists/ => 'path_\1_exist', - } - - expectations = Minitest::Expectations.public_instance_methods.map(&:to_s) - assertions = Minitest::Assertions.public_instance_methods.map(&:to_s) - - assertions.sort.each do |assertion| - expectation = case assertion - when /^assert/ then - assertion.sub(/^assert/, pos_prefix.to_s) - when /^refute/ then - assertion.sub(/^refute/, neg_prefix.to_s) - end - - next unless expectation - next if expectation =~ skip_re - - regexp, replacement = map.find { |re, _| expectation =~ re } - expectation.sub! regexp, replacement if replacement - - next if expectations.include? expectation - - args = [assertion, expectation].map(&:to_sym).map(&:inspect) - args << :reverse if expectation =~ dont_flip_re - - puts - puts "##" - puts "# :method: #{expectation}" - puts "# See Minitest::Assertions##{assertion}" - puts - puts "infect_an_assertion #{args.join ", "}" - end -end - -task :bugs do - sh "for f in bug*.rb ; do echo $f; echo; #{Gem.ruby} -Ilib $f && rm $f ; done" -end - -# vim: syntax=Ruby diff --git a/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/design_rationale.rb b/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/design_rationale.rb deleted file mode 100644 index a3fcc37..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/design_rationale.rb +++ /dev/null @@ -1,52 +0,0 @@ -# Specs: # Equivalent Unit Tests: -############################################################################### -describe Thingy do # class TestThingy < Minitest::Test - before do # def setup - do_some_setup # super - end # do_some_setup - # end - it "should do the first thing" do # - 1.must_equal 1 # def test_first_thing - end # assert_equal 1, 1 - # end - describe SubThingy do # end - before do # - do_more_setup # class TestSubThingy < TestThingy - end # def setup - # super - it "should do the second thing" do # do_more_setup - 2.must_equal 2 # end - end # - end # def test_second_thing -end # assert_equal 2, 2 - # end - # end -############################################################################### -# runs 2 specs # runs 3 tests -############################################################################### -# The specs generate: - -class ThingySpec < Minitest::Spec - def setup - super - do_some_setup - end - - def test_should_do_the_first_thing - assert_equal 1, 1 - end -end - -class SubThingySpec < ThingySpec - def setup - super - do_more_setup - end - - # because only setup/teardown is inherited, not specs - remove_method :test_should_do_the_first_thing - - def test_should_do_the_second_thing - assert_equal 2, 2 - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/test/minitest/metametameta.rb b/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/test/minitest/metametameta.rb deleted file mode 100644 index 69e0940..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/test/minitest/metametameta.rb +++ /dev/null @@ -1,136 +0,0 @@ -require "tempfile" -require "stringio" -require "minitest/autorun" - -class Minitest::Test - def clean s - s.gsub(/^ {6}/, "") - end - - def with_empty_backtrace_filter - original = Minitest.backtrace_filter - - obj = Minitest::BacktraceFilter.new - def obj.filter _bt - [] - end - - Minitest::Test.io_lock.synchronize do # try not to trounce in parallel - begin - Minitest.backtrace_filter = obj - yield - ensure - Minitest.backtrace_filter = original - end - end - end -end - - -class FakeNamedTest < Minitest::Test - @@count = 0 - - def self.name - @fake_name ||= begin - @@count += 1 - "FakeNamedTest%02d" % @@count - end - end -end - -module MyModule; end -class AnError < StandardError; include MyModule; end - -class MetaMetaMetaTestCase < Minitest::Test - attr_accessor :reporter, :output, :tu - - def with_stderr err - old = $stderr - $stderr = err - yield - ensure - $stderr = old - end - - def run_tu_with_fresh_reporter flags = %w[--seed 42] - options = Minitest.process_args flags - - @output = StringIO.new("".encode('UTF-8')) - - self.reporter = Minitest::CompositeReporter.new - reporter << Minitest::SummaryReporter.new(@output, options) - reporter << Minitest::ProgressReporter.new(@output, options) - - with_stderr @output do - reporter.start - - yield(reporter) if block_given? - - @tus ||= [@tu] - @tus.each do |tu| - Minitest::Runnable.runnables.delete tu - - tu.run reporter, options - end - - reporter.report - end - end - - def first_reporter - reporter.reporters.first - end - - def assert_report expected, flags = %w[--seed 42], &block - header = clean <<-EOM - Run options: #{flags.map { |s| s =~ /\|/ ? s.inspect : s }.join " "} - - # Running: - - EOM - - run_tu_with_fresh_reporter flags, &block - - output = normalize_output @output.string.dup - - assert_equal header + expected, output - end - - def normalize_output output - output.sub!(/Finished in .*/, "Finished in 0.00") - output.sub!(/Loaded suite .*/, "Loaded suite blah") - - output.gsub!(/FakeNamedTest\d+/, "FakeNamedTestXX") - output.gsub!(/ = \d+.\d\d s = /, " = 0.00 s = ") - output.gsub!(/0x[A-Fa-f0-9]+/, "0xXXX") - output.gsub!(/ +$/, "") - - if windows? then - output.gsub!(/\[(?:[A-Za-z]:)?[^\]:]+:\d+\]/, "[FILE:LINE]") - output.gsub!(/^(\s+)(?:[A-Za-z]:)?[^:]+:\d+:in/, '\1FILE:LINE:in') - else - output.gsub!(/\[[^\]:]+:\d+\]/, "[FILE:LINE]") - output.gsub!(/^(\s+)[^:]+:\d+:in/, '\1FILE:LINE:in') - end - - output.gsub!(/( at )[^:]+:\d+/, '\1[FILE:LINE]') - - output - end - - def restore_env - old_value = ENV["MT_NO_SKIP_MSG"] - ENV.delete "MT_NO_SKIP_MSG" - - yield - ensure - ENV["MT_NO_SKIP_MSG"] = old_value - end - - def setup - super - Minitest.seed = 42 - Minitest::Test.reset - @tu = nil - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/test/minitest/test_minitest_assertions.rb b/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/test/minitest/test_minitest_assertions.rb deleted file mode 100644 index 37591c1..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/test/minitest/test_minitest_assertions.rb +++ /dev/null @@ -1,1701 +0,0 @@ -# encoding: UTF-8 - -require "minitest/autorun" - -if defined? Encoding then - e = Encoding.default_external - if e != Encoding::UTF_8 then - warn "" - warn "" - warn "NOTE: External encoding #{e} is not UTF-8. Tests WILL fail." - warn " Run tests with `RUBYOPT=-Eutf-8 rake` to avoid errors." - warn "" - warn "" - end -end - -SomeError = Class.new Exception - -unless defined? MyModule then - module MyModule; end - class AnError < StandardError; include MyModule; end -end - -class TestMinitestAssertions < Minitest::Test - # do not call parallelize_me! - teardown accesses @tc._assertions - # which is not threadsafe. Nearly every method in here is an - # assertion test so it isn't worth splitting it out further. - - RUBY18 = !defined? Encoding - - # not included in JRuby - RE_LEVELS = /\(\d+ levels\) / - - class DummyTest - include Minitest::Assertions - # include Minitest::Reportable # TODO: why do I really need this? - - attr_accessor :assertions, :failure - - def initialize - self.assertions = 0 - self.failure = nil - end - end - - def setup - super - - Minitest::Test.reset - - @tc = DummyTest.new - @zomg = "zomg ponies!" # TODO: const - @assertion_count = 1 - end - - def teardown - assert_equal(@assertion_count, @tc.assertions, - "expected #{@assertion_count} assertions to be fired during the test, not #{@tc.assertions}") - end - - def assert_deprecated name - dep = /DEPRECATED: #{name}. From #{__FILE__}:\d+(?::.*)?/ - dep = "" if $-w.nil? - - assert_output nil, dep do - yield - end - end - - def assert_triggered expected, klass = Minitest::Assertion - e = assert_raises klass do - yield - end - - msg = e.message.sub(/(---Backtrace---).*/m, '\1') - msg.gsub!(/\(oid=[-0-9]+\)/, "(oid=N)") - msg.gsub!(/(\d\.\d{6})\d+/, '\1xxx') # normalize: ruby version, impl, platform - - assert_msg = Regexp === expected ? :assert_match : :assert_equal - self.send assert_msg, expected, msg - end - - def assert_unexpected expected - expected = Regexp.new expected if String === expected - - assert_triggered expected, Minitest::UnexpectedError do - yield - end - end - - def clean s - s.gsub(/^ {6,10}/, "") - end - - def non_verbose - orig_verbose = $VERBOSE - $VERBOSE = false - - yield - ensure - $VERBOSE = orig_verbose - end - - def test_assert - @assertion_count = 2 - - @tc.assert_equal true, @tc.assert(true), "returns true on success" - end - - def test_assert__triggered - assert_triggered "Expected false to be truthy." do - @tc.assert false - end - end - - def test_assert__triggered_message - assert_triggered @zomg do - @tc.assert false, @zomg - end - end - - def test_assert__triggered_lambda - assert_triggered "whoops" do - @tc.assert false, lambda { "whoops" } - end - end - - def test_assert_empty - @assertion_count = 2 - - @tc.assert_empty [] - end - - def test_assert_empty_triggered - @assertion_count = 2 - - assert_triggered "Expected [1] to be empty." do - @tc.assert_empty [1] - end - end - - def test_assert_equal - @tc.assert_equal 1, 1 - end - - def test_assert_equal_different_collection_array_hex_invisible - object1 = Object.new - object2 = Object.new - msg = "No visible difference in the Array#inspect output. - You should look at the implementation of #== on Array or its members. - [#]".gsub(/^ +/, "") - assert_triggered msg do - @tc.assert_equal [object1], [object2] - end - end - - def test_assert_equal_different_collection_hash_hex_invisible - h1, h2 = {}, {} - h1[1] = Object.new - h2[1] = Object.new - msg = "No visible difference in the Hash#inspect output. - You should look at the implementation of #== on Hash or its members. - {1=>#}".gsub(/^ +/, "") - - assert_triggered msg do - @tc.assert_equal h1, h2 - end - end - - def test_assert_equal_different_diff_deactivated - without_diff do - assert_triggered util_msg("haha" * 10, "blah" * 10) do - o1 = "haha" * 10 - o2 = "blah" * 10 - - @tc.assert_equal o1, o2 - end - end - end - - def test_assert_equal_different_message - assert_triggered "whoops.\nExpected: 1\n Actual: 2" do - @tc.assert_equal 1, 2, message { "whoops" } - end - end - - def test_assert_equal_different_lambda - assert_triggered "whoops.\nExpected: 1\n Actual: 2" do - @tc.assert_equal 1, 2, lambda { "whoops" } - end - end - - def test_assert_equal_different_hex - c = Class.new do - def initialize s; @name = s; end - end - - o1 = c.new "a" - o2 = c.new "b" - msg = clean <<-EOS - --- expected - +++ actual - @@ -1 +1 @@ - -#<#:0xXXXXXX @name=\"a\"> - +#<#:0xXXXXXX @name=\"b\"> - EOS - - assert_triggered msg do - @tc.assert_equal o1, o2 - end - end - - def test_assert_equal_different_hex_invisible - o1 = Object.new - o2 = Object.new - - msg = "No visible difference in the Object#inspect output. - You should look at the implementation of #== on Object or its members. - #".gsub(/^ +/, "") - - assert_triggered msg do - @tc.assert_equal o1, o2 - end - end - - def test_assert_equal_different_long - msg = "--- expected - +++ actual - @@ -1 +1 @@ - -\"hahahahahahahahahahahahahahahahahahahaha\" - +\"blahblahblahblahblahblahblahblahblahblah\" - ".gsub(/^ +/, "") - - assert_triggered msg do - o1 = "haha" * 10 - o2 = "blah" * 10 - - @tc.assert_equal o1, o2 - end - end - - def test_assert_equal_different_long_invisible - msg = "No visible difference in the String#inspect output. - You should look at the implementation of #== on String or its members. - \"blahblahblahblahblahblahblahblahblahblah\"".gsub(/^ +/, "") - - assert_triggered msg do - o1 = "blah" * 10 - o2 = "blah" * 10 - def o1.== _ - false - end - @tc.assert_equal o1, o2 - end - end - - def test_assert_equal_different_long_msg - msg = "message. - --- expected - +++ actual - @@ -1 +1 @@ - -\"hahahahahahahahahahahahahahahahahahahaha\" - +\"blahblahblahblahblahblahblahblahblahblah\" - ".gsub(/^ +/, "") - - assert_triggered msg do - o1 = "haha" * 10 - o2 = "blah" * 10 - @tc.assert_equal o1, o2, "message" - end - end - - def test_assert_equal_different_short - assert_triggered util_msg(1, 2) do - @tc.assert_equal 1, 2 - end - end - - def test_assert_equal_different_short_msg - assert_triggered util_msg(1, 2, "message") do - @tc.assert_equal 1, 2, "message" - end - end - - def test_assert_equal_different_short_multiline - msg = "--- expected\n+++ actual\n@@ -1,2 +1,2 @@\n \"a\n-b\"\n+c\"\n" - assert_triggered msg do - @tc.assert_equal "a\nb", "a\nc" - end - end - - def test_assert_equal_does_not_allow_lhs_nil - if Minitest::VERSION =~ /^6/ then - warn "Time to strip the MT5 test" - - @assertion_count += 1 - assert_triggered(/Use assert_nil if expecting nil/) do - @tc.assert_equal nil, nil - end - else - err_re = /Use assert_nil if expecting nil from .*test_minitest_\w+.rb/ - err_re = "" if $-w.nil? - - assert_output "", err_re do - @tc.assert_equal nil, nil - end - end - end - - def test_assert_equal_does_not_allow_lhs_nil_triggered - assert_triggered "Expected: nil\n Actual: false" do - @tc.assert_equal nil, false - end - end - - def test_assert_equal_string_bug791 - exp = <<-'EOF'.gsub(/^ {10}/, "") # note single quotes - --- expected - +++ actual - @@ -1,2 +1 @@ - -"\\n - -" - +"\\\" - EOF - - exp = "Expected: \"\\\\n\"\n Actual: \"\\\\\"" - assert_triggered exp do - @tc.assert_equal "\\n", "\\" - end - end - - def test_assert_equal_string_both_escaped_unescaped_newlines - msg = <<-EOM.gsub(/^ {10}/, "") - --- expected - +++ actual - @@ -1,2 +1 @@ - -\"A\\n - -B\" - +\"A\\n\\\\nB\" - EOM - - assert_triggered msg do - exp = "A\\nB" - act = "A\n\\nB" - - @tc.assert_equal exp, act - end - end - - def test_assert_equal_string_encodings - msg = <<-EOM.gsub(/^ {10}/, "") - --- expected - +++ actual - @@ -1,3 +1,3 @@ - -# encoding: UTF-8 - -# valid: false - +# encoding: #{Encoding::BINARY.name} - +# valid: true - "bad-utf8-\\xF1.txt" - EOM - - assert_triggered msg do - x = "bad-utf8-\xF1.txt" - y = x.dup.force_encoding "binary" # TODO: switch to .b when 1.9 dropped - @tc.assert_equal x, y - end - end unless RUBY18 - - def test_assert_equal_string_encodings_both_different - msg = <<-EOM.gsub(/^ {10}/, "") - --- expected - +++ actual - @@ -1,3 +1,3 @@ - -# encoding: US-ASCII - -# valid: false - +# encoding: #{Encoding::BINARY.name} - +# valid: true - "bad-utf8-\\xF1.txt" - EOM - - assert_triggered msg do - x = "bad-utf8-\xF1.txt".force_encoding "ASCII" - y = x.dup.force_encoding "binary" # TODO: switch to .b when 1.9 dropped - @tc.assert_equal x, y - end - end unless RUBY18 - - def test_assert_equal_unescape_newlines - msg = <<-'EOM'.gsub(/^ {10}/, "") # NOTE single quotes on heredoc - --- expected - +++ actual - @@ -1,2 +1,2 @@ - -"hello - +"hello\n - world" - EOM - - assert_triggered msg do - exp = "hello\nworld" - act = 'hello\nworld' # notice single quotes - - @tc.assert_equal exp, act - end - end - - def test_assert_in_delta - @tc.assert_in_delta 0.0, 1.0 / 1000, 0.1 - end - - def test_assert_in_delta_triggered - x = "1.0e-06" - assert_triggered "Expected |0.0 - 0.001| (0.001) to be <= #{x}." do - @tc.assert_in_delta 0.0, 1.0 / 1000, 0.000001 - end - end - - def test_assert_in_epsilon - @assertion_count = 10 - - @tc.assert_in_epsilon 10_000, 9991 - @tc.assert_in_epsilon 9991, 10_000 - @tc.assert_in_epsilon 1.0, 1.001 - @tc.assert_in_epsilon 1.001, 1.0 - - @tc.assert_in_epsilon 10_000, 9999.1, 0.0001 - @tc.assert_in_epsilon 9999.1, 10_000, 0.0001 - @tc.assert_in_epsilon 1.0, 1.0001, 0.0001 - @tc.assert_in_epsilon 1.0001, 1.0, 0.0001 - - @tc.assert_in_epsilon(-1, -1) - @tc.assert_in_epsilon(-10_000, -9991) - end - - def test_assert_in_epsilon_triggered - assert_triggered "Expected |10000 - 9990| (10) to be <= 9.99." do - @tc.assert_in_epsilon 10_000, 9990 - end - end - - def test_assert_in_epsilon_triggered_negative_case - x = (RUBY18 and not maglev?) ? "0.1" : "0.100000xxx" - y = "0.1" - assert_triggered "Expected |-1.1 - -1| (#{x}) to be <= #{y}." do - @tc.assert_in_epsilon(-1.1, -1, 0.1) - end - end - - def test_assert_includes - @assertion_count = 2 - - @tc.assert_includes [true], true - end - - def test_assert_includes_triggered - @assertion_count = 3 - - e = @tc.assert_raises Minitest::Assertion do - @tc.assert_includes [true], false - end - - expected = "Expected [true] to include false." - assert_equal expected, e.message - end - - def test_assert_instance_of - @tc.assert_instance_of String, "blah" - end - - def test_assert_instance_of_triggered - assert_triggered 'Expected "blah" to be an instance of Array, not String.' do - @tc.assert_instance_of Array, "blah" - end - end - - def test_assert_kind_of - @tc.assert_kind_of String, "blah" - end - - def test_assert_kind_of_triggered - assert_triggered 'Expected "blah" to be a kind of Array, not String.' do - @tc.assert_kind_of Array, "blah" - end - end - - def test_assert_match - @assertion_count = 2 - m = @tc.assert_match(/\w+/, "blah blah blah") - - assert_kind_of MatchData, m - assert_equal "blah", m[0] - end - - def test_assert_match_matchee_to_str - @assertion_count = 2 - - obj = Object.new - def obj.to_str; "blah" end - - @tc.assert_match "blah", obj - end - - def test_assert_match_matcher_object - @assertion_count = 2 - - pattern = Object.new - def pattern.=~ _; true end - - @tc.assert_match pattern, 5 - end - - def test_assert_match_object_triggered - @assertion_count = 2 - - pattern = Object.new - def pattern.=~ _; false end - def pattern.inspect; "[Object]" end - - assert_triggered "Expected [Object] to match 5." do - @tc.assert_match pattern, 5 - end - end - - def test_assert_match_triggered - @assertion_count = 2 - assert_triggered 'Expected /\d+/ to match "blah blah blah".' do - @tc.assert_match(/\d+/, "blah blah blah") - end - end - - def test_assert_nil - @tc.assert_nil nil - end - - def test_assert_nil_triggered - assert_triggered "Expected 42 to be nil." do - @tc.assert_nil 42 - end - end - - def test_assert_operator - @tc.assert_operator 2, :>, 1 - end - - def test_assert_operator_bad_object - bad = Object.new - def bad.== _; true end - - @tc.assert_operator bad, :equal?, bad - end - - def test_assert_operator_triggered - assert_triggered "Expected 2 to be < 1." do - @tc.assert_operator 2, :<, 1 - end - end - - def test_assert_output_both - @assertion_count = 2 - - @tc.assert_output "yay", "blah" do - print "yay" - $stderr.print "blah" - end - end - - def test_assert_output_both_regexps - @assertion_count = 4 - - @tc.assert_output(/y.y/, /bl.h/) do - print "yay" - $stderr.print "blah" - end - end - - def test_assert_output_err - @tc.assert_output nil, "blah" do - $stderr.print "blah" - end - end - - def test_assert_output_neither - @assertion_count = 0 - - @tc.assert_output do - # do nothing - end - end - - def test_assert_output_out - @tc.assert_output "blah" do - print "blah" - end - end - - def test_assert_output_triggered_both - assert_triggered util_msg("blah", "blah blah", "In stderr") do - @tc.assert_output "yay", "blah" do - print "boo" - $stderr.print "blah blah" - end - end - end - - def test_assert_output_triggered_err - assert_triggered util_msg("blah", "blah blah", "In stderr") do - @tc.assert_output nil, "blah" do - $stderr.print "blah blah" - end - end - end - - def test_assert_output_triggered_out - assert_triggered util_msg("blah", "blah blah", "In stdout") do - @tc.assert_output "blah" do - print "blah blah" - end - end - end - - def test_assert_output_no_block - assert_triggered "assert_output requires a block to capture output." do - @tc.assert_output "blah" - end - end - - def test_assert_output_nested_assert_uncaught - @assertion_count = 1 - - assert_triggered "Epic Fail!" do - @tc.assert_output "blah\n" do - puts "blah" - @tc.flunk - end - end - end - - def test_assert_output_nested_raise - @assertion_count = 2 - - @tc.assert_output "blah\n" do - @tc.assert_raises RuntimeError do - puts "blah" - raise "boom!" - end - end - end - - def test_assert_output_nested_raise_bad - @assertion_count = 0 - - assert_unexpected "boom!" do - @tc.assert_raises do # 2) bypassed via UnexpectedError - @tc.assert_output "blah\n" do # 1) captures and raises UnexpectedError - puts "not_blah" - raise "boom!" - end - end - end - end - - def test_assert_output_nested_raise_mismatch - # this test is redundant, but illustrative - @assertion_count = 0 - - assert_unexpected "boom!" do - @tc.assert_raises RuntimeError do # 2) bypassed via UnexpectedError - @tc.assert_output "blah\n" do # 1) captures and raises UnexpectedError - puts "not_blah" - raise ArgumentError, "boom!" - end - end - end - end - - def test_assert_output_nested_throw_caught - @assertion_count = 2 - - @tc.assert_output "blah\n" do - @tc.assert_throws :boom! do - puts "blah" - throw :boom! - end - end - end - - def test_assert_output_nested_throw_caught_bad - @assertion_count = 1 # want 0; can't prevent throw from escaping :( - - @tc.assert_throws :boom! do # 2) captured via catch - @tc.assert_output "blah\n" do # 1) bypassed via throw - puts "not_blah" - throw :boom! - end - end - end - - def test_assert_output_nested_throw_mismatch - @assertion_count = 0 - - assert_unexpected "uncaught throw :boom!" do - @tc.assert_throws :not_boom! do # 2) captured via assert_throws+rescue - @tc.assert_output "blah\n" do # 1) bypassed via throw - puts "not_blah" - throw :boom! - end - end - end - end - - def test_assert_output_uncaught_raise - @assertion_count = 0 - - assert_unexpected "RuntimeError: boom!" do - @tc.assert_output "blah\n" do - puts "not_blah" - raise "boom!" - end - end - end - - def test_assert_output_uncaught_throw - @assertion_count = 0 - - assert_unexpected "uncaught throw :boom!" do - @tc.assert_output "blah\n" do - puts "not_blah" - throw :boom! - end - end - end - def test_assert_predicate - @tc.assert_predicate "", :empty? - end - - def test_assert_predicate_triggered - assert_triggered 'Expected "blah" to be empty?.' do - @tc.assert_predicate "blah", :empty? - end - end - - def test_assert_raises - @tc.assert_raises RuntimeError do - raise "blah" - end - end - - def test_assert_raises_default - @tc.assert_raises do - raise StandardError, "blah" - end - end - - def test_assert_raises_default_triggered - e = assert_raises Minitest::Assertion do - @tc.assert_raises do - raise SomeError, "blah" - end - end - - expected = clean <<-EOM.chomp - [StandardError] exception expected, not - Class: - Message: <\"blah\"> - ---Backtrace--- - FILE:LINE:in \`block in test_assert_raises_default_triggered\' - --------------- - EOM - - actual = e.message.gsub(/^.+:\d+/, "FILE:LINE") - actual.gsub!(RE_LEVELS, "") unless jruby? - - assert_equal expected, actual - end - - def test_assert_raises_exit - @tc.assert_raises SystemExit do - exit 1 - end - end - - def test_assert_raises_module - @tc.assert_raises MyModule do - raise AnError - end - end - - def test_assert_raises_signals - @tc.assert_raises SignalException do - raise SignalException, :INT - end - end - - def test_assert_raises_throw_nested_bad - @assertion_count = 0 - - assert_unexpected "RuntimeError: boom!" do - @tc.assert_raises do - @tc.assert_throws :blah do - raise "boom!" - throw :not_blah - end - end - end - end - - ## - # *sigh* This is quite an odd scenario, but it is from real (albeit - # ugly) test code in ruby-core: - - # https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=29259 - - def test_assert_raises_skip - @assertion_count = 0 - - assert_triggered "skipped", Minitest::Skip do - @tc.assert_raises ArgumentError do - begin - raise "blah" - rescue - skip "skipped" - end - end - end - end - - def test_assert_raises_subclass - @tc.assert_raises StandardError do - raise AnError - end - end - - def test_assert_raises_subclass_triggered - e = assert_raises Minitest::Assertion do - @tc.assert_raises SomeError do - raise AnError, "some message" - end - end - - expected = clean <<-EOM - [SomeError] exception expected, not - Class: - Message: <\"some message\"> - ---Backtrace--- - FILE:LINE:in \`block in test_assert_raises_subclass_triggered\' - --------------- - EOM - - actual = e.message.gsub(/^.+:\d+/, "FILE:LINE") - actual.gsub!(RE_LEVELS, "") unless jruby? - - assert_equal expected.chomp, actual - end - - def test_assert_raises_triggered_different - e = assert_raises Minitest::Assertion do - @tc.assert_raises RuntimeError do - raise SyntaxError, "icky" - end - end - - expected = clean <<-EOM.chomp - [RuntimeError] exception expected, not - Class: - Message: <\"icky\"> - ---Backtrace--- - FILE:LINE:in \`block in test_assert_raises_triggered_different\' - --------------- - EOM - - actual = e.message.gsub(/^.+:\d+/, "FILE:LINE") - actual.gsub!(RE_LEVELS, "") unless jruby? - - assert_equal expected, actual - end - - def test_assert_raises_triggered_different_msg - e = assert_raises Minitest::Assertion do - @tc.assert_raises RuntimeError, "XXX" do - raise SyntaxError, "icky" - end - end - - expected = clean <<-EOM - XXX. - [RuntimeError] exception expected, not - Class: - Message: <\"icky\"> - ---Backtrace--- - FILE:LINE:in \`block in test_assert_raises_triggered_different_msg\' - --------------- - EOM - - actual = e.message.gsub(/^.+:\d+/, "FILE:LINE") - actual.gsub!(RE_LEVELS, "") unless jruby? - - assert_equal expected.chomp, actual - end - - def test_assert_raises_triggered_none - e = assert_raises Minitest::Assertion do - @tc.assert_raises Minitest::Assertion do - # do nothing - end - end - - expected = "Minitest::Assertion expected but nothing was raised." - - assert_equal expected, e.message - end - - def test_assert_raises_triggered_none_msg - e = assert_raises Minitest::Assertion do - @tc.assert_raises Minitest::Assertion, "XXX" do - # do nothing - end - end - - expected = "XXX.\nMinitest::Assertion expected but nothing was raised." - - assert_equal expected, e.message - end - - def test_assert_raises_without_block - assert_triggered "assert_raises requires a block to capture errors." do - @tc.assert_raises StandardError - end - end - - def test_assert_respond_to - @tc.assert_respond_to "blah", :empty? - end - - def test_assert_respond_to_triggered - assert_triggered 'Expected "blah" (String) to respond to #rawr!.' do - @tc.assert_respond_to "blah", :rawr! - end - end - - def test_assert_same - @assertion_count = 3 - - o = "blah" - @tc.assert_same 1, 1 - @tc.assert_same :blah, :blah - @tc.assert_same o, o - end - - def test_assert_same_triggered - @assertion_count = 2 - - assert_triggered "Expected 2 (oid=N) to be the same as 1 (oid=N)." do - @tc.assert_same 1, 2 - end - - s1 = "blah" - s2 = "blah" - - assert_triggered 'Expected "blah" (oid=N) to be the same as "blah" (oid=N).' do - @tc.assert_same s1, s2 - end - end - - def test_assert_send - assert_deprecated :assert_send do - @tc.assert_send [1, :<, 2] - end - end - - def test_assert_send_bad - assert_deprecated :assert_send do - assert_triggered "Expected 1.>(*[2]) to return true." do - @tc.assert_send [1, :>, 2] - end - end - end - - def test_assert_silent - @assertion_count = 2 - - @tc.assert_silent do - # do nothing - end - end - - def test_assert_silent_triggered_err - assert_triggered util_msg("", "blah blah", "In stderr") do - @tc.assert_silent do - $stderr.print "blah blah" - end - end - end - - def test_assert_silent_triggered_out - @assertion_count = 2 - - assert_triggered util_msg("", "blah blah", "In stdout") do - @tc.assert_silent do - print "blah blah" - end - end - end - - def test_assert_throws - v = @tc.assert_throws :blah do - throw :blah - end - - assert_nil v - end - - def test_assert_throws_value - v = @tc.assert_throws :blah do - throw :blah, 42 - end - - assert_equal 42, v - end - - def test_assert_throws_argument_exception - @assertion_count = 0 - - assert_unexpected "ArgumentError" do - @tc.assert_throws :blah do - raise ArgumentError - end - end - end - - def test_assert_throws_different - assert_triggered "Expected :blah to have been thrown, not :not_blah." do - @tc.assert_throws :blah do - throw :not_blah - end - end - end - - def test_assert_throws_name_error - @assertion_count = 0 - - assert_unexpected "NameError" do - @tc.assert_throws :blah do - raise NameError - end - end - end - - def test_assert_throws_unthrown - assert_triggered "Expected :blah to have been thrown." do - @tc.assert_throws :blah do - # do nothing - end - end - end - - def test_assert_path_exists - @tc.assert_path_exists __FILE__ - end - - def test_assert_path_exists_triggered - assert_triggered "Expected path 'blah' to exist." do - @tc.assert_path_exists "blah" - end - end - - def test_assert_pattern - if RUBY_VERSION > "3" then - @tc.assert_pattern do - exp = if RUBY_VERSION.start_with? "3.0" - "(eval):1: warning: One-line pattern matching is experimental, and the behavior may change in future versions of Ruby!\n" - else - "" - end - assert_output nil, exp do - eval "[1,2,3] => [Integer, Integer, Integer]" # eval to escape parser for ruby<3 - end - end - else - @assertion_count = 0 - - assert_raises NotImplementedError do - @tc.assert_pattern do - # do nothing - end - end - end - end - - def test_assert_pattern_traps_nomatchingpatternerror - skip unless RUBY_VERSION > "3" - exp = if RUBY_VERSION.start_with? "3.0" then - "[1, 2, 3]" # terrible error message! - else - /length mismatch/ - end - - assert_triggered exp do - @tc.assert_pattern do - capture_io do # 3.0 is noisy - eval "[1,2,3] => [Integer, Integer]" # eval to escape parser for ruby<3 - end - end - end - end - - def test_assert_pattern_raises_other_exceptions - skip unless RUBY_VERSION >= "3.0" - - @assertion_count = 0 - - assert_raises RuntimeError do - @tc.assert_pattern do - raise "boom" - end - end - end - - def test_assert_pattern_with_no_block - skip unless RUBY_VERSION >= "3.0" - - assert_triggered "assert_pattern requires a block to capture errors." do - @tc.assert_pattern - end - end - - def test_capture_io - @assertion_count = 0 - - non_verbose do - out, err = capture_io do - puts "hi" - $stderr.puts "bye!" - end - - assert_equal "hi\n", out - assert_equal "bye!\n", err - end - end - - def test_capture_subprocess_io - @assertion_count = 0 - - non_verbose do - out, err = capture_subprocess_io do - system("echo hi") - system("echo bye! 1>&2") - end - - assert_equal "hi\n", out - assert_equal "bye!", err.strip - end - end - - def test_class_asserts_match_refutes - @assertion_count = 0 - - methods = Minitest::Assertions.public_instance_methods - methods.map!(&:to_s) if Symbol === methods.first - - # These don't have corresponding refutes _on purpose_. They're - # useless and will never be added, so don't bother. - ignores = %w[assert_output assert_raises assert_send - assert_silent assert_throws assert_mock] - - # These are test/unit methods. I'm not actually sure why they're still here - ignores += %w[assert_no_match assert_not_equal assert_not_nil - assert_not_same assert_nothing_raised - assert_nothing_thrown assert_raise] - - asserts = methods.grep(/^assert/).sort - ignores - refutes = methods.grep(/^refute/).sort - ignores - - assert_empty refutes.map { |n| n.sub(/^refute/, "assert") } - asserts - assert_empty asserts.map { |n| n.sub(/^assert/, "refute") } - refutes - end - - def test_delta_consistency - @assertion_count = 2 - - @tc.assert_in_delta 0, 1, 1 - - assert_triggered "Expected |0 - 1| (1) to not be <= 1." do - @tc.refute_in_delta 0, 1, 1 - end - end - - def test_epsilon_consistency - @assertion_count = 2 - - @tc.assert_in_epsilon 1.0, 1.001 - - msg = "Expected |1.0 - 1.001| (0.000999xxx) to not be <= 0.001." - assert_triggered msg do - @tc.refute_in_epsilon 1.0, 1.001 - end - end - - def assert_fail_after t - @tc.fail_after t.year, t.month, t.day, "remove the deprecations" - end - - def test_fail_after - d0 = Time.now - d1 = d0 + 86_400 # I am an idiot - - assert_silent do - assert_fail_after d1 - end - - assert_triggered "remove the deprecations" do - assert_fail_after d0 - end - end - - def test_flunk - assert_triggered "Epic Fail!" do - @tc.flunk - end - end - - def test_flunk_message - assert_triggered @zomg do - @tc.flunk @zomg - end - end - - def test_pass - @tc.pass - end - - def test_refute - @assertion_count = 2 - - @tc.assert_equal true, @tc.refute(false), "returns true on success" - end - - def test_refute_empty - @assertion_count = 2 - - @tc.refute_empty [1] - end - - def test_refute_empty_triggered - @assertion_count = 2 - - assert_triggered "Expected [] to not be empty." do - @tc.refute_empty [] - end - end - - def test_refute_equal - @tc.refute_equal "blah", "yay" - end - - def test_refute_equal_triggered - assert_triggered 'Expected "blah" to not be equal to "blah".' do - @tc.refute_equal "blah", "blah" - end - end - - def test_refute_in_delta - @tc.refute_in_delta 0.0, 1.0 / 1000, 0.000001 - end - - def test_refute_in_delta_triggered - x = "0.1" - assert_triggered "Expected |0.0 - 0.001| (0.001) to not be <= #{x}." do - @tc.refute_in_delta 0.0, 1.0 / 1000, 0.1 - end - end - - def test_refute_in_epsilon - @tc.refute_in_epsilon 10_000, 9990-1 - end - - def test_refute_in_epsilon_triggered - assert_triggered "Expected |10000 - 9990| (10) to not be <= 10.0." do - @tc.refute_in_epsilon 10_000, 9990 - flunk - end - end - - def test_refute_includes - @assertion_count = 2 - - @tc.refute_includes [true], false - end - - def test_refute_includes_triggered - @assertion_count = 3 - - e = @tc.assert_raises Minitest::Assertion do - @tc.refute_includes [true], true - end - - expected = "Expected [true] to not include true." - assert_equal expected, e.message - end - - def test_refute_instance_of - @tc.refute_instance_of Array, "blah" - end - - def test_refute_instance_of_triggered - assert_triggered 'Expected "blah" to not be an instance of String.' do - @tc.refute_instance_of String, "blah" - end - end - - def test_refute_kind_of - @tc.refute_kind_of Array, "blah" - end - - def test_refute_kind_of_triggered - assert_triggered 'Expected "blah" to not be a kind of String.' do - @tc.refute_kind_of String, "blah" - end - end - - def test_refute_match - @assertion_count = 2 - @tc.refute_match(/\d+/, "blah blah blah") - end - - def test_refute_match_matcher_object - @assertion_count = 2 - pattern = Object.new - def pattern.=~ _; false end - @tc.refute_match pattern, 5 - end - - def test_refute_match_object_triggered - @assertion_count = 2 - - pattern = Object.new - def pattern.=~ _; true end - def pattern.inspect; "[Object]" end - - assert_triggered "Expected [Object] to not match 5." do - @tc.refute_match pattern, 5 - end - end - - def test_refute_match_triggered - @assertion_count = 2 - assert_triggered 'Expected /\w+/ to not match "blah blah blah".' do - @tc.refute_match(/\w+/, "blah blah blah") - end - end - - def test_refute_nil - @tc.refute_nil 42 - end - - def test_refute_nil_triggered - assert_triggered "Expected nil to not be nil." do - @tc.refute_nil nil - end - end - - def test_refute_operator - @tc.refute_operator 2, :<, 1 - end - - def test_refute_operator_bad_object - bad = Object.new - def bad.== _; true end - - @tc.refute_operator true, :equal?, bad - end - - def test_refute_operator_triggered - assert_triggered "Expected 2 to not be > 1." do - @tc.refute_operator 2, :>, 1 - end - end - - def test_refute_pattern - if RUBY_VERSION >= "3.0" - @tc.refute_pattern do - capture_io do # 3.0 is noisy - eval "[1,2,3] => [Integer, Integer, String]" - end - end - else - @assertion_count = 0 - - assert_raises NotImplementedError do - @tc.refute_pattern do - eval "[1,2,3] => [Integer, Integer, String]" - end - end - end - end - - def test_refute_pattern_expects_nomatchingpatternerror - skip unless RUBY_VERSION > "3" - - assert_triggered(/NoMatchingPatternError expected, but nothing was raised./) do - @tc.refute_pattern do - capture_io do # 3.0 is noisy - eval "[1,2,3] => [Integer, Integer, Integer]" - end - end - end - end - - def test_refute_pattern_raises_other_exceptions - skip unless RUBY_VERSION >= "3.0" - - @assertion_count = 0 - - assert_raises RuntimeError do - @tc.refute_pattern do - raise "boom" - end - end - end - - def test_refute_pattern_with_no_block - skip unless RUBY_VERSION >= "3.0" - - assert_triggered "refute_pattern requires a block to capture errors." do - @tc.refute_pattern - end - end - - def test_refute_predicate - @tc.refute_predicate "42", :empty? - end - - def test_refute_predicate_triggered - assert_triggered 'Expected "" to not be empty?.' do - @tc.refute_predicate "", :empty? - end - end - - def test_refute_respond_to - @tc.refute_respond_to "blah", :rawr! - end - - def test_refute_respond_to_triggered - assert_triggered 'Expected "blah" to not respond to empty?.' do - @tc.refute_respond_to "blah", :empty? - end - end - - def test_refute_same - @tc.refute_same 1, 2 - end - - def test_refute_same_triggered - assert_triggered "Expected 1 (oid=N) to not be the same as 1 (oid=N)." do - @tc.refute_same 1, 1 - end - end - - def test_refute_path_exists - @tc.refute_path_exists "blah" - end - - def test_refute_path_exists_triggered - assert_triggered "Expected path '#{__FILE__}' to not exist." do - @tc.refute_path_exists __FILE__ - end - end - - def test_skip - @assertion_count = 0 - - assert_triggered "haha!", Minitest::Skip do - @tc.skip "haha!" - end - end - - def assert_skip_until t, msg - @tc.skip_until t.year, t.month, t.day, msg - end - - def test_skip_until - @assertion_count = 0 - - d0 = Time.now - d1 = d0 + 86_400 # I am an idiot - - assert_output "", /Stale skip_until \"not yet\" at .*?:\d+$/ do - assert_skip_until d0, "not yet" - end - - assert_triggered "not ready yet", Minitest::Skip do - assert_skip_until d1, "not ready yet" - end - end - - def util_msg exp, act, msg = nil - s = "Expected: #{exp.inspect}\n Actual: #{act.inspect}" - s = "#{msg}.\n#{s}" if msg - s - end - - def without_diff - old_diff = Minitest::Assertions.diff - Minitest::Assertions.diff = nil - - yield - ensure - Minitest::Assertions.diff = old_diff - end -end - -class TestMinitestAssertionHelpers < Minitest::Test - def assert_mu_pp exp, input, raw = false - act = mu_pp input - - if String === input && !raw then - assert_equal "\"#{exp}\"", act - else - assert_equal exp, act - end - end - - def assert_mu_pp_for_diff exp, input, raw = false - act = mu_pp_for_diff input - - if String === input && !raw then - assert_equal "\"#{exp}\"", act - else - assert_equal exp, act - end - end - - def test_diff_equal - msg = "No visible difference in the String#inspect output. - You should look at the implementation of #== on String or its members. - \"blahblahblahblahblahblahblahblahblahblah\"".gsub(/^ +/, "") - - o1 = "blah" * 10 - o2 = "blah" * 10 - def o1.== _ - false - end - - assert_equal msg, diff(o1, o2) - end - - def test_diff_str_mixed - msg = <<-'EOM'.gsub(/^ {10}/, "") # NOTE single quotes on heredoc - --- expected - +++ actual - @@ -1 +1 @@ - -"A\\n\nB" - +"A\n\\nB" - EOM - - exp = "A\\n\nB" - act = "A\n\\nB" - - assert_equal msg, diff(exp, act) - end - - def test_diff_str_multiline - msg = <<-'EOM'.gsub(/^ {10}/, "") # NOTE single quotes on heredoc - --- expected - +++ actual - @@ -1,2 +1,2 @@ - "A - -B" - +C" - EOM - - exp = "A\nB" - act = "A\nC" - - assert_equal msg, diff(exp, act) - end - - def test_diff_str_simple - msg = <<-'EOM'.gsub(/^ {10}/, "").chomp # NOTE single quotes on heredoc - Expected: "A" - Actual: "B" - EOM - - exp = "A" - act = "B" - - assert_equal msg, diff(exp, act) - end - - def test_message - assert_equal "blah2.", message { "blah2" }.call - assert_equal "blah2.", message("") { "blah2" }.call - assert_equal "blah1.\nblah2.", message(:blah1) { "blah2" }.call - assert_equal "blah1.\nblah2.", message("blah1") { "blah2" }.call - - message = proc { "blah1" } - assert_equal "blah1.\nblah2.", message(message) { "blah2" }.call - - message = message { "blah1" } - assert_equal "blah1.\nblah2.", message(message) { "blah2" }.call - end - - def test_message_deferred - var = nil - - msg = message { var = "blah" } - - assert_nil var - - msg.call - - assert_equal "blah", var - end - - def test_mu_pp - assert_mu_pp 42.inspect, 42 - assert_mu_pp %w[a b c].inspect, %w[a b c] - assert_mu_pp "A B", "A B" - assert_mu_pp "A\\nB", "A\nB" - assert_mu_pp "A\\\\nB", 'A\nB' # notice single quotes - end - - def test_mu_pp_for_diff - assert_mu_pp_for_diff "#", Object.new - assert_mu_pp_for_diff "A B", "A B" - assert_mu_pp_for_diff [1, 2, 3].inspect, [1, 2, 3] - assert_mu_pp_for_diff "A\nB", "A\nB" - end - - def test_mu_pp_for_diff_str_bad_encoding - str = "\666".force_encoding Encoding::UTF_8 - exp = "# encoding: UTF-8\n# valid: false\n\"\\xB6\"" - - assert_mu_pp_for_diff exp, str, :raw - end - - def test_mu_pp_for_diff_str_bad_encoding_both - str = "\666A\\n\nB".force_encoding Encoding::UTF_8 - exp = "# encoding: UTF-8\n# valid: false\n\"\\xB6A\\\\n\\nB\"" - - assert_mu_pp_for_diff exp, str, :raw - end - - def test_mu_pp_for_diff_str_encoding - str = "A\nB".b - exp = "# encoding: #{Encoding::BINARY.name}\n# valid: true\n\"A\nB\"" - - assert_mu_pp_for_diff exp, str, :raw - end - - def test_mu_pp_for_diff_str_encoding_both - str = "A\\n\nB".b - exp = "# encoding: #{Encoding::BINARY.name}\n# valid: true\n\"A\\\\n\\nB\"" - - assert_mu_pp_for_diff exp, str, :raw - end - - def test_mu_pp_for_diff_str_nerd - assert_mu_pp_for_diff "A\\nB\\\\nC", "A\nB\\nC" - assert_mu_pp_for_diff "\\nB\\\\nC", "\nB\\nC" - assert_mu_pp_for_diff "\\nB\\\\n", "\nB\\n" - assert_mu_pp_for_diff "\\n\\\\n", "\n\\n" - assert_mu_pp_for_diff "\\\\n\\n", "\\n\n" - assert_mu_pp_for_diff "\\\\nB\\n", "\\nB\n" - assert_mu_pp_for_diff "\\\\nB\\nC", "\\nB\nC" - assert_mu_pp_for_diff "A\\\\n\\nB", "A\\n\nB" - assert_mu_pp_for_diff "A\\n\\\\nB", "A\n\\nB" - assert_mu_pp_for_diff "\\\\n\\n", "\\n\n" - assert_mu_pp_for_diff "\\n\\\\n", "\n\\n" - end - - def test_mu_pp_for_diff_str_normal - assert_mu_pp_for_diff "", "" - assert_mu_pp_for_diff "A\\n\n", "A\\n" - assert_mu_pp_for_diff "A\\n\nB", "A\\nB" - assert_mu_pp_for_diff "A\n", "A\n" - assert_mu_pp_for_diff "A\nB", "A\nB" - assert_mu_pp_for_diff "\\n\n", "\\n" - assert_mu_pp_for_diff "\n", "\n" - assert_mu_pp_for_diff "\\n\nA", "\\nA" - assert_mu_pp_for_diff "\nA", "\nA" - end - - def test_mu_pp_str_bad_encoding - str = "\666".force_encoding Encoding::UTF_8 - exp = "# encoding: UTF-8\n# valid: false\n\"\\xB6\"" - - assert_mu_pp exp, str, :raw - end - - def test_mu_pp_str_encoding - str = "A\nB".b - exp = "# encoding: #{Encoding::BINARY.name}\n# valid: true\n\"A\\nB\"" - - assert_mu_pp exp, str, :raw - end - - def test_mu_pp_str_immutable - printer = Class.new { extend Minitest::Assertions } - str = "test".freeze - assert_equal '"test"', printer.mu_pp(str) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/test/minitest/test_minitest_benchmark.rb b/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/test/minitest/test_minitest_benchmark.rb deleted file mode 100644 index 409acdf..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/test/minitest/test_minitest_benchmark.rb +++ /dev/null @@ -1,137 +0,0 @@ -require "minitest/autorun" -require "minitest/benchmark" - -## -# Used to verify data: -# https://www.wolframalpha.com/examples/RegressionAnalysis.html - -class TestMinitestBenchmark < Minitest::Test - def test_cls_bench_exp - assert_equal [2, 4, 8, 16, 32], Minitest::Benchmark.bench_exp(2, 32, 2) - end - - def test_cls_bench_linear - assert_equal [2, 4, 6, 8, 10], Minitest::Benchmark.bench_linear(2, 10, 2) - end - - def test_cls_runnable_methods - assert_equal [], Minitest::Benchmark.runnable_methods - - c = Class.new(Minitest::Benchmark) do - def bench_blah - end - end - - assert_equal ["bench_blah"], c.runnable_methods - end - - def test_cls_bench_range - assert_equal [1, 10, 100, 1_000, 10_000], Minitest::Benchmark.bench_range - end - - def test_fit_exponential_clean - x = [1.0, 2.0, 3.0, 4.0, 5.0] - y = x.map { |n| 1.1 * Math.exp(2.1 * n) } - - assert_fit :exponential, x, y, 1.0, 1.1, 2.1 - end - - def test_fit_exponential_noisy - x = [1.0, 1.9, 2.6, 3.4, 5.0] - y = [12, 10, 8.2, 6.9, 5.9] - - # verified with Numbers and R - assert_fit :exponential, x, y, 0.95, 13.81148, -0.1820 - end - - def test_fit_logarithmic_clean - x = [1.0, 2.0, 3.0, 4.0, 5.0] - y = x.map { |n| 1.1 + 2.1 * Math.log(n) } - - assert_fit :logarithmic, x, y, 1.0, 1.1, 2.1 - end - - def test_fit_logarithmic_noisy - x = [1.0, 2.0, 3.0, 4.0, 5.0] - # Generated with - # y = x.map { |n| jitter = 0.999 + 0.002 * rand; (Math.log(n) ) * jitter } - y = [0.0, 0.6935, 1.0995, 1.3873, 1.6097] - - assert_fit :logarithmic, x, y, 0.95, 0, 1 - end - - def test_fit_constant_clean - x = (1..5).to_a - y = [5.0, 5.0, 5.0, 5.0, 5.0] - - assert_fit :linear, x, y, nil, 5.0, 0 - end - - def test_fit_constant_noisy - x = (1..5).to_a - y = [1.0, 1.2, 1.0, 0.8, 1.0] - - # verified in numbers and R - assert_fit :linear, x, y, nil, 1.12, -0.04 - end - - def test_fit_linear_clean - # y = m * x + b where m = 2.2, b = 3.1 - x = (1..5).to_a - y = x.map { |n| 2.2 * n + 3.1 } - - assert_fit :linear, x, y, 1.0, 3.1, 2.2 - end - - def test_fit_linear_noisy - x = [ 60, 61, 62, 63, 65] - y = [3.1, 3.6, 3.8, 4.0, 4.1] - - # verified in numbers and R - assert_fit :linear, x, y, 0.8315, -7.9635, 0.1878 - end - - def test_fit_power_clean - # y = A x ** B, where B = b and A = e ** a - # if, A = 1, B = 2, then - - x = [1.0, 2.0, 3.0, 4.0, 5.0] - y = [1.0, 4.0, 9.0, 16.0, 25.0] - - assert_fit :power, x, y, 1.0, 1.0, 2.0 - end - - def test_fit_power_noisy - # from www.engr.uidaho.edu/thompson/courses/ME330/lecture/least_squares.html - x = [10, 12, 15, 17, 20, 22, 25, 27, 30, 32, 35] - y = [95, 105, 125, 141, 173, 200, 253, 298, 385, 459, 602] - - # verified in numbers - assert_fit :power, x, y, 0.90, 2.6217, 1.4556 - - # income to % of households below income amount - # https://library.wolfram.com/infocenter/Conferences/6461/PowerLaws.nb - x = [15_000, 25_000, 35_000, 50_000, 75_000, 100_000] - y = [0.154, 0.283, 0.402, 0.55, 0.733, 0.843] - - # verified in numbers - assert_fit :power, x, y, 0.96, 3.119e-5, 0.8959 - end - - def assert_fit msg, x, y, fit, exp_a, exp_b - bench = Minitest::Benchmark.new :blah - - a, b, rr = bench.send "fit_#{msg}", x, y - - assert_operator rr, :>=, fit if fit - assert_in_delta exp_a, a - assert_in_delta exp_b, b - end -end - -describe "my class Bench" do - klass = self - it "should provide bench methods" do - klass.must_respond_to :bench - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/test/minitest/test_minitest_mock.rb b/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/test/minitest/test_minitest_mock.rb deleted file mode 100644 index 1a4bab3..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/test/minitest/test_minitest_mock.rb +++ /dev/null @@ -1,1146 +0,0 @@ -require "minitest/autorun" - -def with_kwargs_env - ENV["MT_KWARGS_HAC\K"] = "1" - - yield -ensure - ENV.delete "MT_KWARGS_HAC\K" -end - -class TestMinitestMock < Minitest::Test - def setup - @mock = Minitest::Mock.new.expect(:foo, nil) - @mock.expect(:meaning_of_life, 42) - end - - def test_create_stub_method - assert_nil @mock.foo - end - - def test_allow_return_value_specification - assert_equal 42, @mock.meaning_of_life - end - - def test_blow_up_if_not_called - @mock.foo - - util_verify_bad "expected meaning_of_life() => 42" - end - - def test_not_blow_up_if_everything_called - @mock.foo - @mock.meaning_of_life - - assert_mock @mock - end - - def test_allow_expectations_to_be_added_after_creation - @mock.expect(:bar, true) - assert @mock.bar - end - - def test_not_verify_if_new_expected_method_is_not_called - @mock.foo - @mock.meaning_of_life - @mock.expect(:bar, true) - - util_verify_bad "expected bar() => true" - end - - def test_blow_up_on_wrong_number_of_arguments - @mock.foo - @mock.meaning_of_life - @mock.expect(:sum, 3, [1, 2]) - - e = assert_raises ArgumentError do - @mock.sum - end - - assert_equal "mocked method :sum expects 2 arguments, got []", e.message - end - - def test_return_mock_does_not_raise - retval = Minitest::Mock.new - mock = Minitest::Mock.new - mock.expect(:foo, retval) - mock.foo - - assert_mock mock - end - - def test_mock_args_does_not_raise - arg = Minitest::Mock.new - mock = Minitest::Mock.new - mock.expect(:foo, nil, [arg]) - mock.foo(arg) - - assert_mock mock - end - - def test_set_expectation_on_special_methods - mock = Minitest::Mock.new - - mock.expect :object_id, "received object_id" - assert_equal "received object_id", mock.object_id - - mock.expect :respond_to_missing?, "received respond_to_missing?" - assert_equal "received respond_to_missing?", mock.respond_to_missing? - - mock.expect :===, "received ===" - assert_equal "received ===", mock.=== - - mock.expect :inspect, "received inspect" - assert_equal "received inspect", mock.inspect - - mock.expect :to_s, "received to_s" - assert_equal "received to_s", mock.to_s - - mock.expect :public_send, "received public_send" - assert_equal "received public_send", mock.public_send - - mock.expect :send, "received send" - assert_equal "received send", mock.send - - assert_mock mock - end - - def test_expectations_can_be_satisfied_via_send - @mock.send :foo - @mock.send :meaning_of_life - - assert_mock @mock - end - - def test_expectations_can_be_satisfied_via_public_send - skip "Doesn't run on 1.8" if RUBY_VERSION < "1.9" - - @mock.public_send :foo - @mock.public_send :meaning_of_life - - assert_mock @mock - end - - def test_blow_up_on_wrong_arguments - @mock.foo - @mock.meaning_of_life - @mock.expect(:sum, 3, [1, 2]) - - e = assert_raises MockExpectationError do - @mock.sum(2, 4) - end - - exp = "mocked method :sum called with unexpected arguments [2, 4]" - assert_equal exp, e.message - end - - def test_expect_with_non_array_args - e = assert_raises ArgumentError do - @mock.expect :blah, 3, false - end - - assert_match "args must be an array", e.message - end - - def test_respond_appropriately - assert @mock.respond_to?(:foo) - assert @mock.respond_to?(:foo, true) - assert @mock.respond_to?("foo") - assert !@mock.respond_to?(:bar) - end - - def test_no_method_error_on_unexpected_methods - e = assert_raises NoMethodError do - @mock.bar - end - - expected = "unmocked method :bar, expected one of [:foo, :meaning_of_life]" - - assert_match expected, e.message - end - - def test_assign_per_mock_return_values - a = Minitest::Mock.new - b = Minitest::Mock.new - - a.expect(:foo, :a) - b.expect(:foo, :b) - - assert_equal :a, a.foo - assert_equal :b, b.foo - end - - def test_do_not_create_stub_method_on_new_mocks - a = Minitest::Mock.new - a.expect(:foo, :a) - - assert !Minitest::Mock.new.respond_to?(:foo) - end - - def test_mock_is_a_blank_slate - @mock.expect :kind_of?, true, [String] - @mock.expect :==, true, [1] - - assert @mock.kind_of?(String), "didn't mock :kind_of\?" - assert @mock == 1, "didn't mock :==" - end - - def test_verify_allows_called_args_to_be_loosely_specified - mock = Minitest::Mock.new - mock.expect :loose_expectation, true, [Integer] - mock.loose_expectation 1 - - assert_mock mock - end - - def test_verify_raises_with_strict_args - mock = Minitest::Mock.new - mock.expect :strict_expectation, true, [2] - - e = assert_raises MockExpectationError do - mock.strict_expectation 1 - end - - exp = "mocked method :strict_expectation called with unexpected arguments [1]" - assert_equal exp, e.message - end - - def test_method_missing_empty - mock = Minitest::Mock.new - - mock.expect :a, nil - - mock.a - - e = assert_raises MockExpectationError do - mock.a - end - - assert_equal "No more expects available for :a: [] {}", e.message - end - - def test_same_method_expects_are_verified_when_all_called - mock = Minitest::Mock.new - mock.expect :foo, nil, [:bar] - mock.expect :foo, nil, [:baz] - - mock.foo :bar - mock.foo :baz - - assert_mock mock - end - - def test_same_method_expects_blow_up_when_not_all_called - mock = Minitest::Mock.new - mock.expect :foo, nil, [:bar] - mock.expect :foo, nil, [:baz] - - mock.foo :bar - - e = assert_raises(MockExpectationError) { mock.verify } - - exp = "expected foo(:baz) => nil, got [foo(:bar) => nil]" - - assert_equal exp, e.message - end - - def test_same_method_expects_with_same_args_blow_up_when_not_all_called - mock = Minitest::Mock.new - mock.expect :foo, nil, [:bar] - mock.expect :foo, nil, [:bar] - - mock.foo :bar - - e = assert_raises(MockExpectationError) { mock.verify } - - exp = "expected foo(:bar) => nil, got [foo(:bar) => nil]" - - assert_equal exp, e.message - end - - def test_delegator_calls_are_propagated - delegator = Object.new - mock = Minitest::Mock.new delegator - - refute delegator.nil? - refute mock.nil? - assert_mock mock - end - - def test_handles_kwargs_in_error_message - mock = Minitest::Mock.new - - mock.expect :foo, nil, [], kw: true - mock.expect :foo, nil, [], kw: false - - mock.foo kw: true - - e = assert_raises(MockExpectationError) { mock.verify } - - exp = "expected foo(:kw=>false) => nil, got [foo(:kw=>true) => nil]" - - assert_equal exp, e.message - end - - def test_verify_passes_when_mock_block_returns_true - mock = Minitest::Mock.new - mock.expect :foo, nil do - true - end - - mock.foo - - assert_mock mock - end - - def test_mock_block_is_passed_function_params - arg1, arg2, arg3 = :bar, [1, 2, 3], { :a => "a" } - mock = Minitest::Mock.new - mock.expect :foo, nil do |a1, a2, a3| - a1 == arg1 && a2 == arg2 && a3 == arg3 - end - - assert_silent do - if RUBY_VERSION > "3" then - mock.foo arg1, arg2, arg3 - else - mock.foo arg1, arg2, **arg3 # oddity just for ruby 2.7 - end - end - - assert_mock mock - end - - def test_mock_block_is_passed_keyword_args__block - arg1, arg2, arg3 = :bar, [1, 2, 3], { :a => "a" } - mock = Minitest::Mock.new - mock.expect :foo, nil do |k1:, k2:, k3:| - k1 == arg1 && k2 == arg2 && k3 == arg3 - end - - mock.foo(k1: arg1, k2: arg2, k3: arg3) - - assert_mock mock - end - - def test_mock_block_is_passed_keyword_args__block_bad_missing - arg1, arg2, arg3 = :bar, [1, 2, 3], { :a => "a" } - mock = Minitest::Mock.new - mock.expect :foo, nil do |k1:, k2:, k3:| - k1 == arg1 && k2 == arg2 && k3 == arg3 - end - - e = assert_raises ArgumentError do - mock.foo(k1: arg1, k2: arg2) - end - - # basically testing ruby ... need ? for ruby < 2.7 :( - assert_match(/missing keyword: :?k3/, e.message) - end - - def test_mock_block_is_passed_keyword_args__block_bad_extra - arg1, arg2, arg3 = :bar, [1, 2, 3], { :a => "a" } - mock = Minitest::Mock.new - mock.expect :foo, nil do |k1:, k2:| - k1 == arg1 && k2 == arg2 && k3 == arg3 - end - - e = assert_raises ArgumentError do - mock.foo(k1: arg1, k2: arg2, k3: arg3) - end - - # basically testing ruby ... need ? for ruby < 2.7 :( - assert_match(/unknown keyword: :?k3/, e.message) - end - - def test_mock_block_is_passed_keyword_args__block_bad_value - arg1, arg2, arg3 = :bar, [1, 2, 3], { :a => "a" } - mock = Minitest::Mock.new - mock.expect :foo, nil do |k1:, k2:, k3:| - k1 == arg1 && k2 == arg2 && k3 == arg3 - end - - e = assert_raises MockExpectationError do - mock.foo(k1: arg1, k2: arg2, k3: :BAD!) - end - - exp = "mocked method :foo failed block w/ [] {:k1=>:bar, :k2=>[1, 2, 3], :k3=>:BAD!}" - assert_equal exp, e.message - end - - def test_mock_block_is_passed_keyword_args__args - arg1, arg2, arg3 = :bar, [1, 2, 3], { :a => "a" } - mock = Minitest::Mock.new - mock.expect :foo, nil, k1: arg1, k2: arg2, k3: arg3 - - mock.foo(k1: arg1, k2: arg2, k3: arg3) - - assert_mock mock - end - - def test_mock_allow_all_kwargs__old_style_env - with_kwargs_env do - mock = Minitest::Mock.new - mock.expect :foo, true, [Hash] - assert_equal true, mock.foo(bar: 42) - end - end - - def test_mock_allow_all_kwargs__old_style_env__rewrite - with_kwargs_env do - mock = Minitest::Mock.new - mock.expect :foo, true, [], bar: Integer - assert_equal true, mock.foo(bar: 42) - end - end - - def test_mock_block_is_passed_keyword_args__args__old_style_bad - arg1, arg2, arg3 = :bar, [1, 2, 3], { :a => "a" } - mock = Minitest::Mock.new - mock.expect :foo, nil, [{k1: arg1, k2: arg2, k3: arg3}] - - e = assert_raises ArgumentError do - mock.foo(k1: arg1, k2: arg2, k3: arg3) - end - - assert_equal "mocked method :foo expects 1 arguments, got []", e.message - end - - def test_mock_block_is_passed_keyword_args__args__old_style_env - with_kwargs_env do - arg1, arg2, arg3 = :bar, [1, 2, 3], { :a => "a" } - mock = Minitest::Mock.new - mock.expect :foo, nil, [{k1: arg1, k2: arg2, k3: arg3}] - - mock.foo(k1: arg1, k2: arg2, k3: arg3) - - assert_mock mock - end - end - - def test_mock_block_is_passed_keyword_args__args__old_style_both - with_kwargs_env do - arg1, arg2, arg3 = :bar, [1, 2, 3], { :a => "a" } - mock = Minitest::Mock.new - - assert_output nil, /Using MT_KWARGS_HAC. yet passing kwargs/ do - mock.expect :foo, nil, [{}], k1: arg1, k2: arg2, k3: arg3 - end - - mock.foo({}, k1: arg1, k2: arg2, k3: arg3) - - assert_mock mock - end - end - - def test_mock_block_is_passed_keyword_args__args_bad_missing - arg1, arg2, arg3 = :bar, [1, 2, 3], { :a => "a" } - mock = Minitest::Mock.new - mock.expect :foo, nil, k1: arg1, k2: arg2, k3: arg3 - - e = assert_raises ArgumentError do - mock.foo(k1: arg1, k2: arg2) - end - - assert_equal "mocked method :foo expects 3 keyword arguments, got %p" % {k1: arg1, k2: arg2}, e.message - end - - def test_mock_block_is_passed_keyword_args__args_bad_extra - arg1, arg2, arg3 = :bar, [1, 2, 3], { :a => "a" } - mock = Minitest::Mock.new - mock.expect :foo, nil, k1: arg1, k2: arg2 - - e = assert_raises ArgumentError do - mock.foo(k1: arg1, k2: arg2, k3: arg3) - end - - assert_equal "mocked method :foo expects 2 keyword arguments, got %p" % {k1: arg1, k2: arg2, k3: arg3}, e.message - end - - def test_mock_block_is_passed_keyword_args__args_bad_key - arg1, arg2, arg3 = :bar, [1, 2, 3], { :a => "a" } - mock = Minitest::Mock.new - mock.expect :foo, nil, k1: arg1, k2: arg2, k3: arg3 - - e = assert_raises MockExpectationError do - mock.foo(k1: arg1, k2: arg2, BAD: arg3) - end - - assert_includes e.message, "unexpected keywords [:k1, :k2, :k3]" - assert_includes e.message, "vs [:k1, :k2, :BAD]" - end - - def test_mock_block_is_passed_keyword_args__args_bad_val - arg1, arg2, arg3 = :bar, [1, 2, 3], { :a => "a" } - mock = Minitest::Mock.new - mock.expect :foo, nil, k1: arg1, k2: arg2, k3: arg3 - - e = assert_raises MockExpectationError do - mock.foo(k1: arg1, k2: :BAD!, k3: arg3) - end - - assert_match(/unexpected keyword arguments.* vs .*:k2=>:BAD!/, e.message) - end - - def test_mock_block_is_passed_function_block - mock = Minitest::Mock.new - block = proc { "bar" } - mock.expect :foo, nil do |arg, &blk| - arg == "foo" && - blk == block - end - mock.foo "foo", &block - assert_mock mock - end - - def test_mock_forward_keyword_arguments - mock = Minitest::Mock.new - mock.expect(:foo, nil) { |bar:| bar == 'bar' } - mock.foo(bar: 'bar') - assert_mock mock - end - - def test_verify_fails_when_mock_block_returns_false - mock = Minitest::Mock.new - mock.expect :foo, nil do - false - end - - e = assert_raises(MockExpectationError) { mock.foo } - exp = "mocked method :foo failed block w/ [] {}" - - assert_equal exp, e.message - end - - def test_mock_block_raises_if_args_passed - mock = Minitest::Mock.new - - e = assert_raises(ArgumentError) do - mock.expect :foo, nil, [:a, :b, :c] do - true - end - end - - exp = "args ignored when block given" - - assert_match exp, e.message - end - - def test_mock_block_raises_if_kwargs_passed - mock = Minitest::Mock.new - - e = assert_raises(ArgumentError) do - mock.expect :foo, nil, kwargs:1 do - true - end - end - - exp = "kwargs ignored when block given" - - assert_match exp, e.message - end - - def test_mock_returns_retval_when_called_with_block - mock = Minitest::Mock.new - mock.expect(:foo, 32) do - true - end - - rs = mock.foo - - assert_equal rs, 32 - end - - def util_verify_bad exp - e = assert_raises MockExpectationError do - @mock.verify - end - - assert_equal exp, e.message - end - - def test_mock_called_via_send - mock = Minitest::Mock.new - mock.expect(:foo, true) - - mock.send :foo - assert_mock mock - end - - def test_mock_called_via___send__ - mock = Minitest::Mock.new - mock.expect(:foo, true) - - mock.__send__ :foo - assert_mock mock - end - - def test_mock_called_via_send_with_args - mock = Minitest::Mock.new - mock.expect(:foo, true, [1, 2, 3]) - - mock.send(:foo, 1, 2, 3) - assert_mock mock - end - -end - -require "minitest/metametameta" - -class TestMinitestStub < Minitest::Test - # Do not parallelize since we're calling stub on class methods - - def setup - super - Minitest::Test.reset - - @tc = Minitest::Test.new "fake tc" - @assertion_count = 1 - end - - def teardown - super - assert_equal @assertion_count, @tc.assertions if self.passed? - end - - class Time - def self.now - 24 - end - end - - def assert_stub val_or_callable - @assertion_count += 1 - - t = Time.now.to_i - - Time.stub :now, val_or_callable do - @tc.assert_equal 42, Time.now - end - - @tc.assert_operator Time.now.to_i, :>=, t - end - - def test_stub_private_module_method - @assertion_count += 1 - - t0 = Time.now - - self.stub :sleep, nil do - @tc.assert_nil sleep(10) - end - - @tc.assert_operator Time.now - t0, :<=, 1 - end - - def test_stub_private_module_method_indirect - @assertion_count += 1 - - fail_clapper = Class.new do - def fail_clap - raise - :clap - end - end.new - - fail_clapper.stub :raise, nil do |safe_clapper| - @tc.assert_equal :clap, safe_clapper.fail_clap # either form works - @tc.assert_equal :clap, fail_clapper.fail_clap # yay closures - end - end - - def test_stub_public_module_method - Math.stub :log10, :stubbed do - @tc.assert_equal :stubbed, Math.log10(1000) - end - end - - def test_stub_value - assert_stub 42 - end - - def test_stub_block - assert_stub lambda { 42 } - end - - def test_stub_block_args - @assertion_count += 1 - - t = Time.now.to_i - - Time.stub :now, lambda { |n| n * 2 } do - @tc.assert_equal 42, Time.now(21) - end - - @tc.assert_operator Time.now.to_i, :>=, t - end - - def test_stub_callable - obj = Object.new - - def obj.call - 42 - end - - assert_stub obj - end - - def test_stub_yield_self - obj = "foo" - - val = obj.stub :to_s, "bar" do |s| - s.to_s - end - - @tc.assert_equal "bar", val - end - - def test_dynamic_method - @assertion_count = 2 - - dynamic = Class.new do - def self.respond_to? meth - meth == :found - end - - def self.method_missing meth, *args, &block - if meth == :found - false - else - super - end - end - end - - val = dynamic.stub(:found, true) do |s| - s.found - end - - @tc.assert_equal true, val - @tc.assert_equal false, dynamic.found - end - - def test_stub_NameError - e = @tc.assert_raises NameError do - Time.stub :nope_nope_nope, 42 do - # do nothing - end - end - - exp = jruby? ? /Undefined method nope_nope_nope for '#{self.class}::Time'/ : - /undefined method `nope_nope_nope' for( class)? `#{self.class}::Time'/ - assert_match exp, e.message - end - - def test_mock_with_yield - mock = Minitest::Mock.new - mock.expect(:write, true) do - true - end - rs = nil - - File.stub :open, true, mock do - File.open "foo.txt", "r" do |f| - rs = f.write - end - end - @tc.assert_equal true, rs - end - - def test_mock_with_yield_kwargs - mock = Minitest::Mock.new - rs = nil - - File.stub :open, true, mock, kw:42 do - File.open "foo.txt", "r" do |f, kw:| - rs = kw - end - end - - @tc.assert_equal 42, rs - end - - alias test_stub_value__old test_stub_value # TODO: remove/rename - - ## Permutation Sets: - - # [:value, :lambda] - # [:*, :block, :block_call] - # [:**, :block_args] - # - # Where: - # - # :value = a normal value - # :lambda = callable or lambda - # :* = no block - # :block = normal block - # :block_call = :lambda invokes the block (N/A for :value) - # :** = no args - # :args = args passed to stub - - ## Permutations - - # [:call, :*, :**] =>5 callable+block FIX: CALL BOTH (bug) - # [:call, :*, :**] =>6 callable - - # [:lambda, :*, :**] => lambda result - - # [:lambda, :*, :args] => lambda result NO ARGS - - # [:lambda, :block, :**] =>5 lambda result FIX: CALL BOTH (bug) - # [:lambda, :block, :**] =>6 lambda result - - # [:lambda, :block, :args] =>5 lambda result FIX: CALL BOTH (bug) - # [:lambda, :block, :args] =>6 lambda result - # [:lambda, :block, :args] =>7 raise ArgumentError - - # [:lambda, :block_call, :**] =>5 lambda FIX: BUG!-not passed block to lambda - # [:lambda, :block_call, :**] =>6 lambda+block result - - # [:lambda, :block_call, :args] =>5 lambda FIX: BUG!-not passed block to lambda - # [:lambda, :block_call, :args] =>6 lambda+block result - - # [:value, :*, :**] => value - - # [:value, :*, :args] => value, ignore args - - # [:value, :block, :**] =>5 value, call block - # [:value, :block, :**] =>6 value - - # [:value, :block, :args] =>5 value, call block w/ args - # [:value, :block, :args] =>6 value, call block w/ args, deprecated - # [:value, :block, :args] =>7 raise ArgumentError - - # [:value, :block_call, :**] => N/A - - # [:value, :block_call, :args] => N/A - - class Bar - def call - puts "hi" - end - end - - class Foo - def self.blocking - yield - end - end - - class Thingy - def self.identity arg - arg - end - end - - class Keywords - def self.args req, kw1:, kw2:24 - [req, kw1, kw2] - end - end - - def test_stub_callable_keyword_args - Keywords.stub :args, ->(*args, **kws) { [args, kws] } do - @tc.assert_equal [["woot"], { kw1: 42 }], Keywords.args("woot", kw1: 42) - end - end - - def test_stub__hash_as_last_real_arg - with_kwargs_env do - token = Object.new - def token.create_with_retry u, p; raise "shouldn't see this"; end - - controller = Object.new - controller.define_singleton_method :create do |u, p| - token.create_with_retry u, p - end - - params = Object.new - def params.to_hash; raise "nah"; end - - token.stub(:create_with_retry, ->(u, p) { 42 }) do - act = controller.create :u, params - @tc.assert_equal 42, act - end - end - end - - def test_stub_callable_block_5 # from tenderlove - @assertion_count += 1 - Foo.stub5 :blocking, Bar.new do - @tc.assert_output "hi\n", "" do - Foo.blocking do - @tc.flunk "shouldn't ever hit this" - end - end - end - end - - def test_stub_callable_block_6 # from tenderlove - skip_stub6 - - @assertion_count += 1 - Foo.stub6 :blocking, Bar.new do - @tc.assert_output "hi\n", "" do - Foo.blocking do - @tc.flunk "shouldn't ever hit this" - end - end - end - end - - def test_stub_lambda - Thread.stub :new, lambda { 21+21 } do - @tc.assert_equal 42, Thread.new - end - end - - def test_stub_lambda_args - Thread.stub :new, lambda { 21+21 }, :wtf do - @tc.assert_equal 42, Thread.new - end - end - - def test_stub_lambda_block_5 - Thread.stub5 :new, lambda { 21+21 } do - result = Thread.new do - @tc.flunk "shouldn't ever hit this" - end - @tc.assert_equal 42, result - end - end - - def test_stub_lambda_block_6 - skip_stub6 - - Thread.stub6 :new, lambda { 21+21 } do - result = Thread.new do - @tc.flunk "shouldn't ever hit this" - end - @tc.assert_equal 42, result - end - end - - def test_stub_lambda_block_args_5 - @assertion_count += 1 - Thingy.stub5 :identity, lambda { |y| @tc.assert_equal :nope, y; 21+21 }, :WTF? do - result = Thingy.identity :nope do |x| - @tc.flunk "shouldn't reach this" - end - @tc.assert_equal 42, result - end - end - - def test_stub_lambda_block_args_6 - skip_stub6 - - @assertion_count += 1 - Thingy.stub6 :identity, lambda { |y| @tc.assert_equal :nope, y; 21+21 }, :WTF? do - result = Thingy.identity :nope do |x| - @tc.flunk "shouldn't reach this" - end - @tc.assert_equal 42, result - end - end - - def test_stub_lambda_block_args_6_2 - skip_stub6 - - @tc.assert_raises ArgumentError do - Thingy.stub6_2 :identity, lambda { |y| :__not_run__ }, :WTF? do - # doesn't matter - end - end - end - - def test_stub_lambda_block_call_5 - @assertion_count += 1 - rs = nil - io = StringIO.new "", "w" - File.stub5 :open, lambda { |p, m, &blk| blk and blk.call io } do - File.open "foo.txt", "r" do |f| - rs = f && f.write("woot") - end - end - @tc.assert_equal 4, rs - @tc.assert_equal "woot", io.string - end - - def test_stub_lambda_block_call_6 - skip_stub6 - - @assertion_count += 1 - rs = nil - io = StringIO.new "", "w" - File.stub6 :open, lambda { |p, m, &blk| blk.call io } do - File.open "foo.txt", "r" do |f| - rs = f.write("woot") - end - end - @tc.assert_equal 4, rs - @tc.assert_equal "woot", io.string - end - - def test_stub_lambda_block_call_args_5 - @assertion_count += 1 - rs = nil - io = StringIO.new "", "w" - File.stub5(:open, lambda { |p, m, &blk| blk and blk.call io }, :WTF?) do - File.open "foo.txt", "r" do |f| - rs = f.write("woot") - end - end - @tc.assert_equal 4, rs - @tc.assert_equal "woot", io.string - end - - def test_stub_lambda_block_call_args_6 - skip_stub6 - - @assertion_count += 1 - rs = nil - io = StringIO.new "", "w" - File.stub6(:open, lambda { |p, m, &blk| blk.call io }, :WTF?) do - File.open "foo.txt", "r" do |f| - rs = f.write("woot") - end - end - @tc.assert_equal 4, rs - @tc.assert_equal "woot", io.string - end - - def test_stub_lambda_block_call_args_6_2 - skip_stub6 - - @assertion_count += 2 - rs = nil - io = StringIO.new "", "w" - @tc.assert_raises ArgumentError do - File.stub6_2(:open, lambda { |p, m, &blk| blk.call io }, :WTF?) do - File.open "foo.txt", "r" do |f| - rs = f.write("woot") - end - end - end - @tc.assert_nil rs - @tc.assert_equal "", io.string - end - - def test_stub_value - Thread.stub :new, 42 do - result = Thread.new - @tc.assert_equal 42, result - end - end - - def test_stub_value_args - Thread.stub :new, 42, :WTF? do - result = Thread.new - @tc.assert_equal 42, result - end - end - - def test_stub_value_block_5 - @assertion_count += 1 - Thread.stub5 :new, 42 do - result = Thread.new do - @tc.assert true - end - @tc.assert_equal 42, result - end - end - - def test_stub_value_block_6 - skip_stub6 - - Thread.stub6 :new, 42 do - result = Thread.new do - @tc.flunk "shouldn't hit this" - end - @tc.assert_equal 42, result - end - end - - def test_stub_value_block_args_5 - @assertion_count += 2 - rs = nil - io = StringIO.new "", "w" - File.stub5 :open, :value, io do - result = File.open "foo.txt", "r" do |f| - rs = f.write("woot") - end - @tc.assert_equal :value, result - end - @tc.assert_equal 4, rs - @tc.assert_equal "woot", io.string - end - - def test_stub_value_block_args_5__break_if_not_passed - e = @tc.assert_raises NoMethodError do - File.stub5 :open, :return_value do # intentionally bad setup w/ no args - File.open "foo.txt", "r" do |f| - f.write "woot" - end - end - end - exp = /undefined method `write' for nil/ - assert_match exp, e.message - end - - def test_stub_value_block_args_6 - skip_stub6 - - @assertion_count += 2 - rs = nil - io = StringIO.new "", "w" - assert_deprecated do - File.stub6 :open, :value, io do - result = File.open "foo.txt", "r" do |f| - rs = f.write("woot") - end - @tc.assert_equal :value, result - end - end - @tc.assert_equal 4, rs - @tc.assert_equal "woot", io.string - end - - def test_stub_value_block_args_6_2 - skip_stub6 - - @assertion_count += 2 - rs = nil - io = StringIO.new "", "w" - @tc.assert_raises ArgumentError do - File.stub6_2 :open, :value, io do - result = File.open "foo.txt", "r" do |f| - @tc.flunk "shouldn't hit this" - end - @tc.assert_equal :value, result - end - end - @tc.assert_nil rs - @tc.assert_equal "", io.string - end - - def assert_deprecated re = /deprecated/ - assert_output "", re do - yield - end - end - - def skip_stub6 - skip "not yet" unless STUB6 - end -end - -STUB6 = ENV["STUB6"] - -if STUB6 then - require "minitest/mock6" if STUB6 -else - class Object - alias stub5 stub - alias stub6 stub - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/test/minitest/test_minitest_reporter.rb b/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/test/minitest/test_minitest_reporter.rb deleted file mode 100644 index ed4026f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/test/minitest/test_minitest_reporter.rb +++ /dev/null @@ -1,312 +0,0 @@ -require "minitest/autorun" -require "minitest/metametameta" -require "forwardable" - -class Runnable - def woot - assert true - end -end - -class TestMinitestReporter < MetaMetaMetaTestCase - - attr_accessor :r, :io - - def new_composite_reporter - # Ruby bug in older versions of 2.2 & 2.3 on all platforms - # Latest Windows builds were 2.2.6 and 2.3.3. Latest Ruby releases were - # 2.2.10 and 2.3.8. - skip if windows? && RUBY_VERSION < '2.4' - reporter = Minitest::CompositeReporter.new - reporter << Minitest::SummaryReporter.new(self.io) - reporter << Minitest::ProgressReporter.new(self.io) - - # eg reporter.results -> reporters.first.results - reporter.extend Forwardable - reporter.delegate :first => :reporters - reporter.delegate %i[results count assertions options to_s] => :first - - reporter - end - - def setup - super - self.io = StringIO.new("") - self.r = new_composite_reporter - end - - def error_test - unless defined? @et then - @et = Minitest::Test.new(:woot) - @et.failures << Minitest::UnexpectedError.new(begin - raise "no" - rescue => e - e - end) - @et = Minitest::Result.from @et - end - @et - end - - def fail_test - unless defined? @ft then - @ft = Minitest::Test.new(:woot) - @ft.failures << begin - raise Minitest::Assertion, "boo" - rescue Minitest::Assertion => e - e - end - @ft = Minitest::Result.from @ft - end - @ft - end - - def passing_test - @pt ||= Minitest::Result.from Minitest::Test.new(:woot) - end - - def skip_test - unless defined? @st then - @st = Minitest::Test.new(:woot) - @st.failures << begin - raise Minitest::Skip - rescue Minitest::Assertion => e - e - end - @st = Minitest::Result.from @st - end - @st - end - - def test_to_s - r.record passing_test - r.record fail_test - assert_match "woot", r.to_s - end - - def test_options_skip_F - r.options[:skip] = "F" - - r.record passing_test - r.record fail_test - - refute_match "woot", r.to_s - end - - def test_options_skip_E - r.options[:skip] = "E" - - r.record passing_test - r.record error_test - - refute_match "RuntimeError: no", r.to_s - end - - def test_passed_eh_empty - assert_predicate r, :passed? - end - - def test_passed_eh_failure - r.results << fail_test - - refute_predicate r, :passed? - end - - SKIP_MSG = "\n\nYou have skipped tests. Run with --verbose for details." - - def test_passed_eh_error - r.start - - r.results << error_test - - refute_predicate r, :passed? - - r.report - - refute_match SKIP_MSG, io.string - end - - def test_passed_eh_skipped - r.start - r.results << skip_test - assert r.passed? - - restore_env do - r.report - end - - assert_match SKIP_MSG, io.string - end - - def test_passed_eh_skipped_verbose - r.options[:verbose] = true - - r.start - r.results << skip_test - assert r.passed? - r.report - - refute_match SKIP_MSG, io.string - end - - def test_start - r.start - - exp = "Run options: \n\n# Running:\n\n" - - assert_equal exp, io.string - end - - def test_record_pass - r.record passing_test - - assert_equal ".", io.string - assert_empty r.results - assert_equal 1, r.count - assert_equal 0, r.assertions - end - - def test_record_fail - fail_test = self.fail_test - r.record fail_test - - assert_equal "F", io.string - assert_equal [fail_test], r.results - assert_equal 1, r.count - assert_equal 0, r.assertions - end - - def test_record_error - error_test = self.error_test - r.record error_test - - assert_equal "E", io.string - assert_equal [error_test], r.results - assert_equal 1, r.count - assert_equal 0, r.assertions - end - - def test_record_skip - skip_test = self.skip_test - r.record skip_test - - assert_equal "S", io.string - assert_equal [skip_test], r.results - assert_equal 1, r.count - assert_equal 0, r.assertions - end - - def test_report_empty - r.start - r.report - - exp = clean <<-EOM - Run options: - - # Running: - - - - Finished in 0.00 - - 0 runs, 0 assertions, 0 failures, 0 errors, 0 skips - EOM - - assert_equal exp, normalize_output(io.string) - end - - def test_report_passing - r.start - r.record passing_test - r.report - - exp = clean <<-EOM - Run options: - - # Running: - - . - - Finished in 0.00 - - 1 runs, 0 assertions, 0 failures, 0 errors, 0 skips - EOM - - assert_equal exp, normalize_output(io.string) - end - - def test_report_failure - r.start - r.record fail_test - r.report - - exp = clean <<-EOM - Run options: - - # Running: - - F - - Finished in 0.00 - - 1) Failure: - Minitest::Test#woot [FILE:LINE]: - boo - - 1 runs, 0 assertions, 1 failures, 0 errors, 0 skips - EOM - - assert_equal exp, normalize_output(io.string) - end - - def test_report_error - r.start - r.record error_test - r.report - - exp = clean <<-EOM - Run options: - - # Running: - - E - - Finished in 0.00 - - 1) Error: - Minitest::Test#woot: - RuntimeError: no - FILE:LINE:in `error_test' - FILE:LINE:in `test_report_error' - - 1 runs, 0 assertions, 0 failures, 1 errors, 0 skips - EOM - - assert_equal exp, normalize_output(io.string) - end - - def test_report_skipped - r.start - r.record skip_test - - restore_env do - r.report - end - - exp = clean <<-EOM - Run options: - - # Running: - - S - - Finished in 0.00 - - 1 runs, 0 assertions, 0 failures, 0 errors, 1 skips - - You have skipped tests. Run with --verbose for details. - EOM - - assert_equal exp, normalize_output(io.string) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/test/minitest/test_minitest_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/test/minitest/test_minitest_spec.rb deleted file mode 100644 index ad91f52..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/test/minitest/test_minitest_spec.rb +++ /dev/null @@ -1,1146 +0,0 @@ -# encoding: utf-8 -require "minitest/metametameta" -require "stringio" - -class MiniSpecA < Minitest::Spec; end -class MiniSpecB < Minitest::Test; extend Minitest::Spec::DSL; end -class MiniSpecC < MiniSpecB; end -class NamedExampleA < MiniSpecA; end -class NamedExampleB < MiniSpecB; end -class NamedExampleC < MiniSpecC; end -class ExampleA; end -class ExampleB < ExampleA; end - -describe Minitest::Spec do - # helps to deal with 2.4 deprecation of Fixnum for Integer - Int = 1.class - - # do not parallelize this suite... it just can"t handle it. - - def assert_triggered expected = "blah", klass = Minitest::Assertion - @assertion_count += 1 - - e = assert_raises(klass) do - yield - end - - msg = e.message.sub(/(---Backtrace---).*/m, '\1') - msg.gsub!(/\(oid=[-0-9]+\)/, "(oid=N)") - msg.gsub!(/(\d\.\d{6})\d+/, '\1xxx') # normalize: ruby version, impl, platform - msg.gsub!(/:0x[Xa-fA-F0-9]{4,}[ @].+?>/, ":0xXXXXXX@PATH>") - - if expected - @assertion_count += 1 - case expected - when String then - assert_equal expected, msg - when Regexp then - @assertion_count += 1 - assert_match expected, msg - else - flunk "Unknown: #{expected.inspect}" - end - end - end - - def assert_success spec - assert_equal true, spec - end - - before do - @assertion_count = 4 - end - - after do - _(self.assertions).must_equal @assertion_count if passed? and not skipped? - end - - it "needs to be able to catch a Minitest::Assertion exception" do - @assertion_count = 1 - - assert_triggered "Expected 1 to not be equal to 1." do - _(1).wont_equal 1 - end - end - - it "needs to check for file existence" do - @assertion_count = 3 - - assert_success _(__FILE__).path_must_exist - - assert_triggered "Expected path 'blah' to exist." do - _("blah").path_must_exist - end - end - - it "needs to check for file non-existence" do - @assertion_count = 3 - - assert_success _("blah").path_wont_exist - - assert_triggered "Expected path '#{__FILE__}' to not exist." do - _(__FILE__).path_wont_exist - end - end - - it "needs to be sensible about must_include order" do - @assertion_count += 3 # must_include is 2 assertions - - assert_success _([1, 2, 3]).must_include(2) - - assert_triggered "Expected [1, 2, 3] to include 5." do - _([1, 2, 3]).must_include 5 - end - - assert_triggered "msg.\nExpected [1, 2, 3] to include 5." do - _([1, 2, 3]).must_include 5, "msg" - end - end - - it "needs to be sensible about wont_include order" do - @assertion_count += 3 # wont_include is 2 assertions - - assert_success _([1, 2, 3]).wont_include(5) - - assert_triggered "Expected [1, 2, 3] to not include 2." do - _([1, 2, 3]).wont_include 2 - end - - assert_triggered "msg.\nExpected [1, 2, 3] to not include 2." do - _([1, 2, 3]).wont_include 2, "msg" - end - end - - it "needs to catch an expected exception" do - @assertion_count = 2 - - expect { raise "blah" }.must_raise RuntimeError - expect { raise Minitest::Assertion }.must_raise Minitest::Assertion - end - - it "needs to catch an unexpected exception" do - @assertion_count -= 2 # no positive - - msg = <<-EOM.gsub(/^ {6}/, "").chomp - [RuntimeError] exception expected, not - Class: - Message: <"woot"> - ---Backtrace--- - EOM - - assert_triggered msg do - expect { raise StandardError, "woot" }.must_raise RuntimeError - end - - assert_triggered "msg.\n#{msg}" do - expect { raise StandardError, "woot" }.must_raise RuntimeError, "msg" - end - end - - def good_pattern - capture_io do # 3.0 is noisy - eval "[1,2,3] => [Integer, Integer, Integer]" # eval to escape parser for ruby<3 - end - end - - def bad_pattern - capture_io do # 3.0 is noisy - eval "[1,2,3] => [Integer, Integer]" # eval to escape parser for ruby<3 - end - end - - it "needs to pattern match" do - @assertion_count = 1 - - if RUBY_VERSION > "3" then - expect { good_pattern }.must_pattern_match - else - assert_raises NotImplementedError do - expect {}.must_pattern_match - end - end - end - - it "needs to error on bad pattern match" do - skip unless RUBY_VERSION > "3" - - @assertion_count = 1 - - exp = if RUBY_VERSION.start_with? "3.0" - "[1, 2, 3]" # terrible error message! - else - /length mismatch/ - end - - assert_triggered exp do - expect { bad_pattern }.must_pattern_match - end - end - - it "needs to ensure silence" do - @assertion_count -= 1 # no msg - @assertion_count += 2 # assert_output is 2 assertions - - assert_success expect {}.must_be_silent - - assert_triggered "In stdout.\nExpected: \"\"\n Actual: \"xxx\"" do - expect { print "xxx" }.must_be_silent - end - end - - it "needs to have all methods named well" do - skip "N/A" if ENV["MT_NO_EXPECTATIONS"] - - @assertion_count = 2 - - methods = Minitest::Expectations.public_instance_methods.grep(/must|wont/) - methods.map!(&:to_s) if Symbol === methods.first - - musts, wonts = methods.sort.partition { |m| m =~ /must/ } - - expected_musts = %w[must_be - must_be_close_to - must_be_empty - must_be_instance_of - must_be_kind_of - must_be_nil - must_be_same_as - must_be_silent - must_be_within_delta - must_be_within_epsilon - must_equal - must_include - must_match - must_output - must_pattern_match - must_raise - must_respond_to - must_throw - path_must_exist] - - bad = %w[not raise throw send output be_silent] - - expected_wonts = expected_musts.map { |m| m.sub(/must/, "wont") }.sort - expected_wonts.reject! { |m| m =~ /wont_#{Regexp.union(*bad)}/ } - - _(musts).must_equal expected_musts - _(wonts).must_equal expected_wonts - end - - it "needs to raise if an expected exception is not raised" do - @assertion_count -= 2 # no positive test - - assert_triggered "RuntimeError expected but nothing was raised." do - expect { 42 }.must_raise RuntimeError - end - - assert_triggered "msg.\nRuntimeError expected but nothing was raised." do - expect { 42 }.must_raise RuntimeError, "msg" - end - end - - it "needs to verify binary messages" do - assert_success _(42).wont_be(:<, 24) - - assert_triggered "Expected 24 to not be < 42." do - _(24).wont_be :<, 42 - end - - assert_triggered "msg.\nExpected 24 to not be < 42." do - _(24).wont_be :<, 42, "msg" - end - end - - it "needs to verify emptyness" do - @assertion_count += 3 # empty is 2 assertions - - assert_success _([]).must_be_empty - - assert_triggered "Expected [42] to be empty." do - _([42]).must_be_empty - end - - assert_triggered "msg.\nExpected [42] to be empty." do - _([42]).must_be_empty "msg" - end - end - - it "needs to verify equality" do - @assertion_count += 1 - - assert_success _(6 * 7).must_equal(42) - - assert_triggered "Expected: 42\n Actual: 54" do - _(6 * 9).must_equal 42 - end - - assert_triggered "msg.\nExpected: 42\n Actual: 54" do - _(6 * 9).must_equal 42, "msg" - end - - assert_triggered(/^-42\n\+#\n/) do - _(proc { 42 }).must_equal 42 # proc isn't called, so expectation fails - end - end - - it "needs to warn on equality with nil" do - @assertion_count += 1 # extra test - - out, err = capture_io do - assert_success _(nil).must_equal(nil) - end - - exp = "DEPRECATED: Use assert_nil if expecting nil from #{__FILE__}:#{__LINE__-3}. " \ - "This will fail in Minitest 6.\n" - exp = "" if $-w.nil? - - assert_empty out - assert_equal exp, err - end - - it "needs to verify floats outside a delta" do - @assertion_count += 1 # extra test - - assert_success _(24).wont_be_close_to(42) - - assert_triggered "Expected |42 - 42.0| (0.0) to not be <= 0.001." do - _(6 * 7.0).wont_be_close_to 42 - end - - x = "1.0e-05" - assert_triggered "Expected |42 - 42.0| (0.0) to not be <= #{x}." do - _(6 * 7.0).wont_be_close_to 42, 0.00001 - end - - assert_triggered "msg.\nExpected |42 - 42.0| (0.0) to not be <= #{x}." do - _(6 * 7.0).wont_be_close_to 42, 0.00001, "msg" - end - end - - it "needs to verify floats outside an epsilon" do - @assertion_count += 1 # extra test - - assert_success _(24).wont_be_within_epsilon(42) - - x = "0.042" - assert_triggered "Expected |42 - 42.0| (0.0) to not be <= #{x}." do - _(6 * 7.0).wont_be_within_epsilon 42 - end - - x = "0.00042" - assert_triggered "Expected |42 - 42.0| (0.0) to not be <= #{x}." do - _(6 * 7.0).wont_be_within_epsilon 42, 0.00001 - end - - assert_triggered "msg.\nExpected |42 - 42.0| (0.0) to not be <= #{x}." do - _(6 * 7.0).wont_be_within_epsilon 42, 0.00001, "msg" - end - end - - it "needs to verify floats within a delta" do - @assertion_count += 1 # extra test - - assert_success _(6.0 * 7).must_be_close_to(42.0) - - assert_triggered "Expected |0.0 - 0.01| (0.01) to be <= 0.001." do - _(1.0 / 100).must_be_close_to 0.0 - end - - x = "1.0e-06" - assert_triggered "Expected |0.0 - 0.001| (0.001) to be <= #{x}." do - _(1.0 / 1000).must_be_close_to 0.0, 0.000001 - end - - assert_triggered "msg.\nExpected |0.0 - 0.001| (0.001) to be <= #{x}." do - _(1.0 / 1000).must_be_close_to 0.0, 0.000001, "msg" - end - end - - it "needs to verify floats within an epsilon" do - @assertion_count += 1 # extra test - - assert_success _(6.0 * 7).must_be_within_epsilon(42.0) - - assert_triggered "Expected |0.0 - 0.01| (0.01) to be <= 0.0." do - _(1.0 / 100).must_be_within_epsilon 0.0 - end - - assert_triggered "Expected |0.0 - 0.001| (0.001) to be <= 0.0." do - _(1.0 / 1000).must_be_within_epsilon 0.0, 0.000001 - end - - assert_triggered "msg.\nExpected |0.0 - 0.001| (0.001) to be <= 0.0." do - _(1.0 / 1000).must_be_within_epsilon 0.0, 0.000001, "msg" - end - end - - it "needs to verify identity" do - assert_success _(1).must_be_same_as(1) - - assert_triggered "Expected 1 (oid=N) to be the same as 2 (oid=N)." do - _(1).must_be_same_as 2 - end - - assert_triggered "msg.\nExpected 1 (oid=N) to be the same as 2 (oid=N)." do - _(1).must_be_same_as 2, "msg" - end - end - - it "needs to verify inequality" do - @assertion_count += 2 - assert_success _(42).wont_equal(6 * 9) - assert_success _(proc {}).wont_equal(42) - - assert_triggered "Expected 1 to not be equal to 1." do - _(1).wont_equal 1 - end - - assert_triggered "msg.\nExpected 1 to not be equal to 1." do - _(1).wont_equal 1, "msg" - end - end - - it "needs to verify instances of a class" do - assert_success _(42).wont_be_instance_of(String) - - assert_triggered "Expected 42 to not be a kind of #{Int.name}." do - _(42).wont_be_kind_of Int - end - - assert_triggered "msg.\nExpected 42 to not be an instance of #{Int.name}." do - _(42).wont_be_instance_of Int, "msg" - end - end - - it "needs to verify kinds of a class" do - @assertion_count += 2 - - assert_success _(42).wont_be_kind_of(String) - assert_success _(proc {}).wont_be_kind_of(String) - - assert_triggered "Expected 42 to not be a kind of #{Int.name}." do - _(42).wont_be_kind_of Int - end - - assert_triggered "msg.\nExpected 42 to not be a kind of #{Int.name}." do - _(42).wont_be_kind_of Int, "msg" - end - end - - it "needs to verify kinds of objects" do - @assertion_count += 3 # extra test - - assert_success _(6 * 7).must_be_kind_of(Int) - assert_success _(6 * 7).must_be_kind_of(Numeric) - - assert_triggered "Expected 42 to be a kind of String, not #{Int.name}." do - _(6 * 7).must_be_kind_of String - end - - assert_triggered "msg.\nExpected 42 to be a kind of String, not #{Int.name}." do - _(6 * 7).must_be_kind_of String, "msg" - end - - exp = "Expected # to be a kind of String, not Proc." - assert_triggered exp do - _(proc {}).must_be_kind_of String - end - end - - it "needs to verify mismatch" do - @assertion_count += 3 # match is 2 - - assert_success _("blah").wont_match(/\d+/) - - assert_triggered "Expected /\\w+/ to not match \"blah\"." do - _("blah").wont_match(/\w+/) - end - - assert_triggered "msg.\nExpected /\\w+/ to not match \"blah\"." do - _("blah").wont_match(/\w+/, "msg") - end - end - - it "needs to verify nil" do - assert_success _(nil).must_be_nil - - assert_triggered "Expected 42 to be nil." do - _(42).must_be_nil - end - - assert_triggered "msg.\nExpected 42 to be nil." do - _(42).must_be_nil "msg" - end - end - - it "needs to verify non-emptyness" do - @assertion_count += 3 # empty is 2 assertions - - assert_success _(["some item"]).wont_be_empty - - assert_triggered "Expected [] to not be empty." do - _([]).wont_be_empty - end - - assert_triggered "msg.\nExpected [] to not be empty." do - _([]).wont_be_empty "msg" - end - end - - it "needs to verify non-identity" do - assert_success _(1).wont_be_same_as(2) - - assert_triggered "Expected 1 (oid=N) to not be the same as 1 (oid=N)." do - _(1).wont_be_same_as 1 - end - - assert_triggered "msg.\nExpected 1 (oid=N) to not be the same as 1 (oid=N)." do - _(1).wont_be_same_as 1, "msg" - end - end - - it "needs to verify non-nil" do - assert_success _(42).wont_be_nil - - assert_triggered "Expected nil to not be nil." do - _(nil).wont_be_nil - end - - assert_triggered "msg.\nExpected nil to not be nil." do - _(nil).wont_be_nil "msg" - end - end - - it "needs to verify objects not responding to a message" do - assert_success _("").wont_respond_to(:woot!) - - assert_triggered "Expected \"\" to not respond to to_s." do - _("").wont_respond_to :to_s - end - - assert_triggered "msg.\nExpected \"\" to not respond to to_s." do - _("").wont_respond_to :to_s, "msg" - end - end - - it "needs to verify output in stderr" do - @assertion_count -= 1 # no msg - - assert_success expect { $stderr.print "blah" }.must_output(nil, "blah") - - assert_triggered "In stderr.\nExpected: \"blah\"\n Actual: \"xxx\"" do - expect { $stderr.print "xxx" }.must_output(nil, "blah") - end - end - - it "needs to verify output in stdout" do - @assertion_count -= 1 # no msg - - assert_success expect { print "blah" }.must_output("blah") - - assert_triggered "In stdout.\nExpected: \"blah\"\n Actual: \"xxx\"" do - expect { print "xxx" }.must_output("blah") - end - end - - it "needs to verify regexp matches" do - @assertion_count += 3 # must_match is 2 assertions - - assert_kind_of MatchData, _("blah").must_match(/\w+/) - - assert_triggered "Expected /\\d+/ to match \"blah\"." do - _("blah").must_match(/\d+/) - end - - assert_triggered "msg.\nExpected /\\d+/ to match \"blah\"." do - _("blah").must_match(/\d+/, "msg") - end - end - - describe "expect" do - before do - @assertion_count -= 3 - end - - it "can use expect" do - _(1 + 1).must_equal 2 - end - - it "can use expect with a lambda" do - _ { raise "blah" }.must_raise RuntimeError - end - - it "can use expect in a thread" do - Thread.new { _(1 + 1).must_equal 2 }.join - end - - it "can NOT use must_equal in a thread. It must use expect in a thread" do - skip "N/A" if ENV["MT_NO_EXPECTATIONS"] - assert_raises RuntimeError do - capture_io do - Thread.new { (1 + 1).must_equal 2 }.join - end - end - end - - it "fails gracefully when expectation used outside of `it`" do - skip "N/A" if ENV["MT_NO_EXPECTATIONS"] - - @assertion_count += 1 - - e = assert_raises RuntimeError do - capture_io do - Thread.new { # forces ctx to be nil - describe("woot") do - (1 + 1).must_equal 2 - end - }.join - end - end - - assert_equal "Calling #must_equal outside of test.", e.message - end - - it "deprecates expectation used without _" do - skip "N/A" if ENV["MT_NO_EXPECTATIONS"] - - @assertion_count += 3 - - exp = /DEPRECATED: global use of must_equal from/ - - assert_output "", exp do - (1 + 1).must_equal 2 - end - end - - # https://github.com/seattlerb/minitest/issues/837 - # https://github.com/rails/rails/pull/39304 - it "deprecates expectation used without _ with empty backtrace_filter" do - skip "N/A" if ENV["MT_NO_EXPECTATIONS"] - - @assertion_count += 3 - - exp = /DEPRECATED: global use of must_equal from/ - - with_empty_backtrace_filter do - assert_output "", exp do - (1 + 1).must_equal 2 - end - end - end - end - - it "needs to verify throw" do - @assertion_count += 4 # 2 extra tests - - assert_nil expect { throw :blah }.must_throw(:blah) - assert_equal 42, expect { throw :blah, 42 }.must_throw(:blah) - - assert_triggered "Expected :blah to have been thrown." do - expect {}.must_throw :blah - end - - assert_triggered "Expected :blah to have been thrown, not :xxx." do - expect { throw :xxx }.must_throw :blah - end - - assert_triggered "msg.\nExpected :blah to have been thrown." do - expect {}.must_throw :blah, "msg" - end - - assert_triggered "msg.\nExpected :blah to have been thrown, not :xxx." do - expect { throw :xxx }.must_throw :blah, "msg" - end - end - - it "needs to verify types of objects" do - assert_success _(6 * 7).must_be_instance_of(Int) - - exp = "Expected 42 to be an instance of String, not #{Int.name}." - - assert_triggered exp do - _(6 * 7).must_be_instance_of String - end - - assert_triggered "msg.\n#{exp}" do - _(6 * 7).must_be_instance_of String, "msg" - end - end - - it "needs to verify using any (negative) predicate" do - @assertion_count -= 1 # doesn"t take a message - - assert_success _("blah").wont_be(:empty?) - - assert_triggered "Expected \"\" to not be empty?." do - _("").wont_be :empty? - end - end - - it "needs to verify using any binary operator" do - @assertion_count -= 1 # no msg - - assert_success _(41).must_be(:<, 42) - - assert_triggered "Expected 42 to be < 41." do - _(42).must_be(:<, 41) - end - end - - it "needs to verify using any predicate" do - @assertion_count -= 1 # no msg - - assert_success _("").must_be(:empty?) - - assert_triggered "Expected \"blah\" to be empty?." do - _("blah").must_be :empty? - end - end - - it "needs to verify using respond_to" do - assert_success _(42).must_respond_to(:+) - - assert_triggered "Expected 42 (#{Int.name}) to respond to #clear." do - _(42).must_respond_to :clear - end - - assert_triggered "msg.\nExpected 42 (#{Int.name}) to respond to #clear." do - _(42).must_respond_to :clear, "msg" - end - end -end - -describe Minitest::Spec, :let do - i_suck_and_my_tests_are_order_dependent! - - def _count - $let_count ||= 0 - end - - let :count do - $let_count += 1 - $let_count - end - - it "is evaluated once per example" do - _(_count).must_equal 0 - - _(count).must_equal 1 - _(count).must_equal 1 - - _(_count).must_equal 1 - end - - it "is REALLY evaluated once per example" do - _(_count).must_equal 1 - - _(count).must_equal 2 - _(count).must_equal 2 - - _(_count).must_equal 2 - end - - it 'raises an error if the name begins with "test"' do - expect { self.class.let(:test_value) { true } }.must_raise ArgumentError - end - - it "raises an error if the name shadows a normal instance method" do - expect { self.class.let(:message) { true } }.must_raise ArgumentError - end - - it "doesn't raise an error if it is just another let" do - v = proc do - describe :outer do - let(:bar) - describe :inner do - let(:bar) - end - end - :good - end.call - _(v).must_equal :good - end - - it "procs come after dont_flip" do - p = proc {} - assert_respond_to p, :call - _(p).must_respond_to :call - end -end - -describe Minitest::Spec, :subject do - attr_reader :subject_evaluation_count - - subject do - @subject_evaluation_count ||= 0 - @subject_evaluation_count += 1 - @subject_evaluation_count - end - - it "is evaluated once per example" do - _(subject).must_equal 1 - _(subject).must_equal 1 - _(subject_evaluation_count).must_equal 1 - end -end - -class TestMetaStatic < Minitest::Test - def assert_method_count expected, klass - assert_equal expected, klass.public_instance_methods.grep(/^test_/).count - end - - def test_children - Minitest::Spec.children.clear # prevents parallel run - - y = z = nil - x = describe "top-level thingy" do - y = describe "first thingy" do end - - it "top-level-it" do end - - z = describe "second thingy" do end - end - - assert_equal [x], Minitest::Spec.children - assert_equal [y, z], x.children - assert_equal [], y.children - assert_equal [], z.children - end - - def test_it_wont_remove_existing_child_test_methods - Minitest::Spec.children.clear # prevents parallel run - - inner = nil - outer = describe "outer" do - inner = describe "inner" do - it do - assert true - end - end - it do - assert true - end - end - - assert_method_count 1, outer - assert_method_count 1, inner - end - - def test_it_wont_add_test_methods_to_children - Minitest::Spec.children.clear # prevents parallel run - - inner = nil - outer = describe "outer" do - inner = describe "inner" do end - it do - assert true - end - end - - assert_method_count 1, outer - assert_method_count 0, inner - end -end - -class TestMeta < MetaMetaMetaTestCase - # do not call parallelize_me! here because specs use register_spec_type globally - - def assert_defined_methods expected, klass - assert_equal expected, klass.instance_methods(false).sort.map(&:to_s) - end - - def util_structure - y = z = nil - before_list = [] - after_list = [] - x = describe "top-level thingy" do - before { before_list << 1 } - after { after_list << 1 } - - it "top-level-it" do end - - y = describe "inner thingy" do - before { before_list << 2 } - after { after_list << 2 } - it "inner-it" do end - - z = describe "very inner thingy" do - before { before_list << 3 } - after { after_list << 3 } - it "inner-it" do end - - it { } # ignore me - specify { } # anonymous it - end - end - end - - return x, y, z, before_list, after_list - end - - def test_register_spec_type - original_types = Minitest::Spec::TYPES.dup - - assert_includes Minitest::Spec::TYPES, [//, Minitest::Spec] - - Minitest::Spec.register_spec_type(/woot/, TestMeta) - - p = lambda do |_| true end - Minitest::Spec.register_spec_type TestMeta, &p - - keys = Minitest::Spec::TYPES.map(&:first) - - assert_includes keys, /woot/ - assert_includes keys, p - ensure - Minitest::Spec::TYPES.replace original_types - end - - def test_spec_type - original_types = Minitest::Spec::TYPES.dup - - Minitest::Spec.register_spec_type(/A$/, MiniSpecA) - Minitest::Spec.register_spec_type MiniSpecB do |desc| - desc.superclass == ExampleA - end - Minitest::Spec.register_spec_type MiniSpecC do |_desc, *addl| - addl.include? :woot - end - - assert_equal MiniSpecA, Minitest::Spec.spec_type(ExampleA) - assert_equal MiniSpecB, Minitest::Spec.spec_type(ExampleB) - assert_equal MiniSpecC, Minitest::Spec.spec_type(ExampleB, :woot) - ensure - Minitest::Spec::TYPES.replace original_types - end - - def test_bug_dsl_expectations - spec_class = Class.new MiniSpecB do - it "should work" do - _(0).must_equal 0 - end - end - - test_name = spec_class.instance_methods.sort.grep(/test_/).first - - spec = spec_class.new test_name - - result = spec.run - - assert spec.passed? - assert result.passed? - assert_equal 1, result.assertions - end - - def test_name - spec_a = describe ExampleA do; end - spec_b = describe ExampleB, :random_method do; end - spec_c = describe ExampleB, :random_method, :addl_context do; end - - assert_equal "ExampleA", spec_a.name - assert_equal "ExampleB::random_method", spec_b.name - assert_equal "ExampleB::random_method::addl_context", spec_c.name - end - - def test_name2 - assert_equal "NamedExampleA", NamedExampleA.name - assert_equal "NamedExampleB", NamedExampleB.name - assert_equal "NamedExampleC", NamedExampleC.name - - spec_a = describe ExampleA do; end - spec_b = describe ExampleB, :random_method do; end - - assert_equal "ExampleA", spec_a.name - assert_equal "ExampleB::random_method", spec_b.name - end - - def test_structure - x, y, z, * = util_structure - - assert_equal "top-level thingy", x.to_s - assert_equal "top-level thingy::inner thingy", y.to_s - assert_equal "top-level thingy::inner thingy::very inner thingy", z.to_s - - assert_equal "top-level thingy", x.desc - assert_equal "inner thingy", y.desc - assert_equal "very inner thingy", z.desc - - top_methods = %w[setup teardown test_0001_top-level-it] - inner_methods1 = %w[setup teardown test_0001_inner-it] - inner_methods2 = inner_methods1 + - %w[test_0002_anonymous test_0003_anonymous] - - assert_defined_methods top_methods, x - assert_defined_methods inner_methods1, y - assert_defined_methods inner_methods2, z - end - - def test_structure_postfix_it - z = nil - y = describe "outer" do - # NOT here, below the inner-describe! - # it "inner-it" do end - - z = describe "inner" do - it "inner-it" do end - end - - # defined AFTER inner describe means we'll try to wipe out the inner-it - it "inner-it" do end - end - - assert_defined_methods %w[test_0001_inner-it], y - assert_defined_methods %w[test_0001_inner-it], z - end - - def test_setup_teardown_behavior - _, _, z, before_list, after_list = util_structure - - @tu = z - - run_tu_with_fresh_reporter - - size = z.runnable_methods.size - assert_equal [1, 2, 3] * size, before_list - assert_equal [3, 2, 1] * size, after_list - end - - def test_describe_first_structure - x1 = x2 = y = z = nil - x = describe "top-level thingy" do - y = describe "first thingy" do end - - x1 = it "top level it" do end - x2 = it "не латинские &いった α, β, γ, δ, ε hello!!! world" do end - - z = describe "second thingy" do end - end - - test_methods = ["test_0001_top level it", - "test_0002_не латинские &いった α, β, γ, δ, ε hello!!! world", - ].sort - - assert_equal test_methods, [x1, x2] - assert_defined_methods test_methods, x - assert_defined_methods [], y - assert_defined_methods [], z - end - - def test_structure_subclasses - z = nil - x = Class.new Minitest::Spec do - def xyz; end - end - y = Class.new x do - z = describe("inner") { } - end - - assert_respond_to x.new(nil), "xyz" - assert_respond_to y.new(nil), "xyz" - assert_respond_to z.new(nil), "xyz" - end -end - -class TestSpecInTestCase < MetaMetaMetaTestCase - def setup - super - - Thread.current[:current_spec] = self - @tc = self - @assertion_count = 2 - end - - def assert_triggered expected, klass = Minitest::Assertion - @assertion_count += 1 - - e = assert_raises klass do - yield - end - - msg = e.message.sub(/(---Backtrace---).*/m, "\1") - msg.gsub!(/\(oid=[-0-9]+\)/, "(oid=N)") - - assert_equal expected, msg - end - - def teardown - msg = "expected #{@assertion_count} assertions, not #{@tc.assertions}" - assert_equal @assertion_count, @tc.assertions, msg - end - - def test_expectation - @tc.assert_equal true, _(1).must_equal(1) - end - - def test_expectation_triggered - assert_triggered "Expected: 2\n Actual: 1" do - _(1).must_equal 2 - end - end - - include Minitest::Spec::DSL::InstanceMethods - - def test_expectation_with_a_message - assert_triggered "woot.\nExpected: 2\n Actual: 1" do - _(1).must_equal 2, "woot" - end - end -end - -class ValueMonadTest < Minitest::Test - attr_accessor :struct - - def setup - @struct = { :_ => "a", :value => "b", :expect => "c" } - def @struct.method_missing k # think openstruct - self[k] - end - end - - def test_value_monad_method - assert_equal "a", struct._ - end - - def test_value_monad_value_alias - assert_equal "b", struct.value - end - - def test_value_monad_expect_alias - assert_equal "c", struct.expect - end -end - -describe Minitest::Spec, :infect_an_assertion do - class << self - attr_accessor :infect_mock - end - - def assert_infects exp, act, msg = nil, foo: nil, bar: nil - self.class.infect_mock.assert_infects exp, act, msg, foo: foo, bar: bar - end - - infect_an_assertion :assert_infects, :must_infect - infect_an_assertion :assert_infects, :must_infect_without_flipping, :dont_flip - - it "infects assertions with kwargs" do - mock = Minitest::Mock.new - mock.expect :assert_infects, true, [:exp, :act, nil], foo: :foo, bar: :bar - - self.class.infect_mock = mock - - _(:act).must_infect :exp, foo: :foo, bar: :bar - - assert_mock mock - end - - it "infects assertions with kwargs (dont_flip)" do - mock = Minitest::Mock.new - mock.expect :assert_infects, true, [:act, :exp, nil], foo: :foo, bar: :bar - - self.class.infect_mock = mock - - _(:act).must_infect_without_flipping :exp, foo: :foo, bar: :bar - - assert_mock mock - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/test/minitest/test_minitest_test.rb b/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/test/minitest/test_minitest_test.rb deleted file mode 100644 index beb24cb..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/test/minitest/test_minitest_test.rb +++ /dev/null @@ -1,1272 +0,0 @@ -# encoding: UTF-8 - -require "pathname" -require "minitest/metametameta" - -if defined? Encoding then - e = Encoding.default_external - if e != Encoding::UTF_8 then - warn "" - warn "" - warn "NOTE: External encoding #{e} is not UTF-8. Tests WILL fail." - warn " Run tests with `RUBYOPT=-Eutf-8 rake` to avoid errors." - warn "" - warn "" - end -end - -class Minitest::Runnable - def whatever # faked for testing - assert true - end -end - -class TestMinitestUnit < MetaMetaMetaTestCase - parallelize_me! - - pwd = Pathname.new File.expand_path Dir.pwd - basedir = Pathname.new(File.expand_path "lib/minitest") + "mini" - basedir = basedir.relative_path_from(pwd).to_s - MINITEST_BASE_DIR = basedir[/\A\./] ? basedir : "./#{basedir}" - BT_MIDDLE = ["#{MINITEST_BASE_DIR}/test.rb:161:in `each'", - "#{MINITEST_BASE_DIR}/test.rb:158:in `each'", - "#{MINITEST_BASE_DIR}/test.rb:139:in `run'", - "#{MINITEST_BASE_DIR}/test.rb:106:in `run'"] - - def test_filter_backtrace - # this is a semi-lame mix of relative paths. - # I cheated by making the autotest parts not have ./ - bt = (["lib/autotest.rb:571:in `add_exception'", - "test/test_autotest.rb:62:in `test_add_exception'", - "#{MINITEST_BASE_DIR}/test.rb:165:in `__send__'"] + - BT_MIDDLE + - ["#{MINITEST_BASE_DIR}/test.rb:29", - "test/test_autotest.rb:422"]) - bt = util_expand_bt bt - - ex = ["lib/autotest.rb:571:in `add_exception'", - "test/test_autotest.rb:62:in `test_add_exception'"] - ex = util_expand_bt ex - - Minitest::Test.io_lock.synchronize do # try not to trounce in parallel - fu = Minitest.filter_backtrace(bt) - - assert_equal ex, fu - end - end - - def test_filter_backtrace_all_unit - bt = (["#{MINITEST_BASE_DIR}/test.rb:165:in `__send__'"] + - BT_MIDDLE + - ["#{MINITEST_BASE_DIR}/test.rb:29"]) - ex = bt.clone - fu = Minitest.filter_backtrace(bt) - assert_equal ex, fu - end - - def test_filter_backtrace_unit_starts - bt = (["#{MINITEST_BASE_DIR}/test.rb:165:in `__send__'"] + - BT_MIDDLE + - ["#{MINITEST_BASE_DIR}/mini/test.rb:29", - "-e:1"]) - - bt = util_expand_bt bt - - ex = ["-e:1"] - Minitest::Test.io_lock.synchronize do # try not to trounce in parallel - fu = Minitest.filter_backtrace bt - assert_equal ex, fu - end - end - - def test_filter_backtrace__empty - with_empty_backtrace_filter do - bt = %w[first second third] - fu = Minitest.filter_backtrace bt.dup - assert_equal bt, fu - end - end - - def test_infectious_binary_encoding - @tu = Class.new FakeNamedTest do - def test_this_is_not_ascii_assertion - assert_equal "ЁЁЁ", "ёёё" - end - - def test_this_is_non_ascii_failure_message - fail 'ЁЁЁ'.force_encoding('ASCII-8BIT') - end - end - - expected = clean <<-EOM - FE - - Finished in 0.00 - - 1) Failure: - FakeNamedTestXX#test_this_is_not_ascii_assertion [FILE:LINE]: - Expected: \"ЁЁЁ\" - Actual: \"ёёё\" - - 2) Error: - FakeNamedTestXX#test_this_is_non_ascii_failure_message: - RuntimeError: ЁЁЁ - FILE:LINE:in `test_this_is_non_ascii_failure_message' - - 2 runs, 1 assertions, 1 failures, 1 errors, 0 skips - EOM - - Minitest::Test.io_lock.synchronize do # try not to trounce in parallel - assert_report expected - end - end - - def test_passed_eh_teardown_good - test_class = Class.new FakeNamedTest do - def teardown; assert true; end - def test_omg; assert true; end - end - - test = test_class.new :test_omg - test.run - - refute_predicate test, :error? - assert_predicate test, :passed? - refute_predicate test, :skipped? - end - - def test_passed_eh_teardown_skipped - test_class = Class.new FakeNamedTest do - def teardown; assert true; end - def test_omg; skip "bork"; end - end - - test = test_class.new :test_omg - test.run - - refute_predicate test, :error? - refute_predicate test, :passed? - assert_predicate test, :skipped? - end - - def test_passed_eh_teardown_flunked - test_class = Class.new FakeNamedTest do - def teardown; flunk; end - def test_omg; assert true; end - end - - test = test_class.new :test_omg - test.run - - refute_predicate test, :error? - refute_predicate test, :passed? - refute_predicate test, :skipped? - end - - def util_expand_bt bt - bt.map { |f| (f =~ /^\./) ? File.expand_path(f) : f } - end -end - -class TestMinitestUnitInherited < MetaMetaMetaTestCase - def with_overridden_include - Class.class_eval do - def inherited_with_hacks _klass - throw :inherited_hook - end - - alias inherited_without_hacks inherited - alias inherited inherited_with_hacks - alias IGNORE_ME! inherited # 1.8 bug. god I love venture bros - end - - yield - ensure - Class.class_eval do - alias inherited inherited_without_hacks - - undef_method :inherited_with_hacks - undef_method :inherited_without_hacks - end - - refute_respond_to Class, :inherited_with_hacks - refute_respond_to Class, :inherited_without_hacks - end - - def test_inherited_hook_plays_nice_with_others - with_overridden_include do - assert_throws :inherited_hook do - Class.new FakeNamedTest - end - end - end -end - -class TestMinitestRunner < MetaMetaMetaTestCase - # do not parallelize this suite... it just can't handle it. - - def test_class_runnables - @assertion_count = 0 - - tc = Class.new(Minitest::Test) - - assert_equal 1, Minitest::Test.runnables.size - assert_equal [tc], Minitest::Test.runnables - end - - def test_run_test - @tu = - Class.new FakeNamedTest do - attr_reader :foo - - def run - @foo = "hi mom!" - r = super - @foo = "okay" - - r - end - - def test_something - assert_equal "hi mom!", foo - end - end - - expected = clean <<-EOM - . - - Finished in 0.00 - - 1 runs, 1 assertions, 0 failures, 0 errors, 0 skips - EOM - - assert_report expected - end - - def test_run_error - @tu = - Class.new FakeNamedTest do - def test_something - assert true - end - - def test_error - raise "unhandled exception" - end - end - - expected = clean <<-EOM - .E - - Finished in 0.00 - - 1) Error: - FakeNamedTestXX#test_error: - RuntimeError: unhandled exception - FILE:LINE:in \`test_error\' - - 2 runs, 1 assertions, 0 failures, 1 errors, 0 skips - EOM - - assert_report expected - end - - def test_run_error_teardown - @tu = - Class.new FakeNamedTest do - def test_something - assert true - end - - def teardown - raise "unhandled exception" - end - end - - expected = clean <<-EOM - E - - Finished in 0.00 - - 1) Error: - FakeNamedTestXX#test_something: - RuntimeError: unhandled exception - FILE:LINE:in \`teardown\' - - 1 runs, 1 assertions, 0 failures, 1 errors, 0 skips - EOM - - assert_report expected - end - - def test_run_failing - setup_basic_tu - - expected = clean <<-EOM - .F - - Finished in 0.00 - - 1) Failure: - FakeNamedTestXX#test_failure [FILE:LINE]: - Expected false to be truthy. - - 2 runs, 2 assertions, 1 failures, 0 errors, 0 skips - EOM - - assert_report expected - end - - def setup_basic_tu - @tu = - Class.new FakeNamedTest do - def test_something - assert true - end - - def test_failure - assert false - end - end - end - - def test_seed # this is set for THIS run, so I'm not testing it's actual value - assert_instance_of Integer, Minitest.seed - end - - def test_run_failing_filtered - setup_basic_tu - - expected = clean <<-EOM - . - - Finished in 0.00 - - 1 runs, 1 assertions, 0 failures, 0 errors, 0 skips - EOM - - assert_report expected, %w[--name /some|thing/ --seed 42] - end - - def assert_filtering filter, name, expected, a = false - args = %W[--#{filter} #{name} --seed 42] - - alpha = Class.new FakeNamedTest do - define_method :test_something do - assert a - end - end - Object.const_set(:Alpha, alpha) - - beta = Class.new FakeNamedTest do - define_method :test_something do - assert true - end - end - Object.const_set(:Beta, beta) - - @tus = [alpha, beta] - - assert_report expected, args - ensure - Object.send :remove_const, :Alpha - Object.send :remove_const, :Beta - end - - def test_run_filtered_including_suite_name - expected = clean <<-EOM - . - - Finished in 0.00 - - 1 runs, 1 assertions, 0 failures, 0 errors, 0 skips - EOM - - assert_filtering "name", "/Beta#test_something/", expected - end - - def test_run_filtered_including_suite_name_string - expected = clean <<-EOM - . - - Finished in 0.00 - - 1 runs, 1 assertions, 0 failures, 0 errors, 0 skips - EOM - - assert_filtering "name", "Beta#test_something", expected - end - - def test_run_filtered_string_method_only - expected = clean <<-EOM - .. - - Finished in 0.00 - - 2 runs, 2 assertions, 0 failures, 0 errors, 0 skips - EOM - - assert_filtering "name", "test_something", expected, :pass - end - - def test_run_failing_excluded - setup_basic_tu - - expected = clean <<-EOM - . - - Finished in 0.00 - - 1 runs, 1 assertions, 0 failures, 0 errors, 0 skips - EOM - - assert_report expected, %w[--exclude /failure/ --seed 42] - end - - def test_run_filtered_excluding_suite_name - expected = clean <<-EOM - . - - Finished in 0.00 - - 1 runs, 1 assertions, 0 failures, 0 errors, 0 skips - EOM - - assert_filtering "exclude", "/Alpha#test_something/", expected - end - - def test_run_filtered_excluding_suite_name_string - expected = clean <<-EOM - . - - Finished in 0.00 - - 1 runs, 1 assertions, 0 failures, 0 errors, 0 skips - EOM - - assert_filtering "exclude", "Alpha#test_something", expected - end - - def test_run_filtered_excluding_string_method_only - expected = clean <<-EOM - - - Finished in 0.00 - - 0 runs, 0 assertions, 0 failures, 0 errors, 0 skips - EOM - - assert_filtering "exclude", "test_something", expected, :pass - end - - def test_run_passing - @tu = - Class.new FakeNamedTest do - def test_something - assert true - end - end - - expected = clean <<-EOM - . - - Finished in 0.00 - - 1 runs, 1 assertions, 0 failures, 0 errors, 0 skips - EOM - - assert_report expected - end - - def test_run_skip - @tu = - Class.new FakeNamedTest do - def test_something - assert true - end - - def test_skip - skip "not yet" - end - end - - expected = clean <<-EOM - .S - - Finished in 0.00 - - 2 runs, 1 assertions, 0 failures, 0 errors, 1 skips - - You have skipped tests. Run with --verbose for details. - EOM - - restore_env do - assert_report expected - end - end - - def test_run_skip_verbose - @tu = - Class.new FakeNamedTest do - def test_something - assert true - end - - def test_skip - skip "not yet" - end - end - - expected = clean <<-EOM - FakeNamedTestXX#test_something = 0.00 s = . - FakeNamedTestXX#test_skip = 0.00 s = S - - Finished in 0.00 - - 1) Skipped: - FakeNamedTestXX#test_skip [FILE:LINE]: - not yet - - 2 runs, 1 assertions, 0 failures, 0 errors, 1 skips - EOM - - assert_report expected, %w[--seed 42 --verbose] - end - - def test_run_skip_show_skips - @tu = - Class.new FakeNamedTest do - def test_something - assert true - end - - def test_skip - skip "not yet" - end - end - - expected = clean <<-EOM - .S - - Finished in 0.00 - - 1) Skipped: - FakeNamedTestXX#test_skip [FILE:LINE]: - not yet - - 2 runs, 1 assertions, 0 failures, 0 errors, 1 skips - EOM - - assert_report expected, %w[--seed 42 --show-skips] - end - - def test_run_with_other_runner - @tu = - Class.new FakeNamedTest do - def self.run reporter, options = {} - @reporter = reporter - before_my_suite - super - end - - def self.name; "wacky!" end - - def self.before_my_suite - @reporter.io.puts "Running #{self.name} tests" - @@foo = 1 - end - - def test_something - assert_equal 1, @@foo - end - - def test_something_else - assert_equal 1, @@foo - end - end - - expected = clean <<-EOM - Running wacky! tests - .. - - Finished in 0.00 - - 2 runs, 2 assertions, 0 failures, 0 errors, 0 skips - EOM - - assert_report expected - end - - require "monitor" - - class Latch - def initialize count = 1 - @count = count - @lock = Monitor.new - @cv = @lock.new_cond - end - - def release - @lock.synchronize do - @count -= 1 if @count > 0 - @cv.broadcast if @count == 0 - end - end - - def await - @lock.synchronize { @cv.wait_while { @count > 0 } } - end - end - - def test_run_parallel - test_count = 2 - test_latch = Latch.new test_count - wait_latch = Latch.new test_count - main_latch = Latch.new - - thread = Thread.new { - Thread.current.abort_on_exception = true - - # This latch waits until both test latches have been released. Both - # latches can't be released unless done in separate threads because - # `main_latch` keeps the test method from finishing. - test_latch.await - main_latch.release - } - - @tu = - Class.new FakeNamedTest do - parallelize_me! - - test_count.times do |i| - define_method :"test_wait_on_main_thread_#{i}" do - test_latch.release - - # This latch blocks until the "main thread" releases it. The main - # thread can't release this latch until both test latches have - # been released. This forces the latches to be released in separate - # threads. - main_latch.await - assert true - end - end - end - - expected = clean <<-EOM - .. - - Finished in 0.00 - - 2 runs, 2 assertions, 0 failures, 0 errors, 0 skips - EOM - - skip if Minitest.parallel_executor.size < 2 # locks up test runner if 1 CPU - - assert_report(expected) do |reporter| - reporter.extend(Module.new { - define_method("record") do |result| - super(result) - wait_latch.release - end - - define_method("report") do - wait_latch.await - super() - end - }) - end - assert thread.join - end -end - -class TestMinitestUnitOrder < MetaMetaMetaTestCase - # do not parallelize this suite... it just can't handle it. - - def test_before_setup - call_order = [] - @tu = - Class.new FakeNamedTest do - define_method :setup do - super() - call_order << :setup - end - - define_method :before_setup do - call_order << :before_setup - end - - def test_omg; assert true; end - end - - run_tu_with_fresh_reporter - - expected = [:before_setup, :setup] - assert_equal expected, call_order - end - - def test_after_teardown - call_order = [] - @tu = - Class.new FakeNamedTest do - define_method :teardown do - super() - call_order << :teardown - end - - define_method :after_teardown do - call_order << :after_teardown - end - - def test_omg; assert true; end - end - - run_tu_with_fresh_reporter - - expected = [:teardown, :after_teardown] - assert_equal expected, call_order - end - - def test_all_teardowns_are_guaranteed_to_run - call_order = [] - @tu = - Class.new FakeNamedTest do - define_method :after_teardown do - super() - call_order << :after_teardown - raise - end - - define_method :teardown do - super() - call_order << :teardown - raise - end - - define_method :before_teardown do - super() - call_order << :before_teardown - raise - end - - def test_omg; assert true; end - end - - run_tu_with_fresh_reporter - - expected = [:before_teardown, :teardown, :after_teardown] - assert_equal expected, call_order - end - - def test_setup_and_teardown_survive_inheritance - call_order = [] - - @tu = Class.new FakeNamedTest do - define_method :setup do - call_order << :setup_method - end - - define_method :teardown do - call_order << :teardown_method - end - - define_method :test_something do - call_order << :test - end - end - - run_tu_with_fresh_reporter - - @tu = Class.new @tu - run_tu_with_fresh_reporter - - # Once for the parent class, once for the child - expected = [:setup_method, :test, :teardown_method] * 2 - - assert_equal expected, call_order - end -end - -class BetterError < RuntimeError # like better_error w/o infecting RuntimeError - def set_backtrace bt - super - @bad_ivar = binding - end -end - -class TestMinitestRunnable < Minitest::Test - def setup_marshal klass - tc = klass.new "whatever" - tc.assertions = 42 - tc.failures << "a failure" - - yield tc if block_given? - - def tc.setup - @blah = "blah" - end - tc.setup - - @tc = Minitest::Result.from tc - end - - def assert_marshal expected_ivars - new_tc = Marshal.load Marshal.dump @tc - - ivars = new_tc.instance_variables.map(&:to_s).sort - assert_equal expected_ivars, ivars - assert_equal "whatever", new_tc.name - assert_equal 42, new_tc.assertions - assert_equal ["a failure"], new_tc.failures - - yield new_tc if block_given? - end - - def test_marshal - setup_marshal Minitest::Runnable - - assert_marshal %w[@NAME @assertions @failures @klass @source_location @time] - end - - def test_spec_marshal - klass = describe("whatever") { it("passes") { assert true } } - rm = klass.runnable_methods.first - - # Run the test - @tc = klass.new(rm).run - - assert_kind_of Minitest::Result, @tc - - # Pass it over the wire - over_the_wire = Marshal.load Marshal.dump @tc - - assert_equal @tc.time, over_the_wire.time - assert_equal @tc.name, over_the_wire.name - assert_equal @tc.assertions, over_the_wire.assertions - assert_equal @tc.failures, over_the_wire.failures - assert_equal @tc.klass, over_the_wire.klass - end - - def test_spec_marshal_with_exception - klass = describe("whatever") { - it("raises, badly") { - raise Class.new(StandardError), "this is bad!" - } - } - - rm = klass.runnable_methods.first - - # Run the test - @tc = klass.new(rm).run - - assert_kind_of Minitest::Result, @tc - assert_instance_of Minitest::UnexpectedError, @tc.failure - - msg = @tc.failure.error.message - assert_includes msg, "Neutered Exception #: boom", msg - - # Pass it over the wire - over_the_wire = Marshal.load Marshal.dump @tc - - assert_equal @tc.time, over_the_wire.time - assert_equal @tc.name, over_the_wire.name - assert_equal @tc.assertions, over_the_wire.assertions - assert_equal @tc.failures, over_the_wire.failures - assert_equal @tc.klass, over_the_wire.klass - end -end - -class TestMinitestTest < TestMinitestRunnable - def test_dup - setup_marshal Minitest::Test do |tc| - tc.time = 3.14 - end - - assert_marshal %w[@NAME @assertions @failures @klass @source_location @time] do |new_tc| - assert_in_epsilon 3.14, new_tc.time - end - end -end - -class TestMinitestUnitTestCase < Minitest::Test - # do not call parallelize_me! - teardown accesses @tc._assertions - # which is not threadsafe. Nearly every method in here is an - # assertion test so it isn't worth splitting it out further. - - RUBY18 = !defined? Encoding - - def setup - super - - Minitest::Test.reset - - @tc = Minitest::Test.new "fake tc" - @zomg = "zomg ponies!" - @assertion_count = 1 - end - - def teardown - assert_equal(@assertion_count, @tc.assertions, - "expected #{@assertion_count} assertions to be fired during the test, not #{@tc.assertions}") if @tc.passed? - end - - def non_verbose - orig_verbose = $VERBOSE - $VERBOSE = false - - yield - ensure - $VERBOSE = orig_verbose - end - - def sample_test_case(rand) - srand rand - Class.new FakeNamedTest do - 100.times do |i| - define_method("test_#{i}") { assert true } - end - end.runnable_methods - end - - # srand varies with OS - def test_runnable_methods_random - @assertion_count = 0 - - random_tests_1 = sample_test_case 42 - random_tests_2 = sample_test_case 42 - random_tests_3 = sample_test_case 1_000 - - assert_equal random_tests_1, random_tests_2 - assert_equal random_tests_1, random_tests_3 - end - - def test_runnable_methods_sorted - @assertion_count = 0 - - sample_test_case = Class.new FakeNamedTest do - def self.test_order; :sorted end - def test_test3; assert "does not matter" end - def test_test2; assert "does not matter" end - def test_test1; assert "does not matter" end - end - - expected = %w[test_test1 test_test2 test_test3] - assert_equal expected, sample_test_case.runnable_methods - end - - def test_i_suck_and_my_tests_are_order_dependent_bang_sets_test_order_alpha - @assertion_count = 0 - - shitty_test_case = Class.new FakeNamedTest - - shitty_test_case.i_suck_and_my_tests_are_order_dependent! - - assert_equal :alpha, shitty_test_case.test_order - end - - def test_i_suck_and_my_tests_are_order_dependent_bang_does_not_warn - @assertion_count = 0 - - shitty_test_case = Class.new FakeNamedTest - - def shitty_test_case.test_order; :lol end - - assert_silent do - shitty_test_case.i_suck_and_my_tests_are_order_dependent! - end - end - - def test_autorun_does_not_affect_fork_success_status - @assertion_count = 0 - skip "windows doesn't have skip" unless Process.respond_to?(:fork) - Process.waitpid(fork {}) - assert_equal true, $?.success? - end - - def test_autorun_does_not_affect_fork_exit_status - @assertion_count = 0 - skip "windows doesn't have skip" unless Process.respond_to?(:fork) - Process.waitpid(fork { exit 42 }) - assert_equal 42, $?.exitstatus - end -end - -class TestMinitestGuard < Minitest::Test - parallelize_me! - - def test_mri_eh - assert self.class.mri? "ruby blah" - assert self.mri? "ruby blah" - end - - def test_jruby_eh - assert self.class.jruby? "java" - assert self.jruby? "java" - end - - def test_rubinius_eh - assert_output "", /DEPRECATED/ do - assert self.class.rubinius? "rbx" - end - assert_output "", /DEPRECATED/ do - assert self.rubinius? "rbx" - end - end - - def test_maglev_eh - assert_output "", /DEPRECATED/ do - assert self.class.maglev? "maglev" - end - assert_output "", /DEPRECATED/ do - assert self.maglev? "maglev" - end - end - - def test_osx_eh - assert self.class.osx? "darwin" - assert self.osx? "darwin" - end - - def test_windows_eh - assert self.class.windows? "mswin" - assert self.windows? "mswin" - end -end - -class TestMinitestUnitRecording < MetaMetaMetaTestCase - # do not parallelize this suite... it just can't handle it. - - def assert_run_record *expected, &block - @tu = Class.new FakeNamedTest, &block - - run_tu_with_fresh_reporter - - recorded = first_reporter.results.map(&:failures).flatten.map { |f| f.error.class } - - assert_equal expected, recorded - end - - def test_run_with_bogus_reporter - # https://github.com/seattlerb/minitest/issues/659 - # TODO: remove test for minitest 6 - @tu = Class.new FakeNamedTest do - def test_method - assert true - end - end - - bogus_reporter = Class.new do # doesn't subclass AbstractReporter - def start; @success = false; end - # def prerecord klass, name; end # doesn't define full API - def record result; @success = true; end - def report; end - def passed?; end - def results; end - def success?; @success; end - end.new - - self.reporter = Minitest::CompositeReporter.new - reporter << bogus_reporter - - Minitest::Runnable.runnables.delete @tu - - @tu.run reporter, {} - - assert_predicate bogus_reporter, :success? - end - - def test_record_passing - assert_run_record do - def test_method - assert true - end - end - end - - def test_record_failing - assert_run_record Minitest::Assertion do - def test_method - assert false - end - end - end - - def test_record_error - assert_run_record RuntimeError do - def test_method - raise "unhandled exception" - end - end - end - - def test_record_error_teardown - assert_run_record RuntimeError do - def test_method - assert true - end - - def teardown - raise "unhandled exception" - end - end - end - - def test_record_error_in_test_and_teardown - assert_run_record AnError, RuntimeError do - def test_method - raise AnError - end - - def teardown - raise "unhandled exception" - end - end - end - - def test_to_s_error_in_test_and_teardown - @tu = Class.new FakeNamedTest do - def test_method - raise AnError - end - - def teardown - raise "unhandled exception" - end - end - - run_tu_with_fresh_reporter - - exp = clean " - Error: - FakeNamedTestXX#test_method: - AnError: AnError - FILE:LINE:in `test_method' - - Error: - FakeNamedTestXX#test_method: - RuntimeError: unhandled exception - FILE:LINE:in `teardown' - " - - assert_equal exp.strip, normalize_output(first_reporter.results.first.to_s).strip - end - - def test_record_skip - assert_run_record Minitest::Skip do - def test_method - skip "not yet" - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/test/minitest/test_minitest_test_task.rb b/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/test/minitest/test_minitest_test_task.rb deleted file mode 100644 index 11b2618..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/minitest-5.18.0/test/minitest/test_minitest_test_task.rb +++ /dev/null @@ -1,46 +0,0 @@ -require "minitest/autorun" -require "hoe" - -require "minitest/test_task" - -Hoe.load_plugins # make sure Hoe::Test is loaded - -class TestHoeTest < Minitest::Test - PATH = "test/minitest/test_minitest_test_task.rb" - - mt_path = %w[lib test .].join File::PATH_SEPARATOR - - MT_EXPECTED = %W[-I#{mt_path} -w - -e '%srequire "#{PATH}"' - --].join(" ") + " " - - def test_make_test_cmd_for_minitest - skip "Using TESTOPTS... skipping" if ENV["TESTOPTS"] - - require "minitest/test_task" - - framework = %(require "minitest/autorun"; ) - - @tester = Minitest::TestTask.create :test do |t| - t.test_globs = [PATH] - end - - assert_equal MT_EXPECTED % [framework].join("; "), @tester.make_test_cmd - end - - def test_make_test_cmd_for_minitest_prelude - skip "Using TESTOPTS... skipping" if ENV["TESTOPTS"] - - require "minitest/test_task" - - prelude = %(require "other/file") - framework = %(require "minitest/autorun"; ) - - @tester = Minitest::TestTask.create :test do |t| - t.test_prelude = prelude - t.test_globs = [PATH] - end - - assert_equal MT_EXPECTED % [prelude, framework].join("; "), @tester.make_test_cmd - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/molinillo-0.8.0/ARCHITECTURE.md b/example/vendor/bundle/ruby/2.7.0/gems/molinillo-0.8.0/ARCHITECTURE.md deleted file mode 100644 index 528fa83..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/molinillo-0.8.0/ARCHITECTURE.md +++ /dev/null @@ -1,102 +0,0 @@ -# Molinillo Architecture - -At the highest level, Molinillo is a dependency resolution algorithm. -You hand the `Resolver` a list of dependencies and a 'locking' `DependencyGraph`, and you get a resulting dependency graph out of that. -In order to guarantee that the list of dependencies is properly resolved, however, an algorithm is required that is smarter than just walking the list of dependencies and activating each, and its own dependencies, in turn. - -## Backtracking - -At the heart of Molinillo is a [backtracking](http://en.wikipedia.org/wiki/Backtracking) algorithm with [forward checking](http://en.wikipedia.org/wiki/Look-ahead_(backtracking)). -Essentially, the resolution process keeps track of two types of states (dependency and possibility) in a stack. -If that stack is ever exhausted, resolution was impossible. -New states are pushed onto the stack for every dependency, and every time a dependency is successfully 'activated' a new state is pushed onto the stack that represents that activation. -This stack-based approach is used because backtracking (also known as *unwinding*) becomes as simple as popping a state off that stack. - -### Walkthrough - -1. The client initializes a `Resolver` with a `SpecificationProvider` and `UI` -2. The client calls `resolve` with an array of user-requested dependencies and an optional 'locking' `DependencyGraph` -3. The `Resolver` creates a new `Resolution` with those four user-specified parameters and calls `resolve` on it -4. The `Resolution` creates an `initial_state`, which takes the user-requested dependencies and puts them into a `DependencyState` - - In the process of creating the state, the `SpecificationProvider` is asked to sort the dependencies and return all the `possibilities` for the `initial_requirement` (taking into account whether the dependency is `locked`). These possibilities are then grouped into `PossibilitySet`s, with each set representing a group of versions for the dependency which share the same sub-dependency requirements and are contiguous - - A `DependencyGraph` is created that has all of these requirements point to `root_vertices` -5. The resolution process now enters its main loop, which continues as long as there is a current `state` to process, and the current state has requirements left to process -6. `UI#indicate_progress` is called to allow the client to report progress -7. If the current state is a `DependencyState`, we have it pop off a `PossibilityState` that encapsulates a `PossibilitySet` for that dependency -8. Process the topmost state on the stack -9. If there is a non-empty `PossibilitySet` for the state, `attempt_to_activate` it (jump to #11) -10. If there is no non-empty `PossibilitySet` for the state, `create_conflict` if the state is a `PossibilityState`, and then `unwind_for_conflict` - - `create_conflict` builds a `Conflict` object, with details of all of the requirements for the given dependency, and adds it to a hash of conflicts stored on the `state`, indexed by the name of the dependency - - `unwind_for_conflict` loops through all the conflicts on the `state`, looking for a state it can rewind to that might avoid that conflict. If no such state exists, it raises a VersionConflict error. Otherwise, it takes the most recent state with a chance to avoid the current conflicts and rewinds to it (go to #6) -11. Check if there is an existing vertex in the `activated` dependency graph for the dependency this state's `requirement` relates to -12. If there is no existing vertex in the `activated` dependency graph for the dependency this state's `requirement` relates to, `activate_new_spec`. This creates a new vertex in the `activated` dependency graph, with it's payload set to the possibility's `PossibilitySet`. It also pushes a new `DependencyState`, with the now-activated `PossibilitySet`'s own dependencies. Go to #6 -13. If there is an existing, `activated` vertex for the dependency, `attempt_to_filter_existing_spec` - - This filters the contents of the existing vertex's `PossibilitySet` by the current state's `requirement` - - If any possibilities remain within the `PossibilitySet`, it updates the activated vertex's payload with the new, filtered state and pushes a new `DependencyState` - - If no possibilities remain within the `PossibilitySet` after filtering, or if the current state's `PossibilitySet` had a different set of sub-dependency requirements to the existing vertex's `PossibilitySet`, `create_conflict` and `unwind_for_conflict`, back to the last `DependencyState` that has a chance to not generate a conflict. Go to #6 -15. Terminate with the topmost state's dependency graph when there are no more requirements left -16. For each vertex with a payload of allowable versions for this resolution (i.e., a `PossibilitySet`), pick a single specific version. - -### Optimal unwinding - -For our backtracking algorithm to be efficient as well as correct, we need to -unwind efficiently after a conflict is encountered. Unwind too far and we'll -miss valid resolutions - once we unwind passed a DependencyState we can never -get there again. Unwind too little and resolution will be extremely slow - we'll -repeatedly hit the same conflict, processing many unnecessary iterations before -getting to a branch that avoids it. - -To unwind the optimal amount, we consider the current conflict, along with all -the previous unwinds that have determined our current state. - -1. First, consider the current conflict as follows: - - Find the earliest (lowest index) set of requirements which combine to cause - the conflict. Any non-binding requirements can be ignored, as removing them - would not resolve the current conflict - - For each binding requirement, find all the alternative possibilities that - would relax the requirement: - - the requirement's DependencyState might have alternative possibilities - that would satisfy all the other requirements - - the parent of the requirement might have alternative possibilities that - would prevent the requirement existing - - the parent of the parent of the requirement might have alternative - possibilities that would prevent the parent, and thus the requirement, - from existing - - etc., etc. - - Group all of the above possibilities into an array, and pick the one with - the highest index (i.e., the smallest rewind) as our candidate rewind -2. Next, consider any previous unwinds that were not executed (because a -different, smaller unwind was chosen instead): - - Ignore any previously unused unwinds that would now unwind further than the - highest index found in (1), if any - - For the remaining unused unwinds, check whether the unwind has a chance of - preventing us encountering the current conflict. For this to be the case, the - unwind must have been rejected in favour of an unwind to one of the states in - the current conflict's requirement tree - - If any such unwinds exist, use the one with the highest index (smallest - unwind) instead of the one found in (1) -3a. If no possible unwind was found in (1) and (2), raise a VersionConflict -error as resolution is not possible. -3b. Filter the state that we're unwinding to, in order to remove any -possibilities we know will result in a conflict. Consider all possible unwinds -to the chosen state (there may be several, amassed from previous unused -unwinds for different conflicts) when doing this filtering - only -possibilities that will certainly result in *all* of those conflicts can be -filtered out as having no chance of resolution -4. Update the list of unused unwinds: - - Add all possible unwinds for the current conflict - - Update the `requirements_unwound_to_instead` attribute on any considered - unwind that was only rejected because it had a lower index than the chosen one - - Remove all unwinds to a state greater than or equal to the chosen unwind -5. Go to #6 in the main loop - -## Specification Provider - -The `SpecificationProvider` module forms the basis for the key integration point for a client library with Molinillo. -Its methods convert the client's domain-specific model objects into concepts the resolver understands: - -- Nested dependencies -- Names -- Requirement satisfaction -- Finding specifications (known internally as `possibilities`) -- Sorting dependencies (for the sake of reasonable resolver performance) diff --git a/example/vendor/bundle/ruby/2.7.0/gems/molinillo-0.8.0/CHANGELOG.md b/example/vendor/bundle/ruby/2.7.0/gems/molinillo-0.8.0/CHANGELOG.md deleted file mode 100644 index 285c69a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/molinillo-0.8.0/CHANGELOG.md +++ /dev/null @@ -1,480 +0,0 @@ -# Molinillo Changelog - -## 0.8.0 (2021-08-09) - -##### Breaking - -* Support for Ruby 2.0, 2.1 and 2.2 has been dropped, the minimum supported - Ruby version is now 2.3. - [David Rodríguez](https://github.com/deivid-rodriguez) - -##### Enhancements - -* Use `Array#-` in unwind logic, since it performs better than `Array#&`, so it - speeds up resolution. - [Lukas Oberhuber](https://github.com/lukaso) - -* Allow specification provider to customize how dependencies are compared when - grouping specifications with the same dependencies. - [David Rodríguez](https://github.com/deivid-rodriguez) - -##### Bug Fixes - -* None. - - -## 0.7.0 (2020-10-21) - -##### Breaking - -* Support for Ruby 1.8.7 and 1.9.3 has been dropped, the minimum supported - Ruby version is now 2.0. - [Samuel Giddins](https://github.com/segiddins) - -##### Enhancements - -* Circular dependency errors include the full (shortest) path between the - circularly-dependent vertices. - [Samuel Giddins](https://github.com/segiddins) - -##### Bug Fixes - -* None. - - -## 0.6.6 (2018-08-07) - -##### Enhancements - -* Improve performance of `Vertex#path_to?`. - [Samuel Giddins](https://github.com/segiddins) - -* Allow customization of string used to say that a version conflict has occurred - for a particular name by passing in the `:incompatible_version_message_for_conflict` - key when constructing a version conflict message with trees. - [Samuel Giddins](https://github.com/segiddins) - -##### Bug Fixes - -* None. - - -## 0.6.5 (2018-03-22) - -##### Enhancements - -* Improve performance of recursive vertex methods. - [Samuel Giddins](https://github.com/segiddins) - -##### Bug Fixes - -* None. - - -## 0.6.4 (2017-10-29) - -##### Enhancements - -* Reduce memory usage during resolution by making the `Vertex#requirements` - array unique. - [Grey Baker](https://github.com/greysteil) - [Jan Krutisch](https://github.com/halfbyte) - -##### Bug Fixes - -* None. - - -## 0.6.3 (2017-09-06) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Handle the case where an unwind occurs to a requirement that directly caused - the current conflict but could also have been unwound to directly from - previous conflicts. In this case, filtering must not remove any possibilities - that could have avoided the previous conflicts (even if they would not avoid - the current one). - [Grey Baker](https://github.com/greysteil) - - -## 0.6.2 (2017-08-25) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Insist each PossibilitySet contains contiguous versions. Fixes a regression - where an older dependency version with identical sub-dependencies to the - latest version may be preferred over the second-latest version. - [Grey Baker](https://github.com/greysteil) - - -## 0.6.1 (2017-08-01) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Allow the set of dependencies for a given possibility to change over time, - fixing a regression in 0.6.0. - [Samuel Giddins](https://github.com/segiddins) - - -## 0.6.0 (2017-07-27) - -##### Breaking - -* Objects returned by `dependencies_for` and passed to `resolve` must properly implement - both `==` and `eql?`, such that they return `true` when they exhibit the same behavior in - `requirement_satisfied_by?`. - -##### Enhancements - -* Speed up dependency resolution by considering multiple possible versions of a - dependency at once, grouped by sub-dependencies. Groups are then filtered as - additional requirements are introduced. If a group's sub-dependencies cause - conflicts the entire group can be discarded, which reduces the number of - possibilities that have to be tested to find a resolution. - [Grey Baker](https://github.com/greysteil) - [Samuel Giddins](https://github.com/segiddins) - [#69](https://github.com/CocoaPods/Molinillo/pull/69) - -* Check for locked requirements when generating a new state's possibilities - array, and reduce possibilities set accordingly. Reduces scope for erroneous - VersionConflict errors. - [Grey Baker](https://github.com/greysteil) - [#67](https://github.com/CocoaPods/Molinillo/pull/67) - -* Add `VersionConflict#message_with_trees` for consumers who prefer a more verbose - conflict message that includes full requirement trees for all conflicts. - [Samuel Giddins](https://github.com/segiddins) - -##### Bug Fixes - -* Improve unwinding by considering previous conflicts for the same dependency - when deciding which state to unwind to. Previously, prior conflicts were - stored in a hash indexed by their name, with only the most recent conflict - stored for each dependency. With this fix, Molinillo can resolve anything - that's thrown at it. 🎉 - [Grey Baker](https://github.com/greysteil) - [#73](https://github.com/CocoaPods/Molinillo/pull/73) - -* Only raise CircularDependency errors if they prevent resolution. - [Ian Young](https://github.com/iangreenleaf) - [Grey Baker](https://github.com/greysteil) - [#78](https://github.com/CocoaPods/Molinillo/pull/78) - -* Consider additional (binding) requirements that caused a conflict when - determining which state to unwind to. Previously, in some cases Molinillo - would erroneously throw a VersionConflict error if multiple requirements - combined to cause a conflict. - [Grey Baker](https://github.com/greysteil) - [#72](https://github.com/CocoaPods/Molinillo/pull/72) - -* Consider previous conflicts when determining the state to unwind to. If a - previous conflict, for a different dependency, is the reason we ended up with - the current conflict, then unwinding to a state that would not have caused - that conflict could prevent the current one, too. - [Grey Baker](https://github.com/greysteil) - [#72](https://github.com/CocoaPods/Molinillo/pull/72) - - -## 0.5.7 (2017-03-03) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Keep a stack of parents per requirement, so unwinding past a swap point that - updated the parent of the requirement works. - [Samuel Giddins](https://github.com/segiddins) - [bundler#5425](https://github.com/bundler/bundler/issues/5425) - - -## 0.5.6 (2017-02-08) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Only reset the parent of a requirement after swapping when its original parent - was the same vertex being swapped. - [Samuel Giddins](https://github.com/segiddins) - [bundler#5359](https://github.com/bundler/bundler/issues/5359) - [bundler#5362](https://github.com/bundler/bundler/issues/5362) - - -## 0.5.5 (2017-01-07) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Only remove requirements from the to-be-resolved list if there are no - activated vertices depending upon them after swapping. - [Samuel Giddins](https://github.com/segiddins) - [bundler#5294](https://github.com/bundler/bundler/issues/5294) - - -## 0.5.4 (2016-11-14) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Fix unwinding when both sides of a conflict have a common parent - requirement. - [Samuel Giddins](https://github.com/segiddins) - [bundler#5154](https://github.com/bundler/bundler/issues/5154) - - -## 0.5.3 (2016-10-28) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Fixed a regression in v0.5.2 that could cause resolution to fail after - swapping, because stale dependencies would still be in the requirements - list. - [Samuel Giddins](https://github.com/segiddins) - [#48](https://github.com/CocoaPods/Molinillo/issues/48) - -* Rename `Action.name` to `Action.action_name` to avoid overriding - `Module.name`. - [Samuel Giddins](https://github.com/segiddins) - [#50](https://github.com/CocoaPods/Molinillo/issues/50) - - -## 0.5.2 (2016-10-24) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Fixed a bug where `Resolution#parent_of` would return the incorrect parent for - a dependency after swapping had occurred, resulting in resolution failing. - [Samuel Giddins](https://github.com/segiddins) - [bundler#5059](https://github.com/bundler/bundler/issues/5059) - - -## 0.5.1 (2016-09-12) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Fixed a bug where `Resolution#parent_of` would return the incorrect parent for - a dependency, resulting in resolution failing. - [Samuel Giddins](https://github.com/segiddins) - [bundler#4961](https://github.com/bundler/bundler/issues/4961) - - -## 0.5.0 (2016-06-14) - -##### Enhancements - -* Add an operation log to `DependencyGraph` to eliminate the need for graph - copies during dependency resolution, resulting in a 3-100x speedup and - reduction in allocations. - [Samuel Giddins](https://github.com/segiddins) - [bundler#4376](https://github.com/bundler/bundler/issues/4376) - -* Remove all metaprogramming to reduce array allocation overhead and improve - discoverability. - [Samuel Giddins](https://github.com/segiddins) - -##### Bug Fixes - -* None. - - -## 0.4.5 (2016-04-30) - -##### Enhancements - -* For performance, don't needlessly dup objects in - `Resolution#push_state_for_requirements`. - [Joe Rafaniello](https://github.com/jrafanie) - -##### Bug Fixes - -* Recursively prune requirements when removing an orphan after swapping. - [Daniel DeLeo](https://github.com/danielsdeleo) - [berkshelf/solve#57](https://github.com/berkshelf/solve/issues/57) - - -## 0.4.4 (2016-02-28) - -##### Bug Fixes - -* Fix mutating a frozen string in `NoSuchDependencyError#message`. - [Samuel Giddins](https://github.com/segiddins) - - -## 0.4.3 (2016-02-18) - -##### Enhancements - -* Add frozen string literal comments to all ruby files. - [Samuel Giddins](https://github.com/segiddins) - -##### Bug Fixes - -* Prune the dependency list when removing an orphan after swapping. - [Samuel Giddins](https://github.com/segiddins) - [bundler/bundler#4276](https://github.com/bundler/bundler/issues/4276) - - -## 0.4.2 (2016-01-30) - -##### Bug Fixes - -* Detaching a vertex correctly removes it from the list of successors of its - predecessors. - [Samuel Giddins](https://github.com/segiddins) - -* Vertices orphaned after swapping dependencies are properly cleaned up from the - graph of activated specs. - [Samuel Giddins](https://github.com/segiddins) - [bundler/bundler#4198](https://github.com/bundler/bundler/issues/4198) - - -## 0.4.1 (2015-12-30) - -##### Enhancements - -* Ensure every API is 100% documented. - [Samuel Giddins](https://github.com/segiddins) - [#22](https://github.com/CocoaPods/Molinillo/issues/22) - - -## 0.4.0 (2015-07-27) - -##### API Breaking Changes - -* The `DependencyGraph` no longer treats root vertices specially, nor does it - maintain a direct reference to `edges`. Additionally, `Vertex` no longer - has a reference to its parent graph. - -##### Enhancements - -* Resolution has been sped up by 25x in some pathological cases, and in general - recursive operations on a `DependencyGraph` or `Vertex` are now `O(n)`. - [Samuel Giddins](https://github.com/segiddins) - [Bundler#3803](https://github.com/bundler/bundler/issues/3803) - -* Re-sorting of dependencies is skipped when the unresolved dependency list has - not changed, speeding up resolution of fully locked graphs. - [Samuel Giddins](https://github.com/segiddins) - - -## 0.3.1 (2015-07-24) - -##### Enhancements - -* Add `Conflict#activated_by_name` to allow even richer version conflict - messages. - [Samuel Giddins](https://github.com/segiddins) - -##### Bug Fixes - -* Ensure `Conflict#requirement_trees` is exhaustive. - [Samuel Giddins](https://github.com/segiddins) - [Bundler#3860](https://github.com/bundler/bundler/issues/3860) - - -## 0.3.0 (2015-06-29) - -##### Enhancements - -* Add the ability to optionally skip dependencies that have no possibilities. - [Samuel Giddins](https://github.com/segiddins) - - -## 0.2.3 (2015-03-28) - -##### Bug Fixes - -* Silence a silly MRI warning about declaring private attributes. - [Piotr Szotkowski](https://github.com/chastell) - [Bundler#3516](https://github.com/bundler/bundler/issues/3516) - [Bundler#3525](https://github.com/bundler/bundler/issues/3525) - - -## 0.2.2 (2015-03-27) - -##### Bug Fixes - -* Use an ivar in `DependencyGraph#initialize_copy` to silence an MRI warning. - [Samuel Giddins](https://github.com/segiddins) - [Bundler#3516](https://github.com/bundler/bundler/issues/3516) - - -## 0.2.1 (2015-02-21) - -* Allow resolving some pathological cases where the backjumping algorithm would - skip over a valid possibility. - [Samuel Giddins](https://github.com/segiddins) - - -## 0.2.0 (2014-12-25) - -* Institute stricter forward checking by backjumping to the source of a - conflict, even if that source comes from the existing spec. This further - improves performance in highly conflicting situations when sorting heuristics - prove misleading. - [Samuel Giddins](https://github.com/segiddins) - [Smit Shah](https://github.com/Who828) - -* Add support for topologically sorting a dependency graph's vertices. - [Samuel Giddins](https://github.com/segiddins) - - -## 0.1.2 (2014-11-19) - -##### Enhancements - -* Improve performance in highly conflicting situations by backtracking more than - one state at a time. - [Samuel Giddins](https://github.com/segiddins) - -##### Bug Fixes - -* Ensure that recursive invocations of `detach_vertex_named` don't lead to - messaging `nil`. - [Samuel Giddins](https://github.com/segiddins) - [CocoaPods#2805](https://github.com/CocoaPods/CocoaPods/issues/2805) - -## 0.1.1 (2014-11-06) - -* Ensure that an unwanted exception is not raised when an error occurs before - the initial state has been pushed upon the stack. - [Samuel Giddins](https://github.com/segiddins) - -## 0.1.0 (2014-10-26) - -* Initial release. - [Samuel Giddins](https://github.com/segiddins) diff --git a/example/vendor/bundle/ruby/2.7.0/gems/molinillo-0.8.0/LICENSE b/example/vendor/bundle/ruby/2.7.0/gems/molinillo-0.8.0/LICENSE deleted file mode 100644 index 01feffa..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/molinillo-0.8.0/LICENSE +++ /dev/null @@ -1,9 +0,0 @@ -This project is licensed under the MIT license. - -Copyright (c) 2014 Samuel E. Giddins segiddins@segiddins.me - -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/example/vendor/bundle/ruby/2.7.0/gems/molinillo-0.8.0/README.md b/example/vendor/bundle/ruby/2.7.0/gems/molinillo-0.8.0/README.md deleted file mode 100644 index b4f3dad..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/molinillo-0.8.0/README.md +++ /dev/null @@ -1,44 +0,0 @@ -# Molinillo - -[![Build Status](https://github.com/CocoaPods/Molinillo/workflows/test/badge.svg)](https://github.com/CocoaPods/Molinillo/actions?query=branch%3Amaster) -[![Coverage](https://img.shields.io/codeclimate/coverage/github/CocoaPods/Molinillo.svg?style=flat)](https://codeclimate.com/github/CocoaPods/Molinillo) -[![Code Climate](https://img.shields.io/codeclimate/github/CocoaPods/Molinillo.svg?style=flat)](https://codeclimate.com/github/CocoaPods/Molinillo) - -A generic dependency-resolution implementation. - -## Installation - -Add this line to your application's Gemfile: - -```ruby -gem 'molinillo', :git => 'https://github.com/CocoaPods/Molinillo' -``` - -And then execute: - -```bash -$ bundle install -``` - -Or install it yourself as: - -```bash -$ gem install molinillo -``` - -## Usage - -See the [ARCHITECTURE](ARCHITECTURE.md) file for an overview and look at the test suite for example usage. - -## Contributing - -1. Fork it -2. Create your feature branch (`git checkout -b my-new-feature`) -3. Commit your changes (`git commit -am 'Add some feature'`) -4. Push to the branch (`git push origin my-new-feature`) -5. Create a pull request - -## The Name - -[Molinillo](http://en.wikipedia.org/wiki/Molinillo_(whisk)) is a special whisk used in Mexico in the preparation of beverages such as hot chocolate. -Much like a dependency resolver, a molinillo helps take a list of ingredients and turn it into a delicious concoction! diff --git a/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/.gitignore b/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/.gitignore deleted file mode 100644 index 9106b2a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -/.bundle/ -/.yardoc -/_yardoc/ -/coverage/ -/doc/ -/pkg/ -/spec/reports/ -/tmp/ diff --git a/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/.rspec b/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/.rspec deleted file mode 100644 index 8c18f1a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/.rspec +++ /dev/null @@ -1,2 +0,0 @@ ---format documentation ---color diff --git a/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/.rubocop.yml b/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/.rubocop.yml deleted file mode 100644 index c97ad8c..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/.rubocop.yml +++ /dev/null @@ -1,14 +0,0 @@ -inherit_from: - - .rubocop_todo.yml - -AllCops: - TargetRubyVersion: 2.1 - Exclude: - - 'lib/nanaimo/unicode/**/*.rb' - - 'vendor/**/*' - -Lint/AssignmentInCondition: - Enabled: false - -Metrics: - Enabled: false diff --git a/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/.rubocop_todo.yml b/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/.rubocop_todo.yml deleted file mode 100644 index 53bfac5..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/.rubocop_todo.yml +++ /dev/null @@ -1,104 +0,0 @@ -# This configuration was generated by -# `rubocop --auto-gen-config` -# on 2018-02-13 09:45:35 -0800 using RuboCop version 0.52.1. -# The point is for the user to remove these configuration records -# one by one as the offenses are removed from the code base. -# Note that changes in the inspected code, or installation of new -# versions of RuboCop, may require this file to be generated again. - -# Offense count: 22 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle. -# SupportedStyles: auto_detection, squiggly, active_support, powerpack, unindent -Layout/IndentHeredoc: - Exclude: - - 'Rakefile' - - 'lib/nanaimo/writer/xml.rb' - - 'spec/nanaimo/reader_spec.rb' - - 'spec/nanaimo/writer/xml_spec.rb' - -# Offense count: 2 -# Configuration parameters: Blacklist. -# Blacklist: END, (?-mix:EO[A-Z]{1}) -Naming/HeredocDelimiterNaming: - Exclude: - - 'lib/nanaimo/writer/xml.rb' - -# Offense count: 3 -# Cop supports --auto-correct. -Performance/RegexpMatch: - Exclude: - - 'lib/nanaimo/unicode.rb' - - 'lib/nanaimo/writer.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle. -# SupportedStyles: compact, expanded -Style/EmptyMethod: - Exclude: - - 'lib/nanaimo/writer/xml.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -Style/Encoding: - Exclude: - - 'nanaimo.gemspec' - -# Offense count: 2 -# Configuration parameters: . -# SupportedStyles: annotated, template, unannotated -Style/FormatStringToken: - EnforcedStyle: unannotated - -# Offense count: 2 -Style/IdenticalConditionalBranches: - Exclude: - - 'lib/nanaimo/unicode.rb' - -# Offense count: 4 -# Cop supports --auto-correct. -Style/IfUnlessModifier: - Exclude: - - 'lib/nanaimo/reader.rb' - - 'lib/nanaimo/unicode.rb' - -# Offense count: 3 -# Cop supports --auto-correct. -# Configuration parameters: AutoCorrect, EnforcedStyle. -# SupportedStyles: predicate, comparison -Style/NumericPredicate: - Exclude: - - 'spec/**/*' - - 'lib/nanaimo/writer.rb' - -# Offense count: 8 -# Cop supports --auto-correct. -# Configuration parameters: PreferredDelimiters. -Style/PercentLiteralDelimiters: - Exclude: - - 'lib/nanaimo/reader.rb' - - 'lib/nanaimo/unicode.rb' - - 'spec/nanaimo/reader_spec.rb' - - 'spec/nanaimo/unicode_spec.rb' - - 'spec/nanaimo/writer/xml_spec.rb' - - 'spec/nanaimo/writer_spec.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -Style/RedundantFreeze: - Exclude: - - 'lib/nanaimo/reader.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -# Configuration parameters: MinSize. -# SupportedStyles: percent, brackets -Style/SymbolArray: - EnforcedStyle: brackets - -# Offense count: 56 -# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns. -# URISchemes: http, https -Metrics/LineLength: - Max: 331 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/.travis.yml b/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/.travis.yml deleted file mode 100644 index 46a1f04..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/.travis.yml +++ /dev/null @@ -1,18 +0,0 @@ -dist: trusty -bundler_args: --without debugging documentation -branches: - only: - - master - -language: ruby -cache: bundler -rvm: - # The latest ruby version - - 2.7.0 - - 2.6.2 - - 2.5.0 - - 2.4.2 - # OS X 10.9.5-10.10.0 (2.0.0-p481) - - 2.0.0-p481 -before_install: - - gem install bundler -v "~> 1.17" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/CHANGELOG.md b/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/CHANGELOG.md deleted file mode 100644 index 80c38ba..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/CHANGELOG.md +++ /dev/null @@ -1,168 +0,0 @@ -# Nanaimo Changelog - -## 0.3.0 (2020-07-17) - -##### Enhancements - -* None. - -##### Bug Fixes - -* None. - - -## 0.2.6 (2018-07-01) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Fix parse errors crashing when attempting to show context when the error - occurs on the first character in the plist. - [Samuel Giddins](https://github.com/segiddins) - - -## 0.2.5 (2018-04-04) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Fix parsing arrays that contain a comment after a trailing comma. - [Samuel Giddins](https://github.com/segiddins) - [#26](https://github.com/CocoaPods/Nanaimo/issues/26) - - -## 0.2.4 (2018-03-22) - -##### Enhancements - -* Enable frozen string literals to improve performance. - [Samuel Giddins](https://github.com/segiddins) - -##### Bug Fixes - -* None. - - -## 0.2.3 (2016-11-30) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Quote the empty string `nil` is implicitly written as in non-strict mode. - [Samuel Giddins](https://github.com/segiddins) - [Xcodeproj#453](https://github.com/CocoaPods/Xcodeproj/issues/453) - - -## 0.2.2 (2016-11-04) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Fix extraneously escaping single quotes when writing quoted strings. - [Samuel Giddins](https://github.com/segiddins) - -* Properly align the `^` in parse error messages when the line with the syntax - error contains tabs. - [Samuel Giddins](https://github.com/segiddins) - - -## 0.2.1 (2016-11-03) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Fix reading all supported characters in unquoted strings. - [Samuel Giddins](https://github.com/segiddins) - [#13](https://github.com/CocoaPods/Nanaimo/issues/13) - - -## 0.2.0 (2016-11-02) - -##### Enhancements - -* Add context to parse errors. - [Samuel Giddins](https://github.com/segiddins) - [#5](https://github.com/CocoaPods/Nanaimo/issues/5) - -* Allow disabling 'strict' mode when writing plists, allowing unknown object - types to be serialized as their string representations. - [Samuel Giddins](https://github.com/segiddins) - -##### Bug Fixes - -* None. - - -## 0.1.4 (2016-11-01) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Allow reading unquoted strings that contain `-`. - [Samuel Giddins](https://github.com/segiddins) - [Xcodeproj#438](https://github.com/CocoaPods/Xcodeproj/issues/438) - - -## 0.1.3 (2016-11-01) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Fix unquoting a sequence of backslashes. - [Samuel Giddins](https://github.com/segiddins) - [CocoaPods#6108](https://github.com/CocoaPods/CocoaPods/issues/6108) - - -## 0.1.2 (2016-10-29) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Add support for unquoted strings that contain a `$`. - [Danielle Tomlinson](https://github.com/dantoml) - [CocoaPods#6101](https://github.com/CocoaPods/CocoaPods/issues/6101) - - -## 0.1.1 (2016-10-28) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Ensure all required classes are required before being used. - [Samuel Giddins](https://github.com/segiddins) - [Xcodeproj#435](https://github.com/CocoaPods/Xcodeproj/issues/435) - - -## 0.1.0 (2016-10-21) - -##### Enhancements - -* Initial implementation. - [Samuel Giddins](https://github.com/segiddins) diff --git a/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/CODE_OF_CONDUCT.md b/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/CODE_OF_CONDUCT.md deleted file mode 100644 index ced55a5..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,49 +0,0 @@ -# Contributor Code of Conduct - -As contributors and maintainers of this project, and in the interest of -fostering an open and welcoming community, we pledge to respect all people who -contribute through reporting issues, posting feature requests, updating -documentation, submitting pull requests or patches, and other activities. - -We are committed to making participation in this project a harassment-free -experience for everyone, regardless of level of experience, gender, gender -identity and expression, sexual orientation, disability, personal appearance, -body size, race, ethnicity, age, religion, or nationality. - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery -* Personal attacks -* Trolling or insulting/derogatory comments -* Public or private harassment -* Publishing other's private information, such as physical or electronic - addresses, without explicit permission -* Other unethical or unprofessional conduct - -Project maintainers have the right and responsibility to remove, edit, or -reject comments, commits, code, wiki edits, issues, and other contributions -that are not aligned to this Code of Conduct, or to ban temporarily or -permanently any contributor for other behaviors that they deem inappropriate, -threatening, offensive, or harmful. - -By adopting this Code of Conduct, project maintainers commit themselves to -fairly and consistently applying these principles to every aspect of managing -this project. Project maintainers who do not follow or enforce the Code of -Conduct may be permanently removed from the project team. - -This code of conduct applies both within project spaces and in public spaces -when an individual is representing the project or its community. - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting a project maintainer at dan@tomlinson.io. All -complaints will be reviewed and investigated and will result in a response that -is deemed necessary and appropriate to the circumstances. Maintainers are -obligated to maintain confidentiality with regard to the reporter of an -incident. - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], -version 1.3.0, available at -[http://contributor-covenant.org/version/1/3/0/][version] - -[homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/3/0/ \ No newline at end of file diff --git a/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/Gemfile b/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/Gemfile deleted file mode 100644 index 669620b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/Gemfile +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -source 'https://rubygems.org' - -# Specify your gem's dependencies in nanaimo.gemspec -gemspec - -group :development do - gem 'rake', '~> 12.0' - gem 'rspec' - gem 'rubocop', install_if: RUBY_VERSION >= '2.1' -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/Gemfile.lock b/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/Gemfile.lock deleted file mode 100644 index f1f00f3..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/Gemfile.lock +++ /dev/null @@ -1,51 +0,0 @@ -PATH - remote: . - specs: - nanaimo (0.3.0) - -GEM - remote: https://rubygems.org/ - specs: - ast (2.4.0) - diff-lcs (1.3) - parallel (1.12.1) - parser (2.5.0.2) - ast (~> 2.4.0) - powerpack (0.1.1) - rainbow (3.0.0) - rake (12.3.3) - rspec (3.9.0) - rspec-core (~> 3.9.0) - rspec-expectations (~> 3.9.0) - rspec-mocks (~> 3.9.0) - rspec-core (3.9.1) - rspec-support (~> 3.9.1) - rspec-expectations (3.9.1) - diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.9.0) - rspec-mocks (3.9.1) - diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.9.0) - rspec-support (3.9.2) - rubocop (0.52.1) - parallel (~> 1.10) - parser (>= 2.4.0.2, < 3.0) - powerpack (~> 0.1) - rainbow (>= 2.2.2, < 4.0) - ruby-progressbar (~> 1.7) - unicode-display_width (~> 1.0, >= 1.0.1) - ruby-progressbar (1.9.0) - unicode-display_width (1.3.0) - -PLATFORMS - ruby - -DEPENDENCIES - bundler (~> 1.12) - nanaimo! - rake (~> 12.0) - rspec - rubocop - -BUNDLED WITH - 1.17.3 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/LICENSE.txt b/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/LICENSE.txt deleted file mode 100644 index 1617264..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2016 Danielle Tomlinson, Samuel Giddins - -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/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/README.md b/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/README.md deleted file mode 100644 index f7787ce..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/README.md +++ /dev/null @@ -1,55 +0,0 @@ -# Nanaimo - -Nanaimo is a simple library that implements ASCII Plist serialization and -deserialization, entirely with native Ruby code (and zero dependencies). It -also comes with out-of-the-box support for serializing Xcode projects (complete -with annotations) and XML plists. - -## Installation - -Add this line to your application's Gemfile: - -```ruby -gem 'nanaimo' -``` - -And then execute: - - $ bundle - -Or install it yourself as: - - $ gem install nanaimo - -## Usage - -```ruby -require 'nanaimo' - -# parse a native ruby object from an ascii plist file -project_hash = Nanaimo::Reader - .from_file("App.xcodeproj/project.pbxproj") - .parse! - .as_ruby - -# change that object -project_hash['...'] = '...' - -# re-serialize it -ascii_plist_string = Nanaimo::Writer.new(project_hash).write -``` - -## Development - -After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment. - -To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org). - -## Contributing - -Bug reports and pull requests are welcome on GitHub at https://github.com/CocoaPods/nanaimo. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct. - - -## License - -The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT). diff --git a/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/Rakefile b/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/Rakefile deleted file mode 100644 index c3735c0..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/Rakefile +++ /dev/null @@ -1,80 +0,0 @@ -# frozen_string_literal: true - -require 'bundler/gem_tasks' -require 'rspec/core/rake_task' - -RSpec::Core::RakeTask.new(:spec) - -task default: [:spec] - -if RUBY_VERSION >= '2.1' - require 'rubocop/rake_task' - RuboCop::RakeTask.new - task default: :rubocop -end - -task :generate_nextstep_mappings do - require 'net/http' - url = 'http://ftp.unicode.org/Public/MAPPINGS/VENDORS/NEXT/NEXTSTEP.TXT' - mappings = Net::HTTP.get(URI(url)) - .lines - .grep(/^[^#$]/) - .map { |l| l.split("\t", 3) } - .reduce('') do |f, (ns, uc, cm)| - f << " #{ns} => #{uc}, #{cm}" - end - map = <<-RUBY -# frozen-string-literal: true -module Nanaimo - module Unicode - # Taken from #{url} - NEXT_STEP_MAPPING = { -#{mappings} }.freeze - end -end - RUBY - File.open('lib/nanaimo/unicode/next_step_mapping.rb', 'w') { |f| f << map } -end - -task :generate_quote_maps do - quote_map = { - "\a" => '\\a', - "\b" => '\\b', - "\f" => '\\f', - "\r" => '\\r', - "\t" => '\\t', - "\v" => '\\v', - "\n" => '\\n', - %(') => "\\'", - %(") => '\\"', - '\\' => '\\\\' - } - - unquote_map = quote_map.each_with_object("\n" => "\n") do |(value, escaped), map| - map[escaped[1..-1]] = value - map - end - quote_map.delete("'") - - 0.upto(31) { |i| quote_map[[i].pack('U')] ||= format('\\U%04x', i) } - quote_regexp = Regexp.union(quote_map.keys) - - dump_hash = proc do |hash, indent = 4| - hash.reduce("{\n") { |dumped, (k, v)| dumped << "#{' ' * (indent + 2)}#{k.dump} => #{v.dump},\n" } << ' ' * indent << '}.freeze' - end - - map = <<-RUBY -# frozen-string-literal: true -module Nanaimo - module Unicode - QUOTE_MAP = #{dump_hash[quote_map]} - - UNQUOTE_MAP = #{dump_hash[unquote_map]} - - QUOTE_REGEXP = #{quote_regexp.inspect} - end -end - RUBY - - File.open('lib/nanaimo/unicode/quote_maps.rb', 'w') { |f| f << map } -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/bin/console b/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/bin/console deleted file mode 100755 index e66267b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/bin/console +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env ruby -# frozen_string_literal: true - -require 'bundler/setup' -require 'nanaimo' - -# You can add fixtures and/or initialization code here to make experimenting -# with your gem easier. You can also use a different console, if you like. - -# (If you use this, don't forget to add pry to your Gemfile!) -# require "pry" -# Pry.start - -require 'irb' -IRB.start diff --git a/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/bin/setup b/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/bin/setup deleted file mode 100755 index dce67d8..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/bin/setup +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail -IFS=$'\n\t' -set -vx - -bundle install - -# Do any other automated setup that you need to do here diff --git a/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/nanaimo.gemspec b/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/nanaimo.gemspec deleted file mode 100644 index 061d44c..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/nanaimo-0.3.0/nanaimo.gemspec +++ /dev/null @@ -1,26 +0,0 @@ -# coding: utf-8 -# frozen_string_literal: true - -lib = File.expand_path('../lib', __FILE__) -$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) -require 'nanaimo/version' - -Gem::Specification.new do |spec| - spec.name = 'nanaimo' - spec.version = Nanaimo::VERSION - spec.authors = ['Danielle Tomlinson', 'Samuel Giddins'] - spec.email = ['dan@tomlinson.io', 'segiddins@segiddins.me'] - - spec.summary = 'A library for (de)serialization of ASCII Plists.' - spec.homepage = 'https://github.com/CocoaPods/Nanaimo' - spec.license = 'MIT' - - spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) } - spec.bindir = 'exe' - spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) } - spec.require_paths = ['lib'] - - spec.add_development_dependency 'bundler', '~> 1.12' - spec.add_development_dependency 'rake', '~> 12.3' - spec.add_development_dependency 'rspec', '~> 3.0' -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/nap-1.1.0/LICENSE b/example/vendor/bundle/ruby/2.7.0/gems/nap-1.1.0/LICENSE deleted file mode 100644 index 97c1a79..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/nap-1.1.0/LICENSE +++ /dev/null @@ -1,18 +0,0 @@ -Copyright (c) 2015 Manfred Stienstra, Fingertips - -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/example/vendor/bundle/ruby/2.7.0/gems/nap-1.1.0/README.md b/example/vendor/bundle/ruby/2.7.0/gems/nap-1.1.0/README.md deleted file mode 100644 index af0a26a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/nap-1.1.0/README.md +++ /dev/null @@ -1,80 +0,0 @@ -# Nap - -Nap is an extremely simple REST client for Ruby. It was built to quickly -fire off HTTP requests without having to research net/http internals. - -## Example - -```ruby -gem 'nap' -require 'rest' -require 'json' - -response = REST.get('http://twitter.com/statuses/friends_timeline.json', {}, - {:username => '_evan', :password => 'buttonscat'} -) -if response.ok? - timeline = JSON.parse(response.body) - puts(timeline.map do |item| - "#{item['user']['name']}\n\n#{item['text']}" - end.join("\n\n--\n\n")) -elsif response.forbidden? - puts "Are you sure you're `_evan' and your password is the name of your cat?" -else - puts "Something went wrong (#{response.status_code})" - puts response.body -end -``` - -## Advanced request configuration - -If you need more control over the Net::HTTP request you can pass a block to all of the request methods. -```ruby -response = REST.get('http://google.com') do |http_request| - http_request.open_timeout = 15 - http_request.set_debug_output(STDERR) -end -``` - -## Proxy support - -To enable the proxy settings in Nap, you can either use the HTTP\_PROXY or http\_proxy enviroment variable. - - $ env HTTP_PROXY=http://rob:secret@192.167.1.254:665 ruby app.rb - -## Exceptions - -Nap defines one top-level and three main error types which allow you to catch a whole range of exceptions thrown by underlying protocol implementations. - -* *REST::Error*: Any type of error -* *REST::Error::Timeout*: Read timeouts of various sorts -* *REST::Error::Connection*: Connection errors caused by dropped sockets -* *REST::Error::Protocol*: Request failed because of a problem when handling the HTTP request or response - -In the most basic case you can rescue from the top-level type to warn about fetching problems. - -```ruby -begin - REST.get('http://example.com/pigeons/12') -rescue REST::Error - puts "[!] Failed to fetch Pigeon number 12." -end -``` - -## Contributions - -Nap couldn't be the shining beacon in the eternal darkness without help from: - -* Eloy Durán -* Joshua Sierles -* Thijs van der Vossen - -For all other great human beings, please visit the GitHub contributors page. - -## Changes from 1.0.0 to 1.1.0 - -* REST::Request now allows all HTTP verbs to send a body entity. - -## Changes from 0.8.0 to 1.0.0 - -* Removed REST::DisconnectedError, please use REST::Error::Connection instead. diff --git a/example/vendor/bundle/ruby/2.7.0/gems/nap-1.1.0/support/cacert.pem b/example/vendor/bundle/ruby/2.7.0/gems/nap-1.1.0/support/cacert.pem deleted file mode 100644 index 1b24dc6..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/nap-1.1.0/support/cacert.pem +++ /dev/null @@ -1,3988 +0,0 @@ -## -## Bundle of CA Root Certificates -## -## Certificate data from Mozilla as of: Wed Apr 22 03:12:04 2015 -## -## This is a bundle of X.509 certificates of public Certificate Authorities -## (CA). These were automatically extracted from Mozilla's root certificates -## file (certdata.txt). This file can be found in the mozilla source tree: -## http://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt -## -## It contains the certificates in PEM format and therefore -## can be directly used with curl / libcurl / php_curl, or with -## an Apache+mod_ssl webserver for SSL client authentication. -## Just configure this file as the SSLCACertificateFile. -## -## Conversion done with mk-ca-bundle.pl version 1.25. -## SHA1: ed3c0bbfb7912bcc00cd2033b0cb85c98d10559c -## - - -Equifax Secure CA -================= ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE -ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 -MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT -B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB -nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR -fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW -8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG -A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE -CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG -A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS -spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB -Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961 -zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB -BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95 -70+sB3c4 ------END CERTIFICATE----- - -GlobalSign Root CA -================== ------BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx -GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds -b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV -BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD -VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa -DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc -THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb -Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP -c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX -gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF -AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj -Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG -j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH -hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC -X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== ------END CERTIFICATE----- - -GlobalSign Root CA - R2 -======================= ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv -YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh -bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT -aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln -bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 -ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp -s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN -S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL -TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C -ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i -YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN -BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp -9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu -01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 -9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 -TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority - G3 -============================================================ ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy -dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 -EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc -cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw -EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj -055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA -ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f -j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC -/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 -xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa -t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== ------END CERTIFICATE----- - -Verisign Class 4 Public Primary Certification Authority - G3 -============================================================ ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy -dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS -tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM -8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW -Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX -Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA -j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt -mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm -fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd -RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG -UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== ------END CERTIFICATE----- - -Entrust.net Premium 2048 Secure Server CA -========================================= ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u -ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp -bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV -BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx -NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 -d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl -MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u -ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL -Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr -hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW -nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi -VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ -KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy -T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf -zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT -J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e -nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE= ------END CERTIFICATE----- - -Baltimore CyberTrust Root -========================= ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE -ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li -ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC -SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs -dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME -uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB -UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C -G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 -XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr -l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI -VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB -BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh -cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 -hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa -Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H -RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- - -AddTrust Low-Value Services Root -================================ ------BEGIN CERTIFICATE----- -MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU -cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw -CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO -ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6 -54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr -oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1 -Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui -GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w -HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD -AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT -RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw -HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt -ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph -iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY -eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr -mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj -ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= ------END CERTIFICATE----- - -AddTrust External Root -====================== ------BEGIN CERTIFICATE----- -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD -VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw -NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU -cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg -Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 -+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw -Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo -aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy -2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 -7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL -VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk -VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB -IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl -j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 -6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 -e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u -G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= ------END CERTIFICATE----- - -AddTrust Public Services Root -============================= ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU -cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ -BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l -dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu -nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i -d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG -Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw -HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G -A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux -FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G -A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4 -JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL -+YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao -GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9 -Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H -EufOX1362KqxMy3ZdvJOOjMMK7MtkAY= ------END CERTIFICATE----- - -AddTrust Qualified Certificates Root -==================================== ------BEGIN CERTIFICATE----- -MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU -cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx -CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ -IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx -64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3 -KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o -L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR -wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU -MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE -BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y -azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD -ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG -GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X -dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze -RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB -iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE= ------END CERTIFICATE----- - -Entrust Root Certification Authority -==================================== ------BEGIN CERTIFICATE----- -MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV -BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw -b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG -A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 -MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu -MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu -Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v -dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz -A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww -Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 -j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN -rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw -DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 -MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH -hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA -A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM -Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa -v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS -W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 -tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 ------END CERTIFICATE----- - -RSA Security 2048 v3 -==================== ------BEGIN CERTIFICATE----- -MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK -ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy -MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb -BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7 -Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb -WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH -KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP -+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/ -MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E -FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY -v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj -0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj -VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395 -nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA -pKnXwiJPZ9d37CAFYd4= ------END CERTIFICATE----- - -GeoTrust Global CA -================== ------BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK -Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw -MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j -LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo -BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet -8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc -T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU -vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk -DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q -zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 -d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 -mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p -XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm -Mw== ------END CERTIFICATE----- - -GeoTrust Global CA 2 -==================== ------BEGIN CERTIFICATE----- -MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN -R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw -MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j -LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/ -NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k -LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA -Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b -HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH -K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7 -srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh -ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL -OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC -x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF -H4z1Ir+rzoPz4iIprn2DQKi6bA== ------END CERTIFICATE----- - -GeoTrust Universal CA -===================== ------BEGIN CERTIFICATE----- -MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN -R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 -MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu -Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t -JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e -RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs -7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d -8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V -qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga -Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB -Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu -KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 -ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 -XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB -hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc -aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 -qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL -oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK -xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF -KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 -DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK -xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU -p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI -P/rmMuGNG2+k5o7Y+SlIis5z/iw= ------END CERTIFICATE----- - -GeoTrust Universal CA 2 -======================= ------BEGIN CERTIFICATE----- -MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN -R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 -MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg -SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 -DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 -j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q -JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a -QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 -WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP -20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn -ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC -SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG -8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 -+/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E -BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z -dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ -4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ -mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq -A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg -Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP -pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d -FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp -gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm -X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS ------END CERTIFICATE----- - -Visa eCommerce Root -=================== ------BEGIN CERTIFICATE----- -MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG -EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug -QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 -WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm -VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv -bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL -F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b -RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 -TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI -/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs -GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG -MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc -CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW -YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz -zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu -YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt -398znM/jra6O1I7mT1GvFpLgXPYHDw== ------END CERTIFICATE----- - -Certum Root CA -============== ------BEGIN CERTIFICATE----- -MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK -ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla -Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u -by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x -wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL -kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ -89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K -Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P -NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq -hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+ -GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg -GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/ -0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS -qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw== ------END CERTIFICATE----- - -Comodo AAA Services root -======================== ------BEGIN CERTIFICATE----- -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS -R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg -TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw -MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl -c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV -BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG -C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs -i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW -Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH -Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK -Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f -BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl -cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz -LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm -7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz -Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z -8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C -12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== ------END CERTIFICATE----- - -Comodo Secure Services root -=========================== ------BEGIN CERTIFICATE----- -MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS -R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg -TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw -MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu -Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi -BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP -9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc -rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC -oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V -p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E -FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w -gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj -YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm -aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm -4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj -Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL -DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw -pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H -RR3B7Hzs/Sk= ------END CERTIFICATE----- - -Comodo Trusted Services root -============================ ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS -R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg -TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw -MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h -bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw -IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7 -3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y -/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6 -juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS -ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud -DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp -ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl -cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw -uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 -pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA -BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l -R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O -9y5Xt5hwXsjEeLBi ------END CERTIFICATE----- - -QuoVadis Root CA -================ ------BEGIN CERTIFICATE----- -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE -ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz -MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp -cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD -EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk -J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL -F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL -YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen -AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w -PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y -ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 -MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj -YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs -ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh -Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW -Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu -BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw -FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 -tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo -fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul -LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x -gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi -5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi -5nrQNiOKSnQ2+Q== ------END CERTIFICATE----- - -QuoVadis Root CA 2 -================== ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -QuoVadis Root CA 3 -================== ------BEGIN CERTIFICATE----- -MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT -EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx -OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC -DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg -DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij -KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K -DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv -BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp -p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8 -nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX -MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM -Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz -uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT -BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj -YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 -aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB -BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD -VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4 -ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE -AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV -qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s -hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z -POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2 -Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp -8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC -bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu -g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p -vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr -qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= ------END CERTIFICATE----- - -Security Communication Root CA -============================== ------BEGIN CERTIFICATE----- -MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP -U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw -HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP -U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw -8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM -DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX -5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd -DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 -JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw -DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g -0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a -mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ -s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ -6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi -FL39vmwLAw== ------END CERTIFICATE----- - -Sonera Class 2 Root CA -====================== ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG -U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw -NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh -IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 -/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT -dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG -f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P -tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH -nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT -XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt -0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI -cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph -Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx -EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH -llpwrN9M ------END CERTIFICATE----- - -Staat der Nederlanden Root CA -============================= ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE -ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g -Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w -HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh -bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt -vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P -jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca -C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth -vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6 -22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV -HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v -dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN -BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR -EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw -MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y -nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR -iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== ------END CERTIFICATE----- - -UTN DATACorp SGC Root CA -======================== ------BEGIN CERTIFICATE----- -MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE -BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl -IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ -BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa -MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w -HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy -dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys -raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo -wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA -9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv -33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud -DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9 -BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD -LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3 -DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft -Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0 -I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx -EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP -DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI ------END CERTIFICATE----- - -UTN USERFirst Hardware Root CA -============================== ------BEGIN CERTIFICATE----- -MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE -BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl -IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd -BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx -OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0 -eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz -ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI -wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd -tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8 -i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf -Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw -gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF -lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF -UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF -BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM -//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW -XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2 -lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn -iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67 -nfhmqA== ------END CERTIFICATE----- - -Camerfirma Chambers of Commerce Root -==================================== ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe -QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i -ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx -NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp -cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn -MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC -AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU -xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH -NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW -DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV -d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud -EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v -cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P -AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh -bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD -VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz -aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi -fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD -L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN -UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n -ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1 -erfutGWaIZDgqtCYvDi1czyL+Nw= ------END CERTIFICATE----- - -Camerfirma Global Chambersign Root -================================== ------BEGIN CERTIFICATE----- -MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe -QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i -ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx -NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt -YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg -MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw -ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J -1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O -by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl -6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c -8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/ -BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j -aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B -Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj -aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y -ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh -bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA -PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y -gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ -PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4 -IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes -t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== ------END CERTIFICATE----- - -NetLock Notary (Class A) Root -============================= ------BEGIN CERTIFICATE----- -MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI -EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 -dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j -ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX -DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH -EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD -VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz -cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM -D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ -z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC -/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7 -tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6 -4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG -A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC -Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv -bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu -IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn -LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0 -ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz -IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh -IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu -b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh -bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg -Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp -bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5 -ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP -ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB -CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr -KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM -8CgHrTwXZoi1/baI ------END CERTIFICATE----- - -XRamp Global CA Root -==================== ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE -BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj -dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx -HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg -U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu -IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx -foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE -zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs -AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry -xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud -EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap -oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC -AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc -/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt -qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n -nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz -8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= ------END CERTIFICATE----- - -Go Daddy Class 2 CA -=================== ------BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY -VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG -A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g -RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD -ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv -2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 -qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j -YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY -vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O -BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o -atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu -MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG -A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim -PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt -I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI -Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b -vZ8= ------END CERTIFICATE----- - -Starfield Class 2 CA -==================== ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc -U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo -MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG -A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG -SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY -bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ -JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm -epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN -F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF -MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f -hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo -bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g -QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs -afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM -PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl -xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD -KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 -QBFGmh95DmK/D5fs4C8fF5Q= ------END CERTIFICATE----- - -StartCom Certification Authority -================================ ------BEGIN CERTIFICATE----- -MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN -U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu -ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 -NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk -LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg -U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw -ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y -o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ -Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d -eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt -2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z -6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ -osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ -untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc -UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT -37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE -FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0 -Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj -YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH -AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw -Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg -U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5 -LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl -cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh -cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT -dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC -AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh -3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm -vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk -fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3 -fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ -EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq -yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl -1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/ -lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro -g14= ------END CERTIFICATE----- - -Taiwan GRCA -=========== ------BEGIN CERTIFICATE----- -MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG -EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X -DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv -dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN -w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 -BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O -1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO -htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov -J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 -Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t -B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB -O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 -lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV -HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 -09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ -TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj -Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 -Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU -D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz -DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk -Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk -7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ -CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy -+fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS ------END CERTIFICATE----- - -Swisscom Root CA 1 -================== ------BEGIN CERTIFICATE----- -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 -NY6E0F/6MBr1mmz0DlP5OlvRHA== ------END CERTIFICATE----- - -DigiCert Assured ID Root CA -=========================== ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw -IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx -MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL -ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO -9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy -UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW -/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy -oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf -GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF -66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq -hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc -EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn -SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i -8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe -+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== ------END CERTIFICATE----- - -DigiCert Global Root CA -======================= ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw -HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw -MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 -dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq -hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn -TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 -BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H -4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y -7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB -o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm -8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF -BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr -EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt -tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 -UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- - -DigiCert High Assurance EV Root CA -================================== ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw -KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw -MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ -MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu -Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t -Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS -OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 -MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ -NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe -h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB -Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY -JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ -V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp -myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK -mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K ------END CERTIFICATE----- - -Certplus Class 2 Primary CA -=========================== ------BEGIN CERTIFICATE----- -MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE -BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN -OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy -dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR -5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ -Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO -YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e -e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME -CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ -YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t -L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD -P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R -TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ -7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW -//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 -l7+ijrRU ------END CERTIFICATE----- - -DST Root CA X3 -============== ------BEGIN CERTIFICATE----- -MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK -ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X -DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 -cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT -rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 -UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy -xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d -utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T -AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ -MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug -dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE -GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw -RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS -fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ ------END CERTIFICATE----- - -DST ACES CA X6 -============== ------BEGIN CERTIFICATE----- -MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG -EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT -MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha -MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE -CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI -DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa -pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow -GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy -MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud -EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu -Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy -dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU -CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2 -5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t -Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq -nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs -vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3 -oKfN5XozNmr6mis= ------END CERTIFICATE----- - -TURKTRUST Certificate Services Provider Root 1 -============================================== ------BEGIN CERTIFICATE----- -MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP -MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0 -acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx -MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg -U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB -TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC -aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX -yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i -Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ -8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4 -W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME -BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46 -sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE -q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy -B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY -nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H ------END CERTIFICATE----- - -TURKTRUST Certificate Services Provider Root 2 -============================================== ------BEGIN CERTIFICATE----- -MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP -MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg -QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN -MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr -dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G -A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls -acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe -LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI -x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g -QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr -5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB -AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G -A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt -Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 -Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+ -hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P -9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5 -UrbnBEI= ------END CERTIFICATE----- - -SwissSign Gold CA - G2 -====================== ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -SwissSign Silver CA - G2 -======================== ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -GeoTrust Primary Certification Authority -======================================== ------BEGIN CERTIFICATE----- -MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx -CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ -cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN -b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 -nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge -RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt -tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI -hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K -Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN -NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa -Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG -1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= ------END CERTIFICATE----- - -thawte Primary Root CA -====================== ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE -BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 -aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 -MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg -SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv -KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT -FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs -oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ -1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc -q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K -aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p -afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF -AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE -uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX -xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 -jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH -z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== ------END CERTIFICATE----- - -VeriSign Class 3 Public Primary Certification Authority - G5 -============================================================ ------BEGIN CERTIFICATE----- -MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE -BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO -ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk -IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB -yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln -biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh -dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz -j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD -Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ -Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r -fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ -BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv -Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy -aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG -SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ -X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE -KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC -Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE -ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq ------END CERTIFICATE----- - -SecureTrust CA -============== ------BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG -EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy -dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe -BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX -OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t -DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH -GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b -01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH -ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj -aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ -KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu -SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf -mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ -nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR -3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= ------END CERTIFICATE----- - -Secure Global CA -================ ------BEGIN CERTIFICATE----- -MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG -EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH -bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg -MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg -Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx -YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ -bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g -8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV -HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi -0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud -EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn -oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA -MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ -OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn -CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 -3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc -f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW ------END CERTIFICATE----- - -COMODO Certification Authority -============================== ------BEGIN CERTIFICATE----- -MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE -BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG -A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb -MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD -T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH -+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww -xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV -4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA -1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI -rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k -b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC -AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP -OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ -RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc -IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN -+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== ------END CERTIFICATE----- - -Network Solutions Certificate Authority -======================================= ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG -EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr -IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx -MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu -MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx -jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT -aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT -crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc -/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB -AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv -bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA -A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q -4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ -GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv -wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD -ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey ------END CERTIFICATE----- - -WellsSecure Public Root Certificate Authority -============================================= ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM -F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw -NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN -MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl -bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD -VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1 -iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13 -i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8 -bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB -K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB -AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu -cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm -lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB -i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww -GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg -Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI -K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0 -bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj -qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es -E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ -tylv2G0xffX8oRAHh84vWdw+WNs= ------END CERTIFICATE----- - -COMODO ECC Certification Authority -================================== ------BEGIN CERTIFICATE----- -MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC -R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE -ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix -GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR -Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo -b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X -4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni -wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG -FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA -U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= ------END CERTIFICATE----- - -IGC/A -===== ------BEGIN CERTIFICATE----- -MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD -VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE -Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy -MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI -EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT -STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2 -TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW -So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy -HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd -frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ -tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB -egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC -iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK -q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q -MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg -Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI -lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF -0mBWWg== ------END CERTIFICATE----- - -Security Communication EV RootCA1 -================================= ------BEGIN CERTIFICATE----- -MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc -U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh -dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE -BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl -Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO -/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX -WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z -ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4 -bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK -9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG -SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm -iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG -Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW -mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW -T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 ------END CERTIFICATE----- - -OISTE WISeKey Global Root GA CA -=============================== ------BEGIN CERTIFICATE----- -MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE -BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG -A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH -bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD -VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw -IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 -IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 -Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg -Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD -d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ -/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R -LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ -KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm -MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 -+vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa -hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY -okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= ------END CERTIFICATE----- - -Microsec e-Szigno Root CA -========================= ------BEGIN CERTIFICATE----- -MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE -BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL -EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0 -MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz -dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT -GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG -d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N -oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc -QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ -PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb -MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG -IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD -VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3 -LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A -dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn -AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA -4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg -AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA -egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6 -Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO -PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv -c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h -cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw -IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT -WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV -MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER -MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp -Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal -HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT -nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE -aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a -86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK -yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB -S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= ------END CERTIFICATE----- - -Certigna -======== ------BEGIN CERTIFICATE----- -MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw -EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 -MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI -Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q -XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH -GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p -ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg -DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf -Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ -tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ -BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J -SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA -hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ -ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu -PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY -1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw -WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== ------END CERTIFICATE----- - -TC TrustCenter Class 2 CA II -============================ ------BEGIN CERTIFICATE----- -MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy -IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw -MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 -c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE -AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw -IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2 -xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ -Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u -SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB -7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 -Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU -cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i -SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u -TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G -dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ -KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj -TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP -JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk -vQ== ------END CERTIFICATE----- - -TC TrustCenter Universal CA I -============================= ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy -IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN -MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg -VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw -JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC -qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv -xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw -ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O -gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j -BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG -1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy -vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3 -ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT -ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a -7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY ------END CERTIFICATE----- - -Deutsche Telekom Root CA 2 -========================== ------BEGIN CERTIFICATE----- -MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT -RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG -A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 -MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G -A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS -b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 -bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI -KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY -AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK -Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV -jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV -HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr -E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy -zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 -rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G -dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU -Cm26OWMohpLzGITY+9HPBVZkVw== ------END CERTIFICATE----- - -ComSign Secured CA -================== ------BEGIN CERTIFICATE----- -MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE -AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w -NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD -QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs -49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH -7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB -kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1 -9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw -AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t -U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA -j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC -AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a -BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp -FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP -51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz -OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== ------END CERTIFICATE----- - -Cybertrust Global Root -====================== ------BEGIN CERTIFICATE----- -MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li -ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 -MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD -ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA -+Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW -0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL -AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin -89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT -8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 -MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G -A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO -lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi -5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 -hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T -X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW -WL1WMRJOEcgh4LMRkWXbtKaIOM5V ------END CERTIFICATE----- - -ePKI Root Certification Authority -================================= ------BEGIN CERTIFICATE----- -MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG -EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg -Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx -MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq -MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs -IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi -lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv -qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX -12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O -WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ -ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao -lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ -vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi -Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi -MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH -ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 -1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq -KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV -xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP -NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r -GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE -xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx -gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy -sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD -BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= ------END CERTIFICATE----- - -T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3 -============================================================================================================================= ------BEGIN CERTIFICATE----- -MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH -DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q -aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry -b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV -BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg -S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4 -MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl -IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF -n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl -IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft -dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl -cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO -Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1 -xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR -6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL -hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd -BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF -MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4 -N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT -y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh -LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M -dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI= ------END CERTIFICATE----- - -Buypass Class 2 CA 1 -==================== ------BEGIN CERTIFICATE----- -MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2 -MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh -c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M -cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83 -0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4 -0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R -uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P -AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV -1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt -7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2 -fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w -wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho ------END CERTIFICATE----- - -Buypass Class 3 CA 1 -==================== ------BEGIN CERTIFICATE----- -MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1 -MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh -c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx -ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0 -n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia -AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c -1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P -AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7 -pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA -EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5 -htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj -el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 ------END CERTIFICATE----- - -EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 -========================================================================== ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -certSIGN ROOT CA -================ ------BEGIN CERTIFICATE----- -MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD -VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa -Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE -CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I -JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH -rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 -ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD -0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 -AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB -AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 -SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 -x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt -vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz -TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD ------END CERTIFICATE----- - -CNNIC ROOT -========== ------BEGIN CERTIFICATE----- -MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE -ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw -OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD -o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz -VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT -VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or -czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK -y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC -wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S -lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5 -Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM -O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8 -BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2 -G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m -mxE= ------END CERTIFICATE----- - -ApplicationCA - Japanese Government -=================================== ------BEGIN CERTIFICATE----- -MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT -SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw -MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl -cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4 -fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN -wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE -jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu -nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU -WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV -BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD -vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs -o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g -/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD -io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW -dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL -rosot4LKGAfmt1t06SAZf7IbiVQ= ------END CERTIFICATE----- - -GeoTrust Primary Certification Authority - G3 -============================================= ------BEGIN CERTIFICATE----- -MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE -BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 -IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz -NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo -YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT -LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j -K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE -c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C -IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu -dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr -2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 -cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE -Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD -AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s -t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt ------END CERTIFICATE----- - -thawte Primary Root CA - G2 -=========================== ------BEGIN CERTIFICATE----- -MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC -VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu -IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg -Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV -MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG -b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt -IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS -LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 -8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU -mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN -G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K -rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== ------END CERTIFICATE----- - -thawte Primary Root CA - G3 -=========================== ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE -BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 -aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w -ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh -d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD -VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG -A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At -P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC -+BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY -7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW -vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ -KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK -A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu -t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC -8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm -er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= ------END CERTIFICATE----- - -GeoTrust Primary Certification Authority - G2 -============================================= ------BEGIN CERTIFICATE----- -MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu -Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 -OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg -MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl -b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG -BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc -KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD -VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ -EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m -ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 -npaqBA+K ------END CERTIFICATE----- - -VeriSign Universal Root Certification Authority -=============================================== ------BEGIN CERTIFICATE----- -MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE -BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO -ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk -IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u -IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj -1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP -MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 -9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I -AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR -tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G -CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O -a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud -DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 -Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx -Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx -P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P -wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 -mJO37M2CYfE45k+XmCpajQ== ------END CERTIFICATE----- - -VeriSign Class 3 Public Primary Certification Authority - G4 -============================================================ ------BEGIN CERTIFICATE----- -MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC -VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 -b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz -ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU -cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo -b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 -Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz -rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw -HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u -Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD -A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx -AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== ------END CERTIFICATE----- - -NetLock Arany (Class Gold) FÅ‘tanúsítvány -============================================ ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G -A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 -dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB -cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx -MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO -ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 -c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu -0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw -/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk -H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw -fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 -neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW -qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta -YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC -bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna -NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu -dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= ------END CERTIFICATE----- - -Staat der Nederlanden Root CA - G2 -================================== ------BEGIN CERTIFICATE----- -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 -66+KAQ== ------END CERTIFICATE----- - -CA Disig -======== ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK -QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw -MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz -bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm -GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD -Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo -hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt -ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w -gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P -AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz -aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff -ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa -BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t -WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3 -mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ -CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K -ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA -4Z7CRneC9VkGjCFMhwnN5ag= ------END CERTIFICATE----- - -Juur-SK -======= ------BEGIN CERTIFICATE----- -MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA -c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw -DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG -SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy -aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf -TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC -+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw -UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa -Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF -MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD -HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh -AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA -cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr -AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw -cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE -FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G -A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo -ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL -abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678 -IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh -Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2 -yyqcjg== ------END CERTIFICATE----- - -Hongkong Post Root CA 1 -======================= ------BEGIN CERTIFICATE----- -MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT -DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx -NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n -IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 -ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr -auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh -qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY -V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV -HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i -h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio -l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei -IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps -T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT -c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== ------END CERTIFICATE----- - -SecureSign RootCA11 -=================== ------BEGIN CERTIFICATE----- -MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi -SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS -b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw -KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 -cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL -TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO -wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq -g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP -O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA -bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX -t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh -OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r -bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ -Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 -y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 -lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= ------END CERTIFICATE----- - -ACEDICOM Root -============= ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -Microsec e-Szigno Root CA 2009 -============================== ------BEGIN CERTIFICATE----- -MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER -MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv -c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o -dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE -BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt -U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA -fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG -0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA -pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm -1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC -AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf -QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE -FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o -lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX -I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 -tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 -yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi -LXpUq3DDfSJlgnCW ------END CERTIFICATE----- - -GlobalSign Root CA - R3 -======================= ------BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv -YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh -bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT -aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln -bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt -iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ -0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 -rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl -OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 -xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE -FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 -lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 -EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E -bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 -YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r -kpeDMdmztcpHWD9f ------END CERTIFICATE----- - -Autoridad de Certificacion Firmaprofesional CIF A62634068 -========================================================= ------BEGIN CERTIFICATE----- -MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA -BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 -MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw -QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB -NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD -Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P -B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY -7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH -ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI -plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX -MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX -LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK -bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU -vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud -EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH -DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp -cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA -bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx -ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx -51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk -R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP -T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f -Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl -osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR -crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR -saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD -KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi -6Et8Vcad+qMUu2WFbm5PEn4KPJ2V ------END CERTIFICATE----- - -Izenpe.com -========== ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -Chambers of Commerce Root - 2008 -================================ ------BEGIN CERTIFICATE----- -MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD -MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv -bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu -QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy -Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl -ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF -EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl -cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA -XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj -h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ -ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk -NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g -D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 -lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ -0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj -ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 -EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI -G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ -BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh -bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh -bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC -CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH -AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 -wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH -3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU -RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 -M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 -YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF -9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK -zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG -nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg -OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ ------END CERTIFICATE----- - -Global Chambersign Root - 2008 -============================== ------BEGIN CERTIFICATE----- -MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD -MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv -bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu -QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx -NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg -Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ -QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD -aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf -VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf -XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 -ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB -/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA -TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M -H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe -Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF -HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh -wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB -AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT -BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE -BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm -aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm -aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp -1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 -dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG -/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 -ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s -dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg -9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH -foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du -qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr -P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq -c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z -09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B ------END CERTIFICATE----- - -Go Daddy Root Certificate Authority - G2 -======================================== ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu -MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 -MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 -b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G -A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq -9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD -+qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd -fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl -NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 -BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac -vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r -5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV -N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO -LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 ------END CERTIFICATE----- - -Starfield Root Certificate Authority - G2 -========================================= ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s -b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 -eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw -DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg -VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB -dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv -W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs -bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk -N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf -ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU -JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol -TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx -4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw -F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K -pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ -c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 ------END CERTIFICATE----- - -Starfield Services Root Certificate Authority - G2 -================================================== ------BEGIN CERTIFICATE----- -MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s -b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl -IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV -BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT -dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg -Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 -h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa -hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP -LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB -rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG -SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP -E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy -xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd -iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza -YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 ------END CERTIFICATE----- - -AffirmTrust Commercial -====================== ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS -BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw -MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly -bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb -DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV -C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 -BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww -MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV -HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG -hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi -qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv -0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh -sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= ------END CERTIFICATE----- - -AffirmTrust Networking -====================== ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS -BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw -MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly -bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE -Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI -dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 -/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb -h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV -HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu -UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 -12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 -WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 -/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= ------END CERTIFICATE----- - -AffirmTrust Premium -=================== ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS -BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy -OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy -dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A -MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn -BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV -5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs -+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd -GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R -p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI -S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 -6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 -/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo -+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv -MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg -Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC -6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S -L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK -+4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV -BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg -IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 -g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb -zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== ------END CERTIFICATE----- - -AffirmTrust Premium ECC -======================= ------BEGIN CERTIFICATE----- -MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV -BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx -MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U -cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ -N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW -BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK -BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X -57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM -eQ== ------END CERTIFICATE----- - -Certum Trusted Network CA -========================= ------BEGIN CERTIFICATE----- -MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK -ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy -MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU -ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC -l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J -J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 -fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 -cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB -Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw -DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj -jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 -mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj -Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI -03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= ------END CERTIFICATE----- - -Certinomis - Autorité Racine -============================= ------BEGIN CERTIFICATE----- -MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK -Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg -LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG -A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw -JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa -wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly -Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw -2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N -jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q -c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC -lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb -xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g -530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna -4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ -KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x -WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva -R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40 -nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B -CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv -JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE -qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b -WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE -wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/ -vgt2Fl43N+bYdJeimUV5 ------END CERTIFICATE----- - -Root CA Generalitat Valenciana -============================== ------BEGIN CERTIFICATE----- -MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE -ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290 -IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3 -WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE -CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2 -F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B -ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ -D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte -JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB -AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n -dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB -ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl -AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA -YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy -AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA -aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt -AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA -YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu -AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA -OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0 -dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV -BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G -A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S -b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh -TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz -Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63 -NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH -iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt -+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= ------END CERTIFICATE----- - -A-Trust-nQual-03 -================ ------BEGIN CERTIFICATE----- -MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE -Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy -a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R -dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw -RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0 -ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1 -c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA -zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n -yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE -SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4 -iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V -cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV -eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40 -ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr -sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd -JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS -mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6 -ahq97BvIxYSazQ== ------END CERTIFICATE----- - -TWCA Root Certification Authority -================================= ------BEGIN CERTIFICATE----- -MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ -VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG -EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB -IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx -QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC -oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP -4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r -y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG -9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC -mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW -QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY -T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny -Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== ------END CERTIFICATE----- - -Security Communication RootCA2 -============================== ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc -U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh -dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC -SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy -aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ -+T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R -3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV -spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K -EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 -QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB -CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj -u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk -3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q -tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 -mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 ------END CERTIFICATE----- - -EC-ACC -====== ------BEGIN CERTIFICATE----- -MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE -BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w -ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD -VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE -CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT -BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 -MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt -SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl -Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh -cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK -w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT -ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 -HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a -E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw -0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD -VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 -Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l -dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ -lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa -Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe -l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 -E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D -5EI= ------END CERTIFICATE----- - -Hellenic Academic and Research Institutions RootCA 2011 -======================================================= ------BEGIN CERTIFICATE----- -MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT -O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y -aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z -IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT -AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z -IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo -IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI -1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa -71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u -8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH -3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ -MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 -MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu -b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt -XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 -TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD -/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N -7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 ------END CERTIFICATE----- - -Actalis Authentication Root CA -============================== ------BEGIN CERTIFICATE----- -MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM -BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE -AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky -MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz -IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 -IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ -wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa -by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6 -zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f -YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2 -oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l -EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7 -hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8 -EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5 -jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY -iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt -ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI -WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0 -JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx -K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+ -Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC -4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo -2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz -lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem -OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9 -vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== ------END CERTIFICATE----- - -Trustis FPS Root CA -=================== ------BEGIN CERTIFICATE----- -MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG -EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290 -IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV -BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ -RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk -H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa -cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt -o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA -AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd -BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c -GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC -yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P -8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV -l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl -iB6XzCGcKQENZetX2fNXlrtIzYE= ------END CERTIFICATE----- - -StartCom Certification Authority -================================ ------BEGIN CERTIFICATE----- -MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN -U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu -ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 -NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk -LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg -U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw -ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y -o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ -Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d -eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt -2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z -6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ -osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ -untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc -UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT -37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD -VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ -Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0 -dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu -c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv -bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0 -aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t -L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG -cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5 -fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm -N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN -Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T -tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX -e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA -2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs -HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE -JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib -D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8= ------END CERTIFICATE----- - -StartCom Certification Authority G2 -=================================== ------BEGIN CERTIFICATE----- -MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN -U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE -ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O -o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG -4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi -Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul -Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs -O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H -vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L -nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS -FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa -z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ -KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K -2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk -J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+ -JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG -/+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc -nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld -blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc -l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm -7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm -obp573PYtlNXLfbQ4ddI ------END CERTIFICATE----- - -Buypass Class 2 Root CA -======================= ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X -DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 -eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 -g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn -9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b -/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU -CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff -awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI -zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn -Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX -Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs -M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD -VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF -AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s -A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI -osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S -aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd -DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD -LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 -oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC -wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS -CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN -rJgWVqA= ------END CERTIFICATE----- - -Buypass Class 3 Root CA -======================= ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X -DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 -eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH -sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR -5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh -7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ -ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH -2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV -/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ -RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA -Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq -j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD -VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF -AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV -cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G -uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG -Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 -ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 -KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz -6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug -UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe -eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi -Cp/HuZc= ------END CERTIFICATE----- - -T-TeleSec GlobalRoot Class 3 -============================ ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM -IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU -cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx -MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz -dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD -ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK -9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU -NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF -iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W -0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr -AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb -fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT -ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h -P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml -e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== ------END CERTIFICATE----- - -EE Certification Centre Root CA -=============================== ------BEGIN CERTIFICATE----- -MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG -EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy -dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw -MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB -UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy -ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB -DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM -TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2 -rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw -93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN -P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T -AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ -MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF -BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj -xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM -lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u -uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU -3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM -dcGWxZ0= ------END CERTIFICATE----- - -TURKTRUST Certificate Services Provider Root 2007 -================================================= ------BEGIN CERTIFICATE----- -MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP -MA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg -QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X -DTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl -a3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN -BgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp -bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N -YvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv -KUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya -KhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT -rqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC -AwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s -Px+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I -aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO -Xl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb -BFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK -poRq0Tl9 ------END CERTIFICATE----- - -D-TRUST Root Class 3 CA 2 2009 -============================== ------BEGIN CERTIFICATE----- -MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK -DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe -Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE -LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD -ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA -BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv -KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z -p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC -AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ -4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y -eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw -MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G -PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw -OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm -2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 -o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV -dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph -X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= ------END CERTIFICATE----- - -D-TRUST Root Class 3 CA 2 EV 2009 -================================= ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK -DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw -OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK -DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw -OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS -egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh -zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T -7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 -sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 -11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv -cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v -ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El -MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp -b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh -c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ -PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 -nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX -ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA -NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv -w9y4AyHqnxbxLFS1 ------END CERTIFICATE----- - -PSCProcert -========== ------BEGIN CERTIFICATE----- -MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1dG9yaWRhZCBk -ZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9sYW5vMQswCQYDVQQGEwJWRTEQ -MA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlzdHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lz -dGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBl -cmludGVuZGVuY2lhIGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUw -IwYJKoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEwMFoXDTIw -MTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHByb2NlcnQubmV0LnZlMQ8w -DQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGExKjAoBgNVBAsTIVByb3ZlZWRvciBkZSBD -ZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZp -Y2FjaW9uIEVsZWN0cm9uaWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIw -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo97BVC -wfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74BCXfgI8Qhd19L3uA -3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38GieU89RLAu9MLmV+QfI4tL3czkkoh -RqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmO -EO8GqQKJ/+MMbpfg353bIdD0PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG2 -0qCZyFSTXai20b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH -0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/6mnbVSKVUyqU -td+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1mv6JpIzi4mWCZDlZTOpx+FIyw -Bm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvp -r2uKGcfLFFb14dq12fy/czja+eevbqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/ -AgEBMDcGA1UdEgQwMC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAz -Ni0wMB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFDgBStuyId -xuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0b3JpZGFkIGRlIENlcnRp -ZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xhbm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQH -EwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5h -Y2lvbmFsIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5k -ZW5jaWEgZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkqhkiG -9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQDAgEGME0GA1UdEQRG -MESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0wMDAwMDKgGwYFYIZeAgKgEgwQUklG -LUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEagRKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52 -ZS9sY3IvQ0VSVElGSUNBRE8tUkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNy -YWl6LnN1c2NlcnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v -Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsGAQUFBwIBFh5o -dHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcNAQELBQADggIBACtZ6yKZu4Sq -T96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmN -g7+mvTV+LFwxNG9s2/NkAZiqlCxB3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4q -uxtxj7mkoP3YldmvWb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1 -n8GhHVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHmpHmJWhSn -FFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXzsOfIt+FTvZLm8wyWuevo -5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bEqCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq -3TNWOByyrYDT13K9mmyZY+gAu0F2BbdbmRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5 -poLWccret9W6aAjtmcz9opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3Y -eMLEYC/HYvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km ------END CERTIFICATE----- - -China Internet Network Information Center EV Certificates Root -============================================================== ------BEGIN CERTIFICATE----- -MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCQ04xMjAwBgNV -BAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyMUcwRQYDVQQDDD5D -aGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMg -Um9vdDAeFw0xMDA4MzEwNzExMjVaFw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAG -A1UECgwpQ2hpbmEgSW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMM -PkNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRpZmljYXRl -cyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z7r07eKpkQ0H1UN+U8i6y -jUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA//DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV -98YPjUesWgbdYavi7NifFy2cyjw1l1VxzUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2H -klY0bBoQCxfVWhyXWIQ8hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23 -KzhmBsUs4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54ugQEC -7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oYNJKiyoOCWTAPBgNV -HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUfHJLOcfA22KlT5uqGDSSosqD -glkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd5 -0XPFtQO3WKwMVC/GVhMPMdoG52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM -7+czV0I664zBechNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws -ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrIzo9uoV1/A3U0 -5K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATywy39FCqQmbkHzJ8= ------END CERTIFICATE----- - -Swisscom Root CA 2 -================== ------BEGIN CERTIFICATE----- -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 -5OfNeOI5wSsSnqaeG8XmDtkx2Q== ------END CERTIFICATE----- - -Swisscom Root EV CA 2 -===================== ------BEGIN CERTIFICATE----- -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 -l8PVP3wbI+2ksx0WckNLIOFZfsLorSa/ovc= ------END CERTIFICATE----- - -CA Disig Root R1 -================ ------BEGIN CERTIFICATE----- -MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNVBAYTAlNLMRMw -EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp -ZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQyMDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sx -EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp -c2lnIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy -3QRkD2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/oOI7bm+V8 -u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3AfQ+lekLZWnDZv6fXARz2 -m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJeIgpFy4QxTaz+29FHuvlglzmxZcfe+5nk -CiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8noc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTa -YVKvJrT1cU/J19IG32PK/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6 -vpmumwKjrckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD3AjL -LhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE7cderVC6xkGbrPAX -ZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkCyC2fg69naQanMVXVz0tv/wQFx1is -XxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLdqvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ -04IwDQYJKoZIhvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR -xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaASfX8MPWbTx9B -LxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXoHqJPYNcHKfyyo6SdbhWSVhlM -CrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpBemOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5Gfb -VSUZP/3oNn6z4eGBrxEWi1CXYBmCAMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85 -YmLLW1AL14FABZyb7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKS -ds+xDzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvkF7mGnjix -lAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqFa3qdnom2piiZk4hA9z7N -UaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsTQ6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJ -a7+h89n07eLw4+1knj0vllJPgFOL ------END CERTIFICATE----- - -CA Disig Root R2 -================ ------BEGIN CERTIFICATE----- -MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw -EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp -ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx -EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp -c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC -w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia -xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 -A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S -GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV -g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa -5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE -koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A -Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i -Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u -Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM -tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV -sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je -dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 -1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx -mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 -utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 -sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg -UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV -7+ZtsH8tZ/3zbBt1RqPlShfppNcL ------END CERTIFICATE----- - -ACCVRAIZ1 -========= ------BEGIN CERTIFICATE----- -MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB -SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 -MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH -UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC -DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM -jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 -RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD -aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ -0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG -WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 -8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR -5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J -9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK -Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw -Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu -Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 -VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM -Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA -QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh -AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA -YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj -AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA -IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk -aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 -dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 -MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI -hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E -R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN -YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 -nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ -TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 -sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h -I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg -Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd -3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p -EfbRD0tVNEYqi4Y7 ------END CERTIFICATE----- - -TWCA Global Root CA -=================== ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT -CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD -QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK -EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg -Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C -nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV -r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR -Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV -tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W -KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 -sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p -yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn -kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI -zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC -AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g -cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn -LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M -8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg -/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg -lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP -A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m -i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 -EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 -zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= ------END CERTIFICATE----- - -TeliaSonera Root CA v1 -====================== ------BEGIN CERTIFICATE----- -MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE -CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4 -MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW -VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+ -6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA -3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k -B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn -Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH -oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3 -F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ -oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7 -gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc -TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB -AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW -DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm -zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx -0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW -pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV -G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc -c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT -JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2 -qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6 -Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems -WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= ------END CERTIFICATE----- - -E-Tugra Certification Authority -=============================== ------BEGIN CERTIFICATE----- -MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w -DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls -ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN -ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw -NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx -QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl -cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD -DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A -MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd -hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K -CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g -ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ -BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0 -E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz -rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq -jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn -rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5 -dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB -/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG -MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK -kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO -XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807 -VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo -a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc -dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV -KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT -Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0 -8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G -C7TbO6Orb1wdtn7os4I07QZcJA== ------END CERTIFICATE----- - -T-TeleSec GlobalRoot Class 2 -============================ ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM -IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU -cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx -MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz -dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD -ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ -SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F -vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970 -2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV -WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy -YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4 -r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf -vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR -3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN -9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg== ------END CERTIFICATE----- - -Atos TrustedRoot 2011 -===================== ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU -cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4 -MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG -A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV -hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr -54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+ -DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320 -HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR -z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R -l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ -bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB -CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h -k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh -TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9 -61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G -3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed ------END CERTIFICATE----- - -QuoVadis Root CA 1 G3 -===================== ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG -A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv -b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN -MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg -RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE -PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm -PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6 -Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN -ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l -g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV -7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX -9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f -iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg -t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI -hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC -MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3 -GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct -Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP -+V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh -3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa -wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6 -O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0 -FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV -hMJKzRwuJIczYOXD ------END CERTIFICATE----- - -QuoVadis Root CA 2 G3 -===================== ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG -A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv -b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN -MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg -RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh -ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY -NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t -oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o -MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l -V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo -L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ -sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD -6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh -lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI -hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 -AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K -pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9 -x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz -dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X -U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw -mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD -zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN -JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr -O3jtZsSOeWmD3n+M ------END CERTIFICATE----- - -QuoVadis Root CA 3 G3 -===================== ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG -A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv -b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN -MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg -RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286 -IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL -Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe -6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3 -I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U -VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7 -5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi -Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM -dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt -rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI -hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px -KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS -t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ -TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du -DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib -Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD -hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX -0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW -dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2 -PpxxVJkES/1Y+Zj0 ------END CERTIFICATE----- - -DigiCert Assured ID Root G2 -=========================== ------BEGIN CERTIFICATE----- -MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw -IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw -MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL -ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH -35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq -bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw -VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP -YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn -lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO -w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv -0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz -d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW -hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M -jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo -IhNzbM8m9Yop5w== ------END CERTIFICATE----- - -DigiCert Assured ID Root G3 -=========================== ------BEGIN CERTIFICATE----- -MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD -VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 -MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ -BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb -RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs -KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF -UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy -YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy -1vUhZscv6pZjamVFkpUBtA== ------END CERTIFICATE----- - -DigiCert Global Root G2 -======================= ------BEGIN CERTIFICATE----- -MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw -HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx -MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 -dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq -hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ -kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO -3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV -BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM -UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB -o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu -5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr -F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U -WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH -QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/ -iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl -MrY= ------END CERTIFICATE----- - -DigiCert Global Root G3 -======================= ------BEGIN CERTIFICATE----- -MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD -VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw -MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k -aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C -AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O -YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP -BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp -Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y -3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34 -VOKa5Vt8sycX ------END CERTIFICATE----- - -DigiCert Trusted Root G4 -======================== ------BEGIN CERTIFICATE----- -MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw -HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 -MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G -CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp -pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o -k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa -vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY -QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6 -MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm -mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7 -f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH -dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8 -oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud -DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD -ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY -ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr -yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy -7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah -ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN -5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb -/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa -5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK -G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP -82Z+ ------END CERTIFICATE----- - -WoSign -====== ------BEGIN CERTIFICATE----- -MIIFdjCCA16gAwIBAgIQXmjWEXGUY1BWAGjzPsnFkTANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQG -EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxKjAoBgNVBAMTIUNlcnRpZmljYXRpb24g -QXV0aG9yaXR5IG9mIFdvU2lnbjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMFUxCzAJ -BgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEqMCgGA1UEAxMhQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgb2YgV29TaWduMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA -vcqNrLiRFVaXe2tcesLea9mhsMMQI/qnobLMMfo+2aYpbxY94Gv4uEBf2zmoAHqLoE1UfcIiePyO -CbiohdfMlZdLdNiefvAA5A6JrkkoRBoQmTIPJYhTpA2zDxIIFgsDcSccf+Hb0v1naMQFXQoOXXDX -2JegvFNBmpGN9J42Znp+VsGQX+axaCA2pIwkLCxHC1l2ZjC1vt7tj/id07sBMOby8w7gLJKA84X5 -KIq0VC6a7fd2/BVoFutKbOsuEo/Uz/4Mx1wdC34FMr5esAkqQtXJTpCzWQ27en7N1QhatH/YHGkR -+ScPewavVIMYe+HdVHpRaG53/Ma/UkpmRqGyZxq7o093oL5d//xWC0Nyd5DKnvnyOfUNqfTq1+ez -EC8wQjchzDBwyYaYD8xYTYO7feUapTeNtqwylwA6Y3EkHp43xP901DfA4v6IRmAR3Qg/UDaruHqk -lWJqbrDKaiFaafPz+x1wOZXzp26mgYmhiMU7ccqjUu6Du/2gd/Tkb+dC221KmYo0SLwX3OSACCK2 -8jHAPwQ+658geda4BmRkAjHXqc1S+4RFaQkAKtxVi8QGRkvASh0JWzko/amrzgD5LkhLJuYwTKVY -yrREgk/nkR4zw7CT/xH8gdLKH3Ep3XZPkiWvHYG3Dy+MwwbMLyejSuQOmbp8HkUff6oZRZb9/D0C -AwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOFmzw7R -8bNLtwYgFP6HEtX2/vs+MA0GCSqGSIb3DQEBBQUAA4ICAQCoy3JAsnbBfnv8rWTjMnvMPLZdRtP1 -LOJwXcgu2AZ9mNELIaCJWSQBnfmvCX0KI4I01fx8cpm5o9dU9OpScA7F9dY74ToJMuYhOZO9sxXq -T2r09Ys/L3yNWC7F4TmgPsc9SnOeQHrAK2GpZ8nzJLmzbVUsWh2eJXLOC62qx1ViC777Y7NhRCOj -y+EaDveaBk3e1CNOIZZbOVtXHS9dCF4Jef98l7VNg64N1uajeeAz0JmWAjCnPv/So0M/BVoG6kQC -2nz4SNAzqfkHx5Xh9T71XXG68pWpdIhhWeO/yloTunK0jF02h+mmxTwTv97QRCbut+wucPrXnbes -5cVAWubXbHssw1abR80LzvobtCHXt2a49CUwi1wNuepnsvRtrtWhnk/Yn+knArAdBtaP4/tIEp9/ -EaEQPkxROpaw0RPxx9gmrjrKkcRpnd8BKWRRb2jaFOwIQZeQjdCygPLPwj2/kWjFgGcexGATVdVh -mVd8upUPYUk6ynW8yQqTP2cOEvIo4jEbwFcW3wh8GcF+Dx+FHgo2fFt+J7x6v+Db9NpSvd4MVHAx -kUOVyLzwPt0JfjBkUO1/AaQzZ01oT74V77D2AhGiGxMlOtzCWfHjXEa7ZywCRuoeSKbmW9m1vFGi -kpbbqsY3Iqb+zCB0oy2pLmvLwIIRIbWTee5Ehr7XHuQe+w== ------END CERTIFICATE----- - -WoSign China -============ ------BEGIN CERTIFICATE----- -MIIFWDCCA0CgAwIBAgIQUHBrzdgT/BtOOzNy0hFIjTANBgkqhkiG9w0BAQsFADBGMQswCQYDVQQG -EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMMEkNBIOayg+mAmuagueiv -geS5pjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMEYxCzAJBgNVBAYTAkNOMRowGAYD -VQQKExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAwwSQ0Eg5rKD6YCa5qC56K+B5LmmMIICIjAN -BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0EkhHiX8h8EqwqzbdoYGTufQdDTc7WU1/FDWiD+k -8H/rD195L4mx/bxjWDeTmzj4t1up+thxx7S8gJeNbEvxUNUqKaqoGXqW5pWOdO2XCld19AXbbQs5 -uQF/qvbW2mzmBeCkTVL829B0txGMe41P/4eDrv8FAxNXUDf+jJZSEExfv5RxadmWPgxDT74wwJ85 -dE8GRV2j1lY5aAfMh09Qd5Nx2UQIsYo06Yms25tO4dnkUkWMLhQfkWsZHWgpLFbE4h4TV2TwYeO5 -Ed+w4VegG63XX9Gv2ystP9Bojg/qnw+LNVgbExz03jWhCl3W6t8Sb8D7aQdGctyB9gQjF+BNdeFy -b7Ao65vh4YOhn0pdr8yb+gIgthhid5E7o9Vlrdx8kHccREGkSovrlXLp9glk3Kgtn3R46MGiCWOc -76DbT52VqyBPt7D3h1ymoOQ3OMdc4zUPLK2jgKLsLl3Az+2LBcLmc272idX10kaO6m1jGx6KyX2m -+Jzr5dVjhU1zZmkR/sgO9MHHZklTfuQZa/HpelmjbX7FF+Ynxu8b22/8DU0GAbQOXDBGVWCvOGU6 -yke6rCzMRh+yRpY/8+0mBe53oWprfi1tWFxK1I5nuPHa1UaKJ/kR8slC/k7e3x9cxKSGhxYzoacX -GKUN5AXlK8IrC6KVkLn9YDxOiT7nnO4fuwECAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud -EwEB/wQFMAMBAf8wHQYDVR0OBBYEFOBNv9ybQV0T6GTwp+kVpOGBwboxMA0GCSqGSIb3DQEBCwUA -A4ICAQBqinA4WbbaixjIvirTthnVZil6Xc1bL3McJk6jfW+rtylNpumlEYOnOXOvEESS5iVdT2H6 -yAa+Tkvv/vMx/sZ8cApBWNromUuWyXi8mHwCKe0JgOYKOoICKuLJL8hWGSbueBwj/feTZU7n85iY -r83d2Z5AiDEoOqsuC7CsDCT6eiaY8xJhEPRdF/d+4niXVOKM6Cm6jBAyvd0zaziGfjk9DgNyp115 -j0WKWa5bIW4xRtVZjc8VX90xJc/bYNaBRHIpAlf2ltTW/+op2znFuCyKGo3Oy+dCMYYFaA6eFN0A -kLppRQjbbpCBhqcqBT/mhDn4t/lXX0ykeVoQDF7Va/81XwVRHmyjdanPUIPTfPRm94KNPQx96N97 -qA4bLJyuQHCH2u2nFoJavjVsIE4iYdm8UXrNemHcSxH5/mc0zy4EZmFcV5cjjPOGG0jfKq+nwf/Y -jj4Du9gqsPoUJbJRa4ZDhS4HIxaAjUz7tGM7zMN07RujHv41D198HRaG9Q7DlfEvr10lO1Hm13ZB -ONFLAzkopR6RctR9q5czxNM+4Gm2KHmgCY0c0f9BckgG/Jou5yD5m6Leie2uPAmvylezkolwQOQv -T8Jwg0DXJCxr5wkf09XHwQj02w47HAcLQxGEIYbpgNR12KvxAmLBsX5VYc8T1yaw15zLKYs4SgsO -kI26oQ== ------END CERTIFICATE----- - -COMODO RSA Certification Authority -================================== ------BEGIN CERTIFICATE----- -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 -LaZRfyHBNVOFBkpdn627G190 ------END CERTIFICATE----- - -USERTrust RSA Certification Authority -===================================== ------BEGIN CERTIFICATE----- -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 -Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9 ------END CERTIFICATE----- - -USERTrust ECC Certification Authority -===================================== ------BEGIN CERTIFICATE----- -MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC -VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU -aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC -VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU -aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2 -0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez -nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV -HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB -HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu -9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= ------END CERTIFICATE----- - -GlobalSign ECC Root CA - R4 -=========================== ------BEGIN CERTIFICATE----- -MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb -R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD -EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb -R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD -EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl -OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P -AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV -MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF -JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q= ------END CERTIFICATE----- - -GlobalSign ECC Root CA - R5 -=========================== ------BEGIN CERTIFICATE----- -MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb -R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD -EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb -R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD -EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6 -SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS -h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd -BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx -uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7 -yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3 ------END CERTIFICATE----- - -Staat der Nederlanden Root CA - G3 -================================== ------BEGIN CERTIFICATE----- -MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE -CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g -Um9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloXDTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMC -TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l -ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4y -olQPcPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WWIkYFsO2t -x1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqXxz8ecAgwoNzFs21v0IJy -EavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFyKJLZWyNtZrVtB0LrpjPOktvA9mxjeM3K -Tj215VKb8b475lRgsGYeCasH/lSJEULR9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUur -mkVLoR9BvUhTFXFkC4az5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU5 -1nus6+N86U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7Ngzp -07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHPbMk7ccHViLVlvMDo -FxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXtBznaqB16nzaeErAMZRKQFWDZJkBE -41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTtXUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMB -AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleu -yjWcLhL75LpdINyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD -U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwpLiniyMMB8jPq -KqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8Ipf3YF3qKS9Ysr1YvY2WTxB1 -v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixpgZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA -8KCWAg8zxXHzniN9lLf9OtMJgwYh/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b -8KKaa8MFSu1BYBQw0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0r -mj1AfsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq4BZ+Extq -1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR1VmiiXTTn74eS9fGbbeI -JG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/QFH1T/U67cjF68IeHRaVesd+QnGTbksV -tzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM94B7IWcnMFk= ------END CERTIFICATE----- - -Staat der Nederlanden EV Root CA -================================ ------BEGIN CERTIFICATE----- -MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE -CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g -RVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M -MR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl -cmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk -SzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW -O0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r -0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8 -Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV -XJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr -08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV -0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd -74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx -fRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa -ivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI -eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu -c0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq -5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN -b/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN -f1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi -5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4 -WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK -DyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy -eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg== ------END CERTIFICATE----- - -IdenTrust Commercial Root CA 1 -============================== ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG -EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS -b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES -MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB -IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld -hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/ -mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi -1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C -XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl -3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy -NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV -WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg -xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix -uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC -AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI -hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH -6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg -ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt -ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV -YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX -feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro -kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe -2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz -Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R -cGzM7vRX+Bi6hG6H ------END CERTIFICATE----- - -IdenTrust Public Sector Root CA 1 -================================= ------BEGIN CERTIFICATE----- -MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG -EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv -ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV -UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS -b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy -P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6 -Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI -rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf -qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS -mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn -ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh -LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v -iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL -4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B -Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw -DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj -t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A -mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt -GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt -m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx -NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4 -Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI -ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC -ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ -3Wl9af0AVqW3rLatt8o+Ae+c ------END CERTIFICATE----- - -Entrust Root Certification Authority - G2 -========================================= ------BEGIN CERTIFICATE----- -MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV -BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy -bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug -b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw -HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT -DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx -OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s -eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP -/vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz -HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU -s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y -TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx -AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6 -0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z -iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ -Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi -nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+ -vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO -e4pIb4tF9g== ------END CERTIFICATE----- - -Entrust Root Certification Authority - EC1 -========================================== ------BEGIN CERTIFICATE----- -MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx -FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn -YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl -ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw -FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs -LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg -dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt -IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy -AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef -9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE -FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h -vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8 -kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G ------END CERTIFICATE----- - -CFCA EV ROOT -============ ------BEGIN CERTIFICATE----- -MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE -CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB -IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw -MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD -DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV -BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD -7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN -uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW -ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7 -xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f -py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K -gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol -hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ -tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf -BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB -/wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB -ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q -ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua -4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG -E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX -BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn -aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy -PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX -kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C -ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su ------END CERTIFICATE----- \ No newline at end of file diff --git a/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/LICENSE.md b/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/LICENSE.md deleted file mode 100644 index a834fbb..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/LICENSE.md +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2011-2014 [CONTRIBUTORS.md](https://github.com/geemus/netrc/blob/master/CONTRIBUTORS.md) - -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/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/Readme.md b/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/Readme.md deleted file mode 100644 index 9193474..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/Readme.md +++ /dev/null @@ -1,53 +0,0 @@ -# Netrc - -This library reads and writes -[`.netrc` files](http://www.gnu.org/software/inetutils/manual/html_node/The-_002enetrc-file.html). - -## API - -Read a netrc file: - - n = Netrc.read("sample.netrc") - -If the file doesn't exist, Netrc.read will return an empty object. If -the filename ends in ".gpg", it will be decrypted using -[GPG](http://www.gnupg.org/). - -Read the user's default netrc file. - -**On Unix:** `$NETRC/.netrc` or `$HOME/.netrc` (whichever is set first). - -**On Windows:** `%NETRC%\_netrc`, `%HOME%\_netrc`, `%HOMEDRIVE%%HOMEPATH%\_netrc`, or `%USERPROFILE%\_netrc` (whichever is set first). - - n = Netrc.read - -Configure netrc to allow permissive files (with permissions other than 0600): - - Netrc.configure do |config| - config[:allow_permissive_netrc_file] = true - end - -Look up a username and password: - - user, pass = n["example.com"] - -Write a username and password: - - n["example.com"] = user, newpass - n.save - -If you make an entry that wasn't there before, it will be appended -to the end of the file. Sometimes people want to include a comment -explaining that the entry was added automatically. You can do it -like this: - - n.new_item_prefix = "# This entry was added automatically\n" - n["example.com"] = user, newpass - n.save - -Have fun! - -## Running Tests - - $ bundle install - $ bundle exec ruby -e 'Dir.glob "./test/**/test_*.rb", &method(:require)' diff --git a/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/changelog.txt b/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/changelog.txt deleted file mode 100644 index 60beb4e..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/changelog.txt +++ /dev/null @@ -1,93 +0,0 @@ -0.11.0 10/29/15 -=============== - -Respect NETRC environment variable -Fix for JRuby PernGen Space - -0.10.3 02/24/15 -=============== - -error when Dir.home is not readable - -0.10.2 12/17/14 -=============== - -set file permissions in /data to be world readable after test runs - -0.10.1 12/14/14 -=============== - -fix bug for `Dir.home` when can't find home - -0.10.0 12/10/14 -=============== - -use `Dir.home` for finding home on Ruby 1.9+ - -0.9.0 12/01/14 -============== - -use HOME or HOMEPATH/HOMEDRIVE to find home on windows - -0.8.0 10/16/14 -============== - -re-revert entry changes with minor bump - -0.7.9 10/16/14 -============== - -revert entry changes for a backwards-compatible version - -0.7.8 10/15/14 -============== - -add entry class to facilitate usage -switch gem source to rubygems.org -use guard, when available via guardfile -add default/read-only behavior -add allow_permissive_netrc_file option -fix an undefined variable path -fix Errno::EACCES error -silence const warnings in test - -0.7.7 08/15/12 -============== - -add newline between entries if one is missing - -0.7.6 08/15/12 -============== - -more unified newline handling -make entries with login/password parsable - - -0.7.5 06/25/12 -============== - -* improved operating system detection - -0.7.4 06/04/12 -============== - -* add support for encrypted files pgp netrc files - -0.7.3 06/04/12 -============== - -* also skip permissions check on cygwin - -0.7.2 05/23/12 -============= - -* use length instead of count on Array, provides compatibility with 1.8.6 - - -0.7.1 03/13/12 -============== - -* add Gemfile to simplify development -* add MIT license -* fix test require path -* fix unused variable assignment (caused warnings) in tests diff --git a/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/data/default_only.netrc b/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/data/default_only.netrc deleted file mode 100644 index 8df77a9..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/data/default_only.netrc +++ /dev/null @@ -1,4 +0,0 @@ -# this is my netrc with only a default -default - login ld # this is my default username - password pd diff --git a/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/data/login.netrc b/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/data/login.netrc deleted file mode 100644 index f0ec3b6..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/data/login.netrc +++ /dev/null @@ -1,3 +0,0 @@ -# this is my login netrc -machine m - login l # this is my username diff --git a/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/data/newlineless.netrc b/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/data/newlineless.netrc deleted file mode 100644 index 5f3b1ce..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/data/newlineless.netrc +++ /dev/null @@ -1,4 +0,0 @@ -# this is my netrc -machine m - login l # this is my username - password p \ No newline at end of file diff --git a/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/data/password.netrc b/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/data/password.netrc deleted file mode 100644 index ce68670..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/data/password.netrc +++ /dev/null @@ -1,3 +0,0 @@ -# this is my password netrc -machine m - password p # this is my password diff --git a/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/data/permissive.netrc b/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/data/permissive.netrc deleted file mode 100644 index b92cad3..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/data/permissive.netrc +++ /dev/null @@ -1,4 +0,0 @@ -# this is my netrc -machine m - login l # this is my username - password p diff --git a/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/data/sample.netrc b/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/data/sample.netrc deleted file mode 100644 index b92cad3..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/data/sample.netrc +++ /dev/null @@ -1,4 +0,0 @@ -# this is my netrc -machine m - login l # this is my username - password p diff --git a/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/data/sample_multi.netrc b/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/data/sample_multi.netrc deleted file mode 100644 index 1936d4b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/data/sample_multi.netrc +++ /dev/null @@ -1,8 +0,0 @@ -# this is my netrc with multiple machines -machine m - login lm # this is my m-username - password pm - -machine n - login ln # this is my n-username - password pn diff --git a/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/data/sample_multi_with_default.netrc b/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/data/sample_multi_with_default.netrc deleted file mode 100644 index 4e7dfe6..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/data/sample_multi_with_default.netrc +++ /dev/null @@ -1,12 +0,0 @@ -# this is my netrc with multiple machines and a default -machine m - login lm # this is my m-username - password pm - -machine n - login ln # this is my n-username - password pn - -default - login ld # this is my default username - password pd diff --git a/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/data/sample_with_default.netrc b/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/data/sample_with_default.netrc deleted file mode 100644 index 76597f3..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/data/sample_with_default.netrc +++ /dev/null @@ -1,8 +0,0 @@ -# this is my netrc with default -machine m - login l # this is my username - password p - -default - login default_login # this is my default username - password default_password diff --git a/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/test/test_lex.rb b/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/test/test_lex.rb deleted file mode 100644 index e63ff1d..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/test/test_lex.rb +++ /dev/null @@ -1,58 +0,0 @@ -$VERBOSE = true -require 'minitest/autorun' - -require File.expand_path("#{File.dirname(__FILE__)}/../lib/netrc") - -class TestLex < Minitest::Test - def test_lex_empty - t = Netrc.lex([]) - assert_equal([], t) - end - - def test_lex_comment - t = Netrc.lex(["# foo\n"]) - assert_equal(["# foo\n"], t) - end - - def test_lex_comment_after_space - t = Netrc.lex([" # foo\n"]) - assert_equal([" # foo\n"], t) - end - - def test_lex_comment_after_word - t = Netrc.lex(["x # foo\n"]) - assert_equal(["x", " # foo\n"], t) - end - - def test_lex_comment_with_hash - t = Netrc.lex(["x # foo # bar\n"]) - assert_equal(["x", " # foo # bar\n"], t) - end - - def test_lex_word - t = Netrc.lex(["x"]) - assert_equal(["x"], t) - end - - def test_lex_two_lines - t = Netrc.lex(["x\ny\n"]) - assert_equal(["x", "\n", "y", "\n"], t) - end - - def test_lex_word_and_comment - t = Netrc.lex(["x\n", "# foo\n"]) - assert_equal(["x", "\n", "# foo\n"], t) - end - - def test_lex_six_words - t = Netrc.lex(["machine m login l password p\n"]) - e = ["machine", " ", "m", " ", "login", " ", "l", " ", "password", " ", "p", "\n"] - assert_equal(e, t) - end - - def test_lex_complex - t = Netrc.lex(["machine sub.domain.com login email@domain.com password pass\n"]) - e = ["machine", " ", "sub.domain.com", " ", "login", " ", "email@domain.com", " ", "password", " ", "pass", "\n"] - assert_equal(e, t) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/test/test_netrc.rb b/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/test/test_netrc.rb deleted file mode 100644 index 73c5c25..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/test/test_netrc.rb +++ /dev/null @@ -1,273 +0,0 @@ -$VERBOSE = true -require 'minitest/autorun' -require 'fileutils' - -require File.expand_path("#{File.dirname(__FILE__)}/../lib/netrc") -require "rbconfig" - -class TestNetrc < Minitest::Test - - def setup - Dir.glob('data/*.netrc').each{|f| File.chmod(0600, f)} - File.chmod(0644, "data/permissive.netrc") - end - - def teardown - Dir.glob('data/*.netrc').each{|f| File.chmod(0644, f)} - end - - def test_parse_empty - pre, items = Netrc.parse(Netrc.lex([])) - assert_equal("", pre) - assert_equal([], items) - end - - def test_parse_file - pre, items = Netrc.parse(Netrc.lex(IO.readlines("data/sample.netrc"))) - assert_equal("# this is my netrc\n", pre) - exp = [["machine ", - "m", - "\n login ", - "l", - " # this is my username\n password ", - "p", - "\n"]] - assert_equal(exp, items) - end - - def test_login_file - pre, items = Netrc.parse(Netrc.lex(IO.readlines("data/login.netrc"))) - assert_equal("# this is my login netrc\n", pre) - exp = [["machine ", - "m", - "\n login ", - "l", - " # this is my username\n"]] - assert_equal(exp, items) - end - - def test_password_file - pre, items = Netrc.parse(Netrc.lex(IO.readlines("data/password.netrc"))) - assert_equal("# this is my password netrc\n", pre) - exp = [["machine ", - "m", - "\n password ", - "p", - " # this is my password\n"]] - assert_equal(exp, items) - end - - def test_missing_file - n = Netrc.read("data/nonexistent.netrc") - assert_equal(0, n.length) - end - - def test_permission_error - original_windows = Netrc::WINDOWS - Netrc.send(:remove_const, :WINDOWS) - Netrc.const_set(:WINDOWS, false) - Netrc.read("data/permissive.netrc") - assert false, "Should raise an error if permissions are wrong on a non-windows system." - rescue Netrc::Error - assert true, "" - ensure - Netrc.send(:remove_const, :WINDOWS) - Netrc.const_set(:WINDOWS, original_windows) - end - - def test_allow_permissive_netrc_file_option - Netrc.configure do |config| - config[:allow_permissive_netrc_file] = true - end - original_windows = Netrc::WINDOWS - Netrc.send(:remove_const, :WINDOWS) - Netrc.const_set(:WINDOWS, false) - Netrc.read("data/permissive.netrc") - assert true, "" - rescue Netrc::Error - assert false, "Should not raise an error if allow_permissive_netrc_file option is set to true" - ensure - Netrc.send(:remove_const, :WINDOWS) - Netrc.const_set(:WINDOWS, original_windows) - Netrc.configure do |config| - config[:allow_permissive_netrc_file] = false - end - end - - def test_permission_error_windows - original_windows = Netrc::WINDOWS - Netrc.send(:remove_const, :WINDOWS) - Netrc.const_set(:WINDOWS, true) - Netrc.read("data/permissive.netrc") - rescue Netrc::Error - assert false, "Should not raise an error if permissions are wrong on a non-windows system." - ensure - Netrc.send(:remove_const, :WINDOWS) - Netrc.const_set(:WINDOWS, original_windows) - end - - def test_round_trip - n = Netrc.read("data/sample.netrc") - assert_equal(IO.read("data/sample.netrc"), n.unparse) - end - - def test_set - n = Netrc.read("data/sample.netrc") - n["m"] = "a", "b" - exp = "# this is my netrc\n"+ - "machine m\n"+ - " login a # this is my username\n"+ - " password b\n" - assert_equal(exp, n.unparse) - end - - def test_set_get - n = Netrc.read("data/sample.netrc") - n["m"] = "a", "b" - assert_equal(["a", "b"], n["m"].to_a) - end - - def test_add - n = Netrc.read("data/sample.netrc") - n.new_item_prefix = "# added\n" - n["x"] = "a", "b" - exp = "# this is my netrc\n"+ - "machine m\n"+ - " login l # this is my username\n"+ - " password p\n"+ - "# added\n"+ - "machine x\n"+ - " login a\n"+ - " password b\n" - assert_equal(exp, n.unparse) - end - - def test_add_newlineless - n = Netrc.read("data/newlineless.netrc") - n.new_item_prefix = "# added\n" - n["x"] = "a", "b" - exp = "# this is my netrc\n"+ - "machine m\n"+ - " login l # this is my username\n"+ - " password p\n"+ - "# added\n"+ - "machine x\n"+ - " login a\n"+ - " password b\n" - assert_equal(exp, n.unparse) - end - - def test_add_get - n = Netrc.read("data/sample.netrc") - n.new_item_prefix = "# added\n" - n["x"] = "a", "b" - assert_equal(["a", "b"], n["x"].to_a) - end - - def test_get_missing - n = Netrc.read("data/sample.netrc") - assert_equal(nil, n["x"]) - end - - def test_save - n = Netrc.read("data/sample.netrc") - n.save - assert_equal(File.read("data/sample.netrc"), n.unparse) - end - - def test_save_create - FileUtils.rm_f("/tmp/created.netrc") - n = Netrc.read("/tmp/created.netrc") - n.save - unless Netrc::WINDOWS - assert_equal(0600, File.stat("/tmp/created.netrc").mode & 0777) - end - end - - def test_encrypted_roundtrip - if `gpg --list-keys 2> /dev/null` != "" - FileUtils.rm_f("/tmp/test.netrc.gpg") - n = Netrc.read("/tmp/test.netrc.gpg") - n["m"] = "a", "b" - n.save - assert_equal(0600, File.stat("/tmp/test.netrc.gpg").mode & 0777) - netrc = Netrc.read("/tmp/test.netrc.gpg")["m"] - assert_equal("a", netrc.login) - assert_equal("b", netrc.password) - end - end - - def test_missing_environment - nil_home = nil - ENV["HOME"], nil_home = nil_home, ENV["HOME"] - assert_equal File.join(Dir.pwd, '.netrc'), Netrc.default_path - ensure - ENV["HOME"], nil_home = nil_home, ENV["HOME"] - end - - def test_netrc_environment_variable - ENV["NETRC"] = File.join(Dir.pwd, 'data') - assert_equal File.join(Dir.pwd, 'data', '.netrc'), Netrc.default_path - ensure - ENV.delete("NETRC") - end - - def test_read_entry - entry = Netrc.read("data/sample.netrc")['m'] - assert_equal 'l', entry.login - assert_equal 'p', entry.password - - # hash-style - assert_equal 'l', entry[:login] - assert_equal 'p', entry[:password] - end - - def test_write_entry - n = Netrc.read("data/sample.netrc") - entry = n['m'] - entry.login = 'new_login' - entry.password = 'new_password' - n['m'] = entry - assert_equal(['new_login', 'new_password'], n['m'].to_a) - end - - def test_entry_splat - e = Netrc::Entry.new("user", "pass") - user, pass = *e - assert_equal("user", user) - assert_equal("pass", pass) - end - - def test_entry_implicit_splat - e = Netrc::Entry.new("user", "pass") - user, pass = e - assert_equal("user", user) - assert_equal("pass", pass) - end - - def test_with_default - netrc = Netrc.read('data/sample_with_default.netrc') - assert_equal(['l', 'p'], netrc['m'].to_a) - assert_equal(['default_login', 'default_password'], netrc['unknown'].to_a) - end - - def test_multi_without_default - netrc = Netrc.read('data/sample_multi.netrc') - assert_equal(['lm', 'pm'], netrc['m'].to_a) - assert_equal(['ln', 'pn'], netrc['n'].to_a) - assert_equal([], netrc['other'].to_a) - end - - def test_multi_with_default - netrc = Netrc.read('data/sample_multi_with_default.netrc') - assert_equal(['lm', 'pm'], netrc['m'].to_a) - assert_equal(['ln', 'pn'], netrc['n'].to_a) - assert_equal(['ld', 'pd'], netrc['other'].to_a) - end - - def test_default_only - netrc = Netrc.read('data/default_only.netrc') - assert_equal(['ld', 'pd'], netrc['m'].to_a) - assert_equal(['ld', 'pd'], netrc['other'].to_a) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/test/test_parse.rb b/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/test/test_parse.rb deleted file mode 100644 index 9e61c69..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/netrc-0.11.0/test/test_parse.rb +++ /dev/null @@ -1,34 +0,0 @@ -$VERBOSE = true -require 'minitest/autorun' - -require File.expand_path("#{File.dirname(__FILE__)}/../lib/netrc") - -class TestParse < Minitest::Test - def test_parse_empty - pre, items = Netrc.parse([]) - assert_equal("", pre) - assert_equal([], items) - end - - def test_parse_comment - pre, items = Netrc.parse(["# foo\n"]) - assert_equal("# foo\n", pre) - assert_equal([], items) - end - - def test_parse_item - t = ["machine", " ", "m", " ", "login", " ", "l", " ", "password", " ", "p", "\n"] - pre, items = Netrc.parse(t) - assert_equal("", pre) - e = [["machine ", "m", " login ", "l", " password ", "p", "\n"]] - assert_equal(e, items) - end - - def test_parse_two_items - t = ["machine", " ", "m", " ", "login", " ", "l", " ", "password", " ", "p", "\n"] * 2 - pre, items = Netrc.parse(t) - assert_equal("", pre) - e = [["machine ", "m", " login ", "l", " password ", "p", "\n"]] * 2 - assert_equal(e, items) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/.github/FUNDING.yml b/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/.github/FUNDING.yml deleted file mode 100644 index 085e1ac..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/.github/FUNDING.yml +++ /dev/null @@ -1,12 +0,0 @@ -# These are supported funding model platforms - -github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] -patreon: # Replace with a single Patreon username -open_collective: # Replace with a single Open Collective username -ko_fi: # Replace with a single Ko-fi username -tidelift: "rubygems/public_suffix" -community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry -liberapay: # Replace with a single Liberapay username -issuehunt: # Replace with a single IssueHunt username -otechie: # Replace with a single Otechie username -custom: # Replace with a single custom sponsorship URL diff --git a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/.github/dependabot.yml b/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/.github/dependabot.yml deleted file mode 100644 index 1dbbb9a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/.github/dependabot.yml +++ /dev/null @@ -1,8 +0,0 @@ -version: 2 -updates: -- package-ecosystem: bundler - directory: "/" - schedule: - interval: daily - time: "04:00" - open-pull-requests-limit: 10 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/.github/workflows/release.yml b/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/.github/workflows/release.yml deleted file mode 100644 index e3862e3..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/.github/workflows/release.yml +++ /dev/null @@ -1,16 +0,0 @@ -name: release - -on: - push: - tags: - - v*.*.* -jobs: - release: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Release Gem - uses: cadwallion/publish-rubygems-action@8f9e0538302643309e4e43bf48cd34173ca48cfc - env: - RUBYGEMS_API_KEY: ${{ secrets.RUBYGEMS_API_KEY }} - RELEASE_COMMAND: rake release diff --git a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/.github/workflows/tests.yml b/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/.github/workflows/tests.yml deleted file mode 100644 index a0f334a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/.github/workflows/tests.yml +++ /dev/null @@ -1,28 +0,0 @@ -name: Tests - -on: - push: - pull_request: - workflow_dispatch: - -jobs: - build: - strategy: - matrix: - ruby-version: - - "2.6" - - "2.7" - - "3.0" - - "3.1" - platform: [ubuntu-latest] - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v2 - - name: Set up Ruby - uses: ruby/setup-ruby@v1 - with: - ruby-version: ${{ matrix.ruby-version }} - - name: Install dependencies - run: bundle install - - name: Run tests - run: bundle exec rake diff --git a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/.gitignore b/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/.gitignore deleted file mode 100644 index 8506292..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Bundler -/.bundle -/Gemfile.lock -/pkg/* - -# YARD -/.yardoc -/yardoc/ diff --git a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/.rubocop.yml b/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/.rubocop.yml deleted file mode 100644 index af922f5..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/.rubocop.yml +++ /dev/null @@ -1,36 +0,0 @@ -inherit_from: - - .rubocop_opinionated.yml - -AllCops: - Exclude: - # Exclude .gemspec files because they are generally auto-generated - - '*.gemspec' - # Exclude vendored folders - - 'tmp/**/*' - - 'vendor/**/*' - # Exclude artifacts - - 'pkg/**/*' - # Other - - 'test/benchmarks/**/*' - - 'test/profilers/**/*' - -# I often use @_variable to avoid clashing. -Naming/MemoizedInstanceVariableName: - Enabled: false - -Style/ClassAndModuleChildren: - Exclude: - - 'spec/**/*_spec.rb' - - 'test/**/*_test.rb' - -# Dear Rubocop, I don't want to use String#strip_heredoc -Layout/HeredocIndentation: - Enabled: false - -Style/WordArray: - Enabled: false - MinSize: 3 - -Style/SymbolArray: - Enabled: false - MinSize: 3 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/.rubocop_opinionated.yml b/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/.rubocop_opinionated.yml deleted file mode 100644 index 761e2c7..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/.rubocop_opinionated.yml +++ /dev/null @@ -1,163 +0,0 @@ -AllCops: - Exclude: - # Exclude .gemspec files because they are generally auto-generated - - '*.gemspec' - # Exclude vendored folders - - 'tmp/**/*' - - 'vendor/**/*' - NewCops: enable - -# [codesmell] -Layout/LineLength: - Enabled: false - Exclude: - - 'spec/**/*_spec.rb' - - 'test/**/*_test.rb' - Max: 100 - -Lint/ConstantDefinitionInBlock: - Exclude: - - 'Rakefile' - - 'spec/**/*' - - 'test/**/*' - -# [codesmell] -Metrics/AbcSize: - Enabled: false - Exclude: - - 'spec/**/*_spec.rb' - - 'test/**/*_test.rb' - -# [codesmell] -Metrics/BlockLength: - Enabled: false - -# [codesmell] -Metrics/CyclomaticComplexity: - Enabled: false - Exclude: - - 'spec/**/*_spec.rb' - - 'test/**/*_test.rb' - -# [codesmell] -Metrics/ClassLength: - Enabled: false - Exclude: - - 'spec/**/*_spec.rb' - - 'test/**/*_test.rb' - -# [codesmell] -Metrics/MethodLength: - Enabled: false - Exclude: - - 'spec/**/*_spec.rb' - - 'test/**/*_test.rb' - Max: 10 - -# [codesmell] -Metrics/ModuleLength: - Enabled: false - Exclude: - - 'spec/**/*_spec.rb' - - 'test/**/*_test.rb' - -# [codesmell] -Metrics/ParameterLists: - Enabled: false - Max: 5 - -# [codesmell] -Metrics/PerceivedComplexity: - Enabled: false - -# Do not use "and" or "or" in conditionals, but for readability we can use it -# to chain executions. Just beware of operator order. -Style/AndOr: - EnforcedStyle: conditionals - -Style/Documentation: - Exclude: - - 'spec/**/*' - - 'test/**/*' - -# Double empty lines are useful to separate conceptually different methods -# in the same class or module. -Layout/EmptyLines: - Enabled: false - -# In most cases, a space is nice. Sometimes, it's not. -# Just be consistent with the rest of the surrounding code. -Layout/EmptyLinesAroundClassBody: - Enabled: false - -# In most cases, a space is nice. Sometimes, it's not. -# Just be consistent with the rest of the surrounding code. -Layout/EmptyLinesAroundModuleBody: - Enabled: false - -# This is quite buggy, as it doesn't recognize double lines. -# Double empty lines are useful to separate conceptually different methods -# in the same class or module. -Layout/EmptyLineBetweenDefs: - Enabled: false - -# I personally don't care about the format style. -# In most cases I like to use %, but not at the point I want to enforce it -# as a convention in the entire code. -Style/FormatString: - Enabled: false - -# Annotated tokens (like %s) are a good thing, but in most cases we don't need them. -# %s is a simpler and straightforward version that works in almost all cases. So don't complain. -Style/FormatStringToken: - Enabled: false - -# unless is not always cool. -Style/NegatedIf: - Enabled: false - -# For years, %w() has been the de-facto standard. A lot of libraries are using (). -# Switching to [] would be a nightmare. -Style/PercentLiteralDelimiters: - Enabled: false - -# There are cases were the inline rescue is ok. We can either downgrade the severity, -# or rely on the developer judgement on a case-by-case basis. -Style/RescueModifier: - Enabled: false - -Style/SymbolArray: - EnforcedStyle: brackets - -# Sorry, but using trailing spaces helps readability. -# -# %w( foo bar ) -# -# looks better to me than -# -# %w( foo bar ) -# -Layout/SpaceInsidePercentLiteralDelimiters: - Enabled: false - -# Hate It or Love It, I prefer double quotes as this is more consistent -# with several other programming languages and the output of puts and inspect. -Style/StringLiterals: - EnforcedStyle: double_quotes - -# It's nice to be consistent. The trailing comma also allows easy reordering, -# and doesn't cause a diff in Git when you add a line to the bottom. -Style/TrailingCommaInArrayLiteral: - EnforcedStyleForMultiline: consistent_comma -Style/TrailingCommaInHashLiteral: - EnforcedStyleForMultiline: consistent_comma - -Style/TrivialAccessors: - # IgnoreClassMethods because I want to be able to define class-level accessors - # that sets an instance variable on the metaclass, such as: - # - # def self.default=(value) - # @default = value - # end - # - IgnoreClassMethods: true diff --git a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/.yardopts b/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/.yardopts deleted file mode 100644 index 0a782de..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/.yardopts +++ /dev/null @@ -1 +0,0 @@ ---title 'Ruby Public Suffix API Documentation' diff --git a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/2.0-Upgrade.md b/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/2.0-Upgrade.md deleted file mode 100644 index 1a10bfb..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/2.0-Upgrade.md +++ /dev/null @@ -1,52 +0,0 @@ -# Welcome to PublicSuffix 2.0! - -PublicSuffix 2.0 contains a rewritten internal representation and comparison logic, that drastically increases the lookup performance. The new version also changes several internal and external API. - -This document documents the most relevant changes to help you upgrading from PublicSuffix 1.0 to 2.0. - -## What's New - -- The library is now 100% compliants with the official PublicSuffix tests. The major breaking change you may experience, is that if a domain passed as input doesn't match any rule, the rule `*` is assumed. You can override this behavior by passing a custom default rule with the `default_rule` option. The old behavior can be restored by passing `default_rule: nil`. -- `PublicSuffix.domain` is a new method that parses the input and returns the domain (combination of second level domain + suffix). This is a convenient helper to parse a domain name, for example when you need to determine the cookie or SSL scope. -- Added the ability to disable the use of private domains either at runtime, in addition to the ability to not load the private domains section when reading the list (`private_domains: false`). This feature also superseded the `private_domains` class-level attribute, that is no longer available. - -## Upgrade - -When upgrading, here's the most relevant changes to keep an eye on: - -- Several futile utility helpers were removed, such as `Domain#rule`, `Domain#is_a_domain?`, `Domain#is_a_subdomain?`, `Domain#valid?`. You can easily obtain the same result by having a custom method that reconstructs the logic, and/or calling `PublicSuffix.{domain|parse}(domain.to_s)`. -- `PublicSuffix::List.private_domains` is no longer available. Instead, you now have two ways to enable/disable the private domains: - - 1. At runtime, by using the `ignore_private` option - - ```ruby - PublicSuffix.domain("something.blogspot.com", ignore_private: true) - ``` - - 1. Loading a filtered list: - - ```ruby - # Disable support for private TLDs - PublicSuffix::List.default = PublicSuffix::List.parse(File.read(PublicSuffix::List::DEFAULT_LIST_PATH), private_domains: false) - # => "blogspot.com" - PublicSuffix.domain("something.blogspot.com") - # => "blogspot.com" - ``` -- Now that the library is 100% compliant with the official PublicSuffix algorithm, if a domain passed as input doesn't match any rule, the wildcard rule `*` is assumed. This means that unlisted TLDs will be considered valid by default, when they would have been invalid in 1.x. However, you can override this behavior to emulate the 1.x behavior if needed: - - ```ruby - # 1.x: - - PublicSuffix.valid?("google.commm") - # => false - - # 2.x: - - PublicSuffix.valid?("google.commm") - # => true - - # Overriding 2.x behavior if needed: - - PublicSuffix.valid?("google.commm", default_rule: nil) - # => false - ```` diff --git a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/CHANGELOG.md b/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/CHANGELOG.md deleted file mode 100644 index b6178f5..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/CHANGELOG.md +++ /dev/null @@ -1,417 +0,0 @@ -# Changelog - -This project uses [Semantic Versioning 2.0.0](https://semver.org/). - - -## 4.0.7 - -### Fixes - -- Fixed YARD rake task (GH-179) - -### Changed - -- Updated definitions. - - -## 4.0.6 - -### Changed - -- Updated definitions. - - -## 4.0.5 - -### Changed - -- Updated definitions. - - -## 4.0.4 - -### Changed - -- Updated definitions. - - -## 4.0.3 - -### Fixed - -- Fixed 2.7 deprecations and warnings (GH-167). [Thanks @BrianHawley] - - -## 4.0.2 - -### Changed - -- Updated definitions. - - -## 4.0.1 - -### Changed - -- Updated definitions. - - -## 4.0.0 - -### Changed - -- Minimum Ruby version is 2.3 - - -## Release 3.1.1 - -- CHANGED: Updated definitions. -- CHANGED: Rolled back support for Ruby 2.3 (GH-161, GH-162) - -IMPORTANT: 3.x is the latest version compatible with Ruby 2.1 and Ruby 2.2. - - -## Release 3.1.0 - -- CHANGED: Updated definitions. -- CHANGED: Minimum Ruby version is 2.3 -- CHANGED: Upgraded to Bundler 2.x - - -## Release 3.0.3 - -- CHANGED: Updated definitions. - - -## Release 3.0.2 - -- CHANGED: Updated definitions. - - -## Release 3.0.1 - -- CHANGED: Updated definitions. -- CHANGED: Improve performance and avoid allocation (GH-146). [Thanks @robholland] - - -## Release 3.0.0 - -This new version includes a major redesign of the library internals, with the goal to drastically -improve the lookup time while reducing storage space. - -For this reason, several public methods that are no longer applicable have been deprecated -and/or removed. You can find more information at GH-133. - -- CHANGED: Updated definitions. -- CHANGED: Dropped support for Ruby < 2.1 -- CHANGED: `PublicSuffix::List#rules` is now protected. You should not rely on it as the internal rule representation is subject to change to optimize performances. -- CHANGED: Removed `PublicSuffix::List.clear`, it was an unnecessary accessor method. Use `PublicSuffix::List.default = nil` if you **really** need to reset the default list. You shouldn't. -- CHANGED: `PublicSuffix::List#select` is now private. You should not use it, instead use `PublicSuffix::List#find`. -- CHANGED: `PublicSuffix::List` no longer implements Enumerable. Instead, use `#each` to loop over, or get an Enumerator. -- CHANGED: Redesigned internal list storage and lookup algorithm to achieve O(1) lookup time (see GH-133). - - -## Release 2.0.5 - -- CHANGED: Updated definitions. -- CHANGED: Initialization performance improvements (GH-128). [Thanks @casperisfine] - - -## Release 2.0.4 - -- FIXED: Fix a bug that caused the GEM to be published with the wrong version number in the gemspec (GH-121). - -- CHANGED: Updated definitions. - - -## Release 2.0.3 - -- CHANGED: Updated definitions. - - -## Release 2.0.2 - -- CHANGED: Updated definitions. - - -## Release 2.0.1 - -- FIXED: Fix bug that prevented .valid? to reset the default rule - - -## Release 2.0.0 - -- NEW: Added PublicSuffix.domain # => sld.tld -- NEW: Added the ability to disable the use of private domains either at runtime, in addition to the ability to not load the private domains section when reading the list (`private_domains: false`). This feature also superseded the `private_domains` class-level attribute, that is no longer available. - -- CHANGED: Considerable performance improvements (GH-92) -- CHANGED: Updated definitions. -- CHANGED: Removed deprecated PublicSuffix::InvalidDomain exception -- CHANGED: If the suffix is now listed, then the prevaling rule is "*" as defined by the PSL algorithm (GH-91) -- CHANGED: Input validation is performed only if you call `PublicSuffix.parse` or `PublicSuffix.list` -- CHANGED: Input with leading dot is invalid per PSL acceptance tests -- CHANGED: Removed `private_domains` class-level attribute. It is replaced by the `private_domains: false` option in the list parse method. -- CHANGED: The default list now assumes you use UTF-8 for reading the input (GH-94), - -- REMOVED: Removed futile utility helpers such as `Domain#rule`, `Domain#is_a_domain?`, `Domain#is_a_subdomain?`, `Domain#valid?`. You can easily obtain the same result by having a custom method that reconstructs the logic, and/or calling `PublicSuffix.{domain|parse}(domain.to_s)`. - - -## Release 1.5.3 - -- FIXED: Don't duplicate rule indices when creating index (GH-77). [Thanks @ags] - -- CHANGED: Updated definitions. - - -## Release 1.5.2 - -- CHANGED: Updated definitions. - - -## Release 1.5.1 - -- FIXED: Ignore case for parsing and validating (GH-62) - -- CHANGED: Updated definitions. - - -## Release 1.5.0 - -- CHANGED: Dropped support for Ruby < 2.0 - -- CHANGED: Updated definitions. - - -## Release 1.4.6 - -- CHANGED: Updated definitions. - - -## Release 1.4.5 - -- CHANGED: Updated definitions. - - -## Release 1.4.4 - -- CHANGED: Updated definitions. - - -## Release 1.4.3 - -- CHANGED: Updated definitions. - - -## Release 1.4.2 - -- CHANGED: Updated definitions. - - -## Release 1.4.1 - -- CHANGED: Updated definitions. - - -## Release 1.4.0 - -- CHANGED: Moved the definitions in the lib folder. - -- CHANGED: Updated definitions. - - -## Release 1.3.3 - -- CHANGED: Updated definitions. - - -## Release 1.3.2 - -- CHANGED: Updated definitions. - - -## Release 1.3.1 - -- CHANGED: Updated definitions. - - -## Release 1.3.0 - -- NEW: Ability to skip Private Domains (GH-28). [Thanks @rb2k] - -- CHANGED: Updated definitions. - - -## Release 1.2.1 - -- CHANGED: Updated definitions. - - -## Release 1.2.0 - -- NEW: Allow a custom List on `PublicSuffix.parse` (GH-26). [Thanks @itspriddle] - -- FIXED: PublicSuffix.parse and PublicSuffix.valid? crashes when input is nil (GH-20). - -- CHANGED: Updated definitions. - - -## Release 1.1.3 - -- CHANGED: Updated definitions. - - -## Release 1.1.2 - -- CHANGED: Updated definitions. - - -## Release 1.1.1 - -- CHANGED: Updated definitions. - - -## Release 1.1.0 - -- FIXED: #valid? and #parse consider URIs as valid domains (GH-15) - -- CHANGED: Updated definitions. - -- CHANGED: Removed deprecatd PublicSuffixService::RuleList. - - -## Release 1.0.0 - -- CHANGED: Updated definitions. - - -## Release 1.0.0.rc1 - -The library is now known as PublicSuffix. - - -## Release 0.9.1 - -- CHANGED: Renamed PublicSuffixService::RuleList to PublicSuffixService::List. - -- CHANGED: Renamed PublicSuffixService::List#list to PublicSuffixService::List#rules. - -- CHANGED: Renamed PublicSuffixService to PublicSuffix. - -- CHANGED: Updated definitions. - - -## Release 0.9.0 - -- CHANGED: Minimum Ruby version increased to Ruby 1.8.7. - -- CHANGED: rake/gempackagetask is deprecated. Use rubygems/package_task instead. - - -## Release 0.8.4 - -- FIXED: Reverted bugfix for issue #12 for Ruby 1.8.6. - This is the latest version compatible with Ruby 1.8.6. - - -## Release 0.8.3 - -- FIXED: Fixed ArgumentError: invalid byte sequence in US-ASCII with Ruby 1.9.2 (#12). - -- CHANGED: Updated definitions (#11). - -- CHANGED: Renamed definitions.txt to definitions.dat. - - -## Release 0.8.2 - -- NEW: Added support for rubygems-test. - -- CHANGED: Integrated Bundler. - -- CHANGED: Updated definitions. - - -## Release 0.8.1 - -- FIXED: The files in the release 0.8.0 have wrong permission 600 and can't be loaded (#10). - - -## Release 0.8.0 - -- CHANGED: Update public suffix list to d1a5599b49fa 2010-10-25 15:10 +0100 (#9) - -- NEW: Add support for Fully Qualified Domain Names (#7) - - -## Release 0.7.0 - -- CHANGED: Using YARD to document the code instead of RDoc. - -- FIXED: RuleList cache is not recreated when a new rule is appended to the list (#6) - -- FIXED: PublicSuffixService.valid? should return false if the domain is not defined or not allowed (#4, #5) - - -## Release 0.6.0 - -- NEW: PublicSuffixService.parse raises DomainNotAllowed when trying to parse a domain name - which exists, but is not allowed by the current definition list (#3) - - PublicSuffixService.parse("nic.do") - # => PublicSuffixService::DomainNotAllowed - -- CHANGED: Renamed PublicSuffixService::InvalidDomain to PublicSuffixService::DomainInvalid - - -## Release 0.5.2 - -- CHANGED: Update public suffix list to 248ea690d671 2010-09-16 18:02 +0100 - - -## Release 0.5.1 - -- CHANGED: Update public suffix list to 14dc66dd53c1 2010-09-15 17:09 +0100 - - -## Release 0.5.0 - -- CHANGED: Improve documentation for Domain#domain and Domain#subdomain (#1). - -- CHANGED: Performance improvements (#2). - - -## Release 0.4.0 - -- CHANGED: Rename library from DomainName to PublicSuffixService to reduce the probability of name conflicts. - - -## Release 0.3.1 - -- Deprecated DomainName library. - - -## Release 0.3.0 - -- CHANGED: DomainName#domain and DomainName#subdomain are no longer alias of Domain#sld and Domain#tld. - -- CHANGED: Removed DomainName#labels and decoupled Rule from DomainName. - -- CHANGED: DomainName#valid? no longer instantiates new DomainName objects. This means less overhead. - -- CHANGED: Refactoring the entire DomainName API. Removed the internal on-the-fly parsing. Added a bunch of new methods to check and validate the DomainName. - - -## Release 0.2.0 - -- NEW: DomainName#valid? - -- NEW: DomainName#parse and DomainName#parse! - -- NEW: DomainName#valid_domain? and DomainName#valid_subdomain? - -- CHANGED: Make sure RuleList lookup is only performed once. - - -## Release 0.1.0 - -- Initial version diff --git a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/Gemfile b/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/Gemfile deleted file mode 100644 index 8c67969..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/Gemfile +++ /dev/null @@ -1,14 +0,0 @@ -# frozen_string_literal: true - -source "https://rubygems.org" - -gemspec - -gem "rake" - -gem "memory_profiler", require: false -gem "minitest" -gem "minitest-reporters" -gem "mocha" -gem "rubocop", "~>0.90", require: false -gem "yard" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/LICENSE.txt b/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/LICENSE.txt deleted file mode 100644 index fc7507b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/LICENSE.txt +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2009-2022 Simone Carletti - -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/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/README.md b/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/README.md deleted file mode 100644 index 0747354..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/README.md +++ /dev/null @@ -1,217 +0,0 @@ -# Public Suffix for Ruby - -PublicSuffix is a Ruby domain name parser based on the [Public Suffix List](https://publicsuffix.org/). - -[![Build Status](https://github.com/weppos/publicsuffix-ruby/actions/workflows/tests.yml/badge.svg)](https://github.com/weppos/publicsuffix-ruby/actions/workflows/tests.yml) -[![Tidelift dependencies](https://tidelift.com/badges/package/rubygems/public_suffix)](https://tidelift.com/subscription/pkg/rubygems-public-suffix?utm_source=rubygems-public-suffix&utm_medium=referral&utm_campaign=enterprise) - - -## Links - -- [Homepage](https://simonecarletti.com/code/publicsuffix-ruby) -- [Repository](https://github.com/weppos/publicsuffix-ruby) -- [API Documentation](https://rubydoc.info/gems/public_suffix) -- [Introducing the Public Suffix List library for Ruby](https://simonecarletti.com/blog/2010/06/public-suffix-list-library-for-ruby/) - - -## Requirements - -PublicSuffix requires **Ruby >= 2.3**. For an older versions of Ruby use a previous release. - - -## Installation - -You can install the gem manually: - -```shell -gem install public_suffix -``` - -Or use Bundler and define it as a dependency in your `Gemfile`: - -```ruby -gem 'public_suffix' -``` - -If you are upgrading to 2.0, see [2.0-Upgrade.md](2.0-Upgrade.md). - -## Usage - -Extract the domain out from a name: - -```ruby -PublicSuffix.domain("google.com") -# => "google.com" -PublicSuffix.domain("www.google.com") -# => "google.com" -PublicSuffix.domain("www.google.co.uk") -# => "google.co.uk" -``` - -Parse a domain without subdomains: - -```ruby -domain = PublicSuffix.parse("google.com") -# => # -domain.tld -# => "com" -domain.sld -# => "google" -domain.trd -# => nil -domain.domain -# => "google.com" -domain.subdomain -# => nil -``` - -Parse a domain with subdomains: - -```ruby -domain = PublicSuffix.parse("www.google.com") -# => # -domain.tld -# => "com" -domain.sld -# => "google" -domain.trd -# => "www" -domain.domain -# => "google.com" -domain.subdomain -# => "www.google.com" -``` - -Simple validation example: - -```ruby -PublicSuffix.valid?("google.com") -# => true - -PublicSuffix.valid?("www.google.com") -# => true - -# Explicitly forbidden, it is listed as a private domain -PublicSuffix.valid?("blogspot.com") -# => false - -# Unknown/not-listed TLD domains are valid by default -PublicSuffix.valid?("example.tldnotlisted") -# => true -``` - -Strict validation (without applying the default * rule): - -```ruby -PublicSuffix.valid?("example.tldnotlisted", default_rule: nil) -# => false -``` - - -## Fully Qualified Domain Names - -This library automatically recognizes Fully Qualified Domain Names. A FQDN is a domain name that end with a trailing dot. - -```ruby -# Parse a standard domain name -PublicSuffix.domain("www.google.com") -# => "google.com" - -# Parse a fully qualified domain name -PublicSuffix.domain("www.google.com.") -# => "google.com" -``` - -## Private domains - -This library has support for switching off support for private (non-ICANN). - -```ruby -# Extract a domain including private domains (by default) -PublicSuffix.domain("something.blogspot.com") -# => "something.blogspot.com" - -# Extract a domain excluding private domains -PublicSuffix.domain("something.blogspot.com", ignore_private: true) -# => "blogspot.com" - -# It also works for #parse and #valid? -PublicSuffix.parse("something.blogspot.com", ignore_private: true) -PublicSuffix.valid?("something.blogspot.com", ignore_private: true) -``` - -If you don't care about private domains at all, it's more efficient to exclude them when the list is parsed: - -```ruby -# Disable support for private TLDs -PublicSuffix::List.default = PublicSuffix::List.parse(File.read(PublicSuffix::List::DEFAULT_LIST_PATH), private_domains: false) -# => "blogspot.com" -PublicSuffix.domain("something.blogspot.com") -# => "blogspot.com" -``` - - -## What is the Public Suffix List? - -The [Public Suffix List](https://publicsuffix.org) is a cross-vendor initiative to provide an accurate list of domain name suffixes. - -The Public Suffix List is an initiative of the Mozilla Project, but is maintained as a community resource. It is available for use in any software, but was originally created to meet the needs of browser manufacturers. - -A "public suffix" is one under which Internet users can directly register names. Some examples of public suffixes are ".com", ".co.uk" and "pvt.k12.wy.us". The Public Suffix List is a list of all known public suffixes. - - -## Why the Public Suffix List is better than any available Regular Expression parser? - -Previously, browsers used an algorithm which basically only denied setting wide-ranging cookies for top-level domains with no dots (e.g. com or org). However, this did not work for top-level domains where only third-level registrations are allowed (e.g. co.uk). In these cases, websites could set a cookie for co.uk which will be passed onto every website registered under co.uk. - -Clearly, this was a security risk as it allowed websites other than the one setting the cookie to read it, and therefore potentially extract sensitive information. - -Since there is no algorithmic method of finding the highest level at which a domain may be registered for a particular top-level domain (the policies differ with each registry), the only method is to create a list of all top-level domains and the level at which domains can be registered. This is the aim of the effective TLD list. - -As well as being used to prevent cookies from being set where they shouldn't be, the list can also potentially be used for other applications where the registry controlled and privately controlled parts of a domain name need to be known, for example when grouping by top-level domains. - -Source: https://wiki.mozilla.org/Public_Suffix_List - -Not convinced yet? Check out [this real world example](https://stackoverflow.com/q/288810/123527). - - -## Does PublicSuffix make requests to Public Suffix List website? - -No. PublicSuffix comes with a bundled list. It does not make any HTTP requests to parse or validate a domain. - - -## Support - -Library documentation is auto-generated from the [README](https://github.com/weppos/publicsuffix-ruby/blob/master/README.md) and the source code, and it's available at https://rubydoc.info/gems/public_suffix. - -- The PublicSuffix bug tracker is here: https://github.com/weppos/publicsuffix-ruby/issues -- The PublicSuffix code repository is here: https://github.com/weppos/publicsuffix-ruby. Contributions are welcome! Please include tests and/or feature coverage for every patch, and create a topic branch for every separate change you make. - -[Consider subscribing to Tidelift which provides Enterprise support for this project](https://tidelift.com/subscription/pkg/rubygems-public-suffix?utm_source=rubygems-public-suffix&utm_medium=referral&utm_campaign=readme) as part of the Tidelift Subscription. Tidelift subscriptions also help the maintainers by funding the project, which in turn allows us to ship releases, bugfixes, and security updates more often. - - -## Security and Vulnerability Reporting - -Full information and description of our security policy please visit [`SECURITY.md`](SECURITY.md) - - -## Changelog - -See the [CHANGELOG.md](CHANGELOG.md) file for details. - - -## License - -Copyright (c) 2009-2022 Simone Carletti. This is Free Software distributed under the MIT license. - -The [Public Suffix List source](https://publicsuffix.org/list/) is subject to the terms of the Mozilla Public License, v. 2.0. - -## Definitions - -tld = Top level domain, this is in reference to the last segment of a domain, sometimes the part that is directly after the "dot" symbol. For example, `mozilla.org`, the `.org` portion is the tld. - -sld = Second level domain, a domain that is directly below a top-level domain. For example, in `https://www.mozilla.org/en-US/`, `mozilla` is the second-level domain of the .org tld. - -trd = Transit routing domain, or known as a subdomain. This is the part of the domain that is before the sld or root domain. For example, in `https://www.mozilla.org/en-US/`, `www` is the trd. - -FQDN = Fully Qualified Domain Names, are domain names that are written with the hostname and the domain name, and include the top-level domain, the format looks like `[hostname].[domain].[tld].` for ex. `[www].[mozilla].[org]`. diff --git a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/Rakefile b/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/Rakefile deleted file mode 100644 index 26a6c99..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/Rakefile +++ /dev/null @@ -1,52 +0,0 @@ -# frozen_string_literal: true - -require "bundler/gem_tasks" - -# By default, run tests and linter. -task default: [:test, :rubocop] - - -require "rake/testtask" - -Rake::TestTask.new do |t| - t.libs = %w( lib test ) - t.pattern = "test/**/*_test.rb" - t.verbose = !ENV["VERBOSE"].nil? - t.warning = !ENV["WARNING"].nil? -end - -require "rubocop/rake_task" - -RuboCop::RakeTask.new - - -require "yard" -require "yard/rake/yardoc_task" - -YARD::Rake::YardocTask.new(:yardoc) do |y| - y.options = ["--output-dir", "yardoc"] -end - -CLOBBER.include "yardoc" - - -task :benchmarks do - Dir["benchmarks/bm_*.rb"].each do |file| - sh "ruby #{file}" - end -end -task default: [:benchmarks] if ENV["BENCHMARKS"] == "1" - - -desc "Downloads the Public Suffix List file from the repository and stores it locally." -task :"update-list" do - require "net/http" - - DEFINITION_URL = "https://raw.githubusercontent.com/publicsuffix/list/master/public_suffix_list.dat" - - File.open("data/list.txt", "w+") do |f| - response = Net::HTTP.get_response(URI.parse(DEFINITION_URL)) - response.body - f.write(response.body) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/SECURITY.md b/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/SECURITY.md deleted file mode 100644 index f329128..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/SECURITY.md +++ /dev/null @@ -1,104 +0,0 @@ -# Security Policy - -## Supported Versions - -Security updates are provided only for the current minor version. - -If you are using a previous minor version, we recommend to upgrade to the current minor version. -This project uses [semantic versioning](https://semver.org/), therefore you can upgrade to a more recent minor version without incurring into breaking changes. - -Exceptionally, we may support previous minor versions upon request if there are significant reasons preventing to immediately switch the latest minor version. - -Older major versions are no longer supported. - - -## Reporting a Vulnerability - -To make a report, please email weppos@weppos.net. - -Please consider encrypting your report with GPG using the key [0x420da82a989398df](https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x420da82a989398df). - -``` ------BEGIN PGP PUBLIC KEY BLOCK----- - -xsBNBE/QiI0BCACtBbjJnJIzaLb4NfjaljzT/+dvodst+wyDRE8Vwc6ujwboZjr2 -0QwXScNzObPazyvkSZVh3g6PveneeSD0dSw2XDqKbbtLMg/Ss12yqXJfjavH/zjk -6Xq+nnbSnxBPzwFAAEaEFIc6H6BygJ7zHPP5WEY5QIMqifEAX//aBqHi4GXHJiHE -237Zqufdry23jBYjY7wGXAa11VsU9Iwqh6LPB9/hc1KtzjAuvvm5ufeT/iVjxGQX -te1OZZk6n8xSVYeLsn97PfgYs0yauhexwD9dG7FbRCB379JxPRn5akr391qXcVOG -ZA3yBXUSPOL6D1+TS1S0su5zbw2AEp4+z3SpABEBAAHNIlNpbW9uZSBDYXJsZXR0 -aSA8d2VwcG9zQGdtYWlsLmNvbT7CwHcEEwEKACEFAlXH0UQCGy8FCwkIBwMFFQoJ -CAsFFgIDAQACHgECF4AACgkQQg2oKpiTmN9BOQf/UHd+bmww71MkbS38KkowDu+0 -1VH35aL8sFcAMUSEA4I5oPWZoBtYYPGpALLxtrSNW+SCnmmeCQVfVmLedUVHwDZo -TS4qiynpqnz+Cnq4KRC8VMIyaFoiT5Vg6MLtau8hJtqZn1Wv68g0nXuprsCuf9vs -z7DDZ36z8em6OJQJQ/FQ4BGogzyYHa90cJnIM6BeLiRUUpFTl1tHLlw4JFUNi8sx -6VQ1/nhcr3OyskAix5TytRnJ8uIn22m25GGdTF2WQPNfkWJQVT4ZDbCxT20acRp0 -l3x1DAk3Eel8gOKzgOboB3bkI5/l1XZvNL0YWGZeyfp8I7ZqpXg/m4qLDkYU2cLA -egQTAQoAJAIbLwULCQgHAwUVCgkICwUWAgMBAAIeAQIXgAUCVf6KvAIZAQAKCRBC -DagqmJOY34ABB/9WbNAh0l07UN1ePfVm6Brg2Yt8k6Q2lIRUG2xAeQj/+Kx/4lAL -oY6F0jJ44kIDZqZdNA0QIqYzZRBV4iW+cQrsBUUyM+chiA3RuOsDG18sfvkyPvRy -ecOVubHCN+nK2GKy1oHQkCpVFIeetr0ugB/j+xNDKJ3Oa5dGBKF29ZH5Pxg7cqwH -cdkhBGMpPbBYq5pJtYGggqypELzFTG292StbtV837Eze+clWRTKtMBOHke/oKBCr -YYic2fmipGC9XUiqvMEMAKYq5WWWXIlcSVSnBDdxq41tXjKK4XMVgoOboZCcNFvh -0NxuDQATk1YruRZOS4SpBPXykEA1pK/zm3WmzSNTaW1vbmUgQ2FybGV0dGkgPHdl -cHBvc0B3ZXBwb3MubmV0PsLAeQQTAQIAIwUCT9CIjQIbLwcLCQgHAwIBBhUIAgkK -CwQWAgMBAh4BAheAAAoJEEINqCqYk5jfGWcH/Ax3EhAckGeCqNYE5BTx94bKB1LL -vUjeUoImMtGGFxQu2jNOAjtpuyjihm9uHBZ+dxaxHHrhE11f+0sDcwvW8qtKEzOs -GESr01VqTaVFS2JOEHhLphXseaLXJe32Osz0kHCZmrz1fCwv3b8QuWBifn8oVzcV -vrE7lGC6pGwaiUvMsvA++RUquTlNVlh8uRrqcQCU8Ne9lSoDWHlUJes5s4FoCh3R -oVBcKPsx3m/P9+GlEgTDqYP+WU3sfSfJYERH0r0NAYP96m2e7UQrqdgvMTVVDkPB -UB9efZzgkL7u9IAqmLU2klSGdEZnJ8t1AsjEyHXMztC7ICUhRFCeXHdTNhHCwHwE -EwEKACYCGy8HCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIXgAUCVcfRaQIZAQAKCRBC -DagqmJOY31y1B/41I/SsWwDqJP/Y3LzzatGmIv/gy+LkJBBTr/NV0NYzKV2XJ1BG -ese2ZE4tKKdG4HDwF+IwFLBHcPZRv358IwwTRPnzeO23mxpTYAnRCdg/pcaYIJ9r -OxIOP+R52YbgGrNKcezVA+7TY9za072P7Bk85jTM2FNfqevaf/YQ4GRcGLQ3JI8N -tBUdvrOEETDpR0QFTr22Wv1C7UfPDsSf7ZUM7zJ38CmDji8JSlr6y75/LYSY50BB -8EHb03QxyePe98A3WzvOoqamiCIe9bRzH5IqRAtJYDX8cK4PZmp43bQhrjdjawCc -AU/OY9iz+zCw00+b6CNiRb59N+OwpNJh5iNNwsB5BBMBCgAjAhsvBwsJCAcDAgEG -FQgCCQoLBBYCAwECHgECF4AFAlX+iq0ACgkQQg2oKpiTmN/z2gf/VbcQHgTlXFYa -Sq/dE7S54uGFrdzHOV3IJyl+ByMwVoKn6zdpksRoyt7jPV3RonrUO7jEcrt7VKCU -2KC7/MZMDoUsn9BXXTtUk+uTCNh8qllR0Fo/FvWM9RJKmcDMKwAJwcKIgbfUBJGx -1N6pP2DUc+YCnEerRbnQ1DWJUM7BaOEN6bvPxuGblPst1l6S5VktFj3gZGYItHrs -pit5pesILP8K6B6VCNP2WXXYvYQo7yyYcG8WBWXin8/SdNwU68lUbfhhQVIKv6LU -h0wvgG97NsBPrFbij0K6O63FufnNr9WLMZhAzi0h6gNK2HKAyw9AZNKpPccwg+mX -Huc/4CPRlM0uU2ltb25lIENhcmxldHRpIDxzaW1vbmUuY2FybGV0dGlAZG5zaW1w -bGUuY29tPsLAdwQTAQoAIQUCVh4ipAIbLwULCQgHAwUVCgkICwUWAgMBAAIeAQIX -gAAKCRBCDagqmJOY329iCACpOY5SV7hwOZ8VqmRfxRoHQFQe9Owr+hD3eL0AKZaJ -V918dCPrrxbAmwwMAC8pS8J4CmrrTR27kxcUgVwcfyydFPrgST5pg+H7UTrBR045 -4Npw1+m99I2Pyyl3oaym4lKJFbp2c2DGODEzTg8kKfjk0cb8bd+MJrXqFyod1z5r -0pfexwaLVt1Hz+ZsmFIPO1ISHYBPV8OkpL8Kgb8WtY6REntgNjfcmtHNi0VWQ7+N -vgeYqdhscX8c9ROe26BiiiGXphRlAsCU/VLHOJkzoW3f9QLy4z01Xj/7OaD0JkHS -HrES1ye3ZDxnjnTRdh4U8ntJ+L+xnePcFQA2t0eCbPwIzSZTaW1vbmUgQ2FybGV0 -dGkgPHNpbW9uZUBjYXJsZXR0aS5uYW1lPsLAdwQTAQoAIQUCVf7gmwIbLwULCQgH -AwUVCgkICwUWAgMBAAIeAQIXgAAKCRBCDagqmJOY37L+B/45pWT3wgm43+kzHVOT -j63m4zmRb53TGZToRSxz3acyuVSuqU9Tv010F0ZV9ccb0NDeN+88s9tEisuoO0Rz -5vhC8AtwRUyR3ADE9pBtvvxT+4R9y8yYNTCIX45VPG9ZPp9+7i+XCdKtz30KIV7r -smktd2FrK16r/KUN8+03iZSgzQ9lsTmXK5L7zH/f3Tqhbfvybr4+M71KGnSoP+iP -vwfsoBb5rhijQLOykTb+VzdDpHQbupwxwm/3S4nsA4U6tonIywlJgBDSjgDjQj0i -Ez+Db2Wt59y6LoksRQogvJqm0nuxFUWMZc47zdhsRnqmxUYTNpKaJPWc6pfxsQPK -ZvTjzsBNBE/QiI0BCACsaNbG6kyKJBWL5jPhebsijk8PCfSHte1jNCA5l/NvaImZ -6ORq9f8S9MWlYxmzyUkVJaWrv+9p5zmjwcaegjerj6ggjPDEXlZG41Z4YE1/R8pf -wkSvrkLziBxZDB1aYplg8kgXkaIf2yi2FrMPSi04sjvQbBSCcIJeh6+vGK8tIJTn -e0tQbEvRorTwBAPAFlpx/bdk1wZYu11vFKbckhKWou7f8XSdn9ng9cY5uK+xBlFU -2ORgL1ygeIoY9uRvNZG2ncvCvxUPgOqbo31R8KPyvV4rNNvGBOfxQER9LbieBF2I -5I1gpyboGWKcXu1eV7tOpjtW6LHt+6NHhE6L1Lw1ABEBAAHCwX4EGAECAAkFAk/Q -iI0CGy4BKQkQQg2oKpiTmN/AXSAEGQECAAYFAk/QiI0ACgkQcBROh493BN9hdwf9 -GjiF1GcQN+3TZkXdr2WY0AlbcA/wBp6+ShnqcoU5XLuA0RY3+rWGuaSc2buLke6Y -2MhMAYcgmPdG+WTBoW5dWQGXBZ1IHYVR8HLGaF+Vate1MofE1BNHXhnilIMMfH4G -Tcr3Z3/FaSk9OdHlyiE/Jo7++8PQ+auHVyjtqry+/ysAnyr+lnCn+K4E0PQ1fYpP -fiawKtfSqk9h6HjjMyx9Adrz+ljXh+NyVqYZUfRytjgO+v+dAQmMczT1EawLTdX+ -trx1tHR549pEey7in5QKsje3GLH4zq4mCdWBlivQxmmmlvR07DysLADMbcpjKK2g -utfzygZHCU9hWGR3wbWZ7lXjB/0ZzutNaNYzSCkiC8PIWH1bG+TJO9pslHwP+aBJ -NGAmcwyOH9Bub2CSXikQFZNUmVRwtl7mN4bVAHI8zbMd6xdlX22yDgQei54dPXDw -UYsvGE4zmrD97he1EYcIOKMFHzlJNcWK+uR7lEq6mv7SFGnBr8qTYZRi1bySRgwd -UORuDV12GKTen9WectKtepW0fgYSz+udbDKQyyRef+7xGtCErWRL7f1qr8xm60da -+gSwyD/WkPTY8SP2mdq4u+6m4dWS26kKoENwuL7jUktl/C/EG7NmUKURbXG8lmeu -q59MIs/Fb3SgaO+zN2FZTYp6dyRJHbeEz55JdOu6F+6ihZYH -=j6Xr ------END PGP PUBLIC KEY BLOCK----- -``` - - -## Tracking Security Updates - -Information about security vulnerabilities are published in the [Security Advisories](https://github.com/weppos/publicsuffix-ruby/security/advisories) page. diff --git a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/bin/console b/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/bin/console deleted file mode 100755 index c638bb4..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/bin/console +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env ruby -# frozen_string_literal: true - -require "bundler/setup" -require "public_suffix" - -# You can add fixtures and/or initialization code here to make experimenting -# with your gem easier. You can also use a different console, if you like. - -# (If you use this, don't forget to add pry to your Gemfile!) -# require "pry" -# Pry.start - -require "irb" -IRB.start diff --git a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/data/list.txt b/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/data/list.txt deleted file mode 100644 index 237e159..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/data/list.txt +++ /dev/null @@ -1,14035 +0,0 @@ -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at https://mozilla.org/MPL/2.0/. - -// Please pull this list from, and only from https://publicsuffix.org/list/public_suffix_list.dat, -// rather than any other VCS sites. Pulling from any other URL is not guaranteed to be supported. - -// Instructions on pulling and using this list can be found at https://publicsuffix.org/list/. - -// ===BEGIN ICANN DOMAINS=== - -// ac : http://nic.ac/rules.htm -ac -com.ac -edu.ac -gov.ac -net.ac -mil.ac -org.ac - -// ad : https://en.wikipedia.org/wiki/.ad -ad -nom.ad - -// ae : https://tdra.gov.ae/en/aeda/ae-policies -ae -co.ae -net.ae -org.ae -sch.ae -ac.ae -gov.ae -mil.ae - -// aero : see https://www.information.aero/index.php?id=66 -aero -accident-investigation.aero -accident-prevention.aero -aerobatic.aero -aeroclub.aero -aerodrome.aero -agents.aero -aircraft.aero -airline.aero -airport.aero -air-surveillance.aero -airtraffic.aero -air-traffic-control.aero -ambulance.aero -amusement.aero -association.aero -author.aero -ballooning.aero -broker.aero -caa.aero -cargo.aero -catering.aero -certification.aero -championship.aero -charter.aero -civilaviation.aero -club.aero -conference.aero -consultant.aero -consulting.aero -control.aero -council.aero -crew.aero -design.aero -dgca.aero -educator.aero -emergency.aero -engine.aero -engineer.aero -entertainment.aero -equipment.aero -exchange.aero -express.aero -federation.aero -flight.aero -fuel.aero -gliding.aero -government.aero -groundhandling.aero -group.aero -hanggliding.aero -homebuilt.aero -insurance.aero -journal.aero -journalist.aero -leasing.aero -logistics.aero -magazine.aero -maintenance.aero -media.aero -microlight.aero -modelling.aero -navigation.aero -parachuting.aero -paragliding.aero -passenger-association.aero -pilot.aero -press.aero -production.aero -recreation.aero -repbody.aero -res.aero -research.aero -rotorcraft.aero -safety.aero -scientist.aero -services.aero -show.aero -skydiving.aero -software.aero -student.aero -trader.aero -trading.aero -trainer.aero -union.aero -workinggroup.aero -works.aero - -// af : http://www.nic.af/help.jsp -af -gov.af -com.af -org.af -net.af -edu.af - -// ag : http://www.nic.ag/prices.htm -ag -com.ag -org.ag -net.ag -co.ag -nom.ag - -// ai : http://nic.com.ai/ -ai -off.ai -com.ai -net.ai -org.ai - -// al : http://www.ert.gov.al/ert_alb/faq_det.html?Id=31 -al -com.al -edu.al -gov.al -mil.al -net.al -org.al - -// am : https://www.amnic.net/policy/en/Policy_EN.pdf -am -co.am -com.am -commune.am -net.am -org.am - -// ao : https://en.wikipedia.org/wiki/.ao -// http://www.dns.ao/REGISTR.DOC -ao -ed.ao -gv.ao -og.ao -co.ao -pb.ao -it.ao - -// aq : https://en.wikipedia.org/wiki/.aq -aq - -// ar : https://nic.ar/es/nic-argentina/normativa -ar -bet.ar -com.ar -coop.ar -edu.ar -gob.ar -gov.ar -int.ar -mil.ar -musica.ar -mutual.ar -net.ar -org.ar -senasa.ar -tur.ar - -// arpa : https://en.wikipedia.org/wiki/.arpa -// Confirmed by registry 2008-06-18 -arpa -e164.arpa -in-addr.arpa -ip6.arpa -iris.arpa -uri.arpa -urn.arpa - -// as : https://en.wikipedia.org/wiki/.as -as -gov.as - -// asia : https://en.wikipedia.org/wiki/.asia -asia - -// at : https://en.wikipedia.org/wiki/.at -// Confirmed by registry 2008-06-17 -at -ac.at -co.at -gv.at -or.at -sth.ac.at - -// au : https://en.wikipedia.org/wiki/.au -// http://www.auda.org.au/ -au -// 2LDs -com.au -net.au -org.au -edu.au -gov.au -asn.au -id.au -// Historic 2LDs (closed to new registration, but sites still exist) -info.au -conf.au -oz.au -// CGDNs - http://www.cgdn.org.au/ -act.au -nsw.au -nt.au -qld.au -sa.au -tas.au -vic.au -wa.au -// 3LDs -act.edu.au -catholic.edu.au -// eq.edu.au - Removed at the request of the Queensland Department of Education -nsw.edu.au -nt.edu.au -qld.edu.au -sa.edu.au -tas.edu.au -vic.edu.au -wa.edu.au -// act.gov.au Bug 984824 - Removed at request of Greg Tankard -// nsw.gov.au Bug 547985 - Removed at request of -// nt.gov.au Bug 940478 - Removed at request of Greg Connors -qld.gov.au -sa.gov.au -tas.gov.au -vic.gov.au -wa.gov.au -// 4LDs -// education.tas.edu.au - Removed at the request of the Department of Education Tasmania -schools.nsw.edu.au - -// aw : https://en.wikipedia.org/wiki/.aw -aw -com.aw - -// ax : https://en.wikipedia.org/wiki/.ax -ax - -// az : https://en.wikipedia.org/wiki/.az -az -com.az -net.az -int.az -gov.az -org.az -edu.az -info.az -pp.az -mil.az -name.az -pro.az -biz.az - -// ba : http://nic.ba/users_data/files/pravilnik_o_registraciji.pdf -ba -com.ba -edu.ba -gov.ba -mil.ba -net.ba -org.ba - -// bb : https://en.wikipedia.org/wiki/.bb -bb -biz.bb -co.bb -com.bb -edu.bb -gov.bb -info.bb -net.bb -org.bb -store.bb -tv.bb - -// bd : https://en.wikipedia.org/wiki/.bd -*.bd - -// be : https://en.wikipedia.org/wiki/.be -// Confirmed by registry 2008-06-08 -be -ac.be - -// bf : https://en.wikipedia.org/wiki/.bf -bf -gov.bf - -// bg : https://en.wikipedia.org/wiki/.bg -// https://www.register.bg/user/static/rules/en/index.html -bg -a.bg -b.bg -c.bg -d.bg -e.bg -f.bg -g.bg -h.bg -i.bg -j.bg -k.bg -l.bg -m.bg -n.bg -o.bg -p.bg -q.bg -r.bg -s.bg -t.bg -u.bg -v.bg -w.bg -x.bg -y.bg -z.bg -0.bg -1.bg -2.bg -3.bg -4.bg -5.bg -6.bg -7.bg -8.bg -9.bg - -// bh : https://en.wikipedia.org/wiki/.bh -bh -com.bh -edu.bh -net.bh -org.bh -gov.bh - -// bi : https://en.wikipedia.org/wiki/.bi -// http://whois.nic.bi/ -bi -co.bi -com.bi -edu.bi -or.bi -org.bi - -// biz : https://en.wikipedia.org/wiki/.biz -biz - -// bj : https://en.wikipedia.org/wiki/.bj -bj -asso.bj -barreau.bj -gouv.bj - -// bm : http://www.bermudanic.bm/dnr-text.txt -bm -com.bm -edu.bm -gov.bm -net.bm -org.bm - -// bn : http://www.bnnic.bn/faqs -bn -com.bn -edu.bn -gov.bn -net.bn -org.bn - -// bo : https://nic.bo/delegacion2015.php#h-1.10 -bo -com.bo -edu.bo -gob.bo -int.bo -org.bo -net.bo -mil.bo -tv.bo -web.bo -// Social Domains -academia.bo -agro.bo -arte.bo -blog.bo -bolivia.bo -ciencia.bo -cooperativa.bo -democracia.bo -deporte.bo -ecologia.bo -economia.bo -empresa.bo -indigena.bo -industria.bo -info.bo -medicina.bo -movimiento.bo -musica.bo -natural.bo -nombre.bo -noticias.bo -patria.bo -politica.bo -profesional.bo -plurinacional.bo -pueblo.bo -revista.bo -salud.bo -tecnologia.bo -tksat.bo -transporte.bo -wiki.bo - -// br : http://registro.br/dominio/categoria.html -// Submitted by registry -br -9guacu.br -abc.br -adm.br -adv.br -agr.br -aju.br -am.br -anani.br -aparecida.br -app.br -arq.br -art.br -ato.br -b.br -barueri.br -belem.br -bhz.br -bib.br -bio.br -blog.br -bmd.br -boavista.br -bsb.br -campinagrande.br -campinas.br -caxias.br -cim.br -cng.br -cnt.br -com.br -contagem.br -coop.br -coz.br -cri.br -cuiaba.br -curitiba.br -def.br -des.br -det.br -dev.br -ecn.br -eco.br -edu.br -emp.br -enf.br -eng.br -esp.br -etc.br -eti.br -far.br -feira.br -flog.br -floripa.br -fm.br -fnd.br -fortal.br -fot.br -foz.br -fst.br -g12.br -geo.br -ggf.br -goiania.br -gov.br -// gov.br 26 states + df https://en.wikipedia.org/wiki/States_of_Brazil -ac.gov.br -al.gov.br -am.gov.br -ap.gov.br -ba.gov.br -ce.gov.br -df.gov.br -es.gov.br -go.gov.br -ma.gov.br -mg.gov.br -ms.gov.br -mt.gov.br -pa.gov.br -pb.gov.br -pe.gov.br -pi.gov.br -pr.gov.br -rj.gov.br -rn.gov.br -ro.gov.br -rr.gov.br -rs.gov.br -sc.gov.br -se.gov.br -sp.gov.br -to.gov.br -gru.br -imb.br -ind.br -inf.br -jab.br -jampa.br -jdf.br -joinville.br -jor.br -jus.br -leg.br -lel.br -log.br -londrina.br -macapa.br -maceio.br -manaus.br -maringa.br -mat.br -med.br -mil.br -morena.br -mp.br -mus.br -natal.br -net.br -niteroi.br -*.nom.br -not.br -ntr.br -odo.br -ong.br -org.br -osasco.br -palmas.br -poa.br -ppg.br -pro.br -psc.br -psi.br -pvh.br -qsl.br -radio.br -rec.br -recife.br -rep.br -ribeirao.br -rio.br -riobranco.br -riopreto.br -salvador.br -sampa.br -santamaria.br -santoandre.br -saobernardo.br -saogonca.br -seg.br -sjc.br -slg.br -slz.br -sorocaba.br -srv.br -taxi.br -tc.br -tec.br -teo.br -the.br -tmp.br -trd.br -tur.br -tv.br -udi.br -vet.br -vix.br -vlog.br -wiki.br -zlg.br - -// bs : http://www.nic.bs/rules.html -bs -com.bs -net.bs -org.bs -edu.bs -gov.bs - -// bt : https://en.wikipedia.org/wiki/.bt -bt -com.bt -edu.bt -gov.bt -net.bt -org.bt - -// bv : No registrations at this time. -// Submitted by registry -bv - -// bw : https://en.wikipedia.org/wiki/.bw -// http://www.gobin.info/domainname/bw.doc -// list of other 2nd level tlds ? -bw -co.bw -org.bw - -// by : https://en.wikipedia.org/wiki/.by -// http://tld.by/rules_2006_en.html -// list of other 2nd level tlds ? -by -gov.by -mil.by -// Official information does not indicate that com.by is a reserved -// second-level domain, but it's being used as one (see www.google.com.by and -// www.yahoo.com.by, for example), so we list it here for safety's sake. -com.by - -// http://hoster.by/ -of.by - -// bz : https://en.wikipedia.org/wiki/.bz -// http://www.belizenic.bz/ -bz -com.bz -net.bz -org.bz -edu.bz -gov.bz - -// ca : https://en.wikipedia.org/wiki/.ca -ca -// ca geographical names -ab.ca -bc.ca -mb.ca -nb.ca -nf.ca -nl.ca -ns.ca -nt.ca -nu.ca -on.ca -pe.ca -qc.ca -sk.ca -yk.ca -// gc.ca: https://en.wikipedia.org/wiki/.gc.ca -// see also: http://registry.gc.ca/en/SubdomainFAQ -gc.ca - -// cat : https://en.wikipedia.org/wiki/.cat -cat - -// cc : https://en.wikipedia.org/wiki/.cc -cc - -// cd : https://en.wikipedia.org/wiki/.cd -// see also: https://www.nic.cd/domain/insertDomain_2.jsp?act=1 -cd -gov.cd - -// cf : https://en.wikipedia.org/wiki/.cf -cf - -// cg : https://en.wikipedia.org/wiki/.cg -cg - -// ch : https://en.wikipedia.org/wiki/.ch -ch - -// ci : https://en.wikipedia.org/wiki/.ci -// http://www.nic.ci/index.php?page=charte -ci -org.ci -or.ci -com.ci -co.ci -edu.ci -ed.ci -ac.ci -net.ci -go.ci -asso.ci -aéroport.ci -int.ci -presse.ci -md.ci -gouv.ci - -// ck : https://en.wikipedia.org/wiki/.ck -*.ck -!www.ck - -// cl : https://www.nic.cl -// Confirmed by .CL registry -cl -co.cl -gob.cl -gov.cl -mil.cl - -// cm : https://en.wikipedia.org/wiki/.cm plus bug 981927 -cm -co.cm -com.cm -gov.cm -net.cm - -// cn : https://en.wikipedia.org/wiki/.cn -// Submitted by registry -cn -ac.cn -com.cn -edu.cn -gov.cn -net.cn -org.cn -mil.cn -公司.cn -网络.cn -網絡.cn -// cn geographic names -ah.cn -bj.cn -cq.cn -fj.cn -gd.cn -gs.cn -gz.cn -gx.cn -ha.cn -hb.cn -he.cn -hi.cn -hl.cn -hn.cn -jl.cn -js.cn -jx.cn -ln.cn -nm.cn -nx.cn -qh.cn -sc.cn -sd.cn -sh.cn -sn.cn -sx.cn -tj.cn -xj.cn -xz.cn -yn.cn -zj.cn -hk.cn -mo.cn -tw.cn - -// co : https://en.wikipedia.org/wiki/.co -// Submitted by registry -co -arts.co -com.co -edu.co -firm.co -gov.co -info.co -int.co -mil.co -net.co -nom.co -org.co -rec.co -web.co - -// com : https://en.wikipedia.org/wiki/.com -com - -// coop : https://en.wikipedia.org/wiki/.coop -coop - -// cr : http://www.nic.cr/niccr_publico/showRegistroDominiosScreen.do -cr -ac.cr -co.cr -ed.cr -fi.cr -go.cr -or.cr -sa.cr - -// cu : https://en.wikipedia.org/wiki/.cu -cu -com.cu -edu.cu -org.cu -net.cu -gov.cu -inf.cu - -// cv : https://en.wikipedia.org/wiki/.cv -// cv : http://www.dns.cv/tldcv_portal/do?com=DS;5446457100;111;+PAGE(4000018)+K-CAT-CODIGO(RDOM)+RCNT(100); <- registration rules -cv -com.cv -edu.cv -int.cv -nome.cv -org.cv - -// cw : http://www.una.cw/cw_registry/ -// Confirmed by registry 2013-03-26 -cw -com.cw -edu.cw -net.cw -org.cw - -// cx : https://en.wikipedia.org/wiki/.cx -// list of other 2nd level tlds ? -cx -gov.cx - -// cy : http://www.nic.cy/ -// Submitted by registry Panayiotou Fotia -// namespace policies URL https://www.nic.cy/portal//sites/default/files/symfonia_gia_eggrafi.pdf -cy -ac.cy -biz.cy -com.cy -ekloges.cy -gov.cy -ltd.cy -mil.cy -net.cy -org.cy -press.cy -pro.cy -tm.cy - -// cz : https://en.wikipedia.org/wiki/.cz -cz - -// de : https://en.wikipedia.org/wiki/.de -// Confirmed by registry (with technical -// reservations) 2008-07-01 -de - -// dj : https://en.wikipedia.org/wiki/.dj -dj - -// dk : https://en.wikipedia.org/wiki/.dk -// Confirmed by registry 2008-06-17 -dk - -// dm : https://en.wikipedia.org/wiki/.dm -dm -com.dm -net.dm -org.dm -edu.dm -gov.dm - -// do : https://en.wikipedia.org/wiki/.do -do -art.do -com.do -edu.do -gob.do -gov.do -mil.do -net.do -org.do -sld.do -web.do - -// dz : http://www.nic.dz/images/pdf_nic/charte.pdf -dz -art.dz -asso.dz -com.dz -edu.dz -gov.dz -org.dz -net.dz -pol.dz -soc.dz -tm.dz - -// ec : http://www.nic.ec/reg/paso1.asp -// Submitted by registry -ec -com.ec -info.ec -net.ec -fin.ec -k12.ec -med.ec -pro.ec -org.ec -edu.ec -gov.ec -gob.ec -mil.ec - -// edu : https://en.wikipedia.org/wiki/.edu -edu - -// ee : http://www.eenet.ee/EENet/dom_reeglid.html#lisa_B -ee -edu.ee -gov.ee -riik.ee -lib.ee -med.ee -com.ee -pri.ee -aip.ee -org.ee -fie.ee - -// eg : https://en.wikipedia.org/wiki/.eg -eg -com.eg -edu.eg -eun.eg -gov.eg -mil.eg -name.eg -net.eg -org.eg -sci.eg - -// er : https://en.wikipedia.org/wiki/.er -*.er - -// es : https://www.nic.es/site_ingles/ingles/dominios/index.html -es -com.es -nom.es -org.es -gob.es -edu.es - -// et : https://en.wikipedia.org/wiki/.et -et -com.et -gov.et -org.et -edu.et -biz.et -name.et -info.et -net.et - -// eu : https://en.wikipedia.org/wiki/.eu -eu - -// fi : https://en.wikipedia.org/wiki/.fi -fi -// aland.fi : https://en.wikipedia.org/wiki/.ax -// This domain is being phased out in favor of .ax. As there are still many -// domains under aland.fi, we still keep it on the list until aland.fi is -// completely removed. -// TODO: Check for updates (expected to be phased out around Q1/2009) -aland.fi - -// fj : http://domains.fj/ -// Submitted by registry 2020-02-11 -fj -ac.fj -biz.fj -com.fj -gov.fj -info.fj -mil.fj -name.fj -net.fj -org.fj -pro.fj - -// fk : https://en.wikipedia.org/wiki/.fk -*.fk - -// fm : https://en.wikipedia.org/wiki/.fm -com.fm -edu.fm -net.fm -org.fm -fm - -// fo : https://en.wikipedia.org/wiki/.fo -fo - -// fr : http://www.afnic.fr/ -// domaines descriptifs : https://www.afnic.fr/medias/documents/Cadre_legal/Afnic_Naming_Policy_12122016_VEN.pdf -fr -asso.fr -com.fr -gouv.fr -nom.fr -prd.fr -tm.fr -// domaines sectoriels : https://www.afnic.fr/en/products-and-services/the-fr-tld/sector-based-fr-domains-4.html -aeroport.fr -avocat.fr -avoues.fr -cci.fr -chambagri.fr -chirurgiens-dentistes.fr -experts-comptables.fr -geometre-expert.fr -greta.fr -huissier-justice.fr -medecin.fr -notaires.fr -pharmacien.fr -port.fr -veterinaire.fr - -// ga : https://en.wikipedia.org/wiki/.ga -ga - -// gb : This registry is effectively dormant -// Submitted by registry -gb - -// gd : https://en.wikipedia.org/wiki/.gd -edu.gd -gov.gd -gd - -// ge : http://www.nic.net.ge/policy_en.pdf -ge -com.ge -edu.ge -gov.ge -org.ge -mil.ge -net.ge -pvt.ge - -// gf : https://en.wikipedia.org/wiki/.gf -gf - -// gg : http://www.channelisles.net/register-domains/ -// Confirmed by registry 2013-11-28 -gg -co.gg -net.gg -org.gg - -// gh : https://en.wikipedia.org/wiki/.gh -// see also: http://www.nic.gh/reg_now.php -// Although domains directly at second level are not possible at the moment, -// they have been possible for some time and may come back. -gh -com.gh -edu.gh -gov.gh -org.gh -mil.gh - -// gi : http://www.nic.gi/rules.html -gi -com.gi -ltd.gi -gov.gi -mod.gi -edu.gi -org.gi - -// gl : https://en.wikipedia.org/wiki/.gl -// http://nic.gl -gl -co.gl -com.gl -edu.gl -net.gl -org.gl - -// gm : http://www.nic.gm/htmlpages%5Cgm-policy.htm -gm - -// gn : http://psg.com/dns/gn/gn.txt -// Submitted by registry -gn -ac.gn -com.gn -edu.gn -gov.gn -org.gn -net.gn - -// gov : https://en.wikipedia.org/wiki/.gov -gov - -// gp : http://www.nic.gp/index.php?lang=en -gp -com.gp -net.gp -mobi.gp -edu.gp -org.gp -asso.gp - -// gq : https://en.wikipedia.org/wiki/.gq -gq - -// gr : https://grweb.ics.forth.gr/english/1617-B-2005.html -// Submitted by registry -gr -com.gr -edu.gr -net.gr -org.gr -gov.gr - -// gs : https://en.wikipedia.org/wiki/.gs -gs - -// gt : https://www.gt/sitio/registration_policy.php?lang=en -gt -com.gt -edu.gt -gob.gt -ind.gt -mil.gt -net.gt -org.gt - -// gu : http://gadao.gov.gu/register.html -// University of Guam : https://www.uog.edu -// Submitted by uognoc@triton.uog.edu -gu -com.gu -edu.gu -gov.gu -guam.gu -info.gu -net.gu -org.gu -web.gu - -// gw : https://en.wikipedia.org/wiki/.gw -// gw : https://nic.gw/regras/ -gw - -// gy : https://en.wikipedia.org/wiki/.gy -// http://registry.gy/ -gy -co.gy -com.gy -edu.gy -gov.gy -net.gy -org.gy - -// hk : https://www.hkirc.hk -// Submitted by registry -hk -com.hk -edu.hk -gov.hk -idv.hk -net.hk -org.hk -公司.hk -教育.hk -敎育.hk -政府.hk -個人.hk -个人.hk -箇人.hk -網络.hk -网络.hk -组織.hk -網絡.hk -网絡.hk -组织.hk -組織.hk -組织.hk - -// hm : https://en.wikipedia.org/wiki/.hm -hm - -// hn : http://www.nic.hn/politicas/ps02,,05.html -hn -com.hn -edu.hn -org.hn -net.hn -mil.hn -gob.hn - -// hr : http://www.dns.hr/documents/pdf/HRTLD-regulations.pdf -hr -iz.hr -from.hr -name.hr -com.hr - -// ht : http://www.nic.ht/info/charte.cfm -ht -com.ht -shop.ht -firm.ht -info.ht -adult.ht -net.ht -pro.ht -org.ht -med.ht -art.ht -coop.ht -pol.ht -asso.ht -edu.ht -rel.ht -gouv.ht -perso.ht - -// hu : http://www.domain.hu/domain/English/sld.html -// Confirmed by registry 2008-06-12 -hu -co.hu -info.hu -org.hu -priv.hu -sport.hu -tm.hu -2000.hu -agrar.hu -bolt.hu -casino.hu -city.hu -erotica.hu -erotika.hu -film.hu -forum.hu -games.hu -hotel.hu -ingatlan.hu -jogasz.hu -konyvelo.hu -lakas.hu -media.hu -news.hu -reklam.hu -sex.hu -shop.hu -suli.hu -szex.hu -tozsde.hu -utazas.hu -video.hu - -// id : https://pandi.id/en/domain/registration-requirements/ -id -ac.id -biz.id -co.id -desa.id -go.id -mil.id -my.id -net.id -or.id -ponpes.id -sch.id -web.id - -// ie : https://en.wikipedia.org/wiki/.ie -ie -gov.ie - -// il : http://www.isoc.org.il/domains/ -il -ac.il -co.il -gov.il -idf.il -k12.il -muni.il -net.il -org.il - -// im : https://www.nic.im/ -// Submitted by registry -im -ac.im -co.im -com.im -ltd.co.im -net.im -org.im -plc.co.im -tt.im -tv.im - -// in : https://en.wikipedia.org/wiki/.in -// see also: https://registry.in/Policies -// Please note, that nic.in is not an official eTLD, but used by most -// government institutions. -in -co.in -firm.in -net.in -org.in -gen.in -ind.in -nic.in -ac.in -edu.in -res.in -gov.in -mil.in - -// info : https://en.wikipedia.org/wiki/.info -info - -// int : https://en.wikipedia.org/wiki/.int -// Confirmed by registry 2008-06-18 -int -eu.int - -// io : http://www.nic.io/rules.htm -// list of other 2nd level tlds ? -io -com.io - -// iq : http://www.cmc.iq/english/iq/iqregister1.htm -iq -gov.iq -edu.iq -mil.iq -com.iq -org.iq -net.iq - -// ir : http://www.nic.ir/Terms_and_Conditions_ir,_Appendix_1_Domain_Rules -// Also see http://www.nic.ir/Internationalized_Domain_Names -// Two .ir entries added at request of , 2010-04-16 -ir -ac.ir -co.ir -gov.ir -id.ir -net.ir -org.ir -sch.ir -// xn--mgba3a4f16a.ir (.ir, Persian YEH) -ایران.ir -// xn--mgba3a4fra.ir (.ir, Arabic YEH) -ايران.ir - -// is : http://www.isnic.is/domain/rules.php -// Confirmed by registry 2008-12-06 -is -net.is -com.is -edu.is -gov.is -org.is -int.is - -// it : https://en.wikipedia.org/wiki/.it -it -gov.it -edu.it -// Reserved geo-names (regions and provinces): -// https://www.nic.it/sites/default/files/archivio/docs/Regulation_assignation_v7.1.pdf -// Regions -abr.it -abruzzo.it -aosta-valley.it -aostavalley.it -bas.it -basilicata.it -cal.it -calabria.it -cam.it -campania.it -emilia-romagna.it -emiliaromagna.it -emr.it -friuli-v-giulia.it -friuli-ve-giulia.it -friuli-vegiulia.it -friuli-venezia-giulia.it -friuli-veneziagiulia.it -friuli-vgiulia.it -friuliv-giulia.it -friulive-giulia.it -friulivegiulia.it -friulivenezia-giulia.it -friuliveneziagiulia.it -friulivgiulia.it -fvg.it -laz.it -lazio.it -lig.it -liguria.it -lom.it -lombardia.it -lombardy.it -lucania.it -mar.it -marche.it -mol.it -molise.it -piedmont.it -piemonte.it -pmn.it -pug.it -puglia.it -sar.it -sardegna.it -sardinia.it -sic.it -sicilia.it -sicily.it -taa.it -tos.it -toscana.it -trentin-sud-tirol.it -trentin-süd-tirol.it -trentin-sudtirol.it -trentin-südtirol.it -trentin-sued-tirol.it -trentin-suedtirol.it -trentino-a-adige.it -trentino-aadige.it -trentino-alto-adige.it -trentino-altoadige.it -trentino-s-tirol.it -trentino-stirol.it -trentino-sud-tirol.it -trentino-süd-tirol.it -trentino-sudtirol.it -trentino-südtirol.it -trentino-sued-tirol.it -trentino-suedtirol.it -trentino.it -trentinoa-adige.it -trentinoaadige.it -trentinoalto-adige.it -trentinoaltoadige.it -trentinos-tirol.it -trentinostirol.it -trentinosud-tirol.it -trentinosüd-tirol.it -trentinosudtirol.it -trentinosüdtirol.it -trentinosued-tirol.it -trentinosuedtirol.it -trentinsud-tirol.it -trentinsüd-tirol.it -trentinsudtirol.it -trentinsüdtirol.it -trentinsued-tirol.it -trentinsuedtirol.it -tuscany.it -umb.it -umbria.it -val-d-aosta.it -val-daosta.it -vald-aosta.it -valdaosta.it -valle-aosta.it -valle-d-aosta.it -valle-daosta.it -valleaosta.it -valled-aosta.it -valledaosta.it -vallee-aoste.it -vallée-aoste.it -vallee-d-aoste.it -vallée-d-aoste.it -valleeaoste.it -valléeaoste.it -valleedaoste.it -valléedaoste.it -vao.it -vda.it -ven.it -veneto.it -// Provinces -ag.it -agrigento.it -al.it -alessandria.it -alto-adige.it -altoadige.it -an.it -ancona.it -andria-barletta-trani.it -andria-trani-barletta.it -andriabarlettatrani.it -andriatranibarletta.it -ao.it -aosta.it -aoste.it -ap.it -aq.it -aquila.it -ar.it -arezzo.it -ascoli-piceno.it -ascolipiceno.it -asti.it -at.it -av.it -avellino.it -ba.it -balsan-sudtirol.it -balsan-südtirol.it -balsan-suedtirol.it -balsan.it -bari.it -barletta-trani-andria.it -barlettatraniandria.it -belluno.it -benevento.it -bergamo.it -bg.it -bi.it -biella.it -bl.it -bn.it -bo.it -bologna.it -bolzano-altoadige.it -bolzano.it -bozen-sudtirol.it -bozen-südtirol.it -bozen-suedtirol.it -bozen.it -br.it -brescia.it -brindisi.it -bs.it -bt.it -bulsan-sudtirol.it -bulsan-südtirol.it -bulsan-suedtirol.it -bulsan.it -bz.it -ca.it -cagliari.it -caltanissetta.it -campidano-medio.it -campidanomedio.it -campobasso.it -carbonia-iglesias.it -carboniaiglesias.it -carrara-massa.it -carraramassa.it -caserta.it -catania.it -catanzaro.it -cb.it -ce.it -cesena-forli.it -cesena-forlì.it -cesenaforli.it -cesenaforlì.it -ch.it -chieti.it -ci.it -cl.it -cn.it -co.it -como.it -cosenza.it -cr.it -cremona.it -crotone.it -cs.it -ct.it -cuneo.it -cz.it -dell-ogliastra.it -dellogliastra.it -en.it -enna.it -fc.it -fe.it -fermo.it -ferrara.it -fg.it -fi.it -firenze.it -florence.it -fm.it -foggia.it -forli-cesena.it -forlì-cesena.it -forlicesena.it -forlìcesena.it -fr.it -frosinone.it -ge.it -genoa.it -genova.it -go.it -gorizia.it -gr.it -grosseto.it -iglesias-carbonia.it -iglesiascarbonia.it -im.it -imperia.it -is.it -isernia.it -kr.it -la-spezia.it -laquila.it -laspezia.it -latina.it -lc.it -le.it -lecce.it -lecco.it -li.it -livorno.it -lo.it -lodi.it -lt.it -lu.it -lucca.it -macerata.it -mantova.it -massa-carrara.it -massacarrara.it -matera.it -mb.it -mc.it -me.it -medio-campidano.it -mediocampidano.it -messina.it -mi.it -milan.it -milano.it -mn.it -mo.it -modena.it -monza-brianza.it -monza-e-della-brianza.it -monza.it -monzabrianza.it -monzaebrianza.it -monzaedellabrianza.it -ms.it -mt.it -na.it -naples.it -napoli.it -no.it -novara.it -nu.it -nuoro.it -og.it -ogliastra.it -olbia-tempio.it -olbiatempio.it -or.it -oristano.it -ot.it -pa.it -padova.it -padua.it -palermo.it -parma.it -pavia.it -pc.it -pd.it -pe.it -perugia.it -pesaro-urbino.it -pesarourbino.it -pescara.it -pg.it -pi.it -piacenza.it -pisa.it -pistoia.it -pn.it -po.it -pordenone.it -potenza.it -pr.it -prato.it -pt.it -pu.it -pv.it -pz.it -ra.it -ragusa.it -ravenna.it -rc.it -re.it -reggio-calabria.it -reggio-emilia.it -reggiocalabria.it -reggioemilia.it -rg.it -ri.it -rieti.it -rimini.it -rm.it -rn.it -ro.it -roma.it -rome.it -rovigo.it -sa.it -salerno.it -sassari.it -savona.it -si.it -siena.it -siracusa.it -so.it -sondrio.it -sp.it -sr.it -ss.it -suedtirol.it -südtirol.it -sv.it -ta.it -taranto.it -te.it -tempio-olbia.it -tempioolbia.it -teramo.it -terni.it -tn.it -to.it -torino.it -tp.it -tr.it -trani-andria-barletta.it -trani-barletta-andria.it -traniandriabarletta.it -tranibarlettaandria.it -trapani.it -trento.it -treviso.it -trieste.it -ts.it -turin.it -tv.it -ud.it -udine.it -urbino-pesaro.it -urbinopesaro.it -va.it -varese.it -vb.it -vc.it -ve.it -venezia.it -venice.it -verbania.it -vercelli.it -verona.it -vi.it -vibo-valentia.it -vibovalentia.it -vicenza.it -viterbo.it -vr.it -vs.it -vt.it -vv.it - -// je : http://www.channelisles.net/register-domains/ -// Confirmed by registry 2013-11-28 -je -co.je -net.je -org.je - -// jm : http://www.com.jm/register.html -*.jm - -// jo : http://www.dns.jo/Registration_policy.aspx -jo -com.jo -org.jo -net.jo -edu.jo -sch.jo -gov.jo -mil.jo -name.jo - -// jobs : https://en.wikipedia.org/wiki/.jobs -jobs - -// jp : https://en.wikipedia.org/wiki/.jp -// http://jprs.co.jp/en/jpdomain.html -// Submitted by registry -jp -// jp organizational type names -ac.jp -ad.jp -co.jp -ed.jp -go.jp -gr.jp -lg.jp -ne.jp -or.jp -// jp prefecture type names -aichi.jp -akita.jp -aomori.jp -chiba.jp -ehime.jp -fukui.jp -fukuoka.jp -fukushima.jp -gifu.jp -gunma.jp -hiroshima.jp -hokkaido.jp -hyogo.jp -ibaraki.jp -ishikawa.jp -iwate.jp -kagawa.jp -kagoshima.jp -kanagawa.jp -kochi.jp -kumamoto.jp -kyoto.jp -mie.jp -miyagi.jp -miyazaki.jp -nagano.jp -nagasaki.jp -nara.jp -niigata.jp -oita.jp -okayama.jp -okinawa.jp -osaka.jp -saga.jp -saitama.jp -shiga.jp -shimane.jp -shizuoka.jp -tochigi.jp -tokushima.jp -tokyo.jp -tottori.jp -toyama.jp -wakayama.jp -yamagata.jp -yamaguchi.jp -yamanashi.jp -栃木.jp -愛知.jp -愛媛.jp -兵庫.jp -熊本.jp -茨城.jp -北海道.jp -千葉.jp -和歌山.jp -長崎.jp -長野.jp -新潟.jp -青森.jp -静岡.jp -東京.jp -石川.jp -埼玉.jp -三重.jp -京都.jp -佐賀.jp -大分.jp -大阪.jp -奈良.jp -宮城.jp -宮崎.jp -富山.jp -山口.jp -山形.jp -山梨.jp -岩手.jp -岐阜.jp -岡山.jp -島根.jp -広島.jp -徳島.jp -沖縄.jp -滋賀.jp -神奈川.jp -福井.jp -福岡.jp -福島.jp -秋田.jp -群馬.jp -香川.jp -高知.jp -鳥取.jp -鹿児島.jp -// jp geographic type names -// http://jprs.jp/doc/rule/saisoku-1.html -*.kawasaki.jp -*.kitakyushu.jp -*.kobe.jp -*.nagoya.jp -*.sapporo.jp -*.sendai.jp -*.yokohama.jp -!city.kawasaki.jp -!city.kitakyushu.jp -!city.kobe.jp -!city.nagoya.jp -!city.sapporo.jp -!city.sendai.jp -!city.yokohama.jp -// 4th level registration -aisai.aichi.jp -ama.aichi.jp -anjo.aichi.jp -asuke.aichi.jp -chiryu.aichi.jp -chita.aichi.jp -fuso.aichi.jp -gamagori.aichi.jp -handa.aichi.jp -hazu.aichi.jp -hekinan.aichi.jp -higashiura.aichi.jp -ichinomiya.aichi.jp -inazawa.aichi.jp -inuyama.aichi.jp -isshiki.aichi.jp -iwakura.aichi.jp -kanie.aichi.jp -kariya.aichi.jp -kasugai.aichi.jp -kira.aichi.jp -kiyosu.aichi.jp -komaki.aichi.jp -konan.aichi.jp -kota.aichi.jp -mihama.aichi.jp -miyoshi.aichi.jp -nishio.aichi.jp -nisshin.aichi.jp -obu.aichi.jp -oguchi.aichi.jp -oharu.aichi.jp -okazaki.aichi.jp -owariasahi.aichi.jp -seto.aichi.jp -shikatsu.aichi.jp -shinshiro.aichi.jp -shitara.aichi.jp -tahara.aichi.jp -takahama.aichi.jp -tobishima.aichi.jp -toei.aichi.jp -togo.aichi.jp -tokai.aichi.jp -tokoname.aichi.jp -toyoake.aichi.jp -toyohashi.aichi.jp -toyokawa.aichi.jp -toyone.aichi.jp -toyota.aichi.jp -tsushima.aichi.jp -yatomi.aichi.jp -akita.akita.jp -daisen.akita.jp -fujisato.akita.jp -gojome.akita.jp -hachirogata.akita.jp -happou.akita.jp -higashinaruse.akita.jp -honjo.akita.jp -honjyo.akita.jp -ikawa.akita.jp -kamikoani.akita.jp -kamioka.akita.jp -katagami.akita.jp -kazuno.akita.jp -kitaakita.akita.jp -kosaka.akita.jp -kyowa.akita.jp -misato.akita.jp -mitane.akita.jp -moriyoshi.akita.jp -nikaho.akita.jp -noshiro.akita.jp -odate.akita.jp -oga.akita.jp -ogata.akita.jp -semboku.akita.jp -yokote.akita.jp -yurihonjo.akita.jp -aomori.aomori.jp -gonohe.aomori.jp -hachinohe.aomori.jp -hashikami.aomori.jp -hiranai.aomori.jp -hirosaki.aomori.jp -itayanagi.aomori.jp -kuroishi.aomori.jp -misawa.aomori.jp -mutsu.aomori.jp -nakadomari.aomori.jp -noheji.aomori.jp -oirase.aomori.jp -owani.aomori.jp -rokunohe.aomori.jp -sannohe.aomori.jp -shichinohe.aomori.jp -shingo.aomori.jp -takko.aomori.jp -towada.aomori.jp -tsugaru.aomori.jp -tsuruta.aomori.jp -abiko.chiba.jp -asahi.chiba.jp -chonan.chiba.jp -chosei.chiba.jp -choshi.chiba.jp -chuo.chiba.jp -funabashi.chiba.jp -futtsu.chiba.jp -hanamigawa.chiba.jp -ichihara.chiba.jp -ichikawa.chiba.jp -ichinomiya.chiba.jp -inzai.chiba.jp -isumi.chiba.jp -kamagaya.chiba.jp -kamogawa.chiba.jp -kashiwa.chiba.jp -katori.chiba.jp -katsuura.chiba.jp -kimitsu.chiba.jp -kisarazu.chiba.jp -kozaki.chiba.jp -kujukuri.chiba.jp -kyonan.chiba.jp -matsudo.chiba.jp -midori.chiba.jp -mihama.chiba.jp -minamiboso.chiba.jp -mobara.chiba.jp -mutsuzawa.chiba.jp -nagara.chiba.jp -nagareyama.chiba.jp -narashino.chiba.jp -narita.chiba.jp -noda.chiba.jp -oamishirasato.chiba.jp -omigawa.chiba.jp -onjuku.chiba.jp -otaki.chiba.jp -sakae.chiba.jp -sakura.chiba.jp -shimofusa.chiba.jp -shirako.chiba.jp -shiroi.chiba.jp -shisui.chiba.jp -sodegaura.chiba.jp -sosa.chiba.jp -tako.chiba.jp -tateyama.chiba.jp -togane.chiba.jp -tohnosho.chiba.jp -tomisato.chiba.jp -urayasu.chiba.jp -yachimata.chiba.jp -yachiyo.chiba.jp -yokaichiba.chiba.jp -yokoshibahikari.chiba.jp -yotsukaido.chiba.jp -ainan.ehime.jp -honai.ehime.jp -ikata.ehime.jp -imabari.ehime.jp -iyo.ehime.jp -kamijima.ehime.jp -kihoku.ehime.jp -kumakogen.ehime.jp -masaki.ehime.jp -matsuno.ehime.jp -matsuyama.ehime.jp -namikata.ehime.jp -niihama.ehime.jp -ozu.ehime.jp -saijo.ehime.jp -seiyo.ehime.jp -shikokuchuo.ehime.jp -tobe.ehime.jp -toon.ehime.jp -uchiko.ehime.jp -uwajima.ehime.jp -yawatahama.ehime.jp -echizen.fukui.jp -eiheiji.fukui.jp -fukui.fukui.jp -ikeda.fukui.jp -katsuyama.fukui.jp -mihama.fukui.jp -minamiechizen.fukui.jp -obama.fukui.jp -ohi.fukui.jp -ono.fukui.jp -sabae.fukui.jp -sakai.fukui.jp -takahama.fukui.jp -tsuruga.fukui.jp -wakasa.fukui.jp -ashiya.fukuoka.jp -buzen.fukuoka.jp -chikugo.fukuoka.jp -chikuho.fukuoka.jp -chikujo.fukuoka.jp -chikushino.fukuoka.jp -chikuzen.fukuoka.jp -chuo.fukuoka.jp -dazaifu.fukuoka.jp -fukuchi.fukuoka.jp -hakata.fukuoka.jp -higashi.fukuoka.jp -hirokawa.fukuoka.jp -hisayama.fukuoka.jp -iizuka.fukuoka.jp -inatsuki.fukuoka.jp -kaho.fukuoka.jp -kasuga.fukuoka.jp -kasuya.fukuoka.jp -kawara.fukuoka.jp -keisen.fukuoka.jp -koga.fukuoka.jp -kurate.fukuoka.jp -kurogi.fukuoka.jp -kurume.fukuoka.jp -minami.fukuoka.jp -miyako.fukuoka.jp -miyama.fukuoka.jp -miyawaka.fukuoka.jp -mizumaki.fukuoka.jp -munakata.fukuoka.jp -nakagawa.fukuoka.jp -nakama.fukuoka.jp -nishi.fukuoka.jp -nogata.fukuoka.jp -ogori.fukuoka.jp -okagaki.fukuoka.jp -okawa.fukuoka.jp -oki.fukuoka.jp -omuta.fukuoka.jp -onga.fukuoka.jp -onojo.fukuoka.jp -oto.fukuoka.jp -saigawa.fukuoka.jp -sasaguri.fukuoka.jp -shingu.fukuoka.jp -shinyoshitomi.fukuoka.jp -shonai.fukuoka.jp -soeda.fukuoka.jp -sue.fukuoka.jp -tachiarai.fukuoka.jp -tagawa.fukuoka.jp -takata.fukuoka.jp -toho.fukuoka.jp -toyotsu.fukuoka.jp -tsuiki.fukuoka.jp -ukiha.fukuoka.jp -umi.fukuoka.jp -usui.fukuoka.jp -yamada.fukuoka.jp -yame.fukuoka.jp -yanagawa.fukuoka.jp -yukuhashi.fukuoka.jp -aizubange.fukushima.jp -aizumisato.fukushima.jp -aizuwakamatsu.fukushima.jp -asakawa.fukushima.jp -bandai.fukushima.jp -date.fukushima.jp -fukushima.fukushima.jp -furudono.fukushima.jp -futaba.fukushima.jp -hanawa.fukushima.jp -higashi.fukushima.jp -hirata.fukushima.jp -hirono.fukushima.jp -iitate.fukushima.jp -inawashiro.fukushima.jp -ishikawa.fukushima.jp -iwaki.fukushima.jp -izumizaki.fukushima.jp -kagamiishi.fukushima.jp -kaneyama.fukushima.jp -kawamata.fukushima.jp -kitakata.fukushima.jp -kitashiobara.fukushima.jp -koori.fukushima.jp -koriyama.fukushima.jp -kunimi.fukushima.jp -miharu.fukushima.jp -mishima.fukushima.jp -namie.fukushima.jp -nango.fukushima.jp -nishiaizu.fukushima.jp -nishigo.fukushima.jp -okuma.fukushima.jp -omotego.fukushima.jp -ono.fukushima.jp -otama.fukushima.jp -samegawa.fukushima.jp -shimogo.fukushima.jp -shirakawa.fukushima.jp -showa.fukushima.jp -soma.fukushima.jp -sukagawa.fukushima.jp -taishin.fukushima.jp -tamakawa.fukushima.jp -tanagura.fukushima.jp -tenei.fukushima.jp -yabuki.fukushima.jp -yamato.fukushima.jp -yamatsuri.fukushima.jp -yanaizu.fukushima.jp -yugawa.fukushima.jp -anpachi.gifu.jp -ena.gifu.jp -gifu.gifu.jp -ginan.gifu.jp -godo.gifu.jp -gujo.gifu.jp -hashima.gifu.jp -hichiso.gifu.jp -hida.gifu.jp -higashishirakawa.gifu.jp -ibigawa.gifu.jp -ikeda.gifu.jp -kakamigahara.gifu.jp -kani.gifu.jp -kasahara.gifu.jp -kasamatsu.gifu.jp -kawaue.gifu.jp -kitagata.gifu.jp -mino.gifu.jp -minokamo.gifu.jp -mitake.gifu.jp -mizunami.gifu.jp -motosu.gifu.jp -nakatsugawa.gifu.jp -ogaki.gifu.jp -sakahogi.gifu.jp -seki.gifu.jp -sekigahara.gifu.jp -shirakawa.gifu.jp -tajimi.gifu.jp -takayama.gifu.jp -tarui.gifu.jp -toki.gifu.jp -tomika.gifu.jp -wanouchi.gifu.jp -yamagata.gifu.jp -yaotsu.gifu.jp -yoro.gifu.jp -annaka.gunma.jp -chiyoda.gunma.jp -fujioka.gunma.jp -higashiagatsuma.gunma.jp -isesaki.gunma.jp -itakura.gunma.jp -kanna.gunma.jp -kanra.gunma.jp -katashina.gunma.jp -kawaba.gunma.jp -kiryu.gunma.jp -kusatsu.gunma.jp -maebashi.gunma.jp -meiwa.gunma.jp -midori.gunma.jp -minakami.gunma.jp -naganohara.gunma.jp -nakanojo.gunma.jp -nanmoku.gunma.jp -numata.gunma.jp -oizumi.gunma.jp -ora.gunma.jp -ota.gunma.jp -shibukawa.gunma.jp -shimonita.gunma.jp -shinto.gunma.jp -showa.gunma.jp -takasaki.gunma.jp -takayama.gunma.jp -tamamura.gunma.jp -tatebayashi.gunma.jp -tomioka.gunma.jp -tsukiyono.gunma.jp -tsumagoi.gunma.jp -ueno.gunma.jp -yoshioka.gunma.jp -asaminami.hiroshima.jp -daiwa.hiroshima.jp -etajima.hiroshima.jp -fuchu.hiroshima.jp -fukuyama.hiroshima.jp -hatsukaichi.hiroshima.jp -higashihiroshima.hiroshima.jp -hongo.hiroshima.jp -jinsekikogen.hiroshima.jp -kaita.hiroshima.jp -kui.hiroshima.jp -kumano.hiroshima.jp -kure.hiroshima.jp -mihara.hiroshima.jp -miyoshi.hiroshima.jp -naka.hiroshima.jp -onomichi.hiroshima.jp -osakikamijima.hiroshima.jp -otake.hiroshima.jp -saka.hiroshima.jp -sera.hiroshima.jp -seranishi.hiroshima.jp -shinichi.hiroshima.jp -shobara.hiroshima.jp -takehara.hiroshima.jp -abashiri.hokkaido.jp -abira.hokkaido.jp -aibetsu.hokkaido.jp -akabira.hokkaido.jp -akkeshi.hokkaido.jp -asahikawa.hokkaido.jp -ashibetsu.hokkaido.jp -ashoro.hokkaido.jp -assabu.hokkaido.jp -atsuma.hokkaido.jp -bibai.hokkaido.jp -biei.hokkaido.jp -bifuka.hokkaido.jp -bihoro.hokkaido.jp -biratori.hokkaido.jp -chippubetsu.hokkaido.jp -chitose.hokkaido.jp -date.hokkaido.jp -ebetsu.hokkaido.jp -embetsu.hokkaido.jp -eniwa.hokkaido.jp -erimo.hokkaido.jp -esan.hokkaido.jp -esashi.hokkaido.jp -fukagawa.hokkaido.jp -fukushima.hokkaido.jp -furano.hokkaido.jp -furubira.hokkaido.jp -haboro.hokkaido.jp -hakodate.hokkaido.jp -hamatonbetsu.hokkaido.jp -hidaka.hokkaido.jp -higashikagura.hokkaido.jp -higashikawa.hokkaido.jp -hiroo.hokkaido.jp -hokuryu.hokkaido.jp -hokuto.hokkaido.jp -honbetsu.hokkaido.jp -horokanai.hokkaido.jp -horonobe.hokkaido.jp -ikeda.hokkaido.jp -imakane.hokkaido.jp -ishikari.hokkaido.jp -iwamizawa.hokkaido.jp -iwanai.hokkaido.jp -kamifurano.hokkaido.jp -kamikawa.hokkaido.jp -kamishihoro.hokkaido.jp -kamisunagawa.hokkaido.jp -kamoenai.hokkaido.jp -kayabe.hokkaido.jp -kembuchi.hokkaido.jp -kikonai.hokkaido.jp -kimobetsu.hokkaido.jp -kitahiroshima.hokkaido.jp -kitami.hokkaido.jp -kiyosato.hokkaido.jp -koshimizu.hokkaido.jp -kunneppu.hokkaido.jp -kuriyama.hokkaido.jp -kuromatsunai.hokkaido.jp -kushiro.hokkaido.jp -kutchan.hokkaido.jp -kyowa.hokkaido.jp -mashike.hokkaido.jp -matsumae.hokkaido.jp -mikasa.hokkaido.jp -minamifurano.hokkaido.jp -mombetsu.hokkaido.jp -moseushi.hokkaido.jp -mukawa.hokkaido.jp -muroran.hokkaido.jp -naie.hokkaido.jp -nakagawa.hokkaido.jp -nakasatsunai.hokkaido.jp -nakatombetsu.hokkaido.jp -nanae.hokkaido.jp -nanporo.hokkaido.jp -nayoro.hokkaido.jp -nemuro.hokkaido.jp -niikappu.hokkaido.jp -niki.hokkaido.jp -nishiokoppe.hokkaido.jp -noboribetsu.hokkaido.jp -numata.hokkaido.jp -obihiro.hokkaido.jp -obira.hokkaido.jp -oketo.hokkaido.jp -okoppe.hokkaido.jp -otaru.hokkaido.jp -otobe.hokkaido.jp -otofuke.hokkaido.jp -otoineppu.hokkaido.jp -oumu.hokkaido.jp -ozora.hokkaido.jp -pippu.hokkaido.jp -rankoshi.hokkaido.jp -rebun.hokkaido.jp -rikubetsu.hokkaido.jp -rishiri.hokkaido.jp -rishirifuji.hokkaido.jp -saroma.hokkaido.jp -sarufutsu.hokkaido.jp -shakotan.hokkaido.jp -shari.hokkaido.jp -shibecha.hokkaido.jp -shibetsu.hokkaido.jp -shikabe.hokkaido.jp -shikaoi.hokkaido.jp -shimamaki.hokkaido.jp -shimizu.hokkaido.jp -shimokawa.hokkaido.jp -shinshinotsu.hokkaido.jp -shintoku.hokkaido.jp -shiranuka.hokkaido.jp -shiraoi.hokkaido.jp -shiriuchi.hokkaido.jp -sobetsu.hokkaido.jp -sunagawa.hokkaido.jp -taiki.hokkaido.jp -takasu.hokkaido.jp -takikawa.hokkaido.jp -takinoue.hokkaido.jp -teshikaga.hokkaido.jp -tobetsu.hokkaido.jp -tohma.hokkaido.jp -tomakomai.hokkaido.jp -tomari.hokkaido.jp -toya.hokkaido.jp -toyako.hokkaido.jp -toyotomi.hokkaido.jp -toyoura.hokkaido.jp -tsubetsu.hokkaido.jp -tsukigata.hokkaido.jp -urakawa.hokkaido.jp -urausu.hokkaido.jp -uryu.hokkaido.jp -utashinai.hokkaido.jp -wakkanai.hokkaido.jp -wassamu.hokkaido.jp -yakumo.hokkaido.jp -yoichi.hokkaido.jp -aioi.hyogo.jp -akashi.hyogo.jp -ako.hyogo.jp -amagasaki.hyogo.jp -aogaki.hyogo.jp -asago.hyogo.jp -ashiya.hyogo.jp -awaji.hyogo.jp -fukusaki.hyogo.jp -goshiki.hyogo.jp -harima.hyogo.jp -himeji.hyogo.jp -ichikawa.hyogo.jp -inagawa.hyogo.jp -itami.hyogo.jp -kakogawa.hyogo.jp -kamigori.hyogo.jp -kamikawa.hyogo.jp -kasai.hyogo.jp -kasuga.hyogo.jp -kawanishi.hyogo.jp -miki.hyogo.jp -minamiawaji.hyogo.jp -nishinomiya.hyogo.jp -nishiwaki.hyogo.jp -ono.hyogo.jp -sanda.hyogo.jp -sannan.hyogo.jp -sasayama.hyogo.jp -sayo.hyogo.jp -shingu.hyogo.jp -shinonsen.hyogo.jp -shiso.hyogo.jp -sumoto.hyogo.jp -taishi.hyogo.jp -taka.hyogo.jp -takarazuka.hyogo.jp -takasago.hyogo.jp -takino.hyogo.jp -tamba.hyogo.jp -tatsuno.hyogo.jp -toyooka.hyogo.jp -yabu.hyogo.jp -yashiro.hyogo.jp -yoka.hyogo.jp -yokawa.hyogo.jp -ami.ibaraki.jp -asahi.ibaraki.jp -bando.ibaraki.jp -chikusei.ibaraki.jp -daigo.ibaraki.jp -fujishiro.ibaraki.jp -hitachi.ibaraki.jp -hitachinaka.ibaraki.jp -hitachiomiya.ibaraki.jp -hitachiota.ibaraki.jp -ibaraki.ibaraki.jp -ina.ibaraki.jp -inashiki.ibaraki.jp -itako.ibaraki.jp -iwama.ibaraki.jp -joso.ibaraki.jp -kamisu.ibaraki.jp -kasama.ibaraki.jp -kashima.ibaraki.jp -kasumigaura.ibaraki.jp -koga.ibaraki.jp -miho.ibaraki.jp -mito.ibaraki.jp -moriya.ibaraki.jp -naka.ibaraki.jp -namegata.ibaraki.jp -oarai.ibaraki.jp -ogawa.ibaraki.jp -omitama.ibaraki.jp -ryugasaki.ibaraki.jp -sakai.ibaraki.jp -sakuragawa.ibaraki.jp -shimodate.ibaraki.jp -shimotsuma.ibaraki.jp -shirosato.ibaraki.jp -sowa.ibaraki.jp -suifu.ibaraki.jp -takahagi.ibaraki.jp -tamatsukuri.ibaraki.jp -tokai.ibaraki.jp -tomobe.ibaraki.jp -tone.ibaraki.jp -toride.ibaraki.jp -tsuchiura.ibaraki.jp -tsukuba.ibaraki.jp -uchihara.ibaraki.jp -ushiku.ibaraki.jp -yachiyo.ibaraki.jp -yamagata.ibaraki.jp -yawara.ibaraki.jp -yuki.ibaraki.jp -anamizu.ishikawa.jp -hakui.ishikawa.jp -hakusan.ishikawa.jp -kaga.ishikawa.jp -kahoku.ishikawa.jp -kanazawa.ishikawa.jp -kawakita.ishikawa.jp -komatsu.ishikawa.jp -nakanoto.ishikawa.jp -nanao.ishikawa.jp -nomi.ishikawa.jp -nonoichi.ishikawa.jp -noto.ishikawa.jp -shika.ishikawa.jp -suzu.ishikawa.jp -tsubata.ishikawa.jp -tsurugi.ishikawa.jp -uchinada.ishikawa.jp -wajima.ishikawa.jp -fudai.iwate.jp -fujisawa.iwate.jp -hanamaki.iwate.jp -hiraizumi.iwate.jp -hirono.iwate.jp -ichinohe.iwate.jp -ichinoseki.iwate.jp -iwaizumi.iwate.jp -iwate.iwate.jp -joboji.iwate.jp -kamaishi.iwate.jp -kanegasaki.iwate.jp -karumai.iwate.jp -kawai.iwate.jp -kitakami.iwate.jp -kuji.iwate.jp -kunohe.iwate.jp -kuzumaki.iwate.jp -miyako.iwate.jp -mizusawa.iwate.jp -morioka.iwate.jp -ninohe.iwate.jp -noda.iwate.jp -ofunato.iwate.jp -oshu.iwate.jp -otsuchi.iwate.jp -rikuzentakata.iwate.jp -shiwa.iwate.jp -shizukuishi.iwate.jp -sumita.iwate.jp -tanohata.iwate.jp -tono.iwate.jp -yahaba.iwate.jp -yamada.iwate.jp -ayagawa.kagawa.jp -higashikagawa.kagawa.jp -kanonji.kagawa.jp -kotohira.kagawa.jp -manno.kagawa.jp -marugame.kagawa.jp -mitoyo.kagawa.jp -naoshima.kagawa.jp -sanuki.kagawa.jp -tadotsu.kagawa.jp -takamatsu.kagawa.jp -tonosho.kagawa.jp -uchinomi.kagawa.jp -utazu.kagawa.jp -zentsuji.kagawa.jp -akune.kagoshima.jp -amami.kagoshima.jp -hioki.kagoshima.jp -isa.kagoshima.jp -isen.kagoshima.jp -izumi.kagoshima.jp -kagoshima.kagoshima.jp -kanoya.kagoshima.jp -kawanabe.kagoshima.jp -kinko.kagoshima.jp -kouyama.kagoshima.jp -makurazaki.kagoshima.jp -matsumoto.kagoshima.jp -minamitane.kagoshima.jp -nakatane.kagoshima.jp -nishinoomote.kagoshima.jp -satsumasendai.kagoshima.jp -soo.kagoshima.jp -tarumizu.kagoshima.jp -yusui.kagoshima.jp -aikawa.kanagawa.jp -atsugi.kanagawa.jp -ayase.kanagawa.jp -chigasaki.kanagawa.jp -ebina.kanagawa.jp -fujisawa.kanagawa.jp -hadano.kanagawa.jp -hakone.kanagawa.jp -hiratsuka.kanagawa.jp -isehara.kanagawa.jp -kaisei.kanagawa.jp -kamakura.kanagawa.jp -kiyokawa.kanagawa.jp -matsuda.kanagawa.jp -minamiashigara.kanagawa.jp -miura.kanagawa.jp -nakai.kanagawa.jp -ninomiya.kanagawa.jp -odawara.kanagawa.jp -oi.kanagawa.jp -oiso.kanagawa.jp -sagamihara.kanagawa.jp -samukawa.kanagawa.jp -tsukui.kanagawa.jp -yamakita.kanagawa.jp -yamato.kanagawa.jp -yokosuka.kanagawa.jp -yugawara.kanagawa.jp -zama.kanagawa.jp -zushi.kanagawa.jp -aki.kochi.jp -geisei.kochi.jp -hidaka.kochi.jp -higashitsuno.kochi.jp -ino.kochi.jp -kagami.kochi.jp -kami.kochi.jp -kitagawa.kochi.jp -kochi.kochi.jp -mihara.kochi.jp -motoyama.kochi.jp -muroto.kochi.jp -nahari.kochi.jp -nakamura.kochi.jp -nankoku.kochi.jp -nishitosa.kochi.jp -niyodogawa.kochi.jp -ochi.kochi.jp -okawa.kochi.jp -otoyo.kochi.jp -otsuki.kochi.jp -sakawa.kochi.jp -sukumo.kochi.jp -susaki.kochi.jp -tosa.kochi.jp -tosashimizu.kochi.jp -toyo.kochi.jp -tsuno.kochi.jp -umaji.kochi.jp -yasuda.kochi.jp -yusuhara.kochi.jp -amakusa.kumamoto.jp -arao.kumamoto.jp -aso.kumamoto.jp -choyo.kumamoto.jp -gyokuto.kumamoto.jp -kamiamakusa.kumamoto.jp -kikuchi.kumamoto.jp -kumamoto.kumamoto.jp -mashiki.kumamoto.jp -mifune.kumamoto.jp -minamata.kumamoto.jp -minamioguni.kumamoto.jp -nagasu.kumamoto.jp -nishihara.kumamoto.jp -oguni.kumamoto.jp -ozu.kumamoto.jp -sumoto.kumamoto.jp -takamori.kumamoto.jp -uki.kumamoto.jp -uto.kumamoto.jp -yamaga.kumamoto.jp -yamato.kumamoto.jp -yatsushiro.kumamoto.jp -ayabe.kyoto.jp -fukuchiyama.kyoto.jp -higashiyama.kyoto.jp -ide.kyoto.jp -ine.kyoto.jp -joyo.kyoto.jp -kameoka.kyoto.jp -kamo.kyoto.jp -kita.kyoto.jp -kizu.kyoto.jp -kumiyama.kyoto.jp -kyotamba.kyoto.jp -kyotanabe.kyoto.jp -kyotango.kyoto.jp -maizuru.kyoto.jp -minami.kyoto.jp -minamiyamashiro.kyoto.jp -miyazu.kyoto.jp -muko.kyoto.jp -nagaokakyo.kyoto.jp -nakagyo.kyoto.jp -nantan.kyoto.jp -oyamazaki.kyoto.jp -sakyo.kyoto.jp -seika.kyoto.jp -tanabe.kyoto.jp -uji.kyoto.jp -ujitawara.kyoto.jp -wazuka.kyoto.jp -yamashina.kyoto.jp -yawata.kyoto.jp -asahi.mie.jp -inabe.mie.jp -ise.mie.jp -kameyama.mie.jp -kawagoe.mie.jp -kiho.mie.jp -kisosaki.mie.jp -kiwa.mie.jp -komono.mie.jp -kumano.mie.jp -kuwana.mie.jp -matsusaka.mie.jp -meiwa.mie.jp -mihama.mie.jp -minamiise.mie.jp -misugi.mie.jp -miyama.mie.jp -nabari.mie.jp -shima.mie.jp -suzuka.mie.jp -tado.mie.jp -taiki.mie.jp -taki.mie.jp -tamaki.mie.jp -toba.mie.jp -tsu.mie.jp -udono.mie.jp -ureshino.mie.jp -watarai.mie.jp -yokkaichi.mie.jp -furukawa.miyagi.jp -higashimatsushima.miyagi.jp -ishinomaki.miyagi.jp -iwanuma.miyagi.jp -kakuda.miyagi.jp -kami.miyagi.jp -kawasaki.miyagi.jp -marumori.miyagi.jp -matsushima.miyagi.jp -minamisanriku.miyagi.jp -misato.miyagi.jp -murata.miyagi.jp -natori.miyagi.jp -ogawara.miyagi.jp -ohira.miyagi.jp -onagawa.miyagi.jp -osaki.miyagi.jp -rifu.miyagi.jp -semine.miyagi.jp -shibata.miyagi.jp -shichikashuku.miyagi.jp -shikama.miyagi.jp -shiogama.miyagi.jp -shiroishi.miyagi.jp -tagajo.miyagi.jp -taiwa.miyagi.jp -tome.miyagi.jp -tomiya.miyagi.jp -wakuya.miyagi.jp -watari.miyagi.jp -yamamoto.miyagi.jp -zao.miyagi.jp -aya.miyazaki.jp -ebino.miyazaki.jp -gokase.miyazaki.jp -hyuga.miyazaki.jp -kadogawa.miyazaki.jp -kawaminami.miyazaki.jp -kijo.miyazaki.jp -kitagawa.miyazaki.jp -kitakata.miyazaki.jp -kitaura.miyazaki.jp -kobayashi.miyazaki.jp -kunitomi.miyazaki.jp -kushima.miyazaki.jp -mimata.miyazaki.jp -miyakonojo.miyazaki.jp -miyazaki.miyazaki.jp -morotsuka.miyazaki.jp -nichinan.miyazaki.jp -nishimera.miyazaki.jp -nobeoka.miyazaki.jp -saito.miyazaki.jp -shiiba.miyazaki.jp -shintomi.miyazaki.jp -takaharu.miyazaki.jp -takanabe.miyazaki.jp -takazaki.miyazaki.jp -tsuno.miyazaki.jp -achi.nagano.jp -agematsu.nagano.jp -anan.nagano.jp -aoki.nagano.jp -asahi.nagano.jp -azumino.nagano.jp -chikuhoku.nagano.jp -chikuma.nagano.jp -chino.nagano.jp -fujimi.nagano.jp -hakuba.nagano.jp -hara.nagano.jp -hiraya.nagano.jp -iida.nagano.jp -iijima.nagano.jp -iiyama.nagano.jp -iizuna.nagano.jp -ikeda.nagano.jp -ikusaka.nagano.jp -ina.nagano.jp -karuizawa.nagano.jp -kawakami.nagano.jp -kiso.nagano.jp -kisofukushima.nagano.jp -kitaaiki.nagano.jp -komagane.nagano.jp -komoro.nagano.jp -matsukawa.nagano.jp -matsumoto.nagano.jp -miasa.nagano.jp -minamiaiki.nagano.jp -minamimaki.nagano.jp -minamiminowa.nagano.jp -minowa.nagano.jp -miyada.nagano.jp -miyota.nagano.jp -mochizuki.nagano.jp -nagano.nagano.jp -nagawa.nagano.jp -nagiso.nagano.jp -nakagawa.nagano.jp -nakano.nagano.jp -nozawaonsen.nagano.jp -obuse.nagano.jp -ogawa.nagano.jp -okaya.nagano.jp -omachi.nagano.jp -omi.nagano.jp -ookuwa.nagano.jp -ooshika.nagano.jp -otaki.nagano.jp -otari.nagano.jp -sakae.nagano.jp -sakaki.nagano.jp -saku.nagano.jp -sakuho.nagano.jp -shimosuwa.nagano.jp -shinanomachi.nagano.jp -shiojiri.nagano.jp -suwa.nagano.jp -suzaka.nagano.jp -takagi.nagano.jp -takamori.nagano.jp -takayama.nagano.jp -tateshina.nagano.jp -tatsuno.nagano.jp -togakushi.nagano.jp -togura.nagano.jp -tomi.nagano.jp -ueda.nagano.jp -wada.nagano.jp -yamagata.nagano.jp -yamanouchi.nagano.jp -yasaka.nagano.jp -yasuoka.nagano.jp -chijiwa.nagasaki.jp -futsu.nagasaki.jp -goto.nagasaki.jp -hasami.nagasaki.jp -hirado.nagasaki.jp -iki.nagasaki.jp -isahaya.nagasaki.jp -kawatana.nagasaki.jp -kuchinotsu.nagasaki.jp -matsuura.nagasaki.jp -nagasaki.nagasaki.jp -obama.nagasaki.jp -omura.nagasaki.jp -oseto.nagasaki.jp -saikai.nagasaki.jp -sasebo.nagasaki.jp -seihi.nagasaki.jp -shimabara.nagasaki.jp -shinkamigoto.nagasaki.jp -togitsu.nagasaki.jp -tsushima.nagasaki.jp -unzen.nagasaki.jp -ando.nara.jp -gose.nara.jp -heguri.nara.jp -higashiyoshino.nara.jp -ikaruga.nara.jp -ikoma.nara.jp -kamikitayama.nara.jp -kanmaki.nara.jp -kashiba.nara.jp -kashihara.nara.jp -katsuragi.nara.jp -kawai.nara.jp -kawakami.nara.jp -kawanishi.nara.jp -koryo.nara.jp -kurotaki.nara.jp -mitsue.nara.jp -miyake.nara.jp -nara.nara.jp -nosegawa.nara.jp -oji.nara.jp -ouda.nara.jp -oyodo.nara.jp -sakurai.nara.jp -sango.nara.jp -shimoichi.nara.jp -shimokitayama.nara.jp -shinjo.nara.jp -soni.nara.jp -takatori.nara.jp -tawaramoto.nara.jp -tenkawa.nara.jp -tenri.nara.jp -uda.nara.jp -yamatokoriyama.nara.jp -yamatotakada.nara.jp -yamazoe.nara.jp -yoshino.nara.jp -aga.niigata.jp -agano.niigata.jp -gosen.niigata.jp -itoigawa.niigata.jp -izumozaki.niigata.jp -joetsu.niigata.jp -kamo.niigata.jp -kariwa.niigata.jp -kashiwazaki.niigata.jp -minamiuonuma.niigata.jp -mitsuke.niigata.jp -muika.niigata.jp -murakami.niigata.jp -myoko.niigata.jp -nagaoka.niigata.jp -niigata.niigata.jp -ojiya.niigata.jp -omi.niigata.jp -sado.niigata.jp -sanjo.niigata.jp -seiro.niigata.jp -seirou.niigata.jp -sekikawa.niigata.jp -shibata.niigata.jp -tagami.niigata.jp -tainai.niigata.jp -tochio.niigata.jp -tokamachi.niigata.jp -tsubame.niigata.jp -tsunan.niigata.jp -uonuma.niigata.jp -yahiko.niigata.jp -yoita.niigata.jp -yuzawa.niigata.jp -beppu.oita.jp -bungoono.oita.jp -bungotakada.oita.jp -hasama.oita.jp -hiji.oita.jp -himeshima.oita.jp -hita.oita.jp -kamitsue.oita.jp -kokonoe.oita.jp -kuju.oita.jp -kunisaki.oita.jp -kusu.oita.jp -oita.oita.jp -saiki.oita.jp -taketa.oita.jp -tsukumi.oita.jp -usa.oita.jp -usuki.oita.jp -yufu.oita.jp -akaiwa.okayama.jp -asakuchi.okayama.jp -bizen.okayama.jp -hayashima.okayama.jp -ibara.okayama.jp -kagamino.okayama.jp -kasaoka.okayama.jp -kibichuo.okayama.jp -kumenan.okayama.jp -kurashiki.okayama.jp -maniwa.okayama.jp -misaki.okayama.jp -nagi.okayama.jp -niimi.okayama.jp -nishiawakura.okayama.jp -okayama.okayama.jp -satosho.okayama.jp -setouchi.okayama.jp -shinjo.okayama.jp -shoo.okayama.jp -soja.okayama.jp -takahashi.okayama.jp -tamano.okayama.jp -tsuyama.okayama.jp -wake.okayama.jp -yakage.okayama.jp -aguni.okinawa.jp -ginowan.okinawa.jp -ginoza.okinawa.jp -gushikami.okinawa.jp -haebaru.okinawa.jp -higashi.okinawa.jp -hirara.okinawa.jp -iheya.okinawa.jp -ishigaki.okinawa.jp -ishikawa.okinawa.jp -itoman.okinawa.jp -izena.okinawa.jp -kadena.okinawa.jp -kin.okinawa.jp -kitadaito.okinawa.jp -kitanakagusuku.okinawa.jp -kumejima.okinawa.jp -kunigami.okinawa.jp -minamidaito.okinawa.jp -motobu.okinawa.jp -nago.okinawa.jp -naha.okinawa.jp -nakagusuku.okinawa.jp -nakijin.okinawa.jp -nanjo.okinawa.jp -nishihara.okinawa.jp -ogimi.okinawa.jp -okinawa.okinawa.jp -onna.okinawa.jp -shimoji.okinawa.jp -taketomi.okinawa.jp -tarama.okinawa.jp -tokashiki.okinawa.jp -tomigusuku.okinawa.jp -tonaki.okinawa.jp -urasoe.okinawa.jp -uruma.okinawa.jp -yaese.okinawa.jp -yomitan.okinawa.jp -yonabaru.okinawa.jp -yonaguni.okinawa.jp -zamami.okinawa.jp -abeno.osaka.jp -chihayaakasaka.osaka.jp -chuo.osaka.jp -daito.osaka.jp -fujiidera.osaka.jp -habikino.osaka.jp -hannan.osaka.jp -higashiosaka.osaka.jp -higashisumiyoshi.osaka.jp -higashiyodogawa.osaka.jp -hirakata.osaka.jp -ibaraki.osaka.jp -ikeda.osaka.jp -izumi.osaka.jp -izumiotsu.osaka.jp -izumisano.osaka.jp -kadoma.osaka.jp -kaizuka.osaka.jp -kanan.osaka.jp -kashiwara.osaka.jp -katano.osaka.jp -kawachinagano.osaka.jp -kishiwada.osaka.jp -kita.osaka.jp -kumatori.osaka.jp -matsubara.osaka.jp -minato.osaka.jp -minoh.osaka.jp -misaki.osaka.jp -moriguchi.osaka.jp -neyagawa.osaka.jp -nishi.osaka.jp -nose.osaka.jp -osakasayama.osaka.jp -sakai.osaka.jp -sayama.osaka.jp -sennan.osaka.jp -settsu.osaka.jp -shijonawate.osaka.jp -shimamoto.osaka.jp -suita.osaka.jp -tadaoka.osaka.jp -taishi.osaka.jp -tajiri.osaka.jp -takaishi.osaka.jp -takatsuki.osaka.jp -tondabayashi.osaka.jp -toyonaka.osaka.jp -toyono.osaka.jp -yao.osaka.jp -ariake.saga.jp -arita.saga.jp -fukudomi.saga.jp -genkai.saga.jp -hamatama.saga.jp -hizen.saga.jp -imari.saga.jp -kamimine.saga.jp -kanzaki.saga.jp -karatsu.saga.jp -kashima.saga.jp -kitagata.saga.jp -kitahata.saga.jp -kiyama.saga.jp -kouhoku.saga.jp -kyuragi.saga.jp -nishiarita.saga.jp -ogi.saga.jp -omachi.saga.jp -ouchi.saga.jp -saga.saga.jp -shiroishi.saga.jp -taku.saga.jp -tara.saga.jp -tosu.saga.jp -yoshinogari.saga.jp -arakawa.saitama.jp -asaka.saitama.jp -chichibu.saitama.jp -fujimi.saitama.jp -fujimino.saitama.jp -fukaya.saitama.jp -hanno.saitama.jp -hanyu.saitama.jp -hasuda.saitama.jp -hatogaya.saitama.jp -hatoyama.saitama.jp -hidaka.saitama.jp -higashichichibu.saitama.jp -higashimatsuyama.saitama.jp -honjo.saitama.jp -ina.saitama.jp -iruma.saitama.jp -iwatsuki.saitama.jp -kamiizumi.saitama.jp -kamikawa.saitama.jp -kamisato.saitama.jp -kasukabe.saitama.jp -kawagoe.saitama.jp -kawaguchi.saitama.jp -kawajima.saitama.jp -kazo.saitama.jp -kitamoto.saitama.jp -koshigaya.saitama.jp -kounosu.saitama.jp -kuki.saitama.jp -kumagaya.saitama.jp -matsubushi.saitama.jp -minano.saitama.jp -misato.saitama.jp -miyashiro.saitama.jp -miyoshi.saitama.jp -moroyama.saitama.jp -nagatoro.saitama.jp -namegawa.saitama.jp -niiza.saitama.jp -ogano.saitama.jp -ogawa.saitama.jp -ogose.saitama.jp -okegawa.saitama.jp -omiya.saitama.jp -otaki.saitama.jp -ranzan.saitama.jp -ryokami.saitama.jp -saitama.saitama.jp -sakado.saitama.jp -satte.saitama.jp -sayama.saitama.jp -shiki.saitama.jp -shiraoka.saitama.jp -soka.saitama.jp -sugito.saitama.jp -toda.saitama.jp -tokigawa.saitama.jp -tokorozawa.saitama.jp -tsurugashima.saitama.jp -urawa.saitama.jp -warabi.saitama.jp -yashio.saitama.jp -yokoze.saitama.jp -yono.saitama.jp -yorii.saitama.jp -yoshida.saitama.jp -yoshikawa.saitama.jp -yoshimi.saitama.jp -aisho.shiga.jp -gamo.shiga.jp -higashiomi.shiga.jp -hikone.shiga.jp -koka.shiga.jp -konan.shiga.jp -kosei.shiga.jp -koto.shiga.jp -kusatsu.shiga.jp -maibara.shiga.jp -moriyama.shiga.jp -nagahama.shiga.jp -nishiazai.shiga.jp -notogawa.shiga.jp -omihachiman.shiga.jp -otsu.shiga.jp -ritto.shiga.jp -ryuoh.shiga.jp -takashima.shiga.jp -takatsuki.shiga.jp -torahime.shiga.jp -toyosato.shiga.jp -yasu.shiga.jp -akagi.shimane.jp -ama.shimane.jp -gotsu.shimane.jp -hamada.shimane.jp -higashiizumo.shimane.jp -hikawa.shimane.jp -hikimi.shimane.jp -izumo.shimane.jp -kakinoki.shimane.jp -masuda.shimane.jp -matsue.shimane.jp -misato.shimane.jp -nishinoshima.shimane.jp -ohda.shimane.jp -okinoshima.shimane.jp -okuizumo.shimane.jp -shimane.shimane.jp -tamayu.shimane.jp -tsuwano.shimane.jp -unnan.shimane.jp -yakumo.shimane.jp -yasugi.shimane.jp -yatsuka.shimane.jp -arai.shizuoka.jp -atami.shizuoka.jp -fuji.shizuoka.jp -fujieda.shizuoka.jp -fujikawa.shizuoka.jp -fujinomiya.shizuoka.jp -fukuroi.shizuoka.jp -gotemba.shizuoka.jp -haibara.shizuoka.jp -hamamatsu.shizuoka.jp -higashiizu.shizuoka.jp -ito.shizuoka.jp -iwata.shizuoka.jp -izu.shizuoka.jp -izunokuni.shizuoka.jp -kakegawa.shizuoka.jp -kannami.shizuoka.jp -kawanehon.shizuoka.jp -kawazu.shizuoka.jp -kikugawa.shizuoka.jp -kosai.shizuoka.jp -makinohara.shizuoka.jp -matsuzaki.shizuoka.jp -minamiizu.shizuoka.jp -mishima.shizuoka.jp -morimachi.shizuoka.jp -nishiizu.shizuoka.jp -numazu.shizuoka.jp -omaezaki.shizuoka.jp -shimada.shizuoka.jp -shimizu.shizuoka.jp -shimoda.shizuoka.jp -shizuoka.shizuoka.jp -susono.shizuoka.jp -yaizu.shizuoka.jp -yoshida.shizuoka.jp -ashikaga.tochigi.jp -bato.tochigi.jp -haga.tochigi.jp -ichikai.tochigi.jp -iwafune.tochigi.jp -kaminokawa.tochigi.jp -kanuma.tochigi.jp -karasuyama.tochigi.jp -kuroiso.tochigi.jp -mashiko.tochigi.jp -mibu.tochigi.jp -moka.tochigi.jp -motegi.tochigi.jp -nasu.tochigi.jp -nasushiobara.tochigi.jp -nikko.tochigi.jp -nishikata.tochigi.jp -nogi.tochigi.jp -ohira.tochigi.jp -ohtawara.tochigi.jp -oyama.tochigi.jp -sakura.tochigi.jp -sano.tochigi.jp -shimotsuke.tochigi.jp -shioya.tochigi.jp -takanezawa.tochigi.jp -tochigi.tochigi.jp -tsuga.tochigi.jp -ujiie.tochigi.jp -utsunomiya.tochigi.jp -yaita.tochigi.jp -aizumi.tokushima.jp -anan.tokushima.jp -ichiba.tokushima.jp -itano.tokushima.jp -kainan.tokushima.jp -komatsushima.tokushima.jp -matsushige.tokushima.jp -mima.tokushima.jp -minami.tokushima.jp -miyoshi.tokushima.jp -mugi.tokushima.jp -nakagawa.tokushima.jp -naruto.tokushima.jp -sanagochi.tokushima.jp -shishikui.tokushima.jp -tokushima.tokushima.jp -wajiki.tokushima.jp -adachi.tokyo.jp -akiruno.tokyo.jp -akishima.tokyo.jp -aogashima.tokyo.jp -arakawa.tokyo.jp -bunkyo.tokyo.jp -chiyoda.tokyo.jp -chofu.tokyo.jp -chuo.tokyo.jp -edogawa.tokyo.jp -fuchu.tokyo.jp -fussa.tokyo.jp -hachijo.tokyo.jp -hachioji.tokyo.jp -hamura.tokyo.jp -higashikurume.tokyo.jp -higashimurayama.tokyo.jp -higashiyamato.tokyo.jp -hino.tokyo.jp -hinode.tokyo.jp -hinohara.tokyo.jp -inagi.tokyo.jp -itabashi.tokyo.jp -katsushika.tokyo.jp -kita.tokyo.jp -kiyose.tokyo.jp -kodaira.tokyo.jp -koganei.tokyo.jp -kokubunji.tokyo.jp -komae.tokyo.jp -koto.tokyo.jp -kouzushima.tokyo.jp -kunitachi.tokyo.jp -machida.tokyo.jp -meguro.tokyo.jp -minato.tokyo.jp -mitaka.tokyo.jp -mizuho.tokyo.jp -musashimurayama.tokyo.jp -musashino.tokyo.jp -nakano.tokyo.jp -nerima.tokyo.jp -ogasawara.tokyo.jp -okutama.tokyo.jp -ome.tokyo.jp -oshima.tokyo.jp -ota.tokyo.jp -setagaya.tokyo.jp -shibuya.tokyo.jp -shinagawa.tokyo.jp -shinjuku.tokyo.jp -suginami.tokyo.jp -sumida.tokyo.jp -tachikawa.tokyo.jp -taito.tokyo.jp -tama.tokyo.jp -toshima.tokyo.jp -chizu.tottori.jp -hino.tottori.jp -kawahara.tottori.jp -koge.tottori.jp -kotoura.tottori.jp -misasa.tottori.jp -nanbu.tottori.jp -nichinan.tottori.jp -sakaiminato.tottori.jp -tottori.tottori.jp -wakasa.tottori.jp -yazu.tottori.jp -yonago.tottori.jp -asahi.toyama.jp -fuchu.toyama.jp -fukumitsu.toyama.jp -funahashi.toyama.jp -himi.toyama.jp -imizu.toyama.jp -inami.toyama.jp -johana.toyama.jp -kamiichi.toyama.jp -kurobe.toyama.jp -nakaniikawa.toyama.jp -namerikawa.toyama.jp -nanto.toyama.jp -nyuzen.toyama.jp -oyabe.toyama.jp -taira.toyama.jp -takaoka.toyama.jp -tateyama.toyama.jp -toga.toyama.jp -tonami.toyama.jp -toyama.toyama.jp -unazuki.toyama.jp -uozu.toyama.jp -yamada.toyama.jp -arida.wakayama.jp -aridagawa.wakayama.jp -gobo.wakayama.jp -hashimoto.wakayama.jp -hidaka.wakayama.jp -hirogawa.wakayama.jp -inami.wakayama.jp -iwade.wakayama.jp -kainan.wakayama.jp -kamitonda.wakayama.jp -katsuragi.wakayama.jp -kimino.wakayama.jp -kinokawa.wakayama.jp -kitayama.wakayama.jp -koya.wakayama.jp -koza.wakayama.jp -kozagawa.wakayama.jp -kudoyama.wakayama.jp -kushimoto.wakayama.jp -mihama.wakayama.jp -misato.wakayama.jp -nachikatsuura.wakayama.jp -shingu.wakayama.jp -shirahama.wakayama.jp -taiji.wakayama.jp -tanabe.wakayama.jp -wakayama.wakayama.jp -yuasa.wakayama.jp -yura.wakayama.jp -asahi.yamagata.jp -funagata.yamagata.jp -higashine.yamagata.jp -iide.yamagata.jp -kahoku.yamagata.jp -kaminoyama.yamagata.jp -kaneyama.yamagata.jp -kawanishi.yamagata.jp -mamurogawa.yamagata.jp -mikawa.yamagata.jp -murayama.yamagata.jp -nagai.yamagata.jp -nakayama.yamagata.jp -nanyo.yamagata.jp -nishikawa.yamagata.jp -obanazawa.yamagata.jp -oe.yamagata.jp -oguni.yamagata.jp -ohkura.yamagata.jp -oishida.yamagata.jp -sagae.yamagata.jp -sakata.yamagata.jp -sakegawa.yamagata.jp -shinjo.yamagata.jp -shirataka.yamagata.jp -shonai.yamagata.jp -takahata.yamagata.jp -tendo.yamagata.jp -tozawa.yamagata.jp -tsuruoka.yamagata.jp -yamagata.yamagata.jp -yamanobe.yamagata.jp -yonezawa.yamagata.jp -yuza.yamagata.jp -abu.yamaguchi.jp -hagi.yamaguchi.jp -hikari.yamaguchi.jp -hofu.yamaguchi.jp -iwakuni.yamaguchi.jp -kudamatsu.yamaguchi.jp -mitou.yamaguchi.jp -nagato.yamaguchi.jp -oshima.yamaguchi.jp -shimonoseki.yamaguchi.jp -shunan.yamaguchi.jp -tabuse.yamaguchi.jp -tokuyama.yamaguchi.jp -toyota.yamaguchi.jp -ube.yamaguchi.jp -yuu.yamaguchi.jp -chuo.yamanashi.jp -doshi.yamanashi.jp -fuefuki.yamanashi.jp -fujikawa.yamanashi.jp -fujikawaguchiko.yamanashi.jp -fujiyoshida.yamanashi.jp -hayakawa.yamanashi.jp -hokuto.yamanashi.jp -ichikawamisato.yamanashi.jp -kai.yamanashi.jp -kofu.yamanashi.jp -koshu.yamanashi.jp -kosuge.yamanashi.jp -minami-alps.yamanashi.jp -minobu.yamanashi.jp -nakamichi.yamanashi.jp -nanbu.yamanashi.jp -narusawa.yamanashi.jp -nirasaki.yamanashi.jp -nishikatsura.yamanashi.jp -oshino.yamanashi.jp -otsuki.yamanashi.jp -showa.yamanashi.jp -tabayama.yamanashi.jp -tsuru.yamanashi.jp -uenohara.yamanashi.jp -yamanakako.yamanashi.jp -yamanashi.yamanashi.jp - -// ke : http://www.kenic.or.ke/index.php/en/ke-domains/ke-domains -ke -ac.ke -co.ke -go.ke -info.ke -me.ke -mobi.ke -ne.ke -or.ke -sc.ke - -// kg : http://www.domain.kg/dmn_n.html -kg -org.kg -net.kg -com.kg -edu.kg -gov.kg -mil.kg - -// kh : http://www.mptc.gov.kh/dns_registration.htm -*.kh - -// ki : http://www.ki/dns/index.html -ki -edu.ki -biz.ki -net.ki -org.ki -gov.ki -info.ki -com.ki - -// km : https://en.wikipedia.org/wiki/.km -// http://www.domaine.km/documents/charte.doc -km -org.km -nom.km -gov.km -prd.km -tm.km -edu.km -mil.km -ass.km -com.km -// These are only mentioned as proposed suggestions at domaine.km, but -// https://en.wikipedia.org/wiki/.km says they're available for registration: -coop.km -asso.km -presse.km -medecin.km -notaires.km -pharmaciens.km -veterinaire.km -gouv.km - -// kn : https://en.wikipedia.org/wiki/.kn -// http://www.dot.kn/domainRules.html -kn -net.kn -org.kn -edu.kn -gov.kn - -// kp : http://www.kcce.kp/en_index.php -kp -com.kp -edu.kp -gov.kp -org.kp -rep.kp -tra.kp - -// kr : https://en.wikipedia.org/wiki/.kr -// see also: http://domain.nida.or.kr/eng/registration.jsp -kr -ac.kr -co.kr -es.kr -go.kr -hs.kr -kg.kr -mil.kr -ms.kr -ne.kr -or.kr -pe.kr -re.kr -sc.kr -// kr geographical names -busan.kr -chungbuk.kr -chungnam.kr -daegu.kr -daejeon.kr -gangwon.kr -gwangju.kr -gyeongbuk.kr -gyeonggi.kr -gyeongnam.kr -incheon.kr -jeju.kr -jeonbuk.kr -jeonnam.kr -seoul.kr -ulsan.kr - -// kw : https://www.nic.kw/policies/ -// Confirmed by registry -kw -com.kw -edu.kw -emb.kw -gov.kw -ind.kw -net.kw -org.kw - -// ky : http://www.icta.ky/da_ky_reg_dom.php -// Confirmed by registry 2008-06-17 -ky -com.ky -edu.ky -net.ky -org.ky - -// kz : https://en.wikipedia.org/wiki/.kz -// see also: http://www.nic.kz/rules/index.jsp -kz -org.kz -edu.kz -net.kz -gov.kz -mil.kz -com.kz - -// la : https://en.wikipedia.org/wiki/.la -// Submitted by registry -la -int.la -net.la -info.la -edu.la -gov.la -per.la -com.la -org.la - -// lb : https://en.wikipedia.org/wiki/.lb -// Submitted by registry -lb -com.lb -edu.lb -gov.lb -net.lb -org.lb - -// lc : https://en.wikipedia.org/wiki/.lc -// see also: http://www.nic.lc/rules.htm -lc -com.lc -net.lc -co.lc -org.lc -edu.lc -gov.lc - -// li : https://en.wikipedia.org/wiki/.li -li - -// lk : https://www.nic.lk/index.php/domain-registration/lk-domain-naming-structure -lk -gov.lk -sch.lk -net.lk -int.lk -com.lk -org.lk -edu.lk -ngo.lk -soc.lk -web.lk -ltd.lk -assn.lk -grp.lk -hotel.lk -ac.lk - -// lr : http://psg.com/dns/lr/lr.txt -// Submitted by registry -lr -com.lr -edu.lr -gov.lr -org.lr -net.lr - -// ls : http://www.nic.ls/ -// Confirmed by registry -ls -ac.ls -biz.ls -co.ls -edu.ls -gov.ls -info.ls -net.ls -org.ls -sc.ls - -// lt : https://en.wikipedia.org/wiki/.lt -lt -// gov.lt : http://www.gov.lt/index_en.php -gov.lt - -// lu : http://www.dns.lu/en/ -lu - -// lv : http://www.nic.lv/DNS/En/generic.php -lv -com.lv -edu.lv -gov.lv -org.lv -mil.lv -id.lv -net.lv -asn.lv -conf.lv - -// ly : http://www.nic.ly/regulations.php -ly -com.ly -net.ly -gov.ly -plc.ly -edu.ly -sch.ly -med.ly -org.ly -id.ly - -// ma : https://en.wikipedia.org/wiki/.ma -// http://www.anrt.ma/fr/admin/download/upload/file_fr782.pdf -ma -co.ma -net.ma -gov.ma -org.ma -ac.ma -press.ma - -// mc : http://www.nic.mc/ -mc -tm.mc -asso.mc - -// md : https://en.wikipedia.org/wiki/.md -md - -// me : https://en.wikipedia.org/wiki/.me -me -co.me -net.me -org.me -edu.me -ac.me -gov.me -its.me -priv.me - -// mg : http://nic.mg/nicmg/?page_id=39 -mg -org.mg -nom.mg -gov.mg -prd.mg -tm.mg -edu.mg -mil.mg -com.mg -co.mg - -// mh : https://en.wikipedia.org/wiki/.mh -mh - -// mil : https://en.wikipedia.org/wiki/.mil -mil - -// mk : https://en.wikipedia.org/wiki/.mk -// see also: http://dns.marnet.net.mk/postapka.php -mk -com.mk -org.mk -net.mk -edu.mk -gov.mk -inf.mk -name.mk - -// ml : http://www.gobin.info/domainname/ml-template.doc -// see also: https://en.wikipedia.org/wiki/.ml -ml -com.ml -edu.ml -gouv.ml -gov.ml -net.ml -org.ml -presse.ml - -// mm : https://en.wikipedia.org/wiki/.mm -*.mm - -// mn : https://en.wikipedia.org/wiki/.mn -mn -gov.mn -edu.mn -org.mn - -// mo : http://www.monic.net.mo/ -mo -com.mo -net.mo -org.mo -edu.mo -gov.mo - -// mobi : https://en.wikipedia.org/wiki/.mobi -mobi - -// mp : http://www.dot.mp/ -// Confirmed by registry 2008-06-17 -mp - -// mq : https://en.wikipedia.org/wiki/.mq -mq - -// mr : https://en.wikipedia.org/wiki/.mr -mr -gov.mr - -// ms : http://www.nic.ms/pdf/MS_Domain_Name_Rules.pdf -ms -com.ms -edu.ms -gov.ms -net.ms -org.ms - -// mt : https://www.nic.org.mt/go/policy -// Submitted by registry -mt -com.mt -edu.mt -net.mt -org.mt - -// mu : https://en.wikipedia.org/wiki/.mu -mu -com.mu -net.mu -org.mu -gov.mu -ac.mu -co.mu -or.mu - -// museum : http://about.museum/naming/ -// http://index.museum/ -museum -academy.museum -agriculture.museum -air.museum -airguard.museum -alabama.museum -alaska.museum -amber.museum -ambulance.museum -american.museum -americana.museum -americanantiques.museum -americanart.museum -amsterdam.museum -and.museum -annefrank.museum -anthro.museum -anthropology.museum -antiques.museum -aquarium.museum -arboretum.museum -archaeological.museum -archaeology.museum -architecture.museum -art.museum -artanddesign.museum -artcenter.museum -artdeco.museum -arteducation.museum -artgallery.museum -arts.museum -artsandcrafts.museum -asmatart.museum -assassination.museum -assisi.museum -association.museum -astronomy.museum -atlanta.museum -austin.museum -australia.museum -automotive.museum -aviation.museum -axis.museum -badajoz.museum -baghdad.museum -bahn.museum -bale.museum -baltimore.museum -barcelona.museum -baseball.museum -basel.museum -baths.museum -bauern.museum -beauxarts.museum -beeldengeluid.museum -bellevue.museum -bergbau.museum -berkeley.museum -berlin.museum -bern.museum -bible.museum -bilbao.museum -bill.museum -birdart.museum -birthplace.museum -bonn.museum -boston.museum -botanical.museum -botanicalgarden.museum -botanicgarden.museum -botany.museum -brandywinevalley.museum -brasil.museum -bristol.museum -british.museum -britishcolumbia.museum -broadcast.museum -brunel.museum -brussel.museum -brussels.museum -bruxelles.museum -building.museum -burghof.museum -bus.museum -bushey.museum -cadaques.museum -california.museum -cambridge.museum -can.museum -canada.museum -capebreton.museum -carrier.museum -cartoonart.museum -casadelamoneda.museum -castle.museum -castres.museum -celtic.museum -center.museum -chattanooga.museum -cheltenham.museum -chesapeakebay.museum -chicago.museum -children.museum -childrens.museum -childrensgarden.museum -chiropractic.museum -chocolate.museum -christiansburg.museum -cincinnati.museum -cinema.museum -circus.museum -civilisation.museum -civilization.museum -civilwar.museum -clinton.museum -clock.museum -coal.museum -coastaldefence.museum -cody.museum -coldwar.museum -collection.museum -colonialwilliamsburg.museum -coloradoplateau.museum -columbia.museum -columbus.museum -communication.museum -communications.museum -community.museum -computer.museum -computerhistory.museum -comunicações.museum -contemporary.museum -contemporaryart.museum -convent.museum -copenhagen.museum -corporation.museum -correios-e-telecomunicações.museum -corvette.museum -costume.museum -countryestate.museum -county.museum -crafts.museum -cranbrook.museum -creation.museum -cultural.museum -culturalcenter.museum -culture.museum -cyber.museum -cymru.museum -dali.museum -dallas.museum -database.museum -ddr.museum -decorativearts.museum -delaware.museum -delmenhorst.museum -denmark.museum -depot.museum -design.museum -detroit.museum -dinosaur.museum -discovery.museum -dolls.museum -donostia.museum -durham.museum -eastafrica.museum -eastcoast.museum -education.museum -educational.museum -egyptian.museum -eisenbahn.museum -elburg.museum -elvendrell.museum -embroidery.museum -encyclopedic.museum -england.museum -entomology.museum -environment.museum -environmentalconservation.museum -epilepsy.museum -essex.museum -estate.museum -ethnology.museum -exeter.museum -exhibition.museum -family.museum -farm.museum -farmequipment.museum -farmers.museum -farmstead.museum -field.museum -figueres.museum -filatelia.museum -film.museum -fineart.museum -finearts.museum -finland.museum -flanders.museum -florida.museum -force.museum -fortmissoula.museum -fortworth.museum -foundation.museum -francaise.museum -frankfurt.museum -franziskaner.museum -freemasonry.museum -freiburg.museum -fribourg.museum -frog.museum -fundacio.museum -furniture.museum -gallery.museum -garden.museum -gateway.museum -geelvinck.museum -gemological.museum -geology.museum -georgia.museum -giessen.museum -glas.museum -glass.museum -gorge.museum -grandrapids.museum -graz.museum -guernsey.museum -halloffame.museum -hamburg.museum -handson.museum -harvestcelebration.museum -hawaii.museum -health.museum -heimatunduhren.museum -hellas.museum -helsinki.museum -hembygdsforbund.museum -heritage.museum -histoire.museum -historical.museum -historicalsociety.museum -historichouses.museum -historisch.museum -historisches.museum -history.museum -historyofscience.museum -horology.museum -house.museum -humanities.museum -illustration.museum -imageandsound.museum -indian.museum -indiana.museum -indianapolis.museum -indianmarket.museum -intelligence.museum -interactive.museum -iraq.museum -iron.museum -isleofman.museum -jamison.museum -jefferson.museum -jerusalem.museum -jewelry.museum -jewish.museum -jewishart.museum -jfk.museum -journalism.museum -judaica.museum -judygarland.museum -juedisches.museum -juif.museum -karate.museum -karikatur.museum -kids.museum -koebenhavn.museum -koeln.museum -kunst.museum -kunstsammlung.museum -kunstunddesign.museum -labor.museum -labour.museum -lajolla.museum -lancashire.museum -landes.museum -lans.museum -läns.museum -larsson.museum -lewismiller.museum -lincoln.museum -linz.museum -living.museum -livinghistory.museum -localhistory.museum -london.museum -losangeles.museum -louvre.museum -loyalist.museum -lucerne.museum -luxembourg.museum -luzern.museum -mad.museum -madrid.museum -mallorca.museum -manchester.museum -mansion.museum -mansions.museum -manx.museum -marburg.museum -maritime.museum -maritimo.museum -maryland.museum -marylhurst.museum -media.museum -medical.museum -medizinhistorisches.museum -meeres.museum -memorial.museum -mesaverde.museum -michigan.museum -midatlantic.museum -military.museum -mill.museum -miners.museum -mining.museum -minnesota.museum -missile.museum -missoula.museum -modern.museum -moma.museum -money.museum -monmouth.museum -monticello.museum -montreal.museum -moscow.museum -motorcycle.museum -muenchen.museum -muenster.museum -mulhouse.museum -muncie.museum -museet.museum -museumcenter.museum -museumvereniging.museum -music.museum -national.museum -nationalfirearms.museum -nationalheritage.museum -nativeamerican.museum -naturalhistory.museum -naturalhistorymuseum.museum -naturalsciences.museum -nature.museum -naturhistorisches.museum -natuurwetenschappen.museum -naumburg.museum -naval.museum -nebraska.museum -neues.museum -newhampshire.museum -newjersey.museum -newmexico.museum -newport.museum -newspaper.museum -newyork.museum -niepce.museum -norfolk.museum -north.museum -nrw.museum -nyc.museum -nyny.museum -oceanographic.museum -oceanographique.museum -omaha.museum -online.museum -ontario.museum -openair.museum -oregon.museum -oregontrail.museum -otago.museum -oxford.museum -pacific.museum -paderborn.museum -palace.museum -paleo.museum -palmsprings.museum -panama.museum -paris.museum -pasadena.museum -pharmacy.museum -philadelphia.museum -philadelphiaarea.museum -philately.museum -phoenix.museum -photography.museum -pilots.museum -pittsburgh.museum -planetarium.museum -plantation.museum -plants.museum -plaza.museum -portal.museum -portland.museum -portlligat.museum -posts-and-telecommunications.museum -preservation.museum -presidio.museum -press.museum -project.museum -public.museum -pubol.museum -quebec.museum -railroad.museum -railway.museum -research.museum -resistance.museum -riodejaneiro.museum -rochester.museum -rockart.museum -roma.museum -russia.museum -saintlouis.museum -salem.museum -salvadordali.museum -salzburg.museum -sandiego.museum -sanfrancisco.museum -santabarbara.museum -santacruz.museum -santafe.museum -saskatchewan.museum -satx.museum -savannahga.museum -schlesisches.museum -schoenbrunn.museum -schokoladen.museum -school.museum -schweiz.museum -science.museum -scienceandhistory.museum -scienceandindustry.museum -sciencecenter.museum -sciencecenters.museum -science-fiction.museum -sciencehistory.museum -sciences.museum -sciencesnaturelles.museum -scotland.museum -seaport.museum -settlement.museum -settlers.museum -shell.museum -sherbrooke.museum -sibenik.museum -silk.museum -ski.museum -skole.museum -society.museum -sologne.museum -soundandvision.museum -southcarolina.museum -southwest.museum -space.museum -spy.museum -square.museum -stadt.museum -stalbans.museum -starnberg.museum -state.museum -stateofdelaware.museum -station.museum -steam.museum -steiermark.museum -stjohn.museum -stockholm.museum -stpetersburg.museum -stuttgart.museum -suisse.museum -surgeonshall.museum -surrey.museum -svizzera.museum -sweden.museum -sydney.museum -tank.museum -tcm.museum -technology.museum -telekommunikation.museum -television.museum -texas.museum -textile.museum -theater.museum -time.museum -timekeeping.museum -topology.museum -torino.museum -touch.museum -town.museum -transport.museum -tree.museum -trolley.museum -trust.museum -trustee.museum -uhren.museum -ulm.museum -undersea.museum -university.museum -usa.museum -usantiques.museum -usarts.museum -uscountryestate.museum -usculture.museum -usdecorativearts.museum -usgarden.museum -ushistory.museum -ushuaia.museum -uslivinghistory.museum -utah.museum -uvic.museum -valley.museum -vantaa.museum -versailles.museum -viking.museum -village.museum -virginia.museum -virtual.museum -virtuel.museum -vlaanderen.museum -volkenkunde.museum -wales.museum -wallonie.museum -war.museum -washingtondc.museum -watchandclock.museum -watch-and-clock.museum -western.museum -westfalen.museum -whaling.museum -wildlife.museum -williamsburg.museum -windmill.museum -workshop.museum -york.museum -yorkshire.museum -yosemite.museum -youth.museum -zoological.museum -zoology.museum -ירושלים.museum -иком.museum - -// mv : https://en.wikipedia.org/wiki/.mv -// "mv" included because, contra Wikipedia, google.mv exists. -mv -aero.mv -biz.mv -com.mv -coop.mv -edu.mv -gov.mv -info.mv -int.mv -mil.mv -museum.mv -name.mv -net.mv -org.mv -pro.mv - -// mw : http://www.registrar.mw/ -mw -ac.mw -biz.mw -co.mw -com.mw -coop.mw -edu.mw -gov.mw -int.mw -museum.mw -net.mw -org.mw - -// mx : http://www.nic.mx/ -// Submitted by registry -mx -com.mx -org.mx -gob.mx -edu.mx -net.mx - -// my : http://www.mynic.my/ -// Available strings: https://mynic.my/resources/domains/buying-a-domain/ -my -biz.my -com.my -edu.my -gov.my -mil.my -name.my -net.my -org.my - -// mz : http://www.uem.mz/ -// Submitted by registry -mz -ac.mz -adv.mz -co.mz -edu.mz -gov.mz -mil.mz -net.mz -org.mz - -// na : http://www.na-nic.com.na/ -// http://www.info.na/domain/ -na -info.na -pro.na -name.na -school.na -or.na -dr.na -us.na -mx.na -ca.na -in.na -cc.na -tv.na -ws.na -mobi.na -co.na -com.na -org.na - -// name : has 2nd-level tlds, but there's no list of them -name - -// nc : http://www.cctld.nc/ -nc -asso.nc -nom.nc - -// ne : https://en.wikipedia.org/wiki/.ne -ne - -// net : https://en.wikipedia.org/wiki/.net -net - -// nf : https://en.wikipedia.org/wiki/.nf -nf -com.nf -net.nf -per.nf -rec.nf -web.nf -arts.nf -firm.nf -info.nf -other.nf -store.nf - -// ng : http://www.nira.org.ng/index.php/join-us/register-ng-domain/189-nira-slds -ng -com.ng -edu.ng -gov.ng -i.ng -mil.ng -mobi.ng -name.ng -net.ng -org.ng -sch.ng - -// ni : http://www.nic.ni/ -ni -ac.ni -biz.ni -co.ni -com.ni -edu.ni -gob.ni -in.ni -info.ni -int.ni -mil.ni -net.ni -nom.ni -org.ni -web.ni - -// nl : https://en.wikipedia.org/wiki/.nl -// https://www.sidn.nl/ -// ccTLD for the Netherlands -nl - -// no : https://www.norid.no/en/om-domenenavn/regelverk-for-no/ -// Norid geographical second level domains : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-b/ -// Norid category second level domains : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-c/ -// Norid category second-level domains managed by parties other than Norid : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-d/ -// RSS feed: https://teknisk.norid.no/en/feed/ -no -// Norid category second level domains : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-c/ -fhs.no -vgs.no -fylkesbibl.no -folkebibl.no -museum.no -idrett.no -priv.no -// Norid category second-level domains managed by parties other than Norid : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-d/ -mil.no -stat.no -dep.no -kommune.no -herad.no -// Norid geographical second level domains : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-b/ -// counties -aa.no -ah.no -bu.no -fm.no -hl.no -hm.no -jan-mayen.no -mr.no -nl.no -nt.no -of.no -ol.no -oslo.no -rl.no -sf.no -st.no -svalbard.no -tm.no -tr.no -va.no -vf.no -// primary and lower secondary schools per county -gs.aa.no -gs.ah.no -gs.bu.no -gs.fm.no -gs.hl.no -gs.hm.no -gs.jan-mayen.no -gs.mr.no -gs.nl.no -gs.nt.no -gs.of.no -gs.ol.no -gs.oslo.no -gs.rl.no -gs.sf.no -gs.st.no -gs.svalbard.no -gs.tm.no -gs.tr.no -gs.va.no -gs.vf.no -// cities -akrehamn.no -åkrehamn.no -algard.no -ålgård.no -arna.no -brumunddal.no -bryne.no -bronnoysund.no -brønnøysund.no -drobak.no -drøbak.no -egersund.no -fetsund.no -floro.no -florø.no -fredrikstad.no -hokksund.no -honefoss.no -hønefoss.no -jessheim.no -jorpeland.no -jørpeland.no -kirkenes.no -kopervik.no -krokstadelva.no -langevag.no -langevåg.no -leirvik.no -mjondalen.no -mjøndalen.no -mo-i-rana.no -mosjoen.no -mosjøen.no -nesoddtangen.no -orkanger.no -osoyro.no -osøyro.no -raholt.no -råholt.no -sandnessjoen.no -sandnessjøen.no -skedsmokorset.no -slattum.no -spjelkavik.no -stathelle.no -stavern.no -stjordalshalsen.no -stjørdalshalsen.no -tananger.no -tranby.no -vossevangen.no -// communities -afjord.no -åfjord.no -agdenes.no -al.no -ål.no -alesund.no -ålesund.no -alstahaug.no -alta.no -áltá.no -alaheadju.no -álaheadju.no -alvdal.no -amli.no -åmli.no -amot.no -åmot.no -andebu.no -andoy.no -andøy.no -andasuolo.no -ardal.no -årdal.no -aremark.no -arendal.no -ås.no -aseral.no -åseral.no -asker.no -askim.no -askvoll.no -askoy.no -askøy.no -asnes.no -åsnes.no -audnedaln.no -aukra.no -aure.no -aurland.no -aurskog-holand.no -aurskog-høland.no -austevoll.no -austrheim.no -averoy.no -averøy.no -balestrand.no -ballangen.no -balat.no -bálát.no -balsfjord.no -bahccavuotna.no -báhccavuotna.no -bamble.no -bardu.no -beardu.no -beiarn.no -bajddar.no -bájddar.no -baidar.no -báidár.no -berg.no -bergen.no -berlevag.no -berlevåg.no -bearalvahki.no -bearalváhki.no -bindal.no -birkenes.no -bjarkoy.no -bjarkøy.no -bjerkreim.no -bjugn.no -bodo.no -bodø.no -badaddja.no -bådåddjå.no -budejju.no -bokn.no -bremanger.no -bronnoy.no -brønnøy.no -bygland.no -bykle.no -barum.no -bærum.no -bo.telemark.no -bø.telemark.no -bo.nordland.no -bø.nordland.no -bievat.no -bievát.no -bomlo.no -bømlo.no -batsfjord.no -båtsfjord.no -bahcavuotna.no -báhcavuotna.no -dovre.no -drammen.no -drangedal.no -dyroy.no -dyrøy.no -donna.no -dønna.no -eid.no -eidfjord.no -eidsberg.no -eidskog.no -eidsvoll.no -eigersund.no -elverum.no -enebakk.no -engerdal.no -etne.no -etnedal.no -evenes.no -evenassi.no -evenášši.no -evje-og-hornnes.no -farsund.no -fauske.no -fuossko.no -fuoisku.no -fedje.no -fet.no -finnoy.no -finnøy.no -fitjar.no -fjaler.no -fjell.no -flakstad.no -flatanger.no -flekkefjord.no -flesberg.no -flora.no -fla.no -flå.no -folldal.no -forsand.no -fosnes.no -frei.no -frogn.no -froland.no -frosta.no -frana.no -fræna.no -froya.no -frøya.no -fusa.no -fyresdal.no -forde.no -førde.no -gamvik.no -gangaviika.no -gáŋgaviika.no -gaular.no -gausdal.no -gildeskal.no -gildeskål.no -giske.no -gjemnes.no -gjerdrum.no -gjerstad.no -gjesdal.no -gjovik.no -gjøvik.no -gloppen.no -gol.no -gran.no -grane.no -granvin.no -gratangen.no -grimstad.no -grong.no -kraanghke.no -kråanghke.no -grue.no -gulen.no -hadsel.no -halden.no -halsa.no -hamar.no -hamaroy.no -habmer.no -hábmer.no -hapmir.no -hápmir.no -hammerfest.no -hammarfeasta.no -hámmárfeasta.no -haram.no -hareid.no -harstad.no -hasvik.no -aknoluokta.no -ákŋoluokta.no -hattfjelldal.no -aarborte.no -haugesund.no -hemne.no -hemnes.no -hemsedal.no -heroy.more-og-romsdal.no -herøy.møre-og-romsdal.no -heroy.nordland.no -herøy.nordland.no -hitra.no -hjartdal.no -hjelmeland.no -hobol.no -hobøl.no -hof.no -hol.no -hole.no -holmestrand.no -holtalen.no -holtålen.no -hornindal.no -horten.no -hurdal.no -hurum.no -hvaler.no -hyllestad.no -hagebostad.no -hægebostad.no -hoyanger.no -høyanger.no -hoylandet.no -høylandet.no -ha.no -hå.no -ibestad.no -inderoy.no -inderøy.no -iveland.no -jevnaker.no -jondal.no -jolster.no -jølster.no -karasjok.no -karasjohka.no -kárášjohka.no -karlsoy.no -galsa.no -gálsá.no -karmoy.no -karmøy.no -kautokeino.no -guovdageaidnu.no -klepp.no -klabu.no -klæbu.no -kongsberg.no -kongsvinger.no -kragero.no -kragerø.no -kristiansand.no -kristiansund.no -krodsherad.no -krødsherad.no -kvalsund.no -rahkkeravju.no -ráhkkerávju.no -kvam.no -kvinesdal.no -kvinnherad.no -kviteseid.no -kvitsoy.no -kvitsøy.no -kvafjord.no -kvæfjord.no -giehtavuoatna.no -kvanangen.no -kvænangen.no -navuotna.no -návuotna.no -kafjord.no -kåfjord.no -gaivuotna.no -gáivuotna.no -larvik.no -lavangen.no -lavagis.no -loabat.no -loabát.no -lebesby.no -davvesiida.no -leikanger.no -leirfjord.no -leka.no -leksvik.no -lenvik.no -leangaviika.no -leaŋgaviika.no -lesja.no -levanger.no -lier.no -lierne.no -lillehammer.no -lillesand.no -lindesnes.no -lindas.no -lindås.no -lom.no -loppa.no -lahppi.no -láhppi.no -lund.no -lunner.no -luroy.no -lurøy.no -luster.no -lyngdal.no -lyngen.no -ivgu.no -lardal.no -lerdal.no -lærdal.no -lodingen.no -lødingen.no -lorenskog.no -lørenskog.no -loten.no -løten.no -malvik.no -masoy.no -måsøy.no -muosat.no -muosát.no -mandal.no -marker.no -marnardal.no -masfjorden.no -meland.no -meldal.no -melhus.no -meloy.no -meløy.no -meraker.no -meråker.no -moareke.no -moåreke.no -midsund.no -midtre-gauldal.no -modalen.no -modum.no -molde.no -moskenes.no -moss.no -mosvik.no -malselv.no -målselv.no -malatvuopmi.no -málatvuopmi.no -namdalseid.no -aejrie.no -namsos.no -namsskogan.no -naamesjevuemie.no -nååmesjevuemie.no -laakesvuemie.no -nannestad.no -narvik.no -narviika.no -naustdal.no -nedre-eiker.no -nes.akershus.no -nes.buskerud.no -nesna.no -nesodden.no -nesseby.no -unjarga.no -unjárga.no -nesset.no -nissedal.no -nittedal.no -nord-aurdal.no -nord-fron.no -nord-odal.no -norddal.no -nordkapp.no -davvenjarga.no -davvenjárga.no -nordre-land.no -nordreisa.no -raisa.no -ráisa.no -nore-og-uvdal.no -notodden.no -naroy.no -nærøy.no -notteroy.no -nøtterøy.no -odda.no -oksnes.no -øksnes.no -oppdal.no -oppegard.no -oppegård.no -orkdal.no -orland.no -ørland.no -orskog.no -ørskog.no -orsta.no -ørsta.no -os.hedmark.no -os.hordaland.no -osen.no -osteroy.no -osterøy.no -ostre-toten.no -østre-toten.no -overhalla.no -ovre-eiker.no -øvre-eiker.no -oyer.no -øyer.no -oygarden.no -øygarden.no -oystre-slidre.no -øystre-slidre.no -porsanger.no -porsangu.no -porsáŋgu.no -porsgrunn.no -radoy.no -radøy.no -rakkestad.no -rana.no -ruovat.no -randaberg.no -rauma.no -rendalen.no -rennebu.no -rennesoy.no -rennesøy.no -rindal.no -ringebu.no -ringerike.no -ringsaker.no -rissa.no -risor.no -risør.no -roan.no -rollag.no -rygge.no -ralingen.no -rælingen.no -rodoy.no -rødøy.no -romskog.no -rømskog.no -roros.no -røros.no -rost.no -røst.no -royken.no -røyken.no -royrvik.no -røyrvik.no -rade.no -råde.no -salangen.no -siellak.no -saltdal.no -salat.no -sálát.no -sálat.no -samnanger.no -sande.more-og-romsdal.no -sande.møre-og-romsdal.no -sande.vestfold.no -sandefjord.no -sandnes.no -sandoy.no -sandøy.no -sarpsborg.no -sauda.no -sauherad.no -sel.no -selbu.no -selje.no -seljord.no -sigdal.no -siljan.no -sirdal.no -skaun.no -skedsmo.no -ski.no -skien.no -skiptvet.no -skjervoy.no -skjervøy.no -skierva.no -skiervá.no -skjak.no -skjåk.no -skodje.no -skanland.no -skånland.no -skanit.no -skánit.no -smola.no -smøla.no -snillfjord.no -snasa.no -snåsa.no -snoasa.no -snaase.no -snåase.no -sogndal.no -sokndal.no -sola.no -solund.no -songdalen.no -sortland.no -spydeberg.no -stange.no -stavanger.no -steigen.no -steinkjer.no -stjordal.no -stjørdal.no -stokke.no -stor-elvdal.no -stord.no -stordal.no -storfjord.no -omasvuotna.no -strand.no -stranda.no -stryn.no -sula.no -suldal.no -sund.no -sunndal.no -surnadal.no -sveio.no -svelvik.no -sykkylven.no -sogne.no -søgne.no -somna.no -sømna.no -sondre-land.no -søndre-land.no -sor-aurdal.no -sør-aurdal.no -sor-fron.no -sør-fron.no -sor-odal.no -sør-odal.no -sor-varanger.no -sør-varanger.no -matta-varjjat.no -mátta-várjjat.no -sorfold.no -sørfold.no -sorreisa.no -sørreisa.no -sorum.no -sørum.no -tana.no -deatnu.no -time.no -tingvoll.no -tinn.no -tjeldsund.no -dielddanuorri.no -tjome.no -tjøme.no -tokke.no -tolga.no -torsken.no -tranoy.no -tranøy.no -tromso.no -tromsø.no -tromsa.no -romsa.no -trondheim.no -troandin.no -trysil.no -trana.no -træna.no -trogstad.no -trøgstad.no -tvedestrand.no -tydal.no -tynset.no -tysfjord.no -divtasvuodna.no -divttasvuotna.no -tysnes.no -tysvar.no -tysvær.no -tonsberg.no -tønsberg.no -ullensaker.no -ullensvang.no -ulvik.no -utsira.no -vadso.no -vadsø.no -cahcesuolo.no -čáhcesuolo.no -vaksdal.no -valle.no -vang.no -vanylven.no -vardo.no -vardø.no -varggat.no -várggát.no -vefsn.no -vaapste.no -vega.no -vegarshei.no -vegårshei.no -vennesla.no -verdal.no -verran.no -vestby.no -vestnes.no -vestre-slidre.no -vestre-toten.no -vestvagoy.no -vestvågøy.no -vevelstad.no -vik.no -vikna.no -vindafjord.no -volda.no -voss.no -varoy.no -værøy.no -vagan.no -vågan.no -voagat.no -vagsoy.no -vågsøy.no -vaga.no -vågå.no -valer.ostfold.no -våler.østfold.no -valer.hedmark.no -våler.hedmark.no - -// np : http://www.mos.com.np/register.html -*.np - -// nr : http://cenpac.net.nr/dns/index.html -// Submitted by registry -nr -biz.nr -info.nr -gov.nr -edu.nr -org.nr -net.nr -com.nr - -// nu : https://en.wikipedia.org/wiki/.nu -nu - -// nz : https://en.wikipedia.org/wiki/.nz -// Submitted by registry -nz -ac.nz -co.nz -cri.nz -geek.nz -gen.nz -govt.nz -health.nz -iwi.nz -kiwi.nz -maori.nz -mil.nz -māori.nz -net.nz -org.nz -parliament.nz -school.nz - -// om : https://en.wikipedia.org/wiki/.om -om -co.om -com.om -edu.om -gov.om -med.om -museum.om -net.om -org.om -pro.om - -// onion : https://tools.ietf.org/html/rfc7686 -onion - -// org : https://en.wikipedia.org/wiki/.org -org - -// pa : http://www.nic.pa/ -// Some additional second level "domains" resolve directly as hostnames, such as -// pannet.pa, so we add a rule for "pa". -pa -ac.pa -gob.pa -com.pa -org.pa -sld.pa -edu.pa -net.pa -ing.pa -abo.pa -med.pa -nom.pa - -// pe : https://www.nic.pe/InformeFinalComision.pdf -pe -edu.pe -gob.pe -nom.pe -mil.pe -org.pe -com.pe -net.pe - -// pf : http://www.gobin.info/domainname/formulaire-pf.pdf -pf -com.pf -org.pf -edu.pf - -// pg : https://en.wikipedia.org/wiki/.pg -*.pg - -// ph : http://www.domains.ph/FAQ2.asp -// Submitted by registry -ph -com.ph -net.ph -org.ph -gov.ph -edu.ph -ngo.ph -mil.ph -i.ph - -// pk : http://pk5.pknic.net.pk/pk5/msgNamepk.PK -pk -com.pk -net.pk -edu.pk -org.pk -fam.pk -biz.pk -web.pk -gov.pk -gob.pk -gok.pk -gon.pk -gop.pk -gos.pk -info.pk - -// pl http://www.dns.pl/english/index.html -// Submitted by registry -pl -com.pl -net.pl -org.pl -// pl functional domains (http://www.dns.pl/english/index.html) -aid.pl -agro.pl -atm.pl -auto.pl -biz.pl -edu.pl -gmina.pl -gsm.pl -info.pl -mail.pl -miasta.pl -media.pl -mil.pl -nieruchomosci.pl -nom.pl -pc.pl -powiat.pl -priv.pl -realestate.pl -rel.pl -sex.pl -shop.pl -sklep.pl -sos.pl -szkola.pl -targi.pl -tm.pl -tourism.pl -travel.pl -turystyka.pl -// Government domains -gov.pl -ap.gov.pl -ic.gov.pl -is.gov.pl -us.gov.pl -kmpsp.gov.pl -kppsp.gov.pl -kwpsp.gov.pl -psp.gov.pl -wskr.gov.pl -kwp.gov.pl -mw.gov.pl -ug.gov.pl -um.gov.pl -umig.gov.pl -ugim.gov.pl -upow.gov.pl -uw.gov.pl -starostwo.gov.pl -pa.gov.pl -po.gov.pl -psse.gov.pl -pup.gov.pl -rzgw.gov.pl -sa.gov.pl -so.gov.pl -sr.gov.pl -wsa.gov.pl -sko.gov.pl -uzs.gov.pl -wiih.gov.pl -winb.gov.pl -pinb.gov.pl -wios.gov.pl -witd.gov.pl -wzmiuw.gov.pl -piw.gov.pl -wiw.gov.pl -griw.gov.pl -wif.gov.pl -oum.gov.pl -sdn.gov.pl -zp.gov.pl -uppo.gov.pl -mup.gov.pl -wuoz.gov.pl -konsulat.gov.pl -oirm.gov.pl -// pl regional domains (http://www.dns.pl/english/index.html) -augustow.pl -babia-gora.pl -bedzin.pl -beskidy.pl -bialowieza.pl -bialystok.pl -bielawa.pl -bieszczady.pl -boleslawiec.pl -bydgoszcz.pl -bytom.pl -cieszyn.pl -czeladz.pl -czest.pl -dlugoleka.pl -elblag.pl -elk.pl -glogow.pl -gniezno.pl -gorlice.pl -grajewo.pl -ilawa.pl -jaworzno.pl -jelenia-gora.pl -jgora.pl -kalisz.pl -kazimierz-dolny.pl -karpacz.pl -kartuzy.pl -kaszuby.pl -katowice.pl -kepno.pl -ketrzyn.pl -klodzko.pl -kobierzyce.pl -kolobrzeg.pl -konin.pl -konskowola.pl -kutno.pl -lapy.pl -lebork.pl -legnica.pl -lezajsk.pl -limanowa.pl -lomza.pl -lowicz.pl -lubin.pl -lukow.pl -malbork.pl -malopolska.pl -mazowsze.pl -mazury.pl -mielec.pl -mielno.pl -mragowo.pl -naklo.pl -nowaruda.pl -nysa.pl -olawa.pl -olecko.pl -olkusz.pl -olsztyn.pl -opoczno.pl -opole.pl -ostroda.pl -ostroleka.pl -ostrowiec.pl -ostrowwlkp.pl -pila.pl -pisz.pl -podhale.pl -podlasie.pl -polkowice.pl -pomorze.pl -pomorskie.pl -prochowice.pl -pruszkow.pl -przeworsk.pl -pulawy.pl -radom.pl -rawa-maz.pl -rybnik.pl -rzeszow.pl -sanok.pl -sejny.pl -slask.pl -slupsk.pl -sosnowiec.pl -stalowa-wola.pl -skoczow.pl -starachowice.pl -stargard.pl -suwalki.pl -swidnica.pl -swiebodzin.pl -swinoujscie.pl -szczecin.pl -szczytno.pl -tarnobrzeg.pl -tgory.pl -turek.pl -tychy.pl -ustka.pl -walbrzych.pl -warmia.pl -warszawa.pl -waw.pl -wegrow.pl -wielun.pl -wlocl.pl -wloclawek.pl -wodzislaw.pl -wolomin.pl -wroclaw.pl -zachpomor.pl -zagan.pl -zarow.pl -zgora.pl -zgorzelec.pl - -// pm : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf -pm - -// pn : http://www.government.pn/PnRegistry/policies.htm -pn -gov.pn -co.pn -org.pn -edu.pn -net.pn - -// post : https://en.wikipedia.org/wiki/.post -post - -// pr : http://www.nic.pr/index.asp?f=1 -pr -com.pr -net.pr -org.pr -gov.pr -edu.pr -isla.pr -pro.pr -biz.pr -info.pr -name.pr -// these aren't mentioned on nic.pr, but on https://en.wikipedia.org/wiki/.pr -est.pr -prof.pr -ac.pr - -// pro : http://registry.pro/get-pro -pro -aaa.pro -aca.pro -acct.pro -avocat.pro -bar.pro -cpa.pro -eng.pro -jur.pro -law.pro -med.pro -recht.pro - -// ps : https://en.wikipedia.org/wiki/.ps -// http://www.nic.ps/registration/policy.html#reg -ps -edu.ps -gov.ps -sec.ps -plo.ps -com.ps -org.ps -net.ps - -// pt : https://www.dns.pt/en/domain/pt-terms-and-conditions-registration-rules/ -pt -net.pt -gov.pt -org.pt -edu.pt -int.pt -publ.pt -com.pt -nome.pt - -// pw : https://en.wikipedia.org/wiki/.pw -pw -co.pw -ne.pw -or.pw -ed.pw -go.pw -belau.pw - -// py : http://www.nic.py/pautas.html#seccion_9 -// Submitted by registry -py -com.py -coop.py -edu.py -gov.py -mil.py -net.py -org.py - -// qa : http://domains.qa/en/ -qa -com.qa -edu.qa -gov.qa -mil.qa -name.qa -net.qa -org.qa -sch.qa - -// re : http://www.afnic.re/obtenir/chartes/nommage-re/annexe-descriptifs -re -asso.re -com.re -nom.re - -// ro : http://www.rotld.ro/ -ro -arts.ro -com.ro -firm.ro -info.ro -nom.ro -nt.ro -org.ro -rec.ro -store.ro -tm.ro -www.ro - -// rs : https://www.rnids.rs/en/domains/national-domains -rs -ac.rs -co.rs -edu.rs -gov.rs -in.rs -org.rs - -// ru : https://cctld.ru/files/pdf/docs/en/rules_ru-rf.pdf -// Submitted by George Georgievsky -ru - -// rw : https://www.ricta.org.rw/sites/default/files/resources/registry_registrar_contract_0.pdf -rw -ac.rw -co.rw -coop.rw -gov.rw -mil.rw -net.rw -org.rw - -// sa : http://www.nic.net.sa/ -sa -com.sa -net.sa -org.sa -gov.sa -med.sa -pub.sa -edu.sa -sch.sa - -// sb : http://www.sbnic.net.sb/ -// Submitted by registry -sb -com.sb -edu.sb -gov.sb -net.sb -org.sb - -// sc : http://www.nic.sc/ -sc -com.sc -gov.sc -net.sc -org.sc -edu.sc - -// sd : http://www.isoc.sd/sudanic.isoc.sd/billing_pricing.htm -// Submitted by registry -sd -com.sd -net.sd -org.sd -edu.sd -med.sd -tv.sd -gov.sd -info.sd - -// se : https://en.wikipedia.org/wiki/.se -// Submitted by registry -se -a.se -ac.se -b.se -bd.se -brand.se -c.se -d.se -e.se -f.se -fh.se -fhsk.se -fhv.se -g.se -h.se -i.se -k.se -komforb.se -kommunalforbund.se -komvux.se -l.se -lanbib.se -m.se -n.se -naturbruksgymn.se -o.se -org.se -p.se -parti.se -pp.se -press.se -r.se -s.se -t.se -tm.se -u.se -w.se -x.se -y.se -z.se - -// sg : http://www.nic.net.sg/page/registration-policies-procedures-and-guidelines -sg -com.sg -net.sg -org.sg -gov.sg -edu.sg -per.sg - -// sh : http://nic.sh/rules.htm -sh -com.sh -net.sh -gov.sh -org.sh -mil.sh - -// si : https://en.wikipedia.org/wiki/.si -si - -// sj : No registrations at this time. -// Submitted by registry -sj - -// sk : https://en.wikipedia.org/wiki/.sk -// list of 2nd level domains ? -sk - -// sl : http://www.nic.sl -// Submitted by registry -sl -com.sl -net.sl -edu.sl -gov.sl -org.sl - -// sm : https://en.wikipedia.org/wiki/.sm -sm - -// sn : https://en.wikipedia.org/wiki/.sn -sn -art.sn -com.sn -edu.sn -gouv.sn -org.sn -perso.sn -univ.sn - -// so : http://sonic.so/policies/ -so -com.so -edu.so -gov.so -me.so -net.so -org.so - -// sr : https://en.wikipedia.org/wiki/.sr -sr - -// ss : https://registry.nic.ss/ -// Submitted by registry -ss -biz.ss -com.ss -edu.ss -gov.ss -me.ss -net.ss -org.ss -sch.ss - -// st : http://www.nic.st/html/policyrules/ -st -co.st -com.st -consulado.st -edu.st -embaixada.st -mil.st -net.st -org.st -principe.st -saotome.st -store.st - -// su : https://en.wikipedia.org/wiki/.su -su - -// sv : http://www.svnet.org.sv/niveldos.pdf -sv -com.sv -edu.sv -gob.sv -org.sv -red.sv - -// sx : https://en.wikipedia.org/wiki/.sx -// Submitted by registry -sx -gov.sx - -// sy : https://en.wikipedia.org/wiki/.sy -// see also: http://www.gobin.info/domainname/sy.doc -sy -edu.sy -gov.sy -net.sy -mil.sy -com.sy -org.sy - -// sz : https://en.wikipedia.org/wiki/.sz -// http://www.sispa.org.sz/ -sz -co.sz -ac.sz -org.sz - -// tc : https://en.wikipedia.org/wiki/.tc -tc - -// td : https://en.wikipedia.org/wiki/.td -td - -// tel: https://en.wikipedia.org/wiki/.tel -// http://www.telnic.org/ -tel - -// tf : https://en.wikipedia.org/wiki/.tf -tf - -// tg : https://en.wikipedia.org/wiki/.tg -// http://www.nic.tg/ -tg - -// th : https://en.wikipedia.org/wiki/.th -// Submitted by registry -th -ac.th -co.th -go.th -in.th -mi.th -net.th -or.th - -// tj : http://www.nic.tj/policy.html -tj -ac.tj -biz.tj -co.tj -com.tj -edu.tj -go.tj -gov.tj -int.tj -mil.tj -name.tj -net.tj -nic.tj -org.tj -test.tj -web.tj - -// tk : https://en.wikipedia.org/wiki/.tk -tk - -// tl : https://en.wikipedia.org/wiki/.tl -tl -gov.tl - -// tm : http://www.nic.tm/local.html -tm -com.tm -co.tm -org.tm -net.tm -nom.tm -gov.tm -mil.tm -edu.tm - -// tn : http://www.registre.tn/fr/ -// https://whois.ati.tn/ -tn -com.tn -ens.tn -fin.tn -gov.tn -ind.tn -info.tn -intl.tn -mincom.tn -nat.tn -net.tn -org.tn -perso.tn -tourism.tn - -// to : https://en.wikipedia.org/wiki/.to -// Submitted by registry -to -com.to -gov.to -net.to -org.to -edu.to -mil.to - -// tr : https://nic.tr/ -// https://nic.tr/forms/eng/policies.pdf -// https://nic.tr/index.php?USRACTN=PRICELST -tr -av.tr -bbs.tr -bel.tr -biz.tr -com.tr -dr.tr -edu.tr -gen.tr -gov.tr -info.tr -mil.tr -k12.tr -kep.tr -name.tr -net.tr -org.tr -pol.tr -tel.tr -tsk.tr -tv.tr -web.tr -// Used by Northern Cyprus -nc.tr -// Used by government agencies of Northern Cyprus -gov.nc.tr - -// tt : http://www.nic.tt/ -tt -co.tt -com.tt -org.tt -net.tt -biz.tt -info.tt -pro.tt -int.tt -coop.tt -jobs.tt -mobi.tt -travel.tt -museum.tt -aero.tt -name.tt -gov.tt -edu.tt - -// tv : https://en.wikipedia.org/wiki/.tv -// Not listing any 2LDs as reserved since none seem to exist in practice, -// Wikipedia notwithstanding. -tv - -// tw : https://en.wikipedia.org/wiki/.tw -tw -edu.tw -gov.tw -mil.tw -com.tw -net.tw -org.tw -idv.tw -game.tw -ebiz.tw -club.tw -網路.tw -組織.tw -商業.tw - -// tz : http://www.tznic.or.tz/index.php/domains -// Submitted by registry -tz -ac.tz -co.tz -go.tz -hotel.tz -info.tz -me.tz -mil.tz -mobi.tz -ne.tz -or.tz -sc.tz -tv.tz - -// ua : https://hostmaster.ua/policy/?ua -// Submitted by registry -ua -// ua 2LD -com.ua -edu.ua -gov.ua -in.ua -net.ua -org.ua -// ua geographic names -// https://hostmaster.ua/2ld/ -cherkassy.ua -cherkasy.ua -chernigov.ua -chernihiv.ua -chernivtsi.ua -chernovtsy.ua -ck.ua -cn.ua -cr.ua -crimea.ua -cv.ua -dn.ua -dnepropetrovsk.ua -dnipropetrovsk.ua -donetsk.ua -dp.ua -if.ua -ivano-frankivsk.ua -kh.ua -kharkiv.ua -kharkov.ua -kherson.ua -khmelnitskiy.ua -khmelnytskyi.ua -kiev.ua -kirovograd.ua -km.ua -kr.ua -krym.ua -ks.ua -kv.ua -kyiv.ua -lg.ua -lt.ua -lugansk.ua -lutsk.ua -lv.ua -lviv.ua -mk.ua -mykolaiv.ua -nikolaev.ua -od.ua -odesa.ua -odessa.ua -pl.ua -poltava.ua -rivne.ua -rovno.ua -rv.ua -sb.ua -sebastopol.ua -sevastopol.ua -sm.ua -sumy.ua -te.ua -ternopil.ua -uz.ua -uzhgorod.ua -vinnica.ua -vinnytsia.ua -vn.ua -volyn.ua -yalta.ua -zaporizhzhe.ua -zaporizhzhia.ua -zhitomir.ua -zhytomyr.ua -zp.ua -zt.ua - -// ug : https://www.registry.co.ug/ -ug -co.ug -or.ug -ac.ug -sc.ug -go.ug -ne.ug -com.ug -org.ug - -// uk : https://en.wikipedia.org/wiki/.uk -// Submitted by registry -uk -ac.uk -co.uk -gov.uk -ltd.uk -me.uk -net.uk -nhs.uk -org.uk -plc.uk -police.uk -*.sch.uk - -// us : https://en.wikipedia.org/wiki/.us -us -dni.us -fed.us -isa.us -kids.us -nsn.us -// us geographic names -ak.us -al.us -ar.us -as.us -az.us -ca.us -co.us -ct.us -dc.us -de.us -fl.us -ga.us -gu.us -hi.us -ia.us -id.us -il.us -in.us -ks.us -ky.us -la.us -ma.us -md.us -me.us -mi.us -mn.us -mo.us -ms.us -mt.us -nc.us -nd.us -ne.us -nh.us -nj.us -nm.us -nv.us -ny.us -oh.us -ok.us -or.us -pa.us -pr.us -ri.us -sc.us -sd.us -tn.us -tx.us -ut.us -vi.us -vt.us -va.us -wa.us -wi.us -wv.us -wy.us -// The registrar notes several more specific domains available in each state, -// such as state.*.us, dst.*.us, etc., but resolution of these is somewhat -// haphazard; in some states these domains resolve as addresses, while in others -// only subdomains are available, or even nothing at all. We include the -// most common ones where it's clear that different sites are different -// entities. -k12.ak.us -k12.al.us -k12.ar.us -k12.as.us -k12.az.us -k12.ca.us -k12.co.us -k12.ct.us -k12.dc.us -k12.de.us -k12.fl.us -k12.ga.us -k12.gu.us -// k12.hi.us Bug 614565 - Hawaii has a state-wide DOE login -k12.ia.us -k12.id.us -k12.il.us -k12.in.us -k12.ks.us -k12.ky.us -k12.la.us -k12.ma.us -k12.md.us -k12.me.us -k12.mi.us -k12.mn.us -k12.mo.us -k12.ms.us -k12.mt.us -k12.nc.us -// k12.nd.us Bug 1028347 - Removed at request of Travis Rosso -k12.ne.us -k12.nh.us -k12.nj.us -k12.nm.us -k12.nv.us -k12.ny.us -k12.oh.us -k12.ok.us -k12.or.us -k12.pa.us -k12.pr.us -// k12.ri.us Removed at request of Kim Cournoyer -k12.sc.us -// k12.sd.us Bug 934131 - Removed at request of James Booze -k12.tn.us -k12.tx.us -k12.ut.us -k12.vi.us -k12.vt.us -k12.va.us -k12.wa.us -k12.wi.us -// k12.wv.us Bug 947705 - Removed at request of Verne Britton -k12.wy.us -cc.ak.us -cc.al.us -cc.ar.us -cc.as.us -cc.az.us -cc.ca.us -cc.co.us -cc.ct.us -cc.dc.us -cc.de.us -cc.fl.us -cc.ga.us -cc.gu.us -cc.hi.us -cc.ia.us -cc.id.us -cc.il.us -cc.in.us -cc.ks.us -cc.ky.us -cc.la.us -cc.ma.us -cc.md.us -cc.me.us -cc.mi.us -cc.mn.us -cc.mo.us -cc.ms.us -cc.mt.us -cc.nc.us -cc.nd.us -cc.ne.us -cc.nh.us -cc.nj.us -cc.nm.us -cc.nv.us -cc.ny.us -cc.oh.us -cc.ok.us -cc.or.us -cc.pa.us -cc.pr.us -cc.ri.us -cc.sc.us -cc.sd.us -cc.tn.us -cc.tx.us -cc.ut.us -cc.vi.us -cc.vt.us -cc.va.us -cc.wa.us -cc.wi.us -cc.wv.us -cc.wy.us -lib.ak.us -lib.al.us -lib.ar.us -lib.as.us -lib.az.us -lib.ca.us -lib.co.us -lib.ct.us -lib.dc.us -// lib.de.us Issue #243 - Moved to Private section at request of Ed Moore -lib.fl.us -lib.ga.us -lib.gu.us -lib.hi.us -lib.ia.us -lib.id.us -lib.il.us -lib.in.us -lib.ks.us -lib.ky.us -lib.la.us -lib.ma.us -lib.md.us -lib.me.us -lib.mi.us -lib.mn.us -lib.mo.us -lib.ms.us -lib.mt.us -lib.nc.us -lib.nd.us -lib.ne.us -lib.nh.us -lib.nj.us -lib.nm.us -lib.nv.us -lib.ny.us -lib.oh.us -lib.ok.us -lib.or.us -lib.pa.us -lib.pr.us -lib.ri.us -lib.sc.us -lib.sd.us -lib.tn.us -lib.tx.us -lib.ut.us -lib.vi.us -lib.vt.us -lib.va.us -lib.wa.us -lib.wi.us -// lib.wv.us Bug 941670 - Removed at request of Larry W Arnold -lib.wy.us -// k12.ma.us contains school districts in Massachusetts. The 4LDs are -// managed independently except for private (PVT), charter (CHTR) and -// parochial (PAROCH) schools. Those are delegated directly to the -// 5LD operators. -pvt.k12.ma.us -chtr.k12.ma.us -paroch.k12.ma.us -// Merit Network, Inc. maintains the registry for =~ /(k12|cc|lib).mi.us/ and the following -// see also: http://domreg.merit.edu -// see also: whois -h whois.domreg.merit.edu help -ann-arbor.mi.us -cog.mi.us -dst.mi.us -eaton.mi.us -gen.mi.us -mus.mi.us -tec.mi.us -washtenaw.mi.us - -// uy : http://www.nic.org.uy/ -uy -com.uy -edu.uy -gub.uy -mil.uy -net.uy -org.uy - -// uz : http://www.reg.uz/ -uz -co.uz -com.uz -net.uz -org.uz - -// va : https://en.wikipedia.org/wiki/.va -va - -// vc : https://en.wikipedia.org/wiki/.vc -// Submitted by registry -vc -com.vc -net.vc -org.vc -gov.vc -mil.vc -edu.vc - -// ve : https://registro.nic.ve/ -// Submitted by registry nic@nic.ve and nicve@conatel.gob.ve -ve -arts.ve -bib.ve -co.ve -com.ve -e12.ve -edu.ve -firm.ve -gob.ve -gov.ve -info.ve -int.ve -mil.ve -net.ve -nom.ve -org.ve -rar.ve -rec.ve -store.ve -tec.ve -web.ve - -// vg : https://en.wikipedia.org/wiki/.vg -vg - -// vi : http://www.nic.vi/newdomainform.htm -// http://www.nic.vi/Domain_Rules/body_domain_rules.html indicates some other -// TLDs are "reserved", such as edu.vi and gov.vi, but doesn't actually say they -// are available for registration (which they do not seem to be). -vi -co.vi -com.vi -k12.vi -net.vi -org.vi - -// vn : https://www.dot.vn/vnnic/vnnic/domainregistration.jsp -vn -com.vn -net.vn -org.vn -edu.vn -gov.vn -int.vn -ac.vn -biz.vn -info.vn -name.vn -pro.vn -health.vn - -// vu : https://en.wikipedia.org/wiki/.vu -// http://www.vunic.vu/ -vu -com.vu -edu.vu -net.vu -org.vu - -// wf : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf -wf - -// ws : https://en.wikipedia.org/wiki/.ws -// http://samoanic.ws/index.dhtml -ws -com.ws -net.ws -org.ws -gov.ws -edu.ws - -// yt : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf -yt - -// IDN ccTLDs -// When submitting patches, please maintain a sort by ISO 3166 ccTLD, then -// U-label, and follow this format: -// // A-Label ("", [, variant info]) : -// // [sponsoring org] -// U-Label - -// xn--mgbaam7a8h ("Emerat", Arabic) : AE -// http://nic.ae/english/arabicdomain/rules.jsp -امارات - -// xn--y9a3aq ("hye", Armenian) : AM -// ISOC AM (operated by .am Registry) -հայ - -// xn--54b7fta0cc ("Bangla", Bangla) : BD -বাংলা - -// xn--90ae ("bg", Bulgarian) : BG -бг - -// xn--mgbcpq6gpa1a ("albahrain", Arabic) : BH -البحرين - -// xn--90ais ("bel", Belarusian/Russian Cyrillic) : BY -// Operated by .by registry -бел - -// xn--fiqs8s ("Zhongguo/China", Chinese, Simplified) : CN -// CNNIC -// http://cnnic.cn/html/Dir/2005/10/11/3218.htm -中国 - -// xn--fiqz9s ("Zhongguo/China", Chinese, Traditional) : CN -// CNNIC -// http://cnnic.cn/html/Dir/2005/10/11/3218.htm -中國 - -// xn--lgbbat1ad8j ("Algeria/Al Jazair", Arabic) : DZ -الجزائر - -// xn--wgbh1c ("Egypt/Masr", Arabic) : EG -// http://www.dotmasr.eg/ -مصر - -// xn--e1a4c ("eu", Cyrillic) : EU -// https://eurid.eu -ею - -// xn--qxa6a ("eu", Greek) : EU -// https://eurid.eu -ευ - -// xn--mgbah1a3hjkrd ("Mauritania", Arabic) : MR -موريتانيا - -// xn--node ("ge", Georgian Mkhedruli) : GE -გე - -// xn--qxam ("el", Greek) : GR -// Hellenic Ministry of Infrastructure, Transport, and Networks -ελ - -// xn--j6w193g ("Hong Kong", Chinese) : HK -// https://www.hkirc.hk -// Submitted by registry -// https://www.hkirc.hk/content.jsp?id=30#!/34 -香港 -公司.香港 -教育.香港 -政府.香港 -個人.香港 -網絡.香港 -組織.香港 - -// xn--2scrj9c ("Bharat", Kannada) : IN -// India -ಭಾರತ - -// xn--3hcrj9c ("Bharat", Oriya) : IN -// India -ଭାରତ - -// xn--45br5cyl ("Bharatam", Assamese) : IN -// India -ভাৰত - -// xn--h2breg3eve ("Bharatam", Sanskrit) : IN -// India -भारतम् - -// xn--h2brj9c8c ("Bharot", Santali) : IN -// India -भारोत - -// xn--mgbgu82a ("Bharat", Sindhi) : IN -// India -ڀارت - -// xn--rvc1e0am3e ("Bharatam", Malayalam) : IN -// India -ഭാരതം - -// xn--h2brj9c ("Bharat", Devanagari) : IN -// India -भारत - -// xn--mgbbh1a ("Bharat", Kashmiri) : IN -// India -بارت - -// xn--mgbbh1a71e ("Bharat", Arabic) : IN -// India -بھارت - -// xn--fpcrj9c3d ("Bharat", Telugu) : IN -// India -భారత్ - -// xn--gecrj9c ("Bharat", Gujarati) : IN -// India -ભારત - -// xn--s9brj9c ("Bharat", Gurmukhi) : IN -// India -ਭਾਰਤ - -// xn--45brj9c ("Bharat", Bengali) : IN -// India -ভারত - -// xn--xkc2dl3a5ee0h ("India", Tamil) : IN -// India -இந்தியா - -// xn--mgba3a4f16a ("Iran", Persian) : IR -ایران - -// xn--mgba3a4fra ("Iran", Arabic) : IR -ايران - -// xn--mgbtx2b ("Iraq", Arabic) : IQ -// Communications and Media Commission -عراق - -// xn--mgbayh7gpa ("al-Ordon", Arabic) : JO -// National Information Technology Center (NITC) -// Royal Scientific Society, Al-Jubeiha -الاردن - -// xn--3e0b707e ("Republic of Korea", Hangul) : KR -한국 - -// xn--80ao21a ("Kaz", Kazakh) : KZ -қаз - -// xn--q7ce6a ("Lao", Lao) : LA -ລາວ - -// xn--fzc2c9e2c ("Lanka", Sinhalese-Sinhala) : LK -// https://nic.lk -ලංකා - -// xn--xkc2al3hye2a ("Ilangai", Tamil) : LK -// https://nic.lk -இலங்கை - -// xn--mgbc0a9azcg ("Morocco/al-Maghrib", Arabic) : MA -المغرب - -// xn--d1alf ("mkd", Macedonian) : MK -// MARnet -мкд - -// xn--l1acc ("mon", Mongolian) : MN -мон - -// xn--mix891f ("Macao", Chinese, Traditional) : MO -// MONIC / HNET Asia (Registry Operator for .mo) -澳門 - -// xn--mix082f ("Macao", Chinese, Simplified) : MO -澳门 - -// xn--mgbx4cd0ab ("Malaysia", Malay) : MY -مليسيا - -// xn--mgb9awbf ("Oman", Arabic) : OM -عمان - -// xn--mgbai9azgqp6j ("Pakistan", Urdu/Arabic) : PK -پاکستان - -// xn--mgbai9a5eva00b ("Pakistan", Urdu/Arabic, variant) : PK -پاكستان - -// xn--ygbi2ammx ("Falasteen", Arabic) : PS -// The Palestinian National Internet Naming Authority (PNINA) -// http://www.pnina.ps -فلسطين - -// xn--90a3ac ("srb", Cyrillic) : RS -// https://www.rnids.rs/en/domains/national-domains -срб -пр.срб -орг.срб -обр.срб -од.срб -упр.срб -ак.срб - -// xn--p1ai ("rf", Russian-Cyrillic) : RU -// https://cctld.ru/files/pdf/docs/en/rules_ru-rf.pdf -// Submitted by George Georgievsky -рф - -// xn--wgbl6a ("Qatar", Arabic) : QA -// http://www.ict.gov.qa/ -قطر - -// xn--mgberp4a5d4ar ("AlSaudiah", Arabic) : SA -// http://www.nic.net.sa/ -السعودية - -// xn--mgberp4a5d4a87g ("AlSaudiah", Arabic, variant) : SA -السعودیة - -// xn--mgbqly7c0a67fbc ("AlSaudiah", Arabic, variant) : SA -السعودیۃ - -// xn--mgbqly7cvafr ("AlSaudiah", Arabic, variant) : SA -السعوديه - -// xn--mgbpl2fh ("sudan", Arabic) : SD -// Operated by .sd registry -سودان - -// xn--yfro4i67o Singapore ("Singapore", Chinese) : SG -新加坡 - -// xn--clchc0ea0b2g2a9gcd ("Singapore", Tamil) : SG -சிங்கப்பூர் - -// xn--ogbpf8fl ("Syria", Arabic) : SY -سورية - -// xn--mgbtf8fl ("Syria", Arabic, variant) : SY -سوريا - -// xn--o3cw4h ("Thai", Thai) : TH -// http://www.thnic.co.th -ไทย -ศึกษา.ไทย -ธุรกิจ.ไทย -รัฐบาล.ไทย -ทหาร.ไทย -เน็ต.ไทย -องค์กร.ไทย - -// xn--pgbs0dh ("Tunisia", Arabic) : TN -// http://nic.tn -تونس - -// xn--kpry57d ("Taiwan", Chinese, Traditional) : TW -// http://www.twnic.net/english/dn/dn_07a.htm -台灣 - -// xn--kprw13d ("Taiwan", Chinese, Simplified) : TW -// http://www.twnic.net/english/dn/dn_07a.htm -台湾 - -// xn--nnx388a ("Taiwan", Chinese, variant) : TW -臺灣 - -// xn--j1amh ("ukr", Cyrillic) : UA -укр - -// xn--mgb2ddes ("AlYemen", Arabic) : YE -اليمن - -// xxx : http://icmregistry.com -xxx - -// ye : http://www.y.net.ye/services/domain_name.htm -ye -com.ye -edu.ye -gov.ye -net.ye -mil.ye -org.ye - -// za : https://www.zadna.org.za/content/page/domain-information/ -ac.za -agric.za -alt.za -co.za -edu.za -gov.za -grondar.za -law.za -mil.za -net.za -ngo.za -nic.za -nis.za -nom.za -org.za -school.za -tm.za -web.za - -// zm : https://zicta.zm/ -// Submitted by registry -zm -ac.zm -biz.zm -co.zm -com.zm -edu.zm -gov.zm -info.zm -mil.zm -net.zm -org.zm -sch.zm - -// zw : https://www.potraz.gov.zw/ -// Confirmed by registry 2017-01-25 -zw -ac.zw -co.zw -gov.zw -mil.zw -org.zw - - -// newGTLDs - -// List of new gTLDs imported from https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 2022-03-27T15:13:38Z -// This list is auto-generated, don't edit it manually. -// aaa : 2015-02-26 American Automobile Association, Inc. -aaa - -// aarp : 2015-05-21 AARP -aarp - -// abarth : 2015-07-30 Fiat Chrysler Automobiles N.V. -abarth - -// abb : 2014-10-24 ABB Ltd -abb - -// abbott : 2014-07-24 Abbott Laboratories, Inc. -abbott - -// abbvie : 2015-07-30 AbbVie Inc. -abbvie - -// abc : 2015-07-30 Disney Enterprises, Inc. -abc - -// able : 2015-06-25 Able Inc. -able - -// abogado : 2014-04-24 Registry Services, LLC -abogado - -// abudhabi : 2015-07-30 Abu Dhabi Systems and Information Centre -abudhabi - -// academy : 2013-11-07 Binky Moon, LLC -academy - -// accenture : 2014-08-15 Accenture plc -accenture - -// accountant : 2014-11-20 dot Accountant Limited -accountant - -// accountants : 2014-03-20 Binky Moon, LLC -accountants - -// aco : 2015-01-08 ACO Severin Ahlmann GmbH & Co. KG -aco - -// actor : 2013-12-12 Dog Beach, LLC -actor - -// adac : 2015-07-16 Allgemeiner Deutscher Automobil-Club e.V. (ADAC) -adac - -// ads : 2014-12-04 Charleston Road Registry Inc. -ads - -// adult : 2014-10-16 ICM Registry AD LLC -adult - -// aeg : 2015-03-19 Aktiebolaget Electrolux -aeg - -// aetna : 2015-05-21 Aetna Life Insurance Company -aetna - -// afl : 2014-10-02 Australian Football League -afl - -// africa : 2014-03-24 ZA Central Registry NPC trading as Registry.Africa -africa - -// agakhan : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation) -agakhan - -// agency : 2013-11-14 Binky Moon, LLC -agency - -// aig : 2014-12-18 American International Group, Inc. -aig - -// airbus : 2015-07-30 Airbus S.A.S. -airbus - -// airforce : 2014-03-06 Dog Beach, LLC -airforce - -// airtel : 2014-10-24 Bharti Airtel Limited -airtel - -// akdn : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation) -akdn - -// alfaromeo : 2015-07-31 Fiat Chrysler Automobiles N.V. -alfaromeo - -// alibaba : 2015-01-15 Alibaba Group Holding Limited -alibaba - -// alipay : 2015-01-15 Alibaba Group Holding Limited -alipay - -// allfinanz : 2014-07-03 Allfinanz Deutsche Vermögensberatung Aktiengesellschaft -allfinanz - -// allstate : 2015-07-31 Allstate Fire and Casualty Insurance Company -allstate - -// ally : 2015-06-18 Ally Financial Inc. -ally - -// alsace : 2014-07-02 Region Grand Est -alsace - -// alstom : 2015-07-30 ALSTOM -alstom - -// amazon : 2019-12-19 Amazon Registry Services, Inc. -amazon - -// americanexpress : 2015-07-31 American Express Travel Related Services Company, Inc. -americanexpress - -// americanfamily : 2015-07-23 AmFam, Inc. -americanfamily - -// amex : 2015-07-31 American Express Travel Related Services Company, Inc. -amex - -// amfam : 2015-07-23 AmFam, Inc. -amfam - -// amica : 2015-05-28 Amica Mutual Insurance Company -amica - -// amsterdam : 2014-07-24 Gemeente Amsterdam -amsterdam - -// analytics : 2014-12-18 Campus IP LLC -analytics - -// android : 2014-08-07 Charleston Road Registry Inc. -android - -// anquan : 2015-01-08 Beijing Qihu Keji Co., Ltd. -anquan - -// anz : 2015-07-31 Australia and New Zealand Banking Group Limited -anz - -// aol : 2015-09-17 Oath Inc. -aol - -// apartments : 2014-12-11 Binky Moon, LLC -apartments - -// app : 2015-05-14 Charleston Road Registry Inc. -app - -// apple : 2015-05-14 Apple Inc. -apple - -// aquarelle : 2014-07-24 Aquarelle.com -aquarelle - -// arab : 2015-11-12 League of Arab States -arab - -// aramco : 2014-11-20 Aramco Services Company -aramco - -// archi : 2014-02-06 Afilias Limited -archi - -// army : 2014-03-06 Dog Beach, LLC -army - -// art : 2016-03-24 UK Creative Ideas Limited -art - -// arte : 2014-12-11 Association Relative à la Télévision Européenne G.E.I.E. -arte - -// asda : 2015-07-31 Wal-Mart Stores, Inc. -asda - -// associates : 2014-03-06 Binky Moon, LLC -associates - -// athleta : 2015-07-30 The Gap, Inc. -athleta - -// attorney : 2014-03-20 Dog Beach, LLC -attorney - -// auction : 2014-03-20 Dog Beach, LLC -auction - -// audi : 2015-05-21 AUDI Aktiengesellschaft -audi - -// audible : 2015-06-25 Amazon Registry Services, Inc. -audible - -// audio : 2014-03-20 XYZ.COM LLC -audio - -// auspost : 2015-08-13 Australian Postal Corporation -auspost - -// author : 2014-12-18 Amazon Registry Services, Inc. -author - -// auto : 2014-11-13 XYZ.COM LLC -auto - -// autos : 2014-01-09 XYZ.COM LLC -autos - -// avianca : 2015-01-08 Avianca Holdings S.A. -avianca - -// aws : 2015-06-25 AWS Registry LLC -aws - -// axa : 2013-12-19 AXA Group Operations SAS -axa - -// azure : 2014-12-18 Microsoft Corporation -azure - -// baby : 2015-04-09 XYZ.COM LLC -baby - -// baidu : 2015-01-08 Baidu, Inc. -baidu - -// banamex : 2015-07-30 Citigroup Inc. -banamex - -// bananarepublic : 2015-07-31 The Gap, Inc. -bananarepublic - -// band : 2014-06-12 Dog Beach, LLC -band - -// bank : 2014-09-25 fTLD Registry Services LLC -bank - -// bar : 2013-12-12 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable -bar - -// barcelona : 2014-07-24 Municipi de Barcelona -barcelona - -// barclaycard : 2014-11-20 Barclays Bank PLC -barclaycard - -// barclays : 2014-11-20 Barclays Bank PLC -barclays - -// barefoot : 2015-06-11 Gallo Vineyards, Inc. -barefoot - -// bargains : 2013-11-14 Binky Moon, LLC -bargains - -// baseball : 2015-10-29 MLB Advanced Media DH, LLC -baseball - -// basketball : 2015-08-20 Fédération Internationale de Basketball (FIBA) -basketball - -// bauhaus : 2014-04-17 Werkhaus GmbH -bauhaus - -// bayern : 2014-01-23 Bayern Connect GmbH -bayern - -// bbc : 2014-12-18 British Broadcasting Corporation -bbc - -// bbt : 2015-07-23 BB&T Corporation -bbt - -// bbva : 2014-10-02 BANCO BILBAO VIZCAYA ARGENTARIA, S.A. -bbva - -// bcg : 2015-04-02 The Boston Consulting Group, Inc. -bcg - -// bcn : 2014-07-24 Municipi de Barcelona -bcn - -// beats : 2015-05-14 Beats Electronics, LLC -beats - -// beauty : 2015-12-03 XYZ.COM LLC -beauty - -// beer : 2014-01-09 Registry Services, LLC -beer - -// bentley : 2014-12-18 Bentley Motors Limited -bentley - -// berlin : 2013-10-31 dotBERLIN GmbH & Co. KG -berlin - -// best : 2013-12-19 BestTLD Pty Ltd -best - -// bestbuy : 2015-07-31 BBY Solutions, Inc. -bestbuy - -// bet : 2015-05-07 Afilias Limited -bet - -// bharti : 2014-01-09 Bharti Enterprises (Holding) Private Limited -bharti - -// bible : 2014-06-19 American Bible Society -bible - -// bid : 2013-12-19 dot Bid Limited -bid - -// bike : 2013-08-27 Binky Moon, LLC -bike - -// bing : 2014-12-18 Microsoft Corporation -bing - -// bingo : 2014-12-04 Binky Moon, LLC -bingo - -// bio : 2014-03-06 Afilias Limited -bio - -// black : 2014-01-16 Afilias Limited -black - -// blackfriday : 2014-01-16 UNR Corp. -blackfriday - -// blockbuster : 2015-07-30 Dish DBS Corporation -blockbuster - -// blog : 2015-05-14 Knock Knock WHOIS There, LLC -blog - -// bloomberg : 2014-07-17 Bloomberg IP Holdings LLC -bloomberg - -// blue : 2013-11-07 Afilias Limited -blue - -// bms : 2014-10-30 Bristol-Myers Squibb Company -bms - -// bmw : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft -bmw - -// bnpparibas : 2014-05-29 BNP Paribas -bnpparibas - -// boats : 2014-12-04 XYZ.COM LLC -boats - -// boehringer : 2015-07-09 Boehringer Ingelheim International GmbH -boehringer - -// bofa : 2015-07-31 Bank of America Corporation -bofa - -// bom : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br -bom - -// bond : 2014-06-05 ShortDot SA -bond - -// boo : 2014-01-30 Charleston Road Registry Inc. -boo - -// book : 2015-08-27 Amazon Registry Services, Inc. -book - -// booking : 2015-07-16 Booking.com B.V. -booking - -// bosch : 2015-06-18 Robert Bosch GMBH -bosch - -// bostik : 2015-05-28 Bostik SA -bostik - -// boston : 2015-12-10 Registry Services, LLC -boston - -// bot : 2014-12-18 Amazon Registry Services, Inc. -bot - -// boutique : 2013-11-14 Binky Moon, LLC -boutique - -// box : 2015-11-12 Intercap Registry Inc. -box - -// bradesco : 2014-12-18 Banco Bradesco S.A. -bradesco - -// bridgestone : 2014-12-18 Bridgestone Corporation -bridgestone - -// broadway : 2014-12-22 Celebrate Broadway, Inc. -broadway - -// broker : 2014-12-11 Dog Beach, LLC -broker - -// brother : 2015-01-29 Brother Industries, Ltd. -brother - -// brussels : 2014-02-06 DNS.be vzw -brussels - -// bugatti : 2015-07-23 Bugatti International SA -bugatti - -// build : 2013-11-07 Plan Bee LLC -build - -// builders : 2013-11-07 Binky Moon, LLC -builders - -// business : 2013-11-07 Binky Moon, LLC -business - -// buy : 2014-12-18 Amazon Registry Services, Inc. -buy - -// buzz : 2013-10-02 DOTSTRATEGY CO. -buzz - -// bzh : 2014-02-27 Association www.bzh -bzh - -// cab : 2013-10-24 Binky Moon, LLC -cab - -// cafe : 2015-02-11 Binky Moon, LLC -cafe - -// cal : 2014-07-24 Charleston Road Registry Inc. -cal - -// call : 2014-12-18 Amazon Registry Services, Inc. -call - -// calvinklein : 2015-07-30 PVH gTLD Holdings LLC -calvinklein - -// cam : 2016-04-21 Cam Connecting SARL -cam - -// camera : 2013-08-27 Binky Moon, LLC -camera - -// camp : 2013-11-07 Binky Moon, LLC -camp - -// cancerresearch : 2014-05-15 Australian Cancer Research Foundation -cancerresearch - -// canon : 2014-09-12 Canon Inc. -canon - -// capetown : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry -capetown - -// capital : 2014-03-06 Binky Moon, LLC -capital - -// capitalone : 2015-08-06 Capital One Financial Corporation -capitalone - -// car : 2015-01-22 XYZ.COM LLC -car - -// caravan : 2013-12-12 Caravan International, Inc. -caravan - -// cards : 2013-12-05 Binky Moon, LLC -cards - -// care : 2014-03-06 Binky Moon, LLC -care - -// career : 2013-10-09 dotCareer LLC -career - -// careers : 2013-10-02 Binky Moon, LLC -careers - -// cars : 2014-11-13 XYZ.COM LLC -cars - -// casa : 2013-11-21 Registry Services, LLC -casa - -// case : 2015-09-03 Helium TLDs Ltd -case - -// cash : 2014-03-06 Binky Moon, LLC -cash - -// casino : 2014-12-18 Binky Moon, LLC -casino - -// catering : 2013-12-05 Binky Moon, LLC -catering - -// catholic : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) -catholic - -// cba : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA -cba - -// cbn : 2014-08-22 The Christian Broadcasting Network, Inc. -cbn - -// cbre : 2015-07-02 CBRE, Inc. -cbre - -// cbs : 2015-08-06 CBS Domains Inc. -cbs - -// center : 2013-11-07 Binky Moon, LLC -center - -// ceo : 2013-11-07 CEOTLD Pty Ltd -ceo - -// cern : 2014-06-05 European Organization for Nuclear Research ("CERN") -cern - -// cfa : 2014-08-28 CFA Institute -cfa - -// cfd : 2014-12-11 ShortDot SA -cfd - -// chanel : 2015-04-09 Chanel International B.V. -chanel - -// channel : 2014-05-08 Charleston Road Registry Inc. -channel - -// charity : 2018-04-11 Binky Moon, LLC -charity - -// chase : 2015-04-30 JPMorgan Chase Bank, National Association -chase - -// chat : 2014-12-04 Binky Moon, LLC -chat - -// cheap : 2013-11-14 Binky Moon, LLC -cheap - -// chintai : 2015-06-11 CHINTAI Corporation -chintai - -// christmas : 2013-11-21 XYZ.COM LLC -christmas - -// chrome : 2014-07-24 Charleston Road Registry Inc. -chrome - -// church : 2014-02-06 Binky Moon, LLC -church - -// cipriani : 2015-02-19 Hotel Cipriani Srl -cipriani - -// circle : 2014-12-18 Amazon Registry Services, Inc. -circle - -// cisco : 2014-12-22 Cisco Technology, Inc. -cisco - -// citadel : 2015-07-23 Citadel Domain LLC -citadel - -// citi : 2015-07-30 Citigroup Inc. -citi - -// citic : 2014-01-09 CITIC Group Corporation -citic - -// city : 2014-05-29 Binky Moon, LLC -city - -// cityeats : 2014-12-11 Lifestyle Domain Holdings, Inc. -cityeats - -// claims : 2014-03-20 Binky Moon, LLC -claims - -// cleaning : 2013-12-05 Binky Moon, LLC -cleaning - -// click : 2014-06-05 UNR Corp. -click - -// clinic : 2014-03-20 Binky Moon, LLC -clinic - -// clinique : 2015-10-01 The Estée Lauder Companies Inc. -clinique - -// clothing : 2013-08-27 Binky Moon, LLC -clothing - -// cloud : 2015-04-16 Aruba PEC S.p.A. -cloud - -// club : 2013-11-08 Registry Services, LLC -club - -// clubmed : 2015-06-25 Club Méditerranée S.A. -clubmed - -// coach : 2014-10-09 Binky Moon, LLC -coach - -// codes : 2013-10-31 Binky Moon, LLC -codes - -// coffee : 2013-10-17 Binky Moon, LLC -coffee - -// college : 2014-01-16 XYZ.COM LLC -college - -// cologne : 2014-02-05 dotKoeln GmbH -cologne - -// comcast : 2015-07-23 Comcast IP Holdings I, LLC -comcast - -// commbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA -commbank - -// community : 2013-12-05 Binky Moon, LLC -community - -// company : 2013-11-07 Binky Moon, LLC -company - -// compare : 2015-10-08 Registry Services, LLC -compare - -// computer : 2013-10-24 Binky Moon, LLC -computer - -// comsec : 2015-01-08 VeriSign, Inc. -comsec - -// condos : 2013-12-05 Binky Moon, LLC -condos - -// construction : 2013-09-16 Binky Moon, LLC -construction - -// consulting : 2013-12-05 Dog Beach, LLC -consulting - -// contact : 2015-01-08 Dog Beach, LLC -contact - -// contractors : 2013-09-10 Binky Moon, LLC -contractors - -// cooking : 2013-11-21 Registry Services, LLC -cooking - -// cookingchannel : 2015-07-02 Lifestyle Domain Holdings, Inc. -cookingchannel - -// cool : 2013-11-14 Binky Moon, LLC -cool - -// corsica : 2014-09-25 Collectivité de Corse -corsica - -// country : 2013-12-19 DotCountry LLC -country - -// coupon : 2015-02-26 Amazon Registry Services, Inc. -coupon - -// coupons : 2015-03-26 Binky Moon, LLC -coupons - -// courses : 2014-12-04 OPEN UNIVERSITIES AUSTRALIA PTY LTD -courses - -// cpa : 2019-06-10 American Institute of Certified Public Accountants -cpa - -// credit : 2014-03-20 Binky Moon, LLC -credit - -// creditcard : 2014-03-20 Binky Moon, LLC -creditcard - -// creditunion : 2015-01-22 DotCooperation LLC -creditunion - -// cricket : 2014-10-09 dot Cricket Limited -cricket - -// crown : 2014-10-24 Crown Equipment Corporation -crown - -// crs : 2014-04-03 Federated Co-operatives Limited -crs - -// cruise : 2015-12-10 Viking River Cruises (Bermuda) Ltd. -cruise - -// cruises : 2013-12-05 Binky Moon, LLC -cruises - -// cuisinella : 2014-04-03 SCHMIDT GROUPE S.A.S. -cuisinella - -// cymru : 2014-05-08 Nominet UK -cymru - -// cyou : 2015-01-22 ShortDot SA -cyou - -// dabur : 2014-02-06 Dabur India Limited -dabur - -// dad : 2014-01-23 Charleston Road Registry Inc. -dad - -// dance : 2013-10-24 Dog Beach, LLC -dance - -// data : 2016-06-02 Dish DBS Corporation -data - -// date : 2014-11-20 dot Date Limited -date - -// dating : 2013-12-05 Binky Moon, LLC -dating - -// datsun : 2014-03-27 NISSAN MOTOR CO., LTD. -datsun - -// day : 2014-01-30 Charleston Road Registry Inc. -day - -// dclk : 2014-11-20 Charleston Road Registry Inc. -dclk - -// dds : 2015-05-07 Registry Services, LLC -dds - -// deal : 2015-06-25 Amazon Registry Services, Inc. -deal - -// dealer : 2014-12-22 Intercap Registry Inc. -dealer - -// deals : 2014-05-22 Binky Moon, LLC -deals - -// degree : 2014-03-06 Dog Beach, LLC -degree - -// delivery : 2014-09-11 Binky Moon, LLC -delivery - -// dell : 2014-10-24 Dell Inc. -dell - -// deloitte : 2015-07-31 Deloitte Touche Tohmatsu -deloitte - -// delta : 2015-02-19 Delta Air Lines, Inc. -delta - -// democrat : 2013-10-24 Dog Beach, LLC -democrat - -// dental : 2014-03-20 Binky Moon, LLC -dental - -// dentist : 2014-03-20 Dog Beach, LLC -dentist - -// desi : 2013-11-14 Desi Networks LLC -desi - -// design : 2014-11-07 Registry Services, LLC -design - -// dev : 2014-10-16 Charleston Road Registry Inc. -dev - -// dhl : 2015-07-23 Deutsche Post AG -dhl - -// diamonds : 2013-09-22 Binky Moon, LLC -diamonds - -// diet : 2014-06-26 XYZ.COM LLC -diet - -// digital : 2014-03-06 Binky Moon, LLC -digital - -// direct : 2014-04-10 Binky Moon, LLC -direct - -// directory : 2013-09-20 Binky Moon, LLC -directory - -// discount : 2014-03-06 Binky Moon, LLC -discount - -// discover : 2015-07-23 Discover Financial Services -discover - -// dish : 2015-07-30 Dish DBS Corporation -dish - -// diy : 2015-11-05 Lifestyle Domain Holdings, Inc. -diy - -// dnp : 2013-12-13 Dai Nippon Printing Co., Ltd. -dnp - -// docs : 2014-10-16 Charleston Road Registry Inc. -docs - -// doctor : 2016-06-02 Binky Moon, LLC -doctor - -// dog : 2014-12-04 Binky Moon, LLC -dog - -// domains : 2013-10-17 Binky Moon, LLC -domains - -// dot : 2015-05-21 Dish DBS Corporation -dot - -// download : 2014-11-20 dot Support Limited -download - -// drive : 2015-03-05 Charleston Road Registry Inc. -drive - -// dtv : 2015-06-04 Dish DBS Corporation -dtv - -// dubai : 2015-01-01 Dubai Smart Government Department -dubai - -// dunlop : 2015-07-02 The Goodyear Tire & Rubber Company -dunlop - -// dupont : 2015-06-25 DuPont Specialty Products USA, LLC -dupont - -// durban : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry -durban - -// dvag : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG -dvag - -// dvr : 2016-05-26 DISH Technologies L.L.C. -dvr - -// earth : 2014-12-04 Interlink Co., Ltd. -earth - -// eat : 2014-01-23 Charleston Road Registry Inc. -eat - -// eco : 2016-07-08 Big Room Inc. -eco - -// edeka : 2014-12-18 EDEKA Verband kaufmännischer Genossenschaften e.V. -edeka - -// education : 2013-11-07 Binky Moon, LLC -education - -// email : 2013-10-31 Binky Moon, LLC -email - -// emerck : 2014-04-03 Merck KGaA -emerck - -// energy : 2014-09-11 Binky Moon, LLC -energy - -// engineer : 2014-03-06 Dog Beach, LLC -engineer - -// engineering : 2014-03-06 Binky Moon, LLC -engineering - -// enterprises : 2013-09-20 Binky Moon, LLC -enterprises - -// epson : 2014-12-04 Seiko Epson Corporation -epson - -// equipment : 2013-08-27 Binky Moon, LLC -equipment - -// ericsson : 2015-07-09 Telefonaktiebolaget L M Ericsson -ericsson - -// erni : 2014-04-03 ERNI Group Holding AG -erni - -// esq : 2014-05-08 Charleston Road Registry Inc. -esq - -// estate : 2013-08-27 Binky Moon, LLC -estate - -// etisalat : 2015-09-03 Emirates Telecommunications Corporation (trading as Etisalat) -etisalat - -// eurovision : 2014-04-24 European Broadcasting Union (EBU) -eurovision - -// eus : 2013-12-12 Puntueus Fundazioa -eus - -// events : 2013-12-05 Binky Moon, LLC -events - -// exchange : 2014-03-06 Binky Moon, LLC -exchange - -// expert : 2013-11-21 Binky Moon, LLC -expert - -// exposed : 2013-12-05 Binky Moon, LLC -exposed - -// express : 2015-02-11 Binky Moon, LLC -express - -// extraspace : 2015-05-14 Extra Space Storage LLC -extraspace - -// fage : 2014-12-18 Fage International S.A. -fage - -// fail : 2014-03-06 Binky Moon, LLC -fail - -// fairwinds : 2014-11-13 FairWinds Partners, LLC -fairwinds - -// faith : 2014-11-20 dot Faith Limited -faith - -// family : 2015-04-02 Dog Beach, LLC -family - -// fan : 2014-03-06 Dog Beach, LLC -fan - -// fans : 2014-11-07 ZDNS International Limited -fans - -// farm : 2013-11-07 Binky Moon, LLC -farm - -// farmers : 2015-07-09 Farmers Insurance Exchange -farmers - -// fashion : 2014-07-03 Registry Services, LLC -fashion - -// fast : 2014-12-18 Amazon Registry Services, Inc. -fast - -// fedex : 2015-08-06 Federal Express Corporation -fedex - -// feedback : 2013-12-19 Top Level Spectrum, Inc. -feedback - -// ferrari : 2015-07-31 Fiat Chrysler Automobiles N.V. -ferrari - -// ferrero : 2014-12-18 Ferrero Trading Lux S.A. -ferrero - -// fiat : 2015-07-31 Fiat Chrysler Automobiles N.V. -fiat - -// fidelity : 2015-07-30 Fidelity Brokerage Services LLC -fidelity - -// fido : 2015-08-06 Rogers Communications Canada Inc. -fido - -// film : 2015-01-08 Motion Picture Domain Registry Pty Ltd -film - -// final : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br -final - -// finance : 2014-03-20 Binky Moon, LLC -finance - -// financial : 2014-03-06 Binky Moon, LLC -financial - -// fire : 2015-06-25 Amazon Registry Services, Inc. -fire - -// firestone : 2014-12-18 Bridgestone Licensing Services, Inc -firestone - -// firmdale : 2014-03-27 Firmdale Holdings Limited -firmdale - -// fish : 2013-12-12 Binky Moon, LLC -fish - -// fishing : 2013-11-21 Registry Services, LLC -fishing - -// fit : 2014-11-07 Registry Services, LLC -fit - -// fitness : 2014-03-06 Binky Moon, LLC -fitness - -// flickr : 2015-04-02 Flickr, Inc. -flickr - -// flights : 2013-12-05 Binky Moon, LLC -flights - -// flir : 2015-07-23 FLIR Systems, Inc. -flir - -// florist : 2013-11-07 Binky Moon, LLC -florist - -// flowers : 2014-10-09 XYZ.COM LLC -flowers - -// fly : 2014-05-08 Charleston Road Registry Inc. -fly - -// foo : 2014-01-23 Charleston Road Registry Inc. -foo - -// food : 2016-04-21 Lifestyle Domain Holdings, Inc. -food - -// foodnetwork : 2015-07-02 Lifestyle Domain Holdings, Inc. -foodnetwork - -// football : 2014-12-18 Binky Moon, LLC -football - -// ford : 2014-11-13 Ford Motor Company -ford - -// forex : 2014-12-11 Dog Beach, LLC -forex - -// forsale : 2014-05-22 Dog Beach, LLC -forsale - -// forum : 2015-04-02 Fegistry, LLC -forum - -// foundation : 2013-12-05 Binky Moon, LLC -foundation - -// fox : 2015-09-11 FOX Registry, LLC -fox - -// free : 2015-12-10 Amazon Registry Services, Inc. -free - -// fresenius : 2015-07-30 Fresenius Immobilien-Verwaltungs-GmbH -fresenius - -// frl : 2014-05-15 FRLregistry B.V. -frl - -// frogans : 2013-12-19 OP3FT -frogans - -// frontdoor : 2015-07-02 Lifestyle Domain Holdings, Inc. -frontdoor - -// frontier : 2015-02-05 Frontier Communications Corporation -frontier - -// ftr : 2015-07-16 Frontier Communications Corporation -ftr - -// fujitsu : 2015-07-30 Fujitsu Limited -fujitsu - -// fun : 2016-01-14 Radix FZC -fun - -// fund : 2014-03-20 Binky Moon, LLC -fund - -// furniture : 2014-03-20 Binky Moon, LLC -furniture - -// futbol : 2013-09-20 Dog Beach, LLC -futbol - -// fyi : 2015-04-02 Binky Moon, LLC -fyi - -// gal : 2013-11-07 Asociación puntoGAL -gal - -// gallery : 2013-09-13 Binky Moon, LLC -gallery - -// gallo : 2015-06-11 Gallo Vineyards, Inc. -gallo - -// gallup : 2015-02-19 Gallup, Inc. -gallup - -// game : 2015-05-28 XYZ.COM LLC -game - -// games : 2015-05-28 Dog Beach, LLC -games - -// gap : 2015-07-31 The Gap, Inc. -gap - -// garden : 2014-06-26 Registry Services, LLC -garden - -// gay : 2019-05-23 Top Level Design, LLC -gay - -// gbiz : 2014-07-17 Charleston Road Registry Inc. -gbiz - -// gdn : 2014-07-31 Joint Stock Company "Navigation-information systems" -gdn - -// gea : 2014-12-04 GEA Group Aktiengesellschaft -gea - -// gent : 2014-01-23 COMBELL NV -gent - -// genting : 2015-03-12 Resorts World Inc Pte. Ltd. -genting - -// george : 2015-07-31 Wal-Mart Stores, Inc. -george - -// ggee : 2014-01-09 GMO Internet, Inc. -ggee - -// gift : 2013-10-17 DotGift, LLC -gift - -// gifts : 2014-07-03 Binky Moon, LLC -gifts - -// gives : 2014-03-06 Dog Beach, LLC -gives - -// giving : 2014-11-13 Giving Limited -giving - -// glass : 2013-11-07 Binky Moon, LLC -glass - -// gle : 2014-07-24 Charleston Road Registry Inc. -gle - -// global : 2014-04-17 Dot Global Domain Registry Limited -global - -// globo : 2013-12-19 Globo Comunicação e Participações S.A -globo - -// gmail : 2014-05-01 Charleston Road Registry Inc. -gmail - -// gmbh : 2016-01-29 Binky Moon, LLC -gmbh - -// gmo : 2014-01-09 GMO Internet, Inc. -gmo - -// gmx : 2014-04-24 1&1 Mail & Media GmbH -gmx - -// godaddy : 2015-07-23 Go Daddy East, LLC -godaddy - -// gold : 2015-01-22 Binky Moon, LLC -gold - -// goldpoint : 2014-11-20 YODOBASHI CAMERA CO.,LTD. -goldpoint - -// golf : 2014-12-18 Binky Moon, LLC -golf - -// goo : 2014-12-18 NTT Resonant Inc. -goo - -// goodyear : 2015-07-02 The Goodyear Tire & Rubber Company -goodyear - -// goog : 2014-11-20 Charleston Road Registry Inc. -goog - -// google : 2014-07-24 Charleston Road Registry Inc. -google - -// gop : 2014-01-16 Republican State Leadership Committee, Inc. -gop - -// got : 2014-12-18 Amazon Registry Services, Inc. -got - -// grainger : 2015-05-07 Grainger Registry Services, LLC -grainger - -// graphics : 2013-09-13 Binky Moon, LLC -graphics - -// gratis : 2014-03-20 Binky Moon, LLC -gratis - -// green : 2014-05-08 Afilias Limited -green - -// gripe : 2014-03-06 Binky Moon, LLC -gripe - -// grocery : 2016-06-16 Wal-Mart Stores, Inc. -grocery - -// group : 2014-08-15 Binky Moon, LLC -group - -// guardian : 2015-07-30 The Guardian Life Insurance Company of America -guardian - -// gucci : 2014-11-13 Guccio Gucci S.p.a. -gucci - -// guge : 2014-08-28 Charleston Road Registry Inc. -guge - -// guide : 2013-09-13 Binky Moon, LLC -guide - -// guitars : 2013-11-14 XYZ.COM LLC -guitars - -// guru : 2013-08-27 Binky Moon, LLC -guru - -// hair : 2015-12-03 XYZ.COM LLC -hair - -// hamburg : 2014-02-20 Hamburg Top-Level-Domain GmbH -hamburg - -// hangout : 2014-11-13 Charleston Road Registry Inc. -hangout - -// haus : 2013-12-05 Dog Beach, LLC -haus - -// hbo : 2015-07-30 HBO Registry Services, Inc. -hbo - -// hdfc : 2015-07-30 HOUSING DEVELOPMENT FINANCE CORPORATION LIMITED -hdfc - -// hdfcbank : 2015-02-12 HDFC Bank Limited -hdfcbank - -// health : 2015-02-11 DotHealth, LLC -health - -// healthcare : 2014-06-12 Binky Moon, LLC -healthcare - -// help : 2014-06-26 UNR Corp. -help - -// helsinki : 2015-02-05 City of Helsinki -helsinki - -// here : 2014-02-06 Charleston Road Registry Inc. -here - -// hermes : 2014-07-10 HERMES INTERNATIONAL -hermes - -// hgtv : 2015-07-02 Lifestyle Domain Holdings, Inc. -hgtv - -// hiphop : 2014-03-06 Dot Hip Hop, LLC -hiphop - -// hisamitsu : 2015-07-16 Hisamitsu Pharmaceutical Co.,Inc. -hisamitsu - -// hitachi : 2014-10-31 Hitachi, Ltd. -hitachi - -// hiv : 2014-03-13 UNR Corp. -hiv - -// hkt : 2015-05-14 PCCW-HKT DataCom Services Limited -hkt - -// hockey : 2015-03-19 Binky Moon, LLC -hockey - -// holdings : 2013-08-27 Binky Moon, LLC -holdings - -// holiday : 2013-11-07 Binky Moon, LLC -holiday - -// homedepot : 2015-04-02 Home Depot Product Authority, LLC -homedepot - -// homegoods : 2015-07-16 The TJX Companies, Inc. -homegoods - -// homes : 2014-01-09 XYZ.COM LLC -homes - -// homesense : 2015-07-16 The TJX Companies, Inc. -homesense - -// honda : 2014-12-18 Honda Motor Co., Ltd. -honda - -// horse : 2013-11-21 Registry Services, LLC -horse - -// hospital : 2016-10-20 Binky Moon, LLC -hospital - -// host : 2014-04-17 Radix FZC -host - -// hosting : 2014-05-29 XYZ.COM LLC -hosting - -// hot : 2015-08-27 Amazon Registry Services, Inc. -hot - -// hoteles : 2015-03-05 Travel Reservations SRL -hoteles - -// hotels : 2016-04-07 Booking.com B.V. -hotels - -// hotmail : 2014-12-18 Microsoft Corporation -hotmail - -// house : 2013-11-07 Binky Moon, LLC -house - -// how : 2014-01-23 Charleston Road Registry Inc. -how - -// hsbc : 2014-10-24 HSBC Global Services (UK) Limited -hsbc - -// hughes : 2015-07-30 Hughes Satellite Systems Corporation -hughes - -// hyatt : 2015-07-30 Hyatt GTLD, L.L.C. -hyatt - -// hyundai : 2015-07-09 Hyundai Motor Company -hyundai - -// ibm : 2014-07-31 International Business Machines Corporation -ibm - -// icbc : 2015-02-19 Industrial and Commercial Bank of China Limited -icbc - -// ice : 2014-10-30 IntercontinentalExchange, Inc. -ice - -// icu : 2015-01-08 ShortDot SA -icu - -// ieee : 2015-07-23 IEEE Global LLC -ieee - -// ifm : 2014-01-30 ifm electronic gmbh -ifm - -// ikano : 2015-07-09 Ikano S.A. -ikano - -// imamat : 2015-08-06 Fondation Aga Khan (Aga Khan Foundation) -imamat - -// imdb : 2015-06-25 Amazon Registry Services, Inc. -imdb - -// immo : 2014-07-10 Binky Moon, LLC -immo - -// immobilien : 2013-11-07 Dog Beach, LLC -immobilien - -// inc : 2018-03-10 Intercap Registry Inc. -inc - -// industries : 2013-12-05 Binky Moon, LLC -industries - -// infiniti : 2014-03-27 NISSAN MOTOR CO., LTD. -infiniti - -// ing : 2014-01-23 Charleston Road Registry Inc. -ing - -// ink : 2013-12-05 Top Level Design, LLC -ink - -// institute : 2013-11-07 Binky Moon, LLC -institute - -// insurance : 2015-02-19 fTLD Registry Services LLC -insurance - -// insure : 2014-03-20 Binky Moon, LLC -insure - -// international : 2013-11-07 Binky Moon, LLC -international - -// intuit : 2015-07-30 Intuit Administrative Services, Inc. -intuit - -// investments : 2014-03-20 Binky Moon, LLC -investments - -// ipiranga : 2014-08-28 Ipiranga Produtos de Petroleo S.A. -ipiranga - -// irish : 2014-08-07 Binky Moon, LLC -irish - -// ismaili : 2015-08-06 Fondation Aga Khan (Aga Khan Foundation) -ismaili - -// ist : 2014-08-28 Istanbul Metropolitan Municipality -ist - -// istanbul : 2014-08-28 Istanbul Metropolitan Municipality -istanbul - -// itau : 2014-10-02 Itau Unibanco Holding S.A. -itau - -// itv : 2015-07-09 ITV Services Limited -itv - -// jaguar : 2014-11-13 Jaguar Land Rover Ltd -jaguar - -// java : 2014-06-19 Oracle Corporation -java - -// jcb : 2014-11-20 JCB Co., Ltd. -jcb - -// jeep : 2015-07-30 FCA US LLC. -jeep - -// jetzt : 2014-01-09 Binky Moon, LLC -jetzt - -// jewelry : 2015-03-05 Binky Moon, LLC -jewelry - -// jio : 2015-04-02 Reliance Industries Limited -jio - -// jll : 2015-04-02 Jones Lang LaSalle Incorporated -jll - -// jmp : 2015-03-26 Matrix IP LLC -jmp - -// jnj : 2015-06-18 Johnson & Johnson Services, Inc. -jnj - -// joburg : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry -joburg - -// jot : 2014-12-18 Amazon Registry Services, Inc. -jot - -// joy : 2014-12-18 Amazon Registry Services, Inc. -joy - -// jpmorgan : 2015-04-30 JPMorgan Chase Bank, National Association -jpmorgan - -// jprs : 2014-09-18 Japan Registry Services Co., Ltd. -jprs - -// juegos : 2014-03-20 UNR Corp. -juegos - -// juniper : 2015-07-30 JUNIPER NETWORKS, INC. -juniper - -// kaufen : 2013-11-07 Dog Beach, LLC -kaufen - -// kddi : 2014-09-12 KDDI CORPORATION -kddi - -// kerryhotels : 2015-04-30 Kerry Trading Co. Limited -kerryhotels - -// kerrylogistics : 2015-04-09 Kerry Trading Co. Limited -kerrylogistics - -// kerryproperties : 2015-04-09 Kerry Trading Co. Limited -kerryproperties - -// kfh : 2014-12-04 Kuwait Finance House -kfh - -// kia : 2015-07-09 KIA MOTORS CORPORATION -kia - -// kids : 2021-08-13 DotKids Foundation Limited -kids - -// kim : 2013-09-23 Afilias Limited -kim - -// kinder : 2014-11-07 Ferrero Trading Lux S.A. -kinder - -// kindle : 2015-06-25 Amazon Registry Services, Inc. -kindle - -// kitchen : 2013-09-20 Binky Moon, LLC -kitchen - -// kiwi : 2013-09-20 DOT KIWI LIMITED -kiwi - -// koeln : 2014-01-09 dotKoeln GmbH -koeln - -// komatsu : 2015-01-08 Komatsu Ltd. -komatsu - -// kosher : 2015-08-20 Kosher Marketing Assets LLC -kosher - -// kpmg : 2015-04-23 KPMG International Cooperative (KPMG International Genossenschaft) -kpmg - -// kpn : 2015-01-08 Koninklijke KPN N.V. -kpn - -// krd : 2013-12-05 KRG Department of Information Technology -krd - -// kred : 2013-12-19 KredTLD Pty Ltd -kred - -// kuokgroup : 2015-04-09 Kerry Trading Co. Limited -kuokgroup - -// kyoto : 2014-11-07 Academic Institution: Kyoto Jyoho Gakuen -kyoto - -// lacaixa : 2014-01-09 Fundación Bancaria Caixa d’Estalvis i Pensions de Barcelona, “la Caixa” -lacaixa - -// lamborghini : 2015-06-04 Automobili Lamborghini S.p.A. -lamborghini - -// lamer : 2015-10-01 The Estée Lauder Companies Inc. -lamer - -// lancaster : 2015-02-12 LANCASTER -lancaster - -// lancia : 2015-07-31 Fiat Chrysler Automobiles N.V. -lancia - -// land : 2013-09-10 Binky Moon, LLC -land - -// landrover : 2014-11-13 Jaguar Land Rover Ltd -landrover - -// lanxess : 2015-07-30 LANXESS Corporation -lanxess - -// lasalle : 2015-04-02 Jones Lang LaSalle Incorporated -lasalle - -// lat : 2014-10-16 ECOM-LAC Federaciòn de Latinoamèrica y el Caribe para Internet y el Comercio Electrònico -lat - -// latino : 2015-07-30 Dish DBS Corporation -latino - -// latrobe : 2014-06-16 La Trobe University -latrobe - -// law : 2015-01-22 Registry Services, LLC -law - -// lawyer : 2014-03-20 Dog Beach, LLC -lawyer - -// lds : 2014-03-20 IRI Domain Management, LLC -lds - -// lease : 2014-03-06 Binky Moon, LLC -lease - -// leclerc : 2014-08-07 A.C.D. LEC Association des Centres Distributeurs Edouard Leclerc -leclerc - -// lefrak : 2015-07-16 LeFrak Organization, Inc. -lefrak - -// legal : 2014-10-16 Binky Moon, LLC -legal - -// lego : 2015-07-16 LEGO Juris A/S -lego - -// lexus : 2015-04-23 TOYOTA MOTOR CORPORATION -lexus - -// lgbt : 2014-05-08 Afilias Limited -lgbt - -// lidl : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG -lidl - -// life : 2014-02-06 Binky Moon, LLC -life - -// lifeinsurance : 2015-01-15 American Council of Life Insurers -lifeinsurance - -// lifestyle : 2014-12-11 Lifestyle Domain Holdings, Inc. -lifestyle - -// lighting : 2013-08-27 Binky Moon, LLC -lighting - -// like : 2014-12-18 Amazon Registry Services, Inc. -like - -// lilly : 2015-07-31 Eli Lilly and Company -lilly - -// limited : 2014-03-06 Binky Moon, LLC -limited - -// limo : 2013-10-17 Binky Moon, LLC -limo - -// lincoln : 2014-11-13 Ford Motor Company -lincoln - -// linde : 2014-12-04 Linde Aktiengesellschaft -linde - -// link : 2013-11-14 UNR Corp. -link - -// lipsy : 2015-06-25 Lipsy Ltd -lipsy - -// live : 2014-12-04 Dog Beach, LLC -live - -// living : 2015-07-30 Lifestyle Domain Holdings, Inc. -living - -// llc : 2017-12-14 Afilias Limited -llc - -// llp : 2019-08-26 UNR Corp. -llp - -// loan : 2014-11-20 dot Loan Limited -loan - -// loans : 2014-03-20 Binky Moon, LLC -loans - -// locker : 2015-06-04 Dish DBS Corporation -locker - -// locus : 2015-06-25 Locus Analytics LLC -locus - -// loft : 2015-07-30 Annco, Inc. -loft - -// lol : 2015-01-30 XYZ.COM LLC -lol - -// london : 2013-11-14 Dot London Domains Limited -london - -// lotte : 2014-11-07 Lotte Holdings Co., Ltd. -lotte - -// lotto : 2014-04-10 Afilias Limited -lotto - -// love : 2014-12-22 Merchant Law Group LLP -love - -// lpl : 2015-07-30 LPL Holdings, Inc. -lpl - -// lplfinancial : 2015-07-30 LPL Holdings, Inc. -lplfinancial - -// ltd : 2014-09-25 Binky Moon, LLC -ltd - -// ltda : 2014-04-17 InterNetX, Corp -ltda - -// lundbeck : 2015-08-06 H. Lundbeck A/S -lundbeck - -// luxe : 2014-01-09 Registry Services, LLC -luxe - -// luxury : 2013-10-17 Luxury Partners, LLC -luxury - -// macys : 2015-07-31 Macys, Inc. -macys - -// madrid : 2014-05-01 Comunidad de Madrid -madrid - -// maif : 2014-10-02 Mutuelle Assurance Instituteur France (MAIF) -maif - -// maison : 2013-12-05 Binky Moon, LLC -maison - -// makeup : 2015-01-15 XYZ.COM LLC -makeup - -// man : 2014-12-04 MAN SE -man - -// management : 2013-11-07 Binky Moon, LLC -management - -// mango : 2013-10-24 PUNTO FA S.L. -mango - -// map : 2016-06-09 Charleston Road Registry Inc. -map - -// market : 2014-03-06 Dog Beach, LLC -market - -// marketing : 2013-11-07 Binky Moon, LLC -marketing - -// markets : 2014-12-11 Dog Beach, LLC -markets - -// marriott : 2014-10-09 Marriott Worldwide Corporation -marriott - -// marshalls : 2015-07-16 The TJX Companies, Inc. -marshalls - -// maserati : 2015-07-31 Fiat Chrysler Automobiles N.V. -maserati - -// mattel : 2015-08-06 Mattel Sites, Inc. -mattel - -// mba : 2015-04-02 Binky Moon, LLC -mba - -// mckinsey : 2015-07-31 McKinsey Holdings, Inc. -mckinsey - -// med : 2015-08-06 Medistry LLC -med - -// media : 2014-03-06 Binky Moon, LLC -media - -// meet : 2014-01-16 Charleston Road Registry Inc. -meet - -// melbourne : 2014-05-29 The Crown in right of the State of Victoria, represented by its Department of State Development, Business and Innovation -melbourne - -// meme : 2014-01-30 Charleston Road Registry Inc. -meme - -// memorial : 2014-10-16 Dog Beach, LLC -memorial - -// men : 2015-02-26 Exclusive Registry Limited -men - -// menu : 2013-09-11 Dot Menu Registry, LLC -menu - -// merckmsd : 2016-07-14 MSD Registry Holdings, Inc. -merckmsd - -// miami : 2013-12-19 Registry Services, LLC -miami - -// microsoft : 2014-12-18 Microsoft Corporation -microsoft - -// mini : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft -mini - -// mint : 2015-07-30 Intuit Administrative Services, Inc. -mint - -// mit : 2015-07-02 Massachusetts Institute of Technology -mit - -// mitsubishi : 2015-07-23 Mitsubishi Corporation -mitsubishi - -// mlb : 2015-05-21 MLB Advanced Media DH, LLC -mlb - -// mls : 2015-04-23 The Canadian Real Estate Association -mls - -// mma : 2014-11-07 MMA IARD -mma - -// mobile : 2016-06-02 Dish DBS Corporation -mobile - -// moda : 2013-11-07 Dog Beach, LLC -moda - -// moe : 2013-11-13 Interlink Co., Ltd. -moe - -// moi : 2014-12-18 Amazon Registry Services, Inc. -moi - -// mom : 2015-04-16 XYZ.COM LLC -mom - -// monash : 2013-09-30 Monash University -monash - -// money : 2014-10-16 Binky Moon, LLC -money - -// monster : 2015-09-11 XYZ.COM LLC -monster - -// mormon : 2013-12-05 IRI Domain Management, LLC -mormon - -// mortgage : 2014-03-20 Dog Beach, LLC -mortgage - -// moscow : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) -moscow - -// moto : 2015-06-04 Motorola Trademark Holdings, LLC -moto - -// motorcycles : 2014-01-09 XYZ.COM LLC -motorcycles - -// mov : 2014-01-30 Charleston Road Registry Inc. -mov - -// movie : 2015-02-05 Binky Moon, LLC -movie - -// msd : 2015-07-23 MSD Registry Holdings, Inc. -msd - -// mtn : 2014-12-04 MTN Dubai Limited -mtn - -// mtr : 2015-03-12 MTR Corporation Limited -mtr - -// music : 2021-05-04 DotMusic Limited -music - -// mutual : 2015-04-02 Northwestern Mutual MU TLD Registry, LLC -mutual - -// nab : 2015-08-20 National Australia Bank Limited -nab - -// nagoya : 2013-10-24 GMO Registry, Inc. -nagoya - -// natura : 2015-03-12 NATURA COSMÉTICOS S.A. -natura - -// navy : 2014-03-06 Dog Beach, LLC -navy - -// nba : 2015-07-31 NBA REGISTRY, LLC -nba - -// nec : 2015-01-08 NEC Corporation -nec - -// netbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA -netbank - -// netflix : 2015-06-18 Netflix, Inc. -netflix - -// network : 2013-11-14 Binky Moon, LLC -network - -// neustar : 2013-12-05 NeuStar, Inc. -neustar - -// new : 2014-01-30 Charleston Road Registry Inc. -new - -// news : 2014-12-18 Dog Beach, LLC -news - -// next : 2015-06-18 Next plc -next - -// nextdirect : 2015-06-18 Next plc -nextdirect - -// nexus : 2014-07-24 Charleston Road Registry Inc. -nexus - -// nfl : 2015-07-23 NFL Reg Ops LLC -nfl - -// ngo : 2014-03-06 Public Interest Registry -ngo - -// nhk : 2014-02-13 Japan Broadcasting Corporation (NHK) -nhk - -// nico : 2014-12-04 DWANGO Co., Ltd. -nico - -// nike : 2015-07-23 NIKE, Inc. -nike - -// nikon : 2015-05-21 NIKON CORPORATION -nikon - -// ninja : 2013-11-07 Dog Beach, LLC -ninja - -// nissan : 2014-03-27 NISSAN MOTOR CO., LTD. -nissan - -// nissay : 2015-10-29 Nippon Life Insurance Company -nissay - -// nokia : 2015-01-08 Nokia Corporation -nokia - -// northwesternmutual : 2015-06-18 Northwestern Mutual Registry, LLC -northwesternmutual - -// norton : 2014-12-04 NortonLifeLock Inc. -norton - -// now : 2015-06-25 Amazon Registry Services, Inc. -now - -// nowruz : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. -nowruz - -// nowtv : 2015-05-14 Starbucks (HK) Limited -nowtv - -// nra : 2014-05-22 NRA Holdings Company, INC. -nra - -// nrw : 2013-11-21 Minds + Machines GmbH -nrw - -// ntt : 2014-10-31 NIPPON TELEGRAPH AND TELEPHONE CORPORATION -ntt - -// nyc : 2014-01-23 The City of New York by and through the New York City Department of Information Technology & Telecommunications -nyc - -// obi : 2014-09-25 OBI Group Holding SE & Co. KGaA -obi - -// observer : 2015-04-30 Dog Beach, LLC -observer - -// office : 2015-03-12 Microsoft Corporation -office - -// okinawa : 2013-12-05 BRregistry, Inc. -okinawa - -// olayan : 2015-05-14 Crescent Holding GmbH -olayan - -// olayangroup : 2015-05-14 Crescent Holding GmbH -olayangroup - -// oldnavy : 2015-07-31 The Gap, Inc. -oldnavy - -// ollo : 2015-06-04 Dish DBS Corporation -ollo - -// omega : 2015-01-08 The Swatch Group Ltd -omega - -// one : 2014-11-07 One.com A/S -one - -// ong : 2014-03-06 Public Interest Registry -ong - -// onl : 2013-09-16 iRegistry GmbH -onl - -// online : 2015-01-15 Radix FZC -online - -// ooo : 2014-01-09 INFIBEAM AVENUES LIMITED -ooo - -// open : 2015-07-31 American Express Travel Related Services Company, Inc. -open - -// oracle : 2014-06-19 Oracle Corporation -oracle - -// orange : 2015-03-12 Orange Brand Services Limited -orange - -// organic : 2014-03-27 Afilias Limited -organic - -// origins : 2015-10-01 The Estée Lauder Companies Inc. -origins - -// osaka : 2014-09-04 Osaka Registry Co., Ltd. -osaka - -// otsuka : 2013-10-11 Otsuka Holdings Co., Ltd. -otsuka - -// ott : 2015-06-04 Dish DBS Corporation -ott - -// ovh : 2014-01-16 MédiaBC -ovh - -// page : 2014-12-04 Charleston Road Registry Inc. -page - -// panasonic : 2015-07-30 Panasonic Corporation -panasonic - -// paris : 2014-01-30 City of Paris -paris - -// pars : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. -pars - -// partners : 2013-12-05 Binky Moon, LLC -partners - -// parts : 2013-12-05 Binky Moon, LLC -parts - -// party : 2014-09-11 Blue Sky Registry Limited -party - -// passagens : 2015-03-05 Travel Reservations SRL -passagens - -// pay : 2015-08-27 Amazon Registry Services, Inc. -pay - -// pccw : 2015-05-14 PCCW Enterprises Limited -pccw - -// pet : 2015-05-07 Afilias Limited -pet - -// pfizer : 2015-09-11 Pfizer Inc. -pfizer - -// pharmacy : 2014-06-19 National Association of Boards of Pharmacy -pharmacy - -// phd : 2016-07-28 Charleston Road Registry Inc. -phd - -// philips : 2014-11-07 Koninklijke Philips N.V. -philips - -// phone : 2016-06-02 Dish DBS Corporation -phone - -// photo : 2013-11-14 UNR Corp. -photo - -// photography : 2013-09-20 Binky Moon, LLC -photography - -// photos : 2013-10-17 Binky Moon, LLC -photos - -// physio : 2014-05-01 PhysBiz Pty Ltd -physio - -// pics : 2013-11-14 XYZ.COM LLC -pics - -// pictet : 2014-06-26 Pictet Europe S.A. -pictet - -// pictures : 2014-03-06 Binky Moon, LLC -pictures - -// pid : 2015-01-08 Top Level Spectrum, Inc. -pid - -// pin : 2014-12-18 Amazon Registry Services, Inc. -pin - -// ping : 2015-06-11 Ping Registry Provider, Inc. -ping - -// pink : 2013-10-01 Afilias Limited -pink - -// pioneer : 2015-07-16 Pioneer Corporation -pioneer - -// pizza : 2014-06-26 Binky Moon, LLC -pizza - -// place : 2014-04-24 Binky Moon, LLC -place - -// play : 2015-03-05 Charleston Road Registry Inc. -play - -// playstation : 2015-07-02 Sony Interactive Entertainment Inc. -playstation - -// plumbing : 2013-09-10 Binky Moon, LLC -plumbing - -// plus : 2015-02-05 Binky Moon, LLC -plus - -// pnc : 2015-07-02 PNC Domain Co., LLC -pnc - -// pohl : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG -pohl - -// poker : 2014-07-03 Afilias Limited -poker - -// politie : 2015-08-20 Politie Nederland -politie - -// porn : 2014-10-16 ICM Registry PN LLC -porn - -// pramerica : 2015-07-30 Prudential Financial, Inc. -pramerica - -// praxi : 2013-12-05 Praxi S.p.A. -praxi - -// press : 2014-04-03 Radix FZC -press - -// prime : 2015-06-25 Amazon Registry Services, Inc. -prime - -// prod : 2014-01-23 Charleston Road Registry Inc. -prod - -// productions : 2013-12-05 Binky Moon, LLC -productions - -// prof : 2014-07-24 Charleston Road Registry Inc. -prof - -// progressive : 2015-07-23 Progressive Casualty Insurance Company -progressive - -// promo : 2014-12-18 Afilias Limited -promo - -// properties : 2013-12-05 Binky Moon, LLC -properties - -// property : 2014-05-22 UNR Corp. -property - -// protection : 2015-04-23 XYZ.COM LLC -protection - -// pru : 2015-07-30 Prudential Financial, Inc. -pru - -// prudential : 2015-07-30 Prudential Financial, Inc. -prudential - -// pub : 2013-12-12 Dog Beach, LLC -pub - -// pwc : 2015-10-29 PricewaterhouseCoopers LLP -pwc - -// qpon : 2013-11-14 dotCOOL, Inc. -qpon - -// quebec : 2013-12-19 PointQuébec Inc -quebec - -// quest : 2015-03-26 XYZ.COM LLC -quest - -// racing : 2014-12-04 Premier Registry Limited -racing - -// radio : 2016-07-21 European Broadcasting Union (EBU) -radio - -// read : 2014-12-18 Amazon Registry Services, Inc. -read - -// realestate : 2015-09-11 dotRealEstate LLC -realestate - -// realtor : 2014-05-29 Real Estate Domains LLC -realtor - -// realty : 2015-03-19 Dog Beach, LLC -realty - -// recipes : 2013-10-17 Binky Moon, LLC -recipes - -// red : 2013-11-07 Afilias Limited -red - -// redstone : 2014-10-31 Redstone Haute Couture Co., Ltd. -redstone - -// redumbrella : 2015-03-26 Travelers TLD, LLC -redumbrella - -// rehab : 2014-03-06 Dog Beach, LLC -rehab - -// reise : 2014-03-13 Binky Moon, LLC -reise - -// reisen : 2014-03-06 Binky Moon, LLC -reisen - -// reit : 2014-09-04 National Association of Real Estate Investment Trusts, Inc. -reit - -// reliance : 2015-04-02 Reliance Industries Limited -reliance - -// ren : 2013-12-12 ZDNS International Limited -ren - -// rent : 2014-12-04 XYZ.COM LLC -rent - -// rentals : 2013-12-05 Binky Moon, LLC -rentals - -// repair : 2013-11-07 Binky Moon, LLC -repair - -// report : 2013-12-05 Binky Moon, LLC -report - -// republican : 2014-03-20 Dog Beach, LLC -republican - -// rest : 2013-12-19 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable -rest - -// restaurant : 2014-07-03 Binky Moon, LLC -restaurant - -// review : 2014-11-20 dot Review Limited -review - -// reviews : 2013-09-13 Dog Beach, LLC -reviews - -// rexroth : 2015-06-18 Robert Bosch GMBH -rexroth - -// rich : 2013-11-21 iRegistry GmbH -rich - -// richardli : 2015-05-14 Pacific Century Asset Management (HK) Limited -richardli - -// ricoh : 2014-11-20 Ricoh Company, Ltd. -ricoh - -// ril : 2015-04-02 Reliance Industries Limited -ril - -// rio : 2014-02-27 Empresa Municipal de Informática SA - IPLANRIO -rio - -// rip : 2014-07-10 Dog Beach, LLC -rip - -// rocher : 2014-12-18 Ferrero Trading Lux S.A. -rocher - -// rocks : 2013-11-14 Dog Beach, LLC -rocks - -// rodeo : 2013-12-19 Registry Services, LLC -rodeo - -// rogers : 2015-08-06 Rogers Communications Canada Inc. -rogers - -// room : 2014-12-18 Amazon Registry Services, Inc. -room - -// rsvp : 2014-05-08 Charleston Road Registry Inc. -rsvp - -// rugby : 2016-12-15 World Rugby Strategic Developments Limited -rugby - -// ruhr : 2013-10-02 regiodot GmbH & Co. KG -ruhr - -// run : 2015-03-19 Binky Moon, LLC -run - -// rwe : 2015-04-02 RWE AG -rwe - -// ryukyu : 2014-01-09 BRregistry, Inc. -ryukyu - -// saarland : 2013-12-12 dotSaarland GmbH -saarland - -// safe : 2014-12-18 Amazon Registry Services, Inc. -safe - -// safety : 2015-01-08 Safety Registry Services, LLC. -safety - -// sakura : 2014-12-18 SAKURA Internet Inc. -sakura - -// sale : 2014-10-16 Dog Beach, LLC -sale - -// salon : 2014-12-11 Binky Moon, LLC -salon - -// samsclub : 2015-07-31 Wal-Mart Stores, Inc. -samsclub - -// samsung : 2014-04-03 SAMSUNG SDS CO., LTD -samsung - -// sandvik : 2014-11-13 Sandvik AB -sandvik - -// sandvikcoromant : 2014-11-07 Sandvik AB -sandvikcoromant - -// sanofi : 2014-10-09 Sanofi -sanofi - -// sap : 2014-03-27 SAP AG -sap - -// sarl : 2014-07-03 Binky Moon, LLC -sarl - -// sas : 2015-04-02 Research IP LLC -sas - -// save : 2015-06-25 Amazon Registry Services, Inc. -save - -// saxo : 2014-10-31 Saxo Bank A/S -saxo - -// sbi : 2015-03-12 STATE BANK OF INDIA -sbi - -// sbs : 2014-11-07 ShortDot SA -sbs - -// sca : 2014-03-13 SVENSKA CELLULOSA AKTIEBOLAGET SCA (publ) -sca - -// scb : 2014-02-20 The Siam Commercial Bank Public Company Limited ("SCB") -scb - -// schaeffler : 2015-08-06 Schaeffler Technologies AG & Co. KG -schaeffler - -// schmidt : 2014-04-03 SCHMIDT GROUPE S.A.S. -schmidt - -// scholarships : 2014-04-24 Scholarships.com, LLC -scholarships - -// school : 2014-12-18 Binky Moon, LLC -school - -// schule : 2014-03-06 Binky Moon, LLC -schule - -// schwarz : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG -schwarz - -// science : 2014-09-11 dot Science Limited -science - -// scot : 2014-01-23 Dot Scot Registry Limited -scot - -// search : 2016-06-09 Charleston Road Registry Inc. -search - -// seat : 2014-05-22 SEAT, S.A. (Sociedad Unipersonal) -seat - -// secure : 2015-08-27 Amazon Registry Services, Inc. -secure - -// security : 2015-05-14 XYZ.COM LLC -security - -// seek : 2014-12-04 Seek Limited -seek - -// select : 2015-10-08 Registry Services, LLC -select - -// sener : 2014-10-24 Sener Ingeniería y Sistemas, S.A. -sener - -// services : 2014-02-27 Binky Moon, LLC -services - -// ses : 2015-07-23 SES -ses - -// seven : 2015-08-06 Seven West Media Ltd -seven - -// sew : 2014-07-17 SEW-EURODRIVE GmbH & Co KG -sew - -// sex : 2014-11-13 ICM Registry SX LLC -sex - -// sexy : 2013-09-11 UNR Corp. -sexy - -// sfr : 2015-08-13 Societe Francaise du Radiotelephone - SFR -sfr - -// shangrila : 2015-09-03 Shangri‐La International Hotel Management Limited -shangrila - -// sharp : 2014-05-01 Sharp Corporation -sharp - -// shaw : 2015-04-23 Shaw Cablesystems G.P. -shaw - -// shell : 2015-07-30 Shell Information Technology International Inc -shell - -// shia : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. -shia - -// shiksha : 2013-11-14 Afilias Limited -shiksha - -// shoes : 2013-10-02 Binky Moon, LLC -shoes - -// shop : 2016-04-08 GMO Registry, Inc. -shop - -// shopping : 2016-03-31 Binky Moon, LLC -shopping - -// shouji : 2015-01-08 Beijing Qihu Keji Co., Ltd. -shouji - -// show : 2015-03-05 Binky Moon, LLC -show - -// showtime : 2015-08-06 CBS Domains Inc. -showtime - -// silk : 2015-06-25 Amazon Registry Services, Inc. -silk - -// sina : 2015-03-12 Sina Corporation -sina - -// singles : 2013-08-27 Binky Moon, LLC -singles - -// site : 2015-01-15 Radix FZC -site - -// ski : 2015-04-09 Afilias Limited -ski - -// skin : 2015-01-15 XYZ.COM LLC -skin - -// sky : 2014-06-19 Sky International AG -sky - -// skype : 2014-12-18 Microsoft Corporation -skype - -// sling : 2015-07-30 DISH Technologies L.L.C. -sling - -// smart : 2015-07-09 Smart Communications, Inc. (SMART) -smart - -// smile : 2014-12-18 Amazon Registry Services, Inc. -smile - -// sncf : 2015-02-19 Société Nationale des Chemins de fer Francais S N C F -sncf - -// soccer : 2015-03-26 Binky Moon, LLC -soccer - -// social : 2013-11-07 Dog Beach, LLC -social - -// softbank : 2015-07-02 SoftBank Group Corp. -softbank - -// software : 2014-03-20 Dog Beach, LLC -software - -// sohu : 2013-12-19 Sohu.com Limited -sohu - -// solar : 2013-11-07 Binky Moon, LLC -solar - -// solutions : 2013-11-07 Binky Moon, LLC -solutions - -// song : 2015-02-26 Amazon Registry Services, Inc. -song - -// sony : 2015-01-08 Sony Corporation -sony - -// soy : 2014-01-23 Charleston Road Registry Inc. -soy - -// spa : 2019-09-19 Asia Spa and Wellness Promotion Council Limited -spa - -// space : 2014-04-03 Radix FZC -space - -// sport : 2017-11-16 Global Association of International Sports Federations (GAISF) -sport - -// spot : 2015-02-26 Amazon Registry Services, Inc. -spot - -// srl : 2015-05-07 InterNetX, Corp -srl - -// stada : 2014-11-13 STADA Arzneimittel AG -stada - -// staples : 2015-07-30 Staples, Inc. -staples - -// star : 2015-01-08 Star India Private Limited -star - -// statebank : 2015-03-12 STATE BANK OF INDIA -statebank - -// statefarm : 2015-07-30 State Farm Mutual Automobile Insurance Company -statefarm - -// stc : 2014-10-09 Saudi Telecom Company -stc - -// stcgroup : 2014-10-09 Saudi Telecom Company -stcgroup - -// stockholm : 2014-12-18 Stockholms kommun -stockholm - -// storage : 2014-12-22 XYZ.COM LLC -storage - -// store : 2015-04-09 Radix FZC -store - -// stream : 2016-01-08 dot Stream Limited -stream - -// studio : 2015-02-11 Dog Beach, LLC -studio - -// study : 2014-12-11 OPEN UNIVERSITIES AUSTRALIA PTY LTD -study - -// style : 2014-12-04 Binky Moon, LLC -style - -// sucks : 2014-12-22 Vox Populi Registry Ltd. -sucks - -// supplies : 2013-12-19 Binky Moon, LLC -supplies - -// supply : 2013-12-19 Binky Moon, LLC -supply - -// support : 2013-10-24 Binky Moon, LLC -support - -// surf : 2014-01-09 Registry Services, LLC -surf - -// surgery : 2014-03-20 Binky Moon, LLC -surgery - -// suzuki : 2014-02-20 SUZUKI MOTOR CORPORATION -suzuki - -// swatch : 2015-01-08 The Swatch Group Ltd -swatch - -// swiss : 2014-10-16 Swiss Confederation -swiss - -// sydney : 2014-09-18 State of New South Wales, Department of Premier and Cabinet -sydney - -// systems : 2013-11-07 Binky Moon, LLC -systems - -// tab : 2014-12-04 Tabcorp Holdings Limited -tab - -// taipei : 2014-07-10 Taipei City Government -taipei - -// talk : 2015-04-09 Amazon Registry Services, Inc. -talk - -// taobao : 2015-01-15 Alibaba Group Holding Limited -taobao - -// target : 2015-07-31 Target Domain Holdings, LLC -target - -// tatamotors : 2015-03-12 Tata Motors Ltd -tatamotors - -// tatar : 2014-04-24 Limited Liability Company "Coordination Center of Regional Domain of Tatarstan Republic" -tatar - -// tattoo : 2013-08-30 UNR Corp. -tattoo - -// tax : 2014-03-20 Binky Moon, LLC -tax - -// taxi : 2015-03-19 Binky Moon, LLC -taxi - -// tci : 2014-09-12 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. -tci - -// tdk : 2015-06-11 TDK Corporation -tdk - -// team : 2015-03-05 Binky Moon, LLC -team - -// tech : 2015-01-30 Radix FZC -tech - -// technology : 2013-09-13 Binky Moon, LLC -technology - -// temasek : 2014-08-07 Temasek Holdings (Private) Limited -temasek - -// tennis : 2014-12-04 Binky Moon, LLC -tennis - -// teva : 2015-07-02 Teva Pharmaceutical Industries Limited -teva - -// thd : 2015-04-02 Home Depot Product Authority, LLC -thd - -// theater : 2015-03-19 Binky Moon, LLC -theater - -// theatre : 2015-05-07 XYZ.COM LLC -theatre - -// tiaa : 2015-07-23 Teachers Insurance and Annuity Association of America -tiaa - -// tickets : 2015-02-05 XYZ.COM LLC -tickets - -// tienda : 2013-11-14 Binky Moon, LLC -tienda - -// tiffany : 2015-01-30 Tiffany and Company -tiffany - -// tips : 2013-09-20 Binky Moon, LLC -tips - -// tires : 2014-11-07 Binky Moon, LLC -tires - -// tirol : 2014-04-24 punkt Tirol GmbH -tirol - -// tjmaxx : 2015-07-16 The TJX Companies, Inc. -tjmaxx - -// tjx : 2015-07-16 The TJX Companies, Inc. -tjx - -// tkmaxx : 2015-07-16 The TJX Companies, Inc. -tkmaxx - -// tmall : 2015-01-15 Alibaba Group Holding Limited -tmall - -// today : 2013-09-20 Binky Moon, LLC -today - -// tokyo : 2013-11-13 GMO Registry, Inc. -tokyo - -// tools : 2013-11-21 Binky Moon, LLC -tools - -// top : 2014-03-20 .TOP Registry -top - -// toray : 2014-12-18 Toray Industries, Inc. -toray - -// toshiba : 2014-04-10 TOSHIBA Corporation -toshiba - -// total : 2015-08-06 TOTAL SE -total - -// tours : 2015-01-22 Binky Moon, LLC -tours - -// town : 2014-03-06 Binky Moon, LLC -town - -// toyota : 2015-04-23 TOYOTA MOTOR CORPORATION -toyota - -// toys : 2014-03-06 Binky Moon, LLC -toys - -// trade : 2014-01-23 Elite Registry Limited -trade - -// trading : 2014-12-11 Dog Beach, LLC -trading - -// training : 2013-11-07 Binky Moon, LLC -training - -// travel : 2015-10-09 Dog Beach, LLC -travel - -// travelchannel : 2015-07-02 Lifestyle Domain Holdings, Inc. -travelchannel - -// travelers : 2015-03-26 Travelers TLD, LLC -travelers - -// travelersinsurance : 2015-03-26 Travelers TLD, LLC -travelersinsurance - -// trust : 2014-10-16 UNR Corp. -trust - -// trv : 2015-03-26 Travelers TLD, LLC -trv - -// tube : 2015-06-11 Latin American Telecom LLC -tube - -// tui : 2014-07-03 TUI AG -tui - -// tunes : 2015-02-26 Amazon Registry Services, Inc. -tunes - -// tushu : 2014-12-18 Amazon Registry Services, Inc. -tushu - -// tvs : 2015-02-19 T V SUNDRAM IYENGAR & SONS LIMITED -tvs - -// ubank : 2015-08-20 National Australia Bank Limited -ubank - -// ubs : 2014-12-11 UBS AG -ubs - -// unicom : 2015-10-15 China United Network Communications Corporation Limited -unicom - -// university : 2014-03-06 Binky Moon, LLC -university - -// uno : 2013-09-11 Radix FZC -uno - -// uol : 2014-05-01 UBN INTERNET LTDA. -uol - -// ups : 2015-06-25 UPS Market Driver, Inc. -ups - -// vacations : 2013-12-05 Binky Moon, LLC -vacations - -// vana : 2014-12-11 Lifestyle Domain Holdings, Inc. -vana - -// vanguard : 2015-09-03 The Vanguard Group, Inc. -vanguard - -// vegas : 2014-01-16 Dot Vegas, Inc. -vegas - -// ventures : 2013-08-27 Binky Moon, LLC -ventures - -// verisign : 2015-08-13 VeriSign, Inc. -verisign - -// versicherung : 2014-03-20 tldbox GmbH -versicherung - -// vet : 2014-03-06 Dog Beach, LLC -vet - -// viajes : 2013-10-17 Binky Moon, LLC -viajes - -// video : 2014-10-16 Dog Beach, LLC -video - -// vig : 2015-05-14 VIENNA INSURANCE GROUP AG Wiener Versicherung Gruppe -vig - -// viking : 2015-04-02 Viking River Cruises (Bermuda) Ltd. -viking - -// villas : 2013-12-05 Binky Moon, LLC -villas - -// vin : 2015-06-18 Binky Moon, LLC -vin - -// vip : 2015-01-22 Registry Services, LLC -vip - -// virgin : 2014-09-25 Virgin Enterprises Limited -virgin - -// visa : 2015-07-30 Visa Worldwide Pte. Limited -visa - -// vision : 2013-12-05 Binky Moon, LLC -vision - -// viva : 2014-11-07 Saudi Telecom Company -viva - -// vivo : 2015-07-31 Telefonica Brasil S.A. -vivo - -// vlaanderen : 2014-02-06 DNS.be vzw -vlaanderen - -// vodka : 2013-12-19 Registry Services, LLC -vodka - -// volkswagen : 2015-05-14 Volkswagen Group of America Inc. -volkswagen - -// volvo : 2015-11-12 Volvo Holding Sverige Aktiebolag -volvo - -// vote : 2013-11-21 Monolith Registry LLC -vote - -// voting : 2013-11-13 Valuetainment Corp. -voting - -// voto : 2013-11-21 Monolith Registry LLC -voto - -// voyage : 2013-08-27 Binky Moon, LLC -voyage - -// vuelos : 2015-03-05 Travel Reservations SRL -vuelos - -// wales : 2014-05-08 Nominet UK -wales - -// walmart : 2015-07-31 Wal-Mart Stores, Inc. -walmart - -// walter : 2014-11-13 Sandvik AB -walter - -// wang : 2013-10-24 Zodiac Wang Limited -wang - -// wanggou : 2014-12-18 Amazon Registry Services, Inc. -wanggou - -// watch : 2013-11-14 Binky Moon, LLC -watch - -// watches : 2014-12-22 Afilias Limited -watches - -// weather : 2015-01-08 International Business Machines Corporation -weather - -// weatherchannel : 2015-03-12 International Business Machines Corporation -weatherchannel - -// webcam : 2014-01-23 dot Webcam Limited -webcam - -// weber : 2015-06-04 Saint-Gobain Weber SA -weber - -// website : 2014-04-03 Radix FZC -website - -// wedding : 2014-04-24 Registry Services, LLC -wedding - -// weibo : 2015-03-05 Sina Corporation -weibo - -// weir : 2015-01-29 Weir Group IP Limited -weir - -// whoswho : 2014-02-20 Who's Who Registry -whoswho - -// wien : 2013-10-28 punkt.wien GmbH -wien - -// wiki : 2013-11-07 Top Level Design, LLC -wiki - -// williamhill : 2014-03-13 William Hill Organization Limited -williamhill - -// win : 2014-11-20 First Registry Limited -win - -// windows : 2014-12-18 Microsoft Corporation -windows - -// wine : 2015-06-18 Binky Moon, LLC -wine - -// winners : 2015-07-16 The TJX Companies, Inc. -winners - -// wme : 2014-02-13 William Morris Endeavor Entertainment, LLC -wme - -// wolterskluwer : 2015-08-06 Wolters Kluwer N.V. -wolterskluwer - -// woodside : 2015-07-09 Woodside Petroleum Limited -woodside - -// work : 2013-12-19 Registry Services, LLC -work - -// works : 2013-11-14 Binky Moon, LLC -works - -// world : 2014-06-12 Binky Moon, LLC -world - -// wow : 2015-10-08 Amazon Registry Services, Inc. -wow - -// wtc : 2013-12-19 World Trade Centers Association, Inc. -wtc - -// wtf : 2014-03-06 Binky Moon, LLC -wtf - -// xbox : 2014-12-18 Microsoft Corporation -xbox - -// xerox : 2014-10-24 Xerox DNHC LLC -xerox - -// xfinity : 2015-07-09 Comcast IP Holdings I, LLC -xfinity - -// xihuan : 2015-01-08 Beijing Qihu Keji Co., Ltd. -xihuan - -// xin : 2014-12-11 Elegant Leader Limited -xin - -// xn--11b4c3d : 2015-01-15 VeriSign Sarl -कॉम - -// xn--1ck2e1b : 2015-02-26 Amazon Registry Services, Inc. -セール - -// xn--1qqw23a : 2014-01-09 Guangzhou YU Wei Information Technology Co., Ltd. -佛山 - -// xn--30rr7y : 2014-06-12 Excellent First Limited -慈善 - -// xn--3bst00m : 2013-09-13 Eagle Horizon Limited -集团 - -// xn--3ds443g : 2013-09-08 TLD REGISTRY LIMITED OY -在线 - -// xn--3pxu8k : 2015-01-15 VeriSign Sarl -点看 - -// xn--42c2d9a : 2015-01-15 VeriSign Sarl -คอม - -// xn--45q11c : 2013-11-21 Zodiac Gemini Ltd -八卦 - -// xn--4gbrim : 2013-10-04 Helium TLDs Ltd -موقع - -// xn--55qw42g : 2013-11-08 China Organizational Name Administration Center -公益 - -// xn--55qx5d : 2013-11-14 China Internet Network Information Center (CNNIC) -公司 - -// xn--5su34j936bgsg : 2015-09-03 Shangri‐La International Hotel Management Limited -香格里拉 - -// xn--5tzm5g : 2014-12-22 Global Website TLD Asia Limited -网站 - -// xn--6frz82g : 2013-09-23 Afilias Limited -移动 - -// xn--6qq986b3xl : 2013-09-13 Tycoon Treasure Limited -我爱你 - -// xn--80adxhks : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) -москва - -// xn--80aqecdr1a : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) -католик - -// xn--80asehdb : 2013-07-14 CORE Association -онлайн - -// xn--80aswg : 2013-07-14 CORE Association -сайт - -// xn--8y0a063a : 2015-03-26 China United Network Communications Corporation Limited -联通 - -// xn--9dbq2a : 2015-01-15 VeriSign Sarl -קום - -// xn--9et52u : 2014-06-12 RISE VICTORY LIMITED -时尚 - -// xn--9krt00a : 2015-03-12 Sina Corporation -微博 - -// xn--b4w605ferd : 2014-08-07 Temasek Holdings (Private) Limited -淡马锡 - -// xn--bck1b9a5dre4c : 2015-02-26 Amazon Registry Services, Inc. -ファッション - -// xn--c1avg : 2013-11-14 Public Interest Registry -орг - -// xn--c2br7g : 2015-01-15 VeriSign Sarl -नेट - -// xn--cck2b3b : 2015-02-26 Amazon Registry Services, Inc. -ストア - -// xn--cckwcxetd : 2019-12-19 Amazon Registry Services, Inc. -アマゾン - -// xn--cg4bki : 2013-09-27 SAMSUNG SDS CO., LTD -삼성 - -// xn--czr694b : 2014-01-16 Internet DotTrademark Organisation Limited -商标 - -// xn--czrs0t : 2013-12-19 Binky Moon, LLC -商店 - -// xn--czru2d : 2013-11-21 Zodiac Aquarius Limited -商城 - -// xn--d1acj3b : 2013-11-20 The Foundation for Network Initiatives “The Smart Internet” -дети - -// xn--eckvdtc9d : 2014-12-18 Amazon Registry Services, Inc. -ポイント - -// xn--efvy88h : 2014-08-22 Guangzhou YU Wei Information Technology Co., Ltd. -新闻 - -// xn--fct429k : 2015-04-09 Amazon Registry Services, Inc. -家電 - -// xn--fhbei : 2015-01-15 VeriSign Sarl -كوم - -// xn--fiq228c5hs : 2013-09-08 TLD REGISTRY LIMITED OY -中文网 - -// xn--fiq64b : 2013-10-14 CITIC Group Corporation -中信 - -// xn--fjq720a : 2014-05-22 Binky Moon, LLC -娱乐 - -// xn--flw351e : 2014-07-31 Charleston Road Registry Inc. -谷歌 - -// xn--fzys8d69uvgm : 2015-05-14 PCCW Enterprises Limited -電訊盈科 - -// xn--g2xx48c : 2015-01-30 Nawang Heli(Xiamen) Network Service Co., LTD. -购物 - -// xn--gckr3f0f : 2015-02-26 Amazon Registry Services, Inc. -クラウド - -// xn--gk3at1e : 2015-10-08 Amazon Registry Services, Inc. -通販 - -// xn--hxt814e : 2014-05-15 Zodiac Taurus Limited -网店 - -// xn--i1b6b1a6a2e : 2013-11-14 Public Interest Registry -संगठन - -// xn--imr513n : 2014-12-11 Internet DotTrademark Organisation Limited -餐厅 - -// xn--io0a7i : 2013-11-14 China Internet Network Information Center (CNNIC) -网络 - -// xn--j1aef : 2015-01-15 VeriSign Sarl -ком - -// xn--jlq480n2rg : 2019-12-19 Amazon Registry Services, Inc. -亚马逊 - -// xn--jlq61u9w7b : 2015-01-08 Nokia Corporation -诺基亚 - -// xn--jvr189m : 2015-02-26 Amazon Registry Services, Inc. -食品 - -// xn--kcrx77d1x4a : 2014-11-07 Koninklijke Philips N.V. -飞利浦 - -// xn--kput3i : 2014-02-13 Beijing RITT-Net Technology Development Co., Ltd -手机 - -// xn--mgba3a3ejt : 2014-11-20 Aramco Services Company -ارامكو - -// xn--mgba7c0bbn0a : 2015-05-14 Crescent Holding GmbH -العليان - -// xn--mgbaakc7dvf : 2015-09-03 Emirates Telecommunications Corporation (trading as Etisalat) -اتصالات - -// xn--mgbab2bd : 2013-10-31 CORE Association -بازار - -// xn--mgbca7dzdo : 2015-07-30 Abu Dhabi Systems and Information Centre -ابوظبي - -// xn--mgbi4ecexp : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) -كاثوليك - -// xn--mgbt3dhd : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. -همراه - -// xn--mk1bu44c : 2015-01-15 VeriSign Sarl -닷컴 - -// xn--mxtq1m : 2014-03-06 Net-Chinese Co., Ltd. -政府 - -// xn--ngbc5azd : 2013-07-13 International Domain Registry Pty. Ltd. -شبكة - -// xn--ngbe9e0a : 2014-12-04 Kuwait Finance House -بيتك - -// xn--ngbrx : 2015-11-12 League of Arab States -عرب - -// xn--nqv7f : 2013-11-14 Public Interest Registry -机构 - -// xn--nqv7fs00ema : 2013-11-14 Public Interest Registry -组织机构 - -// xn--nyqy26a : 2014-11-07 Stable Tone Limited -健康 - -// xn--otu796d : 2017-08-06 Jiang Yu Liang Cai Technology Company Limited -招聘 - -// xn--p1acf : 2013-12-12 Rusnames Limited -рус - -// xn--pssy2u : 2015-01-15 VeriSign Sarl -大拿 - -// xn--q9jyb4c : 2013-09-17 Charleston Road Registry Inc. -みんな - -// xn--qcka1pmc : 2014-07-31 Charleston Road Registry Inc. -グーグル - -// xn--rhqv96g : 2013-09-11 Stable Tone Limited -世界 - -// xn--rovu88b : 2015-02-26 Amazon Registry Services, Inc. -書籍 - -// xn--ses554g : 2014-01-16 KNET Co., Ltd. -网址 - -// xn--t60b56a : 2015-01-15 VeriSign Sarl -닷넷 - -// xn--tckwe : 2015-01-15 VeriSign Sarl -コム - -// xn--tiq49xqyj : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) -天主教 - -// xn--unup4y : 2013-07-14 Binky Moon, LLC -游戏 - -// xn--vermgensberater-ctb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG -vermögensberater - -// xn--vermgensberatung-pwb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG -vermögensberatung - -// xn--vhquv : 2013-08-27 Binky Moon, LLC -企业 - -// xn--vuq861b : 2014-10-16 Beijing Tele-info Network Technology Co., Ltd. -信息 - -// xn--w4r85el8fhu5dnra : 2015-04-30 Kerry Trading Co. Limited -嘉里大酒店 - -// xn--w4rs40l : 2015-07-30 Kerry Trading Co. Limited -嘉里 - -// xn--xhq521b : 2013-11-14 Guangzhou YU Wei Information Technology Co., Ltd. -广东 - -// xn--zfr164b : 2013-11-08 China Organizational Name Administration Center -政务 - -// xyz : 2013-12-05 XYZ.COM LLC -xyz - -// yachts : 2014-01-09 XYZ.COM LLC -yachts - -// yahoo : 2015-04-02 Oath Inc. -yahoo - -// yamaxun : 2014-12-18 Amazon Registry Services, Inc. -yamaxun - -// yandex : 2014-04-10 Yandex Europe B.V. -yandex - -// yodobashi : 2014-11-20 YODOBASHI CAMERA CO.,LTD. -yodobashi - -// yoga : 2014-05-29 Registry Services, LLC -yoga - -// yokohama : 2013-12-12 GMO Registry, Inc. -yokohama - -// you : 2015-04-09 Amazon Registry Services, Inc. -you - -// youtube : 2014-05-01 Charleston Road Registry Inc. -youtube - -// yun : 2015-01-08 Beijing Qihu Keji Co., Ltd. -yun - -// zappos : 2015-06-25 Amazon Registry Services, Inc. -zappos - -// zara : 2014-11-07 Industria de Diseño Textil, S.A. (INDITEX, S.A.) -zara - -// zero : 2014-12-18 Amazon Registry Services, Inc. -zero - -// zip : 2014-05-08 Charleston Road Registry Inc. -zip - -// zone : 2013-11-14 Binky Moon, LLC -zone - -// zuerich : 2014-11-07 Kanton Zürich (Canton of Zurich) -zuerich - - -// ===END ICANN DOMAINS=== -// ===BEGIN PRIVATE DOMAINS=== -// (Note: these are in alphabetical order by company name) - -// 1GB LLC : https://www.1gb.ua/ -// Submitted by 1GB LLC -cc.ua -inf.ua -ltd.ua - -// 611coin : https://611project.org/ -611.to - -// Aaron Marais' Gitlab pages: https://lab.aaronleem.co.za -// Submitted by Aaron Marais -graphox.us - -// accesso Technology Group, plc. : https://accesso.com/ -// Submitted by accesso Team -*.devcdnaccesso.com - -// Adobe : https://www.adobe.com/ -// Submitted by Ian Boston and Lars Trieloff -adobeaemcloud.com -*.dev.adobeaemcloud.com -hlx.live -adobeaemcloud.net -hlx.page -hlx3.page - -// Agnat sp. z o.o. : https://domena.pl -// Submitted by Przemyslaw Plewa -beep.pl - -// Airkit : https://www.airkit.com/ -// Submitted by Grant Cooksey -airkitapps.com -airkitapps-au.com -airkitapps.eu - -// Aiven: https://aiven.io/ -// Submitted by Etienne Stalmans -aivencloud.com - -// alboto.ca : http://alboto.ca -// Submitted by Anton Avramov -barsy.ca - -// Alces Software Ltd : http://alces-software.com -// Submitted by Mark J. Titorenko -*.compute.estate -*.alces.network - -// all-inkl.com : https://all-inkl.com -// Submitted by Werner Kaltofen -kasserver.com - -// Altervista: https://www.altervista.org -// Submitted by Carlo Cannas -altervista.org - -// alwaysdata : https://www.alwaysdata.com -// Submitted by Cyril -alwaysdata.net - -// Amazon CloudFront : https://aws.amazon.com/cloudfront/ -// Submitted by Donavan Miller -cloudfront.net - -// Amazon Elastic Compute Cloud : https://aws.amazon.com/ec2/ -// Submitted by Luke Wells -*.compute.amazonaws.com -*.compute-1.amazonaws.com -*.compute.amazonaws.com.cn -us-east-1.amazonaws.com - -// Amazon Elastic Beanstalk : https://aws.amazon.com/elasticbeanstalk/ -// Submitted by Luke Wells -cn-north-1.eb.amazonaws.com.cn -cn-northwest-1.eb.amazonaws.com.cn -elasticbeanstalk.com -ap-northeast-1.elasticbeanstalk.com -ap-northeast-2.elasticbeanstalk.com -ap-northeast-3.elasticbeanstalk.com -ap-south-1.elasticbeanstalk.com -ap-southeast-1.elasticbeanstalk.com -ap-southeast-2.elasticbeanstalk.com -ca-central-1.elasticbeanstalk.com -eu-central-1.elasticbeanstalk.com -eu-west-1.elasticbeanstalk.com -eu-west-2.elasticbeanstalk.com -eu-west-3.elasticbeanstalk.com -sa-east-1.elasticbeanstalk.com -us-east-1.elasticbeanstalk.com -us-east-2.elasticbeanstalk.com -us-gov-west-1.elasticbeanstalk.com -us-west-1.elasticbeanstalk.com -us-west-2.elasticbeanstalk.com - -// Amazon Elastic Load Balancing : https://aws.amazon.com/elasticloadbalancing/ -// Submitted by Luke Wells -*.elb.amazonaws.com -*.elb.amazonaws.com.cn - -// Amazon Global Accelerator : https://aws.amazon.com/global-accelerator/ -// Submitted by Daniel Massaguer -awsglobalaccelerator.com - -// Amazon S3 : https://aws.amazon.com/s3/ -// Submitted by Luke Wells -s3.amazonaws.com -s3-ap-northeast-1.amazonaws.com -s3-ap-northeast-2.amazonaws.com -s3-ap-south-1.amazonaws.com -s3-ap-southeast-1.amazonaws.com -s3-ap-southeast-2.amazonaws.com -s3-ca-central-1.amazonaws.com -s3-eu-central-1.amazonaws.com -s3-eu-west-1.amazonaws.com -s3-eu-west-2.amazonaws.com -s3-eu-west-3.amazonaws.com -s3-external-1.amazonaws.com -s3-fips-us-gov-west-1.amazonaws.com -s3-sa-east-1.amazonaws.com -s3-us-gov-west-1.amazonaws.com -s3-us-east-2.amazonaws.com -s3-us-west-1.amazonaws.com -s3-us-west-2.amazonaws.com -s3.ap-northeast-2.amazonaws.com -s3.ap-south-1.amazonaws.com -s3.cn-north-1.amazonaws.com.cn -s3.ca-central-1.amazonaws.com -s3.eu-central-1.amazonaws.com -s3.eu-west-2.amazonaws.com -s3.eu-west-3.amazonaws.com -s3.us-east-2.amazonaws.com -s3.dualstack.ap-northeast-1.amazonaws.com -s3.dualstack.ap-northeast-2.amazonaws.com -s3.dualstack.ap-south-1.amazonaws.com -s3.dualstack.ap-southeast-1.amazonaws.com -s3.dualstack.ap-southeast-2.amazonaws.com -s3.dualstack.ca-central-1.amazonaws.com -s3.dualstack.eu-central-1.amazonaws.com -s3.dualstack.eu-west-1.amazonaws.com -s3.dualstack.eu-west-2.amazonaws.com -s3.dualstack.eu-west-3.amazonaws.com -s3.dualstack.sa-east-1.amazonaws.com -s3.dualstack.us-east-1.amazonaws.com -s3.dualstack.us-east-2.amazonaws.com -s3-website-us-east-1.amazonaws.com -s3-website-us-west-1.amazonaws.com -s3-website-us-west-2.amazonaws.com -s3-website-ap-northeast-1.amazonaws.com -s3-website-ap-southeast-1.amazonaws.com -s3-website-ap-southeast-2.amazonaws.com -s3-website-eu-west-1.amazonaws.com -s3-website-sa-east-1.amazonaws.com -s3-website.ap-northeast-2.amazonaws.com -s3-website.ap-south-1.amazonaws.com -s3-website.ca-central-1.amazonaws.com -s3-website.eu-central-1.amazonaws.com -s3-website.eu-west-2.amazonaws.com -s3-website.eu-west-3.amazonaws.com -s3-website.us-east-2.amazonaws.com - -// Amune : https://amune.org/ -// Submitted by Team Amune -t3l3p0rt.net -tele.amune.org - -// Apigee : https://apigee.com/ -// Submitted by Apigee Security Team -apigee.io - -// Apphud : https://apphud.com -// Submitted by Alexander Selivanov -siiites.com - -// Appspace : https://www.appspace.com -// Submitted by Appspace Security Team -appspacehosted.com -appspaceusercontent.com - -// Appudo UG (haftungsbeschränkt) : https://www.appudo.com -// Submitted by Alexander Hochbaum -appudo.net - -// Aptible : https://www.aptible.com/ -// Submitted by Thomas Orozco -on-aptible.com - -// ASEINet : https://www.aseinet.com/ -// Submitted by Asei SEKIGUCHI -user.aseinet.ne.jp -gv.vc -d.gv.vc - -// Asociación Amigos de la Informática "Euskalamiga" : http://encounter.eus/ -// Submitted by Hector Martin -user.party.eus - -// Association potager.org : https://potager.org/ -// Submitted by Lunar -pimienta.org -poivron.org -potager.org -sweetpepper.org - -// ASUSTOR Inc. : http://www.asustor.com -// Submitted by Vincent Tseng -myasustor.com - -// Atlassian : https://atlassian.com -// Submitted by Sam Smyth -cdn.prod.atlassian-dev.net - -// Authentick UG (haftungsbeschränkt) : https://authentick.net -// Submitted by Lukas Reschke -translated.page - -// AVM : https://avm.de -// Submitted by Andreas Weise -myfritz.net - -// AVStack Pte. Ltd. : https://avstack.io -// Submitted by Jasper Hugo -onavstack.net - -// AW AdvisorWebsites.com Software Inc : https://advisorwebsites.com -// Submitted by James Kennedy -*.awdev.ca -*.advisor.ws - -// AZ.pl sp. z.o.o: https://az.pl -// Submitted by Krzysztof Wolski -ecommerce-shop.pl - -// b-data GmbH : https://www.b-data.io -// Submitted by Olivier Benz -b-data.io - -// backplane : https://www.backplane.io -// Submitted by Anthony Voutas -backplaneapp.io - -// Balena : https://www.balena.io -// Submitted by Petros Angelatos -balena-devices.com - -// University of Banja Luka : https://unibl.org -// Domains for Republic of Srpska administrative entity. -// Submitted by Marko Ivanovic -rs.ba - -// Banzai Cloud -// Submitted by Janos Matyas -*.banzai.cloud -app.banzaicloud.io -*.backyards.banzaicloud.io - -// BASE, Inc. : https://binc.jp -// Submitted by Yuya NAGASAWA -base.ec -official.ec -buyshop.jp -fashionstore.jp -handcrafted.jp -kawaiishop.jp -supersale.jp -theshop.jp -shopselect.net -base.shop - -// Beget Ltd -// Submitted by Lev Nekrasov -*.beget.app - -// BetaInABox -// Submitted by Adrian -betainabox.com - -// BinaryLane : http://www.binarylane.com -// Submitted by Nathan O'Sullivan -bnr.la - -// Bitbucket : http://bitbucket.org -// Submitted by Andy Ortlieb -bitbucket.io - -// Blackbaud, Inc. : https://www.blackbaud.com -// Submitted by Paul Crowder -blackbaudcdn.net - -// Blatech : http://www.blatech.net -// Submitted by Luke Bratch -of.je - -// Blue Bite, LLC : https://bluebite.com -// Submitted by Joshua Weiss -bluebite.io - -// Boomla : https://boomla.com -// Submitted by Tibor Halter -boomla.net - -// Boutir : https://www.boutir.com -// Submitted by Eric Ng Ka Ka -boutir.com - -// Boxfuse : https://boxfuse.com -// Submitted by Axel Fontaine -boxfuse.io - -// bplaced : https://www.bplaced.net/ -// Submitted by Miroslav Bozic -square7.ch -bplaced.com -bplaced.de -square7.de -bplaced.net -square7.net - -// Brendly : https://brendly.rs -// Submitted by Dusan Radovanovic -shop.brendly.rs - -// BrowserSafetyMark -// Submitted by Dave Tharp -browsersafetymark.io - -// Bytemark Hosting : https://www.bytemark.co.uk -// Submitted by Paul Cammish -uk0.bigv.io -dh.bytemark.co.uk -vm.bytemark.co.uk - -// Caf.js Labs LLC : https://www.cafjs.com -// Submitted by Antonio Lain -cafjs.com - -// callidomus : https://www.callidomus.com/ -// Submitted by Marcus Popp -mycd.eu - -// Carrd : https://carrd.co -// Submitted by AJ -drr.ac -uwu.ai -carrd.co -crd.co -ju.mp - -// CentralNic : http://www.centralnic.com/names/domains -// Submitted by registry -ae.org -br.com -cn.com -com.de -com.se -de.com -eu.com -gb.net -hu.net -jp.net -jpn.com -mex.com -ru.com -sa.com -se.net -uk.com -uk.net -us.com -za.bz -za.com - -// No longer operated by CentralNic, these entries should be adopted and/or removed by current operators -// Submitted by Gavin Brown -ar.com -hu.com -kr.com -no.com -qc.com -uy.com - -// Africa.com Web Solutions Ltd : https://registry.africa.com -// Submitted by Gavin Brown -africa.com - -// iDOT Services Limited : http://www.domain.gr.com -// Submitted by Gavin Brown -gr.com - -// Radix FZC : http://domains.in.net -// Submitted by Gavin Brown -in.net -web.in - -// US REGISTRY LLC : http://us.org -// Submitted by Gavin Brown -us.org - -// co.com Registry, LLC : https://registry.co.com -// Submitted by Gavin Brown -co.com - -// Roar Domains LLC : https://roar.basketball/ -// Submitted by Gavin Brown -aus.basketball -nz.basketball - -// BRS Media : https://brsmedia.com/ -// Submitted by Gavin Brown -radio.am -radio.fm - -// c.la : http://www.c.la/ -c.la - -// certmgr.org : https://certmgr.org -// Submitted by B. Blechschmidt -certmgr.org - -// Cityhost LLC : https://cityhost.ua -// Submitted by Maksym Rivtin -cx.ua - -// Civilized Discourse Construction Kit, Inc. : https://www.discourse.org/ -// Submitted by Rishabh Nambiar & Michael Brown -discourse.group -discourse.team - -// Clever Cloud : https://www.clever-cloud.com/ -// Submitted by Quentin Adam -cleverapps.io - -// Clerk : https://www.clerk.dev -// Submitted by Colin Sidoti -clerk.app -clerkstage.app -*.lcl.dev -*.lclstage.dev -*.stg.dev -*.stgstage.dev - -// ClickRising : https://clickrising.com/ -// Submitted by Umut Gumeli -clickrising.net - -// Cloud66 : https://www.cloud66.com/ -// Submitted by Khash Sajadi -c66.me -cloud66.ws -cloud66.zone - -// CloudAccess.net : https://www.cloudaccess.net/ -// Submitted by Pawel Panek -jdevcloud.com -wpdevcloud.com -cloudaccess.host -freesite.host -cloudaccess.net - -// cloudControl : https://www.cloudcontrol.com/ -// Submitted by Tobias Wilken -cloudcontrolled.com -cloudcontrolapp.com - -// Cloudera, Inc. : https://www.cloudera.com/ -// Submitted by Kedarnath Waikar -*.cloudera.site - -// Cloudflare, Inc. : https://www.cloudflare.com/ -// Submitted by Cloudflare Team -pages.dev -trycloudflare.com -workers.dev - -// Clovyr : https://clovyr.io -// Submitted by Patrick Nielsen -wnext.app - -// co.ca : http://registry.co.ca/ -co.ca - -// Co & Co : https://co-co.nl/ -// Submitted by Govert Versluis -*.otap.co - -// i-registry s.r.o. : http://www.i-registry.cz/ -// Submitted by Martin Semrad -co.cz - -// CDN77.com : http://www.cdn77.com -// Submitted by Jan Krpes -c.cdn77.org -cdn77-ssl.net -r.cdn77.net -rsc.cdn77.org -ssl.origin.cdn77-secure.org - -// Cloud DNS Ltd : http://www.cloudns.net -// Submitted by Aleksander Hristov -cloudns.asia -cloudns.biz -cloudns.club -cloudns.cc -cloudns.eu -cloudns.in -cloudns.info -cloudns.org -cloudns.pro -cloudns.pw -cloudns.us - -// CNPY : https://cnpy.gdn -// Submitted by Angelo Gladding -cnpy.gdn - -// Codeberg e. V. : https://codeberg.org -// Submitted by Moritz Marquardt -codeberg.page - -// CoDNS B.V. -co.nl -co.no - -// Combell.com : https://www.combell.com -// Submitted by Thomas Wouters -webhosting.be -hosting-cluster.nl - -// Coordination Center for TLD RU and XN--P1AI : https://cctld.ru/en/domains/domens_ru/reserved/ -// Submitted by George Georgievsky -ac.ru -edu.ru -gov.ru -int.ru -mil.ru -test.ru - -// COSIMO GmbH : http://www.cosimo.de -// Submitted by Rene Marticke -dyn.cosidns.de -dynamisches-dns.de -dnsupdater.de -internet-dns.de -l-o-g-i-n.de -dynamic-dns.info -feste-ip.net -knx-server.net -static-access.net - -// Craynic, s.r.o. : http://www.craynic.com/ -// Submitted by Ales Krajnik -realm.cz - -// Cryptonomic : https://cryptonomic.net/ -// Submitted by Andrew Cady -*.cryptonomic.net - -// Cupcake : https://cupcake.io/ -// Submitted by Jonathan Rudenberg -cupcake.is - -// Curv UG : https://curv-labs.de/ -// Submitted by Marvin Wiesner -curv.dev - -// Customer OCI - Oracle Dyn https://cloud.oracle.com/home https://dyn.com/dns/ -// Submitted by Gregory Drake -// Note: This is intended to also include customer-oci.com due to wildcards implicitly including the current label -*.customer-oci.com -*.oci.customer-oci.com -*.ocp.customer-oci.com -*.ocs.customer-oci.com - -// cyon GmbH : https://www.cyon.ch/ -// Submitted by Dominic Luechinger -cyon.link -cyon.site - -// Danger Science Group: https://dangerscience.com/ -// Submitted by Skylar MacDonald -fnwk.site -folionetwork.site -platform0.app - -// Daplie, Inc : https://daplie.com -// Submitted by AJ ONeal -daplie.me -localhost.daplie.me - -// Datto, Inc. : https://www.datto.com/ -// Submitted by Philipp Heckel -dattolocal.com -dattorelay.com -dattoweb.com -mydatto.com -dattolocal.net -mydatto.net - -// Dansk.net : http://www.dansk.net/ -// Submitted by Anani Voule -biz.dk -co.dk -firm.dk -reg.dk -store.dk - -// dappnode.io : https://dappnode.io/ -// Submitted by Abel Boldu / DAppNode Team -dyndns.dappnode.io - -// dapps.earth : https://dapps.earth/ -// Submitted by Daniil Burdakov -*.dapps.earth -*.bzz.dapps.earth - -// Dark, Inc. : https://darklang.com -// Submitted by Paul Biggar -builtwithdark.com - -// DataDetect, LLC. : https://datadetect.com -// Submitted by Andrew Banchich -demo.datadetect.com -instance.datadetect.com - -// Datawire, Inc : https://www.datawire.io -// Submitted by Richard Li -edgestack.me - -// DDNS5 : https://ddns5.com -// Submitted by Cameron Elliott -ddns5.com - -// Debian : https://www.debian.org/ -// Submitted by Peter Palfrader / Debian Sysadmin Team -debian.net - -// Deno Land Inc : https://deno.com/ -// Submitted by Luca Casonato -deno.dev -deno-staging.dev - -// deSEC : https://desec.io/ -// Submitted by Peter Thomassen -dedyn.io - -// Deta: https://www.deta.sh/ -// Submitted by Aavash Shrestha -deta.app -deta.dev - -// Diher Solutions : https://diher.solutions -// Submitted by Didi Hermawan -*.rss.my.id -*.diher.solutions - -// Discord Inc : https://discord.com -// Submitted by Sahn Lam -discordsays.com -discordsez.com - -// DNS Africa Ltd https://dns.business -// Submitted by Calvin Browne -jozi.biz - -// DNShome : https://www.dnshome.de/ -// Submitted by Norbert Auler -dnshome.de - -// DotArai : https://www.dotarai.com/ -// Submitted by Atsadawat Netcharadsang -online.th -shop.th - -// DrayTek Corp. : https://www.draytek.com/ -// Submitted by Paul Fang -drayddns.com - -// DreamCommerce : https://shoper.pl/ -// Submitted by Konrad Kotarba -shoparena.pl - -// DreamHost : http://www.dreamhost.com/ -// Submitted by Andrew Farmer -dreamhosters.com - -// Drobo : http://www.drobo.com/ -// Submitted by Ricardo Padilha -mydrobo.com - -// Drud Holdings, LLC. : https://www.drud.com/ -// Submitted by Kevin Bridges -drud.io -drud.us - -// DuckDNS : http://www.duckdns.org/ -// Submitted by Richard Harper -duckdns.org - -// Bip : https://bip.sh -// Submitted by Joel Kennedy -bip.sh - -// bitbridge.net : Submitted by Craig Welch, abeliidev@gmail.com -bitbridge.net - -// dy.fi : http://dy.fi/ -// Submitted by Heikki Hannikainen -dy.fi -tunk.org - -// DynDNS.com : http://www.dyndns.com/services/dns/dyndns/ -dyndns-at-home.com -dyndns-at-work.com -dyndns-blog.com -dyndns-free.com -dyndns-home.com -dyndns-ip.com -dyndns-mail.com -dyndns-office.com -dyndns-pics.com -dyndns-remote.com -dyndns-server.com -dyndns-web.com -dyndns-wiki.com -dyndns-work.com -dyndns.biz -dyndns.info -dyndns.org -dyndns.tv -at-band-camp.net -ath.cx -barrel-of-knowledge.info -barrell-of-knowledge.info -better-than.tv -blogdns.com -blogdns.net -blogdns.org -blogsite.org -boldlygoingnowhere.org -broke-it.net -buyshouses.net -cechire.com -dnsalias.com -dnsalias.net -dnsalias.org -dnsdojo.com -dnsdojo.net -dnsdojo.org -does-it.net -doesntexist.com -doesntexist.org -dontexist.com -dontexist.net -dontexist.org -doomdns.com -doomdns.org -dvrdns.org -dyn-o-saur.com -dynalias.com -dynalias.net -dynalias.org -dynathome.net -dyndns.ws -endofinternet.net -endofinternet.org -endoftheinternet.org -est-a-la-maison.com -est-a-la-masion.com -est-le-patron.com -est-mon-blogueur.com -for-better.biz -for-more.biz -for-our.info -for-some.biz -for-the.biz -forgot.her.name -forgot.his.name -from-ak.com -from-al.com -from-ar.com -from-az.net -from-ca.com -from-co.net -from-ct.com -from-dc.com -from-de.com -from-fl.com -from-ga.com -from-hi.com -from-ia.com -from-id.com -from-il.com -from-in.com -from-ks.com -from-ky.com -from-la.net -from-ma.com -from-md.com -from-me.org -from-mi.com -from-mn.com -from-mo.com -from-ms.com -from-mt.com -from-nc.com -from-nd.com -from-ne.com -from-nh.com -from-nj.com -from-nm.com -from-nv.com -from-ny.net -from-oh.com -from-ok.com -from-or.com -from-pa.com -from-pr.com -from-ri.com -from-sc.com -from-sd.com -from-tn.com -from-tx.com -from-ut.com -from-va.com -from-vt.com -from-wa.com -from-wi.com -from-wv.com -from-wy.com -ftpaccess.cc -fuettertdasnetz.de -game-host.org -game-server.cc -getmyip.com -gets-it.net -go.dyndns.org -gotdns.com -gotdns.org -groks-the.info -groks-this.info -ham-radio-op.net -here-for-more.info -hobby-site.com -hobby-site.org -home.dyndns.org -homedns.org -homeftp.net -homeftp.org -homeip.net -homelinux.com -homelinux.net -homelinux.org -homeunix.com -homeunix.net -homeunix.org -iamallama.com -in-the-band.net -is-a-anarchist.com -is-a-blogger.com -is-a-bookkeeper.com -is-a-bruinsfan.org -is-a-bulls-fan.com -is-a-candidate.org -is-a-caterer.com -is-a-celticsfan.org -is-a-chef.com -is-a-chef.net -is-a-chef.org -is-a-conservative.com -is-a-cpa.com -is-a-cubicle-slave.com -is-a-democrat.com -is-a-designer.com -is-a-doctor.com -is-a-financialadvisor.com -is-a-geek.com -is-a-geek.net -is-a-geek.org -is-a-green.com -is-a-guru.com -is-a-hard-worker.com -is-a-hunter.com -is-a-knight.org -is-a-landscaper.com -is-a-lawyer.com -is-a-liberal.com -is-a-libertarian.com -is-a-linux-user.org -is-a-llama.com -is-a-musician.com -is-a-nascarfan.com -is-a-nurse.com -is-a-painter.com -is-a-patsfan.org -is-a-personaltrainer.com -is-a-photographer.com -is-a-player.com -is-a-republican.com -is-a-rockstar.com -is-a-socialist.com -is-a-soxfan.org -is-a-student.com -is-a-teacher.com -is-a-techie.com -is-a-therapist.com -is-an-accountant.com -is-an-actor.com -is-an-actress.com -is-an-anarchist.com -is-an-artist.com -is-an-engineer.com -is-an-entertainer.com -is-by.us -is-certified.com -is-found.org -is-gone.com -is-into-anime.com -is-into-cars.com -is-into-cartoons.com -is-into-games.com -is-leet.com -is-lost.org -is-not-certified.com -is-saved.org -is-slick.com -is-uberleet.com -is-very-bad.org -is-very-evil.org -is-very-good.org -is-very-nice.org -is-very-sweet.org -is-with-theband.com -isa-geek.com -isa-geek.net -isa-geek.org -isa-hockeynut.com -issmarterthanyou.com -isteingeek.de -istmein.de -kicks-ass.net -kicks-ass.org -knowsitall.info -land-4-sale.us -lebtimnetz.de -leitungsen.de -likes-pie.com -likescandy.com -merseine.nu -mine.nu -misconfused.org -mypets.ws -myphotos.cc -neat-url.com -office-on-the.net -on-the-web.tv -podzone.net -podzone.org -readmyblog.org -saves-the-whales.com -scrapper-site.net -scrapping.cc -selfip.biz -selfip.com -selfip.info -selfip.net -selfip.org -sells-for-less.com -sells-for-u.com -sells-it.net -sellsyourhome.org -servebbs.com -servebbs.net -servebbs.org -serveftp.net -serveftp.org -servegame.org -shacknet.nu -simple-url.com -space-to-rent.com -stuff-4-sale.org -stuff-4-sale.us -teaches-yoga.com -thruhere.net -traeumtgerade.de -webhop.biz -webhop.info -webhop.net -webhop.org -worse-than.tv -writesthisblog.com - -// ddnss.de : https://www.ddnss.de/ -// Submitted by Robert Niedziela -ddnss.de -dyn.ddnss.de -dyndns.ddnss.de -dyndns1.de -dyn-ip24.de -home-webserver.de -dyn.home-webserver.de -myhome-server.de -ddnss.org - -// Definima : http://www.definima.com/ -// Submitted by Maxence Bitterli -definima.net -definima.io - -// DigitalOcean App Platform : https://www.digitalocean.com/products/app-platform/ -// Submitted by Braxton Huggins -ondigitalocean.app - -// DigitalOcean Spaces : https://www.digitalocean.com/products/spaces/ -// Submitted by Robin H. Johnson -*.digitaloceanspaces.com - -// dnstrace.pro : https://dnstrace.pro/ -// Submitted by Chris Partridge -bci.dnstrace.pro - -// Dynu.com : https://www.dynu.com/ -// Submitted by Sue Ye -ddnsfree.com -ddnsgeek.com -giize.com -gleeze.com -kozow.com -loseyourip.com -ooguy.com -theworkpc.com -casacam.net -dynu.net -accesscam.org -camdvr.org -freeddns.org -mywire.org -webredirect.org -myddns.rocks -blogsite.xyz - -// dynv6 : https://dynv6.com -// Submitted by Dominik Menke -dynv6.net - -// E4YOU spol. s.r.o. : https://e4you.cz/ -// Submitted by Vladimir Dudr -e4.cz - -// eero : https://eero.com/ -// Submitted by Yue Kang -eero.online -eero-stage.online - -// Elementor : Elementor Ltd. -// Submitted by Anton Barkan -elementor.cloud -elementor.cool - -// En root‽ : https://en-root.org -// Submitted by Emmanuel Raviart -en-root.fr - -// Enalean SAS: https://www.enalean.com -// Submitted by Thomas Cottier -mytuleap.com -tuleap-partners.com - -// Encoretivity AB: https://encore.dev -// Submitted by André Eriksson -encr.app -encoreapi.com - -// ECG Robotics, Inc: https://ecgrobotics.org -// Submitted by -onred.one -staging.onred.one - -// encoway GmbH : https://www.encoway.de -// Submitted by Marcel Daus -eu.encoway.cloud - -// EU.org https://eu.org/ -// Submitted by Pierre Beyssac -eu.org -al.eu.org -asso.eu.org -at.eu.org -au.eu.org -be.eu.org -bg.eu.org -ca.eu.org -cd.eu.org -ch.eu.org -cn.eu.org -cy.eu.org -cz.eu.org -de.eu.org -dk.eu.org -edu.eu.org -ee.eu.org -es.eu.org -fi.eu.org -fr.eu.org -gr.eu.org -hr.eu.org -hu.eu.org -ie.eu.org -il.eu.org -in.eu.org -int.eu.org -is.eu.org -it.eu.org -jp.eu.org -kr.eu.org -lt.eu.org -lu.eu.org -lv.eu.org -mc.eu.org -me.eu.org -mk.eu.org -mt.eu.org -my.eu.org -net.eu.org -ng.eu.org -nl.eu.org -no.eu.org -nz.eu.org -paris.eu.org -pl.eu.org -pt.eu.org -q-a.eu.org -ro.eu.org -ru.eu.org -se.eu.org -si.eu.org -sk.eu.org -tr.eu.org -uk.eu.org -us.eu.org - -// Eurobyte : https://eurobyte.ru -// Submitted by Evgeniy Subbotin -eurodir.ru - -// Evennode : http://www.evennode.com/ -// Submitted by Michal Kralik -eu-1.evennode.com -eu-2.evennode.com -eu-3.evennode.com -eu-4.evennode.com -us-1.evennode.com -us-2.evennode.com -us-3.evennode.com -us-4.evennode.com - -// eDirect Corp. : https://hosting.url.com.tw/ -// Submitted by C.S. chang -twmail.cc -twmail.net -twmail.org -mymailer.com.tw -url.tw - -// Fabrica Technologies, Inc. : https://www.fabrica.dev/ -// Submitted by Eric Jiang -onfabrica.com - -// Facebook, Inc. -// Submitted by Peter Ruibal -apps.fbsbx.com - -// FAITID : https://faitid.org/ -// Submitted by Maxim Alzoba -// https://www.flexireg.net/stat_info -ru.net -adygeya.ru -bashkiria.ru -bir.ru -cbg.ru -com.ru -dagestan.ru -grozny.ru -kalmykia.ru -kustanai.ru -marine.ru -mordovia.ru -msk.ru -mytis.ru -nalchik.ru -nov.ru -pyatigorsk.ru -spb.ru -vladikavkaz.ru -vladimir.ru -abkhazia.su -adygeya.su -aktyubinsk.su -arkhangelsk.su -armenia.su -ashgabad.su -azerbaijan.su -balashov.su -bashkiria.su -bryansk.su -bukhara.su -chimkent.su -dagestan.su -east-kazakhstan.su -exnet.su -georgia.su -grozny.su -ivanovo.su -jambyl.su -kalmykia.su -kaluga.su -karacol.su -karaganda.su -karelia.su -khakassia.su -krasnodar.su -kurgan.su -kustanai.su -lenug.su -mangyshlak.su -mordovia.su -msk.su -murmansk.su -nalchik.su -navoi.su -north-kazakhstan.su -nov.su -obninsk.su -penza.su -pokrovsk.su -sochi.su -spb.su -tashkent.su -termez.su -togliatti.su -troitsk.su -tselinograd.su -tula.su -tuva.su -vladikavkaz.su -vladimir.su -vologda.su - -// Fancy Bits, LLC : http://getchannels.com -// Submitted by Aman Gupta -channelsdvr.net -u.channelsdvr.net - -// Fastly Inc. : http://www.fastly.com/ -// Submitted by Fastly Security -edgecompute.app -fastly-terrarium.com -fastlylb.net -map.fastlylb.net -freetls.fastly.net -map.fastly.net -a.prod.fastly.net -global.prod.fastly.net -a.ssl.fastly.net -b.ssl.fastly.net -global.ssl.fastly.net - -// FASTVPS EESTI OU : https://fastvps.ru/ -// Submitted by Likhachev Vasiliy -fastvps-server.com -fastvps.host -myfast.host -fastvps.site -myfast.space - -// Fedora : https://fedoraproject.org/ -// submitted by Patrick Uiterwijk -fedorainfracloud.org -fedorapeople.org -cloud.fedoraproject.org -app.os.fedoraproject.org -app.os.stg.fedoraproject.org - -// FearWorks Media Ltd. : https://fearworksmedia.co.uk -// submitted by Keith Fairley -conn.uk -copro.uk -hosp.uk - -// Fermax : https://fermax.com/ -// submitted by Koen Van Isterdael -mydobiss.com - -// FH Muenster : https://www.fh-muenster.de -// Submitted by Robin Naundorf -fh-muenster.io - -// Filegear Inc. : https://www.filegear.com -// Submitted by Jason Zhu -filegear.me -filegear-au.me -filegear-de.me -filegear-gb.me -filegear-ie.me -filegear-jp.me -filegear-sg.me - -// Firebase, Inc. -// Submitted by Chris Raynor -firebaseapp.com - -// Firewebkit : https://www.firewebkit.com -// Submitted by Majid Qureshi -fireweb.app - -// FLAP : https://www.flap.cloud -// Submitted by Louis Chemineau -flap.id - -// FlashDrive : https://flashdrive.io -// Submitted by Eric Chan -onflashdrive.app -fldrv.com - -// fly.io: https://fly.io -// Submitted by Kurt Mackey -fly.dev -edgeapp.net -shw.io - -// Flynn : https://flynn.io -// Submitted by Jonathan Rudenberg -flynnhosting.net - -// Forgerock : https://www.forgerock.com -// Submitted by Roderick Parr -forgeblocks.com -id.forgerock.io - -// Framer : https://www.framer.com -// Submitted by Koen Rouwhorst -framer.app -framercanvas.com - -// Frusky MEDIA&PR : https://www.frusky.de -// Submitted by Victor Pupynin -*.frusky.de - -// RavPage : https://www.ravpage.co.il -// Submitted by Roni Horowitz -ravpage.co.il - -// Frederik Braun https://frederik-braun.com -// Submitted by Frederik Braun -0e.vc - -// Freebox : http://www.freebox.fr -// Submitted by Romain Fliedel -freebox-os.com -freeboxos.com -fbx-os.fr -fbxos.fr -freebox-os.fr -freeboxos.fr - -// freedesktop.org : https://www.freedesktop.org -// Submitted by Daniel Stone -freedesktop.org - -// freemyip.com : https://freemyip.com -// Submitted by Cadence -freemyip.com - -// FunkFeuer - Verein zur Förderung freier Netze : https://www.funkfeuer.at -// Submitted by Daniel A. Maierhofer -wien.funkfeuer.at - -// Futureweb OG : http://www.futureweb.at -// Submitted by Andreas Schnederle-Wagner -*.futurecms.at -*.ex.futurecms.at -*.in.futurecms.at -futurehosting.at -futuremailing.at -*.ex.ortsinfo.at -*.kunden.ortsinfo.at -*.statics.cloud - -// GDS : https://www.gov.uk/service-manual/technology/managing-domain-names -// Submitted by Stephen Ford -independent-commission.uk -independent-inquest.uk -independent-inquiry.uk -independent-panel.uk -independent-review.uk -public-inquiry.uk -royal-commission.uk -campaign.gov.uk -service.gov.uk - -// CDDO : https://www.gov.uk/guidance/get-an-api-domain-on-govuk -// Submitted by Jamie Tanna -api.gov.uk - -// Gehirn Inc. : https://www.gehirn.co.jp/ -// Submitted by Kohei YOSHIDA -gehirn.ne.jp -usercontent.jp - -// Gentlent, Inc. : https://www.gentlent.com -// Submitted by Tom Klein -gentapps.com -gentlentapis.com -lab.ms -cdn-edges.net - -// Ghost Foundation : https://ghost.org -// Submitted by Matt Hanley -ghost.io - -// GignoSystemJapan: http://gsj.bz -// Submitted by GignoSystemJapan -gsj.bz - -// GitHub, Inc. -// Submitted by Patrick Toomey -githubusercontent.com -githubpreview.dev -github.io - -// GitLab, Inc. -// Submitted by Alex Hanselka -gitlab.io - -// Gitplac.si - https://gitplac.si -// Submitted by Aljaž Starc -gitapp.si -gitpage.si - -// Glitch, Inc : https://glitch.com -// Submitted by Mads Hartmann -glitch.me - -// Global NOG Alliance : https://nogalliance.org/ -// Submitted by Sander Steffann -nog.community - -// Globe Hosting SRL : https://www.globehosting.com/ -// Submitted by Gavin Brown -co.ro -shop.ro - -// GMO Pepabo, Inc. : https://pepabo.com/ -// Submitted by Hosting Div -lolipop.io -angry.jp -babyblue.jp -babymilk.jp -backdrop.jp -bambina.jp -bitter.jp -blush.jp -boo.jp -boy.jp -boyfriend.jp -but.jp -candypop.jp -capoo.jp -catfood.jp -cheap.jp -chicappa.jp -chillout.jp -chips.jp -chowder.jp -chu.jp -ciao.jp -cocotte.jp -coolblog.jp -cranky.jp -cutegirl.jp -daa.jp -deca.jp -deci.jp -digick.jp -egoism.jp -fakefur.jp -fem.jp -flier.jp -floppy.jp -fool.jp -frenchkiss.jp -girlfriend.jp -girly.jp -gloomy.jp -gonna.jp -greater.jp -hacca.jp -heavy.jp -her.jp -hiho.jp -hippy.jp -holy.jp -hungry.jp -icurus.jp -itigo.jp -jellybean.jp -kikirara.jp -kill.jp -kilo.jp -kuron.jp -littlestar.jp -lolitapunk.jp -lomo.jp -lovepop.jp -lovesick.jp -main.jp -mods.jp -mond.jp -mongolian.jp -moo.jp -namaste.jp -nikita.jp -nobushi.jp -noor.jp -oops.jp -parallel.jp -parasite.jp -pecori.jp -peewee.jp -penne.jp -pepper.jp -perma.jp -pigboat.jp -pinoko.jp -punyu.jp -pupu.jp -pussycat.jp -pya.jp -raindrop.jp -readymade.jp -sadist.jp -schoolbus.jp -secret.jp -staba.jp -stripper.jp -sub.jp -sunnyday.jp -thick.jp -tonkotsu.jp -under.jp -upper.jp -velvet.jp -verse.jp -versus.jp -vivian.jp -watson.jp -weblike.jp -whitesnow.jp -zombie.jp -heteml.net - -// GOV.UK Platform as a Service : https://www.cloud.service.gov.uk/ -// Submitted by Tom Whitwell -cloudapps.digital -london.cloudapps.digital - -// GOV.UK Pay : https://www.payments.service.gov.uk/ -// Submitted by Richard Baker -pymnt.uk - -// UKHomeOffice : https://www.gov.uk/government/organisations/home-office -// Submitted by Jon Shanks -homeoffice.gov.uk - -// GlobeHosting, Inc. -// Submitted by Zoltan Egresi -ro.im - -// GoIP DNS Services : http://www.goip.de -// Submitted by Christian Poulter -goip.de - -// Google, Inc. -// Submitted by Eduardo Vela -run.app -a.run.app -web.app -*.0emm.com -appspot.com -*.r.appspot.com -codespot.com -googleapis.com -googlecode.com -pagespeedmobilizer.com -publishproxy.com -withgoogle.com -withyoutube.com -*.gateway.dev -cloud.goog -translate.goog -*.usercontent.goog -cloudfunctions.net -blogspot.ae -blogspot.al -blogspot.am -blogspot.ba -blogspot.be -blogspot.bg -blogspot.bj -blogspot.ca -blogspot.cf -blogspot.ch -blogspot.cl -blogspot.co.at -blogspot.co.id -blogspot.co.il -blogspot.co.ke -blogspot.co.nz -blogspot.co.uk -blogspot.co.za -blogspot.com -blogspot.com.ar -blogspot.com.au -blogspot.com.br -blogspot.com.by -blogspot.com.co -blogspot.com.cy -blogspot.com.ee -blogspot.com.eg -blogspot.com.es -blogspot.com.mt -blogspot.com.ng -blogspot.com.tr -blogspot.com.uy -blogspot.cv -blogspot.cz -blogspot.de -blogspot.dk -blogspot.fi -blogspot.fr -blogspot.gr -blogspot.hk -blogspot.hr -blogspot.hu -blogspot.ie -blogspot.in -blogspot.is -blogspot.it -blogspot.jp -blogspot.kr -blogspot.li -blogspot.lt -blogspot.lu -blogspot.md -blogspot.mk -blogspot.mr -blogspot.mx -blogspot.my -blogspot.nl -blogspot.no -blogspot.pe -blogspot.pt -blogspot.qa -blogspot.re -blogspot.ro -blogspot.rs -blogspot.ru -blogspot.se -blogspot.sg -blogspot.si -blogspot.sk -blogspot.sn -blogspot.td -blogspot.tw -blogspot.ug -blogspot.vn - -// Goupile : https://goupile.fr -// Submitted by Niels Martignene -goupile.fr - -// Group 53, LLC : https://www.group53.com -// Submitted by Tyler Todd -awsmppl.com - -// GünstigBestellen : https://günstigbestellen.de -// Submitted by Furkan Akkoc -günstigbestellen.de -günstigliefern.de - -// Hakaran group: http://hakaran.cz -// Submitted by Arseniy Sokolov -fin.ci -free.hr -caa.li -ua.rs -conf.se - -// Handshake : https://handshake.org -// Submitted by Mike Damm -hs.zone -hs.run - -// Hashbang : https://hashbang.sh -hashbang.sh - -// Hasura : https://hasura.io -// Submitted by Shahidh K Muhammed -hasura.app -hasura-app.io - -// Heilbronn University of Applied Sciences - Faculty Informatics (GitLab Pages): https://www.hs-heilbronn.de -// Submitted by Richard Zowalla -pages.it.hs-heilbronn.de - -// Hepforge : https://www.hepforge.org -// Submitted by David Grellscheid -hepforge.org - -// Heroku : https://www.heroku.com/ -// Submitted by Tom Maher -herokuapp.com -herokussl.com - -// Hibernating Rhinos -// Submitted by Oren Eini -ravendb.cloud -myravendb.com -ravendb.community -ravendb.me -development.run -ravendb.run - -// home.pl S.A.: https://home.pl -// Submitted by Krzysztof Wolski -homesklep.pl - -// Hong Kong Productivity Council: https://www.hkpc.org/ -// Submitted by SECaaS Team -secaas.hk - -// Hoplix : https://www.hoplix.com -// Submitted by Danilo De Franco -hoplix.shop - - -// HOSTBIP REGISTRY : https://www.hostbip.com/ -// Submitted by Atanunu Igbunuroghene -orx.biz -biz.gl -col.ng -firm.ng -gen.ng -ltd.ng -ngo.ng -edu.scot -sch.so -org.yt - -// HostyHosting (hostyhosting.com) -hostyhosting.io - -// Häkkinen.fi -// Submitted by Eero Häkkinen -häkkinen.fi - -// Ici la Lune : http://www.icilalune.com/ -// Submitted by Simon Morvan -*.moonscale.io -moonscale.net - -// iki.fi -// Submitted by Hannu Aronsson -iki.fi - -// Impertrix Solutions : -// Submitted by Zhixiang Zhao -impertrixcdn.com -impertrix.com - -// Incsub, LLC: https://incsub.com/ -// Submitted by Aaron Edwards -smushcdn.com -wphostedmail.com -wpmucdn.com -tempurl.host -wpmudev.host - -// Individual Network Berlin e.V. : https://www.in-berlin.de/ -// Submitted by Christian Seitz -dyn-berlin.de -in-berlin.de -in-brb.de -in-butter.de -in-dsl.de -in-dsl.net -in-dsl.org -in-vpn.de -in-vpn.net -in-vpn.org - -// info.at : http://www.info.at/ -biz.at -info.at - -// info.cx : http://info.cx -// Submitted by Jacob Slater -info.cx - -// Interlegis : http://www.interlegis.leg.br -// Submitted by Gabriel Ferreira -ac.leg.br -al.leg.br -am.leg.br -ap.leg.br -ba.leg.br -ce.leg.br -df.leg.br -es.leg.br -go.leg.br -ma.leg.br -mg.leg.br -ms.leg.br -mt.leg.br -pa.leg.br -pb.leg.br -pe.leg.br -pi.leg.br -pr.leg.br -rj.leg.br -rn.leg.br -ro.leg.br -rr.leg.br -rs.leg.br -sc.leg.br -se.leg.br -sp.leg.br -to.leg.br - -// intermetrics GmbH : https://pixolino.com/ -// Submitted by Wolfgang Schwarz -pixolino.com - -// Internet-Pro, LLP: https://netangels.ru/ -// Submitted by Vasiliy Sheredeko -na4u.ru - -// iopsys software solutions AB : https://iopsys.eu/ -// Submitted by Roman Azarenko -iopsys.se - -// IPiFony Systems, Inc. : https://www.ipifony.com/ -// Submitted by Matthew Hardeman -ipifony.net - -// IServ GmbH : https://iserv.eu -// Submitted by Kim-Alexander Brodowski -mein-iserv.de -schulserver.de -test-iserv.de -iserv.dev - -// I-O DATA DEVICE, INC. : http://www.iodata.com/ -// Submitted by Yuji Minagawa -iobb.net - -// Jelastic, Inc. : https://jelastic.com/ -// Submitted by Ihor Kolodyuk -mel.cloudlets.com.au -cloud.interhostsolutions.be -users.scale.virtualcloud.com.br -mycloud.by -alp1.ae.flow.ch -appengine.flow.ch -es-1.axarnet.cloud -diadem.cloud -vip.jelastic.cloud -jele.cloud -it1.eur.aruba.jenv-aruba.cloud -it1.jenv-aruba.cloud -keliweb.cloud -cs.keliweb.cloud -oxa.cloud -tn.oxa.cloud -uk.oxa.cloud -primetel.cloud -uk.primetel.cloud -ca.reclaim.cloud -uk.reclaim.cloud -us.reclaim.cloud -ch.trendhosting.cloud -de.trendhosting.cloud -jele.club -amscompute.com -clicketcloud.com -dopaas.com -hidora.com -paas.hosted-by-previder.com -rag-cloud.hosteur.com -rag-cloud-ch.hosteur.com -jcloud.ik-server.com -jcloud-ver-jpc.ik-server.com -demo.jelastic.com -kilatiron.com -paas.massivegrid.com -jed.wafaicloud.com -lon.wafaicloud.com -ryd.wafaicloud.com -j.scaleforce.com.cy -jelastic.dogado.eu -fi.cloudplatform.fi -demo.datacenter.fi -paas.datacenter.fi -jele.host -mircloud.host -paas.beebyte.io -sekd1.beebyteapp.io -jele.io -cloud-fr1.unispace.io -jc.neen.it -cloud.jelastic.open.tim.it -jcloud.kz -upaas.kazteleport.kz -cloudjiffy.net -fra1-de.cloudjiffy.net -west1-us.cloudjiffy.net -jls-sto1.elastx.net -jls-sto2.elastx.net -jls-sto3.elastx.net -faststacks.net -fr-1.paas.massivegrid.net -lon-1.paas.massivegrid.net -lon-2.paas.massivegrid.net -ny-1.paas.massivegrid.net -ny-2.paas.massivegrid.net -sg-1.paas.massivegrid.net -jelastic.saveincloud.net -nordeste-idc.saveincloud.net -j.scaleforce.net -jelastic.tsukaeru.net -sdscloud.pl -unicloud.pl -mircloud.ru -jelastic.regruhosting.ru -enscaled.sg -jele.site -jelastic.team -orangecloud.tn -j.layershift.co.uk -phx.enscaled.us -mircloud.us - -// Jino : https://www.jino.ru -// Submitted by Sergey Ulyashin -myjino.ru -*.hosting.myjino.ru -*.landing.myjino.ru -*.spectrum.myjino.ru -*.vps.myjino.ru - -// Jotelulu S.L. : https://jotelulu.com -// Submitted by Daniel Fariña -jotelulu.cloud - -// Joyent : https://www.joyent.com/ -// Submitted by Brian Bennett -*.triton.zone -*.cns.joyent.com - -// JS.ORG : http://dns.js.org -// Submitted by Stefan Keim -js.org - -// KaasHosting : http://www.kaashosting.nl/ -// Submitted by Wouter Bakker -kaas.gg -khplay.nl - -// Kakao : https://www.kakaocorp.com/ -// Submitted by JaeYoong Lee -ktistory.com - -// Kapsi : https://kapsi.fi -// Submitted by Tomi Juntunen -kapsi.fi - -// Keyweb AG : https://www.keyweb.de -// Submitted by Martin Dannehl -keymachine.de - -// KingHost : https://king.host -// Submitted by Felipe Keller Braz -kinghost.net -uni5.net - -// KnightPoint Systems, LLC : http://www.knightpoint.com/ -// Submitted by Roy Keene -knightpoint.systems - -// KoobinEvent, SL: https://www.koobin.com -// Submitted by Iván Oliva -koobin.events - -// KUROKU LTD : https://kuroku.ltd/ -// Submitted by DisposaBoy -oya.to - -// Katholieke Universiteit Leuven: https://www.kuleuven.be -// Submitted by Abuse KU Leuven -kuleuven.cloud -ezproxy.kuleuven.be - -// .KRD : http://nic.krd/data/krd/Registration%20Policy.pdf -co.krd -edu.krd - -// Krellian Ltd. : https://krellian.com -// Submitted by Ben Francis -krellian.net -webthings.io - -// LCube - Professional hosting e.K. : https://www.lcube-webhosting.de -// Submitted by Lars Laehn -git-repos.de -lcube-server.de -svn-repos.de - -// Leadpages : https://www.leadpages.net -// Submitted by Greg Dallavalle -leadpages.co -lpages.co -lpusercontent.com - -// Lelux.fi : https://lelux.fi/ -// Submitted by Lelux Admin -lelux.site - -// Lifetime Hosting : https://Lifetime.Hosting/ -// Submitted by Mike Fillator -co.business -co.education -co.events -co.financial -co.network -co.place -co.technology - -// Lightmaker Property Manager, Inc. : https://app.lmpm.com/ -// Submitted by Greg Holland -app.lmpm.com - -// linkyard ldt: https://www.linkyard.ch/ -// Submitted by Mario Siegenthaler -linkyard.cloud -linkyard-cloud.ch - -// Linode : https://linode.com -// Submitted by -members.linode.com -*.nodebalancer.linode.com -*.linodeobjects.com -ip.linodeusercontent.com - -// LiquidNet Ltd : http://www.liquidnetlimited.com/ -// Submitted by Victor Velchev -we.bs - -// Localcert : https://localcert.dev -// Submitted by Lann Martin -*.user.localcert.dev - -// localzone.xyz -// Submitted by Kenny Niehage -localzone.xyz - -// Log'in Line : https://www.loginline.com/ -// Submitted by Rémi Mach -loginline.app -loginline.dev -loginline.io -loginline.services -loginline.site - -// Lokalized : https://lokalized.nl -// Submitted by Noah Taheij -servers.run - -// Lõhmus Family, The -// Submitted by Heiki Lõhmus -lohmus.me - -// LubMAN UMCS Sp. z o.o : https://lubman.pl/ -// Submitted by Ireneusz Maliszewski -krasnik.pl -leczna.pl -lubartow.pl -lublin.pl -poniatowa.pl -swidnik.pl - -// Lug.org.uk : https://lug.org.uk -// Submitted by Jon Spriggs -glug.org.uk -lug.org.uk -lugs.org.uk - -// Lukanet Ltd : https://lukanet.com -// Submitted by Anton Avramov -barsy.bg -barsy.co.uk -barsyonline.co.uk -barsycenter.com -barsyonline.com -barsy.club -barsy.de -barsy.eu -barsy.in -barsy.info -barsy.io -barsy.me -barsy.menu -barsy.mobi -barsy.net -barsy.online -barsy.org -barsy.pro -barsy.pub -barsy.ro -barsy.shop -barsy.site -barsy.support -barsy.uk - -// Magento Commerce -// Submitted by Damien Tournoud -*.magentosite.cloud - -// May First - People Link : https://mayfirst.org/ -// Submitted by Jamie McClelland -mayfirst.info -mayfirst.org - -// Mail.Ru Group : https://hb.cldmail.ru -// Submitted by Ilya Zaretskiy -hb.cldmail.ru - -// Mail Transfer Platform : https://www.neupeer.com -// Submitted by Li Hui -cn.vu - -// Maze Play: https://www.mazeplay.com -// Submitted by Adam Humpherys -mazeplay.com - -// mcpe.me : https://mcpe.me -// Submitted by Noa Heyl -mcpe.me - -// McHost : https://mchost.ru -// Submitted by Evgeniy Subbotin -mcdir.me -mcdir.ru -mcpre.ru -vps.mcdir.ru - -// Mediatech : https://mediatech.by -// Submitted by Evgeniy Kozhuhovskiy -mediatech.by -mediatech.dev - -// Medicom Health : https://medicomhealth.com -// Submitted by Michael Olson -hra.health - -// Memset hosting : https://www.memset.com -// Submitted by Tom Whitwell -miniserver.com -memset.net - -// MetaCentrum, CESNET z.s.p.o. : https://www.metacentrum.cz/en/ -// Submitted by Zdeněk Šustr -*.cloud.metacentrum.cz -custom.metacentrum.cz - -// MetaCentrum, CESNET z.s.p.o. : https://www.metacentrum.cz/en/ -// Submitted by Radim Janča -flt.cloud.muni.cz -usr.cloud.muni.cz - -// Meteor Development Group : https://www.meteor.com/hosting -// Submitted by Pierre Carrier -meteorapp.com -eu.meteorapp.com - -// Michau Enterprises Limited : http://www.co.pl/ -co.pl - -// Microsoft Corporation : http://microsoft.com -// Submitted by Mitch Webster -*.azurecontainer.io -azurewebsites.net -azure-mobile.net -cloudapp.net -azurestaticapps.net -centralus.azurestaticapps.net -eastasia.azurestaticapps.net -eastus2.azurestaticapps.net -westeurope.azurestaticapps.net -westus2.azurestaticapps.net - -// minion.systems : http://minion.systems -// Submitted by Robert Böttinger -csx.cc - -// Mintere : https://mintere.com/ -// Submitted by Ben Aubin -mintere.site - -// MobileEducation, LLC : https://joinforte.com -// Submitted by Grayson Martin -forte.id - -// Mozilla Corporation : https://mozilla.com -// Submitted by Ben Francis -mozilla-iot.org - -// Mozilla Foundation : https://mozilla.org/ -// Submitted by glob -bmoattachments.org - -// MSK-IX : https://www.msk-ix.ru/ -// Submitted by Khannanov Roman -net.ru -org.ru -pp.ru - -// Mythic Beasts : https://www.mythic-beasts.com -// Submitted by Paul Cammish -hostedpi.com -customer.mythic-beasts.com -caracal.mythic-beasts.com -fentiger.mythic-beasts.com -lynx.mythic-beasts.com -ocelot.mythic-beasts.com -oncilla.mythic-beasts.com -onza.mythic-beasts.com -sphinx.mythic-beasts.com -vs.mythic-beasts.com -x.mythic-beasts.com -yali.mythic-beasts.com -cust.retrosnub.co.uk - -// Nabu Casa : https://www.nabucasa.com -// Submitted by Paulus Schoutsen -ui.nabu.casa - -// Names.of.London : https://names.of.london/ -// Submitted by James Stevens or -pony.club -of.fashion -in.london -of.london -from.marketing -with.marketing -for.men -repair.men -and.mom -for.mom -for.one -under.one -for.sale -that.win -from.work -to.work - -// Net at Work Gmbh : https://www.netatwork.de -// Submitted by Jan Jaeschke -cloud.nospamproxy.com - -// Netlify : https://www.netlify.com -// Submitted by Jessica Parsons -netlify.app - -// Neustar Inc. -// Submitted by Trung Tran -4u.com - -// ngrok : https://ngrok.com/ -// Submitted by Alan Shreve -ngrok.io - -// Nimbus Hosting Ltd. : https://www.nimbushosting.co.uk/ -// Submitted by Nicholas Ford -nh-serv.co.uk - -// NFSN, Inc. : https://www.NearlyFreeSpeech.NET/ -// Submitted by Jeff Wheelhouse -nfshost.com - -// Noop : https://noop.app -// Submitted by Nathaniel Schweinberg -*.developer.app -noop.app - -// Northflank Ltd. : https://northflank.com/ -// Submitted by Marco Suter -*.northflank.app -*.build.run -*.code.run -*.database.run -*.migration.run - -// Noticeable : https://noticeable.io -// Submitted by Laurent Pellegrino -noticeable.news - -// Now-DNS : https://now-dns.com -// Submitted by Steve Russell -dnsking.ch -mypi.co -n4t.co -001www.com -ddnslive.com -myiphost.com -forumz.info -16-b.it -32-b.it -64-b.it -soundcast.me -tcp4.me -dnsup.net -hicam.net -now-dns.net -ownip.net -vpndns.net -dynserv.org -now-dns.org -x443.pw -now-dns.top -ntdll.top -freeddns.us -crafting.xyz -zapto.xyz - -// nsupdate.info : https://www.nsupdate.info/ -// Submitted by Thomas Waldmann -nsupdate.info -nerdpol.ovh - -// No-IP.com : https://noip.com/ -// Submitted by Deven Reza -blogsyte.com -brasilia.me -cable-modem.org -ciscofreak.com -collegefan.org -couchpotatofries.org -damnserver.com -ddns.me -ditchyourip.com -dnsfor.me -dnsiskinky.com -dvrcam.info -dynns.com -eating-organic.net -fantasyleague.cc -geekgalaxy.com -golffan.us -health-carereform.com -homesecuritymac.com -homesecuritypc.com -hopto.me -ilovecollege.info -loginto.me -mlbfan.org -mmafan.biz -myactivedirectory.com -mydissent.net -myeffect.net -mymediapc.net -mypsx.net -mysecuritycamera.com -mysecuritycamera.net -mysecuritycamera.org -net-freaks.com -nflfan.org -nhlfan.net -no-ip.ca -no-ip.co.uk -no-ip.net -noip.us -onthewifi.com -pgafan.net -point2this.com -pointto.us -privatizehealthinsurance.net -quicksytes.com -read-books.org -securitytactics.com -serveexchange.com -servehumour.com -servep2p.com -servesarcasm.com -stufftoread.com -ufcfan.org -unusualperson.com -workisboring.com -3utilities.com -bounceme.net -ddns.net -ddnsking.com -gotdns.ch -hopto.org -myftp.biz -myftp.org -myvnc.com -no-ip.biz -no-ip.info -no-ip.org -noip.me -redirectme.net -servebeer.com -serveblog.net -servecounterstrike.com -serveftp.com -servegame.com -servehalflife.com -servehttp.com -serveirc.com -serveminecraft.net -servemp3.com -servepics.com -servequake.com -sytes.net -webhop.me -zapto.org - -// NodeArt : https://nodeart.io -// Submitted by Konstantin Nosov -stage.nodeart.io - -// Nucleos Inc. : https://nucleos.com -// Submitted by Piotr Zduniak -pcloud.host - -// NYC.mn : http://www.information.nyc.mn -// Submitted by Matthew Brown -nyc.mn - -// Observable, Inc. : https://observablehq.com -// Submitted by Mike Bostock -static.observableusercontent.com - -// Octopodal Solutions, LLC. : https://ulterius.io/ -// Submitted by Andrew Sampson -cya.gg - -// OMG.LOL : -// Submitted by Adam Newbold -omg.lol - -// Omnibond Systems, LLC. : https://www.omnibond.com -// Submitted by Cole Estep -cloudycluster.net - -// OmniWe Limited: https://omniwe.com -// Submitted by Vicary Archangel -omniwe.site - -// One.com: https://www.one.com/ -// Submitted by Jacob Bunk Nielsen -service.one - -// One Fold Media : http://www.onefoldmedia.com/ -// Submitted by Eddie Jones -nid.io - -// Open Social : https://www.getopensocial.com/ -// Submitted by Alexander Varwijk -opensocial.site - -// OpenCraft GmbH : http://opencraft.com/ -// Submitted by Sven Marnach -opencraft.hosting - -// OpenResearch GmbH: https://openresearch.com/ -// Submitted by Philipp Schmid -orsites.com - -// Opera Software, A.S.A. -// Submitted by Yngve Pettersen -operaunite.com - -// Orange : https://www.orange.com -// Submitted by Alexandre Linte -tech.orange - -// Oursky Limited : https://authgear.com/, https://skygear.io/ -// Submitted by Authgear Team , Skygear Developer -authgear-staging.com -authgearapps.com -skygearapp.com - -// OutSystems -// Submitted by Duarte Santos -outsystemscloud.com - -// OVHcloud: https://ovhcloud.com -// Submitted by Vincent Cassé -*.webpaas.ovh.net -*.hosting.ovh.net - -// OwnProvider GmbH: http://www.ownprovider.com -// Submitted by Jan Moennich -ownprovider.com -own.pm - -// OwO : https://whats-th.is/ -// Submitted by Dean Sheather -*.owo.codes - -// OX : http://www.ox.rs -// Submitted by Adam Grand -ox.rs - -// oy.lc -// Submitted by Charly Coste -oy.lc - -// Pagefog : https://pagefog.com/ -// Submitted by Derek Myers -pgfog.com - -// Pagefront : https://www.pagefronthq.com/ -// Submitted by Jason Kriss -pagefrontapp.com - -// PageXL : https://pagexl.com -// Submitted by Yann Guichard -pagexl.com - -// Paywhirl, Inc : https://paywhirl.com/ -// Submitted by Daniel Netzer -*.paywhirl.com - -// pcarrier.ca Software Inc: https://pcarrier.ca/ -// Submitted by Pierre Carrier -bar0.net -bar1.net -bar2.net -rdv.to - -// .pl domains (grandfathered) -art.pl -gliwice.pl -krakow.pl -poznan.pl -wroc.pl -zakopane.pl - -// Pantheon Systems, Inc. : https://pantheon.io/ -// Submitted by Gary Dylina -pantheonsite.io -gotpantheon.com - -// Peplink | Pepwave : http://peplink.com/ -// Submitted by Steve Leung -mypep.link - -// Perspecta : https://perspecta.com/ -// Submitted by Kenneth Van Alstyne -perspecta.cloud - -// PE Ulyanov Kirill Sergeevich : https://airy.host -// Submitted by Kirill Ulyanov -lk3.ru - -// Planet-Work : https://www.planet-work.com/ -// Submitted by Frédéric VANNIÈRE -on-web.fr - -// Platform.sh : https://platform.sh -// Submitted by Nikola Kotur -bc.platform.sh -ent.platform.sh -eu.platform.sh -us.platform.sh -*.platformsh.site -*.tst.site - -// Platter: https://platter.dev -// Submitted by Patrick Flor -platter-app.com -platter-app.dev -platterp.us - -// Plesk : https://www.plesk.com/ -// Submitted by Anton Akhtyamov -pdns.page -plesk.page -pleskns.com - -// Port53 : https://port53.io/ -// Submitted by Maximilian Schieder -dyn53.io - -// Porter : https://porter.run/ -// Submitted by Rudraksh MK -onporter.run - -// Positive Codes Technology Company : http://co.bn/faq.html -// Submitted by Zulfais -co.bn - -// Postman, Inc : https://postman.com -// Submitted by Rahul Dhawan -postman-echo.com -pstmn.io -mock.pstmn.io -httpbin.org - -//prequalifyme.today : https://prequalifyme.today -//Submitted by DeepakTiwari deepak@ivylead.io -prequalifyme.today - -// prgmr.com : https://prgmr.com/ -// Submitted by Sarah Newman -xen.prgmr.com - -// priv.at : http://www.nic.priv.at/ -// Submitted by registry -priv.at - -// privacytools.io : https://www.privacytools.io/ -// Submitted by Jonah Aragon -prvcy.page - -// Protocol Labs : https://protocol.ai/ -// Submitted by Michael Burns -*.dweb.link - -// Protonet GmbH : http://protonet.io -// Submitted by Martin Meier -protonet.io - -// Publication Presse Communication SARL : https://ppcom.fr -// Submitted by Yaacov Akiba Slama -chirurgiens-dentistes-en-france.fr -byen.site - -// pubtls.org: https://www.pubtls.org -// Submitted by Kor Nielsen -pubtls.org - -// PythonAnywhere LLP: https://www.pythonanywhere.com -// Submitted by Giles Thomas -pythonanywhere.com -eu.pythonanywhere.com - -// QOTO, Org. -// Submitted by Jeffrey Phillips Freeman -qoto.io - -// Qualifio : https://qualifio.com/ -// Submitted by Xavier De Cock -qualifioapp.com - -// QuickBackend: https://www.quickbackend.com -// Submitted by Dani Biro -qbuser.com - -// Rad Web Hosting: https://radwebhosting.com -// Submitted by Scott Claeys -cloudsite.builders - -// Redgate Software: https://red-gate.com -// Submitted by Andrew Farries -instances.spawn.cc - -// Redstar Consultants : https://www.redstarconsultants.com/ -// Submitted by Jons Slemmer -instantcloud.cn - -// Russian Academy of Sciences -// Submitted by Tech Support -ras.ru - -// QA2 -// Submitted by Daniel Dent (https://www.danieldent.com/) -qa2.com - -// QCX -// Submitted by Cassandra Beelen -qcx.io -*.sys.qcx.io - -// QNAP System Inc : https://www.qnap.com -// Submitted by Nick Chang -dev-myqnapcloud.com -alpha-myqnapcloud.com -myqnapcloud.com - -// Quip : https://quip.com -// Submitted by Patrick Linehan -*.quipelements.com - -// Qutheory LLC : http://qutheory.io -// Submitted by Jonas Schwartz -vapor.cloud -vaporcloud.io - -// Rackmaze LLC : https://www.rackmaze.com -// Submitted by Kirill Pertsev -rackmaze.com -rackmaze.net - -// Rakuten Games, Inc : https://dev.viberplay.io -// Submitted by Joshua Zhang -g.vbrplsbx.io - -// Rancher Labs, Inc : https://rancher.com -// Submitted by Vincent Fiduccia -*.on-k3s.io -*.on-rancher.cloud -*.on-rio.io - -// Read The Docs, Inc : https://www.readthedocs.org -// Submitted by David Fischer -readthedocs.io - -// Red Hat, Inc. OpenShift : https://openshift.redhat.com/ -// Submitted by Tim Kramer -rhcloud.com - -// Render : https://render.com -// Submitted by Anurag Goel -app.render.com -onrender.com - -// Repl.it : https://repl.it -// Submitted by Mason Clayton -repl.co -id.repl.co -repl.run - -// Resin.io : https://resin.io -// Submitted by Tim Perry -resindevice.io -devices.resinstaging.io - -// RethinkDB : https://www.rethinkdb.com/ -// Submitted by Chris Kastorff -hzc.io - -// Revitalised Limited : http://www.revitalised.co.uk -// Submitted by Jack Price -wellbeingzone.eu -wellbeingzone.co.uk - -// Rico Developments Limited : https://adimo.co -// Submitted by Colin Brown -adimo.co.uk - -// Riseup Networks : https://riseup.net -// Submitted by Micah Anderson -itcouldbewor.se - -// Rochester Institute of Technology : http://www.rit.edu/ -// Submitted by Jennifer Herting -git-pages.rit.edu - -// Rocky Enterprise Software Foundation : https://resf.org -// Submitted by Neil Hanlon -rocky.page - -// Rusnames Limited: http://rusnames.ru/ -// Submitted by Sergey Zotov -биз.рус -ком.рус -крым.рус -мир.рус -мск.рус -орг.рус -самара.рус -сочи.рус -спб.рус -я.рус - -// Sandstorm Development Group, Inc. : https://sandcats.io/ -// Submitted by Asheesh Laroia -sandcats.io - -// SBE network solutions GmbH : https://www.sbe.de/ -// Submitted by Norman Meilick -logoip.de -logoip.com - -// Scaleway : https://www.scaleway.com/ -// Submitted by Rémy Léone -fr-par-1.baremetal.scw.cloud -fr-par-2.baremetal.scw.cloud -nl-ams-1.baremetal.scw.cloud -fnc.fr-par.scw.cloud -functions.fnc.fr-par.scw.cloud -k8s.fr-par.scw.cloud -nodes.k8s.fr-par.scw.cloud -s3.fr-par.scw.cloud -s3-website.fr-par.scw.cloud -whm.fr-par.scw.cloud -priv.instances.scw.cloud -pub.instances.scw.cloud -k8s.scw.cloud -k8s.nl-ams.scw.cloud -nodes.k8s.nl-ams.scw.cloud -s3.nl-ams.scw.cloud -s3-website.nl-ams.scw.cloud -whm.nl-ams.scw.cloud -k8s.pl-waw.scw.cloud -nodes.k8s.pl-waw.scw.cloud -s3.pl-waw.scw.cloud -s3-website.pl-waw.scw.cloud -scalebook.scw.cloud -smartlabeling.scw.cloud -dedibox.fr - -// schokokeks.org GbR : https://schokokeks.org/ -// Submitted by Hanno Böck -schokokeks.net - -// Scottish Government: https://www.gov.scot -// Submitted by Martin Ellis -gov.scot -service.gov.scot - -// Scry Security : http://www.scrysec.com -// Submitted by Shante Adam -scrysec.com - -// Securepoint GmbH : https://www.securepoint.de -// Submitted by Erik Anders -firewall-gateway.com -firewall-gateway.de -my-gateway.de -my-router.de -spdns.de -spdns.eu -firewall-gateway.net -my-firewall.org -myfirewall.org -spdns.org - -// Seidat : https://www.seidat.com -// Submitted by Artem Kondratev -seidat.net - -// Sellfy : https://sellfy.com -// Submitted by Yuriy Romadin -sellfy.store - -// Senseering GmbH : https://www.senseering.de -// Submitted by Felix Mönckemeyer -senseering.net - -// Sendmsg: https://www.sendmsg.co.il -// Submitted by Assaf Stern -minisite.ms - -// Service Magnet : https://myservicemagnet.com -// Submitted by Dave Sanders -magnet.page - -// Service Online LLC : http://drs.ua/ -// Submitted by Serhii Bulakh -biz.ua -co.ua -pp.ua - -// Shift Crypto AG : https://shiftcrypto.ch -// Submitted by alex -shiftcrypto.dev -shiftcrypto.io - -// ShiftEdit : https://shiftedit.net/ -// Submitted by Adam Jimenez -shiftedit.io - -// Shopblocks : http://www.shopblocks.com/ -// Submitted by Alex Bowers -myshopblocks.com - -// Shopify : https://www.shopify.com -// Submitted by Alex Richter -myshopify.com - -// Shopit : https://www.shopitcommerce.com/ -// Submitted by Craig McMahon -shopitsite.com - -// shopware AG : https://shopware.com -// Submitted by Jens Küper -shopware.store - -// Siemens Mobility GmbH -// Submitted by Oliver Graebner -mo-siemens.io - -// SinaAppEngine : http://sae.sina.com.cn/ -// Submitted by SinaAppEngine -1kapp.com -appchizi.com -applinzi.com -sinaapp.com -vipsinaapp.com - -// Siteleaf : https://www.siteleaf.com/ -// Submitted by Skylar Challand -siteleaf.net - -// Skyhat : http://www.skyhat.io -// Submitted by Shante Adam -bounty-full.com -alpha.bounty-full.com -beta.bounty-full.com - -// Small Technology Foundation : https://small-tech.org -// Submitted by Aral Balkan -small-web.org - -// Smoove.io : https://www.smoove.io/ -// Submitted by Dan Kozak -vp4.me - -// Snowplow Analytics : https://snowplowanalytics.com/ -// Submitted by Ian Streeter -try-snowplow.com - -// SourceHut : https://sourcehut.org -// Submitted by Drew DeVault -srht.site - -// Stackhero : https://www.stackhero.io -// Submitted by Adrien Gillon -stackhero-network.com - -// Staclar : https://staclar.com -// Submitted by Q Misell -musician.io -// Submitted by Matthias Merkel -novecore.site - -// staticland : https://static.land -// Submitted by Seth Vincent -static.land -dev.static.land -sites.static.land - -// Storebase : https://www.storebase.io -// Submitted by Tony Schirmer -storebase.store - -// Strategic System Consulting (eApps Hosting): https://www.eapps.com/ -// Submitted by Alex Oancea -vps-host.net -atl.jelastic.vps-host.net -njs.jelastic.vps-host.net -ric.jelastic.vps-host.net - -// Sony Interactive Entertainment LLC : https://sie.com/ -// Submitted by David Coles -playstation-cloud.com - -// SourceLair PC : https://www.sourcelair.com -// Submitted by Antonis Kalipetis -apps.lair.io -*.stolos.io - -// SpaceKit : https://www.spacekit.io/ -// Submitted by Reza Akhavan -spacekit.io - -// SpeedPartner GmbH: https://www.speedpartner.de/ -// Submitted by Stefan Neufeind -customer.speedpartner.de - -// Spreadshop (sprd.net AG) : https://www.spreadshop.com/ -// Submitted by Martin Breest -myspreadshop.at -myspreadshop.com.au -myspreadshop.be -myspreadshop.ca -myspreadshop.ch -myspreadshop.com -myspreadshop.de -myspreadshop.dk -myspreadshop.es -myspreadshop.fi -myspreadshop.fr -myspreadshop.ie -myspreadshop.it -myspreadshop.net -myspreadshop.nl -myspreadshop.no -myspreadshop.pl -myspreadshop.se -myspreadshop.co.uk - -// Standard Library : https://stdlib.com -// Submitted by Jacob Lee -api.stdlib.com - -// Storj Labs Inc. : https://storj.io/ -// Submitted by Philip Hutchins -storj.farm - -// Studenten Net Twente : http://www.snt.utwente.nl/ -// Submitted by Silke Hofstra -utwente.io - -// Student-Run Computing Facility : https://www.srcf.net/ -// Submitted by Edwin Balani -soc.srcf.net -user.srcf.net - -// Sub 6 Limited: http://www.sub6.com -// Submitted by Dan Miller -temp-dns.com - -// Supabase : https://supabase.io -// Submitted by Inian Parameshwaran -supabase.co -supabase.in -supabase.net -su.paba.se - -// Symfony, SAS : https://symfony.com/ -// Submitted by Fabien Potencier -*.s5y.io -*.sensiosite.cloud - -// Syncloud : https://syncloud.org -// Submitted by Boris Rybalkin -syncloud.it - -// Synology, Inc. : https://www.synology.com/ -// Submitted by Rony Weng -dscloud.biz -direct.quickconnect.cn -dsmynas.com -familyds.com -diskstation.me -dscloud.me -i234.me -myds.me -synology.me -dscloud.mobi -dsmynas.net -familyds.net -dsmynas.org -familyds.org -vpnplus.to -direct.quickconnect.to - -// Tabit Technologies Ltd. : https://tabit.cloud/ -// Submitted by Oren Agiv -tabitorder.co.il - -// TAIFUN Software AG : http://taifun-software.de -// Submitted by Bjoern Henke -taifun-dns.de - -// Tailscale Inc. : https://www.tailscale.com -// Submitted by David Anderson -beta.tailscale.net -ts.net - -// TASK geographical domains (www.task.gda.pl/uslugi/dns) -gda.pl -gdansk.pl -gdynia.pl -med.pl -sopot.pl - -// team.blue https://team.blue -// Submitted by Cedric Dubois -site.tb-hosting.com - -// Teckids e.V. : https://www.teckids.org -// Submitted by Dominik George -edugit.io -s3.teckids.org - -// Telebit : https://telebit.cloud -// Submitted by AJ ONeal -telebit.app -telebit.io -*.telebit.xyz - -// The Gwiddle Foundation : https://gwiddlefoundation.org.uk -// Submitted by Joshua Bayfield -gwiddle.co.uk - -// Thingdust AG : https://thingdust.com/ -// Submitted by Adrian Imboden -*.firenet.ch -*.svc.firenet.ch -reservd.com -thingdustdata.com -cust.dev.thingdust.io -cust.disrec.thingdust.io -cust.prod.thingdust.io -cust.testing.thingdust.io -reservd.dev.thingdust.io -reservd.disrec.thingdust.io -reservd.testing.thingdust.io - -// ticket i/O GmbH : https://ticket.io -// Submitted by Christian Franke -tickets.io - -// Tlon.io : https://tlon.io -// Submitted by Mark Staarink -arvo.network -azimuth.network -tlon.network - -// Tor Project, Inc. : https://torproject.org -// Submitted by Antoine Beaupré -bloxcms.com -townnews-staging.com - -// TradableBits: https://tradablebits.com -// Submitted by Dmitry Khrisanov dmitry@tradablebits.com -tbits.me - -// TrafficPlex GmbH : https://www.trafficplex.de/ -// Submitted by Phillipp Röll -12hp.at -2ix.at -4lima.at -lima-city.at -12hp.ch -2ix.ch -4lima.ch -lima-city.ch -trafficplex.cloud -de.cool -12hp.de -2ix.de -4lima.de -lima-city.de -1337.pictures -clan.rip -lima-city.rocks -webspace.rocks -lima.zone - -// TransIP : https://www.transip.nl -// Submitted by Rory Breuk -*.transurl.be -*.transurl.eu -*.transurl.nl - -// TransIP: https://www.transip.nl -// Submitted by Cedric Dubois -site.transip.me - -// TuxFamily : http://tuxfamily.org -// Submitted by TuxFamily administrators -tuxfamily.org - -// TwoDNS : https://www.twodns.de/ -// Submitted by TwoDNS-Support -dd-dns.de -diskstation.eu -diskstation.org -dray-dns.de -draydns.de -dyn-vpn.de -dynvpn.de -mein-vigor.de -my-vigor.de -my-wan.de -syno-ds.de -synology-diskstation.de -synology-ds.de - -// Typedream : https://typedream.com -// Submitted by Putri Karunia -typedream.app - -// Typeform : https://www.typeform.com -// Submitted by Sergi Ferriz -pro.typeform.com - -// Uberspace : https://uberspace.de -// Submitted by Moritz Werner -uber.space -*.uberspace.de - -// UDR Limited : http://www.udr.hk.com -// Submitted by registry -hk.com -hk.org -ltd.hk -inc.hk - -// United Gameserver GmbH : https://united-gameserver.de -// Submitted by Stefan Schwarz -virtualuser.de -virtual-user.de - -// Upli : https://upli.io -// Submitted by Lenny Bakkalian -upli.io - -// urown.net : https://urown.net -// Submitted by Hostmaster -urown.cloud -dnsupdate.info - -// .US -// Submitted by Ed Moore -lib.de.us - -// VeryPositive SIA : http://very.lv -// Submitted by Danko Aleksejevs -2038.io - -// Vercel, Inc : https://vercel.com/ -// Submitted by Connor Davis -vercel.app -vercel.dev -now.sh - -// Viprinet Europe GmbH : http://www.viprinet.com -// Submitted by Simon Kissel -router.management - -// Virtual-Info : https://www.virtual-info.info/ -// Submitted by Adnan RIHAN -v-info.info - -// Voorloper.com: https://voorloper.com -// Submitted by Nathan van Bakel -voorloper.cloud - -// Voxel.sh DNS : https://voxel.sh/dns/ -// Submitted by Mia Rehlinger -neko.am -nyaa.am -be.ax -cat.ax -es.ax -eu.ax -gg.ax -mc.ax -us.ax -xy.ax -nl.ci -xx.gl -app.gp -blog.gt -de.gt -to.gt -be.gy -cc.hn -blog.kg -io.kg -jp.kg -tv.kg -uk.kg -us.kg -de.ls -at.md -de.md -jp.md -to.md -indie.porn -vxl.sh -ch.tc -me.tc -we.tc -nyan.to -at.vg -blog.vu -dev.vu -me.vu - -// V.UA Domain Administrator : https://domain.v.ua/ -// Submitted by Serhii Rostilo -v.ua - -// Vultr Objects : https://www.vultr.com/products/object-storage/ -// Submitted by Niels Maumenee -*.vultrobjects.com - -// Waffle Computer Inc., Ltd. : https://docs.waffleinfo.com -// Submitted by Masayuki Note -wafflecell.com - -// WebHare bv: https://www.webhare.com/ -// Submitted by Arnold Hendriks -*.webhare.dev - -// WebHotelier Technologies Ltd: https://www.webhotelier.net/ -// Submitted by Apostolos Tsakpinis -reserve-online.net -reserve-online.com -bookonline.app -hotelwithflight.com - -// WeDeploy by Liferay, Inc. : https://www.wedeploy.com -// Submitted by Henrique Vicente -wedeploy.io -wedeploy.me -wedeploy.sh - -// Western Digital Technologies, Inc : https://www.wdc.com -// Submitted by Jung Jin -remotewd.com - -// WIARD Enterprises : https://wiardweb.com -// Submitted by Kidd Hustle -pages.wiardweb.com - -// Wikimedia Labs : https://wikitech.wikimedia.org -// Submitted by Arturo Borrero Gonzalez -wmflabs.org -toolforge.org -wmcloud.org - -// WISP : https://wisp.gg -// Submitted by Stepan Fedotov -panel.gg -daemon.panel.gg - -// Wizard Zines : https://wizardzines.com -// Submitted by Julia Evans -messwithdns.com - -// WoltLab GmbH : https://www.woltlab.com -// Submitted by Tim Düsterhus -woltlab-demo.com -myforum.community -community-pro.de -diskussionsbereich.de -community-pro.net -meinforum.net - -// Woods Valldata : https://www.woodsvalldata.co.uk/ -// Submitted by Chris Whittle -affinitylottery.org.uk -raffleentry.org.uk -weeklylottery.org.uk - -// WP Engine : https://wpengine.com/ -// Submitted by Michael Smith -// Submitted by Brandon DuRette -wpenginepowered.com -js.wpenginepowered.com - -// Wix.com, Inc. : https://www.wix.com -// Submitted by Shahar Talmi -wixsite.com -editorx.io - -// XenonCloud GbR: https://xenoncloud.net -// Submitted by Julian Uphoff -half.host - -// XnBay Technology : http://www.xnbay.com/ -// Submitted by XnBay Developer -xnbay.com -u2.xnbay.com -u2-local.xnbay.com - -// XS4ALL Internet bv : https://www.xs4all.nl/ -// Submitted by Daniel Mostertman -cistron.nl -demon.nl -xs4all.space - -// Yandex.Cloud LLC: https://cloud.yandex.com -// Submitted by Alexander Lodin -yandexcloud.net -storage.yandexcloud.net -website.yandexcloud.net - -// YesCourse Pty Ltd : https://yescourse.com -// Submitted by Atul Bhouraskar -official.academy - -// Yola : https://www.yola.com/ -// Submitted by Stefano Rivera -yolasite.com - -// Yombo : https://yombo.net -// Submitted by Mitch Schwenk -ybo.faith -yombo.me -homelink.one -ybo.party -ybo.review -ybo.science -ybo.trade - -// Yunohost : https://yunohost.org -// Submitted by Valentin Grimaud -ynh.fr -nohost.me -noho.st - -// ZaNiC : http://www.za.net/ -// Submitted by registry -za.net -za.org - -// Zine EOOD : https://zine.bg/ -// Submitted by Martin Angelov -bss.design - -// Zitcom A/S : https://www.zitcom.dk -// Submitted by Emil Stahl -basicserver.io -virtualserver.io -enterprisecloud.nu - -// ===END PRIVATE DOMAINS=== diff --git a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/public_suffix.gemspec b/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/public_suffix.gemspec deleted file mode 100644 index ae552fc..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/public_suffix.gemspec +++ /dev/null @@ -1,29 +0,0 @@ -# -*- encoding: utf-8 -*- -$LOAD_PATH.push File.expand_path("../lib", __FILE__) -require "public_suffix/version" - -Gem::Specification.new do |s| - s.name = "public_suffix" - s.version = PublicSuffix::VERSION - s.authors = ["Simone Carletti"] - s.email = ["weppos@weppos.net"] - s.homepage = "https://simonecarletti.com/code/publicsuffix-ruby" - s.summary = "Domain name parser based on the Public Suffix List." - s.description = "PublicSuffix can parse and decompose a domain name into top level domain, domain and subdomains." - s.licenses = ["MIT"] - - s.metadata = { - "bug_tracker_uri" => "https://github.com/weppos/publicsuffix-ruby/issues", - "changelog_uri" => "https://github.com/weppos/publicsuffix-ruby/blob/master/CHANGELOG.md", - "documentation_uri" => "https://rubydoc.info/gems/#{s.name}/#{s.version}", - "homepage_uri" => s.homepage, - "source_code_uri" => "https://github.com/weppos/publicsuffix-ruby/tree/v#{s.version}", - } - - s.required_ruby_version = ">= 2.3" - - s.require_paths = ["lib"] - s.files = `git ls-files`.split("\n") - s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n") - s.extra_rdoc_files = %w( LICENSE.txt ) -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/.empty b/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/.empty deleted file mode 100644 index e322015..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/.empty +++ /dev/null @@ -1,2 +0,0 @@ -# This is an empty file I use to force a non-empty commit when I only need to store notes -.. \ No newline at end of file diff --git a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/acceptance_test.rb b/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/acceptance_test.rb deleted file mode 100644 index 371bfe1..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/acceptance_test.rb +++ /dev/null @@ -1,131 +0,0 @@ -# frozen_string_literal: true - -require "test_helper" - -class AcceptanceTest < Minitest::Test - - VALID_CASES = [ - ["example.com", "example.com", [nil, "example", "com"]], - ["foo.example.com", "example.com", ["foo", "example", "com"]], - - ["verybritish.co.uk", "verybritish.co.uk", [nil, "verybritish", "co.uk"]], - ["foo.verybritish.co.uk", "verybritish.co.uk", ["foo", "verybritish", "co.uk"]], - - ["parliament.uk", "parliament.uk", [nil, "parliament", "uk"]], - ["foo.parliament.uk", "parliament.uk", ["foo", "parliament", "uk"]], - ].freeze - - def test_valid - VALID_CASES.each do |input, domain, results| - parsed = PublicSuffix.parse(input) - trd, sld, tld = results - assert_equal tld, parsed.tld, "Invalid tld for `#{name}`" - assert_equal sld, parsed.sld, "Invalid sld for `#{name}`" - if trd.nil? - assert_nil parsed.trd, "Invalid trd for `#{name}`" - else - assert_equal trd, parsed.trd, "Invalid trd for `#{name}`" - end - - assert_equal domain, PublicSuffix.domain(input) - assert PublicSuffix.valid?(input) - end - end - - - INVALID_CASES = [ - ["nic.bd", PublicSuffix::DomainNotAllowed], - [nil, PublicSuffix::DomainInvalid], - ["", PublicSuffix::DomainInvalid], - [" ", PublicSuffix::DomainInvalid], - ].freeze - - def test_invalid - INVALID_CASES.each do |(name, error)| - assert_raises(error) { PublicSuffix.parse(name) } - assert !PublicSuffix.valid?(name) - end - end - - - REJECTED_CASES = [ - ["www. .com", true], - ["foo.co..uk", true], - ["goo,gle.com", true], - ["-google.com", true], - ["google-.com", true], - - # This case was covered in GH-15. - # I decided to cover this case because it's not easily reproducible with URI.parse - # and can lead to several false positives. - ["http://google.com", false], - ].freeze - - def test_rejected - REJECTED_CASES.each do |name, expected| - assert_equal expected, PublicSuffix.valid?(name), - "Expected %s to be %s" % [name.inspect, expected.inspect] - assert !valid_domain?(name), - "#{name} expected to be invalid" - end - end - - - CASE_CASES = [ - ["Www.google.com", %w( www google com )], - ["www.Google.com", %w( www google com )], - ["www.google.Com", %w( www google com )], - ].freeze - - def test_ignore_case - CASE_CASES.each do |name, results| - domain = PublicSuffix.parse(name) - trd, sld, tld = results - assert_equal tld, domain.tld, "Invalid tld for `#{name}'" - assert_equal sld, domain.sld, "Invalid sld for `#{name}'" - assert_equal trd, domain.trd, "Invalid trd for `#{name}'" - assert PublicSuffix.valid?(name) - end - end - - - INCLUDE_PRIVATE_CASES = [ - ["blogspot.com", true, "blogspot.com"], - ["blogspot.com", false, nil], - ["subdomain.blogspot.com", true, "blogspot.com"], - ["subdomain.blogspot.com", false, "subdomain.blogspot.com"], - ].freeze - - # rubocop:disable Style/CombinableLoops - def test_ignore_private - # test domain and parse - INCLUDE_PRIVATE_CASES.each do |given, ignore_private, expected| - if expected.nil? - assert_nil PublicSuffix.domain(given, ignore_private: ignore_private) - else - assert_equal expected, PublicSuffix.domain(given, ignore_private: ignore_private) - end - end - # test valid? - INCLUDE_PRIVATE_CASES.each do |given, ignore_private, expected| - assert_equal !expected.nil?, PublicSuffix.valid?(given, ignore_private: ignore_private) - end - end - # rubocop:enable Style/CombinableLoops - - - def valid_uri?(name) - uri = URI.parse(name) - !uri.host.nil? - rescue StandardError - false - end - - def valid_domain?(name) - uri = URI.parse(name) - !uri.host.nil? && uri.scheme.nil? - rescue StandardError - false - end - -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/benchmarks/bm_find.rb b/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/benchmarks/bm_find.rb deleted file mode 100644 index 0074f1d..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/benchmarks/bm_find.rb +++ /dev/null @@ -1,66 +0,0 @@ -require 'benchmark' -require_relative "../../lib/public_suffix" - -NAME_SHORT = "example.de" -NAME_MEDIUM = "www.subdomain.example.de" -NAME_LONG = "one.two.three.four.five.example.de" -NAME_WILD = "one.two.three.four.five.example.bd" -NAME_EXCP = "one.two.three.four.five.www.ck" - -IAAA = "www.example.ac" -IZZZ = "www.example.zone" - -PAAA = "one.two.three.four.five.example.beep.pl" -PZZZ = "one.two.three.four.five.example.now.sh" - -JP = "www.yokoshibahikari.chiba.jp" -IT = "www.example.it" -COM = "www.example.com" - -TIMES = (ARGV.first || 50_000).to_i - -# Initialize -PublicSuffixList = PublicSuffix::List.default -PublicSuffixList.find("example.com") - -Benchmark.bmbm(25) do |x| - x.report("NAME_SHORT") do - TIMES.times { PublicSuffixList.find(NAME_SHORT) != nil } - end - x.report("NAME_MEDIUM") do - TIMES.times { PublicSuffixList.find(NAME_MEDIUM) != nil } - end - x.report("NAME_LONG") do - TIMES.times { PublicSuffixList.find(NAME_LONG) != nil } - end - x.report("NAME_WILD") do - TIMES.times { PublicSuffixList.find(NAME_WILD) != nil } - end - x.report("NAME_EXCP") do - TIMES.times { PublicSuffixList.find(NAME_EXCP) != nil } - end - - x.report("IAAA") do - TIMES.times { PublicSuffixList.find(IAAA) != nil } - end - x.report("IZZZ") do - TIMES.times { PublicSuffixList.find(IZZZ) != nil } - end - - x.report("PAAA") do - TIMES.times { PublicSuffixList.find(PAAA) != nil } - end - x.report("PZZZ") do - TIMES.times { PublicSuffixList.find(PZZZ) != nil } - end - - x.report("JP") do - TIMES.times { PublicSuffixList.find(JP) != nil } - end - x.report("IT") do - TIMES.times { PublicSuffixList.find(IT) != nil } - end - x.report("COM") do - TIMES.times { PublicSuffixList.find(COM) != nil } - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/benchmarks/bm_find_all.rb b/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/benchmarks/bm_find_all.rb deleted file mode 100644 index 0bcfd42..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/benchmarks/bm_find_all.rb +++ /dev/null @@ -1,102 +0,0 @@ -require 'benchmark' -require_relative "../../lib/public_suffix" - -NAME_SHORT = "example.de" -NAME_MEDIUM = "www.subdomain.example.de" -NAME_LONG = "one.two.three.four.five.example.de" -NAME_WILD = "one.two.three.four.five.example.bd" -NAME_EXCP = "one.two.three.four.five.www.ck" - -IAAA = "www.example.ac" -IZZZ = "www.example.zone" - -PAAA = "one.two.three.four.five.example.beep.pl" -PZZZ = "one.two.three.four.five.example.now.sh" - -JP = "www.yokoshibahikari.chiba.jp" -IT = "www.example.it" -COM = "www.example.com" - -TIMES = (ARGV.first || 50_000).to_i - -# Initialize -PublicSuffixList = PublicSuffix::List.default -PublicSuffixList.find("example.com") - -Benchmark.bmbm(25) do |x| - x.report("NAME_SHORT") do - TIMES.times { PublicSuffixList.find(NAME_SHORT) != nil } - end - x.report("NAME_SHORT (noprivate)") do - TIMES.times { PublicSuffixList.find(NAME_SHORT, ignore_private: true) != nil } - end - x.report("NAME_MEDIUM") do - TIMES.times { PublicSuffixList.find(NAME_MEDIUM) != nil } - end - x.report("NAME_MEDIUM (noprivate)") do - TIMES.times { PublicSuffixList.find(NAME_MEDIUM, ignore_private: true) != nil } - end - x.report("NAME_LONG") do - TIMES.times { PublicSuffixList.find(NAME_LONG) != nil } - end - x.report("NAME_LONG (noprivate)") do - TIMES.times { PublicSuffixList.find(NAME_LONG, ignore_private: true) != nil } - end - x.report("NAME_WILD") do - TIMES.times { PublicSuffixList.find(NAME_WILD) != nil } - end - x.report("NAME_WILD (noprivate)") do - TIMES.times { PublicSuffixList.find(NAME_WILD, ignore_private: true) != nil } - end - x.report("NAME_EXCP") do - TIMES.times { PublicSuffixList.find(NAME_EXCP) != nil } - end - x.report("NAME_EXCP (noprivate)") do - TIMES.times { PublicSuffixList.find(NAME_EXCP, ignore_private: true) != nil } - end - - x.report("IAAA") do - TIMES.times { PublicSuffixList.find(IAAA) != nil } - end - x.report("IAAA (noprivate)") do - TIMES.times { PublicSuffixList.find(IAAA, ignore_private: true) != nil } - end - x.report("IZZZ") do - TIMES.times { PublicSuffixList.find(IZZZ) != nil } - end - x.report("IZZZ (noprivate)") do - TIMES.times { PublicSuffixList.find(IZZZ, ignore_private: true) != nil } - end - - x.report("PAAA") do - TIMES.times { PublicSuffixList.find(PAAA) != nil } - end - x.report("PAAA (noprivate)") do - TIMES.times { PublicSuffixList.find(PAAA, ignore_private: true) != nil } - end - x.report("PZZZ") do - TIMES.times { PublicSuffixList.find(PZZZ) != nil } - end - x.report("PZZZ (noprivate)") do - TIMES.times { PublicSuffixList.find(PZZZ, ignore_private: true) != nil } - end - - x.report("JP") do - TIMES.times { PublicSuffixList.find(JP) != nil } - end - x.report("JP (noprivate)") do - TIMES.times { PublicSuffixList.find(JP, ignore_private: true) != nil } - end - x.report("IT") do - TIMES.times { PublicSuffixList.find(IT) != nil } - end - x.report("IT (noprivate)") do - TIMES.times { PublicSuffixList.find(IT, ignore_private: true) != nil } - end - x.report("COM") do - TIMES.times { PublicSuffixList.find(COM) != nil } - end - x.report("COM (noprivate)") do - TIMES.times { PublicSuffixList.find(COM, ignore_private: true) != nil } - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/benchmarks/bm_names.rb b/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/benchmarks/bm_names.rb deleted file mode 100644 index 36b2bce..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/benchmarks/bm_names.rb +++ /dev/null @@ -1,91 +0,0 @@ -require 'benchmark/ips' - -STRING = "www.subdomain.example.com" -ARRAY = %w( - com - example.com - subdomain.example.com - www.subdomain.example.com -) - -def tokenizer1(string) - parts = string.split(".").reverse! - index = 0 - query = parts[index] - names = [] - - loop do - names << query - - index += 1 - break if index >= parts.size - query = parts[index] + "." + query - end - names -end - -def tokenizer2(string) - parts = string.split(".") - index = parts.size - 1 - query = parts[index] - names = [] - - loop do - names << query - - index -= 1 - break if index < 0 - query = parts[index] + "." + query - end - names -end - -def tokenizer3(string) - isx = string.size - idx = string.size - 1 - names = [] - - loop do - isx = string.rindex(".", isx - 1) || -1 - names << string[isx + 1, idx - isx] - - break if isx <= 0 - end - names -end - -def tokenizer4(string) - isx = string.size - idx = string.size - 1 - names = [] - - loop do - isx = string.rindex(".", isx - 1) || -1 - names << string[(isx+1)..idx] - - break if isx <= 0 - end - names -end - -(x = tokenizer1(STRING)) == ARRAY or fail("tokenizer1 failed: #{x.inspect}") -(x = tokenizer2(STRING)) == ARRAY or fail("tokenizer2 failed: #{x.inspect}") -(x = tokenizer3(STRING)) == ARRAY or fail("tokenizer3 failed: #{x.inspect}") -(x = tokenizer4(STRING)) == ARRAY or fail("tokenizer4 failed: #{x.inspect}") - -Benchmark.ips do |x| - x.report("tokenizer1") do - tokenizer1(STRING).is_a?(Array) - end - x.report("tokenizer2") do - tokenizer2(STRING).is_a?(Array) - end - x.report("tokenizer3") do - tokenizer3(STRING).is_a?(Array) - end - x.report("tokenizer4") do - tokenizer4(STRING).is_a?(Array) - end - - x.compare! -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/benchmarks/bm_select.rb b/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/benchmarks/bm_select.rb deleted file mode 100644 index 66d908b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/benchmarks/bm_select.rb +++ /dev/null @@ -1,26 +0,0 @@ -require 'benchmark' -require_relative "../../lib/public_suffix" - -JP = "www.yokoshibahikari.chiba.jp" - -TIMES = (ARGV.first || 50_000).to_i - -# Initialize -class PublicSuffix::List - public :select -end -PublicSuffixList = PublicSuffix::List.default -PublicSuffixList.select("example.jp") -PublicSuffixList.find("example.jp") - -Benchmark.bmbm(25) do |x| - x.report("JP select") do - TIMES.times { PublicSuffixList.select(JP) } - end - x.report("JP find") do - TIMES.times { PublicSuffixList.find(JP) } - end - # x.report("JP (noprivate)") do - # TIMES.times { PublicSuffixList.find(JP, ignore_private: true) != nil } - # end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/benchmarks/bm_select_incremental.rb b/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/benchmarks/bm_select_incremental.rb deleted file mode 100644 index f002c82..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/benchmarks/bm_select_incremental.rb +++ /dev/null @@ -1,25 +0,0 @@ -require 'benchmark' -require_relative "../../lib/public_suffix" - -JP = "www.yokoshibahikari.chiba.jp" - -TIMES = (ARGV.first || 50_000).to_i - -# Initialize -class PublicSuffix::List - public :select -end -PublicSuffixList = PublicSuffix::List.default -PublicSuffixList.select("example.jp") - -Benchmark.bmbm(25) do |x| - x.report("select jp") do - TIMES.times { PublicSuffixList.select("jp") } - end - x.report("select example.jp") do - TIMES.times { PublicSuffixList.select("example.jp") } - end - x.report("select www.example.jp") do - TIMES.times { PublicSuffixList.select("www.example.jp") } - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/benchmarks/bm_valid.rb b/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/benchmarks/bm_valid.rb deleted file mode 100644 index a484451..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/benchmarks/bm_valid.rb +++ /dev/null @@ -1,101 +0,0 @@ -require 'benchmark' -require_relative "../../lib/public_suffix" - -NAME_SHORT = "example.de" -NAME_MEDIUM = "www.subdomain.example.de" -NAME_LONG = "one.two.three.four.five.example.de" -NAME_WILD = "one.two.three.four.five.example.bd" -NAME_EXCP = "one.two.three.four.five.www.ck" - -IAAA = "www.example.ac" -IZZZ = "www.example.zone" - -PAAA = "one.two.three.four.five.example.beep.pl" -PZZZ = "one.two.three.four.five.example.now.sh" - -JP = "www.yokoshibahikari.chiba.jp" -IT = "www.example.it" -COM = "www.example.com" - -TIMES = (ARGV.first || 50_000).to_i - -# Initialize -PublicSuffix.valid?("example.com") - -Benchmark.bmbm(25) do |x| - x.report("NAME_SHORT") do - TIMES.times { PublicSuffix.valid?(NAME_SHORT) == true } - end - x.report("NAME_SHORT (noprivate)") do - TIMES.times { PublicSuffix.valid?(NAME_SHORT, ignore_private: true) == true } - end - x.report("NAME_MEDIUM") do - TIMES.times { PublicSuffix.valid?(NAME_MEDIUM) == true } - end - x.report("NAME_MEDIUM (noprivate)") do - TIMES.times { PublicSuffix.valid?(NAME_MEDIUM, ignore_private: true) == true } - end - x.report("NAME_LONG") do - TIMES.times { PublicSuffix.valid?(NAME_LONG) == true } - end - x.report("NAME_LONG (noprivate)") do - TIMES.times { PublicSuffix.valid?(NAME_LONG, ignore_private: true) == true } - end - x.report("NAME_WILD") do - TIMES.times { PublicSuffix.valid?(NAME_WILD) == true } - end - x.report("NAME_WILD (noprivate)") do - TIMES.times { PublicSuffix.valid?(NAME_WILD, ignore_private: true) == true } - end - x.report("NAME_EXCP") do - TIMES.times { PublicSuffix.valid?(NAME_EXCP) == true } - end - x.report("NAME_EXCP (noprivate)") do - TIMES.times { PublicSuffix.valid?(NAME_EXCP, ignore_private: true) == true } - end - - x.report("IAAA") do - TIMES.times { PublicSuffix.valid?(IAAA) == true } - end - x.report("IAAA (noprivate)") do - TIMES.times { PublicSuffix.valid?(IAAA, ignore_private: true) == true } - end - x.report("IZZZ") do - TIMES.times { PublicSuffix.valid?(IZZZ) == true } - end - x.report("IZZZ (noprivate)") do - TIMES.times { PublicSuffix.valid?(IZZZ, ignore_private: true) == true } - end - - x.report("PAAA") do - TIMES.times { PublicSuffix.valid?(PAAA) == true } - end - x.report("PAAA (noprivate)") do - TIMES.times { PublicSuffix.valid?(PAAA, ignore_private: true) == true } - end - x.report("PZZZ") do - TIMES.times { PublicSuffix.valid?(PZZZ) == true } - end - x.report("PZZZ (noprivate)") do - TIMES.times { PublicSuffix.valid?(PZZZ, ignore_private: true) == true } - end - - x.report("JP") do - TIMES.times { PublicSuffix.valid?(JP) == true } - end - x.report("JP (noprivate)") do - TIMES.times { PublicSuffix.valid?(JP, ignore_private: true) == true } - end - x.report("IT") do - TIMES.times { PublicSuffix.valid?(IT) == true } - end - x.report("IT (noprivate)") do - TIMES.times { PublicSuffix.valid?(IT, ignore_private: true) == true } - end - x.report("COM") do - TIMES.times { PublicSuffix.valid?(COM) == true } - end - x.report("COM (noprivate)") do - TIMES.times { PublicSuffix.valid?(COM, ignore_private: true) == true } - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/profilers/domain_profiler.rb b/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/profilers/domain_profiler.rb deleted file mode 100644 index 1ed1050..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/profilers/domain_profiler.rb +++ /dev/null @@ -1,12 +0,0 @@ -$LOAD_PATH.unshift File.expand_path("../../lib", __dir__) - -require "memory_profiler" -require "public_suffix" - -PublicSuffix::List.default - -report = MemoryProfiler.report do - PublicSuffix.domain("www.example.com") -end - -report.pretty_print diff --git a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/profilers/find_profiler.rb b/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/profilers/find_profiler.rb deleted file mode 100644 index 53d28eb..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/profilers/find_profiler.rb +++ /dev/null @@ -1,12 +0,0 @@ -$LOAD_PATH.unshift File.expand_path("../../lib", __dir__) - -require "memory_profiler" -require "public_suffix" - -PublicSuffix::List.default - -report = MemoryProfiler.report do - PublicSuffix::List.default.find("www.example.com") -end - -report.pretty_print diff --git a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/profilers/find_profiler_jp.rb b/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/profilers/find_profiler_jp.rb deleted file mode 100644 index 65c13fe..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/profilers/find_profiler_jp.rb +++ /dev/null @@ -1,12 +0,0 @@ -$LOAD_PATH.unshift File.expand_path("../../lib", __dir__) - -require "memory_profiler" -require "public_suffix" - -PublicSuffix::List.default - -report = MemoryProfiler.report do - PublicSuffix::List.default.find("a.b.ide.kyoto.jp") -end - -report.pretty_print diff --git a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/profilers/initialization_profiler.rb b/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/profilers/initialization_profiler.rb deleted file mode 100644 index 008b1e7..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/profilers/initialization_profiler.rb +++ /dev/null @@ -1,11 +0,0 @@ -$LOAD_PATH.unshift File.expand_path("../../lib", __dir__) - -require "memory_profiler" -require "public_suffix" - -report = MemoryProfiler.report do - PublicSuffix::List.default -end - -report.pretty_print -# report.pretty_print(to_file: 'profiler-%s-%d.txt' % [ARGV[0], Time.now.to_i]) diff --git a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/profilers/list_profsize.rb b/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/profilers/list_profsize.rb deleted file mode 100644 index 0b98b4b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/profilers/list_profsize.rb +++ /dev/null @@ -1,11 +0,0 @@ -$LOAD_PATH.unshift File.expand_path("../../lib", __dir__) - -require_relative "object_binsize" -require "public_suffix" - -list = PublicSuffix::List.default -puts "#{list.size} rules:" - -prof = ObjectBinsize.new -prof.report(PublicSuffix::List.default, label: "PublicSuffix::List size") -prof.report(PublicSuffix::List.default.instance_variable_get(:@rules), label: "Size of rules") diff --git a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/profilers/object_binsize.rb b/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/profilers/object_binsize.rb deleted file mode 100644 index dc60bdb..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/profilers/object_binsize.rb +++ /dev/null @@ -1,57 +0,0 @@ -require 'tempfile' - -# A very simple memory profiles that checks the full size of a variable -# by serializing into a binary file. -# -# Yes, I know this is very rough, but there are cases where ObjectSpace.memsize_of -# doesn't cooperate, and this is one of the possible workarounds. -# -# For certain cases, it works (TM). -class ObjectBinsize - - def measure(var, label: nil) - dump(var, label: label) - end - - def report(var, label: nil, padding: 10) - file = measure(var, label: label) - - size = format_integer(file.size) - name = label || File.basename(file.path) - printf("%#{padding}s %s\n", size, name) - end - - private - - def dump(var, **args) - file = Tempfile.new(args[:label].to_s) - file.write(Marshal.dump(var)) - file - ensure - file.close - end - - def format_integer(int) - int.to_s.reverse.gsub(/...(?=.)/, '\&,').reverse - end - -end - -if __FILE__ == $0 - prof = ObjectBinsize.new - - prof.report(nil, label: "nil") - prof.report(false, label: "false") - prof.report(true, label: "true") - prof.report(0, label: "integer") - prof.report("", label: "empty string") - prof.report({}, label: "empty hash") - prof.report({}, label: "empty array") - - prof.report({ foo: "1" }, label: "hash 1 item (symbol)") - prof.report({ foo: "1", bar: 2 }, label: "hash 2 items (symbol)") - prof.report({ "foo" => "1" }, label: "hash 1 item (string)") - prof.report({ "foo" => "1", "bar" => 2 }, label: "hash 2 items (string)") - - prof.report("big string" * 200, label: "big string * 200") -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/psl_test.rb b/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/psl_test.rb deleted file mode 100644 index fae398f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/psl_test.rb +++ /dev/null @@ -1,52 +0,0 @@ -# frozen_string_literal: true - -require "test_helper" -require "public_suffix" - -# This test runs against the current PSL file and ensures -# the definitions satisfies the test suite. -class PslTest < Minitest::Test - - ROOT = File.expand_path("..", __dir__) - - # rubocop:disable Security/Eval - def self.tests - File.readlines(File.join(ROOT, "test/tests.txt")).map do |line| - line = line.strip - next if line.empty? - next if line.start_with?("//") - - input, output = line.split(", ") - - # handle the case of eval("null"), it must be eval("nil") - input = "nil" if input == "null" - output = "nil" if output == "null" - - input = eval(input) - output = eval(output) - [input, output] - end - end - # rubocop:enable Security/Eval - - - def test_valid - # Parse the PSL and run the tests - data = File.read(PublicSuffix::List::DEFAULT_LIST_PATH) - PublicSuffix::List.default = PublicSuffix::List.parse(data) - - failures = [] - self.class.tests.each do |input, output| - # Punycode domains are not supported ATM - next if input =~ /xn--/ - - domain = PublicSuffix.domain(input) rescue nil - failures << [input, output, domain] if output != domain - end - - message = "The following #{failures.size} tests fail:\n" - failures.each { |i, o, d| message += "Expected %s to be %s, got %s\n" % [i.inspect, o.inspect, d.inspect] } - assert_equal 0, failures.size, message - end - -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/test_helper.rb b/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/test_helper.rb deleted file mode 100644 index d590716..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/test_helper.rb +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true - -require "minitest/autorun" -require "minitest/reporters" -require "mocha/minitest" - -Minitest::Reporters.use! Minitest::Reporters::DefaultReporter.new(color: true) - -$LOAD_PATH.unshift File.expand_path("../lib", __dir__) -require "public_suffix" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/tests.txt b/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/tests.txt deleted file mode 100644 index b11150a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/tests.txt +++ /dev/null @@ -1,98 +0,0 @@ -// Any copyright is dedicated to the Public Domain. -// http://creativecommons.org/publicdomain/zero/1.0/ - -// null input -null, null -// Mixed case -'COM', null -'example.COM', 'example.com' -'WwW.example.COM', 'example.com' -// Leading dot -'.com', null -'.example', null -'.example.com', null -'.example.example', null -// Unlisted TLD -'example', null -'example.example', 'example.example' -'b.example.example', 'example.example' -'a.b.example.example', 'example.example' -// Listed, but non-Internet, TLD -//'local', null -//'example.local', null -//'b.example.local', null -//'a.b.example.local', null -// TLD with only 1 rule -'biz', null -'domain.biz', 'domain.biz' -'b.domain.biz', 'domain.biz' -'a.b.domain.biz', 'domain.biz' -// TLD with some 2-level rules -'com', null -'example.com', 'example.com' -'b.example.com', 'example.com' -'a.b.example.com', 'example.com' -'uk.com', null -'example.uk.com', 'example.uk.com' -'b.example.uk.com', 'example.uk.com' -'a.b.example.uk.com', 'example.uk.com' -'test.ac', 'test.ac' -// TLD with only 1 (wildcard) rule -'mm', null -'c.mm', null -'b.c.mm', 'b.c.mm' -'a.b.c.mm', 'b.c.mm' -// More complex TLD -'jp', null -'test.jp', 'test.jp' -'www.test.jp', 'test.jp' -'ac.jp', null -'test.ac.jp', 'test.ac.jp' -'www.test.ac.jp', 'test.ac.jp' -'kyoto.jp', null -'test.kyoto.jp', 'test.kyoto.jp' -'ide.kyoto.jp', null -'b.ide.kyoto.jp', 'b.ide.kyoto.jp' -'a.b.ide.kyoto.jp', 'b.ide.kyoto.jp' -'c.kobe.jp', null -'b.c.kobe.jp', 'b.c.kobe.jp' -'a.b.c.kobe.jp', 'b.c.kobe.jp' -'city.kobe.jp', 'city.kobe.jp' -'www.city.kobe.jp', 'city.kobe.jp' -// TLD with a wildcard rule and exceptions -'ck', null -'test.ck', null -'b.test.ck', 'b.test.ck' -'a.b.test.ck', 'b.test.ck' -'www.ck', 'www.ck' -'www.www.ck', 'www.ck' -// US K12 -'us', null -'test.us', 'test.us' -'www.test.us', 'test.us' -'ak.us', null -'test.ak.us', 'test.ak.us' -'www.test.ak.us', 'test.ak.us' -'k12.ak.us', null -'test.k12.ak.us', 'test.k12.ak.us' -'www.test.k12.ak.us', 'test.k12.ak.us' -// IDN labels -'食狮.com.cn', '食狮.com.cn' -'食狮.公司.cn', '食狮.公司.cn' -'www.食狮.公司.cn', '食狮.公司.cn' -'shishi.公司.cn', 'shishi.公司.cn' -'公司.cn', null -'食狮.中国', '食狮.中国' -'www.食狮.中国', '食狮.中国' -'shishi.中国', 'shishi.中国' -'中国', null -// Same as above, but punycoded -'xn--85x722f.com.cn', 'xn--85x722f.com.cn' -'xn--85x722f.xn--55qx5d.cn', 'xn--85x722f.xn--55qx5d.cn' -'www.xn--85x722f.xn--55qx5d.cn', 'xn--85x722f.xn--55qx5d.cn' -'shishi.xn--55qx5d.cn', 'shishi.xn--55qx5d.cn' -'xn--55qx5d.cn', null -'xn--85x722f.xn--fiqs8s', 'xn--85x722f.xn--fiqs8s' -'www.xn--85x722f.xn--fiqs8s', 'xn--85x722f.xn--fiqs8s' -'shishi.xn--fiqs8s', 'shishi.xn--fiqs8s' -'xn--fiqs8s', null diff --git a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/unit/domain_test.rb b/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/unit/domain_test.rb deleted file mode 100644 index 968462d..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/unit/domain_test.rb +++ /dev/null @@ -1,106 +0,0 @@ -# frozen_string_literal: true - -require "test_helper" - -class PublicSuffix::DomainTest < Minitest::Test - - def setup - @klass = PublicSuffix::Domain - end - - # Tokenizes given input into labels. - def test_self_name_to_labels - assert_equal %w( someone spaces live com ), - PublicSuffix::Domain.name_to_labels("someone.spaces.live.com") - assert_equal %w( leontina23samiko wiki zoho com ), - PublicSuffix::Domain.name_to_labels("leontina23samiko.wiki.zoho.com") - end - - # Converts input into String. - def test_self_name_to_labels_converts_input_to_string - assert_equal %w( someone spaces live com ), - PublicSuffix::Domain.name_to_labels(:"someone.spaces.live.com") - end - - - def test_initialize_with_tld - domain = @klass.new("com") - assert_equal "com", domain.tld - assert_nil domain.sld - assert_nil domain.trd - end - - def test_initialize_with_tld_and_sld - domain = @klass.new("com", "google") - assert_equal "com", domain.tld - assert_equal "google", domain.sld - assert_nil domain.trd - end - - def test_initialize_with_tld_and_sld_and_trd - domain = @klass.new("com", "google", "www") - assert_equal "com", domain.tld - assert_equal "google", domain.sld - assert_equal "www", domain.trd - end - - - def test_to_s - assert_equal "com", @klass.new("com").to_s - assert_equal "google.com", @klass.new("com", "google").to_s - assert_equal "www.google.com", @klass.new("com", "google", "www").to_s - end - - def test_to_a - assert_equal [nil, nil, "com"], @klass.new("com").to_a - assert_equal [nil, "google", "com"], @klass.new("com", "google").to_a - assert_equal ["www", "google", "com"], @klass.new("com", "google", "www").to_a - end - - - def test_tld - assert_equal "com", @klass.new("com", "google", "www").tld - end - - def test_sld - assert_equal "google", @klass.new("com", "google", "www").sld - end - - def test_trd - assert_equal "www", @klass.new("com", "google", "www").trd - end - - - def test_name - assert_equal "com", @klass.new("com").name - assert_equal "google.com", @klass.new("com", "google").name - assert_equal "www.google.com", @klass.new("com", "google", "www").name - end - - def test_domain - assert_nil @klass.new("com").domain - assert_nil @klass.new("tldnotlisted").domain - assert_equal "google.com", @klass.new("com", "google").domain - assert_equal "google.tldnotlisted", @klass.new("tldnotlisted", "google").domain - assert_equal "google.com", @klass.new("com", "google", "www").domain - assert_equal "google.tldnotlisted", @klass.new("tldnotlisted", "google", "www").domain - end - - def test_subdomain - assert_nil @klass.new("com").subdomain - assert_nil @klass.new("tldnotlisted").subdomain - assert_nil @klass.new("com", "google").subdomain - assert_nil @klass.new("tldnotlisted", "google").subdomain - assert_equal "www.google.com", @klass.new("com", "google", "www").subdomain - assert_equal "www.google.tldnotlisted", @klass.new("tldnotlisted", "google", "www").subdomain - end - - - def test_domain_question - assert !@klass.new("com").domain? - assert @klass.new("com", "example").domain? - assert @klass.new("com", "example", "www").domain? - assert @klass.new("tldnotlisted", "example").domain? - end - -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/unit/errors_test.rb b/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/unit/errors_test.rb deleted file mode 100644 index 75099ba..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/unit/errors_test.rb +++ /dev/null @@ -1,25 +0,0 @@ -# frozen_string_literal: true - -require "test_helper" - -class ErrorsTest < Minitest::Test - - # Inherits from StandardError - def test_error_inheritance - assert_kind_of StandardError, - PublicSuffix::Error.new - end - - # Inherits from PublicSuffix::Error - def test_domain_invalid_inheritance - assert_kind_of PublicSuffix::Error, - PublicSuffix::DomainInvalid.new - end - - # Inherits from PublicSuffix::DomainInvalid - def test_domain_not_allowed_inheritance - assert_kind_of PublicSuffix::DomainInvalid, - PublicSuffix::DomainNotAllowed.new - end - -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/unit/list_test.rb b/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/unit/list_test.rb deleted file mode 100644 index 9852935..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/public_suffix-4.0.7/test/unit/list_test.rb +++ /dev/null @@ -1,241 +0,0 @@ -# frozen_string_literal: true - -require "test_helper" - -class PublicSuffix::ListTest < Minitest::Test - - def setup - @list = PublicSuffix::List.new - end - - def teardown - PublicSuffix::List.default = nil - end - - - def test_initialize - assert_instance_of PublicSuffix::List, @list - assert_equal 0, @list.size - end - - - def test_equality_with_self - list = PublicSuffix::List.new - assert_equal list, list - end - - def test_equality_with_internals - rule = PublicSuffix::Rule.factory("com") - assert_equal PublicSuffix::List.new.add(rule), PublicSuffix::List.new.add(rule) - end - - def test_each_without_block - list = PublicSuffix::List.parse(< - Text, text, text - -EOF -doc = Document.new string -``` - -So parsing a string is just as easy as parsing a file. - -## Development - -After checking out the repo, run `rake test` to run the tests. - -To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org). - -## Contributing - -Bug reports and pull requests are welcome on GitHub at https://github.com/ruby/rexml. - -## License - -The gem is available as open source under the terms of the [BSD-2-Clause](LICENSE.txt). diff --git a/example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/context.rdoc b/example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/context.rdoc deleted file mode 100644 index 7ef01f7..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/context.rdoc +++ /dev/null @@ -1,143 +0,0 @@ -== Element Context - -Notes: -- All code on this page presupposes that the following has been executed: - - require 'rexml/document' - -- For convenience, examples on this page use +REXML::Document.new+, not +REXML::Element.new+. - This is completely valid, because REXML::Document is a subclass of REXML::Element. - -The context for an element is a hash of processing directives -that influence the way \XML is read, stored, and written. -The context entries are: - -- +:respect_whitespace+: controls treatment of whitespace. -- +:compress_whitespace+: determines whether whitespace is compressed. -- +:ignore_whitespace_nodes+: determines whether whitespace-only nodes are to be ignored. -- +:raw+: controls treatment of special characters and entities. - -The default context for a new element is {}. -You can set the context at element-creation time: - - d = REXML::Document.new('', {compress_whitespace: :all, raw: :all}) - d.context # => {:compress_whitespace=>:all, :raw=>:all} - -You can reset the entire context by assigning a new hash: - - d.context = {ignore_whitespace_nodes: :all} - d.context # => {:ignore_whitespace_nodes=>:all} - -Or you can create or modify an individual entry: - - d.context[:raw] = :all - d.context # => {:ignore_whitespace_nodes=>:all, :raw=>:all} - -=== +:respect_whitespace+ - -Affects: +REXML::Element.new+, +REXML::Element.text=+. - -By default, all parsed whitespace is respected (that is, stored whitespace not compressed): - - xml_string = 'a b c d e f' - d = REXML::Document.new(xml_string) - d.to_s # => "a b c d e f" - -Use +:respect_whitespace+ with an array of element names -to specify the elements that _are_ to have their whitespace respected; -other elements' whitespace, and whitespace between elements, will be compressed. - -In this example: +foo+ and +baz+ will have their whitespace respected; -+bar+ and the space between elements will have their whitespace compressed: - - d = REXML::Document.new(xml_string, {respect_whitespace: ['foo', 'baz']}) - d.to_s # => "a b c d e f" - bar = d.root[2] # => ... - bar.text = 'X Y' - d.to_s # => "a b X Y e f" - -=== +:compress_whitespace+ - -Affects: +REXML::Element.new+, +REXML::Element.text=+. - -Use compress_whitespace: :all -to compress whitespace both within and between elements: - - xml_string = 'a b c d e f' - d = REXML::Document.new(xml_string, {compress_whitespace: :all}) - d.to_s # => "a b c d e f" - -Use +:compress_whitespace+ with an array of element names -to compress whitespace in those elements, -but not in other elements nor between elements. - -In this example, +foo+ and +baz+ will have their whitespace compressed; -+bar+ and the space between elements will not: - - d = REXML::Document.new(xml_string, {compress_whitespace: ['foo', 'baz']}) - d.to_s # => "a b c d e f" - foo = d.root[0] # => ... - foo.text= 'X Y' - d.to_s # => "X Y c d e f" - -=== +:ignore_whitespace_nodes+ - -Affects: +REXML::Element.new+. - -Use ignore_whitespace_nodes: :all to omit all whitespace-only elements. - -In this example, +bar+ has a text node, while nodes +foo+ and +baz+ do not: - - xml_string = ' BAR ' - d = REXML::Document.new(xml_string, {ignore_whitespace_nodes: :all}) - d.to_s # => " FOO BAZ " - root = d.root # => ... - foo = root[0] # => - bar = root[1] # => ... - baz = root[2] # => - foo.first.class # => NilClass - bar.first.class # => REXML::Text - baz.first.class # => NilClass - -Use +:ignore_whitespace_nodes+ with an array of element names -to specify the elements that are to have whitespace nodes ignored. - -In this example, +bar+ and +baz+ have text nodes, while node +foo+ does not. - - xml_string = ' BAR ' - d = REXML::Document.new(xml_string, {ignore_whitespace_nodes: ['foo']}) - d.to_s # => " BAR " - root = d.root # => ... - foo = root[0] # => - bar = root[1] # => ... - baz = root[2] # => ... - foo.first.class # => NilClass - bar.first.class # => REXML::Text - baz.first.class # => REXML::Text - -=== +:raw+ - -Affects: +Element.text=+, +Element.add_text+, +Text.to_s+. - -Parsing of +a+ elements is not affected by +raw+: - - xml_string = '0 < 11 > 0' - d = REXML::Document.new(xml_string, {:raw => ['a']}) - d.root.to_s # => "0 < 11 > 0" - a, b = *d.root.elements - a.to_s # => "0 < 1" - b.to_s # => "1 > 0" - -But Element#text= is affected: - - a.text = '0 < 1' - b.text = '1 > 0' - a.to_s # => "0 < 1" - b.to_s # => "1 &gt; 0" - -As is Element.add_text: - - a.add_text(' so 1 > 0') - b.add_text(' so 0 < 1') - a.to_s # => "0 < 1 so 1 > 0" - b.to_s # => "1 &gt; 0 so 0 &lt; 1" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/child.rdoc b/example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/child.rdoc deleted file mode 100644 index 8953638..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/child.rdoc +++ /dev/null @@ -1,87 +0,0 @@ -== Class Child - -Class Child includes module Node; -see {Tasks for Node}[node_rdoc.html]. - -:include: ../tocs/child_toc.rdoc - -=== Relationships - -==== Task: Set the Parent - -Use method {Child#parent=}[../../../../REXML/Parent.html#method-i-parent-3D] -to set the parent: - - e0 = REXML::Element.new('foo') - e1 = REXML::Element.new('bar') - e1.parent # => nil - e1.parent = e0 - e1.parent # => - -==== Task: Insert Previous Sibling - -Use method {Child#previous_sibling=}[../../../../REXML/Parent.html#method-i-previous_sibling-3D] -to insert a previous sibling: - - xml_string = '' - d = REXML::Document.new(xml_string) - d.root.to_a # => [, ] - c = d.root[1] # => - b = REXML::Element.new('b') - c.previous_sibling = b - d.root.to_a # => [, , ] - -==== Task: Insert Next Sibling - -Use method {Child#next_sibling=}[../../../../REXML/Parent.html#method-i-next-sibling-3D] -to insert a previous sibling: - - xml_string = '' - d = REXML::Document.new(xml_string) - d.root.to_a # => [, ] - a = d.root[0] # => - b = REXML::Element.new('b') - a.next_sibling = b - d.root.to_a # => [, , ] - -=== Removal or Replacement - -==== Task: Remove Child from Parent - -Use method {Child#remove}[../../../../REXML/Parent.html#method-i-remove] -to remove a child from its parent; returns the removed child: - - xml_string = '' - d = REXML::Document.new(xml_string) - d.root.to_a # => [, , ] - b = d.root[1] # => - b.remove # => - d.root.to_a # => [, ] - -==== Task: Replace Child - -Use method {Child#replace_with}[../../../../REXML/Parent.html#method-i-replace] -to replace a child; -returns the replaced child: - - xml_string = '' - d = REXML::Document.new(xml_string) - d.root.to_a # => [, , ] - b = d.root[1] # => - d = REXML::Element.new('d') - b.replace_with(d) # => - d.root.to_a # => [, , ] - -=== Document - -==== Task: Get the Document - -Use method {Child#document}[../../../../REXML/Parent.html#method-i-document] -to get the document for the child: - - xml_string = '' - d = REXML::Document.new(xml_string) - d.root.to_a # => [, , ] - b = d.root[1] # => - b.document == d # => true - REXML::Child.new.document # => nil diff --git a/example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/document.rdoc b/example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/document.rdoc deleted file mode 100644 index 96d0335..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/document.rdoc +++ /dev/null @@ -1,276 +0,0 @@ -== Class Document - -Class Document has methods from its superclasses and included modules; -see: - -- {Tasks for Element}[element_rdoc.html]. -- {Tasks for Parent}[parent_rdoc.html]. -- {Tasks for Child}[child_rdoc.html]. -- {Tasks for Node}[node_rdoc.html]. -- {Module Enumerable}[https://docs.ruby-lang.org/en/master/Enumerable.html]. - -:include: ../tocs/document_toc.rdoc - -=== New Document - -==== Task: Create an Empty Document - -Use method {Document::new}[../../../../REXML/Document.html#method-c-new] -to create an empty document. - - d = REXML::Document.new - -==== Task: Parse a \String into a New Document - -Use method {Document::new}[../../../../REXML/Document.html#method-c-new] -to parse an XML string into a new document: - - xml_string = 'textmore' - d = REXML::Document.new(xml_string) - d.root # => ... - -==== Task: Parse an \IO Stream into a New Document - -Use method {Document::new}[../../../../REXML/Document.html#method-c-new] -to parse an XML \IO stream into a new document: - - xml_string = 'textmore' - File.write('t.xml', xml_string) - d = File.open('t.xml', 'r') do |file| - REXML::Document.new(file) - end - d.root # => ... - -==== Task: Create a Document from an Existing Document - -Use method {Document::new}[../../../../REXML/Document.html#method-c-new] -to create a document from an existing document. -The context and attributes are copied to the new document, -but not the children: - - xml_string = 'textmore' - d = REXML::Document.new(xml_string) - d.children # => [ ... ] - d.context = {raw: :all, compress_whitespace: :all} - d.add_attributes({'bar' => 0, 'baz' => 1}) - d1 = REXML::Document.new(d) - d1.context # => {:raw=>:all, :compress_whitespace=>:all} - d1.attributes # => {"bar"=>bar='0', "baz"=>baz='1'} - d1.children # => [] - -==== Task: Clone a Document - -Use method {Document#clone}[../../../../REXML/Document.html#method-i-clone] -to clone a document. -The context and attributes are copied to the new document, -but not the children: - - xml_string = 'textmore' - d = REXML::Document.new(xml_string) - d.children # => [ ... ] - d.context = {raw: :all, compress_whitespace: :all} - d.add_attributes({'bar' => 0, 'baz' => 1}) - d1 = d.clone # => < bar='0' baz='1'/> - d1.context # => {:raw=>:all, :compress_whitespace=>:all} - d1.attributes # => {"bar"=>bar='0', "baz"=>baz='1'} - d1.children # => [] - -=== Document Type - -==== Task: Get the Document Type - -Use method {Document#doctype}[../../../../REXML/Document.html#method-i-doctype] -to get the document type: - - d = REXML::Document.new('') - d.doctype.class # => REXML::DocType - d = REXML::Document.new('') - d.doctype.class # => nil - -==== Task: Set the Document Type - -Use method {document#add}[../../../../REXML/Document.html#method-i-add] -to add or replace the document type: - - d = REXML::Document.new('') - d.doctype.class # => nil - d.add(REXML::DocType.new('foo')) - d.doctype.class # => REXML::DocType - -=== XML Declaration - -==== Task: Get the XML Declaration - -Use method {document#xml_decl}[../../../../REXML/Document.html#method-i-xml_decl] -to get the XML declaration: - - d = REXML::Document.new('') - d.xml_decl.class # => REXML::XMLDecl - d.xml_decl # => - d = REXML::Document.new('') - d.xml_decl.class # => REXML::XMLDecl - d.xml_decl # => - -==== Task: Set the XML Declaration - -Use method {document#add}[../../../../REXML/Document.html#method-i-add] -to replace the XML declaration: - - d = REXML::Document.new('') - d.add(REXML::XMLDecl.new) - -=== Children - -==== Task: Add an Element Child - -Use method -{document#add_element}[../../../../REXML/Document.html#method-i-add_element] -to add an element to the document: - - d = REXML::Document.new('') - d.add_element(REXML::Element.new('root')) - d.children # => [] - -==== Task: Add a Non-Element Child - -Use method -{document#add}[../../../../REXML/Document.html#method-i-add] -to add a non-element to the document: - - xml_string = 'textmore' - d = REXML::Document.new(xml_string) - d.add(REXML::Text.new('foo')) - d.children # => [ ... , "foo"] - -=== Writing - -==== Task: Write to $stdout - -Use method -{document#write}[../../../../REXML/Document.html#method-i-write] -to write the document to $stdout: - - xml_string = 'textmore' - d = REXML::Document.new(xml_string) - d.write - -Output: - - textmore - -==== Task: Write to IO Stream - -Use method -{document#write}[../../../../REXML/Document.html#method-i-write] -to write the document to $stdout: - - xml_string = 'textmore' - d = REXML::Document.new(xml_string) - File.open('t.xml', 'w') do |file| - d.write(file) - end - p File.read('t.xml') - -Output: - - "textmore" - -==== Task: Write with No Indentation - -Use method -{document#write}[../../../../REXML/Document.html#method-i-write] -to write the document with no indentation: - - xml_string = '' - d = REXML::Document.new(xml_string) - d.write({indent: 0}) - -Output: - - - - - - - - - -==== Task: Write with Specified Indentation - -Use method -{document#write}[../../../../REXML/Document.html#method-i-write] -to write the document with a specified indentation: - - xml_string = '' - d = REXML::Document.new(xml_string) - d.write({indent: 2}) - -Output: - - - - - - - - - -=== Querying - -==== Task: Get the Document - -Use method -{document#document}[../../../../REXML/Document.html#method-i-document] -to get the document (+self+); overrides Element#document: - - xml_string = '' - d = REXML::Document.new(xml_string) - d.document == d # => true - -==== Task: Get the Encoding - -Use method -{document#document}[../../../../REXML/Document.html#method-i-document] -to get the document (+self+); overrides Element#document: - - xml_string = '' - d = REXML::Document.new(xml_string) - d.encoding # => "UTF-8" - -==== Task: Get the Node Type - -Use method -{document#node_type}[../../../../REXML/Document.html#method-i-node_type] -to get the node type (+:document+); overrides Element#node_type: - - xml_string = '' - d = REXML::Document.new(xml_string) - d.node_type # => :document - -==== Task: Get the Root Element - -Use method -{document#root}[../../../../REXML/Document.html#method-i-root] -to get the root element: - - xml_string = '' - d = REXML::Document.new(xml_string) - d.root # => ... - -==== Task: Determine Whether Stand-Alone - -Use method -{document#stand_alone?}[../../../../REXML/Document.html#method-i-stand_alone-3F] -to get the stand-alone value: - - d = REXML::Document.new('') - d.stand_alone? # => "yes" - -==== Task: Get the Version - -Use method -{document#version}[../../../../REXML/Document.html#method-i-version] -to get the version: - - d = REXML::Document.new('') - d.version # => "2.0" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/element.rdoc b/example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/element.rdoc deleted file mode 100644 index f229275..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/element.rdoc +++ /dev/null @@ -1,602 +0,0 @@ -== Class Element - -Class Element has methods from its superclasses and included modules; -see: - -- {Tasks for Parent}[parent_rdoc.html]. -- {Tasks for Child}[child_rdoc.html]. -- {Tasks for Node}[node_rdoc.html]. -- {Module Enumerable}[https://docs.ruby-lang.org/en/master/Enumerable.html]. - -:include: ../tocs/element_toc.rdoc - -=== New Element - -==== Task: Create a Default Element - -Use method -{Element::new}[../../../../REXML/Element.html#method-c-new] -with no arguments to create a default element: - - e = REXML::Element.new - e.name # => "UNDEFINED" - e.parent # => nil - e.context # => nil - -==== Task: Create a Named Element - -Use method -{Element::new}[../../../../REXML/Element.html#method-c-new] -with a string name argument -to create a named element: - - e = REXML::Element.new('foo') - e.name # => "foo" - e.parent # => nil - e.context # => nil - -==== Task: Create an Element with Name and Parent - -Use method -{Element::new}[../../../../REXML/Element.html#method-c-new] -with name and parent arguments -to create an element with name and parent: - - p = REXML::Parent.new - e = REXML::Element.new('foo', p) - e.name # => "foo" - e.parent # => #]> - e.context # => nil - -==== Task: Create an Element with Name, Parent, and Context - -Use method -{Element::new}[../../../../REXML/Element.html#method-c-new] -with name, parent, and context arguments -to create an element with name, parent, and context: - - p = REXML::Parent.new - e = REXML::Element.new('foo', p, {compress_whitespace: :all}) - e.name # => "foo" - e.parent # => #]> - e.context # => {:compress_whitespace=>:all} - -==== Task: Create a Shallow Clone - -Use method -{Element#clone}[../../../../REXML/Element.html#method-i-clone] -to create a shallow clone of an element, -copying only the name, attributes, and context: - - e0 = REXML::Element.new('foo', nil, {compress_whitespace: :all}) - e0.add_attribute(REXML::Attribute.new('bar', 'baz')) - e0.context = {compress_whitespace: :all} - e1 = e0.clone # => - e1.name # => "foo" - e1.context # => {:compress_whitespace=>:all} - -=== Attributes - -==== Task: Create and Add an Attribute - -Use method -{Element#add_attribute}[../../../../REXML/Element.html#method-i-add_attribute] -to create and add an attribute: - - e = REXML::Element.new - e.add_attribute('attr', 'value') # => "value" - e['attr'] # => "value" - e.add_attribute('attr', 'VALUE') # => "VALUE" - e['attr'] # => "VALUE" - -==== Task: Add an Existing Attribute - -Use method -{Element#add_attribute}[../../../../REXML/Element.html#method-i-add_attribute] -to add an existing attribute: - - e = REXML::Element.new - a = REXML::Attribute.new('attr', 'value') - e.add_attribute(a) - e['attr'] # => "value" - a = REXML::Attribute.new('attr', 'VALUE') - e.add_attribute(a) - e['attr'] # => "VALUE" - -==== Task: Add Multiple Attributes from a Hash - -Use method -{Element#add_attributes}[../../../../REXML/Element.html#method-i-add_attributes] -to add multiple attributes from a hash: - - e = REXML::Element.new - h = {'foo' => 0, 'bar' => 1} - e.add_attributes(h) - e['foo'] # => "0" - e['bar'] # => "1" - -==== Task: Add Multiple Attributes from an Array - -Use method -{Element#add_attributes}[../../../../REXML/Element.html#method-i-add_attributes] -to add multiple attributes from an array: - - e = REXML::Element.new - a = [['foo', 0], ['bar', 1]] - e.add_attributes(a) - e['foo'] # => "0" - e['bar'] # => "1" - -==== Task: Retrieve the Value for an Attribute Name - -Use method -{Element#[]}[../../../../REXML/Element.html#method-i-5B-5D] -to retrieve the value for an attribute name: - - e = REXML::Element.new - e.add_attribute('attr', 'value') # => "value" - e['attr'] # => "value" - -==== Task: Retrieve the Attribute Value for a Name and Namespace - -Use method -{Element#attribute}[../../../../REXML/Element.html#method-i-attribute] -to retrieve the value for an attribute name: - - xml_string = "" - d = REXML::Document.new(xml_string) - e = d.root - e.attribute("x") # => x='x' - e.attribute("x", "a") # => a:x='a:x' - -==== Task: Delete an Attribute - -Use method -{Element#delete_attribute}[../../../../REXML/Element.html#method-i-delete_attribute] -to remove an attribute: - - e = REXML::Element.new('foo') - e.add_attribute('bar', 'baz') - e.delete_attribute('bar') - e.delete_attribute('bar') - e['bar'] # => nil - -==== Task: Determine Whether the Element Has Attributes - -Use method -{Element#has_attributes?}[../../../../REXML/Element.html#method-i-has_attributes-3F] -to determine whether the element has attributes: - - e = REXML::Element.new('foo') - e.has_attributes? # => false - e.add_attribute('bar', 'baz') - e.has_attributes? # => true - -=== Children - -Element Children - -==== Task: Create and Add an Element - -Use method -{Element#add_element}[../../../../REXML/Element.html#method-i-add_element] -to create a new element and add it to this element: - - e0 = REXML::Element.new('foo') - e0.add_element('bar') - e0.children # => [] - -==== Task: Add an Existing Element - -Use method -{Element#add_element}[../../../../REXML/Element.html#method-i-add_element] -to add an element to this element: - - e0 = REXML::Element.new('foo') - e1 = REXML::Element.new('bar') - e0.add_element(e1) - e0.children # => [] - -==== Task: Create and Add an Element with Attributes - -Use method -{Element#add_element}[../../../../REXML/Element.html#method-i-add_element] -to create a new element with attributes, and add it to this element: - - e0 = REXML::Element.new('foo') - e0.add_element('bar', {'name' => 'value'}) - e0.children # => [] - -==== Task: Add an Existing Element with Added Attributes - -Use method -{Element#add_element}[../../../../REXML/Element.html#method-i-add_element] -to add an element to this element: - - e0 = REXML::Element.new('foo') - e1 = REXML::Element.new('bar') - e0.add_element(e1, {'name' => 'value'}) - e0.children # => [] - -==== Task: Delete a Specified Element - -Use method -{Element#delete_element}[../../../../REXML/Element.html#method-i-delete_element] -to remove a specified element from this element: - - e0 = REXML::Element.new('foo') - e1 = REXML::Element.new('bar') - e0.add_element(e1) - e0.children # => [] - e0.delete_element(e1) - e0.children # => [] - -==== Task: Delete an Element by Index - -Use method -{Element#delete_element}[../../../../REXML/Element.html#method-i-delete_element] -to remove an element from this element by index: - - e0 = REXML::Element.new('foo') - e1 = REXML::Element.new('bar') - e0.add_element(e1) - e0.children # => [] - e0.delete_element(1) - e0.children # => [] - -==== Task: Delete an Element by XPath - -Use method -{Element#delete_element}[../../../../REXML/Element.html#method-i-delete_element] -to remove an element from this element by XPath: - - e0 = REXML::Element.new('foo') - e1 = REXML::Element.new('bar') - e0.add_element(e1) - e0.children # => [] - e0.delete_element('//bar/') - e0.children # => [] - -==== Task: Determine Whether Element Children - -Use method -{Element#has_elements?}[../../../../REXML/Element.html#method-i-has_elements-3F] -to determine whether the element has element children: - - e0 = REXML::Element.new('foo') - e0.has_elements? # => false - e0.add_element(REXML::Element.new('bar')) - e0.has_elements? # => true - -==== Task: Get Element Descendants by XPath - -Use method -{Element#get_elements}[../../../../REXML/Element.html#method-i-get_elements] -to fetch all element descendant children by XPath: - - xml_string = <<-EOT - - - - - - EOT - d = REXML::Document.new(xml_string) - d.root.get_elements('//a') # => [ ... , ] - -==== Task: Get Next Element Sibling - -Use method -{Element#next_element}[../../../../REXML/Element.html#method-i-next_element] -to retrieve the next element sibling: - - d = REXML::Document.new 'text' - d.root.elements['b'].next_element #-> - d.root.elements['c'].next_element #-> nil - -==== Task: Get Previous Element Sibling - -Use method -{Element#previous_element}[../../../../REXML/Element.html#method-i-previous_element] -to retrieve the previous element sibling: - - d = REXML::Document.new 'text' - d.root.elements['c'].previous_element #-> - d.root.elements['b'].previous_element #-> nil - -Text Children - -==== Task: Add a Text Node - -Use method -{Element#add_text}[../../../../REXML/Element.html#method-i-add_text] -to add a text node to the element: - - d = REXML::Document.new('foobar') - e = d.root - e.add_text(REXML::Text.new('baz')) - e.to_a # => ["foo", , "bar", "baz"] - e.add_text(REXML::Text.new('baz')) - e.to_a # => ["foo", , "bar", "baz", "baz"] - -==== Task: Replace the First Text Node - -Use method -{Element#text=}[../../../../REXML/Element.html#method-i-text-3D] -to replace the first text node in the element: - - d = REXML::Document.new('textmore') - e = d.root - e.to_a # => [, "text", , "more", ] - e.text = 'oops' - e.to_a # => [, "oops", , "more", ] - -==== Task: Remove the First Text Node - -Use method -{Element#text=}[../../../../REXML/Element.html#method-i-text-3D] -to remove the first text node in the element: - - d = REXML::Document.new('textmore') - e = d.root - e.to_a # => [, "text", , "more", ] - e.text = nil - e.to_a # => [, , "more", ] - -==== Task: Retrieve the First Text Node - -Use method -{Element#get_text}[../../../../REXML/Element.html#method-i-get_text] -to retrieve the first text node in the element: - - d = REXML::Document.new('textmore') - e = d.root - e.to_a # => [, "text", , "more", ] - e.get_text # => "text" - -==== Task: Retrieve a Specific Text Node - -Use method -{Element#get_text}[../../../../REXML/Element.html#method-i-get_text] -to retrieve the first text node in a specified element: - - d = REXML::Document.new "some text this is bold! more text" - e = d.root - e.get_text('//root') # => "some text " - e.get_text('//b') # => "this is bold!" - -==== Task: Determine Whether the Element has Text Nodes - -Use method -{Element#has_text?}[../../../../REXML/Element.html#method-i-has_text-3F] -to determine whethe the element has text: - - e = REXML::Element.new('foo') - e.has_text? # => false - e.add_text('bar') - e.has_text? # => true - -Other Children - -==== Task: Get the Child at a Given Index - -Use method -{Element#[]}[../../../../REXML/Element.html#method-i-5B-5D] -to retrieve the child at a given index: - - d = REXML::Document.new '>textmore' - e = d.root - e[0] # => - e[1] # => "text" - e[2] # => - -==== Task: Get All CDATA Children - -Use method -{Element#cdatas}[../../../../REXML/Element.html#method-i-cdatas] -to retrieve all CDATA children: - - xml_string = <<-EOT - - - - - EOT - d = REXML::Document.new(xml_string) - d.root.cdatas # => ["foo", "bar"] - -==== Task: Get All Comment Children - -Use method -{Element#comments}[../../../../REXML/Element.html#method-i-comments] -to retrieve all comment children: - - xml_string = <<-EOT - - - - - EOT - d = REXML::Document.new(xml_string) - d.root.comments.map {|comment| comment.to_s } # => ["foo", "bar"] - -==== Task: Get All Processing Instruction Children - -Use method -{Element#instructions}[../../../../REXML/Element.html#method-i-instructions] -to retrieve all processing instruction children: - - xml_string = <<-EOT - - - - - EOT - d = REXML::Document.new(xml_string) - instructions = d.root.instructions.map {|instruction| instruction.to_s } - instructions # => ["", ""] - -==== Task: Get All Text Children - -Use method -{Element#texts}[../../../../REXML/Element.html#method-i-texts] -to retrieve all text children: - - xml_string = 'textmore' - d = REXML::Document.new(xml_string) - d.root.texts # => ["text", "more"] - -=== Namespaces - -==== Task: Add a Namespace - -Use method -{Element#add_namespace}[../../../../REXML/Element.html#method-i-add_namespace] -to add a namespace to the element: - - e = REXML::Element.new('foo') - e.add_namespace('bar') - e.namespaces # => {"xmlns"=>"bar"} - -==== Task: Delete the Default Namespace - -Use method -{Element#delete_namespace}[../../../../REXML/Element.html#method-i-delete_namespace] -to remove the default namespace from the element: - - d = REXML::Document.new "" - d.to_s # => "" - d.root.delete_namespace # => - d.to_s # => "" - -==== Task: Delete a Specific Namespace - -Use method -{Element#delete_namespace}[../../../../REXML/Element.html#method-i-delete_namespace] -to remove a specific namespace from the element: - - d = REXML::Document.new "" - d.to_s # => "" - d.root.delete_namespace # => - d.to_s # => "" - d.root.delete_namespace('foo') - d.to_s # => "" - -==== Task: Get a Namespace URI - -Use method -{Element#namespace}[../../../../REXML/Element.html#method-i-namespace] -to retrieve a speficic namespace URI for the element: - - xml_string = <<-EOT - - - - - - - EOT - d = REXML::Document.new(xml_string) - b = d.elements['//b'] - b.namespace # => "1" - b.namespace('y') # => "2" - -==== Task: Retrieve Namespaces - -Use method -{Element#namespaces}[../../../../REXML/Element.html#method-i-namespaces] -to retrieve all namespaces for the element: - - xml_string = '' - d = REXML::Document.new(xml_string) - d.root.attributes.namespaces # => {"xmlns"=>"foo", "x"=>"bar", "y"=>"twee"} - -==== Task: Retrieve Namespace Prefixes - -Use method -{Element#prefixes}[../../../../REXML/Element.html#method-i-prefixes] -to retrieve all prefixes (namespace names) for the element: - - xml_string = <<-EOT - - - - - - - EOT - d = REXML::Document.new(xml_string, {compress_whitespace: :all}) - d.elements['//a'].prefixes # => ["x", "y"] - d.elements['//b'].prefixes # => ["x", "y"] - d.elements['//c'].prefixes # => ["x", "y", "z"] - -=== Iteration - -==== Task: Iterate Over Elements - -Use method -{Element#each_element}[../../../../REXML/Element.html#method-i-each_element] -to iterate over element children: - - d = REXML::Document.new 'bbd' - d.root.each_element {|e| p e } - -Output: - - ... - ... - ... - - -==== Task: Iterate Over Elements Having a Specified Attribute - -Use method -{Element#each_element_with_attribute}[../../../../REXML/Element.html#method-i-each_element_with_attribute] -to iterate over element children that have a specified attribute: - - d = REXML::Document.new '' - a = d.root - a.each_element_with_attribute('id') {|e| p e } - -Output: - - - - - -==== Task: Iterate Over Elements Having a Specified Attribute and Value - -Use method -{Element#each_element_with_attribute}[../../../../REXML/Element.html#method-i-each_element_with_attribute] -to iterate over element children that have a specified attribute and value: - - d = REXML::Document.new '' - a = d.root - a.each_element_with_attribute('id', '1') {|e| p e } - -Output: - - - - -==== Task: Iterate Over Elements Having Specified Text - -Use method -{Element#each_element_with_text}[../../../../REXML/Element.html#method-i-each_element_with_text] -to iterate over element children that have specified text: - - -=== Context - -#whitespace -#ignore_whitespace_nodes -#raw - -=== Other Getters - -#document -#root -#root_node -#node_type -#xpath -#inspect diff --git a/example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/node.rdoc b/example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/node.rdoc deleted file mode 100644 index d5d2e12..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/node.rdoc +++ /dev/null @@ -1,97 +0,0 @@ -== Module Node - -:include: ../tocs/node_toc.rdoc - -=== Siblings - -==== Task: Find Previous Sibling - -Use method -{Node.previous_sibling_node}[../../../../REXML/Node.html#method-i-previous_sibling] -to retrieve the previous sibling: - - d = REXML::Document.new('') - b = d.root[1] # => - b.previous_sibling_node # => - -==== Task: Find Next Sibling - -Use method -{Node.next_sibling_node}[../../../../REXML/Node.html#method-i-next_sibling] -to retrieve the next sibling: - - d = REXML::Document.new('') - b = d.root[1] # => - b.next_sibling_node # => - -=== Position - -==== Task: Find Own Index Among Siblings - -Use method -{Node.index_in_parent}[../../../../REXML/Node.html#method-i-index_in_parent] -to retrieve the 1-based index of this node among its siblings: - - d = REXML::Document.new('') - b = d.root[1] # => - b.index_in_parent # => 2 - -=== Recursive Traversal - -==== Task: Traverse Each Recursively - -Use method -{Node.each_recursive}[../../../../REXML/Node.html#method-i-each_recursive] -to traverse a tree of nodes recursively: - - xml_string = '' - d = REXML::Document.new(xml_string) - d.root.each_recursive {|node| p node } - -Output: - - ... - ... - - ... - - -=== Recursive Search - -==== Task: Traverse Each Recursively - -Use method -{Node.find_first_recursive}[../../../../REXML/Node.html#method-i-find_first_recursive] -to search a tree of nodes recursively: - - xml_string = '' - d = REXML::Document.new(xml_string) - d.root.find_first_recursive {|node| node.name == 'c' } # => - -=== Representation - -==== Task: Represent a String - -Use method {Node.to_s}[../../../../REXML/Node.html#method-i-to_s] -to represent the node as a string: - - xml_string = '' - d = REXML::Document.new(xml_string) - d.root.to_s # => "" - -=== Parent? - -==== Task: Determine Whether the Node is a Parent - -Use method {Node.parent?}[../../../../REXML/Node.html#method-i-parent-3F] -to determine whether the node is a parent; -class Text derives from Node: - - d = REXML::Document.new('textmore') - t = d.root[1] # => "text" - t.parent? # => false - -Class Parent also derives from Node, but overrides this method: - - p = REXML::Parent.new - p.parent? # => true diff --git a/example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/parent.rdoc b/example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/parent.rdoc deleted file mode 100644 index 54f1dbe..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/parent.rdoc +++ /dev/null @@ -1,267 +0,0 @@ -== Class Parent - -Class Parent has methods from its superclasses and included modules; -see: - -- {Tasks for Child}[child_rdoc.html]. -- {Tasks for Node}[node_rdoc.html]. -- {Module Enumerable}[https://docs.ruby-lang.org/en/master/Enumerable.html]. - -:include: ../tocs/parent_toc.rdoc - -=== Queries - -==== Task: Get the Count of Children - -Use method {Parent#size}[../../../../REXML/Parent.html#method-i-size] -(or its alias +length+) to get the count of the parent's children: - - p = REXML::Parent.new - p.size # => 0 - xml_string = '' - d = REXML::Document.new(xml_string) - d.root.size # => 3 - -==== Task: Get the Child at a Given Index - -Use method {Parent#[]}[../../../../REXML/Parent.html#method-i-5B-5D] -to get the child at a given index: - - xml_string = '' - d = REXML::Document.new(xml_string) - d.root[1] # => - d.root[-1] # => - d.root[50] # => nil - -==== Task: Get the Index of a Given Child - -Use method {Parent#index}[../../../../REXML/Parent.html#method-i-index] -to get the index (0-based offset) of a child: - - d = REXML::Document.new('') - root = d.root - e0 = REXML::Element.new('foo') - e1 = REXML::Element.new('bar') - root.add(e0) # => - root.add(e1) # => - root.add(e0) # => - root.add(e1) # => - root.index(e0) # => 0 - root.index(e1) # => 1 - -==== Task: Get the Children - -Use method {Parent#children}[../../../../REXML/Parent.html#method-i-children] -(or its alias +to_a+) to get the parent's children: - - xml_string = '' - d = REXML::Document.new(xml_string) - d.root.children # => [, , ] - -==== Task: Determine Whether the Node is a Parent - -Use method {Parent#parent?}[../../../../REXML/Parent.html#method-i-parent-3F] -to determine whether the node is a parent; -class Text derives from Node: - - d = REXML::Document.new('textmore') - t = d.root[1] # => "text" - t.parent? # => false - -Class Parent also derives from Node, but overrides this method: - - p = REXML::Parent.new - p.parent? # => true - -=== Additions - -==== Task: Add a Child at the Beginning - -Use method {Parent#unshift}[../../../../REXML/Parent.html#method-i-unshift] -to add a child as at the beginning of the children: - - xml_string = '' - d = REXML::Document.new(xml_string) - d.root.children # => [, , ] - d.root.unshift REXML::Element.new('d') - d.root.children # => [, , , ] - -==== Task: Add a Child at the End - -Use method {Parent#<<}[../../../../REXML/Parent.html#method-i-3C-3C] -(or an alias +push+ or +add+) to add a child as at the end of the children: - - xml_string = '' - d = REXML::Document.new(xml_string) - d.root.children # => [, , ] - d.root << REXML::Element.new('d') - d.root.children # => [, , , ] - -==== Task: Replace a Child with Another Child - -Use method {Parent#replace}[../../../../REXML/Parent.html#method-i-replace] - - xml_string = '' - d = REXML::Document.new(xml_string) - d.root.children # => [, , ] - b = d.root[1] # => - d.replace_child(b, REXML::Element.new('d')) - d.root.children # => [, ] - -==== Task: Replace Multiple Children with Another Child - -Use method {Parent#[]=}[../../../../REXML/Parent.html#method-i-parent-5B-5D-3D] -to replace multiple consecutive children with another child: - - xml_string = '' - d = REXML::Document.new(xml_string) - d.root.children # => [, , , ] - d.root[1, 2] = REXML::Element.new('x') - d.root.children # => [, , ] - d.root[1, 5] = REXML::Element.new('x') - d.root.children # => [, ] # BUG? - -==== Task: Insert Child Before a Given Child - -Use method {Parent#insert_before}[../../../../REXML/Parent.html#method-i-insert_before] -to insert a child immediately before a given child: - - xml_string = '' - d = REXML::Document.new(xml_string) - d.root.children # => [, , ] - b = d.root[1] # => - x = REXML::Element.new('x') - d.root.insert_before(b, x) - d.root.children # => [, , , ] - -==== Task: Insert Child After a Given Child - -Use method {Parent#insert_after}[../../../../REXML/Parent.html#method-i-insert_after] -to insert a child immediately after a given child: - - xml_string = '' - d = REXML::Document.new(xml_string) - d.root.children # => [, , ] - b = d.root[1] # => - x = REXML::Element.new('x') - d.root.insert_after(b, x) - d.root.children # => [, , , ] - -=== Deletions - -==== Task: Remove a Given Child - -Use method {Parent#delete}[../../../../REXML/Parent.html#method-i-delete] -to remove all occurrences of a given child: - - d = REXML::Document.new('') - a = REXML::Element.new('a') - b = REXML::Element.new('b') - d.root.add(a) - d.root.add(b) - d.root.add(a) - d.root.add(b) - d.root.children # => [, , , ] - d.root.delete(b) - d.root.children # => [, ] - -==== Task: Remove the Child at a Specified Offset - -Use method {Parent#delete_at}[../../../../REXML/Parent.html#method-i-delete_at] -to remove the child at a specified offset: - - d = REXML::Document.new('') - a = REXML::Element.new('a') - b = REXML::Element.new('b') - d.root.add(a) - d.root.add(b) - d.root.add(a) - d.root.add(b) - d.root.children # => [, , , ] - d.root.delete_at(2) - d.root.children # => [, , ] - -==== Task: Remove Children That Meet Specified Criteria - -Use method {Parent#delete_if}[../../../../REXML/Parent.html#method-i-delete_if] -to remove children that meet criteria specified in the given block: - - d = REXML::Document.new('') - d.root.add(REXML::Element.new('x')) - d.root.add(REXML::Element.new('xx')) - d.root.add(REXML::Element.new('xxx')) - d.root.add(REXML::Element.new('xxxx')) - d.root.children # => [, , , ] - d.root.delete_if {|child| child.name.size.odd? } - d.root.children # => [, ] - -=== Iterations - -==== Task: Iterate Over Children - -Use method {Parent#each_child}[../../../../REXML/Parent.html#method-i-each_child] -(or its alias +each+) to iterate over all children: - - xml_string = '' - d = REXML::Document.new(xml_string) - d.root.children # => [, , ] - d.root.each_child {|child| p child } - -Output: - - - - - -==== Task: Iterate Over Child Indexes - -Use method {Parent#each_index}[../../../../REXML/Parent.html#method-i-each_index] -to iterate over all child indexes: - - xml_string = '' - d = REXML::Document.new(xml_string) - d.root.children # => [, , ] - d.root.each_index {|child| p child } - -Output: - - 0 - 1 - 2 - -=== Clones - -==== Task: Clone Deeply - -Use method {Parent#deep_clone}[../../../../REXML/Parent.html#method-i-deep_clone] -to clone deeply; that is, to clone every nested node that is a Parent object: - - xml_string = <<-EOT - - - - Everyday Italian - Giada De Laurentiis - 2005 - 30.00 - - - Harry Potter - J K. Rowling - 2005 - 29.99 - - - Learning XML - Erik T. Ray - 2003 - 39.95 - - - EOT - d = REXML::Document.new(xml_string) - root = d.root - shallow = root.clone - deep = root.deep_clone - shallow.to_s.size # => 12 - deep.to_s.size # => 590 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/child_toc.rdoc b/example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/child_toc.rdoc deleted file mode 100644 index a2083a0..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/child_toc.rdoc +++ /dev/null @@ -1,12 +0,0 @@ -Tasks on this page: - -- {Relationships}[#label-Relationships] - - {Task: Set the Parent}[#label-Task-3A+Set+the+Parent] - - {Task: Insert Previous Sibling}[#label-Task-3A+Insert+Previous+Sibling] - - {Task: Insert Next Sibling}[#label-Task-3A+Insert+Next+Sibling] -- {Removal or Replacement}[#label-Removal+or+Replacement] - - {Task: Remove Child from Parent}[#label-Task-3A+Remove+Child+from+Parent] - - {Task: Replace Child}[#label-Task-3A+Replace+Child] -- {Document}[#label-Document] - - {Task: Get the Document}[#label-Task-3A+Get+the+Document] - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/document_toc.rdoc b/example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/document_toc.rdoc deleted file mode 100644 index 5db055f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/document_toc.rdoc +++ /dev/null @@ -1,30 +0,0 @@ -Tasks on this page: - -- {New Document}[#label-New+Document] - - {Task: Create an Empty Document}[#label-Task-3A+Create+an+Empty+Document] - - {Task: Parse a String into a New Document}[#label-Task-3A+Parse+a+String+into+a+New+Document] - - {Task: Parse an IO Stream into a New Document}[#label-Task-3A+Parse+an+IO+Stream+into+a+New+Document] - - {Task: Create a Document from an Existing Document}[#label-Task-3A+Create+a+Document+from+an+Existing+Document] - - {Task: Clone a Document}[#label-Task-3A+Clone+a+Document] -- {Document Type}[#label-Document+Type] - - {Task: Get the Document Type}[#label-Task-3A+Get+the+Document+Type] - - {Task: Set the Document Type}[#label-Task-3A+Set+the+Document+Type] -- {XML Declaration}[#label-XML+Declaration] - - {Task: Get the XML Declaration}[#label-Task-3A+Get+the+XML+Declaration] - - {Task: Set the XML Declaration}[#label-Task-3A+Set+the+XML+Declaration] -- {Children}[#label-Children] - - {Task: Add an Element Child}[#label-Task-3A+Add+an+Element+Child] - - {Task: Add a Non-Element Child}[#label-Task-3A+Add+a+Non-Element+Child] -- {Writing}[#label-Writing] - - {Task: Write to $stdout}[#label-Task-3A+Write+to+-24stdout] - - {Task: Write to IO Stream}[#label-Task-3A+Write+to+IO+Stream] - - {Task: Write with No Indentation}[#label-Task-3A+Write+with+No+Indentation] - - {Task: Write with Specified Indentation}[#label-Task-3A+Write+with+Specified+Indentation] -- {Querying}[#label-Querying] - - {Task: Get the Document}[#label-Task-3A+Get+the+Document] - - {Task: Get the Encoding}[#label-Task-3A+Get+the+Encoding] - - {Task: Get the Node Type}[#label-Task-3A+Get+the+Node+Type] - - {Task: Get the Root Element}[#label-Task-3A+Get+the+Root+Element] - - {Task: Determine Whether Stand-Alone}[#label-Task-3A+Determine+Whether+Stand-Alone] - - {Task: Get the Version}[#label-Task-3A+Get+the+Version] - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/element_toc.rdoc b/example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/element_toc.rdoc deleted file mode 100644 index 60a504a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/element_toc.rdoc +++ /dev/null @@ -1,55 +0,0 @@ -Tasks on this page: - -- {New Element}[#label-New+Element] - - {Task: Create a Default Element}[#label-Task-3A+Create+a+Default+Element] - - {Task: Create a Named Element}[#label-Task-3A+Create+a+Named+Element] - - {Task: Create an Element with Name and Parent}[#label-Task-3A+Create+an+Element+with+Name+and+Parent] - - {Task: Create an Element with Name, Parent, and Context}[#label-Task-3A+Create+an+Element+with+Name-2C+Parent-2C+and+Context] - - {Task: Create a Shallow Clone}[#label-Task-3A+Create+a+Shallow+Clone] -- {Attributes}[#label-Attributes] - - {Task: Create and Add an Attribute}[#label-Task-3A+Create+and+Add+an+Attribute] - - {Task: Add an Existing Attribute}[#label-Task-3A+Add+an+Existing+Attribute] - - {Task: Add Multiple Attributes from a Hash}[#label-Task-3A+Add+Multiple+Attributes+from+a+Hash] - - {Task: Add Multiple Attributes from an Array}[#label-Task-3A+Add+Multiple+Attributes+from+an+Array] - - {Task: Retrieve the Value for an Attribute Name}[#label-Task-3A+Retrieve+the+Value+for+an+Attribute+Name] - - {Task: Retrieve the Attribute Value for a Name and Namespace}[#label-Task-3A+Retrieve+the+Attribute+Value+for+a+Name+and+Namespace] - - {Task: Delete an Attribute}[#label-Task-3A+Delete+an+Attribute] - - {Task: Determine Whether the Element Has Attributes}[#label-Task-3A+Determine+Whether+the+Element+Has+Attributes] -- {Children}[#label-Children] - - {Task: Create and Add an Element}[#label-Task-3A+Create+and+Add+an+Element] - - {Task: Add an Existing Element}[#label-Task-3A+Add+an+Existing+Element] - - {Task: Create and Add an Element with Attributes}[#label-Task-3A+Create+and+Add+an+Element+with+Attributes] - - {Task: Add an Existing Element with Added Attributes}[#label-Task-3A+Add+an+Existing+Element+with+Added+Attributes] - - {Task: Delete a Specified Element}[#label-Task-3A+Delete+a+Specified+Element] - - {Task: Delete an Element by Index}[#label-Task-3A+Delete+an+Element+by+Index] - - {Task: Delete an Element by XPath}[#label-Task-3A+Delete+an+Element+by+XPath] - - {Task: Determine Whether Element Children}[#label-Task-3A+Determine+Whether+Element+Children] - - {Task: Get Element Descendants by XPath}[#label-Task-3A+Get+Element+Descendants+by+XPath] - - {Task: Get Next Element Sibling}[#label-Task-3A+Get+Next+Element+Sibling] - - {Task: Get Previous Element Sibling}[#label-Task-3A+Get+Previous+Element+Sibling] - - {Task: Add a Text Node}[#label-Task-3A+Add+a+Text+Node] - - {Task: Replace the First Text Node}[#label-Task-3A+Replace+the+First+Text+Node] - - {Task: Remove the First Text Node}[#label-Task-3A+Remove+the+First+Text+Node] - - {Task: Retrieve the First Text Node}[#label-Task-3A+Retrieve+the+First+Text+Node] - - {Task: Retrieve a Specific Text Node}[#label-Task-3A+Retrieve+a+Specific+Text+Node] - - {Task: Determine Whether the Element has Text Nodes}[#label-Task-3A+Determine+Whether+the+Element+has+Text+Nodes] - - {Task: Get the Child at a Given Index}[#label-Task-3A+Get+the+Child+at+a+Given+Index] - - {Task: Get All CDATA Children}[#label-Task-3A+Get+All+CDATA+Children] - - {Task: Get All Comment Children}[#label-Task-3A+Get+All+Comment+Children] - - {Task: Get All Processing Instruction Children}[#label-Task-3A+Get+All+Processing+Instruction+Children] - - {Task: Get All Text Children}[#label-Task-3A+Get+All+Text+Children] -- {Namespaces}[#label-Namespaces] - - {Task: Add a Namespace}[#label-Task-3A+Add+a+Namespace] - - {Task: Delete the Default Namespace}[#label-Task-3A+Delete+the+Default+Namespace] - - {Task: Delete a Specific Namespace}[#label-Task-3A+Delete+a+Specific+Namespace] - - {Task: Get a Namespace URI}[#label-Task-3A+Get+a+Namespace+URI] - - {Task: Retrieve Namespaces}[#label-Task-3A+Retrieve+Namespaces] - - {Task: Retrieve Namespace Prefixes}[#label-Task-3A+Retrieve+Namespace+Prefixes] -- {Iteration}[#label-Iteration] - - {Task: Iterate Over Elements}[#label-Task-3A+Iterate+Over+Elements] - - {Task: Iterate Over Elements Having a Specified Attribute}[#label-Task-3A+Iterate+Over+Elements+Having+a+Specified+Attribute] - - {Task: Iterate Over Elements Having a Specified Attribute and Value}[#label-Task-3A+Iterate+Over+Elements+Having+a+Specified+Attribute+and+Value] - - {Task: Iterate Over Elements Having Specified Text}[#label-Task-3A+Iterate+Over+Elements+Having+Specified+Text] -- {Context}[#label-Context] -- {Other Getters}[#label-Other+Getters] - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/master_toc.rdoc b/example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/master_toc.rdoc deleted file mode 100644 index 0214f6b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/master_toc.rdoc +++ /dev/null @@ -1,135 +0,0 @@ -== Tasks - -=== {Child}[../../tasks/rdoc/child_rdoc.html] -- {Relationships}[../../tasks/rdoc/child_rdoc.html#label-Relationships] - - {Task: Set the Parent}[../../tasks/rdoc/child_rdoc.html#label-Task-3A+Set+the+Parent] - - {Task: Insert Previous Sibling}[../../tasks/rdoc/child_rdoc.html#label-Task-3A+Insert+Previous+Sibling] - - {Task: Insert Next Sibling}[../../tasks/rdoc/child_rdoc.html#label-Task-3A+Insert+Next+Sibling] -- {Removal or Replacement}[../../tasks/rdoc/child_rdoc.html#label-Removal+or+Replacement] - - {Task: Remove Child from Parent}[../../tasks/rdoc/child_rdoc.html#label-Task-3A+Remove+Child+from+Parent] - - {Task: Replace Child}[../../tasks/rdoc/child_rdoc.html#label-Task-3A+Replace+Child] -- {Document}[../../tasks/rdoc/child_rdoc.html#label-Document] - - {Task: Get the Document}[../../tasks/rdoc/child_rdoc.html#label-Task-3A+Get+the+Document] - -=== {Document}[../../tasks/rdoc/document_rdoc.html] -- {New Document}[../../tasks/rdoc/document_rdoc.html#label-New+Document] - - {Task: Create an Empty Document}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Create+an+Empty+Document] - - {Task: Parse a String into a New Document}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Parse+a+String+into+a+New+Document] - - {Task: Parse an IO Stream into a New Document}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Parse+an+IO+Stream+into+a+New+Document] - - {Task: Create a Document from an Existing Document}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Create+a+Document+from+an+Existing+Document] - - {Task: Clone a Document}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Clone+a+Document] -- {Document Type}[../../tasks/rdoc/document_rdoc.html#label-Document+Type] - - {Task: Get the Document Type}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Get+the+Document+Type] - - {Task: Set the Document Type}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Set+the+Document+Type] -- {XML Declaration}[../../tasks/rdoc/document_rdoc.html#label-XML+Declaration] - - {Task: Get the XML Declaration}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Get+the+XML+Declaration] - - {Task: Set the XML Declaration}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Set+the+XML+Declaration] -- {Children}[../../tasks/rdoc/document_rdoc.html#label-Children] - - {Task: Add an Element Child}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Add+an+Element+Child] - - {Task: Add a Non-Element Child}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Add+a+Non-Element+Child] -- {Writing}[../../tasks/rdoc/document_rdoc.html#label-Writing] - - {Task: Write to $stdout}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Write+to+-24stdout] - - {Task: Write to IO Stream}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Write+to+IO+Stream] - - {Task: Write with No Indentation}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Write+with+No+Indentation] - - {Task: Write with Specified Indentation}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Write+with+Specified+Indentation] -- {Querying}[../../tasks/rdoc/document_rdoc.html#label-Querying] - - {Task: Get the Document}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Get+the+Document] - - {Task: Get the Encoding}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Get+the+Encoding] - - {Task: Get the Node Type}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Get+the+Node+Type] - - {Task: Get the Root Element}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Get+the+Root+Element] - - {Task: Determine Whether Stand-Alone}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Determine+Whether+Stand-Alone] - - {Task: Get the Version}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Get+the+Version] - -=== {Element}[../../tasks/rdoc/element_rdoc.html] -- {New Element}[../../tasks/rdoc/element_rdoc.html#label-New+Element] - - {Task: Create a Default Element}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Create+a+Default+Element] - - {Task: Create a Named Element}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Create+a+Named+Element] - - {Task: Create an Element with Name and Parent}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Create+an+Element+with+Name+and+Parent] - - {Task: Create an Element with Name, Parent, and Context}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Create+an+Element+with+Name-2C+Parent-2C+and+Context] - - {Task: Create a Shallow Clone}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Create+a+Shallow+Clone] -- {Attributes}[../../tasks/rdoc/element_rdoc.html#label-Attributes] - - {Task: Create and Add an Attribute}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Create+and+Add+an+Attribute] - - {Task: Add an Existing Attribute}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Add+an+Existing+Attribute] - - {Task: Add Multiple Attributes from a Hash}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Add+Multiple+Attributes+from+a+Hash] - - {Task: Add Multiple Attributes from an Array}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Add+Multiple+Attributes+from+an+Array] - - {Task: Retrieve the Value for an Attribute Name}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Retrieve+the+Value+for+an+Attribute+Name] - - {Task: Retrieve the Attribute Value for a Name and Namespace}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Retrieve+the+Attribute+Value+for+a+Name+and+Namespace] - - {Task: Delete an Attribute}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Delete+an+Attribute] - - {Task: Determine Whether the Element Has Attributes}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Determine+Whether+the+Element+Has+Attributes] -- {Children}[../../tasks/rdoc/element_rdoc.html#label-Children] - - {Task: Create and Add an Element}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Create+and+Add+an+Element] - - {Task: Add an Existing Element}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Add+an+Existing+Element] - - {Task: Create and Add an Element with Attributes}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Create+and+Add+an+Element+with+Attributes] - - {Task: Add an Existing Element with Added Attributes}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Add+an+Existing+Element+with+Added+Attributes] - - {Task: Delete a Specified Element}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Delete+a+Specified+Element] - - {Task: Delete an Element by Index}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Delete+an+Element+by+Index] - - {Task: Delete an Element by XPath}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Delete+an+Element+by+XPath] - - {Task: Determine Whether Element Children}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Determine+Whether+Element+Children] - - {Task: Get Element Descendants by XPath}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Get+Element+Descendants+by+XPath] - - {Task: Get Next Element Sibling}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Get+Next+Element+Sibling] - - {Task: Get Previous Element Sibling}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Get+Previous+Element+Sibling] - - {Task: Add a Text Node}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Add+a+Text+Node] - - {Task: Replace the First Text Node}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Replace+the+First+Text+Node] - - {Task: Remove the First Text Node}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Remove+the+First+Text+Node] - - {Task: Retrieve the First Text Node}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Retrieve+the+First+Text+Node] - - {Task: Retrieve a Specific Text Node}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Retrieve+a+Specific+Text+Node] - - {Task: Determine Whether the Element has Text Nodes}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Determine+Whether+the+Element+has+Text+Nodes] - - {Task: Get the Child at a Given Index}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Get+the+Child+at+a+Given+Index] - - {Task: Get All CDATA Children}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Get+All+CDATA+Children] - - {Task: Get All Comment Children}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Get+All+Comment+Children] - - {Task: Get All Processing Instruction Children}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Get+All+Processing+Instruction+Children] - - {Task: Get All Text Children}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Get+All+Text+Children] -- {Namespaces}[../../tasks/rdoc/element_rdoc.html#label-Namespaces] - - {Task: Add a Namespace}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Add+a+Namespace] - - {Task: Delete the Default Namespace}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Delete+the+Default+Namespace] - - {Task: Delete a Specific Namespace}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Delete+a+Specific+Namespace] - - {Task: Get a Namespace URI}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Get+a+Namespace+URI] - - {Task: Retrieve Namespaces}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Retrieve+Namespaces] - - {Task: Retrieve Namespace Prefixes}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Retrieve+Namespace+Prefixes] -- {Iteration}[../../tasks/rdoc/element_rdoc.html#label-Iteration] - - {Task: Iterate Over Elements}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Iterate+Over+Elements] - - {Task: Iterate Over Elements Having a Specified Attribute}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Iterate+Over+Elements+Having+a+Specified+Attribute] - - {Task: Iterate Over Elements Having a Specified Attribute and Value}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Iterate+Over+Elements+Having+a+Specified+Attribute+and+Value] - - {Task: Iterate Over Elements Having Specified Text}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Iterate+Over+Elements+Having+Specified+Text] -- {Context}[../../tasks/rdoc/element_rdoc.html#label-Context] -- {Other Getters}[../../tasks/rdoc/element_rdoc.html#label-Other+Getters] - -=== {Node}[../../tasks/rdoc/node_rdoc.html] -- {Siblings}[../../tasks/rdoc/node_rdoc.html#label-Siblings] - - {Task: Find Previous Sibling}[../../tasks/rdoc/node_rdoc.html#label-Task-3A+Find+Previous+Sibling] - - {Task: Find Next Sibling}[../../tasks/rdoc/node_rdoc.html#label-Task-3A+Find+Next+Sibling] -- {Position}[../../tasks/rdoc/node_rdoc.html#label-Position] - - {Task: Find Own Index Among Siblings}[../../tasks/rdoc/node_rdoc.html#label-Task-3A+Find+Own+Index+Among+Siblings] -- {Recursive Traversal}[../../tasks/rdoc/node_rdoc.html#label-Recursive+Traversal] - - {Task: Traverse Each Recursively}[../../tasks/rdoc/node_rdoc.html#label-Task-3A+Traverse+Each+Recursively] -- {Recursive Search}[../../tasks/rdoc/node_rdoc.html#label-Recursive+Search] - - {Task: Traverse Each Recursively}[../../tasks/rdoc/node_rdoc.html#label-Task-3A+Traverse+Each+Recursively] -- {Representation}[../../tasks/rdoc/node_rdoc.html#label-Representation] - - {Task: Represent a String}[../../tasks/rdoc/node_rdoc.html#label-Task-3A+Represent+a+String] -- {Parent?}[../../tasks/rdoc/node_rdoc.html#label-Parent-3F] - - {Task: Determine Whether the Node is a Parent}[../../tasks/rdoc/node_rdoc.html#label-Task-3A+Determine+Whether+the+Node+is+a+Parent] - -=== {Parent}[../../tasks/rdoc/parent_rdoc.html] -- {Queries}[../../tasks/rdoc/parent_rdoc.html#label-Queries] - - {Task: Get the Count of Children}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Get+the+Count+of+Children] - - {Task: Get the Child at a Given Index}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Get+the+Child+at+a+Given+Index] - - {Task: Get the Index of a Given Child}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Get+the+Index+of+a+Given+Child] - - {Task: Get the Children}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Get+the+Children] - - {Task: Determine Whether the Node is a Parent}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Determine+Whether+the+Node+is+a+Parent] -- {Additions}[../../tasks/rdoc/parent_rdoc.html#label-Additions] - - {Task: Add a Child at the Beginning}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Add+a+Child+at+the+Beginning] - - {Task: Add a Child at the End}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Add+a+Child+at+the+End] - - {Task: Replace a Child with Another Child}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Replace+a+Child+with+Another+Child] - - {Task: Replace Multiple Children with Another Child}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Replace+Multiple+Children+with+Another+Child] - - {Task: Insert Child Before a Given Child}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Insert+Child+Before+a+Given+Child] - - {Task: Insert Child After a Given Child}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Insert+Child+After+a+Given+Child] -- {Deletions}[../../tasks/rdoc/parent_rdoc.html#label-Deletions] - - {Task: Remove a Given Child}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Remove+a+Given+Child] - - {Task: Remove the Child at a Specified Offset}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Remove+the+Child+at+a+Specified+Offset] - - {Task: Remove Children That Meet Specified Criteria}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Remove+Children+That+Meet+Specified+Criteria] -- {Iterations}[../../tasks/rdoc/parent_rdoc.html#label-Iterations] - - {Task: Iterate Over Children}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Iterate+Over+Children] - - {Task: Iterate Over Child Indexes}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Iterate+Over+Child+Indexes] -- {Clones}[../../tasks/rdoc/parent_rdoc.html#label-Clones] - - {Task: Clone Deeply}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Clone+Deeply] - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/node_toc.rdoc b/example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/node_toc.rdoc deleted file mode 100644 index d9114fa..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/node_toc.rdoc +++ /dev/null @@ -1,16 +0,0 @@ -Tasks on this page: - -- {Siblings}[#label-Siblings] - - {Task: Find Previous Sibling}[#label-Task-3A+Find+Previous+Sibling] - - {Task: Find Next Sibling}[#label-Task-3A+Find+Next+Sibling] -- {Position}[#label-Position] - - {Task: Find Own Index Among Siblings}[#label-Task-3A+Find+Own+Index+Among+Siblings] -- {Recursive Traversal}[#label-Recursive+Traversal] - - {Task: Traverse Each Recursively}[#label-Task-3A+Traverse+Each+Recursively] -- {Recursive Search}[#label-Recursive+Search] - - {Task: Traverse Each Recursively}[#label-Task-3A+Traverse+Each+Recursively] -- {Representation}[#label-Representation] - - {Task: Represent a String}[#label-Task-3A+Represent+a+String] -- {Parent?}[#label-Parent-3F] - - {Task: Determine Whether the Node is a Parent}[#label-Task-3A+Determine+Whether+the+Node+is+a+Parent] - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/parent_toc.rdoc b/example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/parent_toc.rdoc deleted file mode 100644 index 68fc0b7..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/parent_toc.rdoc +++ /dev/null @@ -1,25 +0,0 @@ -Tasks on this page: - -- {Queries}[#label-Queries] - - {Task: Get the Count of Children}[#label-Task-3A+Get+the+Count+of+Children] - - {Task: Get the Child at a Given Index}[#label-Task-3A+Get+the+Child+at+a+Given+Index] - - {Task: Get the Index of a Given Child}[#label-Task-3A+Get+the+Index+of+a+Given+Child] - - {Task: Get the Children}[#label-Task-3A+Get+the+Children] - - {Task: Determine Whether the Node is a Parent}[#label-Task-3A+Determine+Whether+the+Node+is+a+Parent] -- {Additions}[#label-Additions] - - {Task: Add a Child at the Beginning}[#label-Task-3A+Add+a+Child+at+the+Beginning] - - {Task: Add a Child at the End}[#label-Task-3A+Add+a+Child+at+the+End] - - {Task: Replace a Child with Another Child}[#label-Task-3A+Replace+a+Child+with+Another+Child] - - {Task: Replace Multiple Children with Another Child}[#label-Task-3A+Replace+Multiple+Children+with+Another+Child] - - {Task: Insert Child Before a Given Child}[#label-Task-3A+Insert+Child+Before+a+Given+Child] - - {Task: Insert Child After a Given Child}[#label-Task-3A+Insert+Child+After+a+Given+Child] -- {Deletions}[#label-Deletions] - - {Task: Remove a Given Child}[#label-Task-3A+Remove+a+Given+Child] - - {Task: Remove the Child at a Specified Offset}[#label-Task-3A+Remove+the+Child+at+a+Specified+Offset] - - {Task: Remove Children That Meet Specified Criteria}[#label-Task-3A+Remove+Children+That+Meet+Specified+Criteria] -- {Iterations}[#label-Iterations] - - {Task: Iterate Over Children}[#label-Task-3A+Iterate+Over+Children] - - {Task: Iterate Over Child Indexes}[#label-Task-3A+Iterate+Over+Child+Indexes] -- {Clones}[#label-Clones] - - {Task: Clone Deeply}[#label-Task-3A+Clone+Deeply] - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ruby-macho-2.5.1/.yardopts b/example/vendor/bundle/ruby/2.7.0/gems/ruby-macho-2.5.1/.yardopts deleted file mode 100644 index 035b890..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ruby-macho-2.5.1/.yardopts +++ /dev/null @@ -1 +0,0 @@ ---no-private --markup-provider=redcarpet --markup=markdown - README.md LICENSE diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ruby-macho-2.5.1/LICENSE b/example/vendor/bundle/ruby/2.7.0/gems/ruby-macho-2.5.1/LICENSE deleted file mode 100644 index 89dd7d6..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ruby-macho-2.5.1/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015, 2016, 2017, 2018 William Woodruff - -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/example/vendor/bundle/ruby/2.7.0/gems/ruby-macho-2.5.1/README.md b/example/vendor/bundle/ruby/2.7.0/gems/ruby-macho-2.5.1/README.md deleted file mode 100644 index 28813f1..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ruby-macho-2.5.1/README.md +++ /dev/null @@ -1,69 +0,0 @@ -ruby-macho -================ - -[![Gem Version](https://badge.fury.io/rb/ruby-macho.svg)](http://badge.fury.io/rb/ruby-macho) -[![Build Status](https://travis-ci.org/Homebrew/ruby-macho.svg?branch=master)](https://travis-ci.org/Homebrew/ruby-macho) -[![Coverage Status](https://codecov.io/gh/Homebrew/ruby-macho/branch/master/graph/badge.svg)](https://codecov.io/gh/Homebrew/ruby-macho) - -A Ruby library for examining and modifying Mach-O files. - -### What is a Mach-O file? - -The [Mach-O file format](https://en.wikipedia.org/wiki/Mach-O) is used by macOS -and iOS (among others) as a general purpose binary format for object files, -executables, dynamic libraries, and so forth. - -### Installation - -ruby-macho can be installed via RubyGems: - -```bash -$ gem install ruby-macho -``` - -### Documentation - -Full documentation is available on [RubyDoc](http://www.rubydoc.info/gems/ruby-macho/). - -A quick example of what ruby-macho can do: - -```ruby -require 'macho' - -file = MachO::MachOFile.new("/path/to/my/binary") - -# get the file's type (object, dynamic lib, executable, etc) -file.filetype # => :execute - -# get all load commands in the file and print their offsets: -file.load_commands.each do |lc| - puts "#{lc.type}: offset #{lc.offset}, size: #{lc.cmdsize}" -end - -# access a specific load command -lc_vers = file[:LC_VERSION_MIN_MACOSX].first -puts lc_vers.version_string # => "10.10.0" -``` - -### What works? - -* Reading data from x86/x86_64/PPC Mach-O files -* Changing the IDs of Mach-O and Fat dylibs -* Changing install names in Mach-O and Fat files -* Adding, deleting, and modifying rpaths. - -### What needs to be done? - -* Unit and performance testing. - -Attribution: - -* Constants were taken from Apple, Inc's -[`loader.h` in `cctools/include/mach-o`](https://www.opensource.apple.com/source/cctools/cctools-870/include/mach-o/loader.h). -(Apple Public Source License 2.0). - -### License - -`ruby-macho` is licensed under the MIT License. - -For the exact terms, see the [license](LICENSE) file. diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/.gitignore b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/.gitignore deleted file mode 100644 index a414378..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -*.gem -Gemfile.lock -doc/ -.yardoc -.rvmrc -coverage -check.sh -tags diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/.rspec b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/.rspec deleted file mode 100644 index 838fd57..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/.rspec +++ /dev/null @@ -1,4 +0,0 @@ ---tty ---color ---format documentation ---backtrace diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/.travis.yml b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/.travis.yml deleted file mode 100644 index dc0c9df..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/.travis.yml +++ /dev/null @@ -1,26 +0,0 @@ -language: ruby -script: "bundle exec rake" -rvm: - - 1.9.3 - - 2.0.0 - - 2.1.10 - - 2.2.10 - - 2.3.8 - - 2.4.7 - - 2.5.6 - - 2.6.4 - - ruby-head - - jruby-head - - jruby-18mode - - jruby-19mode -matrix: - fast_finish: true - allow_failures: - - rvm: ruby-head - - rvm: jruby-head - - rvm: ree - include: - - rvm: 1.8.7 - dist: precise - - rvm: 1.9.2 - dist: trusty diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/CHANGELOG.md b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/CHANGELOG.md deleted file mode 100644 index 223e4bc..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/CHANGELOG.md +++ /dev/null @@ -1,406 +0,0 @@ -# Changelog - -## Master - -[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v1.4.0...master) - -## 1.4.0 - -[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v1.1.2...v1.4.0) - -#### 1 feature -- Faraday adapter exceptions namespace compatibility with Faraday v1 ([@iMacTia](https://github.com/iMacTia) in [#616](https://github.com/typhoeus/typhoeus/pull/616)) - -#### 3 Others -- Yard warning fixes ([@olleolleolle](https://github.com/olleolleolle) in [#622](https://github.com/typhoeus/typhoeus/pull/622)) -- Add more Ruby versions in CI matrix ([@olleolleolle](https://github.com/olleolleolle) in [#623](https://github.com/typhoeus/typhoeus/pull/623)) -- Use of argument passed in function instead of `attr_reader` ([@v-kolesnikov](https://github.com/v-kolesnikov) in [#625](https://github.com/typhoeus/typhoeus/pull/625)) - -## 1.1.2 - -[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v1.1.1...v1.1.2) - -## 1.1.1 - -[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v1.1.0...v1.1.1) - -## 1.1.0 - -[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v1.0.2...v1.1.0) - -* Unless specified `Expect` header is set to be empty to avoid `100 continue` - to be set when using `PUT` -* Add global config option `Typhoeus::Config.proxy` - -## 1.0.2 - -[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v1.0.1...v1.0.2) - -## 1.0.1 - -[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v1.0.0...v1.0.1) - -## 1.0.0 - -[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.8.0...v1.0.0) - -## 0.8.0 - -[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.7.3...v0.8.0) - -* `EasyFactory`: Reduced object allocations and method calls during deprecated - option handling and option sanitization. - ([Tasos Laskos](https://github.com/zapotek)) -* `Response` ([Tasos Laskos](https://github.com/zapotek)) - * `Header` - * `#process_pair`: Halved `#set_value` calls. - * `#set_value`: Minimized `Hash` accesses. - * `#parse`: Use `String#start_with?` instead of `Regexp` match. - * `#process_line`: Optimized key/value sanitization. - * `Status` - * `#timed_out?`: Only return `true` when `#return_code` is `operation_timedout`. - -## 0.7.3 - -[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.7.2...v0.7.3) - -* Add on_body callbacks individually to allow Ethon to recognize the return code - -## 0.7.2 - -[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.7.1...v0.7.2) - -* Allow arrays to be passed to Expectation#and_return - ([JP Moral](https://github.com/jpmoral)) - -* Added getter for `redirect_time` value. - ([Adrien Jarthon](https://github.com/jarthod)) - -## 0.7.1 - -[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.7.0...v0.7.1) - -Bugfixes: - -* Forking may cause libcurl sockets to be shared with child processes, causing HTTP requests to be interleaved - ([Rolf Timmermans](https://github.com/rolftimmermans), [\#436](https://github.com/typhoeus/typhoeus/pull/426)) - -## 0.7.0 - -[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.7.0.pre1...v0.7.0) - -Bugfixes: - -* Call on_headers and on_body when using stubbed responses. - -## 0.7.0.pre1 - -[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.6.9...v0.7.0.pre1) - -Enhancements: - -* Improving timeout behavior and documentation. `no_signal` is now set per default! - ([Jonas Wagner](https://github.com/jwagner), [\#398](https://github.com/typhoeus/typhoeus/pull/398)) - -## 0.6.8 - -[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.6.7...v0.6.8) - -Bugfixes: - -* Fix Faraday 0.9 compatibility. - ([Gleb Mazovetskiy](https://github.com/glebm), [\#357](https://github.com/typhoeus/typhoeus/pull/357)) -* Fix Request#hash for different key orders. - ([Matthew Schulkind](https://github.com/mschulkind), [\#344](https://github.com/typhoeus/typhoeus/pull/344)) - -Enhancements: - -* Use an updated Ethon version. Note that from now on the `mime-types` is no longer a Ethon dependency. The gem will be still used if available to determine the mime type of a file which is uploaded. That means you have to have take care of the gem installation yourself. -* Use SVG for status badges in README. - ([Sean Linsley](https://github.com/seanlinsley), [\#353](https://github.com/typhoeus/typhoeus/pull/353)) -* Missing quotes in README example code. - ([Jason R. Clark](https://github.com/jasonrclark), [\#351](https://github.com/typhoeus/typhoeus/pull/351)) -* Specs for Faraday adapter. - ([michaelavila](https://github.com/michaelavila), [\#348](https://github.com/typhoeus/typhoeus/pull/348)) -* Clarify wording in README. - ([Sean Linsley](https://github.com/seanlinsley), [\#347](https://github.com/typhoeus/typhoeus/pull/347)) -* Make caching easier for non-memory caches. - ([Matthew Schulkind](https://github.com/mschulkind), [\#345](https://github.com/typhoeus/typhoeus/pull/345)) -* Spec refactoring. - ([Matthew Schulkind](https://github.com/mschulkind), [\#343](https://github.com/typhoeus/typhoeus/pull/343)) - -## 0.6.7 - -[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.6.6...v0.6.7) - -Enhancements: - -* Add response streaming. - ([\#339](https://github.com/typhoeus/typhoeus/pull/339)) - -## 0.6.6 - -[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.6.5...v0.6.6) - -## 0.6.5 - -[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.6.4...v0.6.5) - -## 0.6.4 - -[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.6.3...v0.6.4) - -The changelog entries are coming soon! - -## 0.6.3 - -[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.6.2...v0.6.3) - -Enhancements: - -* Cache hydra per thread. -* Various documentation improvements. - ([craiglittle](https://github.com/craiglittle)) -* Add support for lazy construction of responses from stubbed requests. - ([ryankindermann](https://github.com/ryankinderman), [\#275](https://github.com/typhoeus/typhoeus/pull/275)) - -## 0.6.2 - -[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.6.1...v0.6.2) - -Enhancements: - -* Reintroduce a global cache. -* `Request#handled_response` falls back to the original response. - ([turnerking](https://github.com/turnerking), [\#272](https://github.com/typhoeus/typhoeus/pull/272)) -* When `Errors::NoStub` is raised the `url` is displayed. - ([dschneider](https://github.com/dschneider), [\#276](https://github.com/typhoeus/typhoeus/pull/276)) -* Make `Request#hash` consistent. -* Add `.rvmrc` and `ctags` to `.gitignore`. - ([ryankindermann](https://github.com/ryankinderman), [\#274](https://github.com/typhoeus/typhoeus/pull/274)) - -## 0.6.1 - -[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.6.0...v0.6.1) - -Enhancements: - -* Updated ethon version which allows to set multiple protocols. - -## 0.6.0 - -[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.5.4...v0.6.0) - -Enhancements: - -* `Request#url` now also contains the url parameters. -* Use updated ethon version which provides access to protocols and redir_protocols in response to [libcurl SASL buffer overflow vulnerability](http://curl.haxx.se/docs/adv_20130206.html) - -Bugfixes: - -* Corrected ssl options for the faraday adapter. -* The before hook now correctly returns the response. - ([Mattias Putman](https://github.com/challengee), [\#268](https://github.com/typhoeus/typhoeus/pull/268)) -* Benchmark is working again. - -## 0.5.4 - -[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.5.3...v0.5.4) - -Enhancements: - -* Make sure response_code is an integer. -* When setting an header through vcr or webmock it becomes a `Typhoeus::Response::Header`. -* Provide a Rack middleware to decode nested Typhoeus arrays properly. - ([Dwayne Macgowan](https://github.com/dwaynemac), [\#224](https://github.com/typhoeus/typhoeus/issues/224)) -* Handled response is available again. -* Rename parameter `url` to `base_url`. See discussion here: [\#250](https://github.com/typhoeus/typhoeus/issues/250). - ([bkimble](https://github.com/bkimble), [\#256](https://github.com/typhoeus/typhoeus/pull/256)) -* Provide O(1) header access. - * Work around ruby 1.8.7 limitations. - ([Chris Johnson](https://github.com/findchris), [\#227](https://github.com/typhoeus/typhoeus/pull/227) ) - * Provide symbol access. - -## 0.5.3 - -[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.5.2...v0.5.3) - -Enhancements: - -* When checking options in Expecation#matches? also consider Request#options. - -Bugfixes: - -* Do not break backwards compatibility with case insensitive headers access. -* Make sure hydra behaves correct in case of before hooks. - -## 0.5.2 - -[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.5.1...v0.5.2) - -Enhancements: - -* Do not check the return_code in Response#success? when response is mocked. -* Check for memoization, stubbing, before hooks are delayed to Hydra#run. It - was on Hydra#queue before and led to strange behavior because if the request - was stubbed, it was wrapped up in queue already. There was no way to add - callbacks after queue thatswhy. This is now different, since everything happens - in run, just as you expect. - -## 0.5.1 - -[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.5.0...v0.5.1) - -Enhancements: - -* Downcase header keys for easier access - ( [\#227](https://github.com/typhoeus/typhoeus/issues/227) ) -* Using an updated Ethon version. - -## 0.5.0 - -[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.4.2...v0.5.0) - -Major Changes: - -* Ethon integration - * Params are url params and a body is always a body for every request type - * The options you can set might have a slightly other names, as Ethon sticks to - libcurl names. See - [Easy.new](http://rubydoc.info/github/typhoeus/ethon/Ethon/Easy#initialize-instance_method) - for a description. - * Request parameter and body are properly encoded (only POST multiform body is not) - * No more header sanitizing. Before: `:headers => { 'user_agent' => 'Custom' }` was modified to - `:headers => { 'User-Agent' => 'Custom' }` - * `Typhoeus::Easy` and `Typhoeus::Multi` are now `Ethon::Easy` and `Ethon::Multi` - -* Request shortcuts: `Typhoeus.get("www.google.de")` -* Global configuration: -```ruby -Typhoeus.configure do |config| - config.verbose = true - config.memoize = true -end -``` -* No more `Response#headers_hash`, instead `Response#headers` returning the last - header and response#redirections returning the responses with headers - generated through redirections -* Instead of defining the same callbacks on every request, you can define global callbacks: -```ruby -Typhoeus.on_complete { p "yay" } -``` -* The stubbing interface changed slightly. You now have the same syntax as for requests: -```ruby -Typhoeus.stub(url, options).and_return(response) -``` -* The following things were removed because they do not seemed to be used at all. Ping me if you disagree! - * `Typhoeus::Filter` - * `Typhoeus::Remote` - * `Typhoeus::RemoteMethod` - * `Typhoeus::RemoteProxyObject` - * build in cache interface - -Enhancements: - -* Documentation - ( [Alex P](https://github.com/ifesdjeen), [\#188](https://github.com/typhoeus/typhoeus/issues/188) ) -* Request#on\_complete can hold multiple blocks. -* Request#eql? recognizes when header/params/body has a different order, but still same keys and values - ( [Alex P](https://github.com/ifesdjeen), [\#194](https://github.com/typhoeus/typhoeus/issues/194) ) - -Bug Fixes: - -* Zero bytes in strings are escaped for libcurl -* Add support for socks5 hostname proxy type - ( [eweathers](https://github.com/eweathers), [\#183](https://github.com/typhoeus/typhoeus/issues/183) ) -* Post body is encoded - ( [Rohan Deshpande](https://github.com/rdeshpande), [\#143](https://github.com/typhoeus/typhoeus/issues/143) ) -* Set default user agent - ( [Steven Shingler](https://github.com/sshingler), [\#176](https://github.com/typhoeus/typhoeus/issues/176) ) - -## 0.4.2 -* A header hotfix - -## 0.4.1 -* Fix verifypeer and verifyhost options -* Fix header sending - -## 0.4.0 -* Make a GET even when a body is given -* Deprecated User Agent setter removed -* Allow cache key basis overwrite (John Crepezzi, #147) -* FFI integration (Daniel Cavanagh, #151) -* Refactor upload code (Marnen Laibow-Koser, #152) -* Fix travis-ci build (Ezekiel Templin, #160) - -## 0.3.3 -* Make sure to call the Easy::failure callback on all non-success http response codes, even invalid ones. [balexis] -* Use bytesize instead of length to determine Content-Length [dlamacchia] -* Added SSL version option to Easy/Request [michelbarbosa/dbalatero] - -## 0.3.2 -* Fix array params to be consistent with HTTP spec [gridaphobe] -* traversal\_to\_params\_hash should use the escape option [itsmeduncan] -* Fix > 1024 open file descriptors [mschulkind] -* Fixed a bug with internally queued requests being dropped [mschulkind] -* Use gemspec in bundler to avoid duplication [mschulkind] -* Run internally queued requests in FIFO order [mschulkind] -* Moved Typhoeus::VERSION to a separate file, to fix rake build\_native [mschulkind] -* Fixed problems related to put requests with empty bodies [skaes, GH-84] -* Added CURLOPT\_INTERFACE option via Request#interface=. [spiegela] -* Added Tempfile support to Form#process! [richievos] -* Hydra won't forget to accept gzip/deflate encoding [codesnik] -* Accept and convert strings to integers in Typhoeus::Request#initialize for timeout/cache\_timeout/connect\_timeout values when using ruby 1.9.x. [djnawara] -* Added interface for registering stub finders [myronmarston] -* Fixed header stubbing [myronmarston] -* Added PKCS12 support [jodell] -* Make a request with handlers marshallable [bernerdschaefer] -* Upgraded to RSpec 2 [bernerdschaefer] -* Fix HTTP status edge-case [balexis] -* Expose primary\_ip to easy object [balexis] - -## 0.2.4 -* Fix form POSTs to only use multipart for file uploads, otherwise use application/x-www-form-urlencoded [dbalatero] - -## 0.2.3 -* Code duplication in Typhoeus::Form led to nested URL param errors on POST only. Fixed [dbalatero] - -## 0.2.2 -* Fixed a problem with nested URL params encoding incorrectly [dbalatero] - -## 0.2.1 -* Added extended proxy support [Zapotek, GH-46] -* eliminated compile time warnings by using proper type declarations [skaes, GH-54] -* fixed broken calls to rb\_raise [skaes, GH-54] -* prevent leaking of curl easy handles when exceptions are raised (either from typhoeus itself or user callbacks) [skaes, GH-54] -* fixed Easy#timed\_out? using curl return codes [skaes, GH-54] -* provide curl return codes and corresponding curl error messages on classes Easy and Request [skaes, GH-54] -* allow VCR to whitelist hosts in Typhoeus stubbing/mocking [myronmarston, GH-57] -* added timed\_out? documentation, method to Response [dbalatero, GH-34] -* added abort to Hydra to prematurely stop a hydra.run [Zapotek] -* added file upload support for POST requests [jtarchie, GH-59] - -## 0.2.0 -* Fix warning in Request#headers from attr\_accessor -* Params with array values were not parsing into the format that rack expects [GH-39, smartocci] -* Removed Rack as a dependency [GH-45] -* Added integration hooks for VCR! - -## 0.1.31 -* Fixed bug in setting compression encoding [morhekil] -* Exposed authentication control methods through Request interface [morhekil] - -## 0.1.30 -* Exposed CURLOPT\_CONNECTTIMEOUT\_MS to Requests [balexis] - -## 0.1.29 -* Fixed a memory corruption with using CURLOPT\_POSTFIELDS [gravis, -32531d0821aecc4] - -## 0.1.28 -* Added SSL cert options for Typhoeus::Easy [GH-25, gravis] -* Ported SSL cert options to Typhoeus::Request interface [gravis] -* Added support for any HTTP method (purge for Varnish) [ryana] - -## 0.1.27 -* Added rack as dependency, added dev dependencies to Rakefile [GH-21] diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/CONTRIBUTING.md b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/CONTRIBUTING.md deleted file mode 100644 index 667e8a3..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/CONTRIBUTING.md +++ /dev/null @@ -1,20 +0,0 @@ -We love pull requests. Here's a quick guide: - -1. Fork the repo. - -2. Run the tests. We only take pull requests with passing tests, and it's great -to know that you have a clean slate: `bundle && bundle exec rake` - -3. Add a test for your change. Only refactoring and documentation changes -require no new tests. If you are adding functionality or fixing a bug, we need -a test! - -4. Make the test pass. - -5. Push to your fork and submit a pull request. - -And in case we didn't emphasize it enough: we love tests! - -## Issue triage [![Open Source Helpers](https://www.codetriage.com/typhoeus/typhoeus/badges/users.svg)](https://www.codetriage.com/typhoeus/typhoeus) - -You can contribute by triaging issues which may include reproducing bug reports or asking for vital information, such as version numbers or reproduction instructions. If you would like to start triaging issues, one easy way to get started is to [subscribe to typhoeus on CodeTriage](https://www.codetriage.com/typhoeus/typhoeus). diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/Gemfile b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/Gemfile deleted file mode 100644 index dd662d7..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/Gemfile +++ /dev/null @@ -1,32 +0,0 @@ -source "https://rubygems.org" -gemspec - -if Gem.ruby_version < Gem::Version.new("2.0.0") - gem "rake", "< 11" - gem "json", "< 2" -else - gem "json" - gem "rake" -end - -group :development, :test do - gem "rspec", "~> 3.0" - - gem "sinatra", "~> 1.3" - - if Gem.ruby_version >= Gem::Version.new("1.9.0") - gem "faraday", ">= 0.9" - gem "dalli", "~> 2.0" - end - - gem "redis", "~> 3.0" - - if RUBY_PLATFORM == "java" - gem "spoon" - end - - unless ENV["CI"] - gem "guard-rspec", "~> 0.7" - gem 'rb-fsevent', '~> 0.9.1' - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/Guardfile b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/Guardfile deleted file mode 100644 index f0db299..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/Guardfile +++ /dev/null @@ -1,9 +0,0 @@ -# vim:set filetype=ruby: -guard( - "rspec", - all_after_pass: false, - cli: "--fail-fast --tty --format documentation --colour") do - - watch(%r{^spec/.+_spec\.rb$}) - watch(%r{^lib/(.+)\.rb$}) { |match| "spec/#{match[1]}_spec.rb" } -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/LICENSE b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/LICENSE deleted file mode 100644 index 387fac5..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2009-2010 Paul Dix -Copyright (c) 2011 David Balatero -Copyright (c) 2012-2016 Hans Hasselberg - -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/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/README.md b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/README.md deleted file mode 100644 index 1bbab54..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/README.md +++ /dev/null @@ -1,584 +0,0 @@ -# Typhoeus [![Build Status](https://img.shields.io/travis/typhoeus/typhoeus/master.svg)](https://travis-ci.org/typhoeus/typhoeus) [![Code Climate](https://img.shields.io/codeclimate/maintainability/typhoeus/typhoeus.svg)](https://codeclimate.com/github/typhoeus/typhoeus) [![Gem Version](https://img.shields.io/gem/v/typhoeus.svg)](https://rubygems.org/gems/typhoeus) - -Like a modern code version of the mythical beast with 100 serpent heads, Typhoeus runs HTTP requests in parallel while cleanly encapsulating handling logic. - -## Example - -A single request: - -```ruby -Typhoeus.get("www.example.com", followlocation: true) -``` - -Parallel requests: - -```ruby -hydra = Typhoeus::Hydra.new -10.times.map{ hydra.queue(Typhoeus::Request.new("www.example.com", followlocation: true)) } -hydra.run -``` - -## Installation -Add the following line to your Gemfile: -``` -gem "typhoeus" -``` -Then run `bundle install` - -Or install it yourself as: - -``` -gem install typhoeus -``` - -## Project Tracking - -* [Documentation](http://rubydoc.info/github/typhoeus/typhoeus/frames/Typhoeus) (GitHub master) -* [Mailing list](http://groups.google.com/group/typhoeus) - -## Usage - -### Introduction - -The primary interface for Typhoeus is comprised of three classes: Request, Response, and Hydra. Request represents an HTTP request object, response represents an HTTP response, and Hydra manages making parallel HTTP connections. - -```ruby -request = Typhoeus::Request.new( - "www.example.com", - method: :post, - body: "this is a request body", - params: { field1: "a field" }, - headers: { Accept: "text/html" } -) -``` - -We can see from this that the first argument is the url. The second is a set of options. -The options are all optional. The default for `:method` is `:get`. - -When you want to send URL parameters, you can use `:params` hash to do so. Please note that in case of you should send a request via `x-www-form-urlencoded` parameters, you need to use `:body` hash instead. `params` are for URL parameters and `:body` is for the request body. - -#### Sending requests through the proxy - -Add a proxy url to the list of options: - -```ruby -options = {proxy: 'http://myproxy.org'} -req = Typhoeus::Request.new(url, options) -``` - -If your proxy requires authentication, add it with `proxyuserpwd` option key: - -```ruby -options = {proxy: 'http://proxyurl.com', proxyuserpwd: 'user:password'} -req = Typhoeus::Request.new(url, options) -``` - -Note that `proxyuserpwd` is a colon-separated username and password, in the vein of basic auth `userpwd` option. - - -You can run the query either on its own or through the hydra: - -``` ruby -request.run -#=> -``` - -```ruby -hydra = Typhoeus::Hydra.hydra -hydra.queue(request) -hydra.run -``` - -The response object will be set after the request is run. - -```ruby -response = request.response -response.code -response.total_time -response.headers -response.body -``` - -### Making Quick Requests - -Typhoeus has some convenience methods for performing single HTTP requests. The arguments are the same as those you pass into the request constructor. - -```ruby -Typhoeus.get("www.example.com") -Typhoeus.head("www.example.com") -Typhoeus.put("www.example.com/posts/1", body: "whoo, a body") -Typhoeus.patch("www.example.com/posts/1", body: "a new body") -Typhoeus.post("www.example.com/posts", body: { title: "test post", content: "this is my test"}) -Typhoeus.delete("www.example.com/posts/1") -Typhoeus.options("www.example.com") -``` -#### Sending params in the body with PUT -When using POST the content-type is set automatically to 'application/x-www-form-urlencoded'. That's not the case for any other method like PUT, PATCH, HEAD and so on, irrespective of whether you are using body or not. To get the same result as POST, i.e. a hash in the body coming through as params in the receiver, you need to set the content-type as shown below: -```ruby -Typhoeus.put("www.example.com/posts/1", - headers: {'Content-Type'=> "application/x-www-form-urlencoded"}, - body: {title:"test post updated title", content: "this is my updated content"} - ) -``` - -### Handling HTTP errors - -You can query the response object to figure out if you had a successful -request or not. Here’s some example code that you might use to handle errors. -The callbacks are executed right after the request is finished, make sure to define -them before running the request. - -```ruby -request = Typhoeus::Request.new("www.example.com", followlocation: true) - -request.on_complete do |response| - if response.success? - # hell yeah - elsif response.timed_out? - # aw hell no - log("got a time out") - elsif response.code == 0 - # Could not get an http response, something's wrong. - log(response.return_message) - else - # Received a non-successful http response. - log("HTTP request failed: " + response.code.to_s) - end -end - -request.run -``` - -This also works with serial (blocking) requests in the same fashion. Both -serial and parallel requests return a Response object. - -### Handling file uploads - -A File object can be passed as a param for a POST request to handle uploading -files to the server. Typhoeus will upload the file as the original file name -and use Mime::Types to set the content type. - -```ruby -Typhoeus.post( - "http://localhost:3000/posts", - body: { - title: "test post", - content: "this is my test", - file: File.open("thesis.txt","r") - } -) -``` - -### Streaming the response body - -Typhoeus can stream responses. When you're expecting a large response, -set the `on_body` callback on a request. Typhoeus will yield to the callback -with chunks of the response, as they're read. When you set an `on_body` callback, -Typhoeus will not store the complete response. - -```ruby -downloaded_file = File.open 'huge.iso', 'wb' -request = Typhoeus::Request.new("www.example.com/huge.iso") -request.on_headers do |response| - if response.code != 200 - raise "Request failed" - end -end -request.on_body do |chunk| - downloaded_file.write(chunk) -end -request.on_complete do |response| - downloaded_file.close - # Note that response.body is "" -end -request.run -``` - -If you need to interrupt the stream halfway, -you can return the `:abort` symbol from the `on_body` block, example: - -```ruby -request.on_body do |chunk| - buffer << chunk - :abort if buffer.size > 1024 * 1024 -end -``` - -This will properly stop the stream internally and avoid any memory leak which -may happen if you interrupt with something like a `return`, `throw` or `raise`. - -### Making Parallel Requests - -Generally, you should be running requests through hydra. Here is how that looks: - -```ruby -hydra = Typhoeus::Hydra.hydra - -first_request = Typhoeus::Request.new("http://example.com/posts/1") -first_request.on_complete do |response| - third_url = response.body - third_request = Typhoeus::Request.new(third_url) - hydra.queue third_request -end -second_request = Typhoeus::Request.new("http://example.com/posts/2") - -hydra.queue first_request -hydra.queue second_request -hydra.run # this is a blocking call that returns once all requests are complete -``` - -The execution of that code goes something like this. The first and second requests are built and queued. When hydra is run the first and second requests run in parallel. When the first request completes, the third request is then built and queued, in this example based on the result of the first request. The moment it is queued Hydra starts executing it. Meanwhile the second request would continue to run (or it could have completed before the first). Once the third request is done, `hydra.run` returns. - -How to get an array of response bodies back after executing a queue: - -```ruby -hydra = Typhoeus::Hydra.new -requests = 10.times.map { - request = Typhoeus::Request.new("www.example.com", followlocation: true) - hydra.queue(request) - request -} -hydra.run - -responses = requests.map { |request| - request.response.body -} -``` -`hydra.run` is a blocking request. You can also use the `on_complete` callback to handle each request as it completes: - -```ruby -hydra = Typhoeus::Hydra.new -10.times do - request = Typhoeus::Request.new("www.example.com", followlocation: true) - request.on_complete do |response| - #do_something_with response - end - hydra.queue(request) -end -hydra.run -``` - -### Making Parallel Requests with Faraday + Typhoeus - -```ruby -require 'faraday' - -conn = Faraday.new(:url => 'http://httppage.com') do |builder| - builder.request :url_encoded - builder.response :logger - builder.adapter :typhoeus -end - -conn.in_parallel do - response1 = conn.get('/first') - response2 = conn.get('/second') - - # these will return nil here since the - # requests have not been completed - response1.body - response2.body -end - -# after it has been completed the response information is fully available -# response1.status, etc -response1.body -response2.body -``` - -### Specifying Max Concurrency - -Hydra will also handle how many requests you can make in parallel. Things will get flakey if you try to make too many requests at the same time. The built in limit is 200. When more requests than that are queued up, hydra will save them for later and start the requests as others are finished. You can raise or lower the concurrency limit through the Hydra constructor. - -```ruby -Typhoeus::Hydra.new(max_concurrency: 20) -``` - -### Memoization - -Hydra memoizes requests within a single run call. You have to enable memoization. -This will result in a single request being issued. However, the on_complete handlers of both will be called. - -```ruby -Typhoeus::Config.memoize = true - -hydra = Typhoeus::Hydra.new(max_concurrency: 1) -2.times do - hydra.queue Typhoeus::Request.new("www.example.com") -end -hydra.run -``` - -This will result in two requests. - -```ruby -Typhoeus::Config.memoize = false - -hydra = Typhoeus::Hydra.new(max_concurrency: 1) -2.times do - hydra.queue Typhoeus::Request.new("www.example.com") -end -hydra.run -``` - -### Caching - -Typhoeus includes built in support for caching. In the following example, if there is a cache hit, the cached object is passed to the on_complete handler of the request object. - -```ruby -class Cache - def initialize - @memory = {} - end - - def get(request) - @memory[request] - end - - def set(request, response) - @memory[request] = response - end -end - -Typhoeus::Config.cache = Cache.new - -Typhoeus.get("www.example.com").cached? -#=> false -Typhoeus.get("www.example.com").cached? -#=> true -``` - -For use with [Dalli](https://github.com/mperham/dalli): - -```ruby -dalli = Dalli::Client.new(...) -Typhoeus::Config.cache = Typhoeus::Cache::Dalli.new(dalli) -``` - -For use with Rails: - -```ruby -Typhoeus::Config.cache = Typhoeus::Cache::Rails.new -``` - -For use with [Redis](https://github.com/redis/redis-rb): - -```ruby -redis = Redis.new(...) -Typhoeus::Config.cache = Typhoeus::Cache::Redis.new(redis) -``` - -All three of these adapters take an optional keyword argument `default_ttl`, which sets a default -TTL on cached responses (in seconds), for requests which do not have a cache TTL set. - -You may also selectively choose not to cache by setting `cache` to `false` on a request or to use -a different adapter. - -```ruby -cache = Cache.new -Typhoeus.get("www.example.com", cache: cache) -``` - -### Direct Stubbing - -Hydra allows you to stub out specific urls and patterns to avoid hitting -remote servers while testing. - -```ruby -response = Typhoeus::Response.new(code: 200, body: "{'name' : 'paul'}") -Typhoeus.stub('www.example.com').and_return(response) - -Typhoeus.get("www.example.com") == response -#=> true -``` - -The queued request will hit the stub. You can also specify a regex to match urls. - -```ruby -response = Typhoeus::Response.new(code: 200, body: "{'name' : 'paul'}") -Typhoeus.stub(/example/).and_return(response) - -Typhoeus.get("www.example.com") == response -#=> true -``` - -You may also specify an array for the stub to return sequentially. - -```ruby -Typhoeus.stub('www.example.com').and_return([response1, response2]) - -Typhoeus.get('www.example.com') == response1 #=> true -Typhoeus.get('www.example.com') == response2 #=> true -``` - -When testing make sure to clear your expectations or the stubs will persist between tests. The following can be included in your spec_helper.rb file to do this automatically. - -```ruby -RSpec.configure do |config| - config.before :each do - Typhoeus::Expectation.clear - end -end -``` - -### Timeouts - -No exceptions are raised on HTTP timeouts. You can check whether a request timed out with the following method: - -```ruby -Typhoeus.get("www.example.com", timeout: 1).timed_out? -``` - -Timed out responses also have their success? method return false. - -There are two different timeouts available: [`timeout`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTTIMEOUT) -and [`connecttimeout`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTCONNECTTIMEOUT). -`timeout` is the time limit for the entire request in seconds. -`connecttimeout` is the time limit for just the connection phase, again in seconds. - -There are two additional more fine grained options `timeout_ms` and -`connecttimeout_ms`. These options offer millisecond precision but are not always available (for instance on linux if `nosignal` is not set to true). - -When you pass a floating point `timeout` (or `connecttimeout`) Typhoeus will set `timeout_ms` for you if it has not been defined. The actual timeout values passed to curl will always be rounded up. - -DNS timeouts of less than one second are not supported unless curl is compiled with an asynchronous resolver. - -The default `timeout` is 0 (zero) which means curl never times out during transfer. The default `connecttimeout` is 300 seconds. A `connecttimeout` of 0 will also result in the default `connecttimeout` of 300 seconds. - -### Following Redirections - -Use `followlocation: true`, eg: - -```ruby -Typhoeus.get("www.example.com", followlocation: true) -``` - -### Basic Authentication - -```ruby -Typhoeus::Request.get("www.example.com", userpwd: "user:password") -``` - -### Compression - -```ruby -Typhoeus.get("www.example.com", accept_encoding: "gzip") -``` - -The above has a different behavior than setting the header directly in the header hash, eg: -```ruby -Typhoeus.get("www.example.com", headers: {"Accept-Encoding" => "gzip"}) -``` - -Setting the header hash directly will not include the `--compressed` flag in the libcurl command and therefore libcurl will not decompress the response. If you want the `--compressed` flag to be added automatically, set `:accept_encoding` Typhoeus option. - - -### Cookies - -```ruby -Typhoeus::Request.get("www.example.com", cookiefile: "/path/to/file", cookiejar: "/path/to/file") -``` - -Here, `cookiefile` is a file to read cookies from, and `cookiejar` is a file to write received cookies to. -If you just want cookies enabled, you need to pass the same filename for both options. - -### Other CURL options - -Are available and documented [here](http://rubydoc.info/github/typhoeus/ethon/Ethon/Easy/Options) - -### SSL - -SSL comes built in to libcurl so it’s in Typhoeus as well. If you pass in a -url with "https" it should just work assuming that you have your [cert -bundle](http://curl.haxx.se/docs/caextract.html) in order and the server is -verifiable. You must also have libcurl built with SSL support enabled. You can -check that by doing this: - -``` -curl --version -``` - -Now, even if you have libcurl built with OpenSSL you may still have a messed -up cert bundle or if you’re hitting a non-verifiable SSL server then you’ll -have to disable peer verification to make SSL work. Like this: - -```ruby -Typhoeus.get("https://www.example.com", ssl_verifypeer: false) -``` - -If you are getting "SSL: certificate subject name does not match target host -name" from curl (ex:- you are trying to access to b.c.host.com when the -certificate subject is \*.host.com). You can disable host verification. Like -this: - -```ruby -# host checking enabled -Typhoeus.get("https://www.example.com", ssl_verifyhost: 2) -# host checking disabled -Typhoeus.get("https://www.example.com", ssl_verifyhost: 0) -``` - -### Verbose debug output - -It’s sometimes useful to see verbose output from curl. You can enable it on a per-request basis: - -```ruby -Typhoeus.get("http://example.com", verbose: true) -``` - -or globally: - -```ruby -Typhoeus::Config.verbose = true -``` - -Just remember that libcurl prints it’s debug output to the console (to -STDERR), so you’ll need to run your scripts from the console to see it. - -### Default User Agent Header - -In many cases, all HTTP requests made by an application require the same User-Agent header set. Instead of supplying it on a per-request basis by supplying a custom header, it is possible to override it for all requests using: - - -```ruby -Typhoeus::Config.user_agent = "custom user agent" -``` - -### Running the specs - -Running the specs should be as easy as: - -``` -bundle install -bundle exec rake -``` -## Semantic Versioning - -This project conforms to [semver](http://semver.org/). - -## LICENSE - -(The MIT License) - -Copyright © 2009-2010 [Paul Dix](http://www.pauldix.net/) - -Copyright © 2011-2012 [David Balatero](https://github.com/dbalatero/) - -Copyright © 2012-2016 [Hans Hasselberg](http://github.com/i0rek/) - -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/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/Rakefile b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/Rakefile deleted file mode 100644 index d5693a5..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/Rakefile +++ /dev/null @@ -1,38 +0,0 @@ -require "bundler" -Bundler.setup - -require "rake" -require "rspec/core/rake_task" -$LOAD_PATH.unshift File.expand_path("../lib", __FILE__) -require "typhoeus/version" - -task :gem => :build -task :build do - system "gem build typhoeus.gemspec" -end - -task :install => :build do - system "gem install typhoeus-#{Typhoeus::VERSION}.gem" -end - -task :release => :build do - system "git tag -a v#{Typhoeus::VERSION} -m 'Tagging #{Typhoeus::VERSION}'" - system "git push --tags" - system "gem push typhoeus-#{Typhoeus::VERSION}.gem" -end - -RSpec::Core::RakeTask.new(:spec) do |t| - t.verbose = false - t.ruby_opts = "-W -I./spec -rspec_helper" -end - -desc "Start up the test servers" -task :start do - require_relative 'spec/support/boot' - begin - Boot.start_servers(:rake) - rescue Exception - end -end - -task :default => :spec diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/UPGRADE.md b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/UPGRADE.md deleted file mode 100644 index 28c7f1d..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/UPGRADE.md +++ /dev/null @@ -1,55 +0,0 @@ -# Upgrade guide - -## 0.5 - -### Options - -Fix the option names, because some were renamed. The errors should point you in the right direction: - -```ruby -Typhoeus.get("www.example.com", follow_location: true) -# Ethon::Errors::InvalidOption: The option: follow_location is invalid. -# Please try followlocation instead of follow_location. -# ... [Backtrace] - -Typhoeus.get("www.example.com", followlocation: true).code -#=> 200 -``` - -### Headers - -`Response#headers` returns a hash now and replaces `Response#headers_hash`, use `Response#response_headers` for the raw string: - -```ruby -Typhoeus.get("www.example.com", followlocation: true).headers -#=> { -# "date"=>"Tue, 06 Nov 2012 09:07:27 GMT", -# "server"=>"Apache/2.2.3 (CentOS)", -# "last-modified"=>"Wed, 09 Feb 2011 17:13:15 GMT", -# "vary"=>"Accept-Encoding", -# "connection"=>"close", -# "content-type"=>"text/html; charset=UTF-8" -# } - -Typhoeus.get("www.example.com", followlocation: true).response_headers -#=> "HTTP/1.0 302 Found\r\nLocation: http://www.iana.org/domains/example/ [...]" -``` - -### Params vs body - -Make sure every request sends proper params and body (especially POST/PUT). `:params` becomes url parameter and `:body` request body. Before params for POST was smashed into the body. - -### Configuration - -Create a global configuration in case you want to turn on verbose, memoize or block_connection: - -```ruby -Typhoeus.configure do |config| - config.verbose = true - config.memoize = true -end -``` - -### Docs - -When in doubt, read the [docs](http://rubydoc.info/github/typhoeus/typhoeus/frames/Typhoeus) or the [code](https://www.github.com/typhoeus). diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/perf/profile.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/perf/profile.rb deleted file mode 100644 index 29ec9c2..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/perf/profile.rb +++ /dev/null @@ -1,14 +0,0 @@ -require 'typhoeus' -require 'ruby-prof' - -calls = 50 -base_url = "http://127.0.0.1:3000/" - -RubyProf.start -calls.times do |i| - Typhoeus::Request.get(base_url+i.to_s) -end -result = RubyProf.stop - -printer = RubyProf::FlatPrinter.new(result) -printer.print(STDOUT) diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/perf/vs_nethttp.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/perf/vs_nethttp.rb deleted file mode 100644 index 305f9fe..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/perf/vs_nethttp.rb +++ /dev/null @@ -1,64 +0,0 @@ -require 'typhoeus' -require 'net/http' -require 'open-uri' -require 'benchmark' - -URL = "http://localhost:300" -hydra = Typhoeus::Hydra.new(max_concurrency: 3) - -if defined? require_relative - require_relative '../spec/support/localhost_server.rb' - require_relative '../spec/support/server.rb' -else - require '../spec/support/localhost_server.rb' - require '../spec/support/server.rb' -end -LocalhostServer.new(TESTSERVER.new, 3000) -LocalhostServer.new(TESTSERVER.new, 3001) -LocalhostServer.new(TESTSERVER.new, 3002) - -def url_for(i) - "#{URL}#{i%3}/" -end - -Benchmark.bm do |bm| - - [1000].each do |calls| - puts "[ #{calls} requests ]" - - bm.report("net/http ") do - calls.times do |i| - uri = URI.parse(url_for(i)) - Net::HTTP.get_response(uri) - end - end - - bm.report("open ") do - calls.times do |i| - open(url_for(i)) - end - end - - bm.report("request ") do - calls.times do |i| - Typhoeus::Request.get(url_for(i)) - end - end - - bm.report("hydra ") do - calls.times do |i| - hydra.queue(Typhoeus::Request.new(url_for(i))) - end - hydra.run - end - - bm.report("hydra memoize ") do - Typhoeus::Config.memoize = true - calls.times do |i| - hydra.queue(Typhoeus::Request.new(url_for(i))) - end - hydra.run - Typhoeus::Config.memoize = false - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/rack/typhoeus/middleware/params_decoder/helper_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/rack/typhoeus/middleware/params_decoder/helper_spec.rb deleted file mode 100644 index 3aee759..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/rack/typhoeus/middleware/params_decoder/helper_spec.rb +++ /dev/null @@ -1,156 +0,0 @@ -require 'spec_helper' -require "rack/typhoeus" - -describe "Rack::Typhoeus::Middleware::ParamsDecoder::Helper" do - - let(:klass) do - Class.new do - include Rack::Typhoeus::Middleware::ParamsDecoder::Helper - end.new - end - - describe "#decode" do - let(:decoded) { klass.decode(params) } - let(:params) { { :array => {'0' => :a, '1' => :b } } } - - it "decodes" do - expect(decoded[:array]).to match_array([:a, :b]) - end - - it "doesn't modify" do - expect(decoded).to_not be(params) - end - end - - describe "#decode!" do - let(:decoded) { klass.decode!(params) } - - context "when hash" do - context "when encoded" do - context "when simple" do - let(:params) { { :array => {'0' => :a, '1' => :b } } } - - it "decodes" do - expect(decoded[:array]).to match_array([:a, :b]) - end - - it "modifies" do - expect(decoded).to eq(params) - end - end - - context "when longer and more complex" do - let(:params) do - { - :ids => { - "0" => "407304", - "1" => "407305", - "2" => "407306", - "3" => "407307", - "4" => "407308", - "5" => "407309", - "6" => "407310", - "7" => "407311", - "8" => "407312", - "9" => "407313", - "10" => "327012" - } - } - end - - it "decodes ensuring arrays maintain their original order" do - expect(decoded[:ids]).to eq(["407304", "407305", "407306", "407307", "407308", "407309", "407310", "407311", "407312", "407313", "327012"]) - end - end - - context "when nested" do - let(:params) do - { :array => { '0' => 0, '1' => { '0' => 'sub0', '1' => 'sub1' } } } - end - - it "decodes" do - expect(decoded[:array]).to include(0) - expect(decoded[:array].find{|e| e.is_a?(Array)}).to( - match_array(['sub0', 'sub1']) - ) - end - - it "modifies" do - expect(decoded).to eq(params) - end - end - end - - context "when not encoded" do - let(:params) { {:a => :a} } - - it "doesn't modify" do - expect(decoded).to be(params) - end - end - end - - context "when no hash" do - let(:params) { "a" } - - it "returns self" do - expect(decoded).to be(params) - end - end - end - - describe "#encoded?" do - let(:encoded) { klass.send(:encoded?, params) } - - context "when there is only one key" do - context "and its 0" do - let(:params){ {'0' => 1} } - it 'returns true' do - expect(encoded).to be_truthy - end - end - context "and its not 0" do - let(:params){ {'some-key' => 1}} - it 'returns false' do - expect(encoded).to be_falsey - end - end - end - - context "when keys are ascending numbers starting with zero" do - let(:params) { Hash[12.times.map {|i| [i, (i+65).chr]}] } - - it "returns true" do - expect(encoded).to be_truthy - end - end - - context "when keys are not ascending numbers starting with zero" do - let(:params) { {:a => 1} } - - it "returns false" do - expect(encoded).to be_falsey - end - end - end - - describe "#convert" do - let(:converted) { klass.send(:convert, params) } - - context "when encoded" do - let(:params) { {'0' => :a, '1' => :b} } - - it "returns values" do - expect(converted).to match_array([:a, :b]) - end - end - - context "when not encoded" do - let(:params) { {:a => :a} } - - it "returns unmodified" do - expect(converted).to be(params) - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/rack/typhoeus/middleware/params_decoder_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/rack/typhoeus/middleware/params_decoder_spec.rb deleted file mode 100644 index 187da9f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/rack/typhoeus/middleware/params_decoder_spec.rb +++ /dev/null @@ -1,31 +0,0 @@ -require 'spec_helper' - -describe "Rack::Typhoeus::Middleware::ParamsDecoder" do - - before(:all) do - require "rack/typhoeus" - end - - let(:app) do - double - end - - let(:env) do - double - end - - let(:klass) do - Rack::Typhoeus::Middleware::ParamsDecoder - end - - describe "#call" do - end - - context "when requesting" do - let(:response) { Typhoeus.get("localhost:3001", :params => {:x => [:a]}) } - - it "transforms parameters" do - expect(response.body).to include("query_hash\":{\"x\":[\"a\"]}") - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/spec_helper.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/spec_helper.rb deleted file mode 100644 index 73302cc..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/spec_helper.rb +++ /dev/null @@ -1,29 +0,0 @@ -$LOAD_PATH.unshift(File.dirname(__FILE__)) -$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) - -require "bundler" -Bundler.setup -require "typhoeus" -require "rspec" - -Dir[File.join(File.dirname(__FILE__), "support/**/*.rb")].each { |f| require f } - -RSpec.configure do |config| - config.order = :rand - - config.before(:suite) do - LocalhostServer.new(TESTSERVER.new, 3001) - end - - config.after do - Typhoeus::Pool.clear - Typhoeus::Expectation.clear - Typhoeus.before.clear - Typhoeus.on_complete.clear - Typhoeus.on_success.clear - Typhoeus.on_failure.clear - Typhoeus::Config.verbose = false - Typhoeus::Config.block_connection = false - Typhoeus::Config.memoize = false - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/support/localhost_server.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/support/localhost_server.rb deleted file mode 100644 index c5a7508..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/support/localhost_server.rb +++ /dev/null @@ -1,94 +0,0 @@ -require 'rack' -require 'rack/handler/webrick' -require 'net/http' - -# The code for this is inspired by Capybara's server: -# http://github.com/jnicklas/capybara/blob/0.3.9/lib/capybara/server.rb -class LocalhostServer - READY_MESSAGE = "Server ready" - - class Identify - def initialize(app) - @app = app - end - - def call(env) - if env["PATH_INFO"] == "/__identify__" - [200, {}, [LocalhostServer::READY_MESSAGE]] - else - @app.call(env) - end - end - end - - attr_reader :port - - def initialize(rack_app, port = nil) - @port = port || find_available_port - @rack_app = rack_app - concurrently { boot } - wait_until(10, "Boot failed.") { booted? } - end - - private - - def find_available_port - server = TCPServer.new('127.0.0.1', 0) - server.addr[1] - ensure - server.close if server - end - - def boot - # Use WEBrick since it's part of the ruby standard library and is available on all ruby interpreters. - options = { :Port => port } - options.merge!(:AccessLog => [], :Logger => WEBrick::BasicLog.new(StringIO.new)) unless ENV['VERBOSE_SERVER'] - Rack::Handler::WEBrick.run(Identify.new(@rack_app), options) - end - - def booted? - res = ::Net::HTTP.get_response("localhost", '/__identify__', port) - if res.is_a?(::Net::HTTPSuccess) or res.is_a?(::Net::HTTPRedirection) - return res.body == READY_MESSAGE - end - rescue Errno::ECONNREFUSED, Errno::EBADF - return false - end - - def concurrently - if should_use_subprocess? - pid = Process.fork do - trap(:INT) { ::Rack::Handler::WEBrick.shutdown } - yield - exit # manually exit; otherwise this sub-process will re-run the specs that haven't run yet. - end - - at_exit do - Process.kill('INT', pid) - begin - Process.wait(pid) - rescue Errno::ECHILD - # ignore this error...I think it means the child process has already exited. - end - end - else - Thread.new { yield } - end - end - - def should_use_subprocess? - # !ENV['THREADED'] - false - end - - def wait_until(timeout, error_message, &block) - start_time = Time.now - - while true - return if yield - raise TimeoutError.new(error_message) if (Time.now - start_time) > timeout - sleep(0.05) - end - end -end - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/support/memory_cache.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/support/memory_cache.rb deleted file mode 100644 index 15cc56b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/support/memory_cache.rb +++ /dev/null @@ -1,15 +0,0 @@ -class MemoryCache - attr_reader :memory - - def initialize - @memory = {} - end - - def get(request) - memory[request] - end - - def set(request, response) - memory[request] = response - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/support/server.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/support/server.rb deleted file mode 100644 index b7f6f06..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/support/server.rb +++ /dev/null @@ -1,116 +0,0 @@ -#!/usr/bin/env ruby -require 'json' -require 'zlib' -require 'sinatra/base' -require 'rack/typhoeus' - -TESTSERVER = Sinatra.new do - set :logging, false - use Rack::Typhoeus::Middleware::ParamsDecoder - - fail_count = 0 - - post '/file' do - { - 'content-type' => params[:file][:type], - 'filename' => params[:file][:filename], - 'content' => params[:file][:tempfile].read, - 'request-content-type' => request.env['CONTENT_TYPE'] - }.to_json - end - - get '/multiple-headers' do - [200, { 'Set-Cookie' => %w[ foo bar ], 'Content-Type' => 'text/plain' }, ['']] - end - - get '/cookies-test' do - [200, { 'Set-Cookie' => %w(foo=bar bar=foo), 'Content-Type' => 'text/plain' }, ['']] - end - - get '/cookies-test2' do - [200, { 'Set-Cookie' => %w(foo2=bar bar2=foo), 'Content-Type' => 'text/plain' }, ['']] - end - - get '/fail/:number' do - if fail_count >= params[:number].to_i - "ok" - else - fail_count += 1 - error 500, "oh noes!" - end - end - - get '/fail_forever' do - error 500, "oh noes!" - end - - get '/redirect' do - redirect '/' - end - - get '/bad_redirect' do - redirect '/bad_redirect' - end - - get '/auth_basic/:username/:password' do - @auth ||= Rack::Auth::Basic::Request.new(request.env) - # Check that we've got a basic auth, and that it's credentials match the ones - # provided in the request - if @auth.provided? && @auth.basic? && @auth.credentials == [ params[:username], params[:password] ] - # auth is valid - confirm it - true - else - # invalid auth - request the authentication - response['WWW-Authenticate'] = %(Basic realm="Testing HTTP Auth") - throw(:halt, [401, "Not authorized\n"]) - end - end - - get '/auth_ntlm' do - # we're just checking for the existence if NTLM auth header here. It's validation - # is too troublesome and really doesn't bother is much, it's up to libcurl to make - # it valid - response['WWW-Authenticate'] = 'NTLM' - is_ntlm_auth = /^NTLM/ =~ request.env['HTTP_AUTHORIZATION'] - true if is_ntlm_auth - throw(:halt, [401, "Not authorized\n"]) if !is_ntlm_auth - end - - get '/gzipped' do - req_env = request.env.to_json - z = Zlib::Deflate.new - gzipped_env = z.deflate(req_env, Zlib::FINISH) - z.close - response['Content-Encoding'] = 'gzip' - gzipped_env - end - - get '/**' do - sleep params["delay"].to_i if params.has_key?("delay") - request.env.merge!(:body => request.body.read).to_json - end - - head '/**' do - sleep params["delay"].to_i if params.has_key?("delay") - end - - put '/**' do - request.env.merge!(:body => request.body.read).to_json - end - - post '/**' do - request.env.merge!(:body => request.body.read).to_json - end - - delete '/**' do - request.env.merge!(:body => request.body.read).to_json - end - - patch '/**' do - request.env.merge!(:body => request.body.read).to_json - end - - options '/**' do - request.env.merge!(:body => request.body.read).to_json - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/adapters/faraday_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/adapters/faraday_spec.rb deleted file mode 100644 index 716fb76..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/adapters/faraday_spec.rb +++ /dev/null @@ -1,339 +0,0 @@ -if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("1.9.0") - require 'spec_helper' - require 'typhoeus/adapters/faraday' - - describe Faraday::Adapter::Typhoeus do - let(:base_url) { "http://localhost:3001" } - let(:adapter) { described_class.new(nil) } - let(:request) { Typhoeus::Request.new(base_url) } - let(:conn) do - Faraday.new(:url => base_url) do |faraday| - faraday.adapter :typhoeus - end - end - let(:response) { conn.get("/") } - - context "when parallel" do - it "returns a faraday response" do - response = nil - conn.in_parallel { response = conn.get("/") } - expect(response).to be_a(Faraday::Response) - end - - it "succeeds" do - response = nil - conn.in_parallel { response = conn.get("/") } - expect(response.status).to be(200) - end - end - - context "when not parallel" do - it "returns a faraday response" do - expect(response).to be_a(Faraday::Response) - end - - it "succeeds" do - expect(response.status).to be(200) - end - end - - context "when a response is stubbed" do - before do - stub = Typhoeus::Response.new \ - :code => 200, - :headers => { "Foo" => "2", "Bar" => "3" }, - :body => "Hello", - :mock => true - - Typhoeus.stub(base_url + '/').and_return(stub) - end - - it 'stubs the status code' do - expect(response.status).to eq(200) - end - - it 'stubs the response body' do - expect(response.body).to eq("Hello") - end - - it 'stubs the headers' do - expect(response.headers).to eq("Foo" => "2", "Bar" => "3") - end - end - - describe "#initialize" do - let(:request) { adapter.method(:typhoeus_request).call({}) } - - context "when typhoeus request options specified" do - let(:adapter) { described_class.new(nil, { :forbid_reuse => true, :maxredirs => 1 }) } - - it "should set option for request" do - expect(request.options[:forbid_reuse]).to be_truthy - expect(request.options[:maxredirs]).to eq(1) - end - end - end - - describe "#perform_request" do - let(:env) { {} } - - context "when body" do - let(:env) { { :body => double(:read => "body") } } - - it "reads body" do - expect(adapter.method(:read_body).call(env)).to eq("body") - end - end - - context "parallel_manager" do - context "when given" do - let(:env) { { :parallel_manager => double(:queue => true), :ssl => {}, :request => {} } } - - it "uses" do - adapter.method(:perform_request).call(env) - end - end - - context "when not given" do - let(:env) { { :method => :get, :ssl => {}, :request => {} } } - - it "falls back to single" do - expect(Typhoeus::Request).to receive(:new).and_return(double(:options => {}, :on_complete => [], :run => true)) - adapter.method(:perform_request).call(env) - end - end - end - end - - describe "#request" do - let(:env) do - { :url => "url", :method => :get, :body => "body", :request_headers => {}, :ssl => {}, :request => {} } - end - - let(:request) { adapter.method(:request).call(env) } - - it "returns request" do - expect(request).to be_a(Typhoeus::Request) - end - - it "sets url" do - expect(request.base_url).to eq("url") - end - - it "sets http method" do - expect(request.original_options[:method]).to eq(:get) - end - - it "sets body" do - expect(request.original_options[:body]).to eq("body") - end - - it "sets headers" do - expect(request.original_options[:headers]).to eq({}) - end - - it "sets on_complete callback" do - expect(request.on_complete.size).to eq(1) - end - end - - context "when the connection failed" do - before do - stub = Typhoeus::Response.new \ - :response_code => 0, - :return_code => 0, - :mock => true - - Typhoeus.stub(base_url + '/').and_return(stub) - end - - context "when parallel" do - it "isn't successful" do - response = nil - conn.in_parallel { response = conn.get("/") } - expect(response.success?).to be_falsey - end - - it "translates the response code into an error message" do - response = nil - conn.in_parallel { response = conn.get("/") } - expect(response.env[:typhoeus_return_message]).to eq("No error") - end - end - - context "when not parallel" do - it "raises an error" do - expect { conn.get("/") }.to raise_error(Faraday::ConnectionFailed, "No error") - end - end - end - - describe "#configure_socket" do - let(:env) { { :request => { :bind => { :host => "interface" } } } } - - before { adapter.method(:configure_socket).call(request, env) } - - context "when host" do - it "sets interface" do - expect(request.options[:interface]).to eq("interface") - end - end - end - - describe "#configure_timeout" do - before { adapter.method(:configure_timeout).call(request, env) } - - context "when timeout" do - let(:env) { { :request => { :timeout => 1 } } } - - it "sets timeout_ms" do - expect(request.options[:timeout_ms]).to eq(1000) - end - end - - context "when open_timeout" do - let(:env) { { :request => { :open_timeout => 1 } } } - - it "sets connecttimeout_ms" do - expect(request.options[:connecttimeout_ms]).to eq(1000) - end - end - end - - describe "#configure_proxy" do - before { adapter.method(:configure_proxy).call(request, env) } - - context "when proxy" do - let(:env) { { :request => { :proxy => { :uri => double(:scheme => 'http', :host => "localhost", :port => "3001") } } } } - - it "sets proxy" do - expect(request.options[:proxy]).to eq("http://localhost:3001") - end - - context "when username and password" do - let(:env) do - { :request => { :proxy => { - :uri => double(:scheme => 'http', :host => :a, :port => :b), - :user => "a", - :password => "b" - } } } - end - - it "sets proxyuserpwd" do - expect(request.options[:proxyuserpwd]).to eq("a:b") - end - end - end - end - - describe "#configure_ssl" do - before { adapter.method(:configure_ssl).call(request, env) } - - context "when version" do - let(:env) { { :ssl => { :version => "a" } } } - - it "sets sslversion" do - expect(request.options[:sslversion]).to eq("a") - end - end - - context "when client_cert" do - let(:env) { { :ssl => { :client_cert => "a" } } } - - it "sets sslcert" do - expect(request.options[:sslcert]).to eq("a") - end - end - - context "when client_key" do - let(:env) { { :ssl => { :client_key => "a" } } } - - it "sets sslkey" do - expect(request.options[:sslkey]).to eq("a") - end - end - - context "when ca_file" do - let(:env) { { :ssl => { :ca_file => "a" } } } - - it "sets cainfo" do - expect(request.options[:cainfo]).to eq("a") - end - end - - context "when ca_path" do - let(:env) { { :ssl => { :ca_path => "a" } } } - - it "sets capath" do - expect(request.options[:capath]).to eq("a") - end - end - - context "when client_cert_passwd" do - let(:env) { { :ssl => { :client_cert_passwd => "a" } } } - - it "sets keypasswd to the value of client_cert_passwd" do - expect(request.options[:keypasswd]).to eq("a") - end - end - - context "when client_certificate_password" do - let(:env) { { :ssl => { :client_certificate_password => "a" } } } - - it "sets keypasswd to the value of client_cert_passwd" do - expect(request.options[:keypasswd]).to eq("a") - end - end - - context "when no client_cert_passwd" do - let(:env) { { :ssl => { } } } - - it "does not set keypasswd on options" do - expect(request.options).not_to have_key :keypasswd - end - end - - context "when verify is false" do - let(:env) { { :ssl => { :verify => false } } } - - it "sets ssl_verifyhost to 0" do - expect(request.options[:ssl_verifyhost]).to eq(0) - end - - it "sets ssl_verifypeer to false" do - expect(request.options[:ssl_verifypeer]).to be_falsey - end - end - - context "when verify is true" do - let(:env) { { :ssl => { :verify => true } } } - - it "sets ssl_verifyhost to 2" do - expect(request.options[:ssl_verifyhost]).to eq(2) - end - - it "sets ssl_verifypeer to true" do - expect(request.options[:ssl_verifypeer]).to be_truthy - end - end - end - - describe "#parallel?" do - context "when parallel_manager" do - let(:env) { { :parallel_manager => true } } - - it "returns true" do - expect(adapter.method(:parallel?).call(env)).to be_truthy - end - end - - context "when no parallel_manager" do - let(:env) { { :parallel_manager => nil } } - - it "returns false" do - expect(adapter.method(:parallel?).call(env)).to be_falsey - end - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/cache/dalli_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/cache/dalli_spec.rb deleted file mode 100644 index 1ea2ce0..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/cache/dalli_spec.rb +++ /dev/null @@ -1,41 +0,0 @@ -if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("1.9.0") - require 'dalli' - require 'typhoeus/cache/dalli' - require 'spec_helper' - - describe Typhoeus::Cache::Dalli do - let(:dalli) { instance_double(Dalli::Client) } - let(:cache) { Typhoeus::Cache::Dalli.new(dalli) } - - let(:base_url) { "localhost:3001" } - let(:request) { Typhoeus::Request.new(base_url, {:method => :get}) } - let(:response) { Typhoeus::Response.new(:response_code => 0, :return_code => 0, :mock => true) } - - describe "#set" do - it "sends the request to Dalli" do - expect(dalli).to receive(:set).with(request.cache_key, response, nil) - - cache.set(request, response) - end - end - - describe "#get" do - it "returns nil when the key is not in the cache" do - expect(dalli).to receive(:get).with(request.cache_key).and_return(nil) - - expect(cache.get(request)).to be_nil - end - - it "returns the cached response when the key is in cache" do - expect(dalli).to receive(:get).with(request.cache_key).and_return(response) - - result = cache.get(request) - expect(result).to_not be_nil - expect(result.response_code).to eq(response.response_code) - expect(result.return_code).to eq(response.return_code) - expect(result.headers).to eq(response.headers) - expect(result.body).to eq(response.body) - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/cache/redis_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/cache/redis_spec.rb deleted file mode 100644 index 9ee5941..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/cache/redis_spec.rb +++ /dev/null @@ -1,41 +0,0 @@ -require 'redis' -require 'typhoeus/cache/redis' -require 'spec_helper' - -describe Typhoeus::Cache::Redis do - let(:redis) { instance_double(Redis) } - let(:cache) { Typhoeus::Cache::Redis.new(redis) } - - let(:base_url) { "localhost:3001" } - let(:request) { Typhoeus::Request.new(base_url, {:method => :get}) } - let(:response) { Typhoeus::Response.new(:response_code => 0, :return_code => 0, :mock => true) } - let(:serialized_response) { Marshal.dump(response) } - - describe "#set" do - it "sends the serialized request to Redis" do - expect(redis).to receive(:set).with(request.cache_key, serialized_response) - expect(redis).to_not receive(:expire).with(request.cache_key, request.cache_ttl) - - cache.set(request, response) - end - end - - describe "#get" do - it "returns nil when the key is not in Redis" do - expect(redis).to receive(:get).with(request.cache_key).and_return(nil) - - expect(cache.get(request)).to be_nil - end - - it "returns the cached response when the key is in Redis" do - expect(redis).to receive(:get).with(request.cache_key).and_return(serialized_response) - - result = cache.get(request) - expect(result).to_not be_nil - expect(result.response_code).to eq(response.response_code) - expect(result.return_code).to eq(response.return_code) - expect(result.headers).to eq(response.headers) - expect(result.body).to eq(response.body) - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/config_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/config_spec.rb deleted file mode 100644 index ac721c5..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/config_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require 'spec_helper' - -describe Typhoeus::Config do - let(:config) { Typhoeus::Config } - - [:block_connection, :memoize, :verbose, :cache, :user_agent, :proxy].each do |name| - it "responds to #{name}" do - expect(config).to respond_to(name) - end - - it "responds to #{name}=" do - expect(config).to respond_to("#{name}=") - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/easy_factory_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/easy_factory_spec.rb deleted file mode 100644 index cc1e9bc..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/easy_factory_spec.rb +++ /dev/null @@ -1,143 +0,0 @@ -require 'spec_helper' - -describe Typhoeus::EasyFactory do - let(:base_url) { "http://localhost:3001" } - let(:hydra) { Typhoeus::Hydra.new(:max_concurrency => 1) } - let(:options) { {} } - let(:request) { Typhoeus::Request.new(base_url, options) } - let(:easy_factory) { described_class.new(request, hydra) } - - describe "#get" do - context "when option[:cache_ttl]" do - let(:options) { {:cache_ttl => 1} } - - it "creates Ethon::Easy" do - expect(easy_factory.get).to be_a(Ethon::Easy) - end - end - - context "timeouts" do - it "sets nosignal to true by default" do - expect(easy_factory.easy).to receive(:http_request).with(anything(), anything(), hash_including(:nosignal => true)) - easy_factory.get - end - - context "when timeout is not a whole number and timeout_ms is not set" do - let(:options) { {:timeout => 0.1} } - it "ceils timeout and sets timeout_ms" do - expect(easy_factory.easy).to receive(:http_request).with(anything(), anything(), hash_including(:timeout_ms => 100, :timeout => 1)) - easy_factory.get - end - end - - context "when timeout is not a whole number and timeout_ms is set" do - let(:options) { {:timeout => 0.1, :timeout_ms => 123} } - it "ceils timeout and does not change timeout_ms" do - expect(easy_factory.easy).to receive(:http_request).with(anything(), anything(), hash_including(:timeout_ms => 123, :timeout => 1)) - easy_factory.get - end - end - - context "when connecttimeout is not a whole number and connecttimeout_ms is not set" do - let(:options) { {:connecttimeout => 0.1} } - it "ceils connecttimeout and sets connecttimeout_ms" do - expect(easy_factory.easy).to receive(:http_request).with(anything(), anything(), hash_including(:connecttimeout_ms => 100, :connecttimeout => 1)) - easy_factory.get - end - end - - context "when connecttimeout is not a whole number and connecttimeout_ms is set" do - let(:options) { {:connecttimeout => 0.1, :connecttimeout_ms => 123} } - it "ceils connecttimeout and does not change connecttimeout_ms" do - expect(easy_factory.easy).to receive(:http_request).with(anything(), anything(), hash_including(:connecttimeout_ms => 123, :connecttimeout => 1)) - easy_factory.get - end - end - - - end - - context "when invalid option" do - let(:options) { {:invalid => 1} } - - it "reraises" do - expect{ easy_factory.get }.to raise_error(Ethon::Errors::InvalidOption) - end - end - - context "when removed option" do - let(:options) { {:cache_timeout => 1} } - - it "reraises with help" do - expect{ easy_factory.get }.to raise_error( - Ethon::Errors::InvalidOption, /The option cache_timeout was removed/ - ) - end - end - - context "when changed option" do - let(:options) { {:proxy_auth_method => 1} } - - it "reraises with help" do - expect{ easy_factory.get }.to raise_error( - Ethon::Errors::InvalidOption, /Please try proxyauth instead of proxy_auth_method/ - ) - end - end - - context "when renamed option" do - let(:options) { {:connect_timeout => 1} } - - it "warns" do - expect(easy_factory).to receive(:warn).with( - "Deprecated option connect_timeout. Please use connecttimeout instead." - ) - easy_factory.get - end - - it "passes correct option" do - expect(easy_factory).to receive(:warn) - expect(easy_factory.easy).to receive(:connecttimeout=).with(1) - easy_factory.get - end - end - end - - describe "#set_callback" do - it "sets easy.on_progress callback when an on_progress callback is provided" do - request.on_progress { 1 } - expect(easy_factory.easy).to receive(:on_progress) - easy_factory.send(:set_callback) - end - - it "sets easy.on_complete callback" do - expect(easy_factory.easy).to receive(:on_complete) - easy_factory.send(:set_callback) - end - - it "finishes request" do - easy_factory.send(:set_callback) - expect(request).to receive(:finish) - easy_factory.easy.complete - end - - it "resets easy" do - easy_factory.send(:set_callback) - expect(easy_factory.easy).to receive(:reset) - easy_factory.easy.complete - end - - it "pushes easy back into the pool" do - easy_factory.send(:set_callback) - easy_factory.easy.complete - expect(Typhoeus::Pool.send(:easies)).to include(easy_factory.easy) - end - - it "adds next request" do - easy_factory.hydra.instance_variable_set(:@queued_requests, [request]) - expect(easy_factory.hydra).to receive(:add).with(request) - easy_factory.send(:set_callback) - easy_factory.easy.complete - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/errors/no_stub_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/errors/no_stub_spec.rb deleted file mode 100644 index 5815cea..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/errors/no_stub_spec.rb +++ /dev/null @@ -1,13 +0,0 @@ -require 'spec_helper' - -describe Typhoeus::Errors::NoStub do - let(:base_url) { "localhost:3001" } - let(:request) { Typhoeus::Request.new(base_url) } - let(:message) { "The connection is blocked and no stub defined: " } - - subject { Typhoeus::Errors::NoStub } - - it "displays the request url" do - expect { raise subject.new(request) }.to raise_error(subject, message + base_url) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/expectation_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/expectation_spec.rb deleted file mode 100644 index 9dfb2b0..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/expectation_spec.rb +++ /dev/null @@ -1,280 +0,0 @@ -require 'spec_helper' - -describe Typhoeus::Expectation do - let(:options) { {} } - let(:base_url) { "www.example.com" } - let(:expectation) { described_class.new(base_url, options) } - - describe ".new" do - it "sets base_url" do - expect(expectation.instance_variable_get(:@base_url)).to eq(base_url) - end - - it "sets options" do - expect(expectation.instance_variable_get(:@options)).to eq(options) - end - - it "initializes response_counter" do - expect(expectation.instance_variable_get(:@response_counter)).to eq(0) - end - end - - describe ".all" do - context "when @expectations nil" do - it "returns empty array" do - expect(Typhoeus::Expectation.all).to eq([]) - end - end - - context "when @expectations not nil" do - let(:expectations) { [1] } - - it "returns @expectations" do - Typhoeus::Expectation.instance_variable_set(:@expectations, expectations) - expect(Typhoeus::Expectation.all).to be(expectations) - end - end - end - - describe ".clear" do - let(:expectations) { double(:clear) } - - it "clears all" do - expect(expectations).to receive(:clear) - Typhoeus::Expectation.instance_variable_set(:@expectations, expectations) - Typhoeus::Expectation.clear - Typhoeus::Expectation.instance_variable_set(:@expectations, nil) - end - end - - describe ".response_for" do - let(:request) { Typhoeus::Request.new("") } - let(:stubbed_response) { Typhoeus::Response.new } - - it "finds a matching expectation and returns its next response" do - Typhoeus::Expectation.all << expectation - expect(expectation).to receive(:matches?).with(request).and_return(true) - expect(expectation).to receive(:response).with(request).and_return(stubbed_response) - - response = Typhoeus::Expectation.response_for(request) - - expect(response).to be(stubbed_response) - end - - it "returns nil if no matching expectation is found" do - response = Typhoeus::Expectation.response_for(request) - expect(response).to be(nil) - end - end - - describe "#stubbed_from" do - it "sets value" do - expectation.stubbed_from(:webmock) - expect(expectation.from).to eq(:webmock) - end - - it "returns self" do - expect(expectation.stubbed_from(:webmock)).to be(expectation) - end - end - - describe "#and_return" do - context "when value" do - it "adds to responses" do - expectation.and_return(1) - expect(expectation.responses).to eq([1]) - end - end - - context "when array" do - it "adds to responses" do - expectation.and_return([1, 2]) - expect(expectation.responses).to eq([1, 2]) - end - end - - context "when block" do - it "adds to responses" do - block = Proc.new {} - expectation.and_return(&block) - expect(expectation.responses).to eq([block]) - end - end - end - - describe "#responses" do - it "returns responses" do - expect(expectation.responses).to be_a(Array) - end - end - - describe "#response" do - let(:request) { Typhoeus::Request.new("") } - - before { expectation.instance_variable_set(:@responses, responses) } - - context "when one response" do - context "is pre-constructed" do - let(:responses) { [Typhoeus::Response.new] } - - it "returns response" do - expect(expectation.response(request)).to be(responses[0]) - end - end - - context "is lazily-constructed" do - def construct_response(request) - @request_from_response_construction = request - lazily_constructed_response - end - - let(:lazily_constructed_response) { Typhoeus::Response.new } - let(:responses) { [ Proc.new { |request| construct_response(request) } ] } - - it "returns response" do - expect(expectation.response(request)).to be(lazily_constructed_response) - expect(@request_from_response_construction).to be(request) - end - end - end - - context "when multiple responses" do - let(:responses) { [Typhoeus::Response.new, Typhoeus::Response.new, Typhoeus::Response.new] } - - it "returns one by one" do - 3.times do |i| - expect(expectation.response(request)).to be(responses[i]) - end - end - end - end - - describe "#matches?" do - let(:request) { double(:base_url => nil) } - - it "calls url_match?" do - expect(expectation).to receive(:url_match?) - expectation.matches?(request) - end - - it "calls options_match?" do - expect(expectation).to receive(:url_match?).and_return(true) - expect(expectation).to receive(:options_match?) - expectation.matches?(request) - end - end - - describe "#url_match?" do - let(:request_url) { "www.example.com" } - let(:request) { Typhoeus::Request.new(request_url) } - let(:url_match) { expectation.method(:url_match?).call(request.base_url) } - - context "when string" do - context "when match" do - it "returns true" do - expect(url_match).to be_truthy - end - end - - context "when no match" do - let(:base_url) { "no_match" } - - it "returns false" do - expect(url_match).to be_falsey - end - end - end - - context "when regexp" do - context "when match" do - let(:base_url) { /example/ } - - it "returns true" do - expect(url_match).to be_truthy - end - end - - context "when no match" do - let(:base_url) { /nomatch/ } - - it "returns false" do - expect(url_match).to be_falsey - end - - context "with nil request_url" do - let(:request_url) { nil } - - it "returns false" do - expect(url_match).to be_falsey - end - end - end - end - - context "when nil" do - let(:base_url) { nil } - - it "returns true" do - expect(url_match).to be_truthy - end - end - - context "when not string, regexp, nil" do - let(:base_url) { 1 } - - it "returns false" do - expect(url_match).to be_falsey - end - end - end - - describe "options_match?" do - let(:request_options) { {} } - let(:request) { Typhoeus::Request.new(nil, request_options) } - let(:options_match) { expectation.method(:options_match?).call(request) } - - context "when match" do - let(:options) { { :a => 1 } } - let(:request_options) { options } - - it "returns true" do - expect(options_match).to be_truthy - end - end - - context "when options are a subset from request_options" do - let(:options) { { :a => 1 } } - let(:request_options) { { :a => 1, :b => 2 } } - - it "returns true" do - expect(options_match).to be_truthy - end - end - - context "when options are nested" do - let(:options) { { :a => { :b => 1 } } } - let(:request_options) { options } - - it "returns true" do - expect(options_match).to be_truthy - end - end - - context "when options contains an array" do - let(:options) { { :a => [1, 2] } } - let(:request_options) { options } - - it "returns true" do - expect(options_match).to be_truthy - end - end - - context "when no match" do - let(:options) { { :a => 1 } } - - it "returns false" do - expect(options_match).to be_falsey - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/addable_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/addable_spec.rb deleted file mode 100644 index 4cb8e1a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/addable_spec.rb +++ /dev/null @@ -1,22 +0,0 @@ -require 'spec_helper' - -describe Typhoeus::Hydra::Addable do - let(:hydra) { Typhoeus::Hydra.new() } - let(:request) { Typhoeus::Request.new("localhost:3001", {:method => :get}) } - - it "asks easy factory for an easy" do - multi = double - expect(Typhoeus::EasyFactory).to receive(:new).with(request, hydra).and_return(double(:get => 1)) - expect(hydra).to receive(:multi).and_return(multi) - expect(multi).to receive(:add).with(1) - hydra.add(request) - end - - it "adds easy to multi" do - multi = double - expect(Typhoeus::EasyFactory).to receive(:new).with(request, hydra).and_return(double(:get => 1)) - expect(hydra).to receive(:multi).and_return(multi) - expect(multi).to receive(:add).with(1) - hydra.add(request) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/before_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/before_spec.rb deleted file mode 100644 index e17e043..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/before_spec.rb +++ /dev/null @@ -1,98 +0,0 @@ -require 'spec_helper' - -describe Typhoeus::Hydra::Before do - let(:request) { Typhoeus::Request.new("") } - let(:hydra) { Typhoeus::Hydra.new } - let(:receive_counter) { double :mark => :twain } - - describe "#add" do - context "when before" do - context "when one" do - it "executes" do - Typhoeus.before { |r| receive_counter.mark } - expect(receive_counter).to receive(:mark) - hydra.add(request) - end - - context "when true" do - it "calls super" do - Typhoeus.before { true } - expect(Typhoeus::Expectation).to receive(:response_for) - hydra.add(request) - end - end - - context "when falsy" do - context "when queue requests" do - let(:queued_request) { Typhoeus::Request.new("") } - - before { hydra.queue(queued_request) } - - it "dequeues" do - Typhoeus.before { false } - hydra.add(request) - expect(hydra.queued_requests).to be_empty - end - end - - context "when false" do - it "doesn't call super" do - Typhoeus.before { false } - expect(Typhoeus::Expectation).to receive(:response_for).never - hydra.add(request) - end - end - - context "when response" do - it "doesn't call super" do - Typhoeus.before { Typhoeus::Response.new } - expect(Typhoeus::Expectation).to receive(:response_for).never - hydra.add(request) - end - end - end - end - - context "when multi" do - context "when all true" do - before { 3.times { Typhoeus.before { |r| receive_counter.mark } } } - - it "calls super" do - expect(Typhoeus::Expectation).to receive(:response_for) - hydra.add(request) - end - - it "executes all" do - expect(receive_counter).to receive(:mark).exactly(3).times - hydra.add(request) - end - end - - context "when middle false" do - before do - Typhoeus.before { |r| receive_counter.mark } - Typhoeus.before { |r| receive_counter.mark; nil } - Typhoeus.before { |r| receive_counter.mark } - end - - it "doesn't call super" do - expect(Typhoeus::Expectation).to receive(:response_for).never - hydra.add(request) - end - - it "executes only two" do - expect(receive_counter).to receive(:mark).exactly(2).times - hydra.add(request) - end - end - end - end - - context "when no before" do - it "calls super" do - expect(Typhoeus::Expectation).to receive(:response_for) - hydra.add(request) - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/block_connection_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/block_connection_spec.rb deleted file mode 100644 index df3e945..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/block_connection_spec.rb +++ /dev/null @@ -1,18 +0,0 @@ -require 'spec_helper' - -describe Typhoeus::Hydra::BlockConnection do - let(:base_url) { "localhost:3001" } - let(:hydra) { Typhoeus::Hydra.new() } - let(:request) { Typhoeus::Request.new(base_url, {:method => :get}) } - - describe "add" do - context "when block_connection activated" do - before { Typhoeus::Config.block_connection = true } - after { Typhoeus::Config.block_connection = false } - - it "raises" do - expect{ hydra.add(request) }.to raise_error(Typhoeus::Errors::NoStub) - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/cacheable_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/cacheable_spec.rb deleted file mode 100644 index 6e2f0ab..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/cacheable_spec.rb +++ /dev/null @@ -1,88 +0,0 @@ -require 'spec_helper' - -describe Typhoeus::Hydra::Cacheable do - let(:base_url) { "localhost:3001" } - let(:hydra) { Typhoeus::Hydra.new() } - let(:request) { Typhoeus::Request.new(base_url, {:method => :get}) } - let(:response) { Typhoeus::Response.new } - let(:cache) { MemoryCache.new } - - describe "add" do - context "when cache activated" do - before { Typhoeus::Config.cache = cache } - after { Typhoeus::Config.cache = false } - - context "when request new" do - it "sets no response" do - hydra.add(request) - expect(request.response).to be_nil - end - - it "doesn't call complete" do - expect(request).to receive(:complete).never - hydra.add(request) - end - end - - context "when request in memory" do - before { cache.memory[request] = response } - - it "returns response with cached status" do - hydra.add(request) - expect(response.cached?).to be_truthy - end - - context "when no queued requests" do - it "finishes request" do - expect(request).to receive(:finish).with(response) - hydra.add(request) - expect(response.cached?).to be_truthy - end - end - - context "when queued requests" do - let(:queued_request) { Typhoeus::Request.new(base_url, {:method => :get}) } - - before { cache.memory[queued_request] = response } - - it "finishes both requests" do - hydra.queue(queued_request) - expect(request).to receive(:finish).with(response) - expect(queued_request).to receive(:finish).with(response) - hydra.add(request) - end - end - end - - context "when cache is specified on a request" do - before { Typhoeus::Config.cache = false } - - context "when cache is false" do - let(:non_cached_request) { Typhoeus::Request.new(base_url, {:method => :get, :cache => false}) } - - it "initiates an HTTP call" do - expect(Typhoeus::EasyFactory).to receive(:new).with(non_cached_request, hydra).and_call_original - - hydra.add(non_cached_request) - end - end - - context "when cache is defined" do - let(:cached_request) { Typhoeus::Request.new(base_url, {:method => :get, :cache => cache}) } - - before { cache.memory[cached_request] = response } - - it "uses the cache instead of making a new request" do - expect(Typhoeus::EasyFactory).not_to receive(:new) - - hydra.add(cached_request) - - expect(cached_request.response).to be_cached - expect(cached_request.response).to eq(response) - end - end - end - - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/memoizable_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/memoizable_spec.rb deleted file mode 100644 index c04f299..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/memoizable_spec.rb +++ /dev/null @@ -1,53 +0,0 @@ -require 'spec_helper' - -describe Typhoeus::Hydra::Memoizable do - let(:base_url) { "localhost:3001" } - let(:hydra) { Typhoeus::Hydra.new() } - let(:request) { Typhoeus::Request.new(base_url) } - - describe "add" do - context "when memoization activated" do - before { Typhoeus::Config.memoize = true } - - context "when request new" do - it "sets no response" do - hydra.add(request) - expect(request.response).to be_nil - end - - it "doesn't call complete" do - expect(request).to receive(:complete).never - hydra.add(request) - end - end - - context "when request in memory" do - let(:response) { Typhoeus::Response.new } - before { hydra.memory[request] = response } - - it "finishes request" do - expect(request).to receive(:finish).with(response, true) - hydra.add(request) - end - - context "when queued request" do - let(:queued_request) { Typhoeus::Request.new(base_url) } - - it "dequeues" do - hydra.queue(queued_request) - expect(request).to receive(:finish).with(response, true) - expect(queued_request).to receive(:finish).with(response, true) - hydra.add(request) - end - end - end - end - end - - describe "#run" do - it "clears memory before starting" do - expect(hydra.memory).to receive(:clear) - hydra.run - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/queueable_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/queueable_spec.rb deleted file mode 100644 index d9fc87a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/queueable_spec.rb +++ /dev/null @@ -1,98 +0,0 @@ -require 'spec_helper' - -describe Typhoeus::Hydra::Queueable do - let(:base_url) { "localhost:3001" } - let(:options) { {} } - let(:hydra) { Typhoeus::Hydra.new(options) } - - describe "#queue" do - let(:request) { Typhoeus::Request.new("") } - - it "accepts requests" do - hydra.queue(request) - end - - it "sets hydra on request" do - hydra.queue(request) - expect(request.hydra).to eq(hydra) - end - - it "adds to queued requests" do - hydra.queue(request) - expect(hydra.queued_requests).to include(request) - end - - it "adds to front of queued requests" do - hydra.queue_front(request) - expect(hydra.queued_requests.first).to be(request) - end - end - - describe "#abort" do - before { hydra.queued_requests << 1 } - - it "clears queue" do - hydra.abort - expect(hydra.queued_requests).to be_empty - end - end - - describe "#dequeue_many" do - before do - requests.each { |r| hydra.queue r } - end - - context "when no request queued" do - let(:requests) { [] } - - it "does nothing" do - expect(hydra).to_not receive(:add) - hydra.dequeue_many - end - end - - context "when request queued" do - let(:first) { Typhoeus::Request.new("localhost:3001/first") } - let(:requests) { [first] } - - it "adds request from queue to multi" do - expect(hydra).to receive(:add).with(first) - hydra.dequeue_many - end - end - - context "when three request queued" do - let(:first) { Typhoeus::Request.new("localhost:3001/first") } - let(:second) { Typhoeus::Request.new("localhost:3001/second") } - let(:third) { Typhoeus::Request.new("localhost:3001/third") } - let(:requests) { [first, second, third] } - - it "adds requests from queue to multi" do - expect(hydra).to receive(:add).with(first) - expect(hydra).to receive(:add).with(second) - expect(hydra).to receive(:add).with(third) - hydra.dequeue_many - end - - context "when max_concurrency is two" do - let(:options) { {:max_concurrency => 2} } - it "adds requests from queue to multi" do - expect(hydra).to receive(:add).with(first) - expect(hydra).to receive(:add).with(second) - expect(hydra).to_not receive(:add).with(third) - hydra.dequeue_many - end - end - - context "when max_concurrency is a string" do - let(:options) { {:max_concurrency => "2"} } - it "adds requests from queue to multi" do - expect(hydra).to receive(:add).with(first) - expect(hydra).to receive(:add).with(second) - expect(hydra).to_not receive(:add).with(third) - hydra.dequeue_many - end - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/runnable_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/runnable_spec.rb deleted file mode 100644 index 1e0237e..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/runnable_spec.rb +++ /dev/null @@ -1,137 +0,0 @@ -require 'spec_helper' - -describe Typhoeus::Hydra::Runnable do - let(:base_url) { "localhost:3001" } - let(:options) { {} } - let(:hydra) { Typhoeus::Hydra.new(options) } - let(:receive_counter) { double :mark => :twain } - - describe "#run" do - let(:requests) { [] } - - before do - requests.each { |r| hydra.queue r } - end - - it "runs multi#dequeue_many" do - expect(hydra).to receive(:dequeue_many) - hydra.run - end - - it "runs multi#perform" do - expect(hydra.multi).to receive(:perform) - hydra.run - end - - context "when request queued" do - let(:first) { Typhoeus::Request.new("localhost:3001/first") } - let(:requests) { [first] } - - it "sends" do - hydra.run - expect(first.response).to be - end - end - - context "when three request queued" do - let(:first) { Typhoeus::Request.new("localhost:3001/first") } - let(:second) { Typhoeus::Request.new("localhost:3001/second") } - let(:third) { Typhoeus::Request.new("localhost:3001/third") } - let(:requests) { [first, second, third] } - - it "sends first" do - hydra.run - expect(first.response).to be - end - - it "sends second" do - hydra.run - expect(second.response).to be - end - - it "sends third" do - hydra.run - expect(third.response).to be - end - - it "sends first first" do - first.on_complete do - expect(second.response).to be_nil - expect(third.response).to be_nil - end - end - - it "sends second second" do - first.on_complete do - expect(first.response).to be - expect(third.response).to be_nil - end - end - - it "sends thirds last" do - first.on_complete do - expect(second.response).to be - expect(third.response).to be - end - end - end - - context "when really queued request" do - let(:options) { {:max_concurrency => 1} } - let(:first) { Typhoeus::Request.new("localhost:3001/first") } - let(:second) { Typhoeus::Request.new("localhost:3001/second") } - let(:third) { Typhoeus::Request.new("localhost:3001/third") } - let(:requests) { [first, second, third] } - - it "sends first" do - hydra.run - expect(first.response).to be - end - - it "sends second" do - hydra.run - expect(second.response).to be - end - - it "sends third" do - hydra.run - expect(third.response).to be - end - end - - context "when request queued in callback" do - let(:first) do - Typhoeus::Request.new("localhost:3001/first").tap do |r| - r.on_complete{ hydra.queue(second) } - end - end - let(:second) { Typhoeus::Request.new("localhost:3001/second") } - let(:requests) { [first] } - - before { Typhoeus.on_complete { |r| receive_counter.mark } } - after { Typhoeus.on_complete.clear; Typhoeus.before.clear } - - context "when real request" do - context "when max_concurrency default" do - let(:options) { {} } - - it "calls on_complete callback once for every response" do - expect(receive_counter).to receive(:mark).exactly(2).times - hydra.run - end - end - end - - context "when no real request" do - context "when before hook returns and finishes response" do - before { Typhoeus.before{ |request| request.finish(Typhoeus::Response.new) } } - - it "simulates real multi run and adds and finishes both requests" do - expect(receive_counter).to receive(:mark).exactly(2).times - hydra.run - end - end - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/stubbable_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/stubbable_spec.rb deleted file mode 100644 index 6b64cc0..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/stubbable_spec.rb +++ /dev/null @@ -1,48 +0,0 @@ -require 'spec_helper' - -describe Typhoeus::Hydra::Stubbable do - let(:base_url) { "localhost:3001" } - let(:request) { Typhoeus::Request.new(base_url) } - let(:response) { Typhoeus::Response.new } - let(:hydra) { Typhoeus::Hydra.new } - - before { Typhoeus.stub(base_url).and_return(response) } - - describe "#add" do - it "checks expectations" do - hydra.add(request) - end - - context "when expectation found" do - it "calls on_headers callbacks" do - canary = :not_called - request.on_headers do - canary = :called - end - hydra.add(request) - hydra.run - expect(canary).to eq(:called) - end - - it "calls on_body callbacks" do - canary = :not_called - request.on_body do - canary = :called - end - hydra.add(request) - hydra.run - expect(canary).to eq(:called) - end - - it "finishes response" do - expect(request).to receive(:finish) - hydra.add(request) - end - - it "is a mock" do - hydra.add(request) - expect(request.response.mock).to be(true) - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra_spec.rb deleted file mode 100644 index a8a35aa..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra_spec.rb +++ /dev/null @@ -1,22 +0,0 @@ -require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') - -describe Typhoeus::Hydra do - let(:base_url) { "localhost:3001" } - let(:options) { {} } - let(:hydra) { Typhoeus::Hydra.new(options) } - - describe "#new" do - let(:options) { {:pipeling => true} } - - it "passes options to multi" do - expect(Ethon::Multi).to receive(:new).with(options) - hydra - end - end - - describe "#hydra" do - it "returns a hydra" do - expect(Typhoeus::Hydra.hydra).to be_a(Typhoeus::Hydra) - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/pool_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/pool_spec.rb deleted file mode 100644 index b04f433..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/pool_spec.rb +++ /dev/null @@ -1,137 +0,0 @@ -require 'spec_helper' - -describe Typhoeus::Pool do - let(:easy) { Ethon::Easy.new } - after { Typhoeus::Pool.clear } - - describe "#easies" do - it "returns array" do - expect(Typhoeus::Pool.send(:easies)).to be_a(Array) - end - end - - describe "#release" do - it "resets easy" do - expect(easy).to receive(:reset) - Typhoeus::Pool.release(easy) - end - - it "flush cookies to disk" do - expect(easy).to receive(:cookielist=).with('flush') - expect(easy).to receive(:reset) - expect(easy).to receive(:cookielist=).with('all') - Typhoeus::Pool.release(easy) - end - - it "writes cookies to disk" do - tempfile1 = Tempfile.new('cookies') - tempfile2 = Tempfile.new('cookies') - - easy.cookiejar = tempfile1.path - easy.url = "localhost:3001/cookies-test" - easy.perform - - Typhoeus::Pool.release(easy) - - expect(File.zero?(tempfile1.path)).to be(false) - expect(File.read(tempfile1.path)).to match(/\s+foo\s+bar$/) - expect(File.read(tempfile1.path)).to match(/\s+bar\s+foo$/) - - # do it again - and check if tempfile1 wasn't change - easy.cookiejar = tempfile2.path - easy.url = "localhost:3001/cookies-test2" - easy.perform - - Typhoeus::Pool.release(easy) - - # tempfile 1 - expect(File.zero?(tempfile1.path)).to be(false) - expect(File.read(tempfile1.path)).to match(/\s+foo\s+bar$/) - expect(File.read(tempfile1.path)).to match(/\s+bar\s+foo$/) - - # tempfile2 - expect(File.zero?(tempfile2.path)).to be(false) - expect(File.read(tempfile2.path)).to match(/\s+foo2\s+bar$/) - expect(File.read(tempfile2.path)).to match(/\s+bar2\s+foo$/) - end - - it "puts easy back into pool" do - Typhoeus::Pool.release(easy) - expect(Typhoeus::Pool.send(:easies)).to include(easy) - end - - context "when threaded access" do - it "releases correct number of easies" do - (0..9).map do |n| - Thread.new do - Typhoeus::Pool.release(Ethon::Easy.new) - end - end.map(&:join) - expect(Typhoeus::Pool.send(:easies).size).to eq(10) - end - end - end - - describe "#get" do - context "when easy in pool" do - before { Typhoeus::Pool.send(:easies) << easy } - - it "takes" do - expect(Typhoeus::Pool.get).to eq(easy) - end - end - - context "when no easy in pool" do - it "creates" do - expect(Typhoeus::Pool.get).to be_a(Ethon::Easy) - end - - context "when threaded access" do - it "creates correct number of easies" do - queue = Queue.new - (0..9).map do |n| - Thread.new do - queue.enq(Typhoeus::Pool.get) - end - end.map(&:join) - - array = Array.new(queue.size) { queue.pop } - expect(array.uniq.size).to eq(10) - end - end - end - - context "when forked" do - before do - allow(Process).to receive(:pid).and_return(1) - Typhoeus::Pool.send(:easies) << easy - allow(Process).to receive(:pid).and_return(2) - end - - after do - allow(Process).to receive(:pid).and_call_original - Typhoeus::Pool.instance_variable_set(:@pid, Process.pid) - end - - it "creates" do - expect(Typhoeus::Pool.get).to_not eq(easy) - end - end - end - - describe "#with" do - it "is re-entrant" do - array = [] - Typhoeus::Pool.with_easy do |e1| - array << e1 - Typhoeus::Pool.with_easy do |e2| - array << e2 - Typhoeus::Pool.with_easy do |e3| - array << e3 - end - end - end - expect(array.uniq.size).to eq(3) - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request/actions_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request/actions_spec.rb deleted file mode 100644 index 03493e1..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request/actions_spec.rb +++ /dev/null @@ -1,19 +0,0 @@ -require 'spec_helper' - -describe Typhoeus::Request::Actions do - [:get, :post, :put, :delete, :head, :patch, :options].each do |name| - describe ".#{name}" do - let(:response) { Typhoeus::Request.method(name).call("http://localhost:3001") } - - it "returns ok" do - expect(response.return_code).to eq(:ok) - end - - unless name == :head - it "makes #{name.to_s.upcase} Request" do - expect(response.response_body).to include("\"REQUEST_METHOD\":\"#{name.to_s.upcase}\"") - end - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request/before_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request/before_spec.rb deleted file mode 100644 index ed39b0c..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request/before_spec.rb +++ /dev/null @@ -1,93 +0,0 @@ -require 'spec_helper' - -describe Typhoeus::Request::Before do - let(:request) { Typhoeus::Request.new("") } - let(:receive_counter) { double :mark => :twain } - - describe "#queue" do - context "when before" do - context "when one" do - it "executes" do - Typhoeus.before { |r| receive_counter.mark } - expect(receive_counter).to receive(:mark) - request.run - end - - context "when true" do - it "calls super" do - Typhoeus.before { true } - expect(Typhoeus::Expectation).to receive(:response_for) - request.run - end - end - - context "when false" do - it "doesn't call super" do - Typhoeus.before { false } - expect(Typhoeus::Expectation).to receive(:response_for).never - request.run - end - - it "returns response" do - Typhoeus.before { |r| r.response = 1; false } - expect(request.run).to be(1) - end - end - - context "when a response" do - it "doesn't call super" do - Typhoeus.before { Typhoeus::Response.new } - expect(Typhoeus::Expectation).to receive(:response_for).never - request.run - end - - it "returns response" do - Typhoeus.before { |r| r.response = Typhoeus::Response.new } - expect(request.run).to be_a(Typhoeus::Response) - end - end - end - - context "when multi" do - context "when all true" do - before { 3.times { Typhoeus.before { |r| receive_counter.mark } } } - - it "calls super" do - expect(Typhoeus::Expectation).to receive(:response_for) - request.run - end - - it "executes all" do - expect(receive_counter).to receive(:mark).exactly(3) - request.run - end - end - - context "when middle false" do - before do - Typhoeus.before { |r| receive_counter.mark } - Typhoeus.before { |r| receive_counter.mark; nil } - Typhoeus.before { |r| receive_counter.mark } - end - - it "doesn't call super" do - expect(Typhoeus::Expectation).to receive(:response_for).never - request.run - end - - it "executes only two" do - expect(receive_counter).to receive(:mark).exactly(2).times - request.run - end - end - end - end - - context "when no before" do - it "calls super" do - expect(Typhoeus::Expectation).to receive(:response_for) - request.run - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request/block_connection_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request/block_connection_spec.rb deleted file mode 100644 index 2ddacdc..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request/block_connection_spec.rb +++ /dev/null @@ -1,75 +0,0 @@ -require 'spec_helper' - -describe Typhoeus::Request::BlockConnection do - let(:base_url) { "localhost:3001" } - let(:request) { Typhoeus::Request.new(base_url, {:method => :get}) } - - describe "run" do - context "when blocked" do - before { request.block_connection = true } - - it "raises" do - expect{ request.run }.to raise_error(Typhoeus::Errors::NoStub) - end - end - - context "when not blocked" do - before { request.block_connection = false } - - it "doesn't raise" do - expect{ request.run }.to_not raise_error - end - end - end - - describe "#blocked?" do - context "when local block_connection" do - context "when true" do - before { request.block_connection = true } - - it "returns true" do - expect(request.blocked?).to be_truthy - end - end - - context "when false" do - before { request.block_connection = false } - - it "returns false" do - expect(request.blocked?).to be_falsey - end - end - end - - context "when global block_connection" do - context "when true" do - before { Typhoeus::Config.block_connection = true } - after { Typhoeus::Config.block_connection = false } - - it "returns true" do - expect(request.blocked?).to be_truthy - end - end - - context "when false" do - before { Typhoeus::Config.block_connection = false } - - it "returns false" do - expect(request.blocked?).to be_falsey - end - end - end - - context "when global and local block_connection" do - before do - Typhoeus::Config.block_connection = true - request.block_connection = false - end - after { Typhoeus::Config.block_connection = false } - - it "takes local" do - expect(request.blocked?).to be_falsey - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request/cacheable_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request/cacheable_spec.rb deleted file mode 100644 index bffa3e4..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request/cacheable_spec.rb +++ /dev/null @@ -1,94 +0,0 @@ -require 'spec_helper' - -describe Typhoeus::Request::Cacheable do - let(:cache) { MemoryCache.new } - let(:options) { {} } - let(:request) { Typhoeus::Request.new("http://localhost:3001", options) } - let(:response) { Typhoeus::Response.new } - - before { Typhoeus::Config.cache = cache } - after { Typhoeus::Config.cache = false } - - describe "#response=" do - context "when cache activated" do - context "when request new" do - it "caches response" do - request.response = response - expect(cache.memory[request]).to be - end - - it "doesn't set cached on response" do - request.response = response - expect(request.response.cached?).to be_falsey - end - end - - context "when request in memory" do - before { cache.memory[request] = response } - - it "finishes request" do - expect(request).to receive(:finish).with(response) - request.run - end - - it "sets cached to true for response" do - request.run - expect(request.response.cached?).to be_truthy - end - end - end - end - - describe "#run" do - context "when cache activated" do - context "when request new" do - it "fetches response" do - expect(request.response).to_not be(response) - end - end - - context "when request in memory" do - before { cache.memory[request] = response } - - it "finishes request" do - expect(request).to receive(:finish).with(response) - request.run - end - end - - context "when cache is specified on a request" do - before { Typhoeus::Config.cache = false } - - context "when cache is false" do - let(:options) { { :cache => false } } - - it "finishes request" do - expect(request.response).to_not be(response) - request.run - end - end - - context "when cache is defined" do - let(:options) { { :cache => cache } } - - before { cache.memory[request] = response } - - it "finishes request" do - expect(request).to receive(:finish).with(response) - request.run - end - end - end - end - end - - describe "#cache_ttl" do - context "when option[:cache_ttl]" do - let(:options) { {:cache_ttl => 1} } - - it "returns" do - expect(request.cache_ttl).to be(1) - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request/callbacks_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request/callbacks_spec.rb deleted file mode 100644 index 9b30e74..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request/callbacks_spec.rb +++ /dev/null @@ -1,91 +0,0 @@ -require 'spec_helper' - -describe Typhoeus::Request::Callbacks do - let(:request) { Typhoeus::Request.new("fubar") } - - [:on_complete, :on_success, :on_failure, :on_progress].each do |callback| - describe "##{callback}" do - it "responds" do - expect(request).to respond_to(callback) - end - - context "when no block given" do - it "returns @#{callback}" do - expect(request.method(callback).call).to eq([]) - end - end - - context "when block given" do - it "stores" do - request.method(callback).call { p 1 } - expect(request.instance_variable_get("@#{callback}").size).to eq(1) - end - end - - context "when multiple blocks given" do - it "stores" do - request.method(callback).call { p 1 } - request.method(callback).call { p 2 } - expect(request.instance_variable_get("@#{callback}").size).to eq(2) - end - end - end - end - - describe "#execute_callbacks" do - [:on_complete, :on_success, :on_failure, :on_progress].each do |callback| - context "when #{callback}" do - context "when local callback" do - before do - code = if callback == :on_failure - 500 - else - 200 - end - request.response = Typhoeus::Response.new(:mock => true, :response_code => code) - request.method(callback).call {|r| expect(r).to be_a(Typhoeus::Response) } - end - - it "executes blocks and passes response" do - request.execute_callbacks - end - - it "sets handled_response" do - request.method(callback).call { 1 } - request.execute_callbacks - expect(request.response.handled_response).to be(1) - end - end - - context "when global callback" do - before do - request.response = Typhoeus::Response.new - Typhoeus.method(callback).call {|r| expect(r).to be_a(Typhoeus::Response) } - end - - it "executes blocks and passes response" do - request.execute_callbacks - end - end - - context "when global and local callbacks" do - before do - request.response = Typhoeus::Response.new - Typhoeus.method(callback).call {|r| r.instance_variable_set(:@fu, 1) } - request.method(callback).call {|r| expect(r.instance_variable_get(:@fu)).to eq(1) } - end - - it "runs global first" do - request.execute_callbacks - end - end - end - end - - context "when local on_complete and gobal on_success" do - it "runs all global callbacks first" do - skip - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request/marshal_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request/marshal_spec.rb deleted file mode 100644 index 6ab922a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request/marshal_spec.rb +++ /dev/null @@ -1,60 +0,0 @@ -require 'spec_helper' - -describe Typhoeus::Request::Marshal do - let(:base_url) { "localhost:3001" } - let(:request) { Typhoeus::Request.new(base_url) } - - describe "#marshal_dump" do - %w(on_complete on_success on_failure on_progress).each do |name| - context "when #{name} handler" do - before { request.instance_variable_set("@#{name}", Proc.new{}) } - - it "doesn't include @#{name}" do - expect(request.send(:marshal_dump).map(&:first)).to_not include("@#{name}") - end - - it "doesn't raise when dumped" do - expect { Marshal.dump(request) }.to_not raise_error - end - - context "when loading" do - let(:loaded) { Marshal.load(Marshal.dump(request)) } - - it "includes base_url" do - expect(loaded.base_url).to eq(request.base_url) - end - - it "doesn't include #{name}" do - expect(loaded.instance_variables).to_not include("@#{name}") - end - end - end - end - - context 'when run through hydra' do - let(:options) { {} } - let(:hydra) { Typhoeus::Hydra.new(options) } - - before(:each) do - hydra.queue(request) - hydra.run - end - - it "doesn't include @hydra" do - expect(request.send(:marshal_dump).map(&:first)).to_not include("@hydra") - end - - context 'when loading' do - let(:loaded) { Marshal.load(Marshal.dump(request)) } - - it "includes base_url" do - expect(loaded.base_url).to eq(request.base_url) - end - - it "doesn't include #{name}" do - expect(loaded.instance_variables).to_not include("@hydra") - end - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request/memoizable_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request/memoizable_spec.rb deleted file mode 100644 index 1bb7ebc..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request/memoizable_spec.rb +++ /dev/null @@ -1,34 +0,0 @@ -require 'spec_helper' - -describe Typhoeus::Request::Memoizable do - let(:options) { {} } - let(:request) { Typhoeus::Request.new("fu", options) } - let(:response) { Typhoeus::Response.new } - let(:hydra) { Typhoeus::Hydra.new } - - describe "#response=" do - context "when memoization activated" do - before { Typhoeus::Config.memoize = true } - after { Typhoeus::Config.memoize = false } - - context "when GET request" do - let(:options) { {:method => :get} } - before { request.hydra = hydra } - - it "stores response in memory" do - request.response = response - expect(hydra.memory[request]).to be - end - end - - context "when no GET request" do - let(:options) { {:method => :post} } - - it "doesn't store response in memory" do - request.response = response - expect(hydra.memory[request]).to be_nil - end - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request/operations_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request/operations_spec.rb deleted file mode 100644 index 79f6be0..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request/operations_spec.rb +++ /dev/null @@ -1,101 +0,0 @@ -require 'spec_helper' - -describe Typhoeus::Request::Operations do - let(:base_url) { "localhost:3001" } - let(:options) { {} } - let(:request) { Typhoeus::Request.new(base_url, options) } - - describe "#run" do - let(:easy) { Ethon::Easy.new } - before { expect(Typhoeus::Pool).to receive(:get).and_return(easy) } - - it "grabs an easy" do - request.run - end - - it "generates settings" do - expect(easy).to receive(:http_request) - request.run - end - - it "performs" do - expect(easy).to receive(:perform) - request.run - end - - it "sets response" do - request.run - expect(request.response).to be - end - - it "releases easy" do - expect(Typhoeus::Pool).to receive(:release) - request.run - end - - it "calls on_body" do - on_body_called = false - request.on_body { |body, response| on_body_called = true } - request.run - expect(on_body_called).to be_truthy - expect(request.response.body).to satisfy { |v| v.nil? || v == '' } - end - - it "makes response headers available to on_body" do - headers = nil - request.on_body { |body, response| headers = response.headers } - request.run - expect(headers).to be - expect(headers).to eq(request.response.headers) - end - - it "calls on_headers and on_body" do - headers = nil - request.on_headers { |response| headers = response.headers } - request.on_body { |body, response| expect(headers).not_to be_nil ; expect(response.headers).to eq(headers) } - request.on_complete { |response| expect(response).not_to be_nil ; expect(response.headers).to eq(headers) ; expect(response.body).to be_empty } - request.run - end - - it "calls on_headers and on_complete" do - headers = nil - request.on_headers { |response| headers = response.headers } - request.on_complete { |response| expect(response).not_to be_nil ; expect(response.headers).to eq(headers) ; expect(response.body).not_to be_empty } - request.run - end - - it "calls on_complete" do - callback = double(:call) - expect(callback).to receive(:call) - request.instance_variable_set(:@on_complete, [callback]) - request.run - end - - it "returns a response" do - expect(request.run).to be_a(Typhoeus::Response) - end - end - - describe "#finish" do - let(:response) { Typhoeus::Response.new } - - it "assigns response" do - request.finish(response) - expect(request.response).to be(response) - end - - it "assigns request to response" do - request.finish(response) - expect(request.response.request).to be(request) - end - - it "executes callbacks" do - expect(request).to receive(:execute_callbacks) - request.finish(response) - end - - it "returns response" do - expect(request.finish(response)).to be(response) - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request/responseable_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request/responseable_spec.rb deleted file mode 100644 index 01087bc..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request/responseable_spec.rb +++ /dev/null @@ -1,13 +0,0 @@ -require 'spec_helper' - -describe Typhoeus::Request::Responseable do - let(:request) { Typhoeus::Request.new("base_url", {}) } - let(:response) { Typhoeus::Response.new } - - describe "#response=" do - it "stores response" do - request.response = response - expect(request.response).to eq(response) - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request/stubbable_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request/stubbable_spec.rb deleted file mode 100644 index 4651d5f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request/stubbable_spec.rb +++ /dev/null @@ -1,45 +0,0 @@ -require 'spec_helper' - -describe Typhoeus::Request::Stubbable do - let(:base_url) { "localhost:3001" } - let(:request) { Typhoeus::Request.new(base_url) } - let(:response) { Typhoeus::Response.new } - - before { Typhoeus.stub(base_url).and_return(response) } - - describe "#run" do - it "checks expectations" do - request.run - end - - context "when expectation found" do - it "calls on_headers callbacks" do - canary = :not_called - request.on_headers do - canary = :called - end - request.run - expect(canary).to eq(:called) - end - - it "calls on_body callbacks" do - canary = :not_called - request.on_body do - canary = :called - end - request.run - expect(canary).to eq(:called) - end - - it "finishes request" do - expect(request).to receive(:finish) - request.run - end - - it "sets mock on response" do - request.run - expect(request.response.mock).to be(true) - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request_spec.rb deleted file mode 100644 index cabcb4c..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/request_spec.rb +++ /dev/null @@ -1,232 +0,0 @@ -require 'spec_helper' - -describe Typhoeus::Request do - let(:base_url) { "localhost:3001" } - let(:options) { {:verbose => true, :headers => { 'User-Agent' => "Fubar", 'Expect' => "" }, :maxredirs => 50} } - let(:request) { Typhoeus::Request.new(base_url, options) } - - describe ".url" do - context "when no parameters" do - it "returns base_url" do - expect(request.url).to eq(request.base_url) - end - end - - context "when parameters" do - let(:options) { {:params => {:a => 1}} } - - it "returns full url" do - expect(request.url).to eq("#{request.base_url}?a=1") - end - end - - it "pushes an easy back into the pool" do - easy = double.as_null_object - allow(Typhoeus::Pool).to receive(:get).and_return(easy) - expect(Typhoeus::Pool).to receive(:release).with(easy) - request.url - end - end - - describe ".new" do - it "stores base_url" do - expect(request.base_url).to eq(base_url) - end - - it "stores options" do - expect(request.options).to eq(options) - end - - it "stores original options" do - expect(request.original_options).to eq(options) - expect(request.original_options).to_not be(request.options) - end - - it "sets defaults" do - expect(request.options[:headers]['User-Agent']).to be - end - end - - describe "set_defaults" do - context "when header with user agent" do - let(:options) { {:headers => {'User-Agent' => "Custom"} } } - - it "doesn't modify user agent" do - expect(request.options[:headers]['User-Agent']).to eq("Custom") - end - end - - context "when header without user agent" do - let(:options) { {:headers => {} } } - - it "add user agent" do - agent = request.options[:headers]['User-Agent'] - expect(agent).to eq(Typhoeus::USER_AGENT) - end - end - - context "when Config.user_agent set" do - before { Typhoeus.configure { |config| config.user_agent = "Default" } } - after { Typhoeus.configure { |config| config.user_agent = nil } } - - context "with headers" do - let(:options) { {:headers => { "User-Agent" => "Fubar" } } } - - it "uses the request options' user agent" do - expect(request.options[:headers]["User-Agent"]).to eq("Fubar") - end - end - - context "without headers" do - let(:options) { {:headers => {} } } - - it "uses the global options' user agent" do - expect(request.options[:headers]["User-Agent"]).to eq("Default") - end - end - end - - context "when Config.verbose set" do - before { Typhoeus.configure { |config| config.verbose = true} } - after { Typhoeus.configure { |config| config.verbose = false} } - - it "respects" do - expect(request.options[:verbose]).to be_truthy - end - end - - context "when maxredirs" do - context "when not set" do - it "defaults to 50" do - expect(request.options[:maxredirs]).to be(50) - end - end - - context "when set" do - let(:options) { {:maxredirs => 1} } - - it "respects" do - expect(request.options[:maxredirs]).to be(1) - end - end - end - - context "when Config.proxy set" do - before { Typhoeus.configure { |config| config.proxy = "http://proxy.internal" } } - after { Typhoeus.configure { |config| config.proxy = nil } } - - it "respects" do - expect(request.options[:proxy]).to eq("http://proxy.internal") - end - - context "when option proxy set" do - let(:options) { {:proxy => nil} } - - it "does not override" do - expect(request.options[:proxy]).to be_nil - end - end - end - end - - describe "#eql?" do - context "when another class" do - let(:other) { "" } - - it "returns false" do - expect(request).to_not eql other - end - end - - context "when same class" do - let(:other) { Typhoeus::Request.new("base_url", options) } - - context "when other base_url" do - it "returns false" do - expect(request).to_not eql other - end - end - - context "when same base_url and other options" do - let(:other) { Typhoeus::Request.new(base_url, {}) } - - it "returns false" do - expect(request).to_not eql other - end - end - - - context "when same base_url and options" do - context "when same order" do - let(:other) { Typhoeus::Request.new(base_url, options) } - - it "returns true" do - expect(request).to eql other - end - end - - context "when different order" do - let(:other_options) { - {:headers => { 'User-Agent' => "Fubar", 'Expect' => ""}, :verbose => true } - } - let(:other) { Typhoeus::Request.new(base_url, other_options)} - - it "returns true" do - expect(request).to eql other - end - end - end - end - end - - describe "#hash" do - context "when request.eql?(other)" do - context "when different order" do - let(:other_options) { - {:headers => { 'User-Agent' => "Fubar", 'Expect' => "" }, :verbose => true } - } - let(:other) { Typhoeus::Request.new(base_url, other_options)} - - it "has same hashes" do - expect(request.hash).to eq(other.hash) - end - end - - context "when same order" do - let(:other) { Typhoeus::Request.new(base_url, options) } - - it "has same hashes" do - expect(request.hash).to eq(other.hash) - end - end - - context "when hashes with different orders are contained in arrays" do - let(:request) { Typhoeus::Request.new(base_url, :params => [{:b => 2, :a => 1}]) } - let(:other) { Typhoeus::Request.new(base_url, :params => [{:a => 1, :b => 2}]) } - it "has different hashes" do - expect(request.hash).to eq(other.hash) - end - end - end - - context "when not request.eql?(other)" do - let(:request) { Typhoeus::Request.new(base_url, :params => {:foo => 'bar'}) } - let(:other) { Typhoeus::Request.new(base_url, :params => {:foo => 'baz'}) } - - it "has different hashes" do - expect(request.hash).to_not eq(other.hash) - end - end - end - - describe "#encoded_body" do - let(:request) { - Typhoeus::Request.new("www.example.com",:body => {:a => 1}) - } - - it "returns encoded body" do - expect(request.encoded_body).to eq("a=1") - end - end - -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/response/header_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/response/header_spec.rb deleted file mode 100644 index 922d99e..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/response/header_spec.rb +++ /dev/null @@ -1,147 +0,0 @@ -require 'spec_helper' - -describe Typhoeus::Response::Header do - let(:raw) { nil } - let(:header) { Typhoeus::Response::Header.new(raw) } - - describe ".new" do - context "when string" do - let(:raw) { 'Date: Fri, 29 Jun 2012 10:09:23 GMT' } - - it "sets Date" do - expect(header['Date']).to eq('Fri, 29 Jun 2012 10:09:23 GMT') - end - - it "provides case insensitive access" do - expect(header['DaTe']).to eq('Fri, 29 Jun 2012 10:09:23 GMT') - end - - it "provides symbol access" do - expect(header[:date]).to eq('Fri, 29 Jun 2012 10:09:23 GMT') - end - end - - context "when hash" do - let(:raw) { { 'Date' => 'Fri, 29 Jun 2012 10:09:23 GMT' } } - - it "sets Date" do - expect(header['Date']).to eq(raw['Date']) - end - - it "provides case insensitive access" do - expect(header['DaTe']).to eq(raw['Date']) - end - end - end - - describe "#parse" do - context "when no header" do - it "returns nil" do - expect(header).to be_empty - end - end - - context "when header" do - let(:raw) do - 'HTTP/1.1 200 OK - Set-Cookie: NID=61=LblqYgUOu; expires=Sat, 29-Dec-2012 10:09:23 GMT; path=/; domain=.google.de; HttpOnly - Date: Fri, 29 Jun 2012 10:09:23 GMT - Expires: -1 - Cache-Control: private, max-age=0 - Content-Type: text/html; charset=ISO-8859-1 - Set-Cookie: PREF=ID=77e93yv0hPtejLou; expires=Sun, 29-Jun-2014 10:09:23 GMT; path=/; domain=.google.de - Set-Cookie: NID=61=LblqYgh5Ou; expires=Sat, 29-Dec-2012 10:09:23 GMT; path=/; domain=.google.de; HttpOnly - P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info." - Server: gws - X-XSS-Protection: 1; mode=block - X-Frame-Options: SAMEORIGIN - Transfer-Encoding: chunked'.gsub(/^\s{8}/, '') - end - - it "sets raw" do - expect(header.send(:raw)).to eq(raw) - end - - it "sets Set-Cookie" do - expect(header['set-cookie'].size).to eq(3) - end - - it "provides case insensitive access" do - expect(header['Set-CooKie'].size).to eq(3) - end - - [ - 'NID=61=LblqYgUOu; expires=Sat, 29-Dec-2012 10:09:23 GMT; path=/; domain=.google.de; HttpOnly', - 'PREF=ID=77e93yv0hPtejLou; expires=Sun, 29-Jun-2014 10:09:23 GMT; path=/; domain=.google.de', - 'NID=61=LblqYgh5Ou; expires=Sat, 29-Dec-2012 10:09:23 GMT; path=/; domain=.google.de; HttpOnly' - ].each_with_index do |cookie, i| - it "sets Cookie##{i}" do - expect(header['set-cookie']).to include(cookie) - end - end - - { - 'Date' => 'Fri, 29 Jun 2012 10:09:23 GMT', 'Expires' => '-1', - 'Cache-Control' => 'private, max-age=0', - 'Content-Type' => 'text/html; charset=ISO-8859-1', - 'P3P' => 'CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."', - 'Server' => 'gws', 'X-XSS-Protection' => '1; mode=block', - 'X-Frame-Options' => 'SAMEORIGIN', 'Transfer-Encoding' => 'chunked' - }.each do |name, value| - it "sets #{name}" do - expect(header[name.downcase]).to eq(value) - end - end - - context 'includes a multi-line header' do - let(:raw) do - 'HTTP/1.1 200 OK - Date: Fri, 29 Jun 2012 10:09:23 GMT - Content-Security-Policy: default-src "self"; - img-src * data: "self"; - upgrade-insecure-requests;'.gsub(/^\s{10}/, '') - end - - it "joins header parts" do - expect(header).to eq({ - 'Date' => 'Fri, 29 Jun 2012 10:09:23 GMT', - 'Content-Security-Policy' => 'default-src "self"; img-src * data: "self"; upgrade-insecure-requests;' - }) - end - end - - context 'includes line with only whitespace' do - let(:raw) do - 'HTTP/1.1 200 OK - Date: Fri, 29 Jun 2012 10:09:23 GMT - - '.gsub(/^\s{10}/, '') - end - - it 'ignores it' do - expect(header).to eq({ 'Date' => 'Fri, 29 Jun 2012 10:09:23 GMT' }) - end - end - - context 'with broken headers' do - let(:raw) do - 'HTTP/1.1 200 OK - Date: - Content-Type - '.gsub(/^\s{10}/, '') - end - - it 'returns empty string for invalid headers' do - expect(header.to_hash).to include({ 'Date' => '', 'Content-Type' => '' }) - end - end - end - end - - it "can be Marshal'd" do - header = Typhoeus::Response::Header.new("Foo: Bar") - expect { - Marshal.dump(header) - }.not_to raise_error - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/response/informations_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/response/informations_spec.rb deleted file mode 100644 index 896931a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/response/informations_spec.rb +++ /dev/null @@ -1,283 +0,0 @@ -require 'spec_helper' - -describe Typhoeus::Response::Informations do - let(:options) { {} } - let(:response) { Typhoeus::Response.new(options) } - - describe "#return_code" do - let(:options) { { :return_code => :ok } } - - it "returns return_code from options" do - expect(response.return_code).to be(:ok) - end - end - - describe "#debug_info" do - let(:options) { { :debug_info => Ethon::Easy::DebugInfo.new } } - - it "returns debug_info from options" do - expect(response.debug_info).to be_a(Ethon::Easy::DebugInfo) - end - end - - describe "#return_message" do - let(:options) { { :return_code => :couldnt_connect } } - - it "returns a message" do - expect(response.return_message).to eq("Couldn't connect to server") - end - - describe "with nil return_code" do - let(:options) { { :return_code => nil } } - - it "returns nil" do - expect(response.return_message).to be_nil - end - end - end - - describe "#response_body" do - context "when response_body" do - let(:options) { { :response_body => "body" } } - - it "returns response_body from options" do - expect(response.response_body).to eq("body") - end - end - - context "when body" do - let(:options) { { :body => "body" } } - - it "returns body from options" do - expect(response.body).to eq("body") - end - end - end - - describe "#response_headers" do - let(:options) { { :response_headers => "Length: 1" } } - - context "when no mock" do - it "returns response_headers from options" do - expect(response.response_headers).to eq("Length: 1") - end - end - - context "when mock" do - context "when no response_headers" do - context "when headers" do - let(:options) { { :mock => true, :headers => {"Length" => 1, "Content-Type" => "text/plain" } } } - - it "constructs response_headers" do - expect(response.response_headers).to include("Length: 1") - expect(response.response_headers).to include("Content-Type: text/plain") - expect(response.response_headers).to include("\r\n") - end - end - - context "when multiple values for a header" do - let(:options) { { :mock => true, :headers => {"Length" => 1, "Content-Type" => "text/plain", "set-cookie" => ["cookieone=one","cookietwo=two"] } } } - - it "constructs response_headers" do - expect(response.response_headers).to include("Length: 1") - expect(response.response_headers).to include("Content-Type: text/plain") - expect(response.response_headers).to include("set-cookie: cookieone=one,cookietwo=two") - expect(response.response_headers).to include("\r\n") - end - end - end - end - end - - describe "#response_code" do - context "when response_code" do - let(:options) { { :response_code => "200" } } - - it "returns response_code from options" do - expect(response.response_code).to eq(200) - end - end - - context "when code" do - let(:options) { { :code => "200" } } - - it "returns code from options" do - expect(response.code).to eq(200) - end - end - end - - describe "#httpauth_avail" do - let(:options) { { :httpauth_avail => "code" } } - - it "returns httpauth_avail from options" do - expect(response.httpauth_avail).to eq("code") - end - end - - describe "#total_time" do - let(:options) { { :total_time => 1 } } - - it "returns total_time from options" do - expect(response.total_time).to eq(1) - end - end - - describe "#starttransfer_time" do - let(:options) { { :starttransfer_time => 1 } } - - it "returns starttransfer_time from options" do - expect(response.starttransfer_time).to eq(1) - end - end - - describe "#appconnect_time" do - let(:options) { { :appconnect_time => 1 } } - - it "returns appconnect_time from options" do - expect(response.appconnect_time).to eq(1) - end - end - - describe "#pretransfer_time" do - let(:options) { { :pretransfer_time => 1 } } - - it "returns pretransfer_time from options" do - expect(response.pretransfer_time).to eq(1) - end - end - - describe "#connect_time" do - let(:options) { { :connect_time => 1 } } - - it "returns connect_time from options" do - expect(response.connect_time).to eq(1) - end - end - - describe "#namelookup_time" do - let(:options) { { :namelookup_time => 1 } } - - it "returns namelookup_time from options" do - expect(response.namelookup_time).to eq(1) - end - end - - describe "#redirect_time" do - let(:options) { { :redirect_time => 1 } } - - it "returns redirect_time from options" do - expect(response.redirect_time).to eq(1) - end - end - - describe "#effective_url" do - let(:options) { { :effective_url => "http://www.example.com" } } - - it "returns effective_url from options" do - expect(response.effective_url).to eq("http://www.example.com") - end - end - - describe "#primary_ip" do - let(:options) { { :primary_ip => "127.0.0.1" } } - - it "returns primary_ip from options" do - expect(response.primary_ip).to eq("127.0.0.1") - end - end - - describe "#redirect_count" do - let(:options) { { :redirect_count => 2 } } - - it "returns redirect_count from options" do - expect(response.redirect_count).to eq(2) - end - end - - describe "#request_size" do - let(:options) { { :request_size => 2 } } - - it "returns request_size from options" do - expect(response.request_size).to eq(2) - end - end - - describe "#headers" do - context "when no response_headers" do - it "returns nil" do - expect(response.headers).to be_nil - end - end - - context "when response_headers" do - let(:options) { {:response_headers => "Expire: -1\nServer: gws"} } - - it "returns nonempty headers" do - expect(response.headers).to_not be_empty - end - - it "has Expire" do - expect(response.headers['expire']).to eq('-1') - end - - it "has Server" do - expect(response.headers['server']).to eq('gws') - end - end - - context "when multiple headers" do - let(:options) { {:response_headers => "Server: A\r\n\r\nServer: B"} } - - it "returns the last" do - expect(response.headers['server']).to eq("B") - end - end - - context "when mock" do - context "when headers" do - let(:options) { {:mock => true, :headers => {"Length" => "1"}} } - - it "returns Typhoeus::Response::Header" do - expect(response.headers).to be_a(Typhoeus::Response::Header) - end - - it "returns headers" do - expect(response.headers.to_hash).to include("Length" => "1") - end - end - end - - context "when requesting" do - let(:response) { Typhoeus.get("localhost:3001") } - - it "returns headers" do - expect(response.headers).to_not be_empty - end - end - end - - describe "#redirections" do - context "when no response_headers" do - it "returns empty array" do - expect(response.redirections).to be_empty - end - end - - context "when headers" do - let(:options) { {:response_headers => "Expire: -1\nServer: gws"} } - - it "returns empty array" do - expect(response.redirections).to be_empty - end - end - - context "when multiple headers" do - let(:options) { {:response_headers => "Server: A\r\n\r\nServer: B"} } - - it "returns response from all but last headers" do - expect(response.redirections.size).to eq(1) - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/response/status_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/response/status_spec.rb deleted file mode 100644 index 64ba1e0..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/response/status_spec.rb +++ /dev/null @@ -1,256 +0,0 @@ -require 'spec_helper' - -describe Typhoeus::Response::Status do - let(:response) { Typhoeus::Response.new(options) } - let(:options) { {} } - - describe "timed_out?" do - context "when return code is operation_timedout" do - let(:options) { {:return_code => :operation_timedout} } - - it "return true" do - expect(response).to be_timed_out - end - end - end - - describe "#status_message" do - context "when no header" do - it "returns nil" do - expect(response.status_message).to be_nil - end - end - - context "when header" do - context "when no message" do - let(:options) { {:response_headers => "HTTP/1.1 200\r\n"} } - - it "returns nil" do - expect(response.status_message).to be_nil - end - end - - context "when messsage" do - let(:options) { {:response_headers => "HTTP/1.1 200 message\r\n"} } - - it "returns message" do - expect(response.status_message).to eq("message") - end - end - end - end - - describe "#http_version" do - context "when no header" do - it "returns nil" do - expect(response.http_version).to be_nil - end - end - - context "when header" do - context "when no http version" do - let(:options) { {:response_headers => "HTTP OK"} } - - it "returns nil" do - expect(response.http_version).to be_nil - end - end - - context "when invalid http_version" do - let(:options) { {:response_headers => "HTTP foo/bar OK"} } - - it "returns nil" do - expect(response.http_version).to be_nil - end - end - - context "when valid http_version" do - let(:options) { {:response_headers => "HTTP/1.1 OK"} } - - it "returns http_version" do - expect(response.http_version).to eq("1.1") - end - end - end - end - - describe "#success?" do - context "when response code 200-299" do - let(:options) { {:return_code => return_code, :response_code => 201} } - - context "when mock" do - before { response.mock = true } - - context "when return_code :ok" do - let(:return_code) { :ok } - - it "returns true" do - expect(response.success?).to be_truthy - end - end - - context "when return_code nil" do - let(:return_code) { nil } - - it "returns true" do - expect(response.success?).to be_truthy - end - end - end - - context "when no mock" do - before { response.mock = nil } - - context "when return_code :ok" do - let(:return_code) { :ok } - - it "returns true" do - expect(response.success?).to be_truthy - end - end - - context "when return_code nil" do - let(:return_code) { nil } - - it "returns false" do - expect(response.success?).to be_falsey - end - end - end - end - - context "when response code is not 200-299" do - let(:options) { {:return_code => :ok, :response_code => 500} } - - it "returns false" do - expect(response.success?).to be_falsey - end - end - end - - describe "#failure?" do - context "when response code between 300-526 and 100-300" do - let(:options) { {:return_code => return_code, :response_code => 300} } - - context "when mock" do - before { response.mock = true } - - context "when return_code :internal_server_error" do - let(:return_code) { :internal_server_error } - - it "returns true" do - expect(response.failure?).to be_truthy - end - end - - context "when return_code nil" do - let(:return_code) { nil } - - it "returns true" do - expect(response.failure?).to be_truthy - end - end - end - - context "when no mock" do - before { response.mock = nil } - - context "when return_code :internal_server_error" do - let(:return_code) { :internal_server_error } - - it "returns true" do - expect(response.failure?).to be_truthy - end - end - - context "when return_code nil" do - let(:return_code) { nil } - - it "returns false" do - expect(response.failure?).to be_falsey - end - end - end - end - - context "when response code is not 300-526" do - let(:options) { {:return_code => :ok, :response_code => 200} } - - it "returns false" do - expect(response.failure?).to be_falsey - end - end - end - - describe "#modified?" do - context "when response code 304" do - let(:options) { {:return_code => :ok, :response_code => 304} } - - context "when mock" do - before { response.mock = true } - - context "when return_code :ok" do - let(:return_code) { :ok } - - it "returns false" do - expect(response.modified?).to be_falsey - end - end - - context "when return_code nil" do - let(:return_code) { nil } - - it "returns false" do - expect(response.modified?).to be_falsey - end - end - end - - context "when no mock" do - before { response.mock = nil } - - context "when return_code :ok" do - let(:return_code) { :ok } - - it "returns false" do - expect(response.modified?).to be_falsey - end - end - - context "when return_code nil" do - let(:return_code) { nil } - - it "returns true" do - expect(response.modified?).to be_falsey - end - end - end - end - - context "when response code is not 304" do - let(:options) { {:return_code => :ok, :response_code => 500} } - - it "returns true" do - expect(response.modified?).to be_truthy - end - end - end - - describe "#first_header_line" do - context "when multiple header" do - let(:options) { {:response_headers => "1\r\n\r\n2\r\nbla"} } - - it "returns first line of last block" do - expect(response.method(:first_header_line).call).to eq("2") - end - end - - context "when single header" do - let(:options) { {:response_headers => "1"} } - - it "returns first line" do - expect(response.method(:first_header_line).call).to eq("1") - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/response_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/response_spec.rb deleted file mode 100644 index 02512f4..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus/response_spec.rb +++ /dev/null @@ -1,100 +0,0 @@ -require 'spec_helper' - -describe Typhoeus::Response do - let(:response) { Typhoeus::Response.new(options) } - let(:options) { {} } - - describe ".new" do - context "when options" do - context "when return_code" do - let(:options) { {:return_code => 2} } - - it "stores" do - expect(response.options[:return_code]).to be(2) - end - end - - context "when headers" do - let(:options) { {:headers => {'A' => 'B'}} } - - it "stores unmodified" do - expect(response.options[:headers]).to be(options[:headers]) - end - - it "sets @headers to a Typhoeus::Response::Header" do - expect(response.instance_variable_get(:@headers)).to be_a(Typhoeus::Response::Header) - end - - it "has key" do - expect(response.headers['A']).to eq('B') - end - end - end - end - - describe "#mock" do - context "when @mock" do - before { response.mock = true } - - it "returns @mock" do - expect(response.mock).to be_truthy - end - end - - context "when options[:mock]" do - let(:options) { {:mock => true} } - - it "returns options[:mock]" do - expect(response.mock).to be_truthy - end - end - - context "when @mock and options[:mock]" do - let(:options) { {:mock => 1} } - before { response.mock = 2 } - - it "returns @mock" do - expect(response.mock).to be(2) - end - end - end - - describe "#handled_response" do - let(:handled_response) { Typhoeus::Response.new } - - context "when @handled_response" do - before { response.handled_response = handled_response } - - it "returns @handled_response" do - expect(response.handled_response).to be(handled_response) - end - end - - context "when @handled_response is nil" do - before { response.handled_response = nil } - - it "returns response" do - expect(response.handled_response).to be(response) - end - end - end - - describe "#cached" do - context "when @cached" do - before { response.cached = true } - - it "returns cached status" do - expect(response.cached?).to be_truthy - end - end - - context "when @cached is nil" do - before { response.cached = nil } - - it "returns false" do - expect(response.cached?).to be_falsey - end - end - - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus_spec.rb deleted file mode 100644 index 6432c8d..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/spec/typhoeus_spec.rb +++ /dev/null @@ -1,105 +0,0 @@ -require 'spec_helper' - -describe Typhoeus do - before(:each) do - Typhoeus.configure { |config| config.verbose = false; config.block_connection = false } - end - - describe ".configure" do - it "yields config" do - Typhoeus.configure do |config| - expect(config).to be_a(Typhoeus::Config) - end - end - - it "sets values config" do - Typhoeus::Config.verbose = true - expect(Typhoeus::Config.verbose).to be_truthy - end - end - - describe ".stub" do - let(:base_url) { "www.example.com" } - - shared_examples "lazy response construction" do - it "calls the block to construct a response when a request matches the stub" do - expected_response = Typhoeus::Response.new - Typhoeus.stub(base_url) do |request| - expected_response - end - - response = Typhoeus.get(base_url) - - expect(response).to be(expected_response) - end - end - - context "when no similar expectation exists" do - include_examples "lazy response construction" - - it "returns expectation" do - expect(Typhoeus.stub(base_url)).to be_a(Typhoeus::Expectation) - end - - it "adds expectation" do - Typhoeus.stub(:get, "") - expect(Typhoeus::Expectation.all.size).to eq(1) - end - end - - context "when similar expectation exists" do - include_examples "lazy response construction" - - let(:expectation) { Typhoeus::Expectation.new(base_url) } - before { Typhoeus::Expectation.all << expectation } - - it "returns expectation" do - expect(Typhoeus.stub(base_url)).to be_a(Typhoeus::Expectation) - end - - it "doesn't add expectation" do - Typhoeus.stub(base_url) - expect(Typhoeus::Expectation.all.size).to eq(1) - end - end - end - - describe ".before" do - it "adds callback" do - Typhoeus.before { true } - expect(Typhoeus.before.size).to eq(1) - end - end - - describe ".with_connection" do - it "executes block with block connection is false" do - Typhoeus.with_connection { expect(Typhoeus::Config.block_connection).to be(false) } - end - - it "sets block connection back to previous value" do - Typhoeus::Config.block_connection = true - Typhoeus.with_connection {} - expect(Typhoeus::Config.block_connection).to be(true) - end - - it "returns result of block" do - expect(Typhoeus.with_connection { "123" }).to eq("123") - end - end - - [:get, :post, :put, :delete, :head, :patch, :options].each do |name| - describe ".#{name}" do - let(:response) { Typhoeus::Request.method(name).call("http://localhost:3001") } - - it "returns ok" do - expect(response.return_code).to eq(:ok) - end - - unless name == :head - it "makes #{name.to_s.upcase} requests" do - expect(response.response_body).to include("\"REQUEST_METHOD\":\"#{name.to_s.upcase}\"") - end - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/typhoeus.gemspec b/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/typhoeus.gemspec deleted file mode 100644 index 39bcc7a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/typhoeus-1.4.0/typhoeus.gemspec +++ /dev/null @@ -1,25 +0,0 @@ -# encoding: utf-8 -lib = File.expand_path('../lib/', __FILE__) -$:.unshift lib unless $:.include?(lib) - -require 'typhoeus/version' - -Gem::Specification.new do |s| - s.name = "typhoeus" - s.version = Typhoeus::VERSION - s.platform = Gem::Platform::RUBY - s.authors = ["David Balatero", "Paul Dix", "Hans Hasselberg"] - s.email = ["hans.hasselberg@gmail.com"] - s.homepage = "https://github.com/typhoeus/typhoeus" - s.summary = "Parallel HTTP library on top of libcurl multi." - s.description = %q{Like a modern code version of the mythical beast with 100 serpent heads, Typhoeus runs HTTP requests in parallel while cleanly encapsulating handling logic.} - - s.required_rubygems_version = ">= 1.3.6" - s.license = 'MIT' - - s.add_dependency('ethon', [">= 0.9.0"]) - - s.files = `git ls-files`.split("\n") - s.test_files = `git ls-files -- spec/*`.split("\n") - s.require_path = 'lib' -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/tzinfo-2.0.6/.yardopts b/example/vendor/bundle/ruby/2.7.0/gems/tzinfo-2.0.6/.yardopts deleted file mode 100644 index 52f74b7..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/tzinfo-2.0.6/.yardopts +++ /dev/null @@ -1,9 +0,0 @@ ---markup markdown ---no-private ---protected ---readme README.md -lib/**/*.rb -- -CHANGES.md -LICENSE -README.md diff --git a/example/vendor/bundle/ruby/2.7.0/gems/tzinfo-2.0.6/CHANGES.md b/example/vendor/bundle/ruby/2.7.0/gems/tzinfo-2.0.6/CHANGES.md deleted file mode 100644 index 8ed356e..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/tzinfo-2.0.6/CHANGES.md +++ /dev/null @@ -1,1026 +0,0 @@ -# Changes - -## Version 2.0.6 - 28-Jan-2023 - -* Eliminate `Object#untaint` deprecation warnings on JRuby 9.4.0.0. #145. - - -## Version 2.0.5 - 19-Jul-2022 - -* Changed `DateTime` results to always use the proleptic Gregorian calendar. - This affects `DateTime` results prior to 1582-10-15 and any arithmetic - performed on the results that would produce a secondary result prior to - 1582-10-15. -* Added support for eager loading all the time zone and country data by calling - either `TZInfo::DataSource#eager_load!` or `TZInfo.eager_load!`. Compatible - with Ruby On Rails' `eager_load_namespaces`. #129. -* Ignore the SECURITY file from Arch Linux's tzdata package. #134. - - -## Version 2.0.4 - 16-Dec-2020 - -* Fixed an incorrect `InvalidTimezoneIdentifier` exception raised when loading a - zoneinfo file that includes rules specifying an additional transition to the - final defined offset (for example, Africa/Casablanca in version 2018e of the - Time Zone Database). #123. - - -## Version 2.0.3 - 8-Nov-2020 - -* Added support for handling "slim" format zoneinfo files that are produced by - default by zic version 2020b and later. The POSIX-style TZ string is now used - calculate DST transition times after the final defined transition in the file. - #120. -* Fixed `TimeWithOffset#getlocal` returning a `TimeWithOffset` with the - `timezone_offset` still assigned when called with an offset argument on JRuby - 9.3. -* Rubinius is no longer supported. - - -## Version 2.0.2 - 2-Apr-2020 - -* Fixed 'wrong number of arguments' errors when running on JRuby 9.0. #114. -* Fixed warnings when running on Ruby 2.8. #113. - - -## Version 2.0.1 - 24-Dec-2019 - -* Fixed "SecurityError: Insecure operation - require" exceptions when loading - data with recent Ruby releases in safe mode. #100. -* Fixed warnings when running on Ruby 2.7. #109. -* Added a `TZInfo::Timezone#=~` method that performs a regex match on the time - zone identifier. #99. -* Added a `TZInfo::Country#=~` method that performs a regex match on the country - code. - - -## Version 2.0.0 - 26-Dec-2018 - -### Added - -* `to_local` and `period_for` instance methods have been added to - `TZInfo::Timezone`. These are similar to `utc_to_local` and `period_for_utc`, - but take the UTC offset of the given time into account. -* `abbreviation`, `dst?`, `base_utc_offset` and `observed_utc_offset` instance - methods have been added to `TZInfo::Timezone`, returning the abbreviation, - whether daylight savings time is in effect and the UTC offset of the time zone - at a specified time. -* A `TZInfo::Timestamp` class has been added. It can be used with - `TZInfo::Timezone` in place of a `Time` or `DateTime`. -* `local_time`, `local_datetime` and `local_timestamp` instance methods have - been added to `TZInfo::Timezone`. These methods construct local `Time`, - `DateTime` and `TZInfo::Timestamp` instances with the correct UTC offset and - abbreviation for the time zone. -* Support for a (yet to be released) version 2 of tzinfo-data has been added, in - addition to support for version 1. The new version will remove the (no longer - needed) `DateTime` parameters from transition times, reduce memory consumption - and improve the efficiency of loading timezone and country indexes. -* A `TZInfo::VERSION` constant has been added, indicating the TZInfo version - number. - -### Changed - -* The minimum supported Ruby versions are now Ruby MRI 1.9.3, JRuby 1.7 (in 1.9 - or later mode) and Rubinius 3. -* Local times are now returned using the correct UTC offset (instead of using - UTC). #49 and #52. -* Local times are returned as instances of `TimeWithOffset`, - `DateTimeWithOffset` or `TZInfo::TimestampWithOffset`. These classes subclass - `Time`, `DateTime` and `TZInfo::Timestamp` respectively. They override the - default behaviour of the base classes to return information about the observed - offset at the indicated time. For example, the zone abbreviation is returned - when using the `%Z` directive with `strftime`. -* The `transitions_up_to`, `offsets_up_to` and `strftime` instance methods of - `TZInfo::Timezone` now take the UTC offsets of given times into account - (instead of ignoring them as was previously the case). -* The `TZInfo::TimezonePeriod` class has been split into two subclasses: - `TZInfo::OffsetTimezonePeriod` and `TZInfo::TransitionsTimezonePeriod`. - `TZInfo::OffsetTimezonePeriod` is returned for time zones that only have a - single offset. `TZInfo::TransitionsTimezonePeriod` is returned for periods - that start or end with a transition. -* `TZInfo::TimezoneOffset#abbreviation`, `TZInfo::TimezonePeriod#abbreviation` - and `TZInfo::TimezonePeriod#zone_identifier` now return frozen `String` - instances instead of instances of `Symbol`. -* The `utc_offset` and `utc_total_offset` attributes of `TZInfo::TimezonePeriod` - and `TZInfo::TimezoneOffset` have been renamed `base_utc_offset` and - `observed_utc_offset` respectively. The former names have been retained as - aliases. -* `TZInfo::Timezone.get`, `TZInfo::Timezone.get_proxy` and `TZInfo::Country.get` - can now be used with strings having any encoding. Previously, only encodings - that are directly comparable with UTF-8 were supported. -* The requested identifier is included in `TZInfo::InvalidTimezoneIdentifier` - exception messages. -* The requested country code is included in `TZInfo::InvalidCountryCode` - exception messages. -* The full range of transitions is now loaded from zoneinfo files. Zoneinfo - files produced with version 2014c of the `zic` tool contain an initial - transition `2**63` seconds before the epoch. Zoneinfo files produced with - version 2014d or later of `zic` contain an initial transition `2**59` seconds - before the epoch. These transitions would previously have been ignored, but - are now returned in methods such as `TZInfo::Timezone#transitions_up_to`. -* The `TZInfo::RubyDataSource` and `TZInfo::ZoneinfoDataSource` classes have - been moved into a new `TZInfo::DataSources` module. Code that is setting - `TZInfo::ZoneinfoDataSource.search_path` or - `TZInfo::ZoneinfoDataSource.alternate_iso3166_tab_search_path` will need to be - updated accordingly. -* The `TZInfo::InvalidZoneinfoDirectory` and `TZInfo::ZoneinfoDirectoryNotFound` - exception classes raised by `TZInfo::DataSources::ZoneinfoDataSource` have - been moved into the `TZInfo::DataSources` module. -* Setting the data source to `:ruby` or instantiating - `TZInfo::DataSources::RubyDataSource` will now immediately raise a - `TZInfo::DataSources::TZInfoDataNotFound` exception if `require 'tzinfo/data'` - fails. Previously, a failure would only occur later when accessing an index or - loading a timezone or country. -* The `DEFAULT_SEARCH_PATH` and `DEFAULT_ALTERNATE_ISO3166_TAB_SEARCH_PATH` - constants of `TZInfo::DataSources::ZoneinfoDataSource` have been made private. -* The `TZInfo::Country.data_source`, - `TZInfo::DataSource.create_default_data_source`, - `TZInfo::DataSources::ZoneinfoDataSource.process_search_path`, - `TZInfo::Timezone.get_proxies` and `TZInfo::Timezone.data_source` methods have - been made private. -* The performance of loading zoneinfo files and the associated indexes has been - improved. -* Memory use has been decreased by deduplicating `String` instances when loading - country and time zone data. -* The dependency on the deprecated thread_safe gem as been removed and replaced - by concurrent-ruby. -* The Info classes used to return time zone and country information from - `TZInfo::DataSource` implementations have been moved into the - `TZInfo::DataSources` module. -* The `TZInfo::TransitionDataTimezoneInfo` class has been removed and replaced - with `TZInfo::DataSources::TransitionsDataTimezoneInfo` and - `TZInfo::DataSources::ConstantOffsetDataTimezoneInfo`. - `TZInfo::DataSources::TransitionsDataTimezoneInfo` is constructed with an - `Array` of `TZInfo::TimezoneTransition` instances representing times when the - offset changes. `TZInfo::DataSources::ConstantOffsetDataTimezoneInfo` is - constructed with a `TZInfo::TimezoneOffset` instance representing the offset - constantly observed in a time zone. -* The `TZInfo::DataSource#timezone_identifiers` method should no longer be - overridden in custom data source implementations. The implementation in the - base class now calculates a result from - `TZInfo::DataSource#data_timezone_identifiers` and - `TZInfo::DataSource#linked_timezone_identifiers`. -* The results of the `TZInfo::DataSources::RubyDataSource` `to_s` and `inspect` - methods now include the time zone database and tzinfo-data versions. - - -### Removed - -* Methods of `TZInfo::Timezone` that accept time arguments no longer allow - `Integer` timestamp values. `Time`, `DateTime` or `TZInfo::Timestamp` values - or objects that respond to `to_i`, `subsec` and optionally `utc_offset` must - be used instead. -* The `%:::z` format directive can now only be used with - `TZInfo::Timezone#strftime` if it is supported by `Time#strftime` on the - runtime platform. -* Using `TZInfo::Timezone.new(identifier)` and `TZInfo::Country.new(code)` to - obtain a specific `TZInfo::Timezone` or `TZInfo::Country` will no longer work. - `TZInfo::Timezone.get(identifier)` and `TZInfo::Country.get(code)` should be - used instead. -* The `TZInfo::TimeOrDateTime` class has been removed. -* The `valid_for_utc?`, `utc_after_start?`, `utc_before_end?`, - `valid_for_local?`, `local_after_start?` and `local_before_end?` instance - methods of `TZInfo::TimezonePeriod` have been removed. Comparisons can be - performed with the results of the `starts_at`, `ends_at`, `local_starts_at` - and `local_ends_at` methods instead. -* The `to_local` and `to_utc` instance methods of `TZInfo::TimezonePeriod` and - `TZInfo::TimezoneOffset` have been removed. Conversions should be performed - using the `TZInfo::Timezone` class instead. -* The `TZInfo::TimezonePeriod#utc_total_offset_rational` method has been - removed. Equivalent information can be obtained using the - `TZInfo::TimezonePeriod#observed_utc_offset` method. -* The `datetime`, `time`, `local_end`, `local_end_time`, `local_start` and - `local_start_time` instance methods of `TZInfo::TimezoneTransition` have been - removed. The `at`, `local_end_at` and `local_start_at` methods should be used - instead and the result (a `TZInfo::TimestampWithOffset`) converted to either a - `DateTime` or `Time` by calling `to_datetime` or `to_time` on the result. -* The `us_zones` and `us_zone_identifiers` class methods of `TZInfo::Timezone` - have been removed. `TZInfo::Country.get('US').zones` and - `TZInfo::Country.get('US').zone_identifiers` should be used instead. - - -## Version 1.2.11 - 28-Jan-2023 - -* Eliminate `Object#untaint` deprecation warnings on JRuby 9.4.0.0. #145. - - -## Version 1.2.10 - 19-Jul-2022 - -* Fixed a relative path traversal bug that could cause arbitrary files to be - loaded with `require` when used with `RubyDataSource`. Please refer to - for - details. CVE-2022-31163. -* Ignore the SECURITY file from Arch Linux's tzdata package. #134. - - -## Version 1.2.9 - 16-Dec-2020 - -* Fixed an incorrect `InvalidTimezoneIdentifier` exception raised when loading a - zoneinfo file that includes rules specifying an additional transition to the - final defined offset (for example, Africa/Casablanca in version 2018e of the - Time Zone Database). #123. - - -## Version 1.2.8 - 8-Nov-2020 - -* Added support for handling "slim" format zoneinfo files that are produced by - default by zic version 2020b and later. The POSIX-style TZ string is now used - calculate DST transition times after the final defined transition in the file. - The 64-bit section is now always used regardless of whether Time has support - for 64-bit times. #120. -* Rubinius is no longer supported. - - -## Version 1.2.7 - 2-Apr-2020 - -* Fixed 'wrong number of arguments' errors when running on JRuby 9.0. #114. -* Fixed warnings when running on Ruby 2.8. #112. - - -## Version 1.2.6 - 24-Dec-2019 - -* `Timezone#strftime('%s', time)` will now return the correct number of seconds - since the epoch. #91. -* Removed the unused `TZInfo::RubyDataSource::REQUIRE_PATH` constant. -* Fixed "SecurityError: Insecure operation - require" exceptions when loading - data with recent Ruby releases in safe mode. -* Fixed warnings when running on Ruby 2.7. #106 and #111. - - -## Version 1.2.5 - 4-Feb-2018 - -* Support recursively (deep) freezing `Country` and `Timezone` instances. #80. -* Allow negative daylight savings time offsets to be derived when reading from - zoneinfo files. The utc_offset and std_offset are now derived correctly for - Europe/Dublin in the 2018a and 2018b releases of the Time Zone Database. - - -## Version 1.2.4 - 26-Oct-2017 - -* Ignore the leapseconds file that is included in zoneinfo directories installed - with version 2017c and later of the Time Zone Database. - - -## Version 1.2.3 - 25-Mar-2017 - -* Reduce the number of `String` objects allocated when loading zoneinfo files. - #54. -* Make `Timezone#friendly_identifier` compatible with frozen string literals. -* Improve the algorithm for deriving the `utc_offset` from zoneinfo files. This - now correctly handles Pacific/Apia switching from one side of the - International Date Line to the other whilst observing daylight savings time. - #66. -* Fix an `UnknownTimezone` exception when calling transitions_up_to or - offsets_up_to on a `TimezoneProxy` instance obtained from - `Timezone.get_proxy`. -* Allow the Factory zone to be obtained from the Zoneinfo data source. -* Ignore the /usr/share/zoneinfo/timeconfig symlink included in Slackware - distributions. #64. -* Fix `Timezone#strftime` handling of `%Z` expansion when `%Z` is prefixed with - more than one percent. #31. -* Support expansion of `%z`, `%:z`, `%::z` and `%:::z` to the UTC offset of the - time zone in `Timezone#strftime`. #31 and #67. - - -## Version 1.2.2 - 8-Aug-2014 - -* Fix an error with duplicates being returned by `Timezone#all_country_zones` - and `Timezone#all_country_zone_identifiers` when used with tzinfo-data - v1.2014.6 or later. -* Use the zone1970.tab file for country timezone data if it is found in the - zoneinfo directory (and fallback to zone.tab if not). zone1970.tab was added - in tzdata 2014f. zone.tab is now deprecated. - - -## Version 1.2.1 - 1-Jun-2014 - -* Support zoneinfo files generated with zic version 2014c and later. -* On platforms that only support positive 32-bit timestamps, ensure that - conversions are accurate from the epoch instead of just from the first - transition after the epoch. -* Minor documentation improvements. - - -## Version 1.2.0 - 26-May-2014 - -* Raise the minimum supported Ruby version to 1.8.7. -* Support loading system zoneinfo data on FreeBSD, OpenBSD and Solaris. - Resolves #15. -* Add `canonical_identifier` and `canonical_zone` methods to `Timezone`. - Resolves #16. -* Add a link to a `DataSourceNotFound` help page in the - `TZInfo::DataSourceNotFound` exception message. -* Load iso3166.tab and zone.tab files as UTF-8. -* Fix `Timezone#local_to_utc` returning local `Time` instances on systems using - UTC as the local time zone. Resolves #13. -* Fix `==` methods raising an exception when passed an instance of a different - class by making `<=>` return `nil` if passed a non-comparable argument. -* Eliminate `require 'rational'` warnings. Resolves #10. -* Eliminate "assigned but unused variable - info" warnings. Resolves #11. -* Switch to minitest v5 for unit tests. Resolves #18. - - -## Version 1.1.0 - 25-Sep-2013 - -* TZInfo is now thread safe. `ThreadSafe::Cache` is now used instead of `Hash` - to cache `Timezone` and `Country` instances returned by `Timezone.get` and - `Country.get`. The tzinfo gem now depends on thread_safe ~> 0.1. -* Added a `transitions_up_to` method to `Timezone` that returns a list of the - times where the UTC offset of the timezone changes. -* Added an `offsets_up_to` method to `Timezone` that returns the set of offsets - that have been observed in a defined timezone. -* Fixed a "can't modify frozen String" error when loading a `Timezone` from a - zoneinfo file using an identifier `String` that is both tainted and frozen. - Resolves #3. -* Support TZif3 format zoneinfo files (now produced by zic from tzcode version - 2013e onwards). -* Support using YARD to generate documentation (added a .yardopts file). -* Ignore the +VERSION file included in the zoneinfo directory on Mac OS X. -* Added a note to the documentation concerning 32-bit zoneinfo files (as - included with Mac OS X). - - -## Version 1.0.1 - 22-Jun-2013 - -* Fix a test case failure when tests are run from a directory that contains a - dot in the path (issue #29751). - - -## Version 1.0.0 - 2-Jun-2013 - -* Allow TZInfo to be used with different data sources instead of just the - built-in Ruby module data files. -* Include a data source that allows TZInfo to load data from the binary - zoneinfo files produced by zic and included with many Linux and Unix-like - distributions. -* Remove the definition and index Ruby modules from TZInfo and move them into - a separate TZInfo::Data library (available as the tzinfo-data gem). -* Default to using the TZInfo::Data library as the data source if it is - installed, otherwise use zoneinfo files instead. -* Preserve the nanoseconds of local timezone Time objects when performing - conversions (issue #29705). -* Don't add the tzinfo lib directory to the search path when requiring 'tzinfo'. - The tzinfo lib directory must now be in the search path before 'tzinfo' is - required. -* Add `utc_start_time`, `utc_end_time`, `local_start_time` and `local_end_time` - instance methods to `TimezonePeriod`. These return an identical value as the - existing `utc_start`, `utc_end`, `local_start` and `local_end` methods, but - return `Time` instances instead of `DateTime`. -* Make the `start_transition`, `end_transition` and `offset` properties of - `TimezonePeriod` protected. To access properties of the period, callers should - use other `TimezonePeriod` instance methods instead (issue #7655). - - -## Version 0.3.61 (tzdata v2022a) - 19-Jul-2022 - -* Fixed a relative path traversal bug that could cause arbitrary files to be - loaded with `require` from the Ruby load path. Please refer to - for - details. CVE-2022-31163. -* Updated to tzdata version 2022a - (). - - -## Version 0.3.60 (tzdata v2021a) - 6-Feb-2021 - -* Updated to tzdata version 2021a - (). - - -## Version 0.3.59 (tzdata v2020e) - 24-Dec-2020 - -* Updated to tzdata version 2020e - (). - - -## Version 0.3.58 (tzdata v2020d) - 8-Nov-2020 - -* Updated to tzdata version 2020d - (). - - -## Version 0.3.57 (tzdata v2020a) - 17-May-2020 - -* Updated to tzdata version 2020a - (). - - -## Version 0.3.56 (tzdata v2019c) - 1-Nov-2019 - -* Updated to tzdata version 2019c - (). - - -## Version 0.3.55 (tzdata v2018g) - 27-Oct-2018 - -* Updated to tzdata version 2018g - (). - - -## Version 0.3.54 (tzdata v2018d) - 25-Mar-2018 - -* Updated to tzdata version 2018d - (). - - -## Version 0.3.53 (tzdata v2017b) - 23-Mar-2017 - -* Updated to tzdata version 2017b - (). - - -## Version 0.3.52 (tzdata v2016h) - 28-Oct-2016 - -* Updated to tzdata version 2016h - (). - - -## Version 0.3.51 (tzdata v2016f) - 5-Jul-2016 - -* Updated to tzdata version 2016f - (). - - -## Version 0.3.50 (tzdata v2016e) - 14-Jun-2016 - -* Updated to tzdata version 2016e - (). - - -## Version 0.3.49 (tzdata v2016d) - 18-Apr-2016 - -* Updated to tzdata version 2016d - (). - - -## Version 0.3.48 (tzdata v2016c) - 23-Mar-2016 - -* Updated to tzdata version 2016c - (). - - -## Version 0.3.47 (tzdata v2016b) - 15-Mar-2016 - -* Updated to tzdata version 2016b - (). - - -## Version 0.3.46 (tzdata v2015g) - 2-Dec-2015 - -* From version 2015e, the IANA time zone database uses non-ASCII characters in - country names. Backport the encoding handling from TZInfo::Data to allow - TZInfo 0.3.x to support Ruby 1.9 (which would otherwise fail with an invalid - byte sequence error when loading the countries index). Resolves #41. - - -## Version 0.3.45 (tzdata v2015g) - 3-Oct-2015 - -* Updated to tzdata version 2015g - (). - - -## Version 0.3.44 (tzdata v2015d) - 24-Apr-2015 - -* Updated to tzdata version 2015d - (). - - -## Version 0.3.43 (tzdata v2015a) - 31-Jan-2015 - -* Updated to tzdata version 2015a - (). - - -## Version 0.3.42 (tzdata v2014i) - 23-Oct-2014 - -* Updated to tzdata version 2014i - (). - - -## Version 0.3.41 (tzdata v2014f) - 8-Aug-2014 - -* Updated to tzdata version 2014f - (). - - -## Version 0.3.40 (tzdata v2014e) - 10-Jul-2014 - -* Updated to tzdata version 2014e - (). - - -## Version 0.3.39 (tzdata v2014a) - 9-Mar-2014 - -* Updated to tzdata version 2014a - (). - - -## Version 0.3.38 (tzdata v2013g) - 8-Oct-2013 - -* Updated to tzdata version 2013g - (). - - -## Version 0.3.37 (tzdata v2013b) - 11-Mar-2013 - -* Updated to tzdata version 2013b - (). - - -## Version 0.3.36 (tzdata v2013a) - 3-Mar-2013 - -* Updated to tzdata version 2013a - (). -* Fix `TimezoneTransitionInfo#eql?` incorrectly returning false when running on - Ruby 2.0. -* Change `eql?` and `==` implementations to test the class of the passed in - object instead of checking individual properties with `respond_to?`. - - -## Version 0.3.35 (tzdata v2012i) - 4-Nov-2012 - -* Updated to tzdata version 2012i - (). - - -## Version 0.3.34 (tzdata v2012h) - 27-Oct-2012 - -* Updated to tzdata version 2012h - (). - - -## Version 0.3.33 (tzdata v2012c) - 8-Apr-2012 - -* Updated to tzdata version 2012c - (). - - -## Version 0.3.32 (tzdata v2012b) - 4-Mar-2012 - -* Updated to tzdata version 2012b - (). - - -## Version 0.3.31 (tzdata v2011n) - 6-Nov-2011 - -* Updated to tzdata version 2011n - (). - - -## Version 0.3.30 (tzdata v2011k) - 29-Sep-2011 - -* Updated to tzdata version 2011k - (). - - -## Version 0.3.29 (tzdata v2011h) - 27-Jun-2011 - -* Updated to tzdata version 2011h - (). -* Allow the default value of the `local_to_utc` and `period_for_local` `dst` - parameter to be specified globally with a `Timezone.default_dst` attribute. - Thanks to Kurt Werle for the suggestion and patch. - - -## Version 0.3.28 (tzdata v2011g) - 13-Jun-2011 - -* Add support for Ruby 1.9.3 (trunk revision 31668 and later). Thanks to - Aaron Patterson for reporting the problems running on the new version. - Closes #29233. - - -## Version 0.3.27 (tzdata v2011g) - 26-Apr-2011 - -* Updated to tzdata version 2011g - (). - - -## Version 0.3.26 (tzdata v2011e) - 2-Apr-2011 - -* Updated to tzdata version 2011e - (). - - -## Version 0.3.25 (tzdata v2011d) - 14-Mar-2011 - -* Updated to tzdata version 2011d - (). - - -## Version 0.3.24 (tzdata v2010o) - 15-Jan-2011 - -* Updated to tzdata version 2010o - (). - - -## Version 0.3.23 (tzdata v2010l) - 19-Aug-2010 - -* Updated to tzdata version 2010l - (). - - -## Version 0.3.22 (tzdata v2010j) - 29-May-2010 - -* Corrected file permissions issue with 0.3.21 release. - - -## Version 0.3.21 (tzdata v2010j) - 28-May-2010 - -* Updated to tzdata version 2010j - (). -* Change invalid timezone check to exclude characters not used in timezone - identifiers and avoid 'character class has duplicated range' warnings with - Ruby 1.9.2. -* Ruby 1.9.2 has deprecated `require 'rational'`, but older versions of - Ruby need rational to be required. Require rational only when the Rational - module has not already been loaded. -* Remove circular requires (now a warning in Ruby 1.9.2). Instead of using - requires in each file for dependencies, `tzinfo.rb` now requires all tzinfo - files. If you were previously requiring files within the tzinfo directory - (e.g. `require 'tzinfo/timezone'`), then you will now have to - `require 'tzinfo'` instead. - - -## Version 0.3.20 (tzdata v2010i) - 19-Apr-2010 - -* Updated to tzdata version 2010i - (). - - -## Version 0.3.19 (tzdata v2010h) - 5-Apr-2010 - -* Updated to tzdata version 2010h - (). - - -## Version 0.3.18 (tzdata v2010g) - 29-Mar-2010 - -* Updated to tzdata version 2010g - (). - - -## Version 0.3.17 (tzdata v2010e) - 8-Mar-2010 - -* Updated to tzdata version 2010e - (). - - -## Version 0.3.16 (tzdata v2009u) - 5-Jan-2010 - -* Support the use of '-' to denote '0' as an offset in the tz data files. - Used for the first time in the SAVE field in tzdata v2009u. -* Updated to tzdata version 2009u - (). - - -## Version 0.3.15 (tzdata v2009p) - 26-Oct-2009 - -* Updated to tzdata version 2009p - (). -* Added a description to the gem spec. -* List test files in test_files instead of files in the gem spec. - - -## Version 0.3.14 (tzdata v2009l) - 19-Aug-2009 - -* Updated to tzdata version 2009l - (). -* Include current directory in load path to allow running tests on - Ruby 1.9.2, which doesn't include it by default any more. - - -## Version 0.3.13 (tzdata v2009f) - 15-Apr-2009 - -* Updated to tzdata version 2009f - (). -* Untaint the timezone module filename after validation to allow use - with `$SAFE == 1` (e.g. under mod_ruby). Thanks to Dmitry Borodaenko for - the suggestion. Closes #25349. - - -## Version 0.3.12 (tzdata v2008i) - 12-Nov-2008 - -* Updated to tzdata version 2008i - (). - - -## Version 0.3.11 (tzdata v2008g) - 7-Oct-2008 - -* Updated to tzdata version 2008g - (). -* Support Ruby 1.9.0-5. `Rational.new!` has now been removed in Ruby 1.9. - Only use `Rational.new!` if it is available (it is preferable in Ruby 1.8 - for performance reasons). Thanks to Jeremy Kemper and Pratik Naik for - reporting this. Closes #22312. -* Apply a patch from Pratik Naik to replace assert calls that have been - deprecated in the Ruby svn trunk. Closes #22308. - - -## Version 0.3.10 (tzdata v2008f) - 16-Sep-2008 - -* Updated to tzdata version 2008f - (). - - -## Version 0.3.9 (tzdata v2008c) - 27-May-2008 - -* Updated to tzdata version 2008c - (). -* Support loading timezone data in the latest trunk versions of Ruby 1.9. - `Rational.new!` is now private, so call it using `Rational.send :new!` - instead. Thanks to Jeremy Kemper and Pratik Naik for spotting this. Closes - #19184. -* Prevent warnings from being output when running Ruby with the -v or -w - command line options. Thanks to Paul McMahon for the patch. Closes #19719. - - -## Version 0.3.8 (tzdata v2008b) - 24-Mar-2008 - -* Updated to tzdata version 2008b - (). -* Support loading timezone data in Ruby 1.9.0. Use `DateTime.new!` if it is - available instead of `DateTime.new0` when constructing transition times. - `DateTime.new!` was added in Ruby 1.8.6. `DateTime.new0` was removed in - Ruby 1.9.0. Thanks to Joshua Peek for reporting this. Closes #17606. -* Modify some of the equality test cases to cope with the differences - between Ruby 1.8.6 and Ruby 1.9.0. - - -## Version 0.3.7 (tzdata v2008a) - 10-Mar-2008 - -* Updated to tzdata version 2008a - (). - - -## Version 0.3.6 (tzdata v2007k) - 1-Jan-2008 - -* Updated to tzdata version 2007k - (). -* Removed deprecated RubyGems autorequire option. - - -## Version 0.3.5 (tzdata v2007h) - 1-Oct-2007 - -* Updated to tzdata version 2007h - (). - - -## Version 0.3.4 (tzdata v2007g) - 21-Aug-2007 - -* Updated to tzdata version 2007g - (). - - -## Version 0.3.3 (tzdata v2006p) - 27-Nov-2006 - -* Updated to tzdata version 2006p - (). - - -## Version 0.3.2 (tzdata v2006n) - 11-Oct-2006 - -* Updated to tzdata version 2006n - (). Note that this - release of tzdata removes the country Serbia and Montenegro (CS) and replaces - it with separate Serbia (RS) and Montenegro (ME) entries. - - -## Version 0.3.1 (tzdata v2006j) - 21-Aug-2006 - -* Remove colon from case statements to avoid warning in Ruby 1.8.5. #5198. -* Use temporary variable to avoid dynamic string warning from rdoc. -* Updated to tzdata version 2006j - (). - - -## Version 0.3.0 (tzdata v2006g) - 17-Jul-2006 - -* New timezone data format. Timezone data now occupies less space on disk and - takes less memory once loaded. #4142, #4144. -* Timezone data is defined in modules rather than classes. `Timezone` instances - returned by `Timezone.get` are no longer instances of data classes, but are - instead instances of new `DataTimezone` and `LinkedTimezone` classes. -* `Timezone` instances can now be used with `Marshal.dump` and `Marshal.load`. - #4240. -* Added a `Timezone.get_proxy` method that returns a `TimezoneProxy` object for - a given identifier. -* Country index data is now defined in a single module that is independent - of the `Country` class implementation. -* `Country` instances can now be used with `Marshal.dump` and `Marshal.load`. - #4240. -* `Country` has a new `zone_info` method that returns `CountryTimezone` objects - containing additional information (latitude, longitude and a description) - relating to each `Timezone`. #4140. -* Time zones within a `Country` are now returned in an order that makes - geographic sense. -* The zdumptest utility now checks local to utc conversions in addition to - utc to local conversions. -* `eql?` method defined on `Country` and `Timezone` that is equivalent to `==`. -* The `==` method of `Timezone` no longer raises an exception when passed an - object with no identifier method. -* The `==` method of `Country` no longer raises an exception when passed an - object with no code method. -* `hash` method defined on `Country` that returns the hash of the code. -* `hash` method defined on `Timezone` that returns the hash of the identifier. -* Miscellaneous API documentation corrections and improvements. -* Timezone definition and indexes are now excluded from rdoc (the contents were - previously ignored with `#:nodoc:` anyway). -* Removed no longer needed `#:nodoc:` directives from timezone data files (which - are now excluded from the rdoc build). -* Installation of the gem now causes rdoc API documentation to be generated. - #4905. -* When optimizing transitions to generate zone definitions, check the - UTC and standard offsets separately rather than just the total offset to UTC. - Fixes an incorrect abbreviation issue with Europe/London, Europe/Dublin and - Pacific/Auckland. -* Eliminated unnecessary `.nil?` calls to give a minor performance gain. -* `Timezone.all` and `Timezone.all_identifiers` now return all the - `Timezone` instances/identifiers rather than just those associated with - countries. #4146. -* Added `all_data_zones`, `all_data_zone_identifiers`, `all_linked_zones` and - `all_linked_zone_identifiers` class methods to `Timezone`. -* Added a `strftime` method to `Timezone` that converts a time in UTC to local - time and then returns it formatted. `%Z` is replaced with the timezone - abbreviation for the given time (for example, EST or EDT). #4143. -* Fix escaping of quotes in `TZDataParser`. This affected country names and - descriptions of time zones within countries. - - -## Version 0.2.2 (tzdata v2006g) - 17-May-2006 - -* Use class-scoped instance variables to store the Timezone identifier and - singleton instance. Loading a linked zone no longer causes the parent - zone's identifier to be changed. The instance method of a linked zone class - also now returns an instance of the linked zone class rather than the parent - class. #4502. -* The zdumptest utility now compares the TZInfo zone identifier with the zdump - zone identifier. -* The zdumptestall utility now exits if not supplied with enough parameters. -* Updated to tzdata version 2006g - (). - - -## Version 0.2.1 (tzdata v2006d) - 17-Apr-2006 - -* Fix a performance issue caused in 0.2.0 with `Timezone.local_to_utc`. - Conversions performed on `TimeOrDateTime` instances passed to `<=>` are now - cached as originally intended. Thanks to Michael Smedberg for spotting this. -* Fix a performance issue with the `local_to_utc` period search algorithm - originally implemented in 0.1.0. The condition that was supposed to cause - the search to terminate when enough periods had been found was only being - evaluated in a small subset of cases. Thanks to Michael Smedberg and - Jamis Buck for reporting this. -* Added abbreviation as an alias for `TimezonePeriod.zone_identifier`. -* Updated to tzdata version 2006d - (). -* Ignore any offset in `DateTime` instances passed in (as is already done for - `Time` instances). All of the following now refer to the same UTC time (15:40 on 17 April 2006). Previously, the `DateTime` in the second line would have been interpreted as 20:40. - - ```ruby - tz.utc_to_local(DateTime.new(2006, 4, 17, 15, 40, 0)) - tz.utc_to_local(DateTime.new(2006, 4, 17, 15, 40, 0).new_offset(Rational(5, 24))) - tz.utc_to_local(Time.utc(2006, 4, 17, 15, 40, 0)) - tz.utc_to_local(Time.local(2006, 4, 17, 15, 40, 0)) - ``` - - -## Version 0.2.0 (tzdata v2006c) - 3-Apr-2006 - -* Use timestamps rather than `DateTime` objects in zone files for times between - 1970 and 2037 (the range of `Time`). -* Don't convert passed in `Time` objects to `DateTime` in most cases (provides - a substantial performance improvement). -* Allow integer timestamps (time in seconds since 1970-1-1) to be used as well - as `Time` and `DateTime` objects in all public methods that take times as - parameters. -* Tool to compare TZInfo conversions with output from zdump. -* `TZDataParser` zone generation algorithm rewritten. Now based on the zic code. - TZInfo is now 100% compatible with zic/zdump output. -* Riyadh Solar Time zones now included again (generation time has been reduced - with `TZDataParser` changes). -* Use binary mode when writing zone and country files to get Unix (\n) new - lines. -* Omit unnecessary quotes in zone identifier symbols. -* Omit the final transition to DST if there is a prior transition in the last - year processed to standard time. -* Updated to tzdata version 2006c - (). - - -## Version 0.1.2 (tzdata v2006a) - 5-Feb-2006 - -* Add lib directory to the load path when tzinfo is required. Makes it easier - to use tzinfo gem when unpacked to vendor directory in rails. -* Updated to tzdata version 2006a - (). -* `build_tz_classes` rake task now handles running svn add and svn delete as new - time zones and countries are added and old ones are removed. -* Return a better error when attempting to use a `Timezone` instance that was - constructed with `Timezone.new(nil)`. This will occur when using Rails' - `composed_of`. When the timezone identifier in the database is null, - attempting to use the `Timezone` will now result in an `UnknownTimezone` - exception rather than a `NameError`. - - -## Version 0.1.1 (tzdata v2005q) - 18-Dec-2005 - -* Time zones that are defined by a single unbounded period (e.g. UTC) now - work again. -* Updated to tzdata version 2005q. - - -## Version 0.1.0 (tzdata v2005n) - 27-Nov-2005 - -* `period_for_local` and `local_to_utc` now allow resolution of ambiguous - times (e.g. when switching from daylight savings to standard time). - The behaviour of these methods when faced with an ambiguous local time - has now changed. If you are using these methods you should check - the documentation. Thanks to Cliff Matthews for suggesting this change. -* Added `require 'date'` to `timezone.rb` (date isn't loaded by default in all - environments). -* Use rake to build packages and documentation. -* License file is now included in gem distribution. -* Dates in definitions stored as Astronomical Julian Day numbers rather than - as civil dates (improves performance creating `DateTime` instances). -* Added options to `TZDataParser` to allow generation of specific zones and - countries. -* Moved `TimezonePeriod` class to `timezone_period.rb`. -* New `TimezonePeriodList` class to store `TimezonePeriod` instances for a - timezone and perform searches for periods. -* Time zones are now defined using blocks. `TimezonePeriod` instances are only - created when they are needed. Thanks to Jamis Buck for the suggestion. -* Add options to `TZDataParser` to allow exclusion of specific zones and - countries. -* Exclude the Riyadh Solar Time zones. The rules are only for 1987 to 1989 and - take a long time to generate and process. Riyadh Solar Time is no longer - observed. -* The last `TimezonePeriod` for each `Timezone` is now written out with an - unbounded rather than arbitrary end time. -* Construct the `Rational` offset in `TimezonePeriod` once when the - `TimezonePeriod` is constructed rather than each time it is needed. -* `Timezone` and `Country` now keep a cache of loaded instances to avoid running - `require` which can be slow on some platforms. -* Updated to tzdata version 2005n. - - -## Version 0.0.4 (tzdata v2005m) - 18-Sep-2005 - -* Removed debug output accidentally included in the previous release. -* Fixed a bug in the generation of friendly zone identifiers (was inserting - apostrophes into UTC, GMT, etc). -* Fixed `Country` `<=>` operator (was comparing non-existent attribute) -* Fixed `Timezone.period_for_local` error when period not found. -* Added test cases for `Timezone`, `TimezoneProxy`, `TimezonePeriod`, `Country` - and some selected time zones. - - -## Version 0.0.3 (tzdata v2005m) - 17-Sep-2005 - -* Reduced visibility of some methods added in `Timezone#setup` and - `Country#setup`. -* Added `name` method to `Timezone` (returns the identifier). -* Added `friendly_identifier` method to `Timezone`. Returns a more friendly - version of the identifier. -* Added `to_s` method to `Timezone`. Returns the friendly identifier. -* Added `==` and `<=>` operators to `Timezone` (compares identifiers). -* `Timezone` now includes `Comparable`. -* Added `to_s` method to `Country`. -* Added `==` and `<=>` operators to `Country` (compares ISO 3166 country codes). -* `Country` now includes `Comparable`. -* New `TimezoneProxy` class that behaves the same as a `Timezone` but doesn't - actually load in its definition until it is actually required. -* Modified `Timezone` and `Country` methods that return `Timezone` instances to - return `TimezoneProxy` instances instead. This makes these methods much - quicker. - -In Ruby on Rails, you can now show a drop-down list of all time zones using the -Rails `time_zone_select` helper method: - -```ruby -<%= time_zone_select 'user', 'time_zone', TZInfo::Timezone.all.sort, :model => TZInfo::Timezone %> -``` - - -## Version 0.0.2 (tzdata v2005m) - 13-Sep-2005 - -* `Country` and `Timezone` data is now loaded into class rather than instance - variables. This makes `Timezone` links more efficient and saves memory if - creating specific `Timezone` and `Country` classes directly. -* `TimezonePeriod` `zone_identifier` is now defined as a symbol to save memory - (was previously a string). -* `TimezonePeriod` `zone_identifier`s that were previously `''` are now - `:Unknown`. -* `Timezone` and `Country` instances can now be returned using - `Timezone.new(identifier)` and `Country.new(identifier)`. When passed an - identifier, the `new` method calls `get` to return an instance of the - specified timezone or country. -* Added new class methods to `Timezone` to return sets of zones and identifiers. - -Thanks to Scott Barron of Lunchbox Software for the suggestions in his -article about using TZInfo with Rails -() - - -## Version 0.0.1 (tzdata v2005m) - 29-Aug-2005 - -* First release. diff --git a/example/vendor/bundle/ruby/2.7.0/gems/tzinfo-2.0.6/LICENSE b/example/vendor/bundle/ruby/2.7.0/gems/tzinfo-2.0.6/LICENSE deleted file mode 100644 index 9b3125a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/tzinfo-2.0.6/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2005-2023 Philip Ross - -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/example/vendor/bundle/ruby/2.7.0/gems/tzinfo-2.0.6/README.md b/example/vendor/bundle/ruby/2.7.0/gems/tzinfo-2.0.6/README.md deleted file mode 100644 index 2c8b6d2..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/tzinfo-2.0.6/README.md +++ /dev/null @@ -1,406 +0,0 @@ -# TZInfo - Ruby Time Zone Library - -[![RubyGems](https://img.shields.io/gem/v/tzinfo?logo=rubygems&label=Gem)](https://rubygems.org/gems/tzinfo) [![Tests](https://github.com/tzinfo/tzinfo/workflows/Tests/badge.svg?branch=master&event=push)](https://github.com/tzinfo/tzinfo/actions?query=workflow%3ATests+branch%3Amaster+event%3Apush) - -[TZInfo](https://tzinfo.github.io) is a Ruby library that provides access to -time zone data and allows times to be converted using time zone rules. - - -## Data Sources - -TZInfo requires a source of time zone data. There are two options: - -1. A zoneinfo directory containing timezone definition files. These files are - generated from the [IANA Time Zone Database](https://www.iana.org/time-zones) - using the `zic` utility. Most Unix-like systems include a zoneinfo directory. -2. The TZInfo::Data library (the tzinfo-data gem). TZInfo::Data contains a set - of Ruby modules that are also generated from the IANA Time Zone Database. - -By default, TZInfo will attempt to use TZInfo::Data. If TZInfo::Data is not -available (i.e. if `require 'tzinfo/data'` fails), then TZInfo will search for a -zoneinfo directory instead (using the search path specified by -`TZInfo::ZoneinfoDataSource::DEFAULT_SEARCH_PATH`). - -If no data source can be found, a `TZInfo::DataSourceNotFound` exception will be -raised when TZInfo is used. Further information is available -[in the wiki](https://tzinfo.github.io/datasourcenotfound) to help resolve -`TZInfo::DataSourceNotFound` errors. - -The default data source selection can be overridden by calling -`TZInfo::DataSource.set`. - -Custom data sources can also be used. See the `TZInfo::DataSource.set` -documentation for further details. - - -## Installation - -The TZInfo gem can be installed by running `gem install tzinfo` or by adding -`gem 'tzinfo'` to your `Gemfile` and running `bundle install`. - -To use the Ruby modules as the data source, TZInfo::Data will also need to be -installed by running `gem install tzinfo-data` or by adding `gem 'tzinfo-data'` -to your `Gemfile`. - - -## IANA Time Zone Database - -The data returned and used by TZInfo is sourced from the -[IANA Time Zone Database](http://www.iana.org/time-zones). The -[Theory and pragmatics of the tz code and data](https://data.iana.org/time-zones/theory.html) -document gives details of how the data is organized and managed. - - -## Example Usage - -To use TZInfo, it must first be required with: - -```ruby -require 'tzinfo' -``` - -The `TZInfo::Timezone` class provides access to time zone data and methods for -converting times. - -The `all_identifiers` method returns a list of valid time zone identifiers: - -```ruby -identifiers = TZInfo::Timezone.all_identifiers -# => ["Africa/Adibdjan", "Africa/Accra", ..., "Zulu"] -``` - -A `TZInfo::Timezone` instance representing an individual time zone can be -obtained with `TZInfo::Timezone.get`: - -```ruby -tz = TZInfo::Timezone.get('America/New_York') -# => # -``` - -A time can be converted to the local time of the time zone with `to_local`: - -```ruby -tz.to_local(Time.utc(2018, 2, 1, 12, 30, 0)) -# => 2018-02-01 07:30:00 -0500 -tz.to_local(Time.utc(2018, 7, 1, 12, 30, 0)) -# => 2018-07-01 08:30:00 -0400 -tz.to_local(Time.new(2018, 7, 1, 13, 30, 0, '+01:00')) -# => 2018-07-01 08:30:00 -0400 -``` - -Local times with the appropriate offset for the time zone can be constructed -with `local_time`: - -```ruby -tz.local_time(2018, 2, 1, 7, 30, 0) -# => 2018-02-01 07:30:00 -0500 -tz.local_time(2018, 7, 1, 8, 30, 0) -# => 2018-07-01 08:30:00 -0400 -``` - -Local times can be converted to UTC by using `local_time` and calling `utc` on -the result: - -```ruby -tz.local_time(2018, 2, 1, 7, 30, 0).utc -# => 2018-02-01 12:30:00 UTC -tz.local_time(2018, 7, 1, 8, 30, 0).utc -# => 2018-07-01 12:30:00 UTC -``` - -The `local_to_utc` method can also be used to convert a time object to UTC. The -offset of the time is ignored - it is treated as if it were a local time for the -time zone: - -```ruby -tz.local_to_utc(Time.utc(2018, 2, 1, 7, 30, 0)) -# => 2018-02-01 12:30:00 UTC -tz.local_to_utc(Time.new(2018, 2, 1, 7, 30, 0, '+01:00')) -# => 2018-02-01 12:30:00 UTC -``` - -Information about the time zone can be obtained from returned local times: - -```ruby -local_time = tz.to_local(Time.utc(2018, 2, 1, 12, 30, 0)) -local_time.utc_offset # => -18000 -local_time.dst? # => false -local_time.zone # => "EST" - -local_time = tz.to_local(Time.utc(2018, 7, 1, 12, 30, 0)) -local_time.utc_offset # => -14400 -local_time.dst? # => true -local_time.zone # => "EDT" -``` - -Time zone information can be included when formatting times with `strftime` -using the `%z` and `%Z` directives: - -```ruby -tz.to_local(Time.utc(2018, 2, 1, 12, 30, 0)).strftime('%Y-%m-%d %H:%M:%S %z %Z') -# => "2018-02-01 07:30:00 -0500 EST" -tz.to_local(Time.utc(2018, 7, 1, 12, 30, 0)).strftime('%Y-%m-%d %H:%M:%S %z %Z') -# => "2018-07-01 08:30:00 -0400 EDT" -``` - -The `period_for` method can be used to obtain information about the observed -time zone information at a particular time as a `TZInfo::TimezonePeriod` object: - -```ruby -period = tz.period_for(Time.utc(2018, 7, 1, 12, 30, 0)) -period.base_utc_offset # => -18000 -period.std_offset # => 3600 -period.observed_utc_offset # => -14400 -period.abbreviation # => "EDT" -period.dst? # => true -period.local_starts_at.to_time # => 2018-03-11 03:00:00 -0400 -period.local_ends_at.to_time # => 2018-11-04 02:00:00 -0400 -``` - -A list of transitions between periods where different rules are observed can be -obtained with the `transitions_up_to` method. The result is returned as an -`Array` of `TZInfo::TimezoneTransition` objects: - -```ruby -transitions = tz.transitions_up_to(Time.utc(2019, 1, 1), Time.utc(2017, 1, 1)) -transitions.map do |t| - [t.local_end_at.to_time, t.offset.observed_utc_offset, t.offset.abbreviation] -end -# => [[2017-03-12 02:00:00 -0500, -14400, "EDT"], -# [2017-11-05 02:00:00 -0400, -18000, "EST"], -# [2018-03-11 02:00:00 -0500, -14400, "EDT"], -# [2018-11-04 02:00:00 -0400, -18000, "EST"]] -``` - -A list of the unique offsets used by a time zone can be obtained with the -`offsets_up_to` method. The result is returned as an `Array` of -`TZInfo::TimezoneOffset` objects: - -```ruby -offsets = tz.offsets_up_to(Time.utc(2019, 1, 1)) -offsets.map {|o| [o.observed_utc_offset, o.abbreviation] } -# => [[-17762, "LMT"], -# [-18000, "EST"], -# [-14400, "EDT"], -# [-14400, "EWT"], -# [-14400, "EPT"]] -``` - -All `TZInfo::Timezone` methods that accept a time as a parameter can be used -with either instances of `Time`, `DateTime` or `TZInfo::Timestamp`. Arbitrary -`Time`-like objects that respond to both `to_i` and `subsec` and optionally -`utc_offset` will be treated as if they are instances of `Time`. - -`TZInfo::Timezone` methods that both accept and return times will return an -object with a type matching that of the parameter (actually a -`TZInfo::TimeWithOffset`, `TZInfo::DateTimeWithOffset` or -`TZInfo::TimestampWithOffset` subclass when returning a local time): - -```ruby -tz.to_local(Time.utc(2018, 7, 1, 12, 30, 0)) -# => 2018-07-01 08:30:00 -0400 -tz.to_local(DateTime.new(2018, 7, 1, 12, 30, 0)) -# => # -tz.to_local(TZInfo::Timestamp.create(2018, 7, 1, 12, 30, 0, 0, :utc)) -# => # -``` - -In addition to `local_time`, which returns `Time` instances, the -`local_datetime` and `local_timestamp` methods can be used to construct local -`DateTime` and `TZInfo::Timestamp` instances with the appropriate offset: - -```ruby -tz.local_time(2018, 2, 1, 7, 30, 0) -# => 2018-02-01 07:30:00 -0500 -tz.local_datetime(2018, 2, 1, 7, 30, 0) -# => # -tz.local_timestamp(2018, 2, 1, 7, 30, 0) -# => # -``` - -The `local_to_utc`, `local_time`, `local_datetime` and `local_timestamp` methods -may raise a `TZInfo::PeriodNotFound` or a `TZInfo::AmbiguousTime` exception. -`TZInfo::PeriodNotFound` signals that there is no equivalent UTC time (for -example, during the transition from standard time to daylight savings time when -the clocks are moved forward and an hour is skipped). `TZInfo::AmbiguousTime` -signals that there is more than one equivalent UTC time (for example, during the -transition from daylight savings time to standard time where the clocks are -moved back and an hour is repeated): - -```ruby -tz.local_time(2018, 3, 11, 2, 30, 0, 0) -# raises TZInfo::PeriodNotFound (2018-03-11 02:30:00 is an invalid local time.) -tz.local_time(2018, 11, 4, 1, 30, 0, 0) -# raises TZInfo::AmbiguousTime (2018-11-04 01:30:00 is an ambiguous local time.) -``` - -`TZInfo::PeriodNotFound` exceptions can only be resolved by adjusting the time, -for example, by advancing an hour: - -```ruby -tz.local_time(2018, 3, 11, 3, 30, 0, 0) -# => 2018-03-11 03:30:00 -0400 -``` - -`TZInfo::AmbiguousTime` exceptions can be resolved by setting the `dst` -parameter and/or specifying a block to choose one of the interpretations: - -```ruby -tz.local_time(2018, 11, 4, 1, 30, 0, 0, true) -# => 2018-11-04 01:30:00 -0400 -tz.local_time(2018, 11, 4, 1, 30, 0, 0, false) -# => 2018-11-04 01:30:00 -0500 - -tz.local_time(2018, 11, 4, 1, 30, 0, 0) {|p| p.first } -# => 2018-11-04 01:30:00 -0400 -tz.local_time(2018, 11, 4, 1, 30, 0, 0) {|p| p.last } -# => 2018-11-04 01:30:00 -0500 -``` - -The default value of the `dst` parameter can also be set globally: - -```ruby -TZInfo::Timezone.default_dst = true -tz.local_time(2018, 11, 4, 1, 30, 0, 0) -# => 2018-11-04 01:30:00 -0400 -TZInfo::Timezone.default_dst = false -tz.local_time(2018, 11, 4, 1, 30, 0, 0) -# => 2018-11-04 01:30:00 -0500 -``` - -TZInfo also provides information about -[ISO 3166-1](https://www.iso.org/iso-3166-country-codes.html) countries and -their associated time zones via the `TZInfo::Country` class. - -A list of valid ISO 3166-1 (alpha-2) country codes can be obtained by calling -`TZInfo::Country.all_codes`: - -```ruby -TZInfo::Country.all_codes -# => ["AD", "AE", ..., "ZW"] -``` - -A `TZInfo::Country` instance representing an individual time zone can be -obtained with `TZInfo::Country.get`: - -```ruby -c = TZInfo::Country.get('US') -# => # -c.name -# => "United States" -``` - -The `zone_identifiers` method returns a list of the time zone identifiers used -in a country: - -```ruby -c.zone_identifiers -# => ["America/New_York", "America/Detroit", ..., "Pacific/Honolulu"] -``` - -The `zone_info` method returns further information about the time zones used in -a country as an `Array` of `TZInfo::CountryTimezone` instances: - -```ruby -zi = c.zone_info.first -zi.identifier # => "America/New_York" -zi.latitude.to_f.round(5) # => 40.71417 -zi.longitude.to_f.round(5) # => -74.00639 -zi.description # => "Eastern (most areas)" -``` - -The `zones` method returns an `Array` of `TZInfo::Timezone` instances for a -country. A `TZInfo::Timezone` instance can be obtained from a -`TZInfo::CountryTimezone` using the `timezone` method: - -```ruby -zi.timezone.to_local(Time.utc(2018, 2, 1, 12, 30, 0)) -# => 2018-02-01 07:30:00 -0500 -``` - -For further detail, please refer to the API documentation for the -`TZInfo::Timezone` and `TZInfo::Country` classes. - - -## Time Zone Selection - -The Time Zone Database maintainers recommend that time zone identifiers are not -made visible to end-users (see [Names of -timezones](https://data.iana.org/time-zones/theory.html#naming)). - -Instead of displaying a list of time zone identifiers, time zones can be -selected by the user's country. Call `TZInfo::Country.all` to obtain a list of -`TZInfo::Country` objects, each with a unique `code` and a `name` that can be -used for display purposes. - -Most countries have a single time zone. When choosing such a country, the time -zone can be inferred and selected automatically. - -```ruby -croatia = TZInfo::Country.get('HR') -# => # -croatia.zone_info.length -# => 1 -croatia.zone_info[0].identifier -# => "Europe/Belgrade" -``` - -Some countries have multiple time zones. The `zone_info` method can be used -to obtain a list of user-friendly descriptions of the available options: - -```ruby -australia = TZInfo::Country.get('AU') -# => # -australia.zone_info.length -# => 13 -australia.zone_info.map {|i| [i.identifier, i.description] } -# => [["Australia/Lord_Howe", "Lord Howe Island"], -# ["Antarctica/Macquarie", "Macquarie Island"], -# ... -# ["Australia/Eucla", "Western Australia (Eucla)"]] -``` - -Please note that country information available through TZInfo is intended as an -aid to help users select a time zone data appropriate for their practical needs. -It is not intended to take or endorse any position on legal or territorial -claims. - - -## Compatibility - -TZInfo v2.0.0 requires a minimum of Ruby MRI 1.9.3 or JRuby 1.7 (in 1.9 mode or -later). - - -## Thread-Safety - -The `TZInfo::Country` and `TZInfo::Timezone` classes are thread-safe. It is safe -to use class and instance methods of `TZInfo::Country` and `TZInfo::Timezone` in -concurrently executing threads. Instances of both classes can be shared across -thread boundaries. - - -## Documentation - -API documentation for TZInfo is available on -[RubyDoc.info](https://www.rubydoc.info/gems/tzinfo/). - - -## License - -TZInfo is released under the MIT license, see LICENSE for details. - - -## Source Code - -Source code for TZInfo is available on -[GitHub](https://github.com/tzinfo/tzinfo). - - -## Issue Tracker - -Please post any bugs, issues, feature requests or questions about TZInfo to the -[GitHub issue tracker](https://github.com/tzinfo/tzinfo/issues). - -Issues with the underlying time zone data should be raised on the -[Time Zone Database Discussion mailing list](https://mm.icann.org/mailman/listinfo/tz). diff --git a/example/vendor/bundle/ruby/2.7.0/gems/xcodeproj-1.22.0/LICENSE b/example/vendor/bundle/ruby/2.7.0/gems/xcodeproj-1.22.0/LICENSE deleted file mode 100644 index f060fab..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/xcodeproj-1.22.0/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2012 Eloy Durán - -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/example/vendor/bundle/ruby/2.7.0/gems/xcodeproj-1.22.0/README.md b/example/vendor/bundle/ruby/2.7.0/gems/xcodeproj-1.22.0/README.md deleted file mode 100644 index 87192f7..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/xcodeproj-1.22.0/README.md +++ /dev/null @@ -1,95 +0,0 @@ -# Xcodeproj - -[![Build Status](https://img.shields.io/github/workflow/status/CocoaPods/Xcodeproj/Specs)](https://github.com/CocoaPods/Xcodeproj/actions) -[![Maintainability](https://api.codeclimate.com/v1/badges/40ae104586c859d3581e/maintainability)](https://codeclimate.com/github/CocoaPods/Xcodeproj/maintainability) -[![Test Coverage](https://api.codeclimate.com/v1/badges/40ae104586c859d3581e/test_coverage)](https://codeclimate.com/github/CocoaPods/Xcodeproj/test_coverage) - -Xcodeproj lets you create and modify Xcode projects from [Ruby][ruby]. -Script boring management tasks or build Xcode-friendly libraries. Also includes -support for Xcode workspaces (`.xcworkspace`), configuration files (`.xcconfig`) and -Xcode Scheme files (`.xcscheme`). - -It is used in [CocoaPods](https://github.com/CocoaPods/CocoaPods) to create a -collection of supplemental libraries or frameworks, for all platforms Xcode supports. - -The API reference can be found [here](http://www.rubydoc.info/gems/xcodeproj). - -## Installing Xcodeproj - -Xcodeproj itself installs through RubyGems, the Ruby package manager. Install it -by performing the following command: - - $ [sudo] gem install xcodeproj - -## Quickstart - -To begin editing an xcodeproj file start by opening it as an Xcodeproj with: - -```ruby -require 'xcodeproj' -project_path = '/your_path/your_project.xcodeproj' -project = Xcodeproj::Project.open(project_path) -``` - -#### Some Small Examples To Get You Started - -> Look through all targets - -```ruby -project.targets.each do |target| - puts target.name -end -``` - -> Get all source files for a target - -```ruby -target = project.targets.first -files = target.source_build_phase.files.to_a.map do |pbx_build_file| - pbx_build_file.file_ref.real_path.to_s - -end.select do |path| - path.end_with?(".m", ".mm", ".swift") - -end.select do |path| - File.exists?(path) -end -``` - -> Set a specific build configuration to all targets - -```ruby -project.targets.each do |target| - target.build_configurations.each do |config| - config.build_settings['MY_CUSTOM_FLAG'] ||= 'TRUE' - end -end -project.save -``` - -## Command Line Tool - -Installing the Xcodeproj gem will also install a command-line tool `xcodeproj` which you can -use to generate project diffs, target diffs, output all configurations and show a YAML representation. - -For more information consult `xcodeproj --help`. - -## Collaborate - -All Xcodeproj development happens on [GitHub][xcodeproj]. Contributing patches -is really easy and gratifying. - -Follow [@CocoaPods][twitter] to get up to date information about what's -going on in the CocoaPods world. - - -## LICENSE - -These works are available under the MIT license. See the [LICENSE][license] file -for more info. - -[twitter]: http://twitter.com/CocoaPods -[ruby]: http://www.ruby-lang.org/en/ -[xcodeproj]: https://github.com/cocoapods/xcodeproj -[tickets]: https://github.com/cocoapods/xcodeproj/issues -[license]: LICENSE diff --git a/example/vendor/bundle/ruby/2.7.0/gems/xcodeproj-1.22.0/bin/xcodeproj b/example/vendor/bundle/ruby/2.7.0/gems/xcodeproj-1.22.0/bin/xcodeproj deleted file mode 100755 index 5d163fe..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/xcodeproj-1.22.0/bin/xcodeproj +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env ruby - -if $PROGRAM_NAME == __FILE__ - ENV['BUNDLE_GEMFILE'] = File.expand_path('../../Gemfile', __FILE__) - require 'bundler/setup' -end - -require 'xcodeproj' - -Xcodeproj::Command.run(ARGV) diff --git a/example/vendor/bundle/ruby/2.7.0/specifications/CFPropertyList-3.0.6.gemspec b/example/vendor/bundle/ruby/2.7.0/specifications/CFPropertyList-3.0.6.gemspec deleted file mode 100644 index f2d47b0..0000000 --- a/example/vendor/bundle/ruby/2.7.0/specifications/CFPropertyList-3.0.6.gemspec +++ /dev/null @@ -1,40 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: CFPropertyList 3.0.6 ruby lib - -Gem::Specification.new do |s| - s.name = "CFPropertyList".freeze - s.version = "3.0.6" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.require_paths = ["lib".freeze] - s.authors = ["Christian Kruse".freeze] - s.date = "2023-01-25" - s.description = "This is a module to read, write and manipulate both binary and XML property lists as defined by apple.".freeze - s.email = "cjk@defunct.ch".freeze - s.extra_rdoc_files = ["README.rdoc".freeze] - s.files = ["README.rdoc".freeze] - s.homepage = "https://github.com/ckruse/CFPropertyList".freeze - s.licenses = ["MIT".freeze] - s.rubygems_version = "3.1.6".freeze - s.summary = "Read, write and manipulate both binary and XML property lists as defined by apple".freeze - - s.installed_by_version = "3.1.6" if s.respond_to? :installed_by_version - - if s.respond_to? :specification_version then - s.specification_version = 4 - end - - if s.respond_to? :add_runtime_dependency then - s.add_runtime_dependency(%q.freeze, [">= 0"]) - s.add_development_dependency(%q.freeze, [">= 0"]) - s.add_development_dependency(%q.freeze, [">= 0"]) - s.add_development_dependency(%q.freeze, [">= 0"]) - s.add_development_dependency(%q.freeze, [">= 0.7.0"]) - else - s.add_dependency(%q.freeze, [">= 0"]) - s.add_dependency(%q.freeze, [">= 0"]) - s.add_dependency(%q.freeze, [">= 0"]) - s.add_dependency(%q.freeze, [">= 0"]) - s.add_dependency(%q.freeze, [">= 0.7.0"]) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/specifications/activesupport-7.0.4.3.gemspec b/example/vendor/bundle/ruby/2.7.0/specifications/activesupport-7.0.4.3.gemspec deleted file mode 100644 index 7e33f82..0000000 --- a/example/vendor/bundle/ruby/2.7.0/specifications/activesupport-7.0.4.3.gemspec +++ /dev/null @@ -1,39 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: activesupport 7.0.4.3 ruby lib - -Gem::Specification.new do |s| - s.name = "activesupport".freeze - s.version = "7.0.4.3" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.metadata = { "bug_tracker_uri" => "https://github.com/rails/rails/issues", "changelog_uri" => "https://github.com/rails/rails/blob/v7.0.4.3/activesupport/CHANGELOG.md", "documentation_uri" => "https://api.rubyonrails.org/v7.0.4.3/", "mailing_list_uri" => "https://discuss.rubyonrails.org/c/rubyonrails-talk", "rubygems_mfa_required" => "true", "source_code_uri" => "https://github.com/rails/rails/tree/v7.0.4.3/activesupport" } if s.respond_to? :metadata= - s.require_paths = ["lib".freeze] - s.authors = ["David Heinemeier Hansson".freeze] - s.date = "2023-03-13" - s.description = "A toolkit of support libraries and Ruby core extensions extracted from the Rails framework. Rich support for multibyte strings, internationalization, time zones, and testing.".freeze - s.email = "david@loudthinking.com".freeze - s.homepage = "https://rubyonrails.org".freeze - s.licenses = ["MIT".freeze] - s.rdoc_options = ["--encoding".freeze, "UTF-8".freeze] - s.required_ruby_version = Gem::Requirement.new(">= 2.7.0".freeze) - s.rubygems_version = "3.1.6".freeze - s.summary = "A toolkit of support libraries and Ruby core extensions extracted from the Rails framework.".freeze - - s.installed_by_version = "3.1.6" if s.respond_to? :installed_by_version - - if s.respond_to? :specification_version then - s.specification_version = 4 - end - - if s.respond_to? :add_runtime_dependency then - s.add_runtime_dependency(%q.freeze, [">= 1.6", "< 2"]) - s.add_runtime_dependency(%q.freeze, ["~> 2.0"]) - s.add_runtime_dependency(%q.freeze, ["~> 1.0", ">= 1.0.2"]) - s.add_runtime_dependency(%q.freeze, [">= 5.1"]) - else - s.add_dependency(%q.freeze, [">= 1.6", "< 2"]) - s.add_dependency(%q.freeze, ["~> 2.0"]) - s.add_dependency(%q.freeze, ["~> 1.0", ">= 1.0.2"]) - s.add_dependency(%q.freeze, [">= 5.1"]) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/specifications/addressable-2.8.4.gemspec b/example/vendor/bundle/ruby/2.7.0/specifications/addressable-2.8.4.gemspec deleted file mode 100644 index becc128..0000000 --- a/example/vendor/bundle/ruby/2.7.0/specifications/addressable-2.8.4.gemspec +++ /dev/null @@ -1,37 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: addressable 2.8.4 ruby lib - -Gem::Specification.new do |s| - s.name = "addressable".freeze - s.version = "2.8.4" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.metadata = { "changelog_uri" => "https://github.com/sporkmonger/addressable/blob/main/CHANGELOG.md" } if s.respond_to? :metadata= - s.require_paths = ["lib".freeze] - s.authors = ["Bob Aman".freeze] - s.date = "2023-04-09" - s.description = "Addressable is an alternative implementation to the URI implementation that is\npart of Ruby's standard library. It is flexible, offers heuristic parsing, and\nadditionally provides extensive support for IRIs and URI templates.\n".freeze - s.email = "bob@sporkmonger.com".freeze - s.extra_rdoc_files = ["README.md".freeze] - s.files = ["README.md".freeze] - s.homepage = "https://github.com/sporkmonger/addressable".freeze - s.licenses = ["Apache-2.0".freeze] - s.rdoc_options = ["--main".freeze, "README.md".freeze] - s.required_ruby_version = Gem::Requirement.new(">= 2.2".freeze) - s.rubygems_version = "3.1.6".freeze - s.summary = "URI Implementation".freeze - - s.installed_by_version = "3.1.6" if s.respond_to? :installed_by_version - - if s.respond_to? :specification_version then - s.specification_version = 4 - end - - if s.respond_to? :add_runtime_dependency then - s.add_runtime_dependency(%q.freeze, [">= 2.0.2", "< 6.0"]) - s.add_development_dependency(%q.freeze, [">= 1.0", "< 3.0"]) - else - s.add_dependency(%q.freeze, [">= 2.0.2", "< 6.0"]) - s.add_dependency(%q.freeze, [">= 1.0", "< 3.0"]) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/specifications/algoliasearch-1.27.5.gemspec b/example/vendor/bundle/ruby/2.7.0/specifications/algoliasearch-1.27.5.gemspec deleted file mode 100644 index 3aec5ff..0000000 --- a/example/vendor/bundle/ruby/2.7.0/specifications/algoliasearch-1.27.5.gemspec +++ /dev/null @@ -1,42 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: algoliasearch 1.27.5 ruby lib - -Gem::Specification.new do |s| - s.name = "algoliasearch".freeze - s.version = "1.27.5" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.metadata = { "bug_tracker_uri" => "https://github.com/algolia/algoliasearch-client-ruby/issues", "changelog_uri" => "https://github.com/algolia/algoliasearch-client-ruby/blob/master/CHANGELOG.md", "documentation_uri" => "http://www.rubydoc.info/gems/algoliasearch", "homepage_uri" => "https://www.algolia.com/doc/api-client/ruby/getting-started/", "source_code_uri" => "https://github.com/algolia/algoliasearch-client-ruby" } if s.respond_to? :metadata= - s.require_paths = ["lib".freeze] - s.authors = ["Algolia".freeze] - s.date = "2020-10-28" - s.description = "A simple Ruby client for the algolia.com REST API".freeze - s.email = "contact@algolia.com".freeze - s.extra_rdoc_files = ["CHANGELOG.md".freeze, "LICENSE".freeze, "README.md".freeze] - s.files = ["CHANGELOG.md".freeze, "LICENSE".freeze, "README.md".freeze] - s.homepage = "https://github.com/algolia/algoliasearch-client-ruby".freeze - s.licenses = ["MIT".freeze] - s.post_install_message = "A new major version is available for Algolia! Please now use the https://rubygems.org/gems/algolia gem to get the latest features.".freeze - s.rubygems_version = "3.1.6".freeze - s.summary = "A simple Ruby client for the algolia.com REST API".freeze - - s.installed_by_version = "3.1.6" if s.respond_to? :installed_by_version - - if s.respond_to? :specification_version then - s.specification_version = 4 - end - - if s.respond_to? :add_runtime_dependency then - s.add_runtime_dependency(%q.freeze, [">= 1.5.1"]) - s.add_runtime_dependency(%q.freeze, ["~> 2.8", ">= 2.8.3"]) - s.add_development_dependency(%q.freeze, ["~> 0"]) - s.add_development_dependency(%q.freeze, ["~> 0"]) - s.add_development_dependency(%q.freeze, ["~> 0"]) - else - s.add_dependency(%q.freeze, [">= 1.5.1"]) - s.add_dependency(%q.freeze, ["~> 2.8", ">= 2.8.3"]) - s.add_dependency(%q.freeze, ["~> 0"]) - s.add_dependency(%q.freeze, ["~> 0"]) - s.add_dependency(%q.freeze, ["~> 0"]) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/specifications/atomos-0.1.3.gemspec b/example/vendor/bundle/ruby/2.7.0/specifications/atomos-0.1.3.gemspec deleted file mode 100644 index 32e15f6..0000000 --- a/example/vendor/bundle/ruby/2.7.0/specifications/atomos-0.1.3.gemspec +++ /dev/null @@ -1,37 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: atomos 0.1.3 ruby lib - -Gem::Specification.new do |s| - s.name = "atomos".freeze - s.version = "0.1.3" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.require_paths = ["lib".freeze] - s.authors = ["Samuel Giddins".freeze] - s.bindir = "exe".freeze - s.date = "2018-08-07" - s.email = ["segiddins@segiddins.me".freeze] - s.homepage = "https://github.com/segiddins/atomos".freeze - s.licenses = ["MIT".freeze] - s.required_ruby_version = Gem::Requirement.new(">= 2.0".freeze) - s.rubygems_version = "3.1.6".freeze - s.summary = "A simple gem to atomically write files".freeze - - s.installed_by_version = "3.1.6" if s.respond_to? :installed_by_version - - if s.respond_to? :specification_version then - s.specification_version = 4 - end - - if s.respond_to? :add_runtime_dependency then - s.add_development_dependency(%q.freeze, ["~> 1.16"]) - s.add_development_dependency(%q.freeze, ["~> 10.0"]) - s.add_development_dependency(%q.freeze, ["~> 3.0"]) - s.add_development_dependency(%q.freeze, [">= 0"]) - else - s.add_dependency(%q.freeze, ["~> 1.16"]) - s.add_dependency(%q.freeze, ["~> 10.0"]) - s.add_dependency(%q.freeze, ["~> 3.0"]) - s.add_dependency(%q.freeze, [">= 0"]) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/specifications/claide-1.1.0.gemspec b/example/vendor/bundle/ruby/2.7.0/specifications/claide-1.1.0.gemspec deleted file mode 100644 index d5f945c..0000000 --- a/example/vendor/bundle/ruby/2.7.0/specifications/claide-1.1.0.gemspec +++ /dev/null @@ -1,20 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: claide 1.1.0 ruby lib - -Gem::Specification.new do |s| - s.name = "claide".freeze - s.version = "1.1.0" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.require_paths = ["lib".freeze] - s.authors = ["Eloy Duran".freeze, "Fabio Pelosin".freeze] - s.date = "2022-01-12" - s.email = ["eloy.de.enige@gmail.com".freeze, "fabiopelosin@gmail.com".freeze] - s.homepage = "https://github.com/CocoaPods/CLAide".freeze - s.licenses = ["MIT".freeze] - s.required_ruby_version = Gem::Requirement.new(">= 2.3.0".freeze) - s.rubygems_version = "3.1.6".freeze - s.summary = "A small command-line interface framework.".freeze - - s.installed_by_version = "3.1.6" if s.respond_to? :installed_by_version -end diff --git a/example/vendor/bundle/ruby/2.7.0/specifications/cocoapods-1.12.1.gemspec b/example/vendor/bundle/ruby/2.7.0/specifications/cocoapods-1.12.1.gemspec deleted file mode 100644 index 52d0e0d..0000000 --- a/example/vendor/bundle/ruby/2.7.0/specifications/cocoapods-1.12.1.gemspec +++ /dev/null @@ -1,71 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: cocoapods 1.12.1 ruby lib - -Gem::Specification.new do |s| - s.name = "cocoapods".freeze - s.version = "1.12.1" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.require_paths = ["lib".freeze] - s.authors = ["Eloy Duran".freeze, "Fabio Pelosin".freeze, "Kyle Fuller".freeze, "Samuel Giddins".freeze] - s.date = "2023-04-18" - s.description = "CocoaPods manages library dependencies for your Xcode project.\n\nYou specify the dependencies for your project in one easy text file. CocoaPods resolves dependencies between libraries, fetches source code for the dependencies, and creates and maintains an Xcode workspace to build your project.\n\nUltimately, the goal is to improve discoverability of, and engagement in, third party open-source libraries, by creating a more centralized ecosystem.".freeze - s.email = ["eloy.de.enige@gmail.com".freeze, "fabiopelosin@gmail.com".freeze, "kyle@fuller.li".freeze, "segiddins@segiddins.me".freeze] - s.executables = ["pod".freeze, "sandbox-pod".freeze] - s.files = ["bin/pod".freeze, "bin/sandbox-pod".freeze] - s.homepage = "https://github.com/CocoaPods/CocoaPods".freeze - s.licenses = ["MIT".freeze] - s.required_ruby_version = Gem::Requirement.new(">= 2.6".freeze) - s.rubygems_version = "3.1.6".freeze - s.summary = "The Cocoa library package manager.".freeze - - s.installed_by_version = "3.1.6" if s.respond_to? :installed_by_version - - if s.respond_to? :specification_version then - s.specification_version = 4 - end - - if s.respond_to? :add_runtime_dependency then - s.add_runtime_dependency(%q.freeze, ["= 1.12.1"]) - s.add_runtime_dependency(%q.freeze, [">= 1.0.2", "< 2.0"]) - s.add_runtime_dependency(%q.freeze, [">= 1.0.3", "< 2.0"]) - s.add_runtime_dependency(%q.freeze, [">= 1.6.0", "< 2.0"]) - s.add_runtime_dependency(%q.freeze, [">= 1.0.0", "< 2.0"]) - s.add_runtime_dependency(%q.freeze, [">= 1.0.0", "< 2.0"]) - s.add_runtime_dependency(%q.freeze, [">= 1.6.0", "< 2.0"]) - s.add_runtime_dependency(%q.freeze, [">= 1.1.0", "< 2.0"]) - s.add_runtime_dependency(%q.freeze, ["~> 0.8.0"]) - s.add_runtime_dependency(%q.freeze, [">= 1.21.0", "< 2.0"]) - s.add_runtime_dependency(%q.freeze, ["~> 3.1"]) - s.add_runtime_dependency(%q.freeze, ["~> 0.0.4"]) - s.add_runtime_dependency(%q.freeze, [">= 2.3.0", "< 3.0"]) - s.add_runtime_dependency(%q.freeze, ["~> 1.0"]) - s.add_runtime_dependency(%q.freeze, ["~> 1.0"]) - s.add_runtime_dependency(%q.freeze, [">= 2.3.0", "< 3.0"]) - s.add_runtime_dependency(%q.freeze, ["~> 2.8"]) - s.add_development_dependency(%q.freeze, ["~> 1.1"]) - s.add_development_dependency(%q.freeze, ["~> 2.0"]) - s.add_development_dependency(%q.freeze, ["~> 12.3"]) - else - s.add_dependency(%q.freeze, ["= 1.12.1"]) - s.add_dependency(%q.freeze, [">= 1.0.2", "< 2.0"]) - s.add_dependency(%q.freeze, [">= 1.0.3", "< 2.0"]) - s.add_dependency(%q.freeze, [">= 1.6.0", "< 2.0"]) - s.add_dependency(%q.freeze, [">= 1.0.0", "< 2.0"]) - s.add_dependency(%q.freeze, [">= 1.0.0", "< 2.0"]) - s.add_dependency(%q.freeze, [">= 1.6.0", "< 2.0"]) - s.add_dependency(%q.freeze, [">= 1.1.0", "< 2.0"]) - s.add_dependency(%q.freeze, ["~> 0.8.0"]) - s.add_dependency(%q.freeze, [">= 1.21.0", "< 2.0"]) - s.add_dependency(%q.freeze, ["~> 3.1"]) - s.add_dependency(%q.freeze, ["~> 0.0.4"]) - s.add_dependency(%q.freeze, [">= 2.3.0", "< 3.0"]) - s.add_dependency(%q.freeze, ["~> 1.0"]) - s.add_dependency(%q.freeze, ["~> 1.0"]) - s.add_dependency(%q.freeze, [">= 2.3.0", "< 3.0"]) - s.add_dependency(%q.freeze, ["~> 2.8"]) - s.add_dependency(%q.freeze, ["~> 1.1"]) - s.add_dependency(%q.freeze, ["~> 2.0"]) - s.add_dependency(%q.freeze, ["~> 12.3"]) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/specifications/cocoapods-core-1.12.1.gemspec b/example/vendor/bundle/ruby/2.7.0/specifications/cocoapods-core-1.12.1.gemspec deleted file mode 100644 index 79c8049..0000000 --- a/example/vendor/bundle/ruby/2.7.0/specifications/cocoapods-core-1.12.1.gemspec +++ /dev/null @@ -1,49 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: cocoapods-core 1.12.1 ruby lib - -Gem::Specification.new do |s| - s.name = "cocoapods-core".freeze - s.version = "1.12.1" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.require_paths = ["lib".freeze] - s.authors = ["Eloy Duran".freeze, "Fabio Pelosin".freeze] - s.date = "2023-04-18" - s.description = "The CocoaPods-Core gem provides support to work with the models of CocoaPods.\n\n It is intended to be used in place of the CocoaPods when the the installation of the dependencies is not needed.".freeze - s.email = ["eloy.de.enige@gmail.com".freeze, "fabiopelosin@gmail.com".freeze] - s.homepage = "https://github.com/CocoaPods/CocoaPods".freeze - s.licenses = ["MIT".freeze] - s.required_ruby_version = Gem::Requirement.new(">= 2.6".freeze) - s.rubygems_version = "3.1.6".freeze - s.summary = "The models of CocoaPods".freeze - - s.installed_by_version = "3.1.6" if s.respond_to? :installed_by_version - - if s.respond_to? :specification_version then - s.specification_version = 4 - end - - if s.respond_to? :add_runtime_dependency then - s.add_runtime_dependency(%q.freeze, [">= 5.0", "< 8"]) - s.add_runtime_dependency(%q.freeze, ["~> 1.0"]) - s.add_runtime_dependency(%q.freeze, ["~> 2.0.4"]) - s.add_runtime_dependency(%q.freeze, ["~> 1.0"]) - s.add_runtime_dependency(%q.freeze, ["~> 1.1"]) - s.add_runtime_dependency(%q.freeze, ["~> 1.0"]) - s.add_runtime_dependency(%q.freeze, ["~> 0.11"]) - s.add_runtime_dependency(%q.freeze, ["~> 2.8"]) - s.add_runtime_dependency(%q.freeze, ["~> 4.0"]) - s.add_development_dependency(%q.freeze, ["~> 1.1"]) - else - s.add_dependency(%q.freeze, [">= 5.0", "< 8"]) - s.add_dependency(%q.freeze, ["~> 1.0"]) - s.add_dependency(%q.freeze, ["~> 2.0.4"]) - s.add_dependency(%q.freeze, ["~> 1.0"]) - s.add_dependency(%q.freeze, ["~> 1.1"]) - s.add_dependency(%q.freeze, ["~> 1.0"]) - s.add_dependency(%q.freeze, ["~> 0.11"]) - s.add_dependency(%q.freeze, ["~> 2.8"]) - s.add_dependency(%q.freeze, ["~> 4.0"]) - s.add_dependency(%q.freeze, ["~> 1.1"]) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/specifications/cocoapods-deintegrate-1.0.5.gemspec b/example/vendor/bundle/ruby/2.7.0/specifications/cocoapods-deintegrate-1.0.5.gemspec deleted file mode 100644 index 8962b3b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/specifications/cocoapods-deintegrate-1.0.5.gemspec +++ /dev/null @@ -1,20 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: cocoapods-deintegrate 1.0.5 ruby lib - -Gem::Specification.new do |s| - s.name = "cocoapods-deintegrate".freeze - s.version = "1.0.5" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.require_paths = ["lib".freeze] - s.authors = ["Kyle Fuller".freeze] - s.date = "2021-08-16" - s.email = ["kyle@fuller.li".freeze] - s.homepage = "https://github.com/kylef/cocoapods-deintegrate".freeze - s.licenses = ["MIT".freeze] - s.required_ruby_version = Gem::Requirement.new(">= 2.0.0".freeze) - s.rubygems_version = "3.1.6".freeze - s.summary = "A CocoaPods plugin to remove and de-integrate CocoaPods from your project.".freeze - - s.installed_by_version = "3.1.6" if s.respond_to? :installed_by_version -end diff --git a/example/vendor/bundle/ruby/2.7.0/specifications/cocoapods-downloader-1.6.3.gemspec b/example/vendor/bundle/ruby/2.7.0/specifications/cocoapods-downloader-1.6.3.gemspec deleted file mode 100644 index 95e8651..0000000 --- a/example/vendor/bundle/ruby/2.7.0/specifications/cocoapods-downloader-1.6.3.gemspec +++ /dev/null @@ -1,20 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: cocoapods-downloader 1.6.3 ruby lib - -Gem::Specification.new do |s| - s.name = "cocoapods-downloader".freeze - s.version = "1.6.3" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.require_paths = ["lib".freeze] - s.authors = ["Eloy Duran".freeze, "Fabio Pelosin".freeze] - s.date = "2022-04-01" - s.email = ["eloy.de.enige@gmail.com".freeze, "fabiopelosin@gmail.com".freeze] - s.homepage = "https://github.com/CocoaPods/cocoapods-downloader".freeze - s.licenses = ["MIT".freeze] - s.required_ruby_version = Gem::Requirement.new(">= 2.3.3".freeze) - s.rubygems_version = "3.1.6".freeze - s.summary = "A small library for downloading files from remotes in a folder.".freeze - - s.installed_by_version = "3.1.6" if s.respond_to? :installed_by_version -end diff --git a/example/vendor/bundle/ruby/2.7.0/specifications/cocoapods-plugins-1.0.0.gemspec b/example/vendor/bundle/ruby/2.7.0/specifications/cocoapods-plugins-1.0.0.gemspec deleted file mode 100644 index 8ea5b2d..0000000 --- a/example/vendor/bundle/ruby/2.7.0/specifications/cocoapods-plugins-1.0.0.gemspec +++ /dev/null @@ -1,34 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: cocoapods-plugins 1.0.0 ruby lib - -Gem::Specification.new do |s| - s.name = "cocoapods-plugins".freeze - s.version = "1.0.0" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.require_paths = ["lib".freeze] - s.authors = ["David Grandinetti".freeze, "Olivier Halligon".freeze] - s.date = "2016-05-10" - s.description = " This CocoaPods plugin shows information about all available CocoaPods plugins\n (yes, this is very meta!).\n This CP plugin adds the \"pod plugins\" command to CocoaPods so that you can list\n all plugins (registered in the reference JSON hosted at CocoaPods/cocoapods-plugins)\n".freeze - s.homepage = "https://github.com/cocoapods/cocoapods-plugins".freeze - s.licenses = ["MIT".freeze] - s.required_ruby_version = Gem::Requirement.new(">= 2.0.0".freeze) - s.rubygems_version = "3.1.6".freeze - s.summary = "CocoaPods plugin which shows info about available CocoaPods plugins.".freeze - - s.installed_by_version = "3.1.6" if s.respond_to? :installed_by_version - - if s.respond_to? :specification_version then - s.specification_version = 4 - end - - if s.respond_to? :add_runtime_dependency then - s.add_runtime_dependency(%q.freeze, [">= 0"]) - s.add_development_dependency(%q.freeze, ["~> 1.3"]) - s.add_development_dependency(%q.freeze, [">= 0"]) - else - s.add_dependency(%q.freeze, [">= 0"]) - s.add_dependency(%q.freeze, ["~> 1.3"]) - s.add_dependency(%q.freeze, [">= 0"]) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/specifications/cocoapods-search-1.0.1.gemspec b/example/vendor/bundle/ruby/2.7.0/specifications/cocoapods-search-1.0.1.gemspec deleted file mode 100644 index 0dbe275..0000000 --- a/example/vendor/bundle/ruby/2.7.0/specifications/cocoapods-search-1.0.1.gemspec +++ /dev/null @@ -1,32 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: cocoapods-search 1.0.1 ruby lib - -Gem::Specification.new do |s| - s.name = "cocoapods-search".freeze - s.version = "1.0.1" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.require_paths = ["lib".freeze] - s.authors = ["Eloy Dur\u00E1n".freeze, "Fabio Pelosin".freeze, "Emma Koszinowski".freeze] - s.date = "2021-08-13" - s.description = "Search for pods.".freeze - s.email = ["eloy.de.enige@gmail.com".freeze, "fabiopelosin@gmail.com".freeze, "emkosz@gmail.com".freeze] - s.homepage = "https://github.com/CocoaPods/cocoapods-search".freeze - s.licenses = ["MIT".freeze] - s.rubygems_version = "3.1.6".freeze - s.summary = "Searches for pods, ignoring case, whose name matches `QUERY`. If the `--full` option is specified, this will also search in the summary and description of the pods.".freeze - - s.installed_by_version = "3.1.6" if s.respond_to? :installed_by_version - - if s.respond_to? :specification_version then - s.specification_version = 4 - end - - if s.respond_to? :add_runtime_dependency then - s.add_development_dependency(%q.freeze, ["~> 1.3"]) - s.add_development_dependency(%q.freeze, [">= 0"]) - else - s.add_dependency(%q.freeze, ["~> 1.3"]) - s.add_dependency(%q.freeze, [">= 0"]) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/specifications/cocoapods-trunk-1.6.0.gemspec b/example/vendor/bundle/ruby/2.7.0/specifications/cocoapods-trunk-1.6.0.gemspec deleted file mode 100644 index bd240b2..0000000 --- a/example/vendor/bundle/ruby/2.7.0/specifications/cocoapods-trunk-1.6.0.gemspec +++ /dev/null @@ -1,36 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: cocoapods-trunk 1.6.0 ruby lib - -Gem::Specification.new do |s| - s.name = "cocoapods-trunk".freeze - s.version = "1.6.0" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.require_paths = ["lib".freeze] - s.authors = ["Eloy Dur\u00E1n".freeze] - s.date = "2021-09-01" - s.email = ["eloy.de.enige@gmail.com".freeze] - s.homepage = "https://github.com/CocoaPods/cocoapods-trunk".freeze - s.licenses = ["MIT".freeze] - s.required_ruby_version = Gem::Requirement.new(">= 2.0.0".freeze) - s.rubygems_version = "3.1.6".freeze - s.summary = "Interact with trunk.cocoapods.org".freeze - - s.installed_by_version = "3.1.6" if s.respond_to? :installed_by_version - - if s.respond_to? :specification_version then - s.specification_version = 4 - end - - if s.respond_to? :add_runtime_dependency then - s.add_runtime_dependency(%q.freeze, [">= 0.8", "< 2.0"]) - s.add_runtime_dependency(%q.freeze, ["~> 0.11"]) - s.add_development_dependency(%q.freeze, ["~> 1.3"]) - s.add_development_dependency(%q.freeze, ["~> 10.0"]) - else - s.add_dependency(%q.freeze, [">= 0.8", "< 2.0"]) - s.add_dependency(%q.freeze, ["~> 0.11"]) - s.add_dependency(%q.freeze, ["~> 1.3"]) - s.add_dependency(%q.freeze, ["~> 10.0"]) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/specifications/cocoapods-try-1.2.0.gemspec b/example/vendor/bundle/ruby/2.7.0/specifications/cocoapods-try-1.2.0.gemspec deleted file mode 100644 index 6e9b18e..0000000 --- a/example/vendor/bundle/ruby/2.7.0/specifications/cocoapods-try-1.2.0.gemspec +++ /dev/null @@ -1,30 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: cocoapods-try 1.2.0 ruby lib - -Gem::Specification.new do |s| - s.name = "cocoapods-try".freeze - s.version = "1.2.0" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.require_paths = ["lib".freeze] - s.authors = ["Fabio Pelosin".freeze] - s.date = "2020-04-20" - s.homepage = "https://github.com/cocoapods/cocoapods-try".freeze - s.licenses = ["MIT".freeze] - s.rubygems_version = "3.1.6".freeze - s.summary = "CocoaPods plugin which allows to quickly try the demo project of a Pod.".freeze - - s.installed_by_version = "3.1.6" if s.respond_to? :installed_by_version - - if s.respond_to? :specification_version then - s.specification_version = 4 - end - - if s.respond_to? :add_runtime_dependency then - s.add_development_dependency(%q.freeze, ["~> 1.3"]) - s.add_development_dependency(%q.freeze, ["~> 10.0"]) - else - s.add_dependency(%q.freeze, ["~> 1.3"]) - s.add_dependency(%q.freeze, ["~> 10.0"]) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/specifications/colored2-3.1.2.gemspec b/example/vendor/bundle/ruby/2.7.0/specifications/colored2-3.1.2.gemspec deleted file mode 100644 index 3e73a60..0000000 --- a/example/vendor/bundle/ruby/2.7.0/specifications/colored2-3.1.2.gemspec +++ /dev/null @@ -1,35 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: colored2 3.1.2 ruby lib - -Gem::Specification.new do |s| - s.name = "colored2".freeze - s.version = "3.1.2" - - s.required_rubygems_version = Gem::Requirement.new(">= 1.3.6".freeze) if s.respond_to? :required_rubygems_version= - s.require_paths = ["lib".freeze] - s.authors = ["Chris Wanstrath".freeze, "Konstantin Gredeskoul".freeze] - s.date = "2017-02-14" - s.description = "This is a heavily modified fork of http://github.com/defunkt/colored gem, with many\nsensible pull requests combined. Since the authors of the original gem no longer support it,\nthis might, perhaps, be considered a good alternative.\n\nSimple gem that adds various color methods to String class, and can be used as follows:\n\n require 'colored2'\n\n puts 'this is red'.red\n puts 'this is red with a yellow background'.red.on.yellow\n puts 'this is red with and italic'.red.italic\n puts 'this is green bold'.green.bold << ' and regular'.green\n puts 'this is really bold blue on white but reversed'.bold.blue.on.white.reversed\n puts 'this is regular, but '.red! << 'this is red '.yellow! << ' and yellow.'.no_color!\n puts ('this is regular, but '.red! do\n 'this is red '.yellow! do\n ' and yellow.'.no_color!\n end\n end)\n\n".freeze - s.email = "kigster@gmail.com".freeze - s.homepage = "http://github.com/kigster/colored2".freeze - s.licenses = ["MIT".freeze] - s.required_ruby_version = Gem::Requirement.new(">= 2.0.0".freeze) - s.rubygems_version = "3.1.6".freeze - s.summary = "Add even more color to your life.".freeze - - s.installed_by_version = "3.1.6" if s.respond_to? :installed_by_version - - if s.respond_to? :specification_version then - s.specification_version = 4 - end - - if s.respond_to? :add_runtime_dependency then - s.add_development_dependency(%q.freeze, ["~> 10.0"]) - s.add_development_dependency(%q.freeze, ["~> 3.4"]) - s.add_development_dependency(%q.freeze, [">= 0"]) - else - s.add_dependency(%q.freeze, ["~> 10.0"]) - s.add_dependency(%q.freeze, ["~> 3.4"]) - s.add_dependency(%q.freeze, [">= 0"]) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/specifications/concurrent-ruby-1.2.2.gemspec b/example/vendor/bundle/ruby/2.7.0/specifications/concurrent-ruby-1.2.2.gemspec deleted file mode 100644 index eeb1d08..0000000 --- a/example/vendor/bundle/ruby/2.7.0/specifications/concurrent-ruby-1.2.2.gemspec +++ /dev/null @@ -1,24 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: concurrent-ruby 1.2.2 ruby lib/concurrent-ruby - -Gem::Specification.new do |s| - s.name = "concurrent-ruby".freeze - s.version = "1.2.2" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.metadata = { "changelog_uri" => "https://github.com/ruby-concurrency/concurrent-ruby/blob/master/CHANGELOG.md", "source_code_uri" => "https://github.com/ruby-concurrency/concurrent-ruby" } if s.respond_to? :metadata= - s.require_paths = ["lib/concurrent-ruby".freeze] - s.authors = ["Jerry D'Antonio".freeze, "Petr Chalupa".freeze, "The Ruby Concurrency Team".freeze] - s.date = "2023-02-24" - s.description = "Modern concurrency tools including agents, futures, promises, thread pools, actors, supervisors, and more.\nInspired by Erlang, Clojure, Go, JavaScript, actors, and classic concurrency patterns.\n".freeze - s.email = "concurrent-ruby@googlegroups.com".freeze - s.extra_rdoc_files = ["README.md".freeze, "LICENSE.txt".freeze, "CHANGELOG.md".freeze] - s.files = ["CHANGELOG.md".freeze, "LICENSE.txt".freeze, "README.md".freeze] - s.homepage = "http://www.concurrent-ruby.com".freeze - s.licenses = ["MIT".freeze] - s.required_ruby_version = Gem::Requirement.new(">= 2.3".freeze) - s.rubygems_version = "3.1.6".freeze - s.summary = "Modern concurrency tools for Ruby. Inspired by Erlang, Clojure, Scala, Haskell, F#, C#, Java, and classic concurrency patterns.".freeze - - s.installed_by_version = "3.1.6" if s.respond_to? :installed_by_version -end diff --git a/example/vendor/bundle/ruby/2.7.0/specifications/escape-0.0.4.gemspec b/example/vendor/bundle/ruby/2.7.0/specifications/escape-0.0.4.gemspec deleted file mode 100644 index f02a927..0000000 --- a/example/vendor/bundle/ruby/2.7.0/specifications/escape-0.0.4.gemspec +++ /dev/null @@ -1,22 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: escape 0.0.4 ruby lib - -Gem::Specification.new do |s| - s.name = "escape".freeze - s.version = "0.0.4" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.require_paths = ["lib".freeze] - s.authors = ["Tanaka Akira".freeze] - s.date = "2007-06-29" - s.description = "...".freeze - s.extra_rdoc_files = ["Readme".freeze] - s.files = ["Readme".freeze] - s.homepage = "http://www.a-k-r.org/escape/".freeze - s.rdoc_options = ["--title".freeze, "escape".freeze, "--main".freeze, "Readme".freeze, "--line-numbers".freeze] - s.required_ruby_version = Gem::Requirement.new("> 0.0.0".freeze) - s.rubygems_version = "3.1.6".freeze - s.summary = "...".freeze - - s.installed_by_version = "3.1.6" if s.respond_to? :installed_by_version -end diff --git a/example/vendor/bundle/ruby/2.7.0/specifications/ethon-0.16.0.gemspec b/example/vendor/bundle/ruby/2.7.0/specifications/ethon-0.16.0.gemspec deleted file mode 100644 index 433979b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/specifications/ethon-0.16.0.gemspec +++ /dev/null @@ -1,30 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: ethon 0.16.0 ruby lib - -Gem::Specification.new do |s| - s.name = "ethon".freeze - s.version = "0.16.0" - - s.required_rubygems_version = Gem::Requirement.new(">= 1.3.6".freeze) if s.respond_to? :required_rubygems_version= - s.require_paths = ["lib".freeze] - s.authors = ["Hans Hasselberg".freeze] - s.date = "2022-11-04" - s.description = "Very lightweight libcurl wrapper.".freeze - s.email = ["me@hans.io".freeze] - s.homepage = "https://github.com/typhoeus/ethon".freeze - s.licenses = ["MIT".freeze] - s.rubygems_version = "3.1.6".freeze - s.summary = "Libcurl wrapper.".freeze - - s.installed_by_version = "3.1.6" if s.respond_to? :installed_by_version - - if s.respond_to? :specification_version then - s.specification_version = 4 - end - - if s.respond_to? :add_runtime_dependency then - s.add_runtime_dependency(%q.freeze, [">= 1.15.0"]) - else - s.add_dependency(%q.freeze, [">= 1.15.0"]) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/specifications/ffi-1.15.5.gemspec b/example/vendor/bundle/ruby/2.7.0/specifications/ffi-1.15.5.gemspec deleted file mode 100644 index 1239544..0000000 --- a/example/vendor/bundle/ruby/2.7.0/specifications/ffi-1.15.5.gemspec +++ /dev/null @@ -1,42 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: ffi 1.15.5 ruby lib -# stub: ext/ffi_c/extconf.rb - -Gem::Specification.new do |s| - s.name = "ffi".freeze - s.version = "1.15.5" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.metadata = { "bug_tracker_uri" => "https://github.com/ffi/ffi/issues", "changelog_uri" => "https://github.com/ffi/ffi/blob/master/CHANGELOG.md", "documentation_uri" => "https://github.com/ffi/ffi/wiki", "mailing_list_uri" => "http://groups.google.com/group/ruby-ffi", "source_code_uri" => "https://github.com/ffi/ffi/", "wiki_uri" => "https://github.com/ffi/ffi/wiki" } if s.respond_to? :metadata= - s.require_paths = ["lib".freeze] - s.authors = ["Wayne Meissner".freeze] - s.date = "2022-01-10" - s.description = "Ruby FFI library".freeze - s.email = "wmeissner@gmail.com".freeze - s.extensions = ["ext/ffi_c/extconf.rb".freeze] - s.files = ["ext/ffi_c/extconf.rb".freeze] - s.homepage = "https://github.com/ffi/ffi/wiki".freeze - s.licenses = ["BSD-3-Clause".freeze] - s.rdoc_options = ["--exclude=ext/ffi_c/.*\\.o$".freeze, "--exclude=ffi_c\\.(bundle|so)$".freeze] - s.required_ruby_version = Gem::Requirement.new(">= 2.3".freeze) - s.rubygems_version = "3.1.6".freeze - s.summary = "Ruby FFI".freeze - - s.installed_by_version = "3.1.6" if s.respond_to? :installed_by_version - - if s.respond_to? :specification_version then - s.specification_version = 4 - end - - if s.respond_to? :add_runtime_dependency then - s.add_development_dependency(%q.freeze, ["~> 13.0"]) - s.add_development_dependency(%q.freeze, ["~> 1.0"]) - s.add_development_dependency(%q.freeze, ["~> 1.0"]) - s.add_development_dependency(%q.freeze, ["~> 2.14.1"]) - else - s.add_dependency(%q.freeze, ["~> 13.0"]) - s.add_dependency(%q.freeze, ["~> 1.0"]) - s.add_dependency(%q.freeze, ["~> 1.0"]) - s.add_dependency(%q.freeze, ["~> 2.14.1"]) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/specifications/fourflusher-2.3.1.gemspec b/example/vendor/bundle/ruby/2.7.0/specifications/fourflusher-2.3.1.gemspec deleted file mode 100644 index 33e4306..0000000 --- a/example/vendor/bundle/ruby/2.7.0/specifications/fourflusher-2.3.1.gemspec +++ /dev/null @@ -1,36 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: fourflusher 2.3.1 ruby lib - -Gem::Specification.new do |s| - s.name = "fourflusher".freeze - s.version = "2.3.1" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.require_paths = ["lib".freeze] - s.authors = ["Boris Bu\u0308gling".freeze] - s.bindir = "exe".freeze - s.date = "2019-06-18" - s.email = ["boris@icculus.org".freeze] - s.homepage = "https://github.com/neonichu/fourflusher".freeze - s.licenses = ["MIT".freeze] - s.rubygems_version = "3.1.6".freeze - s.summary = "A library for interacting with Xcode simulators.".freeze - - s.installed_by_version = "3.1.6" if s.respond_to? :installed_by_version - - if s.respond_to? :specification_version then - s.specification_version = 4 - end - - if s.respond_to? :add_runtime_dependency then - s.add_development_dependency(%q.freeze, ["~> 1.11"]) - s.add_development_dependency(%q.freeze, ["~> 10.0"]) - s.add_development_dependency(%q.freeze, ["~> 2"]) - s.add_development_dependency(%q.freeze, ["~> 0.35.0"]) - else - s.add_dependency(%q.freeze, ["~> 1.11"]) - s.add_dependency(%q.freeze, ["~> 10.0"]) - s.add_dependency(%q.freeze, ["~> 2"]) - s.add_dependency(%q.freeze, ["~> 0.35.0"]) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/specifications/fuzzy_match-2.0.4.gemspec b/example/vendor/bundle/ruby/2.7.0/specifications/fuzzy_match-2.0.4.gemspec deleted file mode 100644 index e6c4fcd..0000000 --- a/example/vendor/bundle/ruby/2.7.0/specifications/fuzzy_match-2.0.4.gemspec +++ /dev/null @@ -1,51 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: fuzzy_match 2.0.4 ruby lib - -Gem::Specification.new do |s| - s.name = "fuzzy_match".freeze - s.version = "2.0.4" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.require_paths = ["lib".freeze] - s.authors = ["Seamus Abshere".freeze] - s.date = "2013-09-19" - s.description = "Find a needle in a haystack using string similarity and (optionally) regexp rules. Replaces loose_tight_dictionary.".freeze - s.email = ["seamus@abshere.net".freeze] - s.executables = ["fuzzy_match".freeze] - s.files = ["bin/fuzzy_match".freeze] - s.homepage = "https://github.com/seamusabshere/fuzzy_match".freeze - s.rubygems_version = "3.1.6".freeze - s.summary = "Find a needle in a haystack using string similarity and (optionally) regexp rules. Replaces loose_tight_dictionary.".freeze - - s.installed_by_version = "3.1.6" if s.respond_to? :installed_by_version - - if s.respond_to? :specification_version then - s.specification_version = 3 - end - - if s.respond_to? :add_runtime_dependency then - s.add_development_dependency(%q.freeze, [">= 0.4.0"]) - s.add_development_dependency(%q.freeze, [">= 0"]) - s.add_development_dependency(%q.freeze, [">= 0"]) - s.add_development_dependency(%q.freeze, [">= 0"]) - s.add_development_dependency(%q.freeze, [">= 0"]) - s.add_development_dependency(%q.freeze, [">= 3"]) - s.add_development_dependency(%q.freeze, [">= 0"]) - s.add_development_dependency(%q.freeze, [">= 0"]) - s.add_development_dependency(%q.freeze, [">= 0"]) - s.add_development_dependency(%q.freeze, [">= 0"]) - s.add_development_dependency(%q.freeze, [">= 0"]) - else - s.add_dependency(%q.freeze, [">= 0.4.0"]) - s.add_dependency(%q.freeze, [">= 0"]) - s.add_dependency(%q.freeze, [">= 0"]) - s.add_dependency(%q.freeze, [">= 0"]) - s.add_dependency(%q.freeze, [">= 0"]) - s.add_dependency(%q.freeze, [">= 3"]) - s.add_dependency(%q.freeze, [">= 0"]) - s.add_dependency(%q.freeze, [">= 0"]) - s.add_dependency(%q.freeze, [">= 0"]) - s.add_dependency(%q.freeze, [">= 0"]) - s.add_dependency(%q.freeze, [">= 0"]) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/specifications/gh_inspector-1.1.3.gemspec b/example/vendor/bundle/ruby/2.7.0/specifications/gh_inspector-1.1.3.gemspec deleted file mode 100644 index 9b6185d..0000000 --- a/example/vendor/bundle/ruby/2.7.0/specifications/gh_inspector-1.1.3.gemspec +++ /dev/null @@ -1,40 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: gh_inspector 1.1.3 ruby lib - -Gem::Specification.new do |s| - s.name = "gh_inspector".freeze - s.version = "1.1.3" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.require_paths = ["lib".freeze] - s.authors = ["Orta Therox".freeze, "Felix Krause".freeze] - s.date = "2018-03-06" - s.description = "Search through GitHub issues for your project for existing issues about a Ruby Error.".freeze - s.email = ["orta.therox@gmail.com".freeze, "gh_inspector@krausefx.com".freeze] - s.homepage = "https://github.com/orta/gh_inspector".freeze - s.licenses = ["MIT".freeze] - s.rubygems_version = "3.1.6".freeze - s.summary = "Search through GitHub issues for your project for existing issues about a Ruby Error.".freeze - - s.installed_by_version = "3.1.6" if s.respond_to? :installed_by_version - - if s.respond_to? :specification_version then - s.specification_version = 4 - end - - if s.respond_to? :add_runtime_dependency then - s.add_development_dependency(%q.freeze, ["~> 1.11"]) - s.add_development_dependency(%q.freeze, ["~> 0.6"]) - s.add_development_dependency(%q.freeze, ["~> 10.0"]) - s.add_development_dependency(%q.freeze, ["~> 3.0"]) - s.add_development_dependency(%q.freeze, ["~> 0", "> 0"]) - s.add_development_dependency(%q.freeze, ["~> 0", "> 0"]) - else - s.add_dependency(%q.freeze, ["~> 1.11"]) - s.add_dependency(%q.freeze, ["~> 0.6"]) - s.add_dependency(%q.freeze, ["~> 10.0"]) - s.add_dependency(%q.freeze, ["~> 3.0"]) - s.add_dependency(%q.freeze, ["~> 0", "> 0"]) - s.add_dependency(%q.freeze, ["~> 0", "> 0"]) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/specifications/httpclient-2.8.3.gemspec b/example/vendor/bundle/ruby/2.7.0/specifications/httpclient-2.8.3.gemspec deleted file mode 100644 index 33cfeab..0000000 --- a/example/vendor/bundle/ruby/2.7.0/specifications/httpclient-2.8.3.gemspec +++ /dev/null @@ -1,21 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: httpclient 2.8.3 ruby lib - -Gem::Specification.new do |s| - s.name = "httpclient".freeze - s.version = "2.8.3" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.require_paths = ["lib".freeze] - s.authors = ["Hiroshi Nakamura".freeze] - s.date = "2016-12-09" - s.email = "nahi@ruby-lang.org".freeze - s.executables = ["httpclient".freeze] - s.files = ["bin/httpclient".freeze] - s.homepage = "https://github.com/nahi/httpclient".freeze - s.licenses = ["ruby".freeze] - s.rubygems_version = "3.1.6".freeze - s.summary = "gives something like the functionality of libwww-perl (LWP) in Ruby".freeze - - s.installed_by_version = "3.1.6" if s.respond_to? :installed_by_version -end diff --git a/example/vendor/bundle/ruby/2.7.0/specifications/i18n-1.13.0.gemspec b/example/vendor/bundle/ruby/2.7.0/specifications/i18n-1.13.0.gemspec deleted file mode 100644 index 3a00bc9..0000000 --- a/example/vendor/bundle/ruby/2.7.0/specifications/i18n-1.13.0.gemspec +++ /dev/null @@ -1,32 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: i18n 1.13.0 ruby lib - -Gem::Specification.new do |s| - s.name = "i18n".freeze - s.version = "1.13.0" - - s.required_rubygems_version = Gem::Requirement.new(">= 1.3.5".freeze) if s.respond_to? :required_rubygems_version= - s.metadata = { "bug_tracker_uri" => "https://github.com/ruby-i18n/i18n/issues", "changelog_uri" => "https://github.com/ruby-i18n/i18n/releases", "documentation_uri" => "https://guides.rubyonrails.org/i18n.html", "source_code_uri" => "https://github.com/ruby-i18n/i18n" } if s.respond_to? :metadata= - s.require_paths = ["lib".freeze] - s.authors = ["Sven Fuchs".freeze, "Joshua Harvey".freeze, "Matt Aimonetti".freeze, "Stephan Soller".freeze, "Saimon Moore".freeze, "Ryan Bigg".freeze] - s.date = "2023-04-26" - s.description = "New wave Internationalization support for Ruby.".freeze - s.email = "rails-i18n@googlegroups.com".freeze - s.homepage = "https://github.com/ruby-i18n/i18n".freeze - s.licenses = ["MIT".freeze] - s.required_ruby_version = Gem::Requirement.new(">= 2.3.0".freeze) - s.rubygems_version = "3.1.6".freeze - s.summary = "New wave Internationalization support for Ruby".freeze - - s.installed_by_version = "3.1.6" if s.respond_to? :installed_by_version - - if s.respond_to? :specification_version then - s.specification_version = 4 - end - - if s.respond_to? :add_runtime_dependency then - s.add_runtime_dependency(%q.freeze, ["~> 1.0"]) - else - s.add_dependency(%q.freeze, ["~> 1.0"]) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/specifications/json-2.6.3.gemspec b/example/vendor/bundle/ruby/2.7.0/specifications/json-2.6.3.gemspec deleted file mode 100644 index d41efd4bfeecb9a7d47d32841424e5199b3012b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1720 zcmcgsU2oGc6y-U;;>vqrh&Wv*CRC||X>xiCJt1+hHq=|Bmf6g>)_2 z6H*^i-*Z3Dx%U9#XEC76Rl#L7gU*)mOaB%ffU#XRgRe$On9>t^47$r!(C}U!eVm7;OG3O=EndM4SiMLQFxHtC^fT5BJ zggFqOo6u4t{=i`Pj@mf9w}p~P6rMGH>$t`u^&M0wO!@~HvMqanKxuuhr{r`FlOggU z@X{sKXj&zU)T&o7+Z%Bn5(>1eV3xT;eget5Dz%#BH>lH2a{}{IAhorvnI%cZZQW%w zS0X7JrFlP4ZcK-UJO`53Ojg*a>ang_qq0OWW8J9F-=1AvF0QF4e5gX@oo_MBbR5nV z60*~EIb8L1IG2RW0`F*TMdO3iN?^+>e4M}cFsjozrcPp8PJ7$;Ubp;)k8|vWCmu`S z*AAWrB6?cZtfeipwQ<~hCQi)*&0hj@th2S!z45~H!6aO0CU3?tM{ZEybTXaBN7H!n zf&}*hO|E(CMe9ZQspbaUkHP!vk5|A&+u())VBWCwOXb!CWl%1ca88F@AtVaM8y_qX z^tyF>N(&rA2KT=1(bDZ&%fZ==d4zqipnHJpRUNGT^}h8HT}2x2VwhB`{mqT3BREa4o<^!N8He?qjKD5n1%{+=;sl~mfL2-o@;iO zFiNF^E{0$Z7ROEon`7r5_Dptkm>zTHru2A7a~Slt<3^HWdPGkKSU{Oh2&PwlSfPV= hV`*=9(BEM$jb%;a4so{ntG0Fc9qYTxAwpS1zX3s)M= 0".freeze) if s.respond_to? :required_rubygems_version= - s.metadata = { "bug_tracker_uri" => "https://github.com/seattlerb/minitest/issues", "homepage_uri" => "https://github.com/seattlerb/minitest" } if s.respond_to? :metadata= - s.require_paths = ["lib".freeze] - s.authors = ["Ryan Davis".freeze] - s.cert_chain = ["-----BEGIN CERTIFICATE-----\nMIIDPjCCAiagAwIBAgIBBzANBgkqhkiG9w0BAQsFADBFMRMwEQYDVQQDDApyeWFu\nZC1ydWJ5MRkwFwYKCZImiZPyLGQBGRYJemVuc3BpZGVyMRMwEQYKCZImiZPyLGQB\nGRYDY29tMB4XDTIzMDEwMTA3NTExN1oXDTI0MDEwMTA3NTExN1owRTETMBEGA1UE\nAwwKcnlhbmQtcnVieTEZMBcGCgmSJomT8ixkARkWCXplbnNwaWRlcjETMBEGCgmS\nJomT8ixkARkWA2NvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALda\nb9DCgK+627gPJkB6XfjZ1itoOQvpqH1EXScSaba9/S2VF22VYQbXU1xQXL/WzCkx\ntaCPaLmfYIaFcHHCSY4hYDJijRQkLxPeB3xbOfzfLoBDbjvx5JxgJxUjmGa7xhcT\noOvjtt5P8+GSK9zLzxQP0gVLS/D0FmoE44XuDr3iQkVS2ujU5zZL84mMNqNB1znh\nGiadM9GHRaDiaxuX0cIUBj19T01mVE2iymf9I6bEsiayK/n6QujtyCbTWsAS9Rqt\nqhtV7HJxNKuPj/JFH0D2cswvzznE/a5FOYO68g+YCuFi5L8wZuuM8zzdwjrWHqSV\ngBEfoTEGr7Zii72cx+sCAwEAAaM5MDcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAw\nHQYDVR0OBBYEFEfFe9md/r/tj/Wmwpy+MI8d9k/hMA0GCSqGSIb3DQEBCwUAA4IB\nAQAkg3y+PBnBAPWdxxITm5sPHqdWQgSyCpRA20o4LTuWr8BWhSXBkfQNa7cY6fOn\nxyM34VPzBFbExv6XOGDfOMFBVaYTHuN9peC/5/umL7kLl+nflXzL2QA7K6LYj5Bg\nsM574Onr0dZDM6Vn69bzQ7rBIFDfK/OhlPzqKZad4nsdcsVH8ODCiT+ATMIZyz5K\nWCnNtqlyiWXI8tdTpahDgcUwfcN/oN7v4K8iU5IbLJX6HQ5DKgmKjfb6XyMth16k\nROfWo9Uyp8ba/j9eVG14KkYRaLydAY1MNQk2yd3R5CGfeOpD1kttxjoypoUJ2dOG\nnsNBRuQJ1UfiCG97a6DNm+Fr\n-----END CERTIFICATE-----\n".freeze] - s.date = "2023-03-04" - s.description = "minitest provides a complete suite of testing facilities supporting\nTDD, BDD, mocking, and benchmarking.\n\n \"I had a class with Jim Weirich on testing last week and we were\n allowed to choose our testing frameworks. Kirk Haines and I were\n paired up and we cracked open the code for a few test\n frameworks...\n\n I MUST say that minitest is *very* readable / understandable\n compared to the 'other two' options we looked at. Nicely done and\n thank you for helping us keep our mental sanity.\"\n\n -- Wayne E. Seguin\n\nminitest/test is a small and incredibly fast unit testing framework.\nIt provides a rich set of assertions to make your tests clean and\nreadable.\n\nminitest/spec is a functionally complete spec engine. It hooks onto\nminitest/test and seamlessly bridges test assertions over to spec\nexpectations.\n\nminitest/benchmark is an awesome way to assert the performance of your\nalgorithms in a repeatable manner. Now you can assert that your newb\nco-worker doesn't replace your linear algorithm with an exponential\none!\n\nminitest/mock by Steven Baker, is a beautifully tiny mock (and stub)\nobject framework.\n\nminitest/pride shows pride in testing and adds coloring to your test\noutput. I guess it is an example of how to write IO pipes too. :P\n\nminitest/test is meant to have a clean implementation for language\nimplementors that need a minimal set of methods to bootstrap a working\ntest suite. For example, there is no magic involved for test-case\ndiscovery.\n\n \"Again, I can't praise enough the idea of a testing/specing\n framework that I can actually read in full in one sitting!\"\n\n -- Piotr Szotkowski\n\nComparing to rspec:\n\n rspec is a testing DSL. minitest is ruby.\n\n -- Adam Hawkins, \"Bow Before MiniTest\"\n\nminitest doesn't reinvent anything that ruby already provides, like:\nclasses, modules, inheritance, methods. This means you only have to\nlearn ruby to use minitest and all of your regular OO practices like\nextract-method refactorings still apply.".freeze - s.email = ["ryand-ruby@zenspider.com".freeze] - s.extra_rdoc_files = ["History.rdoc".freeze, "Manifest.txt".freeze, "README.rdoc".freeze] - s.files = ["History.rdoc".freeze, "Manifest.txt".freeze, "README.rdoc".freeze] - s.homepage = "https://github.com/seattlerb/minitest".freeze - s.licenses = ["MIT".freeze] - s.rdoc_options = ["--main".freeze, "README.rdoc".freeze] - s.required_ruby_version = Gem::Requirement.new([">= 2.6".freeze, "< 4.0".freeze]) - s.rubygems_version = "3.1.6".freeze - s.summary = "minitest provides a complete suite of testing facilities supporting TDD, BDD, mocking, and benchmarking".freeze - - s.installed_by_version = "3.1.6" if s.respond_to? :installed_by_version - - if s.respond_to? :specification_version then - s.specification_version = 4 - end - - if s.respond_to? :add_runtime_dependency then - s.add_development_dependency(%q.freeze, [">= 4.0", "< 7"]) - s.add_development_dependency(%q.freeze, ["~> 4.0"]) - else - s.add_dependency(%q.freeze, [">= 4.0", "< 7"]) - s.add_dependency(%q.freeze, ["~> 4.0"]) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/specifications/molinillo-0.8.0.gemspec b/example/vendor/bundle/ruby/2.7.0/specifications/molinillo-0.8.0.gemspec deleted file mode 100644 index 5155449..0000000 --- a/example/vendor/bundle/ruby/2.7.0/specifications/molinillo-0.8.0.gemspec +++ /dev/null @@ -1,30 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: molinillo 0.8.0 ruby lib - -Gem::Specification.new do |s| - s.name = "molinillo".freeze - s.version = "0.8.0" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.require_paths = ["lib".freeze] - s.authors = ["Samuel E. Giddins".freeze] - s.date = "2021-08-09" - s.email = ["segiddins@segiddins.me".freeze] - s.homepage = "https://github.com/CocoaPods/Molinillo".freeze - s.licenses = ["MIT".freeze] - s.required_ruby_version = Gem::Requirement.new(">= 2.3.0".freeze) - s.rubygems_version = "3.1.6".freeze - s.summary = "Provides support for dependency resolution".freeze - - s.installed_by_version = "3.1.6" if s.respond_to? :installed_by_version - - if s.respond_to? :specification_version then - s.specification_version = 4 - end - - if s.respond_to? :add_runtime_dependency then - s.add_development_dependency(%q.freeze, [">= 0"]) - else - s.add_dependency(%q.freeze, [">= 0"]) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/specifications/nanaimo-0.3.0.gemspec b/example/vendor/bundle/ruby/2.7.0/specifications/nanaimo-0.3.0.gemspec deleted file mode 100644 index 049b758..0000000 --- a/example/vendor/bundle/ruby/2.7.0/specifications/nanaimo-0.3.0.gemspec +++ /dev/null @@ -1,34 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: nanaimo 0.3.0 ruby lib - -Gem::Specification.new do |s| - s.name = "nanaimo".freeze - s.version = "0.3.0" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.require_paths = ["lib".freeze] - s.authors = ["Danielle Tomlinson".freeze, "Samuel Giddins".freeze] - s.bindir = "exe".freeze - s.date = "2020-07-17" - s.email = ["dan@tomlinson.io".freeze, "segiddins@segiddins.me".freeze] - s.homepage = "https://github.com/CocoaPods/Nanaimo".freeze - s.licenses = ["MIT".freeze] - s.rubygems_version = "3.1.6".freeze - s.summary = "A library for (de)serialization of ASCII Plists.".freeze - - s.installed_by_version = "3.1.6" if s.respond_to? :installed_by_version - - if s.respond_to? :specification_version then - s.specification_version = 4 - end - - if s.respond_to? :add_runtime_dependency then - s.add_development_dependency(%q.freeze, ["~> 1.12"]) - s.add_development_dependency(%q.freeze, ["~> 12.3"]) - s.add_development_dependency(%q.freeze, ["~> 3.0"]) - else - s.add_dependency(%q.freeze, ["~> 1.12"]) - s.add_dependency(%q.freeze, ["~> 12.3"]) - s.add_dependency(%q.freeze, ["~> 3.0"]) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/specifications/nap-1.1.0.gemspec b/example/vendor/bundle/ruby/2.7.0/specifications/nap-1.1.0.gemspec deleted file mode 100644 index 89cd539..0000000 --- a/example/vendor/bundle/ruby/2.7.0/specifications/nap-1.1.0.gemspec +++ /dev/null @@ -1,35 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: nap 1.1.0 ruby lib - -Gem::Specification.new do |s| - s.name = "nap".freeze - s.version = "1.1.0" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.require_paths = ["lib".freeze] - s.authors = ["Manfred Stienstra".freeze] - s.date = "2016-01-29" - s.description = " Nap is a really simple REST library. It allows you to perform HTTP requests\n with minimal amounts of code.\n".freeze - s.email = "manfred@fngtps.com".freeze - s.extra_rdoc_files = ["README.md".freeze, "LICENSE".freeze] - s.files = ["LICENSE".freeze, "README.md".freeze] - s.homepage = "https://github.com/Fingertips/nap".freeze - s.licenses = ["MIT".freeze] - s.rdoc_options = ["--charset=utf-8".freeze] - s.rubygems_version = "3.1.6".freeze - s.summary = "Nap is a really simple REST library.".freeze - - s.installed_by_version = "3.1.6" if s.respond_to? :installed_by_version - - if s.respond_to? :specification_version then - s.specification_version = 4 - end - - if s.respond_to? :add_runtime_dependency then - s.add_development_dependency(%q.freeze, ["~> 10"]) - s.add_development_dependency(%q.freeze, ["~> 0.5"]) - else - s.add_dependency(%q.freeze, ["~> 10"]) - s.add_dependency(%q.freeze, ["~> 0.5"]) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/specifications/netrc-0.11.0.gemspec b/example/vendor/bundle/ruby/2.7.0/specifications/netrc-0.11.0.gemspec deleted file mode 100644 index 6bfecfb..0000000 --- a/example/vendor/bundle/ruby/2.7.0/specifications/netrc-0.11.0.gemspec +++ /dev/null @@ -1,30 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: netrc 0.11.0 ruby lib - -Gem::Specification.new do |s| - s.name = "netrc".freeze - s.version = "0.11.0" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.require_paths = ["lib".freeze] - s.authors = ["Keith Rarick".freeze, "geemus (Wesley Beary)".freeze] - s.date = "2015-10-29" - s.description = "This library can read and update netrc files, preserving formatting including comments and whitespace.".freeze - s.email = "geemus@gmail.com".freeze - s.homepage = "https://github.com/geemus/netrc".freeze - s.licenses = ["MIT".freeze] - s.rubygems_version = "3.1.6".freeze - s.summary = "Library to read and write netrc files.".freeze - - s.installed_by_version = "3.1.6" if s.respond_to? :installed_by_version - - if s.respond_to? :specification_version then - s.specification_version = 4 - end - - if s.respond_to? :add_runtime_dependency then - s.add_development_dependency(%q.freeze, [">= 0"]) - else - s.add_dependency(%q.freeze, [">= 0"]) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/specifications/public_suffix-4.0.7.gemspec b/example/vendor/bundle/ruby/2.7.0/specifications/public_suffix-4.0.7.gemspec deleted file mode 100644 index 0a29f83..0000000 --- a/example/vendor/bundle/ruby/2.7.0/specifications/public_suffix-4.0.7.gemspec +++ /dev/null @@ -1,24 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: public_suffix 4.0.7 ruby lib - -Gem::Specification.new do |s| - s.name = "public_suffix".freeze - s.version = "4.0.7" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.metadata = { "bug_tracker_uri" => "https://github.com/weppos/publicsuffix-ruby/issues", "changelog_uri" => "https://github.com/weppos/publicsuffix-ruby/blob/master/CHANGELOG.md", "documentation_uri" => "https://rubydoc.info/gems/public_suffix/4.0.7", "homepage_uri" => "https://simonecarletti.com/code/publicsuffix-ruby", "source_code_uri" => "https://github.com/weppos/publicsuffix-ruby/tree/v4.0.7" } if s.respond_to? :metadata= - s.require_paths = ["lib".freeze] - s.authors = ["Simone Carletti".freeze] - s.date = "2022-04-12" - s.description = "PublicSuffix can parse and decompose a domain name into top level domain, domain and subdomains.".freeze - s.email = ["weppos@weppos.net".freeze] - s.extra_rdoc_files = ["LICENSE.txt".freeze] - s.files = ["LICENSE.txt".freeze] - s.homepage = "https://simonecarletti.com/code/publicsuffix-ruby".freeze - s.licenses = ["MIT".freeze] - s.required_ruby_version = Gem::Requirement.new(">= 2.3".freeze) - s.rubygems_version = "3.1.6".freeze - s.summary = "Domain name parser based on the Public Suffix List.".freeze - - s.installed_by_version = "3.1.6" if s.respond_to? :installed_by_version -end diff --git a/example/vendor/bundle/ruby/2.7.0/specifications/rexml-3.2.5.gemspec b/example/vendor/bundle/ruby/2.7.0/specifications/rexml-3.2.5.gemspec deleted file mode 100644 index b664b0d..0000000 --- a/example/vendor/bundle/ruby/2.7.0/specifications/rexml-3.2.5.gemspec +++ /dev/null @@ -1,38 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: rexml 3.2.5 ruby lib - -Gem::Specification.new do |s| - s.name = "rexml".freeze - s.version = "3.2.5" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.require_paths = ["lib".freeze] - s.authors = ["Kouhei Sutou".freeze] - s.bindir = "exe".freeze - s.date = "2021-04-05" - s.description = "An XML toolkit for Ruby".freeze - s.email = ["kou@cozmixng.org".freeze] - s.extra_rdoc_files = ["LICENSE.txt".freeze, "NEWS.md".freeze, "README.md".freeze, "doc/rexml/context.rdoc".freeze, "doc/rexml/tasks/rdoc/child.rdoc".freeze, "doc/rexml/tasks/rdoc/document.rdoc".freeze, "doc/rexml/tasks/rdoc/element.rdoc".freeze, "doc/rexml/tasks/rdoc/node.rdoc".freeze, "doc/rexml/tasks/rdoc/parent.rdoc".freeze, "doc/rexml/tasks/tocs/child_toc.rdoc".freeze, "doc/rexml/tasks/tocs/document_toc.rdoc".freeze, "doc/rexml/tasks/tocs/element_toc.rdoc".freeze, "doc/rexml/tasks/tocs/master_toc.rdoc".freeze, "doc/rexml/tasks/tocs/node_toc.rdoc".freeze, "doc/rexml/tasks/tocs/parent_toc.rdoc".freeze] - s.files = ["LICENSE.txt".freeze, "NEWS.md".freeze, "README.md".freeze, "doc/rexml/context.rdoc".freeze, "doc/rexml/tasks/rdoc/child.rdoc".freeze, "doc/rexml/tasks/rdoc/document.rdoc".freeze, "doc/rexml/tasks/rdoc/element.rdoc".freeze, "doc/rexml/tasks/rdoc/node.rdoc".freeze, "doc/rexml/tasks/rdoc/parent.rdoc".freeze, "doc/rexml/tasks/tocs/child_toc.rdoc".freeze, "doc/rexml/tasks/tocs/document_toc.rdoc".freeze, "doc/rexml/tasks/tocs/element_toc.rdoc".freeze, "doc/rexml/tasks/tocs/master_toc.rdoc".freeze, "doc/rexml/tasks/tocs/node_toc.rdoc".freeze, "doc/rexml/tasks/tocs/parent_toc.rdoc".freeze] - s.homepage = "https://github.com/ruby/rexml".freeze - s.licenses = ["BSD-2-Clause".freeze] - s.rdoc_options = ["--main".freeze, "README.md".freeze] - s.rubygems_version = "3.1.6".freeze - s.summary = "An XML toolkit for Ruby".freeze - - s.installed_by_version = "3.1.6" if s.respond_to? :installed_by_version - - if s.respond_to? :specification_version then - s.specification_version = 4 - end - - if s.respond_to? :add_runtime_dependency then - s.add_development_dependency(%q.freeze, [">= 0"]) - s.add_development_dependency(%q.freeze, [">= 0"]) - s.add_development_dependency(%q.freeze, [">= 0"]) - else - s.add_dependency(%q.freeze, [">= 0"]) - s.add_dependency(%q.freeze, [">= 0"]) - s.add_dependency(%q.freeze, [">= 0"]) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/specifications/ruby-macho-2.5.1.gemspec b/example/vendor/bundle/ruby/2.7.0/specifications/ruby-macho-2.5.1.gemspec deleted file mode 100644 index bf08ed2..0000000 --- a/example/vendor/bundle/ruby/2.7.0/specifications/ruby-macho-2.5.1.gemspec +++ /dev/null @@ -1,21 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: ruby-macho 2.5.1 ruby lib - -Gem::Specification.new do |s| - s.name = "ruby-macho".freeze - s.version = "2.5.1" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.require_paths = ["lib".freeze] - s.authors = ["William Woodruff".freeze] - s.date = "2021-05-15" - s.description = "A library for viewing and manipulating Mach-O files in Ruby.".freeze - s.email = "william@yossarian.net".freeze - s.homepage = "https://github.com/Homebrew/ruby-macho".freeze - s.licenses = ["MIT".freeze] - s.required_ruby_version = Gem::Requirement.new(">= 2.5".freeze) - s.rubygems_version = "3.1.6".freeze - s.summary = "ruby-macho - Mach-O file analyzer.".freeze - - s.installed_by_version = "3.1.6" if s.respond_to? :installed_by_version -end diff --git a/example/vendor/bundle/ruby/2.7.0/specifications/typhoeus-1.4.0.gemspec b/example/vendor/bundle/ruby/2.7.0/specifications/typhoeus-1.4.0.gemspec deleted file mode 100644 index 8c2dfae..0000000 --- a/example/vendor/bundle/ruby/2.7.0/specifications/typhoeus-1.4.0.gemspec +++ /dev/null @@ -1,30 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: typhoeus 1.4.0 ruby lib - -Gem::Specification.new do |s| - s.name = "typhoeus".freeze - s.version = "1.4.0" - - s.required_rubygems_version = Gem::Requirement.new(">= 1.3.6".freeze) if s.respond_to? :required_rubygems_version= - s.require_paths = ["lib".freeze] - s.authors = ["David Balatero".freeze, "Paul Dix".freeze, "Hans Hasselberg".freeze] - s.date = "2020-05-08" - s.description = "Like a modern code version of the mythical beast with 100 serpent heads, Typhoeus runs HTTP requests in parallel while cleanly encapsulating handling logic.".freeze - s.email = ["hans.hasselberg@gmail.com".freeze] - s.homepage = "https://github.com/typhoeus/typhoeus".freeze - s.licenses = ["MIT".freeze] - s.rubygems_version = "3.1.6".freeze - s.summary = "Parallel HTTP library on top of libcurl multi.".freeze - - s.installed_by_version = "3.1.6" if s.respond_to? :installed_by_version - - if s.respond_to? :specification_version then - s.specification_version = 4 - end - - if s.respond_to? :add_runtime_dependency then - s.add_runtime_dependency(%q.freeze, [">= 0.9.0"]) - else - s.add_dependency(%q.freeze, [">= 0.9.0"]) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/specifications/tzinfo-2.0.6.gemspec b/example/vendor/bundle/ruby/2.7.0/specifications/tzinfo-2.0.6.gemspec deleted file mode 100644 index 27708e7..0000000 --- a/example/vendor/bundle/ruby/2.7.0/specifications/tzinfo-2.0.6.gemspec +++ /dev/null @@ -1,36 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: tzinfo 2.0.6 ruby lib - -Gem::Specification.new do |s| - s.name = "tzinfo".freeze - s.version = "2.0.6" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.metadata = { "bug_tracker_uri" => "https://github.com/tzinfo/tzinfo/issues", "changelog_uri" => "https://github.com/tzinfo/tzinfo/blob/master/CHANGES.md", "documentation_uri" => "https://rubydoc.info/gems/tzinfo/2.0.6", "homepage_uri" => "https://tzinfo.github.io", "source_code_uri" => "https://github.com/tzinfo/tzinfo/tree/v2.0.6" } if s.respond_to? :metadata= - s.require_paths = ["lib".freeze] - s.authors = ["Philip Ross".freeze] - s.cert_chain = ["-----BEGIN CERTIFICATE-----\nMIIDPDCCAiSgAwIBAgIBATANBgkqhkiG9w0BAQsFADAkMSIwIAYDVQQDDBlwaGls\nLnJvc3MvREM9Z21haWwvREM9Y29tMB4XDTE5MTIyNDE0NTU0N1oXDTM5MTIyNDE0\nNTU0N1owJDEiMCAGA1UEAwwZcGhpbC5yb3NzL0RDPWdtYWlsL0RDPWNvbTCCASIw\nDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJGcwfqn4ZsmPl0b1Lt9dCzExrE5\nEeP/CRQjBdGHkF+mSpi69XysxdwLdfg5SPr9LfxthUug4nNFd5fDCiXM8hYe9jQD\nTmkIQKNBh4fFpGngn9gyy+SumCXi6b5L6d/aMc59NAOM6LJ88TOdH1648dh5rq3C\nULq82n3gg4+u0HHGjRPuR/pnCFQCZbANYdX+UBWd0qkOJn/EreNKROmEeHr/xKuh\n2/GlKFKt9KLcW3hwBB4fHHVYUzRau7D1m9KbEERdg//qNDC4B7fD2BFJuPbM5S7J\n41VwDAh1O8B/Qpg0f+S83K4Kodw4MiPGsug55UkNtd3mGR/zZJ9WM03DSwkCAwEA\nAaN5MHcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFA+Z8zvfzBuA\nesoHIfz7+jxfUOcfMB4GA1UdEQQXMBWBE3BoaWwucm9zc0BnbWFpbC5jb20wHgYD\nVR0SBBcwFYETcGhpbC5yb3NzQGdtYWlsLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEA\nJ80xgZ3gGdQVA8N+8NJANU5HLuZIU9jOaAlziU9ImoTgPiOHKGZC4as1TwT4kBt1\nQcnu7YSANYRrxP5tpOHsWPF/MQYgerAFCZS5+PzOTudwZ+7OsMW4/EMHy6aCVHEd\nc7HzQRC4mSrDRpWxzyBnZ5nX5OAmIkKA8NgeKybT/4Ku6iFPPUQwlyxQaO+Wlxdo\nFqHwpjRyoiVSpe4RUTNK3d3qesWPYi7Lxn6k6ZZeEdvG6ya33AXktE3jmmF+jPR1\nJ3Zn/kSTjTekiaspyGbczC3PUaeJNxr+yCvR4sk71Xmk/GaKKGOHedJ1uj/LAXrA\nMR0mpl7b8zCg0PFC1J73uw==\n-----END CERTIFICATE-----\n".freeze] - s.date = "2023-01-28" - s.description = "TZInfo provides access to time zone data and allows times to be converted using time zone rules.".freeze - s.email = "phil.ross@gmail.com".freeze - s.extra_rdoc_files = ["README.md".freeze, "CHANGES.md".freeze, "LICENSE".freeze] - s.files = ["CHANGES.md".freeze, "LICENSE".freeze, "README.md".freeze] - s.homepage = "https://tzinfo.github.io".freeze - s.licenses = ["MIT".freeze] - s.rdoc_options = ["--title".freeze, "TZInfo".freeze, "--main".freeze, "README.md".freeze] - s.required_ruby_version = Gem::Requirement.new(">= 1.9.3".freeze) - s.rubygems_version = "3.1.6".freeze - s.summary = "Time Zone Library".freeze - - s.installed_by_version = "3.1.6" if s.respond_to? :installed_by_version - - if s.respond_to? :specification_version then - s.specification_version = 4 - end - - if s.respond_to? :add_runtime_dependency then - s.add_runtime_dependency(%q.freeze, ["~> 1.0"]) - else - s.add_dependency(%q.freeze, ["~> 1.0"]) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/specifications/xcodeproj-1.22.0.gemspec b/example/vendor/bundle/ruby/2.7.0/specifications/xcodeproj-1.22.0.gemspec deleted file mode 100644 index 793d653..0000000 --- a/example/vendor/bundle/ruby/2.7.0/specifications/xcodeproj-1.22.0.gemspec +++ /dev/null @@ -1,43 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: xcodeproj 1.22.0 ruby lib - -Gem::Specification.new do |s| - s.name = "xcodeproj".freeze - s.version = "1.22.0" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.require_paths = ["lib".freeze] - s.authors = ["Eloy Duran".freeze] - s.date = "2022-06-22" - s.description = "Xcodeproj lets you create and modify Xcode projects from Ruby. Script boring management tasks or build Xcode-friendly libraries. Also includes support for Xcode workspaces (.xcworkspace) and configuration files (.xcconfig).".freeze - s.email = "eloy.de.enige@gmail.com".freeze - s.executables = ["xcodeproj".freeze] - s.files = ["bin/xcodeproj".freeze] - s.homepage = "https://github.com/cocoapods/xcodeproj".freeze - s.licenses = ["MIT".freeze] - s.required_ruby_version = Gem::Requirement.new(">= 2.0.0".freeze) - s.rubygems_version = "3.1.6".freeze - s.summary = "Create and modify Xcode projects from Ruby.".freeze - - s.installed_by_version = "3.1.6" if s.respond_to? :installed_by_version - - if s.respond_to? :specification_version then - s.specification_version = 3 - end - - if s.respond_to? :add_runtime_dependency then - s.add_runtime_dependency(%q.freeze, ["~> 0.1.3"]) - s.add_runtime_dependency(%q.freeze, [">= 2.3.3", "< 4.0"]) - s.add_runtime_dependency(%q.freeze, [">= 1.0.2", "< 2.0"]) - s.add_runtime_dependency(%q.freeze, ["~> 3.1"]) - s.add_runtime_dependency(%q.freeze, ["~> 0.3.0"]) - s.add_runtime_dependency(%q.freeze, ["~> 3.2.4"]) - else - s.add_dependency(%q.freeze, ["~> 0.1.3"]) - s.add_dependency(%q.freeze, [">= 2.3.3", "< 4.0"]) - s.add_dependency(%q.freeze, [">= 1.0.2", "< 2.0"]) - s.add_dependency(%q.freeze, ["~> 3.1"]) - s.add_dependency(%q.freeze, ["~> 0.3.0"]) - s.add_dependency(%q.freeze, ["~> 3.2.4"]) - end -end

    >Am=kUzEZ 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 "-lffi\n" -"gcc -o conftest -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0/arm64-darwin22 -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0/ruby/backward -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0 -I. -I/opt/homebrew/opt/libyaml/include -I/opt/homebrew/opt/libksba/include -I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/zlib/include -I/opt/homebrew/opt/openssl@1.1/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -O2 -fno-common -pipe conftest.c -L. -L/Users/penguin/.rvm/rubies/ruby-2.7.6/lib -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -L. -fstack-protector-strong -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -m64 -lruby.2.7 " -checked program was: -/* begin */ -1: #include "ruby.h" -2: -3: int main(int argc, char **argv) -4: { -5: return !!argv[argc]; -6: } -/* end */ - -"gcc -o conftest -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0/arm64-darwin22 -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0/ruby/backward -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0 -I. -I/opt/homebrew/opt/libyaml/include -I/opt/homebrew/opt/libksba/include -I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/zlib/include -I/opt/homebrew/opt/openssl@1.1/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -O2 -fno-common -pipe conftest.c -L. -L/Users/penguin/.rvm/rubies/ruby-2.7.6/lib -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -L. -fstack-protector-strong -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -m64 -lruby.2.7 -lffi " -checked program was: -/* begin */ -1: #include "ruby.h" -2: -3: int main(int argc, char **argv) -4: { -5: return !!argv[argc]; -6: } -/* end */ - -| pkg-config --cflags-only-I libffi -=> "-I/Library/Developer/CommandLineTools/SDKs/MacOSX13.sdk/usr/include/ffi\n" -| pkg-config --cflags-only-other libffi -=> "\n" -| pkg-config --libs-only-l libffi -=> "-lffi\n" -package configuration for libffi -incflags: -I/Library/Developer/CommandLineTools/SDKs/MacOSX13.sdk/usr/include/ffi -cflags: -ldflags: -libs: -lffi - -have_library: checking for ffi_prep_closure_loc() in -lffi... -------------------- yes - -"gcc -o conftest -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0/arm64-darwin22 -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0/ruby/backward -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0 -I. -I/Library/Developer/CommandLineTools/SDKs/MacOSX13.sdk/usr/include/ffi -I/opt/homebrew/opt/libyaml/include -I/opt/homebrew/opt/libksba/include -I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/zlib/include -I/opt/homebrew/opt/openssl@1.1/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -O2 -fno-common -pipe conftest.c -L. -L/Users/penguin/.rvm/rubies/ruby-2.7.6/lib -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -L. -fstack-protector-strong -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -m64 -lffi -lruby.2.7 -lffi -lffi " -checked program was: -/* begin */ - 1: #include "ruby.h" - 2: - 3: #include - 4: - 5: /*top*/ - 6: extern int t(void); - 7: int main(int argc, char **argv) - 8: { - 9: if (argc > 1000000) { -10: int (* volatile tp)(void)=(int (*)(void))&t; -11: printf("%d", (*tp)()); -12: } -13: -14: return !!argv[argc]; -15: } -16: int t(void) { void ((*volatile p)()); p = (void ((*)()))ffi_prep_closure_loc; return !p; } -/* end */ - --------------------- - -have_func: checking for ffi_prep_cif_var()... -------------------- yes - -"gcc -o conftest -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0/arm64-darwin22 -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0/ruby/backward -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0 -I. -I/Library/Developer/CommandLineTools/SDKs/MacOSX13.sdk/usr/include/ffi -I/opt/homebrew/opt/libyaml/include -I/opt/homebrew/opt/libksba/include -I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/zlib/include -I/opt/homebrew/opt/openssl@1.1/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -O2 -fno-common -pipe conftest.c -L. -L/Users/penguin/.rvm/rubies/ruby-2.7.6/lib -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -L. -fstack-protector-strong -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -m64 -lffi -lffi -lruby.2.7 -lffi -lffi " -conftest.c:14:57: error: use of undeclared identifier 'ffi_prep_cif_var' -int t(void) { void ((*volatile p)()); p = (void ((*)()))ffi_prep_cif_var; return !p; } - ^ -1 error generated. -checked program was: -/* begin */ - 1: #include "ruby.h" - 2: - 3: /*top*/ - 4: extern int t(void); - 5: int main(int argc, char **argv) - 6: { - 7: if (argc > 1000000) { - 8: int (* volatile tp)(void)=(int (*)(void))&t; - 9: printf("%d", (*tp)()); -10: } -11: -12: return !!argv[argc]; -13: } -14: int t(void) { void ((*volatile p)()); p = (void ((*)()))ffi_prep_cif_var; return !p; } -/* end */ - -"gcc -o conftest -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0/arm64-darwin22 -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0/ruby/backward -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0 -I. -I/Library/Developer/CommandLineTools/SDKs/MacOSX13.sdk/usr/include/ffi -I/opt/homebrew/opt/libyaml/include -I/opt/homebrew/opt/libksba/include -I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/zlib/include -I/opt/homebrew/opt/openssl@1.1/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -O2 -fno-common -pipe conftest.c -L. -L/Users/penguin/.rvm/rubies/ruby-2.7.6/lib -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -L. -fstack-protector-strong -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -m64 -lffi -lffi -lruby.2.7 -lffi -lffi " -checked program was: -/* begin */ - 1: #include "ruby.h" - 2: - 3: /*top*/ - 4: extern int t(void); - 5: int main(int argc, char **argv) - 6: { - 7: if (argc > 1000000) { - 8: int (* volatile tp)(void)=(int (*)(void))&t; - 9: printf("%d", (*tp)()); -10: } -11: -12: return !!argv[argc]; -13: } -14: extern void ffi_prep_cif_var(); -15: int t(void) { ffi_prep_cif_var(); return 0; } -/* end */ - --------------------- - -have_func: checking for ffi_raw_call()... -------------------- yes - -"gcc -o conftest -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0/arm64-darwin22 -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0/ruby/backward -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0 -I. -I/Library/Developer/CommandLineTools/SDKs/MacOSX13.sdk/usr/include/ffi -I/opt/homebrew/opt/libyaml/include -I/opt/homebrew/opt/libksba/include -I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/zlib/include -I/opt/homebrew/opt/openssl@1.1/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -O2 -fno-common -pipe conftest.c -L. -L/Users/penguin/.rvm/rubies/ruby-2.7.6/lib -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -L. -fstack-protector-strong -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -m64 -lffi -lffi -lruby.2.7 -lffi -lffi " -conftest.c:14:57: error: use of undeclared identifier 'ffi_raw_call' -int t(void) { void ((*volatile p)()); p = (void ((*)()))ffi_raw_call; return !p; } - ^ -1 error generated. -checked program was: -/* begin */ - 1: #include "ruby.h" - 2: - 3: /*top*/ - 4: extern int t(void); - 5: int main(int argc, char **argv) - 6: { - 7: if (argc > 1000000) { - 8: int (* volatile tp)(void)=(int (*)(void))&t; - 9: printf("%d", (*tp)()); -10: } -11: -12: return !!argv[argc]; -13: } -14: int t(void) { void ((*volatile p)()); p = (void ((*)()))ffi_raw_call; return !p; } -/* end */ - -"gcc -o conftest -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0/arm64-darwin22 -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0/ruby/backward -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0 -I. -I/Library/Developer/CommandLineTools/SDKs/MacOSX13.sdk/usr/include/ffi -I/opt/homebrew/opt/libyaml/include -I/opt/homebrew/opt/libksba/include -I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/zlib/include -I/opt/homebrew/opt/openssl@1.1/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -O2 -fno-common -pipe conftest.c -L. -L/Users/penguin/.rvm/rubies/ruby-2.7.6/lib -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -L. -fstack-protector-strong -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -m64 -lffi -lffi -lruby.2.7 -lffi -lffi " -checked program was: -/* begin */ - 1: #include "ruby.h" - 2: - 3: /*top*/ - 4: extern int t(void); - 5: int main(int argc, char **argv) - 6: { - 7: if (argc > 1000000) { - 8: int (* volatile tp)(void)=(int (*)(void))&t; - 9: printf("%d", (*tp)()); -10: } -11: -12: return !!argv[argc]; -13: } -14: extern void ffi_raw_call(); -15: int t(void) { ffi_raw_call(); return 0; } -/* end */ - --------------------- - -have_func: checking for ffi_prep_raw_closure()... -------------------- yes - -"gcc -o conftest -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0/arm64-darwin22 -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0/ruby/backward -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0 -I. -I/Library/Developer/CommandLineTools/SDKs/MacOSX13.sdk/usr/include/ffi -I/opt/homebrew/opt/libyaml/include -I/opt/homebrew/opt/libksba/include -I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/zlib/include -I/opt/homebrew/opt/openssl@1.1/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -O2 -fno-common -pipe conftest.c -L. -L/Users/penguin/.rvm/rubies/ruby-2.7.6/lib -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -L. -fstack-protector-strong -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -m64 -lffi -lffi -lruby.2.7 -lffi -lffi " -conftest.c:14:57: error: use of undeclared identifier 'ffi_prep_raw_closure' -int t(void) { void ((*volatile p)()); p = (void ((*)()))ffi_prep_raw_closure; return !p; } - ^ -1 error generated. -checked program was: -/* begin */ - 1: #include "ruby.h" - 2: - 3: /*top*/ - 4: extern int t(void); - 5: int main(int argc, char **argv) - 6: { - 7: if (argc > 1000000) { - 8: int (* volatile tp)(void)=(int (*)(void))&t; - 9: printf("%d", (*tp)()); -10: } -11: -12: return !!argv[argc]; -13: } -14: int t(void) { void ((*volatile p)()); p = (void ((*)()))ffi_prep_raw_closure; return !p; } -/* end */ - -"gcc -o conftest -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0/arm64-darwin22 -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0/ruby/backward -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0 -I. -I/Library/Developer/CommandLineTools/SDKs/MacOSX13.sdk/usr/include/ffi -I/opt/homebrew/opt/libyaml/include -I/opt/homebrew/opt/libksba/include -I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/zlib/include -I/opt/homebrew/opt/openssl@1.1/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -O2 -fno-common -pipe conftest.c -L. -L/Users/penguin/.rvm/rubies/ruby-2.7.6/lib -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -L. -fstack-protector-strong -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -m64 -lffi -lffi -lruby.2.7 -lffi -lffi " -checked program was: -/* begin */ - 1: #include "ruby.h" - 2: - 3: /*top*/ - 4: extern int t(void); - 5: int main(int argc, char **argv) - 6: { - 7: if (argc > 1000000) { - 8: int (* volatile tp)(void)=(int (*)(void))&t; - 9: printf("%d", (*tp)()); -10: } -11: -12: return !!argv[argc]; -13: } -14: extern void ffi_prep_raw_closure(); -15: int t(void) { ffi_prep_raw_closure(); return 0; } -/* end */ - --------------------- - -block in append_ldflags: checking for whether -pthread is accepted as LDFLAGS... -------------------- yes - -"gcc -o conftest -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0/arm64-darwin22 -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0/ruby/backward -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0 -I. -I/Library/Developer/CommandLineTools/SDKs/MacOSX13.sdk/usr/include/ffi -I/opt/homebrew/opt/libyaml/include -I/opt/homebrew/opt/libksba/include -I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/zlib/include -I/opt/homebrew/opt/openssl@1.1/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -O2 -fno-common -pipe conftest.c -L. -L/Users/penguin/.rvm/rubies/ruby-2.7.6/lib -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -L. -fstack-protector-strong -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -m64 -lffi -lffi -lruby.2.7 -pthread " -checked program was: -/* begin */ -1: #include "ruby.h" -2: -3: int main(int argc, char **argv) -4: { -5: return !!argv[argc]; -6: } -/* end */ - --------------------- - -extconf.h is: -/* begin */ -1: #ifndef EXTCONF_H -2: #define EXTCONF_H -3: #define HAVE_FFI_PREP_CIF_VAR 1 -4: #define HAVE_FFI_RAW_CALL 1 -5: #define HAVE_FFI_PREP_RAW_CLOSURE 1 -6: #define HAVE_RAW_API 1 -7: #define USE_FFI_ALLOC 1 -8: #endif -/* end */ - diff --git a/example/vendor/bundle/ruby/2.7.0/extensions/arm64-darwin-22/2.7.0/json-2.6.3/gem.build_complete b/example/vendor/bundle/ruby/2.7.0/extensions/arm64-darwin-22/2.7.0/json-2.6.3/gem.build_complete deleted file mode 100644 index e69de29..0000000 diff --git a/example/vendor/bundle/ruby/2.7.0/extensions/arm64-darwin-22/2.7.0/json-2.6.3/gem_make.out b/example/vendor/bundle/ruby/2.7.0/extensions/arm64-darwin-22/2.7.0/json-2.6.3/gem_make.out deleted file mode 100644 index 9cd276a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/extensions/arm64-darwin-22/2.7.0/json-2.6.3/gem_make.out +++ /dev/null @@ -1,13 +0,0 @@ -current directory: /Users/penguin/Documents/Tapp/ometria-rn/sampleApp/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json -/Users/penguin/.rvm/rubies/ruby-2.7.6/bin/ruby -I /Users/penguin/.rvm/rubies/ruby-2.7.6/lib/ruby/2.7.0 -r ./siteconf20230521-58859-1reh8il.rb extconf.rb -creating Makefile - -current directory: /Users/penguin/Documents/Tapp/ometria-rn/sampleApp/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json -make "DESTDIR=" clean - -current directory: /Users/penguin/Documents/Tapp/ometria-rn/sampleApp/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json -make "DESTDIR=" -make: Nothing to be done for `all'. - -current directory: /Users/penguin/Documents/Tapp/ometria-rn/sampleApp/vendor/bundle/ruby/2.7.0/gems/json-2.6.3/ext/json -make "DESTDIR=" install diff --git a/example/vendor/bundle/ruby/2.7.0/extensions/arm64-darwin-22/2.7.0/json-2.6.3/json/ext/generator.bundle b/example/vendor/bundle/ruby/2.7.0/extensions/arm64-darwin-22/2.7.0/json-2.6.3/json/ext/generator.bundle deleted file mode 100755 index 6afc94e89926508af748d8cd34488a74a2181cf1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63885 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

    Oa3+uZ#+2UIjJE993!rQV^(7m7WxV!CrL+UF z9sBIb*dw(k@jX%`8*ny!9$DD){?lx2?>8s6UlzIJqv2-D-aC|xzKv+ZX14YnMB6>) zas15vGg&uJ*25drMqzt1+CNWZTZxuM$!N?1PsAJXQwn~F7dp#nJZw4*562`AgC_Pfw;qGwSu8+*YU@z{@XA--rVh#wjYjhAVs z;Uyw@DKLw%D2Vbgp7Sw5){96!Xe@ZU7z=854g3PycpL^#VT{=U7x`}{V7(Ul^dj&{ z;6*D(vbi0&ClP4u$fiwzZ5#(VPQaLw@2v0$><;X<<;WoP9Q`EUnUx*tfu6chk9=8{ z1V?@s%bJ%_#F}W&rqzE4v@)QJ@~4JS+` z@PkB5hZ*-NmjX|6puCoEO(n1$-O#rP?ac>^lp%mPKJeG0T_?VxqzEu?cn!+N)Jm2DFCG1-gOWx?*|rii+<#-Fb4 z0o27i%T%hjk!TW)G*+7hdzhOl>mz-p`n1-ZR3G*?cbu$`^y%t9adfblbeQTFA+5E4 z@SDM6k};Pr{Ixce5i&P%nODLWycOr19mm%nW?0)CDBF@Cd=pOC1xokaD|CeRpZl@b zhyX`>4w@&MktQD^jddl;lg^MnD1D}q130gduj6khL-T0R#A?ICwmsGhdrW0Ky)5cK znT)mv>K8)4ilAo;u!q4JvPhhl8fHT`U>7kzcVS(uJpkVy(ItI{A9n@qrwG3vc+wg4 zgSR)2@}O6i$Y5>{^!R%4@qK5nBjyC|k8e02^%?fUk|pS~F$>o<+DUiK?c~4jhu)Ge z(R8jOqQaN$#JFFHHppkh&^FCs7vN^}-DW57!x|P@5Xt|I$HQU z9CS9*`Aq%+xscD~UFeqPFL@I@PZN59l4q#1^50_#}ha zuY+bU&TGeEZ({VuMd_UfdQ`6yzNxNh(6`C#Pz%PV89Len{li{ws|B=37kjZ@65go_ z-#+Qqg`_KxXD4h-KWrh5ONL=w!lSScgRHH&*t5bOH9&^R7?<-`d-5)`4sUe8m!*wM z2)-&RYinb*c9f%ip#q!*awZ>42sTmgv!QXZ)xp+bAIcc+rJs#-meK>p{Zt&rd9}D%k4+ni~>V@1%XU758i*;ih^pf;7jD5E?aj4!k9vMuz zZ*|O9mw|mT$teWesOcReU84R0r}>;h*q0dlM|#(OXt4Mg+9ch(0DU`$`h@+ozHiO2 z4X5f`80{GSQ(;}-dZnKhXNstuDFiK?VVb`0ymSnDc^EoEdN}zlQwek_^7EI34sHXU zc&4?H@=M<|alcm2D`F16gZxVo1~-zQCjn=%MA)+=*tKD>Zx*bdR=i&{HGLy(O;)G0 zH8$89=sfg#h|SqMmlcyw=qPN?G1wgP4VmmQo3kBl>21zpz@^;YruR8!puey~G}p3H z9eK7daW=jHU$V#jJ|K5fd|c>ui1we!G~6!`ud!q zuVJh+r|K&syul8Jq^+R7YCfPhX-$cq5rm$6hCRhY#|Ix_XR!`iQyQj-^@RJq&%)jt z>&GAA^Dm{fWq4uRGw{37+H&xT!nWQgO>KnVa2?i`Cs@-0=pkN+VQqo_!yibt7wbIN zD?b0m80H_=ACmboonGNHHRxk(4laQ%t%l4m(8(NUA1+e|tuY3DYQb95%YCP?4~BJz z#-8M^<&%uBH^{hCx7O(OiPoxlV? zl+pJl_SIiQZV}`+&^Z?8UIn&$ooRgE9?sV|?4O0N1)qP|I?kNgNbk}%o!yz2Rg1Hy zo7Hwfeygt%>$_)QFlCjeGB4Yj-1r0Zr^h_8{W$2`u}39%azOBPGx(sr>}1#l!Wa5Q zeSCf*mDj5kFeWR9H`I!H%O%`WBl0hoaAA$eUjn#wy9eItOzP$4RTP8WSWFuULu$t0e zuKy@&vZdXsB)3O?5nPDReXiXTn#Bc}?vVB(g*MLDzcQijT5K zPK?o9G$Pgy>J$3G`$ugBGV>lsTYJ$~FZ^4?Gx7U7z>k&6@U zsl3%4v#EvX50!ZXeyxG}MX(PGVJC`UFBZUV6vDQ?!#}@w1!(BohfZ(B-in_IHk6r4 zBBO2ncU~{XU^DQ8MXX6*-T_>XEU!34`8Tf@Yu8<}{HZ=?LHstTF@Kuv19qqsw)qJ5 z|6gP81$)WuPm4-2z-L+^Te8DMliOjeNn~@$|BwY-So&mIN`+5`Y#Q0)HL`psmoL4) zJga>waCYR$H3{c+v0hkjjLDDI$5XxQS5Oz9$={g*A1^c6KH+Kjd828pLD6)&E}f}M zpRG${J&Tsd89thZ4?LQN?<$%mzq{7%d|modU3!5oy;zsNOqX7!ORvzSuhpe*(4}wI zrOR~b3SHW-OW&ePuhXS(*QM{&rSH+D@71Lr(51KN(huv>kLl7s)1`l|OaDrjZr7!s z(WRf$rC-#gU)H5x*QMXlrQg-1-`Ax-)TKYsrT?N!|4oC(x%^eA0=tS+4{(&bD(nI}Cgb6yNLFLQVdFr;`fUD?c`6-8;0 zFH6m11`+^SrYna0_zca>p<=6IWivB3#(?`}vX#fL3aFk#%F1 zYAoQZ^Sj(^nR6Li>aC#cwd@Lyw=NKcs7=-7cRPd5vMP50i@|Qj(QegKuBDviUKUteUFIVe09CsK%vZL`?Fy={Dkr{V>Gb=ZYh}9J z?ebJRt0YwI47w^o694h_U;gdd)$X+gtlaIc5#QfcSGt4j#vfmTz%IU+dEK|NpdZA1 z-do)MAgl1Z-RSoW2NzY26q~aOT`ON}k4dH+=|Irwg;;zwyfgOs2A=IsZ@GQG?0vM) zc9+xZ^#$!^Zo9oM;3hhDG`_0N>moAjNA9(^`uyegiYn(yd%zvE-&*NL2}lOxWA~S- z0T57~{*{3X>}7R9I|LH6yS?ax-4n1AWv9K;8K}g;#Vs;Xwyqi_c)q9V0(+3giKsaP zc6W76aIGCOqDBMkngHR0CsjpBS;h{Pz=#C#T}vWZ?ym8>UCyAp{L~EwYN|YF*&FoP zYkUDd?9M7KnUm>3NdwXLwd^SOU?IvEbuh+=fsZ=xDTk@f>t0g>9fHV%zSWSaGiX0= zYT!IJBdWy(ESZgDRyKv*#4LFC>+xb5)l{Lgb`W*>%H4KXCAtqHe!Ck3QRBuC)z-P8 z22palN`X2|v6T=Gc=h;X5R(YXnP77|G0cjbx^+ z_?qp)aV#Na0#ja^#!N@1F{Sx@e3e$TkuX}sL>5mm-TYUdt{2sSnLi~I8xQHGX5kw!VXTk*nCVXk$v;@J6unxbn zeJ{eh2%jT-hhSHjf(vyOG^pU_0i_k;9fYqCMwpO?a4mu#VGF|V5&99%Gc)Bf1TVtR z5MD;uhcF_6DYFokAe1BEM~akZ5Z*!9kC2?m6bHf$2>3w-1wSyLe2DNBLP`=-rX!#) z%C!jiQ4Qr`gbsv#2wx!J$8D4;2n!KzLRg1@A5KwTM)(xrFhaV8Dfsa&aCt&B`!Fr^9Dset~=ouhD0H{1clc`4$>+vws1xf zHFda5gy#la9#3AGCy3g(3j-I0aJ1`6el?3oSGvJ2-Oix~*Vce7u;b#mQ-I~=xGhE$ zp<7+}MK5{~j70BP;e>EwOpssS!XaGmG8=c$REsKr)Syo-FN2WKD3RtYl&kXQm~~t% zBGZjKY}`^#6}WgskL5SasCC|Q+?K;BiNd(?q|ygz6K#p{mDg2?E)K!y>beX4@=6`5 z=Prgw#0@(fq?=b%dCiHs(sPU3tJd%aAYK&$@wq&>IwXprduw<-a-cjqRf*zo?+)F>f~!yHULStx4pApz zL5{cZaw}bGwbQ>E|JIfXW`Oa#S9$`t9z|pc+4Is|DV%L1LJg4E?ym#p4%U@Vf&w zK5sdS@>WQ#=xQKR`6!~iPK*;}>Np~h&mJVAWdn6(IuIgNZ*f-DiMG(I*|-&ndQ%sy z$QwGXI7X7>MQ(NSp4XMFRo93)@8@Y;euVjsB06Zc212Bi3mBxlu4*ujgrDwRVv4#H zH#w>NiYGryF|%HN)k<&5&ZNs<9l1I2;w5=0JJWuj_=V-wQ5QcYu5W?;z8waC6b$)x zae)haM8cm*_}3C{78kX!mnA$)-v9BggvI?JjD0L&aZdcZ5oG0Ob zN!TIb?j`s{4WXb zlQ8W;%ITkc@Z008TmulV!dUC!0N@JT%=Fc}n5%fG>P-Bj`@| zESL2)SgSAYJ&N(K&!_sDeYsKA*I=!_xOXa6U!PC)HGAZd^)*nXWv+R9~}q56Jo&O!=fgRSEcqhhVC&&!_sDeQcKXHCU^EG4zri zt-d~=>TCA&d0AhBqxD7gXnlP?)z|Fr9$8<5wfavP_}AxCea&9~UDnrNt^Nmw_O<+8 zl%J-v??(wnUp4z~!AeJSf`tTu(Gs>uc$|b&Bs@*R<0PCbVY`HXAmJ_32&G11PM1wc!q>qC7dhaof5u8!Y@hqG6{D|_$mo^Nw`$P zA4qtWg!f69#$RvWX&Q|NQnS}|uN*)*yP(GgnC@58=PxqAKQh2q3m8?z6EMIV4DkI1 z_-6+A*9Q1a1N^=L-fw^p8Q?^4CjO9t2ltW>f$^K4L*RS^{6hnLodFIS;Cl@)ej5Sw z9r!Pv=MDL98{oeh;64L<+yJLyBn3*)pJsq(8(@b4UT%Qh2DsJ$-(i3sGQjvvl_C7R zVu0T>zy}TRF$0_kTcz(`x&c1N0M9hQ`3Cq31AM&!t~9{w4DekBc(VcCVSslU;8zXs zUIYB80mkp24e9?013WBYX#RKuJlz0aWPl3{@D&F5CId|CD#in&B%V40O!NCegv|&| z2wM;yLfDG14dG#g?Ff$|JcjT%!cP!>ia@qt2SPJK3&PJ4oh85!w*i5y(zF zh43`OGYJ0^VJE_~2+turkI;ee0>X<3zd?8jVHd*72(KW#hVVMV8wi~UyAj?*cnjgT z2yY|2gYY|qE`&V@?;`9)_&vgV2xO1`fI#bQH^O}gB!dSKzE2L1pv?cNEPjQ$Pa^!k zmdUH2`ClOyI~#J|j(hv6g%^Z-WVqub?(Gv2A^%_8+gGOdt;M~4L;QQ1dr$cO{xjY_ z)kRmqOJ|=N5YBJzUUrE)&LQpSt?#OaHu9FFEV(2 z&EpwkK)ae5L7(3+4__v^RB^R8zlHT*eXa0;^QL7##hZv~LPdMVRJX{L?s@l+`|#Bwy7^u$iry2h77e}qUiAoeq8H$k zBVUgLzaDWtKEDS)21Kugrvmz$@BxzNR$PV;z;L%b6_+nIq(>X&b+_Upd+5dZK#05X zwM29bJmg9j3>$9AM^Ptt(GzWQ+8XI<-XmTjcvSuM`M}B>^pUEorr!u) zIoIHq2Ld@YZtu!Ek2hzb&&98!59Aa(Yie?Qc(da7IA{31IRPhKwq6J%-i4I={5fTK z4O8XLA>b zf!?zopL%M1>e0_qU`h=6WeULm#ZwPkS$6zyBRX+np)Eg-E&NFZj!v1sVkR73O#CcU zft(VV50A=@PP+*|Bk-Sk9MMv80*HCbZg}~RXWQ*xwATN$VehLK-mC0;Keg-miWA3v zb!=c?eQxpU;Mec{cGop!58gIBW5>HkAHL|7OP_qdVPVpf&wkZ)Tf*aGuj+h!!@Z9T zys~sn{n*DZf4%7Iif4auVa992)3!aly!;x=8($pQ>)X%o9>3a=awPf{$pB=q_PjAk?_AS$% zzT>IqN__7etmsVmQ+M}j)0HKOgX=riue_%2!OO?K MHGkOV>b4#K0fQZ{L;wH) diff --git a/example/vendor/bundle/ruby/2.7.0/extensions/arm64-darwin-22/2.7.0/json-2.6.3/mkmf.log b/example/vendor/bundle/ruby/2.7.0/extensions/arm64-darwin-22/2.7.0/json-2.6.3/mkmf.log deleted file mode 100644 index 7379e9c..0000000 --- a/example/vendor/bundle/ruby/2.7.0/extensions/arm64-darwin-22/2.7.0/json-2.6.3/mkmf.log +++ /dev/null @@ -1,118 +0,0 @@ -have_func: checking for rb_enc_raise() in ruby.h... -------------------- yes - -"gcc -o conftest -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0/arm64-darwin22 -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0/ruby/backward -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0 -I. -I/opt/homebrew/opt/libyaml/include -I/opt/homebrew/opt/libksba/include -I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/zlib/include -I/opt/homebrew/opt/openssl@1.1/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -O2 -fno-common -pipe conftest.c -L. -L/Users/penguin/.rvm/rubies/ruby-2.7.6/lib -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -L. -fstack-protector-strong -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -m64 -lruby.2.7 " -checked program was: -/* begin */ -1: #include "ruby.h" -2: -3: int main(int argc, char **argv) -4: { -5: return !!argv[argc]; -6: } -/* end */ - -"gcc -o conftest -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0/arm64-darwin22 -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0/ruby/backward -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0 -I. -I/opt/homebrew/opt/libyaml/include -I/opt/homebrew/opt/libksba/include -I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/zlib/include -I/opt/homebrew/opt/openssl@1.1/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -O2 -fno-common -pipe conftest.c -L. -L/Users/penguin/.rvm/rubies/ruby-2.7.6/lib -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -L. -fstack-protector-strong -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -m64 -lruby.2.7 " -conftest.c:16:57: error: use of undeclared identifier 'rb_enc_raise' -int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_enc_raise; return !p; } - ^ -1 error generated. -checked program was: -/* begin */ - 1: #include "ruby.h" - 2: - 3: #include - 4: - 5: /*top*/ - 6: extern int t(void); - 7: int main(int argc, char **argv) - 8: { - 9: if (argc > 1000000) { -10: int (* volatile tp)(void)=(int (*)(void))&t; -11: printf("%d", (*tp)()); -12: } -13: -14: return !!argv[argc]; -15: } -16: int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_enc_raise; return !p; } -/* end */ - -"gcc -o conftest -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0/arm64-darwin22 -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0/ruby/backward -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0 -I. -I/opt/homebrew/opt/libyaml/include -I/opt/homebrew/opt/libksba/include -I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/zlib/include -I/opt/homebrew/opt/openssl@1.1/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -O2 -fno-common -pipe conftest.c -L. -L/Users/penguin/.rvm/rubies/ruby-2.7.6/lib -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -L. -fstack-protector-strong -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -m64 -lruby.2.7 " -checked program was: -/* begin */ - 1: #include "ruby.h" - 2: - 3: #include - 4: - 5: /*top*/ - 6: extern int t(void); - 7: int main(int argc, char **argv) - 8: { - 9: if (argc > 1000000) { -10: int (* volatile tp)(void)=(int (*)(void))&t; -11: printf("%d", (*tp)()); -12: } -13: -14: return !!argv[argc]; -15: } -16: extern void rb_enc_raise(); -17: int t(void) { rb_enc_raise(); return 0; } -/* end */ - --------------------- - -have_func: checking for rb_enc_interned_str() in ruby.h... -------------------- no - -"gcc -o conftest -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0/arm64-darwin22 -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0/ruby/backward -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0 -I. -I/opt/homebrew/opt/libyaml/include -I/opt/homebrew/opt/libksba/include -I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/zlib/include -I/opt/homebrew/opt/openssl@1.1/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -O2 -fno-common -pipe conftest.c -L. -L/Users/penguin/.rvm/rubies/ruby-2.7.6/lib -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -L. -fstack-protector-strong -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -m64 -lruby.2.7 " -conftest.c:16:57: error: use of undeclared identifier 'rb_enc_interned_str' -int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_enc_interned_str; return !p; } - ^ -1 error generated. -checked program was: -/* begin */ - 1: #include "ruby.h" - 2: - 3: #include - 4: - 5: /*top*/ - 6: extern int t(void); - 7: int main(int argc, char **argv) - 8: { - 9: if (argc > 1000000) { -10: int (* volatile tp)(void)=(int (*)(void))&t; -11: printf("%d", (*tp)()); -12: } -13: -14: return !!argv[argc]; -15: } -16: int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_enc_interned_str; return !p; } -/* end */ - -"gcc -o conftest -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0/arm64-darwin22 -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0/ruby/backward -I/Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0 -I. -I/opt/homebrew/opt/libyaml/include -I/opt/homebrew/opt/libksba/include -I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/zlib/include -I/opt/homebrew/opt/openssl@1.1/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -O2 -fno-common -pipe conftest.c -L. -L/Users/penguin/.rvm/rubies/ruby-2.7.6/lib -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -L. -fstack-protector-strong -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -m64 -lruby.2.7 " -Undefined symbols for architecture arm64: - "_rb_enc_interned_str", referenced from: - _t in conftest-8b9f25.o -ld: symbol(s) not found for architecture arm64 -clang: error: linker command failed with exit code 1 (use -v to see invocation) -checked program was: -/* begin */ - 1: #include "ruby.h" - 2: - 3: #include - 4: - 5: /*top*/ - 6: extern int t(void); - 7: int main(int argc, char **argv) - 8: { - 9: if (argc > 1000000) { -10: int (* volatile tp)(void)=(int (*)(void))&t; -11: printf("%d", (*tp)()); -12: } -13: -14: return !!argv[argc]; -15: } -16: extern void rb_enc_interned_str(); -17: int t(void) { rb_enc_interned_str(); return 0; } -/* end */ - --------------------- - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/CFPropertyList-3.0.6/LICENSE b/example/vendor/bundle/ruby/2.7.0/gems/CFPropertyList-3.0.6/LICENSE deleted file mode 100644 index ba6ffb2..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/CFPropertyList-3.0.6/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2010 Christian Kruse, - -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/example/vendor/bundle/ruby/2.7.0/gems/CFPropertyList-3.0.6/README.md b/example/vendor/bundle/ruby/2.7.0/gems/CFPropertyList-3.0.6/README.md deleted file mode 100644 index 49f0c07..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/CFPropertyList-3.0.6/README.md +++ /dev/null @@ -1,79 +0,0 @@ -CFPropertyList implementation -class to read, manipulate and write both XML and binary property list -files (plist(5)) as defined by Apple. Have a look at CFPropertyList::List -for more documentation. - -# Caution! - -In version 3.0.0 we dropped Ruby 1.8 compatibility. If you are using -Ruby 1.8 consider to update Ruby; if you can't upgrade, don't upgrade -CFPropertyList. - -# Installation - -You could either use ruby gems and install it via - -```bash -gem install CFPropertyList -``` - -or you could clone this repository and place it somewhere in your load path. - -Example: -```ruby -require 'cfpropertylist' -``` - -If you're using Rails, you can add it into your Gemfile - -```ruby -gem 'CFPropertyList' -``` - -# Usage - - ## create a arbitrary data structure of basic data types - -```ruby -data = { - 'name' => 'John Doe', - 'missing' => true, - 'last_seen' => Time.now, - 'friends' => ['Jane Doe','Julian Doe'], - 'likes' => { - 'me' => false - } -} -``` - -## create CFPropertyList::List object - -```ruby -plist = CFPropertyList::List.new -``` - -## call CFPropertyList.guess() to create corresponding CFType values - -```ruby -plist.value = CFPropertyList.guess(data) -``` - -## write plist to file -```ruby -plist.save("example.plist", CFPropertyList::List::FORMAT_BINARY) -``` - -## … later, read it again -```ruby -plist = CFPropertyList::List.new(:file => "example.plist") -data = CFPropertyList.native_types(plist.value) -``` - -# Author and license - -**Author:** Christian Kruse (mailto:cjk@wwwtech.de) - -**Copyright:** Copyright (c) 2010 - -**License:** MIT License - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/CFPropertyList-3.0.6/README.rdoc b/example/vendor/bundle/ruby/2.7.0/gems/CFPropertyList-3.0.6/README.rdoc deleted file mode 100644 index a71005c..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/CFPropertyList-3.0.6/README.rdoc +++ /dev/null @@ -1,43 +0,0 @@ -CFPropertyList implementation -class to read, manipulate and write both XML and binary property list -files (plist(5)) as defined by Apple. Have a look at CFPropertyList::List -for more documentation. - -== Installation - -You could either use ruby gems and install it via - - gem install CFPropertyList - -or you could clone this repository and place it somewhere in your load path. - -== Example - require 'cfpropertylist' - - # create a arbitrary data structure of basic data types - data = { - 'name' => 'John Doe', - 'missing' => true, - 'last_seen' => Time.now, - 'friends' => ['Jane Doe','Julian Doe'], - 'likes' => { - 'me' => false - } - } - - # create CFPropertyList::List object - plist = CFPropertyList::List.new - - # call CFPropertyList.guess() to create corresponding CFType values - plist.value = CFPropertyList.guess(data) - - # write plist to file - plist.save("example.plist", CFPropertyList::List::FORMAT_BINARY) - - # … later, read it again - plist = CFPropertyList::List.new(:file => "example.plist") - data = CFPropertyList.native_types(plist.value) - -Author:: Christian Kruse (mailto:cjk@wwwtech.de) -Copyright:: Copyright (c) 2010 -License:: MIT License diff --git a/example/vendor/bundle/ruby/2.7.0/gems/CFPropertyList-3.0.6/THANKS b/example/vendor/bundle/ruby/2.7.0/gems/CFPropertyList-3.0.6/THANKS deleted file mode 100644 index c981a51..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/CFPropertyList-3.0.6/THANKS +++ /dev/null @@ -1,7 +0,0 @@ -Special thanks to: - -Steve Madsen for providing a lot of performance patches and bugfixes! -Have a look at his Github account: - - - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.4.3/CHANGELOG.md b/example/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.4.3/CHANGELOG.md deleted file mode 100644 index 0e7c04c..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.4.3/CHANGELOG.md +++ /dev/null @@ -1,474 +0,0 @@ -## Rails 7.0.4.3 (March 13, 2023) ## - -* Implement SafeBuffer#bytesplice - - [CVE-2023-28120] - - -## Rails 7.0.4.2 (January 24, 2023) ## - -* No changes. - - -## Rails 7.0.4.1 (January 17, 2023) ## - -* Avoid regex backtracking in Inflector.underscore - - [CVE-2023-22796] - - -## Rails 7.0.4 (September 09, 2022) ## - -* Redis cache store is now compatible with redis-rb 5.0. - - *Jean Boussier* - -* Fix `NoMethodError` on custom `ActiveSupport::Deprecation` behavior. - - `ActiveSupport::Deprecation.behavior=` was supposed to accept any object - that responds to `call`, but in fact its internal implementation assumed that - this object could respond to `arity`, so it was restricted to only `Proc` objects. - - This change removes this `arity` restriction of custom behaviors. - - *Ryo Nakamura* - - -## Rails 7.0.3.1 (July 12, 2022) ## - -* No changes. - - -## Rails 7.0.3 (May 09, 2022) ## - -* No changes. - - -## Rails 7.0.2.4 (April 26, 2022) ## - -* Fix and add protections for XSS in `ActionView::Helpers` and `ERB::Util`. - - Add the method `ERB::Util.xml_name_escape` to escape dangerous characters - in names of tags and names of attributes, following the specification of XML. - - *Álvaro Martín Fraguas* - -## Rails 7.0.2.3 (March 08, 2022) ## - -* No changes. - - -## Rails 7.0.2.2 (February 11, 2022) ## - -* Fix Reloader method signature to work with the new Executor signature - - -## Rails 7.0.2.1 (February 11, 2022) ## - -* No changes. - - -## Rails 7.0.2 (February 08, 2022) ## - -* Fix `ActiveSupport::EncryptedConfiguration` to be compatible with Psych 4 - - *Stephen Sugden* - -* Improve `File.atomic_write` error handling. - - *Daniel Pepper* - - -## Rails 7.0.1 (January 06, 2022) ## - -* Fix `Class#descendants` and `DescendantsTracker#descendants` compatibility with Ruby 3.1. - - [The native `Class#descendants` was reverted prior to Ruby 3.1 release](https://bugs.ruby-lang.org/issues/14394#note-33), - but `Class#subclasses` was kept, breaking the feature detection. - - *Jean Boussier* - - -## Rails 7.0.0 (December 15, 2021) ## - -* Fix `ActiveSupport::Duration.build` to support negative values. - - The algorithm to collect the `parts` of the `ActiveSupport::Duration` - ignored the sign of the `value` and accumulated incorrect part values. This - impacted `ActiveSupport::Duration#sum` (which is dependent on `parts`) but - not `ActiveSupport::Duration#eql?` (which is dependent on `value`). - - *Caleb Buxton*, *Braden Staudacher* - - -## Rails 7.0.0.rc3 (December 14, 2021) ## - -* No changes. - - -## Rails 7.0.0.rc2 (December 14, 2021) ## - -* No changes. - -## Rails 7.0.0.rc1 (December 06, 2021) ## - -* Deprecate passing a format to `#to_s` in favor of `#to_formatted_s` in `Array`, `Range`, `Date`, `DateTime`, `Time`, - `BigDecimal`, `Float` and, `Integer`. - - *Rafael Mendonça França* - -* Document `ActiveSupport::Testing::Deprecation`. - - *Sam Bostock & Sam Jordan* - -* Add `Pathname#existence`. - - ```ruby - Pathname.new("file").existence&.read - ``` - - *Timo Schilling* - -* Remove deprecate `ActiveSupport::Multibyte::Unicode.default_normalization_form`. - - *Rafael Mendonça França* - -* Remove deprecated support to use `Range#include?` to check the inclusion of a value in - a date time range is deprecated. - - *Rafael Mendonça França* - -* Remove deprecated `URI.parser`. - - *Rafael Mendonça França* - -* Remove deprecated `config.active_support.use_sha1_digests`. - - *Rafael Mendonça França* - -* Invoking `Object#with_options` without a `&block` argument returns the - `ActiveSupport::OptionMerger` instance. - - *Sean Doyle* - -* `Rails.application.executor` hooks can now be called around every test - - This helps to better simulate request or job local state being reset around tests and prevents state - leaking from one test to another. - - However it requires the executor hooks executed in the test environment to be re-entrant. - - To enable this, set `config.active_support.executor_around_test_case = true` (this is the default in Rails 7). - - *Jean Boussier* - -* `ActiveSupport::DescendantsTracker` now mostly delegate to `Class#descendants` on Ruby 3.1 - - Ruby now provides a fast `Class#descendants` making `ActiveSupport::DescendantsTracker` mostly useless. - - As a result the following methods are deprecated: - - - `ActiveSupport::DescendantsTracker.direct_descendants` - - `ActiveSupport::DescendantsTracker#direct_descendants` - - *Jean Boussier* - -* Fix the `Digest::UUID.uuid_from_hash` behavior for namespace IDs that are different from the ones defined on `Digest::UUID`. - - The new behavior will be enabled by setting the - `config.active_support.use_rfc4122_namespaced_uuids` option to `true` - and is the default for new apps. - - The old behavior is the default for upgraded apps and will output a - deprecation warning every time a value that is different than one of - the constants defined on the `Digest::UUID` extension is used as the - namespace ID. - - *Alex Robbin*, *Erich Soares Machado*, *Eugene Kenny* - -* `ActiveSupport::Inflector::Inflections#clear(:acronyms)` is now supported, - and `inflector.clear` / `inflector.clear(:all)` also clears acronyms. - - *Alex Ghiculescu*, *Oliver Peate* - - -## Rails 7.0.0.alpha2 (September 15, 2021) ## - -* No changes. - - -## Rails 7.0.0.alpha1 (September 15, 2021) ## - -* `ActiveSupport::Dependencies` no longer installs a `const_missing` hook. Before this, you could push to the autoload paths and have constants autoloaded. This feature, known as the `classic` autoloader, has been removed. - - *Xavier Noria* - -* Private internal classes of `ActiveSupport::Dependencies` have been deleted, like `ActiveSupport::Dependencies::Reference`, `ActiveSupport::Dependencies::Blamable`, and others. - - *Xavier Noria* - -* The private API of `ActiveSupport::Dependencies` has been deleted. That includes methods like `hook!`, `unhook!`, `depend_on`, `require_or_load`, `mechanism`, and many others. - - *Xavier Noria* - -* Improves the performance of `ActiveSupport::NumberHelper` formatters by avoiding the use of exceptions as flow control. - - *Mike Dalessio* - -* Removed rescue block from `ActiveSupport::Cache::RedisCacheStore#handle_exception` - - Previously, if you provided a `error_handler` to `redis_cache_store`, any errors thrown by - the error handler would be rescued and logged only. Removed the `rescue` clause from `handle_exception` - to allow these to be thrown. - - *Nicholas A. Stuart* - -* Allow entirely opting out of deprecation warnings. - - Previously if you did `app.config.active_support.deprecation = :silence`, some work would - still be done on each call to `ActiveSupport::Deprecation.warn`. In very hot paths, this could - cause performance issues. - - Now, you can make `ActiveSupport::Deprecation.warn` a no-op: - - ```ruby - config.active_support.report_deprecations = false - ``` - - This is the default in production for new apps. It is the equivalent to: - - ```ruby - config.active_support.deprecation = :silence - config.active_support.disallowed_deprecation = :silence - ``` - - but will take a more optimised code path. - - *Alex Ghiculescu* - -* Faster tests by parallelizing only when overhead is justified by the number - of them. - - Running tests in parallel adds overhead in terms of database - setup and fixture loading. Now, Rails will only parallelize test executions when - there are enough tests to make it worth it. - - This threshold is 50 by default, and is configurable via config setting in - your test.rb: - - ```ruby - config.active_support.test_parallelization_threshold = 100 - ``` - - It's also configurable at the test case level: - - ```ruby - class ActiveSupport::TestCase - parallelize threshold: 100 - end - ``` - - *Jorge Manrubia* - -* OpenSSL constants are now used for Digest computations. - - *Dirkjan Bussink* - -* `TimeZone.iso8601` now accepts valid ordinal values similar to Ruby's `Date._iso8601` method. - A valid ordinal value will be converted to an instance of `TimeWithZone` using the `:year` - and `:yday` fragments returned from `Date._iso8601`. - - ```ruby - twz = ActiveSupport::TimeZone["Eastern Time (US & Canada)"].iso8601("21087") - twz.to_a[0, 6] == [0, 0, 0, 28, 03, 2021] - ``` - - *Steve Laing* - -* `Time#change` and methods that call it (e.g. `Time#advance`) will now - return a `Time` with the timezone argument provided, if the caller was - initialized with a timezone argument. - - Fixes [#42467](https://github.com/rails/rails/issues/42467). - - *Alex Ghiculescu* - -* Allow serializing any module or class to JSON by name. - - *Tyler Rick*, *Zachary Scott* - -* Raise `ActiveSupport::EncryptedFile::MissingKeyError` when the - `RAILS_MASTER_KEY` environment variable is blank (e.g. `""`). - - *Sunny Ripert* - -* The `from:` option is added to `ActiveSupport::TestCase#assert_no_changes`. - - It permits asserting on the initial value that is expected not to change. - - ```ruby - assert_no_changes -> { Status.all_good? }, from: true do - post :create, params: { status: { ok: true } } - end - ``` - - *George Claghorn* - -* Deprecate `ActiveSupport::SafeBuffer`'s incorrect implicit conversion of objects into string. - - Except for a few methods like `String#%`, objects must implement `#to_str` - to be implicitly converted to a String in string operations. In some - circumstances `ActiveSupport::SafeBuffer` was incorrectly calling the - explicit conversion method (`#to_s`) on them. This behavior is now - deprecated. - - *Jean Boussier* - -* Allow nested access to keys on `Rails.application.credentials`. - - Previously only top level keys in `credentials.yml.enc` could be accessed with method calls. Now any key can. - - For example, given these secrets: - - ```yml - aws: - access_key_id: 123 - secret_access_key: 345 - ``` - - `Rails.application.credentials.aws.access_key_id` will now return the same thing as - `Rails.application.credentials.aws[:access_key_id]`. - - *Alex Ghiculescu* - -* Added a faster and more compact `ActiveSupport::Cache` serialization format. - - It can be enabled with `config.active_support.cache_format_version = 7.0` or - `config.load_defaults 7.0`. Regardless of the configuration Active Support - 7.0 can read cache entries serialized by Active Support 6.1 which allows to - upgrade without invalidating the cache. However Rails 6.1 can't read the - new format, so all readers must be upgraded before the new format is enabled. - - *Jean Boussier* - -* Add `Enumerable#sole`, per `ActiveRecord::FinderMethods#sole`. Returns the - sole item of the enumerable, raising if no items are found, or if more than - one is. - - *Asherah Connor* - -* Freeze `ActiveSupport::Duration#parts` and remove writer methods. - - Durations are meant to be value objects and should not be mutated. - - *Andrew White* - -* Fix `ActiveSupport::TimeZone#utc_to_local` with fractional seconds. - - When `utc_to_local_returns_utc_offset_times` is false and the time - instance had fractional seconds the new UTC time instance was out by - a factor of 1,000,000 as the `Time.utc` constructor takes a usec - value and not a fractional second value. - - *Andrew White* - -* Add `expires_at` argument to `ActiveSupport::Cache` `write` and `fetch` to set a cache entry TTL as an absolute time. - - ```ruby - Rails.cache.write(key, value, expires_at: Time.now.at_end_of_hour) - ``` - - *Jean Boussier* - -* Deprecate `ActiveSupport::TimeWithZone.name` so that from Rails 7.1 it will use the default implementation. - - *Andrew White* - -* Deprecates Rails custom `Enumerable#sum` and `Array#sum` in favor of Ruby's native implementation which - is considerably faster. - - Ruby requires an initializer for non-numeric type as per examples below: - - ```ruby - %w[foo bar].sum('') - # instead of %w[foo bar].sum - - [[1, 2], [3, 4, 5]].sum([]) - # instead of [[1, 2], [3, 4, 5]].sum - ``` - - *Alberto Mota* - -* Tests parallelization is now disabled when running individual files to prevent the setup overhead. - - It can still be enforced if the environment variable `PARALLEL_WORKERS` is present and set to a value greater than 1. - - *Ricardo Díaz* - -* Fix proxying keyword arguments in `ActiveSupport::CurrentAttributes`. - - *Marcin Kołodziej* - -* Add `Enumerable#maximum` and `Enumerable#minimum` to easily calculate the maximum or minimum from extracted - elements of an enumerable. - - ```ruby - payments = [Payment.new(5), Payment.new(15), Payment.new(10)] - - payments.minimum(:price) # => 5 - payments.maximum(:price) # => 15 - ``` - - This also allows passing enumerables to `fresh_when` and `stale?` in Action Controller. - See PR [#41404](https://github.com/rails/rails/pull/41404) for an example. - - *Ayrton De Craene* - -* `ActiveSupport::Cache::MemCacheStore` now accepts an explicit `nil` for its `addresses` argument. - - ```ruby - config.cache_store = :mem_cache_store, nil - - # is now equivalent to - - config.cache_store = :mem_cache_store - - # and is also equivalent to - - config.cache_store = :mem_cache_store, ENV["MEMCACHE_SERVERS"] || "localhost:11211" - - # which is the fallback behavior of Dalli - ``` - - This helps those migrating from `:dalli_store`, where an explicit `nil` was permitted. - - *Michael Overmeyer* - -* Add `Enumerable#in_order_of` to put an Enumerable in a certain order by a key. - - *DHH* - -* `ActiveSupport::Inflector.camelize` behaves expected when provided a symbol `:upper` or `:lower` argument. Matches - `String#camelize` behavior. - - *Alex Ghiculescu* - -* Raises an `ArgumentError` when the first argument of `ActiveSupport::Notification.subscribe` is - invalid. - - *Vipul A M* - -* `HashWithIndifferentAccess#deep_transform_keys` now returns a `HashWithIndifferentAccess` instead of a `Hash`. - - *Nathaniel Woodthorpe* - -* Consume dalli’s `cache_nils` configuration as `ActiveSupport::Cache`'s `skip_nil` when using `MemCacheStore`. - - *Ritikesh G* - -* Add `RedisCacheStore#stats` method similar to `MemCacheStore#stats`. Calls `redis#info` internally. - - *Ritikesh G* - - -Please check [6-1-stable](https://github.com/rails/rails/blob/6-1-stable/activesupport/CHANGELOG.md) for previous changes. diff --git a/example/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.4.3/MIT-LICENSE b/example/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.4.3/MIT-LICENSE deleted file mode 100644 index 0a0ce38..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.4.3/MIT-LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2005-2022 David Heinemeier Hansson - -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/example/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.4.3/README.rdoc b/example/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.4.3/README.rdoc deleted file mode 100644 index c2df6d7..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.4.3/README.rdoc +++ /dev/null @@ -1,40 +0,0 @@ -= Active Support -- Utility classes and Ruby extensions from Rails - -Active Support is a collection of utility classes and standard library -extensions that were found useful for the Rails framework. These additions -reside in this package so they can be loaded as needed in Ruby projects -outside of Rails. - -You can read more about the extensions in the {Active Support Core Extensions}[https://edgeguides.rubyonrails.org/active_support_core_extensions.html] guide. - -== Download and installation - -The latest version of Active Support can be installed with RubyGems: - - $ gem install activesupport - -Source code can be downloaded as part of the Rails project on GitHub: - -* https://github.com/rails/rails/tree/main/activesupport - - -== License - -Active Support is released under the MIT license: - -* https://opensource.org/licenses/MIT - - -== Support - -API documentation is at: - -* https://api.rubyonrails.org - -Bug reports for the Ruby on Rails project can be filed here: - -* https://github.com/rails/rails/issues - -Feature requests should be discussed on the rails-core mailing list here: - -* https://discuss.rubyonrails.org/c/rubyonrails-core diff --git a/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/CHANGELOG.md b/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/CHANGELOG.md deleted file mode 100644 index a5c19e0..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/CHANGELOG.md +++ /dev/null @@ -1,282 +0,0 @@ -# Addressable 2.8.4 -- Restore `Addressable::IDNA.unicode_normalize_kc` as a deprecated method ([#504]) - -[#504]: https://github.com/sporkmonger/addressable/pull/504 - -# Addressable 2.8.3 -- Fix template expand level 2 hash support for non-string objects ([#499], [#498]) - -[#499]: https://github.com/sporkmonger/addressable/pull/499 -[#498]: https://github.com/sporkmonger/addressable/pull/498 - -# Addressable 2.8.2 -- Improve cache hits and JIT friendliness ([#486](https://github.com/sporkmonger/addressable/pull/486)) -- Improve code style and test coverage ([#482](https://github.com/sporkmonger/addressable/pull/482)) -- Ensure reset of deferred validation ([#481](https://github.com/sporkmonger/addressable/pull/481)) -- Resolve normalization differences between `IDNA::Native` and `IDNA::Pure` ([#408](https://github.com/sporkmonger/addressable/issues/408), [#492]) -- Remove redundant colon in `Addressable::URI::CharacterClasses::AUTHORITY` regex ([#438](https://github.com/sporkmonger/addressable/pull/438)) (accidentally reverted by [#449] merge but [added back](https://github.com/sporkmonger/addressable/pull/492#discussion_r1105125280) in [#492]) - -[#492]: https://github.com/sporkmonger/addressable/pull/492 - -# Addressable 2.8.1 -- refactor `Addressable::URI.normalize_path` to address linter offenses ([#430](https://github.com/sporkmonger/addressable/pull/430)) -- update gemspec to reflect supported Ruby versions ([#466], [#464], [#463]) -- compatibility w/ public_suffix 5.x ([#466], [#465], [#460]) -- fixes "invalid byte sequence in UTF-8" exception when unencoding URLs containing non UTF-8 characters ([#459](https://github.com/sporkmonger/addressable/pull/459)) -- `Ractor` compatibility ([#449]) -- use the whole string instead of a single line for template match ([#431](https://github.com/sporkmonger/addressable/pull/431)) -- force UTF-8 encoding only if needed ([#341](https://github.com/sporkmonger/addressable/pull/341)) - -[#449]: https://github.com/sporkmonger/addressable/pull/449 -[#460]: https://github.com/sporkmonger/addressable/pull/460 -[#463]: https://github.com/sporkmonger/addressable/pull/463 -[#464]: https://github.com/sporkmonger/addressable/pull/464 -[#465]: https://github.com/sporkmonger/addressable/pull/465 -[#466]: https://github.com/sporkmonger/addressable/pull/466 - -# Addressable 2.8.0 -- fixes ReDoS vulnerability in Addressable::Template#match -- no longer replaces `+` with spaces in queries for non-http(s) schemes -- fixed encoding ipv6 literals -- the `:compacted` flag for `normalized_query` now dedupes parameters -- fix broken `escape_component` alias -- dropping support for Ruby 2.0 and 2.1 -- adding Ruby 3.0 compatibility for development tasks -- drop support for `rack-mount` and remove Addressable::Template#generate -- performance improvements -- switch CI/CD to GitHub Actions - -# Addressable 2.7.0 -- added `:compacted` flag to `normalized_query` -- `heuristic_parse` handles `mailto:` more intuitively -- dropped explicit support for JRuby 9.0.5.0 -- compatibility w/ public_suffix 4.x -- performance improvements - -# Addressable 2.6.0 -- added `tld=` method to allow assignment to the public suffix -- most `heuristic_parse` patterns are now case-insensitive -- `heuristic_parse` handles more `file://` URI variations -- fixes bug in `heuristic_parse` when uri starts with digit -- fixes bug in `request_uri=` with query strings -- fixes template issues with `nil` and `?` operator -- `frozen_string_literal` pragmas added -- minor performance improvements in regexps -- fixes to eliminate warnings - -# Addressable 2.5.2 -- better support for frozen string literals -- fixed bug w/ uppercase characters in scheme -- IDNA errors w/ emoji URLs -- compatibility w/ public_suffix 3.x - -# Addressable 2.5.1 -- allow unicode normalization to be disabled for URI Template expansion -- removed duplicate test - -# Addressable 2.5.0 -- dropping support for Ruby 1.9 -- adding support for Ruby 2.4 preview -- add support for public suffixes and tld; first runtime dependency -- hostname escaping should match RFC; underscores in hostnames no longer escaped -- paths beginning with // and missing an authority are now considered invalid -- validation now also takes place after setting a path -- handle backslashes in authority more like a browser for `heuristic_parse` -- unescaped backslashes in host now raise an `InvalidURIError` -- `merge!`, `join!`, `omit!` and `normalize!` don't disable deferred validation -- `heuristic_parse` now trims whitespace before parsing -- host parts longer than 63 bytes will be ignored and not passed to libidn -- normalized values always encoded as UTF-8 - -# Addressable 2.4.0 -- support for 1.8.x dropped -- double quotes in a host now raises an error -- newlines in host will no longer get unescaped during normalization -- stricter handling of bogus scheme values -- stricter handling of encoded port values -- calling `require 'addressable'` will now load both the URI and Template files -- assigning to the `hostname` component with an `IPAddr` object is now supported -- assigning to the `origin` component is now supported -- fixed minor bug where an exception would be thrown for a missing ACE suffix -- better partial expansion of URI templates - -# Addressable 2.3.8 -- fix warnings -- update dependency gems -- support for 1.8.x officially deprecated - -# Addressable 2.3.7 -- fix scenario in which invalid URIs don't get an exception until inspected -- handle hostnames with two adjacent periods correctly -- upgrade of RSpec - -# Addressable 2.3.6 -- normalization drops empty query string -- better handling in template extract for missing values -- template modifier for `'?'` now treated as optional -- fixed issue where character class parameters were modified -- templates can now be tested for equality -- added `:sorted` option to normalization of query strings -- fixed issue with normalization of hosts given in `'example.com.'` form - -# Addressable 2.3.5 -- added Addressable::URI#empty? method -- Addressable::URI#hostname methods now strip square brackets from IPv6 hosts -- compatibility with Net::HTTP in Ruby 2.0.0 -- Addressable::URI#route_from should always give relative URIs - -# Addressable 2.3.4 -- fixed issue with encoding altering its inputs -- query string normalization now leaves ';' characters alone -- FakeFS is detected before attempting to load unicode tables -- additional testing to ensure frozen objects don't cause problems - -# Addressable 2.3.3 -- fixed issue with converting common primitives during template expansion -- fixed port encoding issue -- removed a few warnings -- normalize should now ignore %2B in query strings -- the IDNA logic should now be handled by libidn in Ruby 1.9 -- no template match should now result in nil instead of an empty MatchData -- added license information to gemspec - -# Addressable 2.3.2 -- added Addressable::URI#default_port method -- fixed issue with Marshalling Unicode data on Windows -- improved heuristic parsing to better handle IPv4 addresses - -# Addressable 2.3.1 -- fixed missing unicode data file - -# Addressable 2.3.0 -- updated Addressable::Template to use RFC 6570, level 4 -- fixed compatibility problems with some versions of Ruby -- moved unicode tables into a data file for performance reasons -- removing support for multiple query value notations - -# Addressable 2.2.8 -- fixed issues with dot segment removal code -- form encoding can now handle multiple values per key -- updated development environment - -# Addressable 2.2.7 -- fixed issues related to Addressable::URI#query_values= -- the Addressable::URI.parse method is now polymorphic - -# Addressable 2.2.6 -- changed the way ambiguous paths are handled -- fixed bug with frozen URIs -- https supported in heuristic parsing - -# Addressable 2.2.5 -- 'parsing' a pre-parsed URI object is now a dup operation -- introduced conditional support for libidn -- fixed normalization issue on ampersands in query strings -- added additional tests around handling of query strings - -# Addressable 2.2.4 -- added origin support from draft-ietf-websec-origin-00 -- resolved issue with attempting to navigate below root -- fixed bug with string splitting in query strings - -# Addressable 2.2.3 -- added :flat_array notation for query strings - -# Addressable 2.2.2 -- fixed issue with percent escaping of '+' character in query strings - -# Addressable 2.2.1 -- added support for application/x-www-form-urlencoded. - -# Addressable 2.2.0 -- added site methods -- improved documentation - -# Addressable 2.1.2 -- added HTTP request URI methods -- better handling of Windows file paths -- validation_deferred boolean replaced with defer_validation block -- normalization of percent-encoded paths should now be correct -- fixed issue with constructing URIs with relative paths -- fixed warnings - -# Addressable 2.1.1 -- more type checking changes -- fixed issue with unicode normalization -- added method to find template defaults -- symbolic keys are now allowed in template mappings -- numeric values and symbolic values are now allowed in template mappings - -# Addressable 2.1.0 -- refactored URI template support out into its own class -- removed extract method due to being useless and unreliable -- removed Addressable::URI.expand_template -- removed Addressable::URI#extract_mapping -- added partial template expansion -- fixed minor bugs in the parse and heuristic_parse methods -- fixed incompatibility with Ruby 1.9.1 -- fixed bottleneck in Addressable::URI#hash and Addressable::URI#to_s -- fixed unicode normalization exception -- updated query_values methods to better handle subscript notation -- worked around issue with freezing URIs -- improved specs - -# Addressable 2.0.2 -- fixed issue with URI template expansion -- fixed issue with percent escaping characters 0-15 - -# Addressable 2.0.1 -- fixed issue with query string assignment -- fixed issue with improperly encoded components - -# Addressable 2.0.0 -- the initialize method now takes an options hash as its only parameter -- added query_values method to URI class -- completely replaced IDNA implementation with pure Ruby -- renamed Addressable::ADDRESSABLE_VERSION to Addressable::VERSION -- completely reworked the Rakefile -- changed the behavior of the port method significantly -- Addressable::URI.encode_segment, Addressable::URI.unencode_segment renamed -- documentation is now in YARD format -- more rigorous type checking -- to_str method implemented, implicit conversion to Strings now allowed -- Addressable::URI#omit method added, Addressable::URI#merge method replaced -- updated URI Template code to match v 03 of the draft spec -- added a bunch of new specifications - -# Addressable 1.0.4 -- switched to using RSpec's pending system for specs that rely on IDN -- fixed issue with creating URIs with paths that are not prefixed with '/' - -# Addressable 1.0.3 -- implemented a hash method - -# Addressable 1.0.2 -- fixed minor bug with the extract_mapping method - -# Addressable 1.0.1 -- fixed minor bug with the extract_mapping method - -# Addressable 1.0.0 -- heuristic parse method added -- parsing is slightly more strict -- replaced to_h with to_hash -- fixed routing methods -- improved specifications -- improved heckle rake task -- no surviving heckle mutations - -# Addressable 0.1.2 -- improved normalization -- fixed bug in joining algorithm -- updated specifications - -# Addressable 0.1.1 -- updated documentation -- added URI Template variable extraction - -# Addressable 0.1.0 -- initial release -- implementation based on RFC 3986, 3987 -- support for IRIs via libidn -- support for the URI Template draft spec diff --git a/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/Gemfile b/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/Gemfile deleted file mode 100644 index 0d36ffb..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/Gemfile +++ /dev/null @@ -1,30 +0,0 @@ -# frozen_string_literal: true - -source 'https://rubygems.org' - -gemspec - -group :test do - gem 'rspec', '~> 3.8' - gem 'rspec-its', '~> 1.3' -end - -group :coverage do - gem "coveralls", "> 0.7", require: false, platforms: :mri - gem "simplecov", require: false -end - -group :development do - gem 'launchy', '~> 2.4', '>= 2.4.3' - gem 'redcarpet', :platform => :mri_19 - gem 'yard' -end - -group :test, :development do - gem 'memory_profiler' - gem "rake", ">= 12.3.3" -end - -unless ENV["IDNA_MODE"] == "pure" - gem "idn-ruby", platform: :mri -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/LICENSE.txt b/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/LICENSE.txt deleted file mode 100644 index ef51da2..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/LICENSE.txt +++ /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/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/README.md b/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/README.md deleted file mode 100644 index 9892f61..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/README.md +++ /dev/null @@ -1,121 +0,0 @@ -# Addressable - -

    -
    Homepage
    github.com/sporkmonger/addressable
    -
    Author
    Bob Aman
    -
    Copyright
    Copyright © Bob Aman
    -
    License
    Apache 2.0
    -
    - -[![Gem Version](https://img.shields.io/gem/dt/addressable.svg)][gem] -[![Build Status](https://github.com/sporkmonger/addressable/workflows/CI/badge.svg)][actions] -[![Test Coverage Status](https://img.shields.io/coveralls/sporkmonger/addressable.svg)][coveralls] -[![Documentation Coverage Status](https://inch-ci.org/github/sporkmonger/addressable.svg?branch=master)][inch] - -[gem]: https://rubygems.org/gems/addressable -[actions]: https://github.com/sporkmonger/addressable/actions -[coveralls]: https://coveralls.io/r/sporkmonger/addressable -[inch]: https://inch-ci.org/github/sporkmonger/addressable - -# Description - -Addressable is an alternative implementation to the URI implementation -that is part of Ruby's standard library. It is flexible, offers heuristic -parsing, and additionally provides extensive support for IRIs and URI templates. - -Addressable closely conforms to RFC 3986, RFC 3987, and RFC 6570 (level 4). - -# Reference - -- {Addressable::URI} -- {Addressable::Template} - -# Example usage - -```ruby -require "addressable/uri" - -uri = Addressable::URI.parse("http://example.com/path/to/resource/") -uri.scheme -#=> "http" -uri.host -#=> "example.com" -uri.path -#=> "/path/to/resource/" - -uri = Addressable::URI.parse("http://www.詹姆斯.com/") -uri.normalize -#=> # -``` - - -# URI Templates - -For more details, see [RFC 6570](https://www.rfc-editor.org/rfc/rfc6570.txt). - - -```ruby - -require "addressable/template" - -template = Addressable::Template.new("http://example.com/{?query*}") -template.expand({ - "query" => { - 'foo' => 'bar', - 'color' => 'red' - } -}) -#=> # - -template = Addressable::Template.new("http://example.com/{?one,two,three}") -template.partial_expand({"one" => "1", "three" => 3}).pattern -#=> "http://example.com/?one=1{&two}&three=3" - -template = Addressable::Template.new( - "http://{host}{/segments*}/{?one,two,bogus}{#fragment}" -) -uri = Addressable::URI.parse( - "http://example.com/a/b/c/?one=1&two=2#foo" -) -template.extract(uri) -#=> -# { -# "host" => "example.com", -# "segments" => ["a", "b", "c"], -# "one" => "1", -# "two" => "2", -# "fragment" => "foo" -# } -``` - -# Install - -```console -$ gem install addressable -``` - -You may optionally turn on native IDN support by installing libidn and the -idn gem: - -```console -$ sudo apt-get install libidn11-dev # Debian/Ubuntu -$ brew install libidn # OS X -$ gem install idn-ruby -``` - -# Semantic Versioning - -This project uses [Semantic Versioning](https://semver.org/). You can (and should) specify your -dependency using a pessimistic version constraint covering the major and minor -values: - -```ruby -spec.add_dependency 'addressable', '~> 2.7' -``` - -If you need a specific bug fix, you can also specify minimum tiny versions -without preventing updates to the latest minor release: - -```ruby -spec.add_dependency 'addressable', '~> 2.3', '>= 2.3.7' -``` diff --git a/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/Rakefile b/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/Rakefile deleted file mode 100644 index e19785d..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/Rakefile +++ /dev/null @@ -1,35 +0,0 @@ -# frozen_string_literal: true - -require 'rubygems' -require 'rake' - -require File.join(File.dirname(__FILE__), 'lib', 'addressable', 'version') - -PKG_DISPLAY_NAME = 'Addressable' -PKG_NAME = PKG_DISPLAY_NAME.downcase -PKG_VERSION = Addressable::VERSION::STRING -PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}" - -RELEASE_NAME = "REL #{PKG_VERSION}" - -PKG_SUMMARY = "URI Implementation" -PKG_DESCRIPTION = <<-TEXT -Addressable is an alternative implementation to the URI implementation that is -part of Ruby's standard library. It is flexible, offers heuristic parsing, and -additionally provides extensive support for IRIs and URI templates. -TEXT - -PKG_FILES = FileList[ - "lib/**/*", "spec/**/*", "vendor/**/*", "data/**/*", - "tasks/**/*", - "[A-Z]*", "Rakefile" -].exclude(/pkg/).exclude(/database\.yml/). - exclude(/Gemfile\.lock/).exclude(/[_\.]git$/). - exclude(/coverage/) - -task :default => "spec" - -WINDOWS = (RUBY_PLATFORM =~ /mswin|win32|mingw|bccwin|cygwin/) rescue false -SUDO = WINDOWS ? '' : ('sudo' unless ENV['SUDOLESS']) - -Dir['tasks/**/*.rake'].each { |rake| load rake } diff --git a/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/addressable.gemspec b/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/addressable.gemspec deleted file mode 100644 index f43698c..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/addressable.gemspec +++ /dev/null @@ -1,28 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: addressable 2.8.4 ruby lib - -Gem::Specification.new do |s| - s.name = "addressable".freeze - s.version = "2.8.4" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.metadata = { "changelog_uri" => "https://github.com/sporkmonger/addressable/blob/main/CHANGELOG.md" } if s.respond_to? :metadata= - s.require_paths = ["lib".freeze] - s.authors = ["Bob Aman".freeze] - s.date = "2023-04-09" - s.description = "Addressable is an alternative implementation to the URI implementation that is\npart of Ruby's standard library. It is flexible, offers heuristic parsing, and\nadditionally provides extensive support for IRIs and URI templates.\n".freeze - s.email = "bob@sporkmonger.com".freeze - s.extra_rdoc_files = ["README.md".freeze] - s.files = ["CHANGELOG.md".freeze, "Gemfile".freeze, "LICENSE.txt".freeze, "README.md".freeze, "Rakefile".freeze, "addressable.gemspec".freeze, "data/unicode.data".freeze, "lib/addressable.rb".freeze, "lib/addressable/idna.rb".freeze, "lib/addressable/idna/native.rb".freeze, "lib/addressable/idna/pure.rb".freeze, "lib/addressable/template.rb".freeze, "lib/addressable/uri.rb".freeze, "lib/addressable/version.rb".freeze, "spec/addressable/idna_spec.rb".freeze, "spec/addressable/net_http_compat_spec.rb".freeze, "spec/addressable/security_spec.rb".freeze, "spec/addressable/template_spec.rb".freeze, "spec/addressable/uri_spec.rb".freeze, "spec/spec_helper.rb".freeze, "tasks/clobber.rake".freeze, "tasks/gem.rake".freeze, "tasks/git.rake".freeze, "tasks/metrics.rake".freeze, "tasks/profile.rake".freeze, "tasks/rspec.rake".freeze, "tasks/yard.rake".freeze] - s.homepage = "https://github.com/sporkmonger/addressable".freeze - s.licenses = ["Apache-2.0".freeze] - s.rdoc_options = ["--main".freeze, "README.md".freeze] - s.required_ruby_version = Gem::Requirement.new(">= 2.2".freeze) - s.rubygems_version = "3.4.10".freeze - s.summary = "URI Implementation".freeze - - s.specification_version = 4 - - s.add_runtime_dependency(%q.freeze, [">= 2.0.2", "< 6.0"]) - s.add_development_dependency(%q.freeze, [">= 1.0", "< 3.0"]) -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/data/unicode.data b/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/data/unicode.data deleted file mode 100644 index cdfc22418a51396f2b89cfc1afb2c892b30d7e3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 115740 zcmZ_12b5J+^1cnNb^vqEBBEk$GAIU;(2|rW7|C36YN7#Xa?TmaIp^4*AS#FrX2sNG zvoqu5ncw`sxAxt;>fLwwttB&6Pd%s3Is5Dr?&(W&VdkK;(U&KleD2~zkwlT~?CeDQ z>_lzLI%Fs6Sk^H+kz-jRJMoldow5^kE$f_}sApN1>_mObx@IRDSk^5&(a^H)*@>qu z>ye#!#_Ytap z!Jm)G2wUDzxBPb)pO6u@yrFLSUtxSoM%a#q$t^c0IQ#urJ$?b|<* zf2m6})h+iCs{g{D6J&%fZ>n4VZx~;Z5w^UkZux&;d`(8!uBN(O|Aq058ZDB&F-v`f z>i^--w@Jfo`Tvj?>JqJV%YBq6`X+=oabA)Ww!KxdKTc^lZ{f@&Cv1JI?54saNfmPs!lr{4IkkIhw~oJQ*y#+va6ZJDt4?>_3m@U6hx1XQ==M$X2nx(Lbz;$2`)D|LJ%9iXJ4)rF>2 zJGxR^xd_Td;$37;D|LJ%9iUu@R_UhI(9!b|lnn7Q%xR;JkE8>XbhOGetw!=Nx<>i9@HKq-b+7n@e&=s0cVA}E)L zcZoS|)bWvYfO0WfU20lQ)qDiyGVv}mr>#0Zk`7QVMXSrbCbyroD}-L5M5+LnL%Y(t z)zYcuBPdsica=Hq)bWvYfN~{TU2R$|omxJEa*cS`nA1)jA4vx&SEJRnrq$As_Ysuq z#JkR%cIx;@IzYJ=t*$q%md;WiLAgP^8_a2^j*p}RlBP$omM&P2$~TPCIpc zBpsmKh*me7R$FJOkD%Nl-Yw>IP{&8o0m{v2b*pK$bx3^#tdGpB<(K9UYlZbhpS zrq$LV^%0cY#k<{{4(j+wIzTCbRwYfVt*$KR1N-N_HT!`G;kF>G@mzO4p5#)s~1gctmEJ#C@+ckk~zKA@sV_Z z@*-NjY+7R-2OmLcC0;9YdaL6j=>X+rv}$cy6J4W^ptKRMjX8bP@sV_Z(i*MWn$|?u z=p!iY#A|0xA9Z{r9iX&DtM*=VGr5D%4oaj7&>mVx>(*2s9ee~OAzs3qTy=aT9iVhX zt4^jh)f3-GP&$j(*_>Q;d?X#9bV92xrZv?Q-$zioir3YgTy=aT9iVhUt8S(>O};F` z#lc5Vx{KG{oLqH$Bpsl1L#rO9HPvf~kD&AvuctY=>i9@HKG@5tQEI z^)@G09Un;tD810Ck7>>I-0=~VT=88Fm5qyv;bXw}!W7OMFON=G4Kl5zKKS_v$}8f% zV$MKyd?X#948n%LYFbM@y?g}aHSu0EXP`Phk`7Q_MXT4nhMR4AZ}$M{ezui1ByhRe zHcrF;3}uoh%jYSPs#6ka!xRDx7dl*tQ~`!zy(1I?G?D%znT!%|loF{rC6P8-AwV-( za14{?LdG%~Crge~B2}j((k3Vb_(teNCM~4ZBqq-ZnapI0EHy=mRGpGYo2n4tWm#|< zlQu%8D@mmNT^9U1MrMXW0DN9Zq|Ic~QOGPNvt`NIN~G!({1i?hKzCViK9gQT7BI;b zvd|OvfHGGfRa}JfBI&-!obE@1<0I+d+9c8zbMqxamne}cz+&w3QiTA^gf3GeRe+_? zmMa7pEStK5$x887Dv_#F5^1Xx0_4epYniMQZ=DjUIwg^|ULn9JS#X0V?gAZlylHX> zP~Ip@ZZs!X2ggU!!L>=GZQ|x*r1@qhV})#CvQ?JcszjB?HyDO zxj+6ru&eHKS0F4R0+xS=mTh}TtEkAb?^-pZUie&m7=`!TA8njb&wn(27yPjFJxoh> z(IN`63x{kDz=c-bdziSI0-v0m_GH^|5J9 zRr3*)PsIDgoLqH$Bpsl9j8>njmUVDmcm~rD(r03RM%G@ld?;NYeTsIUlQ=KjqNSbt zK?tNT#QcJ+y=M7PxahyzuiIY3IJE z0O@Nnzb0$1Sw565kiJ5@Z@efs?g;`X0DenL53`~2A*Aob{En=pX8BOMK>8N#3Qc@( zxr!l#bW+TdWUVmEhtdU7A=;fX@!$v*LkQ`#n5W6Il^*n=bb)jV?ap}7eXKYu^sEx8 z0-S+%PWxrn4#y`%P|k~Y-kc8V_((cHIfqu?n^spfA3^y+ydTWztd5VQ1C;O4>POQW z>Jzn(p!_7>Pv&%2$4Alu%8zLEvuauIuGV18W&el_u(9bpf$ zLI~+MF@H1b$P~3gC|w}^igtfeF|$+fLgbFzpS^%b(~O!e{e9ziEcqAr$F9RQ2PSVD ze+K_u+W$^Vw$&mEvgBWFy|u$xj>8@<1%HzUe>10pIzEyPQ2vTme-G=Cb8WiNe=ylE zQ-wXB1~!)9p+=|5urhpc60`B1t*`Zu=z zza)+@(T9-!Pt5-#Yq?oIlrE6|i+2Abah8cbg!KQ!{C{NaG|Pw51=9b}u1H$)0K41e zL^;3~K`AOvFGbC1bu>6Wk`7Rc;1N2_v}#8uYbzH)xj?)N%xR^LkE8>XG_<T=T>=^A|m3lU^bwS+ z#JkFzUh4QrIzYJ+t*$n$sjksSP_7a08gp{h@sV_Zay43AYg$uXqmQ6mC*F1DX+gw7TB3#z&X?6URqTZV>MVb9$@eBk2I;dbGOHv?i+g2+B?3-DFN5b$lcppxlU7 zH+#+9ByJIUixQ~<+zjnj>sCkaFFt~Dn|QaG(@`BCNe3vmqE$)l4{(RjJCsNjpd_?X z3IXmEdZ!Yp0+fPwmxu0p7QRYRE%~|!%H87KZB8qF5#%H30Oc;UDs5UVeP!z-DEEkW zk2&qs@sV_ZQW~x9RW0k_41Ej;A*B1nypOEyX8BOMK)M(0?k91&i9Uq%fS3=EwaqLa zN*74?quqll;)f<-%zOmpA@LqEr@J~nk`7QFM5}Dovff*->kJ{JGGdk?YlB%nlrE66 z(XOnDcy;K$g@ohkBPiv>D`(CCb$lcppp-?c#$J=Bi6L?y9D@5`6M`cIjsR>%aJ0bD zfXxYx5jY001;L2|Cjvf4aFW1DfG-oADsU=b8-mjWP6O;naHhbSfavP~UWUBF0-OQZ zo!~ry^8kAhoG)-bU@pN00v7-dCb(SSa=<)-s|2nB97S-w!1aJ*2yPO%32-dI%>p+A zP9eBM;10lz0pitYN4fa93(h8^8He39(c#U8)7>Y3N4F5|r7gA^%{aVE@ixYL6mKVd zB>9vo6J&?s^nNPuBsxIp7e?__{N(rBq{o*Lcc+!x>=O|mqkX=Lc=F3_(&y`lyYDu- zKHo&#{nXR(LgN{SmuUNwhSR$!Jw?>Lp>{1!6Ya0=8KW6TrYkOT0p@1WbM7w<$@Uga z$Fk9{F0RX(vG9P{EC$P%9Q-7 zl>F+H{2G^kuj6^G%fHtAx|IC-l>CO2{6?2sznfhCh4#BS#lIybzcnSlEhR6JlHcy~ zBig@YN`6O*Un(WPGbO((CBNI{*1vR0eou;jZ%Te&N`8Mz{y<9pU`qZ_N}ipPmr2RX zrsU;P^74|W>u^t|E z=T9;Q_`!|*b*b4G;EOgXYpU&X8>u=ec}`0HRLb&oQ}TK#dHs~-8>HkfyZlEzQms<* z)-L}+>wP3Il8}Ku;%;ghxSbxDEEkb)^_2KvxL%uI)5X#sNe*Z7|J_2vcp*9}!#&3! zA6Th_974C~2vZ6ss}e$t`C1wHk-GMb>W>m4d+cl*!vdmN7XbWI2;}gsfolu8@^X z-V?Hl$zdU@J;CWwFgtv+K|=^f#9BkvGP8UL;eD~zlC?>vM}ZIVaYUpMxPGl8ahr)g zlyeEf|oDlV!QdSZ=dl zPEPeH0;d3OAvjgwRKTqSrwN<}xQ*a+fztuE6PzJ%2H*~YGX>5B+(~ejz*&I12n80OJN=&xJ=+Oz;_5P7q}eoU4knFt^jlN4;0TPRKD54pHAS=71q5f_)~9rI{8EEGe0-P6mUWrrz&O!TLA;1qpe^4S-fbXIGs1V>Mp+6~+D!`A>epU$Z zi_l+`NEP5`Xum21_)X|d#a>=H|LwC$OYkEdIhp_gB*7 zdV!)`G>Tl9yj<}EiZ8wt69mYb?G{J0Mx zG#2YZUapCdioVSkmxNr-BwNT8Ov(tkl1W)1 zS1~CkNtpUISQ>;I#s;1*}ByI)T>#Rwj78!0Q34 zcqr3tr%g8>%5;Qy1H^}E=^F*!2>1xWn*`njSe4+-0&fO;~ zZ31rte1c#Jfh7Q|5xiaC?SRz@mK0bLum-_91l|EylVB-;@o(8c9#AhN=Z(G}vcMG|#K`aWf5v?XoU>aa!T6&9J z@_i^bH;5NNY(h(4DDXnSrUWk%coASTg6RU&0h`-;KAfR9vJlFR4q^txXKCq7fti3U z2xbY)0&GdJn80Fy&k-yxusGoJ9?Dqmww?5$-1i_}4DkgLciN!)P;Pw?FM;@?i67?a zNf|=9`$4=E;!CtWmkGQK@MVPnt%SBxB2|Ewp|w^B&_-w*B~k@w4Xv$0fObOLDUm8b zTWIYS0(21CL5WlW+C%H85FjBmp+u?x9ieqn2+&z*XC+bv=mf2cLV&J9yDE_?Ko@A; z6asV?+FglM0lGo!p%9>_(4I=93eW>uFNFZTh4xk=Re)a5`X~g*6`HF=ssMeU_4N>w z=fkbxn-UsA>L+GDvbLG!L+JvkFWU9jbpQ+yIzWk30s2E5s1RU~&_PP13NR4bD+&Q# z75b_YsRFzL?KOn}uM2%$iBthzgEm+pz!0HBlt>j|Ftj{@^aHSADf#e}d_+nI{1Za~K0!$VzhmO@*u5MYJS6-uNEupHV-g#fFBu2LdZfR)fzD+E|0bd3_J0<4C%Rw2MTq3e`L z6<{s2^$Gzt2;HDWssQVuZBz)bN$4geQU%xuZL>mvEkd^_kt)DuXj>HmY!kXoiBti$ zLfftoV298hN~8*~9okNX0K0_lQX*A=ozQkG1lS{Vj}oZ@?1r{iAwa&+d?iu^*b8l+ zLV*23_bZVqz&>bic_=sG8G6eMA*2Ih9w2MGSw565klsSOgSrlYw}rl~M5+J>p}ngR z;60)5DUm9`yU^ZO2yj&BQ6*9Zcputv4`m-F+1B|G(uZPxNY+NPd?;NY9Y?#5NSve( zMd%#fID9PT$7F3Z%ZJhh(no0bi5HV^%!GcbM5+LvK>LjPO}EYSA*9d6{G6<9X8BOM zK>7^rzR-05d@1xxB~k_W0@?}d_wg*_h1S=>*z+Z6ccPP2R{T_Bx8yE7!(5Tjj~PG`kDOV&=?2_H%qNN3RQ9Eoq3 z=tD^7#XL{eKC^r%T_Bx9yYIc|#^eW~KPZtZ!1vI8w0VhADqBIYkV#~f)zsP z0_iVk_g52-uh8{|5Ypeo{F_-Hj#Mjz(go6A(e9rn9$%wk2qFDT%zv5n;aIgoC|w}^ z6Ya`eL{E{eE&?sfq_vQ8Oxg%3&!nx83QXDwsmP?gkV;HC2&v4ZqmU|05<(tk(n-i8 zOgamx%A|{sN11dL@)(nDLLO(*UC0wmdI+h;q^FSTOnM2a!KAm4noRl#sl_B$$dgR^ z3aQPcpO89C`U}ZnGC;^vOa=<6%Vdy{dQ4ssQlH7ILK-l6O-Mr~uM2sa$zUPRFc~7G z5tE@p8Z*fg(uBz{Ax)VK7t)N$2qCSM$h-w8a}hqf6D%vREMOag0rTrvL{LtShiC;41{{ z39JYBD#7{!>jS<mV1iEzd>U{F!Dj?M12~jmBY}+o^9VK;*cfma z!6pKm01hYERA5uU5d@nFYz8wQ+Fj)%p^}Z=Cx3B9>P06RFr{r^7{%s3&9e|}2-MoPXQC1045FG|UmxZKvaG$mh_ zk}prmSES@CU2fyKDkWc?;;%`muT9C9v~fl=M1HcS(A^rh6p4LDRjG-l%E5q&I20U(%a3 zeM{0?G(8~ct(v|qDZMx=nT{MU!Z7c@Sn=gl|HX$8x>MkeNSS7e3!PHRlrKkp8I%w@ zFEn(<$p@4|D2NllHy;Hf$_RW=R&rmG<;=T zZkty&rCu&2FQ4L9NU2v$$t$J!l~eL6Dfz=G%RiD*ubPrSn&Ll}Qhz+9{zOV%EhVp> zvV4t{dd-x2t(5wcDfQYZ^*Sl_oRs=gDfvBF$#XZSWbwkKD+`zIO7|-JBPmUxMlQE0)HtQyBqe`V@*;_Jw@cG`BSPZV z+JdzitcApBEm@n%T1cGs9BcDf3yIU7XKfK{A#vIZtSx3OBu;ygwKc4T#Az?Fwt=;f zIBl~! z!QV8ZaFY(cCT^+vqS;bSC2gVC(`J&stm&K7bMyYfE&gG(c%de)=ewkB89|yRPJ1s! z(=8OuB~Ck%qPdTtaxoFjK99c7+8ADGNL;rMM6>;U>Jp@Wif$WGxK)poCT^*^tc_$X zBu=Zx+K9q!Iz7-WnK-S!XtoVU;`9VH*)h9thx<#pvcHsbcmAb@f3fpCuGPbFdL&NYkJGOu4J+Nfrf~Oc z-SKZyON+F0@nyPHX5n7nU2%A$kyd zxqPVRy_0S5cQT6?=5H#@cXK03T$?^_v0=JcZpvcr!(&*?K1udXYVKyTZ*$>3_xBk@ z)5LY}m(=7#ZL%~(XGDMQu!TE>#B~@DbwJ5F43tt)+v7ng`70^;t10>5lzfQfMG|4e zY@aZE$;55ZP`8-9j>=2Phe>WH_=uG9$dr7lx#JR6@JyzJ!Q^?ssT;ufnU z8iojoe9oyNsSWQ(*G1{7>yZ|r_Megou_yv^9k}C)iniaj({f|1W)bSC%yedkO zTk$B=CoGFN74aG8d_awTJ@t#{8sr0%0=Q`WKL^!d?X#9T!>cb zrd2<>Nn5!HN``nD=CoGFN74aGI$C9_mUVEXe*ZLtkg~+gB5Q?NK9nwyGSRM>ikUTa zEPMo|xOm0QX{(Npqyv;%gXDM1mzC#?l7mLIzEyPP)edz zDbwocx#lA%cZzqXIUUvUk#vAk3a#!ktxotJMW&CS+%4YS=5$oYN74bxU1(L>v^sjO z`3TBA;@x9TM|FH89iWs(t9wnWbJX9LuvIRCa-VqjnbT1nA4vx&_oCJPrse1q^bwQ? z#CyP;ggQQw4p8n#s|QufIyliTy*`BWkeCmVwZSYON*72EqFuI%nRSB~A}D3VD`QS) zb$lcppk$*}S<~w3!S)f9a^jUUr?Wafk`7SHqE&g*>gvVUM^Gw=SHYal>i9@HKq-$_ z6-}$BYxEJ6O5#;Ar;9p1k`7QRqE%(pik;l4zXZ-=XjR0m!rqQ>Hp26IzEyPP->#plcqJ$HTnojZSiWG(@h;8Ne3uTqE#K! z8t8%c5tJP9a?I(bj*p}RlsahjlxYq0K>G+vUGeIg(@h;8Ne3uTp;bNAvJTp>f(ap{ z`eN26%YF&QLH#8d^+c+Nb`41Me_t6ti9|d1WkE;{#cW8H|Lb95>E9GFs-xDE9? z1f{8XP0i_{j*p}RlqP7^%(SOO>3kx+ec8I6Yn{5da2_h=>VlAT0O5?v6H*z*i|#c&|VPt1@`8W=VR#v z?Rm6(QPs>wdb0Qk%1h$CWKJ)2d?X#9yogpWo7Pyz!$(kBiPy@U-s<>BIzV|Dty-Jb zSjWRhP}+#s#+=^j_((cHX^mEGRm(awC#+IKNbSUIN7h`kd?;NYwMD!3BrY`3hmbmm z*@3J@X8BOMKx&V69aY2;T^vk{p(Vsku(yOfA4?}_9nrFrs+moK7$PX0#p`TNA9Z{r z9iVhVt1hNB(INH`l&<1+HK&g{K9UYlx}a4z)0*fU@)4Bo;&nHtk2*e*4p6$GRS(me z=tbE_P48?gOlx{{ssC)`BPhMa>upZ1IzEyPP%;X5ba)3F|(Qe!)!i+@~U{R zn$uSuA4vx&ub|ayrZv-P=p!hvi}$)Yebw=ibb#_2S`9X>dAJc~`UuJp@rIbwPaPjg z2PlKlYN%<=^~U8RD0$-LnbS`lA4vx&L(yuOY0bmPW2?d=!Eo`0o6}DnA4vx&!_aDk zY0dTQ_Ystl;*B(?pE^F04p2s*)hN@N>yY{g%4qRMo6}DnA4vx&qtI%MY0v5!eFSB! zcw^1!ua1wT1C%jnHO{nWbsT&IWxROf&FQa>kE8>XacDKcv=+KXA3>QY-b8Z-sN*B) z0A&JNO){;e{>yVdf-+gW$>t1H$4Alu$|SU!Vp>ZbQXfH?D&ACc2CCyD=>TO4T1_*p zrCxM>1ZBE-)6E&Ej*p}Rlxb)+!?cd7`N+MKo@qiK9djQ!VU`K~^dBi7tM&sLO$ z7>~uKRXaM`-(7qJWr=u8%xR^LkE8>X#b~uuwXB0f!&O2}x01x6VK1be+i6Iv#9T$zVzYcGT_CMQyVWEP z4cB~Wm*-#Str2q#S&Pl`p>%{nhXd`LC0!tGMZ4`PxoS^%0a^;_Wi0ojN{}4p4TY)o#;jg+W2nFmiju z+ha~Ub$lcppzKDgy{6R)1AaICK9UYl_M+83)v^xS?_mugr2S&EE|B)2-J2wi(V2vHVZOa3=38W~Hp_?71=5>ncYwq(VL)UAn;^B`HP&GMmi zfph@v-X?KO7!+w2M(&W9hsauOmJg*1q_@%T9ThQmcG79>V`%S+`!0LC$n&vug7ywt zzNcztPS}$WK{+hmVRI7d_((cHc@M3Qn3ki{(nnC<7w>&@66*L!IzTysR!2>1sG5(U zd?4Nj=5$xbN74bxQM4*Bt)XtbkDweA@0dB=)$x&ZfKq@~$5qQZIL#)d40>cJCTpu%K9nwyK0>=sNSqe-LN+u^-A~2*l&r00`B1t* z`ULGhBXOEdN*_Y{T+GkO+G>^$r3<9b(C!Nri=Esv&ZcCDp?xXtm+Xxv&&SdU+81bf zLe;Ey7V1EU5Yks-enr+IvwSFBAe}(FuSr~}1C4g!O7e}E-;lM)EFVf2NMEDfw07ibByph*G}?tL$w@I!lC{VzA4(TUg=lw*#D(GPkzsVV z97w0dJWbXjvwSFBAe}{fPOdsWk`7SLpw&6knuY;Et1xQk z#XE0Kt~x%F4p7da)%U7py<|=1*j8 zG|Pw51=5db_cMtb!d}RRhF$$d%wNdbXqFG93#6aX?pG2w*rE3!q~FB+jjWAk`B1t* z`W5Z|MB;{UxMb_X1o^X=e=_POaa?``w%Y>i9@H zK=}(={nfMi9@HK=~_L{oS+{VQkSV9Dsj__YZRhsN*B)0Ojv! z^-t4UgmFcyJpY*gFY*3m&H#0MBpsmq6RnEe7QUR6h2K9O{_oLezM4}GgwlE)W5b*|xSE`7upF|_$V|+zN)El8*#p+~IeT*;shh-E-6->9i_aUUq#k?W1bl0cr%(+6W8`Z+9^fwe+ z4CPAkZenjX?X-`fTqWMk?CC#7>iUJ5bG3N4u&4hh2R!>%Ij#|}gnC&8J8WNli0{dW zR2qYFdnD@a?g&Tv9ue<>SW-o-O`obP#usKpy%*{otm>l`RDHI(Pt^OMmSR;O{ajan z<+)$f`=Q>+sy_d@u3mjW)CZv6#p*&jAAF3j(1`jV)Vo<-M5>SRl^jtYf?8VDtb&;~ zrapvJLd<(2O9ynO&Y#=Gx>qgiz)G4IK88|Ky!+T&MV^nL+#%lm?CH-`T<_J5cZ-*;p8Nv_de!zJzEdMoWejqeNYvrm z73O0V5vxEft0J~uAI~htmup0Q7-~6IH_;&a7+=*9^%1D$S=DDq*VRw5s-jkfT7gyl zhen|4zcliwsEM9mHnNLqWW$yYE4$@$qZfne5@yGJ*c%qD)hYF5Dl+j}2EdP2;c$kJV3pfjhMSWl^i{ibKA5JRahUS0O+87kkNp=yX%k3D*Z zLccI`YKm8%J$i;hzu?sp?`ieqA1w(-I)v`WFwaCv*ik4h#CK|>PYaA&BNef)^t2OV z*R3&2^qiBg&pFRYzvs}e39Iy+gMP_2q8U_+>`Jr2ctsII3b4DIJt$9=QduRdf|m5 z)-<_h_GklVCu8($F5b(wb;m~Ak@X?IcOp_p>_)3d)Z;rk9N&b935cy##8%NWPKfaZ z6j3`tZNn-(#IOKY(3C?E#HX@Y;#jjXiqC$+u^m_TqJCkDhVz?HQ+o zcsOsu%GH#9Zp;zdN5%-~znz7wLUSeW{y11jvJ( z-?kGXo`Beox@`!1>H@sZ73nKT{i)l2+cqEKO^S&BggC&u9UJGnB?G*X5$Ru$23j{< z!NXAqAzs*t_#?zY)NOp|<^sI>6X_>NuTVF=X=UMZ&cn2&+R#^)bG|BI;R3GEZ zETWEuI*ip}r1}`&L=kly)ZwfSC)LOJUW=&Xp^jj61gSp8mr_KX0Cgm*BT4l!zTzV4 zM5v=!9Yv~-p$!&yG<&1T^D&em;*DW%40%3=GE}^=?2RSQ$58Ub8^_)_@_Y@6hE$M_ZUqRqlkPiA!ysXoT9pBHsD z)G4ekCe_FIjq{?;fjX7dC8YWozpY->xlpIEx|CEO;}_J6IuGh}R+o|LWBhV^QRhRQ z!Rm5SeT?5{FX|gmXR^A2R3GDa;fuNe>MT}QlImk6PZLNBEd6y=)4+t4gtx`$vTJS?spyJ(c9=Dtg#_h!ypcjXIpP z++lOy50_6r;fvzE#W+HJW?CN~Lg*vb`_#w%cvt$k0L9$o?%Uy?8MYa(?2{p^gJON4 zYr~Azj~y1fT`Pzs_wi9)Szv+WM@bpSW04dFQY0G5<0{GLBt1`jh_AuOHhqBu_hBUJ zsj@3vGQJe?ONbwth=2P$40{OO=6{@2+?Y=aQ`rTs{F!wq(08TSJlgEfO*u9u>{?a` zU6(IR!E0#UGaq7Ok0-a-4$5r10{9Tthhm+GdWC&L+i(TwE7n&@%k7r`wNe=cEiW>$08x%4MT;TTZ40RZyZ*q?L&?#plCA`Lg z;zE2GMYiT=Y|S|mhler1uF?>kCuOWDK6I=5-jsr6I!YnLstS{PZxdyiO%xx(Iw{tV zQ7@e+%XFd)6ziv?<%TGHC@*jUii47SXKPzzZ#aDj>#SJ6*xC;0i!5Bd>1g~)tMbpO z83oCQBso~WX*vDnX6H(e}97?+sThi=FhlN_hPc91Rm`|CJ5>FAmmUNt|G! z4_&XnlQP;4mJgls4^=SN>E<6|C;d|;`8k3f1s`I2`pZWBD`~l-5MJ99xB$fgV*H!> z=nFu30hyfb@)`!#f2fcDHE|gQ$zKsC?_Xg2m;30h7ueJ4?_&L*^*ONBUlo&q+o}Kg zCduc5knzMKcrU}#qQhPs?b8oF{ui=P_28UJbj@>aSuS>kF%t75@z_)izCWF;&pC9YPrYR2ui>q3ti#q7{_(C0bEwKcbbC_9t3d=>Vctlnx|%pVC1_ zGf$10qWl%(>5nRXm1t?DuMxdR>FY$hDIHAI#%Bo8GU^T`T2^Tu(Q-PSi$t z1W_B|kwk5TM-jCV9!=Cncnnb+;ju=e5guopMtD3?8{r8=ZG=}E&1lqHhvK+k`pwfH zrsN+{$-q=h|{l97XCUVKbevjx!qmAY+Be%S9t@Ly=}Yy@uKs7|lGe(fCEg+dR}={q%_ED$g*U@s3?YvkasCld2app58%e zaiVpUUi^pjl0T%E678rRE;E|(w)^F1?oM^N;q)ApulPfHCDD57UPZKv(rbt|PvvAa!6 zs#J(7&rwB|vAfRmRFN&P$_rGHZdQ4bDwU$jOIFE}_2_`UYz2Rbz+1c9G3#1cAtNVw z@xa?UskF9AW{#G6NvVyMGIE-^mEh;yQfX_I^ib#{g?3iRXcpF!E0y+E$!wMav?GOXRH*4U>@_KLr$X|a!>^f;LJuk=WC?tqL-@7M zioL9unF!U^Qf-ZDZ>we``X>9fkzyMZ`&cpE*V;<0Eo!+|%joOZ*-nb>Q0!~P%)Vir z?WNit)qYmZLe($aLCPIa?r-IcME~R_b(CU96bD!_-PaOQOQ1H;Y8m}~*G^LGgyJA8 zX7&&3>@3yJsJ>#=ba!);gNj-g)Lx}po8;znm0DNSUZYyuWUZUjx}o+u)w(8Y-KEwY zwK=|q7m}w&Ogg$#${f3U_FR^xkmO@0t!HT(Nj`Sc2PBQ8)rHte1uRjgk=*GROSDZR zd7CaQnVgTZN2Bs=n?meXm&MX3l6>r>i&+{=l8>EKilrqa`PfN!v9ydNA3N!OFX1_} z_^DBA@ShwQS9-uomnKVGeaNavJ z=x)MeD)`6=JygK@mj=aRC-r2B4*qC9_`PfNo zSz1hzkDauRrIjT4*h%YIT1AqNowR|aH6;1iNrfbhrV}#6PCCg_zI7VyV<(*=Y0PAk zLhPi|EYbCJ3|~)wWQk_x7@nCwu|zX-4A0D;S=vh54?qy-L3NCWO%cb>XvO-1~d+9%#a9P7+2$wTFmT-B);|NzUJf3hx!xIQsGCYxRWy6yQS1~-< zaAuio<5QT^eokdhJ35Uy?df#pw5v0i)4tARPCGk`IqmIi=Cr$WnA85wC0>^HcOLQ5 zt!$#tXWrWQ8_e4nU%2rPm-s>o`>F7hFMKJ5 zH>u#>{eqp4!dp}bZ;!r`!T~CTcR^oE;UEsNa1}dH1mbCQaDP5 z=Du)F3LjA6SzkCWg#s$H@P+TCaEuDc_xJdgjuehlp_MFwFIEcQUP>mOJ({*o)^FcA@qO)!h4dnW(7kM(tCowNI{ZkJR>{_8HaOkB?-! zqP7>c&#C5q1SB&SwS3gRpjsl?bDz}qq4p)!IwfoSrM4fn6IAP*ti36Uw0jl+5yzQp<1_O&x2Ash}ySQb3adzX^h(2sC`GZ9?9hnN$n77g;eXA zti2<(cThV?wO+~EyHa}>wNq5=jLtl_VZ1EkK7{>F{D*z^&ny;s$ow-qli%f$@4*y}_)6`Q7V+)MFNpYlb%y$o0o*waW$}=LqPSm&`Ix!tU&VavF6CDjH#BE;P%zUDI|KP^|mWVIW{%;(wsFTs3? z9k1J&FSYF~8S&&7TIGDXBjPsBr6O)Wr@xc=vMsuucQIc#N%`H(*V}w3&3uC$uX~tp zoTz>7jrd~a_eI?L+|PW|di5WO_$K8KGT&kI^Pz~_d6yk=>r*D;_Uo9-GT*gX*IO>) zb{!}mak~ywV7_Oo_Nf?gTW=-i^zW-yj`&pVQ-yiH9mj_wzDWH?B5w1cD)aq$>OV^S z+$cLQ9*el0M~^cfJy!cX!F<{V<<%l?<5QjajFIZsh`611H6y-M{aO*X>(!IYXWDhL zcEoM|)L}k%qxR2XKF`MIsfgQstuFJmw%&To*V*|}KjOCi4VbUDT>Y;^&9hb*~xoQLA-(nn&E`)w2=bqkfBs+j-ZL`DmLz z&qdsx6P}N_jl&Df$E?-$zQ}ySFy${re6;eHnNPL*SF4CGSHCs$X|t5KiMZWg+D6>w zTf2zcylu~XhRu@>5uc*#?Z|w#9hXGJ^VRRfe2!huJ4f7(R~P1U&F{*5fgP7_5x4WD zd&KR$=)rucUAKEOUvBrKUJG`+o*`!c{iH*Xq&fVB5uzQVOlQ7vhmQXY z=9@++pBZs`zMU0u8@JiaH_z8TbC_?l=YhEqx9j0N=G$%l%xAva#{UiGd+hvLz(^)8CIeJ)!}{D+}-UN2!j+|HM!%tzXIE{nL$hvgBs{wtVIx8t>v`3yV0tC-KS z``T*ebL@JxCgOHIT+4i}-M`i`pKsf_KH_iaao-SeyDw~vxP4CC#C(Cx^UV=or~S7? z+~&zv<_qomxsCZ^+pq1+m)Jbn5plcD>}0-thHlTUh}-kb?uf5de-HE3wmo~9ubHKO ze#C8i_Ay^;&&m5EZqNB|M%=E4Z$;d$&j*;Vv-buEnQyW6zRi4>okxcvZugycnD4ee z??!x&j>CJ*_t@v7!x6XZ_K}F&ynR37Hvf-C-0sUCFyA{tx2GWDQv+jah9=KE}aKZ&?q2R@CsZBLPGeIH1FiR)gWMNjD8DY?((XEeXx<=<=m zfXlzt{6Uu&YW`44UQzNQD7$Z&*j`m8ewN-kRf)JgdT1cGMjr z4VrZuz}imk782KOV2Wnlpjo$9Slh$hLgKo;nxa`ZXx42SYa_T@NL;tsqFtgFojGwj z*Ehj6C#!_-;TD@07i_g}_<|hBpsedJT1cF>k+m?%+)6{@ zw9Tw-;%*^v+E&)Kuoe=hZD%da9=FnvIBh3uJGfg&oVJ^_U95$~X?s}<)55JZBu?AM zT0VCRiPPR>Z9i)vaoPdW@`jM6iPH|THjK59IPG25!d#SH$P0e1yI8 zDbIY^P<;xkz2_9)xP2yi zG~)Id^RbBAyT`{PZl8UgU_Q)dTD6GVyMpQww|C|>B0fsDzh=bkXH2ysZtp0bjJSQ) zs2y?p3|=SV_U9M?IMjGrw2F?VVolh}$^#iMX9#xe>SXt8c{ZyyzEkoB#bIZu5LV#BH7r zjJVD7K@qok{z}Acp1&G#o42n;+}^3a&V0DtPX|Zb=GBmh+x!{Ie59R6c@ekm8OD6L z&7a{Bw|9vnB5w0)B=Zq=pB)u(yU&h}xSbbcB5v31u@SfH_PB`Kc{)DgHV-F6+^+Le zi1T;brZV4c<2;S|PP;!&Cw_LWy%U~6{LD_fZ_bRk&9_+*xBKaA;^(K?ahyZ^41ITQ zF7ussyyivRp3~+NKfBbldb zDi_3+;a0gYu8gqCMR8@MRnp_iXscwzm9bXIj4R`;k`-4bSfyB8nP`>bab=QKE{-dc zt#V0RnPQbot#XNs^~vFjtaw>m92ylbkBfOx@rt-OJStup7e_?JtK#CwsCac;932&} ziHl>S;4Jw*T=<)QSpYjI4LUL7#Al;#hc>dl&E-fT*TI{x1&sE>@XLe7s%AH&}JA9p0?&8Xsopc)B&6Tsm*Vr

    5U6}*?X%Dr4UH*b_x?&Au+ab%VIxpHpfR;xS^Rpza<%7a|_VI-YW4{_z} zyal#QHdoHgTxOLrQDxz3tCWo@^XT}Lwyj3c2<^1SfR;kF9?>E!A zUWqH`m(fwE%$2iaXxyrB<;4quE=HD`)o7(XP&w??=*+s}WbW*#5k1l}vuk(JJEh+M;#D z?KMQ3h}&aO+lbr8_;wMu$G-LvAFVgl4iUG4exj$*CPgIh- zla_L$lH8lL)Hf>0ok>gmqLSQ~wA4Q;$z4fH1EP}Lle9E2D#;y5OM{}4+>f+0*h-oF zfIEaaJ>U*yP7ky6luu^9&|c6?VLs2!^r^&g zE73mFh~q}0d^&O5MwHJWj+=<`nZ$7mQ9g?}ZXn8M6Fp)8vzg+v)ac#O<>DS;TF6e;#prFZM;mH|g~FGU7J9Pek0_+kO>syS#iIal71o z6LC9DzKwXkZqIiSx9^-4GS9Qq;bg?^{nx38+XLR|h}-SyOvLRy(bFk#?E&w6 z#O-$QeZ=j-?}v!ngWr!4w+FeOB5v=&e~!4_4t|Nay%+m6;`W~Iw}{(q^iL7D_sD;a zxZTeF5^+0Uevi1FFMo}=oiBfjxScP5kGS2o{tx1pL zNpi7Ov1+Uo8=uF6e@Uva4vX`)U1|chZSCni2)6r|rB*R?cIsVjReX18Jr>t-yTVFn zyWSlX8;~olip|Cvm!)jgRgr+jv1@~Qv#&M*t40T#@Yh%ghfGSC3~pp>RIfGXI`8By zk^`4Fil^3friE7c7Dhb6*PDYqOLznAVsNlu z*jl?>-)sUlW0O>e+8nzjs^TDGJnfcoYibpp?Row-t76sLWW!_w>;x=f0`_rR^89j} zX9Iq_IcT!O9q#BPEolO_e^0WBPNzHmplVl`Qe1WOg!lbUs}?_`G?HGD&R!NI@_ukOjK=H%0#89yxy`_!g}T6 zAFfn(6)k5DHXhCrxBa&7 zh$@+b9mH+Op7bhP3C-uYYnnahREesyuvL6;AC9V67L(sj&qq?LIC*#KEUg+(a~+G9^`t6~nk;SK~YN0>#n zd3DUe=HYAP$?L5NIVNDx7VsVUDJ!ABl){;4gHzWWEROG=+kLa1m9T0lrQ9s)rwB6a z(LJky2^czDVIbI1YxoCM+pwpjDxQV#IA?qPj8(C1*e`j~;Dg@C1nd`tReC@hTM1jW zMlK!nfYijQ=!`1187H`HSW^?w8DnC1mS$GMfTJXn|Mbw!yyeZ!!P;>&qi3XNt(uj6 zo=(daR4BuRmQ*Oqh3BYHjtkFIp*$B}ph5*Myhw$LTzH8JmALRS6)JO~6&0#*p|ut8 z#(^tsxDxGqTdqVq-;OKM-nZvUwEG>n677FSu0#Wn;7T+CowyPWL1(T+W6*^vWur0Z z%9Usgx^X2MgYI03#-ImRqA}=cmCTM$x6*T_m+_3YhIQ32hBI5Y>ZLr_ct-bT ziu)4o(MItg!^O|;+H!7`{RHO~DxI6P?(7tMhwv(u&MsZSZ#!S3(z#g^&TY0gDz97V zigOEBpWQq0%-%Wtrh2dm89l1$HVz@&&G1menFV`|=NZrFYIqpo&W48*u3KH#If8I~ z!y^gTHayC3W}8-Bw99DYS)I8s#tIodo>YG<;ckY<8OEL(A0P1!+Gc|BjIM?!67Fnx z65%=nwaH||nVpGGAzq*ORN}RXPb1!h_;lmN3ih5FHdWU=!zx)_xiFIoZMiUu3Z1zy z+X@-&yXqR|5bkDpu3?O`@p;BGx*DEOxQ*dA2zNHTz;IUAt_SRe%0eo%;ld&-WHMiD zJgYMomQVq!usiuuDqs~>SY`#R!uWFIvI;A#utKq}r$$Zhtz){!}|z#HoTv3eZy}W&g@)ZPm*sDuTT7d@vK%4c70Gc{-6~ys`pg;mQk6Xz?tJAQk=E1u__|N5@~buQ2K z^4#}cd+qh@y>@&tuTgyWtv-I8;!C>v_zjBt-0$NzDem0a$8T}m#m8?`eD44sze90f z%vbMnj8(pexOU$Ma29zVd9A*KeB&QbeBW(8-iEmLeSL7k+|Ky}$af&G)%6nJOeNwv z{dgZp0Mzc<6+^HSd9AM9d^@`+?vG2U4=KKSptnDwxCgfBQ^e8xmGnmbX9QX?*iE1{ zgU<=HVNgY&ErTS1b_`Mk+A~NK=)fRDpd*7UK>U6sZQ&P8)V6=gL~Z<6Ow`tY%|vbf zH%!#_f6GJ-z;{g42z<{(4Z#mg)EN9oq?H^29CBkMrzBLYZHMsicLyA*43T=Q-k4m`a3wAXIIT3$#eEl?XKOe>?be*)7w6HG(`{|;174$iy{U9XGZ!5-~q+eOw zpM-^OppvGNRU7~zRj@9e_o5bTCBlCoq^HZNIudLp!hs}I$VX~o!Bip~1R*m`9&Sd0 ztwcDOgxT`#fmkq=2#1hRA`eev!Bip~3L%>(j|(HgRw5h*Ayt~^Hq%rh98N;HyfYoO zkTR7BM?gsDPq!`DN`xax7%Ok2MJ=RFCBjh z%(NADpll^VT?p9?ZlG)>LOlq{wepZ6?xd+is1G5vRh}fqoivpQ4IpHuj&^-8l?W%1 zuyBDBOeI1?2&p1@#u~4}R3bEjkSUOlI7EW2L^zp*x$@bCSTL0cr$9*hSG=`9x zIn{R3Rw6VZVXfO?Ql=82DTH*9yhj`L!B!$PgOD}vbwz@$L}(77s$#h9gRMk36+&|O zdMnsUgwseUaxZt%R3fy1kecXsIa7(yl7wXw-8h&^gjNvJ=BZY^ne=?CH3`LwZ3}5r zNegWt*dI-dUo86h#I__%bK{UPm9)@~gz4^dkTI1A?MYZKZ(78wFqH@$AY^B{Q#SXOgf^p47)Jm`a4R zAY{h61IJb(oDCs6%DvpS65$*YHo87!O(nv)5HicA*jLk5BAf>yS>g^oTZwQ!30qtr zlBN>j0to5Veltxa!i5krLn>S!OeMla5Yi*&yIsyyB3w*DiM(MSkEE$YxCBC`%uVLD z65&z^*cduz#ZMT65$#a+>wCSq#65&AznF{xE+e(CoAf(o~yChqQ(4T}Nw^yf3CBgs* znId<$Xe$vOhL9TLPAIk#VIYL`WY>bNM0f;3)uxqpByABgr^}S zi`*<{D-i~hFy5Uvlco}32npuPC(+^0Uqi_wVe@jg+nY*S$cK=c>h5`MCBje=w)!2$ zR3Z$6kY3>SYFmjg971-AyN$Ay2n8f8aV=y`B|;$yo7^OpHI)b>NZ35aZf4e0B8-HP zG=DlK9w_=FGDQ$l#qO%uR?@;K5>~i#cgj>EjE0bT)=fdS5@8I4{up#4VUggozN+=C_<9!B!$nB4L6% z^wOphVKNDe{nenUM3_RtdN&SfQ;9GYLS~3R^h_nfG!nKfvM+bWR3c0#VWOL1GNuw? z288TjHx9NEp_qixZY#2;5@9BUWTD$9Z6(4i5=OdJBuyp4Y!W88rzlBNi7*F3+I&6% z=A@~lh2;=ZgWXlJtwdM>Aw9<36x&LKl_ZRJXT7wkM0kdT3U_p;O(nuA2$>;n60?;E zt080y-JxeI5!R4U>>i?KO(jAZ3A5YiLil$8SZj1Ybp^oLP+J$vlED|MA!tOYLgpDTZyn4LNedI7Pb;$ z3klD-tw@?mgl9=u<*uufrV^n7LTZY8PHQU>wvrIMg?SD_x?qgmOj}6{&yz6SO(1Dg ziSPo1%)~8jrZtraFG9!;ae}Qxc!>n_#SZ;>$1Ju6O|N`$vbD0kNnX;X>t4uq_~$FY?N??SL&ZjW9p{+j!H z5K@KiwXl`6@IHj>bbsiXN`wy}BnP{#u$2hgNGNyXkTjJD+aaXZyURseiLe7gW{VSS zB|;^Hq@RLpB|-v1YM6VfW-AePk}%hu{ZpnAVHbq(o%@FnvNPNaV=HOlBM8YtcRH|@ z2p^L$&fQ-mO(nu7B&>EfVo6hp@F|4UH2+M@R3dyv!Yns|q)a8kZW88~x&y~lB79DQ z`P&H59+jfMl28R9J5+=A)bJ|oQdBK!j(Gs<1d*-C_eAtVdk%WW$W_V~kp{vlcD9zWVjggr^vw8(B|(o`bUfRHNk zGmNQ3*b73s%)J9*D-rgFkX-2=P}oX@eITUD-Ge(@iBOY-8SZj1WhxPBLC9=zmj|{I zp*9Kg-1EtdsYIv)A#46pRkRIjEytWeIND_+O zZFSmIA{<4+0(U)`HkAlRld#bBA#ExVj$y%__0kKa65&`97P-?w+EgMO2O&Gl?US|= z;dlt?HU5s(R3e-}LWR4vPn$}Fx)3tc+yr7P5$cn$%w0!iOeI1?2-(3-u$2gnNXU16 z$eK!oCM1-&$1GV>iO`e<_gZ92q!OVS2@Bjzn>CdP%}H42_Nc6>MA+j`|GoTLy?e(K zh{Stx+{ec?IPUA?y%5*#-5dJeDu=%hLzEqGr6rn(gc3 zt)o(wsEf7L+96jf64&EcE+8bX&#_ER5;x#@k{`sAI4<^aLyqPCNE&Ixv0T(hd@{$f zV@Z4p$1=T0+!%4qrhbi0Oe*8BWQV#A=}5|SD7F-(6Dc#G*iw|! zNhyY6OHs}sWhN9`igFeyv!U2hlygX#3&obAoJ-0)D7F;kd{RoF*iw`WNLc{ImZDrl z$|5MX6y;)47DKV6D3_2@3dNS9TuRCkD7F;kGE$a8v85=TNtwLe-tX1fVM|diCuRJ0 zd$$!I0aA+6g_L3_wiM+GQWik5r6^Y#CH~`W(J{CK^IBJcS_%1tgZNj4<8BeGX~+-f-ME9N!m?@8?)< z<)rNg!g0TF{9rhKh+}!2CT;f*#{?;58)-W~91rDK?ry~%7LJE=ERO`mE(phk92fdm zXGAz2$?-IA7lq?d9Ltvuq$i`p@feQfajMv3!|}LqJU$#x;8^aYr0t2}cv3i?9FC`O zT;|7QYB-)2j;Dv?864v*RUD3IhT~b`cs9qFzvqPGxg6sRI4>N}5630pcmc(`aF$va zju&w(cMbAdE)K_~;dn_nUP|#!oQs!*gZE5-gS9Pj3Mgg>}H564v;CIDxxhCHB=GWmn+trW0PRfQ=K?=yfF0_`T;L}S(5s(wfnPMh>-K9d@LMkM zy8`qw{gDg&nG5^{P-_=X`hSPxf5P#<;dqa~{6oEX?^y0%>peBVOj1LE1df}%G{BCz zw+8YkS@ytv7?je=YifX%*U~`V)t07eD?q)fqXBxguLkJVehijUulCmfy*fYx^y)tf zP_GWu0KGa$1N7=(2Fs{dhbTbnI8+0y<1h`dj>8!&ufzr(p#ZJpNCqpYS4Sy8OB~H$ zB`tA`23YyA3Q$wWF({*^j@JN9ouC0;s1p^Sb<}0BmWHIB0<=VZ2J5I-4KzTnPSOCq zYN!CMqY;Dk)T@&fpe0UWuz^5h1{Yj|Q=g0Y@R9b%g@dt1C4?uexf0UR}kYfO^$U z0b0k^8ekpWHNZNqVK9=`ajgc}@*Wys%db;_deu_{^s1Kz=+*TEDpw^|`AeJ|7_266 zBZ0&S0yhEdTQ@N(fhQR^D>9nMEsBgGa;qX^iQJ~hI3l+zGM@T&2S|J+herf=Y9JqH zmTRWo3eXter2#Ir@74f=-$w%s{yhvzsaN-EfL`@gfO>VG2I$rO8lYDXXnv(|y z-~7F(04?zngM7NUeOUwa>J<&pt5+4Ev)X?(z*+5o4EX-*H4U)x*EPV(-%x-y@J$VH zoWI3@Z?oRk04sk-1FZaA1!(2(G2ok~_cg#eKF|Q`*roujW4i{}z#R*;t zi6jF)O{6ry5@`lyw2q7hSR%`yoR;`P11#|+fkZwXgI{TYWAJMRe4Y3WgWezK#4*BfgLPNh7|I{28cD<$AhE|3w2_W&O%vBQ5cp23X>E z2AgP!KQzD+e=;beCH~R?OZ?5CoR;`U11#|`gB7&I9)Ht&AuAGCVowIkX^9#dV2QmL ztfVFO)&NWF!(c5fQBwmfQH#MkTB5cFSfUPtayo_Ws{tmb{WQSjw7&wh2OppS-68yk zK^cJq8LTC65QB9D4rajn?jagr%MWG1`|e>HV2Q&S@VWngQ>- z$7p~hj%C36?r|DmiQ^gYzI%cOSmHzmyzkc4087+k!251}4X{K52E6Z{qyd&_$bk3V zMjBw>Jy`?nyQe5X`)*?eXoqXUfcM>|40zvd#(?+T<_vf{PSpV0ahe9$jur~gcC=(r zmcUu06@zjDtr@JRrrI#zo2IrJpu6ofKzG|S;4SZ<0h;Ql0h;Q>fV+D-1HNxLgTdki zJ{xjoF3=TVzsl&=ng-=6jre}GTW)l9HAD?|*Jvf7YZOZG<@dGK5k{^@b%e3Ij#0E# z^u|}u+^83$6^UVVcD%ki!V{Yt7?oA>K;5VjKP9-S8lqF%%?hc`-;x{MS{>o-w%e*9 z8u{CEqdOQyxA`=NcjiXD6^h0X*OqrNDzA(N*uP70cW%^2qviCX+@nx5P}l+P&5in2 zL)4A?a-;hht&2L39pC|tc*pLS8$HM#qBlPg`>Ie-!K`44s!o&MyZuAtRJT<&eS3@)!gBcA~yXcVW z2%XQXj?nphjh55(=+N9~m`1$G!*inoh14b&=0+nJMSCIjaAY+^165QVVKhc*#FO6W zYKR&fqY*#s99s?1QWG>J&j8AW&8v|Y1uquGQiOQYipFXbFY@#O)~-0BG3n5PjpIKMi=QY8wh zOcL%*ozg4mO_K2jLM?X09wK*Iw8`!mNJS@Z5XI!jN%gq&~ieF z=z%Ap6$+{CTFGdnYVaA2xWQElsRmawigp_6#u`S^EJ~=1QGBFeyUH2qxpyriJ;AOc zRJl>DYdxXpITm+g1Ec7fDxF3*GKww^sE3;v#UqbPk;SJ4 zN<^bU=sQA{YZF81s{!8=O5`c@1JD7LixWem|KW!3M-B6%4aWyVej*s35~Kg{g_xfS z#+`|GJAY033&YiwWr;$1fch)LjZt?-Qipycm?(^vGrM2kni z@v(dGLO(_=RgN#+w^BL2&(Rur&6|BIZGvfAN>A}_J4ze-v^}Md`?Le4Px`bY(%PR7 zMxQ&W9A5}HUFG<={2408r=-qQISz`mRF0eTvsI1{@Sme{oQBR-`6$0#=c#rb+ubQW-KW=3+R3NaQhK&edr(@>r`I8kjuh-&J(1VM-rS2)?9JCxioN*;O0hTJ zh*a&(H>n(Z^UcU>Ht@Z^h0;boy_M1?KD~`n{JO>Mls5P79h9Eo(>p0W%cs35J=3Rm zQ+k6>`%rq4Pw%0$p-=Cn^c*8_0YnSnup6Lq9Cia$j>GN| z#;kYs!CpgA$pX?0ByTb8@;rJtt@%^ul!|^BK_|tIw8OL}6usa-o9*(QRagt+v z06Z0r)8RN1jNgGeJRB)r?jn4kD#=jPmiRuy-$y# zw1ZENrnI9^kD(L~ERLlV4>yjZ6gT6?Q;OT}6DY+k`iYd{K}cOnaf4lt(sQN1eQKQh zZ;L)P>JvE6g7ad~fWY|{oF9Xe2wY&n1u}{$;1mLv zSa3-U8WXtGf=gr2gurDMTo!|-1Ug&LIR?!LTyDYTF=$Spiv?X`a4LZ-EVv>DrxCc) zf-7Utf;$ikVl-}aqb1A(wPW#lT7x%5+zkO<)N9;Dk>c^~p#Lg#nyI~Dt)*xaR5WB;$ zlVWyK#4aRur(q3a)-Ylh5$kPOqnI^{*u})|GVJ7-ogA@Ch}~`2DKR@GVwV!@V_4&u zHICS2#O^VyNz9r=tTVBD4Qm>+rV+cGSYN}M#jIJxx)8h1u;wvq9t|Stn6-%5Rm2`NtYyqvMywmLhYV{KvsMwinpl6sTF0z)#JUq3 zU|5@&wTaj@#2z-RZOqz6>{?<24Qm&(b`k4A>=DD-$ElCw25xbrkJ*uYkiFgUQ&ApLQJixw*(x<$8E7It(cAn2~Q~4;L->&k} zKEFfdxRtt-^Zd=;@2zq?h`5XMym{WgTjjWP?4xpAAl{>LTn65&@+H3gzMSWy{rgmo z_U~6Y+J8Xh`M&*rD&OMs2RYB1@AHRLzQE`GRldmQ15{q>^M_Tw)aL_Ljz@rxsCF=O9_K@G z{LWW7=I0WXqdyB&j>owRRgU9*k;?HHb+O7Z50t8WgWs+tD#!e=ROOqzzf9$rHi<(T)LRXOIp3YBBtdqL%x_g+-_IN#5gR6gG4 zFRL8$1n!KFQ~=sT}j_>nfk({WnxT)#q=j9P{v7DxdECw^fdL;60UN-hN-@ zGkrTBsC<^sx2YWS{C1UNp5LKz%=0@{j(L8U$}!J>sB&DVeTux+3(!B~81` error - raise error if ENV["CI"] && TestHelper.native_supported? - - # Cannot test the native implementation without libidn support. - warn('Could not load native IDN implementation.') -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/spec/addressable/net_http_compat_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/spec/addressable/net_http_compat_spec.rb deleted file mode 100644 index d07a43e..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/spec/addressable/net_http_compat_spec.rb +++ /dev/null @@ -1,29 +0,0 @@ -# frozen_string_literal: true - -# Copyright (C) Bob Aman -# -# 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. - - -require "spec_helper" - -require "addressable/uri" -require "net/http" - -describe Net::HTTP do - it "should be compatible with Addressable" do - response_body = - Net::HTTP.get(Addressable::URI.parse('http://www.google.com/')) - expect(response_body).not_to be_nil - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/spec/addressable/security_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/spec/addressable/security_spec.rb deleted file mode 100644 index 3bf90a2..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/spec/addressable/security_spec.rb +++ /dev/null @@ -1,58 +0,0 @@ -# frozen_string_literal: true - -# Copyright (C) Bob Aman -# -# 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. - - -require "spec_helper" - -require "addressable/uri" - -describe Addressable::URI, "when created with a URI known to cause crashes " + - "in certain browsers" do - it "should parse correctly" do - uri = Addressable::URI.parse('%%30%30') - expect(uri.path).to eq('%%30%30') - expect(uri.normalize.path).to eq('%2500') - end - - it "should parse correctly as a full URI" do - uri = Addressable::URI.parse('http://www.example.com/%%30%30') - expect(uri.path).to eq('/%%30%30') - expect(uri.normalize.path).to eq('/%2500') - end -end - -describe Addressable::URI, "when created with a URI known to cause crashes " + - "in certain browsers" do - it "should parse correctly" do - uri = Addressable::URI.parse('لُصّبُلُلصّبُررً ॣ ॣh ॣ ॣ 冗') - expect(uri.path).to eq('لُصّبُلُلصّبُررً ॣ ॣh ॣ ॣ 冗') - expect(uri.normalize.path).to eq( - '%D9%84%D9%8F%D8%B5%D9%91%D8%A8%D9%8F%D9%84%D9%8F%D9%84%D8%B5%D9%91' + - '%D8%A8%D9%8F%D8%B1%D8%B1%D9%8B%20%E0%A5%A3%20%E0%A5%A3h%20%E0%A5' + - '%A3%20%E0%A5%A3%20%E5%86%97' - ) - end - - it "should parse correctly as a full URI" do - uri = Addressable::URI.parse('http://www.example.com/لُصّبُلُلصّبُررً ॣ ॣh ॣ ॣ 冗') - expect(uri.path).to eq('/لُصّبُلُلصّبُررً ॣ ॣh ॣ ॣ 冗') - expect(uri.normalize.path).to eq( - '/%D9%84%D9%8F%D8%B5%D9%91%D8%A8%D9%8F%D9%84%D9%8F%D9%84%D8%B5%D9%91' + - '%D8%A8%D9%8F%D8%B1%D8%B1%D9%8B%20%E0%A5%A3%20%E0%A5%A3h%20%E0%A5' + - '%A3%20%E0%A5%A3%20%E5%86%97' - ) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/spec/addressable/template_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/spec/addressable/template_spec.rb deleted file mode 100644 index 24616c2..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/spec/addressable/template_spec.rb +++ /dev/null @@ -1,1264 +0,0 @@ -# frozen_string_literal: true - -# Copyright (C) Bob Aman -# -# 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. - - -require "spec_helper" - -require "bigdecimal" -require "timeout" -require "addressable/template" - -shared_examples_for 'expands' do |tests| - tests.each do |template, expansion| - exp = expansion.is_a?(Array) ? expansion.first : expansion - it "#{template} to #{exp}" do - tmpl = Addressable::Template.new(template).expand(subject) - expect(tmpl.to_str).to eq(expansion) - end - end -end - -describe "eql?" do - let(:template) { Addressable::Template.new('https://www.example.com/{foo}') } - it 'is equal when the pattern matches' do - other_template = Addressable::Template.new('https://www.example.com/{foo}') - expect(template).to be_eql(other_template) - expect(other_template).to be_eql(template) - end - it 'is not equal when the pattern differs' do - other_template = Addressable::Template.new('https://www.example.com/{bar}') - expect(template).to_not be_eql(other_template) - expect(other_template).to_not be_eql(template) - end - it 'is not equal to non-templates' do - uri = 'https://www.example.com/foo/bar' - addressable_template = Addressable::Template.new uri - addressable_uri = Addressable::URI.parse uri - expect(addressable_template).to_not be_eql(addressable_uri) - expect(addressable_uri).to_not be_eql(addressable_template) - end -end - -describe "==" do - let(:template) { Addressable::Template.new('https://www.example.com/{foo}') } - it 'is equal when the pattern matches' do - other_template = Addressable::Template.new('https://www.example.com/{foo}') - expect(template).to eq other_template - expect(other_template).to eq template - end - it 'is not equal when the pattern differs' do - other_template = Addressable::Template.new('https://www.example.com/{bar}') - expect(template).not_to eq other_template - expect(other_template).not_to eq template - end - it 'is not equal to non-templates' do - uri = 'https://www.example.com/foo/bar' - addressable_template = Addressable::Template.new uri - addressable_uri = Addressable::URI.parse uri - expect(addressable_template).not_to eq addressable_uri - expect(addressable_uri).not_to eq addressable_template - end -end - -describe "#to_regexp" do - it "does not match the first line of multiline strings" do - uri = "https://www.example.com/bar" - template = Addressable::Template.new(uri) - expect(template.match(uri)).not_to be_nil - expect(template.match("#{uri}\ngarbage")).to be_nil - end -end - -describe "Type conversion" do - subject { - { - :var => true, - :hello => 1234, - :nothing => nil, - :sym => :symbolic, - :decimal => BigDecimal('1') - } - } - - it_behaves_like 'expands', { - '{var}' => 'true', - '{hello}' => '1234', - '{nothing}' => '', - '{sym}' => 'symbolic', - '{decimal}' => RUBY_VERSION < '2.4.0' ? '0.1E1' : '0.1e1' - } -end - -describe "Level 1:" do - subject { - {:var => "value", :hello => "Hello World!"} - } - it_behaves_like 'expands', { - '{var}' => 'value', - '{hello}' => 'Hello%20World%21' - } -end - -describe "Level 2" do - subject { - { - :var => "value", - :hello => "Hello World!", - :path => "/foo/bar" - } - } - context "Operator +:" do - it_behaves_like 'expands', { - '{+var}' => 'value', - '{+hello}' => 'Hello%20World!', - '{+path}/here' => '/foo/bar/here', - 'here?ref={+path}' => 'here?ref=/foo/bar' - } - end - context "Operator #:" do - it_behaves_like 'expands', { - 'X{#var}' => 'X#value', - 'X{#hello}' => 'X#Hello%20World!' - } - end -end - -describe "Level 3" do - subject { - { - :var => "value", - :hello => "Hello World!", - :empty => "", - :path => "/foo/bar", - :x => "1024", - :y => "768" - } - } - context "Operator nil (multiple vars):" do - it_behaves_like 'expands', { - 'map?{x,y}' => 'map?1024,768', - '{x,hello,y}' => '1024,Hello%20World%21,768' - } - end - context "Operator + (multiple vars):" do - it_behaves_like 'expands', { - '{+x,hello,y}' => '1024,Hello%20World!,768', - '{+path,x}/here' => '/foo/bar,1024/here' - } - end - context "Operator # (multiple vars):" do - it_behaves_like 'expands', { - '{#x,hello,y}' => '#1024,Hello%20World!,768', - '{#path,x}/here' => '#/foo/bar,1024/here' - } - end - context "Operator ." do - it_behaves_like 'expands', { - 'X{.var}' => 'X.value', - 'X{.x,y}' => 'X.1024.768' - } - end - context "Operator /" do - it_behaves_like 'expands', { - '{/var}' => '/value', - '{/var,x}/here' => '/value/1024/here' - } - end - context "Operator ;" do - it_behaves_like 'expands', { - '{;x,y}' => ';x=1024;y=768', - '{;x,y,empty}' => ';x=1024;y=768;empty' - } - end - context "Operator ?" do - it_behaves_like 'expands', { - '{?x,y}' => '?x=1024&y=768', - '{?x,y,empty}' => '?x=1024&y=768&empty=' - } - end - context "Operator &" do - it_behaves_like 'expands', { - '?fixed=yes{&x}' => '?fixed=yes&x=1024', - '{&x,y,empty}' => '&x=1024&y=768&empty=' - } - end -end - -describe "Level 4" do - subject { - { - :var => "value", - :hello => "Hello World!", - :path => "/foo/bar", - :semi => ";", - :list => %w(red green blue), - :keys => {"semi" => ';', "dot" => '.', :comma => ','} - } - } - context "Expansion with value modifiers" do - it_behaves_like 'expands', { - '{var:3}' => 'val', - '{var:30}' => 'value', - '{list}' => 'red,green,blue', - '{list*}' => 'red,green,blue', - '{keys}' => 'semi,%3B,dot,.,comma,%2C', - '{keys*}' => 'semi=%3B,dot=.,comma=%2C', - } - end - context "Operator + with value modifiers" do - it_behaves_like 'expands', { - '{+path:6}/here' => '/foo/b/here', - '{+list}' => 'red,green,blue', - '{+list*}' => 'red,green,blue', - '{+keys}' => 'semi,;,dot,.,comma,,', - '{+keys*}' => 'semi=;,dot=.,comma=,', - } - end - context "Operator # with value modifiers" do - it_behaves_like 'expands', { - '{#path:6}/here' => '#/foo/b/here', - '{#list}' => '#red,green,blue', - '{#list*}' => '#red,green,blue', - '{#keys}' => '#semi,;,dot,.,comma,,', - '{#keys*}' => '#semi=;,dot=.,comma=,', - } - end - context "Operator . with value modifiers" do - it_behaves_like 'expands', { - 'X{.var:3}' => 'X.val', - 'X{.list}' => 'X.red,green,blue', - 'X{.list*}' => 'X.red.green.blue', - 'X{.keys}' => 'X.semi,%3B,dot,.,comma,%2C', - 'X{.keys*}' => 'X.semi=%3B.dot=..comma=%2C', - } - end - context "Operator / with value modifiers" do - it_behaves_like 'expands', { - '{/var:1,var}' => '/v/value', - '{/list}' => '/red,green,blue', - '{/list*}' => '/red/green/blue', - '{/list*,path:4}' => '/red/green/blue/%2Ffoo', - '{/keys}' => '/semi,%3B,dot,.,comma,%2C', - '{/keys*}' => '/semi=%3B/dot=./comma=%2C', - } - end - context "Operator ; with value modifiers" do - it_behaves_like 'expands', { - '{;hello:5}' => ';hello=Hello', - '{;list}' => ';list=red,green,blue', - '{;list*}' => ';list=red;list=green;list=blue', - '{;keys}' => ';keys=semi,%3B,dot,.,comma,%2C', - '{;keys*}' => ';semi=%3B;dot=.;comma=%2C', - } - end - context "Operator ? with value modifiers" do - it_behaves_like 'expands', { - '{?var:3}' => '?var=val', - '{?list}' => '?list=red,green,blue', - '{?list*}' => '?list=red&list=green&list=blue', - '{?keys}' => '?keys=semi,%3B,dot,.,comma,%2C', - '{?keys*}' => '?semi=%3B&dot=.&comma=%2C', - } - end - context "Operator & with value modifiers" do - it_behaves_like 'expands', { - '{&var:3}' => '&var=val', - '{&list}' => '&list=red,green,blue', - '{&list*}' => '&list=red&list=green&list=blue', - '{&keys}' => '&keys=semi,%3B,dot,.,comma,%2C', - '{&keys*}' => '&semi=%3B&dot=.&comma=%2C', - } - end -end -describe "Modifiers" do - subject { - { - :var => "value", - :semi => ";", - :year => [1965, 2000, 2012], - :dom => %w(example com) - } - } - context "length" do - it_behaves_like 'expands', { - '{var:3}' => 'val', - '{var:30}' => 'value', - '{var}' => 'value', - '{semi}' => '%3B', - '{semi:2}' => '%3B' - } - end - context "explode" do - it_behaves_like 'expands', { - 'find{?year*}' => 'find?year=1965&year=2000&year=2012', - 'www{.dom*}' => 'www.example.com', - } - end -end -describe "Expansion" do - subject { - { - :count => ["one", "two", "three"], - :dom => ["example", "com"], - :dub => "me/too", - :hello => "Hello World!", - :half => "50%", - :var => "value", - :who => "fred", - :base => "http://example.com/home/", - :path => "/foo/bar", - :list => ["red", "green", "blue"], - :keys => {"semi" => ";","dot" => ".",:comma => ","}, - :v => "6", - :x => "1024", - :y => "768", - :empty => "", - :empty_keys => {}, - :undef => nil - } - } - context "concatenation" do - it_behaves_like 'expands', { - '{count}' => 'one,two,three', - '{count*}' => 'one,two,three', - '{/count}' => '/one,two,three', - '{/count*}' => '/one/two/three', - '{;count}' => ';count=one,two,three', - '{;count*}' => ';count=one;count=two;count=three', - '{?count}' => '?count=one,two,three', - '{?count*}' => '?count=one&count=two&count=three', - '{&count*}' => '&count=one&count=two&count=three' - } - end - context "simple expansion" do - it_behaves_like 'expands', { - '{var}' => 'value', - '{hello}' => 'Hello%20World%21', - '{half}' => '50%25', - 'O{empty}X' => 'OX', - 'O{undef}X' => 'OX', - '{x,y}' => '1024,768', - '{x,hello,y}' => '1024,Hello%20World%21,768', - '?{x,empty}' => '?1024,', - '?{x,undef}' => '?1024', - '?{undef,y}' => '?768', - '{var:3}' => 'val', - '{var:30}' => 'value', - '{list}' => 'red,green,blue', - '{list*}' => 'red,green,blue', - '{keys}' => 'semi,%3B,dot,.,comma,%2C', - '{keys*}' => 'semi=%3B,dot=.,comma=%2C', - } - end - context "reserved expansion (+)" do - it_behaves_like 'expands', { - '{+var}' => 'value', - '{+hello}' => 'Hello%20World!', - '{+half}' => '50%25', - '{base}index' => 'http%3A%2F%2Fexample.com%2Fhome%2Findex', - '{+base}index' => 'http://example.com/home/index', - 'O{+empty}X' => 'OX', - 'O{+undef}X' => 'OX', - '{+path}/here' => '/foo/bar/here', - 'here?ref={+path}' => 'here?ref=/foo/bar', - 'up{+path}{var}/here' => 'up/foo/barvalue/here', - '{+x,hello,y}' => '1024,Hello%20World!,768', - '{+path,x}/here' => '/foo/bar,1024/here', - '{+path:6}/here' => '/foo/b/here', - '{+list}' => 'red,green,blue', - '{+list*}' => 'red,green,blue', - '{+keys}' => 'semi,;,dot,.,comma,,', - '{+keys*}' => 'semi=;,dot=.,comma=,', - } - end - context "fragment expansion (#)" do - it_behaves_like 'expands', { - '{#var}' => '#value', - '{#hello}' => '#Hello%20World!', - '{#half}' => '#50%25', - 'foo{#empty}' => 'foo#', - 'foo{#undef}' => 'foo', - '{#x,hello,y}' => '#1024,Hello%20World!,768', - '{#path,x}/here' => '#/foo/bar,1024/here', - '{#path:6}/here' => '#/foo/b/here', - '{#list}' => '#red,green,blue', - '{#list*}' => '#red,green,blue', - '{#keys}' => '#semi,;,dot,.,comma,,', - '{#keys*}' => '#semi=;,dot=.,comma=,', - } - end - context "label expansion (.)" do - it_behaves_like 'expands', { - '{.who}' => '.fred', - '{.who,who}' => '.fred.fred', - '{.half,who}' => '.50%25.fred', - 'www{.dom*}' => 'www.example.com', - 'X{.var}' => 'X.value', - 'X{.empty}' => 'X.', - 'X{.undef}' => 'X', - 'X{.var:3}' => 'X.val', - 'X{.list}' => 'X.red,green,blue', - 'X{.list*}' => 'X.red.green.blue', - 'X{.keys}' => 'X.semi,%3B,dot,.,comma,%2C', - 'X{.keys*}' => 'X.semi=%3B.dot=..comma=%2C', - 'X{.empty_keys}' => 'X', - 'X{.empty_keys*}' => 'X' - } - end - context "path expansion (/)" do - it_behaves_like 'expands', { - '{/who}' => '/fred', - '{/who,who}' => '/fred/fred', - '{/half,who}' => '/50%25/fred', - '{/who,dub}' => '/fred/me%2Ftoo', - '{/var}' => '/value', - '{/var,empty}' => '/value/', - '{/var,undef}' => '/value', - '{/var,x}/here' => '/value/1024/here', - '{/var:1,var}' => '/v/value', - '{/list}' => '/red,green,blue', - '{/list*}' => '/red/green/blue', - '{/list*,path:4}' => '/red/green/blue/%2Ffoo', - '{/keys}' => '/semi,%3B,dot,.,comma,%2C', - '{/keys*}' => '/semi=%3B/dot=./comma=%2C', - } - end - context "path-style expansion (;)" do - it_behaves_like 'expands', { - '{;who}' => ';who=fred', - '{;half}' => ';half=50%25', - '{;empty}' => ';empty', - '{;v,empty,who}' => ';v=6;empty;who=fred', - '{;v,bar,who}' => ';v=6;who=fred', - '{;x,y}' => ';x=1024;y=768', - '{;x,y,empty}' => ';x=1024;y=768;empty', - '{;x,y,undef}' => ';x=1024;y=768', - '{;hello:5}' => ';hello=Hello', - '{;list}' => ';list=red,green,blue', - '{;list*}' => ';list=red;list=green;list=blue', - '{;keys}' => ';keys=semi,%3B,dot,.,comma,%2C', - '{;keys*}' => ';semi=%3B;dot=.;comma=%2C', - } - end - context "form query expansion (?)" do - it_behaves_like 'expands', { - '{?who}' => '?who=fred', - '{?half}' => '?half=50%25', - '{?x,y}' => '?x=1024&y=768', - '{?x,y,empty}' => '?x=1024&y=768&empty=', - '{?x,y,undef}' => '?x=1024&y=768', - '{?var:3}' => '?var=val', - '{?list}' => '?list=red,green,blue', - '{?list*}' => '?list=red&list=green&list=blue', - '{?keys}' => '?keys=semi,%3B,dot,.,comma,%2C', - '{?keys*}' => '?semi=%3B&dot=.&comma=%2C', - } - end - context "form query expansion (&)" do - it_behaves_like 'expands', { - '{&who}' => '&who=fred', - '{&half}' => '&half=50%25', - '?fixed=yes{&x}' => '?fixed=yes&x=1024', - '{&x,y,empty}' => '&x=1024&y=768&empty=', - '{&x,y,undef}' => '&x=1024&y=768', - '{&var:3}' => '&var=val', - '{&list}' => '&list=red,green,blue', - '{&list*}' => '&list=red&list=green&list=blue', - '{&keys}' => '&keys=semi,%3B,dot,.,comma,%2C', - '{&keys*}' => '&semi=%3B&dot=.&comma=%2C', - } - end - context "non-string key in match data" do - subject {Addressable::Template.new("http://example.com/{one}")} - - it "raises TypeError" do - expect { subject.expand(Object.new => "1") }.to raise_error TypeError - end - end -end - -class ExampleTwoProcessor - def self.restore(name, value) - return value.gsub(/-/, " ") if name == "query" - return value - end - - def self.match(name) - return ".*?" if name == "first" - return ".*" - end - def self.validate(name, value) - return !!(value =~ /^[\w ]+$/) if name == "query" - return true - end - - def self.transform(name, value) - return value.gsub(/ /, "+") if name == "query" - return value - end -end - -class DumbProcessor - def self.match(name) - return ".*?" if name == "first" - end -end - -describe Addressable::Template do - describe 'initialize' do - context 'with a non-string' do - it 'raises a TypeError' do - expect { Addressable::Template.new(nil) }.to raise_error(TypeError) - end - end - end - - describe 'freeze' do - subject { Addressable::Template.new("http://example.com/{first}/{+second}/") } - it 'freezes the template' do - expect(subject.freeze).to be_frozen - end - end - - describe "Matching" do - let(:uri){ - Addressable::URI.parse( - "http://example.com/search/an-example-search-query/" - ) - } - let(:uri2){ - Addressable::URI.parse("http://example.com/a/b/c/") - } - let(:uri3){ - Addressable::URI.parse("http://example.com/;a=1;b=2;c=3;first=foo") - } - let(:uri4){ - Addressable::URI.parse("http://example.com/?a=1&b=2&c=3&first=foo") - } - let(:uri5){ - "http://example.com/foo" - } - context "first uri with ExampleTwoProcessor" do - subject { - Addressable::Template.new( - "http://example.com/search/{query}/" - ).match(uri, ExampleTwoProcessor) - } - its(:variables){ should == ["query"] } - its(:captures){ should == ["an example search query"] } - end - - context "second uri with ExampleTwoProcessor" do - subject { - Addressable::Template.new( - "http://example.com/{first}/{+second}/" - ).match(uri2, ExampleTwoProcessor) - } - its(:variables){ should == ["first", "second"] } - its(:captures){ should == ["a", "b/c"] } - end - - context "second uri with DumbProcessor" do - subject { - Addressable::Template.new( - "http://example.com/{first}/{+second}/" - ).match(uri2, DumbProcessor) - } - its(:variables){ should == ["first", "second"] } - its(:captures){ should == ["a", "b/c"] } - end - - context "second uri" do - subject { - Addressable::Template.new( - "http://example.com/{first}{/second*}/" - ).match(uri2) - } - its(:variables){ should == ["first", "second"] } - its(:captures){ should == ["a", ["b","c"]] } - end - context "third uri" do - subject { - Addressable::Template.new( - "http://example.com/{;hash*,first}" - ).match(uri3) - } - its(:variables){ should == ["hash", "first"] } - its(:captures){ should == [ - {"a" => "1", "b" => "2", "c" => "3", "first" => "foo"}, nil] } - end - # Note that this expansion is impossible to revert deterministically - the - # * operator means first could have been a key of hash or a separate key. - # Semantically, a separate key is more likely, but both are possible. - context "fourth uri" do - subject { - Addressable::Template.new( - "http://example.com/{?hash*,first}" - ).match(uri4) - } - its(:variables){ should == ["hash", "first"] } - its(:captures){ should == [ - {"a" => "1", "b" => "2", "c" => "3", "first"=> "foo"}, nil] } - end - context "fifth uri" do - subject { - Addressable::Template.new( - "http://example.com/{path}{?hash*,first}" - ).match(uri5) - } - its(:variables){ should == ["path", "hash", "first"] } - its(:captures){ should == ["foo", nil, nil] } - end - end - - describe 'match' do - subject { Addressable::Template.new('http://example.com/first/second/') } - context 'when the URI is the same as the template' do - it 'returns the match data itself with an empty mapping' do - uri = Addressable::URI.parse('http://example.com/first/second/') - match_data = subject.match(uri) - expect(match_data).to be_an Addressable::Template::MatchData - expect(match_data.uri).to eq(uri) - expect(match_data.template).to eq(subject) - expect(match_data.mapping).to be_empty - expect(match_data.inspect).to be_an String - end - end - end - - describe "extract" do - let(:template) { - Addressable::Template.new( - "http://{host}{/segments*}/{?one,two,bogus}{#fragment}" - ) - } - let(:uri){ "http://example.com/a/b/c/?one=1&two=2#foo" } - let(:uri2){ "http://example.com/a/b/c/#foo" } - it "should be able to extract with queries" do - expect(template.extract(uri)).to eq({ - "host" => "example.com", - "segments" => %w(a b c), - "one" => "1", - "bogus" => nil, - "two" => "2", - "fragment" => "foo" - }) - end - it "should be able to extract without queries" do - expect(template.extract(uri2)).to eq({ - "host" => "example.com", - "segments" => %w(a b c), - "one" => nil, - "bogus" => nil, - "two" => nil, - "fragment" => "foo" - }) - end - - context "issue #137" do - subject { Addressable::Template.new('/path{?page,per_page}') } - - it "can match empty" do - data = subject.extract("/path") - expect(data["page"]).to eq(nil) - expect(data["per_page"]).to eq(nil) - expect(data.keys.sort).to eq(['page', 'per_page']) - end - - it "can match first var" do - data = subject.extract("/path?page=1") - expect(data["page"]).to eq("1") - expect(data["per_page"]).to eq(nil) - expect(data.keys.sort).to eq(['page', 'per_page']) - end - - it "can match second var" do - data = subject.extract("/path?per_page=1") - expect(data["page"]).to eq(nil) - expect(data["per_page"]).to eq("1") - expect(data.keys.sort).to eq(['page', 'per_page']) - end - - it "can match both vars" do - data = subject.extract("/path?page=2&per_page=1") - expect(data["page"]).to eq("2") - expect(data["per_page"]).to eq("1") - expect(data.keys.sort).to eq(['page', 'per_page']) - end - end - end - - describe "Partial expand with symbols" do - context "partial_expand with two simple values" do - subject { - Addressable::Template.new("http://example.com/{one}/{two}/") - } - it "builds a new pattern" do - expect(subject.partial_expand(:one => "1").pattern).to eq( - "http://example.com/1/{two}/" - ) - end - end - context "partial_expand query with missing param in middle" do - subject { - Addressable::Template.new("http://example.com/{?one,two,three}/") - } - it "builds a new pattern" do - expect(subject.partial_expand(:one => "1", :three => "3").pattern).to eq( - "http://example.com/?one=1{&two}&three=3/" - ) - end - end - context "partial_expand form style query with missing param at beginning" do - subject { - Addressable::Template.new("http://example.com/{?one,two}/") - } - it "builds a new pattern" do - expect(subject.partial_expand(:two => "2").pattern).to eq( - "http://example.com/?two=2{&one}/" - ) - end - end - context "issue #307 - partial_expand form query with nil params" do - subject do - Addressable::Template.new("http://example.com/{?one,two,three}/") - end - it "builds a new pattern with two=nil" do - expect(subject.partial_expand(two: nil).pattern).to eq( - "http://example.com/{?one}{&three}/" - ) - end - it "builds a new pattern with one=nil and two=nil" do - expect(subject.partial_expand(one: nil, two: nil).pattern).to eq( - "http://example.com/{?three}/" - ) - end - it "builds a new pattern with one=1 and two=nil" do - expect(subject.partial_expand(one: 1, two: nil).pattern).to eq( - "http://example.com/?one=1{&three}/" - ) - end - it "builds a new pattern with one=nil and two=2" do - expect(subject.partial_expand(one: nil, two: 2).pattern).to eq( - "http://example.com/?two=2{&three}/" - ) - end - it "builds a new pattern with one=nil" do - expect(subject.partial_expand(one: nil).pattern).to eq( - "http://example.com/{?two}{&three}/" - ) - end - end - context "partial_expand with query string" do - subject { - Addressable::Template.new("http://example.com/{?two,one}/") - } - it "builds a new pattern" do - expect(subject.partial_expand(:one => "1").pattern).to eq( - "http://example.com/?one=1{&two}/" - ) - end - end - context "partial_expand with path operator" do - subject { - Addressable::Template.new("http://example.com{/one,two}/") - } - it "builds a new pattern" do - expect(subject.partial_expand(:one => "1").pattern).to eq( - "http://example.com/1{/two}/" - ) - end - end - context "partial expand with unicode values" do - subject do - Addressable::Template.new("http://example.com/{resource}/{query}/") - end - it "normalizes unicode by default" do - template = subject.partial_expand("query" => "Cafe\u0301") - expect(template.pattern).to eq( - "http://example.com/{resource}/Caf%C3%A9/" - ) - end - - it "normalizes as unicode even with wrong encoding specified" do - template = subject.partial_expand("query" => "Cafe\u0301".b) - expect(template.pattern).to eq( - "http://example.com/{resource}/Caf%C3%A9/" - ) - end - - it "raises on invalid unicode input" do - expect { - subject.partial_expand("query" => "M\xE9thode".b) - }.to raise_error(ArgumentError, "invalid byte sequence in UTF-8") - end - - it "does not normalize unicode when byte semantics requested" do - template = subject.partial_expand({"query" => "Cafe\u0301"}, nil, false) - expect(template.pattern).to eq( - "http://example.com/{resource}/Cafe%CC%81/" - ) - end - end - end - describe "Partial expand with strings" do - context "partial_expand with two simple values" do - subject { - Addressable::Template.new("http://example.com/{one}/{two}/") - } - it "builds a new pattern" do - expect(subject.partial_expand("one" => "1").pattern).to eq( - "http://example.com/1/{two}/" - ) - end - end - context "partial_expand query with missing param in middle" do - subject { - Addressable::Template.new("http://example.com/{?one,two,three}/") - } - it "builds a new pattern" do - expect(subject.partial_expand("one" => "1", "three" => "3").pattern).to eq( - "http://example.com/?one=1{&two}&three=3/" - ) - end - end - context "partial_expand with query string" do - subject { - Addressable::Template.new("http://example.com/{?two,one}/") - } - it "builds a new pattern" do - expect(subject.partial_expand("one" => "1").pattern).to eq( - "http://example.com/?one=1{&two}/" - ) - end - end - context "partial_expand with path operator" do - subject { - Addressable::Template.new("http://example.com{/one,two}/") - } - it "builds a new pattern" do - expect(subject.partial_expand("one" => "1").pattern).to eq( - "http://example.com/1{/two}/" - ) - end - end - end - describe "Expand" do - context "expand with unicode values" do - subject do - Addressable::Template.new("http://example.com/search/{query}/") - end - it "normalizes unicode by default" do - uri = subject.expand("query" => "Cafe\u0301").to_str - expect(uri).to eq("http://example.com/search/Caf%C3%A9/") - end - - it "normalizes as unicode even with wrong encoding specified" do - uri = subject.expand("query" => "Cafe\u0301".b).to_str - expect(uri).to eq("http://example.com/search/Caf%C3%A9/") - end - - it "raises on invalid unicode input" do - expect { - subject.expand("query" => "M\xE9thode".b).to_str - }.to raise_error(ArgumentError, "invalid byte sequence in UTF-8") - end - - it "does not normalize unicode when byte semantics requested" do - uri = subject.expand({ "query" => "Cafe\u0301" }, nil, false).to_str - expect(uri).to eq("http://example.com/search/Cafe%CC%81/") - end - end - context "expand with a processor" do - subject { - Addressable::Template.new("http://example.com/search/{query}/") - } - it "processes spaces" do - expect(subject.expand({"query" => "an example search query"}, - ExampleTwoProcessor).to_str).to eq( - "http://example.com/search/an+example+search+query/" - ) - end - it "validates" do - expect{ - subject.expand({"query" => "Bogus!"}, - ExampleTwoProcessor).to_str - }.to raise_error(Addressable::Template::InvalidTemplateValueError) - end - end - context "partial_expand query with missing param in middle" do - subject { - Addressable::Template.new("http://example.com/{?one,two,three}/") - } - it "builds a new pattern" do - expect(subject.partial_expand("one" => "1", "three" => "3").pattern).to eq( - "http://example.com/?one=1{&two}&three=3/" - ) - end - end - context "partial_expand with query string" do - subject { - Addressable::Template.new("http://example.com/{?two,one}/") - } - it "builds a new pattern" do - expect(subject.partial_expand("one" => "1").pattern).to eq( - "http://example.com/?one=1{&two}/" - ) - end - end - context "partial_expand with path operator" do - subject { - Addressable::Template.new("http://example.com{/one,two}/") - } - it "builds a new pattern" do - expect(subject.partial_expand("one" => "1").pattern).to eq( - "http://example.com/1{/two}/" - ) - end - end - end - context "Matching with operators" do - describe "Level 1:" do - subject { Addressable::Template.new("foo{foo}/{bar}baz") } - it "can match" do - data = subject.match("foofoo/bananabaz") - expect(data.mapping["foo"]).to eq("foo") - expect(data.mapping["bar"]).to eq("banana") - end - it "can fail" do - expect(subject.match("bar/foo")).to be_nil - expect(subject.match("foobaz")).to be_nil - end - it "can match empty" do - data = subject.match("foo/baz") - expect(data.mapping["foo"]).to eq(nil) - expect(data.mapping["bar"]).to eq(nil) - end - it "lists vars" do - expect(subject.variables).to eq(["foo", "bar"]) - end - end - - describe "Level 2:" do - subject { Addressable::Template.new("foo{+foo}{#bar}baz") } - it "can match" do - data = subject.match("foo/test/banana#bazbaz") - expect(data.mapping["foo"]).to eq("/test/banana") - expect(data.mapping["bar"]).to eq("baz") - end - it "can match empty level 2 #" do - data = subject.match("foo/test/bananabaz") - expect(data.mapping["foo"]).to eq("/test/banana") - expect(data.mapping["bar"]).to eq(nil) - data = subject.match("foo/test/banana#baz") - expect(data.mapping["foo"]).to eq("/test/banana") - expect(data.mapping["bar"]).to eq("") - end - it "can match empty level 2 +" do - data = subject.match("foobaz") - expect(data.mapping["foo"]).to eq(nil) - expect(data.mapping["bar"]).to eq(nil) - data = subject.match("foo#barbaz") - expect(data.mapping["foo"]).to eq(nil) - expect(data.mapping["bar"]).to eq("bar") - end - it "lists vars" do - expect(subject.variables).to eq(["foo", "bar"]) - end - end - - describe "Level 3:" do - context "no operator" do - subject { Addressable::Template.new("foo{foo,bar}baz") } - it "can match" do - data = subject.match("foofoo,barbaz") - expect(data.mapping["foo"]).to eq("foo") - expect(data.mapping["bar"]).to eq("bar") - end - it "lists vars" do - expect(subject.variables).to eq(["foo", "bar"]) - end - end - context "+ operator" do - subject { Addressable::Template.new("foo{+foo,bar}baz") } - it "can match" do - data = subject.match("foofoo/bar,barbaz") - expect(data.mapping["bar"]).to eq("foo/bar,bar") - expect(data.mapping["foo"]).to eq("") - end - it "lists vars" do - expect(subject.variables).to eq(["foo", "bar"]) - end - end - context ". operator" do - subject { Addressable::Template.new("foo{.foo,bar}baz") } - it "can match" do - data = subject.match("foo.foo.barbaz") - expect(data.mapping["foo"]).to eq("foo") - expect(data.mapping["bar"]).to eq("bar") - end - it "lists vars" do - expect(subject.variables).to eq(["foo", "bar"]) - end - end - context "/ operator" do - subject { Addressable::Template.new("foo{/foo,bar}baz") } - it "can match" do - data = subject.match("foo/foo/barbaz") - expect(data.mapping["foo"]).to eq("foo") - expect(data.mapping["bar"]).to eq("bar") - end - it "lists vars" do - expect(subject.variables).to eq(["foo", "bar"]) - end - end - context "; operator" do - subject { Addressable::Template.new("foo{;foo,bar,baz}baz") } - it "can match" do - data = subject.match("foo;foo=bar%20baz;bar=foo;bazbaz") - expect(data.mapping["foo"]).to eq("bar baz") - expect(data.mapping["bar"]).to eq("foo") - expect(data.mapping["baz"]).to eq("") - end - it "lists vars" do - expect(subject.variables).to eq(%w(foo bar baz)) - end - end - context "? operator" do - context "test" do - subject { Addressable::Template.new("foo{?foo,bar}baz") } - it "can match" do - data = subject.match("foo?foo=bar%20baz&bar=foobaz") - expect(data.mapping["foo"]).to eq("bar baz") - expect(data.mapping["bar"]).to eq("foo") - end - it "lists vars" do - expect(subject.variables).to eq(%w(foo bar)) - end - end - - context "issue #137" do - subject { Addressable::Template.new('/path{?page,per_page}') } - - it "can match empty" do - data = subject.match("/path") - expect(data.mapping["page"]).to eq(nil) - expect(data.mapping["per_page"]).to eq(nil) - expect(data.mapping.keys.sort).to eq(['page', 'per_page']) - end - - it "can match first var" do - data = subject.match("/path?page=1") - expect(data.mapping["page"]).to eq("1") - expect(data.mapping["per_page"]).to eq(nil) - expect(data.mapping.keys.sort).to eq(['page', 'per_page']) - end - - it "can match second var" do - data = subject.match("/path?per_page=1") - expect(data.mapping["page"]).to eq(nil) - expect(data.mapping["per_page"]).to eq("1") - expect(data.mapping.keys.sort).to eq(['page', 'per_page']) - end - - it "can match both vars" do - data = subject.match("/path?page=2&per_page=1") - expect(data.mapping["page"]).to eq("2") - expect(data.mapping["per_page"]).to eq("1") - expect(data.mapping.keys.sort).to eq(['page', 'per_page']) - end - end - - context "issue #71" do - subject { Addressable::Template.new("http://cyberscore.dev/api/users{?username}") } - it "can match" do - data = subject.match("http://cyberscore.dev/api/users?username=foobaz") - expect(data.mapping["username"]).to eq("foobaz") - end - it "lists vars" do - expect(subject.variables).to eq(%w(username)) - expect(subject.keys).to eq(%w(username)) - end - end - end - context "& operator" do - subject { Addressable::Template.new("foo{&foo,bar}baz") } - it "can match" do - data = subject.match("foo&foo=bar%20baz&bar=foobaz") - expect(data.mapping["foo"]).to eq("bar baz") - expect(data.mapping["bar"]).to eq("foo") - end - it "lists vars" do - expect(subject.variables).to eq(%w(foo bar)) - end - end - end - end - - context "support regexes:" do - context "EXPRESSION" do - subject { Addressable::Template::EXPRESSION } - it "should be able to match an expression" do - expect(subject).to match("{foo}") - expect(subject).to match("{foo,9}") - expect(subject).to match("{foo.bar,baz}") - expect(subject).to match("{+foo.bar,baz}") - expect(subject).to match("{foo,foo%20bar}") - expect(subject).to match("{#foo:20,baz*}") - expect(subject).to match("stuff{#foo:20,baz*}things") - end - it "should fail on non vars" do - expect(subject).not_to match("!{foo") - expect(subject).not_to match("{foo.bar.}") - expect(subject).not_to match("!{}") - end - end - context "VARNAME" do - subject { Addressable::Template::VARNAME } - it "should be able to match a variable" do - expect(subject).to match("foo") - expect(subject).to match("9") - expect(subject).to match("foo.bar") - expect(subject).to match("foo_bar") - expect(subject).to match("foo_bar.baz") - expect(subject).to match("foo%20bar") - expect(subject).to match("foo%20bar.baz") - end - it "should fail on non vars" do - expect(subject).not_to match("!foo") - expect(subject).not_to match("foo.bar.") - expect(subject).not_to match("foo%2%00bar") - expect(subject).not_to match("foo_ba%r") - expect(subject).not_to match("foo_bar*") - expect(subject).not_to match("foo_bar:20") - end - - it 'should parse in a reasonable time' do - expect do - Timeout.timeout(0.1) do - expect(subject).not_to match("0"*25 + "!") - end - end.not_to raise_error - end - end - context "VARIABLE_LIST" do - subject { Addressable::Template::VARIABLE_LIST } - it "should be able to match a variable list" do - expect(subject).to match("foo,bar") - expect(subject).to match("foo") - expect(subject).to match("foo,bar*,baz") - expect(subject).to match("foo.bar,bar_baz*,baz:12") - end - it "should fail on non vars" do - expect(subject).not_to match(",foo,bar*,baz") - expect(subject).not_to match("foo,*bar,baz") - expect(subject).not_to match("foo,,bar*,baz") - end - end - context "VARSPEC" do - subject { Addressable::Template::VARSPEC } - it "should be able to match a variable with modifier" do - expect(subject).to match("9:8") - expect(subject).to match("foo.bar*") - expect(subject).to match("foo_bar:12") - expect(subject).to match("foo_bar.baz*") - expect(subject).to match("foo%20bar:12") - expect(subject).to match("foo%20bar.baz*") - end - it "should fail on non vars" do - expect(subject).not_to match("!foo") - expect(subject).not_to match("*foo") - expect(subject).not_to match("fo*o") - expect(subject).not_to match("fo:o") - expect(subject).not_to match("foo:") - end - end - end -end - -describe Addressable::Template::MatchData do - let(:template) { Addressable::Template.new('{foo}/{bar}') } - subject(:its) { template.match('ab/cd') } - its(:uri) { should == Addressable::URI.parse('ab/cd') } - its(:template) { should == template } - its(:mapping) { should == { 'foo' => 'ab', 'bar' => 'cd' } } - its(:variables) { should == ['foo', 'bar'] } - its(:keys) { should == ['foo', 'bar'] } - its(:names) { should == ['foo', 'bar'] } - its(:values) { should == ['ab', 'cd'] } - its(:captures) { should == ['ab', 'cd'] } - its(:to_a) { should == ['ab/cd', 'ab', 'cd'] } - its(:to_s) { should == 'ab/cd' } - its(:string) { should == its.to_s } - its(:pre_match) { should == "" } - its(:post_match) { should == "" } - - describe 'values_at' do - it 'returns an array with the values' do - expect(its.values_at(0, 2)).to eq(['ab/cd', 'cd']) - end - it 'allows mixing integer an string keys' do - expect(its.values_at('foo', 1)).to eq(['ab', 'ab']) - end - it 'accepts unknown keys' do - expect(its.values_at('baz', 'foo')).to eq([nil, 'ab']) - end - end - - describe '[]' do - context 'string key' do - it 'returns the corresponding capture' do - expect(its['foo']).to eq('ab') - expect(its['bar']).to eq('cd') - end - it 'returns nil for unknown keys' do - expect(its['baz']).to be_nil - end - end - context 'symbol key' do - it 'returns the corresponding capture' do - expect(its[:foo]).to eq('ab') - expect(its[:bar]).to eq('cd') - end - it 'returns nil for unknown keys' do - expect(its[:baz]).to be_nil - end - end - context 'integer key' do - it 'returns the full URI for index 0' do - expect(its[0]).to eq('ab/cd') - end - it 'returns the corresponding capture' do - expect(its[1]).to eq('ab') - expect(its[2]).to eq('cd') - end - it 'returns nil for unknown keys' do - expect(its[3]).to be_nil - end - end - context 'other key' do - it 'raises an exception' do - expect { its[Object.new] }.to raise_error(TypeError) - end - end - context 'with length' do - it 'returns an array starting at index with given length' do - expect(its[0, 2]).to eq(['ab/cd', 'ab']) - expect(its[2, 1]).to eq(['cd']) - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/spec/addressable/uri_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/spec/addressable/uri_spec.rb deleted file mode 100644 index c54fc3f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/spec/addressable/uri_spec.rb +++ /dev/null @@ -1,6801 +0,0 @@ -# frozen_string_literal: true - -# Copyright (C) Bob Aman -# -# 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. - - -require "spec_helper" - -require "addressable/uri" -require "uri" -require "ipaddr" - -if !"".respond_to?("force_encoding") - class String - def force_encoding(encoding) - @encoding = encoding - end - - def encoding - @encoding ||= Encoding::ASCII_8BIT - end - end - - class Encoding - def initialize(name) - @name = name - end - - def to_s - return @name - end - - UTF_8 = Encoding.new("UTF-8") - ASCII_8BIT = Encoding.new("US-ASCII") - end -end - -module Fake - module URI - class HTTP - def initialize(uri) - @uri = uri - end - - def to_s - return @uri.to_s - end - - alias :to_str :to_s - end - end -end - -describe Addressable::URI, "when created with a non-numeric port number" do - it "should raise an error" do - expect do - Addressable::URI.new(:port => "bogus") - end.to raise_error(Addressable::URI::InvalidURIError) - end -end - -describe Addressable::URI, "when created with a invalid encoded port number" do - it "should raise an error" do - expect do - Addressable::URI.new(:port => "%eb") - end.to raise_error(Addressable::URI::InvalidURIError) - end -end - -describe Addressable::URI, "when created with a non-string scheme" do - it "should raise an error" do - expect do - Addressable::URI.new(:scheme => :bogus) - end.to raise_error(TypeError) - end -end - -describe Addressable::URI, "when created with a non-string user" do - it "should raise an error" do - expect do - Addressable::URI.new(:user => :bogus) - end.to raise_error(TypeError) - end -end - -describe Addressable::URI, "when created with a non-string password" do - it "should raise an error" do - expect do - Addressable::URI.new(:password => :bogus) - end.to raise_error(TypeError) - end -end - -describe Addressable::URI, "when created with a non-string userinfo" do - it "should raise an error" do - expect do - Addressable::URI.new(:userinfo => :bogus) - end.to raise_error(TypeError) - end -end - -describe Addressable::URI, "when created with a non-string host" do - it "should raise an error" do - expect do - Addressable::URI.new(:host => :bogus) - end.to raise_error(TypeError) - end -end - -describe Addressable::URI, "when created with a non-string authority" do - it "should raise an error" do - expect do - Addressable::URI.new(:authority => :bogus) - end.to raise_error(TypeError) - end -end - -describe Addressable::URI, "when created with a non-string path" do - it "should raise an error" do - expect do - Addressable::URI.new(:path => :bogus) - end.to raise_error(TypeError) - end -end - -describe Addressable::URI, "when created with a non-string query" do - it "should raise an error" do - expect do - Addressable::URI.new(:query => :bogus) - end.to raise_error(TypeError) - end -end - -describe Addressable::URI, "when created with a non-string fragment" do - it "should raise an error" do - expect do - Addressable::URI.new(:fragment => :bogus) - end.to raise_error(TypeError) - end -end - -describe Addressable::URI, "when created with a scheme but no hierarchical " + - "segment" do - it "should raise an error" do - expect do - Addressable::URI.parse("http:") - end.to raise_error(Addressable::URI::InvalidURIError) - end -end - -describe Addressable::URI, "quote handling" do - describe 'in host name' do - it "should raise an error for single quote" do - expect do - Addressable::URI.parse("http://local\"host/") - end.to raise_error(Addressable::URI::InvalidURIError) - end - end -end - -describe Addressable::URI, "newline normalization" do - it "should not accept newlines in scheme" do - expect do - Addressable::URI.parse("ht%0atp://localhost/") - end.to raise_error(Addressable::URI::InvalidURIError) - end - - it "should not unescape newline in path" do - uri = Addressable::URI.parse("http://localhost/%0a").normalize - expect(uri.to_s).to eq("http://localhost/%0A") - end - - it "should not unescape newline in hostname" do - uri = Addressable::URI.parse("http://local%0ahost/").normalize - expect(uri.to_s).to eq("http://local%0Ahost/") - end - - it "should not unescape newline in username" do - uri = Addressable::URI.parse("http://foo%0abar@localhost/").normalize - expect(uri.to_s).to eq("http://foo%0Abar@localhost/") - end - - it "should not unescape newline in username" do - uri = Addressable::URI.parse("http://example:foo%0abar@example/").normalize - expect(uri.to_s).to eq("http://example:foo%0Abar@example/") - end - - it "should not accept newline in hostname" do - uri = Addressable::URI.parse("http://localhost/") - expect do - uri.host = "local\nhost" - end.to raise_error(Addressable::URI::InvalidURIError) - end -end - -describe Addressable::URI, "when created with ambiguous path" do - it "should raise an error" do - expect do - Addressable::URI.parse("::http") - end.to raise_error(Addressable::URI::InvalidURIError) - end -end - -describe Addressable::URI, "when created with an invalid host" do - it "should raise an error" do - expect do - Addressable::URI.new(:host => "") - end.to raise_error(Addressable::URI::InvalidURIError) - end -end - -describe Addressable::URI, "when created with a host consisting of " + - "sub-delims characters" do - it "should not raise an error" do - expect do - Addressable::URI.new( - :host => Addressable::URI::CharacterClasses::SUB_DELIMS.gsub(/\\/, '') - ) - end.not_to raise_error - end -end - -describe Addressable::URI, "when created with a host consisting of " + - "unreserved characters" do - it "should not raise an error" do - expect do - Addressable::URI.new( - :host => Addressable::URI::CharacterClasses::UNRESERVED.gsub(/\\/, '') - ) - end.not_to raise_error - end -end - -describe Addressable::URI, "when created from nil components" do - before do - @uri = Addressable::URI.new - end - - it "should have a nil site value" do - expect(@uri.site).to eq(nil) - end - - it "should have an empty path" do - expect(@uri.path).to eq("") - end - - it "should be an empty uri" do - expect(@uri.to_s).to eq("") - end - - it "should have a nil default port" do - expect(@uri.default_port).to eq(nil) - end - - it "should be empty" do - expect(@uri).to be_empty - end - - it "should raise an error if the scheme is set to whitespace" do - expect do - @uri.scheme = "\t \n" - end.to raise_error(Addressable::URI::InvalidURIError, /'\t \n'/) - end - - it "should raise an error if the scheme is set to all digits" do - expect do - @uri.scheme = "123" - end.to raise_error(Addressable::URI::InvalidURIError, /'123'/) - end - - it "should raise an error if the scheme begins with a digit" do - expect do - @uri.scheme = "1scheme" - end.to raise_error(Addressable::URI::InvalidURIError, /'1scheme'/) - end - - it "should raise an error if the scheme begins with a plus" do - expect do - @uri.scheme = "+scheme" - end.to raise_error(Addressable::URI::InvalidURIError, /'\+scheme'/) - end - - it "should raise an error if the scheme begins with a dot" do - expect do - @uri.scheme = ".scheme" - end.to raise_error(Addressable::URI::InvalidURIError, /'\.scheme'/) - end - - it "should raise an error if the scheme begins with a dash" do - expect do - @uri.scheme = "-scheme" - end.to raise_error(Addressable::URI::InvalidURIError, /'-scheme'/) - end - - it "should raise an error if the scheme contains an illegal character" do - expect do - @uri.scheme = "scheme!" - end.to raise_error(Addressable::URI::InvalidURIError, /'scheme!'/) - end - - it "should raise an error if the scheme contains whitespace" do - expect do - @uri.scheme = "sch eme" - end.to raise_error(Addressable::URI::InvalidURIError, /'sch eme'/) - end - - it "should raise an error if the scheme contains a newline" do - expect do - @uri.scheme = "sch\neme" - end.to raise_error(Addressable::URI::InvalidURIError) - end - - it "should raise an error if set into an invalid state" do - expect do - @uri.user = "user" - end.to raise_error(Addressable::URI::InvalidURIError) - end - - it "should raise an error if set into an invalid state" do - expect do - @uri.password = "pass" - end.to raise_error(Addressable::URI::InvalidURIError) - end - - it "should raise an error if set into an invalid state" do - expect do - @uri.scheme = "http" - @uri.fragment = "fragment" - end.to raise_error(Addressable::URI::InvalidURIError) - end - - it "should raise an error if set into an invalid state" do - expect do - @uri.fragment = "fragment" - @uri.scheme = "http" - end.to raise_error(Addressable::URI::InvalidURIError) - end -end - -describe Addressable::URI, "when initialized from individual components" do - before do - @uri = Addressable::URI.new( - :scheme => "http", - :user => "user", - :password => "password", - :host => "example.com", - :port => 8080, - :path => "/path", - :query => "query=value", - :fragment => "fragment" - ) - end - - it "returns 'http' for #scheme" do - expect(@uri.scheme).to eq("http") - end - - it "returns 'http' for #normalized_scheme" do - expect(@uri.normalized_scheme).to eq("http") - end - - it "returns 'user' for #user" do - expect(@uri.user).to eq("user") - end - - it "returns 'user' for #normalized_user" do - expect(@uri.normalized_user).to eq("user") - end - - it "returns 'password' for #password" do - expect(@uri.password).to eq("password") - end - - it "returns 'password' for #normalized_password" do - expect(@uri.normalized_password).to eq("password") - end - - it "returns 'user:password' for #userinfo" do - expect(@uri.userinfo).to eq("user:password") - end - - it "returns 'user:password' for #normalized_userinfo" do - expect(@uri.normalized_userinfo).to eq("user:password") - end - - it "returns 'example.com' for #host" do - expect(@uri.host).to eq("example.com") - end - - it "returns 'example.com' for #normalized_host" do - expect(@uri.normalized_host).to eq("example.com") - end - - it "returns 'com' for #tld" do - expect(@uri.tld).to eq("com") - end - - it "returns 'user:password@example.com:8080' for #authority" do - expect(@uri.authority).to eq("user:password@example.com:8080") - end - - it "returns 'user:password@example.com:8080' for #normalized_authority" do - expect(@uri.normalized_authority).to eq("user:password@example.com:8080") - end - - it "returns 8080 for #port" do - expect(@uri.port).to eq(8080) - end - - it "returns 8080 for #normalized_port" do - expect(@uri.normalized_port).to eq(8080) - end - - it "returns 80 for #default_port" do - expect(@uri.default_port).to eq(80) - end - - it "returns 'http://user:password@example.com:8080' for #site" do - expect(@uri.site).to eq("http://user:password@example.com:8080") - end - - it "returns 'http://user:password@example.com:8080' for #normalized_site" do - expect(@uri.normalized_site).to eq("http://user:password@example.com:8080") - end - - it "returns '/path' for #path" do - expect(@uri.path).to eq("/path") - end - - it "returns '/path' for #normalized_path" do - expect(@uri.normalized_path).to eq("/path") - end - - it "returns 'query=value' for #query" do - expect(@uri.query).to eq("query=value") - end - - it "returns 'query=value' for #normalized_query" do - expect(@uri.normalized_query).to eq("query=value") - end - - it "returns 'fragment' for #fragment" do - expect(@uri.fragment).to eq("fragment") - end - - it "returns 'fragment' for #normalized_fragment" do - expect(@uri.normalized_fragment).to eq("fragment") - end - - it "returns #hash" do - expect(@uri.hash).not_to be nil - end - - it "returns #to_s" do - expect(@uri.to_s).to eq( - "http://user:password@example.com:8080/path?query=value#fragment" - ) - end - - it "should not be empty" do - expect(@uri).not_to be_empty - end - - it "should not be frozen" do - expect(@uri).not_to be_frozen - end - - it "should allow destructive operations" do - expect { @uri.normalize! }.not_to raise_error - end -end - -describe Addressable::URI, "when initialized from " + - "frozen individual components" do - before do - @uri = Addressable::URI.new( - :scheme => "http".freeze, - :user => "user".freeze, - :password => "password".freeze, - :host => "example.com".freeze, - :port => "8080".freeze, - :path => "/path".freeze, - :query => "query=value".freeze, - :fragment => "fragment".freeze - ) - end - - it "returns 'http' for #scheme" do - expect(@uri.scheme).to eq("http") - end - - it "returns 'http' for #normalized_scheme" do - expect(@uri.normalized_scheme).to eq("http") - end - - it "returns 'user' for #user" do - expect(@uri.user).to eq("user") - end - - it "returns 'user' for #normalized_user" do - expect(@uri.normalized_user).to eq("user") - end - - it "returns 'password' for #password" do - expect(@uri.password).to eq("password") - end - - it "returns 'password' for #normalized_password" do - expect(@uri.normalized_password).to eq("password") - end - - it "returns 'user:password' for #userinfo" do - expect(@uri.userinfo).to eq("user:password") - end - - it "returns 'user:password' for #normalized_userinfo" do - expect(@uri.normalized_userinfo).to eq("user:password") - end - - it "returns 'example.com' for #host" do - expect(@uri.host).to eq("example.com") - end - - it "returns 'example.com' for #normalized_host" do - expect(@uri.normalized_host).to eq("example.com") - end - - it "returns 'user:password@example.com:8080' for #authority" do - expect(@uri.authority).to eq("user:password@example.com:8080") - end - - it "returns 'user:password@example.com:8080' for #normalized_authority" do - expect(@uri.normalized_authority).to eq("user:password@example.com:8080") - end - - it "returns 8080 for #port" do - expect(@uri.port).to eq(8080) - end - - it "returns 8080 for #normalized_port" do - expect(@uri.normalized_port).to eq(8080) - end - - it "returns 80 for #default_port" do - expect(@uri.default_port).to eq(80) - end - - it "returns 'http://user:password@example.com:8080' for #site" do - expect(@uri.site).to eq("http://user:password@example.com:8080") - end - - it "returns 'http://user:password@example.com:8080' for #normalized_site" do - expect(@uri.normalized_site).to eq("http://user:password@example.com:8080") - end - - it "returns '/path' for #path" do - expect(@uri.path).to eq("/path") - end - - it "returns '/path' for #normalized_path" do - expect(@uri.normalized_path).to eq("/path") - end - - it "returns 'query=value' for #query" do - expect(@uri.query).to eq("query=value") - end - - it "returns 'query=value' for #normalized_query" do - expect(@uri.normalized_query).to eq("query=value") - end - - it "returns 'fragment' for #fragment" do - expect(@uri.fragment).to eq("fragment") - end - - it "returns 'fragment' for #normalized_fragment" do - expect(@uri.normalized_fragment).to eq("fragment") - end - - it "returns #hash" do - expect(@uri.hash).not_to be nil - end - - it "returns #to_s" do - expect(@uri.to_s).to eq( - "http://user:password@example.com:8080/path?query=value#fragment" - ) - end - - it "should not be empty" do - expect(@uri).not_to be_empty - end - - it "should not be frozen" do - expect(@uri).not_to be_frozen - end - - it "should allow destructive operations" do - expect { @uri.normalize! }.not_to raise_error - end -end - -describe Addressable::URI, "when parsed from a frozen string" do - before do - @uri = Addressable::URI.parse( - "http://user:password@example.com:8080/path?query=value#fragment".freeze - ) - end - - it "returns 'http' for #scheme" do - expect(@uri.scheme).to eq("http") - end - - it "returns 'http' for #normalized_scheme" do - expect(@uri.normalized_scheme).to eq("http") - end - - it "returns 'user' for #user" do - expect(@uri.user).to eq("user") - end - - it "returns 'user' for #normalized_user" do - expect(@uri.normalized_user).to eq("user") - end - - it "returns 'password' for #password" do - expect(@uri.password).to eq("password") - end - - it "returns 'password' for #normalized_password" do - expect(@uri.normalized_password).to eq("password") - end - - it "returns 'user:password' for #userinfo" do - expect(@uri.userinfo).to eq("user:password") - end - - it "returns 'user:password' for #normalized_userinfo" do - expect(@uri.normalized_userinfo).to eq("user:password") - end - - it "returns 'example.com' for #host" do - expect(@uri.host).to eq("example.com") - end - - it "returns 'example.com' for #normalized_host" do - expect(@uri.normalized_host).to eq("example.com") - end - - it "returns 'user:password@example.com:8080' for #authority" do - expect(@uri.authority).to eq("user:password@example.com:8080") - end - - it "returns 'user:password@example.com:8080' for #normalized_authority" do - expect(@uri.normalized_authority).to eq("user:password@example.com:8080") - end - - it "returns 8080 for #port" do - expect(@uri.port).to eq(8080) - end - - it "returns 8080 for #normalized_port" do - expect(@uri.normalized_port).to eq(8080) - end - - it "returns 80 for #default_port" do - expect(@uri.default_port).to eq(80) - end - - it "returns 'http://user:password@example.com:8080' for #site" do - expect(@uri.site).to eq("http://user:password@example.com:8080") - end - - it "returns 'http://user:password@example.com:8080' for #normalized_site" do - expect(@uri.normalized_site).to eq("http://user:password@example.com:8080") - end - - it "returns '/path' for #path" do - expect(@uri.path).to eq("/path") - end - - it "returns '/path' for #normalized_path" do - expect(@uri.normalized_path).to eq("/path") - end - - it "returns 'query=value' for #query" do - expect(@uri.query).to eq("query=value") - end - - it "returns 'query=value' for #normalized_query" do - expect(@uri.normalized_query).to eq("query=value") - end - - it "returns 'fragment' for #fragment" do - expect(@uri.fragment).to eq("fragment") - end - - it "returns 'fragment' for #normalized_fragment" do - expect(@uri.normalized_fragment).to eq("fragment") - end - - it "returns #hash" do - expect(@uri.hash).not_to be nil - end - - it "returns #to_s" do - expect(@uri.to_s).to eq( - "http://user:password@example.com:8080/path?query=value#fragment" - ) - end - - it "should not be empty" do - expect(@uri).not_to be_empty - end - - it "should not be frozen" do - expect(@uri).not_to be_frozen - end - - it "should allow destructive operations" do - expect { @uri.normalize! }.not_to raise_error - end -end - -describe Addressable::URI, "when frozen" do - before do - @uri = Addressable::URI.new.freeze - end - - it "returns nil for #scheme" do - expect(@uri.scheme).to eq(nil) - end - - it "returns nil for #normalized_scheme" do - expect(@uri.normalized_scheme).to eq(nil) - end - - it "returns nil for #user" do - expect(@uri.user).to eq(nil) - end - - it "returns nil for #normalized_user" do - expect(@uri.normalized_user).to eq(nil) - end - - it "returns nil for #password" do - expect(@uri.password).to eq(nil) - end - - it "returns nil for #normalized_password" do - expect(@uri.normalized_password).to eq(nil) - end - - it "returns nil for #userinfo" do - expect(@uri.userinfo).to eq(nil) - end - - it "returns nil for #normalized_userinfo" do - expect(@uri.normalized_userinfo).to eq(nil) - end - - it "returns nil for #host" do - expect(@uri.host).to eq(nil) - end - - it "returns nil for #normalized_host" do - expect(@uri.normalized_host).to eq(nil) - end - - it "returns nil for #authority" do - expect(@uri.authority).to eq(nil) - end - - it "returns nil for #normalized_authority" do - expect(@uri.normalized_authority).to eq(nil) - end - - it "returns nil for #port" do - expect(@uri.port).to eq(nil) - end - - it "returns nil for #normalized_port" do - expect(@uri.normalized_port).to eq(nil) - end - - it "returns nil for #default_port" do - expect(@uri.default_port).to eq(nil) - end - - it "returns nil for #site" do - expect(@uri.site).to eq(nil) - end - - it "returns nil for #normalized_site" do - expect(@uri.normalized_site).to eq(nil) - end - - it "returns '' for #path" do - expect(@uri.path).to eq('') - end - - it "returns '' for #normalized_path" do - expect(@uri.normalized_path).to eq('') - end - - it "returns nil for #query" do - expect(@uri.query).to eq(nil) - end - - it "returns nil for #normalized_query" do - expect(@uri.normalized_query).to eq(nil) - end - - it "returns nil for #fragment" do - expect(@uri.fragment).to eq(nil) - end - - it "returns nil for #normalized_fragment" do - expect(@uri.normalized_fragment).to eq(nil) - end - - it "returns #hash" do - expect(@uri.hash).not_to be nil - end - - it "returns #to_s" do - expect(@uri.to_s).to eq('') - end - - it "should be empty" do - expect(@uri).to be_empty - end - - it "should be frozen" do - expect(@uri).to be_frozen - end - - it "should not be frozen after duping" do - expect(@uri.dup).not_to be_frozen - end - - it "should not allow destructive operations" do - expect { @uri.normalize! }.to raise_error { |error| - expect(error.message).to match(/can't modify frozen/) - expect(error).to satisfy { |e| RuntimeError === e || TypeError === e } - } - end -end - -describe Addressable::URI, "when frozen" do - before do - @uri = Addressable::URI.parse( - "HTTP://example.com.:%38%30/%70a%74%68?a=%31#1%323" - ).freeze - end - - it "returns 'HTTP' for #scheme" do - expect(@uri.scheme).to eq("HTTP") - end - - it "returns 'http' for #normalized_scheme" do - expect(@uri.normalized_scheme).to eq("http") - expect(@uri.normalize.scheme).to eq("http") - end - - it "returns nil for #user" do - expect(@uri.user).to eq(nil) - end - - it "returns nil for #normalized_user" do - expect(@uri.normalized_user).to eq(nil) - end - - it "returns nil for #password" do - expect(@uri.password).to eq(nil) - end - - it "returns nil for #normalized_password" do - expect(@uri.normalized_password).to eq(nil) - end - - it "returns nil for #userinfo" do - expect(@uri.userinfo).to eq(nil) - end - - it "returns nil for #normalized_userinfo" do - expect(@uri.normalized_userinfo).to eq(nil) - end - - it "returns 'example.com.' for #host" do - expect(@uri.host).to eq("example.com.") - end - - it "returns nil for #normalized_host" do - expect(@uri.normalized_host).to eq("example.com") - expect(@uri.normalize.host).to eq("example.com") - end - - it "returns 'example.com.:80' for #authority" do - expect(@uri.authority).to eq("example.com.:80") - end - - it "returns 'example.com:80' for #normalized_authority" do - expect(@uri.normalized_authority).to eq("example.com") - expect(@uri.normalize.authority).to eq("example.com") - end - - it "returns 80 for #port" do - expect(@uri.port).to eq(80) - end - - it "returns nil for #normalized_port" do - expect(@uri.normalized_port).to eq(nil) - expect(@uri.normalize.port).to eq(nil) - end - - it "returns 80 for #default_port" do - expect(@uri.default_port).to eq(80) - end - - it "returns 'HTTP://example.com.:80' for #site" do - expect(@uri.site).to eq("HTTP://example.com.:80") - end - - it "returns 'http://example.com' for #normalized_site" do - expect(@uri.normalized_site).to eq("http://example.com") - expect(@uri.normalize.site).to eq("http://example.com") - end - - it "returns '/%70a%74%68' for #path" do - expect(@uri.path).to eq("/%70a%74%68") - end - - it "returns '/path' for #normalized_path" do - expect(@uri.normalized_path).to eq("/path") - expect(@uri.normalize.path).to eq("/path") - end - - it "returns 'a=%31' for #query" do - expect(@uri.query).to eq("a=%31") - end - - it "returns 'a=1' for #normalized_query" do - expect(@uri.normalized_query).to eq("a=1") - expect(@uri.normalize.query).to eq("a=1") - end - - it "returns '/%70a%74%68?a=%31' for #request_uri" do - expect(@uri.request_uri).to eq("/%70a%74%68?a=%31") - end - - it "returns '1%323' for #fragment" do - expect(@uri.fragment).to eq("1%323") - end - - it "returns '123' for #normalized_fragment" do - expect(@uri.normalized_fragment).to eq("123") - expect(@uri.normalize.fragment).to eq("123") - end - - it "returns #hash" do - expect(@uri.hash).not_to be nil - end - - it "returns #to_s" do - expect(@uri.to_s).to eq('HTTP://example.com.:80/%70a%74%68?a=%31#1%323') - expect(@uri.normalize.to_s).to eq('http://example.com/path?a=1#123') - end - - it "should not be empty" do - expect(@uri).not_to be_empty - end - - it "should be frozen" do - expect(@uri).to be_frozen - end - - it "should not be frozen after duping" do - expect(@uri.dup).not_to be_frozen - end - - it "should not allow destructive operations" do - expect { @uri.normalize! }.to raise_error { |error| - expect(error.message).to match(/can't modify frozen/) - expect(error).to satisfy { |e| RuntimeError === e || TypeError === e } - } - end -end - -describe Addressable::URI, "when normalized and then deeply frozen" do - before do - @uri = Addressable::URI.parse( - "http://user:password@example.com:8080/path?query=value#fragment" - ).normalize! - - @uri.instance_variables.each do |var| - @uri.instance_variable_set(var, @uri.instance_variable_get(var).freeze) - end - - @uri.freeze - end - - it "#normalized_scheme should not error" do - expect { @uri.normalized_scheme }.not_to raise_error - end - - it "#normalized_user should not error" do - expect { @uri.normalized_user }.not_to raise_error - end - - it "#normalized_password should not error" do - expect { @uri.normalized_password }.not_to raise_error - end - - it "#normalized_userinfo should not error" do - expect { @uri.normalized_userinfo }.not_to raise_error - end - - it "#normalized_host should not error" do - expect { @uri.normalized_host }.not_to raise_error - end - - it "#normalized_authority should not error" do - expect { @uri.normalized_authority }.not_to raise_error - end - - it "#normalized_port should not error" do - expect { @uri.normalized_port }.not_to raise_error - end - - it "#normalized_site should not error" do - expect { @uri.normalized_site }.not_to raise_error - end - - it "#normalized_path should not error" do - expect { @uri.normalized_path }.not_to raise_error - end - - it "#normalized_query should not error" do - expect { @uri.normalized_query }.not_to raise_error - end - - it "#normalized_fragment should not error" do - expect { @uri.normalized_fragment }.not_to raise_error - end - - it "should be frozen" do - expect(@uri).to be_frozen - end - - it "should not allow destructive operations" do - expect { @uri.normalize! }.to raise_error(RuntimeError) - end -end - -describe Addressable::URI, "when created from string components" do - before do - @uri = Addressable::URI.new( - :scheme => "http", :host => "example.com" - ) - end - - it "should have a site value of 'http://example.com'" do - expect(@uri.site).to eq("http://example.com") - end - - it "should be equal to the equivalent parsed URI" do - expect(@uri).to eq(Addressable::URI.parse("http://example.com")) - end - - it "should raise an error if invalid components omitted" do - expect do - @uri.omit(:bogus) - end.to raise_error(ArgumentError) - expect do - @uri.omit(:scheme, :bogus, :path) - end.to raise_error(ArgumentError) - end -end - -describe Addressable::URI, "when created with a nil host but " + - "non-nil authority components" do - it "should raise an error" do - expect do - Addressable::URI.new(:user => "user", :password => "pass", :port => 80) - end.to raise_error(Addressable::URI::InvalidURIError) - end -end - -describe Addressable::URI, "when created with both an authority and a user" do - it "should raise an error" do - expect do - Addressable::URI.new( - :user => "user", :authority => "user@example.com:80" - ) - end.to raise_error(ArgumentError) - end -end - -describe Addressable::URI, "when created with an authority and no port" do - before do - @uri = Addressable::URI.new(:authority => "user@example.com") - end - - it "should not infer a port" do - expect(@uri.port).to eq(nil) - expect(@uri.default_port).to eq(nil) - expect(@uri.inferred_port).to eq(nil) - end - - it "should have a site value of '//user@example.com'" do - expect(@uri.site).to eq("//user@example.com") - end - - it "should have a 'null' origin" do - expect(@uri.origin).to eq('null') - end -end - -describe Addressable::URI, "when created with a host with trailing dots" do - before do - @uri = Addressable::URI.new(:authority => "example...") - end - - it "should have a stable normalized form" do - expect(@uri.normalize.normalize.normalize.host).to eq( - @uri.normalize.host - ) - end -end - -describe Addressable::URI, "when created with a host with a backslash" do - it "should raise an error" do - expect do - Addressable::URI.new(:authority => "example\\example") - end.to raise_error(Addressable::URI::InvalidURIError) - end -end - -describe Addressable::URI, "when created with a host with a slash" do - it "should raise an error" do - expect do - Addressable::URI.new(:authority => "example/example") - end.to raise_error(Addressable::URI::InvalidURIError) - end -end - -describe Addressable::URI, "when created with a host with a space" do - it "should raise an error" do - expect do - Addressable::URI.new(:authority => "example example") - end.to raise_error(Addressable::URI::InvalidURIError) - end -end - -describe Addressable::URI, "when created with both a userinfo and a user" do - it "should raise an error" do - expect do - Addressable::URI.new(:user => "user", :userinfo => "user:pass") - end.to raise_error(ArgumentError) - end -end - -describe Addressable::URI, "when created with a path that hasn't been " + - "prefixed with a '/' but a host specified" do - before do - @uri = Addressable::URI.new( - :scheme => "http", :host => "example.com", :path => "path" - ) - end - - it "should prefix a '/' to the path" do - expect(@uri).to eq(Addressable::URI.parse("http://example.com/path")) - end - - it "should have a site value of 'http://example.com'" do - expect(@uri.site).to eq("http://example.com") - end - - it "should have an origin of 'http://example.com" do - expect(@uri.origin).to eq('http://example.com') - end -end - -describe Addressable::URI, "when created with a path that hasn't been " + - "prefixed with a '/' but no host specified" do - before do - @uri = Addressable::URI.new( - :scheme => "http", :path => "path" - ) - end - - it "should not prefix a '/' to the path" do - expect(@uri).to eq(Addressable::URI.parse("http:path")) - end - - it "should have a site value of 'http:'" do - expect(@uri.site).to eq("http:") - end - - it "should have a 'null' origin" do - expect(@uri.origin).to eq('null') - end -end - -describe Addressable::URI, "when parsed from an Addressable::URI object" do - it "should not have unexpected side-effects" do - original_uri = Addressable::URI.parse("http://example.com/") - new_uri = Addressable::URI.parse(original_uri) - new_uri.host = 'www.example.com' - expect(new_uri.host).to eq('www.example.com') - expect(new_uri.to_s).to eq('http://www.example.com/') - expect(original_uri.host).to eq('example.com') - expect(original_uri.to_s).to eq('http://example.com/') - end - - it "should not have unexpected side-effects" do - original_uri = Addressable::URI.parse("http://example.com/") - new_uri = Addressable::URI.heuristic_parse(original_uri) - new_uri.host = 'www.example.com' - expect(new_uri.host).to eq('www.example.com') - expect(new_uri.to_s).to eq('http://www.example.com/') - expect(original_uri.host).to eq('example.com') - expect(original_uri.to_s).to eq('http://example.com/') - end - - it "should not have unexpected side-effects" do - original_uri = Addressable::URI.parse("http://example.com/") - new_uri = Addressable::URI.parse(original_uri) - new_uri.origin = 'https://www.example.com:8080' - expect(new_uri.host).to eq('www.example.com') - expect(new_uri.to_s).to eq('https://www.example.com:8080/') - expect(original_uri.host).to eq('example.com') - expect(original_uri.to_s).to eq('http://example.com/') - end - - it "should not have unexpected side-effects" do - original_uri = Addressable::URI.parse("http://example.com/") - new_uri = Addressable::URI.heuristic_parse(original_uri) - new_uri.origin = 'https://www.example.com:8080' - expect(new_uri.host).to eq('www.example.com') - expect(new_uri.to_s).to eq('https://www.example.com:8080/') - expect(original_uri.host).to eq('example.com') - expect(original_uri.to_s).to eq('http://example.com/') - end -end - -describe Addressable::URI, "when parsed from something that looks " + - "like a URI object" do - it "should parse without error" do - uri = Addressable::URI.parse(Fake::URI::HTTP.new("http://example.com/")) - expect do - Addressable::URI.parse(uri) - end.not_to raise_error - end -end - -describe Addressable::URI, "when parsed from a standard library URI object" do - it "should parse without error" do - uri = Addressable::URI.parse(URI.parse("http://example.com/")) - expect do - Addressable::URI.parse(uri) - end.not_to raise_error - end -end - -describe Addressable::URI, "when parsed from ''" do - before do - @uri = Addressable::URI.parse("") - end - - it "should have no scheme" do - expect(@uri.scheme).to eq(nil) - end - - it "should not be considered to be ip-based" do - expect(@uri).not_to be_ip_based - end - - it "should have a path of ''" do - expect(@uri.path).to eq("") - end - - it "should have a request URI of '/'" do - expect(@uri.request_uri).to eq("/") - end - - it "should be considered relative" do - expect(@uri).to be_relative - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end - - it "should have a 'null' origin" do - expect(@uri.origin).to eq('null') - end -end - -# Section 1.1.2 of RFC 3986 -describe Addressable::URI, "when parsed from " + - "'ftp://ftp.is.co.za/rfc/rfc1808.txt'" do - before do - @uri = Addressable::URI.parse("ftp://ftp.is.co.za/rfc/rfc1808.txt") - end - - it "should use the 'ftp' scheme" do - expect(@uri.scheme).to eq("ftp") - end - - it "should be considered to be ip-based" do - expect(@uri).to be_ip_based - end - - it "should have a host of 'ftp.is.co.za'" do - expect(@uri.host).to eq("ftp.is.co.za") - end - - it "should have inferred_port of 21" do - expect(@uri.inferred_port).to eq(21) - end - - it "should have a path of '/rfc/rfc1808.txt'" do - expect(@uri.path).to eq("/rfc/rfc1808.txt") - end - - it "should not have a request URI" do - expect(@uri.request_uri).to eq(nil) - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end - - it "should have an origin of 'ftp://ftp.is.co.za'" do - expect(@uri.origin).to eq('ftp://ftp.is.co.za') - end -end - -# Section 1.1.2 of RFC 3986 -describe Addressable::URI, "when parsed from " + - "'http://www.ietf.org/rfc/rfc2396.txt'" do - before do - @uri = Addressable::URI.parse("http://www.ietf.org/rfc/rfc2396.txt") - end - - it "should use the 'http' scheme" do - expect(@uri.scheme).to eq("http") - end - - it "should be considered to be ip-based" do - expect(@uri).to be_ip_based - end - - it "should have a host of 'www.ietf.org'" do - expect(@uri.host).to eq("www.ietf.org") - end - - it "should have inferred_port of 80" do - expect(@uri.inferred_port).to eq(80) - end - - it "should have a path of '/rfc/rfc2396.txt'" do - expect(@uri.path).to eq("/rfc/rfc2396.txt") - end - - it "should have a request URI of '/rfc/rfc2396.txt'" do - expect(@uri.request_uri).to eq("/rfc/rfc2396.txt") - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end - - it "should correctly omit components" do - expect(@uri.omit(:scheme).to_s).to eq("//www.ietf.org/rfc/rfc2396.txt") - expect(@uri.omit(:path).to_s).to eq("http://www.ietf.org") - end - - it "should correctly omit components destructively" do - @uri.omit!(:scheme) - expect(@uri.to_s).to eq("//www.ietf.org/rfc/rfc2396.txt") - end - - it "should have an origin of 'http://www.ietf.org'" do - expect(@uri.origin).to eq('http://www.ietf.org') - end -end - -# Section 1.1.2 of RFC 3986 -describe Addressable::URI, "when parsed from " + - "'ldap://[2001:db8::7]/c=GB?objectClass?one'" do - before do - @uri = Addressable::URI.parse("ldap://[2001:db8::7]/c=GB?objectClass?one") - end - - it "should use the 'ldap' scheme" do - expect(@uri.scheme).to eq("ldap") - end - - it "should be considered to be ip-based" do - expect(@uri).to be_ip_based - end - - it "should have a host of '[2001:db8::7]'" do - expect(@uri.host).to eq("[2001:db8::7]") - end - - it "should have inferred_port of 389" do - expect(@uri.inferred_port).to eq(389) - end - - it "should have a path of '/c=GB'" do - expect(@uri.path).to eq("/c=GB") - end - - it "should not have a request URI" do - expect(@uri.request_uri).to eq(nil) - end - - it "should not allow request URI assignment" do - expect do - @uri.request_uri = "/" - end.to raise_error(Addressable::URI::InvalidURIError) - end - - it "should have a query of 'objectClass?one'" do - expect(@uri.query).to eq("objectClass?one") - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end - - it "should correctly omit components" do - expect(@uri.omit(:scheme, :authority).to_s).to eq("/c=GB?objectClass?one") - expect(@uri.omit(:path).to_s).to eq("ldap://[2001:db8::7]?objectClass?one") - end - - it "should correctly omit components destructively" do - @uri.omit!(:scheme, :authority) - expect(@uri.to_s).to eq("/c=GB?objectClass?one") - end - - it "should raise an error if omission would create an invalid URI" do - expect do - @uri.omit(:authority, :path) - end.to raise_error(Addressable::URI::InvalidURIError) - end - - it "should have an origin of 'ldap://[2001:db8::7]'" do - expect(@uri.origin).to eq('ldap://[2001:db8::7]') - end -end - -# Section 1.1.2 of RFC 3986 -describe Addressable::URI, "when parsed from " + - "'mailto:John.Doe@example.com'" do - before do - @uri = Addressable::URI.parse("mailto:John.Doe@example.com") - end - - it "should use the 'mailto' scheme" do - expect(@uri.scheme).to eq("mailto") - end - - it "should not be considered to be ip-based" do - expect(@uri).not_to be_ip_based - end - - it "should not have an inferred_port" do - expect(@uri.inferred_port).to eq(nil) - end - - it "should have a path of 'John.Doe@example.com'" do - expect(@uri.path).to eq("John.Doe@example.com") - end - - it "should not have a request URI" do - expect(@uri.request_uri).to eq(nil) - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end - - it "should have a 'null' origin" do - expect(@uri.origin).to eq('null') - end -end - -# Section 2 of RFC 6068 -describe Addressable::URI, "when parsed from " + - "'mailto:?to=addr1@an.example,addr2@an.example'" do - before do - @uri = Addressable::URI.parse( - "mailto:?to=addr1@an.example,addr2@an.example" - ) - end - - it "should use the 'mailto' scheme" do - expect(@uri.scheme).to eq("mailto") - end - - it "should not be considered to be ip-based" do - expect(@uri).not_to be_ip_based - end - - it "should not have an inferred_port" do - expect(@uri.inferred_port).to eq(nil) - end - - it "should have a path of ''" do - expect(@uri.path).to eq("") - end - - it "should not have a request URI" do - expect(@uri.request_uri).to eq(nil) - end - - it "should have the To: field value parameterized" do - expect(@uri.query_values(Hash)["to"]).to eq( - "addr1@an.example,addr2@an.example" - ) - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end - - it "should have a 'null' origin" do - expect(@uri.origin).to eq('null') - end -end - -# Section 1.1.2 of RFC 3986 -describe Addressable::URI, "when parsed from " + - "'news:comp.infosystems.www.servers.unix'" do - before do - @uri = Addressable::URI.parse("news:comp.infosystems.www.servers.unix") - end - - it "should use the 'news' scheme" do - expect(@uri.scheme).to eq("news") - end - - it "should not have an inferred_port" do - expect(@uri.inferred_port).to eq(nil) - end - - it "should not be considered to be ip-based" do - expect(@uri).not_to be_ip_based - end - - it "should have a path of 'comp.infosystems.www.servers.unix'" do - expect(@uri.path).to eq("comp.infosystems.www.servers.unix") - end - - it "should not have a request URI" do - expect(@uri.request_uri).to eq(nil) - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end - - it "should have a 'null' origin" do - expect(@uri.origin).to eq('null') - end -end - -# Section 1.1.2 of RFC 3986 -describe Addressable::URI, "when parsed from " + - "'tel:+1-816-555-1212'" do - before do - @uri = Addressable::URI.parse("tel:+1-816-555-1212") - end - - it "should use the 'tel' scheme" do - expect(@uri.scheme).to eq("tel") - end - - it "should not be considered to be ip-based" do - expect(@uri).not_to be_ip_based - end - - it "should not have an inferred_port" do - expect(@uri.inferred_port).to eq(nil) - end - - it "should have a path of '+1-816-555-1212'" do - expect(@uri.path).to eq("+1-816-555-1212") - end - - it "should not have a request URI" do - expect(@uri.request_uri).to eq(nil) - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end - - it "should have a 'null' origin" do - expect(@uri.origin).to eq('null') - end -end - -# Section 1.1.2 of RFC 3986 -describe Addressable::URI, "when parsed from " + - "'telnet://192.0.2.16:80/'" do - before do - @uri = Addressable::URI.parse("telnet://192.0.2.16:80/") - end - - it "should use the 'telnet' scheme" do - expect(@uri.scheme).to eq("telnet") - end - - it "should have a host of '192.0.2.16'" do - expect(@uri.host).to eq("192.0.2.16") - end - - it "should have a port of 80" do - expect(@uri.port).to eq(80) - end - - it "should have a inferred_port of 80" do - expect(@uri.inferred_port).to eq(80) - end - - it "should have a default_port of 23" do - expect(@uri.default_port).to eq(23) - end - - it "should be considered to be ip-based" do - expect(@uri).to be_ip_based - end - - it "should have a path of '/'" do - expect(@uri.path).to eq("/") - end - - it "should not have a request URI" do - expect(@uri.request_uri).to eq(nil) - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end - - it "should have an origin of 'telnet://192.0.2.16:80'" do - expect(@uri.origin).to eq('telnet://192.0.2.16:80') - end -end - -# Section 1.1.2 of RFC 3986 -describe Addressable::URI, "when parsed from " + - "'urn:oasis:names:specification:docbook:dtd:xml:4.1.2'" do - before do - @uri = Addressable::URI.parse( - "urn:oasis:names:specification:docbook:dtd:xml:4.1.2") - end - - it "should use the 'urn' scheme" do - expect(@uri.scheme).to eq("urn") - end - - it "should not have an inferred_port" do - expect(@uri.inferred_port).to eq(nil) - end - - it "should not be considered to be ip-based" do - expect(@uri).not_to be_ip_based - end - - it "should have a path of " + - "'oasis:names:specification:docbook:dtd:xml:4.1.2'" do - expect(@uri.path).to eq("oasis:names:specification:docbook:dtd:xml:4.1.2") - end - - it "should not have a request URI" do - expect(@uri.request_uri).to eq(nil) - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end - - it "should have a 'null' origin" do - expect(@uri.origin).to eq('null') - end -end - -describe Addressable::URI, "when heuristically parsed from " + - "'192.0.2.16:8000/path'" do - before do - @uri = Addressable::URI.heuristic_parse("192.0.2.16:8000/path") - end - - it "should use the 'http' scheme" do - expect(@uri.scheme).to eq("http") - end - - it "should have a host of '192.0.2.16'" do - expect(@uri.host).to eq("192.0.2.16") - end - - it "should have a port of '8000'" do - expect(@uri.port).to eq(8000) - end - - it "should be considered to be ip-based" do - expect(@uri).to be_ip_based - end - - it "should have a path of '/path'" do - expect(@uri.path).to eq("/path") - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end - - it "should have an origin of 'http://192.0.2.16:8000'" do - expect(@uri.origin).to eq('http://192.0.2.16:8000') - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com'" do - before do - @uri = Addressable::URI.parse("http://example.com") - end - - it "when inspected, should have the correct URI" do - expect(@uri.inspect).to include("http://example.com") - end - - it "when inspected, should have the correct class name" do - expect(@uri.inspect).to include("Addressable::URI") - end - - it "when inspected, should have the correct object id" do - expect(@uri.inspect).to include("%#0x" % @uri.object_id) - end - - it "should use the 'http' scheme" do - expect(@uri.scheme).to eq("http") - end - - it "should be considered to be ip-based" do - expect(@uri).to be_ip_based - end - - it "should have an authority segment of 'example.com'" do - expect(@uri.authority).to eq("example.com") - end - - it "should have a host of 'example.com'" do - expect(@uri.host).to eq("example.com") - end - - it "should be considered ip-based" do - expect(@uri).to be_ip_based - end - - it "should have no username" do - expect(@uri.user).to eq(nil) - end - - it "should have no password" do - expect(@uri.password).to eq(nil) - end - - it "should use port 80" do - expect(@uri.inferred_port).to eq(80) - end - - it "should not have a specified port" do - expect(@uri.port).to eq(nil) - end - - it "should have an empty path" do - expect(@uri.path).to eq("") - end - - it "should have no query string" do - expect(@uri.query).to eq(nil) - expect(@uri.query_values).to eq(nil) - end - - it "should have a request URI of '/'" do - expect(@uri.request_uri).to eq("/") - end - - it "should have no fragment" do - expect(@uri.fragment).to eq(nil) - end - - it "should be considered absolute" do - expect(@uri).to be_absolute - end - - it "should not be considered relative" do - expect(@uri).not_to be_relative - end - - it "should not be exactly equal to 42" do - expect(@uri.eql?(42)).to eq(false) - end - - it "should not be equal to 42" do - expect(@uri == 42).to eq(false) - end - - it "should not be roughly equal to 42" do - expect(@uri === 42).to eq(false) - end - - it "should be exactly equal to http://example.com" do - expect(@uri.eql?(Addressable::URI.parse("http://example.com"))).to eq(true) - end - - it "should be roughly equal to http://example.com/" do - expect(@uri === Addressable::URI.parse("http://example.com/")).to eq(true) - end - - it "should be roughly equal to the string 'http://example.com/'" do - expect(@uri === "http://example.com/").to eq(true) - end - - it "should not be roughly equal to the string " + - "'http://example.com:bogus/'" do - expect do - expect(@uri === "http://example.com:bogus/").to eq(false) - end.not_to raise_error - end - - it "should result in itself when joined with itself" do - expect(@uri.join(@uri).to_s).to eq("http://example.com") - expect(@uri.join!(@uri).to_s).to eq("http://example.com") - end - - it "should be equivalent to http://EXAMPLE.com" do - expect(@uri).to eq(Addressable::URI.parse("http://EXAMPLE.com")) - end - - it "should be equivalent to http://EXAMPLE.com:80/" do - expect(@uri).to eq(Addressable::URI.parse("http://EXAMPLE.com:80/")) - end - - it "should have the same hash as http://example.com" do - expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com").hash) - end - - it "should have the same hash as http://EXAMPLE.com after assignment" do - @uri.origin = "http://EXAMPLE.com" - expect(@uri.hash).to eq(Addressable::URI.parse("http://EXAMPLE.com").hash) - end - - it "should have a different hash from http://EXAMPLE.com" do - expect(@uri.hash).not_to eq(Addressable::URI.parse("http://EXAMPLE.com").hash) - end - - it "should not allow origin assignment without scheme" do - expect do - @uri.origin = "example.com" - end.to raise_error(Addressable::URI::InvalidURIError) - end - - it "should not allow origin assignment without host" do - expect do - @uri.origin = "http://" - end.to raise_error(Addressable::URI::InvalidURIError) - end - - it "should not allow origin assignment with bogus type" do - expect do - @uri.origin = :bogus - end.to raise_error(TypeError) - end - - # Section 6.2.3 of RFC 3986 - it "should be equivalent to http://example.com/" do - expect(@uri).to eq(Addressable::URI.parse("http://example.com/")) - end - - # Section 6.2.3 of RFC 3986 - it "should be equivalent to http://example.com:/" do - expect(@uri).to eq(Addressable::URI.parse("http://example.com:/")) - end - - # Section 6.2.3 of RFC 3986 - it "should be equivalent to http://example.com:80/" do - expect(@uri).to eq(Addressable::URI.parse("http://example.com:80/")) - end - - # Section 6.2.2.1 of RFC 3986 - it "should be equivalent to http://EXAMPLE.COM/" do - expect(@uri).to eq(Addressable::URI.parse("http://EXAMPLE.COM/")) - end - - it "should have a route of '/path/' to 'http://example.com/path/'" do - expect(@uri.route_to("http://example.com/path/")).to eq( - Addressable::URI.parse("/path/") - ) - end - - it "should have a route of '..' from 'http://example.com/path/'" do - expect(@uri.route_from("http://example.com/path/")).to eq( - Addressable::URI.parse("..") - ) - end - - it "should have a route of '#' to 'http://example.com/'" do - expect(@uri.route_to("http://example.com/")).to eq( - Addressable::URI.parse("#") - ) - end - - it "should have a route of 'http://elsewhere.com/' to " + - "'http://elsewhere.com/'" do - expect(@uri.route_to("http://elsewhere.com/")).to eq( - Addressable::URI.parse("http://elsewhere.com/") - ) - end - - it "when joined with 'relative/path' should be " + - "'http://example.com/relative/path'" do - expect(@uri.join('relative/path')).to eq( - Addressable::URI.parse("http://example.com/relative/path") - ) - end - - it "when joined with a bogus object a TypeError should be raised" do - expect do - @uri.join(42) - end.to raise_error(TypeError) - end - - it "should have the correct username after assignment" do - @uri.user = "newuser" - expect(@uri.user).to eq("newuser") - expect(@uri.password).to eq(nil) - expect(@uri.to_s).to eq("http://newuser@example.com") - end - - it "should have the correct username after assignment" do - @uri.user = "user@123!" - expect(@uri.user).to eq("user@123!") - expect(@uri.normalized_user).to eq("user%40123%21") - expect(@uri.password).to eq(nil) - expect(@uri.normalize.to_s).to eq("http://user%40123%21@example.com/") - end - - it "should have the correct password after assignment" do - @uri.password = "newpass" - expect(@uri.password).to eq("newpass") - expect(@uri.user).to eq("") - expect(@uri.to_s).to eq("http://:newpass@example.com") - end - - it "should have the correct password after assignment" do - @uri.password = "#secret@123!" - expect(@uri.password).to eq("#secret@123!") - expect(@uri.normalized_password).to eq("%23secret%40123%21") - expect(@uri.user).to eq("") - expect(@uri.normalize.to_s).to eq("http://:%23secret%40123%21@example.com/") - expect(@uri.omit(:password).to_s).to eq("http://example.com") - end - - it "should have the correct user/pass after repeated assignment" do - @uri.user = nil - expect(@uri.user).to eq(nil) - @uri.password = "newpass" - expect(@uri.password).to eq("newpass") - # Username cannot be nil if the password is set - expect(@uri.user).to eq("") - expect(@uri.to_s).to eq("http://:newpass@example.com") - @uri.user = "newuser" - expect(@uri.user).to eq("newuser") - @uri.password = nil - expect(@uri.password).to eq(nil) - expect(@uri.to_s).to eq("http://newuser@example.com") - @uri.user = "newuser" - expect(@uri.user).to eq("newuser") - @uri.password = "" - expect(@uri.password).to eq("") - expect(@uri.to_s).to eq("http://newuser:@example.com") - @uri.password = "newpass" - expect(@uri.password).to eq("newpass") - @uri.user = nil - # Username cannot be nil if the password is set - expect(@uri.user).to eq("") - expect(@uri.to_s).to eq("http://:newpass@example.com") - end - - it "should have the correct user/pass after userinfo assignment" do - @uri.user = "newuser" - expect(@uri.user).to eq("newuser") - @uri.password = "newpass" - expect(@uri.password).to eq("newpass") - @uri.userinfo = nil - expect(@uri.userinfo).to eq(nil) - expect(@uri.user).to eq(nil) - expect(@uri.password).to eq(nil) - end - - it "should correctly convert to a hash" do - expect(@uri.to_hash).to eq({ - :scheme => "http", - :user => nil, - :password => nil, - :host => "example.com", - :port => nil, - :path => "", - :query => nil, - :fragment => nil - }) - end - - it "should be identical to its duplicate" do - expect(@uri).to eq(@uri.dup) - end - - it "should have an origin of 'http://example.com'" do - expect(@uri.origin).to eq('http://example.com') - end -end - -# Section 5.1.2 of RFC 2616 -describe Addressable::URI, "when parsed from " + - "'HTTP://www.w3.org/pub/WWW/TheProject.html'" do - before do - @uri = Addressable::URI.parse("HTTP://www.w3.org/pub/WWW/TheProject.html") - end - - it "should have the correct request URI" do - expect(@uri.request_uri).to eq("/pub/WWW/TheProject.html") - end - - it "should have the correct request URI after assignment" do - @uri.request_uri = "/pub/WWW/TheProject.html?" - expect(@uri.request_uri).to eq("/pub/WWW/TheProject.html?") - expect(@uri.path).to eq("/pub/WWW/TheProject.html") - expect(@uri.query).to eq("") - end - - it "should have the correct request URI after assignment" do - @uri.request_uri = "/some/where/else.html" - expect(@uri.request_uri).to eq("/some/where/else.html") - expect(@uri.path).to eq("/some/where/else.html") - expect(@uri.query).to eq(nil) - end - - it "should have the correct request URI after assignment" do - @uri.request_uri = "/some/where/else.html?query?string" - expect(@uri.request_uri).to eq("/some/where/else.html?query?string") - expect(@uri.path).to eq("/some/where/else.html") - expect(@uri.query).to eq("query?string") - end - - it "should have the correct request URI after assignment" do - @uri.request_uri = "?x=y" - expect(@uri.request_uri).to eq("/?x=y") - expect(@uri.path).to eq("/") - expect(@uri.query).to eq("x=y") - end - - it "should raise an error if the site value is set to something bogus" do - expect do - @uri.site = 42 - end.to raise_error(TypeError) - end - - it "should raise an error if the request URI is set to something bogus" do - expect do - @uri.request_uri = 42 - end.to raise_error(TypeError) - end - - it "should correctly convert to a hash" do - expect(@uri.to_hash).to eq({ - :scheme => "HTTP", - :user => nil, - :password => nil, - :host => "www.w3.org", - :port => nil, - :path => "/pub/WWW/TheProject.html", - :query => nil, - :fragment => nil - }) - end - - it "should have an origin of 'http://www.w3.org'" do - expect(@uri.origin).to eq('http://www.w3.org') - end -end - -describe Addressable::URI, "when parsing IPv6 addresses" do - it "should not raise an error for " + - "'http://[3ffe:1900:4545:3:200:f8ff:fe21:67cf]/'" do - Addressable::URI.parse("http://[3ffe:1900:4545:3:200:f8ff:fe21:67cf]/") - end - - it "should not raise an error for " + - "'http://[fe80:0:0:0:200:f8ff:fe21:67cf]/'" do - Addressable::URI.parse("http://[fe80:0:0:0:200:f8ff:fe21:67cf]/") - end - - it "should not raise an error for " + - "'http://[fe80::200:f8ff:fe21:67cf]/'" do - Addressable::URI.parse("http://[fe80::200:f8ff:fe21:67cf]/") - end - - it "should not raise an error for " + - "'http://[::1]/'" do - Addressable::URI.parse("http://[::1]/") - end - - it "should not raise an error for " + - "'http://[fe80::1]/'" do - Addressable::URI.parse("http://[fe80::1]/") - end - - it "should raise an error for " + - "'http://[]/'" do - expect do - Addressable::URI.parse("http://[]/") - end.to raise_error(Addressable::URI::InvalidURIError) - end -end - -describe Addressable::URI, "when parsing IPv6 address" do - subject { Addressable::URI.parse("http://[3ffe:1900:4545:3:200:f8ff:fe21:67cf]/") } - its(:host) { should == '[3ffe:1900:4545:3:200:f8ff:fe21:67cf]' } - its(:hostname) { should == '3ffe:1900:4545:3:200:f8ff:fe21:67cf' } -end - -describe Addressable::URI, "when assigning IPv6 address" do - it "should allow to set bare IPv6 address as hostname" do - uri = Addressable::URI.parse("http://[::1]/") - uri.hostname = '3ffe:1900:4545:3:200:f8ff:fe21:67cf' - expect(uri.to_s).to eq('http://[3ffe:1900:4545:3:200:f8ff:fe21:67cf]/') - end - - it "should allow to set bare IPv6 address as hostname with IPAddr object" do - uri = Addressable::URI.parse("http://[::1]/") - uri.hostname = IPAddr.new('3ffe:1900:4545:3:200:f8ff:fe21:67cf') - expect(uri.to_s).to eq('http://[3ffe:1900:4545:3:200:f8ff:fe21:67cf]/') - end - - it "should not allow to set bare IPv6 address as host" do - uri = Addressable::URI.parse("http://[::1]/") - skip "not checked" - expect do - uri.host = '3ffe:1900:4545:3:200:f8ff:fe21:67cf' - end.to raise_error(Addressable::URI::InvalidURIError) - end -end - -describe Addressable::URI, "when parsing IPvFuture addresses" do - it "should not raise an error for " + - "'http://[v9.3ffe:1900:4545:3:200:f8ff:fe21:67cf]/'" do - Addressable::URI.parse("http://[v9.3ffe:1900:4545:3:200:f8ff:fe21:67cf]/") - end - - it "should not raise an error for " + - "'http://[vff.fe80:0:0:0:200:f8ff:fe21:67cf]/'" do - Addressable::URI.parse("http://[vff.fe80:0:0:0:200:f8ff:fe21:67cf]/") - end - - it "should not raise an error for " + - "'http://[v12.fe80::200:f8ff:fe21:67cf]/'" do - Addressable::URI.parse("http://[v12.fe80::200:f8ff:fe21:67cf]/") - end - - it "should not raise an error for " + - "'http://[va0.::1]/'" do - Addressable::URI.parse("http://[va0.::1]/") - end - - it "should not raise an error for " + - "'http://[v255.fe80::1]/'" do - Addressable::URI.parse("http://[v255.fe80::1]/") - end - - it "should raise an error for " + - "'http://[v0.]/'" do - expect do - Addressable::URI.parse("http://[v0.]/") - end.to raise_error(Addressable::URI::InvalidURIError) - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/'" do - before do - @uri = Addressable::URI.parse("http://example.com/") - end - - # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence - it "should be equivalent to http://example.com" do - expect(@uri).to eq(Addressable::URI.parse("http://example.com")) - end - - # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence - it "should be equivalent to HTTP://example.com/" do - expect(@uri).to eq(Addressable::URI.parse("HTTP://example.com/")) - end - - # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence - it "should be equivalent to http://example.com:/" do - expect(@uri).to eq(Addressable::URI.parse("http://example.com:/")) - end - - # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence - it "should be equivalent to http://example.com:80/" do - expect(@uri).to eq(Addressable::URI.parse("http://example.com:80/")) - end - - # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence - it "should be equivalent to http://Example.com/" do - expect(@uri).to eq(Addressable::URI.parse("http://Example.com/")) - end - - it "should have the correct username after assignment" do - @uri.user = nil - expect(@uri.user).to eq(nil) - expect(@uri.password).to eq(nil) - expect(@uri.to_s).to eq("http://example.com/") - end - - it "should have the correct password after assignment" do - @uri.password = nil - expect(@uri.password).to eq(nil) - expect(@uri.user).to eq(nil) - expect(@uri.to_s).to eq("http://example.com/") - end - - it "should have a request URI of '/'" do - expect(@uri.request_uri).to eq("/") - end - - it "should correctly convert to a hash" do - expect(@uri.to_hash).to eq({ - :scheme => "http", - :user => nil, - :password => nil, - :host => "example.com", - :port => nil, - :path => "/", - :query => nil, - :fragment => nil - }) - end - - it "should be identical to its duplicate" do - expect(@uri).to eq(@uri.dup) - end - - it "should have the same hash as its duplicate" do - expect(@uri.hash).to eq(@uri.dup.hash) - end - - it "should have a different hash from its equivalent String value" do - expect(@uri.hash).not_to eq(@uri.to_s.hash) - end - - it "should have the same hash as an equal URI" do - expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com/").hash) - end - - it "should be equivalent to http://EXAMPLE.com" do - expect(@uri).to eq(Addressable::URI.parse("http://EXAMPLE.com")) - end - - it "should be equivalent to http://EXAMPLE.com:80/" do - expect(@uri).to eq(Addressable::URI.parse("http://EXAMPLE.com:80/")) - end - - it "should have the same hash as http://example.com/" do - expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com/").hash) - end - - it "should have the same hash as http://example.com after assignment" do - @uri.path = "" - expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com").hash) - end - - it "should have the same hash as http://example.com/? after assignment" do - @uri.query = "" - expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com/?").hash) - end - - it "should have the same hash as http://example.com/? after assignment" do - @uri.query_values = {} - expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com/?").hash) - end - - it "should have the same hash as http://example.com/# after assignment" do - @uri.fragment = "" - expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com/#").hash) - end - - it "should have a different hash from http://example.com" do - expect(@uri.hash).not_to eq(Addressable::URI.parse("http://example.com").hash) - end - - it "should have an origin of 'http://example.com'" do - expect(@uri.origin).to eq('http://example.com') - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com?#'" do - before do - @uri = Addressable::URI.parse("http://example.com?#") - end - - it "should correctly convert to a hash" do - expect(@uri.to_hash).to eq({ - :scheme => "http", - :user => nil, - :password => nil, - :host => "example.com", - :port => nil, - :path => "", - :query => "", - :fragment => "" - }) - end - - it "should have a request URI of '/?'" do - expect(@uri.request_uri).to eq("/?") - end - - it "should normalize to 'http://example.com/'" do - expect(@uri.normalize.to_s).to eq("http://example.com/") - end - - it "should have an origin of 'http://example.com'" do - expect(@uri.origin).to eq("http://example.com") - end -end - -describe Addressable::URI, "when parsed from " + - "'http://@example.com/'" do - before do - @uri = Addressable::URI.parse("http://@example.com/") - end - - it "should be equivalent to http://example.com" do - expect(@uri).to eq(Addressable::URI.parse("http://example.com")) - end - - it "should correctly convert to a hash" do - expect(@uri.to_hash).to eq({ - :scheme => "http", - :user => "", - :password => nil, - :host => "example.com", - :port => nil, - :path => "/", - :query => nil, - :fragment => nil - }) - end - - it "should be identical to its duplicate" do - expect(@uri).to eq(@uri.dup) - end - - it "should have an origin of 'http://example.com'" do - expect(@uri.origin).to eq('http://example.com') - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com./'" do - before do - @uri = Addressable::URI.parse("http://example.com./") - end - - it "should be equivalent to http://example.com" do - expect(@uri).to eq(Addressable::URI.parse("http://example.com")) - end - - it "should not be considered to be in normal form" do - expect(@uri.normalize).not_to be_eql(@uri) - end - - it "should be identical to its duplicate" do - expect(@uri).to eq(@uri.dup) - end - - it "should have an origin of 'http://example.com'" do - expect(@uri.origin).to eq('http://example.com') - end -end - -describe Addressable::URI, "when parsed from " + - "'http://:@example.com/'" do - before do - @uri = Addressable::URI.parse("http://:@example.com/") - end - - it "should be equivalent to http://example.com" do - expect(@uri).to eq(Addressable::URI.parse("http://example.com")) - end - - it "should correctly convert to a hash" do - expect(@uri.to_hash).to eq({ - :scheme => "http", - :user => "", - :password => "", - :host => "example.com", - :port => nil, - :path => "/", - :query => nil, - :fragment => nil - }) - end - - it "should be identical to its duplicate" do - expect(@uri).to eq(@uri.dup) - end - - it "should have an origin of 'http://example.com'" do - expect(@uri.origin).to eq('http://example.com') - end -end - -describe Addressable::URI, "when parsed from " + - "'HTTP://EXAMPLE.COM/'" do - before do - @uri = Addressable::URI.parse("HTTP://EXAMPLE.COM/") - end - - it "should be equivalent to http://example.com" do - expect(@uri).to eq(Addressable::URI.parse("http://example.com")) - end - - it "should correctly convert to a hash" do - expect(@uri.to_hash).to eq({ - :scheme => "HTTP", - :user => nil, - :password => nil, - :host => "EXAMPLE.COM", - :port => nil, - :path => "/", - :query => nil, - :fragment => nil - }) - end - - it "should be identical to its duplicate" do - expect(@uri).to eq(@uri.dup) - end - - it "should have an origin of 'http://example.com'" do - expect(@uri.origin).to eq('http://example.com') - end - - it "should have a tld of 'com'" do - expect(@uri.tld).to eq('com') - end -end - -describe Addressable::URI, "when parsed from " + - "'http://www.example.co.uk/'" do - before do - @uri = Addressable::URI.parse("http://www.example.co.uk/") - end - - it "should have an origin of 'http://www.example.co.uk'" do - expect(@uri.origin).to eq('http://www.example.co.uk') - end - - it "should have a tld of 'co.uk'" do - expect(@uri.tld).to eq('co.uk') - end - - it "should have a domain of 'example.co.uk'" do - expect(@uri.domain).to eq('example.co.uk') - end -end - -describe Addressable::URI, "when parsed from " + - "'http://sub_domain.blogspot.com/'" do - before do - @uri = Addressable::URI.parse("http://sub_domain.blogspot.com/") - end - - it "should have an origin of 'http://sub_domain.blogspot.com'" do - expect(@uri.origin).to eq('http://sub_domain.blogspot.com') - end - - it "should have a tld of 'com'" do - expect(@uri.tld).to eq('com') - end - - it "should have a domain of 'blogspot.com'" do - expect(@uri.domain).to eq('blogspot.com') - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/~smith/'" do - before do - @uri = Addressable::URI.parse("http://example.com/~smith/") - end - - # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence - it "should be equivalent to http://example.com/%7Esmith/" do - expect(@uri).to eq(Addressable::URI.parse("http://example.com/%7Esmith/")) - end - - # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence - it "should be equivalent to http://example.com/%7esmith/" do - expect(@uri).to eq(Addressable::URI.parse("http://example.com/%7esmith/")) - end - - it "should be identical to its duplicate" do - expect(@uri).to eq(@uri.dup) - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/%E8'" do - before do - @uri = Addressable::URI.parse("http://example.com/%E8") - end - - it "should not raise an exception when normalized" do - expect do - @uri.normalize - end.not_to raise_error - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end - - it "should not change if encoded with the normalizing algorithm" do - expect(Addressable::URI.normalized_encode(@uri).to_s).to eq( - "http://example.com/%E8" - ) - expect(Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s).to be === - "http://example.com/%E8" - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/path%2Fsegment/'" do - before do - @uri = Addressable::URI.parse("http://example.com/path%2Fsegment/") - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end - - it "should be equal to 'http://example.com/path%2Fsegment/'" do - expect(@uri.normalize).to be_eql( - Addressable::URI.parse("http://example.com/path%2Fsegment/") - ) - end - - it "should not be equal to 'http://example.com/path/segment/'" do - expect(@uri).not_to eq( - Addressable::URI.parse("http://example.com/path/segment/") - ) - end - - it "should not be equal to 'http://example.com/path/segment/'" do - expect(@uri.normalize).not_to be_eql( - Addressable::URI.parse("http://example.com/path/segment/") - ) - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/?%F6'" do - before do - @uri = Addressable::URI.parse("http://example.com/?%F6") - end - - it "should not raise an exception when normalized" do - expect do - @uri.normalize - end.not_to raise_error - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end - - it "should not change if encoded with the normalizing algorithm" do - expect(Addressable::URI.normalized_encode(@uri).to_s).to eq( - "http://example.com/?%F6" - ) - expect(Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s).to be === - "http://example.com/?%F6" - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/#%F6'" do - before do - @uri = Addressable::URI.parse("http://example.com/#%F6") - end - - it "should not raise an exception when normalized" do - expect do - @uri.normalize - end.not_to raise_error - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end - - it "should not change if encoded with the normalizing algorithm" do - expect(Addressable::URI.normalized_encode(@uri).to_s).to eq( - "http://example.com/#%F6" - ) - expect(Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s).to be === - "http://example.com/#%F6" - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/%C3%87'" do - before do - @uri = Addressable::URI.parse("http://example.com/%C3%87") - end - - # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence - it "should be equivalent to 'http://example.com/C%CC%A7'" do - expect(@uri).to eq(Addressable::URI.parse("http://example.com/C%CC%A7")) - end - - it "should not change if encoded with the normalizing algorithm" do - expect(Addressable::URI.normalized_encode(@uri).to_s).to eq( - "http://example.com/%C3%87" - ) - expect(Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s).to be === - "http://example.com/%C3%87" - end - - it "should raise an error if encoding with an unexpected return type" do - expect do - Addressable::URI.normalized_encode(@uri, Integer) - end.to raise_error(TypeError) - end - - it "if percent encoded should be 'http://example.com/C%25CC%25A7'" do - expect(Addressable::URI.encode(@uri).to_s).to eq( - "http://example.com/%25C3%2587" - ) - end - - it "if percent encoded should be 'http://example.com/C%25CC%25A7'" do - expect(Addressable::URI.encode(@uri, Addressable::URI)).to eq( - Addressable::URI.parse("http://example.com/%25C3%2587") - ) - end - - it "should raise an error if encoding with an unexpected return type" do - expect do - Addressable::URI.encode(@uri, Integer) - end.to raise_error(TypeError) - end - - it "should be identical to its duplicate" do - expect(@uri).to eq(@uri.dup) - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/?q=string'" do - before do - @uri = Addressable::URI.parse("http://example.com/?q=string") - end - - it "should use the 'http' scheme" do - expect(@uri.scheme).to eq("http") - end - - it "should have an authority segment of 'example.com'" do - expect(@uri.authority).to eq("example.com") - end - - it "should have a host of 'example.com'" do - expect(@uri.host).to eq("example.com") - end - - it "should have no username" do - expect(@uri.user).to eq(nil) - end - - it "should have no password" do - expect(@uri.password).to eq(nil) - end - - it "should use port 80" do - expect(@uri.inferred_port).to eq(80) - end - - it "should have a path of '/'" do - expect(@uri.path).to eq("/") - end - - it "should have a query string of 'q=string'" do - expect(@uri.query).to eq("q=string") - end - - it "should have no fragment" do - expect(@uri.fragment).to eq(nil) - end - - it "should be considered absolute" do - expect(@uri).to be_absolute - end - - it "should not be considered relative" do - expect(@uri).not_to be_relative - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end - - it "should be identical to its duplicate" do - expect(@uri).to eq(@uri.dup) - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com:80/'" do - before do - @uri = Addressable::URI.parse("http://example.com:80/") - end - - it "should use the 'http' scheme" do - expect(@uri.scheme).to eq("http") - end - - it "should have an authority segment of 'example.com:80'" do - expect(@uri.authority).to eq("example.com:80") - end - - it "should have a host of 'example.com'" do - expect(@uri.host).to eq("example.com") - end - - it "should have no username" do - expect(@uri.user).to eq(nil) - end - - it "should have no password" do - expect(@uri.password).to eq(nil) - end - - it "should use port 80" do - expect(@uri.inferred_port).to eq(80) - end - - it "should have explicit port 80" do - expect(@uri.port).to eq(80) - end - - it "should have a path of '/'" do - expect(@uri.path).to eq("/") - end - - it "should have no query string" do - expect(@uri.query).to eq(nil) - end - - it "should have no fragment" do - expect(@uri.fragment).to eq(nil) - end - - it "should be considered absolute" do - expect(@uri).to be_absolute - end - - it "should not be considered relative" do - expect(@uri).not_to be_relative - end - - it "should be exactly equal to http://example.com:80/" do - expect(@uri.eql?(Addressable::URI.parse("http://example.com:80/"))).to eq(true) - end - - it "should be roughly equal to http://example.com/" do - expect(@uri === Addressable::URI.parse("http://example.com/")).to eq(true) - end - - it "should be roughly equal to the string 'http://example.com/'" do - expect(@uri === "http://example.com/").to eq(true) - end - - it "should not be roughly equal to the string " + - "'http://example.com:bogus/'" do - expect do - expect(@uri === "http://example.com:bogus/").to eq(false) - end.not_to raise_error - end - - it "should result in itself when joined with itself" do - expect(@uri.join(@uri).to_s).to eq("http://example.com:80/") - expect(@uri.join!(@uri).to_s).to eq("http://example.com:80/") - end - - # Section 6.2.3 of RFC 3986 - it "should be equal to http://example.com/" do - expect(@uri).to eq(Addressable::URI.parse("http://example.com/")) - end - - # Section 6.2.3 of RFC 3986 - it "should be equal to http://example.com:/" do - expect(@uri).to eq(Addressable::URI.parse("http://example.com:/")) - end - - # Section 6.2.3 of RFC 3986 - it "should be equal to http://example.com:80/" do - expect(@uri).to eq(Addressable::URI.parse("http://example.com:80/")) - end - - # Section 6.2.2.1 of RFC 3986 - it "should be equal to http://EXAMPLE.COM/" do - expect(@uri).to eq(Addressable::URI.parse("http://EXAMPLE.COM/")) - end - - it "should correctly convert to a hash" do - expect(@uri.to_hash).to eq({ - :scheme => "http", - :user => nil, - :password => nil, - :host => "example.com", - :port => 80, - :path => "/", - :query => nil, - :fragment => nil - }) - end - - it "should be identical to its duplicate" do - expect(@uri).to eq(@uri.dup) - end - - it "should have an origin of 'http://example.com'" do - expect(@uri.origin).to eq('http://example.com') - end - - it "should not change if encoded with the normalizing algorithm" do - expect(Addressable::URI.normalized_encode(@uri).to_s).to eq( - "http://example.com:80/" - ) - expect(Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s).to be === - "http://example.com:80/" - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com:8080/'" do - before do - @uri = Addressable::URI.parse("http://example.com:8080/") - end - - it "should use the 'http' scheme" do - expect(@uri.scheme).to eq("http") - end - - it "should have an authority segment of 'example.com:8080'" do - expect(@uri.authority).to eq("example.com:8080") - end - - it "should have a host of 'example.com'" do - expect(@uri.host).to eq("example.com") - end - - it "should have no username" do - expect(@uri.user).to eq(nil) - end - - it "should have no password" do - expect(@uri.password).to eq(nil) - end - - it "should use port 8080" do - expect(@uri.inferred_port).to eq(8080) - end - - it "should have explicit port 8080" do - expect(@uri.port).to eq(8080) - end - - it "should have default port 80" do - expect(@uri.default_port).to eq(80) - end - - it "should have a path of '/'" do - expect(@uri.path).to eq("/") - end - - it "should have no query string" do - expect(@uri.query).to eq(nil) - end - - it "should have no fragment" do - expect(@uri.fragment).to eq(nil) - end - - it "should be considered absolute" do - expect(@uri).to be_absolute - end - - it "should not be considered relative" do - expect(@uri).not_to be_relative - end - - it "should be exactly equal to http://example.com:8080/" do - expect(@uri.eql?(Addressable::URI.parse( - "http://example.com:8080/"))).to eq(true) - end - - it "should have a route of 'http://example.com:8080/' from " + - "'http://example.com/path/to/'" do - expect(@uri.route_from("http://example.com/path/to/")).to eq( - Addressable::URI.parse("http://example.com:8080/") - ) - end - - it "should have a route of 'http://example.com:8080/' from " + - "'http://example.com:80/path/to/'" do - expect(@uri.route_from("http://example.com:80/path/to/")).to eq( - Addressable::URI.parse("http://example.com:8080/") - ) - end - - it "should have a route of '../../' from " + - "'http://example.com:8080/path/to/'" do - expect(@uri.route_from("http://example.com:8080/path/to/")).to eq( - Addressable::URI.parse("../../") - ) - end - - it "should have a route of 'http://example.com:8080/' from " + - "'http://user:pass@example.com/path/to/'" do - expect(@uri.route_from("http://user:pass@example.com/path/to/")).to eq( - Addressable::URI.parse("http://example.com:8080/") - ) - end - - it "should correctly convert to a hash" do - expect(@uri.to_hash).to eq({ - :scheme => "http", - :user => nil, - :password => nil, - :host => "example.com", - :port => 8080, - :path => "/", - :query => nil, - :fragment => nil - }) - end - - it "should be identical to its duplicate" do - expect(@uri).to eq(@uri.dup) - end - - it "should have an origin of 'http://example.com:8080'" do - expect(@uri.origin).to eq('http://example.com:8080') - end - - it "should not change if encoded with the normalizing algorithm" do - expect(Addressable::URI.normalized_encode(@uri).to_s).to eq( - "http://example.com:8080/" - ) - expect(Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s).to be === - "http://example.com:8080/" - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com:%38%30/'" do - before do - @uri = Addressable::URI.parse("http://example.com:%38%30/") - end - - it "should have the correct port" do - expect(@uri.port).to eq(80) - end - - it "should not be considered to be in normal form" do - expect(@uri.normalize).not_to be_eql(@uri) - end - - it "should normalize to 'http://example.com/'" do - expect(@uri.normalize.to_s).to eq("http://example.com/") - end - - it "should have an origin of 'http://example.com'" do - expect(@uri.origin).to eq('http://example.com') - end -end - -describe Addressable::URI, "when parsed with empty port" do - subject(:uri) do - Addressable::URI.parse("//example.com:") - end - - it "should not infer a port" do - expect(uri.port).to be(nil) - end - - it "should have a site value of '//example.com'" do - expect(uri.site).to eq("//example.com") - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/%2E/'" do - before do - @uri = Addressable::URI.parse("http://example.com/%2E/") - end - - it "should be considered to be in normal form" do - skip( - 'path segment normalization should happen before ' + - 'percent escaping normalization' - ) - @uri.normalize.should be_eql(@uri) - end - - it "should normalize to 'http://example.com/%2E/'" do - skip( - 'path segment normalization should happen before ' + - 'percent escaping normalization' - ) - expect(@uri.normalize).to eq("http://example.com/%2E/") - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/..'" do - before do - @uri = Addressable::URI.parse("http://example.com/..") - end - - it "should have the correct port" do - expect(@uri.inferred_port).to eq(80) - end - - it "should not be considered to be in normal form" do - expect(@uri.normalize).not_to be_eql(@uri) - end - - it "should normalize to 'http://example.com/'" do - expect(@uri.normalize.to_s).to eq("http://example.com/") - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/../..'" do - before do - @uri = Addressable::URI.parse("http://example.com/../..") - end - - it "should have the correct port" do - expect(@uri.inferred_port).to eq(80) - end - - it "should not be considered to be in normal form" do - expect(@uri.normalize).not_to be_eql(@uri) - end - - it "should normalize to 'http://example.com/'" do - expect(@uri.normalize.to_s).to eq("http://example.com/") - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/path(/..'" do - before do - @uri = Addressable::URI.parse("http://example.com/path(/..") - end - - it "should have the correct port" do - expect(@uri.inferred_port).to eq(80) - end - - it "should not be considered to be in normal form" do - expect(@uri.normalize).not_to be_eql(@uri) - end - - it "should normalize to 'http://example.com/'" do - expect(@uri.normalize.to_s).to eq("http://example.com/") - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/(path)/..'" do - before do - @uri = Addressable::URI.parse("http://example.com/(path)/..") - end - - it "should have the correct port" do - expect(@uri.inferred_port).to eq(80) - end - - it "should not be considered to be in normal form" do - expect(@uri.normalize).not_to be_eql(@uri) - end - - it "should normalize to 'http://example.com/'" do - expect(@uri.normalize.to_s).to eq("http://example.com/") - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/path(/../'" do - before do - @uri = Addressable::URI.parse("http://example.com/path(/../") - end - - it "should have the correct port" do - expect(@uri.inferred_port).to eq(80) - end - - it "should not be considered to be in normal form" do - expect(@uri.normalize).not_to be_eql(@uri) - end - - it "should normalize to 'http://example.com/'" do - expect(@uri.normalize.to_s).to eq("http://example.com/") - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/(path)/../'" do - before do - @uri = Addressable::URI.parse("http://example.com/(path)/../") - end - - it "should have the correct port" do - expect(@uri.inferred_port).to eq(80) - end - - it "should not be considered to be in normal form" do - expect(@uri.normalize).not_to be_eql(@uri) - end - - it "should normalize to 'http://example.com/'" do - expect(@uri.normalize.to_s).to eq("http://example.com/") - end -end - -describe Addressable::URI, "when parsed from " + - "'/..//example.com'" do - before do - @uri = Addressable::URI.parse("/..//example.com") - end - - it "should become invalid when normalized" do - expect do - @uri.normalize - end.to raise_error(Addressable::URI::InvalidURIError, /authority/) - end - - it "should have a path of '/..//example.com'" do - expect(@uri.path).to eq("/..//example.com") - end -end - -describe Addressable::URI, "when parsed from '/a/b/c/./../../g'" do - before do - @uri = Addressable::URI.parse("/a/b/c/./../../g") - end - - it "should not be considered to be in normal form" do - expect(@uri.normalize).not_to be_eql(@uri) - end - - # Section 5.2.4 of RFC 3986 - it "should normalize to '/a/g'" do - expect(@uri.normalize.to_s).to eq("/a/g") - end -end - -describe Addressable::URI, "when parsed from 'mid/content=5/../6'" do - before do - @uri = Addressable::URI.parse("mid/content=5/../6") - end - - it "should not be considered to be in normal form" do - expect(@uri.normalize).not_to be_eql(@uri) - end - - # Section 5.2.4 of RFC 3986 - it "should normalize to 'mid/6'" do - expect(@uri.normalize.to_s).to eq("mid/6") - end -end - -describe Addressable::URI, "when parsed from " + - "'http://www.example.com///../'" do - before do - @uri = Addressable::URI.parse('http://www.example.com///../') - end - - it "should not be considered to be in normal form" do - expect(@uri.normalize).not_to be_eql(@uri) - end - - it "should normalize to 'http://www.example.com//'" do - expect(@uri.normalize.to_s).to eq("http://www.example.com//") - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/path/to/resource/'" do - before do - @uri = Addressable::URI.parse("http://example.com/path/to/resource/") - end - - it "should use the 'http' scheme" do - expect(@uri.scheme).to eq("http") - end - - it "should have an authority segment of 'example.com'" do - expect(@uri.authority).to eq("example.com") - end - - it "should have a host of 'example.com'" do - expect(@uri.host).to eq("example.com") - end - - it "should have no username" do - expect(@uri.user).to eq(nil) - end - - it "should have no password" do - expect(@uri.password).to eq(nil) - end - - it "should use port 80" do - expect(@uri.inferred_port).to eq(80) - end - - it "should have a path of '/path/to/resource/'" do - expect(@uri.path).to eq("/path/to/resource/") - end - - it "should have no query string" do - expect(@uri.query).to eq(nil) - end - - it "should have no fragment" do - expect(@uri.fragment).to eq(nil) - end - - it "should be considered absolute" do - expect(@uri).to be_absolute - end - - it "should not be considered relative" do - expect(@uri).not_to be_relative - end - - it "should be exactly equal to http://example.com:8080/" do - expect(@uri.eql?(Addressable::URI.parse( - "http://example.com/path/to/resource/"))).to eq(true) - end - - it "should have a route of 'resource/' from " + - "'http://example.com/path/to/'" do - expect(@uri.route_from("http://example.com/path/to/")).to eq( - Addressable::URI.parse("resource/") - ) - end - - it "should have a route of '../' from " + - "'http://example.com/path/to/resource/sub'" do - expect(@uri.route_from("http://example.com/path/to/resource/sub")).to eq( - Addressable::URI.parse("../") - ) - end - - - it "should have a route of 'resource/' from " + - "'http://example.com/path/to/another'" do - expect(@uri.route_from("http://example.com/path/to/another")).to eq( - Addressable::URI.parse("resource/") - ) - end - - it "should have a route of 'resource/' from " + - "'http://example.com/path/to/res'" do - expect(@uri.route_from("http://example.com/path/to/res")).to eq( - Addressable::URI.parse("resource/") - ) - end - - it "should have a route of 'resource/' from " + - "'http://example.com:80/path/to/'" do - expect(@uri.route_from("http://example.com:80/path/to/")).to eq( - Addressable::URI.parse("resource/") - ) - end - - it "should have a route of 'http://example.com/path/to/' from " + - "'http://example.com:8080/path/to/'" do - expect(@uri.route_from("http://example.com:8080/path/to/")).to eq( - Addressable::URI.parse("http://example.com/path/to/resource/") - ) - end - - it "should have a route of 'http://example.com/path/to/' from " + - "'http://user:pass@example.com/path/to/'" do - expect(@uri.route_from("http://user:pass@example.com/path/to/")).to eq( - Addressable::URI.parse("http://example.com/path/to/resource/") - ) - end - - it "should have a route of '../../path/to/resource/' from " + - "'http://example.com/to/resource/'" do - expect(@uri.route_from("http://example.com/to/resource/")).to eq( - Addressable::URI.parse("../../path/to/resource/") - ) - end - - it "should correctly convert to a hash" do - expect(@uri.to_hash).to eq({ - :scheme => "http", - :user => nil, - :password => nil, - :host => "example.com", - :port => nil, - :path => "/path/to/resource/", - :query => nil, - :fragment => nil - }) - end - - it "should be identical to its duplicate" do - expect(@uri).to eq(@uri.dup) - end -end - -describe Addressable::URI, "when parsed from " + - "'relative/path/to/resource'" do - before do - @uri = Addressable::URI.parse("relative/path/to/resource") - end - - it "should not have a scheme" do - expect(@uri.scheme).to eq(nil) - end - - it "should not be considered ip-based" do - expect(@uri).not_to be_ip_based - end - - it "should not have an authority segment" do - expect(@uri.authority).to eq(nil) - end - - it "should not have a host" do - expect(@uri.host).to eq(nil) - end - - it "should have no username" do - expect(@uri.user).to eq(nil) - end - - it "should have no password" do - expect(@uri.password).to eq(nil) - end - - it "should not have a port" do - expect(@uri.port).to eq(nil) - end - - it "should have a path of 'relative/path/to/resource'" do - expect(@uri.path).to eq("relative/path/to/resource") - end - - it "should have no query string" do - expect(@uri.query).to eq(nil) - end - - it "should have no fragment" do - expect(@uri.fragment).to eq(nil) - end - - it "should not be considered absolute" do - expect(@uri).not_to be_absolute - end - - it "should be considered relative" do - expect(@uri).to be_relative - end - - it "should raise an error if routing is attempted" do - expect do - @uri.route_to("http://example.com/") - end.to raise_error(ArgumentError, /relative\/path\/to\/resource/) - expect do - @uri.route_from("http://example.com/") - end.to raise_error(ArgumentError, /relative\/path\/to\/resource/) - end - - it "when joined with 'another/relative/path' should be " + - "'relative/path/to/another/relative/path'" do - expect(@uri.join('another/relative/path')).to eq( - Addressable::URI.parse("relative/path/to/another/relative/path") - ) - end - - it "should be identical to its duplicate" do - expect(@uri).to eq(@uri.dup) - end -end - -describe Addressable::URI, "when parsed from " + - "'relative_path_with_no_slashes'" do - before do - @uri = Addressable::URI.parse("relative_path_with_no_slashes") - end - - it "should not have a scheme" do - expect(@uri.scheme).to eq(nil) - end - - it "should not be considered ip-based" do - expect(@uri).not_to be_ip_based - end - - it "should not have an authority segment" do - expect(@uri.authority).to eq(nil) - end - - it "should not have a host" do - expect(@uri.host).to eq(nil) - end - - it "should have no username" do - expect(@uri.user).to eq(nil) - end - - it "should have no password" do - expect(@uri.password).to eq(nil) - end - - it "should not have a port" do - expect(@uri.port).to eq(nil) - end - - it "should have a path of 'relative_path_with_no_slashes'" do - expect(@uri.path).to eq("relative_path_with_no_slashes") - end - - it "should have no query string" do - expect(@uri.query).to eq(nil) - end - - it "should have no fragment" do - expect(@uri.fragment).to eq(nil) - end - - it "should not be considered absolute" do - expect(@uri).not_to be_absolute - end - - it "should be considered relative" do - expect(@uri).to be_relative - end - - it "when joined with 'another_relative_path' should be " + - "'another_relative_path'" do - expect(@uri.join('another_relative_path')).to eq( - Addressable::URI.parse("another_relative_path") - ) - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/file.txt'" do - before do - @uri = Addressable::URI.parse("http://example.com/file.txt") - end - - it "should have a scheme of 'http'" do - expect(@uri.scheme).to eq("http") - end - - it "should have an authority segment of 'example.com'" do - expect(@uri.authority).to eq("example.com") - end - - it "should have a host of 'example.com'" do - expect(@uri.host).to eq("example.com") - end - - it "should have no username" do - expect(@uri.user).to eq(nil) - end - - it "should have no password" do - expect(@uri.password).to eq(nil) - end - - it "should use port 80" do - expect(@uri.inferred_port).to eq(80) - end - - it "should have a path of '/file.txt'" do - expect(@uri.path).to eq("/file.txt") - end - - it "should have a basename of 'file.txt'" do - expect(@uri.basename).to eq("file.txt") - end - - it "should have an extname of '.txt'" do - expect(@uri.extname).to eq(".txt") - end - - it "should have no query string" do - expect(@uri.query).to eq(nil) - end - - it "should have no fragment" do - expect(@uri.fragment).to eq(nil) - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/file.txt;parameter'" do - before do - @uri = Addressable::URI.parse("http://example.com/file.txt;parameter") - end - - it "should have a scheme of 'http'" do - expect(@uri.scheme).to eq("http") - end - - it "should have an authority segment of 'example.com'" do - expect(@uri.authority).to eq("example.com") - end - - it "should have a host of 'example.com'" do - expect(@uri.host).to eq("example.com") - end - - it "should have no username" do - expect(@uri.user).to eq(nil) - end - - it "should have no password" do - expect(@uri.password).to eq(nil) - end - - it "should use port 80" do - expect(@uri.inferred_port).to eq(80) - end - - it "should have a path of '/file.txt;parameter'" do - expect(@uri.path).to eq("/file.txt;parameter") - end - - it "should have a basename of 'file.txt'" do - expect(@uri.basename).to eq("file.txt") - end - - it "should have an extname of '.txt'" do - expect(@uri.extname).to eq(".txt") - end - - it "should have no query string" do - expect(@uri.query).to eq(nil) - end - - it "should have no fragment" do - expect(@uri.fragment).to eq(nil) - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/file.txt;x=y'" do - before do - @uri = Addressable::URI.parse("http://example.com/file.txt;x=y") - end - - it "should have a scheme of 'http'" do - expect(@uri.scheme).to eq("http") - end - - it "should have a scheme of 'http'" do - expect(@uri.scheme).to eq("http") - end - - it "should have an authority segment of 'example.com'" do - expect(@uri.authority).to eq("example.com") - end - - it "should have a host of 'example.com'" do - expect(@uri.host).to eq("example.com") - end - - it "should have no username" do - expect(@uri.user).to eq(nil) - end - - it "should have no password" do - expect(@uri.password).to eq(nil) - end - - it "should use port 80" do - expect(@uri.inferred_port).to eq(80) - end - - it "should have a path of '/file.txt;x=y'" do - expect(@uri.path).to eq("/file.txt;x=y") - end - - it "should have an extname of '.txt'" do - expect(@uri.extname).to eq(".txt") - end - - it "should have no query string" do - expect(@uri.query).to eq(nil) - end - - it "should have no fragment" do - expect(@uri.fragment).to eq(nil) - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end -end - -describe Addressable::URI, "when parsed from " + - "'svn+ssh://developername@rubyforge.org/var/svn/project'" do - before do - @uri = Addressable::URI.parse( - "svn+ssh://developername@rubyforge.org/var/svn/project" - ) - end - - it "should have a scheme of 'svn+ssh'" do - expect(@uri.scheme).to eq("svn+ssh") - end - - it "should be considered to be ip-based" do - expect(@uri).to be_ip_based - end - - it "should have a path of '/var/svn/project'" do - expect(@uri.path).to eq("/var/svn/project") - end - - it "should have a username of 'developername'" do - expect(@uri.user).to eq("developername") - end - - it "should have no password" do - expect(@uri.password).to eq(nil) - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end -end - -describe Addressable::URI, "when parsed from " + - "'ssh+svn://developername@RUBYFORGE.ORG/var/svn/project'" do - before do - @uri = Addressable::URI.parse( - "ssh+svn://developername@RUBYFORGE.ORG/var/svn/project" - ) - end - - it "should have a scheme of 'ssh+svn'" do - expect(@uri.scheme).to eq("ssh+svn") - end - - it "should have a normalized scheme of 'svn+ssh'" do - expect(@uri.normalized_scheme).to eq("svn+ssh") - end - - it "should have a normalized site of 'svn+ssh'" do - expect(@uri.normalized_site).to eq("svn+ssh://developername@rubyforge.org") - end - - it "should not be considered to be ip-based" do - expect(@uri).not_to be_ip_based - end - - it "should have a path of '/var/svn/project'" do - expect(@uri.path).to eq("/var/svn/project") - end - - it "should have a username of 'developername'" do - expect(@uri.user).to eq("developername") - end - - it "should have no password" do - expect(@uri.password).to eq(nil) - end - - it "should not be considered to be in normal form" do - expect(@uri.normalize).not_to be_eql(@uri) - end -end - -describe Addressable::URI, "when parsed from " + - "'mailto:user@example.com'" do - before do - @uri = Addressable::URI.parse("mailto:user@example.com") - end - - it "should have a scheme of 'mailto'" do - expect(@uri.scheme).to eq("mailto") - end - - it "should not be considered to be ip-based" do - expect(@uri).not_to be_ip_based - end - - it "should have a path of 'user@example.com'" do - expect(@uri.path).to eq("user@example.com") - end - - it "should have no user" do - expect(@uri.user).to eq(nil) - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end -end - -describe Addressable::URI, "when parsed from " + - "'tag:example.com,2006-08-18:/path/to/something'" do - before do - @uri = Addressable::URI.parse( - "tag:example.com,2006-08-18:/path/to/something") - end - - it "should have a scheme of 'tag'" do - expect(@uri.scheme).to eq("tag") - end - - it "should be considered to be ip-based" do - expect(@uri).not_to be_ip_based - end - - it "should have a path of " + - "'example.com,2006-08-18:/path/to/something'" do - expect(@uri.path).to eq("example.com,2006-08-18:/path/to/something") - end - - it "should have no user" do - expect(@uri.user).to eq(nil) - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end - - it "should have a 'null' origin" do - expect(@uri.origin).to eq('null') - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/x;y/'" do - before do - @uri = Addressable::URI.parse("http://example.com/x;y/") - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/?x=1&y=2'" do - before do - @uri = Addressable::URI.parse("http://example.com/?x=1&y=2") - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end -end - -describe Addressable::URI, "when parsed from " + - "'view-source:http://example.com/'" do - before do - @uri = Addressable::URI.parse("view-source:http://example.com/") - end - - it "should have a scheme of 'view-source'" do - expect(@uri.scheme).to eq("view-source") - end - - it "should have a path of 'http://example.com/'" do - expect(@uri.path).to eq("http://example.com/") - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end - - it "should have a 'null' origin" do - expect(@uri.origin).to eq('null') - end -end - -describe Addressable::URI, "when parsed from " + - "'http://user:pass@example.com/path/to/resource?query=x#fragment'" do - before do - @uri = Addressable::URI.parse( - "http://user:pass@example.com/path/to/resource?query=x#fragment") - end - - it "should use the 'http' scheme" do - expect(@uri.scheme).to eq("http") - end - - it "should have an authority segment of 'user:pass@example.com'" do - expect(@uri.authority).to eq("user:pass@example.com") - end - - it "should have a username of 'user'" do - expect(@uri.user).to eq("user") - end - - it "should have a password of 'pass'" do - expect(@uri.password).to eq("pass") - end - - it "should have a host of 'example.com'" do - expect(@uri.host).to eq("example.com") - end - - it "should use port 80" do - expect(@uri.inferred_port).to eq(80) - end - - it "should have a path of '/path/to/resource'" do - expect(@uri.path).to eq("/path/to/resource") - end - - it "should have a query string of 'query=x'" do - expect(@uri.query).to eq("query=x") - end - - it "should have a fragment of 'fragment'" do - expect(@uri.fragment).to eq("fragment") - end - - it "should be considered to be in normal form" do - expect(@uri.normalize).to be_eql(@uri) - end - - it "should have a route of '../../' to " + - "'http://user:pass@example.com/path/'" do - expect(@uri.route_to("http://user:pass@example.com/path/")).to eq( - Addressable::URI.parse("../../") - ) - end - - it "should have a route of 'to/resource?query=x#fragment' " + - "from 'http://user:pass@example.com/path/'" do - expect(@uri.route_from("http://user:pass@example.com/path/")).to eq( - Addressable::URI.parse("to/resource?query=x#fragment") - ) - end - - it "should have a route of '?query=x#fragment' " + - "from 'http://user:pass@example.com/path/to/resource'" do - expect(@uri.route_from("http://user:pass@example.com/path/to/resource")).to eq( - Addressable::URI.parse("?query=x#fragment") - ) - end - - it "should have a route of '#fragment' " + - "from 'http://user:pass@example.com/path/to/resource?query=x'" do - expect(@uri.route_from( - "http://user:pass@example.com/path/to/resource?query=x")).to eq( - Addressable::URI.parse("#fragment") - ) - end - - it "should have a route of '#fragment' from " + - "'http://user:pass@example.com/path/to/resource?query=x#fragment'" do - expect(@uri.route_from( - "http://user:pass@example.com/path/to/resource?query=x#fragment" - )).to eq(Addressable::URI.parse("#fragment")) - end - - it "should have a route of 'http://elsewhere.com/' to " + - "'http://elsewhere.com/'" do - expect(@uri.route_to("http://elsewhere.com/")).to eq( - Addressable::URI.parse("http://elsewhere.com/") - ) - end - - it "should have a route of " + - "'http://user:pass@example.com/path/to/resource?query=x#fragment' " + - "from 'http://example.com/path/to/'" do - expect(@uri.route_from("http://elsewhere.com/path/to/")).to eq( - Addressable::URI.parse( - "http://user:pass@example.com/path/to/resource?query=x#fragment") - ) - end - - it "should have the correct scheme after assignment" do - @uri.scheme = "ftp" - expect(@uri.scheme).to eq("ftp") - expect(@uri.to_s).to eq( - "ftp://user:pass@example.com/path/to/resource?query=x#fragment" - ) - expect(@uri.to_str).to eq( - "ftp://user:pass@example.com/path/to/resource?query=x#fragment" - ) - end - - it "should have the correct site segment after assignment" do - @uri.site = "https://newuser:newpass@example.com:443" - expect(@uri.scheme).to eq("https") - expect(@uri.authority).to eq("newuser:newpass@example.com:443") - expect(@uri.user).to eq("newuser") - expect(@uri.password).to eq("newpass") - expect(@uri.userinfo).to eq("newuser:newpass") - expect(@uri.normalized_userinfo).to eq("newuser:newpass") - expect(@uri.host).to eq("example.com") - expect(@uri.port).to eq(443) - expect(@uri.inferred_port).to eq(443) - expect(@uri.to_s).to eq( - "https://newuser:newpass@example.com:443" + - "/path/to/resource?query=x#fragment" - ) - end - - it "should have the correct authority segment after assignment" do - @uri.authority = "newuser:newpass@example.com:80" - expect(@uri.authority).to eq("newuser:newpass@example.com:80") - expect(@uri.user).to eq("newuser") - expect(@uri.password).to eq("newpass") - expect(@uri.userinfo).to eq("newuser:newpass") - expect(@uri.normalized_userinfo).to eq("newuser:newpass") - expect(@uri.host).to eq("example.com") - expect(@uri.port).to eq(80) - expect(@uri.inferred_port).to eq(80) - expect(@uri.to_s).to eq( - "http://newuser:newpass@example.com:80" + - "/path/to/resource?query=x#fragment" - ) - end - - it "should have the correct userinfo segment after assignment" do - @uri.userinfo = "newuser:newpass" - expect(@uri.userinfo).to eq("newuser:newpass") - expect(@uri.authority).to eq("newuser:newpass@example.com") - expect(@uri.user).to eq("newuser") - expect(@uri.password).to eq("newpass") - expect(@uri.host).to eq("example.com") - expect(@uri.port).to eq(nil) - expect(@uri.inferred_port).to eq(80) - expect(@uri.to_s).to eq( - "http://newuser:newpass@example.com" + - "/path/to/resource?query=x#fragment" - ) - end - - it "should have the correct username after assignment" do - @uri.user = "newuser" - expect(@uri.user).to eq("newuser") - expect(@uri.authority).to eq("newuser:pass@example.com") - end - - it "should have the correct password after assignment" do - @uri.password = "newpass" - expect(@uri.password).to eq("newpass") - expect(@uri.authority).to eq("user:newpass@example.com") - end - - it "should have the correct host after assignment" do - @uri.host = "newexample.com" - expect(@uri.host).to eq("newexample.com") - expect(@uri.authority).to eq("user:pass@newexample.com") - end - - it "should have the correct host after assignment" do - @uri.hostname = "newexample.com" - expect(@uri.host).to eq("newexample.com") - expect(@uri.hostname).to eq("newexample.com") - expect(@uri.authority).to eq("user:pass@newexample.com") - end - - it "should raise an error if assigning a bogus object to the hostname" do - expect do - @uri.hostname = Object.new - end.to raise_error(TypeError) - end - - it "should have the correct port after assignment" do - @uri.port = 8080 - expect(@uri.port).to eq(8080) - expect(@uri.authority).to eq("user:pass@example.com:8080") - end - - it "should have the correct origin after assignment" do - @uri.origin = "http://newexample.com" - expect(@uri.host).to eq("newexample.com") - expect(@uri.authority).to eq("newexample.com") - end - - it "should have the correct path after assignment" do - @uri.path = "/newpath/to/resource" - expect(@uri.path).to eq("/newpath/to/resource") - expect(@uri.to_s).to eq( - "http://user:pass@example.com/newpath/to/resource?query=x#fragment" - ) - end - - it "should have the correct scheme and authority after nil assignment" do - @uri.site = nil - expect(@uri.scheme).to eq(nil) - expect(@uri.authority).to eq(nil) - expect(@uri.to_s).to eq("/path/to/resource?query=x#fragment") - end - - it "should have the correct scheme and authority after assignment" do - @uri.site = "file://" - expect(@uri.scheme).to eq("file") - expect(@uri.authority).to eq("") - expect(@uri.to_s).to eq("file:///path/to/resource?query=x#fragment") - end - - it "should have the correct path after nil assignment" do - @uri.path = nil - expect(@uri.path).to eq("") - expect(@uri.to_s).to eq( - "http://user:pass@example.com?query=x#fragment" - ) - end - - it "should have the correct query string after assignment" do - @uri.query = "newquery=x" - expect(@uri.query).to eq("newquery=x") - expect(@uri.to_s).to eq( - "http://user:pass@example.com/path/to/resource?newquery=x#fragment" - ) - @uri.query = nil - expect(@uri.query).to eq(nil) - expect(@uri.to_s).to eq( - "http://user:pass@example.com/path/to/resource#fragment" - ) - end - - it "should have the correct query string after hash assignment" do - @uri.query_values = {"?uestion mark" => "=sign", "hello" => "g\xC3\xBCnther"} - expect(@uri.query.split("&")).to include("%3Fuestion%20mark=%3Dsign") - expect(@uri.query.split("&")).to include("hello=g%C3%BCnther") - expect(@uri.query_values).to eq({ - "?uestion mark" => "=sign", "hello" => "g\xC3\xBCnther" - }) - end - - it "should have the correct query string after flag hash assignment" do - @uri.query_values = {'flag?1' => nil, 'fl=ag2' => nil, 'flag3' => nil} - expect(@uri.query.split("&")).to include("flag%3F1") - expect(@uri.query.split("&")).to include("fl%3Dag2") - expect(@uri.query.split("&")).to include("flag3") - expect(@uri.query_values(Array).sort).to eq([["fl=ag2"], ["flag3"], ["flag?1"]]) - expect(@uri.query_values(Hash)).to eq({ - 'flag?1' => nil, 'fl=ag2' => nil, 'flag3' => nil - }) - end - - it "should raise an error if query values are set to a bogus type" do - expect do - @uri.query_values = "bogus" - end.to raise_error(TypeError) - end - - it "should have the correct fragment after assignment" do - @uri.fragment = "newfragment" - expect(@uri.fragment).to eq("newfragment") - expect(@uri.to_s).to eq( - "http://user:pass@example.com/path/to/resource?query=x#newfragment" - ) - - @uri.fragment = nil - expect(@uri.fragment).to eq(nil) - expect(@uri.to_s).to eq( - "http://user:pass@example.com/path/to/resource?query=x" - ) - end - - it "should have the correct values after a merge" do - expect(@uri.merge(:fragment => "newfragment").to_s).to eq( - "http://user:pass@example.com/path/to/resource?query=x#newfragment" - ) - end - - it "should have the correct values after a merge" do - expect(@uri.merge(:fragment => nil).to_s).to eq( - "http://user:pass@example.com/path/to/resource?query=x" - ) - end - - it "should have the correct values after a merge" do - expect(@uri.merge(:userinfo => "newuser:newpass").to_s).to eq( - "http://newuser:newpass@example.com/path/to/resource?query=x#fragment" - ) - end - - it "should have the correct values after a merge" do - expect(@uri.merge(:userinfo => nil).to_s).to eq( - "http://example.com/path/to/resource?query=x#fragment" - ) - end - - it "should have the correct values after a merge" do - expect(@uri.merge(:path => "newpath").to_s).to eq( - "http://user:pass@example.com/newpath?query=x#fragment" - ) - end - - it "should have the correct values after a merge" do - expect(@uri.merge(:port => "42", :path => "newpath", :query => "").to_s).to eq( - "http://user:pass@example.com:42/newpath?#fragment" - ) - end - - it "should have the correct values after a merge" do - expect(@uri.merge(:authority => "foo:bar@baz:42").to_s).to eq( - "http://foo:bar@baz:42/path/to/resource?query=x#fragment" - ) - # Ensure the operation was not destructive - expect(@uri.to_s).to eq( - "http://user:pass@example.com/path/to/resource?query=x#fragment" - ) - end - - it "should have the correct values after a destructive merge" do - @uri.merge!(:authority => "foo:bar@baz:42") - # Ensure the operation was destructive - expect(@uri.to_s).to eq( - "http://foo:bar@baz:42/path/to/resource?query=x#fragment" - ) - end - - it "should fail to merge with bogus values" do - expect do - @uri.merge(:port => "bogus") - end.to raise_error(Addressable::URI::InvalidURIError) - end - - it "should fail to merge with bogus values" do - expect do - @uri.merge(:authority => "bar@baz:bogus") - end.to raise_error(Addressable::URI::InvalidURIError) - end - - it "should fail to merge with bogus parameters" do - expect do - @uri.merge(42) - end.to raise_error(TypeError) - end - - it "should fail to merge with bogus parameters" do - expect do - @uri.merge("http://example.com/") - end.to raise_error(TypeError) - end - - it "should fail to merge with both authority and subcomponents" do - expect do - @uri.merge(:authority => "foo:bar@baz:42", :port => "42") - end.to raise_error(ArgumentError) - end - - it "should fail to merge with both userinfo and subcomponents" do - expect do - @uri.merge(:userinfo => "foo:bar", :user => "foo") - end.to raise_error(ArgumentError) - end - - it "should be identical to its duplicate" do - expect(@uri).to eq(@uri.dup) - end - - it "should have an origin of 'http://example.com'" do - expect(@uri.origin).to eq('http://example.com') - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/search?q=Q%26A'" do - - before do - @uri = Addressable::URI.parse("http://example.com/search?q=Q%26A") - end - - it "should have a query of 'q=Q%26A'" do - expect(@uri.query).to eq("q=Q%26A") - end - - it "should have query_values of {'q' => 'Q&A'}" do - expect(@uri.query_values).to eq({ 'q' => 'Q&A' }) - end - - it "should normalize to the original uri " + - "(with the ampersand properly percent-encoded)" do - expect(@uri.normalize.to_s).to eq("http://example.com/search?q=Q%26A") - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/?&x=b'" do - before do - @uri = Addressable::URI.parse("http://example.com/?&x=b") - end - - it "should have a query of '&x=b'" do - expect(@uri.query).to eq("&x=b") - end - - it "should have query_values of {'x' => 'b'}" do - expect(@uri.query_values).to eq({'x' => 'b'}) - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/?q='one;two'&x=1'" do - before do - @uri = Addressable::URI.parse("http://example.com/?q='one;two'&x=1") - end - - it "should have a query of 'q='one;two'&x=1'" do - expect(@uri.query).to eq("q='one;two'&x=1") - end - - it "should have query_values of {\"q\" => \"'one;two'\", \"x\" => \"1\"}" do - expect(@uri.query_values).to eq({"q" => "'one;two'", "x" => "1"}) - end - - it "should escape the ';' character when normalizing to avoid ambiguity " + - "with the W3C HTML 4.01 specification" do - # HTML 4.01 Section B.2.2 - expect(@uri.normalize.query).to eq("q='one%3Btwo'&x=1") - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/?&&x=b'" do - before do - @uri = Addressable::URI.parse("http://example.com/?&&x=b") - end - - it "should have a query of '&&x=b'" do - expect(@uri.query).to eq("&&x=b") - end - - it "should have query_values of {'x' => 'b'}" do - expect(@uri.query_values).to eq({'x' => 'b'}) - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/?q=a&&x=b'" do - before do - @uri = Addressable::URI.parse("http://example.com/?q=a&&x=b") - end - - it "should have a query of 'q=a&&x=b'" do - expect(@uri.query).to eq("q=a&&x=b") - end - - it "should have query_values of {'q' => 'a, 'x' => 'b'}" do - expect(@uri.query_values).to eq({'q' => 'a', 'x' => 'b'}) - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/?q&&x=b'" do - before do - @uri = Addressable::URI.parse("http://example.com/?q&&x=b") - end - - it "should have a query of 'q&&x=b'" do - expect(@uri.query).to eq("q&&x=b") - end - - it "should have query_values of {'q' => true, 'x' => 'b'}" do - expect(@uri.query_values).to eq({'q' => nil, 'x' => 'b'}) - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/?q=a+b'" do - before do - @uri = Addressable::URI.parse("http://example.com/?q=a+b") - end - - it "should have a query of 'q=a+b'" do - expect(@uri.query).to eq("q=a+b") - end - - it "should have query_values of {'q' => 'a b'}" do - expect(@uri.query_values).to eq({'q' => 'a b'}) - end - - it "should have a normalized query of 'q=a+b'" do - expect(@uri.normalized_query).to eq("q=a+b") - end -end - -describe Addressable::URI, "when parsed from 'https://example.com/?q=a+b'" do - before do - @uri = Addressable::URI.parse("https://example.com/?q=a+b") - end - - it "should have query_values of {'q' => 'a b'}" do - expect(@uri.query_values).to eq("q" => "a b") - end -end - -describe Addressable::URI, "when parsed from 'example.com?q=a+b'" do - before do - @uri = Addressable::URI.parse("example.com?q=a+b") - end - - it "should have query_values of {'q' => 'a b'}" do - expect(@uri.query_values).to eq("q" => "a b") - end -end - -describe Addressable::URI, "when parsed from 'mailto:?q=a+b'" do - before do - @uri = Addressable::URI.parse("mailto:?q=a+b") - end - - it "should have query_values of {'q' => 'a+b'}" do - expect(@uri.query_values).to eq("q" => "a+b") - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/?q=a%2bb'" do - before do - @uri = Addressable::URI.parse("http://example.com/?q=a%2bb") - end - - it "should have a query of 'q=a+b'" do - expect(@uri.query).to eq("q=a%2bb") - end - - it "should have query_values of {'q' => 'a+b'}" do - expect(@uri.query_values).to eq({'q' => 'a+b'}) - end - - it "should have a normalized query of 'q=a%2Bb'" do - expect(@uri.normalized_query).to eq("q=a%2Bb") - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/?v=%7E&w=%&x=%25&y=%2B&z=C%CC%A7'" do - before do - @uri = Addressable::URI.parse("http://example.com/?v=%7E&w=%&x=%25&y=%2B&z=C%CC%A7") - end - - it "should have a normalized query of 'v=~&w=%25&x=%25&y=%2B&z=%C3%87'" do - expect(@uri.normalized_query).to eq("v=~&w=%25&x=%25&y=%2B&z=%C3%87") - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/?v=%7E&w=%&x=%25&y=+&z=C%CC%A7'" do - before do - @uri = Addressable::URI.parse("http://example.com/?v=%7E&w=%&x=%25&y=+&z=C%CC%A7") - end - - it "should have a normalized query of 'v=~&w=%25&x=%25&y=+&z=%C3%87'" do - expect(@uri.normalized_query).to eq("v=~&w=%25&x=%25&y=+&z=%C3%87") - end -end - -describe Addressable::URI, "when parsed from 'http://example/?b=1&a=2&c=3'" do - before do - @uri = Addressable::URI.parse("http://example/?b=1&a=2&c=3") - end - - it "should have a sorted normalized query of 'a=2&b=1&c=3'" do - expect(@uri.normalized_query(:sorted)).to eq("a=2&b=1&c=3") - end -end - -describe Addressable::URI, "when parsed from 'http://example/?&a&&c&'" do - before do - @uri = Addressable::URI.parse("http://example/?&a&&c&") - end - - it "should have a compacted normalized query of 'a&c'" do - expect(@uri.normalized_query(:compacted)).to eq("a&c") - end -end - -describe Addressable::URI, "when parsed from 'http://example.com/?a=1&a=1'" do - before do - @uri = Addressable::URI.parse("http://example.com/?a=1&a=1") - end - - it "should have a compacted normalized query of 'a=1'" do - expect(@uri.normalized_query(:compacted)).to eq("a=1") - end -end - -describe Addressable::URI, "when parsed from 'http://example.com/?a=1&a=2'" do - before do - @uri = Addressable::URI.parse("http://example.com/?a=1&a=2") - end - - it "should have a compacted normalized query of 'a=1&a=2'" do - expect(@uri.normalized_query(:compacted)).to eq("a=1&a=2") - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/sound%2bvision'" do - before do - @uri = Addressable::URI.parse("http://example.com/sound%2bvision") - end - - it "should have a normalized path of '/sound+vision'" do - expect(@uri.normalized_path).to eq('/sound+vision') - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/?q='" do - before do - @uri = Addressable::URI.parse("http://example.com/?q=") - end - - it "should have a query of 'q='" do - expect(@uri.query).to eq("q=") - end - - it "should have query_values of {'q' => ''}" do - expect(@uri.query_values).to eq({'q' => ''}) - end -end - -describe Addressable::URI, "when parsed from " + - "'http://user@example.com'" do - before do - @uri = Addressable::URI.parse("http://user@example.com") - end - - it "should use the 'http' scheme" do - expect(@uri.scheme).to eq("http") - end - - it "should have a username of 'user'" do - expect(@uri.user).to eq("user") - end - - it "should have no password" do - expect(@uri.password).to eq(nil) - end - - it "should have a userinfo of 'user'" do - expect(@uri.userinfo).to eq("user") - end - - it "should have a normalized userinfo of 'user'" do - expect(@uri.normalized_userinfo).to eq("user") - end - - it "should have a host of 'example.com'" do - expect(@uri.host).to eq("example.com") - end - - it "should have default_port 80" do - expect(@uri.default_port).to eq(80) - end - - it "should use port 80" do - expect(@uri.inferred_port).to eq(80) - end - - it "should have the correct username after assignment" do - @uri.user = "newuser" - expect(@uri.user).to eq("newuser") - expect(@uri.password).to eq(nil) - expect(@uri.to_s).to eq("http://newuser@example.com") - end - - it "should have the correct password after assignment" do - @uri.password = "newpass" - expect(@uri.password).to eq("newpass") - expect(@uri.to_s).to eq("http://user:newpass@example.com") - end - - it "should have the correct userinfo segment after assignment" do - @uri.userinfo = "newuser:newpass" - expect(@uri.userinfo).to eq("newuser:newpass") - expect(@uri.user).to eq("newuser") - expect(@uri.password).to eq("newpass") - expect(@uri.host).to eq("example.com") - expect(@uri.port).to eq(nil) - expect(@uri.inferred_port).to eq(80) - expect(@uri.to_s).to eq("http://newuser:newpass@example.com") - end - - it "should have the correct userinfo segment after nil assignment" do - @uri.userinfo = nil - expect(@uri.userinfo).to eq(nil) - expect(@uri.user).to eq(nil) - expect(@uri.password).to eq(nil) - expect(@uri.host).to eq("example.com") - expect(@uri.port).to eq(nil) - expect(@uri.inferred_port).to eq(80) - expect(@uri.to_s).to eq("http://example.com") - end - - it "should have the correct authority segment after assignment" do - @uri.authority = "newuser@example.com" - expect(@uri.authority).to eq("newuser@example.com") - expect(@uri.user).to eq("newuser") - expect(@uri.password).to eq(nil) - expect(@uri.host).to eq("example.com") - expect(@uri.port).to eq(nil) - expect(@uri.inferred_port).to eq(80) - expect(@uri.to_s).to eq("http://newuser@example.com") - end - - it "should raise an error after nil assignment of authority segment" do - expect do - # This would create an invalid URI - @uri.authority = nil - end.to raise_error(Addressable::URI::InvalidURIError) - end -end - -describe Addressable::URI, "when parsed from " + - "'http://user:@example.com'" do - before do - @uri = Addressable::URI.parse("http://user:@example.com") - end - - it "should use the 'http' scheme" do - expect(@uri.scheme).to eq("http") - end - - it "should have a username of 'user'" do - expect(@uri.user).to eq("user") - end - - it "should have a password of ''" do - expect(@uri.password).to eq("") - end - - it "should have a normalized userinfo of 'user:'" do - expect(@uri.normalized_userinfo).to eq("user:") - end - - it "should have a host of 'example.com'" do - expect(@uri.host).to eq("example.com") - end - - it "should use port 80" do - expect(@uri.inferred_port).to eq(80) - end - - it "should have the correct username after assignment" do - @uri.user = "newuser" - expect(@uri.user).to eq("newuser") - expect(@uri.password).to eq("") - expect(@uri.to_s).to eq("http://newuser:@example.com") - end - - it "should have the correct password after assignment" do - @uri.password = "newpass" - expect(@uri.password).to eq("newpass") - expect(@uri.to_s).to eq("http://user:newpass@example.com") - end - - it "should have the correct authority segment after assignment" do - @uri.authority = "newuser:@example.com" - expect(@uri.authority).to eq("newuser:@example.com") - expect(@uri.user).to eq("newuser") - expect(@uri.password).to eq("") - expect(@uri.host).to eq("example.com") - expect(@uri.port).to eq(nil) - expect(@uri.inferred_port).to eq(80) - expect(@uri.to_s).to eq("http://newuser:@example.com") - end -end - -describe Addressable::URI, "when parsed from " + - "'http://:pass@example.com'" do - before do - @uri = Addressable::URI.parse("http://:pass@example.com") - end - - it "should use the 'http' scheme" do - expect(@uri.scheme).to eq("http") - end - - it "should have a username of ''" do - expect(@uri.user).to eq("") - end - - it "should have a password of 'pass'" do - expect(@uri.password).to eq("pass") - end - - it "should have a userinfo of ':pass'" do - expect(@uri.userinfo).to eq(":pass") - end - - it "should have a normalized userinfo of ':pass'" do - expect(@uri.normalized_userinfo).to eq(":pass") - end - - it "should have a host of 'example.com'" do - expect(@uri.host).to eq("example.com") - end - - it "should use port 80" do - expect(@uri.inferred_port).to eq(80) - end - - it "should have the correct username after assignment" do - @uri.user = "newuser" - expect(@uri.user).to eq("newuser") - expect(@uri.password).to eq("pass") - expect(@uri.to_s).to eq("http://newuser:pass@example.com") - end - - it "should have the correct password after assignment" do - @uri.password = "newpass" - expect(@uri.password).to eq("newpass") - expect(@uri.user).to eq("") - expect(@uri.to_s).to eq("http://:newpass@example.com") - end - - it "should have the correct authority segment after assignment" do - @uri.authority = ":newpass@example.com" - expect(@uri.authority).to eq(":newpass@example.com") - expect(@uri.user).to eq("") - expect(@uri.password).to eq("newpass") - expect(@uri.host).to eq("example.com") - expect(@uri.port).to eq(nil) - expect(@uri.inferred_port).to eq(80) - expect(@uri.to_s).to eq("http://:newpass@example.com") - end -end - -describe Addressable::URI, "when parsed from " + - "'http://:@example.com'" do - before do - @uri = Addressable::URI.parse("http://:@example.com") - end - - it "should use the 'http' scheme" do - expect(@uri.scheme).to eq("http") - end - - it "should have a username of ''" do - expect(@uri.user).to eq("") - end - - it "should have a password of ''" do - expect(@uri.password).to eq("") - end - - it "should have a normalized userinfo of nil" do - expect(@uri.normalized_userinfo).to eq(nil) - end - - it "should have a host of 'example.com'" do - expect(@uri.host).to eq("example.com") - end - - it "should use port 80" do - expect(@uri.inferred_port).to eq(80) - end - - it "should have the correct username after assignment" do - @uri.user = "newuser" - expect(@uri.user).to eq("newuser") - expect(@uri.password).to eq("") - expect(@uri.to_s).to eq("http://newuser:@example.com") - end - - it "should have the correct password after assignment" do - @uri.password = "newpass" - expect(@uri.password).to eq("newpass") - expect(@uri.user).to eq("") - expect(@uri.to_s).to eq("http://:newpass@example.com") - end - - it "should have the correct authority segment after assignment" do - @uri.authority = ":@newexample.com" - expect(@uri.authority).to eq(":@newexample.com") - expect(@uri.user).to eq("") - expect(@uri.password).to eq("") - expect(@uri.host).to eq("newexample.com") - expect(@uri.port).to eq(nil) - expect(@uri.inferred_port).to eq(80) - expect(@uri.to_s).to eq("http://:@newexample.com") - end -end - -describe Addressable::URI, "when parsed from " + - "'#example'" do - before do - @uri = Addressable::URI.parse("#example") - end - - it "should be considered relative" do - expect(@uri).to be_relative - end - - it "should have a host of nil" do - expect(@uri.host).to eq(nil) - end - - it "should have a site of nil" do - expect(@uri.site).to eq(nil) - end - - it "should have a normalized_site of nil" do - expect(@uri.normalized_site).to eq(nil) - end - - it "should have a path of ''" do - expect(@uri.path).to eq("") - end - - it "should have a query string of nil" do - expect(@uri.query).to eq(nil) - end - - it "should have a fragment of 'example'" do - expect(@uri.fragment).to eq("example") - end -end - -describe Addressable::URI, "when parsed from " + - "the network-path reference '//example.com/'" do - before do - @uri = Addressable::URI.parse("//example.com/") - end - - it "should be considered relative" do - expect(@uri).to be_relative - end - - it "should have a host of 'example.com'" do - expect(@uri.host).to eq("example.com") - end - - it "should have a path of '/'" do - expect(@uri.path).to eq("/") - end - - it "should raise an error if routing is attempted" do - expect do - @uri.route_to("http://example.com/") - end.to raise_error(ArgumentError, /\/\/example.com\//) - expect do - @uri.route_from("http://example.com/") - end.to raise_error(ArgumentError, /\/\/example.com\//) - end - - it "should have a 'null' origin" do - expect(@uri.origin).to eq('null') - end -end - -describe Addressable::URI, "when parsed from " + - "'feed://http://example.com/'" do - before do - @uri = Addressable::URI.parse("feed://http://example.com/") - end - - it "should have a host of 'http'" do - expect(@uri.host).to eq("http") - end - - it "should have a path of '//example.com/'" do - expect(@uri.path).to eq("//example.com/") - end -end - -describe Addressable::URI, "when parsed from " + - "'feed:http://example.com/'" do - before do - @uri = Addressable::URI.parse("feed:http://example.com/") - end - - it "should have a path of 'http://example.com/'" do - expect(@uri.path).to eq("http://example.com/") - end - - it "should normalize to 'http://example.com/'" do - expect(@uri.normalize.to_s).to eq("http://example.com/") - expect(@uri.normalize!.to_s).to eq("http://example.com/") - end - - it "should have a 'null' origin" do - expect(@uri.origin).to eq('null') - end -end - -describe Addressable::URI, "when parsed from " + - "'example://a/b/c/%7Bfoo%7D'" do - before do - @uri = Addressable::URI.parse("example://a/b/c/%7Bfoo%7D") - end - - # Section 6.2.2 of RFC 3986 - it "should be equivalent to eXAMPLE://a/./b/../b/%63/%7bfoo%7d" do - expect(@uri).to eq( - Addressable::URI.parse("eXAMPLE://a/./b/../b/%63/%7bfoo%7d") - ) - end - - it "should have an origin of 'example://a'" do - expect(@uri.origin).to eq('example://a') - end -end - -describe Addressable::URI, "when parsed from " + - "'http://example.com/indirect/path/./to/../resource/'" do - before do - @uri = Addressable::URI.parse( - "http://example.com/indirect/path/./to/../resource/") - end - - it "should use the 'http' scheme" do - expect(@uri.scheme).to eq("http") - end - - it "should have a host of 'example.com'" do - expect(@uri.host).to eq("example.com") - end - - it "should use port 80" do - expect(@uri.inferred_port).to eq(80) - end - - it "should have a path of '/indirect/path/./to/../resource/'" do - expect(@uri.path).to eq("/indirect/path/./to/../resource/") - end - - # Section 6.2.2.3 of RFC 3986 - it "should have a normalized path of '/indirect/path/resource/'" do - expect(@uri.normalize.path).to eq("/indirect/path/resource/") - expect(@uri.normalize!.path).to eq("/indirect/path/resource/") - end -end - -describe Addressable::URI, "when parsed from " + - "'http://under_score.example.com/'" do - it "should not cause an error" do - expect do - Addressable::URI.parse("http://under_score.example.com/") - end.not_to raise_error - end -end - -describe Addressable::URI, "when parsed from " + - "'./this:that'" do - before do - @uri = Addressable::URI.parse("./this:that") - end - - it "should be considered relative" do - expect(@uri).to be_relative - end - - it "should have no scheme" do - expect(@uri.scheme).to eq(nil) - end - - it "should have a 'null' origin" do - expect(@uri.origin).to eq('null') - end -end - -describe Addressable::URI, "when parsed from " + - "'this:that'" do - before do - @uri = Addressable::URI.parse("this:that") - end - - it "should be considered absolute" do - expect(@uri).to be_absolute - end - - it "should have a scheme of 'this'" do - expect(@uri.scheme).to eq("this") - end - - it "should have a 'null' origin" do - expect(@uri.origin).to eq('null') - end -end - -describe Addressable::URI, "when parsed from '?'" do - before do - @uri = Addressable::URI.parse("?") - end - - it "should normalize to ''" do - expect(@uri.normalize.to_s).to eq("") - end - - it "should have the correct return type" do - expect(@uri.query_values).to eq({}) - expect(@uri.query_values(Hash)).to eq({}) - expect(@uri.query_values(Array)).to eq([]) - end - - it "should have a 'null' origin" do - expect(@uri.origin).to eq('null') - end -end - -describe Addressable::URI, "when parsed from '?one=1&two=2&three=3'" do - before do - @uri = Addressable::URI.parse("?one=1&two=2&three=3") - end - - it "should have the correct query values" do - expect(@uri.query_values).to eq({"one" => "1", "two" => "2", "three" => "3"}) - end - - it "should raise an error for invalid return type values" do - expect do - @uri.query_values(Integer) - end.to raise_error(ArgumentError) - end - - it "should have the correct array query values" do - expect(@uri.query_values(Array)).to eq([ - ["one", "1"], ["two", "2"], ["three", "3"] - ]) - end - - it "should have a 'null' origin" do - expect(@uri.origin).to eq('null') - end -end - -describe Addressable::URI, "when parsed from '?one=1=uno&two=2=dos'" do - before do - @uri = Addressable::URI.parse("?one=1=uno&two=2=dos") - end - - it "should have the correct query values" do - expect(@uri.query_values).to eq({"one" => "1=uno", "two" => "2=dos"}) - end - - it "should have the correct array query values" do - expect(@uri.query_values(Array)).to eq([ - ["one", "1=uno"], ["two", "2=dos"] - ]) - end -end - -describe Addressable::URI, "when parsed from '?one[two][three]=four'" do - before do - @uri = Addressable::URI.parse("?one[two][three]=four") - end - - it "should have the correct query values" do - expect(@uri.query_values).to eq({"one[two][three]" => "four"}) - end - - it "should have the correct array query values" do - expect(@uri.query_values(Array)).to eq([ - ["one[two][three]", "four"] - ]) - end -end - -describe Addressable::URI, "when parsed from '?one.two.three=four'" do - before do - @uri = Addressable::URI.parse("?one.two.three=four") - end - - it "should have the correct query values" do - expect(@uri.query_values).to eq({ - "one.two.three" => "four" - }) - end - - it "should have the correct array query values" do - expect(@uri.query_values(Array)).to eq([ - ["one.two.three", "four"] - ]) - end -end - -describe Addressable::URI, "when parsed from " + - "'?one[two][three]=four&one[two][five]=six'" do - before do - @uri = Addressable::URI.parse("?one[two][three]=four&one[two][five]=six") - end - - it "should have the correct query values" do - expect(@uri.query_values).to eq({ - "one[two][three]" => "four", "one[two][five]" => "six" - }) - end - - it "should have the correct array query values" do - expect(@uri.query_values(Array)).to eq([ - ["one[two][three]", "four"], ["one[two][five]", "six"] - ]) - end -end - -describe Addressable::URI, "when parsed from " + - "'?one.two.three=four&one.two.five=six'" do - before do - @uri = Addressable::URI.parse("?one.two.three=four&one.two.five=six") - end - - it "should have the correct query values" do - expect(@uri.query_values).to eq({ - "one.two.three" => "four", "one.two.five" => "six" - }) - end - - it "should have the correct array query values" do - expect(@uri.query_values(Array)).to eq([ - ["one.two.three", "four"], ["one.two.five", "six"] - ]) - end -end - -describe Addressable::URI, "when parsed from " + - "'?one=two&one=three'" do - before do - @uri = Addressable::URI.parse( - "?one=two&one=three&one=four" - ) - end - - it "should have correct array query values" do - expect(@uri.query_values(Array)).to eq( - [['one', 'two'], ['one', 'three'], ['one', 'four']] - ) - end - - it "should have correct hash query values" do - skip("This is probably more desirable behavior.") - expect(@uri.query_values(Hash)).to eq( - {'one' => ['two', 'three', 'four']} - ) - end - - it "should handle assignment with keys of mixed type" do - @uri.query_values = @uri.query_values(Hash).merge({:one => 'three'}) - expect(@uri.query_values(Hash)).to eq({'one' => 'three'}) - end -end - -describe Addressable::URI, "when parsed from " + - "'?one[two][three][]=four&one[two][three][]=five'" do - before do - @uri = Addressable::URI.parse( - "?one[two][three][]=four&one[two][three][]=five" - ) - end - - it "should have correct query values" do - expect(@uri.query_values(Hash)).to eq({"one[two][three][]" => "five"}) - end - - it "should have correct array query values" do - expect(@uri.query_values(Array)).to eq([ - ["one[two][three][]", "four"], ["one[two][three][]", "five"] - ]) - end -end - -describe Addressable::URI, "when parsed from " + - "'?one[two][three][0]=four&one[two][three][1]=five'" do - before do - @uri = Addressable::URI.parse( - "?one[two][three][0]=four&one[two][three][1]=five" - ) - end - - it "should have the correct query values" do - expect(@uri.query_values).to eq({ - "one[two][three][0]" => "four", "one[two][three][1]" => "five" - }) - end -end - -describe Addressable::URI, "when parsed from " + - "'?one[two][three][1]=four&one[two][three][0]=five'" do - before do - @uri = Addressable::URI.parse( - "?one[two][three][1]=four&one[two][three][0]=five" - ) - end - - it "should have the correct query values" do - expect(@uri.query_values).to eq({ - "one[two][three][1]" => "four", "one[two][three][0]" => "five" - }) - end -end - -describe Addressable::URI, "when parsed from " + - "'?one[two][three][2]=four&one[two][three][1]=five'" do - before do - @uri = Addressable::URI.parse( - "?one[two][three][2]=four&one[two][three][1]=five" - ) - end - - it "should have the correct query values" do - expect(@uri.query_values).to eq({ - "one[two][three][2]" => "four", "one[two][three][1]" => "five" - }) - end -end - -describe Addressable::URI, "when parsed from " + - "'http://www.詹姆斯.com/'" do - before do - @uri = Addressable::URI.parse("http://www.詹姆斯.com/") - end - - it "should be equivalent to 'http://www.xn--8ws00zhy3a.com/'" do - expect(@uri).to eq( - Addressable::URI.parse("http://www.xn--8ws00zhy3a.com/") - ) - end - - it "should not have domain name encoded during normalization" do - expect(Addressable::URI.normalized_encode(@uri.to_s)).to eq( - "http://www.詹姆斯.com/" - ) - end - - it "should have an origin of 'http://www.xn--8ws00zhy3a.com'" do - expect(@uri.origin).to eq('http://www.xn--8ws00zhy3a.com') - end -end - -describe Addressable::URI, "when parsed from " + - "'http://www.詹姆斯.com/ some spaces /'" do - before do - @uri = Addressable::URI.parse("http://www.詹姆斯.com/ some spaces /") - end - - it "should be equivalent to " + - "'http://www.xn--8ws00zhy3a.com/%20some%20spaces%20/'" do - expect(@uri).to eq( - Addressable::URI.parse( - "http://www.xn--8ws00zhy3a.com/%20some%20spaces%20/") - ) - end - - it "should not have domain name encoded during normalization" do - expect(Addressable::URI.normalized_encode(@uri.to_s)).to eq( - "http://www.詹姆斯.com/%20some%20spaces%20/" - ) - end - - it "should have an origin of 'http://www.xn--8ws00zhy3a.com'" do - expect(@uri.origin).to eq('http://www.xn--8ws00zhy3a.com') - end -end - -describe Addressable::URI, "when parsed from " + - "'http://www.xn--8ws00zhy3a.com/'" do - before do - @uri = Addressable::URI.parse("http://www.xn--8ws00zhy3a.com/") - end - - it "should be displayed as http://www.詹姆斯.com/" do - expect(@uri.display_uri.to_s).to eq("http://www.詹姆斯.com/") - end - - it "should properly force the encoding" do - display_string = @uri.display_uri.to_str - expect(display_string).to eq("http://www.詹姆斯.com/") - if display_string.respond_to?(:encoding) - expect(display_string.encoding.to_s).to eq(Encoding::UTF_8.to_s) - end - end - - it "should have an origin of 'http://www.xn--8ws00zhy3a.com'" do - expect(@uri.origin).to eq('http://www.xn--8ws00zhy3a.com') - end -end - -describe Addressable::URI, "when parsed from " + - "'http://www.詹姆斯.com/atomtests/iri/詹.html'" do - before do - @uri = Addressable::URI.parse("http://www.詹姆斯.com/atomtests/iri/詹.html") - end - - it "should normalize to " + - "http://www.xn--8ws00zhy3a.com/atomtests/iri/%E8%A9%B9.html" do - expect(@uri.normalize.to_s).to eq( - "http://www.xn--8ws00zhy3a.com/atomtests/iri/%E8%A9%B9.html" - ) - expect(@uri.normalize!.to_s).to eq( - "http://www.xn--8ws00zhy3a.com/atomtests/iri/%E8%A9%B9.html" - ) - end -end - -describe Addressable::URI, "when parsed from a percent-encoded IRI" do - before do - @uri = Addressable::URI.parse( - "http://www.%E3%81%BB%E3%82%93%E3%81%A8%E3%81%86%E3%81%AB%E3%81%AA" + - "%E3%81%8C%E3%81%84%E3%82%8F%E3%81%91%E3%81%AE%E3%82%8F%E3%81%8B%E3" + - "%82%89%E3%81%AA%E3%81%84%E3%81%A9%E3%82%81%E3%81%84%E3%82%93%E3%82" + - "%81%E3%81%84%E3%81%AE%E3%82%89%E3%81%B9%E3%82%8B%E3%81%BE%E3%81%A0" + - "%E3%81%AA%E3%81%8C%E3%81%8F%E3%81%97%E3%81%AA%E3%81%84%E3%81%A8%E3" + - "%81%9F%E3%82%8A%E3%81%AA%E3%81%84.w3.mag.keio.ac.jp" - ) - end - - it "should normalize to something sane" do - expect(@uri.normalize.to_s).to eq( - "http://www.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3f" + - "g11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp/" - ) - expect(@uri.normalize!.to_s).to eq( - "http://www.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3f" + - "g11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp/" - ) - end - - it "should have the correct origin" do - expect(@uri.origin).to eq( - "http://www.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3f" + - "g11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp" - ) - end -end - -describe Addressable::URI, "with a base uri of 'http://a/b/c/d;p?q'" do - before do - @uri = Addressable::URI.parse("http://a/b/c/d;p?q") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with 'g:h' should resolve to g:h" do - expect((@uri + "g:h").to_s).to eq("g:h") - expect(Addressable::URI.join(@uri, "g:h").to_s).to eq("g:h") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with 'g' should resolve to http://a/b/c/g" do - expect((@uri + "g").to_s).to eq("http://a/b/c/g") - expect(Addressable::URI.join(@uri.to_s, "g").to_s).to eq("http://a/b/c/g") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with './g' should resolve to http://a/b/c/g" do - expect((@uri + "./g").to_s).to eq("http://a/b/c/g") - expect(Addressable::URI.join(@uri.to_s, "./g").to_s).to eq("http://a/b/c/g") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with 'g/' should resolve to http://a/b/c/g/" do - expect((@uri + "g/").to_s).to eq("http://a/b/c/g/") - expect(Addressable::URI.join(@uri.to_s, "g/").to_s).to eq("http://a/b/c/g/") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with '/g' should resolve to http://a/g" do - expect((@uri + "/g").to_s).to eq("http://a/g") - expect(Addressable::URI.join(@uri.to_s, "/g").to_s).to eq("http://a/g") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with '//g' should resolve to http://g" do - expect((@uri + "//g").to_s).to eq("http://g") - expect(Addressable::URI.join(@uri.to_s, "//g").to_s).to eq("http://g") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with '?y' should resolve to http://a/b/c/d;p?y" do - expect((@uri + "?y").to_s).to eq("http://a/b/c/d;p?y") - expect(Addressable::URI.join(@uri.to_s, "?y").to_s).to eq("http://a/b/c/d;p?y") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with 'g?y' should resolve to http://a/b/c/g?y" do - expect((@uri + "g?y").to_s).to eq("http://a/b/c/g?y") - expect(Addressable::URI.join(@uri.to_s, "g?y").to_s).to eq("http://a/b/c/g?y") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with '#s' should resolve to http://a/b/c/d;p?q#s" do - expect((@uri + "#s").to_s).to eq("http://a/b/c/d;p?q#s") - expect(Addressable::URI.join(@uri.to_s, "#s").to_s).to eq( - "http://a/b/c/d;p?q#s" - ) - end - - # Section 5.4.1 of RFC 3986 - it "when joined with 'g#s' should resolve to http://a/b/c/g#s" do - expect((@uri + "g#s").to_s).to eq("http://a/b/c/g#s") - expect(Addressable::URI.join(@uri.to_s, "g#s").to_s).to eq("http://a/b/c/g#s") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with 'g?y#s' should resolve to http://a/b/c/g?y#s" do - expect((@uri + "g?y#s").to_s).to eq("http://a/b/c/g?y#s") - expect(Addressable::URI.join( - @uri.to_s, "g?y#s").to_s).to eq("http://a/b/c/g?y#s") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with ';x' should resolve to http://a/b/c/;x" do - expect((@uri + ";x").to_s).to eq("http://a/b/c/;x") - expect(Addressable::URI.join(@uri.to_s, ";x").to_s).to eq("http://a/b/c/;x") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with 'g;x' should resolve to http://a/b/c/g;x" do - expect((@uri + "g;x").to_s).to eq("http://a/b/c/g;x") - expect(Addressable::URI.join(@uri.to_s, "g;x").to_s).to eq("http://a/b/c/g;x") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with 'g;x?y#s' should resolve to http://a/b/c/g;x?y#s" do - expect((@uri + "g;x?y#s").to_s).to eq("http://a/b/c/g;x?y#s") - expect(Addressable::URI.join( - @uri.to_s, "g;x?y#s").to_s).to eq("http://a/b/c/g;x?y#s") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with '' should resolve to http://a/b/c/d;p?q" do - expect((@uri + "").to_s).to eq("http://a/b/c/d;p?q") - expect(Addressable::URI.join(@uri.to_s, "").to_s).to eq("http://a/b/c/d;p?q") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with '.' should resolve to http://a/b/c/" do - expect((@uri + ".").to_s).to eq("http://a/b/c/") - expect(Addressable::URI.join(@uri.to_s, ".").to_s).to eq("http://a/b/c/") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with './' should resolve to http://a/b/c/" do - expect((@uri + "./").to_s).to eq("http://a/b/c/") - expect(Addressable::URI.join(@uri.to_s, "./").to_s).to eq("http://a/b/c/") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with '..' should resolve to http://a/b/" do - expect((@uri + "..").to_s).to eq("http://a/b/") - expect(Addressable::URI.join(@uri.to_s, "..").to_s).to eq("http://a/b/") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with '../' should resolve to http://a/b/" do - expect((@uri + "../").to_s).to eq("http://a/b/") - expect(Addressable::URI.join(@uri.to_s, "../").to_s).to eq("http://a/b/") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with '../g' should resolve to http://a/b/g" do - expect((@uri + "../g").to_s).to eq("http://a/b/g") - expect(Addressable::URI.join(@uri.to_s, "../g").to_s).to eq("http://a/b/g") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with '../..' should resolve to http://a/" do - expect((@uri + "../..").to_s).to eq("http://a/") - expect(Addressable::URI.join(@uri.to_s, "../..").to_s).to eq("http://a/") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with '../../' should resolve to http://a/" do - expect((@uri + "../../").to_s).to eq("http://a/") - expect(Addressable::URI.join(@uri.to_s, "../../").to_s).to eq("http://a/") - end - - # Section 5.4.1 of RFC 3986 - it "when joined with '../../g' should resolve to http://a/g" do - expect((@uri + "../../g").to_s).to eq("http://a/g") - expect(Addressable::URI.join(@uri.to_s, "../../g").to_s).to eq("http://a/g") - end - - # Section 5.4.2 of RFC 3986 - it "when joined with '../../../g' should resolve to http://a/g" do - expect((@uri + "../../../g").to_s).to eq("http://a/g") - expect(Addressable::URI.join(@uri.to_s, "../../../g").to_s).to eq("http://a/g") - end - - it "when joined with '../.././../g' should resolve to http://a/g" do - expect((@uri + "../.././../g").to_s).to eq("http://a/g") - expect(Addressable::URI.join(@uri.to_s, "../.././../g").to_s).to eq( - "http://a/g" - ) - end - - # Section 5.4.2 of RFC 3986 - it "when joined with '../../../../g' should resolve to http://a/g" do - expect((@uri + "../../../../g").to_s).to eq("http://a/g") - expect(Addressable::URI.join( - @uri.to_s, "../../../../g").to_s).to eq("http://a/g") - end - - # Section 5.4.2 of RFC 3986 - it "when joined with '/./g' should resolve to http://a/g" do - expect((@uri + "/./g").to_s).to eq("http://a/g") - expect(Addressable::URI.join(@uri.to_s, "/./g").to_s).to eq("http://a/g") - end - - # Section 5.4.2 of RFC 3986 - it "when joined with '/../g' should resolve to http://a/g" do - expect((@uri + "/../g").to_s).to eq("http://a/g") - expect(Addressable::URI.join(@uri.to_s, "/../g").to_s).to eq("http://a/g") - end - - # Section 5.4.2 of RFC 3986 - it "when joined with 'g.' should resolve to http://a/b/c/g." do - expect((@uri + "g.").to_s).to eq("http://a/b/c/g.") - expect(Addressable::URI.join(@uri.to_s, "g.").to_s).to eq("http://a/b/c/g.") - end - - # Section 5.4.2 of RFC 3986 - it "when joined with '.g' should resolve to http://a/b/c/.g" do - expect((@uri + ".g").to_s).to eq("http://a/b/c/.g") - expect(Addressable::URI.join(@uri.to_s, ".g").to_s).to eq("http://a/b/c/.g") - end - - # Section 5.4.2 of RFC 3986 - it "when joined with 'g..' should resolve to http://a/b/c/g.." do - expect((@uri + "g..").to_s).to eq("http://a/b/c/g..") - expect(Addressable::URI.join(@uri.to_s, "g..").to_s).to eq("http://a/b/c/g..") - end - - # Section 5.4.2 of RFC 3986 - it "when joined with '..g' should resolve to http://a/b/c/..g" do - expect((@uri + "..g").to_s).to eq("http://a/b/c/..g") - expect(Addressable::URI.join(@uri.to_s, "..g").to_s).to eq("http://a/b/c/..g") - end - - # Section 5.4.2 of RFC 3986 - it "when joined with './../g' should resolve to http://a/b/g" do - expect((@uri + "./../g").to_s).to eq("http://a/b/g") - expect(Addressable::URI.join(@uri.to_s, "./../g").to_s).to eq("http://a/b/g") - end - - # Section 5.4.2 of RFC 3986 - it "when joined with './g/.' should resolve to http://a/b/c/g/" do - expect((@uri + "./g/.").to_s).to eq("http://a/b/c/g/") - expect(Addressable::URI.join(@uri.to_s, "./g/.").to_s).to eq("http://a/b/c/g/") - end - - # Section 5.4.2 of RFC 3986 - it "when joined with 'g/./h' should resolve to http://a/b/c/g/h" do - expect((@uri + "g/./h").to_s).to eq("http://a/b/c/g/h") - expect(Addressable::URI.join(@uri.to_s, "g/./h").to_s).to eq("http://a/b/c/g/h") - end - - # Section 5.4.2 of RFC 3986 - it "when joined with 'g/../h' should resolve to http://a/b/c/h" do - expect((@uri + "g/../h").to_s).to eq("http://a/b/c/h") - expect(Addressable::URI.join(@uri.to_s, "g/../h").to_s).to eq("http://a/b/c/h") - end - - # Section 5.4.2 of RFC 3986 - it "when joined with 'g;x=1/./y' " + - "should resolve to http://a/b/c/g;x=1/y" do - expect((@uri + "g;x=1/./y").to_s).to eq("http://a/b/c/g;x=1/y") - expect(Addressable::URI.join( - @uri.to_s, "g;x=1/./y").to_s).to eq("http://a/b/c/g;x=1/y") - end - - # Section 5.4.2 of RFC 3986 - it "when joined with 'g;x=1/../y' should resolve to http://a/b/c/y" do - expect((@uri + "g;x=1/../y").to_s).to eq("http://a/b/c/y") - expect(Addressable::URI.join( - @uri.to_s, "g;x=1/../y").to_s).to eq("http://a/b/c/y") - end - - # Section 5.4.2 of RFC 3986 - it "when joined with 'g?y/./x' " + - "should resolve to http://a/b/c/g?y/./x" do - expect((@uri + "g?y/./x").to_s).to eq("http://a/b/c/g?y/./x") - expect(Addressable::URI.join( - @uri.to_s, "g?y/./x").to_s).to eq("http://a/b/c/g?y/./x") - end - - # Section 5.4.2 of RFC 3986 - it "when joined with 'g?y/../x' " + - "should resolve to http://a/b/c/g?y/../x" do - expect((@uri + "g?y/../x").to_s).to eq("http://a/b/c/g?y/../x") - expect(Addressable::URI.join( - @uri.to_s, "g?y/../x").to_s).to eq("http://a/b/c/g?y/../x") - end - - # Section 5.4.2 of RFC 3986 - it "when joined with 'g#s/./x' " + - "should resolve to http://a/b/c/g#s/./x" do - expect((@uri + "g#s/./x").to_s).to eq("http://a/b/c/g#s/./x") - expect(Addressable::URI.join( - @uri.to_s, "g#s/./x").to_s).to eq("http://a/b/c/g#s/./x") - end - - # Section 5.4.2 of RFC 3986 - it "when joined with 'g#s/../x' " + - "should resolve to http://a/b/c/g#s/../x" do - expect((@uri + "g#s/../x").to_s).to eq("http://a/b/c/g#s/../x") - expect(Addressable::URI.join( - @uri.to_s, "g#s/../x").to_s).to eq("http://a/b/c/g#s/../x") - end - - # Section 5.4.2 of RFC 3986 - it "when joined with 'http:g' should resolve to http:g" do - expect((@uri + "http:g").to_s).to eq("http:g") - expect(Addressable::URI.join(@uri.to_s, "http:g").to_s).to eq("http:g") - end - - # Edge case to be sure - it "when joined with '//example.com/' should " + - "resolve to http://example.com/" do - expect((@uri + "//example.com/").to_s).to eq("http://example.com/") - expect(Addressable::URI.join( - @uri.to_s, "//example.com/").to_s).to eq("http://example.com/") - end - - it "when joined with a bogus object a TypeError should be raised" do - expect do - Addressable::URI.join(@uri, 42) - end.to raise_error(TypeError) - end -end - -describe Addressable::URI, "when converting the path " + - "'relative/path/to/something'" do - before do - @path = 'relative/path/to/something' - end - - it "should convert to " + - "\'relative/path/to/something\'" do - @uri = Addressable::URI.convert_path(@path) - expect(@uri.to_str).to eq("relative/path/to/something") - end - - it "should join with an absolute file path correctly" do - @base = Addressable::URI.convert_path("/absolute/path/") - @uri = Addressable::URI.convert_path(@path) - expect((@base + @uri).to_str).to eq( - "file:///absolute/path/relative/path/to/something" - ) - end -end - -describe Addressable::URI, "when converting a bogus path" do - it "should raise a TypeError" do - expect do - Addressable::URI.convert_path(42) - end.to raise_error(TypeError) - end -end - -describe Addressable::URI, "when given a UNIX root directory" do - before do - @path = "/" - end - - it "should convert to \'file:///\'" do - @uri = Addressable::URI.convert_path(@path) - expect(@uri.to_str).to eq("file:///") - end - - it "should have an origin of 'file://'" do - @uri = Addressable::URI.convert_path(@path) - expect(@uri.origin).to eq('file://') - end -end - -describe Addressable::URI, "when given a Windows root directory" do - before do - @path = "C:\\" - end - - it "should convert to \'file:///c:/\'" do - @uri = Addressable::URI.convert_path(@path) - expect(@uri.to_str).to eq("file:///c:/") - end - - it "should have an origin of 'file://'" do - @uri = Addressable::URI.convert_path(@path) - expect(@uri.origin).to eq('file://') - end -end - -describe Addressable::URI, "when given the path '/one/two/'" do - before do - @path = '/one/two/' - end - - it "should convert to " + - "\'file:///one/two/\'" do - @uri = Addressable::URI.convert_path(@path) - expect(@uri.to_str).to eq("file:///one/two/") - end - - it "should have an origin of 'file://'" do - @uri = Addressable::URI.convert_path(@path) - expect(@uri.origin).to eq('file://') - end -end - -describe Addressable::URI, "when given the tld " do - it "'uk' should have a tld of 'uk'" do - uri = Addressable::URI.parse("http://example.com") - uri.tld = "uk" - - expect(uri.tld).to eq("uk") - end - - context "which " do - let (:uri) { Addressable::URI.parse("http://www.comrade.net/path/to/source/") } - - it "contains a subdomain" do - uri.tld = "co.uk" - - expect(uri.to_s).to eq("http://www.comrade.co.uk/path/to/source/") - end - - it "is part of the domain" do - uri.tld = "com" - - expect(uri.to_s).to eq("http://www.comrade.com/path/to/source/") - end - end -end - -describe Addressable::URI, "when given the path " + - "'c:\\windows\\My Documents 100%20\\foo.txt'" do - before do - @path = "c:\\windows\\My Documents 100%20\\foo.txt" - end - - it "should convert to " + - "\'file:///c:/windows/My%20Documents%20100%20/foo.txt\'" do - @uri = Addressable::URI.convert_path(@path) - expect(@uri.to_str).to eq("file:///c:/windows/My%20Documents%20100%20/foo.txt") - end - - it "should have an origin of 'file://'" do - @uri = Addressable::URI.convert_path(@path) - expect(@uri.origin).to eq('file://') - end -end - -describe Addressable::URI, "when given the path " + - "'file://c:\\windows\\My Documents 100%20\\foo.txt'" do - before do - @path = "file://c:\\windows\\My Documents 100%20\\foo.txt" - end - - it "should convert to " + - "\'file:///c:/windows/My%20Documents%20100%20/foo.txt\'" do - @uri = Addressable::URI.convert_path(@path) - expect(@uri.to_str).to eq("file:///c:/windows/My%20Documents%20100%20/foo.txt") - end - - it "should have an origin of 'file://'" do - @uri = Addressable::URI.convert_path(@path) - expect(@uri.origin).to eq('file://') - end -end - -describe Addressable::URI, "when given the path " + - "'file:c:\\windows\\My Documents 100%20\\foo.txt'" do - before do - @path = "file:c:\\windows\\My Documents 100%20\\foo.txt" - end - - it "should convert to " + - "\'file:///c:/windows/My%20Documents%20100%20/foo.txt\'" do - @uri = Addressable::URI.convert_path(@path) - expect(@uri.to_str).to eq("file:///c:/windows/My%20Documents%20100%20/foo.txt") - end - - it "should have an origin of 'file://'" do - @uri = Addressable::URI.convert_path(@path) - expect(@uri.origin).to eq('file://') - end -end - -describe Addressable::URI, "when given the path " + - "'file:/c:\\windows\\My Documents 100%20\\foo.txt'" do - before do - @path = "file:/c:\\windows\\My Documents 100%20\\foo.txt" - end - - it "should convert to " + - "\'file:///c:/windows/My%20Documents%20100%20/foo.txt\'" do - @uri = Addressable::URI.convert_path(@path) - expect(@uri.to_str).to eq("file:///c:/windows/My%20Documents%20100%20/foo.txt") - end - - it "should have an origin of 'file://'" do - @uri = Addressable::URI.convert_path(@path) - expect(@uri.origin).to eq('file://') - end -end - -describe Addressable::URI, "when given the path " + - "'file:///c|/windows/My%20Documents%20100%20/foo.txt'" do - before do - @path = "file:///c|/windows/My%20Documents%20100%20/foo.txt" - end - - it "should convert to " + - "\'file:///c:/windows/My%20Documents%20100%20/foo.txt\'" do - @uri = Addressable::URI.convert_path(@path) - expect(@uri.to_str).to eq("file:///c:/windows/My%20Documents%20100%20/foo.txt") - end - - it "should have an origin of 'file://'" do - @uri = Addressable::URI.convert_path(@path) - expect(@uri.origin).to eq('file://') - end -end - -describe Addressable::URI, "when given an http protocol URI" do - before do - @path = "http://example.com/" - end - - it "should not do any conversion at all" do - @uri = Addressable::URI.convert_path(@path) - expect(@uri.to_str).to eq("http://example.com/") - end -end - -class SuperString - def initialize(string) - @string = string.to_s - end - - def to_str - return @string - end -end - -describe Addressable::URI, "when parsing a non-String object" do - it "should correctly parse anything with a 'to_str' method" do - Addressable::URI.parse(SuperString.new(42)) - end - - it "should raise a TypeError for objects than cannot be converted" do - expect do - Addressable::URI.parse(42) - end.to raise_error(TypeError) - end - - it "should correctly parse heuristically anything with a 'to_str' method" do - Addressable::URI.heuristic_parse(SuperString.new(42)) - end - - it "should raise a TypeError for objects than cannot be converted" do - expect do - Addressable::URI.heuristic_parse(42) - end.to raise_error(TypeError) - end -end - -describe Addressable::URI, "when form encoding a hash" do - it "should result in correct percent encoded sequence" do - expect(Addressable::URI.form_encode( - [["&one", "/1"], ["=two", "?2"], [":three", "#3"]] - )).to eq("%26one=%2F1&%3Dtwo=%3F2&%3Athree=%233") - end - - it "should result in correct percent encoded sequence" do - expect(Addressable::URI.form_encode( - {"q" => "one two three"} - )).to eq("q=one+two+three") - end - - it "should result in correct percent encoded sequence" do - expect(Addressable::URI.form_encode( - {"key" => nil} - )).to eq("key=") - end - - it "should result in correct percent encoded sequence" do - expect(Addressable::URI.form_encode( - {"q" => ["one", "two", "three"]} - )).to eq("q=one&q=two&q=three") - end - - it "should result in correctly encoded newlines" do - expect(Addressable::URI.form_encode( - {"text" => "one\ntwo\rthree\r\nfour\n\r"} - )).to eq("text=one%0D%0Atwo%0D%0Athree%0D%0Afour%0D%0A%0D%0A") - end - - it "should result in a sorted percent encoded sequence" do - expect(Addressable::URI.form_encode( - [["a", "1"], ["dup", "3"], ["dup", "2"]], true - )).to eq("a=1&dup=2&dup=3") - end -end - -describe Addressable::URI, "when form encoding a non-Array object" do - it "should raise a TypeError for objects than cannot be converted" do - expect do - Addressable::URI.form_encode(42) - end.to raise_error(TypeError) - end -end - -# See https://tools.ietf.org/html/rfc6749#appendix-B -describe Addressable::URI, "when form encoding the example value from OAuth 2" do - it "should result in correct values" do - expect(Addressable::URI.form_encode( - {"value" => " %&+£€"} - )).to eq("value=+%25%26%2B%C2%A3%E2%82%AC") - end -end - -# See https://tools.ietf.org/html/rfc6749#appendix-B -describe Addressable::URI, "when form unencoding the example value from OAuth 2" do - it "should result in correct values" do - expect(Addressable::URI.form_unencode( - "value=+%25%26%2B%C2%A3%E2%82%AC" - )).to eq([["value", " %&+£€"]]) - end -end - -describe Addressable::URI, "when form unencoding a string" do - it "should result in correct values" do - expect(Addressable::URI.form_unencode( - "%26one=%2F1&%3Dtwo=%3F2&%3Athree=%233" - )).to eq([["&one", "/1"], ["=two", "?2"], [":three", "#3"]]) - end - - it "should result in correct values" do - expect(Addressable::URI.form_unencode( - "q=one+two+three" - )).to eq([["q", "one two three"]]) - end - - it "should result in correct values" do - expect(Addressable::URI.form_unencode( - "text=one%0D%0Atwo%0D%0Athree%0D%0Afour%0D%0A%0D%0A" - )).to eq([["text", "one\ntwo\nthree\nfour\n\n"]]) - end - - it "should result in correct values" do - expect(Addressable::URI.form_unencode( - "a=1&dup=2&dup=3" - )).to eq([["a", "1"], ["dup", "2"], ["dup", "3"]]) - end - - it "should result in correct values" do - expect(Addressable::URI.form_unencode( - "key" - )).to eq([["key", nil]]) - end - - it "should result in correct values" do - expect(Addressable::URI.form_unencode("GivenName=Ren%C3%A9")).to eq( - [["GivenName", "René"]] - ) - end -end - -describe Addressable::URI, "when form unencoding a non-String object" do - it "should correctly parse anything with a 'to_str' method" do - Addressable::URI.form_unencode(SuperString.new(42)) - end - - it "should raise a TypeError for objects than cannot be converted" do - expect do - Addressable::URI.form_unencode(42) - end.to raise_error(TypeError) - end -end - -describe Addressable::URI, "when normalizing a non-String object" do - it "should correctly parse anything with a 'to_str' method" do - Addressable::URI.normalize_component(SuperString.new(42)) - end - - it "should raise a TypeError for objects than cannot be converted" do - expect do - Addressable::URI.normalize_component(42) - end.to raise_error(TypeError) - end - - it "should raise a TypeError for objects than cannot be converted" do - expect do - Addressable::URI.normalize_component("component", 42) - end.to raise_error(TypeError) - end -end - -describe Addressable::URI, "when normalizing a path with an encoded slash" do - it "should result in correct percent encoded sequence" do - expect(Addressable::URI.parse("/path%2Fsegment/").normalize.path).to eq( - "/path%2Fsegment/" - ) - end -end - -describe Addressable::URI, "when normalizing a path with special unicode" do - it "does not stop at or ignore null bytes" do - expect(Addressable::URI.parse("/path%00segment/").normalize.path).to eq( - "/path%00segment/" - ) - end - - it "does apply NFC unicode normalization" do - expect(Addressable::URI.parse("/%E2%84%A6").normalize.path).to eq( - "/%CE%A9" - ) - end - - it "does not apply NFKC unicode normalization" do - expect(Addressable::URI.parse("/%C2%AF%C2%A0").normalize.path).to eq( - "/%C2%AF%C2%A0" - ) - end -end - -describe Addressable::URI, "when normalizing a partially encoded string" do - it "should result in correct percent encoded sequence" do - expect(Addressable::URI.normalize_component( - "partially % encoded%21" - )).to eq("partially%20%25%20encoded!") - end - - it "should result in correct percent encoded sequence" do - expect(Addressable::URI.normalize_component( - "partially %25 encoded!" - )).to eq("partially%20%25%20encoded!") - end -end - -describe Addressable::URI, "when normalizing a unicode sequence" do - it "should result in correct percent encoded sequence" do - expect(Addressable::URI.normalize_component( - "/C%CC%A7" - )).to eq("/%C3%87") - end - - it "should result in correct percent encoded sequence" do - expect(Addressable::URI.normalize_component( - "/%C3%87" - )).to eq("/%C3%87") - end -end - -describe Addressable::URI, "when normalizing a multibyte string" do - it "should result in correct percent encoded sequence" do - expect(Addressable::URI.normalize_component("günther")).to eq( - "g%C3%BCnther" - ) - end - - it "should result in correct percent encoded sequence" do - expect(Addressable::URI.normalize_component("g%C3%BCnther")).to eq( - "g%C3%BCnther" - ) - end -end - -describe Addressable::URI, "when normalizing a string but leaving some characters encoded" do - it "should result in correct percent encoded sequence" do - expect(Addressable::URI.normalize_component("%58X%59Y%5AZ", "0-9a-zXY", "Y")).to eq( - "XX%59Y%5A%5A" - ) - end - - it "should not modify the character class" do - character_class = "0-9a-zXY" - - character_class_copy = character_class.dup - - Addressable::URI.normalize_component("%58X%59Y%5AZ", character_class, "Y") - - expect(character_class).to eq(character_class_copy) - end -end - -describe Addressable::URI, "when encoding IP literals" do - it "should work for IPv4" do - input = "http://127.0.0.1/" - expect(Addressable::URI.encode(input)).to eq(input) - end - - it "should work for IPv6" do - input = "http://[fe80::200:f8ff:fe21:67cf]/" - expect(Addressable::URI.encode(input)).to eq(input) - end -end - -describe Addressable::URI, "when encoding a string with existing encodings to upcase" do - it "should result in correct percent encoded sequence" do - expect(Addressable::URI.encode_component("JK%4c", "0-9A-IKM-Za-z%", "L")).to eq("%4AK%4C") - end -end - -describe Addressable::URI, "when encoding a multibyte string" do - it "should result in correct percent encoded sequence" do - expect(Addressable::URI.encode_component("günther")).to eq("g%C3%BCnther") - end - - it "should result in correct percent encoded sequence" do - expect(Addressable::URI.encode_component( - "günther", /[^a-zA-Z0-9\:\/\?\#\[\]\@\!\$\&\'\(\)\*\+\,\;\=\-\.\_\~]/ - )).to eq("g%C3%BCnther") - end -end - -describe Addressable::URI, "when form encoding a multibyte string" do - it "should result in correct percent encoded sequence" do - expect(Addressable::URI.form_encode({"GivenName" => "René"})).to eq( - "GivenName=Ren%C3%A9" - ) - end -end - -describe Addressable::URI, "when encoding a string with ASCII chars 0-15" do - it "should result in correct percent encoded sequence" do - expect(Addressable::URI.encode_component("one\ntwo")).to eq("one%0Atwo") - end - - it "should result in correct percent encoded sequence" do - expect(Addressable::URI.encode_component( - "one\ntwo", /[^a-zA-Z0-9\:\/\?\#\[\]\@\!\$\&\'\(\)\*\+\,\;\=\-\.\_\~]/ - )).to eq("one%0Atwo") - end -end - -describe Addressable::URI, "when unencoding a multibyte string" do - it "should result in correct percent encoded sequence" do - expect(Addressable::URI.unencode_component("g%C3%BCnther")).to eq("günther") - end - - it "should consistently use UTF-8 internally" do - expect(Addressable::URI.unencode_component("ski=%BA%DAɫ")).to eq("ski=\xBA\xDAɫ") - end - - it "should not fail with UTF-8 incompatible string" do - url = "/M%E9/\xE9?p=\xFC".b - expect(Addressable::URI.unencode_component(url)).to eq("/M\xE9/\xE9?p=\xFC") - end - - it "should result in correct percent encoded sequence as a URI" do - expect(Addressable::URI.unencode( - "/path?g%C3%BCnther", ::Addressable::URI - )).to eq(Addressable::URI.new( - :path => "/path", :query => "günther" - )) - end -end - -describe Addressable::URI, "when partially unencoding a string" do - it "should unencode all characters by default" do - expect(Addressable::URI.unencode('%%25~%7e+%2b', String)).to eq('%%~~++') - end - - it "should unencode characters not in leave_encoded" do - expect(Addressable::URI.unencode('%%25~%7e+%2b', String, '~')).to eq('%%~%7e++') - end - - it "should leave characters in leave_encoded alone" do - expect(Addressable::URI.unencode('%%25~%7e+%2b', String, '%~+')).to eq('%%25~%7e+%2b') - end -end - -describe Addressable::URI, "when unencoding a bogus object" do - it "should raise a TypeError" do - expect do - Addressable::URI.unencode_component(42) - end.to raise_error(TypeError) - end - - it "should raise a TypeError" do - expect do - Addressable::URI.unencode("/path?g%C3%BCnther", Integer) - end.to raise_error(TypeError) - end -end - -describe Addressable::URI, "when encoding a bogus object" do - it "should raise a TypeError" do - expect do - Addressable::URI.encode(Object.new) - end.to raise_error(TypeError) - end - - it "should raise a TypeError" do - expect do - Addressable::URI.normalized_encode(Object.new) - end.to raise_error(TypeError) - end - - it "should raise a TypeError" do - expect do - Addressable::URI.encode_component("günther", Object.new) - end.to raise_error(TypeError) - end - - it "should raise a TypeError" do - expect do - Addressable::URI.encode_component(Object.new) - end.to raise_error(TypeError) - end -end - -describe Addressable::URI, "when given the input " + - "'http://example.com/'" do - before do - @input = "http://example.com/" - end - - it "should heuristically parse to 'http://example.com/'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.to_s).to eq("http://example.com/") - end - - it "should not raise error when frozen" do - expect do - Addressable::URI.heuristic_parse(@input).freeze.to_s - end.not_to raise_error - end -end - -describe Addressable::URI, "when given the input " + - "'https://example.com/'" do - before do - @input = "https://example.com/" - end - - it "should heuristically parse to 'https://example.com/'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.to_s).to eq("https://example.com/") - end -end - -describe Addressable::URI, "when given the input " + - "'http:example.com/'" do - before do - @input = "http:example.com/" - end - - it "should heuristically parse to 'http://example.com/'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.to_s).to eq("http://example.com/") - end - - it "should heuristically parse to 'http://example.com/' " + - "even with a scheme hint of 'ftp'" do - @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'}) - expect(@uri.to_s).to eq("http://example.com/") - end -end - -describe Addressable::URI, "when given the input " + - "'https:example.com/'" do - before do - @input = "https:example.com/" - end - - it "should heuristically parse to 'https://example.com/'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.to_s).to eq("https://example.com/") - end - - it "should heuristically parse to 'https://example.com/' " + - "even with a scheme hint of 'ftp'" do - @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'}) - expect(@uri.to_s).to eq("https://example.com/") - end -end - -describe Addressable::URI, "when given the input " + - "'http://example.com/example.com/'" do - before do - @input = "http://example.com/example.com/" - end - - it "should heuristically parse to 'http://example.com/example.com/'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.to_s).to eq("http://example.com/example.com/") - end -end - -describe Addressable::URI, "when given the input " + - "'http://prefix\\.example.com/'" do - before do - @input = "http://prefix\\.example.com/" - end - - it "should heuristically parse to 'http://prefix/.example.com/'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.authority).to eq("prefix") - expect(@uri.to_s).to eq("http://prefix/.example.com/") - end - - it "should heuristically parse to 'http://prefix/.example.com/' " + - "even with a scheme hint of 'ftp'" do - @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'}) - expect(@uri.to_s).to eq("http://prefix/.example.com/") - end -end - -describe Addressable::URI, "when given the input " + - "'http://p:\\/'" do - before do - @input = "http://p:\\/" - end - - it "should heuristically parse to 'http://p//'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.authority).to eq("p") - expect(@uri.to_s).to eq("http://p//") - end - - it "should heuristically parse to 'http://p//' " + - "even with a scheme hint of 'ftp'" do - @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'}) - expect(@uri.to_s).to eq("http://p//") - end -end - -describe Addressable::URI, "when given the input " + - "'http://p://'" do - before do - @input = "http://p://" - end - - it "should heuristically parse to 'http://p//'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.authority).to eq("p") - expect(@uri.to_s).to eq("http://p//") - end - - it "should heuristically parse to 'http://p//' " + - "even with a scheme hint of 'ftp'" do - @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'}) - expect(@uri.to_s).to eq("http://p//") - end -end - -describe Addressable::URI, "when given the input " + - "'http://p://p'" do - before do - @input = "http://p://p" - end - - it "should heuristically parse to 'http://p//p'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.authority).to eq("p") - expect(@uri.to_s).to eq("http://p//p") - end - - it "should heuristically parse to 'http://p//p' " + - "even with a scheme hint of 'ftp'" do - @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'}) - expect(@uri.to_s).to eq("http://p//p") - end -end - -describe Addressable::URI, "when given the input " + - "'http://prefix .example.com/'" do - before do - @input = "http://prefix .example.com/" - end - - # Justification here being that no browser actually tries to resolve this. - # They all treat this as a web search. - it "should heuristically parse to 'http://prefix%20.example.com/'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.authority).to eq("prefix%20.example.com") - expect(@uri.to_s).to eq("http://prefix%20.example.com/") - end - - it "should heuristically parse to 'http://prefix%20.example.com/' " + - "even with a scheme hint of 'ftp'" do - @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'}) - expect(@uri.to_s).to eq("http://prefix%20.example.com/") - end -end - -describe Addressable::URI, "when given the input " + - "' http://www.example.com/ '" do - before do - @input = " http://www.example.com/ " - end - - it "should heuristically parse to 'http://prefix%20.example.com/'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.scheme).to eq("http") - expect(@uri.path).to eq("/") - expect(@uri.to_s).to eq("http://www.example.com/") - end -end - -describe Addressable::URI, "when given the input " + - "'http://prefix%2F.example.com/'" do - before do - @input = "http://prefix%2F.example.com/" - end - - it "should heuristically parse to 'http://prefix%2F.example.com/'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.authority).to eq("prefix%2F.example.com") - expect(@uri.to_s).to eq("http://prefix%2F.example.com/") - end - - it "should heuristically parse to 'http://prefix%2F.example.com/' " + - "even with a scheme hint of 'ftp'" do - @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'}) - expect(@uri.to_s).to eq("http://prefix%2F.example.com/") - end -end - -describe Addressable::URI, "when given the input " + - "'/path/to/resource'" do - before do - @input = "/path/to/resource" - end - - it "should heuristically parse to '/path/to/resource'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.to_s).to eq("/path/to/resource") - end -end - -describe Addressable::URI, "when given the input " + - "'relative/path/to/resource'" do - before do - @input = "relative/path/to/resource" - end - - it "should heuristically parse to 'relative/path/to/resource'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.to_s).to eq("relative/path/to/resource") - end -end - -describe Addressable::URI, "when given the input " + - "'example.com'" do - before do - @input = "example.com" - end - - it "should heuristically parse to 'http://example.com'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.to_s).to eq("http://example.com") - end -end - -describe Addressable::URI, "when given the input " + - "'example.com' and a scheme hint of 'ftp'" do - before do - @input = "example.com" - @hints = {:scheme => 'ftp'} - end - - it "should heuristically parse to 'http://example.com'" do - @uri = Addressable::URI.heuristic_parse(@input, @hints) - expect(@uri.to_s).to eq("ftp://example.com") - end -end - -describe Addressable::URI, "when given the input " + - "'example.com:21' and a scheme hint of 'ftp'" do - before do - @input = "example.com:21" - @hints = {:scheme => 'ftp'} - end - - it "should heuristically parse to 'http://example.com:21'" do - @uri = Addressable::URI.heuristic_parse(@input, @hints) - expect(@uri.to_s).to eq("ftp://example.com:21") - end -end - -describe Addressable::URI, "when given the input " + - "'example.com/path/to/resource'" do - before do - @input = "example.com/path/to/resource" - end - - it "should heuristically parse to 'http://example.com/path/to/resource'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.to_s).to eq("http://example.com/path/to/resource") - end -end - -describe Addressable::URI, "when given the input " + - "'http:///example.com'" do - before do - @input = "http:///example.com" - end - - it "should heuristically parse to 'http://example.com'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.to_s).to eq("http://example.com") - end -end - -describe Addressable::URI, "when given the input which "\ - "start with digits and has specified port" do - before do - @input = "7777.example.org:8089" - end - - it "should heuristically parse to 'http://7777.example.org:8089'" do - uri = Addressable::URI.heuristic_parse(@input) - expect(uri.to_s).to eq("http://7777.example.org:8089") - end -end - -describe Addressable::URI, "when given the input " + - "'feed:///example.com'" do - before do - @input = "feed:///example.com" - end - - it "should heuristically parse to 'feed://example.com'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.to_s).to eq("feed://example.com") - end -end - -describe Addressable::URI, "when given the input " + - "'file://localhost/path/to/resource/'" do - before do - @input = "file://localhost/path/to/resource/" - end - - it "should heuristically parse to 'file:///path/to/resource/'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.to_s).to eq("file:///path/to/resource/") - end -end - -describe Addressable::URI, "when given the input " + - "'file://path/to/resource/'" do - before do - @input = "file://path/to/resource/" - end - - it "should heuristically parse to 'file:///path/to/resource/'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.to_s).to eq("file:///path/to/resource/") - end -end - -describe Addressable::URI, "when given the input " + - "'file://///path/to/resource/'" do - before do - @input = "file:///////path/to/resource/" - end - - it "should heuristically parse to 'file:////path/to/resource/'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.to_s).to eq("file:////path/to/resource/") - end -end - -describe Addressable::URI, "when given the input " + - "'feed://http://example.com'" do - before do - @input = "feed://http://example.com" - end - - it "should heuristically parse to 'feed:http://example.com'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.to_s).to eq("feed:http://example.com") - end -end - -describe Addressable::URI, "when given the input " + - "::URI.parse('http://example.com')" do - before do - @input = ::URI.parse('http://example.com') - end - - it "should heuristically parse to 'http://example.com'" do - @uri = Addressable::URI.heuristic_parse(@input) - expect(@uri.to_s).to eq("http://example.com") - end -end - -describe Addressable::URI, "when given the input: 'user@domain.com'" do - before do - @input = "user@domain.com" - end - - context "for heuristic parse" do - it "should remain 'mailto:user@domain.com'" do - uri = Addressable::URI.heuristic_parse("mailto:#{@input}") - expect(uri.to_s).to eq("mailto:user@domain.com") - end - - it "should have a scheme of 'mailto'" do - uri = Addressable::URI.heuristic_parse(@input) - expect(uri.to_s).to eq("mailto:user@domain.com") - expect(uri.scheme).to eq("mailto") - end - - it "should remain 'acct:user@domain.com'" do - uri = Addressable::URI.heuristic_parse("acct:#{@input}") - expect(uri.to_s).to eq("acct:user@domain.com") - end - - context "HTTP" do - before do - @uri = Addressable::URI.heuristic_parse("http://#{@input}/") - end - - it "should remain 'http://user@domain.com/'" do - expect(@uri.to_s).to eq("http://user@domain.com/") - end - - it "should have the username 'user' for HTTP basic authentication" do - expect(@uri.user).to eq("user") - end - end - end -end - -describe Addressable::URI, "when assigning query values" do - before do - @uri = Addressable::URI.new - end - - it "should correctly assign {:a => 'a', :b => ['c', 'd', 'e']}" do - @uri.query_values = {:a => "a", :b => ["c", "d", "e"]} - expect(@uri.query).to eq("a=a&b=c&b=d&b=e") - end - - it "should raise an error attempting to assign {'a' => {'b' => ['c']}}" do - expect do - @uri.query_values = { 'a' => {'b' => ['c'] } } - end.to raise_error(TypeError) - end - - it "should raise an error attempting to assign " + - "{:b => '2', :a => {:c => '1'}}" do - expect do - @uri.query_values = {:b => '2', :a => {:c => '1'}} - end.to raise_error(TypeError) - end - - it "should raise an error attempting to assign " + - "{:a => 'a', :b => [{:c => 'c', :d => 'd'}, " + - "{:e => 'e', :f => 'f'}]}" do - expect do - @uri.query_values = { - :a => "a", :b => [{:c => "c", :d => "d"}, {:e => "e", :f => "f"}] - } - end.to raise_error(TypeError) - end - - it "should raise an error attempting to assign " + - "{:a => 'a', :b => [{:c => true, :d => 'd'}, " + - "{:e => 'e', :f => 'f'}]}" do - expect do - @uri.query_values = { - :a => 'a', :b => [{:c => true, :d => 'd'}, {:e => 'e', :f => 'f'}] - } - end.to raise_error(TypeError) - end - - it "should raise an error attempting to assign " + - "{:a => 'a', :b => {:c => true, :d => 'd'}}" do - expect do - @uri.query_values = { - :a => 'a', :b => {:c => true, :d => 'd'} - } - end.to raise_error(TypeError) - end - - it "should raise an error attempting to assign " + - "{:a => 'a', :b => {:c => true, :d => 'd'}}" do - expect do - @uri.query_values = { - :a => 'a', :b => {:c => true, :d => 'd'} - } - end.to raise_error(TypeError) - end - - it "should correctly assign {:a => 1, :b => 1.5}" do - @uri.query_values = { :a => 1, :b => 1.5 } - expect(@uri.query).to eq("a=1&b=1.5") - end - - it "should raise an error attempting to assign " + - "{:z => 1, :f => [2, {999.1 => [3,'4']}, ['h', 'i']], " + - ":a => {:b => ['c', 'd'], :e => true, :y => 0.5}}" do - expect do - @uri.query_values = { - :z => 1, - :f => [ 2, {999.1 => [3,'4']}, ['h', 'i'] ], - :a => { :b => ['c', 'd'], :e => true, :y => 0.5 } - } - end.to raise_error(TypeError) - end - - it "should correctly assign {}" do - @uri.query_values = {} - expect(@uri.query).to eq('') - end - - it "should correctly assign nil" do - @uri.query_values = nil - expect(@uri.query).to eq(nil) - end - - it "should correctly sort {'ab' => 'c', :ab => 'a', :a => 'x'}" do - @uri.query_values = {'ab' => 'c', :ab => 'a', :a => 'x'} - expect(@uri.query).to eq("a=x&ab=a&ab=c") - end - - it "should correctly assign " + - "[['b', 'c'], ['b', 'a'], ['a', 'a']]" do - # Order can be guaranteed in this format, so preserve it. - @uri.query_values = [['b', 'c'], ['b', 'a'], ['a', 'a']] - expect(@uri.query).to eq("b=c&b=a&a=a") - end - - it "should preserve query string order" do - query_string = (('a'..'z').to_a.reverse.map { |e| "#{e}=#{e}" }).join("&") - @uri.query = query_string - original_uri = @uri.to_s - @uri.query_values = @uri.query_values(Array) - expect(@uri.to_s).to eq(original_uri) - end - - describe 'when a hash with mixed types is assigned to query_values' do - it 'should not raise an error' do - skip 'Issue #94' - expect { subject.query_values = { "page" => "1", :page => 2 } }.to_not raise_error - end - end -end - -describe Addressable::URI, "when assigning path values" do - before do - @uri = Addressable::URI.new - end - - it "should correctly assign paths containing colons" do - @uri.path = "acct:bob@sporkmonger.com" - expect(@uri.path).to eq("acct:bob@sporkmonger.com") - expect(@uri.normalize.to_str).to eq("acct%2Fbob@sporkmonger.com") - expect { @uri.to_s }.to raise_error( - Addressable::URI::InvalidURIError - ) - end - - it "should correctly assign paths containing colons" do - @uri.path = "/acct:bob@sporkmonger.com" - @uri.authority = "example.com" - expect(@uri.normalize.to_str).to eq("//example.com/acct:bob@sporkmonger.com") - end - - it "should correctly assign paths containing colons" do - @uri.path = "acct:bob@sporkmonger.com" - @uri.scheme = "something" - expect(@uri.normalize.to_str).to eq("something:acct:bob@sporkmonger.com") - end - - it "should not allow relative paths to be assigned on absolute URIs" do - expect do - @uri.scheme = "http" - @uri.host = "example.com" - @uri.path = "acct:bob@sporkmonger.com" - end.to raise_error(Addressable::URI::InvalidURIError) - end - - it "should not allow relative paths to be assigned on absolute URIs" do - expect do - @uri.path = "acct:bob@sporkmonger.com" - @uri.scheme = "http" - @uri.host = "example.com" - end.to raise_error(Addressable::URI::InvalidURIError) - end - - it "should not allow relative paths to be assigned on absolute URIs" do - expect do - @uri.path = "uuid:0b3ecf60-3f93-11df-a9c3-001f5bfffe12" - @uri.scheme = "urn" - end.not_to raise_error - end -end - -describe Addressable::URI, "when initializing a subclass of Addressable::URI" do - before do - @uri = Class.new(Addressable::URI).new - end - - it "should have the same class after being parsed" do - expect(@uri.class).to eq(Addressable::URI.parse(@uri).class) - end - - it "should have the same class as its duplicate" do - expect(@uri.class).to eq(@uri.dup.class) - end - - it "should have the same class after being normalized" do - expect(@uri.class).to eq(@uri.normalize.class) - end - - it "should have the same class after being merged" do - expect(@uri.class).to eq(@uri.merge(:path => 'path').class) - end - - it "should have the same class after being joined" do - expect(@uri.class).to eq(@uri.join('path').class) - end -end - -describe Addressable::URI, "when initialized in a non-main `Ractor`" do - it "should have the same value as if used in the main `Ractor`" do - pending("Ruby 3.0+ for `Ractor` support") unless defined?(Ractor) - main = Addressable::URI.parse("http://example.com") - expect( - Ractor.new { Addressable::URI.parse("http://example.com") }.take - ).to eq(main) - end -end - -describe Addressable::URI, "when deferring validation" do - subject(:deferred) { uri.instance_variable_get(:@validation_deferred) } - - let(:uri) { Addressable::URI.parse("http://example.com") } - - it "defers validation within the block" do - uri.defer_validation do - expect(deferred).to be true - end - end - - it "always resets deferral afterward" do - expect { uri.defer_validation { raise "boom" } }.to raise_error("boom") - expect(deferred).to be false - end - - it "returns nil" do - res = uri.defer_validation {} - expect(res).to be nil - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/spec/spec_helper.rb b/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/spec/spec_helper.rb deleted file mode 100644 index bd8e395..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/spec/spec_helper.rb +++ /dev/null @@ -1,33 +0,0 @@ -# frozen_string_literal: true - -require 'bundler/setup' -require 'rspec/its' - -begin - require 'coveralls' - Coveralls.wear! do - add_filter "spec/" - add_filter "vendor/" - end -rescue LoadError - warn "warning: coveralls gem not found; skipping Coveralls" - require 'simplecov' - SimpleCov.start do - add_filter "spec/" - add_filter "vendor/" - end -end if Gem.loaded_specs.key?("simplecov") - -class TestHelper - def self.native_supported? - mri = RUBY_ENGINE == "ruby" - windows = RUBY_PLATFORM.include?("mingw") - - mri && !windows - end -end - -RSpec.configure do |config| - config.warnings = true - config.filter_run_when_matching :focus -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/tasks/clobber.rake b/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/tasks/clobber.rake deleted file mode 100644 index a9e32b3..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/tasks/clobber.rake +++ /dev/null @@ -1,4 +0,0 @@ -# frozen_string_literal: true - -desc "Remove all build products" -task "clobber" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/tasks/gem.rake b/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/tasks/gem.rake deleted file mode 100644 index 24d9714..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/tasks/gem.rake +++ /dev/null @@ -1,95 +0,0 @@ -# frozen_string_literal: true - -require "rubygems/package_task" - -namespace :gem do - GEM_SPEC = Gem::Specification.new do |s| - s.name = PKG_NAME - s.version = PKG_VERSION - s.summary = PKG_SUMMARY - s.description = PKG_DESCRIPTION - - s.files = PKG_FILES.to_a - - s.extra_rdoc_files = %w( README.md ) - s.rdoc_options.concat ["--main", "README.md"] - - if !s.respond_to?(:add_development_dependency) - puts "Cannot build Gem with this version of RubyGems." - exit(1) - end - - s.required_ruby_version = ">= 2.2" - - s.add_runtime_dependency "public_suffix", ">= 2.0.2", "< 6.0" - s.add_development_dependency "bundler", ">= 1.0", "< 3.0" - - s.require_path = "lib" - - s.author = "Bob Aman" - s.email = "bob@sporkmonger.com" - s.homepage = "https://github.com/sporkmonger/addressable" - s.license = "Apache-2.0" - s.metadata = { - "changelog_uri" => "https://github.com/sporkmonger/addressable/blob/main/CHANGELOG.md" - } - end - - Gem::PackageTask.new(GEM_SPEC) do |p| - p.gem_spec = GEM_SPEC - p.need_tar = true - p.need_zip = true - end - - desc "Generates .gemspec file" - task :gemspec do - spec_string = GEM_SPEC.to_ruby - File.open("#{GEM_SPEC.name}.gemspec", "w") do |file| - file.write spec_string - end - end - - desc "Show information about the gem" - task :debug do - puts GEM_SPEC.to_ruby - end - - desc "Install the gem" - task :install => ["clobber", "gem:package"] do - sh "#{SUDO} gem install --local pkg/#{GEM_SPEC.full_name}" - end - - desc "Uninstall the gem" - task :uninstall do - installed_list = Gem.source_index.find_name(PKG_NAME) - if installed_list && - (installed_list.collect { |s| s.version.to_s}.include?(PKG_VERSION)) - sh( - "#{SUDO} gem uninstall --version '#{PKG_VERSION}' " + - "--ignore-dependencies --executables #{PKG_NAME}" - ) - end - end - - desc "Reinstall the gem" - task :reinstall => [:uninstall, :install] - - desc "Package for release" - task :release => ["gem:package", "gem:gemspec"] do |t| - v = ENV["VERSION"] or abort "Must supply VERSION=x.y.z" - abort "Versions don't match #{v} vs #{PROJ.version}" if v != PKG_VERSION - pkg = "pkg/#{GEM_SPEC.full_name}" - - changelog = File.open("CHANGELOG.md") { |file| file.read } - - puts "Releasing #{PKG_NAME} v. #{PKG_VERSION}" - Rake::Task["git:tag:create"].invoke - end -end - -desc "Alias to gem:package" -task "gem" => "gem:package" - -task "gem:release" => "gem:gemspec" - -task "clobber" => ["gem:clobber_package"] diff --git a/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/tasks/git.rake b/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/tasks/git.rake deleted file mode 100644 index 1238c8d..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/tasks/git.rake +++ /dev/null @@ -1,47 +0,0 @@ -# frozen_string_literal: true - -namespace :git do - namespace :tag do - desc "List tags from the Git repository" - task :list do - tags = `git tag -l` - tags.gsub!("\r", "") - tags = tags.split("\n").sort {|a, b| b <=> a } - puts tags.join("\n") - end - - desc "Create a new tag in the Git repository" - task :create do - changelog = File.open("CHANGELOG.md", "r") { |file| file.read } - puts "-" * 80 - puts changelog - puts "-" * 80 - puts - - v = ENV["VERSION"] or abort "Must supply VERSION=x.y.z" - abort "Versions don't match #{v} vs #{PKG_VERSION}" if v != PKG_VERSION - - git_status = `git status` - if git_status !~ /^nothing to commit/ - abort "Working directory isn't clean." - end - - tag = "#{PKG_NAME}-#{PKG_VERSION}" - msg = "Release #{PKG_NAME}-#{PKG_VERSION}" - - existing_tags = `git tag -l #{PKG_NAME}-*`.split('\n') - if existing_tags.include?(tag) - warn("Tag already exists, deleting...") - unless system "git tag -d #{tag}" - abort "Tag deletion failed." - end - end - puts "Creating git tag '#{tag}'..." - unless system "git tag -a -m \"#{msg}\" #{tag}" - abort "Tag creation failed." - end - end - end -end - -task "gem:release" => "git:tag:create" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/tasks/metrics.rake b/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/tasks/metrics.rake deleted file mode 100644 index 107cc24..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/tasks/metrics.rake +++ /dev/null @@ -1,24 +0,0 @@ -# frozen_string_literal: true - -namespace :metrics do - task :lines do - lines, codelines, total_lines, total_codelines = 0, 0, 0, 0 - for file_name in FileList["lib/**/*.rb"] - f = File.open(file_name) - while line = f.gets - lines += 1 - next if line =~ /^\s*$/ - next if line =~ /^\s*#/ - codelines += 1 - end - puts "L: #{sprintf("%4d", lines)}, " + - "LOC #{sprintf("%4d", codelines)} | #{file_name}" - total_lines += lines - total_codelines += codelines - - lines, codelines = 0, 0 - end - - puts "Total: Lines #{total_lines}, LOC #{total_codelines}" - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/tasks/profile.rake b/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/tasks/profile.rake deleted file mode 100644 index b697d48..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/tasks/profile.rake +++ /dev/null @@ -1,72 +0,0 @@ -# frozen_string_literal: true - -namespace :profile do - desc "Profile Template match memory allocations" - task :template_match_memory do - require "memory_profiler" - require "addressable/template" - - start_at = Time.now.to_f - template = Addressable::Template.new("http://example.com/{?one,two,three}") - report = MemoryProfiler.report do - 30_000.times do - template.match( - "http://example.com/?one=one&two=floo&three=me" - ) - end - end - end_at = Time.now.to_f - print_options = { scale_bytes: true, normalize_paths: true } - puts "\n\n" - - if ENV["CI"] - report.pretty_print(print_options) - else - t_allocated = report.scale_bytes(report.total_allocated_memsize) - t_retained = report.scale_bytes(report.total_retained_memsize) - - puts "Total allocated: #{t_allocated} (#{report.total_allocated} objects)" - puts "Total retained: #{t_retained} (#{report.total_retained} objects)" - puts "Took #{end_at - start_at} seconds" - - FileUtils.mkdir_p("tmp") - report.pretty_print(to_file: "tmp/memprof.txt", **print_options) - end - end - - desc "Profile URI parse memory allocations" - task :memory do - require "memory_profiler" - require "addressable/uri" - if ENV["IDNA_MODE"] == "pure" - Addressable.send(:remove_const, :IDNA) - load "addressable/idna/pure.rb" - end - - start_at = Time.now.to_f - report = MemoryProfiler.report do - 30_000.times do - Addressable::URI.parse( - "http://google.com/stuff/../?with_lots=of¶ms=asdff#!stuff" - ).normalize - end - end - end_at = Time.now.to_f - print_options = { scale_bytes: true, normalize_paths: true } - puts "\n\n" - - if ENV["CI"] - report.pretty_print(**print_options) - else - t_allocated = report.scale_bytes(report.total_allocated_memsize) - t_retained = report.scale_bytes(report.total_retained_memsize) - - puts "Total allocated: #{t_allocated} (#{report.total_allocated} objects)" - puts "Total retained: #{t_retained} (#{report.total_retained} objects)" - puts "Took #{end_at - start_at} seconds" - - FileUtils.mkdir_p("tmp") - report.pretty_print(to_file: "tmp/memprof.txt", **print_options) - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/tasks/rspec.rake b/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/tasks/rspec.rake deleted file mode 100644 index e3d9f01..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/tasks/rspec.rake +++ /dev/null @@ -1,23 +0,0 @@ -# frozen_string_literal: true - -require "rspec/core/rake_task" - -namespace :spec do - RSpec::Core::RakeTask.new(:simplecov) do |t| - t.pattern = FileList['spec/**/*_spec.rb'] - t.rspec_opts = %w[--color --format documentation] unless ENV["CI"] - end - - namespace :simplecov do - desc "Browse the code coverage report." - task :browse => "spec:simplecov" do - require "launchy" - Launchy.open("coverage/index.html") - end - end -end - -desc "Alias to spec:simplecov" -task "spec" => "spec:simplecov" - -task "clobber" => ["spec:clobber_simplecov"] diff --git a/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/tasks/yard.rake b/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/tasks/yard.rake deleted file mode 100644 index 515f960..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/addressable-2.8.4/tasks/yard.rake +++ /dev/null @@ -1,29 +0,0 @@ -# frozen_string_literal: true - -require "rake" - -begin - require "yard" - require "yard/rake/yardoc_task" - - namespace :doc do - desc "Generate Yardoc documentation" - YARD::Rake::YardocTask.new do |yardoc| - yardoc.name = "yard" - yardoc.options = ["--verbose", "--markup", "markdown"] - yardoc.files = FileList[ - "lib/**/*.rb", "ext/**/*.c", - "README.md", "CHANGELOG.md", "LICENSE.txt" - ].exclude(/idna/) - end - end - - task "clobber" => ["doc:clobber_yard"] - - desc "Alias to doc:yard" - task "doc" => "doc:yard" -rescue LoadError - # If yard isn't available, it's not the end of the world - desc "Alias to doc:rdoc" - task "doc" => "doc:rdoc" -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/.rspec b/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/.rspec deleted file mode 100644 index 397921f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/.rspec +++ /dev/null @@ -1,2 +0,0 @@ ---color ---format d diff --git a/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/.travis.yml b/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/.travis.yml deleted file mode 100644 index 4c090ba..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/.travis.yml +++ /dev/null @@ -1,33 +0,0 @@ -language: ruby - -branches: - only: - - master - -rvm: -- 1.9.3 -- 2.0 -- 2.1 -- 2.2 -- 2.3 -- 2.4 -- 2.5 -- jruby -- rbx-3 - -matrix: - allow_failures: - - rvm: rbx-3 - - rvm: jruby - include: - - rvm: 1.8.7 - dist: precise - - -cache: bundler - -before_script: - - wget https://alg.li/algolia-keys && chmod +x algolia-keys - -script: - - if [ "$TRAVIS_PULL_REQUEST" != "false" ] && [[ ! "$TRAVIS_PULL_REQUEST_SLUG" =~ ^algolia\/ ]]; then eval $(./algolia-keys export) && bundle exec rspec --tag ~maintainers_only; else bundle exec rspec; fi diff --git a/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/CHANGELOG.md b/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/CHANGELOG.md deleted file mode 100755 index 26969f8..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/CHANGELOG.md +++ /dev/null @@ -1,454 +0,0 @@ -# ChangeLog - -## Unreleased - -## [1.27.4](https://github.com/algolia/algoliasearch-client-ruby/compare/1.27.3...1.27.4) (2020-09-16) - -**Fixed** - -* Retrieve all objects when using `copy_index` from `AccountClient` class ([399](https://github.com/algolia/algoliasearch-client-ruby/pull/399)) - -## [1.27.3](https://github.com/algolia/algoliasearch-client-ruby/compare/1.27.2...1.27.3) (2020-06-03) - -**Fixed** - -* Replace expired certificate within embedded certificate chain ([9087dd1](https://github.com/algolia/algoliasearch-client-ruby/commit/9087dd14a97bf77c9391a3360c4803edf686086d)) - -## [1.27.2](https://github.com/algolia/algoliasearch-client-ruby/compare/1.27.1...1.27.2) (2020-04-28) - -**Fixed** - -* In `search_user_id`, retrieve param `cluster` instead of `clusterName`. [368](https://github.com/algolia/algoliasearch-client-ruby/issues/368) - -## [1.27.1](https://github.com/algolia/algoliasearch-client-ruby/compare/1.27.0...1.27.1) (2019-09-26) - -**Fixed** - -* Update `Algolia::Index.exists` method to `Algolia::Index.exists?`. [364](https://github.com/algolia/algoliasearch-client-ruby/issues/364) - -## [1.27.0](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.27.0) (2019-09-16) - -**Added** - -* Introduce `Algolia::Index.exists` method. [358](https://github.com/algolia/algoliasearch-client-ruby/issues/358) - - Check whether an index exists or not. - -* Introduce `Algolia::Index.find_object` method. [359](https://github.com/algolia/algoliasearch-client-ruby/issues/359) - - Find object by the given condition. - -* Introduce `Algolia::Index.get_object_position` method. [359](https://github.com/algolia/algoliasearch-client-ruby/issues/359) - - Retrieve the given object position in a set of results. - -* Introduce `Algolia.get_secured_api_key_remaining_validity` method. [361](https://github.com/algolia/algoliasearch-client-ruby/issues/361) - - Returns the remaining validity time for the given API key in seconds. - - -## [1.26.1](https://github.com/algolia/algoliasearch-client-ruby/compare/1.26.0...1.26.1) (2019-07-31) - -### Chore - -- stop using coveralls because of a GPL-licensed transitive dep ([d2fbe8c](https://github.com/algolia/algoliasearch-client-ruby/commit/d2fbe8c)) - - -[1.26.0](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.26.0) (2019-02-12) - -**Added** - -* Introduce `Algolia.restore_api_key` method. - - If you delete your API key by mistake, you can now restore it via - this new method. This especially useful if this key is used in a - mobile app or somewhere you can't update easily. - - -## [1.25.2](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.25.2) (2018-12-19) - -## [1.25.1](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.25.1) (2018-12-19) - -**Fixed** - -* Missing `insights.rb` in gemspec - [7d2f3ab](https://github.com/algolia/algoliasearch-client-ruby/commit/7d2f3abe6e4338f0f7364f6f52ac1d371f066464) - -## [1.25.0](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.25.0) (2018-12-19) - -**Added** - -* Introduce Insights client to send events to Algolia Insights API - [326](https://github.com/algolia/algoliasearch-client-ruby/issues/326) - -* Add `multiple_get_objects` to retrieve objects by objectID across multiple indices - [329](https://github.com/algolia/algoliasearch-client-ruby/issues/329) - -**Modified** - -* Use the correct `hitsPerPage` key when exporting index resources - [319](https://github.com/algolia/algoliasearch-client-ruby/issues/319) - -## [1.24.0](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.24.0) (2018-11-28) - -* Feat(adds-account-client-copy-index): adds `copy_index` to account client ([#324](https://github.com/algolia/algoliasearch-client-ruby/pull/324)) -* Feat(replace-all-methods): adds `replace_all_rules`, `replace_all_objects` and `replace_all_synonyms` to search index ([#323](https://github.com/algolia/algoliasearch-client-ruby/pull/323)) -* Feat(scoped-copy-methods): adds `copy_settings`, `copy_synonyms` and `copy_rules` to search client ([#322](https://github.com/algolia/algoliasearch-client-ruby/pull/322)) - -## [1.23.2](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.23.2) (2018-06-19) - -* Fix(analytics): gem without new analytics class (#306) - -## [1.23.0](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.23.0) (2018-06-19) - -* Feat(analytics): introduce new analytics class -* Chore(rake): use unshift to keep compat with older ruby versions -* Ruby version must be after client version in ua -* Fix ua tests with new format -* Rewrite ua -* Feat(ua): add ruby version -* Fix(syntax): this isn't php -* Tests(mcm): use unique userid everytime -* Tests(mcm): introduce auto_retry for more stable tests -* Feat(client): expose waittask in the client (#302) -* Fix(travis): always test on the latest patches (#295) - -## [1.22.0](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.22.0) (2018-05-30) - -* Rename license file (#297) -* Fix release task (#294) -* Introduce multi cluster management (#285) -* Fix(browse): ensure cursor is passed in the body (#288) -* Chore(md): update contribution-related files (#293) - -## [1.21.0](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.21.0) (2018-05-24) - -* Fix(tests): fix warning for unspecified exception (#287) -* Fix release task missing github link (#291) -* Api review (#292) - -## [1.20.1](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.20.1) (2018-05-15) - -* Fix changelog link in gemspec (#290) -* Utils: move to changelog.md and add rake task for release (#289) - -## [1.20.0](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.20.0) (2018-05-07) - -* Feat: deprecate api keys methods on index in favor of client ones (#286) -* Chore(gemfile): remove useless dependencies (#280) -* Fix(env): adding default env var (#279) -* Chore(travis): test against Rubinius 3 (#281) -* Fix: prevent saving a rule with an empty `objectID` (#283) - -## [1.19.2](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.19.2) (2018-04-03) - -* Fix `Algolia.delete_index` wrong number of arguments (#277) - -## [1.19.1](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.19.1) (2017-12-18) - -* Fix hard dependency on `hashdiff` (#262) - -## [1.19.0](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.19.0) (2017-12-15) - -* Add request options to any method using API calls (#213) -* Add `export_synonyms` index method (#260) -* Add `export_rules` index method (#261) - -## [1.18.5](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.18.5) (2017-12-07) - -* Fix missing requirement - -## [1.18.4](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.18.4) (2017-12-06) - -* Remove remaining unnecessary requirements (#256) -* Remove Gemfile.lock (#257) - -## [1.18.3](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.18.3) (2017-12-04) - -* Remove Bundler and RubyGems requirements (#253) - -## [1.18.2](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.18.2) (2017-11-28) - -* Add (undocumented) gzip option to disable gzip (#240) - -## [1.18.1](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.18.1) (2017-11-15) - -* Fix `get_logs` always returning type `all` (#244) -* New scopes to `copy_index` method (#243) - -## [1.18.0](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.18.0) (2017-11-02) - -* Allow to reuse the webmocks using `Algolia::WebMock.mock!` (#256) - -## [1.17.0](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.17.0) (2017-10-10) - -* New `delete_by` method - -## [1.16.0](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.16.0) (2017-09-14) - -* New Query Rules API - -## [1.15.1](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.15.1) (2017-08-17) - -* Fixed regression introduced in 1.15.0 - -## [1.15.0](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.15.0) (2017-08-17) - -* Make `delete_by_query` not `wait_task` by default (also, make it mockable) -* Add a new `delete_by_query!` doing the last `wait_task` - -## [1.14.0](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.14.0) (2017-07-31) - -* Ability to override the underlying user-agent - -## [1.13.0](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.13.0) (2017-03-17) - -* Add a `index.get_task_status(taskID)` method (#199) - -## [1.12.7](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.12.7) (2017-03-01) - -* Renamed all `*_user_key` methods to `*_api_key` - -## [1.12.6](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.12.6) (2017-01-25) - -* Upgraded `httpclient` to 2.8.3 - -## [1.12.5](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.12.5) (2016-12-07) - -* Fixed retry strategy not keeping the `current_host` first (#163) - -## [1.12.4](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.12.4) (2016-12-07) - -* Fix DNS tests - -## [1.12.3](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.12.3) (2016-12-06) - -* Allow for multiple clients on different app ids on the same thread - -## [1.12.2](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.12.2) (2016-12-05) - -* Fix client scoped methods - -## [1.12.1](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.12.1) (2016-11-25) - -* Rename `search_facet` to `search_for_facet_values` - -## [1.12.0](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.12.0) (2016-10-31) - -* Add `search_facet` - -## [1.11.0](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.11.0) (2016-08-21) - -* Upgraded to httpclient 2.8.1 to avoid reseting the keep-alive while changing timeouts - -## [1.10.0](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.10.0) (2016-07-11) - -* `{get,set}_settings` now take optional custom query parameters - -## [1.9.0](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.9.0) (2016-06-17) - -* New synonyms API - -## [1.8.1](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.8.1) (2016-04-14) - -* Ensure we're using an absolute path for the `ca-bundle.crt` file (could fix some `OpenSSL::X509::StoreError: system lib` errors) - -## [1.8.0](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.8.0) (2016-04-06) - -* Upgraded to `httpclient` 2.7.1 (includes ruby 2.3.0 deprecation fixes) -* Upgraded WebMock URLs - -## [1.7.0](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.7.0) (2016-01-09) - -* New `generate_secured_api_key` embedding the filters in the resulting key - -## [1.6.1](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.6.1) (2015-08-01) - -* Search queries are now using POST requests - -## [1.6.0](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.6.0) (2015-07-19) - -* Ability to instantiate multiple API clients in the same process (was using a class variable before). - -## [1.5.1](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.5.1) (2015-07-14) - -* Ability to retrieve a single page from a cursor with `browse_from` - -## [1.5.0](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.5.0) (2015-06-05) - -* New cursor-based `browse()` implementation taking query parameters - -## [1.4.3](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.4.3) (2015-05-27) - -* Do not call `WebMock.disable!` in the helper - -## [1.4.2](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.4,2) (2015-05-04) - -* Add new methods to add/update api key -* Add batch method to target multiple indices -* Add strategy parameter for the multipleQueries -* Add new method to generate secured api key from query parameters - -## [1.4.1](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.4.1) (2015-04-10) - -* Force the default connect/read/write/search/batch timeouts to Algolia-specific values - -## [1.4.0](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.4.0) (2015-03-17) - -* High-available DNS: search queries are now targeting `APPID-DSN.algolia.net` first, then the main cluster using NSOne, then the main cluster using Route53. -* High-available DNS: Indexing queries are targeting `APPID.algolia.net` first, then the main cluster using NSOne, then the main cluster using Route53. - -## [1.3.1](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.3.1) (2014-11-29) - -* Fixed wrong deployed version (1.3.0 was based on 1.2.13 instead of 1.2.14) - -## [1.3.0](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.3.0) (2014-11-29) - -* Use `algolia.net` domain instead of `algolia.io` - -## [1.2.14](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.2.14) (2014-11-10) - -* Force the underlying `httpclient` dependency to be >= 2.4 in the gemspec as well -* Ability to force the SSL version - -## [1.2.13](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.2.13) (2014-10-22) - -* Fix the loop on hosts to retry when the http code is different than 200, 201, 400, 403, 404 - -## [1.2.12](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.2.12) (2014-10-08) - -* Upgrade to `httpclient` 2.4 -* Do not reset the timeout on each requests - -## [1.2.11](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.2.11) (2014-09-14) - -* Ability to update API keys - -## [1.2.10](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.2.10) (2014-08-22) - -* Using Digest to remove "Digest::Digest is deprecated; Use Digest" warning (author: @dglancy) - -## [1.2.9](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.2.9) (2014-07-10) - -* Expose `connect_timeout`, `receive_timeout` and `send_timeout` -* Add new `delete_by_query` method to delete all objects matching a specific query -* Add new `get_objects` method to retrieve a list of objects from a single API call -* Add a helper to perform disjunctive faceting - -## [1.2.8](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.2.8) (2014-03-27) - -* Catch all exceptions before retrying with another host - -## [1.2.7](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.2.7) (2014-03-24) - -* Ruby 1.8 compatibility - -## [1.2.6](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.2.6) (2014-03-19) - -* Raise an exception if no `APPLICATION_ID` is provided -* Ability to get last API call errors -* Ability to send multiple queries using a single API call -* Secured API keys generation is now based on secured HMAC-SHA256 - -## [1.2.5](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.2.5) (2014-02-24) - -* Ability to generate secured API key from a list of tags + optional `user_token` -* Ability to specify a list of indexes targeted by the user key - -## [1.2.4](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.2.4) (2014-02-21) - -* Add `delete_objects` - -## [1.2.3](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.2.3) (2014-02-10) - -* `add_object`: POST request if `objectID` is `nil` OR `empty` - -## [1.2.2](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.2.2) (2014-01-11) - -* Expose `batch` requests - -## [1.2.1](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.2.1) (2014-01-07) - -* Removed `jeweler` since it doesn't support platform specific deps (see https://github.com/technicalpickles/jeweler/issues/170) - -## [1.2.0](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.2.0) (2014-01-07) - -* Removed `curb` dependency and switched on `httpclient` to avoid fork-safety issue (see issue #5) - -## [1.1.18](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.1.18) (2014-01-06) - -* Fixed batch request builder (broken since last refactoring) - -## [1.1.17](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.1.17) (2014-01-02) - -* Ability to use IP rate limit behind a proxy forwarding the end-user's IP -* Add documentation for the new `attributeForDistinct` setting and `distinct` search parameter - -## [1.1.16](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.1.16) (2013-12-16) - -* Add arguments type-checking -* Normalize save_object/partial_update/add_object signatures -* Force dependencies versions - -## [1.1.15](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.1.15) (2013-12-16) - -* Embed ca-bundle.crt - -## [1.1.14](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.1.14) (2013-12-11) - -* Added `index.add_user_key(acls, validity, rate_limit, maxApiCalls)`` - -## [1.1.13](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.1.13) (2013-12-10) - -* WebMock integration - -## [1.1.12](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.1.12) (2013-12-05) - -* Add `browse` command - -## [1.1.11](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.1.11) (2013-11-29) - -* Remove rubysl (rbx required dependencies) - -## [1.1.10](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.1.10) (2013-11-29) - -* Fixed gzip handling bug - -## [1.1.9](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.1.9) (2013-11-28) - -* Added gzip support - -## [1.1.8](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.1.8) (2013-11-26) - -* Add `partial_update_objects` method - -## [1.1.7](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.1.7) (2013-11-08) - -* Search params: encode array-based parameters (`tagFilters`, `facetFilters`, ...) - -## [1.1.6](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.1.6) (2013-11-07) - -* Index: `clear` and `clear!` methods can now be used the delete the whole content of an index -* User keys: plug new `maxQueriesPerIPPerHour` and `maxHitsPerQuery` parameters - -## [1.1.5](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.1.5) (2013-10-17) - -* Version is now part of the user-agent - -## [1.1.4](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.1.4) (2013-10-17) - -* Fixed `wait_task` not sleeping at all - -## [1.1.3](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.1.3) (2013-10-15) - -* Fixed thread-safety issues -* Curl sessions are now thread-local - -## [1.1.2](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.1.2) (2013-10-02) - -* Fixed instance/class method conflict - -## [1.1.1](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.1.1) (2013-10-01) - -* Updated documentation -* Plug copy/move index - -## [1.1.0](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.1.0) (2013-09-17) - -* Initial import diff --git a/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/Gemfile b/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/Gemfile deleted file mode 100644 index e05662e..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/Gemfile +++ /dev/null @@ -1,28 +0,0 @@ -source 'https://rubygems.org' - -git_source(:github) { |repo_name| "https://github.com/#{repo_name}" } - -# Load algoliasearch.gemspec dependencies -gemspec - -# See https://github.com/algolia/algoliasearch-client-ruby/pull/257/files/36bcd0b1c4d05776dcbdb362c15a609c81f41cde -if Gem::Version.new(RUBY_VERSION) <= Gem::Version.new('1.9.3') - gem 'hashdiff', '< 0.3.6' # Hashdiff 0.3.6 no longer supports Ruby 1.8 - gem 'highline', '< 1.7.0' - gem 'mime-types', '< 2.0' - gem 'rubysl', '~> 2.0', :platform => :rbx -else - gem 'rubysl', '~> 2.2', :platform => :rbx -end - -group :development do - gem 'rake' - gem 'rdoc' - gem 'travis' -end - -group :test do - gem 'rspec', '>= 2.5.0' - gem 'webmock' - gem 'simplecov' -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/Gemfile.lock b/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/Gemfile.lock deleted file mode 100644 index 998dc7c..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/Gemfile.lock +++ /dev/null @@ -1,99 +0,0 @@ -PATH - remote: . - specs: - algoliasearch (1.27.4) - httpclient (~> 2.8, >= 2.8.3) - json (>= 1.5.1) - -GEM - remote: https://rubygems.org/ - specs: - addressable (2.7.0) - public_suffix (>= 2.0.2, < 5.0) - backports (3.18.2) - connection_pool (2.2.3) - crack (0.4.3) - safe_yaml (~> 1.0.0) - diff-lcs (1.4.4) - docile (1.3.2) - ethon (0.12.0) - ffi (>= 1.3.0) - faraday (0.17.3) - multipart-post (>= 1.2, < 3) - faraday_middleware (0.14.0) - faraday (>= 0.7.4, < 1.0) - ffi (1.13.1) - gh (0.14.0) - addressable - backports - faraday (~> 0.8) - multi_json (~> 1.0) - net-http-persistent (>= 2.7) - net-http-pipeline - hashdiff (1.0.1) - highline (1.7.10) - httpclient (2.8.3) - json (2.3.1) - launchy (2.5.0) - addressable (~> 2.7) - multi_json (1.15.0) - multipart-post (2.1.1) - net-http-persistent (4.0.0) - connection_pool (~> 2.2) - net-http-pipeline (1.0.1) - public_suffix (4.0.6) - pusher-client (0.6.2) - json - websocket (~> 1.0) - rake (13.0.1) - rdoc (6.2.1) - rspec (3.9.0) - rspec-core (~> 3.9.0) - rspec-expectations (~> 3.9.0) - rspec-mocks (~> 3.9.0) - rspec-core (3.9.2) - rspec-support (~> 3.9.3) - rspec-expectations (3.9.2) - diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.9.0) - rspec-mocks (3.9.1) - diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.9.0) - rspec-support (3.9.3) - safe_yaml (1.0.5) - simplecov (0.19.0) - docile (~> 1.1) - simplecov-html (~> 0.11) - simplecov-html (0.12.2) - travis (1.8.13) - backports - faraday (~> 0.9) - faraday_middleware (~> 0.9, >= 0.9.1) - gh (~> 0.13) - highline (~> 1.6) - launchy (~> 2.1) - pusher-client (~> 0.4) - typhoeus (~> 0.6, >= 0.6.8) - typhoeus (0.8.0) - ethon (>= 0.8.0) - webmock (3.8.3) - addressable (>= 2.3.6) - crack (>= 0.3.2) - hashdiff (>= 0.4.0, < 2.0.0) - websocket (1.2.8) - -PLATFORMS - ruby - -DEPENDENCIES - algoliasearch! - rake - rdoc - rspec (>= 2.5.0) - rubysl (~> 2.2) - simplecov - travis - webmock - -BUNDLED WITH - 1.17.2 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/LICENSE b/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/LICENSE deleted file mode 100644 index fddf416..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2013-Present Algolia - -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/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/README.md b/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/README.md deleted file mode 100644 index a19b944..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/README.md +++ /dev/null @@ -1,61 +0,0 @@ -

    - - Algolia for Ruby - - -

    The perfect starting point to integrate Algolia within your Ruby project

    - -

    - Build Status - Gem Version - License -

    -

    - -

    - Documentation • - Rails • - Community Forum • - Stack Overflow • - Report a bug • - FAQ • - Support -

    - -## ✨ Features - -- Thin & minimal low-level HTTP client to interact with Algolia's API -- Supports Ruby `^1.8.7`. - -## 💡 Getting Started - -First, install Algolia Ruby API Client via the [RubyGems](https://rubygems.org/) package manager: -```bash -gem install algoliasearch -``` - -Then, create objects on your index: - - -```ruby -Algolia.init(application_id: 'YourApplicationID', - api_key: 'YourAPIKey') -index = Algolia::Index.new('your_index_name') - -index.save_objects([objectID: 1, name: 'Foo']) -``` - -Finally, you may begin searching a object using the `search` method: -```ruby -objects = index.search('Fo') -``` - -For full documentation, visit the **[Algolia Ruby API Client](https://www.algolia.com/doc/api-client/getting-started/install/ruby/)**. - -## ❓ Troubleshooting - -Encountering an issue? Before reaching out to support, we recommend heading to our [FAQ](https://www.algolia.com/doc/api-client/troubleshooting/faq/ruby/) where you will find answers for the most common issues and gotchas with the client. - -## 📄 License - -Algolia Ruby API Client is an open-sourced software licensed under the [MIT license](LICENSE.md). diff --git a/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/Rakefile b/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/Rakefile deleted file mode 100644 index b328a8b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/Rakefile +++ /dev/null @@ -1,111 +0,0 @@ -# encoding: utf-8 - -require 'bundler/gem_tasks' - -begin - Bundler.setup(:default, :development) -rescue Bundler::BundlerError => e - $stderr.puts e.message - $stderr.puts "Run `bundle install` to install missing gems" - exit e.status_code -end -require 'rake' - -require File.expand_path('../lib/algolia/version', __FILE__) - -require 'rake/testtask' -Rake::TestTask.new(:test) do |test| - test.libs << 'lib' << 'test' - test.pattern = 'test/**/test_*.rb' - test.verbose = true -end - -require 'rdoc/task' -Rake::RDocTask.new do |rdoc| - version = Algolia::VERSION - rdoc.rdoc_dir = 'rdoc' - rdoc.title = "algoliasearch #{version}" - rdoc.rdoc_files.include('README*') - rdoc.rdoc_files.include('lib/**/*.rb') -end - -require 'rspec/core/rake_task' -RSpec::Core::RakeTask.new(:spec) - -task :default => :spec - -namespace :algolia do - GEM_VERSION_FILE = File.expand_path('../lib/algolia/version.rb', __FILE__) - GIT_TAG_URL = 'https://github.com/algolia/algoliasearch-client-ruby/releases/tag/' - - def last_commit_date - `git log -1 --date=short --format=%cd`.chomp - end - - def latest_tag - `git describe --tags --abbrev=0`.chomp - end - - def changelog(git_start = latest_tag(), git_end = 'HEAD', format = '%s') - `git log --no-decorate --no-merges --pretty=format:#{format} #{git_start}..#{git_end}` - end - - desc 'Write latest changes to CHANGELOG.md' - task :changelog, [:version] do |t, args| - # Filters-out commits containing some keywords and adds header - exceptions_regexp = Regexp.union(['README']) - title = "## [%s](%s%s) (%s)\n\n" % [args[:version], GIT_TAG_URL, args[:version], last_commit_date] - changes = changelog.each_line - .map { |line| (exceptions_regexp === line) ? nil : "* #{line.capitalize}" } - .unshift(title) - .append("\n\n") - .join - - puts changes - puts "\n\e[31mDo you want to update the CHANGELOG.md with the text above? [y/N]\e[0m" - exit if STDIN.gets.chomp.downcase != 'y' - - # Rewrite CHANGELOG.md - old_changes = File.readlines('CHANGELOG.md', 'r').join - File.open('CHANGELOG.md', 'w') { |file| file.write(changes, old_changes) } - - puts 'CHANGELOG.md successfully updated' - end - - desc 'Bump gem version' - task :semver, [:version] do |t, args| - - File.open(GEM_VERSION_FILE, 'w') do |file| - file.write <<~SEMVER - module Algolia - VERSION = "#{args[:version]}" - end - SEMVER - end - - # This force to reload the file with the newest version. - # Hence, `gemspec.version` invoked by Bundler later on will be correct. - load GEM_VERSION_FILE - - puts "Bumped gem version from #{latest_tag} to #{args[:version]}" - end - - desc 'Release a new version of this gem' - task :release, [:version] => [:changelog, :semver] do |t, args| - `git add #{File.expand_path('../lib/algolia/version.rb', __FILE__)} CHANGELOG.md` - `git commit -m "Bump to version #{args[:version]}"` - - # Invoke Bundler :release task - # https://github.com/bundler/bundler/blob/master/lib/bundler/gem_helper.rb - # - Rake::Task[:release].invoke - end -end - -module Bundler - class GemHelper - def version_tag - "#{version}" - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/algoliasearch.gemspec b/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/algoliasearch.gemspec deleted file mode 100644 index eeb620c..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/algoliasearch.gemspec +++ /dev/null @@ -1,86 +0,0 @@ -# -*- encoding: utf-8 -*- - -require 'date' -require File.join(File.dirname(__FILE__), 'lib', 'algolia', 'version') - -Gem::Specification.new do |s| - s.name = "algoliasearch" - s.version = Algolia::VERSION - s.authors = ["Algolia"] - s.email = "contact@algolia.com" - - s.date = Date.today - s.licenses = ["MIT"] - s.summary = "A simple Ruby client for the algolia.com REST API" - s.description = "A simple Ruby client for the algolia.com REST API" - s.homepage = "https://github.com/algolia/algoliasearch-client-ruby" - - s.metadata = { - "bug_tracker_uri" => "https://github.com/algolia/algoliasearch-client-ruby/issues", - "changelog_uri" => "https://github.com/algolia/algoliasearch-client-ruby/blob/master/CHANGELOG.md", - "documentation_uri" => "http://www.rubydoc.info/gems/algoliasearch", - "homepage_uri" => "https://www.algolia.com/doc/api-client/ruby/getting-started/", - "source_code_uri" => "https://github.com/algolia/algoliasearch-client-ruby" - } - - s.post_install_message = "A new major version is available for Algolia! Please now use the https://rubygems.org/gems/algolia gem to get the latest features." - - s.require_paths = ["lib"] - s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= - - s.extra_rdoc_files = [ - "CHANGELOG.md", - "LICENSE", - "README.md" - ] - s.files = [ - ".rspec", - ".travis.yml", - "CHANGELOG.md", - "Gemfile", - "Gemfile.lock", - "LICENSE", - "README.md", - "Rakefile", - "algoliasearch.gemspec", - "contacts.json", - "lib/algolia/analytics.rb", - "lib/algolia/account_client.rb", - "lib/algolia/client.rb", - "lib/algolia/error.rb", - "lib/algolia/index.rb", - "lib/algolia/insights.rb", - "lib/algolia/protocol.rb", - "lib/algolia/version.rb", - "lib/algolia/webmock.rb", - "lib/algoliasearch.rb", - "resources/ca-bundle.crt", - "spec/account_client_spec.rb", - "spec/client_spec.rb", - "spec/mock_spec.rb", - "spec/spec_helper.rb", - "spec/stub_spec.rb" - ] - - if s.respond_to? :specification_version then - s.specification_version = 4 - - if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then - if defined?(RUBY_VERSION) && RUBY_VERSION < '2.0' - s.add_runtime_dependency 'json', '>= 1.5.1', '< 2.3' - else - s.add_runtime_dependency 'json', '>= 1.5.1' - end - s.add_runtime_dependency 'httpclient', '~> 2.8', '>= 2.8.3' - s.add_development_dependency 'travis', '~> 0' - s.add_development_dependency 'rake', '~> 0' - s.add_development_dependency 'rdoc', '~> 0' - else - s.add_dependency 'httpclient', '~> 2.8', '>= 2.8.3' - s.add_dependency 'json', '>= 1.5.1', '< 2.3' - end - else - s.add_dependency 'httpclient', '~> 2.8', '>= 2.8.3' - s.add_dependency 'json', '>= 1.5.1', '< 2.3' - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/contacts.json b/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/contacts.json deleted file mode 100644 index 8ba54fa..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/contacts.json +++ /dev/null @@ -1,7504 +0,0 @@ -[ - { - "firstname": "Essie", - "lastname": "Vaill", - "company": "Litronic Industries", - "address": "14225 Hancock Dr", - "city": "Anchorage", - "county": "Anchorage", - "state": "AK", - "zip": "99515", - "phone": "907-345-0962", - "fax": "907-345-1215", - "email": "essie@vaill.com", - "web": "http://www.essievaill.com", - "followers": 3574 - }, - { - "firstname": "Cruz", - "lastname": "Roudabush", - "company": "Meridian Products", - "address": "2202 S Central Ave", - "city": "Phoenix", - "county": "Maricopa", - "state": "AZ", - "zip": "85004", - "phone": "602-252-4827", - "fax": "602-252-4009", - "email": "cruz@roudabush.com", - "web": "http://www.cruzroudabush.com", - "followers": 6548 - }, - { - "firstname": "Billie", - "lastname": "Tinnes", - "company": "D & M Plywood Inc", - "address": "28 W 27th St", - "city": "New York", - "county": "New York", - "state": "NY", - "zip": "10001", - "phone": "212-889-5775", - "fax": "212-889-5764", - "email": "billie@tinnes.com", - "web": "http://www.billietinnes.com", - "followers": 3536 - }, - { - "firstname": "Zackary", - "lastname": "Mockus", - "company": "Metropolitan Elevator Co", - "address": "286 State St", - "city": "Perth Amboy", - "county": "Middlesex", - "state": "NJ", - "zip": "08861", - "phone": "732-442-0638", - "fax": "732-442-5218", - "email": "zackary@mockus.com", - "web": "http://www.zackarymockus.com", - "followers": 1497 - }, - { - "firstname": "Rosemarie", - "lastname": "Fifield", - "company": "Technology Services", - "address": "3131 N Nimitz Hwy #-105", - "city": "Honolulu", - "county": "Honolulu", - "state": "HI", - "zip": "96819", - "phone": "808-836-8966", - "fax": "808-836-6008", - "email": "rosemarie@fifield.com", - "web": "http://www.rosemariefifield.com", - "followers": 4812 - }, - { - "firstname": "Bernard", - "lastname": "Laboy", - "company": "Century 21 Keewaydin Prop", - "address": "22661 S Frontage Rd", - "city": "Channahon", - "county": "Will", - "state": "IL", - "zip": "60410", - "phone": "815-467-0487", - "fax": "815-467-1244", - "email": "bernard@laboy.com", - "web": "http://www.bernardlaboy.com", - "followers": 6891 - }, - { - "firstname": "Sue", - "lastname": "Haakinson", - "company": "Kim Peacock Beringhause", - "address": "9617 N Metro Pky W", - "city": "Phoenix", - "county": "Maricopa", - "state": "AZ", - "zip": "85051", - "phone": "602-953-2753", - "fax": "602-953-0355", - "email": "sue@haakinson.com", - "web": "http://www.suehaakinson.com", - "followers": 5787 - }, - { - "firstname": "Valerie", - "lastname": "Pou", - "company": "Sea Port Record One Stop Inc", - "address": "7475 Hamilton Blvd", - "city": "Trexlertown", - "county": "Lehigh", - "state": "PA", - "zip": "18087", - "phone": "610-395-8743", - "fax": "610-395-6995", - "email": "valerie@pou.com", - "web": "http://www.valeriepou.com", - "followers": 8990 - }, - { - "firstname": "Lashawn", - "lastname": "Hasty", - "company": "Kpff Consulting Engineers", - "address": "815 S Glendora Ave", - "city": "West Covina", - "county": "Los Angeles", - "state": "CA", - "zip": "91790", - "phone": "626-960-6738", - "fax": "626-960-1503", - "email": "lashawn@hasty.com", - "web": "http://www.lashawnhasty.com", - "followers": 2131 - }, - { - "firstname": "Marianne", - "lastname": "Earman", - "company": "Albers Technologies Corp", - "address": "6220 S Orange Blossom Trl", - "city": "Orlando", - "county": "Orange", - "state": "FL", - "zip": "32809", - "phone": "407-857-0431", - "fax": "407-857-2506", - "email": "marianne@earman.com", - "web": "http://www.marianneearman.com", - "followers": 1992 - }, - { - "firstname": "Justina", - "lastname": "Dragaj", - "company": "Uchner, David D Esq", - "address": "2552 Poplar Ave", - "city": "Memphis", - "county": "Shelby", - "state": "TN", - "zip": "38112", - "phone": "901-327-5336", - "fax": "901-327-2911", - "email": "justina@dragaj.com", - "web": "http://www.justinadragaj.com", - "followers": 7149 - }, - { - "firstname": "Mandy", - "lastname": "Mcdonnell", - "company": "Southern Vermont Surveys", - "address": "343 Bush St Se", - "city": "Salem", - "county": "Marion", - "state": "OR", - "zip": "97302", - "phone": "503-371-8219", - "fax": "503-371-1118", - "email": "mandy@mcdonnell.com", - "web": "http://www.mandymcdonnell.com", - "followers": 1329 - }, - { - "firstname": "Conrad", - "lastname": "Lanfear", - "company": "Kahler, Karen T Esq", - "address": "49 Roche Way", - "city": "Youngstown", - "county": "Mahoning", - "state": "OH", - "zip": "44512", - "phone": "330-758-0314", - "fax": "330-758-3536", - "email": "conrad@lanfear.com", - "web": "http://www.conradlanfear.com", - "followers": 2906 - }, - { - "firstname": "Cyril", - "lastname": "Behen", - "company": "National Paper & Envelope Corp", - "address": "1650 S Harbor Blvd", - "city": "Anaheim", - "county": "Orange", - "state": "CA", - "zip": "92802", - "phone": "714-772-5050", - "fax": "714-772-3859", - "email": "cyril@behen.com", - "web": "http://www.cyrilbehen.com", - "followers": 7784 - }, - { - "firstname": "Shelley", - "lastname": "Groden", - "company": "Norton, Robert L Esq", - "address": "110 Broadway St", - "city": "San Antonio", - "county": "Bexar", - "state": "TX", - "zip": "78205", - "phone": "210-229-3017", - "fax": "210-229-9757", - "email": "shelley@groden.com", - "web": "http://www.shelleygroden.com", - "followers": 2012 - }, - { - "firstname": "Rosalind", - "lastname": "Krenzke", - "company": "Waldein Manufacturing", - "address": "7000 Bass Lake Rd #-200", - "city": "Minneapolis", - "county": "Hennepin", - "state": "MN", - "zip": "55428", - "phone": "763-537-4194", - "fax": "763-537-3885", - "email": "rosalind@krenzke.com", - "web": "http://www.rosalindkrenzke.com", - "followers": 5547 - }, - { - "firstname": "Davis", - "lastname": "Brevard", - "company": "Transit Trading Corp", - "address": "6715 Tippecanoe Rd", - "city": "Canfield", - "county": "Mahoning", - "state": "OH", - "zip": "44406", - "phone": "330-533-6346", - "fax": "330-533-8211", - "email": "davis@brevard.com", - "web": "http://www.davisbrevard.com", - "followers": 4259 - }, - { - "firstname": "Winnie", - "lastname": "Reich", - "company": "Pacific Seating Co", - "address": "1535 Hawkins Blvd", - "city": "El Paso", - "county": "El Paso", - "state": "TX", - "zip": "79925", - "phone": "915-771-2730", - "fax": "915-771-5729", - "email": "winnie@reich.com", - "web": "http://www.winniereich.com", - "followers": 6621 - }, - { - "firstname": "Trudy", - "lastname": "Worlds", - "company": "Shapiro, Mark R Esq", - "address": "24907 Tibbitts Aven #-b", - "city": "Valencia", - "county": "Los Angeles", - "state": "CA", - "zip": "91355", - "phone": "661-257-3083", - "fax": "661-257-0924", - "email": "trudy@worlds.com", - "web": "http://www.trudyworlds.com", - "followers": 5782 - }, - { - "firstname": "Deshawn", - "lastname": "Inafuku", - "company": "Telair Div Of Teleflex Inc", - "address": "3508 Leopard St", - "city": "Corpus Christi", - "county": "Nueces", - "state": "TX", - "zip": "78408", - "phone": "361-884-8433", - "fax": "361-884-3985", - "email": "deshawn@inafuku.com", - "web": "http://www.deshawninafuku.com", - "followers": 1195 - }, - { - "firstname": "Claudio", - "lastname": "Loose", - "company": "Audiotek Electronics", - "address": "286 State St", - "city": "Perth Amboy", - "county": "Middlesex", - "state": "NJ", - "zip": "08861", - "phone": "732-442-8514", - "fax": "732-442-1775", - "email": "claudio@loose.com", - "web": "http://www.claudioloose.com", - "followers": 6043 - }, - { - "firstname": "Sal", - "lastname": "Pindell", - "company": "Wrigley, Robert I Esq", - "address": "1112 Se 1st St", - "city": "Evansville", - "county": "Vanderburgh", - "state": "IN", - "zip": "47713", - "phone": "812-421-4804", - "fax": "812-421-7625", - "email": "sal@pindell.com", - "web": "http://www.salpindell.com", - "followers": 4359 - }, - { - "firstname": "Cristina", - "lastname": "Sharper", - "company": "Tax Office", - "address": "111 W 40th St", - "city": "New York", - "county": "New York", - "state": "NY", - "zip": "10018", - "phone": "212-719-3952", - "fax": "212-719-0754", - "email": "cristina@sharper.com", - "web": "http://www.cristinasharper.com", - "followers": 4823 - }, - { - "firstname": "Betty Jane", - "lastname": "Mccamey", - "company": "Vita Foods Inc", - "address": "100 E Broad St", - "city": "Columbus", - "county": "Franklin", - "state": "OH", - "zip": "43215", - "phone": "614-225-0900", - "fax": "614-225-1612", - "email": "cary@mccamey.com", - "web": "http://www.carymccamey.com", - "followers": 8863 - }, - { - "firstname": "Haley", - "lastname": "Rocheford", - "company": "Davis, Robert L Esq", - "address": "6030 Greenwood Plaza Blvd", - "city": "Englewood", - "county": "Arapahoe", - "state": "CO", - "zip": "80111", - "phone": "303-689-7729", - "fax": "303-689-5219", - "email": "haley@rocheford.com", - "web": "http://www.haleyrocheford.com", - "followers": 9872 - }, - { - "firstname": "Dorothea", - "lastname": "Sweem", - "company": "Ehrmann, Rolfe F Esq", - "address": "100 Thanet Circ", - "city": "Trenton", - "county": "Mercer", - "state": "NJ", - "zip": "08648", - "phone": "609-896-5871", - "fax": "609-896-2099", - "email": "dorothea@sweem.com", - "web": "http://www.dorotheasweem.com", - "followers": 8897 - }, - { - "firstname": "Fannie", - "lastname": "Steese", - "company": "Chiapete, W Richard Esq", - "address": "926 E Park Ave", - "city": "Tallahassee", - "county": "Leon", - "state": "FL", - "zip": "32301", - "phone": "850-222-8103", - "fax": "850-222-0105", - "email": "fannie@steese.com", - "web": "http://www.fanniesteese.com", - "followers": 7140 - }, - { - "firstname": "Allyson", - "lastname": "Gillispie", - "company": "De Friese Theo & Sons", - "address": "1722 White Horse Mercerville R", - "city": "Trenton", - "county": "Mercer", - "state": "NJ", - "zip": "08619", - "phone": "609-584-1794", - "fax": "609-584-0645", - "email": "allyson@gillispie.com", - "web": "http://www.allysongillispie.com", - "followers": 1414 - }, - { - "firstname": "Roger", - "lastname": "Seid", - "company": "Yoshida, Gerald C Esq", - "address": "3738 N Monroe St", - "city": "Tallahassee", - "county": "Leon", - "state": "FL", - "zip": "32303", - "phone": "850-422-1535", - "fax": "850-422-8152", - "email": "roger@seid.com", - "web": "http://www.rogerseid.com", - "followers": 6661 - }, - { - "firstname": "Dollie", - "lastname": "Daquino", - "company": "Jd Edwards & Co", - "address": "1005 Congress Ave", - "city": "Austin", - "county": "Travis", - "state": "TX", - "zip": "78701", - "phone": "512-478-9636", - "fax": "512-478-9874", - "email": "dollie@daquino.com", - "web": "http://www.dolliedaquino.com", - "followers": 5262 - }, - { - "firstname": "Eva", - "lastname": "Seahorn", - "company": "Saunders Appraisal Inc", - "address": "3 Northern Blvd", - "city": "Amherst", - "county": "Hillsborough", - "state": "NH", - "zip": "03031", - "phone": "603-673-6072", - "fax": "603-673-5009", - "email": "eva@seahorn.com", - "web": "http://www.evaseahorn.com", - "followers": 9192 - }, - { - "firstname": "Mamie", - "lastname": "Mcintee", - "company": "Jacobs, Brian Realtor", - "address": "2810 Jacobs Ave", - "city": "Eureka", - "county": "Humboldt", - "state": "CA", - "zip": "95501", - "phone": "707-443-0621", - "fax": "707-443-9147", - "email": "mamie@mcintee.com", - "web": "http://www.mamiemcintee.com", - "followers": 6954 - }, - { - "firstname": "Lyndon", - "lastname": "Bellerdine", - "company": "A B C Lock & Key", - "address": "200 California St", - "city": "San Francisco", - "county": "San Francisco", - "state": "CA", - "zip": "94111", - "phone": "415-705-1956", - "fax": "415-705-2887", - "email": "lyndon@bellerdine.com", - "web": "http://www.lyndonbellerdine.com", - "followers": 146 - }, - { - "firstname": "Lashonda", - "lastname": "Derouen", - "company": "Travel Agent Magazine", - "address": "101 Royal St", - "city": "Alexandria", - "county": "Alexandria City", - "state": "VA", - "zip": "22314", - "phone": "703-684-3394", - "fax": "703-684-0307", - "email": "lashonda@derouen.com", - "web": "http://www.lashondaderouen.com", - "followers": 3792 - }, - { - "firstname": "Jacklyn", - "lastname": "Emayo", - "company": "Super 8 Motel Temple", - "address": "101 Us Highway 46", - "city": "Fairfield", - "county": "Essex", - "state": "NJ", - "zip": "07004", - "phone": "973-882-3960", - "fax": "973-882-1908", - "email": "jacklyn@emayo.com", - "web": "http://www.jacklynemayo.com", - "followers": 4575 - }, - { - "firstname": "Rubin", - "lastname": "Crotts", - "company": "Misko, Charles G Esq", - "address": "303 N Indian Canyon Dr", - "city": "Palm Springs", - "county": "Riverside", - "state": "CA", - "zip": "92262", - "phone": "760-327-0337", - "fax": "760-327-0929", - "email": "rubin@crotts.com", - "web": "http://www.rubincrotts.com", - "followers": 4736 - }, - { - "firstname": "Boris", - "lastname": "Catino", - "company": "Dream Homes Usa Inc", - "address": "645 Church St", - "city": "Norfolk", - "county": "Norfolk City", - "state": "VA", - "zip": "23510", - "phone": "757-627-8408", - "fax": "757-627-6195", - "email": "boris@catino.com", - "web": "http://www.boriscatino.com", - "followers": 2330 - }, - { - "firstname": "Jannie", - "lastname": "Bowditch", - "company": "Lindsays Landing Rv Pk & Mrna", - "address": "1102 Main St", - "city": "Grandview", - "county": "Jackson", - "state": "MO", - "zip": "64030", - "phone": "816-765-0961", - "fax": "816-765-3469", - "email": "jannie@bowditch.com", - "web": "http://www.janniebowditch.com", - "followers": 7302 - }, - { - "firstname": "Colin", - "lastname": "Altonen", - "company": "Smith, Arthur D Esq", - "address": "1201 18th St", - "city": "Denver", - "county": "Denver", - "state": "CO", - "zip": "80202", - "phone": "303-292-5477", - "fax": "303-292-4239", - "email": "colin@altonen.com", - "web": "http://www.colinaltonen.com", - "followers": 2587 - }, - { - "firstname": "Kerry", - "lastname": "Evertt", - "company": "Washington Crossing Inn", - "address": "337 S North Lake Blvd", - "city": "Altamonte Springs", - "county": "Seminole", - "state": "FL", - "zip": "32701", - "phone": "407-332-9851", - "fax": "407-332-1718", - "email": "kerry@evertt.com", - "web": "http://www.kerryevertt.com", - "followers": 6663 - }, - { - "firstname": "Kathie", - "lastname": "Argenti", - "company": "Microtel Franchise & Dev Corp", - "address": "410 Front St", - "city": "Brainerd", - "county": "Crow Wing", - "state": "MN", - "zip": "56401", - "phone": "218-828-9253", - "fax": "218-828-1401", - "email": "kathie@argenti.com", - "web": "http://www.kathieargenti.com", - "followers": 6260 - }, - { - "firstname": "Henrietta", - "lastname": "Cintora", - "company": "Keyes, Judith Droz Esq", - "address": "1063 Fm Wzzw", - "city": "Milton", - "county": "Cabell", - "state": "WV", - "zip": "25541", - "phone": "304-743-5440", - "fax": "304-743-7475", - "email": "henrietta@cintora.com", - "web": "http://www.henriettacintora.com", - "followers": 9622 - }, - { - "firstname": "Mariano", - "lastname": "Maury", - "company": "Donut & Sandwich Shop", - "address": "1092 Saint Georges Ave", - "city": "Rahway", - "county": "Union", - "state": "NJ", - "zip": "07065", - "phone": "732-388-1579", - "fax": "732-388-9355", - "email": "mariano@maury.com", - "web": "http://www.marianomaury.com", - "followers": 6254 - }, - { - "firstname": "Lottie", - "lastname": "Voll", - "company": "Mason, Joseph G Esq", - "address": "55 E 10th Ave", - "city": "Eugene", - "county": "Lane", - "state": "OR", - "zip": "97401", - "phone": "541-342-7282", - "fax": "541-342-4657", - "email": "lottie@voll.com", - "web": "http://www.lottievoll.com", - "followers": 1092 - }, - { - "firstname": "Ofelia", - "lastname": "Sheffler", - "company": "Rimpsey Agency", - "address": "628 Pacific Ave", - "city": "Oxnard", - "county": "Ventura", - "state": "CA", - "zip": "93030", - "phone": "805-483-7161", - "fax": "805-483-5693", - "email": "ofelia@sheffler.com", - "web": "http://www.ofeliasheffler.com", - "followers": 1096 - }, - { - "firstname": "Gaston", - "lastname": "Cieloszyk", - "company": "Center For Hope Hospice Inc", - "address": "1160 Wccs", - "city": "Homer City", - "county": "Indiana", - "state": "PA", - "zip": "15748", - "phone": "724-479-0355", - "fax": "724-479-7077", - "email": "gaston@cieloszyk.com", - "web": "http://www.gastoncieloszyk.com", - "followers": 7409 - }, - { - "firstname": "Karla", - "lastname": "Ken", - "company": "Nicollet Process Engineering", - "address": "2135 11th St", - "city": "Rockford", - "county": "Winnebago", - "state": "IL", - "zip": "61104", - "phone": "815-968-0369", - "fax": "815-968-7904", - "email": "karla@ken.com", - "web": "http://www.karlaken.com", - "followers": 1296 - }, - { - "firstname": "Avery", - "lastname": "Parbol", - "company": "Schlackman, William H", - "address": "22343 Se Stark St", - "city": "Gresham", - "county": "Multnomah", - "state": "OR", - "zip": "97030", - "phone": "503-666-1948", - "fax": "503-666-9241", - "email": "avery@parbol.com", - "web": "http://www.averyparbol.com", - "followers": 3515 - }, - { - "firstname": "John", - "lastname": "Chipley", - "company": "Manpower Temporary Services", - "address": "2 Horizon Rd #-2", - "city": "Fort Lee", - "county": "Bergen", - "state": "NJ", - "zip": "07024", - "phone": "201-224-7741", - "fax": "201-224-7282", - "email": "john@chipley.com", - "web": "http://www.johnchipley.com", - "followers": 7710 - }, - { - "firstname": "Luella", - "lastname": "Pliner", - "company": "United Waste Systems", - "address": "3437 N 12th Ave", - "city": "Pensacola", - "county": "Escambia", - "state": "FL", - "zip": "32503", - "phone": "850-434-2521", - "fax": "850-434-5228", - "email": "luella@pliner.com", - "web": "http://www.luellapliner.com", - "followers": 5191 - }, - { - "firstname": "Elvira", - "lastname": "Blumenthal", - "company": "Stell Mortgage Investors", - "address": "108 Washington St", - "city": "Keokuk", - "county": "Lee", - "state": "IA", - "zip": "52632", - "phone": "319-524-6237", - "fax": "319-524-9435", - "email": "elvira@blumenthal.com", - "web": "http://www.elvirablumenthal.com", - "followers": 6616 - }, - { - "firstname": "Tyree", - "lastname": "Courrege", - "company": "Stitch Craft", - "address": "13201 Northwest Fwy", - "city": "Houston", - "county": "Harris", - "state": "TX", - "zip": "77040", - "phone": "713-690-9216", - "fax": "713-690-4043", - "email": "tyree@courrege.com", - "web": "http://www.tyreecourrege.com", - "followers": 5210 - }, - { - "firstname": "Ramon", - "lastname": "Amaral", - "company": "Air Academy Federal Credit Un", - "address": "700 W Highway 287", - "city": "Lander", - "county": "Fremont", - "state": "WY", - "zip": "82520", - "phone": "307-332-2667", - "fax": "307-332-3893", - "email": "ramon@amaral.com", - "web": "http://www.ramonamaral.com", - "followers": 8659 - }, - { - "firstname": "Wilfredo", - "lastname": "Gidley", - "company": "Mclaughlin, John F Esq", - "address": "2255 Kuhio Ave #-1203", - "city": "Honolulu", - "county": "Honolulu", - "state": "HI", - "zip": "96815", - "phone": "808-924-2610", - "fax": "808-924-7666", - "email": "wilfredo@gidley.com", - "web": "http://www.wilfredogidley.com", - "followers": 8860 - }, - { - "firstname": "Gracie", - "lastname": "Ehn", - "company": "P C Systems", - "address": "Kahala", - "city": "Honolulu", - "county": "Honolulu", - "state": "HI", - "zip": "96816", - "phone": "808-247-8624", - "fax": "808-247-7982", - "email": "gracie@ehn.com", - "web": "http://www.gracieehn.com", - "followers": 2870 - }, - { - "firstname": "Dorthy", - "lastname": "Alexy", - "company": "Frank Siviglia & Co", - "address": "Pearlridge", - "city": "Aiea", - "county": "Honolulu", - "state": "HI", - "zip": "96701", - "phone": "808-247-4421", - "fax": "808-247-7192", - "email": "dorthy@alexy.com", - "web": "http://www.dorthyalexy.com", - "followers": 1029 - }, - { - "firstname": "Bertie", - "lastname": "Luby", - "company": "Puckett, Dennis L Esq", - "address": "Windward", - "city": "Kaneohe", - "county": "Honolulu", - "state": "HI", - "zip": "96744", - "phone": "808-247-8062", - "fax": "808-247-2529", - "email": "bertie@luby.com", - "web": "http://www.bertieluby.com", - "followers": 2660 - }, - { - "firstname": "Rudy", - "lastname": "Kuhle", - "company": "General Insurcorp Inc", - "address": "1418 3rd Ave", - "city": "New York", - "county": "New York", - "state": "NY", - "zip": "10028", - "phone": "212-628-9987", - "fax": "212-628-1234", - "email": "rudy@kuhle.com", - "web": "http://www.rudykuhle.com", - "followers": 7201 - }, - { - "firstname": "Gale", - "lastname": "Nolau", - "company": "Lust, C James Esq", - "address": "104 N Aurora St", - "city": "Ithaca", - "county": "Tompkins", - "state": "NY", - "zip": "14850", - "phone": "607-277-1567", - "fax": "607-277-6524", - "email": "gale@nolau.com", - "web": "http://www.galenolau.com", - "followers": 6842 - }, - { - "firstname": "Kenya", - "lastname": "Bruni", - "company": "Hurley, Thomas J Jr", - "address": "280 N Midland Ave", - "city": "Saddle Brook", - "county": "Bergen", - "state": "NJ", - "zip": "07663", - "phone": "201-646-9077", - "fax": "201-646-8526", - "email": "kenya@bruni.com", - "web": "http://www.kenyabruni.com", - "followers": 9368 - }, - { - "firstname": "Tricia", - "lastname": "Kruss", - "company": "Edwards, Elwood L", - "address": "4685 Ne 14th St", - "city": "Des Moines", - "county": "Polk", - "state": "IA", - "zip": "50313", - "phone": "515-262-3267", - "fax": "515-262-6264", - "email": "tricia@kruss.com", - "web": "http://www.triciakruss.com", - "followers": 9671 - }, - { - "firstname": "Mack", - "lastname": "Jurasin", - "company": "Sherman, Michael D Esq", - "address": "1180 Dora Hwy", - "city": "Pulaski", - "county": "Pulaski", - "state": "VA", - "zip": "24301", - "phone": "540-980-4958", - "fax": "540-980-2978", - "email": "mack@jurasin.com", - "web": "http://www.mackjurasin.com", - "followers": 4557 - }, - { - "firstname": "Margarito", - "lastname": "Kornbau", - "company": "Acker Knitting Mills Inc", - "address": "303 W 15th St", - "city": "Austin", - "county": "Travis", - "state": "TX", - "zip": "78701", - "phone": "512-478-0371", - "fax": "512-478-4449", - "email": "margarito@kornbau.com", - "web": "http://www.margaritokornbau.com", - "followers": 2072 - }, - { - "firstname": "Lucien", - "lastname": "Iurato", - "company": "Anderson Consulting", - "address": "3918 16th Ave", - "city": "Brooklyn", - "county": "Kings", - "state": "NY", - "zip": "11218", - "phone": "718-871-7952", - "fax": "718-871-3483", - "email": "lucien@iurato.com", - "web": "http://www.lucieniurato.com", - "followers": 9434 - }, - { - "firstname": "Jarvis", - "lastname": "Galas", - "company": "Younghans & Burke", - "address": "307 E President St", - "city": "Savannah", - "county": "Chatham", - "state": "GA", - "zip": "31401", - "phone": "912-236-8524", - "fax": "912-236-8705", - "email": "jarvis@galas.com", - "web": "http://www.jarvisgalas.com", - "followers": 2359 - }, - { - "firstname": "Billie", - "lastname": "Cowley", - "company": "Spears, Robert M Esq", - "address": "1700 Street Rd", - "city": "Warrington", - "county": "Bucks", - "state": "PA", - "zip": "18976", - "phone": "215-548-0842", - "fax": "215-548-4706", - "email": "billie@cowley.com", - "web": "http://www.billiecowley.com", - "followers": 2416 - }, - { - "firstname": "Jacinto", - "lastname": "Gawron", - "company": "Matt Kokkonen Insurance Agency", - "address": "1740 House", - "city": "Lumberville", - "county": "Bucks", - "state": "PA", - "zip": "18933", - "phone": "215-297-0120", - "fax": "215-297-5442", - "email": "jacinto@gawron.com", - "web": "http://www.jacintogawron.com", - "followers": 310 - }, - { - "firstname": "Randall", - "lastname": "Kluemper", - "company": "Lifestyles Organization", - "address": "Rt 16", - "city": "North Conway", - "county": "Carroll", - "state": "NH", - "zip": "03860", - "phone": "603-356-3217", - "fax": "603-356-6174", - "email": "randall@kluemper.com", - "web": "http://www.randallkluemper.com", - "followers": 5669 - }, - { - "firstname": "Enrique", - "lastname": "Oroark", - "company": "Callaghan, Kathleen M Esq", - "address": "34 W 17th St", - "city": "New York", - "county": "New York", - "state": "NY", - "zip": "10011", - "phone": "212-366-5568", - "fax": "212-366-6877", - "email": "enrique@oroark.com", - "web": "http://www.enriqueoroark.com", - "followers": 3911 - }, - { - "firstname": "Alva", - "lastname": "Pennigton", - "company": "Citizens Savings Bank", - "address": "1275 County Road 210 W", - "city": "Jacksonville", - "county": "Saint Johns", - "state": "FL", - "zip": "32259", - "phone": "904-260-2345", - "fax": "904-260-3735", - "email": "alva@pennigton.com", - "web": "http://www.alvapennigton.com", - "followers": 7564 - }, - { - "firstname": "Socorro", - "lastname": "Balandran", - "company": "Mooring", - "address": "401 S Main St", - "city": "Greensburg", - "county": "Westmoreland", - "state": "PA", - "zip": "15601", - "phone": "724-834-6908", - "fax": "724-834-8831", - "email": "socorro@balandran.com", - "web": "http://www.socorrobalandran.com", - "followers": 7056 - }, - { - "firstname": "Nadia", - "lastname": "Wilshire", - "company": "Midwest Undercar Distributors", - "address": "1801 West Ave S", - "city": "La Crosse", - "county": "La Crosse", - "state": "WI", - "zip": "54601", - "phone": "608-788-4965", - "fax": "608-788-5946", - "email": "nadia@wilshire.com", - "web": "http://www.nadiawilshire.com", - "followers": 9311 - }, - { - "firstname": "Reginald", - "lastname": "Humes", - "company": "Cowley & Chidester", - "address": "44 N Main St", - "city": "Wolfeboro", - "county": "Carroll", - "state": "NH", - "zip": "03894", - "phone": "603-569-7730", - "fax": "603-569-8142", - "email": "reginald@humes.com", - "web": "http://www.reginaldhumes.com", - "followers": 8347 - }, - { - "firstname": "Lynda", - "lastname": "Caraway", - "company": "Lowe Art Museum", - "address": "1822 Spring Garden St", - "city": "Philadelphia", - "county": "Philadelphia", - "state": "PA", - "zip": "19130", - "phone": "215-564-3171", - "fax": "215-564-2241", - "email": "lynda@caraway.com", - "web": "http://www.lyndacaraway.com", - "followers": 3853 - }, - { - "firstname": "Saundra", - "lastname": "Mcaulay", - "company": "Rcf Inc", - "address": "2401 Cleveland Rd W", - "city": "Huron", - "county": "Erie", - "state": "OH", - "zip": "44839", - "phone": "419-433-5558", - "fax": "419-433-9756", - "email": "saundra@mcaulay.com", - "web": "http://www.saundramcaulay.com", - "followers": 1620 - }, - { - "firstname": "Allan", - "lastname": "Schwantd", - "company": "Micro Wire Products", - "address": "406 Ne 3rd St", - "city": "McMinnville", - "county": "Yamhill", - "state": "OR", - "zip": "97128", - "phone": "503-434-9666", - "fax": "503-434-3863", - "email": "allan@schwantd.com", - "web": "http://www.allanschwantd.com", - "followers": 6069 - }, - { - "firstname": "Wilmer", - "lastname": "Constantineau", - "company": "Nutra Source", - "address": "1745 W 18th Ave", - "city": "Eugene", - "county": "Lane", - "state": "OR", - "zip": "97402", - "phone": "541-345-4729", - "fax": "541-345-4884", - "email": "wilmer@constantineau.com", - "web": "http://www.wilmerconstantineau.com", - "followers": 1648 - }, - { - "firstname": "Savannah", - "lastname": "Kesich", - "company": "Wbnd Am", - "address": "221 Main", - "city": "Park City", - "county": "Summit", - "state": "UT", - "zip": "84060", - "phone": "435-645-0986", - "fax": "435-645-9504", - "email": "savannah@kesich.com", - "web": "http://www.savannahkesich.com", - "followers": 7325 - }, - { - "firstname": "Dwain", - "lastname": "Cuttitta", - "company": "Kintech Stamping Inc", - "address": "1919 Connecticut Ave Nw", - "city": "Washington", - "county": "District of Columbia", - "state": "DC", - "zip": "20009", - "phone": "202-265-7854", - "fax": "202-265-9475", - "email": "dwain@cuttitta.com", - "web": "http://www.dwaincuttitta.com", - "followers": 8300 - }, - { - "firstname": "Krystle", - "lastname": "Stika", - "company": "Signature Inn", - "address": "3730 Fm", - "city": "Houston", - "county": "Harris", - "state": "TX", - "zip": "77068", - "phone": "281-537-5324", - "fax": "281-537-3235", - "email": "krystle@stika.com", - "web": "http://www.krystlestika.com", - "followers": 2603 - }, - { - "firstname": "Felipe", - "lastname": "Gould", - "company": "Black, Ronald H", - "address": "2308 Bienville Blvd", - "city": "Ocean Springs", - "county": "Jackson", - "state": "MS", - "zip": "39564", - "phone": "228-875-2811", - "fax": "228-875-6402", - "email": "felipe@gould.com", - "web": "http://www.felipegould.com", - "followers": 9237 - }, - { - "firstname": "Steve", - "lastname": "Schorr", - "company": "Midwest Fire Protection Inc", - "address": "1810 N King St", - "city": "Honolulu", - "county": "Honolulu", - "state": "HI", - "zip": "96819", - "phone": "808-842-7045", - "fax": "808-842-7338", - "email": "steve@schorr.com", - "web": "http://www.steveschorr.com", - "followers": 1468 - }, - { - "firstname": "Naomi", - "lastname": "Caetano", - "company": "Bashlin Industries Inc", - "address": "50 Spring St #-1", - "city": "Cresskill", - "county": "Bergen", - "state": "NJ", - "zip": "07626", - "phone": "201-569-3572", - "fax": "201-569-5795", - "email": "naomi@caetano.com", - "web": "http://www.naomicaetano.com", - "followers": 1743 - }, - { - "firstname": "Melody", - "lastname": "Saddat", - "company": "Richards, Edward W Esq", - "address": "3540 S 84th St", - "city": "Omaha", - "county": "Douglas", - "state": "NE", - "zip": "68124", - "phone": "402-397-0581", - "fax": "402-397-8391", - "email": "melody@saddat.com", - "web": "http://www.melodysaddat.com", - "followers": 2442 - }, - { - "firstname": "Mitchel", - "lastname": "Harnar", - "company": "Copycat Quick Print", - "address": "1810 Pioneer Ave", - "city": "Cheyenne", - "county": "Laramie", - "state": "WY", - "zip": "82001", - "phone": "307-632-0256", - "fax": "307-632-2516", - "email": "mitchel@harnar.com", - "web": "http://www.mitchelharnar.com", - "followers": 4662 - }, - { - "firstname": "Sharlene", - "lastname": "Circelli", - "company": "Calibron Systems Inc", - "address": "4018 W Clearwater Ave", - "city": "Kennewick", - "county": "Benton", - "state": "WA", - "zip": "99336", - "phone": "509-783-5167", - "fax": "509-783-7346", - "email": "sharlene@circelli.com", - "web": "http://www.sharlenecircelli.com", - "followers": 6539 - }, - { - "firstname": "Sean", - "lastname": "Bonnet", - "company": "Corporate Alternatives Inc", - "address": "3043 Ridge Rd", - "city": "Lansing", - "county": "Cook", - "state": "IL", - "zip": "60438", - "phone": "708-474-4766", - "fax": "708-474-0011", - "email": "sean@bonnet.com", - "web": "http://www.seanbonnet.com", - "followers": 867 - }, - { - "firstname": "Travis", - "lastname": "Brockert", - "company": "Santa Cruz Title Co", - "address": "7828 N 19th Ave", - "city": "Phoenix", - "county": "Maricopa", - "state": "AZ", - "zip": "85021", - "phone": "602-995-1362", - "fax": "602-995-0966", - "email": "travis@brockert.com", - "web": "http://www.travisbrockert.com", - "followers": 7421 - }, - { - "firstname": "Candice", - "lastname": "Bruckman", - "company": "Fernando Foods Inc", - "address": "611 1st Ave N", - "city": "Humboldt", - "county": "Humboldt", - "state": "IA", - "zip": "50548", - "phone": "515-332-0809", - "fax": "515-332-9083", - "email": "candice@bruckman.com", - "web": "http://www.candicebruckman.com", - "followers": 7084 - }, - { - "firstname": "Mabel", - "lastname": "Weeden", - "company": "Pepsi Cola Gen Bottlers Inc", - "address": "300 E Phillips St", - "city": "Richardson", - "county": "Dallas", - "state": "TX", - "zip": "75081", - "phone": "972-235-5619", - "fax": "972-235-1843", - "email": "mabel@weeden.com", - "web": "http://www.mabelweeden.com", - "followers": 2674 - }, - { - "firstname": "Armando", - "lastname": "Papik", - "company": "Cryogenic Society Of America", - "address": "615 W Markham St", - "city": "Little Rock", - "county": "Pulaski", - "state": "AR", - "zip": "72201", - "phone": "501-376-4154", - "fax": "501-376-0608", - "email": "armando@papik.com", - "web": "http://www.armandopapik.com", - "followers": 7152 - }, - { - "firstname": "Kevin", - "lastname": "Edd", - "company": "Peebles, William J Esq", - "address": "64 Dyerville Ave", - "city": "Johnston", - "county": "Providence", - "state": "RI", - "zip": "02919", - "phone": "401-453-8514", - "fax": "401-453-7085", - "email": "kevin@edd.com", - "web": "http://www.kevinedd.com", - "followers": 3568 - }, - { - "firstname": "Raphael", - "lastname": "Bickel", - "company": "S Shamash & Sons Inc", - "address": "550 N Brand Blvd #-800", - "city": "Glendale", - "county": "Los Angeles", - "state": "CA", - "zip": "91203", - "phone": "818-246-1195", - "fax": "818-246-4734", - "email": "raphael@bickel.com", - "web": "http://www.raphaelbickel.com", - "followers": 1365 - }, - { - "firstname": "Darren", - "lastname": "Merlin", - "company": "Pozzuolo & Perkiss Pc", - "address": "550 N Edward St", - "city": "Decatur", - "county": "Macon", - "state": "IL", - "zip": "62522", - "phone": "217-428-0453", - "fax": "217-428-1491", - "email": "darren@merlin.com", - "web": "http://www.darrenmerlin.com", - "followers": 7653 - }, - { - "firstname": "Francis", - "lastname": "Soo", - "company": "Allen Industrial Supply", - "address": "218 W Main St", - "city": "Sparta", - "county": "Monroe", - "state": "WI", - "zip": "54656", - "phone": "608-269-7306", - "fax": "608-269-3359", - "email": "francis@soo.com", - "web": "http://www.francissoo.com", - "followers": 2482 - }, - { - "firstname": "Nelly", - "lastname": "Jakuboski", - "company": "Hammerman, Stanley M Esq", - "address": "103 Main St", - "city": "Ridgefield", - "county": "Fairfield", - "state": "CT", - "zip": "06877", - "phone": "203-438-9250", - "fax": "203-438-5109", - "email": "nelly@jakuboski.com", - "web": "http://www.nellyjakuboski.com", - "followers": 5338 - }, - { - "firstname": "Mitzi", - "lastname": "Ihenyen", - "company": "Helm, Norman O", - "address": "979 3rd Ave", - "city": "New York", - "county": "New York", - "state": "NY", - "zip": "10022", - "phone": "212-838-8303", - "fax": "212-838-3221", - "email": "mitzi@ihenyen.com", - "web": "http://www.mitziihenyen.com", - "followers": 9264 - }, - { - "firstname": "Kathleen", - "lastname": "Beresnyak", - "company": "R & E Associates", - "address": "100 W 25th Ave", - "city": "San Mateo", - "county": "San Mateo", - "state": "CA", - "zip": "94403", - "phone": "650-349-6809", - "fax": "650-349-5962", - "email": "kathleen@beresnyak.com", - "web": "http://www.kathleenberesnyak.com", - "followers": 2853 - }, - { - "firstname": "Adela", - "lastname": "Cervantsz", - "company": "Arizona Awards", - "address": "102 5th St N", - "city": "Clanton", - "county": "Chilton", - "state": "AL", - "zip": "35045", - "phone": "205-755-4137", - "fax": "205-755-1034", - "email": "adela@cervantsz.com", - "web": "http://www.adelacervantsz.com", - "followers": 9876 - }, - { - "firstname": "Randal", - "lastname": "Gansen", - "company": "Quik Print", - "address": "1 First Federal Plz", - "city": "Rochester", - "county": "Monroe", - "state": "NY", - "zip": "14614", - "phone": "585-238-8558", - "fax": "585-238-7764", - "email": "randal@gansen.com", - "web": "http://www.randalgansen.com", - "followers": 4019 - }, - { - "firstname": "Alyssa", - "lastname": "Biasotti", - "company": "Johnson Hardware Co", - "address": "22 James St", - "city": "Middletown", - "county": "Orange", - "state": "NY", - "zip": "10940", - "phone": "845-343-1878", - "fax": "845-343-5354", - "email": "alyssa@biasotti.com", - "web": "http://www.alyssabiasotti.com", - "followers": 3684 - }, - { - "firstname": "Janet", - "lastname": "Schaffter", - "company": "Hall, Camden M Esq", - "address": "131 Rimbach St", - "city": "Hammond", - "county": "Lake", - "state": "IN", - "zip": "46320", - "phone": "219-853-9283", - "fax": "219-853-9329", - "email": "janet@schaffter.com", - "web": "http://www.janetschaffter.com", - "followers": 2431 - }, - { - "firstname": "Armando", - "lastname": "Kolm", - "company": "Cooper & Cooper Cpas", - "address": "201 N Main St", - "city": "Anderson", - "county": "Anderson", - "state": "SC", - "zip": "29621", - "phone": "864-260-3642", - "fax": "864-260-9205", - "email": "armando@kolm.com", - "web": "http://www.armandokolm.com", - "followers": 4357 - }, - { - "firstname": "Gil", - "lastname": "Scarpa", - "company": "Hughes, James D Esq", - "address": "12 E Broad St", - "city": "Hazleton", - "county": "Luzerne", - "state": "PA", - "zip": "18201", - "phone": "570-459-9281", - "fax": "570-459-5191", - "email": "gil@scarpa.com", - "web": "http://www.gilscarpa.com", - "followers": 7691 - }, - { - "firstname": "Vanessa", - "lastname": "Lewallen", - "company": "Fargo Glass & Paint Co", - "address": "5 E Main", - "city": "Centerburg", - "county": "Knox", - "state": "OH", - "zip": "43011", - "phone": "740-625-8098", - "fax": "740-625-1696", - "email": "vanessa@lewallen.com", - "web": "http://www.vanessalewallen.com", - "followers": 2710 - }, - { - "firstname": "Burton", - "lastname": "Brining", - "company": "Corcoran Machine Company", - "address": "135 E Liberty St", - "city": "Wooster", - "county": "Wayne", - "state": "OH", - "zip": "44691", - "phone": "330-262-5481", - "fax": "330-262-7555", - "email": "burton@brining.com", - "web": "http://www.burtonbrining.com", - "followers": 8158 - }, - { - "firstname": "Rosalie", - "lastname": "Krigger", - "company": "Aaron, William Esq", - "address": "330 Route 211 E", - "city": "Middletown", - "county": "Orange", - "state": "NY", - "zip": "10940", - "phone": "845-343-2313", - "fax": "845-343-2979", - "email": "rosalie@krigger.com", - "web": "http://www.rosaliekrigger.com", - "followers": 1411 - }, - { - "firstname": "Tammie", - "lastname": "Schwartzwalde", - "company": "Cox, Thomas E", - "address": "415 Center St", - "city": "Ironton", - "county": "Lawrence", - "state": "OH", - "zip": "45638", - "phone": "740-532-5488", - "fax": "740-532-0319", - "email": "tammie@schwartzwalde.com", - "web": "http://www.tammieschwartzwalde.com", - "followers": 1367 - }, - { - "firstname": "Darrin", - "lastname": "Neiss", - "company": "Delaney, James J Jr", - "address": "101 W Central Blvd", - "city": "Kewanee", - "county": "Henry", - "state": "IL", - "zip": "61443", - "phone": "309-852-5127", - "fax": "309-852-8638", - "email": "darrin@neiss.com", - "web": "http://www.darrinneiss.com", - "followers": 5748 - }, - { - "firstname": "Rosalia", - "lastname": "Kennemur", - "company": "Reagan, Thomas J Esq", - "address": "222 S 10th St", - "city": "Oakdale", - "county": "Allen", - "state": "LA", - "zip": "71463", - "phone": "318-335-5586", - "fax": "318-335-1873", - "email": "rosalia@kennemur.com", - "web": "http://www.rosaliakennemur.com", - "followers": 5984 - }, - { - "firstname": "Callie", - "lastname": "Leboeuf", - "company": "Town Motors", - "address": "100 S 2nd Ave", - "city": "Alpena", - "county": "Alpena", - "state": "MI", - "zip": "49707", - "phone": "989-354-3344", - "fax": "989-354-3712", - "email": "callie@leboeuf.com", - "web": "http://www.callieleboeuf.com", - "followers": 3607 - }, - { - "firstname": "Patty", - "lastname": "Bernasconi", - "company": "Porter Wright Morris & Arthur", - "address": "851 Fort Street Mall", - "city": "Honolulu", - "county": "Honolulu", - "state": "HI", - "zip": "96813", - "phone": "808-531-2621", - "fax": "808-531-6234", - "email": "patty@bernasconi.com", - "web": "http://www.pattybernasconi.com", - "followers": 3012 - }, - { - "firstname": "Elmo", - "lastname": "Gabouer", - "company": "Conduit & Foundation Corp", - "address": "275 W Bridge St", - "city": "New Hope", - "county": "Bucks", - "state": "PA", - "zip": "18938", - "phone": "215-862-6538", - "fax": "215-862-7006", - "email": "elmo@gabouer.com", - "web": "http://www.elmogabouer.com", - "followers": 9593 - }, - { - "firstname": "Logan", - "lastname": "Muhl", - "company": "Brown, Phillip C Esq", - "address": "126 S Bellevue Ave", - "city": "Langhorne", - "county": "Bucks", - "state": "PA", - "zip": "19047", - "phone": "215-757-6124", - "fax": "215-757-2785", - "email": "logan@muhl.com", - "web": "http://www.loganmuhl.com", - "followers": 741 - }, - { - "firstname": "Vivian", - "lastname": "Brzostowski", - "company": "Savage, Philip M Iii", - "address": "118 Mill St", - "city": "Bristol", - "county": "Bucks", - "state": "PA", - "zip": "19007", - "phone": "215-788-2791", - "fax": "215-788-3902", - "email": "vivian@brzostowski.com", - "web": "http://www.vivianbrzostowski.com", - "followers": 1121 - }, - { - "firstname": "Efren", - "lastname": "Baucher", - "company": "R O Binson Inc", - "address": "Rts 232 & 413", - "city": "Newtown", - "county": "Bucks", - "state": "PA", - "zip": "18940", - "phone": "215-598-4644", - "fax": "215-598-5929", - "email": "efren@baucher.com", - "web": "http://www.efrenbaucher.com", - "followers": 8199 - }, - { - "firstname": "Kurtis", - "lastname": "Mcbay", - "company": "P C Enterprises Ltd", - "address": "737 Levittown Ctr", - "city": "Levittown", - "county": "Bucks", - "state": "PA", - "zip": "19055", - "phone": "215-946-6048", - "fax": "215-946-6458", - "email": "kurtis@mcbay.com", - "web": "http://www.kurtismcbay.com", - "followers": 8315 - }, - { - "firstname": "Guillermo", - "lastname": "Tsang", - "company": "Gillis, Donald W Esq", - "address": "16 Highland Park Way", - "city": "Levittown", - "county": "Bucks", - "state": "PA", - "zip": "19056", - "phone": "215-949-7912", - "fax": "215-949-8919", - "email": "guillermo@tsang.com", - "web": "http://www.guillermotsang.com", - "followers": 4007 - }, - { - "firstname": "Milton", - "lastname": "Kuhlman", - "company": "Imag Corp", - "address": "237 Jackson St Sw", - "city": "Camden", - "county": "Ouachita", - "state": "AR", - "zip": "71701", - "phone": "870-836-9021", - "fax": "870-836-2283", - "email": "milton@kuhlman.com", - "web": "http://www.miltonkuhlman.com", - "followers": 7034 - }, - { - "firstname": "Naomi", - "lastname": "Greenly", - "company": "Kpmg Peat Marwick Llp", - "address": "1400 Gault Ave N", - "city": "Fort Payne", - "county": "De Kalb", - "state": "AL", - "zip": "35967", - "phone": "256-845-1216", - "fax": "256-845-2469", - "email": "naomi@greenly.com", - "web": "http://www.naomigreenly.com", - "followers": 916 - }, - { - "firstname": "Mary", - "lastname": "Maurizio", - "company": "Carey Filter White & Boland", - "address": "404 Main St", - "city": "Delta", - "county": "Fulton", - "state": "OH", - "zip": "43515", - "phone": "419-822-7176", - "fax": "419-822-0591", - "email": "mary@maurizio.com", - "web": "http://www.marymaurizio.com", - "followers": 6083 - }, - { - "firstname": "Caitlin", - "lastname": "Reiniger", - "company": "White, Lawrence R Esq", - "address": "140 N Columbus St", - "city": "Galion", - "county": "Crawford", - "state": "OH", - "zip": "44833", - "phone": "419-468-6910", - "fax": "419-468-9018", - "email": "caitlin@reiniger.com", - "web": "http://www.caitlinreiniger.com", - "followers": 641 - }, - { - "firstname": "Coleman", - "lastname": "Cuneo", - "company": "M & M Mars", - "address": "25 E High St", - "city": "Waynesburg", - "county": "Greene", - "state": "PA", - "zip": "15370", - "phone": "724-627-4378", - "fax": "724-627-2305", - "email": "coleman@cuneo.com", - "web": "http://www.colemancuneo.com", - "followers": 8657 - }, - { - "firstname": "Rachel", - "lastname": "Larrison", - "company": "Ipa The Editing House", - "address": "3721 Oberlin Ave", - "city": "Lorain", - "county": "Lorain", - "state": "OH", - "zip": "44053", - "phone": "440-282-3729", - "fax": "440-282-6918", - "email": "rachel@larrison.com", - "web": "http://www.rachellarrison.com", - "followers": 4562 - }, - { - "firstname": "Dwayne", - "lastname": "Maddalena", - "company": "Ebbeson, James O Esq", - "address": "532 Court St", - "city": "Pekin", - "county": "Tazewell", - "state": "IL", - "zip": "61554", - "phone": "309-347-1137", - "fax": "309-347-9282", - "email": "dwayne@maddalena.com", - "web": "http://www.dwaynemaddalena.com", - "followers": 7384 - }, - { - "firstname": "Angelique", - "lastname": "Schermerhorn", - "company": "Safety Direct Inc", - "address": "511 Saint Johns Ave", - "city": "Palatka", - "county": "Putnam", - "state": "FL", - "zip": "32177", - "phone": "386-328-7869", - "fax": "386-328-1499", - "email": "angelique@schermerhorn.com", - "web": "http://www.angeliqueschermerhorn.com", - "followers": 6181 - }, - { - "firstname": "Junior", - "lastname": "Wadlinger", - "company": "Sonos Music", - "address": "185 E Market St", - "city": "Warren", - "county": "Trumbull", - "state": "OH", - "zip": "44481", - "phone": "330-393-9794", - "fax": "330-393-6808", - "email": "junior@wadlinger.com", - "web": "http://www.juniorwadlinger.com", - "followers": 7690 - }, - { - "firstname": "Darrel", - "lastname": "Tork", - "company": "S & T Machining", - "address": "2121 S Mannheim Rd", - "city": "Westchester", - "county": "Cook", - "state": "IL", - "zip": "60154", - "phone": "708-865-8091", - "fax": "708-865-8984", - "email": "darrel@tork.com", - "web": "http://www.darreltork.com", - "followers": 9708 - }, - { - "firstname": "Lana", - "lastname": "Garrigus", - "company": "Russell Builders & Hardware", - "address": "118 Ne 3rd St", - "city": "McMinnville", - "county": "Yamhill", - "state": "OR", - "zip": "97128", - "phone": "503-434-2642", - "fax": "503-434-8121", - "email": "lana@garrigus.com", - "web": "http://www.lanagarrigus.com", - "followers": 3048 - }, - { - "firstname": "Jonathon", - "lastname": "Waldall", - "company": "Mission Hills Escrow", - "address": "300 Hampton St", - "city": "Walterboro", - "county": "Colleton", - "state": "SC", - "zip": "29488", - "phone": "843-549-9461", - "fax": "843-549-0125", - "email": "jonathon@waldall.com", - "web": "http://www.jonathonwaldall.com", - "followers": 8039 - }, - { - "firstname": "Kristine", - "lastname": "Paker", - "company": "Chagrin Valley Massotherapy", - "address": "301 N Pine St", - "city": "Creston", - "county": "Union", - "state": "IA", - "zip": "50801", - "phone": "641-782-7169", - "fax": "641-782-7962", - "email": "kristine@paker.com", - "web": "http://www.kristinepaker.com", - "followers": 7977 - }, - { - "firstname": "Dwain", - "lastname": "Agricola", - "company": "Beatty Satchell Everngam & Co", - "address": "211 N Main St", - "city": "Leitchfield", - "county": "Grayson", - "state": "KY", - "zip": "42754", - "phone": "270-259-5194", - "fax": "270-259-0821", - "email": "dwain@agricola.com", - "web": "http://www.dwainagricola.com", - "followers": 8410 - }, - { - "firstname": "Jewel", - "lastname": "Agresta", - "company": "Md Assn Cert Pub Accts Inc", - "address": "4565 Harrison St", - "city": "Hillside", - "county": "Cook", - "state": "IL", - "zip": "60162", - "phone": "708-449-7139", - "fax": "708-449-2963", - "email": "jewel@agresta.com", - "web": "http://www.jewelagresta.com", - "followers": 293 - }, - { - "firstname": "Georgette", - "lastname": "Bandyk", - "company": "Specialty Alumn Castings Inc", - "address": "1965 Wakefield Ave", - "city": "Petersburg", - "county": "Petersburg City", - "state": "VA", - "zip": "23805", - "phone": "804-796-2746", - "fax": "804-796-5351", - "email": "georgette@bandyk.com", - "web": "http://www.georgettebandyk.com", - "followers": 9865 - }, - { - "firstname": "Geri", - "lastname": "Forness", - "company": "Quality Dynamics Group", - "address": "Capitol Ave", - "city": "Corydon", - "county": "Harrison", - "state": "IN", - "zip": "47112", - "phone": "812-738-9416", - "fax": "812-738-4816", - "email": "geri@forness.com", - "web": "http://www.geriforness.com", - "followers": 7788 - }, - { - "firstname": "Modesto", - "lastname": "Scroggie", - "company": "Bulloch, Bruce Cpa", - "address": "300 Orlando Dr", - "city": "Raritan", - "county": "Somerset", - "state": "NJ", - "zip": "08869", - "phone": "908-980-5621", - "fax": "908-980-9842", - "email": "modesto@scroggie.com", - "web": "http://www.modestoscroggie.com", - "followers": 5671 - }, - { - "firstname": "Curt", - "lastname": "Menedez", - "company": "J & J Machinery Repair Inc", - "address": "207 Yukon", - "city": "Tampa", - "county": "Hillsborough", - "state": "FL", - "zip": "33604", - "phone": "813-932-8602", - "fax": "813-932-4548", - "email": "curt@menedez.com", - "web": "http://www.curtmenedez.com", - "followers": 1311 - }, - { - "firstname": "Karen", - "lastname": "Zombo", - "company": "Healthcare Family Credit Union", - "address": "3112 W Kennedy Blvd", - "city": "Tampa", - "county": "Hillsborough", - "state": "FL", - "zip": "33609", - "phone": "813-872-4288", - "fax": "813-872-8262", - "email": "karen@zombo.com", - "web": "http://www.karenzombo.com", - "followers": 2543 - }, - { - "firstname": "Lora", - "lastname": "Lendor", - "company": "Advanced Electromagnetics Inc", - "address": "7 W Darlington Ave", - "city": "Kissimmee", - "county": "Osceola", - "state": "FL", - "zip": "34741", - "phone": "407-870-0382", - "fax": "407-870-6229", - "email": "lora@lendor.com", - "web": "http://www.loralendor.com", - "followers": 5947 - }, - { - "firstname": "Felipe", - "lastname": "Mahone", - "company": "Apartment Mart", - "address": "1001 Bishop St #-2850", - "city": "Honolulu", - "county": "Honolulu", - "state": "HI", - "zip": "96813", - "phone": "808-536-3239", - "fax": "808-536-1231", - "email": "felipe@mahone.com", - "web": "http://www.felipemahone.com", - "followers": 4427 - }, - { - "firstname": "Rosalyn", - "lastname": "Daulton", - "company": "Rodgard Corp", - "address": "300 Broadacres Dr", - "city": "Bloomfield", - "county": "Essex", - "state": "NJ", - "zip": "07003", - "phone": "973-338-8552", - "fax": "973-338-1603", - "email": "rosalyn@daulton.com", - "web": "http://www.rosalyndaulton.com", - "followers": 2667 - }, - { - "firstname": "Marquita", - "lastname": "Bousman", - "company": "Constantine, Katherine A Esq", - "address": "30 Highland Ave", - "city": "Warwick", - "county": "Orange", - "state": "NY", - "zip": "10990", - "phone": "845-986-0909", - "fax": "845-986-2447", - "email": "marquita@bousman.com", - "web": "http://www.marquitabousman.com", - "followers": 4315 - }, - { - "firstname": "Carla", - "lastname": "Sirbaugh", - "company": "Urso, Natale L Esq", - "address": "110 S La Brea Ave #-22", - "city": "Inglewood", - "county": "Los Angeles", - "state": "CA", - "zip": "90301", - "phone": "310-412-6653", - "fax": "310-412-1067", - "email": "carla@sirbaugh.com", - "web": "http://www.carlasirbaugh.com", - "followers": 9701 - }, - { - "firstname": "Wes", - "lastname": "Fontanella", - "company": "Woodside Travel Trust", - "address": "1369 W Redondo Beach Blvd", - "city": "Gardena", - "county": "Los Angeles", - "state": "CA", - "zip": "90247", - "phone": "310-515-3065", - "fax": "310-515-2515", - "email": "wes@fontanella.com", - "web": "http://www.wesfontanella.com", - "followers": 1717 - }, - { - "firstname": "Meredith", - "lastname": "Ivrin", - "company": "Hamilton Financial Corp", - "address": "323 N Gilbert St", - "city": "Danville", - "county": "Vermilion", - "state": "IL", - "zip": "61832", - "phone": "217-446-7172", - "fax": "217-446-2369", - "email": "meredith@ivrin.com", - "web": "http://www.meredithivrin.com", - "followers": 7827 - }, - { - "firstname": "Laurie", - "lastname": "Bigg", - "company": "Essc Inc", - "address": "14500 Lakeside Cir", - "city": "Sterling Heights", - "county": "Macomb", - "state": "MI", - "zip": "48313", - "phone": "586-247-6171", - "fax": "586-247-9791", - "email": "laurie@bigg.com", - "web": "http://www.lauriebigg.com", - "followers": 8684 - }, - { - "firstname": "Barton", - "lastname": "Friesner", - "company": "Optical Supply", - "address": "1 Summit Ct", - "city": "Fishkill", - "county": "Dutchess", - "state": "NY", - "zip": "12524", - "phone": "845-896-6652", - "fax": "845-896-1692", - "email": "barton@friesner.com", - "web": "http://www.bartonfriesner.com", - "followers": 4889 - }, - { - "firstname": "Sophie", - "lastname": "Langner", - "company": "Kapetanakis, Alexander Esq", - "address": "535 Ward Ave #-204", - "city": "Honolulu", - "county": "Honolulu", - "state": "HI", - "zip": "96814", - "phone": "808-545-7695", - "fax": "808-545-8636", - "email": "sophie@langner.com", - "web": "http://www.sophielangner.com", - "followers": 1596 - }, - { - "firstname": "Garfield", - "lastname": "Lijewski", - "company": "Denker, Aaron Esq", - "address": "6401 N Lincoln Ave", - "city": "Chicago", - "county": "Cook", - "state": "IL", - "zip": "60645", - "phone": "773-976-3827", - "fax": "773-976-5586", - "email": "garfield@lijewski.com", - "web": "http://www.garfieldlijewski.com", - "followers": 5955 - }, - { - "firstname": "Warren", - "lastname": "Speach", - "company": "E Norwalk Crmc Tile & Mrbl Co", - "address": "361 Park Ave", - "city": "Scotch Plains", - "county": "Union", - "state": "NJ", - "zip": "07076", - "phone": "908-322-3846", - "fax": "908-322-6744", - "email": "warren@speach.com", - "web": "http://www.warrenspeach.com", - "followers": 6741 - }, - { - "firstname": "Madonna", - "lastname": "Cosby", - "company": "Emanuel Reider Architects Inc", - "address": "135 Main St", - "city": "San Francisco", - "county": "San Francisco", - "state": "CA", - "zip": "94105", - "phone": "415-956-4437", - "fax": "415-956-5134", - "email": "madonna@cosby.com", - "web": "http://www.madonnacosby.com", - "followers": 3985 - }, - { - "firstname": "Valeria", - "lastname": "Lingbeek", - "company": "Recreation Director", - "address": "state", - "city": "Newtown", - "county": "Bucks", - "state": "PA", - "zip": "18940", - "phone": "215-968-8421", - "fax": "215-968-1567", - "email": "valeria@lingbeek.com", - "web": "http://www.valerialingbeek.com", - "followers": 8824 - }, - { - "firstname": "Heath", - "lastname": "Vanalphen", - "company": "California Stat Min & Mnrl Mus", - "address": "227 Commercial St", - "city": "Provincetown", - "county": "Barnstable", - "state": "MA", - "zip": "02657", - "phone": "508-487-6010", - "fax": "508-487-0597", - "email": "heath@vanalphen.com", - "web": "http://www.heathvanalphen.com", - "followers": 6846 - }, - { - "firstname": "Marisa", - "lastname": "Woldridge", - "company": "Wegner, Tim Esq", - "address": "153 Baltimore St", - "city": "Cumberland", - "county": "Allegany", - "state": "MD", - "zip": "21502", - "phone": "301-759-7421", - "fax": "301-759-9676", - "email": "marisa@woldridge.com", - "web": "http://www.marisawoldridge.com", - "followers": 6009 - }, - { - "firstname": "Rene", - "lastname": "Dummermuth", - "company": "Super 8 Motel", - "address": "2 Ridgedale Ave", - "city": "Cedar Knolls", - "county": "Morris", - "state": "NJ", - "zip": "07927", - "phone": "973-292-7918", - "fax": "973-292-5898", - "email": "rene@dummermuth.com", - "web": "http://www.renedummermuth.com", - "followers": 1687 - }, - { - "firstname": "Helga", - "lastname": "Windle", - "company": "Loew, Andrea H Esq", - "address": "99185 Moanalua Rd #-101", - "city": "Aiea", - "county": "Honolulu", - "state": "HI", - "zip": "96701", - "phone": "808-487-7779", - "fax": "808-487-6258", - "email": "helga@windle.com", - "web": "http://www.helgawindle.com", - "followers": 56 - }, - { - "firstname": "Margot", - "lastname": "Arenburg", - "company": "Mcivor, Carolyn Md", - "address": "736 N Mills Ave", - "city": "Orlando", - "county": "Orange", - "state": "FL", - "zip": "32803", - "phone": "407-896-1593", - "fax": "407-896-6679", - "email": "margot@arenburg.com", - "web": "http://www.margotarenburg.com", - "followers": 7445 - }, - { - "firstname": "Sheila", - "lastname": "Holloran", - "company": "Warehouse On Wheels", - "address": "126 S Main St", - "city": "Clyde", - "county": "Sandusky", - "state": "OH", - "zip": "43410", - "phone": "419-547-9428", - "fax": "419-547-4835", - "email": "sheila@holloran.com", - "web": "http://www.sheilaholloran.com", - "followers": 9682 - }, - { - "firstname": "Melinda", - "lastname": "Carleton", - "company": "Cenol Co", - "address": "395 Revilo Ave", - "city": "Shirley", - "county": "Suffolk", - "state": "NY", - "zip": "11967", - "phone": "631-399-1636", - "fax": "631-399-6025", - "email": "melinda@carleton.com", - "web": "http://www.melindacarleton.com", - "followers": 7154 - }, - { - "firstname": "Ike", - "lastname": "Zeolla", - "company": "Halpin, Irene A Esq", - "address": "1900 L St Nw", - "city": "Washington", - "county": "District of Columbia", - "state": "DC", - "zip": "20036", - "phone": "202-331-1409", - "fax": "202-331-7781", - "email": "ike@zeolla.com", - "web": "http://www.ikezeolla.com", - "followers": 7418 - }, - { - "firstname": "Elmo", - "lastname": "Dagenais", - "company": "P C Routing Inc", - "address": "12914 Old Stage Rd", - "city": "Chester", - "county": "Chesterfield", - "state": "VA", - "zip": "23831", - "phone": "804-796-5647", - "fax": "804-796-9493", - "email": "elmo@dagenais.com", - "web": "http://www.elmodagenais.com", - "followers": 7355 - }, - { - "firstname": "Valentine", - "lastname": "Granberry", - "company": "Sunnyvale Travel", - "address": "1019 Shadick Dr", - "city": "Orange City", - "county": "Volusia", - "state": "FL", - "zip": "32763", - "phone": "407-775-4269", - "fax": "407-775-0598", - "email": "valentine@granberry.com", - "web": "http://www.valentinegranberry.com", - "followers": 7021 - }, - { - "firstname": "Waldo", - "lastname": "Sisk", - "company": "Muller Drugs Inc", - "address": "2211 Us Highway 19", - "city": "Holiday", - "county": "Pasco", - "state": "FL", - "zip": "34691", - "phone": "727-934-3827", - "fax": "727-934-7181", - "email": "waldo@sisk.com", - "web": "http://www.waldosisk.com", - "followers": 2109 - }, - { - "firstname": "Robt", - "lastname": "Braithwaite", - "company": "Meyer, Janet Md", - "address": "320 W Mclane St", - "city": "Osceola", - "county": "Clarke", - "state": "IA", - "zip": "50213", - "phone": "641-342-1276", - "fax": "641-342-6031", - "email": "robt@braithwaite.com", - "web": "http://www.robtbraithwaite.com", - "followers": 1336 - }, - { - "firstname": "Corinne", - "lastname": "Cowan", - "company": "Ward Equipment Co", - "address": "20 Montana Ave", - "city": "Laurel", - "county": "Yellowstone", - "state": "MT", - "zip": "59044", - "phone": "406-628-4030", - "fax": "406-628-9418", - "email": "corinne@cowan.com", - "web": "http://www.corinnecowan.com", - "followers": 7049 - }, - { - "firstname": "Rebeca", - "lastname": "Brumet", - "company": "Kingston Office Supplies Inc", - "address": "936 N Western Ave", - "city": "Chicago", - "county": "Cook", - "state": "IL", - "zip": "60622", - "phone": "773-772-4015", - "fax": "773-772-1603", - "email": "rebeca@brumet.com", - "web": "http://www.rebecabrumet.com", - "followers": 202 - }, - { - "firstname": "Lynn", - "lastname": "Saulsberry", - "company": "Printing Factory Inc", - "address": "2725 W Mcdowell Rd", - "city": "Phoenix", - "county": "Maricopa", - "state": "AZ", - "zip": "85009", - "phone": "602-272-8326", - "fax": "602-272-3143", - "email": "lynn@saulsberry.com", - "web": "http://www.lynnsaulsberry.com", - "followers": 5265 - }, - { - "firstname": "Hannah", - "lastname": "Facio", - "company": "Cmptr Pros For Scl", - "address": "115 E Church St", - "city": "Elberton", - "county": "Elbert", - "state": "GA", - "zip": "30635", - "phone": "706-283-8280", - "fax": "706-283-6916", - "email": "hannah@facio.com", - "web": "http://www.hannahfacio.com", - "followers": 4321 - }, - { - "firstname": "Benjamin", - "lastname": "Schkade", - "company": "Port Brownsville Pub Scale Inc", - "address": "1636 E 1st Ave", - "city": "Anchorage", - "county": "Anchorage", - "state": "AK", - "zip": "99501", - "phone": "907-278-8687", - "fax": "907-278-7166", - "email": "benjamin@schkade.com", - "web": "http://www.benjaminschkade.com", - "followers": 5846 - }, - { - "firstname": "Athena", - "lastname": "Fontanilla", - "company": "Willamette Hobbies", - "address": "5020 Germantown Ave", - "city": "Philadelphia", - "county": "Philadelphia", - "state": "PA", - "zip": "19144", - "phone": "215-438-9675", - "fax": "215-438-1716", - "email": "athena@fontanilla.com", - "web": "http://www.athenafontanilla.com", - "followers": 5342 - }, - { - "firstname": "Alene", - "lastname": "Rabeck", - "company": "Bucks County Of", - "address": "475 E 162nd St", - "city": "South Holland", - "county": "Cook", - "state": "IL", - "zip": "60473", - "phone": "708-333-8056", - "fax": "708-333-2125", - "email": "alene@rabeck.com", - "web": "http://www.alenerabeck.com", - "followers": 2815 - }, - { - "firstname": "Yvette", - "lastname": "Kokoska", - "company": "Automation Products Inc", - "address": "200 Valley Dr", - "city": "Brisbane", - "county": "San Mateo", - "state": "CA", - "zip": "94005", - "phone": "650-468-3592", - "fax": "650-468-7716", - "email": "yvette@kokoska.com", - "web": "http://www.yvettekokoska.com", - "followers": 6175 - }, - { - "firstname": "Petra", - "lastname": "Clemmens", - "company": "Belton Industries Inc", - "address": "980 N Federal Hwy", - "city": "Boca Raton", - "county": "Palm Beach", - "state": "FL", - "zip": "33432", - "phone": "561-394-2152", - "fax": "561-394-1574", - "email": "petra@clemmens.com", - "web": "http://www.petraclemmens.com", - "followers": 5263 - }, - { - "firstname": "Carmel", - "lastname": "Overfelt", - "company": "Woodworkers Supply Inc", - "address": "6801 Lake Worth Rd", - "city": "Lake Worth", - "county": "Palm Beach", - "state": "FL", - "zip": "33467", - "phone": "561-965-5167", - "fax": "561-965-1433", - "email": "carmel@overfelt.com", - "web": "http://www.carmeloverfelt.com", - "followers": 5868 - }, - { - "firstname": "Danette", - "lastname": "Fostervold", - "company": "Flach, Douglas Esq", - "address": "6920 Santa Teresa Blvd", - "city": "San Jose", - "county": "Santa Clara", - "state": "CA", - "zip": "95119", - "phone": "408-225-1319", - "fax": "408-225-5205", - "email": "danette@fostervold.com", - "web": "http://www.danettefostervold.com", - "followers": 1315 - }, - { - "firstname": "Vince", - "lastname": "Ettel", - "company": "Breen Trucking", - "address": "408 Main St", - "city": "Springfield", - "county": "Sarpy", - "state": "NE", - "zip": "68059", - "phone": "402-399-6999", - "fax": "402-399-6478", - "email": "vince@ettel.com", - "web": "http://www.vinceettel.com", - "followers": 7780 - }, - { - "firstname": "Davis", - "lastname": "Heideman", - "company": "Dennis J Wall Atty At Law Pa", - "address": "801 W 5th St", - "city": "Fort Worth", - "county": "Tarrant", - "state": "TX", - "zip": "76102", - "phone": "817-332-7902", - "fax": "817-332-5439", - "email": "davis@heideman.com", - "web": "http://www.davisheideman.com", - "followers": 4778 - }, - { - "firstname": "Bradly", - "lastname": "Hasselvander", - "company": "Public Works Department Office", - "address": "2302 Artesia Blvd", - "city": "Redondo Beach", - "county": "Los Angeles", - "state": "CA", - "zip": "90278", - "phone": "310-374-2374", - "fax": "310-374-2363", - "email": "bradly@hasselvander.com", - "web": "http://www.bradlyhasselvander.com", - "followers": 7831 - }, - { - "firstname": "Nathanial", - "lastname": "Phoenix", - "company": "Precision Steel Rule Die Co", - "address": "1000 Nw 105th St", - "city": "Oklahoma City", - "county": "Oklahoma", - "state": "OK", - "zip": "73114", - "phone": "405-748-7637", - "fax": "405-748-1856", - "email": "nathanial@phoenix.com", - "web": "http://www.nathanialphoenix.com", - "followers": 8308 - }, - { - "firstname": "Lamar", - "lastname": "Mckibben", - "company": "Battaglia, Jack M Esq", - "address": "1620 Folsom St", - "city": "San Francisco", - "county": "San Francisco", - "state": "CA", - "zip": "94103", - "phone": "415-864-7338", - "fax": "415-864-7623", - "email": "lamar@mckibben.com", - "web": "http://www.lamarmckibben.com", - "followers": 4193 - }, - { - "firstname": "Shanna", - "lastname": "Numkena", - "company": "Anderson Independent Mail", - "address": "1426 5th Pl Nw", - "city": "Rochester", - "county": "Olmsted", - "state": "MN", - "zip": "55901", - "phone": "507-280-1856", - "fax": "507-280-6844", - "email": "shanna@numkena.com", - "web": "http://www.shannanumkena.com", - "followers": 1364 - }, - { - "firstname": "Helena", - "lastname": "Suermann", - "company": "Stubenberge, James A Esq", - "address": "897 Independence Ave", - "city": "Mountain View", - "county": "Santa Clara", - "state": "CA", - "zip": "94043", - "phone": "650-965-0255", - "fax": "650-965-3368", - "email": "helena@suermann.com", - "web": "http://www.helenasuermann.com", - "followers": 4536 - }, - { - "firstname": "Delphine", - "lastname": "Helmich", - "company": "Friends Hospital", - "address": "50 Aviation Way", - "city": "Watsonville", - "county": "Santa Cruz", - "state": "CA", - "zip": "95076", - "phone": "831-763-4348", - "fax": "831-763-0923", - "email": "delphine@helmich.com", - "web": "http://www.delphinehelmich.com", - "followers": 7383 - }, - { - "firstname": "Barbara", - "lastname": "Hindley", - "company": "Kirin Amgen", - "address": "904 N Lake St", - "city": "Burbank", - "county": "Los Angeles", - "state": "CA", - "zip": "91502", - "phone": "818-841-8886", - "fax": "818-841-8221", - "email": "barbara@hindley.com", - "web": "http://www.barbarahindley.com", - "followers": 9155 - }, - { - "firstname": "Sheryl", - "lastname": "Sisofo", - "company": "Thrifty Sign Stop", - "address": "1049 S Mccord Rd", - "city": "Holland", - "county": "Lucas", - "state": "OH", - "zip": "43528", - "phone": "419-865-8702", - "fax": "419-865-1836", - "email": "sheryl@sisofo.com", - "web": "http://www.sherylsisofo.com", - "followers": 5693 - }, - { - "firstname": "Robyn", - "lastname": "Christophel", - "company": "Woodward, John C Esq", - "address": "3420 E Flamingo Rd", - "city": "Las Vegas", - "county": "Clark", - "state": "NV", - "zip": "89121", - "phone": "702-458-1072", - "fax": "702-458-2093", - "email": "robyn@christophel.com", - "web": "http://www.robynchristophel.com", - "followers": 3971 - }, - { - "firstname": "Gayla", - "lastname": "Geimer", - "company": "Ortman Mccain Co", - "address": "1280 Price Ave", - "city": "Pomona", - "county": "Los Angeles", - "state": "CA", - "zip": "91767", - "phone": "909-620-6453", - "fax": "909-620-2768", - "email": "gayla@geimer.com", - "web": "http://www.gaylageimer.com", - "followers": 8969 - }, - { - "firstname": "Evan", - "lastname": "Pyfrom", - "company": "Nevada Baking Co", - "address": "5430 Alpha Rd", - "city": "Dallas", - "county": "Dallas", - "state": "TX", - "zip": "75240", - "phone": "214-661-4625", - "fax": "214-661-8804", - "email": "evan@pyfrom.com", - "web": "http://www.evanpyfrom.com", - "followers": 2516 - }, - { - "firstname": "Chad", - "lastname": "Miklas", - "company": "Red Carpet Inn", - "address": "31 S Grove St", - "city": "East Aurora", - "county": "Erie", - "state": "NY", - "zip": "14052", - "phone": "716-655-2736", - "fax": "716-655-2749", - "email": "chad@miklas.com", - "web": "http://www.chadmiklas.com", - "followers": 5357 - }, - { - "firstname": "Trey", - "lastname": "Tout", - "company": "Breen, Sean E Esq", - "address": "100 Mbc Dr", - "city": "Shawano", - "county": "Shawano", - "state": "WI", - "zip": "54166", - "phone": "715-526-6806", - "fax": "715-526-2421", - "email": "trey@tout.com", - "web": "http://www.treytout.com", - "followers": 205 - }, - { - "firstname": "Isabell", - "lastname": "Armout", - "company": "True Electric Corp", - "address": "7895 S Cessna Ave", - "city": "Gaithersburg", - "county": "Montgomery", - "state": "MD", - "zip": "20879", - "phone": "301-921-0406", - "fax": "301-921-1251", - "email": "isabell@armout.com", - "web": "http://www.isabellarmout.com", - "followers": 4878 - }, - { - "firstname": "Alejandro", - "lastname": "Mascall", - "company": "Railway Educational Bureau", - "address": "2350 Duke St", - "city": "Alexandria", - "county": "Alexandria City", - "state": "VA", - "zip": "22314", - "phone": "703-684-2882", - "fax": "703-684-8561", - "email": "alejandro@mascall.com", - "web": "http://www.alejandromascall.com", - "followers": 3512 - }, - { - "firstname": "Kennith", - "lastname": "Kirklin", - "company": "Sears Roebuck And Co", - "address": "2303 21st Ave S", - "city": "Nashville", - "county": "Davidson", - "state": "TN", - "zip": "37212", - "phone": "615-385-1598", - "fax": "615-385-6946", - "email": "kennith@kirklin.com", - "web": "http://www.kennithkirklin.com", - "followers": 5087 - }, - { - "firstname": "Ike", - "lastname": "Benthin", - "company": "Lee, Harry Esq", - "address": "1062 Folsom St", - "city": "San Francisco", - "county": "San Francisco", - "state": "CA", - "zip": "94103", - "phone": "415-255-5277", - "fax": "415-255-6543", - "email": "ike@benthin.com", - "web": "http://www.ikebenthin.com", - "followers": 8473 - }, - { - "firstname": "Donald", - "lastname": "Sherretts", - "company": "Nylonge Corporation", - "address": "1062 Folsom St", - "city": "San Francisco", - "county": "San Francisco", - "state": "CA", - "zip": "94103", - "phone": "415-255-7718", - "fax": "415-255-7088", - "email": "donald@sherretts.com", - "web": "http://www.donaldsherretts.com", - "followers": 2332 - }, - { - "firstname": "Lina", - "lastname": "Hybarger", - "company": "L & H Central Office", - "address": "1828 Jefferson Pl Nw", - "city": "Washington", - "county": "District of Columbia", - "state": "DC", - "zip": "20036", - "phone": "202-833-4983", - "fax": "202-833-3174", - "email": "lina@hybarger.com", - "web": "http://www.linahybarger.com", - "followers": 9793 - }, - { - "firstname": "Rebekah", - "lastname": "Padley", - "company": "Reed Engineering Inc", - "address": "200 E Delawr Pl", - "city": "Chicago", - "county": "Cook", - "state": "IL", - "zip": "60611", - "phone": "312-944-1877", - "fax": "312-944-1477", - "email": "rebekah@padley.com", - "web": "http://www.rebekahpadley.com", - "followers": 3839 - }, - { - "firstname": "Marion", - "lastname": "Gaulden", - "company": "Madden, John H Jr", - "address": "200 W South St", - "city": "Charlottesville", - "county": "Charlottesville City", - "state": "VA", - "zip": "22902", - "phone": "434-979-9335", - "fax": "434-979-2694", - "email": "marion@gaulden.com", - "web": "http://www.mariongaulden.com", - "followers": 5625 - }, - { - "firstname": "Maurine", - "lastname": "Monroy", - "company": "Central Distribution System", - "address": "2000 Linwood Ave", - "city": "Fort Lee", - "county": "Bergen", - "state": "NJ", - "zip": "07024", - "phone": "201-947-8922", - "fax": "201-947-4235", - "email": "maurine@monroy.com", - "web": "http://www.maurinemonroy.com", - "followers": 5828 - }, - { - "firstname": "Rosanna", - "lastname": "Sandrock", - "company": "Computer X Consulting", - "address": "1797 Lakewood Ter Se", - "city": "Atlanta", - "county": "Fulton", - "state": "GA", - "zip": "30315", - "phone": "404-627-4604", - "fax": "404-627-4276", - "email": "rosanna@sandrock.com", - "web": "http://www.rosannasandrock.com", - "followers": 3044 - }, - { - "firstname": "Marcelino", - "lastname": "Maggs", - "company": "Rascher & Betzold Inc", - "address": "201 E Pine St", - "city": "Orlando", - "county": "Orange", - "state": "FL", - "zip": "32801", - "phone": "407-420-1152", - "fax": "407-420-7195", - "email": "marcelino@maggs.com", - "web": "http://www.marcelinomaggs.com", - "followers": 5320 - }, - { - "firstname": "Florine", - "lastname": "Willardson", - "company": "Lunt, Donald C Esq", - "address": "5605 Ne 105th Ave", - "city": "Portland", - "county": "Multnomah", - "state": "OR", - "zip": "97220", - "phone": "503-256-6559", - "fax": "503-256-8982", - "email": "florine@willardson.com", - "web": "http://www.florinewillardson.com", - "followers": 2336 - }, - { - "firstname": "Jude", - "lastname": "Haza", - "company": "Howard Fabrication", - "address": "1348 Liberty Pike", - "city": "Franklin", - "county": "Williamson", - "state": "TN", - "zip": "37067", - "phone": "615-790-3984", - "fax": "615-790-3042", - "email": "jude@haza.com", - "web": "http://www.judehaza.com", - "followers": 7311 - }, - { - "firstname": "Eldon", - "lastname": "Sutch", - "company": "Friesen And Kane Public Accts", - "address": "1818 E Atlantic St", - "city": "Philadelphia", - "county": "Philadelphia", - "state": "PA", - "zip": "19134", - "phone": "215-743-2414", - "fax": "215-743-2529", - "email": "eldon@sutch.com", - "web": "http://www.eldonsutch.com", - "followers": 6895 - }, - { - "firstname": "Lashonda", - "lastname": "Enote", - "company": "Nichols Village The Inn", - "address": "6301 Owensmouth Ave", - "city": "Woodland Hills", - "county": "Los Angeles", - "state": "CA", - "zip": "91367", - "phone": "818-704-8490", - "fax": "818-704-7539", - "email": "lashonda@enote.com", - "web": "http://www.lashondaenote.com", - "Note": "Ancien Dailymotion, recontré à LeWeb London 2012", - "followers": 6383 - }, - { - "firstname": "Marla", - "lastname": "Folz", - "company": "Odonoghue C Kevin", - "address": "201 Electronics Blvd Sw", - "city": "Huntsville", - "county": "Madison", - "state": "AL", - "zip": "35824", - "phone": "256-464-3329", - "fax": "256-464-6964", - "email": "marla@folz.com", - "web": "http://www.marlafolz.com", - "Note": "Product Manager at Sage France & WebMaster of ConseilsMarketing.Fr Interview at LEWeb", - "followers": 5861 - }, - { - "firstname": "Reginald", - "lastname": "Lunan", - "company": "Healey Chevy Olds Buick Geo", - "address": "985 Parker Ct", - "city": "Santa Clara", - "county": "Santa Clara", - "state": "CA", - "zip": "95050", - "phone": "408-727-1747", - "fax": "408-727-0884", - "email": "reginald@lunan.com", - "web": "http://www.reginaldlunan.com", - "followers": 7075 - }, - { - "firstname": "Kyle", - "lastname": "Lindauer", - "company": "Gem Tec Inc", - "address": "2000 E Jefferson St", - "city": "Phoenix", - "county": "Maricopa", - "state": "AZ", - "zip": "85034", - "phone": "602-258-5196", - "fax": "602-258-8609", - "email": "kyle@lindauer.com", - "web": "http://www.kylelindauer.com", - "followers": 6277 - }, - { - "firstname": "Son", - "lastname": "Marschke", - "company": "Evenings Dlght Fireplaces", - "address": "1119 Wheeler Ave", - "city": "Scranton", - "county": "Lackawanna", - "state": "PA", - "zip": "18510", - "phone": "570-969-0886", - "fax": "570-969-8176", - "email": "son@marschke.com", - "web": "http://www.sonmarschke.com", - "followers": 3481 - }, - { - "firstname": "Johnie", - "lastname": "Minaai", - "company": "Darling, Pamela E", - "address": "2100 Linwood Ave", - "city": "Fort Lee", - "county": "Bergen", - "state": "NJ", - "zip": "07024", - "phone": "201-592-4771", - "fax": "201-592-8423", - "email": "johnie@minaai.com", - "web": "http://www.johnieminaai.com", - "followers": 5903 - }, - { - "firstname": "Kelli", - "lastname": "Varrato", - "company": "Frances Meyer Inc", - "address": "2505 Congress St", - "city": "San Diego", - "county": "San Diego", - "state": "CA", - "zip": "92110", - "phone": "858-298-3969", - "fax": "858-298-6695", - "email": "kelli@varrato.com", - "web": "http://www.kellivarrato.com", - "followers": 9891 - }, - { - "firstname": "Neva", - "lastname": "Marsell", - "company": "Comfort Inn Wilshire", - "address": "1312 W Lincoln Ave", - "city": "Olivia", - "county": "Renville", - "state": "MN", - "zip": "56277", - "phone": "320-523-4975", - "fax": "320-523-8378", - "email": "neva@marsell.com", - "web": "http://www.nevamarsell.com", - "followers": 4114 - }, - { - "firstname": "Brice", - "lastname": "Hedglin", - "company": "Cupkovic, Walter D Esq", - "address": "2809 Granny White Pike", - "city": "Nashville", - "county": "Davidson", - "state": "TN", - "zip": "37204", - "phone": "615-292-9016", - "fax": "615-292-9027", - "email": "brice@hedglin.com", - "web": "http://www.bricehedglin.com", - "followers": 7730 - }, - { - "firstname": "Terrance", - "lastname": "Nimmer", - "company": "C D Short Foods Inc", - "address": "1400 N Woodward Ave", - "city": "Bloomfield Hills", - "county": "Oakland", - "state": "MI", - "zip": "48304", - "phone": "248-647-0653", - "fax": "248-647-1999", - "email": "terrance@nimmer.com", - "web": "http://www.terrancenimmer.com", - "followers": 7388 - }, - { - "firstname": "Carol", - "lastname": "Krisman", - "company": "Uniglobe Transeas Travel", - "address": "100 E 85th St", - "city": "New York", - "county": "New York", - "state": "NY", - "zip": "10028", - "phone": "212-472-7877", - "fax": "212-472-9579", - "email": "carol@krisman.com", - "web": "http://www.carolkrisman.com", - "followers": 5985 - }, - { - "firstname": "Dollie", - "lastname": "Pillitteri", - "company": "Jiffy Moving & Storage Company", - "address": "4024 Merchant Rd", - "city": "Fort Wayne", - "county": "Allen", - "state": "IN", - "zip": "46818", - "phone": "260-489-3094", - "fax": "260-489-4697", - "email": "dollie@pillitteri.com", - "web": "http://www.dolliepillitteri.com", - "followers": 2624 - }, - { - "firstname": "Mellissa", - "lastname": "Sule", - "company": "Dowse, Geoffrey Esq", - "address": "92 Argonaut #-270", - "city": "Aliso Viejo", - "county": "Orange", - "state": "CA", - "zip": "92656", - "phone": "949-768-6176", - "fax": "949-768-8107", - "email": "mellissa@sule.com", - "web": "http://www.mellissasule.com", - "followers": 2709 - }, - { - "firstname": "Antony", - "lastname": "Thierauf", - "company": "Gutzwiller, Robert H Esq", - "address": "4915 Industrial Way", - "city": "Coeur d Alene", - "county": "Kootenai", - "state": "ID", - "zip": "83814", - "phone": "208-667-5252", - "fax": "208-667-5935", - "email": "antony@thierauf.com", - "web": "http://www.antonythierauf.com", - "followers": 1044 - }, - { - "firstname": "Reina", - "lastname": "Reisenauer", - "company": "Terrance Fox", - "address": "207 N Main St", - "city": "Hutchins", - "county": "Dallas", - "state": "TX", - "zip": "75141", - "phone": "972-225-9930", - "fax": "972-225-9569", - "email": "reina@reisenauer.com", - "web": "http://www.reinareisenauer.com", - "followers": 2953 - }, - { - "firstname": "Zane", - "lastname": "Sulikowski", - "company": "Meijer Associates Credit Union", - "address": "2375 3rd St", - "city": "Riverside", - "county": "Riverside", - "state": "CA", - "zip": "92507", - "phone": "951-683-4479", - "fax": "951-683-9932", - "email": "zane@sulikowski.com", - "web": "http://www.zanesulikowski.com", - "followers": 7275 - }, - { - "firstname": "Hilario", - "lastname": "Cassa", - "company": "Independence Assocaites Inc", - "address": "2222 Santa Monica Blvd", - "city": "Santa Monica", - "county": "Los Angeles", - "state": "CA", - "zip": "90404", - "phone": "310-828-6710", - "fax": "310-828-1895", - "email": "hilario@cassa.com", - "web": "http://www.hilariocassa.com", - "followers": 994 - }, - { - "firstname": "Veronica", - "lastname": "Radman", - "company": "Martin, Anthony D Esq", - "address": "235 W Main St", - "city": "Charlottesville", - "county": "Charlottesville City", - "state": "VA", - "zip": "22902", - "phone": "434-979-3306", - "fax": "434-979-9777", - "email": "veronica@radman.com", - "web": "http://www.veronicaradman.com", - "followers": 7568 - }, - { - "firstname": "Teri", - "lastname": "Erlewine", - "company": "League Of Kans Municipalities", - "address": "370 34th St St", - "city": "Saint Petersburg", - "county": "Pinellas", - "state": "FL", - "zip": "33711", - "phone": "727-327-3850", - "fax": "727-327-8494", - "email": "teri@erlewine.com", - "web": "http://www.terierlewine.com", - "followers": 6077 - }, - { - "firstname": "Alissa", - "lastname": "Mountjoy", - "company": "Technical & Mgmt Svc Corp", - "address": "6585 Commerce Blvd", - "city": "Rohnert Park", - "county": "Sonoma", - "state": "CA", - "zip": "94928", - "phone": "707-585-9715", - "fax": "707-585-7011", - "email": "alissa@mountjoy.com", - "web": "http://www.alissamountjoy.com", - "followers": 4886 - }, - { - "firstname": "Helene", - "lastname": "Iberg", - "company": "Spec Check Inc", - "address": "24800 Rockside Rd", - "city": "Bedford", - "county": "Cuyahoga", - "state": "OH", - "zip": "44146", - "phone": "440-786-6052", - "fax": "440-786-9246", - "email": "helene@iberg.com", - "web": "http://www.heleneiberg.com", - "followers": 716 - }, - { - "firstname": "Lona", - "lastname": "Scronce", - "company": "L & L Builders", - "address": "Rte 6 & 209", - "city": "Matamoras", - "county": "Pike", - "state": "PA", - "zip": "18336", - "phone": "570-296-4820", - "fax": "570-296-2054", - "email": "lona@scronce.com", - "web": "http://www.lonascronce.com", - "followers": 4687 - }, - { - "firstname": "Jeremy", - "lastname": "Lampi", - "company": "E Henderson Inc", - "address": "150 Sawkill Ave", - "city": "Milford", - "county": "Pike", - "state": "PA", - "zip": "18337", - "phone": "570-296-7797", - "fax": "570-296-4647", - "email": "jeremy@lampi.com", - "web": "http://www.jeremylampi.com", - "followers": 4714 - }, - { - "firstname": "Mitch", - "lastname": "Schattner", - "company": "Cosgrove Eisenberg & Kiley Pc", - "address": "3001 Geary Blvd", - "city": "San Francisco", - "county": "San Francisco", - "state": "CA", - "zip": "94118", - "phone": "415-668-8105", - "fax": "415-668-5841", - "email": "mitch@schattner.com", - "web": "http://www.mitchschattner.com", - "followers": 4388 - }, - { - "firstname": "Hans", - "lastname": "Carlan", - "company": "Midlen & Guillot Chartered", - "address": "509 W 4th Ave", - "city": "Anchorage", - "county": "Anchorage", - "state": "AK", - "zip": "99501", - "phone": "907-276-2956", - "fax": "907-276-6002", - "email": "hans@carlan.com", - "web": "http://www.hanscarlan.com", - "followers": 985 - }, - { - "firstname": "Concetta", - "lastname": "Sarchett", - "company": "Barco/chromatics Inc", - "address": "2405 Grand Blvd", - "city": "Kansas City", - "county": "Jackson", - "state": "MO", - "zip": "64108", - "phone": "816-274-3833", - "fax": "816-274-6897", - "email": "concetta@sarchett.com", - "web": "http://www.concettasarchett.com", - "followers": 3086 - }, - { - "firstname": "Isaac", - "lastname": "Zackery", - "company": "Holiday Inn Of Issaquah", - "address": "321 Palmer Rd", - "city": "Denville", - "county": "Morris", - "state": "NJ", - "zip": "07834", - "phone": "973-328-5943", - "fax": "973-328-1903", - "email": "isaac@zackery.com", - "web": "http://www.isaaczackery.com", - "followers": 501 - }, - { - "firstname": "Doug", - "lastname": "Matrisciano", - "company": "Cefpi", - "address": "12500 Ne 10th Pl", - "city": "Bellevue", - "county": "King", - "state": "WA", - "zip": "98005", - "phone": "425-451-5906", - "fax": "425-451-1273", - "email": "doug@matrisciano.com", - "web": "http://www.dougmatrisciano.com", - "followers": 9054 - }, - { - "firstname": "Devon", - "lastname": "Samrah", - "company": "Software Pursuits Inc", - "address": "1219 Pine Ave", - "city": "Orlando", - "county": "Orange", - "state": "FL", - "zip": "32824", - "phone": "407-240-2401", - "fax": "407-240-8312", - "email": "devon@samrah.com", - "web": "http://www.devonsamrah.com", - "followers": 6795 - }, - { - "firstname": "Amos", - "lastname": "Linnan", - "company": "Quincy, Jim", - "address": "3960 W 26th St", - "city": "Chicago", - "county": "Cook", - "state": "IL", - "zip": "60623", - "phone": "773-277-8332", - "fax": "773-277-4756", - "email": "amos@linnan.com", - "web": "http://www.amoslinnan.com", - "followers": 6297 - }, - { - "firstname": "Manuel", - "lastname": "Dienhart", - "company": "Bohning Co Ltd", - "address": "40 E Mcmicken Ave", - "city": "Cincinnati", - "county": "Hamilton", - "state": "OH", - "zip": "45210", - "phone": "513-357-4669", - "fax": "513-357-7989", - "email": "manuel@dienhart.com", - "web": "http://www.manueldienhart.com", - "followers": 6771 - }, - { - "firstname": "Audra", - "lastname": "Cantu", - "company": "Chesapeake Telephone Systems", - "address": "935 S 2nd St", - "city": "Plainfield", - "county": "Union", - "state": "NJ", - "zip": "07063", - "phone": "908-756-1816", - "fax": "908-756-5441", - "email": "audra@cantu.com", - "web": "http://www.audracantu.com", - "followers": 3088 - }, - { - "firstname": "Keisha", - "lastname": "Ransonet", - "company": "Hsk Decker", - "address": "1049 Lakloey Dr", - "city": "North Pole", - "county": "Fairbanks North Star", - "state": "AK", - "zip": "99705", - "phone": "907-488-6897", - "fax": "907-488-2093", - "email": "keisha@ransonet.com", - "web": "http://www.keisharansonet.com", - "followers": 5340 - }, - { - "firstname": "Rolando", - "lastname": "Baumann", - "company": "Erie Brush Co", - "address": "921 Sw Washington St #-321", - "city": "Portland", - "county": "Multnomah", - "state": "OR", - "zip": "97205", - "phone": "503-241-6723", - "fax": "503-241-7691", - "email": "rolando@baumann.com", - "web": "http://www.rolandobaumann.com", - "followers": 9754 - }, - { - "firstname": "Maryanne", - "lastname": "Whyman", - "company": "Walls, Robert E Esq", - "address": "1008 S San Pedro St", - "city": "Los Angeles", - "county": "Los Angeles", - "state": "CA", - "zip": "90015", - "phone": "213-748-1137", - "fax": "213-748-0447", - "email": "maryanne@whyman.com", - "web": "http://www.maryannewhyman.com", - "followers": 844 - }, - { - "firstname": "Kurtis", - "lastname": "Asberry", - "company": "Budgetel Inns", - "address": "Box #-37223", - "city": "El Paso", - "county": "El Paso", - "state": "TX", - "zip": "79937", - "phone": "915-591-1621", - "fax": "915-591-3614", - "email": "kurtis@asberry.com", - "web": "http://www.kurtisasberry.com", - "followers": 8502 - }, - { - "firstname": "Ed", - "lastname": "Gompf", - "company": "Corro Therm Inc", - "address": "3 B Floor Care & Hskpg Svc", - "city": "Catawissa", - "county": "Columbia", - "state": "PA", - "zip": "17820", - "phone": "570-799-2838", - "fax": "570-799-4583", - "email": "ed@gompf.com", - "web": "http://www.edgompf.com", - "followers": 8705 - }, - { - "firstname": "Norman", - "lastname": "Betance", - "company": "Precision Electric Co Inc", - "address": "7949 E Acoma Dr", - "city": "Scottsdale", - "county": "Maricopa", - "state": "AZ", - "zip": "85260", - "phone": "480-991-7884", - "fax": "480-991-6547", - "email": "norman@betance.com", - "web": "http://www.normanbetance.com", - "followers": 4602 - }, - { - "firstname": "Berta", - "lastname": "Karczewski", - "company": "Sather Eng Inc", - "address": "1035 N Mcqueen Rd #-133", - "city": "Gilbert", - "county": "Maricopa", - "state": "AZ", - "zip": "85233", - "phone": "480-926-0770", - "fax": "480-926-7533", - "email": "berta@karczewski.com", - "web": "http://www.bertakarczewski.com", - "followers": 1093 - }, - { - "firstname": "Mac", - "lastname": "Marksberry", - "company": "Pursell, David B Esq", - "address": "112 W Plum", - "city": "Doniphan", - "county": "Hall", - "state": "NE", - "zip": "68832", - "phone": "402-845-4275", - "fax": "402-845-8229", - "email": "mac@marksberry.com", - "web": "http://www.macmarksberry.com", - "followers": 6081 - }, - { - "firstname": "Sandra", - "lastname": "Graen", - "company": "Action Remediation Co", - "address": "106 Erie St", - "city": "Hutchinson", - "county": "McLeod", - "state": "MN", - "zip": "55350", - "phone": "320-587-3844", - "fax": "320-587-7201", - "email": "sandra@graen.com", - "web": "http://www.sandragraen.com", - "followers": 4844 - }, - { - "firstname": "Lee", - "lastname": "Javens", - "company": "Dyer, James R Esq", - "address": "6086 N Lyons Rd", - "city": "Burlington", - "county": "Racine", - "state": "WI", - "zip": "53105", - "phone": "262-763-9582", - "fax": "262-763-3845", - "email": "lee@javens.com", - "web": "http://www.leejavens.com", - "followers": 2954 - }, - { - "firstname": "Fran", - "lastname": "Zanders", - "company": "River City Body Co", - "address": "6312 S Yellowstone Hwy", - "city": "Idaho Falls", - "county": "Bonneville", - "state": "ID", - "zip": "83402", - "phone": "208-525-6418", - "fax": "208-525-5501", - "email": "fran@zanders.com", - "web": "http://www.franzanders.com", - "followers": 9590 - }, - { - "firstname": "Lane", - "lastname": "Brantz", - "company": "Kings Inn", - "address": "106 Erie St", - "city": "Hutchinson", - "county": "McLeod", - "state": "MN", - "zip": "55350", - "phone": "320-587-2903", - "fax": "320-587-3448", - "email": "lane@brantz.com", - "web": "http://www.lanebrantz.com", - "followers": 361 - }, - { - "firstname": "Bess", - "lastname": "Marso", - "company": "Lesher Printers Inc", - "address": "15542 Chemical Ln", - "city": "Huntington Beach", - "county": "Orange", - "state": "CA", - "zip": "92649", - "phone": "714-895-4582", - "fax": "714-895-8188", - "email": "bess@marso.com", - "web": "http://www.bessmarso.com", - "followers": 9552 - }, - { - "firstname": "Tamara", - "lastname": "Declue", - "company": "Glen Burnie The Bank Of", - "address": "1900 W Loop S #-600", - "city": "Houston", - "county": "Harris", - "state": "TX", - "zip": "77027", - "phone": "713-871-3958", - "fax": "713-871-6355", - "email": "tamara@declue.com", - "web": "http://www.tamaradeclue.com", - "followers": 3229 - }, - { - "firstname": "Denise", - "lastname": "Speegle", - "company": "Shipley Oil Company", - "address": "2078 Foster Ave", - "city": "Wheeling", - "county": "Cook", - "state": "IL", - "zip": "60090", - "phone": "847-870-8743", - "fax": "847-870-6026", - "email": "denise@speegle.com", - "web": "http://www.denisespeegle.com", - "followers": 1139 - }, - { - "firstname": "Lynda", - "lastname": "Youtsey", - "company": "Accurate Color Inc", - "address": "1370 S Bertelsen Rd", - "city": "Eugene", - "county": "Lane", - "state": "OR", - "zip": "97402", - "phone": "541-342-0606", - "fax": "541-342-0655", - "email": "lynda@youtsey.com", - "web": "http://www.lyndayoutsey.com", - "followers": 378 - }, - { - "firstname": "Diann", - "lastname": "Burigsay", - "company": "Snyder, Stephen E Esq", - "address": "13026 S Normandie Ave", - "city": "Gardena", - "county": "Los Angeles", - "state": "CA", - "zip": "90249", - "phone": "310-321-8278", - "fax": "310-321-0564", - "email": "diann@burigsay.com", - "web": "http://www.diannburigsay.com", - "followers": 6193 - }, - { - "firstname": "Mari", - "lastname": "Hwang", - "company": "Play Craft Pontoon Co", - "address": "23352 El Toro Rd", - "city": "Lake Forest", - "county": "Orange", - "state": "CA", - "zip": "92630", - "phone": "949-583-6901", - "fax": "949-583-7758", - "email": "mari@hwang.com", - "web": "http://www.marihwang.com", - "followers": 6719 - }, - { - "firstname": "Shanna", - "lastname": "Neundorfer", - "company": "Door Systems", - "address": "833 E Allegheny Ave", - "city": "Philadelphia", - "county": "Philadelphia", - "state": "PA", - "zip": "19134", - "phone": "215-426-9722", - "fax": "215-426-8416", - "email": "shanna@neundorfer.com", - "web": "http://www.shannaneundorfer.com", - "followers": 9759 - }, - { - "firstname": "Sherwood", - "lastname": "Detillier", - "company": "Minteq International", - "address": "Box #-851", - "city": "Woodland Hills", - "county": "Los Angeles", - "state": "CA", - "zip": "91365", - "phone": "818-703-9160", - "fax": "818-703-0447", - "email": "sherwood@detillier.com", - "web": "http://www.sherwooddetillier.com", - "followers": 6816 - }, - { - "firstname": "Walton", - "lastname": "Schwallie", - "company": "Nielsen, Laura W Md", - "address": "154 Main St", - "city": "Upton", - "county": "Worcester", - "state": "MA", - "zip": "01568", - "phone": "508-529-8783", - "fax": "508-529-8368", - "email": "walton@schwallie.com", - "web": "http://www.waltonschwallie.com", - "followers": 4498 - }, - { - "firstname": "Judy", - "lastname": "Gartenmayer", - "company": "Pro Infusion Pharm Inc", - "address": "3260 W New Haven Ave", - "city": "Melbourne", - "county": "Brevard", - "state": "FL", - "zip": "32904", - "phone": "321-676-3091", - "fax": "321-676-3378", - "email": "judy@gartenmayer.com", - "web": "http://www.judygartenmayer.com", - "followers": 5730 - }, - { - "firstname": "Antione", - "lastname": "Mccleary", - "company": "Cerberus Pyrotronics", - "address": "1110 25th Ave N", - "city": "Fargo", - "county": "Cass", - "state": "ND", - "zip": "58102", - "phone": "701-293-8410", - "fax": "701-293-7439", - "email": "antione@mccleary.com", - "web": "http://www.antionemccleary.com", - "followers": 5273 - }, - { - "firstname": "Kay", - "lastname": "Ganguli", - "company": "Hanson, Bruce Esq", - "address": "3763 Scripps Dr", - "city": "Las Vegas", - "county": "Clark", - "state": "NV", - "zip": "89103", - "phone": "702-876-3089", - "fax": "702-876-9367", - "email": "kay@ganguli.com", - "web": "http://www.kayganguli.com", - "followers": 6368 - }, - { - "firstname": "Oma", - "lastname": "Duffy", - "company": "Laun Law Offices", - "address": "255 Industrial Dr", - "city": "Franklin", - "county": "Warren", - "state": "OH", - "zip": "45005", - "phone": "937-746-7537", - "fax": "937-746-4129", - "email": "oma@duffy.com", - "web": "http://www.omaduffy.com", - "followers": 9375 - }, - { - "firstname": "Devon", - "lastname": "Teston", - "company": "Bilton, Dean H Esq", - "address": "1900 W Loop S", - "city": "Houston", - "county": "Harris", - "state": "TX", - "zip": "77027", - "phone": "713-871-9773", - "fax": "713-871-0838", - "email": "devon@teston.com", - "web": "http://www.devonteston.com", - "followers": 3426 - }, - { - "firstname": "Jade", - "lastname": "Erlebach", - "company": "Vickery Tape & Label Co Inc", - "address": "975 Flynn Rd", - "city": "Camarillo", - "county": "Ventura", - "state": "CA", - "zip": "93012", - "phone": "805-445-8331", - "fax": "805-445-9961", - "email": "jade@erlebach.com", - "web": "http://www.jadeerlebach.com", - "followers": 4178 - }, - { - "firstname": "Roseann", - "lastname": "Jerko", - "company": "Larry Farmer Appraisal Co Inc", - "address": "850 Glen Ave", - "city": "Moorestown", - "county": "Burlington", - "state": "NJ", - "zip": "08057", - "phone": "856-866-4945", - "fax": "856-866-1542", - "email": "roseann@jerko.com", - "web": "http://www.roseannjerko.com", - "followers": 5397 - }, - { - "firstname": "Ruthie", - "lastname": "Zortman", - "company": "Review Monterey Peninsula", - "address": "4508 Enterprise St", - "city": "Fremont", - "county": "Alameda", - "state": "CA", - "zip": "94538", - "phone": "510-651-1410", - "fax": "510-651-1242", - "email": "ruthie@zortman.com", - "web": "http://www.ruthiezortman.com", - "followers": 6079 - }, - { - "firstname": "Leif", - "lastname": "Arguin", - "company": "Cmplt Cmptg Solutions Ne", - "address": "4508 Enterprise St", - "city": "Fremont", - "county": "Alameda", - "state": "CA", - "zip": "94538", - "phone": "510-651-4937", - "fax": "510-651-8302", - "email": "leif@arguin.com", - "web": "http://www.leifarguin.com", - "followers": 6571 - }, - { - "firstname": "Millicent", - "lastname": "Ekstrom", - "company": "Personal Creations Inc", - "address": "151 Brown St #-b", - "city": "Lawrenceburg", - "county": "Dearborn", - "state": "IN", - "zip": "47025", - "phone": "812-537-7287", - "fax": "812-537-5442", - "email": "millicent@ekstrom.com", - "web": "http://www.millicentekstrom.com", - "followers": 5739 - }, - { - "firstname": "Val", - "lastname": "Oborne", - "company": "Stone Container Corporation", - "address": "7846 Clybourn Ave", - "city": "Sun Valley", - "county": "Los Angeles", - "state": "CA", - "zip": "91352", - "phone": "818-767-1347", - "fax": "818-767-5123", - "email": "val@oborne.com", - "web": "http://www.valoborne.com", - "followers": 6746 - }, - { - "firstname": "Bridgett", - "lastname": "Retort", - "company": "Womens Resource & Refrl Ntwrk", - "address": "6747 Signat Dr", - "city": "Houston", - "county": "Harris", - "state": "TX", - "zip": "77041", - "phone": "713-466-7259", - "fax": "713-466-3278", - "email": "bridgett@retort.com", - "web": "http://www.bridgettretort.com", - "followers": 3060 - }, - { - "firstname": "Tia", - "lastname": "Lino", - "company": "Superior Gundrilling", - "address": "35375 Highway 228", - "city": "Brownsville", - "county": "Linn", - "state": "OR", - "zip": "97327", - "phone": "541-466-2483", - "fax": "541-466-1661", - "email": "tia@lino.com", - "web": "http://www.tialino.com", - "followers": 8942 - }, - { - "firstname": "Jarrett", - "lastname": "Kenzie", - "company": "Young Men Christian Assn Cnty", - "address": "11551 Riverpark Way", - "city": "Chesterfield", - "county": "Chesterfield", - "state": "VA", - "zip": "23838", - "phone": "804-739-3007", - "fax": "804-739-7905", - "email": "jarrett@kenzie.com", - "web": "http://www.jarrettkenzie.com", - "followers": 9459 - }, - { - "firstname": "Mara", - "lastname": "Vanderzwaag", - "company": "Brown & Brown Law Office", - "address": "2550 E Lucas Dr", - "city": "Beaumont", - "county": "Jefferson", - "state": "TX", - "zip": "77703", - "phone": "409-892-1231", - "fax": "409-892-8492", - "email": "mara@vanderzwaag.com", - "web": "http://www.maravanderzwaag.com", - "followers": 2331 - }, - { - "firstname": "Tiffany", - "lastname": "Knust", - "company": "Vantage Products", - "address": "1425 Koll Cir #-107", - "city": "San Jose", - "county": "Santa Clara", - "state": "CA", - "zip": "95112", - "phone": "408-453-0357", - "fax": "408-453-1525", - "email": "tiffany@knust.com", - "web": "http://www.tiffanyknust.com", - "followers": 2896 - }, - { - "firstname": "Fabian", - "lastname": "Mcshaw", - "company": "Bodik, Michael G Esq", - "address": "6023 Garfield Ave", - "city": "Los Angeles", - "county": "Los Angeles", - "state": "CA", - "zip": "90040", - "phone": "323-726-5319", - "fax": "323-726-8499", - "email": "fabian@mcshaw.com", - "web": "http://www.fabianmcshaw.com", - "followers": 4892 - }, - { - "firstname": "Annabelle", - "lastname": "Coger", - "company": "Center For Resource Management", - "address": "1200 Shreveport Barksdale Hwy", - "city": "Shreveport", - "county": "Caddo", - "state": "LA", - "zip": "71105", - "phone": "318-865-8418", - "fax": "318-865-7381", - "email": "annabelle@coger.com", - "web": "http://www.annabellecoger.com", - "followers": 2623 - }, - { - "firstname": "Marisa", - "lastname": "Smiler", - "company": "Star Systems Inc", - "address": "200 Broadhollow Rd", - "city": "Melville", - "county": "Suffolk", - "state": "NY", - "zip": "11747", - "phone": "631-673-3339", - "fax": "631-673-1556", - "email": "marisa@smiler.com", - "web": "http://www.marisasmiler.com", - "followers": 4693 - }, - { - "firstname": "Samantha", - "lastname": "Bordwell", - "company": "Interwest Freight System Inc", - "address": "23405 Sw 152nd Ct", - "city": "Homestead", - "county": "Miami-Dade", - "state": "FL", - "zip": "33032", - "phone": "305-247-8402", - "fax": "305-247-4599", - "email": "samantha@bordwell.com", - "web": "http://www.samanthabordwell.com", - "followers": 6109 - }, - { - "firstname": "Felecia", - "lastname": "Riedl", - "company": "Benson, John S", - "address": "333 Andrew Ave", - "city": "Salt Lake City", - "county": "Salt Lake", - "state": "UT", - "zip": "84115", - "phone": "801-486-6484", - "fax": "801-486-6755", - "email": "felecia@riedl.com", - "web": "http://www.feleciariedl.com", - "followers": 7849 - }, - { - "firstname": "Kris", - "lastname": "Persson", - "company": "Tweel, Ronald R Esq", - "address": "1765 Sw Highway 97", - "city": "Madras", - "county": "Jefferson", - "state": "OR", - "zip": "97741", - "phone": "541-475-8404", - "fax": "541-475-0021", - "email": "kris@persson.com", - "web": "http://www.krispersson.com", - "followers": 232 - }, - { - "firstname": "Kylie", - "lastname": "Bridgeman", - "company": "Thomas & Libowitz Pa", - "address": "118 Lenzner Ct", - "city": "Sewickley", - "county": "Allegheny", - "state": "PA", - "zip": "15143", - "phone": "412-741-4604", - "fax": "412-741-4236", - "email": "kylie@bridgeman.com", - "web": "http://www.kyliebridgeman.com", - "followers": 9868 - }, - { - "firstname": "Eduardo", - "lastname": "Bellendir", - "company": "Powers & Assocs", - "address": "1800 Pine Run Rd", - "city": "Wilkes Barre", - "county": "Luzerne", - "state": "PA", - "zip": "18702", - "phone": "570-822-0721", - "fax": "570-822-6267", - "email": "eduardo@bellendir.com", - "web": "http://www.eduardobellendir.com", - "followers": 597 - }, - { - "firstname": "Waldo", - "lastname": "Edberg", - "company": "Bush Building Corporation", - "address": "2017 W Jackson St", - "city": "Tupelo", - "county": "Lee", - "state": "MS", - "zip": "38801", - "phone": "662-842-4133", - "fax": "662-842-8645", - "email": "waldo@edberg.com", - "web": "http://www.waldoedberg.com", - "followers": 6609 - }, - { - "firstname": "Brent", - "lastname": "Vaidya", - "company": "Crain Industries", - "address": "45 Church St", - "city": "Stamford", - "county": "Fairfield", - "state": "CT", - "zip": "06906", - "phone": "203-359-2824", - "fax": "203-359-6466", - "email": "brent@vaidya.com", - "web": "http://www.brentvaidya.com", - "followers": 3729 - }, - { - "firstname": "Bette", - "lastname": "Barcelona", - "company": "Fischer, William R Esq", - "address": "432 Lignite Ave", - "city": "Fairbanks", - "county": "Fairbanks North Star", - "state": "AK", - "zip": "99701", - "phone": "907-456-6738", - "fax": "907-456-4144", - "email": "bette@barcelona.com", - "web": "http://www.bettebarcelona.com", - "followers": 5857 - }, - { - "firstname": "Rich", - "lastname": "Gleave", - "company": "Finkelstein, Bernard A Cpa", - "address": "827 E 10th Ave", - "city": "Anchorage", - "county": "Anchorage", - "state": "AK", - "zip": "99501", - "phone": "907-277-9294", - "fax": "907-277-2227", - "email": "rich@gleave.com", - "web": "http://www.richgleave.com", - "followers": 488 - }, - { - "firstname": "Lyman", - "lastname": "Whittley", - "company": "Berry, Robert A Esq", - "address": "3030 Bridgeway", - "city": "Sausalito", - "county": "Marin", - "state": "CA", - "zip": "94965", - "phone": "415-332-9570", - "fax": "415-332-7303", - "email": "lyman@whittley.com", - "web": "http://www.lymanwhittley.com", - "followers": 7950 - }, - { - "firstname": "Maryann", - "lastname": "Garnette", - "company": "Catholic University Of", - "address": "582 Centerville Rd", - "city": "Lancaster", - "county": "Lancaster", - "state": "PA", - "zip": "17601", - "phone": "717-560-6671", - "fax": "717-560-5625", - "email": "maryann@garnette.com", - "web": "http://www.maryanngarnette.com", - "followers": 5412 - }, - { - "firstname": "Jimmie", - "lastname": "Zarzycki", - "company": "John C Auth", - "address": "215 E Pikes Peak Ave", - "city": "Colorado Springs", - "county": "El Paso", - "state": "CO", - "zip": "80903", - "phone": "719-632-0667", - "fax": "719-632-5612", - "email": "jimmie@zarzycki.com", - "web": "http://www.jimmiezarzycki.com", - "followers": 4291 - }, - { - "firstname": "Gisela", - "lastname": "Kosicki", - "company": "Lisher, John L Esq", - "address": "22140 Ventura Blvd #-4", - "city": "Woodland Hills", - "county": "Los Angeles", - "state": "CA", - "zip": "91364", - "phone": "818-713-6306", - "fax": "818-713-8346", - "email": "gisela@kosicki.com", - "web": "http://www.giselakosicki.com", - "followers": 377 - }, - { - "firstname": "Marlene", - "lastname": "Hammeren", - "company": "Chamot, Philip S Esq", - "address": "1000 Monte Sano Blvd Se", - "city": "Huntsville", - "county": "Madison", - "state": "AL", - "zip": "35801", - "phone": "256-533-8674", - "fax": "256-533-1176", - "email": "marlene@hammeren.com", - "web": "http://www.marlenehammeren.com", - "followers": 428 - }, - { - "firstname": "Kris", - "lastname": "Stanzak", - "company": "Cenref Labs", - "address": "3100 Dodge St", - "city": "Dubuque", - "county": "Dubuque", - "state": "IA", - "zip": "52003", - "phone": "563-557-2588", - "fax": "563-557-6308", - "email": "kris@stanzak.com", - "web": "http://www.krisstanzak.com", - "followers": 368 - }, - { - "firstname": "Roman", - "lastname": "Simone", - "company": "Spottswood, William B Esq", - "address": "610 W Main St", - "city": "Batavia", - "county": "Clermont", - "state": "OH", - "zip": "45103", - "phone": "513-732-3089", - "fax": "513-732-2547", - "email": "roman@simone.com", - "web": "http://www.romansimone.com", - "followers": 3460 - }, - { - "firstname": "Cathryn", - "lastname": "Nicolaus", - "company": "Perkins Photo/graphics Inc", - "address": "2575 State Highway 32", - "city": "Chico", - "county": "Butte", - "state": "CA", - "zip": "95973", - "phone": "530-345-4627", - "fax": "530-345-8372", - "email": "cathryn@nicolaus.com", - "web": "http://www.cathrynnicolaus.com", - "followers": 9494 - }, - { - "firstname": "Lana", - "lastname": "Keels", - "company": "Veron, J Michael Esq", - "address": "711 Park Ave", - "city": "Freehold", - "county": "Monmouth", - "state": "NJ", - "zip": "07728", - "phone": "732-462-1106", - "fax": "732-462-3575", - "email": "lana@keels.com", - "web": "http://www.lanakeels.com", - "followers": 2796 - }, - { - "firstname": "Malissa", - "lastname": "Ziesemer", - "company": "Electron Rentals Inc", - "address": "330 S Ocean Blvd", - "city": "Palm Beach", - "county": "Palm Beach", - "state": "FL", - "zip": "33480", - "phone": "561-655-6443", - "fax": "561-655-9129", - "email": "malissa@ziesemer.com", - "web": "http://www.malissaziesemer.com", - "followers": 7525 - }, - { - "firstname": "Pamala", - "lastname": "Brodtmann", - "company": "Gagen, William E Jr", - "address": "342 Seaside Ave", - "city": "Honolulu", - "county": "Honolulu", - "state": "HI", - "zip": "96815", - "phone": "808-926-0776", - "fax": "808-926-6173", - "email": "pamala@brodtmann.com", - "web": "http://www.pamalabrodtmann.com", - "followers": 134 - }, - { - "firstname": "Heriberto", - "lastname": "Tivis", - "company": "Newood", - "address": "1135 Kildaire Farm Rd", - "city": "Cary", - "county": "Wake", - "state": "NC", - "zip": "27511", - "phone": "919-460-8104", - "fax": "919-460-4304", - "email": "heriberto@tivis.com", - "web": "http://www.heribertotivis.com", - "followers": 2418 - }, - { - "firstname": "Edgardo", - "lastname": "Prudente", - "company": "R A Hamilton Corp", - "address": "1110 N Highway 360", - "city": "Grand Prairie", - "county": "Dallas", - "state": "TX", - "zip": "75050", - "phone": "972-660-3960", - "fax": "972-660-0934", - "email": "edgardo@prudente.com", - "web": "http://www.edgardoprudente.com", - "followers": 3269 - }, - { - "firstname": "Fred", - "lastname": "Kunde", - "company": "Swanson, Victoria C Esq", - "address": "5321 Sterling Center Dr", - "city": "Westlake Village", - "county": "Ventura", - "state": "CA", - "zip": "91361", - "phone": "805-991-9740", - "fax": "805-991-4665", - "email": "fred@kunde.com", - "web": "http://www.fredkunde.com", - "followers": 7741 - }, - { - "firstname": "Pilar", - "lastname": "Suddeth", - "company": "Slant Fin Corp", - "address": "3700 Campus Dr", - "city": "Newport Beach", - "county": "Orange", - "state": "CA", - "zip": "92660", - "phone": "949-852-5463", - "fax": "949-852-9027", - "email": "pilar@suddeth.com", - "web": "http://www.pilarsuddeth.com", - "followers": 4094 - }, - { - "firstname": "Eliseo", - "lastname": "Wice", - "company": "A Limousine Service", - "address": "711 W 38th St", - "city": "Austin", - "county": "Travis", - "state": "TX", - "zip": "78705", - "phone": "512-458-0034", - "fax": "512-458-7226", - "email": "eliseo@wice.com", - "web": "http://www.eliseowice.com", - "followers": 7508 - }, - { - "firstname": "Bridget", - "lastname": "Knightly", - "company": "Teamsters Union Local 20", - "address": "66 Flint St", - "city": "Asheville", - "county": "Buncombe", - "state": "NC", - "zip": "28801", - "phone": "828-251-0817", - "fax": "828-251-4242", - "email": "bridget@knightly.com", - "web": "http://www.bridgetknightly.com", - "followers": 1212 - }, - { - "firstname": "Tori", - "lastname": "Villaescusa", - "company": "Church Point Whol Gr Co Inc", - "address": "1006 S San Pedro St", - "city": "Los Angeles", - "county": "Los Angeles", - "state": "CA", - "zip": "90015", - "phone": "213-748-7617", - "fax": "213-748-5668", - "email": "tori@villaescusa.com", - "web": "http://www.torivillaescusa.com", - "followers": 9093 - }, - { - "firstname": "Claire", - "lastname": "Moyerman", - "company": "Grt Nthrn Shoe Rpr & Dry Clnrs", - "address": "2280 S Xanadu Way #-300", - "city": "Aurora", - "county": "Arapahoe", - "state": "CO", - "zip": "80014", - "phone": "303-337-5701", - "fax": "303-337-5796", - "email": "claire@moyerman.com", - "web": "http://www.clairemoyerman.com", - "followers": 5959 - }, - { - "firstname": "Judi", - "lastname": "Kivel", - "company": "Postal Place At 111th Square", - "address": "125 N Emporia St", - "city": "Wichita", - "county": "Sedgwick", - "state": "KS", - "zip": "67202", - "phone": "316-267-2178", - "fax": "316-267-5183", - "email": "judi@kivel.com", - "web": "http://www.judikivel.com", - "followers": 6139 - }, - { - "firstname": "Terrell", - "lastname": "Rodda", - "company": "Woodland Village Nursing Home", - "address": "200 Cottontail Ln", - "city": "Somerset", - "county": "Somerset", - "state": "NJ", - "zip": "08873", - "phone": "732-563-5361", - "fax": "732-563-1293", - "email": "terrell@rodda.com", - "web": "http://www.terrellrodda.com", - "followers": 3803 - }, - { - "firstname": "Jasmin", - "lastname": "Gum", - "company": "White, Samuel I Esq", - "address": "43 Parmenter Rd", - "city": "Hudson", - "county": "Middlesex", - "state": "MA", - "zip": "01749", - "phone": "978-562-2524", - "fax": "978-562-5062", - "email": "jasmin@gum.com", - "web": "http://www.jasmingum.com", - "followers": 9074 - }, - { - "firstname": "Bridget", - "lastname": "Bottella", - "company": "Mid State Construction Prod", - "address": "112 E Pecan St", - "city": "San Antonio", - "county": "Bexar", - "state": "TX", - "zip": "78205", - "phone": "210-224-9708", - "fax": "210-224-4881", - "email": "bridget@bottella.com", - "web": "http://www.bridgetbottella.com", - "followers": 5951 - }, - { - "firstname": "Tami", - "lastname": "Trybus", - "company": "Seawright, Rodney", - "address": "3963 Virginia Ave", - "city": "Cincinnati", - "county": "Hamilton", - "state": "OH", - "zip": "45227", - "phone": "513-561-1096", - "fax": "513-561-7531", - "email": "tami@trybus.com", - "web": "http://www.tamitrybus.com", - "followers": 370 - }, - { - "firstname": "Maynard", - "lastname": "Kaewprasert", - "company": "Decatur Studio Inc", - "address": "1224 S Hope St", - "city": "Los Angeles", - "county": "Los Angeles", - "state": "CA", - "zip": "90015", - "phone": "213-747-6026", - "fax": "213-747-3088", - "email": "maynard@kaewprasert.com", - "web": "http://www.maynardkaewprasert.com", - "followers": 711 - }, - { - "firstname": "Viola", - "lastname": "Mcsorley", - "company": "First Bank Of Brunswick", - "address": "6850 S Harlem Ave", - "city": "Summit Argo", - "county": "Cook", - "state": "IL", - "zip": "60501", - "phone": "708-496-7428", - "fax": "708-496-8587", - "email": "viola@mcsorley.com", - "web": "http://www.violamcsorley.com", - "followers": 7687 - }, - { - "firstname": "Reggie", - "lastname": "Streu", - "company": "Als Motors Inc", - "address": "15 Henderson Dr", - "city": "Caldwell", - "county": "Essex", - "state": "NJ", - "zip": "07006", - "phone": "973-575-5898", - "fax": "973-575-9328", - "email": "reggie@streu.com", - "web": "http://www.reggiestreu.com", - "followers": 971 - }, - { - "firstname": "Rena", - "lastname": "Griffeth", - "company": "Reliable Optical", - "address": "19901 Nordhoff St", - "city": "Northridge", - "county": "Los Angeles", - "state": "CA", - "zip": "91324", - "phone": "818-709-9165", - "fax": "818-709-2649", - "email": "rena@griffeth.com", - "web": "http://www.renagriffeth.com", - "followers": 6336 - }, - { - "firstname": "Pierre", - "lastname": "Salera", - "company": "Ridley Ridley & Burnette", - "address": "1601 S Shamrock Ave", - "city": "Monrovia", - "county": "Los Angeles", - "state": "CA", - "zip": "91016", - "phone": "626-303-9233", - "fax": "626-303-2569", - "email": "pierre@salera.com", - "web": "http://www.pierresalera.com", - "followers": 6542 - }, - { - "firstname": "Carolina", - "lastname": "Kinlaw", - "company": "Loftus, Daniel B Esq", - "address": "3m County", - "city": "Belle Mead", - "county": "Somerset", - "state": "NJ", - "zip": "08502", - "phone": "908-874-0864", - "fax": "908-874-4873", - "email": "carolina@kinlaw.com", - "web": "http://www.carolinakinlaw.com", - "followers": 8944 - }, - { - "firstname": "Alejandra", - "lastname": "Prenatt", - "company": "Mitchell De Burring Co", - "address": "6850 S Harlem Ave", - "city": "Summit Argo", - "county": "Cook", - "state": "IL", - "zip": "60501", - "phone": "708-496-6958", - "fax": "708-496-4617", - "email": "alejandra@prenatt.com", - "web": "http://www.alejandraprenatt.com", - "followers": 4118 - }, - { - "firstname": "Quintin", - "lastname": "Isacson", - "company": "Spectrum Constrctn & Dev Corp", - "address": "1015 N Cahuenga Blvd", - "city": "Los Angeles", - "county": "Los Angeles", - "state": "CA", - "zip": "90038", - "phone": "323-469-0643", - "fax": "323-469-3082", - "email": "quintin@isacson.com", - "web": "http://www.quintinisacson.com", - "followers": 94 - }, - { - "firstname": "Robin", - "lastname": "Grotz", - "company": "Hackett, Peter J", - "address": "2601 Summerhill Rd", - "city": "Texarkana", - "county": "Bowie", - "state": "TX", - "zip": "75503", - "phone": "903-792-2081", - "fax": "903-792-5309", - "email": "robin@grotz.com", - "web": "http://www.robingrotz.com", - "followers": 2532 - }, - { - "firstname": "Lacy", - "lastname": "Woodfin", - "company": "Enviro Dynamics", - "address": "130 Wyoming Ave", - "city": "Scranton", - "county": "Lackawanna", - "state": "PA", - "zip": "18503", - "phone": "570-348-3754", - "fax": "570-348-4204", - "email": "lacy@woodfin.com", - "web": "http://www.lacywoodfin.com", - "followers": 4644 - }, - { - "firstname": "Daniel", - "lastname": "Zill", - "company": "Safety Team Inc", - "address": "550 N Brand Blvd #-1940", - "city": "Glendale", - "county": "Los Angeles", - "state": "CA", - "zip": "91203", - "phone": "818-507-7207", - "fax": "818-507-1925", - "email": "daniel@zill.com", - "web": "http://www.danielzill.com", - "followers": 2051 - }, - { - "firstname": "Reina", - "lastname": "Wolchesky", - "company": "Highland Management Group", - "address": "305 W Washington St", - "city": "Brainerd", - "county": "Crow Wing", - "state": "MN", - "zip": "56401", - "phone": "218-828-7281", - "fax": "218-828-3231", - "email": "reina@wolchesky.com", - "web": "http://www.reinawolchesky.com", - "followers": 9240 - }, - { - "firstname": "Marc", - "lastname": "Wanger", - "company": "Welsh Company", - "address": "33 Harrison Ave", - "city": "Boston", - "county": "Suffolk", - "state": "MA", - "zip": "02111", - "phone": "617-426-6393", - "fax": "617-426-1114", - "email": "marc@wanger.com", - "web": "http://www.marcwanger.com", - "followers": 2846 - }, - { - "firstname": "Damion", - "lastname": "Matkin", - "company": "Data Ware Development Inc", - "address": "5830 Downing St #-d", - "city": "Denver", - "county": "Denver", - "state": "CO", - "zip": "80216", - "phone": "303-295-4797", - "fax": "303-295-3867", - "email": "damion@matkin.com", - "web": "http://www.damionmatkin.com", - "followers": 5752 - }, - { - "firstname": "Lucius", - "lastname": "Winchester", - "company": "Barrett Paving Materials Inc", - "address": "670 S Barrington Rd", - "city": "Streamwood", - "county": "Cook", - "state": "IL", - "zip": "60107", - "phone": "630-289-9458", - "fax": "630-289-9033", - "email": "lucius@winchester.com", - "web": "http://www.luciuswinchester.com", - "followers": 8815 - }, - { - "firstname": "Petra", - "lastname": "Mcnichol", - "company": "Hyacinth Foundation Aids Proj", - "address": "670 S Barrington Rd", - "city": "Streamwood", - "county": "Cook", - "state": "IL", - "zip": "60107", - "phone": "630-289-8190", - "fax": "630-289-8985", - "email": "petra@mcnichol.com", - "web": "http://www.petramcnichol.com", - "followers": 9459 - }, - { - "firstname": "Katina", - "lastname": "Ramano", - "company": "Fuhrmann, Chris C Esq", - "address": "580 Fountain Ave", - "city": "Brooklyn", - "county": "Kings", - "state": "NY", - "zip": "11208", - "phone": "718-272-2553", - "fax": "718-272-8498", - "email": "katina@ramano.com", - "web": "http://www.katinaramano.com", - "followers": 924 - }, - { - "firstname": "Leslie", - "lastname": "Cackowski", - "company": "Re, Matthew R Esq", - "address": "2103 W Main St", - "city": "Farmington", - "county": "San Juan", - "state": "NM", - "zip": "87401", - "phone": "505-325-3933", - "fax": "505-325-9042", - "email": "leslie@cackowski.com", - "web": "http://www.lesliecackowski.com", - "followers": 3028 - }, - { - "firstname": "Cristopher", - "lastname": "Wiget", - "company": "Roche, Patrick Esq", - "address": "4354 Highway 64", - "city": "Kirtland", - "county": "San Juan", - "state": "NM", - "zip": "87417", - "phone": "505-598-9742", - "fax": "505-598-3063", - "email": "cristopher@wiget.com", - "web": "http://www.cristopherwiget.com", - "followers": 2445 - }, - { - "firstname": "Garth", - "lastname": "Skiffington", - "company": "Fox & Killbride", - "address": "22 Mill St", - "city": "Paterson", - "county": "Passaic", - "state": "NJ", - "zip": "07501", - "phone": "973-684-7654", - "fax": "973-684-6309", - "email": "garth@skiffington.com", - "web": "http://www.garthskiffington.com", - "followers": 1725 - }, - { - "firstname": "Brendan", - "lastname": "Qin", - "company": "Allegro Copy & Print", - "address": "305 Griffin Ave Sw", - "city": "Eastman", - "county": "Dodge", - "state": "GA", - "zip": "31023", - "phone": "478-374-5686", - "fax": "478-374-6992", - "email": "brendan@qin.com", - "web": "http://www.brendanqin.com", - "followers": 8035 - }, - { - "firstname": "Chase", - "lastname": "Furler", - "company": "Hostetler & Kowalik", - "address": "3333 Se 21st St", - "city": "Topeka", - "county": "Shawnee", - "state": "KS", - "zip": "66607", - "phone": "785-354-7091", - "fax": "785-354-3042", - "email": "chase@furler.com", - "web": "http://www.chasefurler.com", - "followers": 2977 - }, - { - "firstname": "Marietta", - "lastname": "Bjornberg", - "company": "Consolidated Mechanical Inc", - "address": "1515 Wyoming St", - "city": "Missoula", - "county": "Missoula", - "state": "MT", - "zip": "59801", - "phone": "406-728-0501", - "fax": "406-728-5507", - "email": "marietta@bjornberg.com", - "web": "http://www.mariettabjornberg.com", - "followers": 54 - }, - { - "firstname": "Carmella", - "lastname": "Wishman", - "company": "Meicher Cpa", - "address": "1515 Wyoming St", - "city": "Missoula", - "county": "Missoula", - "state": "MT", - "zip": "59801", - "phone": "406-728-6772", - "fax": "406-728-7668", - "email": "carmella@wishman.com", - "web": "http://www.carmellawishman.com", - "followers": 624 - }, - { - "firstname": "Erica", - "lastname": "Eyrich", - "company": "C & I Computer Services Inc", - "address": "1515 Wyoming St", - "city": "Missoula", - "county": "Missoula", - "state": "MT", - "zip": "59801", - "phone": "406-728-7293", - "fax": "406-728-4789", - "email": "erica@eyrich.com", - "web": "http://www.ericaeyrich.com", - "followers": 8217 - }, - { - "firstname": "Lucius", - "lastname": "Bagnoli", - "company": "American Music Teacher", - "address": "404 W Boonville New Harmony Rd", - "city": "Evansville", - "county": "Vanderburgh", - "state": "IN", - "zip": "47711", - "phone": "812-867-2916", - "fax": "812-867-2593", - "email": "lucius@bagnoli.com", - "web": "http://www.luciusbagnoli.com", - "followers": 8666 - }, - { - "firstname": "Bart", - "lastname": "Hachey", - "company": "Pip Printing", - "address": "490 S Broad St", - "city": "Canfield", - "county": "Mahoning", - "state": "OH", - "zip": "44406", - "phone": "330-533-9769", - "fax": "330-533-6543", - "email": "bart@hachey.com", - "web": "http://www.barthachey.com", - "followers": 8457 - }, - { - "firstname": "Isiah", - "lastname": "Phernetton", - "company": "Wyckoff Florist & Gifts", - "address": "246 Griffing Ave", - "city": "Riverhead", - "county": "Suffolk", - "state": "NY", - "zip": "11901", - "phone": "631-727-0917", - "fax": "631-727-2147", - "email": "isiah@phernetton.com", - "web": "http://www.isiahphernetton.com", - "followers": 6662 - }, - { - "firstname": "Morton", - "lastname": "Crummell", - "company": "Boykin Management Co", - "address": "5485 Conestoga Ct", - "city": "Boulder", - "county": "Boulder", - "state": "CO", - "zip": "80301", - "phone": "303-546-3698", - "fax": "303-546-1589", - "email": "morton@crummell.com", - "web": "http://www.mortoncrummell.com", - "followers": 8143 - }, - { - "firstname": "Prince", - "lastname": "Kauk", - "company": "Mckesson Drug Co", - "address": "2320 W Louise Dr", - "city": "Phoenix", - "county": "Maricopa", - "state": "AZ", - "zip": "85027", - "phone": "623-581-7435", - "fax": "623-581-2472", - "email": "prince@kauk.com", - "web": "http://www.princekauk.com", - "followers": 177 - }, - { - "firstname": "Marta", - "lastname": "Horner", - "company": "Scisci, Pasquale M", - "address": "4694 Alvarado Canyon Rd #-f", - "city": "San Diego", - "county": "San Diego", - "state": "CA", - "zip": "92120", - "phone": "858-265-2270", - "fax": "858-265-6604", - "email": "marta@horner.com", - "web": "http://www.martahorner.com", - "followers": 5749 - }, - { - "firstname": "Teodoro", - "lastname": "Gaboury", - "company": "Bostek, Eva M Dvm", - "address": "4251 Glenwood Ave", - "city": "Youngstown", - "county": "Mahoning", - "state": "OH", - "zip": "44512", - "phone": "330-783-8123", - "fax": "330-783-9674", - "email": "teodoro@gaboury.com", - "web": "http://www.teodorogaboury.com", - "followers": 3663 - }, - { - "firstname": "Jess", - "lastname": "Assad", - "company": "Livingston City", - "address": "9100 F St", - "city": "Omaha", - "county": "Douglas", - "state": "NE", - "zip": "68127", - "phone": "402-331-0470", - "fax": "402-331-4974", - "email": "jess@assad.com", - "web": "http://www.jessassad.com", - "followers": 6985 - }, - { - "firstname": "Freeman", - "lastname": "Soula", - "company": "Henson, Claudia", - "address": "Hwy 8e E", - "city": "Mena", - "county": "Polk", - "state": "AR", - "zip": "71953", - "phone": "479-394-6308", - "fax": "479-394-7509", - "email": "freeman@soula.com", - "web": "http://www.freemansoula.com", - "followers": 7262 - }, - { - "firstname": "Rita", - "lastname": "Center", - "company": "R D Playman Co", - "address": "4013 Cameron St #-b", - "city": "Lafayette", - "county": "Lafayette", - "state": "LA", - "zip": "70506", - "phone": "337-269-8825", - "fax": "337-269-7011", - "email": "rita@center.com", - "web": "http://www.ritacenter.com", - "followers": 4484 - }, - { - "firstname": "Kira", - "lastname": "Papen", - "company": "Tile City & Carpet Of Pa", - "address": "8387 University Ave", - "city": "La Mesa", - "county": "San Diego", - "state": "CA", - "zip": "91941", - "phone": "619-464-3649", - "fax": "619-464-8499", - "email": "kira@papen.com", - "web": "http://www.kirapapen.com", - "followers": 5711 - }, - { - "firstname": "Miquel", - "lastname": "Demicco", - "company": "Welk Resort Center", - "address": "5921 S Middlefield Rd", - "city": "Littleton", - "county": "Jefferson", - "state": "CO", - "zip": "80123", - "phone": "303-730-8080", - "fax": "303-730-8087", - "email": "miquel@demicco.com", - "web": "http://www.miqueldemicco.com", - "followers": 6863 - }, - { - "firstname": "William", - "lastname": "Mahmud", - "company": "Campbell Inn", - "address": "1003 Northern Blvd", - "city": "Manhasset", - "county": "Nassau", - "state": "NY", - "zip": "11030", - "phone": "516-365-3496", - "fax": "516-365-0493", - "email": "william@mahmud.com", - "web": "http://www.williammahmud.com", - "followers": 3591 - }, - { - "firstname": "Lacy", - "lastname": "Belmont", - "company": "House Boat Rentals Inc", - "address": "585 Bedford Rd", - "city": "Bedford Hills", - "county": "Westchester", - "state": "NY", - "zip": "10507", - "phone": "914-241-8888", - "fax": "914-241-2272", - "email": "lacy@belmont.com", - "web": "http://www.lacybelmont.com", - "followers": 1399 - }, - { - "firstname": "Van", - "lastname": "Leanen", - "company": "Mail Boxes Etc", - "address": "Bus Rt 54 & Hh", - "city": "Lake Ozark", - "county": "Camden", - "state": "MO", - "zip": "65049", - "phone": "573-365-0319", - "fax": "573-365-1055", - "email": "van@leanen.com", - "web": "http://www.vanleanen.com", - "followers": 1949 - }, - { - "firstname": "Mayme", - "lastname": "Staub", - "company": "River House Hotel", - "address": "2470 Lamington Rd", - "city": "Bedminster", - "county": "Somerset", - "state": "NJ", - "zip": "07921", - "phone": "908-234-9338", - "fax": "908-234-9433", - "email": "mayme@staub.com", - "web": "http://www.maymestaub.com", - "followers": 2216 - }, - { - "firstname": "Gregg", - "lastname": "Guevarra", - "company": "Arbor Center", - "address": "221 S Kerr Ave", - "city": "Wilmington", - "county": "New Hanover", - "state": "NC", - "zip": "28403", - "phone": "910-799-9811", - "fax": "910-799-1965", - "email": "gregg@guevarra.com", - "web": "http://www.greggguevarra.com", - "followers": 2704 - }, - { - "firstname": "Minh", - "lastname": "Leclare", - "company": "Osach, Ronald C Esq", - "address": "106 S 4th St", - "city": "Forest City", - "county": "Winnebago", - "state": "IA", - "zip": "50436", - "phone": "641-582-0973", - "fax": "641-582-0424", - "email": "minh@leclare.com", - "web": "http://www.minhleclare.com", - "followers": 7681 - }, - { - "firstname": "Joey", - "lastname": "Sedore", - "company": "Goodwill Speciality Co", - "address": "1647 E Palmdale Blvd", - "city": "Palmdale", - "county": "Los Angeles", - "state": "CA", - "zip": "93550", - "phone": "661-273-4188", - "fax": "661-273-6263", - "email": "joey@sedore.com", - "web": "http://www.joeysedore.com", - "followers": 273 - }, - { - "firstname": "Jeanie", - "lastname": "Dalen", - "company": "Ivs Media Inc", - "address": "2900 Ford Rd", - "city": "Bristol", - "county": "Bucks", - "state": "PA", - "zip": "19007", - "phone": "215-788-5062", - "fax": "215-788-7666", - "email": "jeanie@dalen.com", - "web": "http://www.jeaniedalen.com", - "followers": 290 - }, - { - "firstname": "Eddie", - "lastname": "Gauer", - "company": "Easy Mail", - "address": "506 Kellogg Ave", - "city": "Ames", - "county": "Story", - "state": "IA", - "zip": "50010", - "phone": "515-233-2381", - "fax": "515-233-6551", - "email": "eddie@gauer.com", - "web": "http://www.eddiegauer.com", - "followers": 2350 - }, - { - "firstname": "Jessie", - "lastname": "Barkle", - "company": "Days Inn Airport By Mall Amer", - "address": "1002 S Treadaway Blvd", - "city": "Abilene", - "county": "Taylor", - "state": "TX", - "zip": "79602", - "phone": "325-677-1190", - "fax": "325-677-2343", - "email": "jessie@barkle.com", - "web": "http://www.jessiebarkle.com", - "followers": 5427 - }, - { - "firstname": "Deandre", - "lastname": "Resendiz", - "company": "Sav Mart", - "address": "4 Trvl Svc Carlson Trvl Ways", - "city": "Twin Falls", - "county": "Twin Falls", - "state": "ID", - "zip": "83301", - "phone": "208-733-8306", - "fax": "208-733-3476", - "email": "deandre@resendiz.com", - "web": "http://www.deandreresendiz.com", - "followers": 1120 - }, - { - "firstname": "Janet", - "lastname": "Rathrock", - "company": "Ryder, Edward A Esq", - "address": "2181 Harlem Rd", - "city": "Loves Park", - "county": "Winnebago", - "state": "IL", - "zip": "61111", - "phone": "815-877-4376", - "fax": "815-877-9538", - "email": "janet@rathrock.com", - "web": "http://www.janetrathrock.com", - "followers": 2725 - }, - { - "firstname": "Denice", - "lastname": "Nordlinger", - "company": "Bickel, Daniel R Cpa", - "address": "7210 Gateway Blvd E", - "city": "El Paso", - "county": "El Paso", - "state": "TX", - "zip": "79915", - "phone": "915-593-2344", - "fax": "915-593-8069", - "email": "denice@nordlinger.com", - "web": "http://www.denicenordlinger.com", - "followers": 2003 - }, - { - "firstname": "Danny", - "lastname": "Dales", - "company": "Barrett Bindery Co", - "address": "3530 E Washington St", - "city": "Phoenix", - "county": "Maricopa", - "state": "AZ", - "zip": "85034", - "phone": "602-225-9543", - "fax": "602-225-9028", - "email": "danny@dales.com", - "web": "http://www.dannydales.com", - "followers": 2843 - }, - { - "firstname": "Robbie", - "lastname": "Deshay", - "company": "Cornhusker Press", - "address": "1700 Terminal St", - "city": "West Sacramento", - "county": "Yolo", - "state": "CA", - "zip": "95691", - "phone": "916-372-5032", - "fax": "916-372-1333", - "email": "robbie@deshay.com", - "web": "http://www.robbiedeshay.com", - "followers": 3460 - }, - { - "firstname": "Carla", - "lastname": "Humble", - "company": "Express Printing Center", - "address": "11796 Sheldon St", - "city": "Sun Valley", - "county": "Los Angeles", - "state": "CA", - "zip": "91352", - "phone": "818-768-0662", - "fax": "818-768-1832", - "email": "carla@humble.com", - "web": "http://www.carlahumble.com", - "followers": 4639 - }, - { - "firstname": "Ashley", - "lastname": "Leonesio", - "company": "Martinique Resort Hotel", - "address": "15 Park Row", - "city": "New York", - "county": "New York", - "state": "NY", - "zip": "10038", - "phone": "212-227-3681", - "fax": "212-227-4343", - "email": "ashley@leonesio.com", - "web": "http://www.ashleyleonesio.com", - "followers": 4801 - }, - { - "firstname": "Josephine", - "lastname": "Sotlar", - "company": "Shipp Storage", - "address": "400 1st St Nw", - "city": "Washington", - "county": "District of Columbia", - "state": "DC", - "zip": "20001", - "phone": "202-783-2772", - "fax": "202-783-8805", - "email": "josephine@sotlar.com", - "web": "http://www.josephinesotlar.com", - "followers": 515 - }, - { - "firstname": "Derek", - "lastname": "Kreutzbender", - "company": "Recycle Metals Corp", - "address": "411 E Wisconsin Ave", - "city": "Milwaukee", - "county": "Milwaukee", - "state": "WI", - "zip": "53202", - "phone": "414-271-5253", - "fax": "414-271-6234", - "email": "derek@kreutzbender.com", - "web": "http://www.derekkreutzbender.com", - "followers": 2430 - }, - { - "firstname": "Kira", - "lastname": "Staffon", - "company": "International Management Assoc", - "address": "933 Wiliwili St", - "city": "Honolulu", - "county": "Honolulu", - "state": "HI", - "zip": "96826", - "phone": "808-949-0941", - "fax": "808-949-8257", - "email": "kira@staffon.com", - "web": "http://www.kirastaffon.com", - "followers": 5769 - }, - { - "firstname": "Isaac", - "lastname": "Davensizer", - "company": "Dillon Measurement Instruments", - "address": "444 Nahua St", - "city": "Honolulu", - "county": "Honolulu", - "state": "HI", - "zip": "96815", - "phone": "808-544-5794", - "fax": "808-544-6357", - "email": "isaac@davensizer.com", - "web": "http://www.isaacdavensizer.com", - "followers": 3453 - }, - { - "firstname": "Reva", - "lastname": "Bayer", - "company": "Hirt, Stanley Esq", - "address": "4011 Wallingford Ave N", - "city": "Seattle", - "county": "King", - "state": "WA", - "zip": "98103", - "phone": "206-634-9998", - "fax": "206-634-2589", - "email": "reva@bayer.com", - "web": "http://www.revabayer.com", - "followers": 7415 - }, - { - "firstname": "Melvin", - "lastname": "Auteri", - "company": "Interstate Unltd Fed Crdt Un", - "address": "463 Beacon St", - "city": "Boston", - "county": "Suffolk", - "state": "MA", - "zip": "02115", - "phone": "617-247-8022", - "fax": "617-247-6002", - "email": "melvin@auteri.com", - "web": "http://www.melvinauteri.com", - "followers": 2705 - }, - { - "firstname": "Stephen", - "lastname": "Seiters", - "company": "Us Mortgage Corp", - "address": "814 Blue Mound Rd", - "city": "Fort Worth", - "county": "Tarrant", - "state": "TX", - "zip": "76131", - "phone": "817-947-3102", - "fax": "817-947-6272", - "email": "stephen@seiters.com", - "web": "http://www.stephenseiters.com", - "followers": 9568 - }, - { - "firstname": "Lucas", - "lastname": "Santellana", - "company": "Constantino, James P Esq", - "address": "4820 E Mcdowell Rd #-300", - "city": "Phoenix", - "county": "Maricopa", - "state": "AZ", - "zip": "85008", - "phone": "602-225-3469", - "fax": "602-225-8897", - "email": "lucas@santellana.com", - "web": "http://www.lucassantellana.com", - "followers": 8420 - }, - { - "firstname": "Traci", - "lastname": "Toomey", - "company": "Pea Press", - "address": "Box #-1948", - "city": "Jackson", - "county": "Teton", - "state": "WY", - "zip": "83001", - "phone": "307-733-9708", - "fax": "307-733-6525", - "email": "traci@toomey.com", - "web": "http://www.tracitoomey.com", - "followers": 7718 - }, - { - "firstname": "Vernice", - "lastname": "Resendes", - "company": "Sorrento Cheese Co Inc", - "address": "11796 Sheldon St", - "city": "Sun Valley", - "county": "Los Angeles", - "state": "CA", - "zip": "91352", - "phone": "818-768-6234", - "fax": "818-768-7585", - "email": "vernice@resendes.com", - "web": "http://www.verniceresendes.com", - "followers": 912 - }, - { - "firstname": "Hillary", - "lastname": "Holmes", - "company": "Dennis N Brager Law Offices Of", - "address": "7565 Green Valley Rd", - "city": "Placerville", - "county": "El Dorado", - "state": "CA", - "zip": "95667", - "phone": "530-626-1934", - "fax": "530-626-6128", - "email": "hillary@holmes.com", - "web": "http://www.hillaryholmes.com", - "followers": 7918 - }, - { - "firstname": "Robin", - "lastname": "Schartz", - "company": "Fairmount Country Club", - "address": "10175 Joerschke Dr", - "city": "Grass Valley", - "county": "Nevada", - "state": "CA", - "zip": "95945", - "phone": "530-477-9983", - "fax": "530-477-7396", - "email": "robin@schartz.com", - "web": "http://www.robinschartz.com", - "followers": 2169 - }, - { - "firstname": "Sabrina", - "lastname": "Deppert", - "company": "Americold", - "address": "2701 E Thomas Rd #-j", - "city": "Phoenix", - "county": "Maricopa", - "state": "AZ", - "zip": "85016", - "phone": "602-954-4343", - "fax": "602-954-6266", - "email": "sabrina@deppert.com", - "web": "http://www.sabrinadeppert.com", - "followers": 5488 - }, - { - "firstname": "Luciano", - "lastname": "Truiolo", - "company": "Currier Gallery Of Art", - "address": "435 Mira Vista Ter", - "city": "Pasadena", - "county": "Los Angeles", - "state": "CA", - "zip": "91105", - "phone": "626-792-6850", - "fax": "626-792-5166", - "email": "luciano@truiolo.com", - "web": "http://www.lucianotruiolo.com", - "followers": 9047 - }, - { - "firstname": "Ezekiel", - "lastname": "Mildon", - "company": "Ace Pro Pest Cntrl Inc", - "address": "10 Rogers St", - "city": "Cambridge", - "county": "Middlesex", - "state": "MA", - "zip": "02142", - "phone": "617-494-5618", - "fax": "617-494-3365", - "email": "ezekiel@mildon.com", - "web": "http://www.ezekielmildon.com", - "followers": 399 - }, - { - "firstname": "Hanna", - "lastname": "Cinkan", - "company": "Northbrook Flowers", - "address": "1150 Nw 72nd Ave #-333", - "city": "Miami", - "county": "Miami-Dade", - "state": "FL", - "zip": "33126", - "phone": "305-477-7869", - "fax": "305-477-7089", - "email": "hanna@cinkan.com", - "web": "http://www.hannacinkan.com", - "followers": 4636 - }, - { - "firstname": "Kory", - "lastname": "Wooldridge", - "company": "Paper Stock Dealers Inc", - "address": "1525 E 53rd St", - "city": "Chicago", - "county": "Cook", - "state": "IL", - "zip": "60615", - "phone": "312-753-6734", - "fax": "312-753-2693", - "email": "kory@wooldridge.com", - "web": "http://www.korywooldridge.com", - "followers": 4528 - }, - { - "firstname": "Darrel", - "lastname": "Ruffins", - "company": "Brickman, Arthur Cpa", - "address": "2800 4th St N", - "city": "Saint Petersburg", - "county": "Pinellas", - "state": "FL", - "zip": "33704", - "phone": "727-821-8502", - "fax": "727-821-5104", - "email": "darrel@ruffins.com", - "web": "http://www.darrelruffins.com", - "followers": 6468 - }, - { - "firstname": "Miranda", - "lastname": "Hammitt", - "company": "Steindel, Carl R Md", - "address": "964 E Saint Francis St", - "city": "Brownsville", - "county": "Cameron", - "state": "TX", - "zip": "78520", - "phone": "956-541-5918", - "fax": "956-541-9021", - "email": "miranda@hammitt.com", - "web": "http://www.mirandahammitt.com", - "followers": 8847 - }, - { - "firstname": "Sadie", - "lastname": "Rowlett", - "company": "Port City Taxi Inc", - "address": "2659 Webster Ave", - "city": "Bronx", - "county": "Bronx", - "state": "NY", - "zip": "10458", - "phone": "718-365-1753", - "fax": "718-365-5353", - "email": "sadie@rowlett.com", - "web": "http://www.sadierowlett.com", - "followers": 9836 - }, - { - "firstname": "Deanna", - "lastname": "Gerbi", - "company": "Centerville Historical Society", - "address": "264 Broadway", - "city": "Jersey City", - "county": "Hudson", - "state": "NJ", - "zip": "07306", - "phone": "201-433-0391", - "fax": "201-433-3619", - "email": "deanna@gerbi.com", - "web": "http://www.deannagerbi.com", - "followers": 9112 - }, - { - "firstname": "Alfonso", - "lastname": "Griglen", - "company": "Paul D Friedman", - "address": "577 Township Road #-30s", - "city": "Ada", - "county": "Hardin", - "state": "OH", - "zip": "45810", - "phone": "419-634-3513", - "fax": "419-634-5733", - "email": "alfonso@griglen.com", - "web": "http://www.alfonsogriglen.com", - "followers": 7361 - }, - { - "firstname": "Vernon", - "lastname": "Engelman", - "company": "Atlas Metal Cutting Inc", - "address": "321 Watson St", - "city": "Ripon", - "county": "Fond du Lac", - "state": "WI", - "zip": "54971", - "phone": "920-748-1387", - "fax": "920-748-3703", - "email": "vernon@engelman.com", - "web": "http://www.vernonengelman.com", - "followers": 656 - }, - { - "firstname": "Johnnie", - "lastname": "Rheaves", - "company": "Roberts, James A Cpa", - "address": "2910 E La Cresta Ave", - "city": "Anaheim", - "county": "Orange", - "state": "CA", - "zip": "92806", - "phone": "714-632-1291", - "fax": "714-632-7337", - "email": "johnnie@rheaves.com", - "web": "http://www.johnnierheaves.com", - "followers": 2812 - }, - { - "firstname": "Ella", - "lastname": "Pahnke", - "company": "Davis, Randle S Esq", - "address": "2640 Junction Hwy", - "city": "Kerrville", - "county": "Kerr", - "state": "TX", - "zip": "78028", - "phone": "830-367-8513", - "fax": "830-367-9231", - "email": "ella@pahnke.com", - "web": "http://www.ellapahnke.com", - "followers": 4762 - }, - { - "firstname": "Veronica", - "lastname": "Achorn", - "company": "Guy Spradling", - "address": "5201 Hanawalt Dr", - "city": "El Paso", - "county": "El Paso", - "state": "TX", - "zip": "79903", - "phone": "915-772-3217", - "fax": "915-772-2346", - "email": "veronica@achorn.com", - "web": "http://www.veronicaachorn.com", - "followers": 9145 - }, - { - "firstname": "Kasey", - "lastname": "Nguyen", - "company": "Pettine, Paul A Iii", - "address": "5603 Arapahoe Ave", - "city": "Boulder", - "county": "Boulder", - "state": "CO", - "zip": "80303", - "phone": "303-440-3916", - "fax": "303-440-2452", - "email": "kasey@nguyen.com", - "web": "http://www.kaseynguyen.com", - "followers": 2867 - }, - { - "firstname": "Frankie", - "lastname": "Morein", - "company": "Oliver, Jerrold B Esq", - "address": "104 North St", - "city": "Stamford", - "county": "Fairfield", - "state": "CT", - "zip": "06902", - "phone": "203-975-3712", - "fax": "203-975-4688", - "email": "frankie@morein.com", - "web": "http://www.frankiemorein.com", - "followers": 5663 - }, - { - "firstname": "Elaine", - "lastname": "Renzi", - "company": "Delvel Chem Co", - "address": "221 E 59th St", - "city": "New York", - "county": "New York", - "state": "NY", - "zip": "10022", - "phone": "212-826-7966", - "fax": "212-826-2043", - "email": "elaine@renzi.com", - "web": "http://www.elainerenzi.com", - "followers": 9525 - }, - { - "firstname": "Timothy", - "lastname": "Janski", - "company": "Snyder Chevrolet Olds Geo Co", - "address": "800 E Dimond Blvd", - "city": "Anchorage", - "county": "Anchorage", - "state": "AK", - "zip": "99515", - "phone": "907-344-4330", - "fax": "907-344-4086", - "email": "timothy@janski.com", - "web": "http://www.timothyjanski.com", - "followers": 1000 - }, - { - "firstname": "Warren", - "lastname": "Hacher", - "company": "Josel, Stephen C Esq", - "address": "4600 S 1st St", - "city": "Abilene", - "county": "Taylor", - "state": "TX", - "zip": "79605", - "phone": "325-691-7220", - "fax": "325-691-7394", - "email": "warren@hacher.com", - "web": "http://www.warrenhacher.com", - "followers": 6287 - }, - { - "firstname": "Brant", - "lastname": "Darnel", - "company": "Cody, Daniel S Esq", - "address": "8250 Tyler Blvd", - "city": "Mentor", - "county": "Lake", - "state": "OH", - "zip": "44060", - "phone": "440-974-8416", - "fax": "440-974-7476", - "email": "brant@darnel.com", - "web": "http://www.brantdarnel.com", - "followers": 5217 - }, - { - "firstname": "Mara", - "lastname": "Rineheart", - "company": "Berry Naturipe Growers", - "address": "39 W 21st St", - "city": "Northampton", - "county": "Northampton", - "state": "PA", - "zip": "18067", - "phone": "610-262-2444", - "fax": "610-262-6836", - "email": "mara@rineheart.com", - "web": "http://www.mararineheart.com", - "followers": 9213 - }, - { - "firstname": "Karen", - "lastname": "Flierl", - "company": "Cook Vetter Doerhoff", - "address": "501 N I #-h35", - "city": "Austin", - "county": "Travis", - "state": "TX", - "zip": "78702", - "phone": "512-477-1826", - "fax": "512-477-1407", - "email": "karen@flierl.com", - "web": "http://www.karenflierl.com", - "followers": 754 - }, - { - "firstname": "Virgil", - "lastname": "Chinni", - "company": "Dorfman Abrams Music & Co", - "address": "248 Libby St", - "city": "Honolulu", - "county": "Honolulu", - "state": "HI", - "zip": "96819", - "phone": "808-841-9811", - "fax": "808-841-9646", - "email": "virgil@chinni.com", - "web": "http://www.virgilchinni.com", - "followers": 6740 - }, - { - "firstname": "Jimmie", - "lastname": "Kertzman", - "company": "Oregon Pacific Trading Co", - "address": "279 Puuhale Rd", - "city": "Honolulu", - "county": "Honolulu", - "state": "HI", - "zip": "96819", - "phone": "808-841-2883", - "fax": "808-841-1772", - "email": "jimmie@kertzman.com", - "web": "http://www.jimmiekertzman.com", - "followers": 4795 - }, - { - "firstname": "Leif", - "lastname": "Bachta", - "company": "Hislop, Lorna Brumfield Esq", - "address": "91246 Oihana St", - "city": "Kapolei", - "county": "Honolulu", - "state": "HI", - "zip": "96707", - "phone": "808-682-8942", - "fax": "808-682-2789", - "email": "leif@bachta.com", - "web": "http://www.leifbachta.com", - "followers": 6016 - }, - { - "firstname": "Ione", - "lastname": "Kucera", - "company": "Tweedy Penney & Crawford", - "address": "94210 Pupukahi St #-201a", - "city": "Waipahu", - "county": "Honolulu", - "state": "HI", - "zip": "96797", - "phone": "808-671-5253", - "fax": "808-671-3048", - "email": "ione@kucera.com", - "web": "http://www.ionekucera.com", - "followers": 17 - }, - { - "firstname": "Doreen", - "lastname": "Sakurai", - "company": "Airlifter", - "address": "211 E 50th St", - "city": "New York", - "county": "New York", - "state": "NY", - "zip": "10022", - "phone": "212-759-4757", - "fax": "212-759-7548", - "email": "doreen@sakurai.com", - "web": "http://www.doreensakurai.com", - "followers": 8051 - }, - { - "firstname": "Joel", - "lastname": "Nardo", - "company": "New Era Canning Co", - "address": "5150 Town Center Cir", - "city": "Boca Raton", - "county": "Palm Beach", - "state": "FL", - "zip": "33486", - "phone": "561-395-2277", - "fax": "561-395-7825", - "email": "joel@nardo.com", - "web": "http://www.joelnardo.com", - "followers": 9041 - }, - { - "firstname": "Neil", - "lastname": "Backus", - "company": "Smith Capital Management", - "address": "521 5th Ave", - "city": "New York", - "county": "New York", - "state": "NY", - "zip": "10175", - "phone": "212-537-4955", - "fax": "212-537-1181", - "email": "neil@backus.com", - "web": "http://www.neilbackus.com", - "followers": 9529 - }, - { - "firstname": "Fausto", - "lastname": "Marks", - "company": "Donohue, Brian C Esq", - "address": "200 Stuart St", - "city": "Boston", - "county": "Suffolk", - "state": "MA", - "zip": "02116", - "phone": "617-451-9353", - "fax": "617-451-2136", - "email": "fausto@marks.com", - "web": "http://www.faustomarks.com", - "followers": 9763 - }, - { - "firstname": "Christa", - "lastname": "Bodenschatz", - "company": "Stationers Inc", - "address": "Tilton Rd", - "city": "Danville", - "county": "Vermilion", - "state": "IL", - "zip": "61832", - "phone": "217-443-6280", - "fax": "217-443-6382", - "email": "christa@bodenschatz.com", - "web": "http://www.christabodenschatz.com", - "followers": 1744 - }, - { - "firstname": "Chi", - "lastname": "Greenlaw", - "company": "E & T Screw Machine Products", - "address": "4300 N Miller Rd #-143", - "city": "Scottsdale", - "county": "Maricopa", - "state": "AZ", - "zip": "85251", - "phone": "480-946-1537", - "fax": "480-946-1657", - "email": "chi@greenlaw.com", - "web": "http://www.chigreenlaw.com", - "followers": 2707 - }, - { - "firstname": "Kyle", - "lastname": "Ferri", - "company": "Ames Plumbing & Heating", - "address": "1801 E 5th Ave", - "city": "Anchorage", - "county": "Anchorage", - "state": "AK", - "zip": "99501", - "phone": "907-272-2216", - "fax": "907-272-7109", - "email": "kyle@ferri.com", - "web": "http://www.kyleferri.com", - "followers": 7533 - }, - { - "firstname": "Freida", - "lastname": "Michelfelder", - "company": "Fun Discovery Inc", - "address": "117 Martin Luther King Jr Dr S", - "city": "Atlanta", - "county": "Fulton", - "state": "GA", - "zip": "30303", - "phone": "404-521-3372", - "fax": "404-521-3223", - "email": "freida@michelfelder.com", - "web": "http://www.freidamichelfelder.com", - "followers": 4298 - }, - { - "firstname": "Bryant", - "lastname": "Bouliouris", - "company": "Medlin, Charles K Jr", - "address": "480 W Pearl Ave", - "city": "Jackson", - "county": "Teton", - "state": "WY", - "zip": "83001", - "phone": "307-733-8286", - "fax": "307-733-6041", - "email": "bryant@bouliouris.com", - "web": "http://www.bryantbouliouris.com", - "followers": 9520 - }, - { - "firstname": "Emilia", - "lastname": "Oxley", - "company": "Buckeye Reserve Title", - "address": "14651 Dallas Pky", - "city": "Dallas", - "county": "Dallas", - "state": "TX", - "zip": "75240", - "phone": "214-702-8125", - "fax": "214-702-4766", - "email": "emilia@oxley.com", - "web": "http://www.emiliaoxley.com", - "followers": 6873 - }, - { - "firstname": "Naomi", - "lastname": "Mcraven", - "company": "Oak Brook Capital Corp", - "address": "13456 Se 27th Pl", - "city": "Bellevue", - "county": "King", - "state": "WA", - "zip": "98005", - "phone": "425-641-5463", - "fax": "425-641-5923", - "email": "naomi@mcraven.com", - "web": "http://www.naomimcraven.com", - "followers": 7029 - }, - { - "firstname": "Dionne", - "lastname": "Borycz", - "company": "Pepsi Cola Dr Pepper Bottling", - "address": "77 S Washington St #-207", - "city": "Rockville", - "county": "Montgomery", - "state": "MD", - "zip": "20850", - "phone": "301-294-0154", - "fax": "301-294-7523", - "email": "dionne@borycz.com", - "web": "http://www.dionneborycz.com", - "followers": 6973 - }, - { - "firstname": "Jimmy", - "lastname": "Hrobsky", - "company": "Howard Johnson", - "address": "8253 Ronson Rd", - "city": "San Diego", - "county": "San Diego", - "state": "CA", - "zip": "92111", - "phone": "858-268-4663", - "fax": "858-268-4964", - "email": "jimmy@hrobsky.com", - "web": "http://www.jimmyhrobsky.com", - "followers": 544 - }, - { - "firstname": "Peggy", - "lastname": "Hohlstein", - "company": "Steritek Inc", - "address": "Rt 20", - "city": "Westfield", - "county": "Hampden", - "state": "MA", - "zip": "01085", - "phone": "413-543-2933", - "fax": "413-543-3805", - "email": "peggy@hohlstein.com", - "web": "http://www.peggyhohlstein.com", - "followers": 8885 - }, - { - "firstname": "Genevieve", - "lastname": "Kekiwi", - "company": "Lawson, John F Esq", - "address": "8300 Bell Ter", - "city": "Newburgh", - "county": "Warrick", - "state": "IN", - "zip": "47630", - "phone": "812-477-3620", - "fax": "812-477-3646", - "email": "genevieve@kekiwi.com", - "web": "http://www.genevievekekiwi.com", - "followers": 8134 - }, - { - "firstname": "Terra", - "lastname": "Plagge", - "company": "Beach, Jeffrey E", - "address": "60 Minute Photo Colormax", - "city": "Evansville", - "county": "Vanderburgh", - "state": "IN", - "zip": "47715", - "phone": "812-477-9524", - "fax": "812-477-9617", - "email": "terra@plagge.com", - "web": "http://www.terraplagge.com", - "followers": 4323 - }, - { - "firstname": "Allie", - "lastname": "Pumphrey", - "company": "Asher, Ronald L Md", - "address": "501 N Weinbach Ave", - "city": "Evansville", - "county": "Vanderburgh", - "state": "IN", - "zip": "47711", - "phone": "812-477-0753", - "fax": "812-477-4604", - "email": "allie@pumphrey.com", - "web": "http://www.alliepumphrey.com", - "followers": 3985 - }, - { - "firstname": "Katina", - "lastname": "Survant", - "company": "Kgtv Channel 10", - "address": "590 N 2nd E", - "city": "Mountain Home", - "county": "Elmore", - "state": "ID", - "zip": "83647", - "phone": "208-587-3734", - "fax": "208-587-5574", - "email": "katina@survant.com", - "web": "http://www.katinasurvant.com", - "followers": 3440 - }, - { - "firstname": "Marta", - "lastname": "Warran", - "company": "Wirth, John T Esq", - "address": "2929 W Kennewick Ave", - "city": "Kennewick", - "county": "Benton", - "state": "WA", - "zip": "99336", - "phone": "509-735-8388", - "fax": "509-735-9193", - "email": "marta@warran.com", - "web": "http://www.martawarran.com", - "followers": 9891 - }, - { - "firstname": "Rebekah", - "lastname": "Lindboe", - "company": "Granite Corporation", - "address": "600 Las Colinas Blvd E", - "city": "Irving", - "county": "Dallas", - "state": "TX", - "zip": "75039", - "phone": "972-556-1121", - "fax": "972-556-0801", - "email": "rebekah@lindboe.com", - "web": "http://www.rebekahlindboe.com", - "followers": 180 - }, - { - "firstname": "Roxie", - "lastname": "Varenhorst", - "company": "Good Neighbor Real Estate", - "address": "1301 Dublin Rd", - "city": "Columbus", - "county": "Franklin", - "state": "OH", - "zip": "43215", - "phone": "614-487-2917", - "fax": "614-487-4227", - "email": "roxie@varenhorst.com", - "web": "http://www.roxievarenhorst.com", - "followers": 1352 - }, - { - "firstname": "Kennith", - "lastname": "Peto", - "company": "Kirschbaum, Thomas A Esq", - "address": "2080 Peachtree Industrial Ct", - "city": "Atlanta", - "county": "Dekalb", - "state": "GA", - "zip": "30341", - "phone": "770-455-4277", - "fax": "770-455-6746", - "email": "kennith@peto.com", - "web": "http://www.kennithpeto.com", - "followers": 8164 - }, - { - "firstname": "Darrell", - "lastname": "Amrich", - "company": "Harris, James P Iii", - "address": "64 W Convenient", - "city": "Apex", - "county": "Wake", - "state": "NC", - "zip": "27502", - "phone": "919-362-8201", - "fax": "919-362-7475", - "email": "darrell@amrich.com", - "web": "http://www.darrellamrich.com", - "followers": 9098 - }, - { - "firstname": "Savannah", - "lastname": "Loffier", - "company": "Saint Charles Catv", - "address": "501 S Johnstone Ave", - "city": "Bartlesville", - "county": "Washington", - "state": "OK", - "zip": "74003", - "phone": "918-337-3201", - "fax": "918-337-4947", - "email": "savannah@loffier.com", - "web": "http://www.savannahloffier.com", - "followers": 7227 - }, - { - "firstname": "Martin", - "lastname": "Carley", - "company": "Heil, John P Esq", - "address": "680 Country W", - "city": "Sylva", - "county": "Jackson", - "state": "NC", - "zip": "28779", - "phone": "828-586-3914", - "fax": "828-586-8059", - "email": "martin@carley.com", - "web": "http://www.martincarley.com", - "followers": 7412 - }, - { - "firstname": "Lacy", - "lastname": "Hyten", - "company": "Buy & Sell Press", - "address": "1 Palmer Sq", - "city": "Princeton", - "county": "Mercer", - "state": "NJ", - "zip": "08542", - "phone": "609-683-3558", - "fax": "609-683-0649", - "email": "lacy@hyten.com", - "web": "http://www.lacyhyten.com", - "followers": 2184 - }, - { - "firstname": "Forest", - "lastname": "Orea", - "company": "Clark, Francis J", - "address": "6858 S Ashland Ave", - "city": "Chicago", - "county": "Cook", - "state": "IL", - "zip": "60636", - "phone": "773-436-4531", - "fax": "773-436-2636", - "email": "forest@orea.com", - "web": "http://www.forestorea.com", - "followers": 8308 - }, - { - "firstname": "Courtney", - "lastname": "Shishido", - "company": "Beymers Jewelry", - "address": "145 W 6th Ave", - "city": "Anchorage", - "county": "Anchorage", - "state": "AK", - "zip": "99501", - "phone": "907-279-2737", - "fax": "907-279-2025", - "email": "courtney@shishido.com", - "web": "http://www.courtneyshishido.com", - "followers": 6286 - }, - { - "firstname": "Annette", - "lastname": "Frietas", - "company": "Monsanto Chemical Company", - "address": "45 W 46th St", - "city": "New York", - "county": "New York", - "state": "NY", - "zip": "10036", - "phone": "212-944-8670", - "fax": "212-944-9464", - "email": "annette@frietas.com", - "web": "http://www.annettefrietas.com", - "followers": 9185 - }, - { - "firstname": "Karyn", - "lastname": "Jinks", - "company": "Maslen, David Esq", - "address": "2318 N Galloway Ave", - "city": "Mesquite", - "county": "Dallas", - "state": "TX", - "zip": "75150", - "phone": "972-289-4090", - "fax": "972-289-3319", - "email": "karyn@jinks.com", - "web": "http://www.karynjinks.com", - "followers": 3549 - }, - { - "firstname": "Edwin", - "lastname": "Lavelli", - "company": "Letterguide Co", - "address": "W 1st St", - "city": "East Liverpool", - "county": "Columbiana", - "state": "OH", - "zip": "43920", - "phone": "330-385-4581", - "fax": "330-385-9959", - "email": "edwin@lavelli.com", - "web": "http://www.edwinlavelli.com", - "followers": 1645 - }, - { - "firstname": "Jimmie", - "lastname": "Barninger", - "company": "California Paint & Wlpaper Str", - "address": "Box #-4038", - "city": "Modesto", - "county": "Stanislaus", - "state": "CA", - "zip": "95352", - "phone": "209-525-7568", - "fax": "209-525-4389", - "email": "jimmie@barninger.com", - "web": "http://www.jimmiebarninger.com", - "followers": 3947 - }, - { - "firstname": "Merle", - "lastname": "Wyrosdick", - "company": "Keil, James J Esq", - "address": "1350 Campus Pky", - "city": "Neptune", - "county": "Monmouth", - "state": "NJ", - "zip": "07753", - "phone": "732-938-7301", - "fax": "732-938-7237", - "email": "merle@wyrosdick.com", - "web": "http://www.merlewyrosdick.com", - "followers": 5762 - }, - { - "firstname": "Amelia", - "lastname": "Caputo", - "company": "Security Marketing Agency", - "address": "1800 Airport Way", - "city": "Fairbanks", - "county": "Fairbanks North Star", - "state": "AK", - "zip": "99701", - "phone": "907-456-1748", - "fax": "907-456-7535", - "email": "amelia@caputo.com", - "web": "http://www.ameliacaputo.com", - "followers": 9583 - }, - { - "firstname": "Germaine", - "lastname": "Bruski", - "company": "Alloy Founders", - "address": "2301 S Cushman St", - "city": "Fairbanks", - "county": "Fairbanks North Star", - "state": "AK", - "zip": "99701", - "phone": "907-456-8225", - "fax": "907-456-9261", - "email": "germaine@bruski.com", - "web": "http://www.germainebruski.com", - "followers": 5075 - }, - { - "firstname": "Willa", - "lastname": "Dutt", - "company": "Gutmann Leather Co Inc", - "address": "2110 Peger Rd", - "city": "Fairbanks", - "county": "Fairbanks North Star", - "state": "AK", - "zip": "99709", - "phone": "907-456-2885", - "fax": "907-456-2187", - "email": "willa@dutt.com", - "web": "http://www.willadutt.com", - "followers": 2775 - }, - { - "firstname": "Cherie", - "lastname": "Fuhri", - "company": "Continental Baking Co", - "address": "3679 College Rd", - "city": "Fairbanks", - "county": "Fairbanks North Star", - "state": "AK", - "zip": "99709", - "phone": "907-456-9072", - "fax": "907-456-8467", - "email": "cherie@fuhri.com", - "web": "http://www.cheriefuhri.com", - "followers": 5839 - }, - { - "firstname": "Tyron", - "lastname": "Quillman", - "company": "Analysts International Corp", - "address": "5300 Shawnee Rd", - "city": "Alexandria", - "county": "Fairfax", - "state": "VA", - "zip": "22312", - "phone": "703-354-9266", - "fax": "703-354-2554", - "email": "tyron@quillman.com", - "web": "http://www.tyronquillman.com", - "followers": 9439 - }, - { - "firstname": "Charity", - "lastname": "Dyckman", - "company": "Marriott, Frank Jr", - "address": "6927 Old Seward Hwy", - "city": "Anchorage", - "county": "Anchorage", - "state": "AK", - "zip": "99518", - "phone": "907-349-9880", - "fax": "907-349-4449", - "email": "charity@dyckman.com", - "web": "http://www.charitydyckman.com", - "followers": 2058 - }, - { - "firstname": "Nanette", - "lastname": "Turansky", - "company": "Sheraton Society Hill Hotel", - "address": "52 S 2nd St", - "city": "Easton", - "county": "Northampton", - "state": "PA", - "zip": "18042", - "phone": "610-250-6188", - "fax": "610-250-4334", - "email": "nanette@turansky.com", - "web": "http://www.nanetteturansky.com", - "followers": 5905 - }, - { - "firstname": "Cherie", - "lastname": "Schronce", - "company": "Varda, John Duncan Esq", - "address": "21603 Devonshire St", - "city": "Chatsworth", - "county": "Los Angeles", - "state": "CA", - "zip": "91311", - "phone": "818-718-2001", - "fax": "818-718-7339", - "email": "cherie@schronce.com", - "web": "http://www.cherieschronce.com", - "followers": 9409 - }, - { - "firstname": "Theron", - "lastname": "Hambright", - "company": "Sensor Oil And Gas Inc", - "address": "905 Brooks Ave", - "city": "Holland", - "county": "Ottawa", - "state": "MI", - "zip": "49423", - "phone": "616-392-2074", - "fax": "616-392-0226", - "email": "theron@hambright.com", - "web": "http://www.theronhambright.com", - "followers": 6532 - }, - { - "firstname": "Laurie", - "lastname": "Bibbs", - "company": "Action Nursing Care Llc", - "address": "2101 Claremont Ave Ne", - "city": "Albuquerque", - "county": "Bernalillo", - "state": "NM", - "zip": "87107", - "phone": "505-881-2899", - "fax": "505-881-3771", - "email": "laurie@bibbs.com", - "web": "http://www.lauriebibbs.com", - "followers": 5422 - }, - { - "firstname": "Angelo", - "lastname": "Ferentz", - "company": "Reagan, William L Esq", - "address": "3220 E 26th St", - "city": "Los Angeles", - "county": "Los Angeles", - "state": "CA", - "zip": "90023", - "phone": "323-262-5047", - "fax": "323-262-8693", - "email": "angelo@ferentz.com", - "web": "http://www.angeloferentz.com", - "followers": 6580 - }, - { - "firstname": "Denver", - "lastname": "Topete", - "company": "Insight Cablevision", - "address": "5770 Morehouse Dr", - "city": "San Diego", - "county": "San Diego", - "state": "CA", - "zip": "92121", - "phone": "858-457-3538", - "fax": "858-457-0465", - "email": "denver@topete.com", - "web": "http://www.denvertopete.com", - "followers": 6542 - }, - { - "firstname": "Tommie", - "lastname": "Reuland", - "company": "Schaff, Michael D Esq", - "address": "1166 Arroyo St", - "city": "San Fernando", - "county": "Los Angeles", - "state": "CA", - "zip": "91340", - "phone": "818-361-4035", - "fax": "818-361-7493", - "email": "tommie@reuland.com", - "web": "http://www.tommiereuland.com", - "followers": 7735 - }, - { - "firstname": "Delmer", - "lastname": "Delucas", - "company": "American Processing Co Inc", - "address": "2770 Walden Ave", - "city": "Buffalo", - "county": "Erie", - "state": "NY", - "zip": "14225", - "phone": "716-874-1439", - "fax": "716-874-3467", - "email": "delmer@delucas.com", - "web": "http://www.delmerdelucas.com", - "followers": 8605 - }, - { - "firstname": "Latisha", - "lastname": "Bahls", - "company": "Search South Inc", - "address": "3 E 4th St", - "city": "Cincinnati", - "county": "Hamilton", - "state": "OH", - "zip": "45202", - "phone": "513-784-5007", - "fax": "513-784-5275", - "email": "latisha@bahls.com", - "web": "http://www.latishabahls.com", - "followers": 8504 - }, - { - "firstname": "Simone", - "lastname": "Lundie", - "company": "Casebolt, Victor S Esq", - "address": "701 S 17th St", - "city": "Philadelphia", - "county": "Philadelphia", - "state": "PA", - "zip": "19146", - "phone": "215-732-9026", - "fax": "215-732-8257", - "email": "simone@lundie.com", - "web": "http://www.simonelundie.com", - "followers": 2165 - }, - { - "firstname": "Ross", - "lastname": "Spurger", - "company": "Hoover Group Inc", - "address": "710 S Illinois Ave", - "city": "Carbondale", - "county": "Jackson", - "state": "IL", - "zip": "62901", - "phone": "618-453-9968", - "fax": "618-453-6144", - "email": "ross@spurger.com", - "web": "http://www.rossspurger.com", - "followers": 361 - }, - { - "firstname": "Abel", - "lastname": "Tuter", - "company": "Wernsing Plumbing & Heating", - "address": "2457 Perkiomen Ave", - "city": "Reading", - "county": "Berks", - "state": "PA", - "zip": "19606", - "phone": "610-370-6549", - "fax": "610-370-0856", - "email": "abel@tuter.com", - "web": "http://www.abeltuter.com", - "followers": 6215 - }, - { - "firstname": "Beverley", - "lastname": "Bunche", - "company": "Nurses Organization Vets Affrs", - "address": "1727 Nw 79th Ave", - "city": "Miami", - "county": "Miami-Dade", - "state": "FL", - "zip": "33126", - "phone": "305-591-4141", - "fax": "305-591-7751", - "email": "beverley@bunche.com", - "web": "http://www.beverleybunche.com", - "followers": 8121 - }, - { - "firstname": "Lizzie", - "lastname": "Torregrossa", - "company": "Salerno & Son", - "address": "78 Faunce Corner Rd", - "city": "North Dartmouth", - "county": "Bristol", - "state": "MA", - "zip": "02747", - "phone": "508-997-1409", - "fax": "508-997-9846", - "email": "lizzie@torregrossa.com", - "web": "http://www.lizzietorregrossa.com", - "followers": 1134 - }, - { - "firstname": "Tia", - "lastname": "Neumaier", - "company": "Carterville Mini Storage", - "address": "2500 Maitland Center Pky", - "city": "Maitland", - "county": "Orange", - "state": "FL", - "zip": "32751", - "phone": "407-660-7426", - "fax": "407-660-7628", - "email": "tia@neumaier.com", - "web": "http://www.tianeumaier.com", - "followers": 3010 - }, - { - "firstname": "Lesa", - "lastname": "Chantry", - "company": "Lutz Cichy Selig & Zeronda", - "address": "1119 N Bodine St", - "city": "Philadelphia", - "county": "Philadelphia", - "state": "PA", - "zip": "19123", - "phone": "215-923-0136", - "fax": "215-923-9492", - "email": "lesa@chantry.com", - "web": "http://www.lesachantry.com", - "followers": 5201 - }, - { - "firstname": "Marcelo", - "lastname": "Arostegui", - "company": "Moraschs Quality Meats", - "address": "76 Mall Comp", - "city": "Branson", - "county": "Taney", - "state": "MO", - "zip": "65616", - "phone": "417-336-9702", - "fax": "417-336-2664", - "email": "marcelo@arostegui.com", - "web": "http://www.marceloarostegui.com", - "followers": 1195 - }, - { - "firstname": "Jimmie", - "lastname": "Hardgrove", - "company": "Prosthodontic Associates", - "address": "305 E 47th St", - "city": "New York", - "county": "New York", - "state": "NY", - "zip": "10017", - "phone": "212-980-0445", - "fax": "212-980-6914", - "email": "jimmie@hardgrove.com", - "web": "http://www.jimmiehardgrove.com", - "followers": 1002 - }, - { - "firstname": "Renae", - "lastname": "Eldrige", - "company": "Pexco Packaging Corp", - "address": "1716 Rt 77", - "city": "Attica", - "county": "Wyoming", - "state": "NY", - "zip": "14011", - "phone": "585-591-3118", - "fax": "585-591-9104", - "email": "renae@eldrige.com", - "web": "http://www.renaeeldrige.com", - "followers": 4105 - }, - { - "firstname": "Tisha", - "lastname": "Gorder", - "company": "Paroly Rampart Sec Systems", - "address": "77 W Huron St", - "city": "Chicago", - "county": "Cook", - "state": "IL", - "zip": "60610", - "phone": "312-642-2897", - "fax": "312-642-2664", - "email": "tisha@gorder.com", - "web": "http://www.tishagorder.com", - "followers": 3305 - }, - { - "firstname": "Clarice", - "lastname": "Knower", - "company": "Yaffa, Andrew B Esq", - "address": "210 W 79th St", - "city": "Chicago", - "county": "Cook", - "state": "IL", - "zip": "60620", - "phone": "773-846-1489", - "fax": "773-846-1462", - "email": "clarice@knower.com", - "web": "http://www.clariceknower.com", - "followers": 5497 - }, - { - "firstname": "Sybil", - "lastname": "Marmerchant", - "company": "Blvd Distillers & Importers", - "address": "12 E 7th Ave", - "city": "York", - "county": "York", - "state": "PA", - "zip": "17404", - "phone": "717-845-4718", - "fax": "717-845-4736", - "email": "sybil@marmerchant.com", - "web": "http://www.sybilmarmerchant.com", - "followers": 4656 - }, - { - "firstname": "Floyd", - "lastname": "Veazey", - "company": "Ramada Inn San Fran Arprt N", - "address": "2877 E Florence Ave", - "city": "Huntington Park", - "county": "Los Angeles", - "state": "CA", - "zip": "90255", - "phone": "323-862-9133", - "fax": "323-862-5589", - "email": "floyd@veazey.com", - "web": "http://www.floydveazey.com", - "followers": 4208 - }, - { - "firstname": "Reyna", - "lastname": "Bangle", - "company": "C & R Contractors Inc", - "address": "85 Long Island Expy", - "city": "New Hyde Park", - "county": "Nassau", - "state": "NY", - "zip": "11040", - "phone": "516-627-8715", - "fax": "516-627-9033", - "email": "reyna@bangle.com", - "web": "http://www.reynabangle.com", - "followers": 9261 - }, - { - "firstname": "Owen", - "lastname": "Sparacino", - "company": "Murtha, Thomas D Esq", - "address": "2865 Poplar Ave", - "city": "Memphis", - "county": "Shelby", - "state": "TN", - "zip": "38111", - "phone": "901-324-9274", - "fax": "901-324-4381", - "email": "owen@sparacino.com", - "web": "http://www.owensparacino.com", - "followers": 154 - }, - { - "firstname": "Eli", - "lastname": "Bettner", - "company": "Shea, David J Esq", - "address": "825 W Main Ave", - "city": "Brewster", - "county": "Okanogan", - "state": "WA", - "zip": "98812", - "phone": "509-689-7964", - "fax": "509-689-1394", - "email": "eli@bettner.com", - "web": "http://www.elibettner.com", - "followers": 9176 - }, - { - "firstname": "Taylor", - "lastname": "Fogerty", - "company": "Khoury Factory Outlet", - "address": "2000 W 120th Ave", - "city": "Denver", - "county": "Adams", - "state": "CO", - "zip": "80234", - "phone": "303-465-0070", - "fax": "303-465-2109", - "email": "taylor@fogerty.com", - "web": "http://www.taylorfogerty.com", - "followers": 2464 - }, - { - "firstname": "Reva", - "lastname": "Lecates", - "company": "First American Rlty Assoc Inc", - "address": "829 S 14th St", - "city": "Fernandina Beach", - "county": "Nassau", - "state": "FL", - "zip": "32034", - "phone": "904-261-0604", - "fax": "904-261-2123", - "email": "reva@lecates.com", - "web": "http://www.revalecates.com", - "followers": 8963 - }, - { - "firstname": "Rodrigo", - "lastname": "Wildrick", - "company": "Midwest Wrecking Company Inc", - "address": "1201 34th St N", - "city": "Saint Petersburg", - "county": "Pinellas", - "state": "FL", - "zip": "33713", - "phone": "727-323-5060", - "fax": "727-323-5982", - "email": "rodrigo@wildrick.com", - "web": "http://www.rodrigowildrick.com", - "followers": 1406 - }, - { - "firstname": "George", - "lastname": "Tukis", - "company": "Andow Personnel Services", - "address": "8 Inn Of Americus", - "city": "Americus", - "county": "Sumter", - "state": "GA", - "zip": "31709", - "phone": "229-924-0263", - "fax": "229-924-4251", - "email": "george@tukis.com", - "web": "http://www.georgetukis.com", - "followers": 5243 - }, - { - "firstname": "Titus", - "lastname": "Rodreguez", - "company": "Vasquez & Co", - "address": "7677 Engineer Rd", - "city": "San Diego", - "county": "San Diego", - "state": "CA", - "zip": "92111", - "phone": "858-571-0819", - "fax": "858-571-9047", - "email": "titus@rodreguez.com", - "web": "http://www.titusrodreguez.com", - "followers": 9258 - }, - { - "firstname": "Emilio", - "lastname": "Lampkin", - "company": "Hendricks, Kenneth J Cpa", - "address": "834 Lois Dr", - "city": "Williamstown", - "county": "Gloucester", - "state": "NJ", - "zip": "08094", - "phone": "856-629-8933", - "fax": "856-629-3337", - "email": "emilio@lampkin.com", - "web": "http://www.emiliolampkin.com", - "followers": 5810 - }, - { - "firstname": "Maryjane", - "lastname": "Arata", - "company": "Larson, John R Esq", - "address": "342 Wolverine Way", - "city": "Sparks", - "county": "Washoe", - "state": "NV", - "zip": "89431", - "phone": "775-352-5822", - "fax": "775-352-1557", - "email": "maryjane@arata.com", - "web": "http://www.maryjanearata.com", - "followers": 5044 - }, - { - "firstname": "Marcie", - "lastname": "Shulz", - "company": "United Printers Inc", - "address": "Blanco Rd", - "city": "San Antonio", - "county": "Bexar", - "state": "TX", - "zip": "78216", - "phone": "210-524-6711", - "fax": "210-524-1693", - "email": "marcie@shulz.com", - "web": "http://www.marcieshulz.com", - "followers": 4807 - }, - { - "firstname": "Celia", - "lastname": "Slavin", - "company": "Acra Aerospace Inc", - "address": "8750 W Bryn Mawr Ave", - "city": "Chicago", - "county": "Cook", - "state": "IL", - "zip": "60631", - "phone": "773-256-3550", - "fax": "773-256-2162", - "email": "celia@slavin.com", - "web": "http://www.celiaslavin.com", - "followers": 3493 - }, - { - "firstname": "Suzette", - "lastname": "Devaughan", - "company": "Anchor Graphics Inc", - "address": "385 Prospect Ave", - "city": "Hackensack", - "county": "Bergen", - "state": "NJ", - "zip": "07601", - "phone": "201-342-8964", - "fax": "201-342-9862", - "email": "suzette@devaughan.com", - "web": "http://www.suzettedevaughan.com", - "followers": 6410 - }, - { - "firstname": "Christian", - "lastname": "Marnell", - "company": "Wenick, George D Esq", - "address": "2750 Springboro Rd", - "city": "Dayton", - "county": "Montgomery", - "state": "OH", - "zip": "45439", - "phone": "937-293-9728", - "fax": "937-293-6782", - "email": "christian@marnell.com", - "web": "http://www.christianmarnell.com", - "followers": 3071 - }, - { - "firstname": "Misty", - "lastname": "Ericksen", - "company": "Graham & Associates Inc", - "address": "1808 2nd", - "city": "Cheney", - "county": "Spokane", - "state": "WA", - "zip": "99004", - "phone": "509-235-8873", - "fax": "509-235-1856", - "email": "misty@ericksen.com", - "web": "http://www.mistyericksen.com", - "followers": 1779 - }, - { - "firstname": "Bert", - "lastname": "Schadle", - "company": "Guaranty Chevrolet Geo", - "address": "500 Sw Loop #-820", - "city": "Fort Worth", - "county": "Tarrant", - "state": "TX", - "zip": "76115", - "phone": "817-921-5560", - "fax": "817-921-5913", - "email": "bert@schadle.com", - "web": "http://www.bertschadle.com", - "followers": 9753 - }, - { - "firstname": "Bertram", - "lastname": "Quertermous", - "company": "Florida Mining & Materials", - "address": "222 Delaware Ave", - "city": "Wilmington", - "county": "New Castle", - "state": "DE", - "zip": "19801", - "phone": "302-655-8039", - "fax": "302-655-4522", - "email": "bertram@quertermous.com", - "web": "http://www.bertramquertermous.com", - "followers": 4349 - }, - { - "firstname": "Buster", - "lastname": "Wubbel", - "company": "Collins, Joseph B Esq", - "address": "315 Us Rt 1", - "city": "Fairless Hills", - "county": "Bucks", - "state": "PA", - "zip": "19030", - "phone": "215-943-3689", - "fax": "215-943-6049", - "email": "buster@wubbel.com", - "web": "http://www.busterwubbel.com", - "followers": 6911 - }, - { - "firstname": "Mildred", - "lastname": "Gallegas", - "company": "Rogers, William A Jr", - "address": "310 Ridge Rd", - "city": "Claymont", - "county": "New Castle", - "state": "DE", - "zip": "19703", - "phone": "302-792-8044", - "fax": "302-792-1282", - "email": "mildred@gallegas.com", - "web": "http://www.mildredgallegas.com", - "followers": 8618 - }, - { - "firstname": "Pat", - "lastname": "Hoshaw", - "company": "Jorgensen, James L Esq", - "address": "30 Matthews Rd", - "city": "Malvern", - "county": "Chester", - "state": "PA", - "zip": "19355", - "phone": "610-644-7836", - "fax": "610-644-3252", - "email": "pat@hoshaw.com", - "web": "http://www.pathoshaw.com", - "followers": 6030 - }, - { - "firstname": "Marshall", - "lastname": "Hutch", - "company": "Nako, Joy Y", - "address": "Route 519", - "city": "Eighty Four", - "county": "Washington", - "state": "PA", - "zip": "15330", - "phone": "724-225-1729", - "fax": "724-225-7064", - "email": "marshall@hutch.com", - "web": "http://www.marshallhutch.com", - "followers": 6225 - }, - { - "firstname": "Don", - "lastname": "Mestler", - "company": "Coldwell Bnkr Hearthside Rltrs", - "address": "State Hwy #-31", - "city": "Pennington", - "county": "Mercer", - "state": "NJ", - "zip": "08534", - "phone": "609-737-2033", - "fax": "609-737-2374", - "email": "don@mestler.com", - "web": "http://www.donmestler.com", - "followers": 6967 - }, - { - "firstname": "Emery", - "lastname": "Reek", - "company": "Metri Tech Engineering Inc", - "address": "85 S Beachview Dr", - "city": "Jekyll Island", - "county": "Glynn", - "state": "GA", - "zip": "31527", - "phone": "912-635-3866", - "fax": "912-635-4039", - "email": "emery@reek.com", - "web": "http://www.emeryreek.com", - "followers": 2476 - }, - { - "firstname": "Ray", - "lastname": "Srock", - "company": "Tilt Lock Inc", - "address": "8700 E Pinnacle Peak Rd", - "city": "Scottsdale", - "county": "Maricopa", - "state": "AZ", - "zip": "85255", - "phone": "480-585-6138", - "fax": "480-585-4983", - "email": "ray@srock.com", - "web": "http://www.raysrock.com", - "followers": 2387 - }, - { - "firstname": "Nickolas", - "lastname": "Khosravi", - "company": "Brennan, Mary V Esq", - "address": "120 Tustin Ave", - "city": "Newport Beach", - "county": "Orange", - "state": "CA", - "zip": "92663", - "phone": "949-646-6578", - "fax": "949-646-0043", - "email": "nickolas@khosravi.com", - "web": "http://www.nickolaskhosravi.com", - "followers": 3074 - }, - { - "firstname": "Aileen", - "lastname": "Mottern", - "company": "Bennett Hallmark Cards", - "address": "2053 Lemoine Ave", - "city": "Fort Lee", - "county": "Bergen", - "state": "NJ", - "zip": "07024", - "phone": "201-944-1664", - "fax": "201-944-3382", - "email": "aileen@mottern.com", - "web": "http://www.aileenmottern.com", - "followers": 6519 - }, - { - "firstname": "Chad", - "lastname": "Araiza", - "company": "Christiansen, David L Cpa", - "address": "536 Grand Ave", - "city": "Schofield", - "county": "Marathon", - "state": "WI", - "zip": "54476", - "phone": "715-359-8700", - "fax": "715-359-3579", - "email": "chad@araiza.com", - "web": "http://www.chadaraiza.com", - "followers": 4865 - }, - { - "firstname": "Beverly", - "lastname": "Cambel", - "company": "Mcintyre Mcintyre & Mcintyre", - "address": "630 W 8th Ave", - "city": "Anchorage", - "county": "Anchorage", - "state": "AK", - "zip": "99501", - "phone": "907-272-3953", - "fax": "907-272-3618", - "email": "beverly@cambel.com", - "web": "http://www.beverlycambel.com", - "followers": 2393 - }, - { - "firstname": "Janice", - "lastname": "Twiet", - "company": "Henley, Cal Pa", - "address": "136 S Riverside Ave", - "city": "Rialto", - "county": "San Bernardino", - "state": "CA", - "zip": "92376", - "phone": "909-874-6739", - "fax": "909-874-2594", - "email": "janice@twiet.com", - "web": "http://www.janicetwiet.com", - "followers": 7340 - }, - { - "firstname": "Byron", - "lastname": "Fortuna", - "company": "Jackson & Collins Pa", - "address": "700 Sw Higgins Ave", - "city": "Missoula", - "county": "Missoula", - "state": "MT", - "zip": "59803", - "phone": "406-549-8320", - "fax": "406-549-4641", - "email": "byron@fortuna.com", - "web": "http://www.byronfortuna.com", - "followers": 8913 - }, - { - "firstname": "Lynette", - "lastname": "Setlock", - "company": "George S Olive & Co", - "address": "614 W Superior Ave", - "city": "Cleveland", - "county": "Cuyahoga", - "state": "OH", - "zip": "44113", - "phone": "216-566-2265", - "fax": "216-566-2299", - "email": "lynette@setlock.com", - "web": "http://www.lynettesetlock.com", - "followers": 8002 - }, - { - "firstname": "Willard", - "lastname": "Roughen", - "company": "Nakamura Oyama & Assocs Inc", - "address": "9 5officce Product Cent", - "city": "Arlington", - "county": "Tarrant", - "state": "TX", - "zip": "76012", - "phone": "817-265-1847", - "fax": "817-265-0322", - "email": "willard@roughen.com", - "web": "http://www.willardroughen.com", - "followers": 861 - }, - { - "firstname": "Elisa", - "lastname": "Gracely", - "company": "Alexander, Christine T Esq", - "address": "1805 Kings Hwy", - "city": "Brooklyn", - "county": "Kings", - "state": "NY", - "zip": "11229", - "phone": "718-627-1421", - "fax": "718-627-9346", - "email": "elisa@gracely.com", - "web": "http://www.elisagracely.com", - "followers": 5321 - }, - { - "firstname": "Jeri", - "lastname": "Farstvedt", - "company": "Regan, Denis J Esq", - "address": "16133 Ventura Blvd #-700", - "city": "Encino", - "county": "Los Angeles", - "state": "CA", - "zip": "91436", - "phone": "818-986-8843", - "fax": "818-986-6786", - "email": "jeri@farstvedt.com", - "web": "http://www.jerifarstvedt.com", - "followers": 9529 - }, - { - "firstname": "Stacey", - "lastname": "Blow", - "company": "Schechter, Jeffrey S Esq", - "address": "136 S Riverside Ave", - "city": "Rialto", - "county": "San Bernardino", - "state": "CA", - "zip": "92376", - "phone": "909-874-0274", - "fax": "909-874-8538", - "email": "stacey@blow.com", - "web": "http://www.staceyblow.com", - "followers": 6685 - }, - { - "firstname": "Bryan", - "lastname": "Rovell", - "company": "All N All Shop", - "address": "90 Hackensack St", - "city": "East Rutherford", - "county": "Bergen", - "state": "NJ", - "zip": "07073", - "phone": "201-939-2788", - "fax": "201-939-9079", - "email": "bryan@rovell.com", - "web": "http://www.bryanrovell.com", - "followers": 2687 - }, - { - "firstname": "Joey", - "lastname": "Bolick", - "company": "Utility Trailer Sales", - "address": "7700 N Council Rd", - "city": "Oklahoma City", - "county": "Oklahoma", - "state": "OK", - "zip": "73132", - "phone": "405-728-5972", - "fax": "405-728-5244", - "email": "joey@bolick.com", - "web": "http://www.joeybolick.com", - "followers": 8465 - } -] diff --git a/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/resources/ca-bundle.crt b/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/resources/ca-bundle.crt deleted file mode 100644 index 52e0c4e..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/resources/ca-bundle.crt +++ /dev/null @@ -1,3908 +0,0 @@ -## -## ca-bundle.crt -- Bundle of CA Root Certificates -## -## Certificate data from Mozilla as of: Sat Dec 29 20:03:40 2012 -## -## This is a bundle of X.509 certificates of public Certificate Authorities -## (CA). These were automatically extracted from Mozilla's root certificates -## file (certdata.txt). This file can be found in the mozilla source tree: -## http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1 -## -## It contains the certificates in PEM format and therefore -## can be directly used with curl / libcurl / php_curl, or with -## an Apache+mod_ssl webserver for SSL client authentication. -## Just configure this file as the SSLCACertificateFile. -## - -# @(#) $RCSfile: certdata.txt,v $ $Revision: 1.87 $ $Date: 2012/12/29 16:32:45 $ - -USERTrust RSA root CA -===================== ------BEGIN CERTIFICATE----- -MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB -iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl -cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV -BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw -MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV -BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU -aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B -3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY -tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ -Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 -VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT -79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 -c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT -Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l -c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee -UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE -Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd -BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G -A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF -Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO -VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 -ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs -8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR -iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze -Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ -XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ -qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB -VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB -L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG -jjxDah2nGN59PRbxYvnKkKj9 ------END CERTIFICATE----- - -GTE CyberTrust Global Root -========================== ------BEGIN CERTIFICATE----- -MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg -Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG -A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz -MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL -Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0 -IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u -sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql -HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID -AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW -M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF -NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ ------END CERTIFICATE----- - -Thawte Server CA -================ ------BEGIN CERTIFICATE----- -MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs -dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE -AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j -b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV -BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u -c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG -A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 -ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl -/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7 -1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR -MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J -GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ -GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= ------END CERTIFICATE----- - -Thawte Premium Server CA -======================== ------BEGIN CERTIFICATE----- -MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs -dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE -AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl -ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT -AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU -VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2 -aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ -cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2 -aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh -Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/ -qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm -SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf -8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t -UCemDaYj+bvLpgcUQg== ------END CERTIFICATE----- - -Equifax Secure CA -================= ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE -ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 -MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT -B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB -nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR -fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW -8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG -A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE -CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG -A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS -spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB -Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961 -zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB -BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95 -70+sB3c4 ------END CERTIFICATE----- - -Digital Signature Trust Co. Global CA 1 -======================================= ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE -ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMTAeFw05ODEy -MTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs -IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUA -A4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJE -NySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2i -o74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo -BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 -dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw -IoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQY -MBaAFGp5fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAM -BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB -ACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lNQseSJqBcNJo4cvj9axY+IO6CizEq -kzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4 -RbyhkwS7hp86W0N6w4pl ------END CERTIFICATE----- - -Digital Signature Trust Co. Global CA 3 -======================================= ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE -ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMjAeFw05ODEy -MDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs -IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUA -A4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGOD -VvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JS -xhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo -BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 -dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw -IoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQY -MBaAFB6CTShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAM -BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB -AEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHRxdf0CiUPPXiBng+xZ8SQTGPdXqfi -up/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1 -mPnHfxsb1gYgAlihw6ID ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority -======================================================= ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx -FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow -XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz -IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 -f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol -hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA -TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah -WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf -Tqj/ZA1k ------END CERTIFICATE----- - -Verisign Class 1 Public Primary Certification Authority - G2 -============================================================ ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT -MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz -dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT -MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz -dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgd -k4xWArzZbxpvUjZudVYKVdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIq -WpDBucSmFc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQIDAQAB -MA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0Jh9ZrbWB85a7FkCMM -XErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2uluIncrKTdcu1OofdPvAbT6shkdHvC -lUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68DzFc6PLZ ------END CERTIFICATE----- - -Verisign Class 2 Public Primary Certification Authority - G2 -============================================================ ------BEGIN CERTIFICATE----- -MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h -cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp -Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1 -c3QgTmV0d29yazAeFw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h -cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp -Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1 -c3QgTmV0d29yazCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjx -nNuX6Zr8wgQGE75fUsjMHiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRC -wiNPStjwDqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cCAwEA -ATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9jinb3/7aHmZuovCfTK -1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAXrXfMSTWqz9iP0b63GJZHc2pUIjRk -LbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnInjBJ7xUS0rg== ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority - G2 -============================================================ ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT -MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz -dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT -MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz -dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO -FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71 -lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB -MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT -1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD -Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9 ------END CERTIFICATE----- - -GlobalSign Root CA -================== ------BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx -GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds -b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV -BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD -VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa -DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc -THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb -Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP -c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX -gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF -AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj -Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG -j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH -hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC -X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== ------END CERTIFICATE----- - -GlobalSign Root CA - R2 -======================= ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv -YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh -bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT -aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln -bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 -ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp -s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN -S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL -TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C -ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i -YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN -BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp -9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu -01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 -9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 -TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== ------END CERTIFICATE----- - -ValiCert Class 1 VA -=================== ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp -b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh -bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy -MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 -d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg -UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 -LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi -GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm -DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG -lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX -icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP -Orf1LXLI ------END CERTIFICATE----- - -ValiCert Class 2 VA -=================== ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp -b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh -bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw -MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 -d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg -UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 -LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC -CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf -ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ -SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV -UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8 -W9ViH0Pd ------END CERTIFICATE----- - -RSA Root Certificate 1 -====================== ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp -b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh -bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw -MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 -d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg -UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 -LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td -3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H -BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs -3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF -V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r -on+jjBXu ------END CERTIFICATE----- - -Verisign Class 1 Public Primary Certification Authority - G3 -============================================================ ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy -dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAN2E1Lm0+afY8wR4nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/E -bRrsC+MO8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjVojYJ -rKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjbPG7PoBMAGrgnoeS+ -Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP26KbqxzcSXKMpHgLZ2x87tNcPVkeB -FQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vrn5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA -q2aN17O6x5q25lXQBfGfMY1aqtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/N -y9Sn2WCVhDr4wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3 -ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrspSCAaWihT37h -a88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4E1Z5T21Q6huwtVexN2ZYI/Pc -D98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g== ------END CERTIFICATE----- - -Verisign Class 2 Public Primary Certification Authority - G3 -============================================================ ------BEGIN CERTIFICATE----- -MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJBgNVBAYTAlVT -MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29y -azE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ug -b25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1 -c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y -aXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEArwoNwtUs22e5LeWUJ92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6 -tW8UvxDOJxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUYwZF7 -C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9okoqQHgiBVrKtaaNS -0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjNqWm6o+sdDZykIKbBoMXRRkwXbdKs -Zj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/ESrg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0 -JhU8wI1NQ0kdvekhktdmnLfexbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf -0xwLRtxyID+u7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU -sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RIsH/7NiXaldDx -JBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTPcjnhsUPgKM+351psE2tJs//j -GHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority - G3 -============================================================ ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy -dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 -EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc -cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw -EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj -055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA -ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f -j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC -/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 -xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa -t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== ------END CERTIFICATE----- - -Verisign Class 4 Public Primary Certification Authority - G3 -============================================================ ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy -dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS -tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM -8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW -Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX -Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA -j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt -mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm -fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd -RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG -UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== ------END CERTIFICATE----- - -Entrust.net Secure Server CA -============================ ------BEGIN CERTIFICATE----- -MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV -BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg -cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl -ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG -A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi -eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p -dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ -aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5 -gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw -ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw -CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l -dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF -bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu -dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw -NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow -HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA -BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN -Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9 -n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= ------END CERTIFICATE----- - -Entrust.net Premium 2048 Secure Server CA -========================================= ------BEGIN CERTIFICATE----- -MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u -ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp -bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV -BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx -NzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 -d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl -MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u -ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL -Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr -hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW -nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi -VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo3QwcjARBglghkgBhvhC -AQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdER -gL7YibkIozH5oSQJFrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B -AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo -oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQh7A6tcOdBTcS -o8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z -2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjX -OP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ== ------END CERTIFICATE----- - -Baltimore CyberTrust Root -========================= ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE -ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li -ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC -SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs -dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME -uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB -UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C -G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 -XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr -l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI -VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB -BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh -cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 -hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa -Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H -RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- - -Equifax Secure Global eBusiness CA -================================== ------BEGIN CERTIFICATE----- -MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp -bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx -HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds -b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV -PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN -qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn -hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j -BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs -MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN -I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY -NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV ------END CERTIFICATE----- - -Equifax Secure eBusiness CA 1 -============================= ------BEGIN CERTIFICATE----- -MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB -LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE -ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz -IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ -1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a -IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk -MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW -Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF -AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5 -lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+ -KpYrtWKmpj29f5JZzVoqgrI3eQ== ------END CERTIFICATE----- - -Equifax Secure eBusiness CA 2 -============================= ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEXMBUGA1UE -ChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y -MB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoT -DkVxdWlmYXggU2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCB -nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn -2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5 -BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAG -A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUx -JjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoG -A1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9e -uSBIplBqy/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMB -Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAAyGgq3oThr1 -jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia -78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUm -V+GRMOrN ------END CERTIFICATE----- - -AddTrust Low-Value Services Root -================================ ------BEGIN CERTIFICATE----- -MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU -cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw -CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO -ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6 -54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr -oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1 -Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui -GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w -HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD -AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT -RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw -HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt -ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph -iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY -eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr -mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj -ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= ------END CERTIFICATE----- - -AddTrust Public Services Root -============================= ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU -cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ -BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l -dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu -nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i -d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG -Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw -HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G -A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux -FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G -A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4 -JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL -+YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao -GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9 -Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H -EufOX1362KqxMy3ZdvJOOjMMK7MtkAY= ------END CERTIFICATE----- - -AddTrust Qualified Certificates Root -==================================== ------BEGIN CERTIFICATE----- -MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU -cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx -CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ -IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx -64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3 -KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o -L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR -wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU -MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE -BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y -azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD -ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG -GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X -dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze -RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB -iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE= ------END CERTIFICATE----- - -Entrust Root Certification Authority -==================================== ------BEGIN CERTIFICATE----- -MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV -BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw -b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG -A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 -MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu -MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu -Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v -dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz -A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww -Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 -j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN -rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw -DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 -MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH -hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA -A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM -Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa -v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS -W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 -tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 ------END CERTIFICATE----- - -RSA Security 2048 v3 -==================== ------BEGIN CERTIFICATE----- -MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK -ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy -MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb -BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7 -Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb -WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH -KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP -+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/ -MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E -FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY -v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj -0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj -VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395 -nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA -pKnXwiJPZ9d37CAFYd4= ------END CERTIFICATE----- - -GeoTrust Global CA -================== ------BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK -Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw -MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j -LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo -BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet -8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc -T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU -vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk -DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q -zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 -d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 -mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p -XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm -Mw== ------END CERTIFICATE----- - -GeoTrust Global CA 2 -==================== ------BEGIN CERTIFICATE----- -MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN -R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw -MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j -LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/ -NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k -LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA -Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b -HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH -K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7 -srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh -ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL -OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC -x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF -H4z1Ir+rzoPz4iIprn2DQKi6bA== ------END CERTIFICATE----- - -GeoTrust Universal CA -===================== ------BEGIN CERTIFICATE----- -MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN -R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 -MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu -Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t -JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e -RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs -7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d -8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V -qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga -Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB -Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu -KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 -ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 -XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB -hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc -aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 -qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL -oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK -xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF -KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 -DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK -xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU -p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI -P/rmMuGNG2+k5o7Y+SlIis5z/iw= ------END CERTIFICATE----- - -GeoTrust Universal CA 2 -======================= ------BEGIN CERTIFICATE----- -MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN -R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 -MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg -SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 -DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 -j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q -JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a -QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 -WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP -20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn -ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC -SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG -8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 -+/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E -BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z -dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ -4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ -mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq -A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg -Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP -pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d -FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp -gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm -X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS ------END CERTIFICATE----- - -UTN-USER First-Network Applications -=================================== ------BEGIN CERTIFICATE----- -MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUFADCBozELMAkGA1UE -BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl -IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzAp -BgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0ODM5 -WhcNMTkwNzA5MTg1NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5T -YWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBB -cHBsaWNhdGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCz+5Gh5DZVhawGNFug -mliy+LUPBXeDrjKxdpJo7CNKyXY/45y2N3kDuatpjQclthln5LAbGHNhSuh+zdMvZOOmfAz6F4Cj -DUeJT1FxL+78P/m4FoCHiZMlIJpDgmkkdihZNaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXu -Ozr0hAReYFmnjDRy7rh4xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1axwi -P8vv/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6gyN7igEL66S/ozjIE -j3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8w -HQYDVR0OBBYEFPqGydvguul49Uuo1hXf8NPhahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9j -cmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0G -CSqGSIb3DQEBBQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXhi6r/fWRRzwr/vH3Y -IWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUqf9FuVSTiuwL7MT++6LzsQCv4AdRWOOTK -RIK1YSAhZ2X28AvnNPilwpyjXEAfhZOVBt5P1CeptqX8Fs1zMT+4ZSfP1FMa8Kxun08FDAOBp4Qp -xFq9ZFdyrTvPNximmMatBrTcCKME1SmklpoSZ0qMYEWd8SOasACcaLWYUNPvji6SZbFIPiG+FTAq -DbUMo2s/rn9X9R+WfN9v3YIwLGUbQErNaLly7HF27FSOH4UMAWr6pjisH8SE ------END CERTIFICATE----- - -America Online Root Certification Authority 1 -============================================= ------BEGIN CERTIFICATE----- -MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG -A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg -T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG -v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z -DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh -sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP -8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T -AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z -o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf -GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF -VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft -3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g -Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds -sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 ------END CERTIFICATE----- - -America Online Root Certification Authority 2 -============================================= ------BEGIN CERTIFICATE----- -MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG -A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg -T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en -fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8 -f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO -qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN -RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0 -gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn -6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid -FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6 -Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj -B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op -aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE -AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY -T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p -+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg -JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy -zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO -ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh -1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf -GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff -Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP -cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk= ------END CERTIFICATE----- - -Visa eCommerce Root -=================== ------BEGIN CERTIFICATE----- -MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG -EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug -QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 -WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm -VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv -bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL -F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b -RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 -TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI -/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs -GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG -MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc -CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW -YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz -zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu -YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt -398znM/jra6O1I7mT1GvFpLgXPYHDw== ------END CERTIFICATE----- - -Certum Root CA -============== ------BEGIN CERTIFICATE----- -MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK -ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla -Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u -by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x -wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL -kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ -89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K -Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P -NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq -hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+ -GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg -GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/ -0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS -qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw== ------END CERTIFICATE----- - -Comodo AAA Services root -======================== ------BEGIN CERTIFICATE----- -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS -R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg -TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw -MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl -c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV -BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG -C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs -i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW -Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH -Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK -Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f -BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl -cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz -LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm -7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz -Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z -8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C -12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== ------END CERTIFICATE----- - -Comodo Secure Services root -=========================== ------BEGIN CERTIFICATE----- -MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS -R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg -TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw -MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu -Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi -BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP -9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc -rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC -oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V -p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E -FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w -gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj -YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm -aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm -4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj -Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL -DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw -pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H -RR3B7Hzs/Sk= ------END CERTIFICATE----- - -Comodo Trusted Services root -============================ ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS -R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg -TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw -MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h -bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw -IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7 -3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y -/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6 -juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS -ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud -DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp -ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl -cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw -uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 -pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA -BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l -R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O -9y5Xt5hwXsjEeLBi ------END CERTIFICATE----- - -QuoVadis Root CA -================ ------BEGIN CERTIFICATE----- -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE -ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz -MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp -cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD -EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk -J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL -F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL -YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen -AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w -PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y -ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 -MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj -YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs -ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh -Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW -Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu -BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw -FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 -tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo -fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul -LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x -gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi -5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi -5nrQNiOKSnQ2+Q== ------END CERTIFICATE----- - -QuoVadis Root CA 2 -================== ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -QuoVadis Root CA 3 -================== ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -Security Communication Root CA -============================== ------BEGIN CERTIFICATE----- -MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP -U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw -HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP -U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw -8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM -DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX -5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd -DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 -JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw -DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g -0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a -mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ -s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ -6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi -FL39vmwLAw== ------END CERTIFICATE----- - -Sonera Class 1 Root CA -====================== ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG -U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAxMDQwNjEwNDkxM1oXDTIxMDQw -NjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh -IENsYXNzMSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H88 -7dF+2rDNbS82rDTG29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9 -EJUkoVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk3w0LBUXl -0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBLqdReLjVQCfOAl/QMF645 -2F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIINnvmLVz5MxxftLItyM19yejhW1ebZrgUa -HXVFsculJRwSVzb9IjcCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZT -iFIwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE9 -28Jj2VuXZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0HDjxV -yhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VOTzF2nBBhjrZTOqMR -vq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2UvkVrCqIexVmiUefkl98HVrhq4uz2P -qYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4wzMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9Z -IRlXvVWa ------END CERTIFICATE----- - -Sonera Class 2 Root CA -====================== ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG -U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw -NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh -IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 -/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT -dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG -f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P -tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH -nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT -XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt -0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI -cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph -Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx -EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH -llpwrN9M ------END CERTIFICATE----- - -Staat der Nederlanden Root CA -============================= ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE -ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g -Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w -HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh -bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt -vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P -jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca -C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth -vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6 -22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV -HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v -dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN -BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR -EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw -MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y -nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR -iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== ------END CERTIFICATE----- - -TDC Internet Root CA -==================== ------BEGIN CERTIFICATE----- -MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJESzEVMBMGA1UE -ChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUx -NjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJu -ZXQxHTAbBgNVBAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20j -xsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvL -znWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc -5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6 -otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZI -AYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMM -VERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JM -MTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjALBgNVHQ8EBAMC -AQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAwHQYDVR0OBBYEFGxkAcf9hW2syNqe -UAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0G -CSqGSIb3DQEBBQUAA4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m -gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ -2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm899qNLPg7kbWzb -O0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrU -Cbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l ------END CERTIFICATE----- - -TDC OCES Root CA -================ ------BEGIN CERTIFICATE----- -MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJESzEMMAoGA1UE -ChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEwODM5MzBaFw0zNzAyMTEwOTA5 -MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNUREMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuH -nEz9pPPEXyG9VhDr2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0 -zY0s2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItUGBxIYXvV -iGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKjdGqPqcNiKXEx5TukYBde -dObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+rTpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO -3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB -5DCB4TCB3gYIKoFQgSkBAQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5k -ay9yZXBvc2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRlciBm -cmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4xLiBDZXJ0aWZp -Y2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4x -LjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1UdHwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEM -MAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYm -aHR0cDovL2NybC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy -MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZJ2cdUBVLc647 -+RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6 -NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACromJkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4 -A9G28kNBKWKnctj7fAXmMXAnVBhOinxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYsc -A+UYyAFMP8uXBV2YcaaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9 -AOoBmbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQYqbsFbS1 -AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9BKNDLdr8C2LqL19iUw== ------END CERTIFICATE----- - -UTN DATACorp SGC Root CA -======================== ------BEGIN CERTIFICATE----- -MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE -BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl -IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ -BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa -MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w -HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy -dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys -raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo -wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA -9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv -33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud -DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9 -BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD -LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3 -DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft -Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0 -I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx -EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP -DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI ------END CERTIFICATE----- - -UTN USERFirst Email Root CA -=========================== ------BEGIN CERTIFICATE----- -MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UE -BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl -IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0 -BgNVBAMTLVVUTi1VU0VSRmlyc3QtQ2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05 -OTA3MDkxNzI4NTBaFw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQx -FzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsx -ITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UEAxMtVVROLVVTRVJGaXJz -dC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWlsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3BYHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIx -B8dOtINknS4p1aJkxIW9hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8 -om+rWV6lL8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLmSGHG -TPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM1tZUOt4KpLoDd7Nl -yP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws6wIDAQABo4G5MIG2MAsGA1UdDwQE -AwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNV -HR8EUTBPME2gS6BJhkdodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGll -bnRBdXRoZW50aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH -AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u7mFVbwQ+zzne -xRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0xtcgBEXkzYABurorbs6q15L+ -5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQrfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarV -NZ1yQAOJujEdxRBoUp7fooXFXAimeOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZ -w7JHpsIyYdfHb0gkUSeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ= ------END CERTIFICATE----- - -UTN USERFirst Hardware Root CA -============================== ------BEGIN CERTIFICATE----- -MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE -BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl -IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd -BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx -OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0 -eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz -ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI -wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd -tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8 -i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf -Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw -gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF -lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF -UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF -BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM -//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW -XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2 -lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn -iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67 -nfhmqA== ------END CERTIFICATE----- - -UTN USERFirst Object Root CA -============================ ------BEGIN CERTIFICATE----- -MIIEZjCCA06gAwIBAgIQRL4Mi1AAJLQR0zYt4LNfGzANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UE -BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl -IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAb -BgNVBAMTFFVUTi1VU0VSRmlyc3QtT2JqZWN0MB4XDTk5MDcwOTE4MzEyMFoXDTE5MDcwOTE4NDAz -NlowgZUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkx -HjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3dy51c2Vy -dHJ1c3QuY29tMR0wGwYDVQQDExRVVE4tVVNFUkZpcnN0LU9iamVjdDCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAM6qgT+jo2F4qjEAVZURnicPHxzfOpuCaDDASmEd8S8O+r5596Uj71VR -loTN2+O5bj4x2AogZ8f02b+U60cEPgLOKqJdhwQJ9jCdGIqXsqoc/EHSoTbL+z2RuufZcDX65OeQ -w5ujm9M89RKZd7G3CeBo5hy485RjiGpq/gt2yb70IuRnuasaXnfBhQfdDWy/7gbHd2pBnqcP1/vu -lBe3/IW+pKvEHDHd17bR5PDv3xaPslKT16HUiaEHLr/hARJCHhrh2JU022R5KP+6LhHC5ehbkkj7 -RwvCbNqtMoNB86XlQXD9ZZBt+vpRxPm9lisZBCzTbafc8H9vg2XiaquHhnUCAwEAAaOBrzCBrDAL -BgNVHQ8EBAMCAcYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU2u1kdBScFDyr3ZmpvVsoTYs8 -ydgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmly -c3QtT2JqZWN0LmNybDApBgNVHSUEIjAgBggrBgEFBQcDAwYIKwYBBQUHAwgGCisGAQQBgjcKAwQw -DQYJKoZIhvcNAQEFBQADggEBAAgfUrE3RHjb/c652pWWmKpVZIC1WkDdIaXFwfNfLEzIR1pp6ujw -NTX00CXzyKakh0q9G7FzCL3Uw8q2NbtZhncxzaeAFK4T7/yxSPlrJSUtUbYsbUXBmMiKVl0+7kNO -PmsnjtA6S4ULX9Ptaqd1y9Fahy85dRNacrACgZ++8A+EVCBibGnU4U3GDZlDAQ0Slox4nb9QorFE -qmrPF3rPbw/U+CRVX/A0FklmPlBGyWNxODFiuGK581OtbLUrohKqGU8J2l7nk8aOFAj+8DCAGKCG -hU3IfdeLA/5u1fedFqySLKAj5ZyRUh+U3xeUc8OzwcFxBSAAeL0TUh2oPs0AH8g= ------END CERTIFICATE----- - -Camerfirma Chambers of Commerce Root -==================================== ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe -QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i -ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx -NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp -cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn -MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC -AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU -xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH -NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW -DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV -d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud -EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v -cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P -AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh -bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD -VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz -aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi -fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD -L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN -UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n -ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1 -erfutGWaIZDgqtCYvDi1czyL+Nw= ------END CERTIFICATE----- - -Camerfirma Global Chambersign Root -================================== ------BEGIN CERTIFICATE----- -MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe -QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i -ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx -NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt -YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg -MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw -ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J -1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O -by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl -6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c -8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/ -BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j -aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B -Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj -aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y -ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh -bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA -PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y -gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ -PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4 -IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes -t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== ------END CERTIFICATE----- - -NetLock Qualified (Class QA) Root -================================= ------BEGIN CERTIFICATE----- -MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUxETAPBgNVBAcT -CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV -BAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQDEzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVn -eXpvaSAoQ2xhc3MgUUEpIFRhbnVzaXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0 -bG9jay5odTAeFw0wMzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTER -MA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNhZ2kgS2Z0 -LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5ldExvY2sgTWlub3NpdGV0 -dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZhbnlraWFkbzEeMBwGCSqGSIb3DQEJARYP -aW5mb0BuZXRsb2NrLmh1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRV -CacbvWy5FPSKAtt2/GoqeKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e -8ia6AFQer7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO53Lhb -m+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWdvLrqOU+L73Sa58XQ -0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0lmT+1fMptsK6ZmfoIYOcZwvK9UdPM -0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4ICwDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV -HQ8BAf8EBAMCAQYwggJ1BglghkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2 -YW55IGEgTmV0TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh -biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQgZWxla3Ryb25p -a3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywgdmFsYW1pbnQgZWxmb2dhZGFz -YW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwg -YXogQWx0YWxhbm9zIFN6ZXJ6b2Rlc2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kg -ZWxqYXJhcyBtZWd0ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczov -L3d3dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0BuZXRsb2Nr -Lm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0 -aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMg -YXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0 -IGluZm9AbmV0bG9jay5uZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3 -DQEBBQUAA4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQMznN -wNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+NFAwLvt/MpqNPfMg -W/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCRVCHnpgu0mfVRQdzNo0ci2ccBgcTc -R08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR -5qq5aKrN9p2QdRLqOBrKROi3macqaJVmlaut74nLYKkGEsaUR+ko ------END CERTIFICATE----- - -NetLock Notary (Class A) Root -============================= ------BEGIN CERTIFICATE----- -MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI -EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 -dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j -ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX -DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH -EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD -VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz -cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM -D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ -z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC -/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7 -tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6 -4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG -A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC -Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv -bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu -IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn -LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0 -ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz -IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh -IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu -b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh -bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg -Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp -bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5 -ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP -ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB -CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr -KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM -8CgHrTwXZoi1/baI ------END CERTIFICATE----- - -NetLock Business (Class B) Root -=============================== ------BEGIN CERTIFICATE----- -MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT -CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV -BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg -VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD -VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv -bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg -VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB -iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S -o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr -1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV -HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ -RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh -dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0 -ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv -c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg -YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh -c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz -Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA -bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl -IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2 -YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj -cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM -43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR -stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI ------END CERTIFICATE----- - -NetLock Express (Class C) Root -============================== ------BEGIN CERTIFICATE----- -MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT -CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV -BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD -KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ -BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 -dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j -ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB -jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z -W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63 -euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw -DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN -RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn -YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB -IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i -aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0 -ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs -ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo -dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y -emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k -IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ -UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg -YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2 -xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW -gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A== ------END CERTIFICATE----- - -XRamp Global CA Root -==================== ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE -BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj -dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx -HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg -U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu -IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx -foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE -zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs -AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry -xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud -EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap -oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC -AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc -/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt -qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n -nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz -8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= ------END CERTIFICATE----- - -Go Daddy Class 2 CA -=================== ------BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY -VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG -A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g -RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD -ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv -2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 -qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j -YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY -vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O -BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o -atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu -MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG -A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim -PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt -I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI -Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b -vZ8= ------END CERTIFICATE----- - -Starfield Class 2 CA -==================== ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc -U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo -MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG -A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG -SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY -bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ -JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm -epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN -F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF -MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f -hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo -bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g -QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs -afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM -PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl -xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD -KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 -QBFGmh95DmK/D5fs4C8fF5Q= ------END CERTIFICATE----- - -StartCom Certification Authority -================================ ------BEGIN CERTIFICATE----- -MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN -U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu -ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 -NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk -LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg -U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw -ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y -o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ -Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d -eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt -2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z -6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ -osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ -untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc -UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT -37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE -FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0 -Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj -YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH -AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw -Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg -U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5 -LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl -cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh -cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT -dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC -AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh -3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm -vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk -fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3 -fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ -EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq -yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl -1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/ -lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro -g14= ------END CERTIFICATE----- - -Taiwan GRCA -=========== ------BEGIN CERTIFICATE----- -MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG -EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X -DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv -dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN -w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 -BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O -1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO -htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov -J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 -Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t -B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB -O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 -lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV -HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 -09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ -TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj -Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 -Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU -D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz -DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk -Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk -7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ -CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy -+fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS ------END CERTIFICATE----- - -Firmaprofesional Root CA -======================== ------BEGIN CERTIFICATE----- -MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMxIjAgBgNVBAcT -GUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZp -Y2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FA -ZmlybWFwcm9mZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTEL -MAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMT -OUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2 -ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5V -j1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJH -lShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf -3H5idPayBQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8 -NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMBAAGjgZ8wgZww -KgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lvbmFsLmNvbTASBgNVHRMBAf8ECDAG -AQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1Ud -DwEB/wQEAwIBBjAdBgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD -ggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq -u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36mhoEyIwOdyPdf -wUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm -7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YG -VM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA= ------END CERTIFICATE----- - -Wells Fargo Root CA -=================== ------BEGIN CERTIFICATE----- -MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCVVMxFDASBgNV -BAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN -MDAxMDExMTY0MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dl -bGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEv -MC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mX -x3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93OvRw6esP3 -E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5 -OEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4j -sNtlAHCEAQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGj -YTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAyMDAGCCsGAQUF -BwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRwb2xpY3kwDQYJKoZIhvcNAQEFBQAD -ggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrv -m+0fazbuSCUlFLZWohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R -OhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx -x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ33ZwmVxwQ023 -tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s= ------END CERTIFICATE----- - -Swisscom Root CA 1 -================== ------BEGIN CERTIFICATE----- -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 -NY6E0F/6MBr1mmz0DlP5OlvRHA== ------END CERTIFICATE----- - -DigiCert Assured ID Root CA -=========================== ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw -IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx -MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL -ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO -9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy -UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW -/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy -oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf -GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF -66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq -hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc -EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn -SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i -8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe -+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== ------END CERTIFICATE----- - -DigiCert Global Root CA -======================= ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw -HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw -MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 -dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq -hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn -TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 -BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H -4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y -7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB -o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm -8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF -BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr -EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt -tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 -UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- - -DigiCert High Assurance EV Root CA -================================== ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw -KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw -MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ -MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu -Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t -Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS -OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 -MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ -NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe -h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB -Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY -JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ -V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp -myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK -mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K ------END CERTIFICATE----- - -Certplus Class 2 Primary CA -=========================== ------BEGIN CERTIFICATE----- -MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE -BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN -OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy -dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR -5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ -Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO -YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e -e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME -CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ -YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t -L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD -P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R -TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ -7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW -//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 -l7+ijrRU ------END CERTIFICATE----- - -DST Root CA X3 -============== ------BEGIN CERTIFICATE----- -MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK -ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X -DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 -cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT -rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 -UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy -xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d -utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T -AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ -MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug -dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE -GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw -RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS -fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ ------END CERTIFICATE----- - -DST ACES CA X6 -============== ------BEGIN CERTIFICATE----- -MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG -EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT -MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha -MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE -CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI -DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa -pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow -GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy -MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud -EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu -Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy -dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU -CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2 -5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t -Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq -nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs -vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3 -oKfN5XozNmr6mis= ------END CERTIFICATE----- - -TURKTRUST Certificate Services Provider Root 1 -============================================== ------BEGIN CERTIFICATE----- -MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP -MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0 -acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx -MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg -U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB -TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC -aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX -yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i -Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ -8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4 -W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME -BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46 -sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE -q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy -B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY -nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H ------END CERTIFICATE----- - -TURKTRUST Certificate Services Provider Root 2 -============================================== ------BEGIN CERTIFICATE----- -MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP -MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg -QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN -MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr -dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G -A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls -acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe -LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI -x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g -QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr -5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB -AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G -A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt -Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 -Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+ -hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P -9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5 -UrbnBEI= ------END CERTIFICATE----- - -SwissSign Platinum CA - G2 -========================== ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -SwissSign Gold CA - G2 -====================== ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -SwissSign Silver CA - G2 -======================== ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -GeoTrust Primary Certification Authority -======================================== ------BEGIN CERTIFICATE----- -MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx -CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ -cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN -b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 -nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge -RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt -tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI -hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K -Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN -NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa -Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG -1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= ------END CERTIFICATE----- - -thawte Primary Root CA -====================== ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE -BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 -aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 -MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg -SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv -KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT -FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs -oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ -1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc -q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K -aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p -afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF -AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE -uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX -xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 -jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH -z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== ------END CERTIFICATE----- - -VeriSign Class 3 Public Primary Certification Authority - G5 -============================================================ ------BEGIN CERTIFICATE----- -MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE -BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO -ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk -IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB -yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln -biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh -dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz -j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD -Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ -Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r -fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ -BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv -Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy -aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG -SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ -X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE -KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC -Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE -ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq ------END CERTIFICATE----- - -SecureTrust CA -============== ------BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG -EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy -dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe -BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX -OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t -DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH -GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b -01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH -ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj -aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ -KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu -SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf -mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ -nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR -3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= ------END CERTIFICATE----- - -Secure Global CA -================ ------BEGIN CERTIFICATE----- -MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG -EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH -bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg -MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg -Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx -YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ -bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g -8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV -HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi -0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud -EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn -oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA -MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ -OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn -CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 -3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc -f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW ------END CERTIFICATE----- - -COMODO Certification Authority -============================== ------BEGIN CERTIFICATE----- -MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE -BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG -A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb -MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD -T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH -+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww -xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV -4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA -1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI -rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k -b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC -AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP -OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ -RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc -IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN -+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== ------END CERTIFICATE----- - -Network Solutions Certificate Authority -======================================= ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG -EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr -IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx -MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu -MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx -jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT -aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT -crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc -/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB -AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv -bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA -A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q -4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ -GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv -wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD -ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey ------END CERTIFICATE----- - -WellsSecure Public Root Certificate Authority -============================================= ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM -F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw -NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN -MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl -bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD -VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1 -iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13 -i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8 -bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB -K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB -AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu -cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm -lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB -i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww -GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg -Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI -K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0 -bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj -qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es -E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ -tylv2G0xffX8oRAHh84vWdw+WNs= ------END CERTIFICATE----- - -COMODO ECC Certification Authority -================================== ------BEGIN CERTIFICATE----- -MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC -R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE -ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix -GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR -Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo -b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X -4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni -wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG -FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA -U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= ------END CERTIFICATE----- - -IGC/A -===== ------BEGIN CERTIFICATE----- -MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD -VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE -Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy -MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI -EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT -STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2 -TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW -So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy -HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd -frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ -tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB -egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC -iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK -q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q -MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg -Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI -lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF -0mBWWg== ------END CERTIFICATE----- - -Security Communication EV RootCA1 -================================= ------BEGIN CERTIFICATE----- -MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc -U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh -dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE -BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl -Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO -/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX -WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z -ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4 -bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK -9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG -SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm -iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG -Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW -mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW -T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 ------END CERTIFICATE----- - -OISTE WISeKey Global Root GA CA -=============================== ------BEGIN CERTIFICATE----- -MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE -BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG -A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH -bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD -VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw -IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 -IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 -Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg -Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD -d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ -/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R -LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ -KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm -MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 -+vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa -hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY -okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= ------END CERTIFICATE----- - -S-TRUST Authentication and Encryption Root CA 2005 PN -===================================================== ------BEGIN CERTIFICATE----- -MIIEezCCA2OgAwIBAgIQNxkY5lNUfBq1uMtZWts1tzANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UE -BhMCREUxIDAeBgNVBAgTF0JhZGVuLVd1ZXJ0dGVtYmVyZyAoQlcpMRIwEAYDVQQHEwlTdHV0dGdh -cnQxKTAnBgNVBAoTIERldXRzY2hlciBTcGFya2Fzc2VuIFZlcmxhZyBHbWJIMT4wPAYDVQQDEzVT -LVRSVVNUIEF1dGhlbnRpY2F0aW9uIGFuZCBFbmNyeXB0aW9uIFJvb3QgQ0EgMjAwNTpQTjAeFw0w -NTA2MjIwMDAwMDBaFw0zMDA2MjEyMzU5NTlaMIGuMQswCQYDVQQGEwJERTEgMB4GA1UECBMXQmFk -ZW4tV3VlcnR0ZW1iZXJnIChCVykxEjAQBgNVBAcTCVN0dXR0Z2FydDEpMCcGA1UEChMgRGV1dHNj -aGVyIFNwYXJrYXNzZW4gVmVybGFnIEdtYkgxPjA8BgNVBAMTNVMtVFJVU1QgQXV0aGVudGljYXRp -b24gYW5kIEVuY3J5cHRpb24gUm9vdCBDQSAyMDA1OlBOMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEA2bVKwdMz6tNGs9HiTNL1toPQb9UY6ZOvJ44TzbUlNlA0EmQpoVXhOmCTnijJ4/Ob -4QSwI7+Vio5bG0F/WsPoTUzVJBY+h0jUJ67m91MduwwA7z5hca2/OnpYH5Q9XIHV1W/fuJvS9eXL -g3KSwlOyggLrra1fFi2SU3bxibYs9cEv4KdKb6AwajLrmnQDaHgTncovmwsdvs91DSaXm8f1Xgqf -eN+zvOyauu9VjxuapgdjKRdZYgkqeQd3peDRF2npW932kKvimAoA0SVtnteFhy+S8dF2g08LOlk3 -KC8zpxdQ1iALCvQm+Z845y2kuJuJja2tyWp9iRe79n+Ag3rm7QIDAQABo4GSMIGPMBIGA1UdEwEB -/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMCkGA1UdEQQiMCCkHjAcMRowGAYDVQQDExFTVFJv -bmxpbmUxLTIwNDgtNTAdBgNVHQ4EFgQUD8oeXHngovMpttKFswtKtWXsa1IwHwYDVR0jBBgwFoAU -D8oeXHngovMpttKFswtKtWXsa1IwDQYJKoZIhvcNAQEFBQADggEBAK8B8O0ZPCjoTVy7pWMciDMD -pwCHpB8gq9Yc4wYfl35UvbfRssnV2oDsF9eK9XvCAPbpEW+EoFolMeKJ+aQAPzFoLtU96G7m1R08 -P7K9n3frndOMusDXtk3sU5wPBG7qNWdX4wple5A64U8+wwCSersFiXOMy6ZNwPv2AtawB6MDwidA -nwzkhYItr5pCHdDHjfhA7p0GVxzZotiAFP7hYy0yh9WUUpY6RsZxlj33mA6ykaqP2vROJAA5Veit -F7nTNCtKqUDMFypVZUF0Qn71wK/Ik63yGFs9iQzbRzkk+OBM8h+wPQrKBU6JIRrjKpms/H+h8Q8b -Hz2eBIPdltkdOpQ= ------END CERTIFICATE----- - -Microsec e-Szigno Root CA -========================= ------BEGIN CERTIFICATE----- -MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE -BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL -EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0 -MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz -dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT -GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG -d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N -oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc -QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ -PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb -MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG -IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD -VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3 -LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A -dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn -AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA -4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg -AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA -egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6 -Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO -PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv -c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h -cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw -IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT -WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV -MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER -MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp -Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal -HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT -nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE -aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a -86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK -yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB -S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= ------END CERTIFICATE----- - -Certigna -======== ------BEGIN CERTIFICATE----- -MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw -EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 -MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI -Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q -XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH -GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p -ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg -DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf -Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ -tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ -BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J -SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA -hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ -ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu -PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY -1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw -WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== ------END CERTIFICATE----- - -AC Ra\xC3\xADz Certic\xC3\xA1mara S.A. -====================================== ------BEGIN CERTIFICATE----- -MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT -AkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg -LSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w -HhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+ -U29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh -IFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN -yu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU -2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3 -4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP -2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm -8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf -HjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa -Mh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK -5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b -czwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE -AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g -ADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF -BQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug -cHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf -AygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX -EpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v -/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3 -MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4 -3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk -eZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f -/RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h -RqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU -Iw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ== ------END CERTIFICATE----- - -TC TrustCenter Class 2 CA II -============================ ------BEGIN CERTIFICATE----- -MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy -IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw -MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 -c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE -AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw -IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2 -xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ -Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u -SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB -7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 -Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU -cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i -SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u -TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G -dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ -KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj -TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP -JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk -vQ== ------END CERTIFICATE----- - -TC TrustCenter Class 3 CA II -============================ ------BEGIN CERTIFICATE----- -MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy -IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw -MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 -c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE -AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W -yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo -6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ -uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk -2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB -7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 -Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU -cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i -SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u -TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE -O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8 -yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9 -IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal -092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc -5A== ------END CERTIFICATE----- - -TC TrustCenter Universal CA I -============================= ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy -IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN -MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg -VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw -JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC -qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv -xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw -ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O -gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j -BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG -1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy -vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3 -ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT -ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a -7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY ------END CERTIFICATE----- - -Deutsche Telekom Root CA 2 -========================== ------BEGIN CERTIFICATE----- -MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT -RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG -A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 -MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G -A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS -b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 -bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI -KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY -AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK -Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV -jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV -HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr -E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy -zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 -rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G -dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU -Cm26OWMohpLzGITY+9HPBVZkVw== ------END CERTIFICATE----- - -ComSign CA -========== ------BEGIN CERTIFICATE----- -MIIDkzCCAnugAwIBAgIQFBOWgxRVjOp7Y+X8NId3RDANBgkqhkiG9w0BAQUFADA0MRMwEQYDVQQD -EwpDb21TaWduIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0wNDAzMjQxMTMy -MThaFw0yOTAzMTkxNTAyMThaMDQxEzARBgNVBAMTCkNvbVNpZ24gQ0ExEDAOBgNVBAoTB0NvbVNp -Z24xCzAJBgNVBAYTAklMMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8ORUaSvTx49q -ROR+WCf4C9DklBKK8Rs4OC8fMZwG1Cyn3gsqrhqg455qv588x26i+YtkbDqthVVRVKU4VbirgwTy -P2Q298CNQ0NqZtH3FyrV7zb6MBBC11PN+fozc0yz6YQgitZBJzXkOPqUm7h65HkfM/sb2CEJKHxN -GGleZIp6GZPKfuzzcuc3B1hZKKxC+cX/zT/npfo4sdAMx9lSGlPWgcxCejVb7Us6eva1jsz/D3zk -YDaHL63woSV9/9JLEYhwVKZBqGdTUkJe5DSe5L6j7KpiXd3DTKaCQeQzC6zJMw9kglcq/QytNuEM -rkvF7zuZ2SOzW120V+x0cAwqTwIDAQABo4GgMIGdMAwGA1UdEwQFMAMBAf8wPQYDVR0fBDYwNDAy -oDCgLoYsaHR0cDovL2ZlZGlyLmNvbXNpZ24uY28uaWwvY3JsL0NvbVNpZ25DQS5jcmwwDgYDVR0P -AQH/BAQDAgGGMB8GA1UdIwQYMBaAFEsBmz5WGmU2dst7l6qSBe4y5ygxMB0GA1UdDgQWBBRLAZs+ -VhplNnbLe5eqkgXuMucoMTANBgkqhkiG9w0BAQUFAAOCAQEA0Nmlfv4pYEWdfoPPbrxHbvUanlR2 -QnG0PFg/LUAlQvaBnPGJEMgOqnhPOAlXsDzACPw1jvFIUY0McXS6hMTXcpuEfDhOZAYnKuGntewI -mbQKDdSFc8gS4TXt8QUxHXOZDOuWyt3T5oWq8Ir7dcHyCTxlZWTzTNity4hp8+SDtwy9F1qWF8pb -/627HOkthIDYIb6FUtnUdLlphbpN7Sgy6/lhSuTENh4Z3G+EER+V9YMoGKgzkkMn3V0TBEVPh9VG -zT2ouvDzuFYkRes3x+F2T3I5GN9+dHLHcy056mDmrRGiVod7w2ia/viMcKjfZTL0pECMocJEAw6U -AGegcQCCSA== ------END CERTIFICATE----- - -ComSign Secured CA -================== ------BEGIN CERTIFICATE----- -MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE -AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w -NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD -QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs -49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH -7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB -kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1 -9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw -AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t -U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA -j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC -AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a -BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp -FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP -51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz -OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== ------END CERTIFICATE----- - -Cybertrust Global Root -====================== ------BEGIN CERTIFICATE----- -MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li -ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 -MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD -ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA -+Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW -0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL -AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin -89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT -8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 -MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G -A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO -lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi -5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 -hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T -X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW -WL1WMRJOEcgh4LMRkWXbtKaIOM5V ------END CERTIFICATE----- - -ePKI Root Certification Authority -================================= ------BEGIN CERTIFICATE----- -MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG -EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg -Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx -MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq -MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs -IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi -lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv -qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX -12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O -WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ -ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao -lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ -vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi -Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi -MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH -ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 -1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq -KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV -xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP -NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r -GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE -xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx -gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy -sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD -BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= ------END CERTIFICATE----- - -T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3 -============================================================================================================================= ------BEGIN CERTIFICATE----- -MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH -DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q -aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry -b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV -BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg -S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4 -MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl -IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF -n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl -IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft -dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl -cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO -Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1 -xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR -6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL -hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd -BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF -MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4 -N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT -y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh -LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M -dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI= ------END CERTIFICATE----- - -Buypass Class 2 CA 1 -==================== ------BEGIN CERTIFICATE----- -MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2 -MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh -c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M -cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83 -0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4 -0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R -uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P -AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV -1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt -7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2 -fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w -wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho ------END CERTIFICATE----- - -Buypass Class 3 CA 1 -==================== ------BEGIN CERTIFICATE----- -MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1 -MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh -c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx -ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0 -n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia -AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c -1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P -AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7 -pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA -EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5 -htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj -el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 ------END CERTIFICATE----- - -EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 -========================================================================== ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -certSIGN ROOT CA -================ ------BEGIN CERTIFICATE----- -MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD -VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa -Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE -CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I -JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH -rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 -ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD -0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 -AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB -AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 -SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 -x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt -vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz -TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD ------END CERTIFICATE----- - -CNNIC ROOT -========== ------BEGIN CERTIFICATE----- -MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE -ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw -OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD -o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz -VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT -VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or -czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK -y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC -wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S -lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5 -Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM -O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8 -BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2 -G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m -mxE= ------END CERTIFICATE----- - -ApplicationCA - Japanese Government -=================================== ------BEGIN CERTIFICATE----- -MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT -SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw -MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl -cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4 -fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN -wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE -jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu -nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU -WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV -BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD -vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs -o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g -/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD -io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW -dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL -rosot4LKGAfmt1t06SAZf7IbiVQ= ------END CERTIFICATE----- - -GeoTrust Primary Certification Authority - G3 -============================================= ------BEGIN CERTIFICATE----- -MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE -BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 -IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz -NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo -YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT -LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j -K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE -c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C -IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu -dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr -2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 -cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE -Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD -AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s -t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt ------END CERTIFICATE----- - -thawte Primary Root CA - G2 -=========================== ------BEGIN CERTIFICATE----- -MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC -VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu -IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg -Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV -MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG -b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt -IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS -LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 -8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU -mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN -G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K -rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== ------END CERTIFICATE----- - -thawte Primary Root CA - G3 -=========================== ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE -BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 -aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w -ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh -d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD -VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG -A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At -P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC -+BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY -7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW -vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ -KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK -A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu -t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC -8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm -er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= ------END CERTIFICATE----- - -GeoTrust Primary Certification Authority - G2 -============================================= ------BEGIN CERTIFICATE----- -MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu -Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 -OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg -MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl -b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG -BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc -KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD -VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ -EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m -ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 -npaqBA+K ------END CERTIFICATE----- - -VeriSign Universal Root Certification Authority -=============================================== ------BEGIN CERTIFICATE----- -MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE -BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO -ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk -IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u -IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj -1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP -MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 -9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I -AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR -tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G -CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O -a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud -DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 -Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx -Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx -P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P -wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 -mJO37M2CYfE45k+XmCpajQ== ------END CERTIFICATE----- - -VeriSign Class 3 Public Primary Certification Authority - G4 -============================================================ ------BEGIN CERTIFICATE----- -MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC -VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 -b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz -ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU -cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo -b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 -Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz -rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw -HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u -Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD -A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx -AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== ------END CERTIFICATE----- - -NetLock Arany (Class Gold) Főtanúsítvány -============================================ ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G -A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 -dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB -cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx -MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO -ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 -c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu -0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw -/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk -H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw -fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 -neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW -qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta -YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC -bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna -NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu -dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= ------END CERTIFICATE----- - -Staat der Nederlanden Root CA - G2 -================================== ------BEGIN CERTIFICATE----- -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 -66+KAQ== ------END CERTIFICATE----- - -CA Disig -======== ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK -QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw -MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz -bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm -GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD -Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo -hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt -ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w -gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P -AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz -aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff -ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa -BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t -WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3 -mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ -CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K -ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA -4Z7CRneC9VkGjCFMhwnN5ag= ------END CERTIFICATE----- - -Juur-SK -======= ------BEGIN CERTIFICATE----- -MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA -c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw -DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG -SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy -aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf -TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC -+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw -UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa -Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF -MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD -HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh -AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA -cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr -AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw -cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE -FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G -A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo -ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL -abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678 -IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh -Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2 -yyqcjg== ------END CERTIFICATE----- - -Hongkong Post Root CA 1 -======================= ------BEGIN CERTIFICATE----- -MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT -DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx -NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n -IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 -ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr -auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh -qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY -V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV -HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i -h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio -l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei -IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps -T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT -c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== ------END CERTIFICATE----- - -SecureSign RootCA11 -=================== ------BEGIN CERTIFICATE----- -MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi -SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS -b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw -KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 -cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL -TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO -wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq -g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP -O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA -bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX -t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh -OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r -bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ -Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 -y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 -lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= ------END CERTIFICATE----- - -ACEDICOM Root -============= ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -Verisign Class 1 Public Primary Certification Authority -======================================================= ------BEGIN CERTIFICATE----- -MIICPDCCAaUCED9pHoGc8JpK83P/uUii5N0wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx -FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAxIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow -XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAx -IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDlGb9to1ZhLZlIcfZn3rmN67eehoAKkQ76OCWvRoiC5XOooJskXQ0fzGVuDLDQ -VoQYh5oGmxChc9+0WDlrbsH2FdWoqD+qEgaNMax/sDTXjzRniAnNFBHiTkVWaR94AoDa3EeRKbs2 -yWNcxeDXLYd7obcysHswuiovMaruo2fa2wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFgVKTk8d6Pa -XCUDfGD67gmZPCcQcMgMCeazh88K4hiWNWLMv5sneYlfycQJ9M61Hd8qveXbhpxoJeUwfLaJFf5n -0a3hUKw8fGJLj7qE1xIVGx/KXQ/BUpQqEZnae88MNhPVNdwQGVnqlMEAv3WP2fr9dgTbYruQagPZ -RjXZ+Hxb ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority -======================================================= ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx -FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow -XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz -IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 -f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol -hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky -CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX -bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/ -D/xwzoiQ ------END CERTIFICATE----- - -Microsec e-Szigno Root CA 2009 -============================== ------BEGIN CERTIFICATE----- -MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER -MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv -c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o -dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE -BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt -U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA -fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG -0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA -pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm -1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC -AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf -QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE -FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o -lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX -I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 -tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 -yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi -LXpUq3DDfSJlgnCW ------END CERTIFICATE----- - -E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi -=================================================== ------BEGIN CERTIFICATE----- -MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG -EwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz -ZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3 -MDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0 -cm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u -aWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY -8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y -jfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI -JjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk -9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD -AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG -SIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d -F4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq -D2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4 -Vwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq -fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX ------END CERTIFICATE----- - -GlobalSign Root CA - R3 -======================= ------BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv -YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh -bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT -aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln -bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt -iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ -0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 -rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl -OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 -xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE -FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 -lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 -EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E -bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 -YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r -kpeDMdmztcpHWD9f ------END CERTIFICATE----- - -TC TrustCenter Universal CA III -=============================== ------BEGIN CERTIFICATE----- -MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezELMAkGA1UEBhMC -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy -IFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAe -Fw0wOTA5MDkwODE1MjdaFw0yOTEyMzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNU -QyBUcnVzdENlbnRlciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0Ex -KDAmBgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF5+cvAqBNLaT6hdqbJYUt -QCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYvDIRlzg9uwliT6CwLOunBjvvya8o84pxO -juT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8vzArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+Eut -CHnNaYlAJ/Uqwa1D7KRTyGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1 -M4BDj5yjdipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBhMB8G -A1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI4jANBgkqhkiG9w0BAQUFAAOCAQEA -g8ev6n9NCjw5sWi+e22JLumzCecYV42FmhfzdkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+ -KGwWaODIl0YgoGhnYIg5IFHYaAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhK -BgePxLcHsU0GDeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV -CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPHLQNjO9Po5KIq -woIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg== ------END CERTIFICATE----- - -Autoridad de Certificacion Firmaprofesional CIF A62634068 -========================================================= ------BEGIN CERTIFICATE----- -MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA -BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 -MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw -QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB -NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD -Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P -B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY -7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH -ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI -plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX -MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX -LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK -bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU -vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud -EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH -DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp -cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA -bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx -ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx -51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk -R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP -T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f -Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl -osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR -crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR -saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD -KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi -6Et8Vcad+qMUu2WFbm5PEn4KPJ2V ------END CERTIFICATE----- - -Izenpe.com -========== ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -Chambers of Commerce Root - 2008 -================================ ------BEGIN CERTIFICATE----- -MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD -MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv -bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu -QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy -Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl -ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF -EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl -cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA -XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj -h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ -ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk -NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g -D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 -lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ -0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj -ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 -EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI -G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ -BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh -bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh -bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC -CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH -AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 -wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH -3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU -RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 -M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 -YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF -9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK -zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG -nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg -OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ ------END CERTIFICATE----- - -Global Chambersign Root - 2008 -============================== ------BEGIN CERTIFICATE----- -MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD -MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv -bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu -QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx -NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg -Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ -QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD -aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf -VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf -XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 -ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB -/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA -TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M -H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe -Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF -HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh -wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB -AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT -BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE -BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm -aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm -aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp -1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 -dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG -/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 -ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s -dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg -9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH -foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du -qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr -P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq -c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z -09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B ------END CERTIFICATE----- - -Go Daddy Root Certificate Authority - G2 -======================================== ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu -MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 -MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 -b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G -A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq -9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD -+qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd -fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl -NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 -BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac -vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r -5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV -N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO -LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 ------END CERTIFICATE----- - -Starfield Root Certificate Authority - G2 -========================================= ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s -b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 -eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw -DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg -VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB -dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv -W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs -bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk -N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf -ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU -JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol -TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx -4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw -F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K -pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ -c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 ------END CERTIFICATE----- - -Starfield Services Root Certificate Authority - G2 -================================================== ------BEGIN CERTIFICATE----- -MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s -b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl -IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV -BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT -dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg -Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 -h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa -hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP -LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB -rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG -SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP -E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy -xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd -iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza -YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 ------END CERTIFICATE----- - -AffirmTrust Commercial -====================== ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS -BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw -MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly -bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb -DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV -C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 -BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww -MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV -HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG -hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi -qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv -0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh -sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= ------END CERTIFICATE----- - -AffirmTrust Networking -====================== ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS -BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw -MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly -bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE -Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI -dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 -/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb -h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV -HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu -UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 -12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 -WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 -/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= ------END CERTIFICATE----- - -AffirmTrust Premium -=================== ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS -BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy -OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy -dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A -MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn -BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV -5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs -+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd -GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R -p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI -S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 -6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 -/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo -+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv -MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg -Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC -6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S -L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK -+4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV -BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg -IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 -g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb -zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== ------END CERTIFICATE----- - -AffirmTrust Premium ECC -======================= ------BEGIN CERTIFICATE----- -MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV -BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx -MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U -cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ -N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW -BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK -BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X -57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM -eQ== ------END CERTIFICATE----- - -Certum Trusted Network CA -========================= ------BEGIN CERTIFICATE----- -MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK -ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy -MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU -ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC -l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J -J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 -fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 -cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB -Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw -DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj -jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 -mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj -Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI -03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= ------END CERTIFICATE----- - -Certinomis - Autorité Racine -============================= ------BEGIN CERTIFICATE----- -MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK -Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg -LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG -A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw -JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa -wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly -Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw -2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N -jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q -c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC -lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb -xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g -530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna -4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ -KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x -WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva -R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40 -nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B -CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv -JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE -qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b -WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE -wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/ -vgt2Fl43N+bYdJeimUV5 ------END CERTIFICATE----- - -Root CA Generalitat Valenciana -============================== ------BEGIN CERTIFICATE----- -MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE -ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290 -IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3 -WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE -CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2 -F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B -ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ -D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte -JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB -AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n -dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB -ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl -AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA -YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy -AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA -aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt -AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA -YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu -AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA -OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0 -dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV -BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G -A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S -b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh -TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz -Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63 -NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH -iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt -+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= ------END CERTIFICATE----- - -A-Trust-nQual-03 -================ ------BEGIN CERTIFICATE----- -MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE -Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy -a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R -dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw -RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0 -ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1 -c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA -zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n -yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE -SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4 -iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V -cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV -eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40 -ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr -sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd -JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS -mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6 -ahq97BvIxYSazQ== ------END CERTIFICATE----- - -TWCA Root Certification Authority -================================= ------BEGIN CERTIFICATE----- -MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ -VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG -EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB -IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx -QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC -oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP -4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r -y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG -9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC -mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW -QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY -T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny -Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== ------END CERTIFICATE----- - -Security Communication RootCA2 -============================== ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc -U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh -dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC -SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy -aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ -+T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R -3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV -spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K -EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 -QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB -CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj -u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk -3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q -tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 -mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 ------END CERTIFICATE----- - -EC-ACC -====== ------BEGIN CERTIFICATE----- -MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE -BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w -ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD -VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE -CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT -BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 -MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt -SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl -Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh -cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK -w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT -ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 -HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a -E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw -0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD -VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 -Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l -dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ -lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa -Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe -l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 -E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D -5EI= ------END CERTIFICATE----- - -Hellenic Academic and Research Institutions RootCA 2011 -======================================================= ------BEGIN CERTIFICATE----- -MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT -O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y -aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z -IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT -AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z -IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo -IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI -1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa -71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u -8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH -3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ -MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 -MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu -b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt -XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 -TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD -/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N -7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 ------END CERTIFICATE----- - -Actalis Authentication Root CA -============================== ------BEGIN CERTIFICATE----- -MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM -BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE -AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky -MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz -IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 -IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ -wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa -by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6 -zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f -YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2 -oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l -EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7 -hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8 -EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5 -jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY -iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt -ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI -WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0 -JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx -K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+ -Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC -4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo -2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz -lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem -OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9 -vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== ------END CERTIFICATE----- - -Trustis FPS Root CA -=================== ------BEGIN CERTIFICATE----- -MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG -EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290 -IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV -BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ -RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk -H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa -cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt -o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA -AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd -BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c -GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC -yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P -8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV -l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl -iB6XzCGcKQENZetX2fNXlrtIzYE= ------END CERTIFICATE----- - -StartCom Certification Authority -================================ ------BEGIN CERTIFICATE----- -MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN -U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu -ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 -NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk -LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg -U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw -ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y -o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ -Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d -eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt -2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z -6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ -osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ -untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc -UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT -37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD -VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ -Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0 -dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu -c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv -bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0 -aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t -L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG -cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5 -fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm -N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN -Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T -tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX -e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA -2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs -HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE -JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib -D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8= ------END CERTIFICATE----- - -StartCom Certification Authority G2 -=================================== ------BEGIN CERTIFICATE----- -MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN -U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE -ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O -o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG -4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi -Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul -Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs -O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H -vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L -nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS -FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa -z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ -KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K -2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk -J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+ -JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG -/+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc -nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld -blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc -l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm -7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm -obp573PYtlNXLfbQ4ddI ------END CERTIFICATE----- - -Buypass Class 2 Root CA -======================= ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X -DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 -eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 -g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn -9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b -/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU -CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff -awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI -zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn -Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX -Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs -M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD -VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF -AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s -A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI -osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S -aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd -DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD -LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 -oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC -wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS -CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN -rJgWVqA= ------END CERTIFICATE----- - -Buypass Class 3 Root CA -======================= ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X -DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 -eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH -sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR -5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh -7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ -ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH -2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV -/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ -RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA -Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq -j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD -VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF -AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV -cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G -uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG -Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 -ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 -KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz -6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug -UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe -eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi -Cp/HuZc= ------END CERTIFICATE----- - -T-TeleSec GlobalRoot Class 3 -============================ ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM -IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU -cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx -MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz -dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD -ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK -9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU -NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF -iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W -0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr -AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb -fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT -ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h -P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml -e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== ------END CERTIFICATE----- - -EE Certification Centre Root CA -=============================== ------BEGIN CERTIFICATE----- -MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG -EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy -dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw -MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB -UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy -ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB -DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM -TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2 -rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw -93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN -P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T -AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ -MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF -BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj -xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM -lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u -uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU -3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM -dcGWxZ0= ------END CERTIFICATE----- diff --git a/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/spec/account_client_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/spec/account_client_spec.rb deleted file mode 100644 index 26a1f58..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/spec/account_client_spec.rb +++ /dev/null @@ -1,89 +0,0 @@ -# encoding: UTF-8 -require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper')) -require 'securerandom' - -describe 'Account client' do - before(:all) do - client_1 = Algolia::Client.new({ - :application_id => ENV['ALGOLIA_APPLICATION_ID_1'], - :api_key => ENV['ALGOLIA_ADMIN_KEY_1'] - }) - - @index_1 = client_1.init_index(index_name('account_client_1')) - - client_2 = Algolia::Client.new({ - :application_id => ENV['ALGOLIA_APPLICATION_ID_1'], - :api_key => ENV['ALGOLIA_ADMIN_KEY_1'] - }) - - @index_2 = client_2.init_index(index_name('account_client_2')) - - client_3 = Algolia::Client.new({ - :application_id => ENV['ALGOLIA_APPLICATION_ID_2'], - :api_key => ENV['ALGOLIA_ADMIN_KEY_2'] - }) - - @index_3 = client_3.init_index(index_name('account_client_3')) - - @index_1.delete_index rescue 'not fatal' - @index_2.delete_index rescue 'not fatal' - @index_3.delete_index rescue 'not fatal' - end - - after(:all) do - @index_1.delete_index rescue 'not fatal' - @index_2.delete_index rescue 'not fatal' - @index_3.delete_index rescue 'not fatal' - end - - it 'should not allow operations in the same application' do - expect { - Algolia::AccountClient.copy_index!(@index_1, @index_2) - }.to raise_exception( - Algolia::AlgoliaError, - 'The indexes are in the same application. Use Algolia::Client.copy_index instead.' - ) - end - - it 'should perform a cross app copy index and assert that destination must not exist' do - - @index_1.save_objects!(1.upto(1500).map { |i| { :objectID => i, :i => i } }) - - @index_1.batch_rules! ([ - { - :objectID => 'one', - :condition => {:pattern => 'test', :anchoring => 'contains'}, - :consequence => {:params => {:query => 'this is better'}} - } - ]) - - @index_1.batch_synonyms! ([ - {:objectID => 'one', :type => 'synonym', :synonyms => ['San Francisco', 'SF']} - ]) - - @index_1.set_settings! ({:searchableAttributes => ['objectID']}) - - Algolia::AccountClient.copy_index!(@index_1, @index_3) - - res = @index_3.search('') - res['nbHits'].should eq(1500) - - res = @index_3.search_rules('')['hits'] - res.size.should eq(1) - res[0]['objectID'].should eq('one') - - res = @index_3.search_synonyms('')['hits'] - res.size.should eq(1) - res[0]['objectID'].should eq('one') - - @index_3.get_settings['searchableAttributes'].should eq(['objectID']) - - expect { - Algolia::AccountClient.copy_index!(@index_1, @index_3) - }.to raise_exception( - Algolia::AlgoliaError, - 'Destination index already exists. Please delete it before copying index across applications.' - ) - end -end - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/spec/client_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/spec/client_spec.rb deleted file mode 100644 index fb664ff..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/spec/client_spec.rb +++ /dev/null @@ -1,1426 +0,0 @@ -# encoding: UTF-8 -require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper')) -require 'base64' - -def is_include(array, attr, value) - array.each do |elt| - if elt[attr] == value - return true - end - end - return false -end - -describe 'API keys', :maintainers_only => true do - before(:all) do - @index = Algolia::Index.new(safe_index_name("àlgol?a")) - @index.delete_index rescue "not fatal" - end - - after(:all) do - @index.delete_index rescue "not fatal" - end - - def wait_key(index, key, &block) - 1.upto(60) do # do not wait too long - begin - k = index.get_api_key(key) - if block_given? - return if yield k - # not found - sleep 1 - next - end - return - rescue - # not found - sleep 1 - end - end - end - - def wait_key_missing(index, key) - 1.upto(60) do # do not wait too long - begin - k = index.get_api_key(key) - sleep 1 - rescue - # not found - return - end - end - end - - def wait_global_key(key, &block) - 1.upto(60) do # do not wait too long - begin - k = Algolia.get_api_key(key) - if block_given? - return if yield k - # not found - sleep 1 - next - end - return - rescue - # not found - sleep 1 - end - end - end - - def wait_global_key_missing(key) - 1.upto(60) do # do not wait too long - begin - k = Algolia.get_api_key(key) - sleep 1 - rescue - # not found - return - end - end - end - - it "should test index keys" do - @index.set_settings!({}) # ensure the index exists - - resIndex = @index.list_api_keys - newIndexKey = @index.add_api_key(['search']) - newIndexKey['key'].should_not eq("") - wait_key(@index, newIndexKey['key']) - resIndexAfter = @index.list_api_keys - is_include(resIndex['keys'], 'value', newIndexKey['key']).should eq(false) - is_include(resIndexAfter['keys'], 'value', newIndexKey['key']).should eq(true) - indexKey = @index.get_api_key(newIndexKey['key']) - indexKey['acl'][0].should eq('search') - @index.update_api_key(newIndexKey['key'], ['addObject']) - wait_key(@index, newIndexKey['key']) do |key| - key['acl'] == ['addObject'] - end - indexKey = @index.get_api_key(newIndexKey['key']) - indexKey['acl'][0].should eq('addObject') - @index.delete_api_key(newIndexKey['key']) - wait_key_missing(@index, newIndexKey['key']) - resIndexEnd = @index.list_api_keys - is_include(resIndexEnd['keys'], 'value', newIndexKey['key']).should eq(false) - end - - it "should test global keys" do - res = Algolia.list_api_keys - newKey = Algolia.add_api_key(['search']) - newKey['key'].should_not eq("") - wait_global_key(newKey['key']) - resAfter = Algolia.list_api_keys - is_include(res['keys'], 'value', newKey['key']).should eq(false) - is_include(resAfter['keys'], 'value', newKey['key']).should eq(true) - key = Algolia.get_api_key(newKey['key']) - key['acl'][0].should eq('search') - Algolia.update_api_key(newKey['key'], ['addObject']) - wait_global_key(newKey['key']) do |key| - key['acl'] == ['addObject'] - end - key = Algolia.get_api_key(newKey['key']) - key['acl'][0].should eq('addObject') - Algolia.delete_api_key(newKey['key']) - wait_global_key_missing(newKey['key']) - resEnd = Algolia.list_api_keys - is_include(resEnd['keys'], 'value', newKey['key']).should eq(false) - - # Restore the deleted key - Algolia.restore_api_key(newKey['key']) - wait_global_key(newKey['key']) - key_end = Algolia.list_api_keys - is_include(key_end['keys'], 'value', newKey['key']).should eq(true) - - # Re-delete the key - Algolia.delete_api_key(newKey['key']) - end - - it "Check add keys" do - newIndexKey = @index.add_api_key(['search']) - newIndexKey.should have_key('key') - newIndexKey['key'].should be_a(String) - newIndexKey.should have_key('createdAt') - newIndexKey['createdAt'].should be_a(String) - sleep 5 # no task ID here - resIndex = @index.list_api_keys - resIndex.should have_key('keys') - resIndex['keys'].should be_a(Array) - resIndex['keys'][0].should have_key('value') - resIndex['keys'][0]['value'].should be_a(String) - resIndex['keys'][0].should have_key('acl') - resIndex['keys'][0]['acl'].should be_a(Array) - resIndex['keys'][0].should have_key('validity') - resIndex['keys'][0]['validity'].should be_a(Integer) - indexKey = @index.get_api_key(newIndexKey['key']) - indexKey.should have_key('value') - indexKey['value'].should be_a(String) - indexKey.should have_key('acl') - indexKey['acl'].should be_a(Array) - indexKey.should have_key('validity') - indexKey['validity'].should be_a(Integer) - task = @index.delete_api_key(newIndexKey['key']) - task.should have_key('deletedAt') - task['deletedAt'].should be_a(String) - end -end - -describe 'Client' do - before(:all) do - @index = Algolia::Index.new(safe_index_name("àlgol?a")) - @index.delete_index rescue "not fatal" - end - - after(:all) do - @index.delete_index rescue "not fatal" - end - - it "should tell if index exists" do - @index.add_object!({ :name => "John Doe", :email => "john@doe.org" }, "1") - expect(@index.exists?).to be true - end - - it "should tell if index does not exist" do - index = Algolia::Index.new('nonexistent_index') - expect(index.exists?).to be false - end - - it "should add a simple object" do - @index.add_object!({ :name => "John Doe", :email => "john@doe.org" }, "1") - res = @index.search("john") - res["hits"].length.should eq(1) - end - - it "should partial update a simple object" do - @index.add_object!({ :name => "John Doe", :email => "john@doe.org" }, "1") - res = @index.search("john") - res["hits"].length.should eq(1) - @index.partial_update_object!({ :name => "Robert Doe"}, "1") - res = @index.search("robert") - res["hits"].length.should eq(1) - end - - it "should partial update a simple object, or add it if it doesn't exist" do - res = @index.search("tonny@parker.org") - res["hits"].length.should eq(0) - @index.partial_update_object!({ :email => "tonny@parker.org" }, "1") - res = @index.search("tonny@parker.org") - res["hits"].length.should eq(1) - end - - it "should partial update a simple object, but don't add it if it doesn't exist" do - @index.partial_update_object!({ :email => "alex@boom.org" }, "51", false) - res = @index.search("alex@boom.org") - res["hits"].length.should eq(0) - end - - it "should partial update a batch of objects, and add them if they don't exist" do - batch = [ - { :objectID => "1", :email => "john@wanna.org" }, - { :objectID => "2", :email => "robert@wanna.org" } - ] - @index.partial_update_objects!(batch) - res = @index.search("@wanna.org") - res["hits"].length.should eq(2) - end - - it "should partial update a batch of objects, but don't add them if they don't exist" do - create_if_not_exits = false - batch = [ - { :objectID => "11", :email => "john@be.org" }, - { :objectID => "22", :email => "robert@be.org" } - ] - @index.partial_update_objects!(batch, create_if_not_exits) - res = @index.search("@be.org") - res["hits"].length.should eq(0) - end - - it "should add a set of objects" do - @index.add_objects!([ - { :name => "Another", :email => "another1@example.org" }, - { :name => "Another", :email => "another2@example.org" } - ]) - res = @index.search("another") - res["hits"].length.should eq(2) - end - - it "should partial update a simple object" do - @index.add_object!({ :name => "John Doe", :email => "john@doe.org" }, "1") - @index.add_object!({ :name => "John Doe", :email => "john@doe.org" }, "2") - res = @index.search("john") - res["hits"].length.should eq(2) - @index.partial_update_objects!([{ :name => "Robert Doe", :objectID => "1"}, { :name => "Robert Doe", :objectID => "2"}]) - res = @index.search("robert") - res["hits"].length.should eq(2) - end - - it "should save a set of objects with their ids" do - @index.save_object!({ :name => "objectid", :email => "objectid1@example.org", :objectID => 101 }) - res = @index.search("objectid") - res["hits"].length.should eq(1) - end - - it "should save a set of objects with their ids" do - @index.save_objects!([ - { :name => "objectid", :email => "objectid1@example.org", :objectID => 101 }, - { :name => "objectid", :email => "objectid2@example.org", :objectID => 102 } - ]) - res = @index.search("objectid") - res["hits"].length.should eq(2) - end - - it "should replace all objects" do - @index.save_objects!([{:objectID => '1'}, {:objectID => '2'}]) - @index.replace_all_objects!([{'color' => 'black'}, {:objectID => '4', 'color' => 'green'}]) - - res = @index.search('') - res["hits"].length.should eq(2) - res = @index.search('black') - res["hits"][0]['color'].should eq('black') - @index.get_object('4')['color'].should eq('green') - end - - it "should throw an exception if invalid argument" do - expect { @index.add_object!([ {:name => "test"} ]) }.to raise_error(ArgumentError) - expect { @index.add_objects!([ [ {:name => "test"} ] ]) }.to raise_error(ArgumentError) - expect { @index.save_object(1) }.to raise_error(ArgumentError) - expect { @index.save_object("test") }.to raise_error(ArgumentError) - expect { @index.save_object({ :objectID => 42 }.to_json) }.to raise_error(ArgumentError) - expect { @index.save_objects([{}, ""]) }.to raise_error(ArgumentError) - expect { @index.save_objects([1]) }.to raise_error(ArgumentError) - expect { @index.save_objects!([1]) }.to raise_error(ArgumentError) - expect { @index.save_object({ :foo => 42 }) }.to raise_error(ArgumentError) # missing objectID - end - - it "should be thread safe" do - @index.clear! - @index.add_object!({ :name => "John Doe", :email => "john@doe.org" }) - @index.add_object!({ :name => "John Doe", :email => "john@doe.org" }) - - threads = [] - 64.times do - t = Thread.new do - 10.times do - res = @index.search("john") - res["hits"].length.should eq(2) - end - end - threads << t - end - threads.each { |t| t.join } - end - - if !defined?(RUBY_ENGINE) || RUBY_ENGINE != 'jruby' - it "should be fork safe" do - 8.times do - Process.fork do - 10.times do - res = @index.search("john") - res["hits"].length.should eq(2) - end - end - end - Process.waitall - end - end - - it "should clear the index" do - @index.clear! - @index.search("")["hits"].length.should eq(0) - end - - it "should have another index after" do - index = Algolia::Index.new(safe_index_name("àlgol?a")) - begin - index.delete_index! - rescue - # friends_2 does not exist - end - res = Algolia.list_indexes - is_include(res['items'], 'name', safe_index_name('àlgol?a')).should eq(false) - index.add_object!({ :name => "Robert" }) - resAfter = Algolia.list_indexes - is_include(resAfter['items'], 'name', safe_index_name('àlgol?a')).should eq(true) - end - - it "should get a object" do - @index.clear_index - @index.add_object!({:firstname => "Robert"}) - @index.add_object!({:firstname => "Robert2"}) - res = @index.search('') - res["nbHits"].should eq(2) - object = @index.get_object(res['hits'][0]['objectID']) - object['firstname'].should eq(res['hits'][0]['firstname']) - - object = @index.get_object(res['hits'][0]['objectID'], 'firstname') - object['firstname'].should eq(res['hits'][0]['firstname']) - - objects = @index.get_objects([ res['hits'][0]['objectID'], res['hits'][1]['objectID'] ]) - objects.size.should eq(2) - end - - it "should restrict attributesToRetrieve" do - @index.clear_index - @index.add_object({:firstname => "Robert", :lastname => "foo", :objectID => 1}) - @index.add_object!({:firstname => "Robert2", :lastname => "bar", :objectID => 2}) - objects = @index.get_objects([1, 2], ['firstname']) - objects.size.should eq(2) - objects[0].should eq({"firstname"=>"Robert", "objectID"=>"1"}) - objects[1].should eq({"firstname"=>"Robert2", "objectID"=>"2"}) - - objects = @index.get_objects([1, 2], [:firstname]) - objects.size.should eq(2) - objects[0].should eq({"firstname"=>"Robert", "objectID"=>"1"}) - objects[1].should eq({"firstname"=>"Robert2", "objectID"=>"2"}) - - objects = @index.get_objects(["1", "2"], 'firstname,lastname') - objects.size.should eq(2) - objects[0].should eq({"firstname"=>"Robert", "lastname"=>"foo", "objectID"=>"1"}) - objects[1].should eq({"firstname"=>"Robert2", "lastname"=>"bar", "objectID"=>"2"}) - end - - it "should delete the object" do - @index.clear - @index.add_object!({:firstname => "Robert"}) - res = @index.search('') - @index.search('')['nbHits'].should eq(1) - @index.delete_object!(res['hits'][0]['objectID']) - @index.search('')['nbHits'].should eq(0) - end - - it "should not delete the index because the objectID is blank" do - @index.clear - @index.add_object!({:firstname => "Robert"}) - res = @index.search('') - @index.search('')['nbHits'].should eq(1) - expect { @index.delete_object('') }.to raise_error(ArgumentError) - expect { @index.delete_object!(nil) }.to raise_error(ArgumentError) - @index.search('')['nbHits'].should eq(1) - end - - it "should delete several objects" do - @index.clear - @index.add_object!({:firstname => "Robert1"}) - @index.add_object!({:firstname => "Robert2"}) - res = @index.search('') - @index.search('')['nbHits'].should eq(2) - @index.delete_objects!(res['hits'].map { |h| h['objectID'] }) - @index.search('')['nbHits'].should eq(0) - end - - it "should delete several objects by query" do - @index.clear - @index.add_object({:firstname => "Robert1"}) - @index.add_object!({:firstname => "Robert2"}) - @index.search('')['nbHits'].should eq(2) - @index.delete_by_query!('rob') - @index.search('')['nbHits'].should eq(0) - end - - it "should not wipe the entire index with delete_by_query" do - expect { @index.delete_by_query(nil) }.to raise_error(ArgumentError) - end - - context 'delete_by' do - it 'should not wipe the entire index' do - expect { @index.delete_by(nil) }.to raise_error(ArgumentError) - end - - it 'should fail with query passed' do - @index.clear - @index.add_object({:firstname => 'Robert1'}) - @index.add_object!({:firstname => 'Robert2'}) - @index.search('')['nbHits'].should eq(2) - expect { @index.delete_by({ 'query' => 'abc' }) }.to raise_error(Algolia::AlgoliaProtocolError) - @index.search('')['nbHits'].should eq(2) - end - - it 'should work with filters' do - @index.clear - @index.set_settings!({:attributesForFaceting => ['firstname']}) - @index.add_object({:firstname => 'Robert1'}) - @index.add_object!({:firstname => 'Robert2'}) - @index.search('')['nbHits'].should eq(2) - @index.delete_by!({ 'filters' => 'firstname:Robert1' }) - @index.search('')['nbHits'].should eq(1) - end - end - - it 'should find objects when needed' do - index = Algolia::Index.new(safe_index_name("àlgol?à")) - - index.save_objects!([ - {:company => 'Algolia', :name => 'Julien Lemoine', :objectID => 'julien-lemoine'}, - {:company => 'Algolia', :name => 'Nicolas Dessaigne', :objectID => 'nicolas-dessaigne'}, - {:company => 'Amazon', :name =>' "Jeff Bezos', :objectID => '162590850'}, - {:company => 'Apple', :name => 'Steve Jobs', :objectID => '162590860'}, - {:company => 'Apple', :name => 'Steve Wozniak', :objectID => '162590870'}, - {:company => 'Arista Networks', :name => 'Jayshree Ullal', :objectID => '162590880'}, - {:company => 'Google', :name => 'Larry Page', :objectID => '162590890'}, - {:company => 'Google', :name => 'Rob Pike', :objectID => '162590900'}, - {:company => 'Google', :name => 'Sergueï Brin', :objectID => '162590910'}, - {:company => 'Microsoft', :name => 'Bill Gates', :objectID => '162590920'}, - {:company => 'SpaceX', :name => 'Elon Musk', :objectID => '162590930'}, - {:company => 'Tesla', :name => 'Elon Musk', :objectID => '162590940'}, - {:company => 'Yahoo', :name => 'Marissa Mayer', :objectID => '162590950'}, - ]) - - res = index.search('algolia') - Algolia::Index.get_object_position(res, 'nicolas-dessaigne').should eq(0) - Algolia::Index.get_object_position(res, 'julien-lemoine').should eq(1) - Algolia::Index.get_object_position(res, '').should eq(-1) - - expect { - index.find_object({'query' => '', 'paginate' => true}) - }.to raise_exception( - Algolia::AlgoliaObjectNotFoundError, - 'Object not found' - ) - - expect { - index.find_object({'query' => '', 'paginate' => true}) { false } - }.to raise_exception( - Algolia::AlgoliaObjectNotFoundError, - 'Object not found' - ) - - obj = index.find_object({'query' => '', 'paginate' => true}) { true } - obj['position'].should eq(0) - obj['page'].should eq(0) - - # we use a lambda and convert it to a block with `&` - # so as not to repeat the condition - condition = lambda do |obj| - obj.key?('company') and obj['company'] == 'Apple' - end - - expect { - index.find_object({'query' => 'algolia', 'paginate' => true}, &condition) - }.to raise_exception( - Algolia::AlgoliaObjectNotFoundError, - 'Object not found' - ) - - expect { - index.find_object({'query' => '', 'paginate' => false, 'hitsPerPage' => 5}, &condition) - }.to raise_exception( - Algolia::AlgoliaObjectNotFoundError, - 'Object not found' - ) - - obj = index.find_object({'query' => '', 'paginate' => true, 'hitsPerPage' => 5}, &condition) - obj['position'].should eq(0) - obj['page'].should eq(2) - end - - it "should copy the index" do - index = Algolia::Index.new(safe_index_name("àlgol?à")) - begin - @index.clear_index - Algolia.delete_index index.name - rescue - # friends_2 does not exist - end - - @index.add_object!({:firstname => "Robert"}) - @index.search('')['nbHits'].should eq(1) - - Algolia.copy_index!(safe_index_name("àlgol?a"), safe_index_name("àlgol?à")) - @index.delete_index! - - index.search('')['nbHits'].should eq(1) - index.delete_index! - end - - it "should copy only settings" do - index = Algolia::Index.new(safe_index_name("àlgol?à")) - begin - @index.clear_index - Algolia.delete_index index.name - rescue - end - - res = @index.set_settings!({ - 'searchableAttributes' => ['one'], - }) - - @index.wait_task(res['taskID']) - Algolia.copy_settings!(@index.name, index.name) - @index.delete_index! - - index.get_settings['searchableAttributes'].should eq(['one']) - index.delete_index! - end - - it "should copy only synonyms" do - index = Algolia::Index.new(safe_index_name("àlgol?à")) - begin - @index.clear_index - Algolia.delete_index index.name - rescue - end - - @index.save_synonym!('foo', { - :objectID => 'foo', :synonyms => ['car', 'vehicle', 'auto'], :type => 'synonym', - }) - - Algolia.copy_synonyms!(@index.name, index.name) - @index.delete_index! - - index.get_synonym('foo')['objectID'].should eq('foo') - index.delete_index! - end - - it "should copy only rules" do - index = Algolia::Index.new(safe_index_name("àlgol?à")) - begin - @index.clear_index - Algolia.delete_index index.name - rescue - end - - @index.save_rule!('bar', { - :objectID => 'bar', - :condition => {:pattern => 'test', :anchoring => 'contains'}, - :consequence => {:params => {:query => 'this is better'}} - }) - - Algolia.copy_rules!(@index.name, index.name) - @index.delete_index! - - index.get_rule('bar')['objectID'].should eq('bar') - index.delete_index! - end - - it "should copy parts of the index only" do - index = Algolia::Index.new(safe_index_name("àlgol?à")) - begin - @index.clear_index - Algolia.delete_index! index.name - rescue - # friends_2 does not exist - end - - @index.add_object!({:firstname => "Robert"}) - @index.batch_synonyms! [ - { :objectID => 'city', :type => 'synonym', :synonyms => ['San Francisco', 'SF'] }, - { :objectID => 'street', :type => 'altCorrection1', :word => 'street', :corrections => ['st'] } - ] - @index.search('')['nbHits'].should eq(1) - @index.search_synonyms('')['nbHits'].should eq(2) - - res = Algolia.copy_index!(safe_index_name("àlgol?a"), safe_index_name("àlgol?à"), ["synonyms"]) - - @index.delete_index! - - index.search_synonyms('')['nbHits'].should eq(2) - index.delete_index! - end - - it "should move the index" do - @index.clear_index rescue "friends does not exist" - index = Algolia::Index.new(safe_index_name("àlgol?à")) - begin - Algolia.delete_index! index.name - rescue - # friends_2 does not exist - end - - @index.add_object!({:firstname => "Robert"}) - @index.search('')['nbHits'].should eq(1) - - Algolia.move_index!(safe_index_name("àlgol?a"), safe_index_name("àlgol?à")) - - index.search('')['nbHits'].should eq(1) - index.delete_index - end - - it "should retrieve the object" do - @index.clear_index rescue "friends does not exist" - @index.add_object!({:firstname => "Robert"}) - - res = @index.browse - - res['hits'].size.should eq(1) - res['hits'][0]['firstname'].should eq("Robert") - end - - it "should get logs" do - - expect { - Algolia::Index.new(safe_index_name('thisdefinitelyshouldntexist')).get_settings - }.to raise_error(Algolia::AlgoliaProtocolError) - res = Algolia.get_logs(0, 20, true) - - res['logs'].size.should > 0 - (res['logs'][0]['answer_code'].to_i / 100).should eq(4) - end - - it "should search on multipleIndex" do - @index.clear_index! rescue "Not fatal" - @index.add_object!({ :name => "John Doe", :email => "john@doe.org" }, "1") - res = Algolia.multiple_queries([{:index_name => safe_index_name("àlgol?a"), "query" => ""}]) - res["results"][0]["hits"].length.should eq(1) - - res = Algolia.multiple_queries([{"indexName" => safe_index_name("àlgol?a"), "query" => ""}], "indexName") - res["results"][0]["hits"].length.should eq(1) - end - - it "should get multiple objectIDs" do - index_name_1 = safe_index_name("àlgol?a-multi") - index_1 = Algolia::Index.new(index_name_1) - index_1.save_object!({:objectID => "obj1-multi-get", :name => 'test'}) - - index_name_2 = safe_index_name("àlgol?a-multi") - index_2 = Algolia::Index.new(index_name_2) - index_2.save_object!({:objectID => "obj2-multi-get", :name => 'another index'}) - - requests = [ - { "indexName" => index_name_1, "objectID" => "obj1-multi-get" }, - { "indexName" => index_name_2, "objectID" => "obj2-multi-get" } - ] - - response = Algolia.multiple_get_objects(requests) - - response['results'].count.should eq(2) - - index_1.delete_index rescue "not fatal" - index_2.delete_index rescue "not fatal" - end - - it "should throw if the index_name is missing in multiple_queries" do - expect { Algolia.multiple_queries([{"query" => ""}]) }.to raise_error(ArgumentError) - end - - it "should accept custom batch" do - @index.clear_index! rescue "Not fatal" - request = { "requests" => [ - { - "action" => "addObject", - "body" => {"firstname" => "Jimmie", - "lastname" => "Barninger"} - }, - { - "action" => "addObject", - "body" => {"firstname" => "Warren", - "lastname" => "Speach"} - }, - { - "action" => "updateObject", - "body" => {"firstname" => "Jimmie", - "lastname" => "Barninger", - "objectID" => "43"} - }, - { - "action" => "updateObject", - "body" => {"firstname" => "Warren", - "lastname" => "Speach"}, - "objectID" => "42" - } - ]} - res = @index.batch!(request) - @index.search('')['nbHits'].should eq(4) - end - - it "should allow an array of tags" do - @index.add_object!({ :name => "P1", :_tags => "t1" }) - @index.add_object!({ :name => "P2", :_tags => "t1" }) - @index.add_object!({ :name => "P3", :_tags => "t2" }) - @index.add_object!({ :name => "P4", :_tags => "t3" }) - @index.add_object!({ :name => "P5", :_tags => ["t3", "t4"] }) - - @index.search("", { :tagFilters => ["t1"] })['hits'].length.should eq(2) # t1 - @index.search("", { :tagFilters => ["t1", "t2"] })['hits'].length.should eq(0) # t1 AND t2 - @index.search("", { :tagFilters => ["t3", "t4"] })['hits'].length.should eq(1) # t3 AND t4 - @index.search("", { :tagFilters => [["t1", "t2"]] })['hits'].length.should eq(3) # t1 OR t2 - end - - it "should be facetable" do - @index.clear! - @index.set_settings( { :attributesForFacetting => ["f", "g"] }) - @index.add_object!({ :name => "P1", :f => "f1", :g => "g1" }) - @index.add_object!({ :name => "P2", :f => "f1", :g => "g2" }) - @index.add_object!({ :name => "P3", :f => "f2", :g => "g2" }) - @index.add_object!({ :name => "P4", :f => "f3", :g => "g2" }) - - res = @index.search("", { :facets => "f" }) - res['facets']['f']['f1'].should eq(2) - res['facets']['f']['f2'].should eq(1) - res['facets']['f']['f3'].should eq(1) - - res = @index.search("", { :facets => "f", :facetFilters => ["f:f1"] }) - res['facets']['f']['f1'].should eq(2) - res['facets']['f']['f2'].should be_nil - res['facets']['f']['f3'].should be_nil - - res = @index.search("", { :facets => "f", :facetFilters => ["f:f1", "g:g2"] }) - res['facets']['f']['f1'].should eq(1) - res['facets']['f']['f2'].should be_nil - res['facets']['f']['f3'].should be_nil - - res = @index.search("", { :facets => "f,g", :facetFilters => [["f:f1", "g:g2"]] }) - res['nbHits'].should eq(4) - res['facets']['f']['f1'].should eq(2) - res['facets']['f']['f2'].should eq(1) - res['facets']['f']['f3'].should eq(1) - - res = @index.search("", { :facets => "f,g", :facetFilters => [["f:f1", "g:g2"], "g:g1"] }) - res['nbHits'].should eq(1) - res['facets']['f']['f1'].should eq(1) - res['facets']['f']['f2'].should be_nil - res['facets']['f']['f3'].should be_nil - res['facets']['g']['g1'].should eq(1) - res['facets']['g']['g2'].should be_nil - end - - it "should handle slash in objectId" do - @index.clear_index!() - @index.add_object!({:firstname => "Robert", :objectID => "A/go/?a"}) - res = @index.search('') - @index.search("")["nbHits"].should eq(1) - object = @index.get_object(res['hits'][0]['objectID']) - object['firstname'].should eq('Robert') - object = @index.get_object(res['hits'][0]['objectID'], 'firstname') - object['firstname'].should eq('Robert') - - @index.save_object!({:firstname => "George", :objectID => "A/go/?a"}) - res = @index.search('') - @index.search("")["nbHits"].should eq(1) - object = @index.get_object(res['hits'][0]['objectID']) - object['firstname'].should eq('George') - - @index.partial_update_object!({:firstname => "Sylvain", :objectID => "A/go/?a"}) - res = @index.search('') - @index.search("")["nbHits"].should eq(1) - object = @index.get_object(res['hits'][0]['objectID']) - object['firstname'].should eq('Sylvain') - - end - - it "Check attributes list_indexes:" do - res = Algolia::Index.all - res.should have_key('items') - res['items'][0].should have_key('name') - res['items'][0]['name'].should be_a(String) - res['items'][0].should have_key('createdAt') - res['items'][0]['createdAt'].should be_a(String) - res['items'][0].should have_key('updatedAt') - res['items'][0]['updatedAt'].should be_a(String) - res['items'][0].should have_key('entries') - res['items'][0]['entries'].should be_a(Integer) - res['items'][0].should have_key('pendingTask') - [true, false].should include(res['items'][0]['pendingTask']) - end - - it 'Check attributes search : ' do - res = @index.search('') - res.should have_key('hits') - res['hits'].should be_a(Array) - res.should have_key('page') - res['page'].should be_a(Integer) - res.should have_key('nbHits') - res['nbHits'].should be_a(Integer) - res.should have_key('nbPages') - res['nbPages'].should be_a(Integer) - res.should have_key('hitsPerPage') - res['hitsPerPage'].should be_a(Integer) - res.should have_key('processingTimeMS') - res['processingTimeMS'].should be_a(Integer) - res.should have_key('query') - res['query'].should be_a(String) - res.should have_key('params') - res['params'].should be_a(String) - end - - it 'Check attributes delete_index : ' do - index = Algolia::Index.new(safe_index_name("àlgol?à2")) - index.add_object!({ :name => "John Doe", :email => "john@doe.org" }, "1") - task = index.delete_index() - task.should have_key('deletedAt') - task['deletedAt'].should be_a(String) - task.should have_key('taskID') - task['taskID'].should be_a(Integer) - end - - it 'Check attributes clear_index : ' do - task = @index.clear_index - task.should have_key('updatedAt') - task['updatedAt'].should be_a(String) - task.should have_key('taskID') - task['taskID'].should be_a(Integer) - end - - it 'Check attributes add object : ' do - task = @index.add_object({ :name => "John Doe", :email => "john@doe.org" }) - task.should have_key('createdAt') - task['createdAt'].should be_a(String) - task.should have_key('taskID') - task['taskID'].should be_a(Integer) - task.should have_key('objectID') - task['objectID'].should be_a(String) - end - - it 'Check attributes add object id: ' do - task = @index.add_object({ :name => "John Doe", :email => "john@doe.org" }, "1") - task.should have_key('updatedAt') - task['updatedAt'].should be_a(String) - task.should have_key('taskID') - task['taskID'].should be_a(Integer) - #task.to_s.should eq("") - task.should have_key('objectID') - task['objectID'].should be_a(String) - task['objectID'].should eq("1") - end - - it 'Check attributes partial update: ' do - task = @index.partial_update_object({ :name => "John Doe", :email => "john@doe.org" }, "1") - task.should have_key('updatedAt') - task['updatedAt'].should be_a(String) - task.should have_key('taskID') - task['taskID'].should be_a(Integer) - task.should have_key('objectID') - task['objectID'].should be_a(String) - task['objectID'].should eq("1") - end - - it 'Check attributes delete object: ' do - @index.add_object({ :name => "John Doe", :email => "john@doe.org" }, "1") - task = @index.delete_object("1") - task.should have_key('deletedAt') - task['deletedAt'].should be_a(String) - task.should have_key('taskID') - task['taskID'].should be_a(Integer) - end - - it 'Check attributes add objects: ' do - task = @index.add_objects([{ :name => "John Doe", :email => "john@doe.org", :objectID => "1" }]) - task.should have_key('taskID') - task['taskID'].should be_a(Integer) - task.should have_key('objectIDs') - task['objectIDs'].should be_a(Array) - end - - it 'Check attributes browse: ' do - res = @index.browse() - res.should have_key('hits') - res['hits'].should be_a(Array) - res.should have_key('page') - res['page'].should be_a(Integer) - res.should have_key('nbHits') - res['nbHits'].should be_a(Integer) - res.should have_key('nbPages') - res['nbPages'].should be_a(Integer) - res.should have_key('hitsPerPage') - res['hitsPerPage'].should be_a(Integer) - res.should have_key('processingTimeMS') - res['processingTimeMS'].should be_a(Integer) - res.should have_key('query') - res['query'].should be_a(String) - res.should have_key('params') - res['params'].should be_a(String) - end - - it 'Check attributes get settings: ' do - task = @index.set_settings({}) - task.should have_key('taskID') - task['taskID'].should be_a(Integer) - task.should have_key('updatedAt') - task['updatedAt'].should be_a(String) - end - - it 'Check attributes move_index : ' do - index = Algolia::Index.new(safe_index_name("àlgol?à")) - index2 = Algolia::Index.new(safe_index_name("àlgol?à2")) - index2.add_object!({ :name => "John Doe", :email => "john@doe.org" }, "1") - task = Algolia.move_index!(safe_index_name("àlgol?à2"), safe_index_name("àlgol?à")) - task.should have_key('updatedAt') - task['updatedAt'].should be_a(String) - task.should have_key('taskID') - task['taskID'].should be_a(Integer) - index.delete_index - end - - it 'Check attributes copy_index : ' do - index = Algolia::Index.new(safe_index_name("àlgol?à")) - index2 = Algolia::Index.new(safe_index_name("àlgol?à2")) - index2.add_object!({ :name => "John Doe", :email => "john@doe.org" }, "1") - task = Algolia.copy_index!(safe_index_name("àlgol?à2"), safe_index_name("àlgol?à")) - task.should have_key('updatedAt') - task['updatedAt'].should be_a(String) - task.should have_key('taskID') - task['taskID'].should be_a(Integer) - index.delete_index - index2.delete_index - end - - it 'Check attributes wait_task : ' do - task = @index.add_object!({ :name => "John Doe", :email => "john@doe.org" }, "1") - task = Algolia.client.get(Algolia::Protocol.task_uri(safe_index_name("àlgol?a"), task['objectID'])) - task.should have_key('status') - task['status'].should be_a(String) - task.should have_key('pendingTask') - [true, false].should include(task['pendingTask']) - end - - it 'Check attributes get_task_status' do - task = @index.add_object!({ :name => "John Doe", :email => "john@doe.org" }, "1") - status = @index.get_task_status(task["taskID"]) - status.should be_a(String) - end - - it 'Check attributes log : ' do - logs = Algolia.get_logs() - logs.should have_key('logs') - logs['logs'].should be_a(Array) - logs['logs'][0].should have_key('timestamp') - logs['logs'][0]['timestamp'].should be_a(String) - logs['logs'][0].should have_key('method') - logs['logs'][0]['method'].should be_a(String) - logs['logs'][0].should have_key('answer_code') - logs['logs'][0]['answer_code'].should be_a(String) - logs['logs'][0].should have_key('query_body') - logs['logs'][0]['query_body'].should be_a(String) - logs['logs'][0].should have_key('answer') - logs['logs'][0]['answer'].should be_a(String) - logs['logs'][0].should have_key('url') - logs['logs'][0]['url'].should be_a(String) - logs['logs'][0].should have_key('ip') - logs['logs'][0]['ip'].should be_a(String) - logs['logs'][0].should have_key('query_headers') - logs['logs'][0]['query_headers'].should be_a(String) - logs['logs'][0].should have_key('sha1') - logs['logs'][0]['sha1'].should be_a(String) - end - - it 'should generate secured api keys (old syntax)' do - key = Algolia.generate_secured_api_key('my_api_key', '(public,user1)') - key.should eq(OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), 'my_api_key', '(public,user1)')) - key = Algolia.generate_secured_api_key('my_api_key', '(public,user1)', 42) - key.should eq(OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), 'my_api_key', '(public,user1)42')) - key = Algolia.generate_secured_api_key('my_api_key', ['public']) - key.should eq(OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), 'my_api_key', 'public')) - key = Algolia.generate_secured_api_key('my_api_key', ['public', ['premium','vip']]) - key.should eq(OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), 'my_api_key', 'public,(premium,vip)')) - end - - it 'should generate secured api keys (new syntax)' do - key = Algolia.generate_secured_api_key('my_api_key', :tagFilters => '(public,user1)') - key.should eq(Base64.encode64("#{OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), 'my_api_key', 'tagFilters=%28public%2Cuser1%29')}tagFilters=%28public%2Cuser1%29").gsub("\n", '')) - key = Algolia.generate_secured_api_key('182634d8894831d5dbce3b3185c50881', :tagFilters => '(public,user1)', :userToken => 42) - # in ruby 1.8.7, the map iteration doesn't have the same ordering, - # making the hash slightly different - expected_keys = [ - 'ZDU0N2YzZjA3NGZkZGM2OTUxNzY3NzhkZDI3YWFkMjhhNzU5OTBiOGIyYTgyYzFmMjFjZTY4NTA0ODNiN2I1ZnVzZXJUb2tlbj00MiZ0YWdGaWx0ZXJzPSUyOHB1YmxpYyUyQ3VzZXIxJTI5', - 'OGYwN2NlNTdlOGM2ZmM4MjA5NGM0ZmYwNTk3MDBkNzMzZjQ0MDI3MWZjNTNjM2Y3YTAzMWM4NTBkMzRiNTM5YnRhZ0ZpbHRlcnM9JTI4cHVibGljJTJDdXNlcjElMjkmdXNlclRva2VuPTQy' - ] - expected_keys.include?(key).should eq(true) - end - - it 'Check attributes multipleQueries' do - res = Algolia.multiple_queries([{:index_name => safe_index_name("àlgol?a"), "query" => ""}]) - res.should have_key('results') - res['results'].should be_a(Array) - res['results'][0].should have_key('hits') - res['results'][0]['hits'].should be_a(Array) - res['results'][0].should have_key('page') - res['results'][0]['page'].should be_a(Integer) - res['results'][0].should have_key('nbHits') - res['results'][0]['nbHits'].should be_a(Integer) - res['results'][0].should have_key('nbPages') - res['results'][0]['nbPages'].should be_a(Integer) - res['results'][0].should have_key('hitsPerPage') - res['results'][0]['hitsPerPage'].should be_a(Integer) - res['results'][0].should have_key('processingTimeMS') - res['results'][0]['processingTimeMS'].should be_a(Integer) - res['results'][0].should have_key('query') - res['results'][0]['query'].should be_a(String) - res['results'][0].should have_key('params') - res['results'][0]['params'].should be_a(String) - end - - it 'should handle facet search' do - objects = { - :snoopy => { - :objectID => '1', - 'name' => 'Snoopy', - :kind => ['dog', 'animal'], - :born => 1950, - :series => 'Peanuts' - }, - :woodstock => { - :objectID => '2', - :name => 'Woodstock', - :kind => ['bird', 'animal'], - :born => 1960, - :series => 'Peanuts' - }, - :charlie => { - :objectID => '3', - :name => 'Charlie Brown', - :kind => ['human'], - :born => 1950, - :series => 'Peanuts' - }, - :hobbes => { - :objectID => '4', - :name => 'Hobbes', - :kind => ['tiger', 'animal', 'teddy'], - :born => 1985, - :series => 'Calvin & Hobbes' - }, - :calvin => { - :objectID => '5', - :name => 'Calvin', - :kind => ['human'], - :born => 1985, - :series => 'Calvin & Hobbes' - } - } - - index = Algolia::Index.new(safe_index_name('test_facet_search')) - index.set_settings({ - :attributesForFaceting => [ - 'searchable(series)', - 'kind' - ] - }) - index.add_objects! objects.values - - query = { - :facetFilters => ['kind:animal'], - :numericFilters => ['born >= 1955'] - } - answer = index.search_for_facet_values 'series', 'Peanutz', query - expect(answer['facetHits'].size).to eq(1) - expect(answer['facetHits'].first['value']).to eq('Peanuts') - expect(answer['facetHits'].first['count']).to eq(1) - end - - it 'should handle disjunctive faceting' do - index = Algolia::Index.new(safe_index_name("test_hotels")) - index.set_settings :attributesForFacetting => ['city', 'stars', 'facilities'] - index.clear_index rescue nil - index.add_objects! [ - { :name => 'Hotel A', :stars => '*', :facilities => ['wifi', 'bath', 'spa'], :city => 'Paris' }, - { :name => 'Hotel B', :stars => '*', :facilities => ['wifi'], :city => 'Paris' }, - { :name => 'Hotel C', :stars => '**', :facilities => ['bath'], :city => 'San Francisco' }, - { :name => 'Hotel D', :stars => '****', :facilities => ['spa'], :city => 'Paris' }, - { :name => 'Hotel E', :stars => '****', :facilities => ['spa'], :city => 'New York' }, - ] - - answer = index.search_disjunctive_faceting('h', ['stars', 'facilities'], { :facets => 'city' }) - answer['nbHits'].should eq(5) - answer['facets'].size.should eq(1) - answer['disjunctiveFacets'].size.should eq(2) - - answer = index.search_disjunctive_faceting('h', ['stars', 'facilities'], { :facets => 'city' }, { :stars => ['*'] }) - answer['nbHits'].should eq(2) - answer['facets'].size.should eq(1) - answer['disjunctiveFacets'].size.should eq(2) - answer['disjunctiveFacets']['stars']['*'].should eq(2) - answer['disjunctiveFacets']['stars']['**'].should eq(1) - answer['disjunctiveFacets']['stars']['****'].should eq(2) - - answer = index.search_disjunctive_faceting('h', ['stars', 'facilities'], { :facets => 'city' }, { :stars => ['*'], :city => ['Paris'] }) - answer['nbHits'].should eq(2) - answer['facets'].size.should eq(1) - answer['disjunctiveFacets'].size.should eq(2) - answer['disjunctiveFacets']['stars']['*'].should eq(2) - answer['disjunctiveFacets']['stars']['****'].should eq(1) - - answer = index.search_disjunctive_faceting('h', ['stars', 'facilities'], { :facets => 'city' }, { :stars => ['*', '****'], :city => ['Paris'] }) - answer['nbHits'].should eq(3) - answer['facets'].size.should eq(1) - answer['disjunctiveFacets'].size.should eq(2) - answer['disjunctiveFacets']['stars']['*'].should eq(2) - answer['disjunctiveFacets']['stars']['****'].should eq(1) - end - - it 'should apply jobs one after another if synchronous' do - index = Algolia::Index.new(safe_index_name("sync")) - begin - index.add_object! :objectID => 1 - answer = index.search('') - answer['nbHits'].should eq(1) - answer['hits'][0]['objectID'].to_i.should eq(1) - index.clear_index! - index.add_object! :objectID => 2 - index.add_object! :objectID => 3 - answer = index.search('') - answer['nbHits'].should eq(2) - answer['hits'][0]['objectID'].to_i.should_not eq(1) - ensure - index.delete_index - end - end - - it "should send a custom batch" do - batch = [ - {:action => "addObject", :indexName => @index.name, :body => { :objectID => "11", :email => "john@be.org" }}, - {:action => "addObject", :indexName => @index.name, :body => { :objectID => "22", :email => "robert@be.org" }} - ] - Algolia.batch!(batch) - res = @index.search("@be.org") - res["hits"].length.should eq(2) - end - - def test_browse(expected, *args) - @index.clear - @index.add_objects!(1.upto(1500).map { |i| { :objectID => i, :i => i } }) - hits = {} - @index.browse(*args) do |hit| - hits[hit['objectID']] = true - end - hits.size.should eq(expected) - end - - it "should browse the index using cursors" do - test_browse(1500) - test_browse(500, 1, 1000) - test_browse(0, 2, 1000) - end - - it "should browse the index using cursors specifying hitsPerPage" do - test_browse(1500, { :hitsPerPage => 500 }) - end - - it "should browse the index using cursors specifying params" do - test_browse(1, { :hitsPerPage => 500, :numericFilters => 'i=42' }) - test_browse(42, { :numericFilters => 'i<=42' }) - end - - it "should browse the index using cursors from a cursor" do - @index.clear - @index.add_objects!(1.upto(1500).map { |i| { :objectID => i, :i => i } }) - answer = @index.browse(0, 1000) - - hits = {} - @index.browse(:cursor => answer['cursor']) do |hit, cursor| - hits[hit['objectID']] = true - cursor.should eq(answer['cursor']) - end - hits.size.should eq(500) - - @index.browse_from(answer['cursor'])['hits'].size.should eq(500) - end - - it "should test synonyms" do - @index.add_object! :name => '589 Howard St., San Francisco' - @index.search('Howard St San Francisco')['nbHits'].should eq(1) - @index.batch_synonyms! [ - { :objectID => 'city', :type => 'synonym', :synonyms => ['San Francisco', 'SF'] }, - { :objectID => 'street', :type => 'altCorrection1', :word => 'street', :corrections => ['st'] } - ] - synonyms_search = @index.search_synonyms('')['hits'] - synonyms_search.size.should eq(2) - @index.search('Howard St SF')['nbHits'].should eq(1) - - synonym = @index.get_synonym('city') - synonym['objectID'].should eq('city') - synonym['type'].should eq('synonym') - - @index.search('Howard Street')['nbHits'].should eq(1) - - synonyms_block = [] - synonyms_ret = @index.export_synonyms(1) do |s| - synonyms_block << s - end - - s0 = synonyms_search.map { |s| s['objectID'] }.sort - s1 = synonyms_block.map { |s| s['objectID'] }.sort - s2 = synonyms_ret.map { |s| s['objectID'] }.sort - - s0.should eq(s1) - s1.should eq(s2) - - @index.delete_synonym! 'city' - @index.search('Howard Street SF')['nbHits'].should eq(0) - - @index.clear_synonyms! - @index.search_synonyms('')['nbHits'].should eq(0) - end - - it "should replace all synonyms" do - @index.batch_synonyms! ([ - {:objectID => '1', :type => 'synonym', :synonyms => ['San Francisco', 'SF']}, - {:objectID => '2', :type => 'altCorrection1', :word => 'foo', :corrections => ['st']} - ]) - - @index.replace_all_synonyms! ([ - {:objectID => '3', :type => 'synonym', :synonyms => ['San Francisco', 'SF']}, - {:objectID => '4', :type => 'altCorrection1', :word => 'bar', :corrections => ['st']} - ]) - - synonym = @index.get_synonym('4')['objectID'].should eq('4') - synonyms_search = @index.search_synonyms('')['hits'] - synonyms_search.size.should eq(2) - end - - it 'should test synonyms Export Query' do - @index.batch_synonyms! [ - { :objectID => 'city', :type => 'synonym', :synonyms => ['San Francisco', 'SF'] }, - { :objectID => 'us', :type => 'synonym', :synonyms => ['US', 'USA', 'Untied States of America'] }, - { :objectID => 'ie', :type => 'synonym', :synonyms => ['IE', 'IRL', 'Ireland'] }, - { :objectID => 'street', :type => 'altCorrection1', :word => 'street', :corrections => ['st'] } - ] - - expect(@index).to receive(:search_synonyms).and_call_original.at_least(4) - @index.export_synonyms(1) - - @index.clear_synonyms! - end - - it 'should test Query Rules' do - rule_1 = { - :objectID => '42', - :condition => { :pattern => 'test', :anchoring => 'contains' }, - :consequence => { :params => { :query => 'this is better' } } - } - rule_2 = { - :objectID => '2', - :condition => { :pattern => 'Pura', :anchoring => 'contains' }, - :consequence => { :params => { :query => 'Pura Vida' } } - } - - result = @index.save_rule!(rule_1[:objectID], rule_1) - result.should have_key('taskID') - result.should have_key('updatedAt') - - @index.get_rule(rule_1[:objectID])['objectID'].should eq(rule_1[:objectID]) - - @index.search_rules('better')['nbHits'].should eq(1) - @index.search_rules('', { :anchoring => 'contains' })['nbHits'].should eq(1) - - @index.delete_rule!(rule_1[:objectID]) - @index.search_rules('')['nbHits'].should eq(0) - - @index.batch_rules!([rule_1, rule_2]) - rules_search = @index.search_rules('')['hits'] - rules_search.size.should eq(2) - - rules_block = [] - rules_ret = @index.export_rules(1) do |r| - rules_block << r - end - - r0 = rules_search.map { |r| r['objectID'] }.sort - r1 = rules_block.map { |r| r['objectID'] }.sort - r2 = rules_ret.map { |r| r['objectID'] }.sort - - r0.should eq(r1) - r1.should eq(r2) - - @index.clear_rules! - @index.search_rules('')['nbHits'].should eq(0) - end - - it "should replace all rules" do - rule_1 = { - :objectID => '1', - :condition => {:pattern => 'test', :anchoring => 'contains'}, - :consequence => {:params => {:query => 'this is better'}} - } - rule_2 = { - :objectID => '2', - :condition => {:pattern => 'Pura', :anchoring => 'contains'}, - :consequence => {:params => {:query => 'Pura Vida'}} - } - - @index.batch_rules! [rule_1, rule_2] - - rule_1[:objectID] = '3' - rule_2[:objectID] = '4' - @index.replace_all_rules!([rule_1, rule_2]) - - @index.get_rule('4')['objectID'].should eq('4') - rules_search = @index.search_rules('')['hits'] - rules_search.size.should eq(2) - end - - it 'should not save a query rule with an empty objectID' do - rule = { - :objectID => '', - :condition => { :pattern => 'test', :anchoring => 'contains' }, - :consequence => { :params => { :query => 'this is better' } } - } - - expect { @index.save_rule!(nil, rule) }.to raise_error(ArgumentError) - expect { @index.save_rule!(rule[:objectID], rule) }.to raise_error(ArgumentError) - end - - it "should use request options" do - expect{Algolia.list_indexes}.to_not raise_error - - expect{Algolia.list_indexes('headers' => { 'X-Algolia-API-Key' => 'NotExistentAPIKey' })}.to raise_error(Algolia::AlgoliaProtocolError) - end - - it 'should retrieve the remaining validity time in seconds' do - now = Time.now.to_i - - key = Algolia.generate_secured_api_key('foo', :validUntil => now - (10 * 60)) - expect(Algolia.get_secured_api_key_remaining_validity(key)).to be < 0 - - key = Algolia.generate_secured_api_key('foo', :validUntil => now + (10 * 60)) - expect(Algolia.get_secured_api_key_remaining_validity(key)).to be > 0 - - key = Algolia.generate_secured_api_key('foo', []) - expect { Algolia.get_secured_api_key_remaining_validity(key) }.to raise_error(Algolia::ValidUntilNotFoundError) - end - - context 'DNS timeout' do - before(:each) do - @client = Algolia::Client.new :application_id => ENV['ALGOLIA_APPLICATION_ID'], :api_key => ENV['ALGOLIA_API_KEY'], - :hosts => [ - "10.0.0.1", # this will timeout - "#{ENV['ALGOLIA_APPLICATION_ID']}.algolia.net", - "#{ENV['ALGOLIA_APPLICATION_ID']}-1.algolianet.com", - "#{ENV['ALGOLIA_APPLICATION_ID']}-2.algolianet.com", - "#{ENV['ALGOLIA_APPLICATION_ID']}-3.algolianet.com" - ], - :connect_timeout => 5 - @client.destroy # make sure the thread-local vars are reseted - end - - it "should fallback to the 2nd host after a few seconds" do - start_time = Time.now - @client.list_indexes # fallback on the second host after 5 sec (connection timeout) - expect(start_time.to_i + 5).to be <= Time.now.to_i + 1 - end - - it "should re-use the working (2nd) host after the 1st one failed" do - start_time = Time.now - @client.list_indexes # fallback on the second host after 5 sec (connection timeout) - expect(start_time.to_i + 5).to be <= Time.now.to_i + 1 - start_time = Time.now - @client.list_indexes # re-use the 2nd one - expect(start_time.to_i).to be <= Time.now.to_i + 1 - end - end - - context 'Custom User Agent' do - before(:all) do - WebMock.enable! - end - - before(:each) do - @client = Algolia::Client.new( - :application_id => ENV['ALGOLIA_APPLICATION_ID'], - :api_key => ENV['ALGOLIA_API_KEY'], - :user_agent => 'test agent' - ) - @client.destroy # make sure the thread-local vars are reseted - end - - it "should use a custom user-agent" do - WebMock.stub_request(:get, /.*\.algolia(net\.com|\.net)\/1\/indexes/). - to_return(:status => 200, :body => '{}') - @client.list_indexes - expect(WebMock).to have_requested(:get, /https:\/\/.+-dsn.algolia(net\.com|\.net)\/1\/indexes/). - with(:headers => { 'User-Agent' => "Algolia for Ruby (#{::Algolia::VERSION}); Ruby (#{RUBY_VERSION}); test agent" }) - end - - after(:all) do - WebMock.disable! - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/spec/mock_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/spec/mock_spec.rb deleted file mode 100644 index 8dae58a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/spec/mock_spec.rb +++ /dev/null @@ -1,31 +0,0 @@ -require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper')) - -describe 'With a mocked client' do - - before(:all) do - WebMock.enable! - Algolia::WebMock.mock! - # reset session objects - app_id = Algolia.client.application_id - Thread.current["algolia_hosts_#{app_id}"] = nil - Thread.current["algolia_search_hosts_#{app_id}"] = nil - Thread.current["algolia_host_index_#{app_id}"] = nil - Thread.current["algolia_search_host_index_#{app_id}"] = nil - end - - it "should add a simple object" do - index = Algolia::Index.new("friends") - index.add_object!({ :name => "John Doe", :email => "john@doe.org" }) - index.search('').should == { "hits" => [ { "objectID" => 42 } ], "page" => 1, "hitsPerPage" => 1, "nbHits"=>1, "nbPages"=>1 } # mocked - index.list_api_keys - index.browse - index.clear - index.delete - index.delete_by_query 'test' - end - - after(:all) do - WebMock.disable! - end - -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/spec/spec_helper.rb b/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/spec/spec_helper.rb deleted file mode 100644 index e317c1e..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/spec/spec_helper.rb +++ /dev/null @@ -1,69 +0,0 @@ - -if ENV['COVERAGE'] - require 'simplecov' - SimpleCov.start -end - -require 'bundler/setup' - -Bundler.setup :test - -$LOAD_PATH.unshift(File.dirname(__FILE__)) -$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib')) - -require 'algoliasearch' -require 'rspec' -require 'webmock/rspec' -require 'algolia/webmock' -require 'time' - -raise 'missing ALGOLIA_APPLICATION_ID or ALGOLIA_API_KEY environment variables' if ENV['ALGOLIA_APPLICATION_ID'].nil? || ENV['ALGOLIA_API_KEY'].nil? -Algolia.init :application_id => ENV['ALGOLIA_APPLICATION_ID'], :api_key => ENV['ALGOLIA_API_KEY'] - -RSpec.configure do |config| - config.mock_with :rspec - - config.before(:suite) do - WebMock.disable! - end - - config.after(:suite) do - WebMock.disable! - end -end - -# avoid concurrent access to the same index -def safe_index_name(name) - return name if ENV['TRAVIS'].to_s != "true" - id = ENV['TRAVIS_JOB_NUMBER'] - "TRAVIS_RUBY_#{name}-#{id}" -end - -# avoid concurrent access to the same index and follows the CTS standards. -def index_name(name) - date = DateTime.now.strftime('%Y-%m-%d_%H:%M:%S') - - instance = ENV['TRAVIS'].to_s == 'true' ? ENV['TRAVIS_JOB_NUMBER'] : 'unknown' - - 'ruby_%s_%s_%s' % [date, instance, name] -end - -def auto_retry(options = {}) - return if !block_given? - - max_retry = options[:max_retry] || 10 - retry_count = 0 - - loop do - begin - return yield - rescue => e - retry_count += 1 - if retry_count >= max_retry - raise e - else - sleep retry_count - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/spec/stub_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/spec/stub_spec.rb deleted file mode 100644 index 9c92efa..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/algoliasearch-1.27.5/spec/stub_spec.rb +++ /dev/null @@ -1,51 +0,0 @@ -require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper')) - -require 'webmock' - -describe 'With a rate limited client' do - - before(:each) do - WebMock.enable! - # reset session objects - app_id = Algolia.client.application_id - Thread.current["algolia_hosts_#{app_id}"] = nil - Thread.current["algolia_search_hosts_#{app_id}"] = nil - Thread.current["algolia_host_index_#{app_id}"] = nil - Thread.current["algolia_search_host_index_#{app_id}"] = nil - end - - it "should pass the right headers" do - WebMock.stub_request(:post, %r{https://.*\.algolia\.(io|net)/1/indexes/friends/query}). - with(:headers => {'Content-Type'=>'application/json; charset=utf-8', 'User-Agent'=>"Algolia for Ruby (#{Algolia::VERSION}); Ruby (#{RUBY_VERSION})", 'X-Algolia-Api-Key'=>ENV['ALGOLIA_API_KEY'], 'X-Algolia-Application-Id'=>ENV['ALGOLIA_APPLICATION_ID'], 'X-Forwarded-Api-Key'=>'ratelimitapikey', 'X-Forwarded-For'=>'1.2.3.4'}). - to_return(:status => 200, :body => "{ \"hits\": [], \"fakeAttribute\": 1 }", :headers => {}) - Algolia.enable_rate_limit_forward ENV['ALGOLIA_API_KEY'], "1.2.3.4", "ratelimitapikey" - index = Algolia::Index.new("friends") - index.search('foo')['fakeAttribute'].should == 1 - index.search('bar')['fakeAttribute'].should == 1 - end - - it "should use original headers" do - WebMock.stub_request(:post, %r{https://.*\.algolia\.(io|net)/1/indexes/friends/query}). - with(:headers => {'Content-Type'=>'application/json; charset=utf-8', 'User-Agent'=>"Algolia for Ruby (#{Algolia::VERSION}); Ruby (#{RUBY_VERSION})", 'X-Algolia-Api-Key'=>ENV['ALGOLIA_API_KEY'], 'X-Algolia-Application-Id'=>ENV['ALGOLIA_APPLICATION_ID'] }). - to_return(:status => 200, :body => "{ \"hits\": [], \"fakeAttribute\": 2 }", :headers => {}) - Algolia.disable_rate_limit_forward - index = Algolia::Index.new("friends") - index.search('bar')['fakeAttribute'].should == 2 - end - - it "should pass the right headers in the scope" do - WebMock.stub_request(:post, %r{https://.*\.algolia\.(io|net)/1/indexes/friends/query}). - with(:headers => {'Content-Type'=>'application/json; charset=utf-8', 'User-Agent'=>"Algolia for Ruby (#{Algolia::VERSION}); Ruby (#{RUBY_VERSION})", 'X-Algolia-Api-Key'=>ENV['ALGOLIA_API_KEY'], 'X-Algolia-Application-Id'=>ENV['ALGOLIA_APPLICATION_ID'], 'X-Forwarded-Api-Key'=>'ratelimitapikey', 'X-Forwarded-For'=>'1.2.3.4'}). - to_return(:status => 200, :body => "{ \"hits\": [], \"fakeAttribute\": 1 }", :headers => {}) - Algolia.with_rate_limits "1.2.3.4", "ratelimitapikey" do - index = Algolia::Index.new("friends") - index.search('foo')['fakeAttribute'].should == 1 - index.search('bar')['fakeAttribute'].should == 1 - end - end - - after(:each) do - WebMock.disable! - end - -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/.gitignore b/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/.gitignore deleted file mode 100644 index b04a8c8..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -/.bundle/ -/.yardoc -/_yardoc/ -/coverage/ -/doc/ -/pkg/ -/spec/reports/ -/tmp/ - -# rspec failure tracking -.rspec_status diff --git a/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/.rspec b/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/.rspec deleted file mode 100644 index 34c5164..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/.rspec +++ /dev/null @@ -1,3 +0,0 @@ ---format documentation ---color ---require spec_helper diff --git a/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/.rubocop.yml b/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/.rubocop.yml deleted file mode 100644 index 3ffe2b0..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/.rubocop.yml +++ /dev/null @@ -1,2 +0,0 @@ -inherit_from: .rubocop_todo.yml - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/.rubocop_todo.yml b/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/.rubocop_todo.yml deleted file mode 100644 index 826a7a2..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/.rubocop_todo.yml +++ /dev/null @@ -1,32 +0,0 @@ -# This configuration was generated by -# `rubocop --auto-gen-config` -# on 2018-02-02 08:32:23 -0800 using RuboCop version 0.52.1. -# The point is for the user to remove these configuration records -# one by one as the offenses are removed from the code base. -# Note that changes in the inspected code, or installation of new -# versions of RuboCop, may require this file to be generated again. - -# Offense count: 1 -# Configuration parameters: Include. -# Include: **/*.gemspec -Gemspec/RequiredRubyVersion: - Exclude: - - 'atomos.gemspec' - -# Offense count: 1 -# Configuration parameters: CountComments. -Metrics/MethodLength: - Max: 14 - -# Offense count: 1 -Style/Documentation: - Exclude: - - 'spec/**/*' - - 'test/**/*' - - 'lib/atomos.rb' - -# Offense count: 7 -# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns. -# URISchemes: http, https -Metrics/LineLength: - Max: 97 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/.travis.yml b/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/.travis.yml deleted file mode 100644 index 6a8e36f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -sudo: false -language: ruby -rvm: - - 2.5.0 -before_install: gem install bundler -v 1.16.1 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/CODE_OF_CONDUCT.md b/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/CODE_OF_CONDUCT.md deleted file mode 100644 index 3399e24..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,74 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -In the interest of fostering an open and welcoming environment, we as -contributors and maintainers pledge to making participation in our project and -our community a harassment-free experience for everyone, regardless of age, body -size, disability, ethnicity, gender identity and expression, level of experience, -nationality, personal appearance, race, religion, or sexual identity and -orientation. - -## Our Standards - -Examples of behavior that contributes to creating a positive environment -include: - -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery and unwelcome sexual attention or -advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic - address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a - professional setting - -## Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable -behavior and are expected to take appropriate and fair corrective action in -response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or -reject comments, commits, code, wiki edits, issues, and other contributions -that are not aligned to this Code of Conduct, or to ban temporarily or -permanently any contributor for other behaviors that they deem inappropriate, -threatening, offensive, or harmful. - -## Scope - -This Code of Conduct applies both within project spaces and in public spaces -when an individual is representing the project or its community. Examples of -representing a project or community include using an official project e-mail -address, posting via an official social media account, or acting as an appointed -representative at an online or offline event. Representation of a project may be -further defined and clarified by project maintainers. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at segiddins@squareup.com. All -complaints will be reviewed and investigated and will result in a response that -is deemed necessary and appropriate to the circumstances. The project team is -obligated to maintain confidentiality with regard to the reporter of an incident. -Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good -faith may face temporary or permanent repercussions as determined by other -members of the project's leadership. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, -available at [http://contributor-covenant.org/version/1/4][version] - -[homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/4/ diff --git a/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/Gemfile b/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/Gemfile deleted file mode 100644 index 2d1d7e6..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/Gemfile +++ /dev/null @@ -1,8 +0,0 @@ -# frozen_string_literal: true - -source 'https://rubygems.org' - -git_source(:github) { |repo_name| "https://github.com/#{repo_name}" } - -# Specify your gem's dependencies in atomos.gemspec -gemspec diff --git a/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/Gemfile.lock b/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/Gemfile.lock deleted file mode 100644 index edfb2e5..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/Gemfile.lock +++ /dev/null @@ -1,51 +0,0 @@ -PATH - remote: . - specs: - atomos (0.1.3) - -GEM - remote: https://rubygems.org/ - specs: - ast (2.3.0) - diff-lcs (1.3) - parallel (1.12.1) - parser (2.4.0.2) - ast (~> 2.3) - powerpack (0.1.1) - rainbow (3.0.0) - rake (10.5.0) - rspec (3.7.0) - rspec-core (~> 3.7.0) - rspec-expectations (~> 3.7.0) - rspec-mocks (~> 3.7.0) - rspec-core (3.7.1) - rspec-support (~> 3.7.0) - rspec-expectations (3.7.0) - diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.7.0) - rspec-mocks (3.7.0) - diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.7.0) - rspec-support (3.7.0) - rubocop (0.52.1) - parallel (~> 1.10) - parser (>= 2.4.0.2, < 3.0) - powerpack (~> 0.1) - rainbow (>= 2.2.2, < 4.0) - ruby-progressbar (~> 1.7) - unicode-display_width (~> 1.0, >= 1.0.1) - ruby-progressbar (1.9.0) - unicode-display_width (1.3.0) - -PLATFORMS - ruby - -DEPENDENCIES - atomos! - bundler (~> 1.16) - rake (~> 10.0) - rspec (~> 3.0) - rubocop - -BUNDLED WITH - 1.16.3 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/LICENSE.txt b/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/LICENSE.txt deleted file mode 100644 index 7a54c62..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2018 Samuel Giddins - -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/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/README.md b/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/README.md deleted file mode 100644 index de832a5..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/README.md +++ /dev/null @@ -1,43 +0,0 @@ -# Atomos - -Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/atomos`. To experiment with that code, run `bin/console` for an interactive prompt. - -TODO: Delete this and the text above, and describe your gem - -## Installation - -Add this line to your application's Gemfile: - -```ruby -gem 'atomos' -``` - -And then execute: - - $ bundle - -Or install it yourself as: - - $ gem install atomos - -## Usage - -TODO: Write usage instructions here - -## Development - -After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment. - -To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org). - -## Contributing - -Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/atomos. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct. - -## License - -The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT). - -## Code of Conduct - -Everyone interacting in the Atomos project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/atomos/blob/master/CODE_OF_CONDUCT.md). diff --git a/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/Rakefile b/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/Rakefile deleted file mode 100644 index 8ce173e..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/Rakefile +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -require 'bundler/gem_tasks' - -require 'rspec/core/rake_task' -require 'rubocop/rake_task' - -RSpec::Core::RakeTask.new -RuboCop::RakeTask.new - -task default: %i[rubocop spec] diff --git a/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/VERSION b/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/VERSION deleted file mode 100644 index b1e80bb..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/VERSION +++ /dev/null @@ -1 +0,0 @@ -0.1.3 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/atomos.gemspec b/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/atomos.gemspec deleted file mode 100644 index 7ad4922..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/atomos.gemspec +++ /dev/null @@ -1,26 +0,0 @@ -# frozen_string_literal: true - -Gem::Specification.new do |spec| - spec.name = 'atomos' - spec.version = File.read(File.expand_path('../VERSION', __FILE__)) - spec.authors = ['Samuel Giddins'] - spec.email = ['segiddins@segiddins.me'] - - spec.summary = 'A simple gem to atomically write files' - spec.homepage = 'https://github.com/segiddins/atomos' - spec.license = 'MIT' - - spec.files = `git ls-files -z`.split("\x0").reject do |f| - f.match(%r{^(test|spec|features)/}) - end - spec.bindir = 'exe' - spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) } - spec.require_paths = ['lib'] - - spec.required_ruby_version = '>= 2.0' - - spec.add_development_dependency 'bundler', '~> 1.16' - spec.add_development_dependency 'rake', '~> 10.0' - spec.add_development_dependency 'rspec', '~> 3.0' - spec.add_development_dependency 'rubocop' -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/bin/console b/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/bin/console deleted file mode 100755 index 535613d..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/bin/console +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env ruby -# frozen_string_literal: true - -require 'bundler/setup' -require 'atomos' - -# You can add fixtures and/or initialization code here to make experimenting -# with your gem easier. You can also use a different console, if you like. - -# (If you use this, don't forget to add pry to your Gemfile!) -# require "pry" -# Pry.start - -require 'irb' -IRB.start(__FILE__) diff --git a/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/bin/rake b/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/bin/rake deleted file mode 100755 index 8226b57..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/bin/rake +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env ruby -# frozen_string_literal: true - -# -# This file was generated by Bundler. -# -# The application 'rake' is installed as part of a gem, and -# this file is here to facilitate running it. -# - -require 'pathname' -ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', - Pathname.new(__FILE__).realpath) - -bundle_binstub = File.expand_path('../bundle', __FILE__) - -if File.file?(bundle_binstub) - if File.read(bundle_binstub, 150).match?(/This file was generated by Bundler/) - load(bundle_binstub) - else - abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. -Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") - end -end - -require 'rubygems' -require 'bundler/setup' - -load Gem.bin_path('rake', 'rake') diff --git a/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/bin/rspec b/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/bin/rspec deleted file mode 100755 index d086973..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/bin/rspec +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env ruby -# frozen_string_literal: true - -# -# This file was generated by Bundler. -# -# The application 'rspec' is installed as part of a gem, and -# this file is here to facilitate running it. -# - -require 'pathname' -ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', - Pathname.new(__FILE__).realpath) - -bundle_binstub = File.expand_path('../bundle', __FILE__) - -if File.file?(bundle_binstub) - if File.read(bundle_binstub, 150).match?(/This file was generated by Bundler/) - load(bundle_binstub) - else - abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. -Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") - end -end - -require 'rubygems' -require 'bundler/setup' - -load Gem.bin_path('rspec-core', 'rspec') diff --git a/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/bin/rubocop b/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/bin/rubocop deleted file mode 100755 index 8424d87..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/bin/rubocop +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env ruby -# frozen_string_literal: true - -# -# This file was generated by Bundler. -# -# The application 'rubocop' is installed as part of a gem, and -# this file is here to facilitate running it. -# - -require 'pathname' -ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', - Pathname.new(__FILE__).realpath) - -bundle_binstub = File.expand_path('../bundle', __FILE__) - -if File.file?(bundle_binstub) - if File.read(bundle_binstub, 150).match?(/This file was generated by Bundler/) - load(bundle_binstub) - else - abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. -Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") - end -end - -require 'rubygems' -require 'bundler/setup' - -load Gem.bin_path('rubocop', 'rubocop') diff --git a/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/bin/setup b/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/bin/setup deleted file mode 100755 index dce67d8..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/atomos-0.1.3/bin/setup +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail -IFS=$'\n\t' -set -vx - -bundle install - -# Do any other automated setup that you need to do here diff --git a/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/.github/workflows/ci.yml b/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/.github/workflows/ci.yml deleted file mode 100644 index 54e1f05..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/.github/workflows/ci.yml +++ /dev/null @@ -1,45 +0,0 @@ -name: ci - -on: - pull_request: - - push: - branches: - - master - - '*-stable' - -jobs: - ci: - name: Ruby ${{ matrix.ruby.name }} - - runs-on: ubuntu-20.04 - - strategy: - fail-fast: false - - matrix: - ruby: - - { name: "2.3", value: 2.3.8 } - - { name: "2.4", value: 2.4.10 } - - { name: "2.5", value: 2.5.9 } - - { name: "2.6", value: 2.6.9 } - - { name: "2.7", value: 2.7.5 } - - { name: "3.0", value: 3.0.3 } - - { name: "3.1", value: 3.1.0 } - - steps: - - uses: actions/checkout@v2 - - - name: Setup ruby - uses: ruby/setup-ruby@v1 - with: - ruby-version: ${{ matrix.ruby.value }} - bundler-cache: true - - - name: Run Test - run: bundle exec rake spec - - - name: Test & publish code coverage - uses: paambaati/codeclimate-action@v3.0.0 - env: - CC_TEST_REPORTER_ID: 46c8b29dd6711f35704e7c5a541486cbbf2cff8b2df8ce755bfc09917d3c1cbb diff --git a/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/.gitignore b/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/.gitignore deleted file mode 100644 index 001d28f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/.gitignore +++ /dev/null @@ -1,17 +0,0 @@ -*.gem -*.rbc -.bundle -.config -.yardoc -InstalledFiles -_yardoc -coverage -doc/ -lib/bundler/man -pkg -rdoc -spec/reports -test/tmp -test/version_tmp -tmp -.idea diff --git a/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/.kick b/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/.kick deleted file mode 100644 index 0686cce..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/.kick +++ /dev/null @@ -1,30 +0,0 @@ -recipe :ruby - -Kicker::Recipes::Ruby.runner_bin = 'bundle exec bacon --quiet' - -process do |files| - specs = files.take_and_map do |file| - if file =~ %r{lib/[^/]*/(.+?)\.rb$} - s = Dir.glob("spec/**/#{File.basename(file, '.rb')}_spec.rb") - s.uniq unless s.empty? - end - end - Kicker::Recipes::Ruby.run_tests(specs) -end - -# Have written this so many times, probably should make a recipe out of it. -process do |files| - files.each do |file| - case file - when 'Gemfile' - files.delete(file) - execute 'bundle install' - end - end -end - -recipe :ignore -ignore(/.*\/?tags/) -ignore(/.*\/?\.git/) -ignore(/^tmp/) - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/.rubocop.yml b/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/.rubocop.yml deleted file mode 100644 index 3ef9f69..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/.rubocop.yml +++ /dev/null @@ -1,6 +0,0 @@ -require: - - rubocop-performance - -inherit_from: - - .rubocop_todo.yml - - .rubocop_cocoapods.yml diff --git a/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/.rubocop_cocoapods.yml b/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/.rubocop_cocoapods.yml deleted file mode 100644 index 4702a3e..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/.rubocop_cocoapods.yml +++ /dev/null @@ -1,151 +0,0 @@ -AllCops: - Include: - - ./Rakefile - - ./Gemfile - - ./*.gemspec - Exclude: - - ./spec/fixtures/**/* - - ./vendor/bundle/**/* - -# At the moment not ready to be used -# https://github.com/bbatsov/rubocop/issues/947 -Style/Documentation: - Enabled: false - -#- CocoaPods -----------------------------------------------------------------# - -# We adopted raise instead of fail. -Style/SignalException: - EnforcedStyle: only_raise - -# They are idiomatic -Lint/AssignmentInCondition: - Enabled: false - -# Allow backticks -Style/AsciiComments: - Enabled: false - -# Indentation clarifies logic branches in implementations -Style/IfUnlessModifier: - Enabled: false - -# No enforced convention here. -Style/SingleLineBlockParams: - Enabled: false - -# We only add the comment when needed. -Style/Encoding: - Enabled: false - -# Having these make it easier to *not* forget to add one when adding a new -# value and you can simply copy the previous line. -Style/TrailingCommaInArguments: - EnforcedStyleForMultiline: comma - -Style/TrailingCommaInArrayLiteral: - EnforcedStyleForMultiline: comma - -Style/TrailingCommaInHashLiteral: - EnforcedStyleForMultiline: comma - -Layout/MultilineOperationIndentation: - EnforcedStyle: indented - -# Clashes with CLAide Command#validate! -Style/GuardClause: - Enabled: false - -# Not always desirable: lib/claide/command/plugins_helper.rb:12:15 -Style/Next: - Enabled: false - -# Arbitrary max lengths for classes simply do not work and enabling this will -# lead to a never ending stream of annoyance and changes. -Metrics/ClassLength: - Enabled: false - -# Arbitrary max lengths for modules simply do not work and enabling this will -# lead to a never ending stream of annoyance and changes. -Metrics/ModuleLength: - Enabled: false - -# Arbitrary max lengths for methods simply do not work and enabling this will -# lead to a never ending stream of annoyance and changes. -Metrics/MethodLength: - Enabled: false - -# No enforced convention here. -Metrics/BlockNesting: - Enabled: false - -# It will be obvious which code is complex, Rubocop should only lint simple -# rules for us. -Metrics/AbcSize: - Enabled: false - -# It will be obvious which code is complex, Rubocop should only lint simple -# rules for us. -Metrics/CyclomaticComplexity: - Enabled: false - -# It will be obvious which code is complex, Rubocop should only lint simple -# rules for us. -Metrics/PerceivedComplexity: - Enabled: false - -#- CocoaPods support for Ruby 1.8.7 ------------------------------------------# - -Style/HashSyntax: - EnforcedStyle: hash_rockets - -Style/Lambda: - Enabled: false - -Layout/DotPosition: - EnforcedStyle: trailing - -Style/EachWithObject: - Enabled: false - -Style/SpecialGlobalVars: - Enabled: false - -#- CocoaPods specs -----------------------------------------------------------# - -# Allow for `should.match /regexp/`. -Lint/AmbiguousRegexpLiteral: - Exclude: - - spec/**/* - -Performance/RedundantMatch: - Exclude: - - spec/**/* - -# Allow `object.should == object` syntax. -Lint/Void: - Exclude: - - spec/**/* - -Style/ClassAndModuleChildren: - Exclude: - - spec/**/* - -Lint/UselessComparison: - Exclude: - - spec/**/* - -Lint/RaiseException: - Enabled: false - -Lint/StructNewOverride: - Enabled: false - -Style/HashEachMethods: - Enabled: false - -Style/HashTransformKeys: - Enabled: false - -Style/HashTransformValues: - Enabled: false diff --git a/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/.rubocop_todo.yml b/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/.rubocop_todo.yml deleted file mode 100644 index 926b32c..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/.rubocop_todo.yml +++ /dev/null @@ -1,70 +0,0 @@ -# This configuration was generated by -# `rubocop --auto-gen-config` -# on 2016-03-09 18:40:14 -0600 using RuboCop version 0.38.0. -# The point is for the user to remove these configuration records -# one by one as the offenses are removed from the code base. -# Note that changes in the inspected code, or installation of new -# versions of RuboCop, may require this file to be generated again. - -# Offense count: 3 -Lint/IneffectiveAccessModifier: - Exclude: - - 'lib/claide/command.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -Lint/RedundantCopDisableDirective: - Exclude: - - 'spec/command/banner_spec.rb' - -# Offense count: 1 -Performance/FixedSize: - Exclude: - - 'lib/claide/command/banner.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -Performance/StringReplacement: - Exclude: - - 'lib/claide/command/banner.rb' - -# Offense count: 8 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles. -# SupportedStyles: prefer_alias, prefer_alias_method -Style/Alias: - Exclude: - - 'lib/claide/argument.rb' - - 'lib/claide/command.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -# Configuration parameters: SingleLineConditionsOnly. -Style/ConditionalAssignment: - Exclude: - - 'lib/claide/command/banner.rb' - -# Offense count: 1 -Style/IfInsideElse: - Exclude: - - 'lib/claide/command.rb' - -# Offense count: 9 -# Cop supports --auto-correct. -Style/MutableConstant: - Exclude: - - 'lib/claide/ansi.rb' - - 'lib/claide/argument.rb' - - 'lib/claide/command.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -Style/ParallelAssignment: - Exclude: - - 'lib/claide/command/argument_suggester.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -Style/RedundantInterpolation: - Exclude: - - 'lib/claide/command/argument_suggester.rb' diff --git a/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/.yardopts b/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/.yardopts deleted file mode 100644 index a647564..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/.yardopts +++ /dev/null @@ -1 +0,0 @@ ---markup markdown --protected --charset=utf-8 lib diff --git a/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/CHANGELOG.md b/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/CHANGELOG.md deleted file mode 100644 index 2fd0d62..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/CHANGELOG.md +++ /dev/null @@ -1,265 +0,0 @@ -# CLAide Changelog - -## 1.1.0 (2022-01-12) - -##### Enhancements - -* None. - -##### Bug Fixes - -* None. - - -## 1.0.3 (2019-08-02) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Correctly handle `--help` flags when using `argv.remainder!` after initialization - [Eric Amorde](https://github.com/amorde), - [tripleCC](https://github.com/tripleCC) - [#87](https://github.com/CocoaPods/CLAide/pull/87) - - -## 1.0.2 (2017-06-06) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Avoid a method redefinition warning when requiring `claide`. - [Samuel Giddins](https://github.com/segiddins) - - -## 1.0.1 (2016-10-10) - -##### Bug Fixes - -* Adds a fix for older versions of Rubygems when CLAide crashes. - [Samuel Giddins](https://github.com/segiddins) - [#73](https://github.com/CocoaPods/CLAide/issues/73) - - -## 1.0.0 (2016-05-10) - -##### Enhancements - -* None. - -##### Bug Fixes - -* None. - - -## 1.0.0.rc.1 (2016-04-30) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Fix circular require of `claide/ansi` in `claide/ansi/string_escaper`. - [bootstraponline](https://github.com/bootstraponline) - [#66](https://github.com/CocoaPods/CLAide/issues/66) - - -## 1.0.0.beta.3 (2016-03-15) - -##### Enhancements - -* Added `Command.option` to easily add a single option to a command class. - [Samuel Giddins](https://github.com/segiddins) - [#64](https://github.com/CocoaPods/CLAide/issues/64) - -##### Bug Fixes - -* None. - - -## 1.0.0.beta.2 (2016-03-08) - -##### Bug Fixes - -* Attempt to get the terminal width without shelling out to `tput`. - [Samuel Giddins](https://github.com/segiddins) - - -## 1.0.0.beta.1 (2015-12-30) - -##### Bug Fixes - -* The plugin manager will now properly activate plugin gems, ensuring all of - their files are requirable. - [Samuel Giddins](https://github.com/segiddins) - - -## 0.9.1 (2015-07-05) - -##### Bug Fixes - -* Fix a regression when contradictory flags were given in `ARGV` -- the last - flag given will once again be the value returned, and all entries for that key - are removed. - [Samuel Giddins](https://github.com/segiddins) - - -## 0.9.0 (2015-07-02) - -##### Enhancements - -* Properly parse everything in `ARGV` after `--` as an argument. - [Samuel Giddins](https://github.com/segiddins) - [#48](https://github.com/CocoaPods/CLAide/issues/48) - -* Allow parsing an option that occurs multiple times. - [Samuel Giddins](https://github.com/segiddins) - - -## 0.8.2 (2015-06-27) - -##### Enhancements - -* Add `ARGV#remainder!`, which returns all the remaining arguments, deleting - them from the receiver. - [Samuel Giddins](https://github.com/segiddins) - - -## 0.8.1 (2015-02-25) - -###### Bug Fixes - -* Silence errors while loading plugins. - [Clément Beffa](https://github.com/cl3m) - [#44](https://github.com/CocoaPods/CLAide/issues/44) - - -## 0.8.0 (2014-12-25) - -###### Breaking - -* Removes the `ShellCompletionHelper` along with completion script for ZSH. This is out of the scope of CLAide. - [Eloy Durán](https://github.com/alloy) - [#43](https://github.com/CocoaPods/CLAide/issues/43) - -* Various refactoring replacing “Helper” API’s which specialised classes such as ArgumentSuggester, TextWrapper and PluginManager. - [Eloy Durán](https://github.com/alloy) - -###### Enhancements - -* Added convenience method to invoke commands more easily. - [Olivier Halligon](https://github.com/AliSoftware) - [#33](https://github.com/CocoaPods/CLAide/issues/40) - -* Changes to the PluginManager to handle multiple plugin prefixes, which by default adds the `clad` plugin prefix. - [Eloy Durán](https://github.com/alloy) - -## 0.7.0 (2014-09-11) - -###### Breaking - -* Plugins are now expected to include the `cocoapods-plugin.rb` file in - `./lib`. - [Fabio Pelosin](https://github.com/fabiopelosin) - [#28](https://github.com/CocoaPods/CLAide/pull/28) - -###### Enhancements - -* Improved messages for exceptions generated by plugins. - [Fabio Pelosin](https://github.com/fabiopelosin) - [#28](https://github.com/CocoaPods/CLAide/pull/28) - -* Use the Argument class to describe arguments. - [Olivier Halligon](https://github.com/AliSoftware) - [#33](https://github.com/CocoaPods/CLAide/issues/33) - -* Support for argument alternatives and repeatable arguments (ellipsis). - [Olivier Halligon](https://github.com/AliSoftware) - [#33](https://github.com/CocoaPods/CLAide/issues/33) - -* No stack trace if --help and --vebose are combined. - [Marius Rackwitz](https://github.com/mrackwitz) - [#36](https://github.com/CocoaPods/CLAide/issues/36) - - -## 0.6.1 (2014-05-20) - -###### Bug Fixes - -* Respect the ANSI flag for the help banner. - [Fabio Pelosin](https://github.com/fabiopelosin) - [#34](https://github.com/CocoaPods/CLAide/issues/34) - -* Underline the colon of the titles of the help banner. - [Fabio Pelosin](https://github.com/fabiopelosin) - -## 0.6.0 (2014-05-19) - -###### Enhancements - -* Use an array to describe arguments. - [Fabio Pelosin][fabiopelosin] - [#26](https://github.com/CocoaPods/CLAide/issues/26) - -* Improved layout and contents of help banner - [Fabio Pelosin](https://github.com/fabiopelosin) - [#25](https://github.com/CocoaPods/CLAide/pull/25) - -* Colorize option, arguments, and example commands in the help banner. - [Fabio Pelosin](https://github.com/fabiopelosin) - [#12](https://github.com/CocoaPods/CLAide/issues/12) - -* Add support for ANSI escape sequences. - [Fabio Pelosin](https://github.com/fabiopelosin) - [#17](https://github.com/CocoaPods/CLAide/issues/17) - [#20](https://github.com/CocoaPods/CLAide/pull/20) - [#24](https://github.com/CocoaPods/CLAide/pull/24) - -* Add support for completion script - [Fabio Pelosin](https://github.com/fabiopelosin) - [#19](https://github.com/CocoaPods/CLAide/pull/19) - -* Add support for version logic via the introduction of the `version` class - attribute to the `CLAide::Commmand` class. If a value for the attribute is - specified the `--version` flag is added. The `--version --verbose` flags - include the version of the plugins in the output. - [Fabio Pelosin](https://github.com/fabiopelosin) - [#13](https://github.com/CocoaPods/CLAide/issues/13) - [#14](https://github.com/CocoaPods/CLAide/issues/14) - -## 0.5.0 (2014-03-26) - -###### Enhancements - -* Add a `ignore_in_command_lookup` option to commands, which makes it possible - to have anonymous command classes that are or only meant to provide common - functionality, but are otherwise completely ignored during parsing, command - lookup, and help banner printing. - [Eloy Durán](https://github.com/alloy) - -* Deprecate the `color` option in favor of `ansi`. This is more abstract and - can be used for commands that only prettify output by using, for instance, - the bold ANSI code. This applies to the `CLAide` APIs as well. - [Eloy Durán](https://github.com/alloy) - -* Add more hooks that allow the user to customize how to prettify output. - [Eloy Durán](https://github.com/alloy) - -* Word wrap option descriptions to terminal width. - [Eloy Durán](https://github.com/alloy) - [#6](https://github.com/CocoaPods/CLAide/issues/6) - - -## 0.4.0 (2013-11-14) - -###### Enhancements - -* Added support for plugins. - [Les Hill](https://github.com/leshill) - [#1](https://github.com/CocoaPods/CLAide/pull/1) diff --git a/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/Gemfile b/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/Gemfile deleted file mode 100644 index c33e9bc..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/Gemfile +++ /dev/null @@ -1,22 +0,0 @@ -source 'https://rubygems.org' - -gemspec - -gem 'rake' - -group :development do - gem 'kicker' - gem 'colored' # for examples -end - -group :spec do - gem 'bacon' - gem 'json', '< 3' - gem 'mocha-on-bacon' - gem 'prettybacon' - - gem 'parallel', '<= 1.19.2' - gem 'rubocop', '<= 0.81.0' - gem 'rubocop-performance', '<= 1.5.2', :require => nil - gem 'simplecov' -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/Gemfile.lock b/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/Gemfile.lock deleted file mode 100644 index 22fe1a9..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/Gemfile.lock +++ /dev/null @@ -1,79 +0,0 @@ -PATH - remote: . - specs: - claide (1.1.0) - -GEM - remote: https://rubygems.org/ - specs: - ast (2.4.2) - bacon (1.2.0) - colored (1.2) - docile (1.1.5) - ffi (1.14.2) - jaro_winkler (1.5.4) - json (2.5.1) - kicker (3.0.0) - listen (~> 1.3.0) - notify (~> 0.5.2) - listen (1.3.1) - rb-fsevent (>= 0.9.3) - rb-inotify (>= 0.9) - rb-kqueue (>= 0.2) - metaclass (0.0.4) - mocha (1.1.0) - metaclass (~> 0.0.1) - mocha-on-bacon (0.2.2) - mocha (>= 0.13.0) - multi_json (1.10.1) - notify (0.5.2) - parallel (1.19.2) - parser (3.1.0.0) - ast (~> 2.4.1) - prettybacon (0.0.2) - bacon (~> 1.2) - rainbow (3.0.0) - rake (10.3.2) - rb-fsevent (0.9.4) - rb-inotify (0.9.5) - ffi (>= 0.5.0) - rb-kqueue (0.2.3) - ffi (>= 0.5.0) - rexml (3.2.5) - rubocop (0.81.0) - jaro_winkler (~> 1.5.1) - parallel (~> 1.10) - parser (>= 2.7.0.1) - rainbow (>= 2.2.2, < 4.0) - rexml - ruby-progressbar (~> 1.7) - unicode-display_width (>= 1.4.0, < 2.0) - rubocop-performance (1.5.2) - rubocop (>= 0.71.0) - ruby-progressbar (1.11.0) - simplecov (0.9.1) - docile (~> 1.1.0) - multi_json (~> 1.0) - simplecov-html (~> 0.8.0) - simplecov-html (0.8.0) - unicode-display_width (1.8.0) - -PLATFORMS - ruby - -DEPENDENCIES - bacon - claide! - colored - json (< 3) - kicker - mocha-on-bacon - parallel (<= 1.19.2) - prettybacon - rake - rubocop (<= 0.81.0) - rubocop-performance (<= 1.5.2) - simplecov - -BUNDLED WITH - 2.3.4 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/LICENSE b/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/LICENSE deleted file mode 100644 index 7c1df53..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -Copyright (c) 2011 - 2012 Eloy Durán -Copyright (c) 2012 Fabio Pelosin - -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/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/README.md b/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/README.md deleted file mode 100644 index f4ed63d..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/README.md +++ /dev/null @@ -1,115 +0,0 @@ -# Hi, I’m Claide, your command-line tool aide. - -[![Build Status](https://img.shields.io/github/workflow/status/CocoaPods/claide/ci)](https://github.com/CocoaPods/claide/actions) -[![Gem Version](https://img.shields.io/gem/v/claide)](https://rubygems.org/gems/claide) - -I was born out of a need for a _simple_ option and command parser, while still -providing an API that allows you to quickly create a full featured command-line -interface. - -## Install - -``` -$ [sudo] gem install claide -``` - - -## Usage - -For full documentation, on the API of CLAide, visit [rubydoc.info][docs]. - - -### Argument handling - -At its core, a library, such as myself, needs to parse the parameters specified -by the user. - -Working with parameters is done through the `CLAide::ARGV` class. It takes an -array of parameters and parses them as either flags, options, or arguments. - -| Parameter | Description | -| :---: | :---: | -| `--milk`, `--no-milk` | A boolean ‘flag’, which may be negated. | -| `--sweetener=honey` | An ‘option’ consists of a key, a ‘=’, and a value. | -| `tea` | An ‘argument’ is just a value. | - - -Accessing flags, options, and arguments, with the following methods, will also -remove the parameter from the remaining unprocessed parameters. - -```ruby -argv = CLAide::ARGV.new(['tea', '--no-milk', '--sweetener=honey']) -argv.shift_argument # => 'tea' -argv.shift_argument # => nil -argv.flag?('milk') # => false -argv.flag?('milk') # => nil -argv.option('sweetener') # => 'honey' -argv.option('sweetener') # => nil -``` - - -In case the requested flag or option is not present, `nil` is returned. You can -specify a default value to be used as the optional second method parameter: - -```ruby -argv = CLAide::ARGV.new(['tea']) -argv.flag?('milk', true) # => true -argv.option('sweetener', 'sugar') # => 'sugar' -``` - - -Unlike flags and options, accessing all of the arguments can be done in either -a preserving or mutating way: - -```ruby -argv = CLAide::ARGV.new(['tea', 'coffee']) -argv.arguments # => ['tea', 'coffee'] -argv.arguments! # => ['tea', 'coffee'] -argv.arguments # => [] -``` - - -### Command handling - -Commands are actions that a tool can perform. Every command is represented by -its own command class. - -Commands may be nested, in which case they inherit from the ‘super command’ -class. Some of these nested commands may not actually perform any work -themselves, but are rather used as ‘super commands’ _only_, in which case they -are ‘abtract commands’. - -Running commands is typically done through the `CLAide::Command.run(argv)` -method, which performs the following three steps: - -1. Parses the given parameters, finds the command class matching the parameters, - and instantiates it with the remaining parameters. It’s each nested command - class’ responsibility to remove the parameters it handles from the remaining - parameters, _before_ calling the `super` implementation. - -2. Asks the command instance to validate its parameters, but only _after_ - calling the `super` implementation. The `super` implementation will show a - help banner in case the `--help` flag is specified, not all parameters were - removed from the parameter list, or the command is an abstract command. - -3. Calls the `run` method on the command instance, where it may do its work. - -4. Catches _any_ uncaught exception and shows it to user in a meaningful way. - * A `Help` exception triggers a help banner to be shown for the command. - * A exception that includes the `InformativeError` module will show _only_ - the message, unless disabled with the `--verbose` flag; and in red, - depending on the color configuration. - * Any other type of exception will be passed to `Command.report_error(error)` - for custom error reporting (such as the one in [CocoaPods][report-error]). - -In case you want to call commands from _inside_ other commands, you should use -the `CLAide::Command.parse(argv)` method to retrieve an instance of the command -and call `run` on it. Unless you are using user-supplied parameters, there -should not be a need to validate the parameters. - -See the [example][example] for a illustration of how to define commands. - - -[docs]: http://www.rubydoc.info/github/CocoaPods/CLAide/index -[example]: https://github.com/CocoaPods/CLAide/blob/master/examples/make.rb -[report-error]: https://github.com/CocoaPods/CocoaPods/blob/054fe5c861d932219ec40a91c0439a7cfc3a420c/lib/cocoapods/command.rb#L36 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/Rakefile b/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/Rakefile deleted file mode 100644 index dc22070..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/Rakefile +++ /dev/null @@ -1,57 +0,0 @@ -# encoding: utf-8 - -#-- Bootstrap --------------------------------------------------------------# - -desc 'Initializes your working copy to run the specs' -task :bootstrap do - if system('which bundle') - title 'Installing gems' - sh 'bundle install' - else - $stderr.puts "\033[0;31m" \ - "[!] Please install the bundler gem manually:\n" \ - ' $ [sudo] gem install bundler' \ - "\e[0m" - exit 1 - end -end - -begin - require 'bundler/gem_tasks' - task :default => :spec - - #-- Specs ------------------------------------------------------------------# - - desc 'Run specs' - task :spec do - title 'Running Unit Tests' - files = FileList['spec/**/*_spec.rb'].shuffle.join(' ') - sh "bundle exec bacon #{files}" - - Rake::Task['rubocop'].invoke - end - - #-- Rubocop ----------------------------------------------------------------# - - desc 'Check code against RuboCop rules' - task :rubocop do - sh 'bundle exec rubocop' - end - -rescue LoadError - $stderr.puts "\033[0;31m" \ - '[!] Some Rake tasks haven been disabled because the environment' \ - ' couldn’t be loaded. Be sure to run `rake bootstrap` first.' \ - "\e[0m" -end - -#-- Helpers ------------------------------------------------------------------# - -def title(title) - cyan_title = "\033[0;36m#{title}\033[0m" - puts - puts '-' * 80 - puts cyan_title - puts '-' * 80 - puts -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/claide.gemspec b/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/claide.gemspec deleted file mode 100644 index 1f298d3..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/claide-1.1.0/claide.gemspec +++ /dev/null @@ -1,23 +0,0 @@ -# -*- encoding: utf-8 -*- -$:.unshift File.expand_path('../lib', __FILE__) -require File.expand_path('../lib/claide/gem_version', __FILE__) - -Gem::Specification.new do |s| - s.name = "claide" - s.version = CLAide::VERSION - s.license = "MIT" - s.email = ["eloy.de.enige@gmail.com", "fabiopelosin@gmail.com"] - s.homepage = "https://github.com/CocoaPods/CLAide" - s.authors = ["Eloy Duran", "Fabio Pelosin"] - - s.summary = "A small command-line interface framework." - - s.files = `git ls-files -z`.split("\0").reject { |f| f =~ /\A(spec|examples)/i } - - ## Make sure you can build the gem on older versions of RubyGems too: - s.rubygems_version = "1.6.2" - s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= - s.specification_version = 3 if s.respond_to? :specification_version - - s.required_ruby_version = ">= 2.3.0" -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-1.12.1/CHANGELOG.md b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-1.12.1/CHANGELOG.md deleted file mode 100644 index 9e2f258..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-1.12.1/CHANGELOG.md +++ /dev/null @@ -1,7920 +0,0 @@ -# Installation & Update - -To install or update CocoaPods see this [guide](https://guides.cocoapods.org/using/index.html). - -To install release candidates run `[sudo] gem install cocoapods --pre` - -## 1.12.1 (2023-04-18) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Xcode 14.3 fix: Pass the -f option when resolving the path to the symlinked source. - [Chris Vasselli](https://github.com/chrisvasselli) - [#11828](https://github.com/CocoaPods/CocoaPods/pull/11828) - [#11808](https://github.com/CocoaPods/CocoaPods/issues/11808) - -* Fix typo in validation for `--validation-dir` help message - [Austin Evans](https://github.com/ajevans99) - [#11857](https://github.com/CocoaPods/CocoaPods/issues/11857) - -# Xcode 14.3 fix: `pod lib lint` warning generation from main.m. - [Paul Beusterien](https://github.com/paulb777) - [#11846](https://github.com/CocoaPods/CocoaPods/issuess/11846) - -## 1.12.0 (2023-02-27) - -##### Enhancements - -* Add ability to specify the `validation-dir` during `lint`. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#11773](https://github.com/CocoaPods/CocoaPods/pull/11773) - -* Correctly handle `.docc` documentation in source_files. - [haifengkao](https://github.com/haifengkao) - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#11438](https://github.com/CocoaPods/CocoaPods/pull/11438) - [#10885](https://github.com/CocoaPods/CocoaPods/issues/10885) - -* Re-use the same path lists for pods that share the same root. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#11417](https://github.com/CocoaPods/CocoaPods/pull/11417) - -* Integrate `parallelizable` scheme DSL option. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#11399](https://github.com/CocoaPods/CocoaPods/pull/11399) - -* Use `${DEVELOPMENT_LANGUAGE}` as the default `CFBundleDevelopmentRegion` value in any generated `Info.plist`. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#10950](https://github.com/CocoaPods/CocoaPods/pull/10950) - -* Fix setting `LD_RUNTIME_SEARCH_PATHS` for aggregate targets that include dynamic xcframeworks. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#11158](https://github.com/CocoaPods/CocoaPods/pull/11158) - -* Add method for formatting licenses for acknowledgements generation. - [Raihaan Shouhell](https://github.com/res0nance) - [#10940](https://github.com/CocoaPods/CocoaPods/pull/10940) - -* Add the ability to download pods in parallel - [Seth Friedman](https://github.com/sethfri) - [#11232](https://github.com/CocoaPods/CocoaPods/pull/11232) - -* Include subprojects in the plugin post-install hook context - [Eric Amorde](https://github.com/amorde) - [#11224](https://github.com/CocoaPods/CocoaPods/pull/11224) - -* Ensure the order of slices passed to the `install_xcframework` script (in the "Copy XCFrameworks" script build phase) is stable. - [Olivier Halligon](https://github.com/AliSoftware) - [#11707](https://github.com/CocoaPods/CocoaPods/pull/11707) - -##### Bug Fixes - -* Fix incremental installation when a development pod is deleted. - [John Szumski](https://github.com/jszumski) - [#11438](https://github.com/CocoaPods/CocoaPods/pull/11681) - -* Clean sandbox when a pod switches from remote to local. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#11213](https://github.com/CocoaPods/CocoaPods/pull/11213) - -* Run post install hooks when "skip Pods.xcodeproj generation" option is set - [Elton Gao](https://github.com/gyfelton) - [#11073](https://github.com/CocoaPods/CocoaPods/pull/11073) - -* Change minimal required version of ruby-macho to 2.3.0. - [xuzhongping](https://github.com/xuzhongping) - [#10390](https://github.com/CocoaPods/CocoaPods/issues/10390) - -* Add .gitignores to the banana and snake fixtures - [Seth Friedman](https://github.com/sethfri) - [#11235](https://github.com/CocoaPods/CocoaPods/pull/11235) - -* Fix publishing podspecs with watchOS support on Xcode 14 - [Justin Martin](https://github.com/justinseanmartin) - [#11660](https://github.com/CocoaPods/CocoaPods/pull/11660) - -## 1.11.3 (2022-03-16) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Fix script breaking when attempting to print a warning. - [Igor Makarov](https://github.com/igor-makarov) - [#11251](https://github.com/CocoaPods/CocoaPods/issues/11251) - -* Do not consider podspec_repo when analying sandbox for changes. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#10985](https://github.com/CocoaPods/CocoaPods/pull/10985) - -* Rewrite XCFramework slice selection using plist metadata. - [Igor Makarov](https://github.com/igor-makarov) - [#11229](https://github.com/CocoaPods/CocoaPods/pull/11229) - -* Fix setting `LD_RUNTIME_SEARCH_PATHS` for aggregate targets that include dynamic xcframeworks. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#11158](https://github.com/CocoaPods/CocoaPods/pull/11158) - -* Add catch for YAML syntax error to prevent crash in `cdn_url?` check. - [Kanstantsin Shautsou](https://github.com/KostyaSha) - [#11010](https://github.com/CocoaPods/CocoaPods/issues/11010) - -* Fix static Swift XCFramework import paths. - [Igor Makarov](https://github.com/igor-makarov) - [#11058](https://github.com/CocoaPods/CocoaPods/issues/10058) - [#11093](https://github.com/CocoaPods/CocoaPods/pull/11093) - -## 1.11.2 (2021-09-13) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Do not validate modular header dependencies for pre-built Swift pods. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#10912](https://github.com/CocoaPods/CocoaPods/issues/10912) - - -## 1.11.1 (2021-09-12) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Handle spec repo urls with user info when determining if they are CDN. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#10941](https://github.com/CocoaPods/CocoaPods/issues/10941) - -* Set `INFOPLIST_FILE` build setting to `$(SRCROOT)/App/App-Info.plist` during lint. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#10927](https://github.com/CocoaPods/CocoaPods/issues/10927) - -* Set `PRODUCT_BUNDLE_IDENTIFIER` for generated app during lint. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#10933](https://github.com/CocoaPods/CocoaPods/issues/10933) - - -## 1.11.0 (2021-09-01) - -##### Enhancements - -* None. - -##### Bug Fixes - -* None. - - -## 1.11.0.rc.1 (2021-08-25) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Correctly process multiple `xcframeworks` a pod provides. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#10378](https://github.com/CocoaPods/CocoaPods/issues/10378) - - -## 1.11.0.beta.2 (2021-08-11) - -##### Enhancements - -* Integrate ODR categories into projects. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#10855](https://github.com/CocoaPods/CocoaPods/pull/10855) - -##### Bug Fixes - -* Pass correct paths for `select_slice` method. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#10430](https://github.com/CocoaPods/CocoaPods/issues/10430) - - -## 1.11.0.beta.1 (2021-08-09) - -##### Enhancements - -* Add support for integrating on demand resources. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [JunyiXie](https://github.com/JunyiXie) - [#9606](https://github.com/CocoaPods/CocoaPods/issues/9606) - [#10845](https://github.com/CocoaPods/CocoaPods/pull/10845) - -* Integrate `project_header_files` specified by specs. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#9820](https://github.com/CocoaPods/CocoaPods/issues/9820) - -* Mark RealityComposer-projects (`.rcproject`) files defined in resources for compilation. - [Hendrik von Prince](https://github.com/parallaxe) - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#10793](https://github.com/CocoaPods/CocoaPods/pull/10793) - -* Integrate test specs and app specs of pre-built pods. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#10795](https://github.com/CocoaPods/CocoaPods/pull/10795) - -* Add support for `before_headers` and `after_headers` script phase DSL. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#10770](https://github.com/CocoaPods/CocoaPods/issues/10770) - -* Fix touch on a missing directory for dSYM copy phase script. - [alvarollmenezes](https://github.com/alvarollmenezes) - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#10488](https://github.com/CocoaPods/CocoaPods/issues/10488) - -* Check the podfile sources and plugin sources when printing warnings without explicitly using the master source. - [gonghonglou](https://github.com/gonghonglou) - [#10764](https://github.com/CocoaPods/CocoaPods/pull/10764) - -* Use relative paths in copy dsyms script. - [Mickey Knox](https://github.com/knox) - [#10583](https://github.com/CocoaPods/CocoaPods/pull/10583) - -* Use `OpenURI.open_uri` instead. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#10597](https://github.com/CocoaPods/CocoaPods/issues/10597) - -* Set minimum supported Ruby version to 2.6. - [Igor Makarov](https://github.com/igor-makarov) - [#10412](https://github.com/CocoaPods/CocoaPods/pull/10412) - -* Improve compatibility with ActiveSupport 6 - [Jun Jiang](https://github.com/jasl) - [#10364](https://github.com/CocoaPods/CocoaPods/pull/10364) - -* Add a `pre_integrate_hook` API - [dcvz](https://github.com/dcvz) - [#9935](https://github.com/CocoaPods/CocoaPods/pull/9935) - -* Rewrite the only place dependent on `typhoeus`. - [Jun Jiang](https://github.com/jasl), [Igor Makarov](https://github.com/igor-makarov) - [#10346](https://github.com/CocoaPods/CocoaPods/pull/10346) - -* Add a `--update-sources` option to `pod repo push` so one can ensure sources are up-to-date. - [Elton Gao](https://github.com/gyfelton) - [Justin Martin](https://github.com/justinseanmartin) - -* Installing a local (`:path`) pod that defines script phases will no longer - produce warnings. - [Samuel Giddins](https://github.com/segiddins) - -* Allow building app & test spec targets that depend on a library that uses - Swift without requiring an empty Swift file be present. - [Samuel Giddins](https://github.com/segiddins) - -* Add flag to ignore prerelease versions when reporting latest version for outdated pods. - [cltnschlosser](https://github.com/cltnschlosser) - [#9916](https://github.com/CocoaPods/CocoaPods/pull/9916) - -* Add possibility to skip modulemap generation - [till0xff](https://github.com/till0xff) - [#10235](https://github.com/CocoaPods/CocoaPods/issues/10235) - -* Add a `--version` option to `pod spec cat` and `pod spec which` for listing the podspec of a specific version - [pietbrauer](https://github.com/pietbrauer) - [#10609](https://github.com/CocoaPods/CocoaPods/pull/10609) - -##### Bug Fixes - -* Fix resource variant groups in static frameworks - [Igor Makarov](https://github.com/igor-makarov) - [#10834](https://github.com/CocoaPods/CocoaPods/pull/10834) - [#10605](https://github.com/CocoaPods/CocoaPods/issues/10605) - -* Fix adding embed frameworks script phase to unit test targets if xcframeworks are present. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#10652](https://github.com/CocoaPods/CocoaPods/issues/10652) - -* Remove unused `install_xcframework_library` code. - [Gio Lodi](https://github.com/mokagio) - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#10831](https://github.com/CocoaPods/CocoaPods/pull/10831) - -* Validate vendored library names after they have been expanded. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#10832](https://github.com/CocoaPods/CocoaPods/pull/10832) - -* Place frameworks from xcframeworks into a unique folder name to avoid duplicate outputs. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#10106](https://github.com/CocoaPods/CocoaPods/issues/10106) - -* Update pod in Pods folder when changing the pod from branch to version in Podfie. - [gonghonglou](https://github.com/gonghonglou) - [#10825](https://github.com/CocoaPods/CocoaPods/pull/10825) - -* Bump addressable dependency to 2.8. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#10802](https://github.com/CocoaPods/CocoaPods/issues/10802) - -* Dedup bcsymbolmap paths found from multiple vendored frameworks. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#10373](https://github.com/CocoaPods/CocoaPods/issues/10373) - -* Correctly filter dependencies for pod variants across different platforms. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#10777](https://github.com/CocoaPods/CocoaPods/issues/10777) - -* Generate default `Info.plist` for consumer app during validation. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#8570](https://github.com/CocoaPods/CocoaPods/issues/8570) - -* Fix lint subspec error when the name of subspec start with the pod name. - [XianpuMeng](https://github.com/XianpuMeng) - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#9906](https://github.com/CocoaPods/CocoaPods/issues/9906) - -* Update `ruby-macho` gem version to support 1.x and 2.x. - [Eric Chamberlain](https://github.com/PeqNP) - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#10390](https://github.com/CocoaPods/CocoaPods/issues/10390) - -* Respect `--configuration` option when analyzing via `pod lib lint --analyze`. - [Jenn Magder](https://github.com/jmagman) - [#10476](https://github.com/CocoaPods/CocoaPods/issues/10476) - -* Do not add dependencies to 'Link Binary With Libraries' phase. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#10133](https://github.com/CocoaPods/CocoaPods/pull/10133) - -* Ensure cache integrity on concurrent installations. - [Erik Blomqvist](https://github.com/codiophile) - [#10013](https://github.com/CocoaPods/CocoaPods/issues/10013) - -* Force a clean install if installation options change. - [Sebastian Shanus](https://github.com/sebastianv1) - [#10016](https://github.com/CocoaPods/CocoaPods/pull/10016) - -* Correctly detect that a prebuilt pod uses Swift. - [Elton Gao](https://github.com/gyfelton) - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#8649](https://github.com/CocoaPods/CocoaPods/issues/8649) - -* fix: ensure cached spec path uniq - [SolaWing](https://github.com/SolaWing) - [#10231](https://github.com/CocoaPods/CocoaPods/issues/10231) - -* Set `knownRegions` on generated projects with localized resources to prevent Xcode from re-saving projects to disk. - [Eric Amorde](https://github.com/amorde) - [#10290](https://github.com/CocoaPods/CocoaPods/pull/10290) - -* Serialize schemes that do not need to be rewritten by Xcode. - [Samuel Giddins](https://github.com/segiddins) - - -## 1.10.2 (2021-07-28) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Fix errors when archiving a Catalyst app which depends on a pod which uses `header_mappings_dir`. - [Thomas Goyne](https://github.com/tgoyne) - [#10224](https://github.com/CocoaPods/CocoaPods/pull/10224) - -* Fix missing `-ObjC` for static XCFrameworks - take 2 - [Paul Beusterien](https://github.com/paulb777) - [#10459](https://github.com/CocoaPods/CocoaPods/issuess/10459) - -* Change URL validation failure to a note - [Paul Beusterien](https://github.com/paulb777) - [#10291](https://github.com/CocoaPods/CocoaPods/issues/10291) - - -## 1.10.1 (2021-01-07) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Fix library name in LD `-l` flags for XCFrameworks containing libraries - [Wes Campaigne](https://github.com/Westacular) - [#10165](https://github.com/CocoaPods/CocoaPods/issues/10165) - -* Fix file extension replacement for resource paths when using static frameworks. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#10206](https://github.com/CocoaPods/CocoaPods/issues/10206) - -* Fix processing of xcassets resources when pod target is static framework - [Federico Trimboli](https://github.com/fedetrim) - [#10175](https://github.com/CocoaPods/CocoaPods/pull/10175) - [#10170](https://github.com/CocoaPods/CocoaPods/issues/10170) - -* Fix missing `-ObjC` for static XCFrameworks - [Paul Beusterien](https://github.com/paulb777) - [#10234](https://github.com/CocoaPods/CocoaPods/pull/10234) - - -## 1.10.0 (2020-10-20) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Generate the correct LD `-l` flags for XCFrameworks containing libraries - [Wes Campaigne](https://github.com/Westacular) - [#10071](https://github.com/CocoaPods/CocoaPods/issues/10071) - -* Add support for automatically embedding XCFramework debug symbols for XCFrameworks generated with Xcode 12 - [johntmcintosh](https://github.com/johntmcintosh) - [#10111](https://github.com/CocoaPods/CocoaPods/issues/10111) - -## 1.10.0.rc.1 (2020-09-15) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Fix XCFramework slice selection - [lowip](https://github.com/lowip) - [#10026](https://github.com/CocoaPods/CocoaPods/issues/10026) - -* Honor test spec deployment target during validation. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#9999](https://github.com/CocoaPods/CocoaPods/pull/9999) - -* Ensure that incremental installation is able to set target dependencies for a - test spec that uses a custom `app_host_name` that is in a project that is not - regenerated. - [Samuel Giddins](https://github.com/segiddins) - - -## 1.10.0.beta.2 (2020-08-12) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Ensure that static frameworks are not embedded - [Bernard Gatt](https://github.com/BernardGatt) - [#9943](https://github.com/CocoaPods/CocoaPods/issues/9943) - -* Ensure that the non-compilable resource skipping in static frameworks happens only for the pod itself - [Igor Makarov](https://github.com/igor-makarov) - [#9922](https://github.com/CocoaPods/CocoaPods/pull/9922) - [#9920](https://github.com/CocoaPods/CocoaPods/issues/9920) - - -## 1.10.0.beta.1 (2020-07-17) - -##### Breaking - -* Bump minimum Ruby version to 2.3.3 (included with macOS High Sierra) - [Eric Amorde](https://github.com/amorde) - [#9821](https://github.com/CocoaPods/CocoaPods/issues/9821) - -##### Enhancements - -* Add the App Clip product symbol to the list of products that need embedding. - [Igor Makarov](https://github.com/igor-makarov) - [#9882](https://github.com/CocoaPods/CocoaPods/pull/9882) - -* Allow gem to run as root when passing argument flag `--allow-root` - [Sean Reinhardt](https://github.com/seanreinhardtapps) - [#8929](https://github.com/CocoaPods/CocoaPods/issues/8929) - -* Warn users to delete the master specs repo if its not explicitly used. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#9871](https://github.com/CocoaPods/CocoaPods/pull/9871) - -* Use User Project's compatibilityVersion instead of objectVersion when - deciding when to use xcfilelists. - [Sean Reinhardt](https://github.com/seanreinhardtapps) - [#9140](https://github.com/CocoaPods/CocoaPods/issues/9140) - -* add a `--configuration` option to `pod lib lint` and `pod spec lint`. - [Gereon Steffens](https://github.com/gereons) - [#9686](https://github.com/CocoaPods/CocoaPods/issues/9686) - -* Add a `post_integrate_hook` API - [lucasmpaim](https://github.com/lucasmpaim) - [#7432](https://github.com/CocoaPods/CocoaPods/issues/7432) - -* Set the `BUILD_LIBRARY_FOR_DISTRIBUTION` build setting if integrating with a target that has the setting set to `YES`. - [Juanjo López](https://github.com/juanjonol) - [#9232](https://github.com/CocoaPods/CocoaPods/issues/9232) - -* Option to lint a specified set of test_specs - [Paul Beusterien](https://github.com/paulb777) - [#9392](https://github.com/CocoaPods/CocoaPods/pull/9392) - -* Add `--use-static-frameworks` lint option - [Paul Beusterien](https://github.com/paulb777) - [#9632](https://github.com/CocoaPods/CocoaPods/pull/9632) - -* Exclude the local spec-repos directory from Time Machine Backups. - [Jakob Krigovsky](https://github.com/sonicdoe) - [#8308](https://github.com/CocoaPods/CocoaPods/issues/8308) - -##### Bug Fixes - -* Override Xcode 12 default for erroring on quoted imports in umbrellas. - [Paul Beusterien](https://github.com/paulb777) - [#9902](https://github.com/CocoaPods/CocoaPods/issues/9902) - -* Remove bitcode symbol maps from embedded framework bundles - [Eric Amorde](https://github.com/amorde) - [#9681](https://github.com/CocoaPods/CocoaPods/issues/9681) - -* Prevent "source changed" message for every version change when using trunk source - [cltnschlosser](https://github.com/cltnschlosser) - [#9865](https://github.com/CocoaPods/CocoaPods/issues/9865) - -* When pod target is a static framework, save time by copying compiled resources - [Igor Makarov](https://github.com/igor-makarov) - [#9441](https://github.com/CocoaPods/CocoaPods/pull/9441) - -* Re-implement `bcsymbolmap` copying to avoid duplicate outputs. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [mplorentz](https://github.com/mplorentz) - [#9734](https://github.com/CocoaPods/CocoaPods/pull/9734) - -* Fix Xcode 11 warning when setting Bundle Identifier in `info_plist` - [Sean Reinhardt](https://github.com/seanreinhardtapps) - [#9536](https://github.com/CocoaPods/CocoaPods/issues/9536) - -* Fix `incompatible encoding regexp match` for linting non-ascii pod name - [banjun](https://github.com/banjun) - [#9765](https://github.com/CocoaPods/CocoaPods/issues/9765) - [#9776](https://github.com/CocoaPods/CocoaPods/pull/9776) - -* Fix crash when targets missing in Podfile - [Paul Beusterien](https://github.com/paulb777) - [#9745](https://github.com/CocoaPods/CocoaPods/pull/9745) - -* Fix adding developer library search paths during pod validation. - [Nick Entin](https://github.com/NickEntin) - [#9736](https://github.com/CocoaPods/CocoaPods/pull/9736) - -* Fix an issue that caused multiple xcframework scripts to produce the same output files - [Eric Amorde](https://github.com/amorde) - [#9670](https://github.com/CocoaPods/CocoaPods/issues/9670) - [#9720](https://github.com/CocoaPods/CocoaPods/pull/9720) - -* Fix an issue preventing framework user targets with an xcframework dependency from building successfully - [Eric Amorde](https://github.com/amorde) - [#9525](https://github.com/CocoaPods/CocoaPods/issues/9525) - [#9720](https://github.com/CocoaPods/CocoaPods/pull/9720) - -* Fix an issue preventing xcframeworks that wrapped static libraries from linking successfully - [Eric Amorde](https://github.com/amorde) - [#9528](https://github.com/CocoaPods/CocoaPods/issues/9528) - [#9720](https://github.com/CocoaPods/CocoaPods/pull/9720) - -* Fix setting `swift_version` when deduplicate targets is turned off. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#9689](https://github.com/CocoaPods/CocoaPods/pull/9689) - -* Honor prefix_header_file=false for subspecs - [Paul Beusterien](https://github.com/paulb777) - [#9687](https://github.com/CocoaPods/CocoaPods/pull/9687) - -* Do not clean user projects from sandbox. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#9683](https://github.com/CocoaPods/CocoaPods/pull/9683) - -* Fix mapping of resource paths for app specs. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#9676](https://github.com/CocoaPods/CocoaPods/pull/9676) - -* When preserving pod paths, preserve ALL the paths - [Igor Makarov](https://github.com/igor-makarov) - [#9483](https://github.com/CocoaPods/CocoaPods/pull/9483) - -* Re-implement `dSYM` copying and stripping to avoid duplicate outputs. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#9185](https://github.com/CocoaPods/CocoaPods/issues/9185) - -* Add support for running tests through the scheme of the app spec host of a test spec - [Eric Amorde](https://github.com/amorde) - [#9332](https://github.com/CocoaPods/CocoaPods/issues/9332) - -* Fix an issue that prevented variables in test bundle scheme settings from expanding - [Eric Amorde](https://github.com/amorde) - [#9539](https://github.com/CocoaPods/CocoaPods/pull/9539) - -* Fix project path handling issue that caused cmake projects to be incorrect - [Paul Beusterien](https://github.com/paulb777) - [Andrew](https://github.com/mad-rain) - [#6268](https://github.com/CocoaPods/CocoaPods/pull/6268) - -* Set `Missing Localizability` setting to `'YES'` to prevent warnings in Xcode 11 - [Eric Amorde](https://github.com/amorde) - [#9612](https://github.com/CocoaPods/CocoaPods/pull/9612) - -* Don't crash on non UTF-8 error message - [Kenji KATO](https://github.com/katoken-0215) - [#9706](https://github.com/CocoaPods/CocoaPods/pull/9706) - -* Fix XCFramework slice selection when having more archs in slice than requested with $ARCHS - [jerbob92](https://github.com/jerbob92) - [#9790](https://github.com/CocoaPods/CocoaPods/pull/9790) - -* Don't add app spec dependencies to the parent library's target in Xcode, - which was happening when the dependency's project was not being regenerated - due to incremental installation. - [segiddins][https://github.com/segiddins] - -* Add the trunk repo to the default `sources` for the `repo push` command - [Elf Sundae](https://github.com/ElfSundae) - [#9840](https://github.com/CocoaPods/CocoaPods/pull/9840) - -## 1.9.3 (2020-05-29) - -##### Enhancements - -* None. - -##### Bug Fixes - -* None. - - -## 1.9.2 (2020-05-22) - -##### Enhancements - -* None. - -##### Bug Fixes - -* None. - - -## 1.9.1 (2020-03-09) - -##### Enhancements - -##### Bug Fixes - -* Apply correct `SYSTEM_FRAMEWORK_SEARCH_PATHS` for `XCTUnwrap` fix. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#9579](https://github.com/CocoaPods/CocoaPods/pull/9579) - -* Fix an issue that caused a build failure with vendored XCFrameworks on macOS - [Eric Amorde](https://github.com/amorde) - [#9572](https://github.com/CocoaPods/CocoaPods/issues/9572) - -* Fix an issue that prevented the correct XCFramework slice from being selected for watchOS extensions - [Eric Amorde](https://github.com/amorde) - [#9569](https://github.com/CocoaPods/CocoaPods/issues/9569) - - -## 1.9.0 (2020-02-25) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Also apply Xcode 11 `XCTUnwrap` fix to library and framework targets that weakly link `XCTest`. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#9518](https://github.com/CocoaPods/CocoaPods/pull/9518) - -* Fix dSYM handling for XCFrameworks. - [Eric Amorde](https://github.com/amorde) - [#9530](https://github.com/CocoaPods/CocoaPods/issues/9530) - -## 1.9.0.beta.3 (2020-02-04) - -##### Enhancements - -* PathList optimizations related to file system reads. - [manuyavuz](https://github.com/manuyavuz) - [#9428](https://github.com/CocoaPods/CocoaPods/pull/9428) - -##### Bug Fixes - -* Apply Xcode 11 `XCTUnwrap` fix to library and framework targets. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#9500](https://github.com/CocoaPods/CocoaPods/pull/9500) - -* Fix resources script when building a project from a symlink. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#9423](https://github.com/CocoaPods/CocoaPods/issues/9423) - -* Fix `pod install` crash on projects with atypical configuration names. - [Paul Beusterien](https://github.com/paulb777) - [#9465](https://github.com/CocoaPods/CocoaPods/pull/9465) - -* Fix an issue that caused iOS archives to be invalid when including a vendored XCFramework - [Eric Amorde](https://github.com/amorde) - [#9458](https://github.com/CocoaPods/CocoaPods/issues/9458) - -* Fix a bug where an incremental install missed library resources. - [Igor Makarov](https://github.com/igor-makarov) - [#9431](https://github.com/CocoaPods/CocoaPods/pull/9431) - -* Fix an issue that caused an incorrect warning to be emitted for CLI targets with static libraries - [Eric Amorde](https://github.com/amorde) - [#9498](https://github.com/CocoaPods/CocoaPods/issues/9498) - -## 1.9.0.beta.2 (2019-12-17) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Fix validator to properly integration project during `lint`. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#9416](https://github.com/CocoaPods/CocoaPods/pull/9416) - -## 1.9.0.beta.1 (2019-12-16) - -##### Enhancements - -* Support for scheme code coverage. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#8921](https://github.com/CocoaPods/CocoaPods/issues/8921) - -* Support Swift version variants. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#9230](https://github.com/CocoaPods/CocoaPods/pull/9230) - -* Configure dependencies per configuration. - [Samuel Giddins](https://github.com/segiddins) - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#9149](https://github.com/CocoaPods/CocoaPods/pull/9149) - -* Include Podfile Plugin changes for incremental installation. - [Sebastian Shanus](https://github.com/sebastianv1) - [#9147](https://github.com/CocoaPods/CocoaPods/pull/9147) - -* Integrate `use_frameworks!` linkage DSL. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#9099](https://github.com/CocoaPods/CocoaPods/issues/9099) - -* Add support for integrating dependency file in user script phases. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#9082](https://github.com/CocoaPods/CocoaPods/issues/9082) - -* Add support for XCFrameworks using the `vendored_frameworks` Podspec DSL. - [Eric Amorde](https://github.com/amorde) - [#9148](https://github.com/CocoaPods/CocoaPods/issues/9148) - -##### Bug Fixes - -* Move `run_podfile_post_install_hooks` call to execute right before projects are saved. - [Yusuf Sobh](https://github.com/yusufoos) - [#9379](https://github.com/CocoaPods/CocoaPods/issues/9379) - -* Do not apply header mapping copy if the spec does not provide a header mappings dir. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#9308](https://github.com/CocoaPods/CocoaPods/issues/9308) - -* Fix issue where workspace was missing user project references during incremental installation. - [Sebastian Shanus](https://github.com/sebastianv1) - [#9237](https://github.com/CocoaPods/CocoaPods/issues/9237) - -* Search in users xcconfig's for figuring out when to set `APPLICATION_EXTENSION_API_ONLY`. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#9233](https://github.com/CocoaPods/CocoaPods/issues/9233) - -* Always generate a lockfile even if project integration is disabled. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#9288](https://github.com/CocoaPods/CocoaPods/issues/9288) - -* Fix incremental installation with plugins that include arguments with different ordering. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#9170](https://github.com/CocoaPods/CocoaPods/pull/9170) - -* Move custom `Copy Headers` script phase for header mappings before `Compile Sources`. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#9131](https://github.com/CocoaPods/CocoaPods/pull/9131) - -* Don't create a conflicting `LaunchScreen.storyboard` when an app spec contains a file - with that name in its `resources`. - [Samuel Giddins](https://github.com/segiddins) - - -## 1.8.4 (2019-10-16) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Do not crash if the repos dir is not setup. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#9216](https://github.com/CocoaPods/CocoaPods/issues/9216) - -## 1.8.3 (2019-10-04) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Fix crash when running on mounted filesystems - [Paul Beusterien](https://github.com/paulb777) - [#9200](https://github.com/CocoaPods/CocoaPods/pull/9200) - - -## 1.8.1 (2019-09-27) - -##### Enhancements - -* None. - -##### Bug Fixes - -* None. - - -## 1.8.0 (2019-09-23) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Include dependent vendored frameworks in linker flags - [Alex Coomans](https://github.com/drcapulet) - [#9045](https://github.com/CocoaPods/CocoaPods/pull/9045) - -* Correctly set deployment target for non library specs even if the root spec does not specify one. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#9153](https://github.com/CocoaPods/CocoaPods/pull/9153) - -* Make `APPLICATION_EXTENSION_API_ONLY` build setting not break when performing a cached incremental install. - [Igor Makarov](https://github.com/igor-makarov) - [#8967](https://github.com/CocoaPods/CocoaPods/issues/8967) - [#9141](https://github.com/CocoaPods/CocoaPods/issues/9141) - [#9142](https://github.com/CocoaPods/CocoaPods/pull/9142) - -## 1.8.0.beta.2 (2019-08-27) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Do not verify deployment target version during resolution for non library specs. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#9105](https://github.com/CocoaPods/CocoaPods/issues/9105) - -* Add `USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES` to all `.xcconfig`s - [Igor Makarov](https://github.com/igor-makarov) - [#8073](https://github.com/CocoaPods/CocoaPods/issues/8073) - [#9125](https://github.com/CocoaPods/CocoaPods/pull/9125) - [cocoapods-integration-specs#248](https://github.com/CocoaPods/cocoapods-integration-specs/pull/248) - -* Fix iOS app spec code signing. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#9110](https://github.com/CocoaPods/CocoaPods/issues/9110) - -* Add Apple watch device family to resource bundles built for WatchOS - [Aaron McDaniel](https://github.com/Spilly) - [#9075](https://github.com/CocoaPods/CocoaPods/issues/9075) - -## 1.8.0.beta.1 (2019-08-05) - -##### Enhancements - -* Allow Algolia search for CDNSource - [Igor Makarov](https://github.com/igor-makarov) - [#9015](https://github.com/CocoaPods/CocoaPods/issues/9015) - [#9046](https://github.com/CocoaPods/CocoaPods/pull/9046) - [Core#569](https://github.com/CocoaPods/Core/pull/569) - -* Using `repo push` now pushes to the current repo branch (`HEAD`) instead of `master` - [Jhonatan Avalos](https://github.com/baguio) - [#8630](https://github.com/CocoaPods/CocoaPods/pull/8630) - -* Add support for UI test specs with `test_type` value `:ui` - [Yavuz Nuzumlali](https://github.com/manuyavuz) - [#9002](https://github.com/CocoaPods/CocoaPods/pull/9002) - [Core#562](https://github.com/CocoaPods/Core/pull/562) - -* Replace git-based `MasterSource` with CDN-based `TrunkSource` - [Igor Makarov](https://github.com/igor-makarov) - [#8923](https://github.com/CocoaPods/CocoaPods/pull/8923) - [Core#552](https://github.com/CocoaPods/Core/pull/552) - -* Integrate a pod into a custom project name if specified. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) & [Sebastian Shanus](https://github.com/sebastianv1) - [#8939](https://github.com/CocoaPods/CocoaPods/pull/8939) - -* Performance optimization for large number of files related to cleaning sandbox directory during installation - [hovox](https://github.com/hovox) - [#8797](https://github.com/CocoaPods/CocoaPods/issues/8797) - -* Add support for Specification Info.plist DSL - [Eric Amorde](https://github.com/amorde) - [#8753](https://github.com/CocoaPods/CocoaPods/issues/8753) - [#3032](https://github.com/CocoaPods/CocoaPods/issues/3032) - -* Fix target definition display name for inhibit warnings message. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#8935](https://github.com/CocoaPods/CocoaPods/pull/8935) - -* Allow using an application defined by an app spec as the app host for a test spec. - [jkap](https://github.com/jkap) - [Samuel Giddins](https://github.com/segiddins) - [#8654](https://github.com/CocoaPods/CocoaPods/pull/8654) - -* Speed up dependency resolution when there are many requirements for the same pod - or many versions that do not satisfy the given requirements. - [Samuel Giddins](https://github.com/segiddins) - -* Add support for pods in abstract-only targets to be installed. - [Samuel Giddins](https://github.com/segiddins) - -* Emit a warning when attempting to integrate dynamic frameworks into command line tool targets - [Eric Amorde](https://github.com/amorde) - [#6493](https://github.com/CocoaPods/CocoaPods/issues/6493) - -* Always suggest `pod repo update` on dependency resolution conflict, - unless repo update was specifically requested. - [Artem Sheremet](https://github.com/dotdoom) - [#8768](https://github.com/CocoaPods/CocoaPods/pull/8768) - -* Set Default Module for Storyboards in resource bundle targets. - [James Treanor](https://github.com/jtreanor) - [#8890](https://github.com/CocoaPods/CocoaPods/pull/8890) - -* Print correct platform name when inferring target platform. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#8916](https://github.com/CocoaPods/CocoaPods/pull/8916) - -* Do not re-write sandbox files if they have not changed. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#8983](https://github.com/CocoaPods/CocoaPods/pull/8983) - -* Added option to skip Pods.xcodeproj generation - [Itay Brenner](https://github.com/itaybre) - [8872](https://github.com/CocoaPods/CocoaPods/pull/8872) - -##### Bug Fixes - -* Update symlink script to prevent duplicate files - [Alex Coomans](https://github.com/drcapulet) - [#9035](https://github.com/CocoaPods/CocoaPods/pull/9035) - -* Use correct `header_mappings_dir` for subspecs - [Alex Coomans](https://github.com/drcapulet) - [#9019](https://github.com/CocoaPods/CocoaPods/pull/9019) - -* Make CDNSource show up in `pod repo env` - [Igor Makarov](https://github.com/igor-makarov) - [#9016](https://github.com/CocoaPods/CocoaPods/pull/9016) - -* Fix regenerating aggregate targets for incremental installation. - [Sebastian Shanus](https://github.com/sebastianv1) - [#9009](https://github.com/CocoaPods/CocoaPods/pull/9009) - -* Fix heuristic for determining whether the source URL to be added is CDN - [Igor Makarov](https://github.com/igor-makarov) - [#9000](https://github.com/CocoaPods/CocoaPods/issues/9000) - [#8999](https://github.com/CocoaPods/CocoaPods/issues/8999) - -* Fix set `cache_root` from config file error - [tripleCC](https://github.com/tripleCC) - [#8515](https://github.com/CocoaPods/CocoaPods/issues/8515) - -* Set default build configurations for app / test specs when installing with - `integrate_targets: false`, ensuring the `Embed Frameworks` and - `Copy Resources` scripts will copy the necessary build artifacts. - [Samuel Giddins](https://github.com/segiddins) - -* No longer show a warning when using an optional include (`#include?`) to - include the Pods .xcconfig from the base .xcconfig file - [Rob Hudson](https://github.com/robtimp) - -* Remove stale podspecs from 'Local Podspecs' when installing non-local counterparts. - [Pär Strindevall](https://github.com/parski) - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#8914](https://github.com/CocoaPods/CocoaPods/pull/8914) - -* Fix inheriting search paths for test targets in `init` command. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#8868](https://github.com/CocoaPods/CocoaPods/issues/8868) - -* Allow detecting `SWIFT_VERSION` build settings from user targets when some - xcconfig files are missing. - [Samuel Giddins](https://github.com/segiddins) - -* Only return library itself as a framework path for library specs. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#9029](https://github.com/CocoaPods/CocoaPods/pull/9029) - -* Fix a bug that prevented dependencies in a plugin source from resolving - [Eric Amorde](https://github.com/amorde) - [#8540](https://github.com/CocoaPods/CocoaPods/issues/8540) - -* Store relative project and file paths in the incremental cache. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#9041](https://github.com/CocoaPods/CocoaPods/pull/9041) - -* Use correct deployment target for test specs and app specs. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#9040](https://github.com/CocoaPods/CocoaPods/pull/9040) - -* Allow overriding custom xcconfig entries set for compiling a library when - specifying an app or test spec. - [Samuel Giddins](https://github.com/segiddins) - -* Pass a non-browser user agent for social media validation - [Dov Frankel](https://github.com/abbeycode) - [CocoaPods/Core#571](https://github.com/CocoaPods/Core/pull/571) - [#9053](https://github.com/CocoaPods/Cocoapods/pull/9053) - [#9049](https://github.com/CocoaPods/CocoaPods/issues/9049) - -* Do not add CocoaPods script phases to targets that have no paths to embed. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#9069](https://github.com/CocoaPods/CocoaPods/pull/9069) - - -## 1.7.5 (2019-07-19) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Do not pass inhibit warnings compiler flags for Swift source files. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#9013](https://github.com/CocoaPods/CocoaPods/issues/9013) - - -## 1.7.4 (2019-07-09) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Handle scheme configuration for specs with unsupported platforms. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#8850](https://github.com/CocoaPods/CocoaPods/issues/8850) - - -## 1.7.3 (2019-06-28) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Honor the Swift version set by a dependency pod during lint. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#8940](https://github.com/CocoaPods/CocoaPods/issues/8940) - - -## 1.7.2 (2019-06-13) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Prevent crash when configuring schemes for subspecs. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#8880](https://github.com/CocoaPods/CocoaPods/issues/8880) - -* Attempt to use Swift version for dependencies during lint. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#8764](https://github.com/CocoaPods/CocoaPods/issues/8764) - - -## 1.7.1 (2019-05-30) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Stabilize product reference UUIDs to fix Xcode crashing with incremental installation. - [Sebastian Shanus](https://github.com/sebastianv1) - [#8845](https://github.com/CocoaPods/CocoaPods/pull/8845) - -* Fix a 1.7.0 regression in header directory paths when using static libraries - [Eric Amorde](https://github.com/amorde) - [#8836](https://github.com/CocoaPods/CocoaPods/issues/8836) - - -## 1.7.0 (2019-05-22) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Fix 1.7.0.rc.2 regression - Resources need to be added for test specs in library builds - [Paul Beusterien](https://github.com/paulb777) - [#8812](https://github.com/CocoaPods/CocoaPods/pull/8812) - -* Configure schemes regardless if they are being shared or not. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#8815](https://github.com/CocoaPods/CocoaPods/pull/8815) - -* Update dSYM stripping string matcher for 64-bit only dSYMs. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#8827](https://github.com/CocoaPods/CocoaPods/issues/8827) - - -## 1.7.0.rc.2 (2019-05-15) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Don't add resources to a second test_spec pod target build phase - [Paul Beusterien](https://github.com/paulb777) - [#8173](https://github.com/CocoaPods/CocoaPods/issues/8173) - -* Fix 1.7.0.rc.1 static library regression for pods with `header_dir` attribute - [Paul Beusterien](https://github.com/paulb777) - [#8765](https://github.com/CocoaPods/CocoaPods/issues/8765) - -* Scope app spec dependent targets when no dedup'ing targets. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#8770](https://github.com/CocoaPods/CocoaPods/pull/8770) - -* Fix embedding static frameworks in extensions while using `use_frameworks!` - [Martin Fiebig](https://github.com/mfiebig) - [#8798](https://github.com/CocoaPods/CocoaPods/pull/8798) - - -## 1.7.0.rc.1 (2019-05-02) - -##### Enhancements - -* Replace Pods project `Dependencies` group with `Development Pods` and `Pods` groups. - [Sebastian Shanus](https://github.com/sebastianv1) - [#8659](https://github.com/CocoaPods/CocoaPods/issues/8659) - -* Add an error message for :podspec pods not matching the version in Pods and on disk - [orta](https://github.com/orta) - [#8676](https://github.com/CocoaPods/CocoaPods/issues/8676) - -##### Bug Fixes - -* Allow insecure loads in requires_app_host's Info.plist - [Paul Beusterien](https://github.com/paulb777) - [#8747](https://github.com/CocoaPods/CocoaPods/pull/8747) - -* Fix a regression for static libraries with a custom module name - [Eric Amorde](https://github.com/amorde) - [#8695](https://github.com/CocoaPods/CocoaPods/issues/8695) - -* Fix target cache key SPECS key ordering. - [Sebastian Shanus](https://github.com/sebastianv1) - [#8657](https://github.com/CocoaPods/CocoaPods/issues/8657) - -* Fix regression not compiling xcdatamodeld files in static frameworks - [Paul Beusterien](https://github.com/paulb777) - [#8702](https://github.com/CocoaPods/CocoaPods/issues/8702) - -* Fix: AppIcon not found when executing `pod lib lint` - [Itay Brenner](https://github.com/itaybre) - [#8648](https://github.com/CocoaPods/CocoaPods/issues/8648) - - -## 1.7.0.beta.3 (2019-03-28) - -##### Enhancements - -* Adds support for referring to other podspecs during validation - [Orta Therox](https://github.com/orta) - [#8536](https://github.com/CocoaPods/CocoaPods/pull/8536) - -##### Bug Fixes - -* Deintegrate deleted targets even if `incremental_installation` is turned on. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) & [Doug Mead](https://github.com/dmead28) - [#8638](https://github.com/CocoaPods/CocoaPods/pull/8638) - -* Reduce the probability of multiple project UUID collisions. - [Sebastian Shanus](https://github.com/sebastianv1) - [#8636](https://github.com/CocoaPods/CocoaPods/pull/8636) - -* Resolved an issue that could cause spec repo updates to fail on CI servers. - [rpecka](https://github.com/rpecka) - [#7317](https://github.com/CocoaPods/CocoaPods/issues/7317) - - -## 1.7.0.beta.2 (2019-03-08) - -##### Enhancements - -* Integrate `xcfilelist` input/output paths for script phases. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#8585](https://github.com/CocoaPods/CocoaPods/pull/8585) - -##### Bug Fixes - -* Do not warn of `.swift-version` file being deprecated if pod does not use Swift. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#8593](https://github.com/CocoaPods/CocoaPods/pull/8593) - -* Generate sibling targets for incremental installation. - [Sebastian Shanus](https://github.com/sebastianv1) & [Igor Makarov](https://github.com/igor-makarov) - [#8577](https://github.com/CocoaPods/CocoaPods/issues/8577) - -* Validator should filter our app specs from subspec analysis. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#8592](https://github.com/CocoaPods/CocoaPods/pull/8592) - -* Do not warn that `--swift-version` parameter is deprecated. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#8586](https://github.com/CocoaPods/CocoaPods/pull/8586) - -* Include `bcsymbolmap` file output paths into script phase. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#8563](https://github.com/CocoaPods/CocoaPods/pull/8563) - -* Copy `bcsymbolmap` files into correct destination to avoid invalid app archives - [florianbuerger](https://github.com/florianbuerger) - [#8558](https://github.com/CocoaPods/CocoaPods/pull/8558) - -* Fix: unset GIT_DIR and GIT_WORK_TREE for git operations - [tripleCC](https://github.com/tripleCC) - [#7958](https://github.com/CocoaPods/CocoaPods/issues/7958) - -* Fix crash when running `pod update` with `--sources` and `--project-directory` - [tripleCC](https://github.com/tripleCC) - [#8565](https://github.com/CocoaPods/CocoaPods/issues/8565) - -* Do not use spaces around variable assignment in generated embed framework script - [florianbuerger](https://github.com/florianbuerger) - [#8548](https://github.com/CocoaPods/CocoaPods/pull/8548) - -* Do not link specs into user targets that are only used by app specs. - [Samuel Giddins](https://github.com/segiddins) - - -## 1.7.0.beta.1 (2019-02-22) - -##### Enhancements - -* Copy `bcsymbolmap` files of a vendored framework. - [dacaiguoguogmail](https://github.com/dacaiguoguogmail) - [#8461](https://github.com/CocoaPods/CocoaPods/issues/8461) - -* Set the path of development pod groups to root directory of the Pod - [Eric Amorde](https://github.com/amorde) - [#8445](https://github.com/CocoaPods/CocoaPods/pull/8445) - [#8503](https://github.com/CocoaPods/CocoaPods/pull/8503) - -* Incremental Pod Installation - Enables only regenerating projects for pod targets that have changed since the previous installation. - This feature is gated by the `incremental_installation` option. - [Sebastian Shanus](https://github.com/sebastianv1) - [#8319](https://github.com/CocoaPods/CocoaPods/issues/8319) - -* Podfile: Add a CDNSource automatically if it's not present, just like git source. - Convenience for CDNSource when specified as `source 'https://cdn.jsdelivr.net/cocoa/'`. - If source doesn't exist, it will be created. - [igor-makarov](https://github.com/igor-makarov) - [#8362](https://github.com/CocoaPods/CocoaPods/pull/8362) - -* Scheme configuration support. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7577](https://github.com/CocoaPods/CocoaPods/issues/7577) - -* Add support for `.rb` extension for Podfiles - [Eric Amorde](https://github.com/amorde) - [#8171](https://github.com/CocoaPods/CocoaPods/issues/8171) - -* Add CDN repo Source to allow retrieving specs from a web URL. - [igor-makarov](https://github.com/igor-makarov) - [#8268](https://github.com/CocoaPods/CocoaPods/issues/8268) (partial beta solution) - -* Multi Pod Project Generation Support. - Support for splitting the pods project into a subproject per pod target, gated by the `generate_multiple_pod_projects` installation option. - [Sebastian Shanus](https://github.com/sebastianv1) - [#8253](https://github.com/CocoaPods/CocoaPods/issues/8253) - -* Don't add main for app specs. - [Derek Ostrander](https://github.com/dostrander) - [#8235](https://github.com/CocoaPods/CocoaPods/pull/8235) - -* Multiple Swift versions support - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#8191](https://github.com/CocoaPods/CocoaPods/issues/8191) - -* Adds app spec project integration. - [Derek Ostrander](https://github.com/dostrander) - [#8158](https://github.com/CocoaPods/CocoaPods/pull/8158) - -* Add documentation for the Podfile installation options - [Eric Amorde](https://github.com/amorde) - [#8198](https://github.com/CocoaPods/CocoaPods/issues/8198) - [guides.cocoapods.org #142](https://github.com/CocoaPods/guides.cocoapods.org/issues/142) - -##### Bug Fixes - -* Clean up old integrated framework references. - [Dimitris Koutsogiorgas](https://github.com/dnkouts) - [#8296](https://github.com/CocoaPods/CocoaPods/issues/8296) - -* Always update sources specified with the `:source` option when `--repo-update` is specified - [Eric Amorde](https://github.com/amorde) - [#8421](https://github.com/CocoaPods/CocoaPods/issues/8421) - -* Set `showEnvVarsInLog` for script phases only when its disabled. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#8400](https://github.com/CocoaPods/CocoaPods/pull/8400) - -* Fix error when execute pod list --update --verbose command - [tripleCC](https://github.com/tripleCC) - [#8404](https://github.com/CocoaPods/CocoaPods/pull/8404) - -* Remove `manifest` attribute from sandbox. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#8260](https://github.com/CocoaPods/CocoaPods/pull/8260) - -* Don't have libraries build the app spec. - [Derek Ostrander](https://github.com/dostrander) - [#8244](https://github.com/CocoaPods/CocoaPods/pull/8244) - -* Fix HTTPs -> HTTPS in warning message - [CydeWeys](https://github.com/CydeWeys) - [#8354](https://github.com/CocoaPods/CocoaPods/issues/8354) - -* Add the `FRAMEWORK_SEARCH_PATHS` necessary to import `XCTest` when it is - linked as a weak framework. - [Samuel Giddins](https://github.com/segiddins) - -* Treat `USER_HEADER_SEARCH_PATHS` as a plural build setting. - [Samuel Giddins](https://github.com/segiddins) - [#8451](https://github.com/CocoaPods/CocoaPods/issues/8451) - -* Trying to add a spec repo with a `file://` URL on Ruby 2.6 won't fail with a - a git unknown option error. - [Samuel Giddins](https://github.com/segiddins) - -* Fixed test host delegate methods to not warn about unused arguments. - [Jacek Suliga](https://github.com/jmkk) - [#8521](https://github.com/CocoaPods/CocoaPods/pull/8521) - - -## 1.6.2 (2019-05-15) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Ensure all embedded pod targets are copied over to the host target. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#8608](https://github.com/CocoaPods/CocoaPods/issues/8608) - - -## 1.6.1 (2019-02-21) - -##### Enhancements - -* Add `--analyze` option for the linters. - [Paul Beusterien](https://github.com/paulb777) - [#8792](https://github.com/CocoaPods/CocoaPods/issues/8792) - -##### Bug Fixes - -* Properly link system frameworks and weak frameworks into dynamic framework targets. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#8493](https://github.com/CocoaPods/CocoaPods/issues/8493) - - -## 1.6.0 (2019-02-07) - -##### Enhancements - -* None. - -##### Bug Fixes - -* None. - - -## 1.6.0.rc.2 (2019-01-29) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Fix linking of vendored libraries and frameworks in pod targets - [Wes Campaigne](https://github.com/Westacular) - [#8453](https://github.com/CocoaPods/CocoaPods/issues/8453) - - -## 1.6.0.rc.1 (2019-01-25) - -##### Enhancements - -* Generate Info.plist files for static frameworks - [Paul Beusterien](https://github.com/paulb777) - [#8287](https://github.com/CocoaPods/CocoaPods/issues/8287) - -##### Bug Fixes - -* Do not force 64-bit architectures on Xcode 10 - [Eric Amorde](https://github.com/amorde) - [#8242](https://github.com/CocoaPods/CocoaPods/issues/8242) - -* Fix running test specs that support iOS 8. - [Jeff Kelley](https://github.com/SlaunchaMan) - [#8286](https://github.com/CocoaPods/CocoaPods/pull/8286) - -* Remove linker flags that linked dynamic libraries & frameworks from the build - settings for pod targets. - [Samuel Giddins](https://github.com/segiddins) - [#8314](https://github.com/CocoaPods/CocoaPods/pull/8314) - -## 1.6.0.beta.2 (2018-10-17) - -##### Enhancements - -* Remove contraction from docs to fix rendering on the website. - [stevemoser](https://github.com/stevemoser) - [#8131](https://github.com/CocoaPods/CocoaPods/pull/8131) - -* Provide an installation option to preserve folder structure - [dacaiguoguogmail](https://github.com/dacaiguoguogmail) - [#8097](https://github.com/CocoaPods/CocoaPods/pull/8097) - -* Nests test specs host apps inside that Pod's directory for cleaner project - navigators. - [Derek Ostrander](https://github.com/dostrander) - -* mark_ruby_file_ref add indent width and tab width config - [dacaiguoguogmail](https://github.com/dacaiguoguogmail) - -* Print an error that will show up in Xcode's issue navigator upon unexpected - failures in the copy resources and embed frameworks script phases. - [Samuel Giddins](https://github.com/segiddins) - -* Validate that all generated `PBXNativeTarget`s contain source files to build, - so specs (including test specs) with no source files won't fail at runtime - due to the lack of a generated executable. - [Samuel Giddins](https://github.com/segiddins) - -* Print better promote message when unable to find a specification. - [Xinyu Zhao](https://github.com/X140Yu) - [#8064](https://github.com/CocoaPods/CocoaPods/issues/8064) - -* Silence warnings in headers for Pods with `inhibit_warnings => true` - [Guillaume Algis](https://github.com/guillaumealgis) - [#6401](https://github.com/CocoaPods/CocoaPods/pull/6401) - -* When resolving a locked dependency, source the spec from the locked - specs repository. - [Samuel Giddins](https://github.com/segiddins) - -* Slightly improve resolution speed for Podfiles that contain multiple targets - with the same dependencies. - [Samuel Giddins](https://github.com/segiddins) - -##### Bug Fixes - -* Don't generate unencrypted source warnings for localhost. - [Paul Beusterien](https://github.com/paulb777) - [#8156](https://github.com/CocoaPods/CocoaPods/issues/8156) - -* Fix linting when armv7 is included but i386 isn't. - [Paul Beusterien](https://github.com/paulb777) - [#8129](https://github.com/CocoaPods/CocoaPods/issues/8129) - -* Provide an installation option to disable usage of input/output paths. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#8073](https://github.com/CocoaPods/CocoaPods/issues/8073) - -* Scope prefix header setting to each test spec. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#8046](https://github.com/CocoaPods/CocoaPods/pull/8046) - -* Don't add incomplete subspec subset targets for extensions. - [Paul Beusterien](https://github.com/paulb777) - [#7850](https://github.com/CocoaPods/CocoaPods/issues/7850) - -* Clear out `MACH_O_TYPE` for unit test bundles that use static frameworks. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#8031](https://github.com/CocoaPods/CocoaPods/issues/8031) - -* Fix `weak_frameworks` missing regression. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7872](https://github.com/CocoaPods/CocoaPods/issues/7872) - -* Fix line spacing for Swift error message. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#8024](https://github.com/CocoaPods/CocoaPods/pull/8024) - -* Improve validation for test_specs on specific platforms - [icecrystal23](https://github.com/icecrystal23) - [#7009](https://github.com/CocoaPods/CocoaPods/issues/7009) - -* Fix running `pod outdated` with externally-sourced pods. - [Samuel Giddins](https://github.com/segiddins) - [#8025](https://github.com/CocoaPods/CocoaPods/issues/8025) - -* Remove codesign suppression - [Jaehong Kang](https://github.com/sinoru) - [#7606](https://github.com/CocoaPods/CocoaPods/issues/7606) - - -## 1.6.0.beta.1 (2018-08-16) - -##### Enhancements - -* Every test spec will have its own xctest bundle. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [Jenn Kaplan](https://github.com/jkap) - [#7908](https://github.com/CocoaPods/CocoaPods/pull/7908) - -* Generate a separate app host per pod. - [Samuel Giddins](https://github.com/segiddins) - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#8005](https://github.com/CocoaPods/CocoaPods/pull/8005) - -* Add default launch screen storyboard to test app hosts. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7971](https://github.com/CocoaPods/CocoaPods/pull/7971) - -* Always display downloader error message. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7625](https://github.com/CocoaPods/CocoaPods/issues/7625) - -* Warn instead of error when linting if `public_header_files` or - `private_header_files` do not match any files. - [Eric Amorde](https://github.com/amorde) - [#7427](https://github.com/CocoaPods/CocoaPods/issues/7427) - -* Add `--platforms` parameter to `pod spec lint` and `pod lib lint` to specify - which platforms to lint. - [Eric Amorde](https://github.com/amorde) - [#7783](https://github.com/CocoaPods/CocoaPods/issues/7783) - -* Warn if the `git://` protocol is used as the source of a pod. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7705](https://github.com/CocoaPods/CocoaPods/issues/7705) - -* Remove all xcode project state from target objects, - improving project generation performance. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7610](https://github.com/CocoaPods/CocoaPods/pull/7610) - -* Improve performance of Pods project generation by skipping native targets - for which dependent targets have already been added. - [Jacek Suliga](https://github.com/jmkk) - -* Refactor build settings generation to perform much better on large projects. - [Samuel Giddins](https://github.com/segiddins) - -* Make sure the temporary directory used to download a pod is removed, - even if an error is raised. - [augustorsouza](https://github.com/augustorsouza) - -* Avoid unlocking sources on every `pod install` when there are no - plugin post-install hooks for performance reasons. - [Samuel Giddins](https://github.com/segiddins) - -* Change shell script relative paths to use `${PODS_ROOT}` instead of - `${SRCROOT}/Pods`. - [Whirlwind](https://github.com/Whirlwind) - [#7878](https://github.com/CocoaPods/CocoaPods/pull/7878) - -* Set the path of the Pods group in the user project. - [Whirlwind](https://github.com/Whirlwind) - [#7886](https://github.com/CocoaPods/CocoaPods/pull/7886) - [#6194](https://github.com/CocoaPods/CocoaPods/issues/6194) - -* Add a `--deployment` flag to `pod install` that errors if there are any - changes to the Podfile or Lockfile. - [Samuel Giddins](https://github.com/segiddins) - -* Add `--use-modular-headers` flag to the `pod spec lint`, `pod lib lint`, - and `pod repo push` commands. - [Eric Amorde](https://github.com/amorde) - [#7683](https://github.com/CocoaPods/CocoaPods/issues/7683) - -##### Bug Fixes - -* Scope embedded pods to their host targets by their configuration. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#8011](https://github.com/CocoaPods/CocoaPods/issues/8011) - -* Set the `SWIFT_VERSION` on resource bundle targets that contain compiled - sources and use Swift. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7950](https://github.com/CocoaPods/CocoaPods/issues/7950) - -* Do not ignore `--no-overwrite` parameter if a commit message is specified. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7926](https://github.com/CocoaPods/CocoaPods/issues/7926) - -* Generate `-ObjC` in `OTHER_LDFLAGS` for apps with static frameworks. - [Paul Beusterien](https://github.com/paulb777) - [#7946](https://github.com/CocoaPods/CocoaPods/pull/7946) - -* Do not display that a source was changed if it uses different casing. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7883](https://github.com/CocoaPods/CocoaPods/pull/7883) - -* Set `CURRENT_PROJECT_VERSION` for generated app host targets. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7825](https://github.com/CocoaPods/CocoaPods/pull/7825) - -* Properly follow symlinks within macOS universal frameworks. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7587](https://github.com/CocoaPods/CocoaPods/issues/7587) - -* Validator adds a Swift file if any of the pod targets use Swift. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7738](https://github.com/CocoaPods/CocoaPods/issues/7738) - -* Fix `INFOPLIST_FILE` being overridden when set in a podspec's `pod_target_xcconfig`. - [Eric Amorde](https://github.com/amorde) - [#7530](https://github.com/CocoaPods/CocoaPods/issues/7530) - -* Raise an error if user target `SWIFT_VERSION` is missing. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7770](https://github.com/CocoaPods/CocoaPods/issues/7770) - -* Fix the umbrella header import path when `header_dir` is specified in the - podspec and building a static library with modular headers enabled. - [chuganzy](https://github.com/chuganzy) - [#7724](https://github.com/CocoaPods/CocoaPods/pull/7724) - -* Do not symlink headers that belong to test specs. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7762](https://github.com/CocoaPods/CocoaPods/pull/7762) - -* Do not build pod target if it only contains script phases. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7746](https://github.com/CocoaPods/CocoaPods/issues/7746) - -* Do not try to integrate uncreated test native targets. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7394](https://github.com/CocoaPods/CocoaPods/issues/7394) - -* Attempt to parse `SWIFT_VERSION` from xcconfig during target inspection. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7731](https://github.com/CocoaPods/CocoaPods/issues/7731) - -* Do not crash when creating build settings for a missing user build configuration. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7698](https://github.com/CocoaPods/CocoaPods/pull/7698) - -* Do not overwrite App host info plist when using multiple test specs. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7695](https://github.com/CocoaPods/CocoaPods/pull/7695) - -* Do not include test dependencies' input and output paths. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7688](https://github.com/CocoaPods/CocoaPods/pull/7688) - -* Skip test file accessors for `uses_swift?` and `should_build?` methods. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7671](https://github.com/CocoaPods/CocoaPods/pull/7671) - -* When integrating a vendored framework while building pods as static - libraries, public headers will be found via `FRAMEWORK_SEARCH_PATHS` - instead of via the sandbox headers store. - [Samuel Giddins](https://github.com/segiddins) - -* Improve performance of grouping pods by configuration. - [Samuel Giddins](https://github.com/segiddins) - -* Stop linking frameworks to static libraries to avoid warnings with the new build system. - [Samuel Giddins](https://github.com/segiddins) - [#7570](https://github.com/CocoaPods/CocoaPods/pull/7570) - -* Allow `EXPANDED_CODE_SIGN_IDENTITY` to be unset. - [Keith Smiley](https://github.com/keith) - [#7708](https://github.com/CocoaPods/CocoaPods/issues/7708) - -* Running `pod install` with static library modules no longer causes pods to - be recompiled. - [Samuel Giddins](https://github.com/segiddins) - -* A pod built as a static library linked into multiple targets will only build - as a module when all of the targets it is linked into have opted into it. - [Samuel Giddins](https://github.com/segiddins) - -* Use `CP_HOME_DIR` as the base for all default directories. - [mcfedr](https://github.com/mcfedr) - [#7917](https://github.com/CocoaPods/CocoaPods/pull/7917) - -* Exclude 32-bit architectures from Pod targets when the deployment target is - iOS 11.0 or higher. - [Eric Amorde](https://github.com/amorde) - [#7148](https://github.com/CocoaPods/CocoaPods/issues/7148) - -* Fail gracefully when the analyzer has dependencies to fetch, but has been - told not to fetch them. - [Samuel Giddins](https://github.com/segiddins) - -* Don't generate framework or resource scripts if they will not be used. - [Eric Amorde](https://github.com/amorde) - -* Fix a crash when loading the `macho` gem in certain environments. - [Eric Amorde](https://github.com/amorde) - [#7867](https://github.com/CocoaPods/CocoaPods/issues/7867) - - -## 1.5.3 (2018-05-25) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Fix compatibility with RubyGems 2.7.7. - [Samuel Giddins](https://github.com/segiddins) - [#7765](https://github.com/CocoaPods/CocoaPods/issues/7765) - [#7766](https://github.com/CocoaPods/CocoaPods/issues/7766) - [#7763](https://github.com/CocoaPods/CocoaPods/issues/7763) - - -## 1.5.2 (2018-05-09) - -##### Enhancements - -* None. - -##### Bug Fixes - -* None. - - -## 1.5.1 (2018-05-07) - -##### Enhancements - -* Improve performance of the dependency resolver by removing duplicates for dependency nodes. - [Jacek Suliga](https://github.com/jmkk) - -##### Bug Fixes - -* Do not include test dependencies input and output paths. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7688](https://github.com/CocoaPods/CocoaPods/pull/7688) - -* Remove [system] declaration attribute from generated module maps. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7589](https://github.com/CocoaPods/CocoaPods/issues/7589) - -* Properly namespace Info.plist names during target installation. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7611](https://github.com/CocoaPods/CocoaPods/pull/7611) - -* Always generate FRAMEWORK_SEARCH_PATHS for vendored_frameworks. - [Paul Beusterien](https://github.com/paulb777) - [#7591](https://github.com/CocoaPods/CocoaPods/issues/7591) - -* Fix modular header access to header_dir's. - [Paul Beusterien](https://github.com/paulb777) - [#7597](https://github.com/CocoaPods/CocoaPods/issues/7597) - -* Fix static framework dependent target double linking without `use_frameworks`. - [Paul Beusterien](https://github.com/paulb777) - [#7592](https://github.com/CocoaPods/CocoaPods/issues/7592) - -* Make modular header private header access consistent with frameworks and static libraries. - [Paul Beusterien](https://github.com/paulb777) - [#7596](https://github.com/CocoaPods/CocoaPods/issues/7596) - -* Inhibit warnings for all dependencies during validation except for the one being validated. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7434](https://github.com/CocoaPods/CocoaPods/issues/7434) - -* Prevent duplicated targets from being stripped out from the framework search paths. - [Liquidsoul](https://github.com/liquidsoul) - [#7644](https://github.com/CocoaPods/CocoaPods/pull/7644) - -* Fix `assetcatalog_generated_info.plist` path in copy resources phase. - [Maxime Le Moine](https://github.com/MaximeLM) - [#7590](https://github.com/CocoaPods/CocoaPods/issues/7590) - -## 1.5.0 (2018-04-04) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Escape double quotes for module map contents - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7549](https://github.com/CocoaPods/CocoaPods/pull/7549) - -* Fix building Swift static library test specs. - [Samuel Giddins](https://github.com/segiddins) - -* Swift static libraries can be used in targets whose search paths are inherited. - [Samuel Giddins](https://github.com/segiddins) - -## 1.5.0.beta.1 (2018-03-23) - -##### Enhancements - -* Add `--exclude-pods` option to `pod update` to allow excluding specific pods from update - [Oleksandr Kruk](https://github.com/0mega) - [#7334](https://github.com/CocoaPods/CocoaPods/issues/7334) - -* Add support for mixed Objective-C and Swift static frameworks - [Paul Beusterien](https://github.com/paulb777) - [#7213](https://github.com/CocoaPods/CocoaPods/issues/7213) - -* Improve `pod install` performance for pods with exact file paths rather than glob patterns - [Muhammed Yavuz Nuzumlalı](https://github.com/manuyavuz) - [#7473](https://github.com/CocoaPods/CocoaPods/pull/7473) - -* Display a message when a pods source has changed during installation - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7464](https://github.com/CocoaPods/CocoaPods/pull/7464) - -* Add support for modular header search paths, include "legacy" support. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7412](https://github.com/CocoaPods/CocoaPods/pull/7412) - -* Set direct and transitive dependency header search paths for pod targets - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7116](https://github.com/CocoaPods/CocoaPods/pull/7116) - -* Log target names missing host for libraries - [Keith Smiley](https://github.com/keith) - [#7346](https://github.com/CocoaPods/CocoaPods/pull/7346) - -* Add a `--no-overwrite` flag to `pod repo push` to disable overwriting - existing specs that have already been pushed. - [Samuel Giddins](https://github.com/segiddins) - -* Store which specs repo a pod comes from in the lockfile. - [Samuel Giddins](https://github.com/segiddins) - -* Add `set -u` to the copy frameworks and copy resources scripts. - [Keith Smiley](https://github.com/keith) - [#7180](https://github.com/CocoaPods/CocoaPods/pull/7180) - -* Allow integrating into static library targets without attempting to copy - resources or embed frameworks unless `UNLOCALIZED_RESOURCES_FOLDER_PATH` - or `FRAMEWORKS_FOLDER_PATH` is set. - [Samuel Giddins](https://github.com/segiddins) - -* Change color scheme of `pod outdated` from red-yellow-green to red-blue-green to be more colorblind friendly - [iv-mexx](https://github.com/iv-mexx) - [#7372](https://github.com/CocoaPods/CocoaPods/issues/7372) - -* Add support for integrating swift pods as static libraries. - [Danielle Tomlinson](https://github.com/dantoml) - [Samuel Giddins](https://github.com/segiddins) - [#6899](https://github.com/CocoaPods/CocoaPods/issues/6899) - -* Document format of POD_NAMES in pod update - [mrh-is](https://github.com/mrh-is) - -* Update validator to stream output as xcodebuild runs - [abbeycode](https://github.com/abbeycode) - [#7040](https://github.com/CocoaPods/CocoaPods/issues/7040) - -##### Bug Fixes - -* Create a generic Info.plist file for test targets - Use xcode default `PRODUCT_MODULE_NAME` for generated test targets - [Paul Zabelin](https://github.com/paulz) - [#7506](https://github.com/CocoaPods/CocoaPods/issues/7506) - -* Prevent `xcassets` compilation from stomping over the apps `xcassets` - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7003](https://github.com/CocoaPods/CocoaPods/issues/7003) - -* Fix script phase output path for `.xcasset` resources - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7511](https://github.com/CocoaPods/CocoaPods/issues/7511) - -* Fix `PRODUCT_MODULE_NAME` for generated test targets - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7507](https://github.com/CocoaPods/CocoaPods/issues/7507) - -* Ensure `SWIFT_VERSION` is set for test only pod targets during validation - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7498](https://github.com/CocoaPods/CocoaPods/issues/7498) - -* Fix iOS test native target signing settings - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7504](https://github.com/CocoaPods/CocoaPods/pull/7504) - -* Clear input/output paths if they exceed an arbitrary limit - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7362](https://github.com/CocoaPods/CocoaPods/issues/7362) - -* Warn instead of throwing an exception when a development pod specifies an invalid license file path - [Eric Amorde](https://github.com/amorde) - [#7377](https://github.com/CocoaPods/CocoaPods/issues/7377) - -* Better static frameworks transitive dependency error checking - [Paul Beusterien](https://github.com/paulb777) - [#7352](https://github.com/CocoaPods/CocoaPods/issues/7352) - -* Always update input/output paths even if they are empty - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7368](https://github.com/CocoaPods/CocoaPods/pull/7368) - -* Unique all available pre-release versions when displaying - [Samuel Giddins](https://github.com/segiddins) - [#7353](https://github.com/CocoaPods/CocoaPods/pull/7353) - -* Do not attempt compilation for pods with no sources and skipping import validation - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7336](https://github.com/CocoaPods/CocoaPods/issues/7336) - -* Avoid adding copy resources and frameworks script phases when those phases - would not copy anything. - [Keith Smiley](https://github.com/keith) - [Samuel Giddins](https://github.com/segiddins) - -* Speed up `pod install` times by up to 50% for very large project. - [Samuel Giddins](https://github.com/segiddins) - -* Avoid dependency resolution conflicts when a pod depends upon a local pod. - [Samuel Giddins](https://github.com/segiddins) - -* Fix legacy header search paths that broke due to #7116 and #7412. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7445](https://github.com/CocoaPods/CocoaPods/pull/7445) - -* Stop adding header search paths that do not contain any headers. - [Samuel Giddins](https://github.com/segiddins) - -* Do not warn when http source uses `file:///` URI scheme - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7460](https://github.com/CocoaPods/CocoaPods/issues/7460) - -* Remove bogus `PROVISIONING_PROFILE_SPECIFIER` value from Pods project. - [Ruenzuo](https://github.com/Ruenzuo) - [#6964](https://github.com/CocoaPods/CocoaPods/issues/6964) - -* Fix returning absolute paths from glob, fixes issue with static framework and public headers. - [Morgan McKenzie](https://github.com/rmtmckenzie) - [#7463](https://github.com/CocoaPods/CocoaPods/issues/7463) - -* Improve messages when integrating Swift pods as static libraries. - [Marcelo Fabri](https://github.com/marcelofabri) - [#7495](https://github.com/CocoaPods/CocoaPods/issues/7495) - -## 1.4.0 (2018-01-18) - -##### Enhancements - -* Show warning when Pod source uses unencrypted HTTP - [KrauseFx](https://github.com/KrauseFx) - [#7293](https://github.com/CocoaPods/CocoaPods/issues/7293) - -##### Bug Fixes - -* Do not include test spec resources and framework paths of dependent targets into test scripts - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7318](https://github.com/CocoaPods/CocoaPods/pull/7318) - -* Restore `development_pod_targets` public method in installer - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7292](https://github.com/CocoaPods/CocoaPods/pull/7292) - -* Fix resolution when multiple sources provide the same pods, and there are - (potential) dependencies between the sources. - [Samuel Giddins](https://github.com/segiddins) - [#7031](https://github.com/CocoaPods/CocoaPods/issues/7031) - -* Ensure that externally-sourced (e.g. local & git) pods are allowed to resolve - to prerelease versions. - [segiddins](https://github.com/segiddins) - -## 1.4.0.rc.1 (2017-12-16) - -##### Enhancements - -* Integrate `swift_version` DSL support into pod targets - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7134](https://github.com/CocoaPods/CocoaPods/issues/7134) - -* Add color indication to output of `pod outdated` - [iv-mexx](https://github.com/iv-mexx) - [#7204](https://github.com/CocoaPods/CocoaPods/pull/7204) - -* Set syntax of podspecs from development pods to Ruby when appropriate - [Eric Amorde](https://github.com/amorde) - [#7278](https://github.com/CocoaPods/CocoaPods/pull/7278) - -* Add support for editing the podspec, license, README, license, and docs of local development pods - [Eric Amorde](https://github.com/amorde) - [#7093](https://github.com/CocoaPods/CocoaPods/pull/7093) - -* Show warning when SDK provider tries to push a version with an unencrypted HTTP source - [KrauseFx](https://github.com/KrauseFx) - [#7250](https://github.com/CocoaPods/CocoaPods/pull/7250) - -##### Bug Fixes - -* Deduplicate output path file names for resources and frameworks - [Eric Amorde](https://github.com/amorde) - [#7259](https://github.com/CocoaPods/CocoaPods/issues/7259) - -* Allow installation of a pod with its own Swift version on multiple targets - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7261](https://github.com/CocoaPods/CocoaPods/pull/7261) - -* Quote framework names in OTHER_LDFLAGS - [Tyler Stromberg](https://github.com/AquaGeek) - [#7185](https://github.com/CocoaPods/CocoaPods/issues/7185) - -* Fix static framework archive regression from #7187 - [Paul Beusterien](https://github.com/paulb777) - [#7225](https://github.com/CocoaPods/CocoaPods/issues/7225) - -* Install resource bundles and embed frameworks for every test target's configuration - [Nickolay Tarbayev](https://github.com/tarbayev) - [#7012](https://github.com/CocoaPods/CocoaPods/issues/7012) - -* Set `SWIFT_VERSION` to test native targets during validation - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7216](https://github.com/CocoaPods/CocoaPods/pull/7216) - -* Add copied resources' paths to "Copy Pods Resources" output file list - [igor-makarov](https://github.com/igor-makarov) - [#6936](https://github.com/CocoaPods/CocoaPods/issues/6936) - -* Do not link system frameworks of test specs to library targets - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7205](https://github.com/CocoaPods/CocoaPods/pull/7205) - -* Be more lenient when stripping frameworks and dSYMs for non fat binaries - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7196](https://github.com/CocoaPods/CocoaPods/issues/7196) - [#5854](https://github.com/CocoaPods/CocoaPods/issues/5854) - -* Do not display script phases warnings multiple times per platform - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7193](https://github.com/CocoaPods/CocoaPods/pull/7193) - -* Fix unnecessary whole project recompilation with static frameworks - [Vladimir Gorbenko](https://github.com/volodg) - [#7187](https://github.com/CocoaPods/CocoaPods/issues/7187) - -* Prevent passing empty string to git when running `pod repo update --silent` - [Jon Sorrells](https://github.com/jonsorrells) - [#7176](https://github.com/CocoaPods/CocoaPods/issues/7176) - -* Do not propagate test spec frameworks and libraries into pod target xcconfig - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7172](https://github.com/CocoaPods/CocoaPods/issues/7172) - -* Set language to Swift for test native targets if any dependencies use Swift - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7170](https://github.com/CocoaPods/CocoaPods/issues/7170) - -* Prevent multiple script phases from stripping vendored dSYM - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7166](https://github.com/CocoaPods/CocoaPods/pull/7166) - -* Static library headers should all be `Project` in Xcode header build phase - [Paul Beusterien](https://github.com/paulb777) - [#4496](https://github.com/CocoaPods/CocoaPods/issues/4496) - -* Fix archiving apps with static frameworks - [Paul Beusterien](https://github.com/paulb777) - [#7158](https://github.com/CocoaPods/CocoaPods/issues/7158) - -## 1.4.0.beta.2 (2017-10-24) - -##### Enhancements - -* Integrate execution position for shell script phases - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7101](https://github.com/CocoaPods/CocoaPods/pull/7101) - -* Add support to integrate script phases from podspecs - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7092](https://github.com/CocoaPods/CocoaPods/pull/7092) - -* Add support for preventing pch file generation with the skip_pch podspec attribute - [Paul Beusterien](https://github.com/paulb777) - [#7044](https://github.com/CocoaPods/CocoaPods/pull/7044) - -* Add app host support for test specs - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6953](https://github.com/CocoaPods/CocoaPods/issues/6953) - -* Add support for resources in source static library frameworks - [Paul Beusterien](https://github.com/paulb777) - [#7100](https://github.com/CocoaPods/CocoaPods/pull/7100) - -##### Bug Fixes - -* Copy .swiftmodule into static_frameworks to enable access to Swift static frameworks - [Paul Beusterien](https://github.com/paulb777) - [#7140](https://github.com/CocoaPods/CocoaPods/issues/7140) - -* Fix docs for prefix header paths - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7149](https://github.com/CocoaPods/CocoaPods/pull/7149) - -* Fix integration `prefix_header_file` with test specs - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7147](https://github.com/CocoaPods/CocoaPods/pull/7147) - -* Set the default Swift version to 3.2 during validation - [Victor Hugo Barros](https://github.com/heyzooi) - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7136](https://github.com/CocoaPods/CocoaPods/pull/7136) - -* Better warning message for which Swift version was used during validation - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7121](https://github.com/CocoaPods/CocoaPods/issues/7121) - -* Fix static_framework Swift pod dependencies and implement pod access to dependent vendored_framework modules - [Paul Beusterien](https://github.com/paulb777) - [#7117](https://github.com/CocoaPods/CocoaPods/issues/7117) - -* Strip vendored dSYMs during embed script phase - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7111](https://github.com/CocoaPods/CocoaPods/issues/7111) - -* Warn when a pod that was added or changed includes script phases - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7110](https://github.com/CocoaPods/CocoaPods/pull/7110) - -* Build pod targets with script phases and integrate them properly - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7104](https://github.com/CocoaPods/CocoaPods/pull/7104) - -* Do not set a `CODE_SIGN_IDENTITY` for macOS app hosts or xctest bundles - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7103](https://github.com/CocoaPods/CocoaPods/pull/7103) - -* Fix framework and resources paths caching - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7068](https://github.com/CocoaPods/CocoaPods/pull/7068) - -* Build subspecs in static frameworks without error - [Paul Beusterien](https://github.com/paulb777) - [#7058](https://github.com/CocoaPods/CocoaPods/pull/7058) - -* Ensure `SYMROOT` is properly set for all user configurations - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7081](https://github.com/CocoaPods/CocoaPods/issues/7081) - -## 1.4.0.beta.1 (2017-09-24) - -##### Enhancements - -* Do not force include the master spec repo if plugins provide sources - [Eric Amorde](https://github.com/amorde) - [#7033](https://github.com/CocoaPods/CocoaPods/pull/7033) - -* Add custom shell script integration from Podfile - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6820](https://github.com/CocoaPods/CocoaPods/pull/6820) - -* Show full requirement trees when a version conflict is encountered during - dependency resolution. - [Samuel Giddins](https://github.com/segiddins) - -* Add support for source static library frameworks - [Paul Beusterien](https://github.com/paulb777) - [#6811](https://github.com/CocoaPods/CocoaPods/pull/6811) - -* Add Private Header support to static frameworks - [Paul Beusterien](https://github.com/paulb777) - [#6969](https://github.com/CocoaPods/CocoaPods/pull/6969) - -* For source static frameworks, include frameworks from dependent targets and libraries in OTHER_LDFLAGS - [Paul Beusterien](https://github.com/paulb777) - [#6988](https://github.com/CocoaPods/CocoaPods/pull/6988) - -##### Bug Fixes - -* Deduplicate test specs correctly from pod variants and targets - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7036](https://github.com/CocoaPods/CocoaPods/pull/7036) - -* Do not merge `pod_target_xcconfig` from test specs into non test xcconfigs - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7037](https://github.com/CocoaPods/CocoaPods/pull/7037) - -* Wrap `$PODS_CONFIGURATION_BUILD_DIR` and `$PODS_BUILD_DIR` with curlies - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7048](https://github.com/CocoaPods/CocoaPods/pull/7048) - -* Fix common paths sometimes calculating incorrectly - [amorde](https://github.com/amorde) - [#7028](https://github.com/CocoaPods/CocoaPods/pull/7028) - -* Do not code sign OSX targets for testing bundles - [Justin Martin](https://github.com/justinseanmartin) - [#7027](https://github.com/CocoaPods/CocoaPods/pull/7027) - -* Ensure a unique ID is generated for each resource bundle - [Justin Martin](https://github.com/justinseanmartin) - [#7015](https://github.com/CocoaPods/CocoaPods/pull/7015) - -* Do not include settings from file accessors of test specs into aggregate xcconfigs - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7019](https://github.com/CocoaPods/CocoaPods/pull/7019) - -* Use the resolver to identify which pod targets are test only - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [Justin Martin](https://github.com/justinseanmartin) - [#7014](https://github.com/CocoaPods/CocoaPods/pull/7014) - -* Perform code signing on xctest bundles in the Pods project generated by a test spec - [Justin Martin](https://github.com/justinseanmartin) - [#7013](https://github.com/CocoaPods/CocoaPods/pull/7013) - -* Exclude test resource and framework paths from aggregate targets - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#7000](https://github.com/CocoaPods/CocoaPods/pull/7000) - -* Wrap platform warning message with quotes - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6968](https://github.com/CocoaPods/CocoaPods/pull/6968) - -* Wire dependencies for pod targets not part of any aggregate target - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6948](https://github.com/CocoaPods/CocoaPods/pull/6948) - -* Fix validation warnings when using --swift-version - [Danielle Tomlinson](https://github.com/dantoml) - [#6971](https://github.com/CocoaPods/CocoaPods/pull/6971) - -* Fix xcconfig boolean merging when substrings include yes or no - [Paul Beusterien](https://github.com/paulb777) - [#6997](https://github.com/CocoaPods/CocoaPods/pull/6997) - -* Filter out subset dependent targets from FRAMEWORK_SEARCH_PATHS - [Paul Beusterien](https://github.com/paulb777) - [#7002](https://github.com/CocoaPods/CocoaPods/pull/7002) - -* Propagate HEADER_SEARCH_PATHS settings from search paths - [Paul Beusterien](https://github.com/paulb777) - [#7006](https://github.com/CocoaPods/CocoaPods/pull/7006) - -## 1.3.1 (2017-08-02) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Do not use `--delete` when copying resources to app target folder - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6927](https://github.com/CocoaPods/CocoaPods/issues/6927) - -## 1.3.0 (2017-08-02) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Ensure transitive dependencies are linked to test targets - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6917](https://github.com/CocoaPods/CocoaPods/pull/6917) - -* Properly install pod targets with test specs within subspecs - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6915](https://github.com/CocoaPods/CocoaPods/pull/6915) - -* Add `--skip-tests` support `push` to push command - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6893](https://github.com/CocoaPods/CocoaPods/pull/6893) - -## 1.3.0.rc.1 (2017-07-27) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Cache result of resource and framework paths - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6893](https://github.com/CocoaPods/CocoaPods/pull/6893) - -* Ensure source urls are set when spec has subspecs with dependencies - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6888](https://github.com/CocoaPods/CocoaPods/pull/6888) - -## 1.3.0.beta.3 (2017-07-19) - -##### Enhancements - -* Protect rsync tmp files from being deleted if two targets sync at the same time - [Justin Martin](https://github.com/justinseanmartin) - [#6873](https://github.com/CocoaPods/CocoaPods/pull/6873) - -* Include test schemes within library schemes - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6765](https://github.com/CocoaPods/CocoaPods/issues/6765) - -* Truncate extra groups in Development Pods when they are parents of all files - [Eric Amorde](https://github.com/amorde) - [#6814](https://github.com/CocoaPods/CocoaPods/pull/6814) - -* Do not re-write generated files that have not changed - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [dingjingpisces2015](https://github.com/dingjingpisces2015) - [#6825](https://github.com/CocoaPods/CocoaPods/pull/6825) - -##### Bug Fixes - -* Set the test xcconfig file to resource bundles used only by tests - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6886](https://github.com/CocoaPods/CocoaPods/pull/6886) - -* Integrate test targets to embed frameworks and resources - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6828](https://github.com/CocoaPods/CocoaPods/pull/6828) - -* Ensure resource bundle and test dependencies are set for test native targets - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6829](https://github.com/CocoaPods/CocoaPods/pull/6829) - -* Provide a better error message when references are missing for non-source files - [David Airapetyan](https://github.com/davidair) - [#4887](https://github.com/CocoaPods/CocoaPods/issues/4887) - -* Select unique module_name(s) across host target's and embedded targets' pod targets - [Anand Biligiri](https://github.com/abiligiri) - [#6711](https://github.com/CocoaPods/CocoaPods/issues/6711) - -## 1.3.0.beta.2 (2017-06-22) - -##### Enhancements -* Add inputs and outputs for resources script phase - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6806](https://github.com/CocoaPods/CocoaPods/pull/6806) - -* Simplify logic around framework input and output paths - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6803](https://github.com/CocoaPods/CocoaPods/pull/6803) - -* Add inputs and outputs to check manifest lock and embed framework script phases - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6797](https://github.com/CocoaPods/CocoaPods/issues/6797) - -##### Bug Fixes - -* Remove 0.34 migration for a small boost in `pod install` time - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6783](hhttps://github.com/CocoaPods/CocoaPods/pull/6783) - -* Use a cache when figuring out if a pod target is test only - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6787](https://github.com/CocoaPods/CocoaPods/pull/6787) - -## 1.3.0.beta.1 (2017-06-06) - -##### Enhancements - -* Add validator support to run test specs during lint - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6753](https://github.com/CocoaPods/CocoaPods/pull/6753) - -* Fix to include proper runtime search paths for test native targets - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6727](https://github.com/CocoaPods/CocoaPods/pull/6727) - -* Aggregate targets should not include pod targets only used by tests - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6726](https://github.com/CocoaPods/CocoaPods/pull/6726) - -* Add support for test target creation in the pods project generator - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6703](https://github.com/CocoaPods/CocoaPods/pull/6703) - -* Copy dSYM for vendored frameworks. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#1698](https://github.com/CocoaPods/CocoaPods/issues/1698) - -* Prevents need for .swift-version file in Objective-C pods - [Austin Emmons](https://github.com/atreat) - [#6742](https://github.com/CocoaPods/CocoaPods/issues/6742) - -* Add a ipc command `podfile_json` converts a Podfile to JSON - [Dacaiguoguo](https://github.com/dacaiguoguogmail) - [#6779](https://github.com/CocoaPods/CocoaPods/pull/6779) - -##### Bug Fixes - -* Link `swiftSwiftOnoneSupport` for test xcconfigs - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6769](https://github.com/CocoaPods/CocoaPods/pull/6769) - -* Do not double add search paths to test xcconfig from parent - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6768](https://github.com/CocoaPods/CocoaPods/pull/6768) - -* Ensure product name for tests is not overridden by custom build settings - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6766](https://github.com/CocoaPods/CocoaPods/pull/6766) - -* Do not use the same product name for test targets - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6762](https://github.com/CocoaPods/CocoaPods/pull/6762) - -* Use unique temp folder during lint for parallel execution - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#5117](https://github.com/CocoaPods/CocoaPods/issues/5117) - -* Stop adding `$(inherited)` for every static library linked - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6756](https://github.com/CocoaPods/CocoaPods/pull/6756) - -* Settings for dependent targets should include the parent target for test xcconfigs - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6755](https://github.com/CocoaPods/CocoaPods/pull/6755) - -* Only check for valid Swift version for pod targets that use Swift - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6733](https://github.com/CocoaPods/CocoaPods/pull/6733) - -* Fix pod install error from 1.2.1 when working with static lib-only projects. - [Ben Asher](https://github.com/benasher44) - [#6673](https://github.com/CocoaPods/CocoaPods/issues/6673) - -* Use `git!` when executing `push` command in order to raise informative and set exit code. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6700](https://github.com/CocoaPods/CocoaPods/pull/6700) - -* Make copy resources echoes always return true to work around issue where Xcode stops handling build script output greater than \~440 characters (rdar://30607704). - [postmechanical](https://github.com/postmechanical) - [#6595](https://github.com/CocoaPods/CocoaPods/issues/6595) - -* Inherit pod defined values for `SWIFT_ACTIVE_COMPILATION_CONDITIONS`. - [Louis D'hauwe](https://github.com/louisdh) - [#6629](https://github.com/CocoaPods/CocoaPods/pull/6629) - -* Delete extraneous files in rsync destination. - [jgavris](https://github.com/jgavris) - [#6694](https://github.com/CocoaPods/CocoaPods/pull/6694) - -## 1.2.1 (2017-04-11) - -##### Enhancements - -* None. - -##### Bug Fixes - -* No master specs cloning when not needed for `pod lib lint`. - [Alfredo Delli Bovi](https://github.com/adellibovi) - [#6154](https://github.com/CocoaPods/CocoaPods/issues/6154) - - -## 1.2.1.rc.1 (2017-04-05) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Fix generating `LD_RUNPATH_SEARCH_PATHS` without `use_frameworks!` but consuming a vendored dynamic artifact. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6596](https://github.com/CocoaPods/CocoaPods/issues/6596) - -* Fix building with static lib subprojects (previously only supported framework subprojects). - [Ben Asher](https://github.com/benasher44) - [#5830](https://github.com/CocoaPods/CocoaPods/issues/5830) - [#6306](https://github.com/CocoaPods/CocoaPods/issues/6306) - -* Fix regression from #6457 to ensure a correct error message is given when a spec is not found. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6457](https://github.com/CocoaPods/CocoaPods/issues/6457) - -* Provide a better error message if a podspec is found but cannot be parsed. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6457](https://github.com/CocoaPods/CocoaPods/issues/6457) - -* Only share pod target xcscheme if present during validation. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6558](https://github.com/CocoaPods/CocoaPods/pull/6558) - -* Properly compile storyboard for watch device family. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6516](https://github.com/CocoaPods/CocoaPods/issues/6516) - -* Support git progress for `pod repo update` and `pod install --repo-update` - [Alfredo Delli Bovi](https://github.com/adellibovi) - [#6525](https://github.com/CocoaPods/CocoaPods/issues/6525) - -* Return new exit code (31) when spec not found - [Alfredo Delli Bovi](https://github.com/adellibovi) - [#6033](https://github.com/CocoaPods/CocoaPods/issues/6033) - -* Provide better error message when spec not found - [Alfredo Delli Bovi](https://github.com/adellibovi) - [#6033](https://github.com/CocoaPods/CocoaPods/issues/6033) - - -## 1.2.1.beta.1 (2017-03-08) - -##### Enhancements - -* Use red text when pod installation fails - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6534](https://github.com/CocoaPods/CocoaPods/issues/6534) - -* Provide installation option to disable multiple pod sources warnings. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6497](https://github.com/CocoaPods/CocoaPods/pull/6497) - -* Use the colored2 gem instead of colored. - [Orta Therox](https://github.com/orta) - [xcodeproj#463](https://github.com/CocoaPods/Xcodeproj/pull/463) - -* Cache results of dynamic_binary? - [Ken Wigginton](https://github.com/hailstorm350) - [#6434](https://github.com/CocoaPods/CocoaPods/pull/6434) - -* Created `NOMENCLATURE.md` to keep a glossary of the most common terms used in cocoapods. - [Rob Contreras](https://github.com/robcontreras) - [#2379](https://github.com/CocoaPods/CocoaPods/pull/2379) - -##### Bug Fixes - -* Ensure Core Data models get added to the compile sources phase for header generation. - [Ben Asher](https://github.com/benasher44) - [#6259](https://github.com/CocoaPods/CocoaPods/issues/6259) - -* Do not crash when attempting to install pod with no supported targets. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6465](https://github.com/CocoaPods/CocoaPods/issues/6465) - -* Correctly handle `OTHER_LDFLAGS` for targets with inherit search paths and source pods. - [Justin Martin](https://github.com/justinseanmartin) - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6481](https://github.com/CocoaPods/CocoaPods/pull/6481) - -* Uses `${PODS_PODFILE_DIR_PATH}` for generated manifest lock script phase. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#5499](https://github.com/CocoaPods/CocoaPods/issues/5499) - -* Do not generate `UIRequiredDeviceCapabilities` for `tvOS` Info.plists. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6193](https://github.com/CocoaPods/CocoaPods/issues/6193) - -* Fix integration with vendored static frameworks and libraries. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6477](https://github.com/CocoaPods/CocoaPods/pull/6477) - -* Use `${SRCROOT}` rather than `${PODS_ROOT}` in the generated manifest lock script phase. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#5499](https://github.com/CocoaPods/CocoaPods/issues/5499) - -* Fix build phase resource references to point at PBXVariantGroups where relevant. - [Wes Campaigne](https://github.com/Westacular) - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6373](https://github.com/CocoaPods/CocoaPods/issues/6373) - -* Correctly set runtime search paths for OSX unit test bundles when using frameworks. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6435](https://github.com/CocoaPods/CocoaPods/pull/6435) - -* Add `--skip-import-validation` to skip linking a pod during lint. - [Samuel Giddins](https://github.com/segiddins) - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#5670](https://github.com/CocoaPods/CocoaPods/issues/5670) - -* Updated the colored2 gem (previous version removed from rubygems.org). - [Ben Asher](https://github.com/benasher44) - [#6533](https://github.com/CocoaPods/CocoaPods/pull/6533) - -## 1.2.0 (2017-01-28) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Do not link static frameworks to targets that use `inherit! search_paths`. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6065](https://github.com/CocoaPods/CocoaPods/issues/6065) - - -## 1.2.0.rc.1 (2017-01-13) - -##### Enhancements - -* Show git progress when downloading the CocoaPods Specs repo. - [Danielle Tomlinson](https://github.com/dantoml) - [#5937](https://github.com/CocoaPods/CocoaPods/issues/5937) - -* Move Installer target verification into the Xcode namespace - [Danielle Tomlinson](https://github.com/DanToml) - [#5607](https://github.com/CocoaPods/CocoaPods/pull/5607) - -##### Bug Fixes - -* None. - - -## 1.2.0.beta.3 (2016-12-28) - -##### Enhancements - -* `pod repo push` now accepts the `--swift-version` argument. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6217](https://github.com/CocoaPods/CocoaPods/issues/6217) - -* Output Swift targets when multiple versions of Swift are detected. - [Justin Martin](https://github.com/justinseanmartin) & [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6191](https://github.com/CocoaPods/CocoaPods/issues/6191) - -* [update] adding --sources to specify to only update pods from a repo - [Mark Schall](https://github.com/maschall) - [#5809](https://github.com/CocoaPods/CocoaPods/pull/5809) - -* Add aggregated search paths targets to vendored build settings - [Chris Ortman](https://github.com/chrisortman) - [Johannes Plunien](https://github.com/plu) - [#5512](https://github.com/CocoaPods/CocoaPods/issues/5512) - -* Use fetch and reset rather than a pull when updating specs repos. - [Danielle Tomlinson](https://github.com/dantoml) - [#6206](https://github.com/CocoaPods/CocoaPods/pull/6206) - -##### Bug Fixes - -* Fix default LD_RUNPATH_SEARCH_PATHS for host targets. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6006](https://github.com/CocoaPods/CocoaPods/issues/6006) - -* Fix codesigning issues when targets have spaces. - [Sam Gammon](https://github.com/sgammon) - [#6153](https://github.com/CocoaPods/CocoaPods/issues/6153) - -* Raise an exception if unable to find a reference for a path and handle symlink references. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#5427](https://github.com/CocoaPods/CocoaPods/issues/5427) - -* Re-escaped backslashes in embed_frameworks generator - [Harlan Haskins](https://github.com/harlanhaskins) - [#6121](https://github.com/CocoaPods/CocoaPods/issues/6121) - -* Escape spaces in CONFIGURATION_BUILD_DIR when creating header folders symlink - [Dmitry Obukhov](https://github.com/stel) - [#6146](https://github.com/CocoaPods/CocoaPods/pull/6146) - -* Fail gracefully when downloading a podspec in `pod spec lint` fails. - [Samuel Giddins](https://github.com/segiddins) - -* Remove the `const_missing` hack for `Pod::SourcesManager`. - [Samuel Giddins](https://github.com/segiddins) - -* Fixed code signing issue causing lint failure on macOS. - [Paul Cantrell](https://github.com/pcantrell) - [#5645](https://github.com/CocoaPods/CocoaPods/issues/5645) - -* Raise an exception when using a git version prior to 1.8.5. - [Danielle Tomlinson](https://github.com/dantoml) - [#6078](https://github.com/CocoaPods/CocoaPods/issues/6078) - -* Fix framework support for frameworks in sub-projects. - [Ben Asher](https://github.com/benasher44) - [#6123](https://github.com/CocoaPods/CocoaPods/issues/6123) - -* Remove errors that prevent host/extension target mismatches, which Xcode will warn about. - [Ben Asher](https://github.com/benasher44) - [#6173](https://github.com/CocoaPods/CocoaPods/issues/6173) - - -## 1.2.0.beta.1 (2016-10-28) - -##### Enhancements - -* Generate `PODS_TARGET_SRCROOT` build setting for each pod target. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#5375](https://github.com/CocoaPods/CocoaPods/issues/5375) - -* Add support for running CocoaPods on Linux. - [Samuel Giddins](https://github.com/segiddins) - -* Use native Ruby ASCII plist parsing and serialization, removing dependencies - on FFI, Xcode, and macOS. - [Samuel Giddins](https://github.com/segiddins) - -* Run codesigning in parallel in the embed frameworks build phase when - `COCOAPODS_PARALLEL_CODE_SIGN` is set to `true`. - [Ben Asher](https://github.com/benasher44) - [#6088](https://github.com/CocoaPods/CocoaPods/pull/6088) - -##### Bug Fixes - -* Add target-device tvOS in copy_resources generator. - [Konrad Feiler](https://github.com/Bersaelor) - [#6052](https://github.com/CocoaPods/CocoaPods/issues/6052) - -* Read the correct `SWIFT_VERSION` when generating target XCConfigs. - [Ben Asher](https://github.com/benasher44) - [#6067](https://github.com/CocoaPods/CocoaPods/issues/6067) - -* Don't explicitly set `ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES` to NO. - [Ben Asher](https://github.com/benasher44) - [#6064](https://github.com/CocoaPods/CocoaPods/issues/6064) - -* Redefine FOUNDATION_EXPORT for C-only pods in umbrella header. - [Chris Ballinger](https://github.com/chrisballinger) - [#6024](https://github.com/CocoaPods/CocoaPods/issues/6024) - - -## 1.1.1 (2016-10-20) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Strip newlines from .swift-version files. - [Danielle Tomlinson](https://github.com/dantoml) - [#6059](https://github.com/CocoaPods/CocoaPods/pull/6059) - - -## 1.1.0 (2016-10-19) - -##### Enhancements - -* Use host target for frameworks of XPC services. - [Ingmar Stein](https://github.com/IngmarStein) - [#6029](https://github.com/CocoaPods/CocoaPods/pull/6029) - -* Use Swift 3.0 by default during validation. - [Danielle Tomlinson](https://github.com/dantoml) - [#6042](https://github.com/CocoaPods/CocoaPods/pull/6042) - -* Exit with non-zero exit status if pod repo update fails - [Uku Loskit](https://github.com/UkuLoskit) - [#6037](https://github.com/CocoaPods/CocoaPods/issues/6037) - -* The validator has an API for accessing which version of Swift was used. - [Orta Therox](https://github.com/orta) - [#6049](https://github.com/CocoaPods/CocoaPods/pull/6049) - -##### Bug Fixes - -* None. - -* Redefine FOUNDATION_EXPORT for C-only pods in umbrella header. - [Chris Ballinger](https://github.com/chrisballinger) - [#6024](https://github.com/CocoaPods/CocoaPods/issues/6024) - -## 1.1.0.rc.3 (2016-10-11) - -##### Enhancements - -* Cache result of inhibit_warnings and include_in_build_config to speed up pod install. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#5934](https://github.com/CocoaPods/CocoaPods/pull/5934) - -* Tell users about the .swift-version file on validation failures. - [Danielle Tomlinson](https://github.com/dantoml) - [#5951](https://github.com/CocoaPods/CocoaPods/pull/5951) - -* Improve performance of PathList.read_file_system - [Heath Borders](https://github.com/hborders) - [#5890](https://github.com/CocoaPods/CocoaPods/issues/5890) - -* Cache result of uses_swift and should_build to speed up pod install. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#5837](https://github.com/CocoaPods/CocoaPods/pull/5837) - -* Remove uses of `cd` in generated scripts - [Ben Asher](https://github.com/benasher44) - [#5959](https://github.com/CocoaPods/CocoaPods/pull/5959) - -* Error with helpful message when integrating a pod into targets that have mismatched Swift versions. - [Ben Asher](https://github.com/benasher44) - [#5984](https://github.com/CocoaPods/CocoaPods/pull/5984) - -* Allow users to share pods between Objective-C and Swift targets. - [Danielle Tomlinson](https://github.com/dantoml) - [#5984](https://github.com/CocoaPods/CocoaPods/pull/5984) - -* Allow setting the linting Swift version via `--swift-version=VERSION` - [Danielle Tomlinson](https://github.com/dantoml) - [#5989](https://github.com/CocoaPods/CocoaPods/pull/5989) - -* Greenify pod install success message - [Stephen Hayes](https://github.com/schayes04) - [#5713](https://github.com/CocoaPods/CocoaPods/issues/5713) - -* Update EMBEDDED_CONTENT_CONTAINS_SWIFT flag behaviour based on xcode version. - [codymoorhouse](https://github.com/codymoorhouse) - [#5732](https://github.com/CocoaPods/CocoaPods/issues/5732) - -##### Bug Fixes - -* Remove special handling for messages apps - [Ben Asher](https://github.com/benasher44) - [#5860](https://github.com/CocoaPods/CocoaPods/issues/5860) - -* Ensure messages apps have an embed frameworks build phase - [Ben Asher](https://github.com/benasher44) - [#5860](https://github.com/CocoaPods/CocoaPods/issues/5860) - -* Fix linting of private pods when using libraries. - [Stefan Pühringer](https://github.com/b-ray) - [#5891](https://github.com/CocoaPods/CocoaPods/issues/5891) - - -## 1.1.0.rc.2 (2016-09-13) - -##### Enhancements - -* Use the SWIFT_VERSION when linting pods. To lint with Swift 3.0 - add a Swift Version file. `echo "3.0" >> .swift-version`. - [Danielle Tomlinson](https://github.com/dantoml) - [#5841](https://github.com/CocoaPods/CocoaPods/pull/5841) - -##### Bug Fixes - -* Correctly pass Pod:VERSION in `pod lib create`. - [Danielle Tomlinson](https://github.com/dantoml) - [#5840](https://github.com/CocoaPods/CocoaPods/issues/5840) - - -## 1.1.0.rc.1 (2016-09-10) - -##### Enhancements - -* - -##### Bug Fixes - -* Wrap generated import headers with __OBJC__ to fix C only pods. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#5291](https://github.com/CocoaPods/CocoaPods/issues/5291) - -* Prevent crash when generating acknowledgements when license type is not specified. - [Marcelo Fabri](https://github.com/marcelofabri) - [#5826](https://github.com/CocoaPods/CocoaPods/issues/5826) - -* Pass full path to App.xcworkspace for spec validation, and use `git -C` for `pod repo push` git ops. - [Ben Asher](https://github.com/benasher44) - [#5805](https://github.com/CocoaPods/CocoaPods/issues/5805) - - -## 1.1.0.beta.2 (2016-09-03) - -##### Enhancements - -* Remove references to the pre-1.0 Migrator. - [Danielle Tomlinson](https://github.com/dantoml) - [#5635](https://github.com/CocoaPods/CocoaPods/pull/5635) - -* Improve performance of dependency resolution. - [yanzhiwei147](https://github.com/yanzhiwei147) - [#5510](https://github.com/CocoaPods/CocoaPods/pull/5510) - -* Add support for building Messages applications. - [Ben Asher](https://github.com/benasher44) - [#5726](https://github.com/CocoaPods/CocoaPods/pull/5726) - -* Improved messaging when missing host targets for embedded targets. - Improved support for framework-only projects. - [Ben Asher](https://github.com/benasher44) - [#5733](https://github.com/CocoaPods/CocoaPods/pull/5733) - -* Set ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES when appropriate. - [Ben Asher](https://github.com/benasher44) - [#5732](https://github.com/CocoaPods/CocoaPods/pull/5732) - -* Verify that embedded target platform and swift version matches the host. - [Ben Asher](https://github.com/benasher44) - [#5747](https://github.com/CocoaPods/CocoaPods/pull/5747) - -* Pass the version of CocoaPods to `pod lib create`'s configure script. - [orta](https://github.com/orta) - [#5787](https://github.com/CocoaPods/CocoaPods/pull/5787) - -* Improve host target detection for embedded targets - in sub-projects. - [Ben Asher](https://github.com/benasher44) - [#5622](https://github.com/CocoaPods/CocoaPods/issues/5622) - -##### Bug Fixes - -* Hash scope suffixes if they are over 50 characters to prevent file paths from being too long. - [Danielle Tomlinson](https://github.com/dantoml) - [#5491](https://github.com/CocoaPods/CocoaPods/issues/5491) - -* Fix codesigning identity on watchOS and tvOS targets. - [Danielle Tomlinson](https://github.com/dantoml) - [#5686](https://github.com/CocoaPods/CocoaPods/issues/5686) - -* Fix SWIFT_VERSION not being read when only defined at the project level. - [Ben Asher](https://github.com/benasher44) - [#5700](https://github.com/CocoaPods/CocoaPods/issues/5700) and [#5737](https://github.com/CocoaPods/CocoaPods/issues/5737) - -* Fix analyzer checking the compatibility of an embedded target with a host that has not been added the Podfile. - [Ben Asher](https://github.com/benasher44) - [#5783](https://github.com/CocoaPods/CocoaPods/issues/5783) - -## 1.1.0.beta.1 (2016-07-11) - -##### Enhancements - -* Move Pods Project generation to an `Xcode` Namespace. - [Daniel Tomlinson](https://github.com/dantoml) - [#5480](https://github.com/CocoaPods/CocoaPods/pull/5480) - -* Add the ability to inhibit swift warnings. - [Peter Ryszkiewicz](https://github.com/pRizz) - [#5414](https://github.com/CocoaPods/CocoaPods/pull/5414) - -* Use `git ls-remote` to skip full clones for branch dependencies. - [Juan Civile](https://github.com/champo) - [#5376](https://github.com/CocoaPods/CocoaPods/issues/5376) - -* [repo/push] --use-json to convert podspecs to JSON format when pushing. - [Mark Schall](https://github.com/maschall) - [#5568](https://github.com/CocoaPods/CocoaPods/pull/5568) - -* Set 'Allow app extension API only' for Messages extensions. - [Boris Bügling](https://github.com/neonichu) - [#5558](https://github.com/CocoaPods/CocoaPods/issues/5558) - -* Accept `pod repo push` with URL instead of only repo name. - [Mark Schall](https://github.com/maschall) - [#5572](https://github.com/CocoaPods/CocoaPods/pull/5572) - -* [Installer] Set the SWIFT_VERSION for CocoaPods generated targets. - [Danielle Tomlinson](https://github.com/DanToml) - [#5540](https://github.com/CocoaPods/CocoaPods/pull/5540) - -* Print message when skipping user project integration. - [Danielle Tomlinson](https://github.com/dantoml) - [#5517](https://github.com/CocoaPods/CocoaPods/issues/5517) - -* Show GitHub Issues that could be related to exceptions. - [Orta Therox](https://github.com/orta) - [#4817](https://github.com/CocoaPods/CocoaPods/issues/4817) - -* Improve handling of app extensions, watch os 1 extensions - and framework targets. - [Ben Asher](https://github.com/benasher44) - [#4203](https://github.com/CocoaPods/CocoaPods/issues/4203) - -* Add a license type to generated acknowledgements file in plist. - [Naoto Kaneko](https://github.com/naoty) - [#5436](https://github.com/CocoaPods/CocoaPods/pull/5436) - -##### Bug Fixes - -* Fix local pod platform conflict error message. - [Muhammed Yavuz Nuzumlalı](https://github.com/manuyavuz) - [#5052](https://github.com/CocoaPods/CocoaPods/issues/5052) - -* Avoid use of `activesupport` version 5 to stay compatible with macOS system - Ruby. - [Boris Bügling](https://github.com/neonichu) - [#5602](https://github.com/CocoaPods/CocoaPods/issues/5602) - -* Fix installing pods with `use_frameworks` when deduplication is disabled. - [Samuel Giddins](https://github.com/segiddins) - [#5481](https://github.com/CocoaPods/CocoaPods/issues/5481) - -* Running `pod setup --silent` will now properly silence git output while - updating the repository. - [Samuel Giddins](https://github.com/segiddins) - -* Fix linting pods that depend upon `XCTest`. - [Samuel Giddins](https://github.com/segiddins) - [#5321](https://github.com/CocoaPods/CocoaPods/issues/5321) - -* Use `require` instead of `autoload` to solve an issue with loading - `fourflusher`. - [Boris Bügling](https://github.com/neonichu) - [#5445](https://github.com/CocoaPods/CocoaPods/issues/5445) - -* Resolve cyclic dependencies when creating pod targets. - [Juan Civile](https://github.com/champo) - [#5362](https://github.com/CocoaPods/CocoaPods/issues/5362) - -* Fix embedding frameworks in UI Testing bundles. - [Daniel Tomlinson](https://github.com/dantoml) - [#5250](https://github.com/CocoaPods/CocoaPods/issues/5250) - -* Ensure attempting to print a path in the error report doesn't itself error. - [Samuel Giddins](https://github.com/) - [#5541](https://github.com/CocoaPods/CocoaPods/issues/5541) - -* Fix linting with Xcode 8. - [Boris Bügling](https://github.com/neonichu) - [#5529](https://github.com/CocoaPods/CocoaPods/issues/5529) - -* Fix linting with Xcode 8 by disabling it entirely. - [Boris Bügling](https://github.com/neonichu) - [#5528](https://github.com/CocoaPods/CocoaPods/issues/5528) - -* Error during install when there are duplicate library names. - [Daniel Tomlinson](https://github.com/dantoml) - [#4014](https://github.com/CocoaPods/CocoaPods/issues/4014) - -* Make the `Check Pods Manifest.lock` script write errors to STDERR and improve - POSIX shell compatibility. - [Simon Warta](https://github.com/webmaster128) - [#5595](https://github.com/CocoaPods/CocoaPods/pull/5595) - - -## 1.0.1 (2016-06-02) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Symlink the header folders in the framework bundle's root directory - by a new shell script build phase if `header_mappings_dir` is used - with frameworks. - [Marius Rackwitz](https://github.com/mrackwitz) - [#5313](https://github.com/CocoaPods/CocoaPods/issues/5313) - -* Removed emojis in Build Phases names — as it seems that some third party tools have trouble with them. - [Olivier Halligon](https://github.com/AliSoftware) - [#5382](https://github.com/CocoaPods/CocoaPods/pull/5382) - -* Ensure `Set` is defined before using it. - [Samuel Giddins](https://github.com/segiddins) - [#5287](https://github.com/CocoaPods/CocoaPods/issues/5287) - -* Add --target-device to ibtool invocation for XIBs - [Juan Civile](https://github.com/champo) - [#5282](https://github.com/CocoaPods/CocoaPods/issues/5282) - -* Fix error when executables cannot be found. - [Jan Berkel](https://github.com/jberkel) - [#5319](https://github.com/CocoaPods/CocoaPods/pull/5319) - -* Avoid removing all files when root directory contains unicode characters. - [Marc Boquet](https://github.com/marcboquet) - [#5294](https://github.com/CocoaPods/CocoaPods/issues/5294) - -* Guarding from crash if pod lib create has a + character in the name. - [William Entriken](https://github.com/fulldecent) - [CocoaPods/pod-template#69](https://github.com/CocoaPods/pod-template/issues/69) - -* Use target product types to determine whether a target is a test target when - running `pod init`. - [Samuel Giddins](https://github.com/segiddins) - [#5378](https://github.com/CocoaPods/CocoaPods/issues/5378) - - -## 1.0.0 (2016-05-10) - -##### Enhancements - -* Validate that resource bundles declared in the podspec contain resources. - [Samuel Giddins](https://github.com/segiddins) - [#5218](https://github.com/CocoaPods/CocoaPods/issues/5218) - -* Improvements to the error messaging around missing dependencies. - [Orta Therox](https://github.com/orta) - [#5260](https://github.com/CocoaPods/CocoaPods/issues/5260) - -* Make sharing schemes for development pods an installation option - (`share_schemes_for_development_pods`) and disable sharing schemes - by default. - [Samuel Giddins](https://github.com/segiddins) - -##### Bug Fixes - -* Fix search paths inheritance when there are transitive dependencies. - [Samuel Giddins](https://github.com/segiddins) - [#5264](https://github.com/CocoaPods/CocoaPods/issues/5264) - - -## 1.0.0.rc.2 (2016-05-04) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Handle when an abstract target has no declared platform without crashing. - [Samuel Giddins](https://github.com/segiddins) - [#5236](https://github.com/CocoaPods/CocoaPods/issues/5236) - -* Don't recurse into child directories to find podspecs when running - `pod spec lint`. - [Samuel Giddins](https://github.com/segiddins) - [#5244](https://github.com/CocoaPods/CocoaPods/issues/5244) - - -## 1.0.0.rc.1 (2016-04-30) - -##### Enhancements - -* The `pod init` command now uses target inheritance for test targets - in the generated Podfile. - [Orta Therox](https://github.com/orta) - [#4714](https://github.com/CocoaPods/CocoaPods/issues/4714) - -* Support customized build directories by letting user xcconfig definitions - rely on the new overridable alias build variable `PODS_BUILD_DIR`. - [Marius Rackwitz](https://github.com/mrackwitz) - [#5217](https://github.com/CocoaPods/CocoaPods/issues/5217) - -##### Bug Fixes - -* Fix for `pod repo push --help` throwing an error. - [Boris Bügling](https://github.com/neonichu) - [#5214](https://github.com/CocoaPods/CocoaPods/pull/5214) - -* The warning for not having utf-8 set as the default encoding for a - terminal now properly respects the `--no-ansi` argument. - [Joshua Kalpin](https://github.com/Kapin) - [#5199](https://github.com/CocoaPods/CocoaPods/pull/5199) - - -## 1.0.0.beta.8 (2016-04-15) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Headers from vendored frameworks no longer end up in the `HEADER_SEARCH_PATH` - when using frameworks. They are now assumed to be already present as modular - headers in the framework itself. - [Mark Spanbroek](https://github.com/markspanbroek) - [#5146](https://github.com/CocoaPods/CocoaPods/pull/5146) - -* Access to the `Pod::SourcesManager` constant has been restored, though its use - is considered deprecated and subject to removal at any time. Migrate to use - `Pod::Config.instance.sources_manager` in some manner as soon as possible. - [Samuel Giddins](https://github.com/segiddins) - -* Running `pod repo update --silent` will now properly silence git output while - updating the repository. - [Samuel Giddins](https://github.com/segiddins) - - -## 1.0.0.beta.7 (2016-04-15) - -##### Enhancements - -* When an unknown build configuration is mentioned in the Podfile, CocoaPods - will suggest the build configurations found in the user project. - [Samuel Giddins](https://github.com/segiddins) - [#5113](https://github.com/CocoaPods/CocoaPods/issues/5113) - -* Improved the error message when a matching spec cannot be found, - mentioning that now `pod repo update` is not implicit when running `pod - install`. - [Orta Therox](https://github.com/orta) - [#5135](https://github.com/CocoaPods/CocoaPods/issues/5135) - -* Add support for sharded specs directories. - [Samuel Giddins](https://github.com/segiddins) - [#5002](https://github.com/CocoaPods/CocoaPods/issues/5002) - -* Pass the build setting `OTHER_CODE_SIGN_FLAGS` to codesign for the generated - embed frameworks build phase's script, as Xcode does when signing natively. - [Václav Slavík](https://github.com/vslavik) - [#5087](https://github.com/CocoaPods/CocoaPods/pull/5087) - -##### Bug Fixes - -* Sort files from `Dir.glob` explicitly to produce same result on case sensitive - file system as result on case insensitive file system. - [Soutaro Matsumoto](https://github.com/soutaro) - -* Fix build path for resource bundles. - [Marius Rackwitz](https://github.com/mrackwitz) - [#5034](https://github.com/CocoaPods/CocoaPods/issues/5034) - -* Rely on `TARGET_BUILD_DIR` instead of `CONFIGURATION_BUILD_DIR` in the - generated embed resources build phase's script, so that UI test targets can - be run. - [seaders](https://github.com/seaders) - [#5133](https://github.com/CocoaPods/CocoaPods/issues/5133) - -* Ensure that a `CFBundleVersion` is set for resource bundles' Info.plist - files. - [Samuel Giddins](https://github.com/segiddins) - [#4897](https://github.com/CocoaPods/CocoaPods/issues/4897) - - -## 1.0.0.beta.6 (2016-03-15) - -##### Breaking - -* Running `pod install` doesn't imply an automatic spec repo update. - The old behavior can be achieved by passing in the option `--repo-update` - or running `pod repo update`. - [Marius Rackwitz](https://github.com/mrackwitz) - [#5004](https://github.com/CocoaPods/CocoaPods/issues/5004) - -* Remove the configuration variable `skip_repo_update` as the default behavior - varies now between `pod install` and `pod (update|outdated)`. - [Marius Rackwitz](https://github.com/mrackwitz) - [#5017](https://github.com/CocoaPods/CocoaPods/issues/5017) - -##### Enhancements - -* The master specs repo will no longer perform 'no-op' git fetches. This should - help to reduce the load on GitHub's servers. - [Daniel Tomlinson](https://github.com/DanielTomlinson) - [#5005](https://github.com/CocoaPods/CocoaPods/issues/5005) - [#4989](https://github.com/CocoaPods/CocoaPods/issues/4989) - -* The specs repos will no longer support shallow clones to reduce CPU load - on git servers. Pre-existing shallow clones of the `master` repo will - automatically be upgraded to deep clones when the repo is updated. - [Samuel Giddins](https://github.com/segiddins) - [#5016](https://github.com/CocoaPods/CocoaPods/issues/5016) - -* The validator will check that all `public_header_files` and - `private_header_files` are also present in `source_files`. - [Samuel Giddins](https://github.com/segiddins) - [#4936](https://github.com/CocoaPods/CocoaPods/issues/4936) - -##### Bug Fixes - -* The master specs repository can no longer be added via `pod repo add`, but - instead must be done via `pod setup`. - [Samuel Giddins](https://github.com/segiddins) - -* Print a friendly error message when the platform for a target cannot be - inferred. - [Samuel Giddins](https://github.com/segiddins) - [#4790](https://github.com/CocoaPods/CocoaPods/issues/4790) - -* Rely on `TARGET_BUILD_DIR` instead of `CONFIGURATION_BUILD_DIR` in the - generated embed frameworks build phase's script, so that UI test targets can - be run. - [Marius Rackwitz](https://github.com/mrackwitz) - [#5022](https://github.com/CocoaPods/CocoaPods/issues/5022) - -* Fix build paths for resources bundles. - [Marius Rackwitz](https://github.com/mrackwitz) - [#5028](https://github.com/CocoaPods/CocoaPods/pull/5028) - -* Validate that a Podfile does not declare the same target twice. - [Samuel Giddins](https://github.com/segiddins) - [#5029](https://github.com/CocoaPods/CocoaPods/issues/5029) - - -## 1.0.0.beta.5 (2016-03-08) - -##### Breaking - -* Development pods will no longer be implicitly unlocked. This makes CocoaPods respect - constraints related to dependencies of development pods in the lockfile. - - If you change the constraints of a dependency of your development pod and want to - override the locked version, you will have to use - `pod update ${DEPENDENCY_NAME}` manually. - [Muhammed Yavuz Nuzumlalı](https://github.com/manuyavuz) - [#4211](https://github.com/CocoaPods/CocoaPods/issues/4211) - [#4577](https://github.com/CocoaPods/CocoaPods/issues/4577) - [#4580](https://github.com/CocoaPods/CocoaPods/issues/4580) - -##### Enhancements - -* Add the :package: emoji in front of CocoaPods Script Build Phases - to quickly and visually differentiate them from other phases. - [Olivier Halligon](https://github.com/AliSoftware) - [#4985](https://github.com/CocoaPods/CocoaPods/issues/4985) - -* Enable syntax highlighting on the Podfile in the generated - `Pods.xcodeproj`. - [Samuel Giddins](https://github.com/segiddins) - [#4962](https://github.com/CocoaPods/CocoaPods/issues/4962) - -##### Bug Fixes - -* Fixes paths passed for resources bundles in the copy resources script. - [Marius Rackwitz](https://github.com/mrackwitz) - [#4954](https://github.com/CocoaPods/CocoaPods/pull/4954) - -* Fix saying the `master` specs repo exists when it has not been set up. - [Samuel Giddins](https://github.com/segiddins) - [#4955](https://github.com/CocoaPods/CocoaPods/issues/4955) - -* Move `${TARGET_DEVICE_ARGS}` out of the quotations for `--sdk` in the - `Copy Pods Resources` build phase. - [seaders](https://github.com/seaders) [#4940](https://github.com/CocoaPods/CocoaPods/issues/4940) - -* Handle when `$PATH` isn't set. - [Samuel Giddins](https://github.com/segiddins) - -* Module maps that are set per-platform will be installed for the correct - platform. - [Samuel Giddins](https://github.com/segiddins) - [#4968](https://github.com/CocoaPods/CocoaPods/issues/4968) - - -## 1.0.0.beta.4 (2016-02-24) - -##### Enhancements - -* Allow deduplication to take effect even when the same pod is used with - different sets of subspecs across different platforms. - This changes the general naming scheme scoped pod targets. They are - suffixed now on base of what makes them different among others for the - same root spec instead of being prefixed by the dependent target. - [Marius Rackwitz](https://github.com/mrackwitz) - [#4146](https://github.com/CocoaPods/CocoaPods/pull/4146) - -* Pass `COCOAPODS_VERSION` as environment variable when invoking the - `prepare_command`. - [Marius Rackwitz](https://github.com/mrackwitz) - [#4933](https://github.com/CocoaPods/CocoaPods/pull/4933) - -##### Bug Fixes - -* Pods are built by default in another scoping level of the build products - directory identified by their name to prevent name clashes among - dependencies. - [Marius Rackwitz](https://github.com/mrackwitz) - [#4146](https://github.com/CocoaPods/CocoaPods/pull/4146) - -* Fix mixed integrations where static libraries are used along frameworks - from different target definitions in one Podfile. - [Marius Rackwitz](https://github.com/mrackwitz) - [#4146](https://github.com/CocoaPods/CocoaPods/pull/4146) - -* Pass target device arguments to `ibtool` in the copy resources script, fixing - compilation of storyboards when targeting versions of iOS prior to iOS 8. - [seaders](https://github.com/seaders) - [#4913](https://github.com/CocoaPods/CocoaPods/issues/4913) - -* Fix `pod repo lint` when passed a path argument. - [Boris Bügling](https://github.com/neonichu) - [#4883](https://github.com/CocoaPods/CocoaPods/issues/4883) - - -## 1.0.0.beta.3 (2016-02-03) - -##### Breaking - -* Rename the `xcodeproj` Podfile directive to `project`. - [Marius Rackwitz](https://github.com/mrackwitz) - [Core#298](https://github.com/CocoaPods/Core/issues/298) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Don't try to embed project headers into frameworks. - [Marius Rackwitz](https://github.com/mrackwitz) - [#4819](https://github.com/CocoaPods/CocoaPods/issues/4819) - -* Fix a crash in the analyzer when target deduplication is deactivated. - [Marius Rackwitz](https://github.com/mrackwitz) - [#4751](https://github.com/CocoaPods/CocoaPods/issues/4751) - -* Handle CoreData mapping models with recursive resource globs. - [Eric Firestone](https://github.com/efirestone) - [#4809](https://github.com/CocoaPods/CocoaPods/pull/4809) - -* Generate valid xcconfig when target name includes spaces. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#4783](https://github.com/CocoaPods/CocoaPods/issues/4783) - -* Properly add resource files to resources build phase. - [Eric Firestone](https://github.com/efirestone) - [#4762](https://github.com/CocoaPods/CocoaPods/issues/4762) - -* Fix suggestion of sudo when it actually isn't needed. - [Marcel Jackwerth](https://github.com/sirlantis) - -* Set the `TARGET_DEVICE_FAMILY` to support both iPhone and iPad for iOS - resource bundle targets. - [Andy Rifken](https://github.com/arifken) - -* Share user schemes of `Pods.xcodeproj` after generating deterministic UUIDS. - [Samuel Giddins](https://github.com/segiddins) - -* Only attempt to `import` a framework during linting if the pod has source - files, and is thus being built by CocoaPods. - [Samuel Giddins](https://github.com/segiddins) - [#4823](https://github.com/CocoaPods/CocoaPods/issues/4823) - -* Determine whether an external source needs to be fetched when updating a - dependency regardless of subspec names. - [Samuel Giddins](https://github.com/segiddins) - [#4821](https://github.com/CocoaPods/CocoaPods/issues/4821) - - -## 1.0.0.beta.2 (2016-01-05) - -##### Enhancements - -* Present a friendly error suggesting running `pod install` when there are - missing local podspecs when running `pod outdated`. - [Samuel Giddins](https://github.com/segiddins) - [#4716](https://github.com/CocoaPods/CocoaPods/issues/4716) - -* Don't warn about setting base config when identical to current config. - [Jed Lewison](https://github.com/jedlewison) - [#4722](https://github.com/CocoaPods/CocoaPods/issues/4722) - -* Add `user_targets` method to the `UmbrellaTargetDescription` in the - post-install hooks context. - [Samuel Giddins](https://github.com/segiddins) - -##### Bug Fixes - -* Always fetch a `:podspec` dependency's podspec when it is missing in the - `Pods` directory. - [Samuel Giddins](https://github.com/segiddins) - [#4717](https://github.com/CocoaPods/CocoaPods/issues/4717) - -* The `Info.plist` file will now be generated properly for resource bundles, - setting the proper `CFBundlePackageType` and omitting the `CFBundleExecutable` - key. - [Samuel Giddins](https://github.com/segiddins) - [Xcodeproj#259](https://github.com/CocoaPods/Xcodeproj/issues/259) - -* Fix crash when deintegrating due to major version change and there are - multiple root-level Xcode projects. - [Samuel Giddins](https://github.com/segiddins) - -* Ensure the `sandbox_root` attribute is set on the pre-install hooks context. - [Samuel Giddins](https://github.com/segiddins) - - -## 1.0.0.beta.1 (2015-12-30) - -##### Breaking - -* The `link_with` Podfile DSL method has been removed in favor of target - inheritance. - [Samuel Giddins](https://github.com/segiddins) - -* The `:exclusive => true` Podfile DSL target option has been removed in favor - of the `inherit! :search_paths` directive. - [Samuel Giddins](https://github.com/segiddins) - -* The specification of `:head` dependencies has been removed. - [Samuel Giddins](https://github.com/segiddins) - [#4673](https://github.com/CocoaPods/CocoaPods/issues/4673) - -* The deprecated `:local` dependency option has been removed in favor of the - equivalent `:path` option. - [Samuel Giddins](https://github.com/segiddins) - -* The deprecated `dependency` method in the Podfile DSL has been removed in - favor of the equivalent `pod` method. - [Samuel Giddins](https://github.com/segiddins) - -* The deprecated `preferred_dependency` method in the Specification DSL has been - removed in favor of the equivalent `default_subspecs` method. - [Samuel Giddins](https://github.com/segiddins) - -* The `docset_url` Specification attribute has been removed. - [Samuel Giddins](https://github.com/segiddins) - [Core#284](https://github.com/CocoaPods/Core/issues/284) - -* Build configuration names are no longer set as pre-processor defines, but - rather `POD_CONFIGURATION_$CONFIGURATION_NAME` is defined in order to lessen - conflicts with pod code. - [#4143](https://github.com/CocoaPods/CocoaPods/issues/4143) - -##### Highlighted Enhancements That Need Testing - -* The Podfile DSL has been cleaned up, with the removal of confusing options and - the introduction of abstract targets, search paths-only inheritance, the - specification of installation options, and the removal of head dependencies. - [Samuel Giddins](https://github.com/segiddins) - [#840](https://github.com/CocoaPods/CocoaPods/issues/840) - -##### Enhancements - -* Add the ability to add a custom commit message when pushing a spec. - [Bart Jacobs](https://github.com/bartjacobs) - [#4583](https://github.com/CocoaPods/CocoaPods/issues/4583) - -* Added support for `pod env` to print the pod environment without having to crash. - [Hemal Shah](https://github.com/hemal) - [#3660](https://github.com/CocoaPods/CocoaPods/issues/3660) - -* Add support for specifying :source with a pod dependency. - [Eric Firestone](https://github.com/efirestone) - [#4486](https://github.com/CocoaPods/CocoaPods/pull/4486) - -* Ask user to run `pod install` when a resource not found during in copy resources script. - [Muhammed Yavuz Nuzumlalı](https://github.com/manuyavuz) - -* Add support to track `.def` sources. -* Add support to track `.def` files as headers. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#338](https://github.com/CocoaPods/Xcodeproj/pull/338) - -* `Pod::Installer::PostInstallHooksContext` now offers access to the `sandbox` - object. - [Marcelo Fabri](https://github.com/marcelofabri) - [#4487](https://github.com/CocoaPods/CocoaPods/pull/4487) - -* Improve sorting algorithm for `pod search`. - [Muhammed Yavuz Nuzumlalı](https://github.com/manuyavuz) - [cocoapods-search#12](https://github.com/CocoaPods/cocoapods-search/issues/12) - -* Improve `pod search` performance while using _`--full`_ flag. - [Muhammed Yavuz Nuzumlalı](https://github.com/manuyavuz) - [cocoapods-search#8](https://github.com/CocoaPods/cocoapods-search/issues/8) - -* Improve message when there is no spec in repos for dependency set in Podfile. - [Muhammed Yavuz Nuzumlalı](https://github.com/manuyavuz) - [#4430](https://github.com/CocoaPods/CocoaPods/issues/4430) - -* Reduce the number of times the user's Xcode project is opened, speeding up - installation. - [Samuel Giddins](https://github.com/segiddins) - [#4374](https://github.com/CocoaPods/CocoaPods/issues/4374) - -* Improving the performance of Pod::Installer::Analyzer#generate_pod_targets - [Daniel Ribeiro](https://github.com/danielribeiro) - [#4399](https://github.com/CocoaPods/CocoaPods/pull/4399) - -* Framework pods that have a `header_mappings_dirs` set will now produce - frameworks with headers that respect the nesting. - [Samuel Giddins](https://github.com/segiddins) - -* The validator will now ensure that pods with a `header_mappings_dirs` have all - of their headers inside that directory. - [Samuel Giddins](https://github.com/segiddins) - -* Pods will be validated with the `-Wincomplete-umbrella` compiler flag to - ensure module maps are valid. - [Samuel Giddins](https://github.com/segiddins) - [#3428](https://github.com/CocoaPods/CocoaPods/issues/3428) - -* The validator will now attempt to build an app that imports the pod. - [Samuel Giddins](https://github.com/segiddins) - [#2095](https://github.com/CocoaPods/CocoaPods/issues/2095) - [#2134](https://github.com/CocoaPods/CocoaPods/issues/2134) - -* The `Info.plist` file's `CFBundleIdentifier` is now set via the - `PRODUCT_BUNDLE_IDENTIFIER` build setting, consistent with Xcode 7. - [Samuel Giddins](https://github.com/segiddins) - [#4426](https://github.com/CocoaPods/CocoaPods/issues/4426) - -* Externally-sourced pods will now have their specifications quickly linted. - [Samuel Giddins](https://github.com/segiddins) - -* Set the deployment target on pods to be that which is defined in the - podspec. - [Samuel Giddins](https://github.com/segiddins) - [#4354](https://github.com/CocoaPods/CocoaPods/issues/3454) - -* Set a deployment target for resource bundle targets. - [Samuel Giddins](https://github.com/segiddins) - [#3347](https://github.com/CocoaPods/CocoaPods/issues/3347) - -* Targets that are no longer integrated with CocoaPods will be properly - de-integrated when installation occurs. - [Samuel Giddins](https://github.com/segiddins) - -* Targets that are integrated will be ensured that they have all - CocoaPods-related settings and phases properly installed. - [Samuel Giddins](https://github.com/segiddins) - -* Total de-integration will happen whenever the major version of CocoaPods - changes, ensuring backwards-incompatible changes are properly applied. - [Samuel Giddins](https://github.com/segiddins) - -* The Podfile now allows specifying installation options via the `install!` - directive. - [Samuel Giddins](https://github.com/segiddins) - [Core#151](https://github.com/CocoaPods/Core/issues/151) - -* The Podfile now allows marking targets as `abstract` and specifying the pod - inheritance mode via the `inherit!` directive. - [Samuel Giddins](https://github.com/segiddins) - [#1249](https://github.com/CocoaPods/CocoaPods/issues/1249) - [#1626](https://github.com/CocoaPods/CocoaPods/issues/1626) - [#4001](https://github.com/CocoaPods/CocoaPods/issues/4001) - -##### Bug Fixes - -* Fix compiling of localized resources. - [Eric Firestone](https://github.com/efirestone) - [#1653](https://github.com/CocoaPods/CocoaPods/issues/1653) - -* Fix compiling of asset catalog files inside resource bundles. - [Muhammed Yavuz Nuzumlalı](https://github.com/manuyavuz) - [#4501](https://github.com/CocoaPods/CocoaPods/issues/4501) - -* Prevent installer to be run from inside sandbox directory. - [Muhammed Yavuz Nuzumlalı](https://github.com/manuyavuz) - -* Improve repo lint error message when no repo found with given name. - [Muhammed Yavuz Nuzumlalı](https://github.com/manuyavuz) - [#4142](https://github.com/CocoaPods/CocoaPods/issues/4142) - -* Fix a crash in dependency resolution when running Ruby 2.3. - [Samuel Giddins](https://github.com/segiddins) - [#4345](https://github.com/CocoaPods/CocoaPods/issues/4345) - -* Fix handling of localized files in Pods installed as frameworks. - [Tim Bodeit](https://github.com/timbodeit) - [#2597](https://github.com/CocoaPods/CocoaPods/issues/2597) - -* Only include native targets when generating the Podfile in `pod init`. - [Samuel Giddins](https://github.com/segiddins) - [#2169](https://github.com/CocoaPods/CocoaPods/issues/2169) - -* Ensure that generated `Info.plist` files have a `CFBundleShortVersionString` - that is precisely three dot-separated numbers. - [Samuel Giddins](https://github.com/segiddins) - [#4421](https://github.com/CocoaPods/CocoaPods/issues/4421) - -* Set the `APPLICATION_EXTENSION_API_ONLY` build setting if integrating with a - tvOS extension target, or a target that has the setting set to `YES`. - [Samuel Giddins](https://github.com/segiddins) - [#3644](https://github.com/CocoaPods/CocoaPods/issues/3644) - [#4393](https://github.com/CocoaPods/CocoaPods/issues/4393) - -* Only the root directory of externally-sourced pods will be searched for - podspecs. - [Samuel Giddins](https://github.com/segiddins) - [#3683](https://github.com/CocoaPods/CocoaPods/issues/3683) - -* Remove the library name's extension when adding it in the "linker flags" build - setting to support dynamic libraries. - [Andrea Cremaschi](https://github.com/andreacremaschi) - [#4468](https://github.com/CocoaPods/CocoaPods/issues/4468) - -* Specifying relative subspec names to the linter is now supported. - [Samuel Giddins](https://github.com/segiddins) - [#1917](https://github.com/CocoaPods/CocoaPods/issues/1917) - -* Headers used to build a pod will no longer be duplicated for frameworks. - [Samuel Giddins](https://github.com/segiddins) - [#4420](https://github.com/CocoaPods/CocoaPods/issues/4420) - -* The `UIRequiredDeviceCapabilities` key is now specified in the `Info.plist` - file for tvOS pods built as frameworks. - [Samuel Giddins](https://github.com/segiddins) - [#4514](https://github.com/CocoaPods/CocoaPods/issues/4514) - -* Fix Swift code completion for Development Pods by using `realpath` for - symlinked source files. - [Boris Bügling](https://github.com/neonichu) - [#3777](https://github.com/CocoaPods/CocoaPods/issues/3777) - -* Avoid the duplicate UUID warning when a Pod is installed for multiple - platforms. - [Samuel Giddins](https://github.com/segiddins) - [#4521](https://github.com/CocoaPods/CocoaPods/issues/4521) - -* Changing the name of a target in a Podfile will no longer cause warnings about - being unable to set the base configuration XCConfig. - [Samuel Giddins](https://github.com/segiddins) - -* Ensure that linking multiple times against the same framework does not trigger - the duplicate module name check for frameworks. - [Boris Bügling](https://github.com/neonichu) - [Samuel Giddins](https://github.com/segiddins) - [#4550](https://github.com/CocoaPods/CocoaPods/issues/4550) - -* Fix lint in Xcode 7.2, it requires `-destination`. - [Boris Bügling](https://github.com/neonichu) - [#4652](https://github.com/CocoaPods/CocoaPods/pull/4652) - -* Empty podfiles / target blocks no longer break the user's Xcode project. - [Samuel Giddins](https://github.com/segiddins) - [#3617](https://github.com/CocoaPods/CocoaPods/issues/3617) - -* The pre-processor define for `DEBUG` will be set for all debug-based build - configurations when building pods. - [Samuel Giddins](https://github.com/segiddins) - [#4148](https://github.com/CocoaPods/CocoaPods/issues/4148) - - -## 0.39.0 (2015-10-09) - -##### Enhancements - -* Podfile-specified options are passed to plugins as hashes that treat string - and symbol keys identically. - [Samuel Giddins](https://github.com/segiddins) - [#3354](https://github.com/CocoaPods/CocoaPods/issues/3354) - -##### Bug Fixes - -* Only link dynamic vendored frameworks and libraries of pod dependencies. - [Kevin Coleman](https://github.com/kcoleman731) - [#4336](https://github.com/CocoaPods/CocoaPods/issues/4336) - - -## 0.39.0.rc.1 (2015-10-05) - -##### Enhancements - -* Support for adding dependency target vendored libraries and frameworks to build settings. - [Kevin Coleman](https://github.com/kcoleman731) - [#4278](https://github.com/CocoaPods/CocoaPods/pull/4278) - -* Always link the aggregate target as static to the user project. - [Marius Rackwitz](https://github.com/mrackwitz) - [#4137](https://github.com/CocoaPods/CocoaPods/pull/4137) - - -## 0.39.0.beta.5 (2015-10-01) - -##### Breaking - -* Activesupport 4 is now required, breaking compatibility with applications - locked to `3.x.y`. - -##### Enhancements - -* The `EMBEDDED_CONTENT_CONTAINS_SWIFT` build setting will now be set when - appropriate. - [Samuel Giddins](https://github.com/segiddins) - -* The embed frameworks script will no longer manually copy over the Swift - runtime libraries on Xcode 7 and later. - [Samuel Giddins](https://github.com/segiddins) - [earltedly](https://github.com/segiddins) - [DJ Tarazona](https://github.com/djtarazona) - [#4188](https://github.com/CocoaPods/CocoaPods/issues/4188) - -* A post-install summary of the pods installed is now printed. - [Samuel Giddins](https://github.com/segiddins) - [#4124](https://github.com/CocoaPods/CocoaPods/issues/4124) - -##### Bug Fixes - -* Give a meaningful message for the case where there is no available stable - version for a pod, and there is no explicit version requirement. - [Muhammed Yavuz Nuzumlalı](https://github.com/manuyavuz) - [#4197](https://github.com/CocoaPods/CocoaPods/issues/4197) - -* Use `watchsimulator` when validating pods with the watchOS platform. - [Thomas Kollbach](https://github.com/toto) - [#4130](https://github.com/CocoaPods/CocoaPods/issues/4130) - -* C or C++ preprocessor output files with `.i` extension now have their compiler - flags set correctly. - [Andrea Aresu](https://github.com/aaresu/) - -* Remove SDKROOT relative search path as it isn't needed anymore since XCTest. - [Boris Bügling](https://github.com/neonichu) - [#4219](https://github.com/CocoaPods/CocoaPods/issues/4219) - -* Podfile generated by `pod init` now specifies iOS 8.0 as the default platform - and includes `use_frameworks!` for Swift projects. - [Jamie Evans](https://github.com/JamieREvans) - -* Support for the new `tvos` platform. - [Boris Bügling](https://github.com/neonichu) - [#4152](https://github.com/CocoaPods/CocoaPods/pull/4152) - -* Either generate just one pod target or generate it once for each target - definition. - [Marius Rackwitz](https://github.com/mrackwitz) - [#4034](https://github.com/CocoaPods/CocoaPods/issues/4034) - -* Stop setting `DYLIB_CURRENT_VERSION`, `CURRENT_PROJECT_VERSION`, and - `DYLIB_COMPATIBILITY_VERSION` for pods integrated as dynamic frameworks. - [Samuel Giddins](https://github.com/segiddins) - [#4083](https://github.com/CocoaPods/CocoaPods/issues/4083) - -* The headers folders paths for static library pods will be unset, fixing - validation when archives are uploaded to iTunes Connect. - [Boris Bügling](https://github.com/neonichu) - [Samuel Giddins](https://github.com/segiddins) - [#4119](https://github.com/CocoaPods/CocoaPods/issues/4119) - -* Don't require the `platform` attribute for targets without any declared pods - when running `pod install --no-integrate`. - [Sylvain Guillopé](https://github.com/sguillope) - [#3151](https://github.com/CocoaPods/CocoaPods/issues/3151) - -* Gracefully handle exception if creating the repos directory fails due to a - system error like a permission issue. - [Sylvain Guillopé](https://github.com/sguillope) - [#4177](https://github.com/CocoaPods/CocoaPods/issues/4177) - -## 0.39.0.beta.4 (2015-09-02) - -##### Bug Fixes - -* Using vendored frameworks without a `Headers` directory will no longer cause a - crash. - [Samuel Giddins](https://github.com/segiddins) - [#3967](https://github.com/CocoaPods/CocoaPods/issues/3967) - -* Computing the set of transitive dependencies for a pod target, - even if the target is scoped, will no longer smash the stack. - [Samuel Giddins](https://github.com/segiddins) - [#4092](https://github.com/CocoaPods/CocoaPods/issues/4092) - -* Take into account a specification's `exclude_files` when constructing resource - bundles. - [Samuel Giddins](https://github.com/segiddins) - [#4065](https://github.com/CocoaPods/CocoaPods/issues/4065) - -* Fix resolving to platform-compatible versions of transitive dependencies. - [Samuel Giddins](https://github.com/segiddins) - [#4084](https://github.com/CocoaPods/CocoaPods/issues/4084) - - -## 0.39.0.beta.3 (2015-08-28) - -##### Bug Fixes - -* This release fixes a file permissions error when using the RubyGem. - [Samuel Giddins](https://github.com/segiddins) - - -## 0.39.0.beta.2 (2015-08-27) - -##### Bug Fixes - -* Ensure all gem files are readable. - [Samuel Giddins](https://github.com/segiddins) - [#4085](https://github.com/CocoaPods/CocoaPods/issues/4085) - - -## 0.39.0.beta.1 (2015-08-26) - -##### Breaking - -* The `HEADER_SEARCH_PATHS` will no longer be constructed recursively. - [Samuel Giddins](https://github.com/segiddins) - [twoboxen](https://github.com/twoboxen) - [#1437](https://github.com/CocoaPods/CocoaPods/issues/1437) - [#3760](https://github.com/CocoaPods/CocoaPods/issues/3760) - -##### Enhancements - -* Collapse the namespaced public and private pod xcconfig into one single - xcconfig file. - [Marius Rackwitz](https://github.com/mrackwitz) - [#3916](https://github.com/CocoaPods/CocoaPods/pull/3916) - -* Add `--sources` option to `push` command. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#3912](https://github.com/CocoaPods/CocoaPods/issues/3912) - -* Implicitly unlock all local dependencies when installing. - [Samuel Giddins](https://github.com/segiddins) - [#3764](https://github.com/CocoaPods/CocoaPods/issues/3764) - -* The resolver error message when a conflict occurred due to platform deployment - target mismatches will now explain that. - [Samuel Giddins](https://github.com/segiddins) - [#3926](https://github.com/CocoaPods/CocoaPods/issues/3926) - -* Add `:source_provider` hook to allow plugins to provide sources. - [Eric Amorde](https://github.com/amorde) - [#3190](https://github.com/CocoaPods/CocoaPods/issues/3190) - [#3792](https://github.com/CocoaPods/CocoaPods/pull/3792) - -* Remove embed frameworks build phase from target types, where it is not required. - [Marius Rackwitz](https://github.com/mrackwitz) - [#3905](https://github.com/CocoaPods/CocoaPods/issues/3905) - [#4028](https://github.com/CocoaPods/CocoaPods/pull/4028) - -* Add a `--private` option to `pod spec lint`, `pod lib lint`, and - `pod repo push` that will ignore warnings that only apply to public - specifications and sources. - [Samuel Giddins](https://github.com/segiddins) - [Core#190](https://github.com/CocoaPods/Core/issues/190) - [#2682](https://github.com/CocoaPods/CocoaPods/issues/2682) - -* Add support for dynamic `vendored_frameworks` and `vendored_libraries`. - [Samuel Giddins](https://github.com/segiddins) - [#1993](https://github.com/CocoaPods/CocoaPods/issues/1993) - -##### Bug Fixes - -* Build settings specified in `pod_target_xcconfig` of a spec are also for - library targets only applied to the pod target. - [Marius Rackwitz](https://github.com/mrackwitz) - [#3906](https://github.com/CocoaPods/CocoaPods/issues/3906) - -* Use APPLICATION_EXTENSION_API_ONLY for watchOS 2 extensions. - [Boris Bügling](https://github.com/neonichu) - [#3920](https://github.com/CocoaPods/CocoaPods/pull/3920) - -* Prevent copying resources to installation directory when `SKIP_INSTALL` is enabled. - [Dominique d'Argent](https://github.com/nubbel) - [#3971](https://github.com/CocoaPods/CocoaPods/pull/3971) - -* Embed frameworks into app and watch extensions. - [Boris Bügling](https://github.com/neonichu) - [#4004](https://github.com/CocoaPods/CocoaPods/pull/4004) - -* Fix missing `$(inherited)` for generated xcconfig `LIBRARY_SEARCH_PATHS` - and `HEADER_SEARCH_PATHS` build settings. - [Tyler Fox](https://github.com/smileyborg) - [#3908](https://github.com/CocoaPods/CocoaPods/issues/3908) - -* Fix source locking/unlocking. - [Samuel Giddins](https://github.com/segiddins) - [#4059](https://github.com/CocoaPods/CocoaPods/issues/4059) - -* Include the `-ObjC` linker flag when static `vendored_frameworks` are present. - [Samuel Giddins](https://github.com/segiddins) - [#3870](https://github.com/CocoaPods/CocoaPods/issues/3870) - [#3992](https://github.com/CocoaPods/CocoaPods/issues/3992) - - -## 0.38.2 (2015-07-25) - -##### Bug Fixes - -* Fix generation of xcconfig files that specify both `-iquote` and `-isystem` - headers. - [Russ Bishop](https://github.com/russbishop) - [#3893](https://github.com/CocoaPods/CocoaPods/issues/3893) - -* Pods integrated as static libraries can no longer be imported as - modules, as that change had unexpected side-effects. - [Boris Bügling](https://github.com/neonichu) - [#3898](https://github.com/CocoaPods/CocoaPods/pull/3898) - [#3879](https://github.com/CocoaPods/CocoaPods/issues/3879) - [#3888](https://github.com/CocoaPods/CocoaPods/issues/3888) - [#3886](https://github.com/CocoaPods/CocoaPods/issues/3886) - [#3889](https://github.com/CocoaPods/CocoaPods/issues/3889) - [#3884](https://github.com/CocoaPods/CocoaPods/issues/3884) - -* Source file locking now happens after plugin and podfile post-install hooks - have run. - [Samuel Giddins](https://github.com/segiddins) - [#3529](https://github.com/CocoaPods/CocoaPods/issues/3529) - -* Only set project, dylib, and compatibility versions to valid, three integer - values. - [Samuel Giddins](https://github.com/segiddins) - [#3887](https://github.com/CocoaPods/CocoaPods/issues/3887) - - -## 0.38.1 (2015-07-23) - -##### Enhancements - -* Set project, dylib, and compatibility versions when building pods as - frameworks. - [Marius Rackwitz](https://github.com/mrackwitz) - -* Pods integrated as static libraries can now be imported as modules. - [Tomas Linhart](https://github.com/TomasLinhart) - [#3874](https://github.com/CocoaPods/CocoaPods/issues/3874) - -##### Bug Fixes - -* Ensure the aggregate `.xcconfig` file only has the settings for the - appropriate build configuration. - [Samuel Giddins](https://github.com/segiddins) - [#3842](https://github.com/CocoaPods/CocoaPods/issues/3842) - -* Show the correct error when `pod spec lint` finds multiple podspecs, and at - least one of them fails linting. - [Samuel Giddins](https://github.com/segiddins) - [#3869](https://github.com/CocoaPods/CocoaPods/issues/3869) - -* Set header search paths properly on the user target when `vendored_libraries` - Pods are used while integrating Pods as frameworks. - [Jonathan MacMillan](https://github.com/perotinus) - [#3857](https://github.com/CocoaPods/CocoaPods/issues/3857) - -* Only link public headers in the sandbox for Pods that are not being built - into dynamic frameworks, when integrating Pods as frameworks. - [Jonathan MacMillan](https://github.com/perotinus) - [#3867](https://github.com/CocoaPods/CocoaPods/issues/3867) - -* Don't lock resource files, only source files. - [Mason Glidden](https://github.com/mglidden) - [#3557](https://github.com/CocoaPods/CocoaPods/issues/3557) - -* Fix copying frameworks when integrating with today extensions. - [Samuel Giddins](https://github.com/segiddins) - [#3819](https://github.com/CocoaPods/CocoaPods/issues/3819) - - -## 0.38.0 (2015-07-18) - -##### Enhancements - -* Improve the message shown when trying to use Swift Pods without frameworks. - Now it includes the offending Pods so that the user can take action to remove - the Pods, if they don’t want to move to frameworks yet. - [Eloy Durán](https://github.com/alloy) - [#3830](https://github.com/CocoaPods/CocoaPods/pull/3830) - -##### Bug Fixes - -* Properly merge the `user_target_xcconfig`s of multiple subspecs. - [Samuel Giddins](https://github.com/segiddins) - [#3813](https://github.com/CocoaPods/CocoaPods/issues/3813) - - -## 0.38.0.beta.2 (2015-07-05) - -##### Enhancements - -* The resolver will now take supported platform deployment targets into account - when resolving dependencies. - [Samuel Giddins](https://github.com/segiddins) - [#2443](https://github.com/CocoaPods/CocoaPods/issues/2443) - -* `Pods.xcodeproj` will now be written with deterministic UUIDs, vastly reducing - project churn and merge conflicts. This behavior can be disabled via the new - `COCOAPODS_DISABLE_DETERMINISTIC_UUIDS` environment variable. - [Samuel Giddins](https://github.com/segiddins) - -* [`cocoapods-stats`](https://github.com/CocoaPods/cocoapods-stats) - is now a default plugin. - [Samuel Giddins](https://github.com/segiddins) - -##### Bug Fixes - -* Ensure that the `prepare_command` is run even when skipping the download - cache. - [Samuel Giddins](https://github.com/segiddins) - [#3674](https://github.com/CocoaPods/CocoaPods/issues/3674) - -* Public headers inside a directory named `framework` should be linked in the - sandbox. - [Vincent Isambart](https://github.com/vincentisambart) - [#3751](https://github.com/CocoaPods/CocoaPods/issues/3751) - -* Properly support targets with spaces in their name in the embed frameworks - script. - [Samuel Giddins](https://github.com/segiddins) - [#3754](https://github.com/CocoaPods/CocoaPods/issues/3754) - -* Don't add the `-ObjC` linker flag if it's unnecessary. - [Samuel Giddins](https://github.com/segiddins) - [#3537](https://github.com/CocoaPods/CocoaPods/issues/3537) - -* Ensure that no duplicate framework or target dependencies are created. - [Samuel Giddins](https://github.com/segiddins) - [#3763](https://github.com/CocoaPods/CocoaPods/issues/3763) - - -## 0.38.0.beta.1 (2015-06-26) - -##### Highlighted Enhancement That Needs Testing - -* De-duplicate Pod Targets: CocoaPods now recognizes when a dependency is used - multiple times across different user targets, but needs to be built only once. - The targets in `Pods.xcodeproj` need to be duplicated when one of the following - applies: - * They are used on different platforms. - * They are used with differents sets of subspecs. - * They have any dependency which needs to be duplicated. - - You can opt-out of this behavior installation-wise, by setting the following - option in your `~/.cocoapods/config.yaml`: - ```yaml - deduplicate_targets: false - ``` - - [Marius Rackwitz](https://github.com/mrackwitz) - [#3550](https://github.com/CocoaPods/CocoaPods/issues/3550) - -##### Breaking - -* The CocoaPods environment header has been removed. - [Samuel Giddins](https://github.com/segiddins) - [#2390](https://github.com/CocoaPods/CocoaPods/issues/2390) - -* The `Installer` is passed directly to the `pre_install` and `post_install` - hooks defined in the Podfile, instead of the previously used - `Hooks::InstallerRepresentation`. - [Marius Rackwitz](https://github.com/mrackwitz) - [#3648](https://github.com/CocoaPods/CocoaPods/issues/3648) - -* Deprecate the `xcconfig` attribute in the Podspec DSL, which is replaced by - the new attributes `pod_target_xcconfig` and `user_target_xcconfig`. - [Marius Rackwitz](https://github.com/mrackwitz) - [CocoaPods#3465](https://github.com/CocoaPods/CocoaPods/issues/3465) - -##### Enhancements - -* The notice about a new version being available will now include our - recommendation of using the latest stable version. - [Hugo Tunius](https://github.com/k0nserv) - [#3667](https://github.com/CocoaPods/CocoaPods/pull/3667) - -* New commands `pod cache list` and `pod cache clean` allows you to see the - contents of the cache and clean it. - [Olivier Halligon](https://github.com/AliSoftware) - [#3508](https://github.com/CocoaPods/CocoaPods/issues/3508) - -* The download cache will automatically be reset when changing CocoaPods - versions. - [Samuel Giddins](https://github.com/segiddins) - [#3542](https://github.com/CocoaPods/CocoaPods/issues/3542) - -* Supports running pre-install hooks in plugins. This happens before the resolver - does its work, and offers easy access to the sandbox, podfile and lockfile via a - `PreInstallHooksContext` object. This also renames the post-install hooks from `HooksContext` - to `PostInstallHooksContext`. - [Orta Therox](https://github.com/orta) - [#3540](https://github.com/CocoaPods/cocoapods/issues/3409) - -* Allow passing additional arguments to `pod lib create`, which then get passed - as-is to the `configure` scripts. - [Samuel Giddins](https://github.com/segiddins) - [#2160](https://github.com/CocoaPods/CocoaPods/issues/2160) - -* Use `-analyzer-disable-all-checks` to disable static analyzer for - pods with `inhibit_warnings` enabled (requires Xcode >= 6.1). - [Dieter Komendera](https://github.com/kommen) - [#2402](https://github.com/CocoaPods/CocoaPods/issues/2402) - -* Cache globbing in `PathList` to speed up `pod install`. - [Vincent Isambart](https://github.com/vincentisambart) - [#3699](https://github.com/CocoaPods/CocoaPods/pull/3699) - -* CocoaPods will validate your podfile and try to identify problems - and conflicts in how you've specified the dependencies. - [Hugo Tunius](https://github.com/k0nserv) - [#995](https://github.com/CocoaPods/CocoaPods/issues/995) - -* `pod update` will now accept root pod names, even when only subspecs are - installed. - [Samuel Giddins](https://github.com/segiddins) - [#3689](https://github.com/CocoaPods/CocoaPods/issues/3689) - -* Support for the new `watchos` platform. - [Boris Bügling](https://github.com/neonichu) - [#3681](https://github.com/CocoaPods/CocoaPods/pull/3681) - -##### Bug Fixes - -* Added recursive support to the public headers of vendored frameworks - that are automatically linked in the sandbox. This fixes and issue - for framework header directories that contain sub-directories. - [Todd Casey](https://github.com/vhariable) - [#3161](https://github.com/CocoaPods/CocoaPods/issues/3161) - -* Public headers of vendored frameworks are now automatically linked in - the sandbox. That allows transitive inclusion of headers from other pods. - [Vincent Isambart](https://github.com/vincentisambart) - [#3161](https://github.com/CocoaPods/CocoaPods/issues/3161) - -* Fixes an issue that prevented static libraries from building. `OTHER_LIBTOOLFLAGS` - is no longer set to the value of `OTHER_LDFLAGS`. If you want to create a static - library that includes all dependencies for (internal/external) distribution then - you should use a tool like `cocoapods-packager`. - [Michael Moscardini](https://github.com/themackworth) - [#2747](https://github.com/CocoaPods/CocoaPods/issues/2747) - [#2704](https://github.com/CocoaPods/CocoaPods/issues/2704) - -* The embed frameworks script will now properly filter out symlinks to the - directories that are filtered, which fixes an issue when submitting to the - Mac App Store. - [Samuel Giddins](https://github.com/segiddins) - -* The error report template is now more robust against missing executables. - [Samuel Giddins](https://github.com/segiddins) - [#3719](https://github.com/CocoaPods/CocoaPods/issues/3719) - -* Attempting to specify a `git` source where a Podspec for the requested pod is - not found will have a more helpful error message. - [Samuel Giddins](https://github.com/segiddins) - -* `pod outdated` will now accept the `--no-repo-update` and `--no-integrate` - options. - [Samuel Giddins](https://github.com/segiddins) - -* Fixes an issue which prevented using a custom `CONFIGURATION_BUILD_DIR` when - integrating CocoaPods via dynamic frameworks. - [Tim Rosenblatt](https://github.com/timrosenblatt) - [#3675](https://github.com/CocoaPods/CocoaPods/pull/3675) - -* Pods frameworks in codesigned Mac apps are now signed. - [Nikolaj Schumacher](https://github.com/nschum) - [#3646](https://github.com/CocoaPods/CocoaPods/issues/3646) - - -## 0.37.2 (2015-05-27) - -##### Enhancements - -* Schemes of development pods will now be shared. - [Boris Bügling](https://github.com/neonichu) - [#3600](https://github.com/CocoaPods/CocoaPods/issues/3600) - -* Recognizes incomplete cache when the original download of a pod was - interrupted. - [Marius Rackwitz](https://github.com/mrackwitz) - [#3561](https://github.com/CocoaPods/CocoaPods/issues/3561) - -* Allow opting out of pod source locking, meaning `pod try` yields editable - projects. - [Samuel Giddins](https://github.com/segiddins) - [cocoapods-try#31](https://github.com/CocoaPods/cocoapods-try/issues/31) - -##### Bug Fixes - -* `pod repo push` will now find and push JSON podspecs. - [#3494](https://github.com/CocoaPods/CocoaPods/issues/3494) - [Kyle Fuller](https://github.com/kylef) - -* Flush stdin/stderr and wait a bit in `executable`. - [Boris Bügling](https://github.com/neonichu) - [#3500](https://github.com/CocoaPods/CocoaPods/issues/3500) - -## 0.37.1 (2015-05-06) - -##### Bug Fixes - -* [Cache] Fixes a bug that caused that a pod, which was cached once is not updated - correctly when needed e.g. for `pod spec lint`. - [Marius Rackwitz](https://github.com/mrackwitz) - [#3498](https://github.com/CocoaPods/CocoaPods/issues/3498) - -* Only add the "Embed Pods Frameworks" script for application and unit test targets. - [Marius Rackwitz](https://github.com/mrackwitz) - [#3440](https://github.com/CocoaPods/CocoaPods/issues/3440) - -* C++ source files with `.cc`, `.cxx` and `.c++` extensions now have their - compiler flags set correctly. - [Chongyu Zhu](https://github.com/lembacon) - [Kyle Fuller](https://github.com/kylef) - -* Handle broken symlinks when installing a Pod. - [Daniel Barden](https://github.com/dbarden) - [#3515](https://github.com/cocoapods/cocoapods/issues/3515) - -* Just remove write permissions from files, so executables are unaffected. - [Mason Glidden](https://github.com/mglidden) - [#3501](https://github.com/CocoaPods/CocoaPods/issues/3501) - -* Always copy the generated `Podfile.lock` to `Pods/Manifest.lock` so they are - guaranteed to match, character-by-character, after installation. - [Samuel Giddins](https://github.com/segiddins) - [#3502](https://github.com/CocoaPods/CocoaPods/issues/3502) - -* Don't generate an umbrella header when a custom module map is specified. This - avoids an incomplete module map warning. - [Samuel Giddins](https://github.com/segiddins) - -* Actually allow skipping the download cache by downloading directly to the - download target when requested. - [Samuel Giddins](https://github.com/segiddins) - - -## 0.37.0 (2015-05-03) - -For more details, see 📝 [CocoaPods 0.37](https://blog.cocoapods.org/CocoaPods-0.37/) on our blog. - -##### Bug Fixes - -* Print the UTF-8 warning to STDERR. - [Matt Holgate](https://github.com/mjholgate) - - -## 0.37.0.rc.2 (2015-04-30) - -##### Bug Fixes - -* Handle caching specs that have subspecs with higher minimum deployment targets - without deleting needed source files. - [Samuel Giddins](https://github.com/segiddins) - [#3471](https://github.com/CocoaPods/CocoaPods/issues/3471) - -* Automatically detect JSON podspecs in `pod lib lint`. - [Samuel Giddins](https://github.com/segiddins) - [#3477](https://github.com/CocoaPods/CocoaPods/issues/3477) - - -## 0.37.0.rc.1 (2015-04-27) - -[Core](https://github.com/CocoaPods/Core/compare/0.37.0.beta.1...0.37.0.rc.1) -[Xcodeproj](https://github.com/CocoaPods/Xcodeproj/compare/0.24.0...0.24.1) - -##### Enhancements - -* Add environment variable `COCOAPODS_SKIP_UPDATE_MESSAGE` to disable new - version message. - [Andrea Mazzini](https://github.com/andreamazz) - [#3364](https://github.com/CocoaPods/CocoaPods/issues/3364) - -* Use user project's object version for pods project. - [Boris Bügling](https://github.com/neonichu) - [#253](https://github.com/CocoaPods/Xcodeproj/issues/253) - -##### Bug Fixes - -* Adding `$(inherited)` to `FRAMEWORK_SEARCH_PATHS` build setting in xcconfig for aggregate. - [Tomohiro Kumagai](https://github.com/EZ-NET) - [#3429](https://github.com/CocoaPods/CocoaPods/pull/3429) - -* Don't crash when the downloader can't find an appropriate podspec in a `git` - pod. - [Samuel Giddins](https://github.com/segiddins) - [#3433](https://github.com/CocoaPods/CocoaPods/issues/3433) - -* Automatically lock Pod source files after installing. - [Mason Glidden](https://github.com/mglidden) - [#1154](https://github.com/CocoaPods/CocoaPods/issues/1154) - -* Handle subprocesses leaking STDOUT/STDERR pipes by more strictly managing - process lifetime and not allowing I/O to block completion of the task. - [Samuel Giddins](https://github.com/segiddins) - [#3101](https://github.com/CocoaPods/CocoaPods/issues/3101) - -* Do not create pod target if `source_files` only contains headers. - [Boris Bügling](https://github.com/neonichu) - [#3106](https://github.com/CocoaPods/CocoaPods/issues/3106) - -* Run a pod's `prepare_command` (if it has one) before it is cleaned in the - download cache. - [Marius Rackwitz](https://github.com/mrackwitz) - [Samuel Giddins](https://github.com/segiddins) - [#3436](https://github.com/CocoaPods/CocoaPods/issues/3436) - -* Don't set the `-fno-objc-arc` compiler flags for files for which the flag - makes no sense. - [Samuel Giddins](https://github.com/segiddins) - [#2559](https://github.com/CocoaPods/CocoaPods/issues/2559) - -* Also apply a pod's configuration to any resource targets defined by the pod. - [Tom Adriaenssen](https://github.com/inferis) - [#3463](https://github.com/CocoaPods/CocoaPods/issues/3463) - - -## 0.37.0.beta.1 (2015-04-18) - -##### Enhancements - -* Allow the specification of custom module map files. - [Samuel Giddins](https://github.com/segiddins) - [Marius Rackwitz](https://github.com/mrackwitz) - [#3145](https://github.com/CocoaPods/CocoaPods/issues/3145) - -* Show the source URI for local Pod specification repositories in - `pod repo list`. - [Kyle Fuller](https://github.com/kylef) - -* Only show a warning when there is a minimum deployment target mismatch - between target and spec, instead of throwing a hard error. - [Samuel Giddins](https://github.com/segiddins) - [#1241](https://github.com/CocoaPods/CocoaPods/issues/1241) - -* Add download caching for pods, which speeds up `pod install` and linting, - potentially by several orders of magnitude. - [Samuel Giddins](https://github.com/segiddins) - [#2863](https://github.com/CocoaPods/CocoaPods/issues/2863) - [#3172](https://github.com/CocoaPods/CocoaPods/issues/3172) - -* Add a `--fail-fast` option to both `pod spec lint` and `pod lib lint` that - causes the linter to exit as soon as a single subspec or platform fails - linting. - [Marius Rackwitz](https://github.com/mrackwitz) - -* Naïvely prevent base xcconfig warnings for targets that have custom - config files set. - [Chris Brauchli](https://github.com/cbrauchli) - [#2633](https://github.com/CocoaPods/CocoaPods/issues/2633) - -* Ensure private headers are declared as such in a framework's generated module - map. - [Samuel Giddins](https://github.com/segiddins) - [#2974](https://github.com/CocoaPods/CocoaPods/issues/2974) - -##### Bug Fixes - -* Do not pass code-sign arguments to xcodebuild when linting OS X targets. - [Boris Bügling](https://github.com/neonichu) - [#3310](https://github.com/CocoaPods/CocoaPods/issues/3310) - -* Fixes an issue showing the URL to remote resources in `pod repo list`. - [Kyle Fuller](https://github.com/kylef) - -* Fixes a problem with code signing when integrating CocoaPods - into a Today Widget extension. - [Christian Sampaio](https://github.com/chrisfsampaio) - [#3390](https://github.com/CocoaPods/CocoaPods/pull/3390) - - -## 0.36.4 (2015-04-16) - -##### Bug Fixes - -* Fixes various problems with Pods that use xcasset bundles. Pods that - use xcassets can now be used with the `pod :path` option. - [Kyle Fuller](https://github.com/kylef) - [#1549](https://github.com/CocoaPods/CocoaPods/issues/1549) - [#3384](https://github.com/CocoaPods/CocoaPods/pull/3383) - [#3358](https://github.com/CocoaPods/CocoaPods/pull/3358) - - -## 0.36.3 (2015-03-31) - -##### Bug Fixes - -* Fix using the downloader. - [Samuel Giddins](https://github.com/segiddins) - [#3344](https://github.com/CocoaPods/CocoaPods/issues/3344) - [#3345](https://github.com/CocoaPods/CocoaPods/issues/3345) - - -## 0.36.2 (2015-03-31) - -[Core](https://github.com/CocoaPods/Core/compare/0.36.1...0.36.2) - -##### Bug Fixes - -* Unique resources passed to the script generator. - [Diego Torres](https://github.com/dtorres) - [#3315](https://github.com/CocoaPods/CocoaPods/issues/3315) - [#3327](https://github.com/CocoaPods/CocoaPods/issues/3327) - -* Update the `Manifest.lock` when migrating local podspecs to JSON. This fixes - running `pod install` after upgrading to `0.36`. - [Samuel Giddins](https://github.com/segiddins) - [#3292](https://github.com/CocoaPods/CocoaPods/issues/3292) - [#3299](https://github.com/CocoaPods/CocoaPods/issues/3299) - - -## 0.36.1 (2015-03-27) - -[Xcodeproj](https://github.com/CocoaPods/Xcodeproj/compare/0.23.0...0.23.1) - -##### Bug Fixes - -* Workarounds(✻) for the resource script's handling of `.xcasset` files. - [sodas](https://github.com/sodastsai) - [Tony Li](https://github.com/crazytonyli) - [Chongyu Zhu](https://github.com/lembacon) - [#3247](https://github.com/CocoaPods/CocoaPods/issues/3247) - [#3303](https://github.com/CocoaPods/CocoaPods/issues/3303) - -* Fix the sanitization of configuration names in the generated target - environment header. - [Samuel Giddins](https://github.com/segiddins) - [#3301](https://github.com/CocoaPods/CocoaPods/issues/3301) - -> _(✻) Note: these fixes are only temporary to avoid overriding the user project's `xcassets`. - We are aware that these workarounds are "too greedy" and thus user projects having different - `xcassets` for different targets will still have issues; we ([@AliSoftware](https://github.com/AliSoftware)) - are working on a deeper fix ([#3263](https://github.com/CocoaPods/CocoaPods/issues/3263)) for the next release._ - -## 0.36.0 (2015-03-11) - -[Xcodeproj](https://github.com/CocoaPods/Xcodeproj/compare/0.22.0...0.23.0) - -For more details, see 📝 [CocoaPods 0.36](https://blog.cocoapods.org/CocoaPods-0.36/) on our blog. - -##### Enhancements - -* Allows Swift pods to have a deployment target under iOS 8.0 if they use - XCTest. - [Samuel Giddins](https://github.com/segiddins) - [#3225](https://github.com/CocoaPods/CocoaPods/issues/3225) - -##### Bug Fixes - -* Include Swift-specific build settings on target creation, i.e. disable optimizations - for debug configuration. - [Marius Rackwitz](https://github.com/mrackwitz) - [#3238](https://github.com/CocoaPods/CocoaPods/issues/3238) - -* Only copy explicitly specified xcasset files into the bundle of the integrated target. - [Marius Rackwitz](https://github.com/mrackwitz) - [#3219](https://github.com/CocoaPods/CocoaPods/issues/3219) - -* Correctly filter Xcode warnings about the use of dynamic frameworks. - [Boris Bügling](https://github.com/neonichu) - -* Fixes warnings, when the aggregate target doesn't contain any pod target, which is build, - because `PODS_FRAMEWORK_BUILD_PATH` was added to `FRAMEWORK_SEARCH_PATHS`, but never created. - [Marius Rackwitz](https://github.com/mrackwitz) - [#3217](https://github.com/CocoaPods/CocoaPods/issues/3217) - -* Allows the usage of `:head` dependencies even when the most recent published - version was a pre-release. - [Samuel Giddins](https://github.com/segiddins) - [#3212](https://github.com/CocoaPods/CocoaPods/issues/3212) - -* Limit the check for transitive static binaries to those which are directly linked to the user target. - [Boris Bügling](https://github.com/neonichu) - [#3194](https://github.com/CocoaPods/CocoaPods/issues/3194) - -* Lint to prevent dynamic libraries and frameworks from passing with iOS 7. - [Boris Bügling](https://github.com/neonichu) - [#3193](https://github.com/CocoaPods/CocoaPods/issues/3193) - -* Shows an informative error message when there is no base specification found - for a `:head` dependency. - [Samuel Giddins](https://github.com/segiddins) - [#3230](https://github.com/CocoaPods/CocoaPods/issues/3230) - -* Fix the `OTHER_SWIFT_FLAGS` generated, so it inherits previous definitions. - [Daniel Thorpe](https://github.com/danthorpe) - [#2983](https://github.com/CocoaPods/CocoaPods/issues/2983) - - -## 0.36.0.rc.1 (2015-02-24) - -##### Enhancements - -* Set the `APPLICATION_EXTENSION_API_ONLY` build setting if integrating with a watch extension target. - [Boris Bügling](https://github.com/neonichu) - [#3153](https://github.com/CocoaPods/CocoaPods/issues/3153) - -* Build for iOS simulator only during validation. This allows validation without having - provisioning profiles set up. - [Boris Bügling](https://github.com/neonichu) - [#3083](https://github.com/CocoaPods/CocoaPods/issues/3083) - [Swift#13](https://github.com/CocoaPods/swift/issues/13) - -* Explicitly inform the user to close existing project when switching to - a workspace for the first time. - [Kyle Fuller](https://github.com/kylef) - [#2996](https://github.com/CocoaPods/CocoaPods/issues/2996) - -* Automatically detect conflicts between framework names. - [Samuel Giddins](https://github.com/segiddins) - [#2943](https://github.com/CocoaPods/CocoaPods/issues/2943) - -* Use the proper `TMPDIR` for the CocoaPods process, instead of blindly using - `/tmp`. - [Samuel Giddins](https://github.com/segiddins) - -* Let lint fail for Swift pods supporting deployment targets below iOS 8.0. - [Boris Bügling](https://github.com/neonichu) - [#2963](https://github.com/CocoaPods/CocoaPods/issues/2963) - -* Reject installation if a static library is used as a transitive dependency - while integrating Pods as frameworks. - [Samuel Giddins](https://github.com/segiddins) - [#2926](https://github.com/CocoaPods/CocoaPods/issues/2926) - -* Do not copy Swift standard libraries multiple times. - [Boris Bügling](https://github.com/neonichu) - [#3131](https://github.com/CocoaPods/CocoaPods/issues/3131) - -* Check for Xcode License Agreement before running commands. - [Xavi Matos](https://github.com/CalQL8ed-K-OS) - [#3002](https://github.com/CocoaPods/CocoaPods/issues/3002) - -* `pod update PODNAME` will update pods in a case-insensitive manner. - [Samuel Giddins](https://github.com/segiddins) - [#2992](https://github.com/CocoaPods/CocoaPods/issues/2992) - -* Allow specifying repo names to `pod {spec,lib} lint --sources`. - [Samuel Giddins](https://github.com/segiddins) - [#2685](https://github.com/CocoaPods/CocoaPods/issues/2685) - -* Require explicit use of `use_frameworks!` for Pods written in Swift. - [Boris Bügling](https://github.com/neonichu) - [#3029](https://github.com/CocoaPods/CocoaPods/issues/3029) - -* Lint as framework automatically. If needed, `--use-libraries` option - allows linting as a static library. - [Boris Bügling](https://github.com/neonichu) - [#2912](https://github.com/CocoaPods/CocoaPods/issues/2912) - -* Adding Xcode Legacy build location support for default Pods.xcodeproj. - It defaults to `${SRCROOT}/../build` but can be changed in a `post_install` - hook by using the `Project#symroot=` writer. - [Sam Marshall](https://github.com/samdmarshall) - -##### Bug Fixes - -* Set `SKIP_INSTALL=YES` for all generated targets to avoid producing - *Generic Xcode Archives* on Archive. - [Marius Rackwitz](https://github.com/mrackwitz) - [#3188](https://github.com/CocoaPods/CocoaPods/issues/3188) - -* Added support for .tpp C++ header files in specs (previously were getting - filtered out and symlinks wouldn't get created in the Pods/Headers folder.) - [Honza Dvorsky](https://github.com/czechboy0) - [#3129](https://github.com/CocoaPods/CocoaPods/pull/3129) - -* Fixed installation for app-extension targets which had no dependencies - configured in the Podfile. - [Boris Bügling](https://github.com/neonichu) - [#3102](https://github.com/CocoaPods/CocoaPods/issues/3102) - -* Correct escaping of resource bundles in 'Copy Pods Resources' script. - [Seán Labastille](https://github.com/flufff42) - [#3082](https://github.com/CocoaPods/CocoaPods/issues/3082) - -* Correctly update sources when calling `pod outdated`, and also respect the - `--[no-]repo-update` flag. - [Samuel Giddins](https://github.com/segiddins) - [#3137](https://github.com/CocoaPods/CocoaPods/issues/3137) - -* Fix the `OTHER_SWIFT_FLAGS` generated, so `#if COCOAPODS` works in Swift. - [Samuel Giddins](https://github.com/segiddins) - [#2983](https://github.com/CocoaPods/CocoaPods/issues/2983) - -* Output a properly-formed `Podfile` when running `pod init` with a target that - contains a `'` in its name. - [Samuel Giddins](https://github.com/segiddins) - [#3136](https://github.com/CocoaPods/CocoaPods/issues/3136) - -* Remove the stored lockfile checkout source when switching to a development - pod. - [Samuel Giddins](https://github.com/segiddins) - [#3141](https://github.com/CocoaPods/CocoaPods/issues/3141) - -* Migrate local Ruby podspecs to JSON, allowing updating those pods to work. - [Samuel Giddins](https://github.com/segiddins) - [#3038](https://github.com/CocoaPods/CocoaPods/issues/3038) - -* Removing grep color markup in the embed frameworks script. - [Adriano Bonat](https://github.com/tanob) - [#3117](https://github.com/CocoaPods/CocoaPods/issues/3117) - -* Fixes an issue where `pod ipc list` and `pod ipc podfile` was returning an - error. - [Kyle Fuller](https://github.com/kylef) - [#3134](https://github.com/CocoaPods/CocoaPods/issues/3134) - -* Fixes an issue with spaces in the path to the user's developer tools. - [Boris Bügling](https://github.com/neonichu) - [#3181](https://github.com/CocoaPods/CocoaPods/issues/3181) - - -## 0.36.0.beta.2 (2015-01-28) - -[Xcodeproj](https://github.com/CocoaPods/Xcodeproj/compare/0.21.0...0.21.2) - -##### Breaking - -* Changes the default spec repositories used from all configured spec - repositories, to the master spec repository when no spec repositories - are explicitly configured in a Podfile. - [Kyle Fuller](https://github.com/kylef) - [#2946](https://github.com/CocoaPods/CocoaPods/issues/2946) - -##### Enhancements - -* Set the APPLICATION_EXTENSION_API_ONLY build setting if integrating with an app extension target. - [Boris Bügling](https://github.com/neonichu) - [#2980](https://github.com/CocoaPods/CocoaPods/issues/2980) - -* Xcodebuild warnings will now be reported as `warning` during linting - instead of `note`. - [Hugo Tunius](https://github.com/K0nserv) - -* Copy only the resources required for the current build configuration. - [Samuel Giddins](https://github.com/segiddins) - [#2391](https://github.com/CocoaPods/CocoaPods/issues/2391) - -##### Bug Fixes - -* Ensure that linting fails if xcodebuild doesn't successfully build your Pod. - [Kyle Fuller](https://github.com/kylef) - [#2981](https://github.com/CocoaPods/CocoaPods/issues/2981) - [cocoapods-trunk#33](https://github.com/CocoaPods/cocoapods-trunk/issues/33) - -* Clone the master spec repository when no spec repositories are explicitly - defined in the Podfile. This fixes problems using CocoaPods for the first - time without any explicit spec repositories. - [Kyle Fuller](https://github.com/kylef) - [#2946](https://github.com/CocoaPods/CocoaPods/issues/2946) - -* Xcodebuild warnings with the string `error` in them will no longer be - linted as errors if they are in fact warnings. - [Hugo Tunius](https://github.com/K0nserv) - [#2579](https://github.com/CocoaPods/CocoaPods/issues/2579) - -* Any errors which occur during fetching of external podspecs over HTTP - will now be gracefully handled. - [Hugo Tunius](https://github.com/K0nserv) - [#2823](https://github.com/CocoaPods/CocoaPods/issues/2823) - -* When updating spec repositories only update the git sourced repos. - [Dustin Clark](https://github.com/clarkda) - [#2558](https://github.com/CocoaPods/CocoaPods/issues/2558) - -* Pods referenced via the `:podspec` option will have their podspecs properly - parsed in the local directory if the path points to a local file. - [Samuel Giddins](https://github.com/segiddins) - -* Fix an issue where using Swift frameworks in an Objective-C host application - causes an error because the Swift frameworks we're not code signed. - [Joseph Ross](https://github.com/jrosssavant) - [#3008](https://github.com/CocoaPods/CocoaPods/issues/3008) - - -## 0.36.0.beta.1 (2014-12-25) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.35.0...0.36.0.beta.1) -• [CocoaPods-Core](https://github.com/CocoaPods/Core/compare/0.35.0...0.36.0.beta.1) -• [Xcodeproj](https://github.com/CocoaPods/Xcodeproj/compare/0.20.2...0.21.0) -• [CLAide](https://github.com/CocoaPods/CLAide/compare/v0.7.0...0.8.0) -• [Molinillo](https://github.com/CocoaPods/Molinillo/compare/0.1.2...0.2.0) -• [cocoapods-downloader](https://github.com/CocoaPods/cocoapods-downloader/compare/0.8.0...0.8.1) -• [cocoapods-try](https://github.com/CocoaPods/cocoapods-try/compare/0.4.2...0.4.3) -• [cocoapods-trunk](https://github.com/CocoaPods/cocoapods-trunk/compare/0.4.1...0.5.0) -• [cocoapods-plugins](https://github.com/CocoaPods/cocoapods-plugins/compare/0.3.2...0.4.0) - -##### Highlighted Enhancement That Needs Testing - -* Support Frameworks & Swift: CocoaPods now recognizes Swift source files and - builds dynamic frameworks when necessary. A project can explicitly - opt-in via `use_frameworks!` in the Podfile, or if any dependency contains - Swift code, all pods for that target will be integrated as frameworks. - - As a pod author, you can change the module name of the built framework by - specifying a `module_name` in the podspec. The built frameworks are embedded into - the host application with a new shell script build phase in the user's - project allowing configuration-dependent pods. - - [Marius Rackwitz](https://github.com/mrackwitz) - [#2835](https://github.com/CocoaPods/CocoaPods/issues/2835) - -##### Breaking - -* Bundle Resources into Frameworks: Previously all resources were compiled and - copied into the `mainBundle`. Now Pods have to use - `[NSBundle bundleForClass:<#Class from Pod#>]` to access provided resources - relative to the bundle. - - [Boris Bügling](https://github.com/neonichu) - [#2835](https://github.com/CocoaPods/CocoaPods/issues/2730) - -* Only the hooks specified by usage of the `plugin` directive of the `Podfile` - will be run. Additionally, plugins that depend on hooks will have to update to - specify their 'plugin name' when registering the hooks in order to make it - possible for those hooks to be run. - [Samuel Giddins](https://github.com/segiddins) - [#2640](https://github.com/CocoaPods/CocoaPods/issues/2640) - -##### Enhancements - -* Do not generate targets for Pods without sources. - [Boris Bügling](https://github.com/neonichu) - [#2918](https://github.com/CocoaPods/CocoaPods/issues/2918) - -* Show the name of the source for each hook that is run in verbose mode. - [Samuel Giddins](https://github.com/segiddins) - [#2639](https://github.com/CocoaPods/CocoaPods/issues/2639) - -* Move pods' private headers to `Headers/Private` from `Headers/Build`. - Since some SCM ignore templates include `build` by default, this makes it - easier to check in the `Pods/` directory. - [Samuel Giddins](https://github.com/segiddins) - [#2623](https://github.com/CocoaPods/CocoaPods/issues/2623) - -* Validate that a specification's `public_header_files` and - `private_header_files` file patterns only match header files. - Also, validate that all file patterns, if given, match at least one file. - [Samuel Giddins](https://github.com/segiddins) - [#2914](https://github.com/CocoaPods/CocoaPods/issues/2914) - -* Installer changed to organize a development pod's source and resource files - into subgroups reflecting their organization in the filesystem. - [Imre mihaly](https://github.com/imihaly) - -##### Bug Fixes - -* Fix updating a pod that has subspec dependencies. - [Samuel Giddins](https://github.com/segiddins) - [#2879](https://github.com/CocoaPods/CocoaPods/issues/2879) - -* Restore the `#define`s in the environment header when the `--no-integrate` - installation option is used. - [Samuel Giddins](https://github.com/segiddins) - [#2876](https://github.com/CocoaPods/CocoaPods/issues/2876) - -* Fix issues when trying to discover the xcodeproj automatically - but the current path contains special characters (`[`,`]`,`{`,`}`,`*`,`?`). - [Olivier Halligon](https://github.com/AliSoftware) - [#2852](https://github.com/CocoaPods/CocoaPods/issues/2852) - -* Fix linting subspecs that have a higher deployment target than the root - spec. - [Samuel Giddins](https://github.com/segiddins) - [#1919](https://github.com/CocoaPods/CocoaPods/issues/1919) - -* Fix the reading of podspecs that come from the `:git`, `:svn`, `:http`, or - `:hg` options in your `Podfile` that used context-dependent ruby code, such as - reading a file to determine the specification version. - [Samuel Giddins](https://github.com/segiddins) - [#2875](https://github.com/CocoaPods/CocoaPods/issues/2875) - -* Fix the updating of `:git`, `:svn`, and `:hg` dependencies when updating all - pods. - [Samuel Giddins](https://github.com/CocoaPods/CocoaPods/issues/2859) - [#2859](https://github.com/CocoaPods/CocoaPods/issues/2859) - -* Fix an issue when a user doesn't yet have any spec repositories configured. - [Boris Bügling](https://github.com/neonichu) - -* Fix an issue updating repositories when another spec repository doesn't - have a remote. - [Kyle Fuller](https://github.com/kylef) - [#2965](https://github.com/CocoaPods/CocoaPods/issues/2965) - - -## 0.35.0 (2014-11-19) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.34.4...0.35.0) -• [CocoaPods-Core](https://github.com/CocoaPods/Core/compare/0.34.4...0.35.0) -• [Xcodeproj](https://github.com/CocoaPods/Xcodeproj/compare/0.19.4...0.20.2) -• [cocoapods-downloader](https://github.com/CocoaPods/cocoapods-downloader/compare/0.7.2...0.8.0) - -For more details, see 📝 [CocoaPods 0.35](https://blog.cocoapods.org/CocoaPods-0.35/) on our blog. - -##### Enhancements - -* Allow the specification of file patterns for the Podspec's `requires_arc` - attribute. - [Kyle Fuller](https://github.com/kylef) - [Samuel Giddins](https://github.com/segiddins) - [#532](https://github.com/CocoaPods/CocoaPods/issues/532) - -* From now on, pods installed directly from their repositories will be recorded - in the `Podfile.lock` file and will be guaranteed to be checked-out using the - same revision on subsequent installations. Examples of this are when using - the `:git`, `:svn`, or `:hg` options in your `Podfile`. - [Samuel Giddins](https://github.com/segiddins) - [#1058](https://github.com/CocoaPods/CocoaPods/issues/1058) - -##### Bug Fixes - -* Fix an output formatting issue with various commands like `pod search` - and `pod trunk`. - [Olivier Halligon](https://github.com/AliSoftware) - [#2603](https://github.com/CocoaPods/CocoaPods/issues/2603) - -* Show a helpful error message if the old resolver incorrectly activated a - pre-release version that now leads to a version conflict. - [Samuel Giddins](https://github.com/segiddins) - -* Provides a user friendly message when using `pod spec create` with a - repository that doesn't yet have any commits. - [Kyle Fuller](https://github.com/kylef) - [#2803](https://github.com/CocoaPods/CocoaPods/issues/2803) - -* Fixes an issue with integrating into projects where there is a slash in the - build configuration name. - [Kyle Fuller](https://github.com/kylef) - [#2767](https://github.com/CocoaPods/CocoaPods/issues/2767) - -* Pods will use `CLANG_ENABLE_OBJC_ARC = 'YES'` instead of - `CLANG_ENABLE_OBJC_ARC = 'NO'`. For pods with `requires_arc = false` the - `-fno-objc-arc` flag will be specified for the all source files. - [Hugo Tunius](https://github.com/K0nserv) - [#2262](https://github.com/CocoaPods/CocoaPods/issues/2262) - -* Fixed an issue that Core Data mapping models where not compiled when - copying resources to main application bundle. - [Yan Rabovik](https://github.com/rabovik) - -* Fix uninitialized constant Class::YAML crash in some cases. - [Tim Shadel](https://github.com/timshadel) - -##### Enhancements - -* `pod search`, `pod spec which`, `pod spec cat` and `pod spec edit` - now use plain text search by default instead of a regex. Especially - `pod search UIView+UI` now searches for pods containing exactly `UIView+UI` - in their name, not trying to interpret the `+` as a regular expression. - _Note: You can still use a regular expression with the new `--regex` flag that has - been added to these commands, e.g. `pod search --regex "(NS|UI)Color"`._ - [Olivier Halligon](https://github.com/AliSoftware) - [Core#188](https://github.com/CocoaPods/Core/issues/188) - -* Use `--allow-warnings` rather than `--error-only` for pod spec validation - [Daniel Tomlinson](https://github.com/DanielTomlinson) - [#2820](https://github.com/CocoaPods/CocoaPods/issues/2820) - -## 0.35.0.rc2 (2014-11-06) - -##### Enhancements - -* Allow the resolver to fail faster when there are unresolvable conflicts - involving the Lockfile. - [Samuel Giddins](https://github.com/segiddins) - -##### Bug Fixes - -* Allows pre-release spec versions when a requirement has an external source - specified. - [Samuel Giddins](https://github.com/segiddins) - [#2768](https://github.com/CocoaPods/CocoaPods/issues/2768) - -* We no longer require git version 1.7.5 or greater. - [Kyle Fuller](https://github.com/kylef) - -* Fix the usage of `:head` pods. - [Samuel Giddins](https://github.com/segiddins) - [#2789](https://github.com/CocoaPods/CocoaPods/issues/2789) - -* Show a more informative message when attempting to lint a spec whose - source could not be downloaded. - [Samuel Giddins](https://github.com/segiddins) - [#2667](https://github.com/CocoaPods/CocoaPods/issues/2667) - [#2759](https://github.com/CocoaPods/CocoaPods/issues/2759) - -## 0.35.0.rc1 (2014-11-02) - -##### Highlighted Enhancements That Need Testing - -* The `Resolver` has been completely rewritten to use - [Molinillo](https://github.com/CocoaPods/Molinillo), an iterative dependency - resolution algorithm that automatically resolves version conflicts. - The order in which dependencies are declared in the `Podfile` no longer has - any effect on the resolution process. - - You should ensure that `pod install`, `pod update` and `pod update [NAME]` - work as expected and install the correct versions of your pods during - this RC1 release. - [Samuel Giddins](https://github.com/segiddins) - [#978](https://github.com/CocoaPods/CocoaPods/issues/978) - [#2002](https://github.com/CocoaPods/CocoaPods/issues/2002) - -##### Breaking - -* Support for older versions of Ruby has been dropped and CocoaPods now depends - on Ruby 2.0.0 or greater. This is due to the release of Xcode 6.0 which has - dropped support for OS X 10.8, which results in the minimum version of - Ruby pre-installed on OS X now being 2.0.0. - - If you are using a custom installation of Ruby older than 2.0.0, you - will need to update. Or even better, migrate to system Ruby. - [Kyle Fuller](https://github.com/kylef) - -* Attempts to resolve circular dependencies will now raise an exception. - [Samuel Giddins](https://github.com/segiddins) - [Molinillo#6](https://github.com/CocoaPods/Molinillo/issues/6) - -##### Enhancements - -* The use of implicit sources has been un-deprecated. By default, all available - spec-repos will be used. There should only be a need to specify explicit - sources if you want to specifically _exclude_ certain spec-repos, such as the - `master` spec-repo, if you want to declare the order of spec look-up - precedence, or if you want other users of a Podfile to automatically have a - spec-repo cloned on `pod install`. - [Eloy Durán](https://github.com/alloy) - -* The `pod push` command has been removed as it has been deprecated in favour of - `pod repo push` in CocoaPods 0.33. - [Fabio Pelosin](https://github.com/fabiopelosin) - -* Refactorings in preparation to framework support, which could break usage - of the Hooks API. - [Marius Rackwitz](https://github.com/mrackwitz) - [#2461](https://github.com/CocoaPods/CocoaPods/issues/2461) - -* Implicit dependencies are now locked, so simply running `pod install` will not - cause them to be updated when they shouldn't be. - [Samuel Giddins](https://github.com/segiddins) - [#2318](https://github.com/CocoaPods/CocoaPods/issues/2318) - [#2506](https://github.com/CocoaPods/CocoaPods/issues/2506) - -* Pre-release versions are only considered in the resolution process when there - are dependencies that explicitly reference pre-release requirements. - [Samuel Giddins](https://github.com/segiddins) - [#1489](https://github.com/CocoaPods/CocoaPods/issues/1489) - -* Only setup the master specs repo if required. - [Daniel Tomlinson](https://github.com/DanielTomlinson) - [#2562](https://github.com/CocoaPods/CocoaPods/issues/2562) - -* `Sandbox::FileAccessor` now optionally includes expanded paths of headers of - vendored frameworks in `public_headers`. - [Eloy Durán](https://github.com/alloy) - [#2722](https://github.com/CocoaPods/CocoaPods/pull/2722) - -* Analysis is now halted and the user informed when there are multiple different - external sources for dependencies with the same root name. - The user is also now warned when there are duplicate dependencies in the - Podfile. - [Samuel Giddins](https://github.com/segiddins) - [#2738](https://github.com/CocoaPods/CocoaPods/issues/2738) - -* Multiple subspecs that point to the same external dependency will now only - cause that external source to be fetched once. - [Samuel Giddins](https://github.com/segiddins) - [#2743](https://github.com/CocoaPods/CocoaPods/issues/2743) - -##### Bug Fixes - -* Fixes an issue in the `XCConfigIntegrator` where not all targets that need - integration were being integrated, but were getting incorrect warnings about - the user having specified a custom base configuration. - [Eloy Durán](https://github.com/alloy) - [2752](https://github.com/CocoaPods/CocoaPods/issues/2752) - -* Do not try to clone spec-repos in `/`. - [Eloy Durán](https://github.com/alloy) - [#2723](https://github.com/CocoaPods/CocoaPods/issues/2723) - -* Improved sanitizing of configuration names which have a numeric prefix. - [Steffen Matthischke](https://github.com/HeEAaD) - [#2700](https://github.com/CocoaPods/CocoaPods/pull/2700) - -* Fixes an issues where headers from a podspec with one platform are exposed to - targets with a different platform. The headers are now only exposed to the - targets with the same platform. - [Michael Melanson](https://github.com/michaelmelanson) - [Kyle Fuller](https://github.com/kylef) - [#1249](https://github.com/CocoaPods/CocoaPods/issues/1249) - - -## 0.34.4 (2014-10-18) - -##### Bug Fixes - -* Fixes a crash when running `pod outdated`. - [Samuel Giddins](https://github.com/segiddins) - [#2624](https://github.com/CocoaPods/CocoaPods/issues/2624) - -* Ensure that external sources (as specified in the `Podfile`) are downloaded - when their source is missing, even if their specification is present. - [Samuel Giddins](https://github.com/segiddins) - [#2494](https://github.com/CocoaPods/CocoaPods/issues/2494) - -* Fixes an issue where running `pod install/update` while the Xcode project - is open can cause the open project to have build failures until Xcode - is restarted. - [Kyle Fuller](https://github.com/kylef) - [#2627](https://github.com/CocoaPods/CocoaPods/issues/2627) - [#2665](https://github.com/CocoaPods/CocoaPods/issues/2665) - -* Fixes a crash when using file URLs as a source. - [Kurry Tran](https://github.com/kurry) - [#2683](https://github.com/CocoaPods/CocoaPods/issues/2683) - -* Fixes an issue when using pods in static library targets and building with - Xcode 6 which requires `OTHER_LIBTOOLFLAGS` instead of `OTHER_LDFLAGS`, thus - basically reverting to the previous Xcode behaviour, for now at least. - [Kyle Fuller](https://github.com/kylef) - [Eloy Durán](https://github.com/alloy) - [#2666](https://github.com/CocoaPods/CocoaPods/issues/2666) - -* Fixes an issue running the resources script when Xcode is installed to a - directory with a space when compiling xcassets. - [Kyle Fuller](https://github.com/kylef) - [#2684](https://github.com/CocoaPods/CocoaPods/issues/2684) - -* Fixes an issue when installing Pods with resources to a target which - doesn't have any resources. - [Kyle Fuller](https://github.com/kylef) - [#2083](https://github.com/CocoaPods/CocoaPods/issues/2083) - -* Ensure that git 1.7.5 or newer is installed when running pod. - [Kyle Fuller](https://github.com/kylef) - [#2651](https://github.com/CocoaPods/CocoaPods/issues/2651) - - -## 0.34.2 (2014-10-08) - -##### Enhancements - -* Make the output of `pod outdated` show what running `pod update` will do. - Takes into account the sources specified in the `Podfile`. - [Samuel Giddins](https://github.com/segiddins) - [#2470](https://github.com/CocoaPods/CocoaPods/issues/2470) - -* Allows the use of the `GCC_PREPROCESSOR_DEFINITION` flag `${inherited}` - without emitting a warning. - [Samuel Giddins](https://github.com/segiddins) - [#2577](https://github.com/CocoaPods/CocoaPods/issues/2577) - -* Integration with user project will no longer replace an existing - base build configuration. - [Robert Jones](https://github.com/redshirtrob) - [#1736](https://github.com/CocoaPods/CocoaPods/issues/1736) - -##### Bug Fixes - -* Improved sanitizing of configuration names to avoid generating invalid - preprocessor definitions. - [Boris Bügling](https://github.com/neonichu) - [#2542](https://github.com/CocoaPods/CocoaPods/issues/2542) - -* More robust generation of source names from URLs. - [Samuel Giddins](https://github.com/segiddins) - [#2534](https://github.com/CocoaPods/CocoaPods/issues/2534) - -* Allow the `Validator` to only use specific sources. - Allows customizable source for `pod spec lint` and `pod lib lint`, - with both defaulting to `master`. - [Samuel Giddins](https://github.com/segiddins) - [#2543](https://github.com/CocoaPods/CocoaPods/issues/2543) - [cocoapods-trunk#28](https://github.com/CocoaPods/cocoapods-trunk/issues/28) - -* Takes into account the sources specified in `Podfile` running - `pod outdated`. - [Samuel Giddins](https://github.com/segiddins) - [#2553](https://github.com/CocoaPods/CocoaPods/issues/2553) - -* Ensures that the master repo is shallow cloned when added via a Podfile - `source` directive. - [Samuel Giddins](https://github.com/segiddins) - [#3586](https://github.com/CocoaPods/CocoaPods/issues/2586) - -* Ensures that the user project is not saved when there are no - user targets integrated. - [Samuel Giddins](https://github.com/segiddins) - [#2561](https://github.com/CocoaPods/CocoaPods/issues/2561) - [#2593](https://github.com/CocoaPods/CocoaPods/issues/2593) - -* Fix a crash when running `pod install` with an empty target that inherits a - pod from a parent target. - [Kyle Fuller](https://github.com/kylef) - [#2591](https://github.com/CocoaPods/CocoaPods/issues/2591) - -* Take into account versions of a Pod from all specified sources when - resolving dependencies. - [Thomas Visser](https://github.com/Thomvis) - [#2556](https://github.com/CocoaPods/CocoaPods/issues/2556) - -* Sanitize build configuration names in target environment header macros. - [Kra Larivain](https://github.com/olarivain) - [#2532](https://github.com/CocoaPods/CocoaPods/pull/2532) - - -## 0.34.1 (2014-09-26) - -##### Bug Fixes - -* Doesn't take into account the trailing `.git` in repository URLs when - trying to find a matching specs repo. - [Samuel Giddins](https://github.com/segiddins) - [#2526](https://github.com/CocoaPods/CocoaPods/issues/2526) - - -## 0.34.0 (2014-09-26) - -For more details, see 📝 [CocoaPods 0.34](https://blog.cocoapods.org/CocoaPods-0.34/) on our blog. - -##### Breaking - -* Add support for loading podspecs from *only* specific spec-repos via - `sources`. By default, when there are no sources specified in a Podfile all - source repos will be used. This has always been the case. However, this - implicit use of sources is now deprecated. Once you specify specific sources, - **no** repos will be included by default. For example: - - source 'https://github.com/artsy/Specs.git' - source 'https://github.com/CocoaPods/Specs.git' - - Any source URLs specified that have not yet been added will be cloned before - resolution begins. - [François Benaiteau](https://github.com/netbe) - [Fabio Pelosin](https://github.com/fabiopelosin) - [Samuel Giddins](https://github.com/segiddins) - [#1143](https://github.com/CocoaPods/CocoaPods/pull/1143) - [Core#19](https://github.com/CocoaPods/Core/pull/19) - [Core#170](https://github.com/CocoaPods/Core/issues/170) - [#2515](https://github.com/CocoaPods/CocoaPods/issues/2515) - -##### Enhancements - -* Added the `pod repo list` command which lists all the repositories. - [Luis Ascorbe](https://github.com/lascorbe) - [#1455](https://github.com/CocoaPods/CocoaPods/issues/1455) - -##### Bug Fixes - -* Works around an Xcode issue where linting would fail even though `xcodebuild` - actually succeeds. Xcode.app also doesn't fail when this issue occurs, so it's - safe for us to do the same. - [Kra Larivain](https://github.com/olarivain) - [Boris Bügling](https://github.com/neonichu) - [Eloy Durán](https://github.com/alloy) - [Samuel E. Giddins](https://github.com/segiddins) - [#2394](https://github.com/CocoaPods/CocoaPods/issues/2394) - [#2395](https://github.com/CocoaPods/CocoaPods/pull/2395) - -* Fixes the detection of JSON podspecs included via `:path`. - [laiso](https://github.com/laiso) - [#2489](https://github.com/CocoaPods/CocoaPods/pull/2489) - -* Fixes an issue where `pod install` would crash during Plist building if any - pod has invalid UTF-8 characters in their title or description. - [Ladislav Martincik](https://github.com/martincik) - [#2482](https://github.com/CocoaPods/CocoaPods/issues/2482) - -* Fix crash when the URL of a private GitHub repo is passed to `pod spec - create` as an argument. - [Fabio Pelosin](https://github.com/fabiopelosin) - [#1543](https://github.com/CocoaPods/CocoaPods/issues/1543) - - -## 0.34.0.rc2 (2014-09-16) - -##### Bug Fixes - -* Fixes an issue where `pod lib lint` would crash if a podspec couldn't be - loaded. - [Kyle Fuller](https://github.com/kylef) - [#2147](https://github.com/CocoaPods/CocoaPods/issues/2147) - -* Fixes an issue where `pod init` would not add `source 'master'` to newly - created Podfiles. - [Ash Furrow](https://github.com/AshFurrow) - [#2473](https://github.com/CocoaPods/CocoaPods/issues/2473) - - -## 0.34.0.rc1 (2014-09-13) - -##### Breaking - -* The use of the `$PODS_ROOT` environment variable has been deprecated and - should not be used. It will be removed in future versions of CocoaPods. - [#2449](https://github.com/CocoaPods/CocoaPods/issues/2449) - -* Add support for loading podspecs from specific spec-repos _only_, a.k.a. ‘sources’. - By default, when not specifying any specific sources in your Podfile, the ‘master’ - spec-repo will be used, as was always the case. However, once you specify specific - sources the ‘master’ spec-repo will **not** be included by default. For example: - - source 'private-spec-repo' - source 'master' - - [François Benaiteau](https://github.com/netbe) - [Fabio Pelosin](https://github.com/fabiopelosin) - [#1143](https://github.com/CocoaPods/CocoaPods/pull/1143) - [Core#19](https://github.com/CocoaPods/Core/pull/19) - -* The `Pods` directory has been reorganized. This might require manual - intervention in projects where files generated by CocoaPods have manually been - imported into the user's project (common with the acknowledgements files). - [#1055](https://github.com/CocoaPods/CocoaPods/pull/1055) - [Fabio Pelosin](https://github.com/fabiopelosin) - [Michele Titolo](https://github.com/mtitolo) - -* Plugins are now expected to include the `cocoapods-plugin.rb` file in - `./lib`. - [Fabio Pelosin](https://github.com/fabiopelosin) - [CLAide#28](https://github.com/CocoaPods/CLAide/pull/28) - -* The specification `requires_arc` attribute now defaults to true. - [Fabio Pelosin](https://github.com/fabiopelosin) - [CocoaPods#267](https://github.com/CocoaPods/CocoaPods/issues/267) - -##### Enhancements - -* Add support to specify dependencies per build configuration: - - pod 'Lookback', :configurations => ['Debug'] - - Currently configurations can only be specified per single Pod. - [Joachim Bengtsson](https://github.com/nevyn) - [Eloy Durán](https://github.com/alloy) - [Fabio Pelosin](https://github.com/fabiopelosin) - [#1791](https://github.com/CocoaPods/CocoaPods/pull/1791) - [#1668](https://github.com/CocoaPods/CocoaPods/pull/1668) - [#731](https://github.com/CocoaPods/CocoaPods/pull/731) - -* Improved performance of git downloads using shallow clone. - [Marin Usalj](https://github.com/supermarin) - [Fabio Pelosin](https://github.com/fabiopelosin) - [cocoapods-downloader#29](https://github.com/CocoaPods/cocoapods-downloader/pull/29) - -* Simplify installation: CocoaPods no longer requires the - compilation of the troublesome native extensions. - [Fabio Pelosin](https://github.com/fabiopelosin) - [Xcodeproj#168](https://github.com/CocoaPods/Xcodeproj/pull/168) - [Xcodeproj#167](https://github.com/CocoaPods/Xcodeproj/issues/167) - -* Add hooks for plugins. Currently only the installer hook is supported. - A plugin can register itself to be activated after the installation with the - following syntax: - - Pod::HooksManager.register(:post_install) do |installer_context| - # implementation - end - - The `installer_context` is an instance of the `Pod::Installer:HooksContext` - class which provides the information about the installation. - [Fabio Pelosin](https://github.com/fabiopelosin) - [Core#132](https://github.com/CocoaPods/Core/pull/1755) - -* Add a support for migrating the sandbox to new versions of CocoaPods. - [Fabio Pelosin](https://github.com/fabiopelosin) - -* Display an indication for deprecated Pods in the command line search. - [Hugo Tunius](https://github.com/k0nserv) - [#2180](https://github.com/CocoaPods/CocoaPods/issues/2180) - -* Use the CLIntegracon gem for the integration tests. - [Marius Rackwitz](https://github.com/mrackwitz) - [#2371](https://github.com/CocoaPods/CocoaPods/issues/2371) - -* Include configurations that a user explicitly specifies, in their Podfile, - when the `--no-integrate` option is specified. - [Eloy Durán](https://github.com/alloy) - -* Properly quote the `-isystem` values in the xcconfig files. - [Eloy Durán](https://github.com/alloy) - -* Remove the installation post install message which presents the CHANGELOG. - [Fabio Pelosin](https://github.com/fabiopelosin) - [Eloy Durán](https://github.com/alloy) - -* Add support for user-specified project directories with the - `--project-directory` option. - [Samuel E. Giddins](https://github.com/segiddins) - [#2183](https://github.com/CocoaPods/CocoaPods/issues/2183) - -* Now the `plutil` tool is used when available to produce - output consistent with Xcode. - [Fabio Pelosin](https://github.com/fabiopelosin) - -* Indicate the name of the pod whose requirements cannot be satisfied. - [Seivan Heidari](https://github.com/seivan) - [Fabio Pelosin](https://github.com/fabiopelosin) - [#1938](https://github.com/CocoaPods/CocoaPods/issues/1938) - -* Add support for JSON specs to external sources (`:path`, `:git`, etc) - options. - [Kyle Fuller](https://github.com/kylef) - [#2320](https://github.com/CocoaPods/CocoaPods/issues/2320) - -* Generate the workspaces using the same output of Xcode. - [Fabio Pelosin](https://github.com/fabiopelosin) - - -##### Bug Fixes - -* Fix `pod repo push` to first check if a Specs directory exists and if so - push there. - [Edward Valentini](edwardvalentini) - [#2060](https://github.com/CocoaPods/CocoaPods/issues/2060) - -* Fix `pod outdated` to not include subspecs. - [Ash Furrow](ashfurrow) - [#2136](https://github.com/CocoaPods/CocoaPods/issues/2136) - -* Always evaluate podspecs from the original podspec directory. This fixes - an issue when depending on a pod via `:path` and that pod's podspec uses - relative paths. - [Kyle Fuller](kylef) - [pod-template#50](https://github.com/CocoaPods/pod-template/issues/50) - -* Fix spec linting to not warn for missing license file in subspecs. - [Fabio Pelosin](https://github.com/fabiopelosin) - [Core#132](https://github.com/CocoaPods/Core/issues/132) - -* Fix `pod init` so that it doesn't recurse when checking for Podfiles. - [Paddy O'Brien](https://github.com/tapi) - [#2181](https://github.com/CocoaPods/CocoaPods/issues/2181) - -* Fix missing XCTest framework in Xcode 6. - [Paul Williamson](squarefrog) - [#2296](https://github.com/CocoaPods/CocoaPods/issues/2296) - -* Support multiple values in `ARCHS`. - [Robert Zuber](https://github.com/z00b) - [#1904](https://github.com/CocoaPods/CocoaPods/issues/1904) - -* Fix static analysis in Xcode 6. - [Samuel E. Giddins](https://github.com/segiddins) - [#2402](https://github.com/CocoaPods/CocoaPods/issues/2402) - -* Fix an issue where a version of a spec will not be locked when using - multiple subspecs of a podspec. - [Kyle Fuller](https://github.com/kylef) - [Fabio Pelosin](https://github.com/fabiopelosin) - [#2135](https://github.com/CocoaPods/CocoaPods/issues/2135) - -* Fix an issue using JSON podspecs installed directly from a lib's - repository. - [Kyle Fuller](https://github.com/kylef) - [#2320](https://github.com/CocoaPods/CocoaPods/issues/2320) - -* Support and use quotes in the `OTHER_LDFLAGS` of xcconfigs to avoid - issues with targets containing a space character in their name. - [Fabio Pelosin](https://github.com/fabiopelosin) - - -## 0.33.1 (2014-05-20) - -##### Bug Fixes - -* Fix `pod spec lint` for `json` podspecs. - [Fabio Pelosin](https://github.com/fabiopelosin) - [#2157](https://github.com/CocoaPods/CocoaPods/issues/2157) - -* Fixed downloader issues related to `json` podspecs. - [Fabio Pelosin](https://github.com/fabiopelosin) - [#2158](https://github.com/CocoaPods/CocoaPods/issues/2158) - -* Fixed `--no-ansi` flag in help banners. - [Fabio Pelosin](https://github.com/fabiopelosin) - [#34](https://github.com/CocoaPods/CLAide/issues/34) - - -## 0.33.0 (2014-05-20) - -For more details, see 📝 [CocoaPods 0.33](https://blog.cocoapods.org/CocoaPods-0.33/) on our blog. - -##### Breaking - -* The deprecated `pre_install` and the `pod_install` hooks of the specification - class have been removed. - [Fabio Pelosin](https://github.com/fabiopelosin) - [#2151](https://github.com/CocoaPods/CocoaPods/issues/2151) - [#2153](https://github.com/CocoaPods/CocoaPods/pull/2153) - -##### Enhancements - -* Added the `cocoapods-trunk` plugin which introduces the `trunk` subcommand. - [Fabio Pelosin](https://github.com/fabiopelosin) - [#2151](https://github.com/CocoaPods/CocoaPods/issues/2151) - [#2153](https://github.com/CocoaPods/CocoaPods/pull/2153) - -* The `pod push` sub-command has been moved to the `pod repo push` sub-command. - Moreover pushing to the master repo from it has been disabled. - [Fabio Pelosin](https://github.com/fabiopelosin) - [#2151](https://github.com/CocoaPods/CocoaPods/issues/2151) - [#2153](https://github.com/CocoaPods/CocoaPods/pull/2153) - -* Overhauled command line interface. Add support for auto-completion script - (d). If auto-completion is enabled for your shell you can configure it for - CocoaPods with the following command: - - rm -f /usr/local/share/zsh/site-functions/\_pod - dpod --completion-script > /usr/local/share/zsh/site-functions/\_pod - exec zsh - - Currently only the Z shell is supported. - [Fabio Pelosin](https://github.com/fabiopelosin) - [CLAide#25](https://github.com/CocoaPods/CLAide/issues/25) - [CLAide#20](https://github.com/CocoaPods/CLAide/issues/20) - [CLAide#19](https://github.com/CocoaPods/CLAide/issues/19) - [CLAide#17](https://github.com/CocoaPods/CLAide/issues/17) - [CLAide#12](https://github.com/CocoaPods/CLAide/issues/12) - -* The `--version` flag is now only supported for the root `pod` command. If - used in conjunction with the `--verbose` flag the version of the detected - plugins will be printed as well. - [Fabio Pelosin](https://github.com/fabiopelosin) - [CLAide#13](https://github.com/CocoaPods/CLAide/issues/13) - [CLAide#14](https://github.com/CocoaPods/CLAide/issues/14) - -* The extremely meta `cocoaPods-plugins` is now installed by default providing - information about the available and the installed plug-ins. - [David Grandinetti](https://github.com/dbgrandi) - [Olivier Halligon](https://github.com/AliSoftware) - [Fabio Pelosin](https://github.com/fabiopelosin) - [#2092](https://github.com/CocoaPods/CocoaPods/issues/2092) - -* Validate the reachability of `social_media_url`, `documentation_url` and - `docset_url` in podspecs we while linting a specification. - [Kyle Fuller](https://github.com/kylef) - [#2025](https://github.com/CocoaPods/CocoaPods/issues/2025) - -* Print the current version when the repo/lockfile requires a higher version. - [Samuel E. Giddins](https://github.com/segiddins) - [#2049](https://github.com/CocoaPods/CocoaPods/issues/2049) - -* Show `help` when running the `pod` command instead of defaulting to `pod - install`. - [Kyle Fuller](https://github.com/kylef) - [#1771](https://github.com/CocoaPods/CocoaPods/issues/1771) - -##### Bug Fixes - -* Show the actual executable when external commands fail. - [Boris Bügling](https://github.com/neonichu) - [#2102](https://github.com/CocoaPods/CocoaPods/issues/2102) - -* Fixed support for file references in the workspace generated by CocoaPods. - [Kyle Fuller](https://github.com/kylef) - [Fabio Pelosin](https://github.com/fabiopelosin) - [Xcodeproj#105](https://github.com/CocoaPods/Xcodeproj/pull/150) - -* Show a helpful error message when reading version information with merge - conflict. - [Samuel E. Giddins](https://github.com/segiddins) - [#1853](https://github.com/CocoaPods/CocoaPods/issues/1853) - -* Show deprecated specs when invoking `pod outdated`. - [Samuel E. Giddins](https://github.com/segiddins) - [#2003](https://github.com/CocoaPods/CocoaPods/issues/2003) - -* Fixes an issue where `pod repo update` may start an un-committed merge. - [Kyle Fuller](https://github.com/kylef) - [#2024](https://github.com/CocoaPods/CocoaPods/issues/2024) - -## 0.32.1 (2014-04-15) - -##### Bug Fixes - -* Fixed the Podfile `default_subspec` attribute in nested subspecs. - [Fabio Pelosin](https://github.com/fabiopelosin) - [#2050](https://github.com/CocoaPods/CocoaPods/issues/2050) - -## 0.32.0 (2014-04-15) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.31.1...0.32.0) -• [CocoaPods-Core](https://github.com/CocoaPods/Core/compare/0.31.1...0.32.0) - -For more details, see 📝 [CocoaPods 0.32](https://blog.cocoapods.org/CocoaPods-0.32/) on our blog. - -##### Enhancements - -* Allow to update only a list of given pods with `pod update [POD_NAMES...]`. - [Marius Rackwitz](https://github.com/mrackwitz) - [CocoaPods#760](https://github.com/CocoaPods/CocoaPods/issues/760) - -* `pod update` prints the previous version of the updated pods. - [Andrea Mazzini](https://github.com/andreamazz) - [#2008](https://github.com/CocoaPods/CocoaPods/issues/2008) - -* `pod update` falls back to `pod install` if no Lockfile is present. - [Marius Rackwitz](https://github.com/mrackwitz) - -* File references in the Pods project for development Pods now are absolute if - the dependency is specified with an absolute paths. - [Samuel Ford](https://github.com/samuelwford) - [#1042](https://github.com/CocoaPods/CocoaPods/issues/1042) - -* Added `deprecated` and `deprecated_in_favor_of` attributes to Specification - DSL. - [Paul Young](https://github.com/paulyoung) - [Core#87](https://github.com/CocoaPods/Core/pull/87) - -* Numerous improvements to the validator and to the linter. - * Validate the reachability of screenshot URLs in podspecs while linting a - specification. - [Kyle Fuller](https://github.com/kylef) - [#2010](https://github.com/CocoaPods/CocoaPods/issues/2010) - * Support HTTP redirects when linting homepage and screenshots. - [Boris Bügling](https://github.com/neonichu) - [#2027](https://github.com/CocoaPods/CocoaPods/pull/2027) - * The linter now checks `framework` and `library` attributes for invalid - strings. - [Paul Williamson](https://github.com/squarefrog) - [Fabio Pelosin](fabiopelosin) - [Core#66](https://github.com/CocoaPods/Core/issues/66) - [Core#96](https://github.com/CocoaPods/Core/pull/96) - [Core#105](https://github.com/CocoaPods/Core/issues/105) - * The Linter will not check for comments anymore. - [Fabio Pelosin](https://github.com/fabiopelosin) - [Core#108](https://github.com/CocoaPods/Core/issues/108) - * Removed legacy checks from the linter. - [Fabio Pelosin](https://github.com/fabiopelosin) - [Core#108](https://github.com/CocoaPods/Core/issues/108) - * Added logic to handle subspecs and platform scopes to linter check of - the `requries_arc` attribute. - [Fabio Pelosin](https://github.com/fabiopelosin) - [CocoaPods#2005](https://github.com/CocoaPods/CocoaPods/issues/2005) - * The linter no longer considers empty a Specification if it only specifies the - `resource_bundle` attribute. - [Joshua Kalpin](https://github.com/Kapin) - [#63](https://github.com/CocoaPods/Core/issues/63) - [#95](https://github.com/CocoaPods/Core/pull/95) - -* `pod lib create` is now using the `configure` file instead of the - `_CONFIGURE.rb` file. - [Piet Brauer](https://github.com/pietbrauer) - [Orta Therox](https://github.com/orta) - -* `pod lib create` now disallows any pod name that begins with a `.` - [Dustin Clark](https://github.com/clarkda) - [#2026](https://github.com/CocoaPods/CocoaPods/pull/2026) - [Core#97](https://github.com/CocoaPods/Core/pull/97) - [Core#98](https://github.com/CocoaPods/Core/issues/98) - -* Prevent the user from using `pod` commands as root. - [Kyle Fuller](https://github.com/kylef) - [#1815](https://github.com/CocoaPods/CocoaPods/issues/1815) - -* Dependencies declared with external sources now support HTTP downloads and - have improved support for all the options supported by the downloader. - [Fabio Pelosin](https://github.com/fabiopelosin) - -* An informative error message is presented when merge conflict is detected in - a YAML file. - [Luis de la Rosa](https://github.com/luisdelarosa) - [#69](https://github.com/CocoaPods/Core/issues/69) - [#100](https://github.com/CocoaPods/Core/pull/100) - -##### Bug Fixes - -* Fixed the Podfile `default_subspec` attribute in nested subspecs. - [Fabio Pelosin](https://github.com/fabiopelosin) - [#1021](https://github.com/CocoaPods/CocoaPods/issues/1021) - -* Warn when including deprecated pods - [Samuel E. Giddins](https://github.com/segiddins) - [#2003](https://github.com/CocoaPods/CocoaPods/issues/2003) - - -## 0.31.1 (2014-04-01) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.31.0...0.31.1) -• [CocoaPods-Core](https://github.com/CocoaPods/Core/compare/0.31.0...0.31.1) - -##### Minor Enhancements - -* The specification now strips the indentation of the `prefix_header` and - `prepare_command` to aide their declaration as a here document (similarly to - what it already does with the description). - [Fabio Pelosin](https://github.com/fabiopelosin) - [Core#51](https://github.com/CocoaPods/Core/issues/51) - -##### Bug Fixes - -* Fix linting for Pods which declare a private repo as the source. - [Boris Bügling](https://github.com/neonichu) - [Core#82](https://github.com/CocoaPods/Core/issues/82) - - -## 0.31.0 (2014-03-31) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.30.0...0.31.0) -• [CocoaPods-Core](https://github.com/CocoaPods/Core/compare/0.30.0...0.31.0) - -For more details, see 📝 [CocoaPods 0.31](https://blog.cocoapods.org/CocoaPods-0.31/) on our blog. - -##### Enhancements - -* Warnings are not promoted to errors anymore to maximise compatibility with - existing libraries. - [Fabio Pelosin](https://github.com/fabiopelosin) - [#1629](https://github.com/CocoaPods/CocoaPods/issues/1629) - -* Include the versions of the Pods to the output of `pod list`. - [Stefan Damm](https://github.com/StefanDamm) - [Robert Zuber](https://github.com/z00b) - [#1617](https://github.com/CocoaPods/CocoaPods/issues/1617) - -* Generated prefix header file will now have unique prefix_header_contents for - Pods with subspecs. - [Luis de la Rosa](https://github.com/luisdelarosa) - [#1449](https://github.com/CocoaPods/CocoaPods/issues/1449) - -* The linter will now check the reachability of the homepage of Podspecs during - a full lint. - [Richard Lee](https://github.com/dlackty) - [Fabio Pelosin](https://github.com/fabiopelosin) - [#1704](https://github.com/CocoaPods/CocoaPods/issues/1704) - [Core#70](https://github.com/CocoaPods/Core/pull/70) - -* Improved detection of the last version of a specification in `pod spec` - subcommands. - [Laurent Sansonetti](https://github.com/lrz) - [#1953](https://github.com/CocoaPods/CocoaPods/pull/1953) - -* Display advised settings for Travis CI in the warning related presented when - the terminal encoding is not set to UTF-8. - [Richard Lee](https://github.com/dlackty) - [#1933](https://github.com/CocoaPods/CocoaPods/issues/1933) - [#1941](https://github.com/CocoaPods/CocoaPods/pull/1941) - -* Unset the `CDPATH` env variable before shelling-out to `prepare_command`. - [Marc Boquet](https://github.com/apalancat) - [#1943](https://github.com/CocoaPods/CocoaPods/pull/1943) - -##### Bug Fixes - -* Resolve crash related to the I18n deprecation warning. - [Eloy Durán](https://github.com/alloy) - [#1950](https://github.com/CocoaPods/CocoaPods/issues/1950) - -* Fix compilation issues related to the native Extension of Xcodeproj. - [Eloy Durán](https://github.com/alloy) - -* Robustness against user Git configuration and against merge commits in `pod - repo` subcommands. - [Boris Bügling](https://github.com/neonichu) - [#1949](https://github.com/CocoaPods/CocoaPods/issues/1949) - [#1978](https://github.com/CocoaPods/CocoaPods/pull/1978) - -* Gracefully inform the user if the `:head` option is not supported for a given - download strategy. - [Boris Bügling](https://github.com/neonichu) - [#1947](https://github.com/CocoaPods/CocoaPods/issues/1947) - [#1958](https://github.com/CocoaPods/CocoaPods/pull/1958) - -* Cleanup a pod directory if error occurs while downloading. - [Alex Rothenberg](https://github.com/alexrothenberg) - [#1842](https://github.com/CocoaPods/CocoaPods/issues/1842) - [#1960](https://github.com/CocoaPods/CocoaPods/pull/1960) - -* No longer warn for Github repositories with OAuth authentication. - [Boris Bügling](https://github.com/neonichu) - [#1928](https://github.com/CocoaPods/CocoaPods/issues/1928) - [Core#77](https://github.com/CocoaPods/Core/pull/77) - -* Fix for when using `s.version` as the `:tag` for a git repository in a - Podspec. - [Joel Parsons](https://github.com/joelparsons) - [#1721](https://github.com/CocoaPods/CocoaPods/issues/1721) - [Core#72](https://github.com/CocoaPods/Core/pull/72) - -* Improved escaping of paths in Git downloader. - [Vladimir Burdukov](https://github.com/chipp) - [cocoapods-downloader#14](https://github.com/CocoaPods/cocoapods-downloader/pull/14) - -* Podspec without explicitly set `requires_arc` attribute no longer passes the - lint. - [Richard Lee](https://github.com/dlackty) - [#1840](https://github.com/CocoaPods/CocoaPods/issues/1840) - [Core#71](https://github.com/CocoaPods/Core/pull/71) - -* Properly quote headers in the `-isystem` compiler flag of the aggregate - targets. - [Eloy Durán](https://github.com/alloy) - [#1862](https://github.com/CocoaPods/CocoaPods/issues/1862) - [#1894](https://github.com/CocoaPods/CocoaPods/pull/1894) - -## 0.30.0 (2014-03-29) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.29.0...0.30.0) - -For more details, see 📝 [CocoaPods 0.30](https://blog.cocoapods.org/CocoaPods-0.30/) on our blog. - -###### Enhancements - -* Radically reduce first run pod setup bandwidth by creating a shallow clone of - the ‘master’ repo by default. Use the `--no-shallow` option to perform a full - clone instead. - [Jeff Verkoeyen](https://github.com/jverkoey) - [#1803](https://github.com/CocoaPods/CocoaPods/pull/1803) - -* Improves the error message when searching with an invalid regular expression. - [Kyle Fuller](https://github.com/kylef) - -* Improves `pod init` to save Xcode project file in Podfile when one was supplied. - [Kyle Fuller](https://github.com/kylef) - -* Adds functionality to specify a template URL for the `pod lib create` command. - [Piet Brauer](https://github.com/pietbrauer) - -###### Bug Fixes - -* Fixes a bug with `pod repo remove` silently handling permission errors. - [Kyle Fuller](https://github.com/kylef) - [#1778](https://github.com/CocoaPods/CocoaPods/issues/1778) - -* `pod push` now properly checks that the repo has changed before attempting - to commit. This only affected pods with special characters (such as `+`) in - their names. - [Gordon Fontenot](https://github.com/gfontenot) - [#1739](https://github.com/CocoaPods/CocoaPods/pull/1739) - - -## 0.29.0 (2013-12-25) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.28.0...0.29.0) -• [CocoaPods-core](https://github.com/CocoaPods/Core/compare/0.28.0...0.29.0) -• [cocoapods-downloader](https://github.com/CocoaPods/cocoapods-downloader/compare/0.2.0...0.3.0) - -For more details, see 📝 [CocoaPods 0.29](https://blog.cocoapods.org/CocoaPods-0.29/) on our blog. - -###### Breaking - -* The command `podfile_info` is now a plugin offered by CocoaPods. - As a result, the command has been removed from CocoaPods. - [Joshua Kalpin](https://github.com/Kapin) - [#1589](https://github.com/CocoaPods/CocoaPods/issues/1589) - -* JSON has been adopted as the format to store specifications. As a result - the `pod ipc spec` command returns a JSON representation and the YAML - specifications are not supported anymore. JSON specifications adopt the - `.podspec.json` extension. - [Fabio Pelosin](https://github.com/fabiopelosin) - [#1568](https://github.com/CocoaPods/CocoaPods/pull/1568) - -###### Enhancements - -* Introduced `pod try` the easiest way to test the example project of a pod. - [Fabio Pelosin](https://github.com/fabiopelosin) - [#1568](https://github.com/CocoaPods/CocoaPods/pull/1568) - -* Pod headers are now provided to the user target as a system - header. This means that any warnings in a Pod's code will show - under its target in Xcode's build navigator, and never under the - user target. - [Swizzlr](https://github.com/swizzlr) - [#1596](https://github.com/CocoaPods/CocoaPods/pull/1596) - -* Support LZMA2 compressed tarballs in the downloader. - [Kyle Fuller](https://github.com/kylef) - [cocoapods-downloader#5](https://github.com/CocoaPods/cocoapods-downloader/pull/5) - -* Add Bazaar support for installing directly from a repo. - [Fred McCann](https://github.com/fmccann) - [#1632](https://github.com/CocoaPods/CocoaPods/pull/1632) - -* The `pod search ` command now supports regular expressions - for the query parameter when searching using the option `--full`. - [Florian Hanke](https://github.com/floere) - [#1643](https://github.com/CocoaPods/CocoaPods/pull/1643) - -* Pod lib lint now accepts multiple podspecs in the same folder. - [kra Larivain/OpenTable](https://github.com/opentable) - [#1635](https://github.com/CocoaPods/CocoaPods/pull/1635) - -* The `pod push` command will now silently test the upcoming CocoaPods trunk - service. The service is only tested when pushing to the master repo and the - test doesn't affect the normal workflow. - [Fabio Pelosin](https://github.com/fabiopelosin) - -* The `pod search ` command now supports searching on cocoapods.org - when searching using the option `--web`. Options `--ios` and `--osx` are - fully supported. - [Florian Hanke](https://github.com/floere) - [#1643](https://github.com/CocoaPods/CocoaPods/pull/1682) - -* The `pod search ` command now supports multiword queries when using - the `--web` option. - [Florian Hanke](https://github.com/floere) - [#1643](https://github.com/CocoaPods/CocoaPods/pull/1682) - -###### Bug Fixes - -* Fixed a bug which resulted in `pod lib lint` not being able to find the - headers. - [Fabio Pelosin](https://github.com/fabiopelosin) - [#1566](https://github.com/CocoaPods/CocoaPods/issues/1566) - -* Fixed the developer frameworks search paths so that - `$(SDKROOT)/Developer/Library/Frameworks` is used for iOS and - `$(DEVELOPER_LIBRARY_DIR)/Frameworks` is used for OS X. - [Kevin Wales](https://github.com/kwales) - [#1562](https://github.com/CocoaPods/CocoaPods/pull/1562) - -* When updating the pod repos, repositories with unreachable remotes - are now ignored. This fixes an issue with certain private repositories. - [Joshua Kalpin](https://github.com/Kapin) - [#1595](https://github.com/CocoaPods/CocoaPods/pull/1595) - [#1571](https://github.com/CocoaPods/CocoaPods/issues/1571) - -* The linter will now display an error if a Pod's name contains whitespace. - [Joshua Kalpin](https://github.com/Kapin) - [Core#39](https://github.com/CocoaPods/Core/pull/39) - [#1610](https://github.com/CocoaPods/CocoaPods/issues/1610) - -* Having the silent flag enabled in the config will no longer cause issues - with `pod search`. In addition, the flag `--silent` is no longer supported - for the command. - [Joshua Kalpin](https://github.com/Kapin) - [#1627](https://github.com/CocoaPods/CocoaPods/pull/1627) - -* The linter will now display an error if a framework ends with `.framework` - (i.e. `QuartzCore.framework`). - [Joshua Kalpin](https://github.com/Kapin) - [#1331](https://github.com/CocoaPods/CocoaPods/issues/1336) - [Core#45](https://github.com/CocoaPods/Core/pull/45) - -* The linter will now display an error if a library ends with `.a` or `.dylib` - (i.e. `z.dylib`). It will also display an error if it begins with `lib` - (i.e. `libxml`). - [Joshua Kalpin](https://github.com/Kapin) - [Core#44](https://github.com/CocoaPods/Core/issues/44) - -* The ARCHS build setting can come back as an array when more than one - architecture is specified. - [Carson McDonald](https://github.com/carsonmcdonald) - [#1628](https://github.com/CocoaPods/CocoaPods/issues/1628) - -* Fixed all issues caused by `/tmp` being a symlink to `/private/tmp`. - This affected mostly `pod lib lint`, causing it to fail when the - Pod used `prefix_header_*` or when the pod headers imported headers - using the namespaced syntax (e.g. `#import `). - [kra Larivain/OpenTable](https://github.com/opentable) - [#1514](https://github.com/CocoaPods/CocoaPods/pull/1514) - -* Fixed an incorrect path being used in the example app Podfile generated by - `pod lib create`. - [Eloy Durán](https://github.com/alloy) - [cocoapods-try#5](https://github.com/CocoaPods/cocoapods-try/issues/5) - - -## 0.28.0 (2013-11-14) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.27.1...0.28.0) -• [CocoaPods-core](https://github.com/CocoaPods/Core/compare/0.27.1...0.28.0) -• [CLAide](https://github.com/CocoaPods/CLAide/compare/0.3.2...0.4.0) - -For more details, see 📝 [CocoaPods 0.28](https://blog.cocoapods.org/CocoaPods-0.28/) on our blog. - -###### Enhancements - -* CLAide now supports gem plugins. An example CocoaPods plugin can be found at - [open\_pod\_bay](https://github.com/leshill/open_pod_bay). - - As of yet there are no promises made yet on the APIs, so try to fail as - gracefully as possible in case a CocoaPods update breaks your usage. In these - cases, also please let us know what you would need, so we can take this into - account when we do finalize APIs. - - [Les Hill](https://github.com/leshill) - [CLAide#1](https://github.com/CocoaPods/CLAide/pull/1) - [#959](https://github.com/CocoaPods/CocoaPods/issues/959) - -###### Bug Fixes - -* Compiling `xcassets` with `actool` now uses `UNLOCALIZED_RESOURCES_FOLDER_PATH` - instead of `PRODUCT_NAME.WRAPPER_EXTENSION` as output directory as it is more - accurate and allows the project to overwrite `WRAPPER_NAME`. - [Marc Knaup](https://github.com/fluidsonic) - [#1556](https://github.com/CocoaPods/CocoaPods/pull/1556) - -* Added a condition to avoid compiling xcassets when `WRAPPER_EXTENSION` - is undefined, as it would be in the case of static libraries. This prevents - trying to copy the compiled files to a directory that does not exist. - [Noah McCann](https://github.com/nmccann) - [#1521](https://github.com/CocoaPods/CocoaPods/pull/1521) - -* Added additional condition to check if `actool` is available when compiling - `xcassets`. This prevents build failures of Xcode 5 projects on Travis CI (or - lower Xcode versions). - [Michal Konturek](https://github.com/michalkonturek) - [#1511](https://github.com/CocoaPods/CocoaPods/pull/1511) - -* Added a condition to properly handle universal or mac apps when compiling - xcassets. This prevents build errors in the xcassets compilation stage - particularly when using xctool to build. - [Ryan Marsh](https://github.com/ryanwmarsh) - [#1594](https://github.com/CocoaPods/CocoaPods/pull/1594) - -* Vendored Libraries now correctly affect whether a podspec is considered empty. - [Joshua Kalpin](https://github.com/Kapin) - [Core#38](https://github.com/CocoaPods/Core/pull/38) - -* Vendored Libraries and Vendored Frameworks now have their paths validated correctly. - [Joshua Kalpin](https://github.com/Kapin) - [#1567](https://github.com/CocoaPods/CocoaPods/pull/1567) - -* Gists are now correctly accepted with https. - [Joshua Kalpin](https://github.com/Kapin) - [Core#38](https://github.com/CocoaPods/Core/pull/38) - -* The `pod push` command is now more specific about the branch it pushes to. - [orta](http://orta.github.io) - [#1561](https://github.com/CocoaPods/CocoaPods/pull/1561) - -* Dtrace files are now properly left unflagged when installing, regardless of configuration. - [Swizzlr](https://github.com/swizzlr) - [#1560](https://github.com/CocoaPods/CocoaPods/pull/1560) - -* Users are now warned if their terminal encoding is not UTF-8. This fixes an issue - with a small percentage of pod names that are incompatible with ASCII. - [Joshua Kalpin](https://github.com/Kapin) - [#1570](https://github.com/CocoaPods/CocoaPods/pull/1570) - - -## 0.27.1 (2013-10-24) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.26.2...0.27.1) -• [cocoapods-core](https://github.com/CocoaPods/Core/compare/0.26.2...0.27.1) -• [Xcodeproj](https://github.com/CocoaPods/Xcodeproj/compare/0.13.0...0.14.0) - -For more details, see 📝 [CocoaPods 0.27 and improved installation UX](https://blog.cocoapods.org/CocoaPods-0.27-and-improved-installation-UX/) on our blog. - -###### Enhancements - -* The xcodeproj gem now comes bundled with prebuilt binaries for the Ruby - versions that come with OS X 10.8 and 10.9. Users now no longer need to - install the Xcode Command Line Tools or deal with the Ruby C header location. - [Eloy Durán](https://github.com/alloy) - [Xcodeproj#88](https://github.com/CocoaPods/Xcodeproj/issues/88) - -* Targets passed to the `link_with` method of the Podfile DSL no longer need - to be explicitly passed as an array. `link_with ['target1', 'target2']` can - now be written as `link_with 'target1', 'target2'`. - [Adam Sharp](https://github.com/sharplet) - [Core#30](https://github.com/CocoaPods/Core/pull/30) - -* The copy resources script now compiles xcassets resources. - [Ulrik Damm](https://github.com/ulrikdamm) - [#1427](https://github.com/CocoaPods/CocoaPods/pull/1427) - -* `pod repo` now support a `remove ['repo_name']` command. - [Joshua Kalpin](https://github.com/Kapin) - [#1493](https://github.com/CocoaPods/CocoaPods/issues/1493) - [#1484](https://github.com/CocoaPods/CocoaPods/issues/1484) - -###### Bug Fixes - -* The architecture is now set in the build settings of the user build - configurations. - [Fabio Pelosin](https://github.com/fabiopelosin) - [#1450](https://github.com/CocoaPods/CocoaPods/issues/1462) - [#1462](https://github.com/CocoaPods/CocoaPods/issues/1462) - -* Fixed a crash related to CocoaPods being unable to resolve an unique build - setting of an user target with custom build configurations. - [Fabio Pelosin](https://github.com/fabiopelosin) - [#1462](https://github.com/CocoaPods/CocoaPods/issues/1462) - [#1463](https://github.com/CocoaPods/CocoaPods/issues/1463) - [#1457](https://github.com/CocoaPods/CocoaPods/issues/1457) - -* Fixed a defect which prevented subspecs from being dependant on a pod with a - name closely matching the name of one of the subspec's parents. - [Noah McCann](https://github.com/nmccann) - [#29](https://github.com/CocoaPods/Core/pull/29) - -* The developer dir relative to the SDK is not added anymore if testing - frameworks are detected in OS X targets, as it doesn't exists, avoiding the - presentation of the relative warning in Xcode. - [Fabio Pelosin](https://github.com/fabiopelosin) - - -## 0.26.2 (2013-10-09) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.26.1...0.26.2) -• [cocoapods-core](https://github.com/CocoaPods/Core/compare/0.26.1...0.26.2) -• [Xcodeproj](https://github.com/CocoaPods/Xcodeproj/compare/0.11.1...0.13.0) - -###### Bug Fixes - -* Fixed a crash which was causing a failure in `pod lib create` if the name of - the Pod included spaces. As spaces are not supported now this is gracefully - handled with an informative message. - [Kyle Fuller](https://github.com/kylef) - [#1456](https://github.com/CocoaPods/CocoaPods/issues/1456) - -* If an user target doesn't specify an architecture the value specified for the - project is used in CocoaPods targets. - [Fabio Pelosin](https://github.com/fabiopelosin) - [#1450](https://github.com/CocoaPods/CocoaPods/issues/1450) - -* The Pods project now properly configures ARC on all build configurations. - [Fabio Pelosin](https://github.com/fabiopelosin) - [#1454](https://github.com/CocoaPods/CocoaPods/issues/1454) - - -## 0.26.1 (2013-10-08) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.25.0...0.26.1) -• [cocoapods-core](https://github.com/CocoaPods/Core/compare/0.25.0...0.26.1) -• [Xcodeproj](https://github.com/CocoaPods/Xcodeproj/compare/0.11.1...0.12.0) - -For more details, see 📝 [CocoaPods 0.26](https://blog.cocoapods.org/CocoaPods-0.26/) on our blog. - -###### Enhancements - -* CocoaPods now creates and hides the schemes of its targets after every - installation. The schemes are not shared because the flag which keeps track - whether they should be visible is a user only flag. The schemes are still - present and to debug a single Pod it is possible to make its scheme visible - in the Schemes manager of Xcode. This is rarely needed though because the - user targets trigger the compilation of the Pod targets. - [Fabio Pelosin](https://github.com/fabiopelosin) - [#1185](https://github.com/CocoaPods/CocoaPods/pull/1185) - -* Installations which don't integrate a user target (lint subcommands and - `--no-integrate` option) now set the architecture of OS X Pod targets to - `$(ARCHS_STANDARD_64_BIT)` (Xcode 4 default value for new targets). This - fixes lint issues with Xcode 4. - [Fabio Pelosin](https://github.com/fabiopelosin) - [#1185](https://github.com/CocoaPods/CocoaPods/pull/1185) - -* Further improvements to the organization of the Pods project - - - The project is now is sorted by name with groups at the bottom. - - Source files are now stored in the root group of the spec, subspecs are not - stored in a `Subspec` group anymore and the products of the Pods all are - stored in the products group of the project. - - The frameworks are referenced relative to the Developer directory and - namespaced per platform. - - [Fabio Pelosin](https://github.com/fabiopelosin) - [#1389](https://github.com/CocoaPods/CocoaPods/pull/1389) - [#1420](https://github.com/CocoaPods/CocoaPods/pull/1420) - -* Added the `documentation_url` DSL attribute to the specifications. - [Fabio Pelosin](https://github.com/fabiopelosin) - [#1273](https://github.com/CocoaPods/CocoaPods/pull/1273) - -###### Bug Fixes - -* The search paths of vendored frameworks and libraries now are always - specified relatively. - [Fabio Pelosin](https://github.com/fabiopelosin) - [#1405](https://github.com/CocoaPods/CocoaPods/pull/1405) - -* Fix an issue where CocoaPods would fail to work when used with an older - version of the Active Support gem. This fix raises the dependency version to - the earliest compatible version of Active Support. - [Kyle Fuller](https://github.com/kylef) - [#1407](https://github.com/CocoaPods/CocoaPods/issues/1407) - -* CocoaPods will not attempt to load anymore all the version of a specification - preventing crashes if those are incompatible. - [Fabio Pelosin](https://github.com/fabiopelosin) - [#1272](https://github.com/CocoaPods/CocoaPods/pull/1272) - - -## 0.25.0 (2013-09-20) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.24.0...0.25.0) -• [cocoapods-core](https://github.com/CocoaPods/Core/compare/0.24.0...0.25.0) -• [Xcodeproj](https://github.com/CocoaPods/Xcodeproj/compare/0.10.1...0.11.0) - -###### Enhancements - -* Added support for Xcode 5. - - The generated Pods Xcode project is now compatible with `arm64` projects and - is updated to use Xcode 5’s default settings removing all warnings. - - **NOTE to users migrating projects from Xcode 4, or are still using Xcode 4:** - 1. The Pods Xcode project now sets the `ONLY_ACTIVE_ARCH` build setting to - `YES` in the `Debug` configuration. You _will_ have to set the same on your - project/target, otherwise the build _will_ fail. - 2. Ensure your project/target has an `ARCHS` value set, otherwise the build - _will_ fail. - 3. When building a **iOS** project from the command-line, with the `xcodebuild` - tool that comes with Xcode 4, you’ll need to completely disable this setting - by appending to your build command: `ONLY_ACTIVE_ARCH=NO`. - - [#1352](https://github.com/CocoaPods/CocoaPods/pull/1352) - -* Speed up project generation in `pod install` and `pod update`. - -* The pre and post install hooks that have been deprecated now include the name - and version of the spec that’s using them. - -###### Bug Fixes - -* Only create a single resource bundle for all targets. Prior to this change a - resource bundle included into multiple targets within the project would create - duplicately named targets in the Pods Xcode project, causing duplicately named - Schemes to be created on each invocation of `pod install`. All targets that - reference a given resource bundle now have dependencies on a single common - target. - - [Blake Watters](https://github.com/blakewatters) - [#1338](https://github.com/CocoaPods/CocoaPods/issues/1338) - -* Solved outstanding issues with CocoaPods resource bundles and Archive builds: - 1. The rsync task copies symlinks into the App Bundle, producing an invalid - app. This change add `--copy-links` to the rsync invocation to ensure the - target files are copied rather than the symlink. - 2. The Copy Resources script uses `TARGET_BUILD_DIR` which points to the App - Archiving folder during an Archive action. Switching to - `BUILT_PRODUCTS_DIR` instead ensures that the path is correct for all - actions and configurations. - - [Blake Watters](https://github.com/blakewatters) - [#1309](https://github.com/CocoaPods/CocoaPods/issues/1309) - [#1329](https://github.com/CocoaPods/CocoaPods/issues/1329) - -* Ensure resource bundles are copied to installation location on install actions - [Chris Gummer](https://github.com/chrisgummer) - [#1364](https://github.com/CocoaPods/CocoaPods/issues/1364) - -* Various bugfixes in Xcodeproj, refer to its [CHANGELOG](https://github.com/CocoaPods/Xcodeproj/blob/0.11.0/CHANGELOG.md) - for details. - - -## 0.24.0 (2013-09-04) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.23.0...0.24.0) -• [cocoapods-core](https://github.com/CocoaPods/Core/compare/0.23.0...0.24.0) -• [Xcodeproj](https://github.com/CocoaPods/Xcodeproj/compare/0.8.1...0.9.0) -• [cocoapods-downloader](https://github.com/CocoaPods/cocoapods-downloader/compare/0.1.1...0.2.0) - -###### Enhancements - -* Added `pod init` command which generates a Podfile according to the - targets of the project stored in the working directory and to the templates - stored in the `~/.cocoapods/templates` folder. Two templates are supported: - - the `Podfile.default` template for regular targets. - - and the `Podfile.test` template for test targets. - [Ian Ynda-Hummel](https://github.com/ianyh) - [#1106](https://github.com/CocoaPods/CocoaPods/issues/1106) - [#1045](https://github.com/CocoaPods/CocoaPods/issues/1045) - -* CocoaPods will now leverage the [xcproj](https://github.com/0xced/xcproj) - command line tool if available in the path of the user to touch saved - projects. This will result in projects being serialized in the exact format - used by Xcode eliminating merge conflicts and other related issues. To learn - more about how to install xcproj see its - [readme](https://github.com/0xced/xcproj). - [Cédric Luthi](https://github.com/0xced) - [#1275](https://github.com/CocoaPods/CocoaPods/issues/1275) - -* Rationalized and cleaned up Pods project group structure and path specification. - -* Create all necessary build configurations for *Pods.xcodeproj* at the project level. If the user’s project has more than just *Debug* and *Release* build configurations, they may be explicitly specified in the Podfile: -`xcodeproj 'MyApp', 'App Store' => :release, 'Debug' => :debug, 'Release' => :release` - If build configurations aren’t specified in the Podfile then they will be automatically picked from the user’s project in *Release* mode. - These changes will ensure that the `libPods.a` static library is not stripped for all configurations, as explained in [#1217](https://github.com/CocoaPods/CocoaPods/pull/1217). - [Cédric Luthi](https://github.com/0xced) - [#1294](https://github.com/CocoaPods/CocoaPods/issues/1294) - -* Added basic support for Bazaar repositories. - [Fred McCann](https://github.com/fmccann) - [cocoapods-downloader#4](https://github.com/CocoaPods/cocoapods-downloader/pull/4) - -###### Bug Fixes - -* Fixed crash in `pod spec cat`. - -* Use the `TARGET_BUILD_DIR` environment variable for installing resource bundles. - [Cédric Luthi](https://github.com/0xced) - [#1268](https://github.com/CocoaPods/CocoaPods/issues/1268) - -* CoreData versioned models are now properly handled respecting the contents of - the `.xccurrentversion` file. - [Ashton-W](https://github.com/Ashton-W) - [#1288](https://github.com/CocoaPods/CocoaPods/issues/1288), - [Xcodeproj#83](https://github.com/CocoaPods/Xcodeproj/pull/83) - -* OS X frameworks are now copied to the Resources folder using rsync to - properly overwrite existing files. - [Nikolaj Schumacher](https://github.com/nschum) - [#1063](https://github.com/CocoaPods/CocoaPods/issues/1063) - -* User defined build configurations are now added to the resource bundle - targets. - [#1309](https://github.com/CocoaPods/CocoaPods/issues/1309) - - -## 0.23.0 (2013-08-08) - - -## 0.23.0.rc1 (2013-08-02) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.22.3...0.23.0.rc1) -• [cocoapods-core](https://github.com/CocoaPods/Core/compare/0.22.3...0.23.0.rc1) -• [Xcodeproj](https://github.com/CocoaPods/Xcodeproj/compare/0.8.1...0.9.0) -• [cocoapods-downloader](https://github.com/CocoaPods/cocoapods-downloader/compare/0.1.1...0.1.2) - -###### Enhancements - -* Added `prepare_command` attribute to Specification DSL. The prepare command - will replace the `pre_install` hook. The `post_install` hook has also been - deprecated. - [#1247](https://github.com/CocoaPods/CocoaPods/issues/1247) - - The reason we provided Ruby hooks at first, was because we wanted to offer - the option to make any required configuration possible. By now, however, we - have a pretty good idea of the use-cases and are therefore locking down the - freedom that was once available. In turn, we’re adding attributes that can - replace the most common use-cases. _(See the enhancements directly following - this entry for more info)._ - - The second reason we need to lock this down is because this is the last - remaining obstacle to fully serialize specifications, which we need in order - to move to a ‘spec push’ web-service in the future. - -* Added `resource_bundles` attribute to the Specification DSL. - [#743](https://github.com/CocoaPods/CocoaPods/issues/743) - [#1186](https://github.com/CocoaPods/CocoaPods/issues/1186) - -* Added `vendored_frameworks` attribute to the Specification DSL. - [#809](https://github.com/CocoaPods/CocoaPods/issues/809) - [#1075](https://github.com/CocoaPods/CocoaPods/issues/1075) - -* Added `vendored_libraries` attribute to the Specification DSL. - [#809](https://github.com/CocoaPods/CocoaPods/issues/809) - [#1075](https://github.com/CocoaPods/CocoaPods/issues/1075) - -* Restructured `.cocoapods` folder to contain repos in a subdirectory. - [Ian Ynda-Hummel](https://github.com/ianyh) - [#1150](https://github.com/CocoaPods/CocoaPods/issues/1150) - -* Improved `pod spec create` template. - [#1223](https://github.com/CocoaPods/CocoaPods/issues/1223) - -* Added copy&paste-friendly dependency to `pod search`. - [#1073](https://github.com/CocoaPods/CocoaPods/issues/1073) - -* Improved performance of the installation of Pods with git - sources which specify a tag. - [#1077](https://github.com/CocoaPods/CocoaPods/issues/1077) - -* Core Data `xcdatamodeld` files are now properly referenced from the Pods - project. - [#1155](https://github.com/CocoaPods/CocoaPods/issues/1155) - -* Removed punctuation check from the specification validations. - [#1242](https://github.com/CocoaPods/CocoaPods/issues/1242) - -* Deprecated the `documentation` attribute of the Specification DSL. - [Core#20](https://github.com/CocoaPods/Core/issues/20) - -###### Bug Fixes - -* Fix copy resource script issue related to filenames with spaces. - [Denis Hennessy](https://github.com/dhennessy) - [#1231](https://github.com/CocoaPods/CocoaPods/issues/1231) - - - -## 0.22.3 (2013-07-23) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.22.2...0.22.3) - -###### Enhancements - -* Add support for .xcdatamodel resource files (in addition to .xcdatamodeld). - [#1201](https://github.com/CocoaPods/CocoaPods/pull/1201) - -###### Bug Fixes - -* Always exlude `USE_HEADERMAP` from the user’s project. - [#1216](https://github.com/CocoaPods/CocoaPods/issues/1216) - -* Use correct template repo when using the `pod lib create` command. - [#1214](https://github.com/CocoaPods/CocoaPods/issues/1214) - -* Fixed issue with `pod push` failing when the podspec is unchanged. It will now - report `[No change] ExamplePod (0.1.0)` and continue to push other podspecs if - they exist. [#1199](https://github.com/CocoaPods/CocoaPods/pull/1199) - -* Set STRIP_INSTALLED_PRODUCT = NO in the generated Pods project. This allows - Xcode to include symbols from CocoaPods in dSYMs during Archive builds. - [#1217](https://github.com/CocoaPods/CocoaPods/pull/1217) - -* Ensure the resource script doesn’t fail due to the resources list file not - existing when trying to delete it. - [#1198](https://github.com/CocoaPods/CocoaPods/pull/1198) - -* Fix handling of spaces in paths when compiling xcdatamodel(d) files. - [#1201](https://github.com/CocoaPods/CocoaPods/pull/1201) - - - -## 0.22.2 (2013-07-11) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.22.1...0.22.2) -• [cocoapods-core](https://github.com/CocoaPods/Core/compare/0.22.1...0.22.2) -• [Xcodeproj](https://github.com/CocoaPods/Xcodeproj/compare/0.8.0...0.8.1) - -###### Enhancements - -* The build settings of the Pods project and of its target have been updated to - be in line with the new defaults of the future versions of Xcode. - -###### Bug fixes - -* Specifications defining build setting with the `[*]` syntax are now properly - handled. - [#1171](https://github.com/CocoaPods/CocoaPods/issues/1171) - -* The name of the files references are now properly set fixing a minor - regression introduced by CocoaPods 0.22.1 and matching more closely Xcode - behaviour. - -* The validator now builds the Pods target instead of the first target actually - performing the validation. - -* Build settings defined through the `xcconfig` attribute of a `podspec` are now - stripped of duplicate values when merged in an aggregate target. - [#1189](https://github.com/CocoaPods/CocoaPods/issues/1189) - - -## 0.22.1 (2013-07-03) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.22.0...0.22.1) -• [cocoapods-core](https://github.com/CocoaPods/Core/compare/0.22.0...0.22.1) - -###### Bug fixes - -* Fixed a crash related to target dependencies and subspecs. - [#1168](https://github.com/CocoaPods/CocoaPods/issues/1168) - - -## 0.22.0 (2013-07-03) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.21.0...0.22.0) -• [cocoapods-core](https://github.com/CocoaPods/Core/compare/0.21.0...0.22.0) -• [Xcodeproj](https://github.com/CocoaPods/Xcodeproj/compare/0.7.1...0.8.0) - -###### Enhancements - -* Added the `pod lib create` subcommand which allows to create a new Pod - adhering to the best practices. The template is still a bit primitive - and we encourage users to provide feedback by submitting patches and issues - to https://github.com/CocoaPods/CocoaPods. - [#850](https://github.com/CocoaPods/CocoaPods/issues/850) - -* Added the `pod lib lint` subcommand which allows to lint the Pod stored - in the working directory (a pod spec in the root is needed). This subcommand - is equivalent to the deprecated `pod spec lint --local`. - [#850](https://github.com/CocoaPods/CocoaPods/issues/850) - -* The dependencies of the targets of the Pods project are now made explicit. - [#1165](https://github.com/CocoaPods/CocoaPods/issues/1165) - -* The size of the cache used for the git repos is now configurable. For more - details see - https://github.com/CocoaPods/CocoaPods/blob/master/lib/cocoapods/config.rb#L7-L25 - [#1159](https://github.com/CocoaPods/CocoaPods/issues/1159) - -* The copy resources shell script now aborts if any error occurs. - [#1098](https://github.com/CocoaPods/CocoaPods/issues/1098) - -* The output of shell script build phases no longer includes environment - variables to reduce noise. - [#1122](https://github.com/CocoaPods/CocoaPods/issues/1122) - -* CocoaPods no longer sets the deprecated `ALWAYS_SEARCH_USER_PATHS` build - setting. - -###### Bug fixes - -* Pods whose head state changes now are correctly detected and reinstalled. - [#1160](https://github.com/CocoaPods/CocoaPods/issues/1160) - -* Fixed the library reppresentation of the hooks which caused issues with the - `#copy_resources_script_path` method. - [#1157](https://github.com/CocoaPods/CocoaPods/issues/1157) - -* Frameworks symlinks are not properly preserved by the copy resources script. - Thanks to Thomas Dohmke (ashtom) for the fix. - [#1063](https://github.com/CocoaPods/CocoaPods/issues/1063) - -## 0.21.0 (2013-07-01) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.21.0.rc1...0.21.0) -• [cocoapods-core](https://github.com/CocoaPods/Core/compare/0.21.0.rc1...0.21.0) -• [Xcodeproj](https://github.com/CocoaPods/Xcodeproj/compare/0.7.0...0.7.1) - -###### Bug fixes - -* Fixed a linter issue related to the dedicated targets change. - [#1130](https://github.com/CocoaPods/CocoaPods/issues/1130) - -* Fixed xcconfig issues related to Pods including a dot in the name. - [#1152](https://github.com/CocoaPods/CocoaPods/issues/1152) - - -## 0.21.0.rc1 (2013-06-18) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.20.2...0.21.0.rc1) -• [cocoapods-core](https://github.com/CocoaPods/Core/compare/0.20.2...0.21.0.rc1) -• [Xcodeproj](https://github.com/CocoaPods/Xcodeproj/compare/0.6.0...0.7.0) - -###### Enhancements - -* Pods are now built in dedicated targets. This enhancement isolates the build - environment of each Pod from other ones eliminating pollution issues. It also - introduces an important architectural improvement which lays the foundation - for the upcoming CocoaPods features. Stay tuned! This feature has been - implemented by [Jeremy Slater](https://github.com/jasl8r). - [#1011](https://github.com/CocoaPods/CocoaPods/issues/1011) - [#983](https://github.com/CocoaPods/CocoaPods/issues/983) - [#841](https://github.com/CocoaPods/CocoaPods/issues/841) - -* Reduced external dependencies and deprecation of Rake::FileList. - [#1080](https://github.com/CocoaPods/CocoaPods/issues/1080) - -###### Bug fixes - -* Fixed crash due to Podfile.lock containing multiple version requirements for - a Pod. [#1076](https://github.com/CocoaPods/CocoaPods/issues/1076) - -* Fixed a build error due to the copy resources script using the same temporary - file for multiple targets. - [#1099](https://github.com/CocoaPods/CocoaPods/issues/1099) - -## 0.20.2 (2013-05-26) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.20.1...0.20.2) - -###### Bug fixes - -* Ensure that, in a sandbox-pod env, RubyGems loads the CocoaPods gem on system - Ruby (1.8.7). - [#939](https://github.com/CocoaPods/CocoaPods/issues/939#issuecomment-18396063) -* Allow sandbox-pod to execute any tool inside the Xcode.app bundle. -* Allow sandbox-pod to execute any tool inside a rbenv prefix. - -## 0.20.1 (2013-05-23) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.20.0...0.20.1) -• [CLAide](https://github.com/CocoaPods/CLAide/compare/0.3.0...0.3.2) - -###### Bug fixes - -* Made sandbox-pod executable visible as it wasn't correctly configured in the - gemspec. -* Made sandbox-pod executable actually work when installed as a gem. (In which - case every executable is wrapped in a wrapper bin script and the DATA constant - can no longer be used.) -* Required CLAide 0.3.2 as 0.3.0 didn't include all the files in the gemspec - and 0.3.1 was not correctly processed by RubyGems. - -## 0.20.0 (2013-05-23) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.19.1...0.20.0) -• [cocoapods-core](https://github.com/CocoaPods/Core/compare/0.19.1...0.20.0) -• [cocoapods-downloader](https://github.com/CocoaPods/CLAide/compare/0.1.0...0.1.1) -• [Xcodeproj](https://github.com/CocoaPods/Xcodeproj/compare/0.5.5...0.6.0) -• [CLAide](https://github.com/CocoaPods/CLAide/compare/0.2.0...0.3.0) - -###### Enhancements - -* Introduces an experimental sandbox feature. - [#939](https://github.com/CocoaPods/CocoaPods/issues/939) - - Let’s face it, even though we have a great community that spends an amazing - amount of time on curating the specifications, the internet can be a hostile - place and the community is growing too large to take a naive approach any - longer. - - As such, we have started leveraging OS X’s sandbox facilities to disallow - unsanctioned operations. This is still very experimental and therefore has to - be used explicitely, for now, but that does **not** mean we don’t want you to - start using it and **report issues**. - - To use the sandbox, simply use the `sandbox-pod` command instead. E.g.: - - $ sandbox-pod install - - In case of issues, be sure to check `/var/log/system.log` for ‘deny’ messages. - For instance, here’s an example where the sandbox denies read access to `/`: - - May 16 00:23:35 Khaos kernel[0]: Sandbox: ruby(98430) deny file-read-data / - - **NOTE**: _The above example is actually one that we know of. We’re not sure - yet which process causes this, but there shouldn’t be a need for any process - to read data from the root path anyways._ - - **NOTE 2**: _At the moment the sandbox is not compatible with the `:path` option - when referencing Pods that are not stored within the directory of the Podfile._ - -* The naked `pod` command now defaults to `pod install`. - [#958](https://github.com/CocoaPods/CocoaPods/issues/958) - -* CocoaPods will look for the Podfile in the ancestors paths if one is - not available in the working directory. - [#940](https://github.com/CocoaPods/CocoaPods/issues/940) - -* Documentation generation has been removed from CocoaPods as it graduated - to CocoaDocs. This decision was taken because CocoaDocs is a much better - solution which doesn't clutter Xcode's docsets while still allowing - access to the docsets with Xcode and with Dash. Removing this feature - keeps the installer leaner and easier to develop and paves the way for the - upcoming sandbox. Private pods can use pre install hook to generate the - documentation. If there will be enough demand this feature might be - reintegrated as plugin (see - [#1037](https://github.com/CocoaPods/CocoaPods/issues/1037)). - -* Improved performance of the copy resources script and thus build time of - the integrated targets. Contribution by [@onato](https://github.com/onato) - [#1050](https://github.com/CocoaPods/CocoaPods/issues/1050). - -* The changelog for the current version is printed after CocoaPods is - installed/updated. - [#853](https://github.com/CocoaPods/CocoaPods/issues/853). - - -###### Bug fixes - -* Inheriting `inhibit_warnings` per pod is now working - [#1032](https://github.com/CocoaPods/CocoaPods/issues/1032) -* Fix copy resources script for iOS < 6 and OS X < 10.8 by removing the - `--reference-external-strings-file` - flag. [#1030](https://github.com/CocoaPods/CocoaPods/pull/1030) -* Fixed issues with the `:head` option of the Podfile. - [#1046](https://github.com/CocoaPods/CocoaPods/issues/1046) - [#1039](https://github.com/CocoaPods/CocoaPods/issues/1039) - -## 0.19.1 (2013-04-30) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.19.0...0.19.1) -• [cocoapods-core](https://github.com/CocoaPods/Core/compare/0.19.0...0.19.1) - -###### Bug fixes - -* Project-level preprocessor macros are not overwritten anymore. - [#903](https://github.com/CocoaPods/CocoaPods/issues/903) -* A Unique hash instances for the build settings of the Pods target is now - created resolving interferences in the hooks. - [#1014](https://github.com/CocoaPods/CocoaPods/issues/1014) - -## 0.19.0 (2013-04-30) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.18.1...0.19.0) -• [cocoapods-core](https://github.com/CocoaPods/Core/compare/0.18.1...0.19.0) - -###### Enhancements - -* Compile time introspection. Macro definitions which allow to inspect the - installed Pods and their version have been introduced in the build - environment of the Pod libraries - ([example](https://gist.github.com/fabiopelosin/5348551)). -* CocoaPods now defines the `COCOAPODS=1` macro in the Pod and the Client - targets. This is useful for libraries which conditionally expose interfaces. - [#903](https://github.com/CocoaPods/CocoaPods/issues/903) -* Added support for the `private_header_files` attribute of the Specification - DSL. - [#998](https://github.com/CocoaPods/CocoaPods/issues/998) -* CocoaPods now defines the deployment target of the Pods project computed as - the minimum deployment target of the Pods libraries. - [#556](https://github.com/CocoaPods/CocoaPods/issues/556) -* Added `pod podfile-info` command. Shows list of used Pods and their info - in a project or supplied Podfile. - Options: `--all` - with dependencies. `--md` - in Markdown. - [#855](https://github.com/CocoaPods/CocoaPods/issues/855) -* Added `pod help` command. You can still use the old format - with --help flag. - [#957](https://github.com/CocoaPods/CocoaPods/pull/957) -* Restored support for Podfiles named `CocoaPods.podfile`. Moreover, the - experimental YAML format of the Podfile now is associated with files named - `CocoaPods.podfile.yaml`. - [#1004](https://github.com/CocoaPods/CocoaPods/pull/1004) - -###### Deprecations - -* The `:local` flag in Podfile has been renamed to `:path` and the old syntax - has been deprecated. - [#971](https://github.com/CocoaPods/CocoaPods/issues/971) - -###### Bug fixes - -* Fixed issue related to `pod outdated` and external sources. - [#954](https://github.com/CocoaPods/CocoaPods/issues/954) -* Fixed issue with .svn folders in copy resources script. - [#972](https://github.com/CocoaPods/CocoaPods/issues/972) - -## 0.18.1 (2013-04-10) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.18.0...0.18.1) -• [cocoapods-core](https://github.com/CocoaPods/Core/compare/0.18.0...0.18.) - -###### Bug fixes - -* Fixed a bug introduced in 0.18 which cause compilation issue due to the - quoting of the inherited value in the xcconfigs. - [#956](https://github.com/CocoaPods/CocoaPods/issues/956) -* Robustness against user targets including build files with missing file - references. - [#938](https://github.com/CocoaPods/CocoaPods/issues/938) -* Partially fixed slow performance from the command line - [#919](https://github.com/CocoaPods/CocoaPods/issues/919) - - -## 0.18.0 (2013-04-08) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.17.2...0.18.0) -• [cocoapods-core](https://github.com/CocoaPods/Core/compare/0.17.2...0.18.0) -• [Xcodeproj](https://github.com/CocoaPods/Xcodeproj/compare/0.5.2...0.5.5) - -###### Enhancements - -* Added the ability to inhibit warnings per pod. - Just pass `:inhibit_warnings => true` inline. - This feature has been implemented by Marin Usalj (@mneorr). - [#10](https://github.com/CocoaPods/Core/pull/10) - [#934](https://github.com/CocoaPods/CocoaPods/pull/934) -* Inhibiting warnings will also suppress the warnings of the static analyzer. -* A new build phase has been added to check that your - installation is in sync with the `Podfile.lock` and fail the build otherwise. - The new build phase will not be added automatically to targets already - integrated with CocoaPods, for integrating targets manually see [this - comment](https://github.com/CocoaPods/CocoaPods/pull/946#issuecomment-16042419). - This feature has been implemented by Ullrich Schäfer (@stigi). - [#946](https://github.com/CocoaPods/CocoaPods/pull/946) -* The `pod search` commands now accepts the `--ios` and the `--osx` arguments - to filter the results by platform. - [#625](https://github.com/CocoaPods/CocoaPods/issues/625) -* The developer frameworks are automatically added if `SenTestingKit` is - detected. There is no need to specify them in specifications anymore. - [#771](https://github.com/CocoaPods/CocoaPods/issues/771) -* The `--no-update` argument of the `install`, `update`, `outdated` subcommands - has been renamed to `--no-repo-update`. - [#913](https://github.com/CocoaPods/CocoaPods/issues/913) - -###### Bug fixes - -* Improved handling for Xcode projects containing non ASCII characters. - Special thanks to Cédric Luthi (@0xced), Vincent Isambart (@vincentisambart), - and Manfred Stienstra (@Manfred) for helping to develop the workaround. - [#926](https://github.com/CocoaPods/CocoaPods/issues/926) -* Corrected improper configuration of the PODS_ROOT xcconfig variable in - non-integrating installations. - [#918](https://github.com/CocoaPods/CocoaPods/issues/918) -* Improved support for pre-release versions using dashes. - [#935](https://github.com/CocoaPods/CocoaPods/issues/935) -* Documentation sets are now namespaced by pod solving improper attribution. - [#659](https://github.com/CocoaPods/CocoaPods/issues/659) - - -## 0.17.2 (2013-04-03) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.17.1...0.17.2) -• [cocoapods-core](https://github.com/CocoaPods/Core/compare/0.17.1...0.17.2) - -###### Bug fixes - -* Fix crash related to the specification of the workspace as a relative path. - [#920](https://github.com/CocoaPods/CocoaPods/issues/920) -* Fix an issue related to the `podspec` dsl directive of the Podfile for - specifications with internal dependencies. - [#928](https://github.com/CocoaPods/CocoaPods/issues/928) -* Fix crash related to search from the command line. - [#929](https://github.com/CocoaPods/CocoaPods/issues/929) - -###### Ancillary enhancements - -* Enabled the FileList deprecation warning in the Linter. -* CocoaPods will raise if versions requirements are specified for dependencies - with external sources. -* The exclude patterns now handle folders automatically. - - -## 0.17.1 (2013-03-30) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.17.0...0.17.1) -• [cocoapods-core](https://github.com/CocoaPods/Core/compare/0.17.0...0.17.1) - -###### Bug fixes - -* Always create the CACHE_ROOT directory when performing a search. - [#917](https://github.com/CocoaPods/CocoaPods/issues/917) - -## 0.17.0 (2013-03-29) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.17.0.rc7...0.17.0) -• [cocoapods-core](https://github.com/CocoaPods/Core/compare/0.17.0.rc7...0.17.0) - -#### GM - -###### Bug fixes - -* Don’t break when specifying doc options, but not appledoc ones. - [#906](https://github.com/CocoaPods/CocoaPods/issues/906) -* Sort resolved specifications. - [#907](https://github.com/CocoaPods/CocoaPods/issues/907) -* Subspecs do not need to include HEAD information. - [#905](https://github.com/CocoaPods/CocoaPods/issues/905) - -###### Ancillary enhancements - -* Allow the analyzer to do its work without updating sources. - [motion-cocoapods#50](https://github.com/HipByte/motion-cocoapods/pull/50) - -#### rc7 - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.17.0.rc6...0.17.0.rc7) -• [cocoapods-core](https://github.com/CocoaPods/Core/compare/0.17.0.rc6...0.17.0.rc7) - -###### Bug fixes - -- Fixed an issue which lead to the missing declaration of the plural directives - of the Specification DSL. - [#816](https://github.com/CocoaPods/CocoaPods/issues/816) -- The resolver now respects the order of specification of the target - definitions. -- Restore usage of cache file to store a cache for expensive stats. -- Moved declaration of `Pod::FileList` to CocoaPods-core. - -###### Ancillary enhancements - -- Fine tuned the Specification linter and the health reporter of repositories. -- Search results are sorted. - -#### rc6 - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.17.0.rc5...0.17.0.rc6) -• [cocoapods-core](https://github.com/CocoaPods/Core/compare/0.17.0.rc5...0.17.0.rc6) - -###### Bug fixes - -- CocoaPods updates the repositories by default. - [#872](https://github.com/CocoaPods/CocoaPods/issues/872) -- Fixed a crash which was present when the Podfile specifies a workspace. - [#871](https://github.com/CocoaPods/CocoaPods/issues/871) -- Fix for a bug which lead to a broken installation in paths containing - brackets and other glob metacharacters. - [#862](https://github.com/CocoaPods/CocoaPods/issues/862) -- Fix for a bug related to the case of the paths which lead to clean all files - in the directories of the Pods. - - -###### Ancillary enhancements - -- CocoaPods now maintains a search index which is updated incrementally instead - of analyzing all the specs every time. The search index can be updated - manually with the `pod ipc update-search-index` command. -- Enhancements to the `pod repo lint` command. -- CocoaPods will not create anymore the pre commit hook in the master repo - during setup. If already created it is possible remove it deleting the - `~/.cocoapods/master/.git/hooks/pre-commit` path. -- Improved support for linting and validating specs repo. - -#### rc5 - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.17.0.rc4...0.17.0.rc5) -• [cocoapods-core](https://github.com/CocoaPods/Core/compare/0.17.0.rc4...0.17.0.rc5) - -###### Bug fixes - -- The `--no-clean` argument is not ignored anymore by the installer. -- Proper handling of file patterns ending with a slash. -- More user errors are raised as an informative. - -#### rc4 - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.17.0.rc3...0.17.0.rc4) - -###### Bug fixes - -- Restored compatibility with `Podfile::TargetDefinition#copy_resources_script_name` - in the Podfile hooks. -- Updated copy resources script so that it will use base internationalization - [#846](https://github.com/CocoaPods/CocoaPods/issues/846) -- Robustness against an empty configuration file. -- Fixed a crash with `pod push` - [#848](https://github.com/CocoaPods/CocoaPods/issues/848) -- Fixed an issue which lead to the creation of a Pods project which would - crash Xcode. - [#854](https://github.com/CocoaPods/CocoaPods/issues/854) -- Fixed a crash related to a `PBXVariantGroup` present in the frameworks build - phase of client targets. - [#859](https://github.com/CocoaPods/CocoaPods/issues/859) - - -###### Ancillary enhancements - -- The `podspec` option of the `pod` directive of the Podfile DSL now accepts - folders. - -#### rc3 - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.17.0.rc2...0.17.0.rc3 -• [Xcodeproj](https://github.com/CocoaPods/Xcodeproj/compare/0.5.0...0.5.1)) - -###### Bug fixes - -- CocoaPods will not crash anymore if the license file indicated on the spec - doesn't exits. -- Pre install hooks are called before the Pods are cleaned. -- Fixed and issue which prevent the inclusion of OTHER_CFLAGS and - OTHER_CPLUSPLUSFLAGS in the release builds of the Pods project. -- Fixed `pod lint --local` -- Fixed the `--allow-warnings` of `pod push` - [#835](https://github.com/CocoaPods/CocoaPods/issues/835) -- Added `copy_resources_script_name` to the library representation used in the - hooks. - [#837](https://github.com/CocoaPods/CocoaPods/issues/837) - -###### Ancillary enhancements - -- General improvements to `pod ipc`. -- Added `pod ipc repl` subcommand. - -#### rc2 - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.17.0.rc1...0.17.0.rc2) -• [cocoapods-core](https://github.com/CocoaPods/Core/compare/0.17.0.rc1...0.17.0.rc2) - -###### Bug fixes - -- Restored output coloring. -- Fixed a crash related to subspecs - [#819](https://github.com/CocoaPods/CocoaPods/issues/819) -- Git repos were not cached for dependencies with external sources. - [#820](https://github.com/CocoaPods/CocoaPods/issues/820) -- Restored support for directories for the preserve_patterns specification - attribute. - [#823](https://github.com/CocoaPods/CocoaPods/issues/823) - -#### rc1 - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.16.4...0.17.0.rc1) -• [Xcodeproj](https://github.com/CocoaPods/Xcodeproj/compare/0.4.3...0.5.0) -• [cocoapods-core](https://github.com/CocoaPods/Core) -• [cocoapods-downloader](https://github.com/CocoaPods/cocoapods-downloader) - -###### __Notice__ - -At some point in future the master repo will be switched to the YAML format of -specifications. This means that specifications with hooks (or any other kind of -dynamic logic) will not be accepted. Please let us know if there is need for -other DSL attributes or any other kind of support. - -Currently the following specifications fail to load as they depended on the -CocoaPods internals and need to be updated: - -- LibComponentLogging-pods/0.0.1/LibComponentLogging-pods.podspec -- RestKit/0.9.3/RestKit.podspec -- Three20/1.0.11/Three20.podspec -- ARAnalytics/1.1/ARAnalytics.podspec - -Other specifications, might present compatibility issues for the reasons -presented below. - -###### __Breaking__ - -- Subspecs do **not** inherit the files patterns from the parent spec anymore. - This feature made the implementation more complicated and was not easy to - explain to podspecs maintainers. Compatibility can be easily fixed by adding - a 'Core' subspec. -- Support for inline podspecs has been removed. -- The support for Rake::FileList is being deprecated, in favor of a more - consistent DSL. Rake::FileList also presented issues because it would access - the file system as soon as it was converted to an array. -- The hooks architecture has been re-factored and might present - incompatibilities (please open an issue if appropriate). -- The `requires_arc` attribute default value is transitioning from `false` to - `true`. In the meanwhile a value is needed to pass the lint. -- Deprecated `copy_header_mapping` hook. -- Deprecated `exclude_header_search_paths` attribute. -- External sources are not supported in the dependencies of specifications - anymore. Actually they never have been supported, they just happened to work. - -###### DSL - -- Podfile: - - It is not needed to specify the platform anymore (unless not integrating) - as CocoaPods now can infer the platform from the integrated targets. -- Specification: - - `preferred_dependency` has been renamed to `default_subspec`. - - Added `exclude_files` attribute. - - Added `screenshots` attribute. - - Added default values for attributes like `source_files`. - -###### Enhancements - -- Released preview [documentation](http://docs.cocoapods.org). -- CocoaPods now has support for working in teams and not committing the Pods - folder, as it will keep track of the status of the Pods folder. - [#552](https://github.com/CocoaPods/CocoaPods/issues/552) -- Simplified installation: no specific version of ruby gems is required anymore. -- The workspace is written only if needed greatly reducing the occasions in - which Xcode asks to revert. -- The Lockfile is sorted reducing the SCM noise. - [#591](https://github.com/CocoaPods/CocoaPods/issues/591) -- Added Podfile, Frameworks, and Resources to the Pods project. - [#647](https://github.com/CocoaPods/CocoaPods/issues/647) - [#588](https://github.com/CocoaPods/CocoaPods/issues/588) -- Adds new subcommand `pod spec cat NAME` to print a spec file to standard output. -- Specification hooks are only called when the specification is installed. -- The `--no-clean` option of the `pod spec lint` command now displays the Pods - project for inspection. -- It is now possible to specify default values for the configuration in - `~/.cocoapods/config.yaml` ([default values](https://github.com/CocoaPods/CocoaPods/blob/master/lib/cocoapods/config.rb#L17)). -- CocoaPods now checks the checksums of the installed specifications and - reinstalls them if needed. -- Support for YAML formats of the Podfile and the Specification. -- Added new command `pod ipc` to provide support for inter process - communication through YAML formats. -- CocoaPods now detects if the folder of a Pod is empty and reinstalls it. - [#534](https://github.com/CocoaPods/CocoaPods/issues/534) -- Install hooks and the `prefix_header_contents` attribute are supported in subspecs. - [#617](https://github.com/CocoaPods/CocoaPods/issues/617) -- Dashes are now supported in the versions of the Pods. - [#293](https://github.com/CocoaPods/CocoaPods/issues/293) - -###### Bug fixes - -- CocoaPods is not confused anymore by target definitions with different activated subspec. - [#535](https://github.com/CocoaPods/CocoaPods/issues/535) -- CocoaPods is not confused anymore by to dependencies from external sources. - [#548](https://github.com/CocoaPods/CocoaPods/issues/548) -- The git cache will always update against the remote if a tag is requested, - resolving issues where library maintainers where updating the tag after a - lint and would be confused by CocoaPods using the cached commit for the tag. - [#407](https://github.com/CocoaPods/CocoaPods/issues/407) - [#596](https://github.com/CocoaPods/CocoaPods/issues/596) - -###### Codebase - -- Major clean up and refactor of the whole code base. -- Extracted the core classes into - [cocoapods-core](https://github.com/CocoaPods/Core) gem. -- Extracted downloader into - [cocoapods-downloader](https://github.com/CocoaPods/cocoapods-downloader). -- Extracted command-line command & option handling into - [CLAide](https://github.com/CocoaPods/CLAide). - -## 0.16.4 (2013-02-25) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.16.3...0.16.4) - -###### Enhancements - -- Add explicit flattening option to `Downloader:Http`: `:flatten => true`. - [#814](https://github.com/CocoaPods/CocoaPods/pull/814) - [#812](https://github.com/CocoaPods/CocoaPods/issues/812) - [#1314](https://github.com/CocoaPods/Specs/pull/1314) - -###### Bug fixes - -- Explicitely require `date` in the gemspec for Ruby 2.0.0. - [34da3f7](https://github.com/CocoaPods/CocoaPods/commit/34da3f792b2a36fafacd4122e29025c9cf2ff38d) - -## 0.16.3 (2013-02-20) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.16.2...0.16.3) • [Xcodeproj](https://github.com/CocoaPods/Xcodeproj/compare/0.4.3...0.5.0) - -###### Bug fixes - -- Only flatten tarballs, **not** zipballs, from HTTP sources. A zipball can - contain single directories in the root that should be preserved, for instance - a framework bundle. This reverts part of the change in 0.16.1. - **NOTE** This will break some podspecs that were changed after 0.16.1. - [#783](https://github.com/CocoaPods/CocoaPods/pull/783) - [#727](https://github.com/CocoaPods/CocoaPods/issues/727) -- Never consider aggregate targets in the user’s project for integration. - [#729](https://github.com/CocoaPods/CocoaPods/issues/729) - [#784](https://github.com/CocoaPods/CocoaPods/issues/784) -- Support comments on all build phases, groups and targets in Xcode projects. - [#51](https://github.com/CocoaPods/Xcodeproj/pull/51) -- Ensure default Xcode project values are copied before being used. - [b43087c](https://github.com/CocoaPods/Xcodeproj/commit/b43087cb342d8d44b491e702faddf54a222b23c3) -- Block assertions in Release builds. - [#53](https://github.com/CocoaPods/Xcodeproj/pull/53) - [#803](https://github.com/CocoaPods/CocoaPods/pull/803) - [#802](https://github.com/CocoaPods/CocoaPods/issues/802) - - -###### Enhancements - -- Compile Core Data model files. - [#795](https://github.com/CocoaPods/CocoaPods/pull/795) -- Add `Xcodeproj::Differ`, which shows differences between Xcode projects. - [308941e](https://github.com/CocoaPods/Xcodeproj/commit/308941eeaa3bca817742c774fd584cc5ab1c8f84) - - -## 0.16.2 (2013-02-02) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.16.1...0.16.2) • [Xcodeproj](https://github.com/CocoaPods/Xcodeproj/compare/0.4.1...0.4.3) - -###### Bug fixes - -- Quote storyboard and xib paths in ‘copy resource’ script. - [#740](https://github.com/CocoaPods/CocoaPods/pull/740) -- Fix use of `podspec` directive in Podfile with no options specified. - [#768](https://github.com/CocoaPods/CocoaPods/pull/768) -- Generate Mac OS X Pods target with the specified deployment target. - [#757](https://github.com/CocoaPods/CocoaPods/issues/757) -- Disable libSystem objects for ARC libs that target older platforms. - This applies when the deployment target is set to < iOS 6.0 or OS X 10.8, - or not specified at all. - [#352](https://github.com/CocoaPods/Specs/issues/352) - [#1161](https://github.com/CocoaPods/Specs/pull/1161) -- Mark header source files as ‘Project’ not ‘Public’. - [#747](https://github.com/CocoaPods/CocoaPods/issues/747) -- Add `PBXGroup` as acceptable `PBXFileReference` value. - [#49](https://github.com/CocoaPods/Xcodeproj/pull/49) -- Make `xcodeproj show` without further arguments actually work. - [#45](https://github.com/CocoaPods/Xcodeproj/issues/45) - -###### Enhancements - -- Added support for pre-download over Mercurial. - [#750](https://github.com/CocoaPods/CocoaPods/pull/750) - -## 0.16.1 (2013-01-13) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.16.0...0.16.1) • [Xcodeproj](https://github.com/CocoaPods/Xcodeproj/compare/0.4.0...0.4.1) - -###### Bug fixes - -- After unpacking source from a HTTP location, move the source into the parent - dir if the archive contained only one child. This is done to make it - consistent with how source from other types of locations are described in a - podspec. - **NOTE** This might break some podspecs that assumed the incorrect layout. - [#727](https://github.com/CocoaPods/CocoaPods/issues/727) - [#728](https://github.com/CocoaPods/CocoaPods/pull/728) -- Remove duplicate option in `pod update` command. - [#725](https://github.com/CocoaPods/CocoaPods/issues/725) -- Memory fixes in Xcodeproj. - [#43](https://github.com/CocoaPods/Xcodeproj/pull/43) - -###### Xcodeproj Enhancements - -- Sort contents of xcconfig files by setting name. - [#591](https://github.com/CocoaPods/CocoaPods/issues/591) -- Add helpers to get platform name, deployment target, and frameworks build phases -- Take SDKROOT into account when adding frameworks. - -## 0.16.0 (2012-11-22) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.16.0.rc5...master) - -###### Enhancements - -- Use Rake 0.9.4 - [#657](https://github.com/CocoaPods/CocoaPods/issues/657) - -## 0.16.0.rc5 (2012-11-14) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.16.0.rc4...0.16.0.rc5) - -###### Deprecated - -- The usage of specifications defined in a Podfile is deprecated. Use the - `:podspec` option with a file path instead. Complete removal will most - probably happen in 0.17.0. - [#549](https://github.com/CocoaPods/CocoaPods/issues/549) - [#616](https://github.com/CocoaPods/CocoaPods/issues/616) - [#525](https://github.com/CocoaPods/CocoaPods/issues/525) - -###### Bug fixes - -- Always consider inline podspecs as needing installation. -- Fix detection when the lib has already been integrated with the user’s target. - [#643](https://github.com/CocoaPods/CocoaPods/issues/643) - [#614](https://github.com/CocoaPods/CocoaPods/issues/614) - [#613](https://github.com/CocoaPods/CocoaPods/issues/613) - -## 0.16.0.rc4 (2012-11-14) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.16.0.rc3...0.16.0.rc4) - -###### Bug fixes - -- Fix for Rake 0.9.3 - [#657](https://github.com/CocoaPods/CocoaPods/issues/657) - -## 0.16.0.rc3 (2012-11-02) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.16.0.rc2...0.16.0.rc3) • [Xcodeproj](https://github.com/CocoaPods/Xcodeproj/compare/0.4.0.rc1...0.4.0.rc6) - -###### Enhancements - -- Added support for copying frameworks to the app bundle. - [#597](https://github.com/CocoaPods/CocoaPods/pull/597) - -###### Bug fixes - -- Ignore PBXReferenceProxy while integrating into user project. - [#626](https://github.com/CocoaPods/CocoaPods/issues/626) -- Added support for PBXAggregateTarget and PBXLegacyTarget. - [#615](https://github.com/CocoaPods/CocoaPods/issues/615) -- Added support for PBXReferenceProxy. - [#612](https://github.com/CocoaPods/CocoaPods/issues/612) - -## 0.16.0.rc2 (2012-10-21) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.16.0.rc1...0.16.0.rc2) - -###### Bug fixes - -- Fix for uninitialized constant Xcodeproj::Constants error. - -## 0.16.0.rc1 (2012-10-21) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.15.2...0.16.0.rc1) • [Xcodeproj](https://github.com/CocoaPods/Xcodeproj/compare/0.3.5...0.4.0.rc1) - -###### Enhancements - -- Xcodeproj partial rewrite. - [#565](https://github.com/CocoaPods/CocoaPods/issues/565) - [#561](https://github.com/CocoaPods/CocoaPods/pull/561) - - Performance improvements in the `Generating support files` phase. - - Better support for editing existing projects and sorting groups. - -## 0.15.2 (2012-10-19) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.15.1...0.15.2) - -###### Enhancements - -- Added support for `.hh` headers. - [#576](https://github.com/CocoaPods/CocoaPods/pull/576) - -###### Bug fixes - -- Restored support for running CocoaPods without a terminal. - [#575](https://github.com/CocoaPods/CocoaPods/issues/575) - [#577](https://github.com/CocoaPods/CocoaPods/issues/577) -- The git cache now always uses a barebones repo preventing a number of related issues. - [#581](https://github.com/CocoaPods/CocoaPods/issues/581) - [#569](https://github.com/CocoaPods/CocoaPods/issues/569) -- Improved fix for the issue that lead to empty directories for Pods. - [#572](https://github.com/CocoaPods/CocoaPods/issues/572) - [#602](https://github.com/CocoaPods/CocoaPods/issues/602) -- Xcodeproj robustness against invalid values, such as malformed UTF8. - [#592](https://github.com/CocoaPods/CocoaPods/issues/592) - -## 0.15.1 (2012-10-04) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.15.0...0.15.1) - -###### Enhancements - -- Show error if syntax error in Podfile or Podfile.lock. - -###### Bug fixes - -- Fixed an issue that lead to empty directories for Pods. - [#519](https://github.com/CocoaPods/CocoaPods/issues/519) - [#568](https://github.com/CocoaPods/CocoaPods/issues/568) -- Fixed a crash related to the RubyGems version informative. - [#570](https://github.com/CocoaPods/CocoaPods/issues/570) -- Fixed a crash for `pod outdated`. - [#567](https://github.com/CocoaPods/CocoaPods/issues/567) -- Fixed an issue that lead to excessively slow sets computation. - -## 0.15.0 (2012-10-02) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.14.0...0.15.0) • [Xcodeproj](https://github.com/CocoaPods/Xcodeproj/compare/0.3.3...0.3.4) - -###### Enhancements - -- Pod `install` will update the specs repo only if needed. - [#533](https://github.com/CocoaPods/CocoaPods/issues/533) -- CocoaPods now searches for the highest version of a Pod on all the repos. - [#85](https://github.com/CocoaPods/CocoaPods/issues/85) -- Added a pre install hook to the Podfile and to root specifications. - [#486](https://github.com/CocoaPods/CocoaPods/issues/486) -- Support for `header_mappings_dir` attribute in subspecs. -- Added support for linting a Podspec using the files from its folder `pod spec - lint --local` -- Refactored UI. -- Added support for Podfiles named `CocoaPods.podfile` which allows to - associate an editor application in Mac OS X. - [#528](https://github.com/CocoaPods/CocoaPods/issues/528) -- Added config option to disable the new version available message. - [#448](https://github.com/CocoaPods/CocoaPods/issues/448) -- Added support for extracting `.tar.bz2` files - [#522](https://github.com/CocoaPods/CocoaPods/issues/522) -- Improved feedback for errors of repo subcommands. - [#505](https://github.com/CocoaPods/CocoaPods/issues/505) - - -###### Bug fixes - -- Subspecs namespacing has been restored. - [#541](https://github.com/CocoaPods/CocoaPods/issues/541) -- Improvements to the git cache that should be more robust. - [#517](https://github.com/CocoaPods/CocoaPods/issues/517) - - In certain conditions pod setup would execute twice. -- The git cache now is updated if a branch is not found - [#514](https://github.com/CocoaPods/CocoaPods/issues/514) -- Forcing UTF-8 encoding on licenses generation in Ruby 1.9. - [#530](https://github.com/CocoaPods/CocoaPods/issues/530) -- Added support for `.hpp` headers. - [#244](https://github.com/CocoaPods/CocoaPods/issues/244) - -## 0.14.0 (2012-09-10) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.14.0.rc2...0.14.0) • [Xcodeproj](https://github.com/CocoaPods/Xcodeproj/compare/0.3.2...0.3.3) - -###### Bug fixes - -- In certain conditions the spec of an external would have been overridden - by the spec in the root of a Pod. - [#489](https://github.com/CocoaPods/CocoaPods/issues/489) -- CocoaPods now uses a recent version of Octokit. - [#490](https://github.com/CocoaPods/CocoaPods/issues/490) -- Fixed a bug that caused Pods with preferred dependencies to be always - installed. - [Specs#464](https://github.com/CocoaPods/CocoaPods/issues/464) -- Fixed Xcode 4.4+ artwork warning. - [Specs#508](https://github.com/CocoaPods/CocoaPods/issues/508) - -## 0.14.0.rc2 (2012-08-30) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.14.0.rc1...0.14.0.rc2) - -###### Bug fixes - -- Fix incorrect name for Pods from external sources with preferred subspecs. - [#485](https://github.com/CocoaPods/CocoaPods/issues/485) -- Prevent duplication of Pod with a local source and mutliple activated specs. - [#485](https://github.com/CocoaPods/CocoaPods/issues/485) -- Fixed the `uninitialized constant Pod::Lockfile::Digest` error. - [#484](https://github.com/CocoaPods/CocoaPods/issues/484) - -## 0.14.0.rc1 (2012-08-28) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.13.0...0.14.0.rc1) • [Xcodeproj](https://github.com/CocoaPods/Xcodeproj/compare/0.3.1...0.3.2) - -###### Enhancements - -- Improve installation process by preserving the installed versions of Pods - across installations and machines. A Pod is reinstalled if: - - the version required in the Podfile changes and becomes incompatible with - the installed one. - [#191](https://github.com/CocoaPods/CocoaPods/issues/191) - - the external source changes. - - the head status changes (from disabled to enabled or vice-versa). -- Introduce `pod update` command that installs the dependencies of the Podfile - **ignoring** the lockfile `Podfile.lock`. - [#131](https://github.com/CocoaPods/CocoaPods/issues/131) -- Introduce `pod outdated` command that shows the pods with known updates. -- Add `:local` option for dependencies which will use the source files directly - from a local directory. This is usually used for libraries that are being - developed in parallel to the end product (application/library). - [#458](https://github.com/CocoaPods/CocoaPods/issues/458), - [#415](https://github.com/CocoaPods/CocoaPods/issues/415), - [#156](https://github.com/CocoaPods/CocoaPods/issues/156). -- Folders of Pods which are no longer required are removed during installation. - [#298](https://github.com/CocoaPods/CocoaPods/issues/298) -- Add meaningful error messages - - ia podspec can’t be found in the root of an external source. - [#385](https://github.com/CocoaPods/CocoaPods/issues/385), - [#338](https://github.com/CocoaPods/CocoaPods/issues/338), - [#337](https://github.com/CocoaPods/CocoaPods/issues/337). - - a subspec name is misspelled. - [#327](https://github.com/CocoaPods/CocoaPods/issues/327) - - an unrecognized command and/or argument is provided. -- The subversion downloader now does an export instead of a checkout, which - makes it play nicer with SCMs that store metadata in each directory. - [#245](https://github.com/CocoaPods/CocoaPods/issues/245) -- Now the Podfile is added to the Pods project for convenient editing. - -###### Bug fixes - -- The git cache now fetches the tags from the remote if it can’t find the - reference. -- Xcodeproj now builds on 10.6.8 and Travis CI without symlinking headers. -- Only try to install, add source files to the project, and clean a Pod once. - [#376](https://github.com/CocoaPods/CocoaPods/issues/376) - -###### Notes - -- External Pods might be reinstalled due to the migration to the new - `Podfile.lock`. -- The SCM reference of head Pods is not preserved across machines. -- Pods whose inline specification changed are not detected as modified. As a - workaround, remove their folder stored in `Pods`. -- Pods whose specification changed are not detected as modified. As a - workaround, remove their folder stored in `Pods`. - - -## 0.13.0 (2012-08-22) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.12.0...0.13.0) - -###### Enhancements - -- Add Podfile `podspec` which allows to use the dependencies of a podspec file. - [#162](https://github.com/CocoaPods/CocoaPods/issues/162) -- Check if any of the build settings defined in the xcconfig files is - overridden. [#92](https://github.com/CocoaPods/CocoaPods/issues/92) -- The Linter now checks that there are no compiler flags that disable warnings. - -###### Bug fixes - -- The final project isn’t affected anymore by the `inhibit_all_warnings!` - option. -- Support for redirects while using podspec from an url. - [#462](https://github.com/CocoaPods/CocoaPods/issues/462) - - -## 0.12.0 (2012-08-21) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.11.1...0.12.0) - -###### Enhancements - -- The documentation is generated using the public headers if they are - specified. -- In case of a download failure the installation is aborted and the error - message is shown. -- Git submodules are initialized only if requested. -- Don’t impose a certain structure of the user’s project by raising if no - ‘Frameworks’ group exists. - [#431](https://github.com/CocoaPods/CocoaPods/pull/431) -- Support for GitHub Gists in the linter. -- Allow specifying ARC settings in subspecs. -- Add Podfile `inhibit_all_warnings!` which will inhibit all warnings from the - Pods library. [#209](https://github.com/CocoaPods/CocoaPods/issues/209) -- Make the Pods Xcode project prettier by namespacing subspecs in nested - groups. [#466](https://github.com/CocoaPods/CocoaPods/pull/466) - - -## 0.11.1 (2012-08-09) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.11.0...0.11.1) - -###### Bug fixes - -- Fixed a crash related to subspecs without header files. [#449] -- Git submodules are loaded after the appropriate referenced is checked out and - will be not loaded anymore in the cache. [#451] -- Fixed SVN support for the head version. [#432] - - -## 0.11.0 (2012-08-08) - -[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.10.0...0.11.0) - -###### Enhancements - -- Added support for public headers. [#440] -- Added `pod repo lint`. [#423] -- Improved support for `:head` option and SVN repositories. -- When integrating Pods with a project without "Frameworks" group in root of - the project, raise an informative message. - [#431](https://github.com/CocoaPods/CocoaPods/pull/431) -- Dropped support for legacy `config.ios?` and `config.osx?` - -###### Bug fixes - -- Version message now correctly terminates with a 0 exit status. -- Resolved an issue that lead to git error messages in the error report. - - -## 0.10.0 (2012-07-29) - -[CocoaPods](http://git.io/4i75YA) - -###### Enhancements - -- Added a `--local-only` option to `pod push` so that developers can push - locally and test before pushing to a remote. [#405](http://git.io/0ILJEw) -- Added line number information for errors generated in the Podfile. - [#408](http://git.io/fWQvMg) -- Pods stored in git repositories now initialize submodules. - [#406](http://git.io/L9ssSw) - -###### Bug fixes - -- Removed note about the post install hook form the linter. -- Improved xcodebuild error detection in the linter. -- Ensure the git cache exists, before updating it, when trying to install the - ‘bleeding edge’ of a pod. [#426](http://git.io/d4eqRA) -- Clean downloaded external pods **after** resolving and activating (sub)specs. - [#414](http://git.io/i77q_w) -- Support `tar.gz` as filename in a HTTP source. [#428](http://git.io/qhwKkA) - - -## 0.9.2 (2012-07-16) - -[CocoaPods](http://git.io/AVlRKg) • [Xcodeproj](http://git.io/xHbc0w) - -###### Bug fixes - -- When generating the PodsDummy class, make that class unique to each target. [#402](http://git.io/NntYiQ) -- Raise an informative error message when the platform in the `Podfile` is omitted or incorrect. [#403](http://git.io/k5EcUQ) - - -## 0.9.1 (2012-07-14) - -[CocoaPods](http://git.io/_kqAbw) - -###### Bug fixes - -- CocoaPods 0.9.x needs Xcodeproj 0.3.0. - - -## 0.9.0 (2012-07-14) - -[CocoaPods](http://git.io/kucJQw) • [Xcodeproj](http://git.io/5eLL8g) - -###### Enhancements - -- Force downloading the ‘bleeding edge’ version of a pod with the `:head` flag. [#392](http://git.io/t_NVRQ) -- Support for weak frameworks. [#263](http://git.io/XZDuog) -- Use double quotes when shelling out. This makes a url like `$HOME/local/lib` work. [#396](http://git.io/DnBzhA) - -###### Bug fixes - -- Relaxed linter to accepts pod that only specify paths to preserve (like TuneupJS). -- Gender neutralization of podfile documentation. [#384](http://git.io/MAsHXg) -- Exit early when using an old RubyGems version (< 1.4.0). These versions contain subtle bugs - related to prerelease version comparisons. Unfortunately, OS X >= 10.7 ships with 1.3.6. [#398](http://git.io/Lr7DoA) - - -## 0.8.0 (2012-07-09) - -[CocoaPods](http://git.io/RgMF3w) • [Xcodeproj](http://git.io/KBKE_Q) - -###### Breaking change - -Syntax change in Podfile: `dependency` has been replaced by `pod`. - -``ruby -platform :ios -pod 'JSONKit', '~> 1.4' -pod 'Reachability', '~> 2.0.4' -`` - -###### Bug fixes - -- Properly quote all paths given to Git. - - -## 0.7.0 (2012-07-06) - -[CocoaPods](http://git.io/Agia6A) • [Xcodeproj](http://git.io/mlqquw) - -###### Features - -- Added support for branches in git repos. -- Added support for linting remote files, i.e. `pod spec lint http://raw/file.podspec`. -- Improved `Spec create template`. -- The indentation is automatically stripped for podspecs strings. - -###### Bug fixes - -- The default warnings of Xcode are not overriden anymore. -- Improvements to the detection of the license files. -- Improvements to `pod spec lint`. -- CocoaPods is now case insensitive. - - -## 0.6.1 (2012-07-01) - -[CocoaPods](http://git.io/45wFjw) • [Xcodeproj](http://git.io/rRA4XQ) - -###### Bug fixes - -- Switched to master branch for specs repo. -- Fixed a crash with `pod spec lint` related to `preserve_paths`. -- Fixed a bug that caused subspecs to not inherit the compiler flags of the top level specification. -- Fixed a bug that caused duplication of system framworks. - - -## 0.6.0 (2012-07-01) - -A full list of all the changes since 0.5.1 can be found [here][6]. - - -### Link with specific targets - -CocoaPods can now integrate all the targets specified in your `Podfile`. - -To specify which target, in your Xcode project, a Pods target should be linked -with, use the `link_with` method like so: - -```ruby -platform :ios - -workspace 'MyWorkspace' - -link_with ['MyAppTarget', 'MyOtherAppTarget'] -dependency 'JSONKit' - -target :test, :exclusive => true do - xcodeproj 'TestProject', 'Test' => :debug - link_with 'TestRunnerTarget' - dependency 'Kiwi' -end -``` - -_NOTE: As you can see it can take either one target name, or an array of names._ - -* If no explicit Xcode workspace is specified and only **one** project exists in -the same directory as the Podfile, then the name of that project is used as the -workspace’s name. - -* If no explicit Xcode project is specified for a target, it will use the Xcode -project of the parent target. If no target specifies an expicit Xcode project -and there is only **one** project in the same directory as the Podfile then that -project will be used. - -* If no explicit target is specified, then the Pods target will be linked with -the first target in your project. So if you only have one target you do not -need to specify the target to link with. - -See [#76](https://github.com/CocoaPods/CocoaPods/issues/76) for more info. - -Finally, CocoaPods will add build configurations to the Pods project for all -configurations in the other projects in the workspace. By default the -configurations are based on the `Release` configuration, to base them on the -`Debug` configuration you will have to explicitely specify them as can be seen -above in the following line: - -```ruby -xcodeproj 'TestProject', 'Test' => :debug -``` - - -### Documentation - -CocoaPods will now generate documentation for every library with the -[`appledoc`][5] tool and install it into Xcode’s documentation viewer. - -You can customize the settings used like so: - -```ruby -s.documentation = { :appledoc => ['--product-name', 'My awesome project!'] } -``` - -Alternatively, you can specify a URL where an HTML version of the documentation -can be found: - -```ruby -s.documentation = { :html => 'http://example.com/docs/index.html' } -``` - -See [#149](https://github.com/CocoaPods/CocoaPods/issues/149) and -[#151](https://github.com/CocoaPods/CocoaPods/issues/151) for more info. - - -### Licenses & Documentation - -CocoaPods will now generate two 'Acknowledgements' files for each target specified -in your Podfile which contain the License details for each Pod used in that target -(assuming details have been specified in the Pod spec). - -There is a markdown file, for general consumption, as well as a property list file -that can be added to a settings bundle for an iOS application. - -You don't need to do anything for this to happen, it should just work. - -If you're not happy with the default boilerplate text generated for the title, header -and footnotes in the files, it's possible to customize these by overriding the methods -that generate the text in your `Podfile` like this: - -```ruby -class ::Pod::Generator::Acknowledgements - def header_text - "My custom header text" - end -end -``` - -You can even go one step further and customize the text on a per target basis by -checking against the target name, like this: - -```ruby -class ::Pod::Generator::Acknowledgements - def header_text - if @target_definition.label.end_with?("MyTargetName") - "Custom header text for MyTargetName" - else - "Custom header text for other targets" - end - end -end -``` - -Finally, here's a list of the methods that are available to override: - -```ruby -header_title -header_text -footnote_title -footnote_text -``` - - -### Introduced two new classes: LocalPod and Sandbox. - -The Sandbox represents the entire contents of the `POD_ROOT` (normally -`SOURCE_ROOT/Pods`). A LocalPod represents a pod that has been installed within -the Sandbox. - -These two classes can be used as better homes for various pieces of logic -currently spread throughout the installation process and provide a better API -for working with the contents of this directory. - - -### Xcodeproj API - -All Xcodeproj APIs are now in `snake_case`, instead of `camelCase`. If you are -manipulating the project from your Podfile's `post_install` hook, or from a -podspec, then update these method calls. - - -### Enhancements - -* [#188](https://github.com/CocoaPods/CocoaPods/pull/188): `list` command now - displays the specifications introduced in the master repo if it is given as an - option the number of days to take into account. - -* [#188](https://github.com/CocoaPods/CocoaPods/pull/188): Transferred search - layout improvements and options to `list` command. - -* [#166](https://github.com/CocoaPods/CocoaPods/issues/166): Added printing - of homepage and source to search results. - -* [#177](https://github.com/CocoaPods/CocoaPods/issues/177): Added `--stat` - option to display watchers and forks for pods hosted on GitHub. - -* [#177](https://github.com/CocoaPods/CocoaPods/issues/177): Introduced colors - and tuned layout of search. - -* [#112](https://github.com/CocoaPods/CocoaPods/issues/112): Introduced `--push` - option to `$ pod setup`. It configures the master spec repository to use the private - push URL. The change is preserved in future calls to `$ pod setup`. - -* [#153](https://github.com/CocoaPods/CocoaPods/issues/153): It is no longer - required to call `$ pod setup`. - -* [#163](https://github.com/CocoaPods/CocoaPods/issues/163): Print a template - for a new ticket when an error occurs. - -* Added a new Github-specific downloader that can download repositories as a - gzipped tarball. - -* No more global state is kept during resolving of dependencies. - -* Updated Xcodeproj to have a friendlier API. - - -### Fixes - -* [#142](https://github.com/CocoaPods/CocoaPods/issues/142): Xcode 4.3.2 no longer - supports passing the -fobj-arc flag to the linker and will fail to build. The - addition of this flag was a workaround for a compiler bug in previous versions. - This flag is no longer included by default - to keep using this flag, you need to - add `set_arc_compatibility_flag!` to your Podfile. - -* [#183](https://github.com/CocoaPods/CocoaPods/issues/183): Fix for - `.DS_Store` file in `~/.cocoapods` prevents `$ pod install` from running. - -* [#134](https://github.com/CocoaPods/CocoaPods/issues/134): Match - `IPHONEOS_DEPLOYMENT_TARGET` build setting with `deployment_target` option in - generated Pods project file. - -* [#142](https://github.com/CocoaPods/CocoaPods/issues/): Add `-fobjc-arc` to - `OTHER_LDFLAGS` if _any_ pods require ARC. - -* [#148](https://github.com/CocoaPods/CocoaPods/issues/148): External encoding - set to UTF-8 on Ruby 1.9 to fix crash caused by non-ascii characters in pod - description. - -* Ensure all header search paths are quoted in the xcconfig file. - -* Added weak quoting to `ibtool` input paths. - - -## 0.5.0 (2011-11-22) - -No longer requires MacRuby. Runs on MRI 1.8.7 (OS X system version) and 1.9.3. - -A full list of all the changes since 0.3.0 can be found [here][7]. - - -## 0.4.0 - -Oops, accidentally skipped this version. - - -## 0.3.0 (2011-11-12) - -### Multiple targets - -Add support for multiple static library targets in the Pods Xcode project with -different sets of depedencies. This means that you can create a separate -library which contains all dependencies, including extra ones that you only use -in, for instance, a debug or test build. [[docs][1]] - -```ruby -# This Podfile will build three static libraries: -# * libPods.a -# * libPods-debug.a -# * libPods-test.a - -# This dependency is included in the `default` target, which generates the -# `libPods.a` library, and all non-exclusive targets. -dependency 'SSCatalog' - -target :debug do - # This dependency is only included in the `debug` target, which generates - # the `libPods-debug.a` library. - dependency 'CocoaLumberjack' -end - -target :test, :exclusive => true do - # This dependency is *only* included in the `test` target, which generates - # the `libPods-test.a` library. - dependency 'Kiwi' -end -``` - -### Install libraries from anywhere - -A dependency can take a git url if the repo contains a podspec file in its -root, or a podspec can be loaded from a file or HTTP location. If no podspec is -available, a specification can be defined inline in the Podfile. [[docs][2]] - -```ruby -# From a spec repo. -dependency 'SSToolkit' - -# Directly from the Pod’s repo (if it contains a podspec). -dependency 'SSToolkit', :git => 'https://github.com/samsoffes/sstoolkit.git' - -# Directly from the Pod’s repo (if it contains a podspec) with a specific commit (or tag). -dependency 'SSToolkit', :git => 'https://github.com/samsoffes/sstoolkit.git', - :commit => '2adcd0f81740d6b0cd4589af98790eee3bd1ae7b' - -# From a podspec that's outside a spec repo _and_ the library’s repo. This can be a file or http url. -dependency 'SSToolkit', :podspec => 'https://raw.github.com/gist/1353347/ef1800da9c5f5d267a642b8d3950b41174f2a6d7/SSToolkit-0.1.1.podspec' - -# If no podspec is available anywhere, you can define one right in your Podfile. -dependency do |s| - s.name = 'SSToolkit' - s.version = '0.1.3' - s.platform = :ios - s.source = { :git => 'https://github.com/samsoffes/sstoolkit.git', :commit => '2adcd0f81740d6b0cd4589af98790eee3bd1ae7b' } - s.resources = 'Resources' - s.source_files = 'SSToolkit/**/*.{h,m}' - s.frameworks = 'QuartzCore', 'CoreGraphics' - - def s.post_install(target) - prefix_header = config.project_pods_root + target.prefix_header_filename - prefix_header.open('a') do |file| - file.puts(%{#ifdef __OBJC__\n#import "SSToolkitDefines.h"\n#endif}) - end - end -end -``` - -### Add a `post_install` hook to the Podfile class - -This allows the user to customize, for instance, the generated Xcode project -_before_ it’s written to disk. [[docs][3]] - -```ruby -# Enable garbage collection support for MacRuby applications. -post_install do |installer| - installer.project.targets.each do |target| - target.build_configurations.each do |config| - config.build_settings['GCC_ENABLE_OBJC_GC'] = 'supported' - end - end -end -``` - -### Manifest - -Generate a Podfile.lock file next to the Podfile, which contains a manifest of -your application’s dependencies and their dependencies. - -``` -PODS: - - JSONKit (1.4) - - LibComponentLogging-Core (1.1.4) - - LibComponentLogging-NSLog (1.0.2): - - LibComponentLogging-Core (>= 1.1.4) - - RestKit-JSON-JSONKit (0.9.3): - - JSONKit - - RestKit (= 0.9.3) - - RestKit-Network (0.9.3): - - LibComponentLogging-NSLog - - RestKit (= 0.9.3) - - RestKit-ObjectMapping (0.9.3): - - RestKit (= 0.9.3) - - RestKit-Network (= 0.9.3) - -DOWNLOAD_ONLY: - - RestKit (0.9.3) - -DEPENDENCIES: - - RestKit-JSON-JSONKit - - RestKit-ObjectMapping -``` - -### Generate Xcode projects from scratch - -We no longer ship template projects with the gem, but instead generate them -programmatically. This code has moved out into its own [Xcodeproj gem][4], -allowing you to automate Xcode related tasks. - - - - -[1]: https://github.com/CocoaPods/CocoaPods/blob/master/lib/cocoapods/podfile.rb#L151 -[2]: https://github.com/CocoaPods/CocoaPods/blob/master/lib/cocoapods/podfile.rb#L82 -[3]: https://github.com/CocoaPods/CocoaPods/blob/master/lib/cocoapods/podfile.rb#L185 -[4]: https://github.com/CocoaPods/Xcodeproj -[5]: https://github.com/tomaz/appledoc -[6]: https://github.com/CocoaPods/CocoaPods/compare/0.5.1...0.6.0 -[7]: https://github.com/CocoaPods/CocoaPods/compare/0.3.10...0.5.0 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-1.12.1/LICENSE b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-1.12.1/LICENSE deleted file mode 100644 index 6e8a60d..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-1.12.1/LICENSE +++ /dev/null @@ -1,33 +0,0 @@ -This project is licensed under the MIT license. - -Copyright (c) 2011 Eloy Durán , - Fabio Pelosin , - Samuel Giddins , - Marius Rackwitz , - Kyle Fuller , - Boris Bügling , - Orta Therox , - Olivier Halligon , - Danielle Tomlinson , - Dimitris Koutsogiorgas , - Paul Beusterien , and - Eric Amorde . - - -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/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-1.12.1/README.md b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-1.12.1/README.md deleted file mode 100644 index fa1d946..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-1.12.1/README.md +++ /dev/null @@ -1,81 +0,0 @@ -![CocoaPods Logo](https://raw.github.com/CocoaPods/shared_resources/master/assets/cocoapods-banner-readme.png) - -### CocoaPods: The Cocoa dependency manager - -[![Build Status](https://github.com/CocoaPods/CocoaPods/workflows/Specs/badge.svg)](https://github.com/CocoaPods/CocoaPods/actions/workflows/Specs.yml) -[![Gem Version](https://img.shields.io/gem/v/cocoapods)](https://rubygems.org/gems/cocoapods) -[![Maintainability](https://api.codeclimate.com/v1/badges/8f0fe544baf2ae1acc2b/maintainability)](https://codeclimate.com/github/CocoaPods/CocoaPods/maintainability) -[![Test Coverage](https://api.codeclimate.com/v1/badges/8f0fe544baf2ae1acc2b/test_coverage)](https://codeclimate.com/github/CocoaPods/CocoaPods/test_coverage) - -CocoaPods manages dependencies for your Xcode projects. - -You specify the dependencies for your project in a simple text file: your `Podfile`. -CocoaPods recursively resolves dependencies between libraries, fetches -source code for all dependencies, and creates and maintains an Xcode -workspace to build your project. The latest released Xcode versions and the -prior version are supported. - -Installing and updating CocoaPods is very easy. Don't miss the [Installation -guide](https://guides.cocoapods.org/using/getting-started.html#installation) and the -[Getting Started guide](https://guides.cocoapods.org/using/getting-started.html). - -## Project Goals - -CocoaPods aims to improve the engagement with, and discoverability -of, third party open-source Cocoa libraries. These -project goals influence and drive the design of CocoaPods: - -- Create and share libraries, and use them in your own projects, - without creating extra work for library authors. Integrate - non-CocoaPods libraries and hack on your own fork of any - CocoaPods library with a simple transparent `Podspec` standard. -- Allow library authors to structure their libraries however they like. -- Save time for library authors by automating a lot of Xcode work not - related to their libraries' functionality. -- Support any source management system. (Currently supported are `git`, - `svn`, `mercurial`, `bazaar`, and various types of archives downloaded over HTTP.) -- Promote a culture of distributed collaboration on pods, but also provide - features only possible with a centralised solution to foster a community. -- Build tools on top of the core Cocoa development system, including those - typically deployed to other operating systems, such as web-services. -- Provide opinionated and automated integration, but make it completely - optional. You may manually integrate your CocoaPods dependencies - into your Xcode project as you see fit, with or without a workspace. -- Solve everyday problems for Cocoa and Xcode developers. - -## Sponsors - -Lovingly sponsored by a collection of companies, see the footer of [CocoaPods.org](https://cocoapods.org) for an up-to-date list. - -## Collaborate - -All CocoaPods development happens on GitHub. Contributions make for good karma and -we [welcome new](https://blog.cocoapods.org/starting-open-source/) contributors with joy. We take contributors seriously, and thus have a -contributor [code of conduct](CODE_OF_CONDUCT.md). - -## Links - -| Link | Description | -| :----- | :------ | -[CocoaPods.org](https://cocoapods.org/) | Homepage and search for Pods. -[@CocoaPods](https://twitter.com/CocoaPods) | Follow CocoaPods on Twitter to stay up to date. -[Blog](https://blog.cocoapods.org) | The CocoaPods blog. -[Mailing List](https://groups.google.com/group/cocoapods) | Feel free to ask any kind of question. -[Guides](https://guides.cocoapods.org) | Everything you want to know about CocoaPods. -[Changelog](https://github.com/CocoaPods/CocoaPods/blob/master/CHANGELOG.md) | See the changes introduced in each CocoaPods version. -[New Pods RSS](https://feeds.cocoapods.org/new-pods.rss) | Don't miss any new Pods. -[Code of Conduct](CODE_OF_CONDUCT.md) | Find out the standards we hold ourselves to. - -## Projects - -CocoaPods is composed of the following projects: - -| Status | Project | Description | Info | -| :-------- | :------ | :--- | :--- | -| [![Build Status](https://github.com/CocoaPods/CocoaPods/workflows/Specs/badge.svg)](https://github.com/CocoaPods/CocoaPods/actions/workflows/Specs.yml) | [CocoaPods](https://github.com/CocoaPods/CocoaPods) | The CocoaPods command line tool. | [guides](https://guides.cocoapods.org) -| [![Build Status](https://github.com/CocoaPods/Core/workflows/Specs/badge.svg)](https://github.com/CocoaPods/Core/actions/workflows/Specs.yml) | [CocoaPods Core](https://github.com/CocoaPods/Core) | Support for working with specifications and podfiles. | [docs](https://guides.cocoapods.org/contributing/components.html) -| [![Build Status](https://github.com/CocoaPods/cocoapods-downloader/workflows/Specs/badge.svg)](https://github.com/CocoaPods/cocoapods-downloader/actions/workflows/Specs.yml) |[CocoaPods Downloader](https://github.com/CocoaPods/cocoapods-downloader) | Downloaders for various source types. | [docs](https://www.rubydoc.info/gems/cocoapods-downloader) -| [![Build Status](https://github.com/CocoaPods/Xcodeproj/workflows/Specs/badge.svg)](https://github.com/CocoaPods/Xcodeproj/actions/workflows/Specs.yml) | [Xcodeproj](https://github.com/CocoaPods/Xcodeproj) | Create and modify Xcode projects from Ruby. | [docs](https://www.rubydoc.info/gems/xcodeproj) -| [![Build Status](https://github.com/CocoaPods/CLAide/workflows/ci/badge.svg)](https://github.com/CocoaPods/CLAide/actions/workflows/ci.yml) | [CLAide](https://github.com/CocoaPods/CLAide) | A small command-line interface framework. | [docs](https://www.rubydoc.info/gems/claide) -| [![Build Status](https://github.com/CocoaPods/Molinillo/workflows/test/badge.svg)](https://github.com/CocoaPods/Molinillo/actions/workflows/test.yml) | [Molinillo](https://github.com/CocoaPods/Molinillo) | A powerful generic dependency resolver. | [docs](https://www.rubydoc.info/gems/molinillo) -| | [Master Repo ](https://github.com/CocoaPods/Specs) | Master repository of specifications. | [guides](https://guides.cocoapods.org/making/specs-and-specs-repo.html) diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-1.12.1/bin/pod b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-1.12.1/bin/pod deleted file mode 100755 index 47f6a27..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-1.12.1/bin/pod +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env ruby - -if Encoding.default_external != Encoding::UTF_8 - - if ARGV.include? '--no-ansi' - STDERR.puts <<-DOC - WARNING: CocoaPods requires your terminal to be using UTF-8 encoding. - Consider adding the following to ~/.profile: - - export LANG=en_US.UTF-8 - DOC - else - STDERR.puts <<-DOC - \e[33mWARNING: CocoaPods requires your terminal to be using UTF-8 encoding. - Consider adding the following to ~/.profile: - - export LANG=en_US.UTF-8 - \e[0m - DOC - end - -end - -if $PROGRAM_NAME == __FILE__ && !ENV['COCOAPODS_NO_BUNDLER'] - ENV['BUNDLE_GEMFILE'] = File.expand_path('../../Gemfile', __FILE__) - require 'rubygems' - require 'bundler/setup' - $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__) -elsif ENV['COCOAPODS_NO_BUNDLER'] - require 'rubygems' - gem 'cocoapods' -end - -STDOUT.sync = true if ENV['CP_STDOUT_SYNC'] == 'TRUE' - -require 'cocoapods' - -if profile_filename = ENV['COCOAPODS_PROFILE'] - require 'ruby-prof' - reporter = - case (profile_extname = File.extname(profile_filename)) - when '.txt' - RubyProf::FlatPrinterWithLineNumbers - when '.html' - RubyProf::GraphHtmlPrinter - when '.callgrind' - RubyProf::CallTreePrinter - else - raise "Unknown profiler format indicated by extension: #{profile_extname}" - end - File.open(profile_filename, 'w') do |io| - reporter.new(RubyProf.profile { Pod::Command.run(ARGV) }).print(io) - end -else - Pod::Command.run(ARGV) -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-1.12.1/bin/sandbox-pod b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-1.12.1/bin/sandbox-pod deleted file mode 100755 index 2752885..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-1.12.1/bin/sandbox-pod +++ /dev/null @@ -1,168 +0,0 @@ -#!/usr/bin/env ruby -# encoding: utf-8 - -# This bin wrapper runs the `pod` command in a OS X sandbox. The reason for this -# is to ensure that people can’t use malicious code from pod specifications. -# -# It does this by creating a ‘seatbelt’ profile on the fly and executing the -# given command through `/usr/bin/sandbox-exec`. This profile format is an -# undocumented format, which uses TinyScheme to implement its DSL. -# -# Even though it uses a undocumented format, it’s actually very self-explanatory. -# Because we use a whitelist approach, `(deny default)`, any action that is -# denied is logged to `/var/log/system.log`. So tailing that should provide -# enough information on steps that need to be take to get something to work. -# -# For more information see: -# -# * https://github.com/CocoaPods/CocoaPods/issues/939 -# * http://reverse.put.as/wp-content/uploads/2011/08/The-Apple-Sandbox-BHDC2011-Slides.pdf -# * http://reverse.put.as/wp-content/uploads/2011/08/The-Apple-Sandbox-BHDC2011-Paper.pdf -# * https://github.com/s7ephen/OSX-Sandbox--Seatbelt--Profiles -# * `$ man sandbox-exec` -# * `$ ls /usr/share/sandbox` - -if $0 == __FILE__ - $:.unshift File.expand_path('../../lib', __FILE__) -end - -require 'pathname' -require 'cocoapods/config' -require 'rbconfig' -require 'erb' - -PROFILE_ERB_TEMPLATE = <<-EOS -(version 1) -(debug allow) - -(import "mDNSResponder.sb") - -(allow file-ioctl) -(allow sysctl-read) -(allow mach-lookup) -(allow ipc-posix-shm) -(allow process-fork) -(allow system-socket) - -; TODO make this stricter if possible -(allow network-outbound) - -(allow process-exec - (literal - "<%= pod_bin %>" - "<%= ruby_bin %>" - ) - (regex -<% prefixes.each do |prefix| %> - #"^<%= prefix %>/*" -<% end %> - ) -) - -(allow file-read-metadata) -(allow file-read* - ; This is currenly only added because using `xcodebuild` to build a resource - ; bundle target starts a FSEvents stream on `/`. No idea why that would be - ; needed, but for now it doesn’t seem like a real problem. - (literal "/") - (regex - ; TODO see if we can restrict this more, but it's going to be hard - #"^/Users/[^.]+/*" - ;#"^/Users/[^.]+/.netrc" - ;#"^/Users/[^.]+/.gemrc" - ;#"^/Users/[^.]+/.gem/*" - ;#"^/Users/[^.]+/Library/.*" - #"^/Library/*" - #"^/System/Library/*" - #"^/usr/lib/*" - #"^/usr/share/*" - #"^/private/*" - #"^/dev/*" - #"^<%= ruby_prefix %>" - #"^<%= pod_prefix %>" - #"^<%= xcode_app_path %>" - #"^<%= Pod::Config.instance.repos_dir %>" -<% prefixes.each do |prefix| %> - #"^<%= prefix %>/*" -<% end %> - ) -) - -(allow file-write* - (literal - "/dev/dtracehelper" - "/dev/null" - ) - (regex - #"^<%= Pod::Config.instance.project_root %>" - #"^<%= Pod::Config.instance.repos_dir %>" - #"^/Users/[^.]+/Library/Caches/CocoaPods/*" - #"^/dev/tty" - #"^/private/var" - ) -) - -(deny default) -EOS - -class Profile - def pod_bin - File.expand_path('../pod', __FILE__) - end - - def pod_prefix - File.expand_path('../..', pod_bin) - end - - def ruby_bin - File.join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['ruby_install_name']) - end - - def ruby_prefix - RbConfig::CONFIG['prefix'] - end - - def prefix_from_bin(bin_name) - unless (path = `which #{bin_name}`.strip).empty? - File.dirname(File.dirname(path)) - end - end - - def prefixes - prefixes = ['/bin', '/usr/bin', '/usr/libexec', xcode_app_path] - prefixes << `brew --prefix`.strip unless `which brew`.strip.empty? - - # From asking people, it seems MacPorts does not have a `prefix` command, like - # Homebrew does, so make an educated guess: - if port_prefix = prefix_from_bin('port') - prefixes << port_prefix - end - - if rbenv_prefix = prefix_from_bin('rbenv') - prefixes << rbenv_prefix - end - - prefixes - end - - def developer_prefix - `xcode-select --print-path`.strip - end - - def xcode_app_path - File.expand_path('../..', developer_prefix) - end - - # TODO: raise SAFE level (0) to 4 if possible. - def generate - ERB.new(PROFILE_ERB_TEMPLATE, 0, '>').result(binding) - end -end - -# Ensure the `pod` bin doesn’t think it needs to use Bundler. -ENV['COCOAPODS_NO_BUNDLER'] = '1' - -profile = Profile.new -# puts profile.generate -command = ['/usr/bin/sandbox-exec', '-p', profile.generate, profile.pod_bin, *ARGV] -exec(*command) diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-core-1.12.1/LICENSE b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-core-1.12.1/LICENSE deleted file mode 100644 index f25cc61..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-core-1.12.1/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2011 - 2012 Eloy Durán -Copyright (c) 2012 Fabio Pelosin - -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/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-core-1.12.1/README.md b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-core-1.12.1/README.md deleted file mode 100644 index 5133f40..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-core-1.12.1/README.md +++ /dev/null @@ -1,42 +0,0 @@ -# CocoaPods Core - -[![Build Status](https://github.com/CocoaPods/Core/workflows/Specs/badge.svg)](https://github.com/CocoaPods/Core/actions/workflows/Specs.yml) -[![Test Coverage](https://api.codeclimate.com/v1/badges/91a2d70b9ed977815c66/test_coverage)](https://codeclimate.com/github/CocoaPods/Core/test_coverage) -[![Maintainability](https://api.codeclimate.com/v1/badges/91a2d70b9ed977815c66/maintainability)](https://codeclimate.com/github/CocoaPods/Core/maintainability) - -The CocoaPods-Core gem provides support to work with the models of CocoaPods. -It is intended to be used in place of the CocoaPods gem when the installation -of the dependencies is not needed. Therefore, it is suitable for web services. - -Provides support for working with the following models: - -- `Pod::Specification` - [Podspec Syntax Reference](https://guides.cocoapods.org/syntax/podspec.html). -- `Pod::Podfile` - [Podfile Syntax Reference](https://guides.cocoapods.org/syntax/podfile.html). -- `Pod::Source` - collections of podspec files like the [CocoaPods Spec repo](https://github.com/CocoaPods/Specs). - -The gem also provides support for ancillary features like -`Pod::Specification::Set::Presenter` suitable for presetting descriptions of -Pods and the `Specification::Linter`, which ensures the validity of podspec -files. - -## Installation - -``` -$ [sudo] gem install cocoapods-core -``` - -The `cocoapods-core` gem requires Ruby 2.6.0 or later. - -## Collaborate - -All CocoaPods development happens on GitHub, there is a repository for -[CocoaPods](https://github.com/CocoaPods/CocoaPods) and one for the [CocoaPods -specs](https://github.com/CocoaPods/Specs). Contributing patches or Pods is -really easy and gratifying. - -Follow [@CocoaPods](http://twitter.com/CocoaPods) to get up to date -information about what's going on in the CocoaPods world. - -## License - -This gem and CocoaPods are available under the MIT license. diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-deintegrate-1.0.5/LICENSE b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-deintegrate-1.0.5/LICENSE deleted file mode 100644 index 5a7b88b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-deintegrate-1.0.5/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -Copyright (c) 2015 Kyle Fuller - -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/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-deintegrate-1.0.5/README.md b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-deintegrate-1.0.5/README.md deleted file mode 100644 index 1fde3ed..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-deintegrate-1.0.5/README.md +++ /dev/null @@ -1,56 +0,0 @@ -# cocoapods-deintegrate - -A CocoaPods plugin to remove and deintegrate CocoaPods from your project. -Removing all traces of CocoaPods from an Xcode project. - -## Installation - -```bash -$ [sudo] gem install cocoapods-deintegrate -``` - -## Usage - -Running `pod deintegrate` will deintegrate your Xcode project from -CocoaPods. Before running you should ensure you have a backup of your project. - -```bash -$ pod deintegrate -Deintegrating Palaver.xcodeproj -Deintegrating target Palaver -Deleted 1 'Copy Pods Resources' build phases. -Deleted 1 'Check Pods Manifest.lock' build phases. -Removing Pod libraries from build phase: -- libPods-Palaver.a -Deleting Pod file references from project -- libPods-Palaver.a -- libPods-PalaverTests.a -- Pods-Palaver.debug.xcconfig -- Pods-Palaver.release.xcconfig -- Pods-Palaver.ad hoc.xcconfig -- Pods-PalaverTests.debug.xcconfig -- Pods-PalaverTests.release.xcconfig -- Pods-PalaverTests.ad hoc.xcconfig -Deleted 1 `Pod` groups from project. -Deintegrating target PalaverTests -Deleted 1 'Copy Pods Resources' build phases. -Deleted 1 'Check Pods Manifest.lock' build phases. - -Project has been deintegrated. No traces of CocoaPods left in project. -Note: The workspace referencing the Pods project still remains. -``` - -The only things that will remains are as follows: - -- Podfile, Podfile.lock -- Workspace - -### Credits - -This CocoaPods plugin was created by [Kyle Fuller](http://kylefuller.co.uk/) -([@kylefuller](https://twitter.com/kylefuller)). - -### License - -cocoapods-deintegrate is released under the MIT license. See [LICENSE](LICENSE). - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-downloader-1.6.3/LICENSE b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-downloader-1.6.3/LICENSE deleted file mode 100644 index 7c1df53..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-downloader-1.6.3/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -Copyright (c) 2011 - 2012 Eloy Durán -Copyright (c) 2012 Fabio Pelosin - -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/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-downloader-1.6.3/README.markdown b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-downloader-1.6.3/README.markdown deleted file mode 100644 index 5d93a5a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-downloader-1.6.3/README.markdown +++ /dev/null @@ -1,81 +0,0 @@ -# Downloader - -A small library for downloading files from remotes in a folder. - -[![Build Status](https://img.shields.io/github/workflow/status/CocoaPods/CocoaPods-Downloader/Spec)](https://github.com/CocoaPods/cocoapods-downloader/actions) -[![Gem Version](https://img.shields.io/gem/v/cocoapods-downloader)](https://rubygems.org/gems/cocoapods-downloader) -[![Maintainability](https://api.codeclimate.com/v1/badges/2253ffb0c2c98e4d1c71/maintainability)](https://codeclimate.com/github/CocoaPods/cocoapods-downloader/maintainability) - -## Install - -``` -$ [sudo] gem install cocoapods-downloader -``` - -## Usage - -```ruby -require 'cocoapods-downloader' - -target_path = './Downloads/MyDownload' -options = { :git => 'example.com' } -options = Pod::Downloader.preprocess_options(options) -downloader = Pod::Downloader.for_target(target_path, options) -downloader.cache_root = '~/Library/Caches/APPNAME' -downloader.max_cache_size = 500 -downloader.download -downloader.checkout_options #=> { :git => 'example.com', :commit => 'd7f410490dabf7a6bde665ba22da102c3acf1bd9' } -``` - -The downloader class supports the following option keys: - -- git: commit, tag, branch, submodules -- svn: revision, tag, folder, externals -- hg: revision, tag, branch -- http: type, flatten -- scp: type, flatten -- bzr: revision, tag - -The downloader also provides hooks which allow to customize its output or the way in which the commands are executed - -```ruby -require 'cocoapods-downloader' - -module Pod - module Downloader - class Base - - override_api do - def self.execute_command(executable, command, raise_on_failure = false) - puts "Will download" - super - end - - def self.ui_action(ui_message) - puts ui_message.green - yield - end - end - - end - end -end -``` - -## Extraction - -This gem was extracted from [CocoaPods](https://github.com/CocoaPods/CocoaPods). Refer to also that repository for the history and the contributors. - -## Collaborate - -All CocoaPods development happens on GitHub, there is a repository for [CocoaPods](https://github.com/CocoaPods/CocoaPods) and one for the [CocoaPods specs](https://github.com/CocoaPods/Specs). Contributing patches or Pods is really easy and gratifying and for a lot of people is their first time. - -Follow [@CocoaPods](http://twitter.com/CocoaPods) to get up to date information about what's going on in the CocoaPods world. - -## Development - -You need to have `svn`, `bzr`, `hg` and `git` installed to run the specs. There are some specs which require `hdiutil` which will only run on macOS. - -## License - -This gem and CocoaPods are available under the MIT license. diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/.gitignore b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/.gitignore deleted file mode 100644 index 40855cf..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/.gitignore +++ /dev/null @@ -1,40 +0,0 @@ -*.gem -*.rbc -/.config -/coverage/ -/InstalledFiles -/pkg/ -/spec/reports/ -/test/tmp/ -/test/version_tmp/ -/tmp/ - -## Specific to RubyMotion: -.dat* -.repl_history -build/ - -## Documentation cache and generated files: -/.yardoc/ -/_yardoc/ -/doc/ -/rdoc/ - -## Environment normalisation: -/.bundle/ -/lib/bundler/man/ - -# for a library or gem, you might want to ignore these files since the code is -# intended to run in multiple environments; otherwise, check them in: -# Gemfile.lock -# .ruby-version -# .ruby-gemset - -# unless supporting rvm < 1.11.0 or doing something fancy, ignore this: -.rvmrc - -/coverage/ - -# RubyMine Editor -.idea - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/.rubocop.yml b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/.rubocop.yml deleted file mode 100644 index 7583205..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/.rubocop.yml +++ /dev/null @@ -1,4 +0,0 @@ -inherit_from: - - .rubocop_cocoapods.yml - - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/.rubocop_cocoapods.yml b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/.rubocop_cocoapods.yml deleted file mode 100644 index 9104ebd..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/.rubocop_cocoapods.yml +++ /dev/null @@ -1,116 +0,0 @@ -AllCops: - Include: - - ./Rakefile - - ./Gemfile - - ./*.gemspec - Exclude: - - ./spec/fixtures/**/* - -# At the moment not ready to be used -# https://github.com/bbatsov/rubocop/issues/947 -Documentation: - Enabled: false - -#- CocoaPods -----------------------------------------------------------------# - -# We adopted raise instead of fail. -SignalException: - EnforcedStyle: only_raise - -# They are idiomatic -AssignmentInCondition: - Enabled: false - -# Allow backticks -AsciiComments: - Enabled: false - -# Indentation clarifies logic branches in implementations -IfUnlessModifier: - Enabled: false - -# No enforced convention here. -SingleLineBlockParams: - Enabled: false - -# We only add the comment when needed. -Encoding: - Enabled: false - -# Having these make it easier to *not* forget to add one when adding a new -# value and you can simply copy the previous line. -TrailingComma: - EnforcedStyleForMultiline: comma - -Style/MultilineOperationIndentation: - EnforcedStyle: indented - -# Clashes with CLAide Command#validate! -GuardClause: - Enabled: false - -# Not always desirable: lib/claide/command/plugins_helper.rb:12:15 -Next: - Enabled: false - -# Arbitrary max lengths for classes simply do not work and enabling this will -# lead to a never ending stream of annoyance and changes. -Metrics/ClassLength: - Enabled: false - -# Arbitrary max lengths for methods simply do not work and enabling this will -# lead to a never ending stream of annoyance and changes. -Metrics/MethodLength: - Enabled: false - -# No enforced convention here. -Metrics/BlockNesting: - Enabled: false - -# It will be obvious which code is complex, Rubocop should only lint simple -# rules for us. -Metrics/AbcSize: - Enabled: false - -# It will be obvious which code is complex, Rubocop should only lint simple -# rules for us. -Metrics/CyclomaticComplexity: - Enabled: false - -#- CocoaPods support for Ruby 1.8.7 ------------------------------------------# - -HashSyntax: - EnforcedStyle: hash_rockets - -Lambda: - Enabled: false - -DotPosition: - EnforcedStyle: trailing - -EachWithObject: - Enabled: false - -Style/SpecialGlobalVars: - Enabled: false - -#- CocoaPods specs -----------------------------------------------------------# - -# Allow for `should.match /regexp/`. -AmbiguousRegexpLiteral: - Exclude: - - spec/**/* - -# Allow `object.should == object` syntax. -Void: - Exclude: - - spec/**/* - -ClassAndModuleChildren: - Exclude: - - spec/**/* - -UselessComparison: - Exclude: - - spec/**/* - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/.travis.yml b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/.travis.yml deleted file mode 100644 index 282bfc7..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/.travis.yml +++ /dev/null @@ -1,24 +0,0 @@ -# Sets Travis to run the Ruby specs on OS X machines to be as close as possible -# to the user environment. -# -language: objective-c -addons: - code_climate: - repo_token: 2926ae7ea0b2a6ced8b0d67efa235769ab85de1d9c9f6702f40d80bacec3c9c4 - -env: - - RVM_RUBY_VERSION=system - # - RVM_RUBY_VERSION=1.8.7-p358 - -before_install: - - export LANG=en_US.UTF-8 - - curl http://curl.haxx.se/ca/cacert.pem -o /usr/local/share/cacert.pem - - source ~/.rvm/scripts/rvm - - if [[ $RVM_RUBY_VERSION != 'system' ]]; then rvm install $RVM_RUBY_VERSION; fi - - rvm use $RVM_RUBY_VERSION - - if [[ $RVM_RUBY_VERSION == 'system' ]]; then sudo gem install bundler --no-ri --no-rdoc; else gem install bundler --no-ri --no-rdoc; fi - -install: - - sudo bundle install --without=documentation - -script: bundle exec rake spec diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/CHANGELOG.md b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/CHANGELOG.md deleted file mode 100644 index 4d1a245..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/CHANGELOG.md +++ /dev/null @@ -1,102 +0,0 @@ -# Cocoapods::Plugins Changelog - -## 1.0.0 (2016-05-10) - -##### Enhancements - -* None. - -##### Bug Fixes - -* None. - - -## 1.0.0.rc.1 (2016-04-30) - -This version contains no changes. - - -## 1.0.0.beta.1 (2015-12-30) - -This version contains no changes. - - -## 0.4.2 (2015-04-03) - - -## 0.4.1 (2015-02-25) - -* Added the `pod plugins installed` subcommand. - [Olivier Halligon](https://github.com/AliSoftware) - -## 0.4.0 (2014-12-25) - -* Added the `pod plugins publish` subcommand. - [Olivier Halligon](https://github.com/AliSoftware) - -## 0.3.2 (2014-11-02) - -* Switch to using cocoapods-plugins JSON file instead of from Cocoapods.org's repo. - [542919](https://github.com/CocoaPods/cocoapods-plugins/commit/542919902e611c33bb0e02848037474529ddd0f9) - [Florian Hanke](https://github.com/floere) - - -## 0.3.1 (2014-09-12) - -* Restore compatibility with Ruby 1.8.7. - [#30](https://github.com/CocoaPods/cocoapods-plugins/issues/30) - [Fabio Pelosin](https://github.com/fabiopelosin) - -## 0.3.0 (2014-09-11) - -* Added a reminder to add plugin to `plugins.json` once released. - [#27](https://github.com/CocoaPods/cocoapods-plugins/issues/27) - [Olivier Halligon](https://github.com/AliSoftware) - -* Print out the version of plugins when invoked with `--verbose`. - [#16](https://github.com/CocoaPods/cocoapods-plugins/issues/16) - [David Grandinetti](https://github.com/dbgrandi) - -## 0.2.0 (2014-05-20) - -* Migrating to new syntax of CLAide::Command#arguments. - [#23](https://github.com/CocoaPods/cocoapods-plugins/issues/23) - [Olivier Halligon](https://github.com/AliSoftware) - -* Printing URL of template used. - [#21](https://github.com/CocoaPods/cocoapods-plugins/issues/21) - [Olivier Halligon](https://github.com/AliSoftware) - -* `create` subcommand now prefixes the given name if not already. - [#20](https://github.com/CocoaPods/cocoapods-plugins/issues/20) - [Olivier Halligon](https://github.com/AliSoftware) - -## 0.1.1 (2014-05-02) - -* Making `pod plugins` an abstract command, with `list` the default subcommand. - [#11](https://github.com/CocoaPods/cocoapods-plugins/issues/11) - [#12](https://github.com/CocoaPods/cocoapods-plugins/issues/12) - [Olivier Halligon](https://github.com/AliSoftware) - -* Added `search` subcommand to search plugins by name, author and description. - [#6](https://github.com/CocoaPods/cocoapods-plugins/issues/6) - [Olivier Halligon](https://github.com/AliSoftware) - -* Refactoring and improved output formatting. - [#8](https://github.com/CocoaPods/cocoapods-plugins/issues/8) - [#10](https://github.com/CocoaPods/cocoapods-plugins/issues/10) - [#13](https://github.com/CocoaPods/cocoapods-plugins/issues/13) - [Olivier Halligon](https://github.com/AliSoftware) - -* Fixing coding conventions and RuboCop offenses. - [#17](https://github.com/CocoaPods/cocoapods-plugins/issues/17) - [Olivier Halligon](https://github.com/AliSoftware) - -## 0.1.0 (2014-04-22) - -* Initial implementation. - [David Grandinetti](https://github.com/dbgrandi) - -* Added `create` subcommand to create an empty project for a new plugin. - [#6](https://github.com/CocoaPods/cocoapods-plugins/issues/6) - [Boris Bügling](https://github.com/neonichu) diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/Gemfile b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/Gemfile deleted file mode 100644 index 23f47e7..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/Gemfile +++ /dev/null @@ -1,18 +0,0 @@ -source 'https://rubygems.org' - -gemspec - -group :development do - gem 'cocoapods', :git => 'https://github.com/CocoaPods/CocoaPods.git', :branch => 'master' - gem 'cocoapods-core', :git => 'https://github.com/CocoaPods/Core.git', :branch => 'master' - gem 'claide', :git => 'https://github.com/CocoaPods/CLAide.git', :branch => 'master' - - gem 'bacon' - gem 'mocha-on-bacon' - gem 'prettybacon' - gem 'vcr' - gem 'webmock' - - gem 'codeclimate-test-reporter', :require => nil - gem 'rubocop' -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/Gemfile.lock b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/Gemfile.lock deleted file mode 100644 index de064d4..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/Gemfile.lock +++ /dev/null @@ -1,134 +0,0 @@ -GIT - remote: https://github.com/CocoaPods/CLAide.git - revision: 00927807580554b7d3485d673c90386d3fd8fde0 - branch: master - specs: - claide (0.8.1) - -GIT - remote: https://github.com/CocoaPods/CocoaPods.git - revision: 06f9a9870f1fc205f06c6d0193502fd7cf0241ef - branch: master - specs: - cocoapods (0.36.3) - activesupport (>= 3.2.15) - claide (~> 0.8.1) - cocoapods-core (= 0.36.3) - cocoapods-downloader (~> 0.9.0) - cocoapods-plugins (= 1.0.0) - cocoapods-trunk (~> 0.6.0) - cocoapods-try (~> 0.4.3) - colored (~> 1.2) - escape (~> 0.0.4) - molinillo (~> 0.2.1) - nap (~> 0.8) - open4 (~> 1.3) - xcodeproj (~> 0.23.1) - -GIT - remote: https://github.com/CocoaPods/Core.git - revision: 11f3eee2008e822e5af0b01866a5a0b376c930a7 - branch: master - specs: - cocoapods-core (0.36.3) - activesupport (>= 3.2.15) - fuzzy_match (~> 2.0.4) - nap (~> 0.8.0) - -PATH - remote: . - specs: - cocoapods-plugins (1.0.0) - nap - -GEM - remote: https://rubygems.org/ - specs: - activesupport (4.2.1) - i18n (~> 0.7) - json (~> 1.7, >= 1.7.7) - minitest (~> 5.1) - thread_safe (~> 0.3, >= 0.3.4) - tzinfo (~> 1.1) - addressable (2.3.7) - ast (2.0.0) - astrolabe (1.3.0) - parser (>= 2.2.0.pre.3, < 3.0) - bacon (1.2.0) - cocoapods-downloader (0.9.0) - cocoapods-trunk (0.6.0) - nap (>= 0.8) - netrc (= 0.7.8) - cocoapods-try (0.4.3) - codeclimate-test-reporter (0.4.0) - simplecov (>= 0.7.1, < 1.0.0) - colored (1.2) - crack (0.4.2) - safe_yaml (~> 1.0.0) - docile (1.1.5) - escape (0.0.4) - fuzzy_match (2.0.4) - i18n (0.7.0) - json (1.8.2) - metaclass (0.0.4) - minitest (5.5.1) - mocha (1.1.0) - metaclass (~> 0.0.1) - mocha-on-bacon (0.2.2) - mocha (>= 0.13.0) - molinillo (0.2.3) - multi_json (1.10.1) - nap (0.8.0) - netrc (0.7.8) - open4 (1.3.4) - parser (2.2.0.3) - ast (>= 1.1, < 3.0) - powerpack (0.1.0) - prettybacon (0.0.2) - bacon (~> 1.2) - rainbow (2.0.0) - rake (10.3.2) - rubocop (0.29.1) - astrolabe (~> 1.3) - parser (>= 2.2.0.1, < 3.0) - powerpack (~> 0.1) - rainbow (>= 1.99.1, < 3.0) - ruby-progressbar (~> 1.4) - ruby-progressbar (1.7.5) - safe_yaml (1.0.4) - simplecov (0.9.0) - docile (~> 1.1.0) - multi_json - simplecov-html (~> 0.8.0) - simplecov-html (0.8.0) - thread_safe (0.3.5) - tzinfo (1.2.2) - thread_safe (~> 0.1) - vcr (2.9.3) - webmock (1.20.4) - addressable (>= 2.3.6) - crack (>= 0.3.2) - xcodeproj (0.23.1) - activesupport (>= 3) - colored (~> 1.2) - -PLATFORMS - ruby - -DEPENDENCIES - bacon - bundler (~> 1.3) - claide! - cocoapods! - cocoapods-core! - cocoapods-plugins! - codeclimate-test-reporter - mocha-on-bacon - prettybacon - rake - rubocop - vcr - webmock - -BUNDLED WITH - 1.11.2 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/LICENSE b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/LICENSE deleted file mode 100644 index 0d932da..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 David Grandinetti - -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. \ No newline at end of file diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/README.md b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/README.md deleted file mode 100644 index a38af09..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/README.md +++ /dev/null @@ -1,44 +0,0 @@ -# Cocoapods plugins - -[![Build Status](https://img.shields.io/travis/CocoaPods/cocoapods-plugins/master.svg?style=flat)](https://travis-ci.org/CocoaPods/cocoapods-plugins) -[![Coverage](https://img.shields.io/codeclimate/coverage/github/CocoaPods/cocoapods-plugins.svg?style=flat)](https://codeclimate.com/github/CocoaPods/cocoapods-plugins) -[![Code Climate](https://img.shields.io/codeclimate/github/CocoaPods/cocoapods-plugins.svg?style=flat)](https://codeclimate.com/github/CocoaPods/cocoapods-plugins) - -CocoaPods plugin which shows info about available CocoaPods plugins or helps you get started developing a new plugin. Yeah, it's very meta. - -## Installation - - $ gem install cocoapods-plugins - -## Usage - -##### List installed plugins - - $ pod plugins installed - -List all installed CocoaPods plugins with their respective version (and pre_install/post_insall hooks if any) - -##### List known plugins - - $ pod plugins list - -List all known CocoaPods plugins (according to the list hosted on `http://github.com/CocoaPods/cocoapods-plugins`) - -##### Search plugins - - $ pod plugins search QUERY - -Search plugins whose name contains the given text (ignoring case). With --full, it searches by name but also by author and description. - -##### Create a new plugin - - $ pod plugins create NAME [TEMPLATE_URL] - -Create a scaffold for the development of a new plugin according to the CocoaPods best practices. -If a `TEMPLATE_URL`, pointing to a git repo containing a compatible template, is specified, it will be used in place of the default one. - -## Get your plugin listed - - $ pod plugins publish - -Create an issue in the `cocoapods-plugins` GitHub repository to ask for your plugin to be added to the official list (with the proper JSON fragment to be added to `plugins.json` so we just have to copy/paste it). diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/Rakefile b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/Rakefile deleted file mode 100644 index ce44a28..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/Rakefile +++ /dev/null @@ -1,88 +0,0 @@ -# Bootstrap -#-----------------------------------------------------------------------------# - -task :bootstrap do - if system('which bundle') - sh 'bundle install' - else - $stderr.puts "\033[0;31m" \ - "[!] Please install the bundler gem manually:\n" \ - ' $ [sudo] gem install bundler' \ - "\e[0m" - exit 1 - end -end - -begin - - require 'bundler/gem_tasks' - - task :default => 'spec' - - # Spec - #-----------------------------------------------------------------------------# - - desc 'Runs all the specs' - task :spec do - start_time = Time.now - sh "bundle exec bacon #{specs('**')}" - duration = Time.now - start_time - puts "Tests completed in #{duration}s" - Rake::Task['rubocop'].invoke - Rake::Task['validate_json'].invoke - end - - def specs(dir) - FileList["spec/#{dir}/*_spec.rb"].shuffle.join(' ') - end - - # Rubocop - #-----------------------------------------------------------------------------# - - desc 'Checks code style' - task :rubocop do - require 'rubocop' - cli = RuboCop::CLI.new - result = cli.run(FileList['{spec,lib}/**/*.rb']) - abort('RuboCop failed!') unless result == 0 - end - - # plugins.json - #----------------------------------------------------------------------------# - - desc 'Validates plugins.json' - task :validate_json do - require 'json' - require 'pathname' - - puts 'Validating plugins.json' - - json_file = Pathname(__FILE__).parent + 'plugins.json' - json = json_file.read - plugins = JSON.load(json) - abort('Invalid JSON in plugins.json') unless plugins - keys = %w(gem name author social_media_url url description) - optional_keys = %w(social_media_url) - errors = plugins['plugins'].reduce([]) do |errors, plugin| - extra_keys = plugin.keys - keys - unless extra_keys.empty? - errors << "plugin `#{plugin['name']}` has extra keys #{extra_keys}" - end - (keys - optional_keys).each do |key| - unless plugin[key] - errors << "plugin `#{plugin['name']}` is missing key `#{key}`" - end - end - errors - end - unless errors.empty? - abort("Invalid plugins.json:\n\n#{errors.join("\n")}") - end - end - -rescue LoadError - $stderr.puts "\033[0;31m" \ - '[!] Some Rake tasks haven been disabled because the environment' \ - ' couldn’t be loaded. Be sure to run `rake bootstrap` first.' \ - "\e[0m" -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/cocoapods-plugins.gemspec b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/cocoapods-plugins.gemspec deleted file mode 100644 index 555c86f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/cocoapods-plugins.gemspec +++ /dev/null @@ -1,31 +0,0 @@ -# coding: utf-8 -lib = File.expand_path('../lib', __FILE__) -$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) -require 'cocoapods_plugins.rb' - -Gem::Specification.new do |spec| - spec.name = 'cocoapods-plugins' - spec.version = CocoapodsPlugins::VERSION - spec.authors = ['David Grandinetti', 'Olivier Halligon'] - spec.summary = %q{CocoaPods plugin which shows info about available CocoaPods plugins.} - spec.description = <<-DESC - This CocoaPods plugin shows information about all available CocoaPods plugins - (yes, this is very meta!). - This CP plugin adds the "pod plugins" command to CocoaPods so that you can list - all plugins (registered in the reference JSON hosted at CocoaPods/cocoapods-plugins) - DESC - spec.homepage = 'https://github.com/cocoapods/cocoapods-plugins' - spec.license = 'MIT' - - spec.files = `git ls-files`.split($/) - spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } - spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) - spec.require_paths = ['lib'] - - spec.add_runtime_dependency 'nap' - - spec.add_development_dependency 'bundler', '~> 1.3' - spec.add_development_dependency 'rake' - - spec.required_ruby_version = '>= 2.0.0' -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/plugins.json b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/plugins.json deleted file mode 100644 index 2f6f985..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/plugins.json +++ /dev/null @@ -1,245 +0,0 @@ -{ - "plugins": [ - { - "gem": "cocoapods-appledoc", - "name": "AppleDoc", - "author": "Kyle Fuller", - "social_media_url": "http://twitter.com/kylefuller", - "url": "https://github.com/CocoaPods/cocoapods-appledoc", - "description": "Generates docset and documentation for a pod." - }, - { - "gem": "cocoapods-deploy", - "name": "Deploy", - "author": "James Campbell", - "social_media_url": "https://twitter.com/jcampbell_05", - "url": "https://github.com/jcampbell05/cocoapods-deploy", - "description": "Deploys dependencies for a CocoaPods project without needing to clone the repo (Similar to Bundler's `--deployment`)." - }, - { - "gem": "cocoapods-rome", - "name": "Rome", - "author": "Boris Bügling", - "social_media_url": "https://twitter.com/neonichu", - "url": "https://github.com/neonichu/rome", - "description": "Rome makes it easy to build a list of frameworks for consumption outside of Xcode, e.g. for a Swift script." - }, - { - "gem": "cocoapods-deintegrate", - "name": "Deintegrate", - "author": "Kyle Fuller", - "social_media_url": "http://twitter.com/kylefuller", - "url": "https://github.com/kylef/cocoapods-deintegrate", - "description": "Deintegrates a project from CocoaPods." - }, - { - "gem": "cocoapods-dependencies", - "name": "Pod Dependencies", - "author": "Samuel E. Giddins", - "social_media_url": "http://twitter.com/segiddins", - "url": "https://github.com/segiddins/cocoapods-dependencies", - "description": "Shows a project's CocoaPod dependency graph." - }, - { - "gem": "cocoapods-browser", - "name": "Pod browser", - "author": "Toshihiro Morimoto", - "social_media_url": "http://twitter.com/dealforest", - "url": "https://github.com/dealforest/cocoapods-browser", - "description": "Open a pod's homepage in the browser." - }, - { - "gem": "cocoapods-check_latest", - "name": "Check Latest", - "author": "Yuji Nakayama", - "social_media_url": "http://twitter.com/nkym37", - "url": "https://github.com/yujinakayama/cocoapods-check_latest", - "description": "Checks if the latest version of a pod is up to date." - }, - { - "gem": "cocoapods-docs", - "name": "Pod docs", - "author": "CocoaPods Dev Team", - "social_media_url": "http://twitter.com/CocoaPods", - "url": "https://github.com/CocoaPods/cocoapods-docs", - "description": "Convenient access to the documentation of a Pod via cocoadocs.org." - }, - { - "gem": "cocoapods-docstats", - "name": "docstats", - "author": "Boris Bügling", - "social_media_url": "http://twitter.com/NeoNacho", - "url": "https://github.com/neonichu/cocoapods-docstats", - "description": "Showing documentation metrics of Pods." - }, - { - "gem": "cocoapods-open", - "name": "open", - "author": "Les Hill", - "social_media_url": "http://twitter.com/leshill", - "url": "https://github.com/leshill/open_pod_bay", - "description": "Open a pod’s workspace." - }, - { - "gem": "cocoapods-podfile_info", - "name": "Pod info", - "author": "CocoaPods Dev Team", - "social_media_url": "http://twitter.com/CocoaPods", - "url": "https://github.com/cocoapods/cocoapods-podfile_info", - "description": "Shows information on installed Pods." - }, - { - "gem": "cocoapods-repo-svn", - "name": "repo-svn", - "author": "Dusty Clarkda", - "social_media_url": "http://twitter.com/_clarkda", - "url": "https://github.com/clarkda/cocoapods-repo-svn", - "description": "Adds subversion support to manage spec-repositories." - }, - { - "gem": "cocoapods-repo-hg", - "name": "repo-hg", - "author": "Dusty Clarkda", - "social_media_url": "http://twitter.com/_clarkda", - "url": "https://github.com/clarkda/cocoapods-repo-hg", - "description": "Adds mercurial support to manage spec-repositories." - }, - { - "gem": "cocoapods-try", - "name": "Pod try", - "author": "CocoaPods Dev Team", - "social_media_url": "http://twitter.com/CocoaPods", - "url": "https://github.com/CocoaPods/cocoapods-try", - "description": "Quickly try the demo project of a Pod." - }, - { - "gem": "cocoapods-watch", - "name": "Pod watch", - "author": "Marin Usalj", - "url": "https://github.com/supermarin/cocoapods-watch", - "description": "Watch for Podfile changes and run pod install." - }, - { - "gem": "cocoapods-roulette", - "name": "Pods Roulette", - "author": "Heiko Behrens, Marcel Jackwerth", - "url": "https://github.com/sirlantis/cocoapods-roulette", - "description": "Builds an empty project with three random pods." - }, - { - "gem": "cocoapods-sorted-search", - "name": "Sorted Search", - "author": "Denys Telezhkin", - "url": "https://github.com/DenHeadless/cocoapods-sorted-search", - "description": "Adds a sort subcommand for pod search to sort search results by amount of stars, forks, or github activity." - }, - { - "gem": "cocoapods-release", - "name": "Release", - "author": "Oliver Letterer", - "social_media_url": "https://twitter.com/oletterer", - "url": "https://github.com/Sparrow-Labs/cocoapods-release", - "description": "Tags and releases pods for you." - }, - { - "gem": "cocoapods-clean", - "name": "cocoapods clean", - "author": "Luca Querella", - "url": "https://github.com/BendingSpoons/cocoapods-clean", - "description": "Remove Podfile.lock, Pods/ and *.xcworkspace." - }, - { - "gem": "cocoapods-keys", - "name": "CocoaPods Keys", - "author": "Orta Therox, Samuel E. Giddins", - "url": "https://github.com/orta/cocoapods-keys", - "description": "Store sensitive data in your Mac's keychain, that will be installed into your app's source code via the Pods library." - }, - { - "gem": "cocoapods-packager", - "name": "CocoaPods Packager", - "author": "Kyle Fuller, Boris Bügling", - "url": "https://github.com/CocoaPods/cocoapods-packager", - "description": "Generate a framework or static library from a podspec." - }, - { - "gem": "cocoapods-links", - "name": "CocoaPods Links", - "author": "Mike Owens", - "social_media_url": "https://twitter.com/mikejowens", - "url": "https://github.com/mowens/cocoapods-links", - "description": "A CocoaPods plugin to manage local development pods" - }, - { - "gem": "cocoapods-prune-localizations", - "name": "CocoaPods Prune Localizations", - "author": "Diego Torres", - "social_media_url": "https://twitter.com/dtorres", - "url": "https://github.com/dtorres/cocoapods-prune-localizations", - "description": "Upon running pod install, this plugin will remove unused localizations by your project" - }, - { - "gem": "cocoapods-readonly", - "name": "CocoaPods Readonly", - "author": "Mason Glidden", - "url": "https://github.com/Yelp/cocoapods-readonly", - "description": "Developers switching from submodules are used to modifying library source files from within Xcode. This locks those files as needed so Xcode warns you when attempting to edit them." - }, - { - "gem": "cocoapods-thumbs", - "name": "CocoaPods Thumbs", - "author": "Pablo Bendersky", - "url": "https://github.com/quadion/cocoapods-thumbs", - "description": "Use cocoapods-thumbs to check upvotes or downvotes of Podspecs from your peers based on past experiences." - }, - { - "gem": "cocoapods-blacklist", - "name": "CocoaPods Blacklist", - "author": "David Grandinetti", - "url": "https://github.com/yahoo/cocoapods-blacklist", - "description": "Check if a project is using a banned version of a pod. Handy for security audits." - }, - { - "gem": "cocoapods-superdeintegrate", - "name": "CocoaPods Superdeintegrate", - "author": "Ash Furrow", - "url": "https://github.com/ashfurrow/cocoapods-superdeintegrate", - "description": "Deletes the CocoaPods cache, your derived data folder, and makes sure that your Pods directory is gone." - }, - { - "gem": "cocoapods-archive", - "name": "CocoaPods Archive", - "author": "fjbelchi, alexito4", - "url": "https://github.com/fjbelchi/cocoapods-archive", - "description": "cocoapods-archive plugin that archive your project" - }, - { - "gem": "cocoapods-check", - "name": "CocoaPods Check", - "author": "Matt Di Iorio", - "url": "https://github.com/square/cocoapods-check", - "description": "Displays differences between locked and installed Pods" - }, - { - "gem": "cocoapods-acknowledgements", - "name": "CocoaPods Acknowledgements", - "author": "Fabio Pelosin, Orta Therox, Marcelo Fabri", - "url": "https://github.com/CocoaPods/cocoapods-acknowledgements", - "description": "CocoaPods plugin that generates an acknowledgements plist to make it easy to create tools to use in apps." - }, - { - "gem": "cocoapods-generator", - "name": "CocoaPods Generator", - "author": "从权", - "url": "https://github.com/zhzhy/cocoapods-generator", - "description": "Add files to empty target from *.podspec, such as souce files, libraries, frameworks, resources and so on." - }, - { - "gem": "cocoapods-debug", - "name": "CocoaPods Debug", - "author": "Samuel Giddins", - "url": "https://github.com/segiddins/cocoapods-debug", - "description": "A simple plugin to ease debugging CocoaPods." - } - ] -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/command/gem_helper_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/command/gem_helper_spec.rb deleted file mode 100644 index 45c4d17..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/command/gem_helper_spec.rb +++ /dev/null @@ -1,40 +0,0 @@ -require File.expand_path('../spec_helper', File.dirname(__FILE__)) - -# The CocoaPods namespace -# -module Pod - describe Command::GemHelper do - before do - UI.output = '' - end - - after do - mocha_teardown - end - - it 'detects if a gem is installed' do - Command::GemHelper.gem_installed?('bacon').should.be.true - Command::GemHelper.gem_installed?('fake-fake-fake-gem').should.be.false - end - - it 'detects if a specific version of a gem is installed' do - Command::GemHelper.gem_installed?('bacon', Bacon::VERSION).should.be.true - impossibacon = Gem::Version.new(Bacon::VERSION).bump - Command::GemHelper.gem_installed?('bacon', impossibacon).should.be.false - end - - it 'creates a version list that includes all versions of a single gem' do - spec2 = Gem::NameTuple.new('cocoapods-plugins', Gem::Version.new('0.2.0')) - spec1 = Gem::NameTuple.new('cocoapods-plugins', Gem::Version.new('0.1.0')) - response = [{ 1 => [spec2, spec1] }, []] - Gem::SpecFetcher.any_instance.stubs(:available_specs).returns(response) - - @cache = Command::GemIndexCache.new - @cache.download_and_cache_specs - versions_string = - Command::GemHelper.versions_string('cocoapods-plugins', @cache) - versions_string.should.include('0.2.0') - versions_string.should.include('0.1.0') - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/command/gem_index_cache_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/command/gem_index_cache_spec.rb deleted file mode 100644 index 34f63ca..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/command/gem_index_cache_spec.rb +++ /dev/null @@ -1,37 +0,0 @@ -require File.expand_path('../spec_helper', File.dirname(__FILE__)) - -# The CocoaPods namespace -# -module Pod - describe Command::GemIndexCache do - before do - @cache = Command::GemIndexCache.new - UI.output = '' - end - - after do - mocha_teardown - end - - it 'notifies the user that it is downloading the spec index' do - response = [{}, []] - Gem::SpecFetcher.any_instance.stubs(:available_specs).returns(response) - - @cache.download_and_cache_specs - UI.output.should.include('Downloading Rubygem specification index...') - UI.output.should.not.include('Error downloading Rubygem specification') - end - - it 'notifies the user when getting the spec index fails' do - error = Gem::RemoteFetcher::FetchError.new('no host', 'bad url') - wrapper_error = stub(:error => error) - response = [[], [wrapper_error]] - Gem::SpecFetcher.any_instance.stubs(:available_specs).returns(response) - - @cache.download_and_cache_specs - @cache.specs.should.be.empty? - UI.output.should.include('Downloading Rubygem specification index...') - UI.output.should.include('Error downloading Rubygem specification') - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/command/plugins/create_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/command/plugins/create_spec.rb deleted file mode 100644 index fa3e7cf..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/command/plugins/create_spec.rb +++ /dev/null @@ -1,89 +0,0 @@ -require File.expand_path('../../../spec_helper', __FILE__) -require 'tmpdir' - -# The CocoaPods namespace -# -module Pod - describe Command::Plugins::Create do - extend SpecHelper::PluginsCreateCommand - - before do - UI.output = '' - end - - it 'registers itself' do - Command.parse(%w(plugins create)). - should.be.instance_of Command::Plugins::Create - end - - #--- Validation - - it 'should require a name is passed in' do - @command = create_command - should.raise(CLAide::Help) do - @command.validate! - end.message.should.match(/A name for the plugin is required./) - end - - it 'should require a non-empty name is passed in' do - @command = create_command('') - should.raise(CLAide::Help) do - @command.validate! - end.message.should.match(/A name for the plugin is required./) - end - - it 'should require the name does not have spaces' do - @command = create_command('my gem') - should.raise(CLAide::Help) do - @command.validate! - end.message.should.match(/The plugin name cannot contain spaces./) - end - - #--- Naming - - it 'should prefix the given name if not already' do - @command = create_command('unprefixed') - Dir.mktmpdir do |tmpdir| - Dir.chdir(tmpdir) do - @command.run - end - end - UI.output.should.include('Creating `cocoapods-unprefixed` plugin') - end - - it 'should not prefix the name if already prefixed' do - @command = create_command('cocoapods-prefixed') - Dir.mktmpdir do |tmpdir| - Dir.chdir(tmpdir) do - @command.run - end - end - UI.output.should.include('Creating `cocoapods-prefixed` plugin') - end - - #--- Template download - - it 'should download the default template repository' do - @command = create_command('cocoapods-banana') - - template_repo = 'https://github.com/CocoaPods/' \ - 'cocoapods-plugin-template.git' - git_command = ['clone', template_repo, 'cocoapods-banana'] - @command.expects(:git!).with(git_command) - @command.expects(:configure_template) - @command.run - UI.output.should.include('Creating `cocoapods-banana` plugin') - end - - it 'should download the passed in template repository' do - alt_repo = 'https://github.com/CocoaPods/' \ - 'cocoapods-banana-plugin-template.git' - @command = create_command('cocoapods-banana', alt_repo) - - @command.expects(:git!).with(['clone', alt_repo, 'cocoapods-banana']) - @command.expects(:configure_template) - @command.run - UI.output.should.include('Creating `cocoapods-banana` plugin') - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/command/plugins/installed_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/command/plugins/installed_spec.rb deleted file mode 100644 index 4f27be1..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/command/plugins/installed_spec.rb +++ /dev/null @@ -1,140 +0,0 @@ -require File.expand_path('../../../spec_helper', __FILE__) - -# The CocoaPods namespace -# -module Pod - describe Command::Plugins::Installed do - extend SpecHelper::PluginsStubs - - def stub_plugins(plugins_and_hooks) - specs = [] - registrations = {} - plugins_and_hooks.each do |(plugin_name, hooks)| - # Load Plugin GemSpec - fixture_path = fixture("#{plugin_name}.gemspec") - specs.push Gem::Specification.load(fixture_path.to_s) - # Fill hook registrations hash - Array(hooks).each do |hook_name| - registrations[hook_name] ||= [] - hook = Pod::HooksManager::Hook.new(hook_name, plugin_name, {}) - registrations[hook_name] << hook - end - end - - Pod::HooksManager.stubs(:registrations).returns(registrations) - CLAide::Command::PluginManager.stubs(:specifications).returns(specs) - end - - before do - UI.output = '' - end - - it 'registers itself' do - Command.parse(%w(plugins installed)). - should.be.instance_of Command::Plugins::Installed - end - - #--- Output printing - - describe 'Compact List' do - before do - @command = Pod::Command::Plugins::Installed.new CLAide::ARGV.new([]) - end - - it 'no hooks' do - stub_plugins('cocoapods-foo1' => nil, 'cocoapods-foo2' => nil) - - @command.run - UI.output.should.include(' - cocoapods-foo1 : 2.0.1') - UI.output.should.include(' - cocoapods-foo2 : 2.0.2') - UI.output.should.not.include('pre_install') - UI.output.should.not.include('post_install') - end - - it 'one hook' do - stub_plugins( - 'cocoapods-foo1' => :pre_install, - 'cocoapods-foo2' => :post_install, - ) - - @command.run - UI.output.should.include(' - cocoapods-foo1 : 2.0.1 ' \ - '(pre_install hook)') - UI.output.should.include(' - cocoapods-foo2 : 2.0.2 ' \ - '(post_install hook)') - end - - it 'two hooks' do - stub_plugins('cocoapods-foo1' => [:pre_install, :post_install]) - - @command.run - UI.output.should.include(' - cocoapods-foo1 : 2.0.1 ' \ - '(pre_install and post_install hooks)') - end - end - - describe 'Verbose List' do - before do - verbose_args = CLAide::ARGV.new(['--verbose']) - @command = Pod::Command::Plugins::Installed.new verbose_args - end - - it 'no hooks' do - stub_plugins('cocoapods-foo1' => nil, 'cocoapods-foo2' => nil) - - @command.run - - UI.output.should.include < :pre_install, - 'cocoapods-foo2' => :post_install, - ) - - @command.run - UI.output.should.include < [:pre_install, :post_install]) - - @command.run - UI.output.should.include < CocoaPods Fake Gem') - UI.output.should.include('-> CocoaPods Searchable Fake Gem') - UI.output.should.not.include('-> Bacon') - end - - it 'should filter plugins by name, author, description with full search' do - stub_plugins_json_request - @command = search_command('--full', 'search') - @command.run - UI.output.should.include('-> CocoaPods Fake Gem') - UI.output.should.include('-> CocoaPods Searchable Fake Gem') - UI.output.should.not.include('-> Bacon') - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/command/plugins_helper_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/command/plugins_helper_spec.rb deleted file mode 100644 index 166fd60..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/command/plugins_helper_spec.rb +++ /dev/null @@ -1,33 +0,0 @@ -require File.expand_path('../spec_helper', File.dirname(__FILE__)) - -# The CocoaPods namespace -# -module Pod - describe Command::PluginsHelper do - extend SpecHelper::PluginsStubs - - it 'downloads the json file' do - stub_plugins_json_request - json = Command::PluginsHelper.download_json - json.should.not.be.nil? - json.should.be.is_a? Hash - json['plugins'].size.should.eql? 3 - end - - it 'handles empty/bad JSON' do - stub_plugins_json_request 'This is not JSON' - expected_error = /Invalid plugins list from cocoapods-plugins/ - should.raise(Pod::Informative) do - Command::PluginsHelper.download_json - end.message.should.match(expected_error) - end - - it 'notifies the user if the download fails' do - stub_plugins_json_request '', [404, 'Not Found'] - expected_error = /Could not download plugins list from cocoapods-plugins/ - should.raise(Pod::Informative) do - Command::PluginsHelper.download_json - end.message.should.match(expected_error) - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/command/plugins_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/command/plugins_spec.rb deleted file mode 100644 index f15b1cd..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/command/plugins_spec.rb +++ /dev/null @@ -1,20 +0,0 @@ -require File.expand_path('../../spec_helper', __FILE__) - -# The CocoaPods namespace -# -module Pod - describe Command::Plugins do - before do - argv = CLAide::ARGV.new([]) - @command = Command::Plugins.new(argv) - end - - it 'registers itself and uses the default subcommand' do - Command.parse(%w(plugins)).should.be.instance_of Command::Plugins::List - end - - it 'exists' do - @command.should.not.be.nil? - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/fixtures/cocoapods-foo1.gemspec b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/fixtures/cocoapods-foo1.gemspec deleted file mode 100644 index 6d27dbc..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/fixtures/cocoapods-foo1.gemspec +++ /dev/null @@ -1,10 +0,0 @@ -# coding: utf-8 -Gem::Specification.new do |spec| - spec.name = 'cocoapods-foo1' - spec.version = '2.0.1' - spec.authors = ['Author 1'] - spec.summary = 'Gem Summary 1' - spec.description = 'Gem Description 1' - spec.homepage = 'https://github.com/proper-man/cocoapods-foo1' - spec.license = 'MIT' -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/fixtures/cocoapods-foo2.gemspec b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/fixtures/cocoapods-foo2.gemspec deleted file mode 100644 index ed0428f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/fixtures/cocoapods-foo2.gemspec +++ /dev/null @@ -1,9 +0,0 @@ -# coding: utf-8 -Gem::Specification.new do |spec| - spec.name = 'cocoapods-foo2' - spec.version = '2.0.2' - spec.authors = ['Author 1', 'Author 2'] - spec.description = 'Gem Description 2' - spec.homepage = 'https://github.com/proper-man/cocoapods-foo2' - spec.license = 'MIT' -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/fixtures/plugins.json b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/fixtures/plugins.json deleted file mode 100644 index ebe0d5c..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/fixtures/plugins.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "plugins":[ - { - "gem":"cocoapods-fake-fake-fake-1", - "name":"CocoaPods Fake Gem", - "url":"https://github.com/CocoaPods/cocoapods-fake-1", - "description":"A Pod that should not exist and should only be found by full search" - }, - { - "gem":"bacon", - "name":"Bacon", - "url":"https://github.com/chneukirchen/bacon", - "description":"A minimal RSpec clone." - }, - { - "gem":"cocoapods-fake-fake-fake-2", - "name":"CocoaPods Searchable Fake Gem", - "url":"https://github.com/CocoaPods/cocoapods-fake-2", - "description":"A Pod that should not exist but should be found with search" - } - ] -} \ No newline at end of file diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/fixtures/unprefixed.gemspec b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/fixtures/unprefixed.gemspec deleted file mode 100644 index abd90e6..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/fixtures/unprefixed.gemspec +++ /dev/null @@ -1,10 +0,0 @@ -# coding: utf-8 -Gem::Specification.new do |spec| - spec.name = 'unprefixed-plugin' - spec.version = '1.2.3' - spec.authors = ['Author 1', 'Author 2'] - spec.summary = 'Gem Summary' - spec.description = 'Gem Description' - spec.homepage = 'https://github.com/messy-man/unprefixed-plugins' - spec.license = 'MIT' -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/spec_helper.rb b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/spec_helper.rb deleted file mode 100644 index 8a3720f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-plugins-1.0.0/spec/spec_helper.rb +++ /dev/null @@ -1,122 +0,0 @@ -# Set up coverage analysis -#-----------------------------------------------------------------------------# - -require 'codeclimate-test-reporter' -CodeClimate::TestReporter.configure do |config| - config.logger.level = Logger::WARN -end -CodeClimate::TestReporter.start - -# Set up -#-----------------------------------------------------------------------------# - -require 'pathname' -ROOT = Pathname.new(File.expand_path('../../', __FILE__)) -$LOAD_PATH.unshift((ROOT + 'lib').to_s) -$LOAD_PATH.unshift((ROOT + 'spec').to_s) - -require 'bundler/setup' -require 'bacon' -require 'mocha-on-bacon' -require 'pretty_bacon' - -require 'webmock' -include WebMock::API - -require 'cocoapods' -require 'cocoapods_plugin' - -# VCR -#--------------------------------------# - -require 'vcr' -VCR.configure do |c| - c.cassette_library_dir = ROOT + 'spec/fixtures/vcr_cassettes' - c.hook_into :webmock - c.ignore_hosts 'codeclimate.com' -end - -#-----------------------------------------------------------------------------# - -# The CocoaPods namespace -# -module Pod - # Disable the wrapping so the output is deterministic in the tests. - # - UI.disable_wrap = true - - # Redirects the messages to an internal store. - # - module UI - @output = '' - @warnings = '' - - class << self - attr_accessor :output - attr_accessor :warnings - - def puts(message = '') - @output << "#{message}\n" - end - - def warn(message = '', _actions = []) - @warnings << "#{message}\n" - end - - def print(message) - @output << message - end - end - end -end - -#-----------------------------------------------------------------------------# - -# Bacon namespace -# -module Bacon - # Add a fixture helper to the Bacon Context - class Context - ROOT = ::ROOT + 'spec/fixtures' - - def fixture(name) - ROOT + name - end - end -end - -#-----------------------------------------------------------------------------# - -# SpecHelper namespace -# -module SpecHelper - # Add this as an extension into the Search and List specs - # to help stub the plugins.json request - module PluginsStubs - def stub_plugins_json_request(json = nil, status = 200) - body = json || File.read(fixture('plugins.json')) - stub_request(:get, Pod::Command::PluginsHelper::PLUGINS_RAW_URL). - to_return(:status => status, :body => body, :headers => {}) - end - end - - # Add this as an extension into the Create specs - module PluginsCreateCommand - def create_command(*args) - Pod::Command::Plugins::Create.new CLAide::ARGV.new(args) - end - end - - # Add this as an extension into the Search specs - module PluginsSearchCommand - def search_command(*args) - Pod::Command::Plugins::Search.new CLAide::ARGV.new(args) - end - end - - module PluginsPublishCommand - def publish_command - Pod::Command::Plugins::Publish.new CLAide::ARGV.new [] - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/.github/workflows/Specs.yml b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/.github/workflows/Specs.yml deleted file mode 100644 index bd3bb06..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/.github/workflows/Specs.yml +++ /dev/null @@ -1,42 +0,0 @@ -name: Specs - -jobs: - specs: - strategy: - matrix: - os: [ubuntu-16.04] - ruby: [2.6, 2.7, 3.0] - - name: ${{ matrix.os }} / Ruby ${{ matrix.ruby }} - runs-on: ${{ matrix.os }} - steps: - - name: Checkout git - uses: actions/checkout@v1 - - - name: Set up Ruby - uses: ruby/setup-ruby@v1 - if: ${{ matrix.ruby != 'system' }} - with: - ruby-version: ${{ matrix.ruby }} - - - name: Update git submodules - run: git submodule update --init --recursive - - - name: Run bundle install - run: | - gem install bundler -v "~> 1.17" - bundle install --jobs 4 --retry 3 --without debugging documentation - - - name: Run Specs - run: bundle exec rake specs - -on: - push: - branches: - - "master" - - "*-stable" - pull_request: - branches: - - master - - "*-stable" - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/.gitignore b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/.gitignore deleted file mode 100644 index 54a36d7..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/.gitignore +++ /dev/null @@ -1,39 +0,0 @@ -*.gem -*.rbc -/.config -/coverage/ -/InstalledFiles -/pkg/ -/spec/reports/ -/test/tmp/ -/test/version_tmp/ -/tmp/ - -## Specific to RubyMotion: -.dat* -.repl_history -build/ - -## Documentation cache and generated files: -/.yardoc/ -/_yardoc/ -/doc/ -/rdoc/ - -## Environment normalisation: -/.bundle/ -/lib/bundler/man/ - -# for a library or gem, you might want to ignore these files since the code is -# intended to run in multiple environments; otherwise, check them in: -# Gemfile.lock -# .ruby-version -# .ruby-gemset - -# unless supporting rvm < 1.11.0 or doing something fancy, ignore this: -.rvmrc - -/coverage/ - -# RubyMine Editor -.idea diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/CHANGELOG.md b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/CHANGELOG.md deleted file mode 100644 index 34b4660..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/CHANGELOG.md +++ /dev/null @@ -1,83 +0,0 @@ -# Cocoapods::Search Changelog - -## 1.0.1 (2021-08-13) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Fix running with `--web`. - [Samuel Giddins](https://github.com/segiddins) - [#25](https://github.com/CocoaPods/cocoapods-search/issues/25) - - -## 1.0.0 (2016-05-10) - -##### Enhancements - -* None. - -##### Bug Fixes - -* None. - - -## 1.0.0.rc.1 (2016-04-30) - -##### Enhancements - -* None. - -##### Bug Fixes - -* None. - - -## 1.0.0.beta.2 (2016-04-14) - -##### Bug Fixes - -* Compatibility with CocoaPods 1.0.0.beta.7. - [Samuel Giddins](https://github.com/segiddins) - - -## 1.0.0.beta.1 (2015-12-30) - -##### Enhancements - -* Perform full search as default, add `--simple` option to search only by - name. - [Muhammed Yavuz Nuzumlalı](https://github.com/manuyavuz) - [#13](https://github.com/CocoaPods/cocoapods-search/issues/13) - -* Add support for tvOS and any possible future platforms. - [Muhammed Yavuz Nuzumlalı](https://github.com/manuyavuz) - [#11](https://github.com/CocoaPods/cocoapods-search/issues/11) - -##### Bug Fixes - -* Print output in reverse order. - [Muhammed Yavuz Nuzumlalı](https://github.com/manuyavuz) - -* Perform regexp escape on individual query words before joining them. - [Muhammed Yavuz Nuzumlalı](https://github.com/manuyavuz) - [#8](https://github.com/CocoaPods/cocoapods-search/issues/8) - - -## 0.1.0 (2015-09-03) - -* Version number must not collide with old gem called cocoapods-search 0.0.7 - - -## 0.0.1 (2015-09-03) - -* Initial implementation. This version is an extraction from [CocoaPods](https://github.com/CocoaPods/CocoaPods). - -Original creators: -[Eloy Durán](https://github.com/alloy) -[Fabio Pelosin](https://github.com/fabiopelosin) - -Extractor: -[Emma Koszinowski](http://github.com/emkosz) diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/Gemfile b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/Gemfile deleted file mode 100644 index 0f7f267..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/Gemfile +++ /dev/null @@ -1,13 +0,0 @@ -source 'https://rubygems.org' - -# Specify your gem's dependencies in cocoapods-search.gemspec -gemspec - -group :development do - gem 'cocoapods', :git => "https://github.com/CocoaPods/CocoaPods.git", :branch => 'master' - gem 'cocoapods-core', :git => "https://github.com/CocoaPods/Core.git", :branch => 'master' - gem 'bacon' - gem 'mocha-on-bacon' - gem 'prettybacon' -end - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/Gemfile.lock b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/Gemfile.lock deleted file mode 100644 index 5db12c3..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/Gemfile.lock +++ /dev/null @@ -1,126 +0,0 @@ -GIT - remote: https://github.com/CocoaPods/CocoaPods.git - revision: 2e285ae6be8aadf0e6319a51626d5176c47e0ede - branch: master - specs: - cocoapods (1.11.0.beta.2) - addressable (~> 2.8) - claide (>= 1.0.2, < 2.0) - cocoapods-core (= 1.11.0.beta.2) - cocoapods-deintegrate (>= 1.0.3, < 2.0) - cocoapods-downloader (>= 1.4.0, < 2.0) - cocoapods-plugins (>= 1.0.0, < 2.0) - cocoapods-search (= 1.0.1) - cocoapods-trunk (>= 1.4.0, < 2.0) - cocoapods-try (>= 1.1.0, < 2.0) - colored2 (~> 3.1) - escape (~> 0.0.4) - fourflusher (>= 2.3.0, < 3.0) - gh_inspector (~> 1.0) - molinillo (~> 0.8.0) - nap (~> 1.0) - ruby-macho (>= 1.0, < 3.0) - xcodeproj (>= 1.21.0, < 2.0) - -GIT - remote: https://github.com/CocoaPods/Core.git - revision: 0a0394afabd9c5f0838fc044e1c817024499dace - branch: master - specs: - cocoapods-core (1.11.0.beta.2) - activesupport (>= 5.0, < 7) - addressable (~> 2.8) - algoliasearch (~> 1.0) - concurrent-ruby (~> 1.1) - fuzzy_match (~> 2.0.4) - nap (~> 1.0) - netrc (~> 0.11) - public_suffix (~> 4.0) - typhoeus (~> 1.0) - -PATH - remote: . - specs: - cocoapods-search (1.0.1) - -GEM - remote: https://rubygems.org/ - specs: - CFPropertyList (3.0.3) - activesupport (6.1.4) - concurrent-ruby (~> 1.0, >= 1.0.2) - i18n (>= 1.6, < 2) - minitest (>= 5.1) - tzinfo (~> 2.0) - zeitwerk (~> 2.3) - addressable (2.8.0) - public_suffix (>= 2.0.2, < 5.0) - algoliasearch (1.27.5) - httpclient (~> 2.8, >= 2.8.3) - json (>= 1.5.1) - atomos (0.1.3) - bacon (1.2.0) - claide (1.0.3) - cocoapods-deintegrate (1.0.4) - cocoapods-downloader (1.4.0) - cocoapods-plugins (1.0.0) - nap - cocoapods-trunk (1.5.0) - nap (>= 0.8, < 2.0) - netrc (~> 0.11) - cocoapods-try (1.2.0) - colored2 (3.1.2) - concurrent-ruby (1.1.9) - escape (0.0.4) - ethon (0.14.0) - ffi (>= 1.15.0) - ffi (1.15.3) - fourflusher (2.3.1) - fuzzy_match (2.0.4) - gh_inspector (1.1.3) - httpclient (2.8.3) - i18n (1.8.10) - concurrent-ruby (~> 1.0) - json (2.5.1) - minitest (5.14.4) - mocha (1.13.0) - mocha-on-bacon (0.2.3) - mocha (>= 0.13.0) - molinillo (0.8.0) - nanaimo (0.3.0) - nap (1.1.0) - netrc (0.11.0) - prettybacon (0.0.2) - bacon (~> 1.2) - public_suffix (4.0.6) - rake (13.0.6) - rexml (3.2.5) - ruby-macho (2.5.1) - typhoeus (1.4.0) - ethon (>= 0.9.0) - tzinfo (2.0.4) - concurrent-ruby (~> 1.0) - xcodeproj (1.21.0) - CFPropertyList (>= 2.3.3, < 4.0) - atomos (~> 0.1.3) - claide (>= 1.0.2, < 2.0) - colored2 (~> 3.1) - nanaimo (~> 0.3.0) - rexml (~> 3.2.4) - zeitwerk (2.4.2) - -PLATFORMS - ruby - -DEPENDENCIES - bacon - bundler (~> 1.3) - cocoapods! - cocoapods-core! - cocoapods-search! - mocha-on-bacon - prettybacon - rake - -BUNDLED WITH - 1.17.3 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/LICENSE.txt b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/LICENSE.txt deleted file mode 100644 index 288b8fe..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -Copyright (c) 2015 Eloy Durán , Fabio Pelosin -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/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/README.md b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/README.md deleted file mode 100644 index 1e8a609..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/README.md +++ /dev/null @@ -1,106 +0,0 @@ -# cocoapods-search - -[![Build Status](https://travis-ci.org/CocoaPods/cocoapods-search.svg)](https://travis-ci.org/CocoaPods/cocoapods-search) - -A CocoaPods plugin that allows you to search multiple pod spec repositories for specific pods matching a query. cocoapods-search is by default included in CocoaPods. - -## Installation - -If you have CocoaPods, you already have cocoapods-search installed by default. If not, you can also install it as a seperate gem as followed. - - $ gem install cocoapods-search - -## Usage - -Search for pods by using the pod search command as followed. - - $ pod search QUERY - -e.g. - - $ pod search networkin - - -> ACSNetworking (0.0.1) - On the basis of AFNetworking encapsulation. - pod 'ACSNetworking', '~> 0.0.1' - - Homepage: https://github.com/Hyosung/ACSNetworking - - Source: https://github.com/Hyosung/ACSNetworking.git - - Versions: 0.0.1 [master repo] - - - -> AFNetworking (2.5.4) - A delightful iOS and OS X networking framework. - pod 'AFNetworking', '~> 2.5.4' - - Homepage: https://github.com/AFNetworking/AFNetworking - - Source: https://github.com/AFNetworking/AFNetworking.git - - Versions: 2.5.4, 2.5.3, 2.5.2, 2.5.1, 2.5.0, 2.4.1, 2.4.0, 2.3.1, 2.3.0, 2.2.4, 2.2.3, 2.2.2, 2.2.1, 2.2.0, 2.1.0, 2.0.3, 2.0.2, 2.0.1, 2.0.0, 2.0.0-RC3, - 2.0.0-RC2, 2.0.0-RC1, 1.3.4, 1.3.3, 1.3.2, 1.3.1, 1.3.0, 1.2.1, 1.2.0, 1.1.0, 1.0.1, 1.0, 1.0RC3, 1.0RC2, 1.0RC1, 0.10.1, 0.10.0, 0.9.2, 0.9.1, 0.9.0, 0.7.0, - 0.5.1 [master repo] - - Subspecs: - - AFNetworking/Serialization (2.5.4) - - AFNetworking/Security (2.5.4) - - AFNetworking/Reachability (2.5.4) - - AFNetworking/NSURLConnection (2.5.4) - - AFNetworking/NSURLSession (2.5.4) - - AFNetworking/UIKit (2.5.4) - - - -> AFNetworking+AutoRetry (0.0.5) - Auto Retries for AFNetworking requests - pod 'AFNetworking+AutoRetry', '~> 0.0.5' - - Homepage: https://github.com/shaioz/AFNetworking-AutoRetry - - Source: https://github.com/shaioz/AFNetworking-AutoRetry.git - - Versions: 0.0.5, 0.0.4, 0.0.3, 0.0.2, 0.0.1 [master repo] - - ... - - -### Options - -You can use the following options with the search command. - -| Flag | Description | -|----------- |-------------| -| `--regex` | Interpret the `QUERY` as a regular expression | -| `--full` | Search by name, summary, and description | -| `--stats` | Show additional stats (like GitHub watchers and forks) | -| `--ios` | Restricts the search to Pods supported on iOS | -| `--osx` | Restricts the search to Pods supported on OS X | -| `--watchos` | Restricts the seach to Pods supported on Watch OS | -| `--web` | Opens a new search on cocoapods.org | - - -e.g. - - $ pod search video --osx - - -> AMCoreAudio (2.0.7) - AMCoreAudio is a Swift wrapper for Apple's CoreAudio framework - pod 'AMCoreAudio', '~> 2.0.7' - - Homepage: https://github.com/rnine/AMCoreAudio - - Source: https://github.com/rnine/AMCoreAudio.git - - Versions: 2.0.7, 2.0.6, 2.0.5, 2.0.4, 2.0.3, 2.0.2, 2.0.1, 2.0, 1.5, 1.4.3, 1.4.2, 1.4.1, 1.4, 1.3.2, 1.3.1, 1.3, 1.2, 1.1, 1.0.1, 1.0 [master repo] - - - -> AppleCoreAudioUtilityClasses@thehtb (2013.09.17) - A git mirror of Apple's Core Audio Utility Classes for better versioning and with clang/llvm fixes. - pod 'AppleCoreAudioUtilityClasses@thehtb', '~> 2013.09.17' - - Homepage: https://github.com/thehtb/AppleCoreAudioUtilityClasses - - Source: https://github.com/thehtb/AppleCoreAudioUtilityClasses.git - - Versions: 2013.09.17, 2013.2.18, 2013.1.2 [master repo] - - Subspecs: - - AppleCoreAudioUtilityClasses@thehtb/PublicUtility (2013.09.17) - - AppleCoreAudioUtilityClasses@thehtb/PublicUtility/CAProcess (2013.09.17) - - AppleCoreAudioUtilityClasses@thehtb/PublicUtility/CAAutoDisposer (2013.09.17) - - AppleCoreAudioUtilityClasses@thehtb/PublicUtility/CABitOperations (2013.09.17) - - AppleCoreAudioUtilityClasses@thehtb/PublicUtility/CASpectralProcessor (2013.09.17) - - - -> AudioKit (2.1.1) - Open-source audio synthesis, processing, & analysis platform. - pod 'AudioKit', '~> 2.1.1' - - Homepage: http://audiokit.io/ - - Source: https://github.com/audiokit/AudioKit.git - - Versions: 2.1.1, 2.0.1, 2.0, 1.3, 1.2-01, 1.2 [master repo] - - ... diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/Rakefile b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/Rakefile deleted file mode 100644 index c34b828..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/Rakefile +++ /dev/null @@ -1,13 +0,0 @@ -require 'bundler/gem_tasks' - -def specs(dir) - FileList["spec/#{dir}/*_spec.rb"].shuffle.join(' ') -end - -desc 'Runs all the specs' -task :specs do - sh "bundle exec bacon #{specs('**')}" -end - -task :default => :specs - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/cocoapods-search.gemspec b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/cocoapods-search.gemspec deleted file mode 100644 index 80d106f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/cocoapods-search.gemspec +++ /dev/null @@ -1,25 +0,0 @@ -# coding: utf-8 -lib = File.expand_path('../lib', __FILE__) -$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) -require 'cocoapods-search/gem_version.rb' - -Gem::Specification.new do |spec| - spec.name = 'cocoapods-search' - spec.version = CocoapodsSearch::VERSION - spec.authors = ['Eloy Durán', 'Fabio Pelosin', 'Emma Koszinowski'] - spec.email = ['eloy.de.enige@gmail.com', 'fabiopelosin@gmail.com', 'emkosz@gmail.com'] - spec.description = %q{Search for pods.} - spec.summary = %q{Searches for pods, ignoring case, whose name matches `QUERY`. If the - `--full` option is specified, this will also search in the summary and - description of the pods.} - spec.homepage = 'https://github.com/CocoaPods/cocoapods-search' - spec.license = 'MIT' - - spec.files = `git ls-files`.split($/) - spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } - spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) - spec.require_paths = ['lib'] - - spec.add_development_dependency 'bundler', '~> 1.3' - spec.add_development_dependency 'rake' -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/command/search_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/command/search_spec.rb deleted file mode 100644 index f3d4334..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/command/search_spec.rb +++ /dev/null @@ -1,148 +0,0 @@ -require File.expand_path('../../spec_helper', __FILE__) - -module Pod - describe Command::Search do - extend SpecHelper::TemporaryRepos - - describe 'Search' do - it 'registers it self' do - Command.parse(%w{ search }).should.be.instance_of Command::Search - end - - it 'runs with correct parameters' do - lambda { run_command('search', 'JSON') }.should.not.raise - lambda { run_command('search', 'JSON', '--simple') }.should.not.raise - end - - it 'complains for wrong parameters' do - lambda { run_command('search') }.should.raise CLAide::Help - lambda { run_command('search', 'too', '--wrong') }.should.raise CLAide::Help - lambda { run_command('search', '--wrong') }.should.raise CLAide::Help - end - - it 'searches for a pod with name matching the given query ignoring case' do - output = run_command('search', 'json', '--simple') - output.should.include? 'JSONKit' - end - - it 'searches for a pod with name, summary, or description matching the given query ignoring case' do - output = run_command('search', 'engelhart') - output.should.include? 'JSONKit' - end - - it 'searches for a pod with name, summary, or description matching the given multi-word query ignoring case' do - output = run_command('search', 'very', 'high', 'performance') - output.should.include? 'JSONKit' - end - - it 'prints search results in order' do - output = run_command('search', 'lib') - output.should.match /BananaLib.*JSONKit/m - end - - it 'restricts the search to Pods supported on iOS' do - output = run_command('search', 'BananaLib', '--ios') - output.should.include? 'BananaLib' - Specification.any_instance.stubs(:available_platforms).returns([Platform.osx]) - output = run_command('search', 'BananaLib', '--ios') - output.should.not.include? 'BananaLib' - end - - it 'restricts the search to Pods supported on OS X' do - output = run_command('search', 'BananaLib', '--osx') - output.should.not.include? 'BananaLib' - end - - it 'restricts the search to Pods supported on Watch OS' do - output = run_command('search', 'a', '--watchos') - output.should.include? 'Realm' - output.should.not.include? 'BananaLib' - end - - it 'restricts the search to Pods supported on tvOS' do - output = run_command('search', 'n', '--tvos') - output.should.include? 'monkey' - output.should.not.include? 'BananaLib' - end - - it 'outputs with the silent parameter' do - output = run_command('search', 'BananaLib', '--silent') - output.should.include? 'BananaLib' - end - - it 'shows a friendly message when locally searching with invalid regex' do - lambda { run_command('search', '--regex', '+') }.should.raise CLAide::Help - end - - it 'does not try to validate the query as a regex with plain-text search' do - lambda { run_command('search', '+') }.should.not.raise CLAide::Help - end - - it 'uses regex search when asked for regex mode' do - output = run_command('search', '--regex', 'Ba(na)+Lib') - output.should.include? 'BananaLib' - output.should.not.include? 'Pod+With+Plus+Signs' - output.should.not.include? 'JSONKit' - end - - it 'uses plain-text search when not asked for regex mode' do - output = run_command('search', 'Pod+With+Plus+Signs') - output.should.include? 'Pod+With+Plus+Signs' - output.should.not.include? 'BananaLib' - end - end - - describe 'option --web' do - extend SpecHelper::TemporaryRepos - - it 'searches with invalid regex' do - Executable.expects(:execute_command).with(:open, ['https://cocoapods.org/?q=NSAttributedString%2BCCLFormat']) - run_command('search', '--web', 'NSAttributedString+CCLFormat') - end - - it 'should url encode search queries' do - Executable.expects(:execute_command).with(:open, ['https://cocoapods.org/?q=NSAttributedString%2BCCLFormat']) - run_command('search', '--web', 'NSAttributedString+CCLFormat') - end - - it 'searches the web via the open! command' do - Executable.expects(:execute_command).with(:open, ['https://cocoapods.org/?q=bananalib']) - run_command('search', '--web', 'bananalib') - end - - it 'includes option --osx correctly' do - Executable.expects(:execute_command).with(:open, ['https://cocoapods.org/?q=on%3Aosx%20bananalib']) - run_command('search', '--web', '--osx', 'bananalib') - end - - it 'includes option --ios correctly' do - Executable.expects(:execute_command).with(:open, ['https://cocoapods.org/?q=on%3Aios%20bananalib']) - run_command('search', '--web', '--ios', 'bananalib') - end - - it 'includes option --watchos correctly' do - Executable.expects(:execute_command).with(:open, ['https://cocoapods.org/?q=on%3Awatchos%20bananalib']) - run_command('search', '--web', '--watchos', 'bananalib') - end - - it 'includes option --tvos correctly' do - Executable.expects(:execute_command).with(:open, ['https://cocoapods.org/?q=on%3Atvos%20bananalib']) - run_command('search', '--web', '--tvos', 'bananalib') - end - - it 'includes any new platform option correctly' do - Platform.stubs(:all).returns([Platform.ios, Platform.tvos, Platform.new('whateveros')]) - Executable.expects(:execute_command).with(:open, ['https://cocoapods.org/?q=on%3Awhateveros%20bananalib']) - run_command('search', '--web', '--whateveros', 'bananalib') - end - - it 'does not matter in which order the ios/osx options are set' do - Executable.expects(:execute_command).with(:open, ['https://cocoapods.org/?q=on%3Aios%20on%3Aosx%20bananalib']) - run_command('search', '--web', '--ios', '--osx', 'bananalib') - - Executable.expects(:execute_command).with(:open, ['https://cocoapods.org/?q=on%3Aios%20on%3Aosx%20bananalib']) - run_command('search', '--web', '--osx', '--ios', 'bananalib') - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/fixtures/spec-repos/test_repo/BananaLib/1.0/BananaLib.podspec b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/fixtures/spec-repos/test_repo/BananaLib/1.0/BananaLib.podspec deleted file mode 100644 index 881ed82..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/fixtures/spec-repos/test_repo/BananaLib/1.0/BananaLib.podspec +++ /dev/null @@ -1,21 +0,0 @@ -Pod::Spec.new do |s| - s.name = 'BananaLib' - s.version = '1.0' - s.authors = 'Banana Corp', { 'Monkey Boy' => 'monkey@banana-corp.local' } - s.homepage = 'http://banana-corp.local/banana-lib.html' - s.summary = 'Chunky bananas!' - s.description = 'Full of chunky bananas.' - s.platform = :ios - - s.source = { :git => 'http://banana-corp.local/banana-lib.git', :tag => 'v1.0' } - s.source_files = 'Classes/*.{h,m}', 'Vendor' - s.xcconfig = { 'OTHER_LDFLAGS' => '-framework SystemConfiguration' } - s.prefix_header_file = 'Classes/BananaLib.pch' - s.resources = "Resources/*.png" - s.dependency 'monkey', '~> 1.0.1', '< 1.0.9' - s.license = { - :type => 'MIT', - :file => 'LICENSE', - :text => 'Permission is hereby granted ...' - } -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/fixtures/spec-repos/test_repo/JSONKit/1.4/JSONKit.podspec b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/fixtures/spec-repos/test_repo/JSONKit/1.4/JSONKit.podspec deleted file mode 100644 index 687fe5b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/fixtures/spec-repos/test_repo/JSONKit/1.4/JSONKit.podspec +++ /dev/null @@ -1,11 +0,0 @@ -Pod::Spec.new do |s| - s.name = 'JSONKit' - s.version = '1.4' - s.license = 'BSD / Apache License, Version 2.0' - s.summary = 'A Very High Performance Objective-C JSON Library.' - s.homepage = 'https://github.com/johnezang/JSONKit' - s.author = 'John Engelhart' - s.source = { :git => 'https://github.com/johnezang/JSONKit.git', :tag => 'v1.4' } - - s.source_files = 'JSONKit.*' -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/fixtures/spec-repos/test_repo/JSONKit/999.999.999/JSONKit.podspec b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/fixtures/spec-repos/test_repo/JSONKit/999.999.999/JSONKit.podspec deleted file mode 100644 index d9f2c9d..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/fixtures/spec-repos/test_repo/JSONKit/999.999.999/JSONKit.podspec +++ /dev/null @@ -1,12 +0,0 @@ -Pod::Spec.new do |s| - s.name = 'JSONKit' - s.version = '999.999.999' - s.license = 'BSD / Apache License, Version 2.0' - s.summary = 'A Very High Performance Objective-C JSON Library.' - s.homepage = 'https://github.com/johnezang/JSONKit' - s.author = 'John Engelhart' - s.source = { :git => 'https://github.com/johnezang/JSONKit.git', :commit => '0aff3deb5e1bb2bbc88a83fd71c8ad5550185cce' } - - s.source_files = 'JSONKit.*' - s.compiler_flags = '-Wno-deprecated-objc-isa-usage', '-Wno-format' -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/fixtures/spec-repos/test_repo/OrangeFramework/0.1.0/OrangeFramework.podspec b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/fixtures/spec-repos/test_repo/OrangeFramework/0.1.0/OrangeFramework.podspec deleted file mode 100644 index ef91e61..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/fixtures/spec-repos/test_repo/OrangeFramework/0.1.0/OrangeFramework.podspec +++ /dev/null @@ -1,16 +0,0 @@ -Pod::Spec.new do |s| - s.name = "OrangeFramework" - s.version = "0.1.0" - s.author = { "Swiftest Orang-Utan" => "swiftest@orang.utan.local" } - s.summary = "Fresh juice!" - s.description = "Blends fresh orange juice." - s.homepage = "http://httpbin.org/html" - s.source = { :git => "http://utan.local/orange-framework.git", :tag => s.version.to_s } - s.license = 'MIT' - - s.platform = :ios, '8.0' - - s.source_files = 'Source/Juicer.swift' - - s.frameworks = 'UIKit' -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/fixtures/spec-repos/test_repo/Pod+With+Plus+Signs/1.0/Pod+With+Plus+Signs.podspec b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/fixtures/spec-repos/test_repo/Pod+With+Plus+Signs/1.0/Pod+With+Plus+Signs.podspec deleted file mode 100644 index 9aa9123..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/fixtures/spec-repos/test_repo/Pod+With+Plus+Signs/1.0/Pod+With+Plus+Signs.podspec +++ /dev/null @@ -1,17 +0,0 @@ -Pod::Spec.new do |s| - s.name = 'Pod+With+Plus+Signs' - s.version = '1.0' - s.authors = 'Evil Corp' - s.homepage = 'http://evil-corp.local/pod_with_plus_signs.html' - s.summary = 'Messing with special chars' - s.description = 'I love messing up with special chars in my pod name! Mouahahahahaa (evil laugh)' - s.platform = :ios - - s.source = { :git => 'http://evil-corp.local/pod_with_plus_signs.git', :tag => '1.0' } - s.source_files = 'Classes/*.{h,m}' - s.license = { - :type => 'MIT', - :file => 'LICENSE', - :text => 'Permission is hereby granted ...' - } -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/fixtures/spec-repos/test_repo/Realm/0.94/Realm.podspec b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/fixtures/spec-repos/test_repo/Realm/0.94/Realm.podspec deleted file mode 100644 index 14f9360..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/fixtures/spec-repos/test_repo/Realm/0.94/Realm.podspec +++ /dev/null @@ -1,18 +0,0 @@ -Pod::Spec.new do |s| - s.name = 'Realm' - s.version = '0.94' - s.authors = 'Realm', { 'Realm' => 'help@realm.io' } - s.homepage = 'https://realm.io/' - s.summary = 'Realm is a modern data framework & database for iOS & OS X.' - s.description = 'The Realm database, for Objective-C. (If you want to use Realm from Swift, see the “RealmSwift” pod.)\n\nRealm is a mobile database: a replacement for Core Data & SQLite. You can use it on iOS & OS X. Realm is not an ORM on top SQLite: instead it uses its own persistence engine, built for simplicity (& speed). Learn more and get help at https://realm.io' - s.platform = :watchos - - s.source = { :git => 'https://github.com/realm/realm-cocoa.git', :tag => 'v0.94.0' } - s.source_files = 'Realm/*.{m,mm}', 'Realm/ObjectStore/*.cpp' - s.xcconfig = { 'CLANG_CXX_LANGUAGE_STANDARD": "compiler-default' => 'OTHER_CPLUSPLUSFLAGS": "-std=c++1y $(inherited)' } - s.prefix_header_file = 'Classes/Realm.pch' - s.license = { - :type => 'Apache 2.0', - :file => 'LICENSE' - } -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/fixtures/spec-repos/test_repo/monkey/1.0.2/monkey.podspec b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/fixtures/spec-repos/test_repo/monkey/1.0.2/monkey.podspec deleted file mode 100644 index 60d4234..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/fixtures/spec-repos/test_repo/monkey/1.0.2/monkey.podspec +++ /dev/null @@ -1,11 +0,0 @@ -Pod::Spec.new do |s| - s.name = "monkey" - s.version = "1.0.2" - s.author = { "Funky Monkey" => "funky@monkey.local" } - s.summary = "🙈🙉🙊" - s.description = "See no evil! Hear no evil! Speak no evil!" - s.homepage = "http://httpbin.org/html" - s.source = { :git => "http://monkey.local/monkey.git", :tag => s.version.to_s } - s.license = 'MIT' - s.vendored_library = 'monkey.a' -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/spec_helper.rb b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/spec_helper.rb deleted file mode 100644 index d10a130..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/spec_helper.rb +++ /dev/null @@ -1,85 +0,0 @@ -require 'pathname' -ROOT = Pathname.new(File.expand_path('../../', __FILE__)) -$:.unshift((ROOT + 'lib').to_s) -$:.unshift((ROOT + 'spec').to_s) - -require 'bundler/setup' -require 'bacon' -require 'mocha-on-bacon' -require 'pretty_bacon' -require 'cocoapods' - -require 'cocoapods_plugin' - -require 'spec_helper/command' # Allows to run Pod commands and returns their output. -require 'spec_helper/fixture' # Provides access to the fixtures and unpacks them if needed. -require 'spec_helper/temporary_repos' # Allows to create and modify temporary spec repositories. -require 'spec_helper/user_interface' # Redirects UI to UI.output & UI.warnings. -require 'spec_helper/pre_flight' # Cleans the temporary directory, the config & the UI.output before every test. - -module Bacon - class Context - include Pod::Config::Mixin - include SpecHelper::Fixture - include SpecHelper::Command - - def skip_xcodebuild? - ENV['SKIP_XCODEBUILD'] - end - - def temporary_directory - SpecHelper.temporary_directory - end - end -end - -#Mocha::Configuration.prevent(:stubbing_non_existent_method) - -module SpecHelper - def self.temporary_directory - ROOT + 'tmp' - end -end - -def temporary_sandbox - Pod::Sandbox.new(temporary_directory + 'Pods') -end - -def fixture_spec(name) - file = SpecHelper::Fixture.fixture(name) - Pod::Specification.from_file(file) -end - -def fixture_file_accessor(spec_or_name, platform = Pod::Platform.ios) - spec = spec_or_name.is_a?(Pod::Specification) ? spec_or_name : fixture_spec(spec_or_name) - path_list = Pod::Sandbox::PathList.new(spec.defined_in_file.dirname) - Pod::Sandbox::FileAccessor.new(path_list, spec.consumer(platform)) -end - -def fixture_target_definition(name = 'Pods', platform = Pod::Platform.ios) - Pod::Podfile::TargetDefinition.new(name, Pod::Podfile.new, 'name' => name, 'platform' => platform) -end - -def fixture_pod_target(spec_or_name, target_definition = nil) - spec = spec_or_name.is_a?(Pod::Specification) ? spec_or_name : fixture_spec(spec_or_name) - target_definition ||= fixture_target_definition - target_definition.store_pod(spec.name) - Pod::PodTarget.new([spec], [target_definition], config.sandbox).tap do |pod_target| - pod_target.file_accessors << fixture_file_accessor(spec, pod_target.platform) - consumer = spec.consumer(pod_target.platform) - pod_target.spec_consumers << consumer - end -end - -def fixture_aggregate_target(pod_targets = [], target_definition = nil) - target_definition ||= pod_targets.flat_map(&:target_definitions).first || fixture_target_definition - target = Pod::AggregateTarget.new(target_definition, config.sandbox) - target.client_root = config.sandbox.root.dirname - target.pod_targets = pod_targets - target -end - -#-----------------------------------------------------------------------------# - -SpecHelper::Fixture.fixture('banana-lib') # ensure it exists -SpecHelper::Fixture.fixture('orange-framework') diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/spec_helper/command.rb b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/spec_helper/command.rb deleted file mode 100644 index 6662114..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/spec_helper/command.rb +++ /dev/null @@ -1,27 +0,0 @@ -module SpecHelper - module Command - def argv(*argv) - CLAide::ARGV.new(argv) - end - - def command(*argv) - argv += ['--no-ansi', '--no-pager'] - Pod::Command.parse(argv) - end - - def run_command(*args) - Dir.chdir(SpecHelper.temporary_directory) do - Pod::UI.output = '' - # @todo Remove this once all cocoapods has - # been converted to use the UI.puts - config_silent = config.silent? - config.silent = false - cmd = command(*args) - cmd.validate! - cmd.run - config.silent = config_silent - Pod::UI.output - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/spec_helper/fixture.rb b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/spec_helper/fixture.rb deleted file mode 100644 index 39704e4..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/spec_helper/fixture.rb +++ /dev/null @@ -1,32 +0,0 @@ -module SpecHelper - def self.fixture(name) - Fixture.fixture(name) - end - - def self.create_sample_app_copy_from_fixture(fixture_name) - fixture_copy_path = temporary_directory + fixture_name - FileUtils.cp_r(fixture(fixture_name), temporary_directory) - fixture_copy_path + "#{fixture_name}.xcodeproj" - end - - def self.test_repo_url - 'https://github.com/CocoaPods/test_repo.git' - - end - - module Fixture - ROOT = ::ROOT + 'spec/fixtures' - - def fixture(name) - file = ROOT + name - unless file.exist? - archive = Pathname.new(file.to_s + '.tar.gz') - if archive.exist? - system "cd '#{archive.dirname}' && tar -zxvf '#{archive}' > /dev/null 2>&1" - end - end - file - end - module_function :fixture - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/spec_helper/pre_flight.rb b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/spec_helper/pre_flight.rb deleted file mode 100644 index ee52b35..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/spec_helper/pre_flight.rb +++ /dev/null @@ -1,36 +0,0 @@ -# Restores the config to the default state before each requirement - -module Bacon - class Context - old_run_requirement = instance_method(:run_requirement) - - - define_method(:run_requirement) do |description, spec| - ::Pod::Config.instance = nil - ::Pod::Config.instance.tap do |c| - c.verbose = false - c.silent = true - c.repos_dir = fixture('spec-repos') - c.installation_root = SpecHelper.temporary_directory - c.cache_root = SpecHelper.temporary_directory + 'Cache' - end - - ::Pod::UI.output = '' - ::Pod::UI.warnings = '' - ::Pod::UI.next_input = '' - # The following prevents a nasty behaviour where the increments are not - # balanced when testing informative which might lead to sections not - # being printed to the output as they are too nested. - ::Pod::UI.indentation_level = 0 - ::Pod::UI.title_level = 0 - - SpecHelper.temporary_directory.rmtree if SpecHelper.temporary_directory.exist? - SpecHelper.temporary_directory.mkpath - - # TODO - #::Pod::SourcesManager.stubs(:search_index_path).returns(temporary_directory + 'search_index.yaml') - - old_run_requirement.bind(self).call(description, spec) - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/spec_helper/temporary_repos.rb b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/spec_helper/temporary_repos.rb deleted file mode 100644 index 2c6f5da..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/spec_helper/temporary_repos.rb +++ /dev/null @@ -1,90 +0,0 @@ -module SpecHelper - def self.tmp_repos_path - TemporaryRepos.tmp_repos_path - end - - module TemporaryRepos - extend Pod::Executable - executable :git - - # @return [Pathname] The path for the repo with the given name. - # - def repo_path(name) - tmp_repos_path + name - end - - # Makes a repo with the given name. - # - def repo_make(name) - path = repo_path(name) - path.mkpath - Dir.chdir(path) do - `git init` - repo_make_readme_change(name, 'Added') - `git add .` - `git commit -m "Initialized."` - end - path - end - - # Clones a repo to the given name. - # - def repo_clone(from_name, to_name) - Dir.chdir(tmp_repos_path) { `git clone #{from_name} #{to_name} 2>&1 > /dev/null` } - repo_path(to_name) - end - - def repo_make_readme_change(name, string) - file = repo_path(name) + 'README' - file.open('w') { |f| f << "#{string}" } - end - - #--------------------------------------# - - def test_repo_path - repo_path('master') - end - - # Sets up a lighweight master repo in `tmp/cocoapods/repos/master` with the - # contents of `spec/fixtures/spec-repos/test_repo`. - # - def set_up_test_repo - require 'fileutils' - test_repo_path.mkpath - origin = ROOT + 'spec/fixtures/spec-repos/test_repo/.' - destination = tmp_repos_path + 'master' - FileUtils.cp_r(origin, destination) - repo_make('master') - end - - def test_old_repo_path - repo_path('../master') - end - - # Sets up a lighweight master repo in `tmp/cocoapods/master` with the - # contents of `spec/fixtures/spec-repos/test_repo`. - # - def set_up_old_test_repo - require 'fileutils' - test_old_repo_path.mkpath - origin = ROOT + 'spec/fixtures/spec-repos/test_repo/.' - destination = tmp_repos_path + '../master' - FileUtils.cp_r(origin, destination) - repo_make('../master') - end - - #--------------------------------------# - - def tmp_repos_path - SpecHelper.temporary_directory + 'cocoapods/repos' - end - - module_function :tmp_repos_path - - def self.extended(base) - base.before do - TemporaryRepos.tmp_repos_path.mkpath - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/spec_helper/user_interface.rb b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/spec_helper/user_interface.rb deleted file mode 100644 index d603a45..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-search-1.0.1/spec/spec_helper/user_interface.rb +++ /dev/null @@ -1,36 +0,0 @@ -module Pod - # Disable the wrapping so the output is deterministic in the tests. - # - UI.disable_wrap = true - - # Redirects the messages to an internal store. - # - module UI - @output = '' - @warnings = '' - @next_input = '' - - class << self - attr_accessor :output - attr_accessor :warnings - attr_accessor :next_input - - def puts(message = '') - @output << "#{message}\n" - end - - def warn(message = '', _actions = []) - @warnings << "#{message}\n" - end - - def print(message) - @output << message - end - - alias_method :gets, :next_input - - def print_warnings - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/.github/workflows/ci.yml b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/.github/workflows/ci.yml deleted file mode 100644 index f73b8e4..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/.github/workflows/ci.yml +++ /dev/null @@ -1,64 +0,0 @@ -name: Specs - -jobs: - specs: - strategy: - fail-fast: false - matrix: - task: [SPECS] - ruby: [2.6, 2.7] - os: [ubuntu-16.04] - include: - - task: SPECS - os: macos-10.15 - ruby: system - - name: ${{ matrix.task }} / ${{ matrix.os }} / Ruby ${{ matrix.ruby }} - runs-on: ${{ matrix.os }} - - steps: - - name: Set build image var - run: echo "ImageVersion=$ImageVersion" >> $GITHUB_ENV - - - name: Checkout git - uses: actions/checkout@v1 - - - name: Set up Ruby - uses: ruby/setup-ruby@v1 - if: ${{ matrix.ruby != 'system' }} - with: - ruby-version: ${{ matrix.ruby }} - - - name: Update git submodules - run: git submodule update --init - - - uses: actions/cache@v2 - with: - path: vendor/bundle - key: gems@v1-${{ matrix.os }}-${{ env.ImageVersion }}-Ruby${{ matrix.ruby }}-${{ hashFiles('Gemfile.lock') }} - restore-keys: | - gems@v1-${{ matrix.os }}-${{ env.ImageVersion }}-Ruby${{ matrix.ruby }}- - - name: Run bundle install - run: | - gem install bundler -v "~> 1.17" - bundle config path vendor/bundle - bundle install --jobs 4 --retry 3 --without debugging documentation - - name: Set up git identity - run: | - git config --global user.email "tests@cocoapods.org" - git config --global user.name "CocoaPods Tests" - - - name: Run Tests - run: bundle exec rake spec - env: - COCOAPODS_CI_TASKS: ${{ matrix.task }} - -on: - push: - branches: - - "master" - - "*-stable" - pull_request: - branches: - - master - - "*-stable" diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/.gitignore b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/.gitignore deleted file mode 100644 index 001d28f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/.gitignore +++ /dev/null @@ -1,17 +0,0 @@ -*.gem -*.rbc -.bundle -.config -.yardoc -InstalledFiles -_yardoc -coverage -doc/ -lib/bundler/man -pkg -rdoc -spec/reports -test/tmp -test/version_tmp -tmp -.idea diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/.kick b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/.kick deleted file mode 100644 index 612ecc6..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/.kick +++ /dev/null @@ -1,29 +0,0 @@ -recipe :ruby - -Kicker::Recipes::Ruby.runner_bin = 'bacon --quiet' - -process do |files| - specs = files.take_and_map do |file| - if file =~ %r{lib/(.+?)\.rb$} - s = Dir.glob("spec/**/#{File.basename(file, '.rb')}_spec.rb") - s.uniq unless s.empty? - end - end - Kicker::Recipes::Ruby.run_tests(specs) -end - -# Have written this so many times, probably should make a recipe out of it. -process do |files| - files.each do |file| - case file - when 'Gemfile' - files.delete(file) - execute 'bundle install' - end - end -end - -recipe :ignore -ignore(/.*\/?tags/) -ignore(/.*\/?\.git/) - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/.rubocop.yml b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/.rubocop.yml deleted file mode 100644 index 227d50d..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/.rubocop.yml +++ /dev/null @@ -1,3 +0,0 @@ -inherit_from: - - .rubocop_todo.yml - - .rubocop_cocoapods.yml diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/.rubocop_cocoapods.yml b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/.rubocop_cocoapods.yml deleted file mode 100644 index ebc2123..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/.rubocop_cocoapods.yml +++ /dev/null @@ -1,138 +0,0 @@ -AllCops: - Include: - - ./Rakefile - - ./Gemfile - - ./*.gemspec - Exclude: - - ./spec/fixtures/**/* - - ./vendor/bundle/**/* - -# At the moment not ready to be used -# https://github.com/bbatsov/rubocop/issues/947 -Documentation: - Enabled: false - -#- CocoaPods -----------------------------------------------------------------# - -# We adopted raise instead of fail. -SignalException: - EnforcedStyle: only_raise - -# They are idiomatic -AssignmentInCondition: - Enabled: false - -# Allow backticks -AsciiComments: - Enabled: false - -# Indentation clarifies logic branches in implementations -IfUnlessModifier: - Enabled: false - -# No enforced convention here. -SingleLineBlockParams: - Enabled: false - -# We only add the comment when needed. -Encoding: - Enabled: false - -# Having these make it easier to *not* forget to add one when adding a new -# value and you can simply copy the previous line. -Style/TrailingCommaInArguments: - EnforcedStyleForMultiline: comma - -Style/TrailingCommaInLiteral: - EnforcedStyleForMultiline: comma - -Style/MultilineOperationIndentation: - EnforcedStyle: indented - -# Clashes with CLAide Command#validate! -GuardClause: - Enabled: false - -# Not always desirable: lib/claide/command/plugins_helper.rb:12:15 -Next: - Enabled: false - -# Autocorrect makes this cop much more useful, taking away needless guessing -Lint/EndAlignment: - AutoCorrect: true - - -# Arbitrary max lengths for classes simply do not work and enabling this will -# lead to a never ending stream of annoyance and changes. -Metrics/ClassLength: - Enabled: false - -# Arbitrary max lengths for modules simply do not work and enabling this will -# lead to a never ending stream of annoyance and changes. -Metrics/ModuleLength: - Enabled: false - -# Arbitrary max lengths for methods simply do not work and enabling this will -# lead to a never ending stream of annoyance and changes. -Metrics/MethodLength: - Enabled: false - -# No enforced convention here. -Metrics/BlockNesting: - Enabled: false - -# It will be obvious which code is complex, Rubocop should only lint simple -# rules for us. -Metrics/AbcSize: - Enabled: false - -# It will be obvious which code is complex, Rubocop should only lint simple -# rules for us. -Metrics/CyclomaticComplexity: - Enabled: false - -# It will be obvious which code is complex, Rubocop should only lint simple -# rules for us. -Metrics/PerceivedComplexity: - Enabled: false - -#- CocoaPods support for Ruby 1.8.7 ------------------------------------------# - -HashSyntax: - EnforcedStyle: hash_rockets - -Lambda: - Enabled: false - -DotPosition: - EnforcedStyle: trailing - -EachWithObject: - Enabled: false - -Style/SpecialGlobalVars: - Enabled: false - -#- CocoaPods specs -----------------------------------------------------------# - -# Allow for `should.match /regexp/`. -AmbiguousRegexpLiteral: - Exclude: - - spec/**/* - -Performance/RedundantMatch: - Exclude: - - spec/**/* - -# Allow `object.should == object` syntax. -Void: - Exclude: - - spec/**/* - -ClassAndModuleChildren: - Exclude: - - spec/**/* - -UselessComparison: - Exclude: - - spec/**/* diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/.rubocop_todo.yml b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/.rubocop_todo.yml deleted file mode 100644 index e8af53d..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/.rubocop_todo.yml +++ /dev/null @@ -1,33 +0,0 @@ -# This configuration was generated by `rubocop --auto-gen-config` -# on 2014-08-20 17:00:42 +0200 using RuboCop version 0.25.0. -# The point is for the user to remove these configuration records -# one by one as the offenses are removed from the code base. -# Note that changes in the inspected code, or installation of new -# versions of RuboCop, may require this file to be generated again. - -# Offense count: 1 -Metrics/CyclomaticComplexity: - Max: 8 - -# Offense count: 9 -# Configuration parameters: AllowURI. -Metrics/LineLength: - Max: 105 - -# Offense count: 7 -# Configuration parameters: CountComments. -Metrics/MethodLength: - Max: 42 - -# Offense count: 1 -Metrics/PerceivedComplexity: - Max: 9 - -# Offense count: 1 -Style/ClassVars: - Enabled: false - -# Offense count: 1 -# Configuration parameters: Keywords. -Style/CommentAnnotation: - Enabled: false diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/CHANGELOG.md b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/CHANGELOG.md deleted file mode 100644 index 3a382bf..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/CHANGELOG.md +++ /dev/null @@ -1,378 +0,0 @@ -## 1.6.0 (2021-09-01) - -##### Enhancements - -* None. - -##### Bug Fixes - -* None. - - -## 1.5.0 (2020-05-01) - -##### Enhancements - -* Add --synchronous option to `pod trunk push`. - [Paul Beusterien](https://github.com/paulb777) - [#147](https://github.com/CocoaPods/cocoapods-trunk/pull/147) - [CocoaPods#9497](https://github.com/CocoaPods/CocoaPods/issues/9497) - -##### Bug Fixes - -* None. - - -## 1.4.1 (2019-09-26) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Use a more robust `Trunk` init when pushing. - [Igor Makarov](https://github.com/igor-makarov) - [#135](https://github.com/CocoaPods/cocoapods-trunk/pull/135) - - -## 1.4.0 (2019-08-21) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Update to get the master spec repo from `Source::Manager` for validation - effectively - use the new CDN `TrunkSource` for podspec validation and not a hard-coded URL - [Igor Makarov](https://github.com/igor-makarov) - [#132](https://github.com/CocoaPods/cocoapods-trunk/pull/132) - [CocoaPods#9112](https://github.com/CocoaPods/CocoaPods/issues/9112) - -## 1.3.1 (2018-08-16) - -##### Enhancements - -* None. - -##### Bug Fixes - -* None. - - -## 1.3.0 (2017-10-02) - -##### Enhancements - -* Add skip test option to trunk push - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#93](https://github.com/CocoaPods/cocoapods-trunk/pull/93) - -* Loosen netrc requirement - [jasl](https://github.com/jasl) - [#93](https://github.com/CocoaPods/cocoapods-trunk/pull/95) - -* Update development dependencies to support MRI 2.3+ - [jasl](https://github.com/jasl) - [#93](https://github.com/CocoaPods/cocoapods-trunk/pull/95) - -##### Bug Fixes - -* None. - - -## 1.2.0 (2017-04-11) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Properly display `pod trunk deprecate` command line options - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#6486](https://github.com/CocoaPods/CocoaPods/issues/6486) - -* Add `--skip-import-validation` to skip linking a pod during lint. - [Dimitris Koutsogiorgas](https://github.com/dnkoutso) - [#86](https://github.com/CocoaPods/cocoapods-trunk/pull/86) - - -## 1.1.2 (2016-12-17) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Checks that `Pod::Validator` has `swift_version=` for CocoaPods <= 1.1.0 support. - [Danielle Tomlinson](https://github.com/dantoml) - [#6209](https://github.com/CocoaPods/CocoaPods/issues/6209) - - -## 1.1.1 (2016-10-20) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Support submitting from multiple versions of CocoaPods. - [Samuel Giddins](https://github.com/segiddins) - -## 1.1.0 (2016-10-19) - -##### Enhancements - -* Passes the pod's version of Swift used for deployment to the CocoaPods Specs repo - [Orta](https://github.com/orta) - [#92](https://github.com/CocoaPods/cocoapods-trunk/pull/72) - -* Prettier success message when successfully pushed a new version - [Marin](https://github.com/icanzilb) - [#76](https://github.com/CocoaPods/cocoapods-trunk/pull/76) - -##### Bug Fixes - -* None. - - -## 1.1.0.beta.1 (2016-10-10) - -##### Enhancements - -* Pass --swift-version to the Validator during `pod lib lint` - [Danielle Tomlinson](https://github.com/dantoml) - [#92](https://github.com/CocoaPods/cocoapods-trunk/pull/72) - -##### Bug Fixes - -* None. - - -## 1.0.0 (2016-05-10) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Don't print the invocation of `/bin/date`. - [Samuel Giddins](https://github.com/segiddins) - - -## 1.0.0.rc.1 (2016-04-30) - -##### Enhancements - -* Make the error loading a specification during `pod trunk push` more - informative. - [Samuel Giddins](https://github.com/segiddins) - [#63](https://github.com/CocoaPods/cocoapods-trunk/issues/63) - -##### Bug Fixes - -* None. - - -## 1.0.0.beta.4 (2016-04-15) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Compatibility With CocoaPods 1.0.0.beta.8. - [Samuel Giddins](https://github.com/segiddins) - [#61](https://github.com/CocoaPods/cocoapods-trunk/issues/61) - - -## 1.0.0.beta.3 (2016-04-14) - -##### Enhancements - -* The failure reason is printed when validation fails during `pod trunk push`. - [Samuel Giddins](https://github.com/segiddins) - [CocoaPods#5073](https://github.com/CocoaPods/CocoaPods/issues/5073) - -##### Bug Fixes - -* None. - - -## 1.0.0.beta.2 (2016-02-03) - -##### Bug Fixes - -* Send a body with the `PATCH` request to deprecate a pod. - [Samuel Giddins](https://github.com/segiddins) - [#52](https://github.com/CocoaPods/cocoapods-trunk/issues/52) - - -## 1.0.0.beta.1 (2015-12-30) - -##### Enhancements - -* The `pod deprecate PODNAME` command has been added to deprecate all versions - of a pod. - [Samuel Giddins](https://github.com/segiddins) - [#31](https://github.com/CocoaPods/cocoapods-trunk/issues/31) - -* The `pod delete PODNAME VERSION` command has been added to delete a single - version of a pod. - [Samuel Giddins](https://github.com/segiddins) - -##### Bug Fixes - -* If the master repo has not been setup when pushing a spec, run `pod setup` - instead of failing. - [Samuel Giddins](https://github.com/segiddins) - [#48](https://github.com/CocoaPods/cocoapods-trunk/issues/48) - - -## 0.6.4 (2015-08-28) - -##### Bug Fixes - -* This release fixes installation compatibility issues when using the RubyGem - due to an incompatible dependency on `nap`. - [Samuel Giddins](https://github.com/segiddins) - - -## 0.6.3 (2015-08-28) - -##### Bug Fixes - -* This release fixes a file permissions error when using the RubyGem. - [Samuel Giddins](https://github.com/segiddins) - - -## 0.6.2 (2015-08-26) - -##### Enhancements - -* The `--allow-warnings` flag to `pod trunk push` is now propagated to the trunk - server. - [Samuel Giddins](https://github.com/segiddins) - [CocoaPods#3855](https://github.com/CocoaPods/CocoaPods/issues/3855) - - -## 0.6.1 (2015-05-27) - -##### Enhancements - -* The `master` specs repo is updated before and after pushing a new spec to - trunk. - [Samuel Giddins](https://github.com/segiddins) - [#43](https://github.com/CocoaPods/cocoapods-trunk/issues/43) - - -## 0.6.0 (2015-03-11) - -##### Enhancements - -* Allow specifying a Trunk token via the `COCOAPODS_TRUNK_TOKEN` environment - variable. - [Samuel Giddins](https://github.com/segiddins) - [CocoaPods#3224](https://github.com/CocoaPods/CocoaPods/issues/3224) - - -## 0.5.1 (2015-02-25) - -##### Enhancements - -* Lint as a framework automatically. If needed, the `--use-libraries` - option allows linting as a static library. - [Boris Bügling](https://github.com/neonichu) - [#2912](https://github.com/CocoaPods/CocoaPods/issues/2912) - -##### Bug Fixes - -* Fix the detection of spec validation errors, and present the proper error - (and messages) to the user. - [Orta Therox](https://github.com/orta) - [#39](https://github.com/CocoaPods/cocoapods-trunk/issues/39) - - -## 0.5.0 (2014-12-25) - -##### Enhancements - -* Added `pod trunk remove-owner` command to remove an owner from a pod. - [Samuel Giddins](https://github.com/segiddins) - [#35](https://github.com/CocoaPods/cocoapods-trunk/issues/35) - -* Added `pod trunk info` command to get information for a pod, including the - owners. - [Kyle Fuller](https://github.com/kylef) - [#15](https://github.com/CocoaPods/cocoapods-trunk/issues/15) - - -## 0.4.1 (2014-11-19) - -##### Enhancements - -* Improved code readability and structure by splitting subcommands - into individual files. - [Olivier Halligon](https://github.com/alisoftware) - [#21](https://github.com/CocoaPods/CocoaPods/issues/21) - -##### Bug Fixes - -* Updates for changes in CocoaPods regarding `--allow-warnings`. - [Kyle Fuller](https://github.com/kylef) - [Cocoapods#2831](https://github.com/CocoaPods/CocoaPods/pull/2831) - - -## 0.4.0 (2014-11-06) - -##### Bug Fixes - -* Fixes installation issues with the JSON dependency. - [Eloy Durán](https://github.com/alloy) - [CocoaPods#2773](https://github.com/CocoaPods/CocoaPods/issues/2773) - -## 0.3.1 (2014-10-15) - -##### Bug Fixes - -* Fixes an issue introduced with the release of `netrc 0.7.8`. - [Samuel Giddins](https://github.com/segiddins) - [CocoaPods#2674](https://github.com/CocoaPods/CocoaPods/issues/2674) - - -## 0.3.0 (2014-10-07) - -##### Enhancements - -* When linting, only allow dependencies from the 'master' specs repository. - [Samuel Giddins](https://github.com/segiddins) - [#28](https://github.com/CocoaPods/cocoapods-trunk/issues/28) - -##### Bug Fixes - -* Fixes an issue where `pod trunk push` doesn't show which validation errors - and just stated it failed. - [Kyle Fuller](https://github.com/kylef) - [#26](https://github.com/CocoaPods/cocoapods-trunk/issues/26) - - -## 0.2.0 (2014-09-11) - -##### Enhancements - -* Network errors are now gracefully handled. - [Samuel E. Giddins](https://github.com/segiddins) - -* Adopted new argument format of CLAide. - [Olivier Halligon](https://github.com/AliSoftware) - - -## 0.1.0 (2014-05-19) - -* Initial release. diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/Gemfile b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/Gemfile deleted file mode 100644 index 0244104..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/Gemfile +++ /dev/null @@ -1,25 +0,0 @@ -source 'https://rubygems.org' - -gemspec - -# This is the version that ships with OS X 10.10, so be sure we test against it. -# At the same time, the 1.7.7 version won't install cleanly on Ruby > 2.2, -# so we use a fork that makes a trivial change to a macro invocation. -gem 'json', :git => 'https://github.com/segiddins/json.git', :branch => 'seg-1.7.7-ruby-2.2' - -group :development do - gem 'cocoapods', :git => "https://github.com/CocoaPods/CocoaPods.git", :branch => 'master' - gem 'cocoapods-core', :git => "https://github.com/CocoaPods/Core.git", :branch => 'master' - gem 'claide', :git => 'https://github.com/CocoaPods/CLAide.git', :branch => 'master' - - gem 'bacon' - gem 'kicker' - gem 'mocha' - gem 'mocha-on-bacon' - gem 'prettybacon' - gem 'webmock' - - gem 'codeclimate-test-reporter', :require => nil - gem 'rubocop' -end - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/Gemfile.lock b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/Gemfile.lock deleted file mode 100644 index 45210fa..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/Gemfile.lock +++ /dev/null @@ -1,190 +0,0 @@ -GIT - remote: https://github.com/CocoaPods/CLAide.git - revision: a5d1a29b08ca88f90f47104805bc4fad2efc93c9 - branch: master - specs: - claide (1.0.3) - -GIT - remote: https://github.com/CocoaPods/CocoaPods.git - revision: 035518e56945778e9916d8118ea5e61ecb96beb0 - branch: master - specs: - cocoapods (1.11.0) - addressable (~> 2.8) - claide (>= 1.0.2, < 2.0) - cocoapods-core (= 1.11.0) - cocoapods-deintegrate (>= 1.0.3, < 2.0) - cocoapods-downloader (>= 1.4.0, < 2.0) - cocoapods-plugins (>= 1.0.0, < 2.0) - cocoapods-search (>= 1.0.0, < 2.0) - cocoapods-trunk (= 1.6.0) - cocoapods-try (>= 1.1.0, < 2.0) - colored2 (~> 3.1) - escape (~> 0.0.4) - fourflusher (>= 2.3.0, < 3.0) - gh_inspector (~> 1.0) - molinillo (~> 0.8.0) - nap (~> 1.0) - ruby-macho (>= 1.0, < 3.0) - xcodeproj (>= 1.21.0, < 2.0) - -GIT - remote: https://github.com/CocoaPods/Core.git - revision: a8e38de9907968d6e627b1465f053c55fc778118 - branch: master - specs: - cocoapods-core (1.11.0) - activesupport (>= 5.0, < 7) - addressable (~> 2.8) - algoliasearch (~> 1.0) - concurrent-ruby (~> 1.1) - fuzzy_match (~> 2.0.4) - nap (~> 1.0) - netrc (~> 0.11) - public_suffix (~> 4.0) - typhoeus (~> 1.0) - -GIT - remote: https://github.com/segiddins/json.git - revision: a9588bc4334c2f5bf985f255b61c05eafdcd8907 - branch: seg-1.7.7-ruby-2.2 - specs: - json (1.7.7) - -PATH - remote: . - specs: - cocoapods-trunk (1.6.0) - nap (>= 0.8, < 2.0) - netrc (~> 0.11) - -GEM - remote: https://rubygems.org/ - specs: - CFPropertyList (3.0.3) - activesupport (6.1.4.1) - concurrent-ruby (~> 1.0, >= 1.0.2) - i18n (>= 1.6, < 2) - minitest (>= 5.1) - tzinfo (~> 2.0) - zeitwerk (~> 2.3) - addressable (2.8.0) - public_suffix (>= 2.0.2, < 5.0) - algoliasearch (1.27.5) - httpclient (~> 2.8, >= 2.8.3) - json (>= 1.5.1) - ast (2.2.0) - atomos (0.1.3) - bacon (1.2.0) - cocoapods-deintegrate (1.0.5) - cocoapods-downloader (1.5.0) - cocoapods-plugins (1.0.0) - nap - cocoapods-search (1.0.1) - cocoapods-try (1.2.0) - codeclimate-test-reporter (0.4.7) - simplecov (>= 0.7.1, < 1.0.0) - colored2 (3.1.2) - concurrent-ruby (1.1.9) - crack (0.4.3) - safe_yaml (~> 1.0.0) - docile (1.1.5) - escape (0.0.4) - ethon (0.14.0) - ffi (>= 1.15.0) - ffi (1.15.3) - fourflusher (2.3.1) - fuzzy_match (2.0.4) - gh_inspector (1.1.3) - hashdiff (0.3.4) - httpclient (2.8.3) - i18n (1.8.10) - concurrent-ruby (~> 1.0) - kicker (3.0.0) - listen (~> 1.3.0) - notify (~> 0.5.2) - listen (1.3.1) - rb-fsevent (>= 0.9.3) - rb-inotify (>= 0.9) - rb-kqueue (>= 0.2) - metaclass (0.0.4) - minitest (5.14.4) - mocha (1.1.0) - metaclass (~> 0.0.1) - mocha-on-bacon (0.2.2) - mocha (>= 0.13.0) - molinillo (0.8.0) - multi_json (1.11.2) - nanaimo (0.3.0) - nap (1.1.0) - netrc (0.11.0) - notify (0.5.2) - parser (2.3.0.7) - ast (~> 2.2) - powerpack (0.1.1) - prettybacon (0.0.2) - bacon (~> 1.2) - public_suffix (4.0.6) - rainbow (2.1.0) - rake (10.4.2) - rb-fsevent (0.9.5) - rb-inotify (0.9.5) - ffi (>= 0.5.0) - rb-kqueue (0.2.4) - ffi (>= 0.5.0) - rexml (3.2.5) - rubocop (0.39.0) - parser (>= 2.3.0.7, < 3.0) - powerpack (~> 0.1) - rainbow (>= 1.99.1, < 3.0) - ruby-progressbar (~> 1.7) - unicode-display_width (~> 1.0, >= 1.0.1) - ruby-macho (2.5.1) - ruby-progressbar (1.7.5) - safe_yaml (1.0.4) - simplecov (0.9.2) - docile (~> 1.1.0) - multi_json (~> 1.0) - simplecov-html (~> 0.9.0) - simplecov-html (0.9.0) - typhoeus (1.4.0) - ethon (>= 0.9.0) - tzinfo (2.0.4) - concurrent-ruby (~> 1.0) - unicode-display_width (1.0.3) - webmock (3.5.1) - addressable (>= 2.3.6) - crack (>= 0.3.2) - hashdiff - xcodeproj (1.21.0) - CFPropertyList (>= 2.3.3, < 4.0) - atomos (~> 0.1.3) - claide (>= 1.0.2, < 2.0) - colored2 (~> 3.1) - nanaimo (~> 0.3.0) - rexml (~> 3.2.4) - zeitwerk (2.4.2) - -PLATFORMS - ruby - -DEPENDENCIES - bacon - bundler (~> 1.3) - claide! - cocoapods! - cocoapods-core! - cocoapods-trunk! - codeclimate-test-reporter - json! - kicker - mocha - mocha-on-bacon - prettybacon - rake (~> 10.0) - rubocop - webmock - -BUNDLED WITH - 1.17.3 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/LICENSE.txt b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/LICENSE.txt deleted file mode 100644 index d011c24..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/LICENSE.txt +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2013 Eloy Durán - -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/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/README.md b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/README.md deleted file mode 100644 index a600242..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/README.md +++ /dev/null @@ -1,35 +0,0 @@ -# CocoaPods::Trunk - -[![Build Status](https://img.shields.io/github/workflow/status/CocoaPods/cocoapods-trunk/Specs)](https://github.com/CocoaPods/cocoapods-trunk/actions) -[![Maintainability](https://api.codeclimate.com/v1/badges/157b8b7f7b73976f3edf/maintainability)](https://codeclimate.com/github/CocoaPods/cocoapods-trunk/maintainability) - -CocoaPods plugin for trunk. - -## Installation - -Add this line to your application's Gemfile: - - gem 'cocoapods-trunk' - -And then execute: - - $ bundle - -Or install it yourself as: - - $ gem install cocoapods-trunk - -## Usage - -With a local install of `trunk.cocoapods.org` up and running: - - $ env TRUNK_SCHEME_AND_HOST=http://localhost:4567 bundle exec pod trunk --help - -## Contributing - -1. Fork it -2. Create your feature branch (`git checkout -b my-new-feature`) -3. Commit your changes (`git commit -am 'Add some feature'`) -4. Push to the branch (`git push origin my-new-feature`) -5. Create new Pull Request - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/Rakefile b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/Rakefile deleted file mode 100644 index 2a8b679..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/Rakefile +++ /dev/null @@ -1,68 +0,0 @@ -# encoding: utf-8 - -#-- Bootstrap --------------------------------------------------------------# - -desc 'Initializes your working copy to run the specs' -task :bootstrap do - if system('which bundle') - title 'Installing gems' - sh 'bundle install' - else - $stderr.puts "\033[0;31m" \ - "[!] Please install the bundler gem manually:\n" \ - ' $ [sudo] gem install bundler' - "\e[0m" - exit 1 - end -end - -begin - require "bundler/gem_tasks" - task :default => :spec - - #-- Specs ------------------------------------------------------------------# - - desc 'Runs all the specs' - task :spec do - title 'Running Unit Tests' - files = FileList['spec/**/*_spec.rb'].shuffle.join(' ') - sh "bundle exec bacon #{files}" - - title 'Checking code style...' - Rake::Task['rubocop'].invoke if RUBY_VERSION >= '1.9.3' - end - - #-- Kick -------------------------------------------------------------------# - - desc 'Automatically run specs for updated files' - task :kick do - exec 'bundle exec kicker -c' - end - - #-- RuboCop ----------------------------------------------------------------# - - if RUBY_VERSION >= '1.9.3' - require 'rubocop/rake_task' - RuboCop::RakeTask.new - end - -rescue LoadError => e - $stderr.puts "\033[0;31m" \ - '[!] Some Rake tasks haven been disabled because the environment' \ - ' couldn’t be loaded. Be sure to run `rake bootstrap` first.' \ - "\e[0m" - $stderr.puts e.message - $stderr.puts e.backtrace - $stderr.puts -end - -#-- Helpers ------------------------------------------------------------------# - -def title(title) - cyan_title = "\033[0;36m#{title}\033[0m" - puts - puts '-' * 80 - puts cyan_title - puts '-' * 80 - puts -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/cocoapods-trunk.gemspec b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/cocoapods-trunk.gemspec deleted file mode 100644 index e4f525f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/cocoapods-trunk.gemspec +++ /dev/null @@ -1,26 +0,0 @@ -# coding: utf-8 -lib = File.expand_path('../lib', __FILE__) -$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) -require 'cocoapods_trunk' - -Gem::Specification.new do |spec| - spec.name = "cocoapods-trunk" - spec.version = CocoaPodsTrunk::VERSION - spec.authors = ["Eloy Durán"] - spec.email = ["eloy.de.enige@gmail.com"] - spec.summary = "Interact with trunk.cocoapods.org" - spec.homepage = "https://github.com/CocoaPods/cocoapods-trunk" - spec.license = "MIT" - - spec.files = `git ls-files`.split($/) - spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } - spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) - spec.require_paths = ["lib"] - - spec.add_dependency 'nap', '>= 0.8', '< 2.0' - spec.add_dependency 'netrc', '~> 0.11' - spec.add_development_dependency "bundler", "~> 1.3" - spec.add_development_dependency "rake", '~> 10.0' - - spec.required_ruby_version = '>= 2.0.0' -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/command/trunk/addowner_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/command/trunk/addowner_spec.rb deleted file mode 100644 index 2600ada..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/command/trunk/addowner_spec.rb +++ /dev/null @@ -1,52 +0,0 @@ -require File.expand_path('../../../spec_helper', __FILE__) - -module Pod - describe Command::Trunk::AddOwner do - describe 'CLAide' do - it 'registers it self' do - Command.parse(%w( trunk add-owner )).should.be.instance_of Command::Trunk::AddOwner - end - end - - describe 'validation' do - it "should error if we don't have a token" do - Netrc.any_instance.stubs(:[]).returns(nil) - command = Command.parse(%w( trunk push )) - exception = lambda { command.validate! }.should.raise CLAide::Help - exception.message.should.include 'register a session' - end - - it 'should error if pod name is not supplied' do - command = Command.parse(%w( trunk add-owner )) - command.stubs(:token).returns('token') - exception = lambda { command.validate! }.should.raise CLAide::Help - exception.message.should.include 'pod name' - end - - it 'should error if new owners email is not supplied' do - command = Command.parse(%w( trunk add-owner QueryKit )) - command.stubs(:token).returns('token') - exception = lambda { command.validate! }.should.raise CLAide::Help - exception.message.should.include 'email' - end - - it 'should should validate with valid pod and email' do - command = Command.parse(%w( trunk add-owner QueryKit kyle@cocoapods.org )) - command.stubs(:token).returns('token') - lambda { command.validate! }.should.not.raise CLAide::Help - end - end - - it 'should successfully add an owner' do - url = 'https://trunk.cocoapods.org/api/v1/pods/QueryKit/owners' - stub_request(:patch, url). - with(:body => '{"email":"kyle@cocoapods.org"}', - :headers => { 'Authorization' => 'Token 527d11fe429f3426cb8dbeba183a0d80' }). - to_return(:status => 200, :body => '[]', :headers => {}) - - command = Command.parse(%w( trunk add-owner QueryKit kyle@cocoapods.org )) - command.stubs(:token).returns('527d11fe429f3426cb8dbeba183a0d80') - lambda { command.run }.should.not.raise - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/command/trunk/delete_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/command/trunk/delete_spec.rb deleted file mode 100644 index 7538773..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/command/trunk/delete_spec.rb +++ /dev/null @@ -1,69 +0,0 @@ -require File.expand_path('../../../spec_helper', __FILE__) -require 'tmpdir' - -module Pod - describe Command::Trunk::Delete do - describe 'CLAide' do - it 'registers it self' do - Command.parse(%w( trunk delete )).should.be.instance_of Command::Trunk::Delete - end - end - - it 'should error without a pod name' do - command = Command.parse(%w( trunk delete )) - lambda { command.validate! }.should.raise CLAide::Help - end - - it 'should error without a version' do - command = Command.parse(%w( trunk delete Stencil )) - lambda { command.validate! }.should.raise CLAide::Help - end - - it 'confirms deletion' do - Colored2.disable! - UI.inputs += %w(garbage true false) - command = Command.parse(%w( trunk delete Stencil 1.0.0 )) - command.send(:confirm_deletion?).should.be.true - command.send(:confirm_deletion?).should.be.false - - UI.output.should == <<-OUTPUT.gsub(/^>$/, '> ') -WARNING: It is generally considered bad behavior to remove versions of a Pod that others are depending on! -Please consider using the `deprecate` command instead. -Are you sure you want to delete this Pod version? -> -Are you sure you want to delete this Pod version? -> -WARNING: It is generally considered bad behavior to remove versions of a Pod that others are depending on! -Please consider using the `deprecate` command instead. -Are you sure you want to delete this Pod version? -> - OUTPUT - end - - it 'does not delete if the user does not confirm' do - Command::Trunk::Delete.any_instance.expects(:confirm_deletion?).returns(false) - Command::Trunk::Delete.any_instance.expects(:delete).never - Command::Trunk::Delete.invoke(%w(Stencil 1.0.0)) - end - - it 'should show information for a pod' do - response = { - 'messages' => [ - { - '2015-12-05 02:00:25 UTC' => 'Push for `Stencil 1.0.0` initiated.', - }, - { - '2015-12-05 02:00:26 UTC' => 'Push for `Stencil 1.0.0` has been pushed (1.02409270 s).', - }, - ], - 'data_url' => 'https://raw.githubusercontent.com/CocoaPods/Specs/ce4efe9f986d297008e8c61010a4b0d5881c50d0/Specs/Stencil/1.0.0/Stencil.podspec.json', - } - Command::Trunk::Delete.any_instance.expects(:delete).returns(response) - UI.inputs << 'TRUE ' - Command::Trunk::Delete.invoke(%w(Stencil 1.0.0)) - - UI.output.should.include 'Data URL: https://raw.githubusercontent' - UI.output.should.include 'Push for `Stencil 1.0.0` initiated' - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/command/trunk/deprecate_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/command/trunk/deprecate_spec.rb deleted file mode 100644 index 7f43498..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/command/trunk/deprecate_spec.rb +++ /dev/null @@ -1,58 +0,0 @@ -require File.expand_path('../../../spec_helper', __FILE__) -require 'tmpdir' - -module Pod - describe Command::Trunk::Deprecate do - describe 'CLAide' do - it 'registers it self' do - Command.parse(%w( trunk deprecate )).should.be.instance_of Command::Trunk::Deprecate - end - end - - it 'should error without a pod name' do - command = Command.parse(%w( trunk deprecate )) - lambda { command.validate! }.should.raise CLAide::Help - end - - before do - @push_response = { - 'messages' => [ - { - '2015-12-05 02:00:25 UTC' => 'Push for `Stencil 0.96.3` initiated.', - }, - { - '2015-12-05 02:00:26 UTC' => 'Push for `Stencil 0.96.3` has been pushed (1.02409270 s).', - }, - ], - 'data_url' => 'https://raw.githubusercontent.com/CocoaPods/Specs/ce4efe9f986d297008e8c61010a4b0d5881c50d0/Specs/Stencil/0.96.3/Stencil.podspec.json', - } - end - - it 'should show information for a pod' do - Command::Trunk::Deprecate.any_instance.expects(:deprecate).returns(@push_response) - Command::Trunk::Deprecate.invoke(%w(Stencil)) - - UI.output.should.include 'Data URL: https://raw.githubusercontent' - UI.output.should.include 'Push for `Stencil 0.96.3` initiated' - end - - it 'should send the proper network request' do - redirect = 'http://redirected.com' - stub_request(:patch, 'https://trunk.cocoapods.org/api/v1/pods/Stencil/deprecated'). - with(:body => hash_including('in_favor_of' => 'Stamp')). - to_return(:status => 201, :headers => { :location => redirect }) - - stub_request(:get, redirect). - to_return(:status => 200, :body => @push_response.to_json) - - Command::Trunk::Deprecate.invoke(%w(Stencil --in-favor-of=Stamp)) - - UI.output.should == <<-EOS - - Data URL: https://raw.githubusercontent.com/CocoaPods/Specs/ce4efe9f986d297008e8c61010a4b0d5881c50d0/Specs/Stencil/0.96.3/Stencil.podspec.json -- Log messages: - - December 5th, 2015 02:00: Push for `Stencil 0.96.3` initiated. - - December 5th, 2015 02:00: Push for `Stencil 0.96.3` has been pushed (1.02409270 s). - EOS - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/command/trunk/info_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/command/trunk/info_spec.rb deleted file mode 100644 index 1ff1a38..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/command/trunk/info_spec.rb +++ /dev/null @@ -1,36 +0,0 @@ -require File.expand_path('../../../spec_helper', __FILE__) -require 'tmpdir' - -module Pod - describe Command::Trunk::Info do - describe 'CLAide' do - it 'registers it self' do - Command.parse(%w( trunk info )).should.be.instance_of Command::Trunk::Info - end - end - - it 'should error without a pod name' do - command = Command.parse(%w( trunk info )) - lambda { command.validate! }.should.raise CLAide::Help - end - - it 'should show information for a pod' do - url = 'https://trunk.cocoapods.org/api/v1/pods/Stencil' - stub_request(:get, url).to_return(:body => { - 'owners' => [ - { - 'name' => 'Kyle Fuller', - 'email' => 'kyle@example.com', - }, - ], - }.to_json) - - command = Command.parse(%w( trunk info Stencil )) - lambda { command.validate! }.should.not.raise CLAide::Help - command.run - - UI.output.should.include 'Owners' - UI.output.should.include 'Kyle Fuller ' - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/command/trunk/me_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/command/trunk/me_spec.rb deleted file mode 100644 index 585bb38..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/command/trunk/me_spec.rb +++ /dev/null @@ -1,17 +0,0 @@ -require File.expand_path('../../../spec_helper', __FILE__) - -module Pod - describe Command::Trunk::Me do - describe 'CLAide' do - it 'registers it self' do - Command.parse(%w( trunk me )).should.be.instance_of Command::Trunk::Me - end - end - - it "should error if we don't have a token" do - Netrc.any_instance.stubs(:[]).returns(nil) - command = Command.parse(%w( trunk me )) - lambda { command.validate! }.should.raise CLAide::Help - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/command/trunk/push_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/command/trunk/push_spec.rb deleted file mode 100644 index c6c62bc..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/command/trunk/push_spec.rb +++ /dev/null @@ -1,332 +0,0 @@ -require File.expand_path('../../../spec_helper', __FILE__) -require 'tmpdir' - -module Pod - describe Command::Trunk::Push do - def success_json - { - 'messages' => [ - { - '2015-12-05 02:00:25 UTC' => "Push for `BananaLib 0.96.3' initiated.", - }, - { - '2015-12-05 02:00:26 UTC' => "Push for `BananaLib 0.96.3' has been pushed (1.02409270 s).", - }, - ], - 'data_url' => 'https://raw.githubusercontent.com/CocoaPods/Specs/ce4efe9f986d297008e8c61010a4b0d5881c50d0/Specs/BananaLib/0.96.3/BananaLib.podspec.json', - } - end - - before do - Command::Trunk::Push.any_instance.stubs(:update_master_repo) - end - - describe 'CLAide' do - it 'registers it self' do - Command.parse(%w( trunk push )).should.be.instance_of Command::Trunk::Push - end - end - - it "should error if we don't have a token" do - Netrc.any_instance.stubs(:[]).returns(nil) - command = Command.parse(%w( trunk push )) - exception = lambda { command.validate! }.should.raise CLAide::Help - exception.message.should.include 'register a session' - end - - it 'should error when the trunk service returns an error' do - url = 'https://trunk.cocoapods.org/api/v1/pods?allow_warnings=false' - stub_request(:post, url).to_return(:status => 422, :body => { - 'error' => 'The Pod Specification did not pass validation.', - 'data' => { - 'warnings' => [ - 'A value for `requires_arc` should be specified until the migration to a `true` default.', - ], - }, - }.to_json) - command = Command.parse(%w(trunk push)) - command.stubs(:validate_podspec) - command.stubs(:spec).returns(Pod::Specification.new) - exception = lambda { command.run }.should.raise Informative - exception.message.should.include 'following validation failed' - exception.message.should.include 'should be specified' - exception.message.should.include 'The Pod Specification did not pass validation' - end - - describe 'PATH' do - before do - UI.output = '' - end - it 'defaults to the current directory' do - # Disable the podspec finding algorithm so we can check the raw path - Command::Trunk::Push.any_instance.stubs(:find_podspec_file) { |path| path } - command = Command.parse(%w( trunk push )) - command.instance_eval { @path }.should == '.' - end - - def found_podspec_among_files(files) - # Create a temp directory with the dummy `files` in it - Dir.mktmpdir do |dir| - files.each do |filename| - path = Pathname(dir) + filename - File.open(path, 'w') {} - end - # Execute `pod trunk push` with this dir as parameter - command = Command.parse(%w( trunk push ) + [dir]) - path = command.instance_eval { @path } - return File.basename(path) if path - end - end - - it 'should find the only JSON podspec in a given directory' do - files = %w(foo bar.podspec.json baz) - found_podspec_among_files(files).should == files[1] - end - - it 'should find the only Ruby podspec in a given directory' do - files = %w(foo bar.podspec baz) - found_podspec_among_files(files).should == files[1] - end - - it 'should warn when no podspec found in a given directory' do - files = %w(foo bar baz) - found_podspec_among_files(files).should.nil? - UI.output.should.match /No podspec found in directory/ - end - - it 'should warn when multiple podspecs found in a given directory' do - files = %w(foo bar.podspec bar.podspec.json baz) - found_podspec_among_files(files).should.nil? - UI.output.should.match /Multiple podspec files in directory/ - end - end - - describe 'validation' do - before do - Installer.any_instance.stubs(:aggregate_targets).returns([]) - Installer.any_instance.stubs(:pod_targets).returns([]) - - Validator.any_instance.stubs(:check_file_patterns) - Validator.any_instance.stubs(:validate_url) - Validator.any_instance.stubs(:validate_screenshots) - Validator.any_instance.stubs(:xcodebuild).returns('') - Validator.any_instance.stubs(:install_pod) - Validator.any_instance.stubs(:build_pod) - Validator.any_instance.stubs(:add_app_project_import) - Validator.any_instance.stubs(:used_swift_version).returns(nil) - %i(prepare resolve_dependencies download_dependencies write_lockfiles).each do |m| - Installer.any_instance.stubs(m) - end - Command::Trunk::Push.any_instance.stubs(:master_repo_url). - returns(Pod::TrunkSource::TRUNK_REPO_URL) - end - - it 'passes the SWIFT_VERSION to the Validator' do - Validator.any_instance.expects(:swift_version=).with('3.0') - - cmd = Command.parse(%w(trunk push spec/fixtures/BananaLib.podspec --swift-version=3.0)) - cmd.send(:validate_podspec) - end - - it 'passes a swift version back to command, to handle .swift-version files' do - Validator.any_instance.stubs(:dot_swift_version).returns('1.2.3') - Validator.any_instance.stubs(:used_swift_version).returns('1.2.3') - - cmd = Command.parse(%w(trunk push spec/fixtures/BananaLib.podspec --allow-warnings)) - cmd.send(:validate_podspec) - cmd.instance_variable_get(:@swift_version).should == '1.2.3' - end - - it 'validates specs as frameworks by default' do - Validator.any_instance.expects(:podfile_from_spec). - with(:ios, '8.0', true, [], nil, nil).once.returns(Podfile.new) - Validator.any_instance.expects(:podfile_from_spec). - with(:osx, nil, true, [], nil, nil).once.returns(Podfile.new) - Validator.any_instance.expects(:podfile_from_spec). - with(:tvos, nil, true, [], nil, nil).once.returns(Podfile.new) - Validator.any_instance.expects(:podfile_from_spec). - with(:watchos, nil, true, [], nil, nil).once.returns(Podfile.new) - - cmd = Command.parse(%w(trunk push spec/fixtures/BananaLib.podspec)) - cmd.send(:validate_podspec) - end - - it 'validates specs as libraries if requested' do - Validator.any_instance.expects(:podfile_from_spec). - with(:ios, nil, false, [], nil, nil).once.returns(Podfile.new) - Validator.any_instance.expects(:podfile_from_spec). - with(:osx, nil, false, [], nil, nil).once.returns(Podfile.new) - Validator.any_instance.expects(:podfile_from_spec). - with(:tvos, nil, false, [], nil, nil).once.returns(Podfile.new) - Validator.any_instance.expects(:podfile_from_spec). - with(:watchos, nil, false, [], nil, nil).once.returns(Podfile.new) - - cmd = Command.parse(%w(trunk push spec/fixtures/BananaLib.podspec --use-libraries)) - cmd.send(:validate_podspec) - end - - it 'prints the failure reason' do - Validator.any_instance.expects(:validated?).returns(false) - Validator.any_instance.expects(:validate) - Validator.any_instance.expects(:failure_reason).returns('failure_reason') - - cmd = Command.parse(%w(trunk push spec/fixtures/BananaLib.podspec --use-libraries)) - e = should.raise(Informative) { cmd.send(:validate_podspec) } - e.message.should.include 'The spec did not pass validation, due to failure_reason.' - end - - it 'passes skip import validation' do - Validator.any_instance.expects(:skip_import_validation=).with(true) - cmd = Command.parse(%w(trunk push spec/fixtures/BananaLib.podspec --skip-import-validation)) - cmd.send(:validate_podspec) - end - - it 'passes skip test' do - Validator.any_instance.expects(:skip_tests=).with(true) - cmd = Command.parse(%w(trunk push spec/fixtures/BananaLib.podspec --skip-tests)) - cmd.send(:validate_podspec) - end - - it 'passes use modular headers' do - Validator.any_instance.expects(:use_modular_headers=) - - cmd = Command.parse(%w(trunk push spec/fixtures/BananaLib.podspec --use-modular-headers)) - cmd.send(:validate_podspec) - end - end - - describe 'sending the swift version up to trunk' do - before do - # This won't get called - Command::Trunk::Push.any_instance.unstub(:update_master_repo) - # For faking the networking when sending - Pod::Command::Trunk.any_instance.expects(:json).returns({}) - Pod::Command::Trunk.any_instance.expects(:auth_headers).returns({}) - end - - it 'passes the value to trunk' do - # Fakes for the network response - response = mock - response.expects(:headers).returns('location' => ['http://theinternet.com']) - response.expects(:status_code).returns(200) - - cmd = Command.parse(%w(trunk push spec/fixtures/BananaLib.podspec --swift-version=1.1.2)) - - # Using a blank podspec - JSON should include `"pushed_with_swift_version":"1.1.2"` - cmd.stubs(:spec).returns(Pod::Specification.new) - - json = <<-JSON -{"name":null,"pushed_with_swift_version":"1.1.2","platforms":{"osx":null,"ios":null,"tvos":null,"watchos":null}} - JSON - - cmd.stubs(:validate_podspec) - cmd.stubs(:request_url) - - api_route = 'pods?allow_warnings=false' - cmd.expects(:request_path).with(:post, api_route, json, {}).returns(response) - cmd.send(:push_to_trunk) - end - end - - describe 'updating the master repo' do - before do - @cmd = Command.parse(%w(trunk push spec/fixtures/BananaLib.podspec)) - @cmd.stubs(:validate_podspec) - @cmd.stubs(:push_to_trunk).returns([200, success_json]) - Command::Trunk::Push.any_instance.unstub(:update_master_repo) - Command::Trunk::Push.any_instance.stubs(:master_repo_name). - returns(Pod::TrunkSource::TRUNK_REPO_NAME) - end - - it 'updates the master repo when it exists' do - Config.instance.sources_manager.stubs(:source_with_url). - at_most(2). - returns(Pod::TrunkSource.new(Pod::TrunkSource::TRUNK_REPO_NAME)) - - Config.instance.sources_manager.expects(:update).with(Pod::TrunkSource::TRUNK_REPO_NAME).twice - Command::Repo::AddCDN.any_instance.expects(:run).never - - @cmd.run - end - - it 'sets up the master repo when it does not exist' do - Config.instance.sources_manager.stubs(:source_with_url). - at_most(3). - returns(nil). - returns(Pod::TrunkSource.new(Pod::TrunkSource::TRUNK_REPO_NAME)) - Config.instance.sources_manager.expects(:update).with(Pod::TrunkSource::TRUNK_REPO_NAME).twice - Command::Repo::AddCDN.any_instance.expects(:run) - - @cmd.run - end - end - - describe 'synchronous updating the git repo' do - before do - @cmd = Command.parse(%w(trunk push spec/fixtures/BananaLib.podspec --synchronous)) - @cmd.stubs(:validate_podspec) - @cmd.stubs(:push_to_trunk).returns([200, success_json]) - Command::Trunk::Push.any_instance.unstub(:update_master_repo) - Command::Trunk::Push.any_instance.stubs(:master_repo_name).returns('master') - end - - it 'updates the git repo when it exists' do - Config.instance.sources_manager.stubs(:source_with_url). - at_most(2). - returns(Pod::TrunkSource.new('master')) - - Config.instance.sources_manager.expects(:update).with('master').twice - Command::Repo::AddCDN.any_instance.expects(:run).never - - @cmd.run - end - - it 'sets up the git repo when it does not exist' do - Config.instance.sources_manager.stubs(:source_with_url). - at_most(3). - returns(nil). - returns(Pod::TrunkSource.new('master')) - Config.instance.sources_manager.stubs(:cdn_url?).returns(false) - Config.instance.sources_manager.stubs(:create_source_with_url).once. - returns(Pod::TrunkSource.new('master')) - Config.instance.sources_manager.expects(:update).with('master').twice - - @cmd.run - end - end - - describe 'Presenting Responses to the user' do - before do - Command::Trunk::Push.any_instance.stubs(:update_master_repo) - Config.instance.sources_manager.stubs(:master_repo_functional?).returns(true) - end - - it 'shows full logs when verbose' do - cmd = Command.parse(%w(trunk push spec/fixtures/BananaLib.podspec --verbose)) - cmd.stubs(:validate_podspec) - cmd.stubs(:push_to_trunk).returns([200, success_json]) - - cmd.run - UI.output.should.match %r{- Data URL: https://raw.githubusercontent.com/CocoaPods/Specs} - end - - it 'shows full logs when errored' do - cmd = Command.parse(%w(trunk push spec/fixtures/BananaLib.podspec --verbose)) - cmd.stubs(:validate_podspec) - cmd.stubs(:push_to_trunk).returns([400, success_json]) - - cmd.run - UI.output.should.match %r{- Data URL: https://raw.githubusercontent.com/CocoaPods/Specs} - end - - it 'shows thanks emojis when success' do - cmd = Command.parse(%w(trunk push spec/fixtures/BananaLib.podspec)) - cmd.stubs(:validate_podspec) - cmd.stubs(:push_to_trunk).returns([200, success_json]) - cmd.run - - UI.output.should.match %r{https://cocoapods.org/pods/BananaLib} - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/command/trunk/register_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/command/trunk/register_spec.rb deleted file mode 100644 index 7bc316a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/command/trunk/register_spec.rb +++ /dev/null @@ -1,31 +0,0 @@ -require File.expand_path('../../../spec_helper', __FILE__) - -module Pod - describe Command::Trunk::Register do - describe 'CLAide' do - it 'registers it self' do - Command.parse(%w( trunk register )).should.be.instance_of Command::Trunk::Register - end - end - - it 'should error if email is not supplied' do - Netrc.any_instance.stubs(:[]).returns(nil) - command = Command.parse(%w( trunk register )) - exception = lambda { command.validate! }.should.raise CLAide::Help - exception.message.should.include 'email address' - end - - it 'should register user' do - url = 'https://trunk.cocoapods.org/api/v1/sessions' - stub_request(:post, url). - with(:body => hash_including('email' => 'kyle@cocoapods.org')). - to_return(:status => 200, :body => '{"token": "acct"}') - Netrc.any_instance.stubs(:[]).returns(nil) - Netrc.any_instance.expects(:[]=).with('trunk.cocoapods.org', ['kyle@cocoapods.org', 'acct']) - Netrc.any_instance.expects(:save) - - command = Command.parse(%w( trunk register kyle@cocoapods.org )) - lambda { command.run }.should.not.raise - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/command/trunk/remove_owner_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/command/trunk/remove_owner_spec.rb deleted file mode 100644 index bed408f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/command/trunk/remove_owner_spec.rb +++ /dev/null @@ -1,51 +0,0 @@ -require File.expand_path('../../../spec_helper', __FILE__) - -module Pod - describe Command::Trunk::RemoveOwner do - describe 'CLAide' do - it 'registers itself' do - Command.parse(%w( trunk remove-owner )).should.be.instance_of Command::Trunk::RemoveOwner - end - end - - describe 'validation' do - it "should error if we don't have a token" do - Netrc.any_instance.stubs(:[]).returns(nil) - command = Command.parse(%w( trunk remove-owner )) - exception = lambda { command.validate! }.should.raise CLAide::Help - exception.message.should.include 'register a session' - end - - it 'should error if pod name is not supplied' do - command = Command.parse(%w( trunk remove-owner )) - command.stubs(:token).returns('token') - exception = lambda { command.validate! }.should.raise CLAide::Help - exception.message.should.include 'pod name' - end - - it 'should error if new owners email is not supplied' do - command = Command.parse(%w( trunk remove-owner QueryKit )) - command.stubs(:token).returns('token') - exception = lambda { command.validate! }.should.raise CLAide::Help - exception.message.should.include 'email' - end - - it 'should should validate with valid pod and email' do - command = Command.parse(%w( trunk remove-owner QueryKit kyle@cocoapods.org )) - command.stubs(:token).returns('token') - lambda { command.validate! }.should.not.raise CLAide::Help - end - end - - it 'should successfully remove an owner' do - url = 'https://trunk.cocoapods.org/api/v1/pods/QueryKit/owners/kyle@cocoapods.org' - stub_request(:delete, url). - with(:headers => { 'Authorization' => 'Token 527d11fe429f3426cb8dbeba183a0d80' }). - to_return(:status => 200, :body => '[]', :headers => {}) - - command = Command.parse(%w( trunk remove-owner QueryKit kyle@cocoapods.org )) - command.stubs(:token).returns('527d11fe429f3426cb8dbeba183a0d80') - lambda { command.run }.should.not.raise - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/command/trunk_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/command/trunk_spec.rb deleted file mode 100644 index e062461..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/command/trunk_spec.rb +++ /dev/null @@ -1,23 +0,0 @@ -require File.expand_path('../../spec_helper', __FILE__) - -module Pod - describe Command::Trunk do - describe 'CLAide' do - it 'registers it self' do - Command.parse(%w( trunk )).should.be.instance_of Command::Trunk - end - end - - before do - @command = Command.parse(%w(trunk)) - end - - describe 'authorization' do - it 'will use the trunk token from ENV if present' do - ENV.stubs(:[]).with('COCOAPODS_TRUNK_TOKEN').returns('token') - - @command.send(:token).should == 'token' - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/fixtures/BananaLib.podspec b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/fixtures/BananaLib.podspec deleted file mode 100644 index b9f98d4..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/fixtures/BananaLib.podspec +++ /dev/null @@ -1,25 +0,0 @@ -Pod::Spec.new do |s| - s.name = 'BananaLib' - s.version = '1.0' - s.authors = 'Banana Corp', { 'Monkey Boy' => 'monkey@banana-corp.local' } - s.homepage = 'http://banana-corp.local/banana-lib.html' - s.summary = 'Chunky bananas!' - s.description = 'Full of chunky bananas.' - s.source = { :git => 'http://banana-corp.local/banana-lib.git', :tag => 'v1.0' } - s.license = { - :type => 'MIT', - :file => 'LICENSE', - :text => 'Permission is hereby granted ...' - } - s.source_files = 'Classes/*.{h,m,d}', 'Vendor' - s.resources = "Resources/*" - s.vendored_framework = 'Bananalib.framework' - s.vendored_library = 'libBananalib.a' - s.preserve_paths = 'preserve_me.txt' - s.public_header_files = 'Classes/Banana.h' - - s.prefix_header_file = 'Classes/BananaLib.pch' - s.xcconfig = { 'OTHER_LDFLAGS' => '-framework SystemConfiguration' } - s.dependency 'monkey', '~> 1.0.1', '< 1.0.9' - -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/spec_helper.rb b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/spec_helper.rb deleted file mode 100644 index 3ca19a5..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-trunk-1.6.0/spec/spec_helper.rb +++ /dev/null @@ -1,97 +0,0 @@ -# Set up coverage analysis -#-----------------------------------------------------------------------------# - -if RUBY_VERSION >= '1.9.3' - require 'codeclimate-test-reporter' - CodeClimate::TestReporter.configure do |config| - config.logger.level = Logger::WARN - end - CodeClimate::TestReporter.start -end - -# Set up -#-----------------------------------------------------------------------------# - -require 'pathname' -ROOT = Pathname.new(File.expand_path('../../', __FILE__)) -$:.unshift((ROOT + 'lib').to_s) -$:.unshift((ROOT + 'spec').to_s) - -require 'bundler/setup' -require 'bacon' -require 'mocha-on-bacon' -require 'pretty_bacon' -require 'webmock' - -include WebMock::API -WebMock.enable! -WebMock.disable_net_connect!(:allow => ['codeclimate.com', 'cdn.cocoapods.org']) - -require 'cocoapods' - -require 'cocoapods_plugin' - -# Helpers -#-----------------------------------------------------------------------------# - -module Pod - # Disable the wrapping so the output is deterministic in the tests. - # - UI.disable_wrap = true - - # Redirects the messages to an internal store. - # - module UI - @output = '' - @warnings = '' - - class << self - attr_accessor :output - attr_accessor :warnings - attr_accessor :inputs - - def gets - inputs.shift - end - - def puts(message = '') - @output << "#{message}\n" - end - - def warn(message = '', _actions = []) - @warnings << "#{message}\n" - end - - def print(message) - @output << message - end - end - end - - class Command::Trunk - def time_zone - 'UTC' - end - end -end - -module Bacon - class Context - old_run_requirement = instance_method(:run_requirement) - define_method(:run_requirement) do |description, spec| - ::Pod::Config.instance = nil - ::Pod::UI.output = '' - ::Pod::UI.warnings = '' - ::Pod::UI.inputs = [] - # The following prevents a nasty behaviour where the increments are not - # balanced when testing informative which might lead to sections not - # being printed to the output as they are too nested. - ::Pod::UI.indentation_level = 0 - ::Pod::UI.title_level = 0 - - WebMock.reset! - - old_run_requirement.bind(self).call(description, spec) - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/.gitignore b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/.gitignore deleted file mode 100644 index 001d28f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/.gitignore +++ /dev/null @@ -1,17 +0,0 @@ -*.gem -*.rbc -.bundle -.config -.yardoc -InstalledFiles -_yardoc -coverage -doc/ -lib/bundler/man -pkg -rdoc -spec/reports -test/tmp -test/version_tmp -tmp -.idea diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/.rubocop.yml b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/.rubocop.yml deleted file mode 100644 index e3dc640..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/.rubocop.yml +++ /dev/null @@ -1,3 +0,0 @@ -inherit_from: - - .rubocop_todo.yml - - .rubocop_cocoapods.yml diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/.rubocop_cocoapods.yml b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/.rubocop_cocoapods.yml deleted file mode 100644 index 93f03f5..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/.rubocop_cocoapods.yml +++ /dev/null @@ -1,129 +0,0 @@ -AllCops: - Include: - - ./Rakefile - - ./Gemfile - - ./*.gemspec - Exclude: - - ./spec/fixtures/**/* - - ./vendor/bundle/**/* - -# At the moment not ready to be used -# https://github.com/bbatsov/rubocop/issues/947 -Style/Documentation: - Enabled: false - -#- CocoaPods -----------------------------------------------------------------# - -# We adopted raise instead of fail. -Style/SignalException: - EnforcedStyle: only_raise - -# They are idiomatic -Lint/AssignmentInCondition: - Enabled: false - -# Allow backticks -Style/AsciiComments: - Enabled: false - -# Indentation clarifies logic branches in implementations -Style/IfUnlessModifier: - Enabled: false - -# No enforced convention here. -Style/SingleLineBlockParams: - Enabled: false - -# We only add the comment when needed. -Style/Encoding: - Enabled: false - -# Having these make it easier to *not* forget to add one when adding a new -# value and you can simply copy the previous line. -Style/TrailingCommaInLiteral: - EnforcedStyleForMultiline: comma - -Layout/MultilineOperationIndentation: - EnforcedStyle: indented - -Style/PercentLiteralDelimiters: - PreferredDelimiters: - default: '()' - '%w': '()' - -# Clashes with CLAide Command#validate! -Style/GuardClause: - Enabled: false - -# Not always desirable -Style/Next: - Enabled: false - -# Arbitrary max lengths for classes simply do not work and enabling this will -# lead to a never ending stream of annoyance and changes. -Metrics/ClassLength: - Enabled: false - -# Arbitrary max lengths for modules simply do not work and enabling this will -# lead to a never ending stream of annoyance and changes. -Metrics/ModuleLength: - Enabled: false - -# Arbitrary max lengths for methods simply do not work and enabling this will -# lead to a never ending stream of annoyance and changes. -Metrics/MethodLength: - Enabled: false - -# No enforced convention here. -Metrics/BlockNesting: - Enabled: false - -# It will be obvious which code is complex, Rubocop should only lint simple -# rules for us. -Metrics/AbcSize: - Enabled: false - -# It will be obvious which code is complex, Rubocop should only lint simple -# rules for us. -Metrics/CyclomaticComplexity: - Enabled: false - -Style/HashSyntax: - EnforcedStyle: hash_rockets - -Style/Lambda: - Enabled: true - -Layout/DotPosition: - EnforcedStyle: trailing - -Style/EachWithObject: - Enabled: true - -Performance/HashEachMethods: - Enabled: true - -#- CocoaPods specs -----------------------------------------------------------# - -# Allow for `should.match /regexp/`. -Lint/AmbiguousRegexpLiteral: - Exclude: - - spec/**/* - -# Allow `object.should == object` syntax. -Lint/Void: - Exclude: - - spec/**/* - -Style/ClassAndModuleChildren: - Exclude: - - spec/**/* - -Lint/UselessComparison: - Exclude: - - spec/**/* - -Metrics/BlockLength: - Exclude: - - spec/**/* - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/.rubocop_todo.yml b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/.rubocop_todo.yml deleted file mode 100644 index a5288bf..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/.rubocop_todo.yml +++ /dev/null @@ -1,72 +0,0 @@ -# This configuration was generated by -# `rubocop --auto-gen-config` -# on 2020-04-16 22:06:47 -0700 using RuboCop version 0.50.0. -# The point is for the user to remove these configuration records -# one by one as the offenses are removed from the code base. -# Note that changes in the inspected code, or installation of new -# versions of RuboCop, may require this file to be generated again. - -# Offense count: 1 -# Cop supports --auto-correct. -Layout/EmptyLineAfterMagicComment: - Exclude: - - 'cocoapods-try.gemspec' - -# Offense count: 2 -# Configuration parameters: ContextCreatingMethods, MethodCreatingMethods. -Lint/UselessAccessModifier: - Exclude: - - 'lib/pod/command/try.rb' - -# Offense count: 37 -# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns. -# URISchemes: http, https -Metrics/LineLength: - Max: 108 - -# Offense count: 3 -# Configuration parameters: ExpectMatchingDefinition, Regex, IgnoreExecutableScripts, AllowedAcronyms. -# AllowedAcronyms: CLI, DSL, ACL, API, ASCII, CPU, CSS, DNS, EOF, GUID, HTML, HTTP, HTTPS, ID, IP, JSON, LHS, QPS, RAM, RHS, RPC, SLA, SMTP, SQL, SSH, TCP, TLS, TTL, UDP, UI, UID, UUID, URI, URL, UTF8, VM, XML, XMPP, XSRF, XSS -Naming/FileName: - Exclude: - - 'Gemfile' - - 'Rakefile' - - 'cocoapods-try.gemspec' - -# Offense count: 1 -# Cop supports --auto-correct. -# Configuration parameters: AutoCorrect, EnforcedStyle, SupportedStyles. -# SupportedStyles: predicate, comparison -Style/NumericPredicate: - Exclude: - - 'spec/**/*' - - 'lib/pod/command/try.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -# Configuration parameters: PreferredDelimiters. -Style/PercentLiteralDelimiters: - Exclude: - - 'cocoapods-try.gemspec' - -# Offense count: 1 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles. -# SupportedStyles: use_perl_names, use_english_names -Style/SpecialGlobalVars: - Exclude: - - 'cocoapods-try.gemspec' - -# Offense count: 8 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles, ConsistentQuotesInMultiline. -# SupportedStyles: single_quotes, double_quotes -Style/StringLiterals: - Exclude: - - 'cocoapods-try.gemspec' - -# Offense count: 1 -# Cop supports --auto-correct. -Style/UnneededPercentQ: - Exclude: - - 'cocoapods-try.gemspec' diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/.travis.yml b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/.travis.yml deleted file mode 100644 index 49cb2c4..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/.travis.yml +++ /dev/null @@ -1,34 +0,0 @@ -# Sets Travis to run the Ruby specs on OS X machines to be as close as possible -# to the user environment. -# -language: ruby - -dist: trusty - -branches: - only: - - master - - /.+-stable$/ - -matrix: - include: - - rvm: 2.4.1 - -rvm: - - 2.0.0-p647 - - 2.3.4 - - 2.4.1 - - 2.6.2 - -before_install: - # There is a bug in travis. When using system ruby, bundler is not - # installed and causes the default install action to fail. - - if [ "$TRAVIS_RUBY_VERSION" = "system" ]; then sudo gem install "bundler:~> 1.17"; else gem install "bundler:~> 1.17"; fi - # RubyGems 2.0.14 isn't a fun time on 2.0.0p648 - - if [ "$TRAVIS_RUBY_VERSION" = "system" ]; then sudo gem update --system; fi - -install: - - bundle install --path .bundle - - bundle exec pod repo add-cdn trunk 'https://cdn.cocoapods.org' - -script: bundle exec rake spec diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/CHANGELOG.md b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/CHANGELOG.md deleted file mode 100644 index 7068a50..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/CHANGELOG.md +++ /dev/null @@ -1,204 +0,0 @@ -# CocoaPods::Try CHANGELOG - -## 1.2.0 (2020-04-20) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Fix a crash when using `pod try` with CocoaPods 1.8.0 or higher. - [@arielpollack](https://github.com/arielpollack) - [#63](https://github.com/CocoaPods/cocoapods-try/issues/63) - [#65](https://github.com/CocoaPods/cocoapods-try/pull/65) - - -## 1.1.0 (2016-07-10) - -##### Enhancements - -* Added a command line option for specifying the podspec file from Git URL - [@rockwotj](https://github.com/rockwotj) - [59](https://github.com/CocoaPods/CocoaPods-try/issues/59) - -##### Bug Fixes - -* None. - - -## 1.0.0 (2016-05-10) - -##### Enhancements - -* None. - -##### Bug Fixes - -* None. - - -## 1.0.0.rc.1 (2016-04-30) - -##### Enhancements - -* None. - -##### Bug Fixes - -* None. - - -## 1.0.0.beta.4 (2016-04-15) - -##### Enhancements - -* None. - -##### Bug Fixes - -* Compatibility With CocoaPods 1.0.0.beta.8. - [Samuel Giddins](https://github.com/segiddins) - [CocoaPods#5159](https://github.com/CocoaPods/CocoaPods/issues/5159) - - -## 1.0.0.beta.3 (2016-03-15) - -##### Bug Fixes - -* Compatibility with CocoaPods 1.0.0.beta.6. - [Marius Rackwitz](https://github.com/mrackwitz) - - -## 1.0.0.beta.2 (2016-01-05) - -##### Bug Fixes - -* Ensure that the pod's source is re-downloaded, instead of pulling from the - cache, which only holds cleaned sources. - [Samuel Giddins](https://github.com/segiddins) - [#43](https://github.com/CocoaPods/cocoapods-try/issues/43) - - -## 1.0.0.beta.1 (2015-12-30) - -##### Bug Fixes - -* Ensure commands in the `.cocoapods` file are strings, and uses the pods folder when executing commands. - [Samuel Giddins](https://github.com/segiddins) - [CocoaPods-Try#40](https://github.com/CocoaPods/cocoapods-try/issues/40) - - -## 0.5.1 (2015-08-28) - -##### Bug Fixes - -* This release fixes a file permissions error when using the RubyGem. - [Samuel Giddins](https://github.com/segiddins) - - -## 0.5.0 (2015-08-26) - -##### Enhancements - -* Any CocoaPod / GitHub repo can now declare their own pre-install commands, and prefer a - project. To use this, add a `.cocoapods.yml` file to the root of your repo. The yaml file - should have a structure like: - - ``` yaml - try: - install: - pre: - - pod install - - git submodule init - project: 'ORStackView.xcworkspace' - ``` - - [Orta Therox](https://github.com/orta) - [#33](https://github.com/CocoaPods/cocoapods-try/issues/33) - - -## 0.4.5 (2015-05-27) - -##### Bug Fixes - -* Use `Dir.tmpdir` instead of explicit `/tmp`. - [Boris Bügling](https://github.com/neonichu) - [#34](https://github.com/CocoaPods/cocoapods-try/pull/34) - -* Automatically detect JSON podspecs. - [Samuel Giddins](https://github.com/segiddins) - [#35](https://github.com/CocoaPods/cocoapods-try/issues/35) - - -## 0.4.4 (2015-05-06) - -##### Bug Fixes - -* Fix working with the CocoaPods download cache introduced in 0.37. - [Samuel Giddins](https://github.com/) - [#30](https://github.com/CocoaPods/cocoapods-try/issues/30) - - -## 0.4.3 (2014-12-25) - -##### Bug Fixes - -* Ensure that the master repo is setup on try. - [Daniel Tomlinson](https://github.com/DanielTomlinson) - [CocoaPods/CocoaPods#2563](https://github.com/CocoaPods/CocoaPods/pull/2563) - -## 0.4.2 (2014-10-29) - -* Prefer projects or workspaces with the name including Sample over others. - [Kyle Fuller](https://github.com/kylef) - -## 0.4.1 (2014-09-26) - -* Add `--no-repo-update` option. - [Eloy Durán](https://github.com/alloy) - -## 0.4.0 (2014-09-11) - -### Enhancements - -* Adopted new argument format of CLAide. - [Olivier Halligon](https://github.com/AliSoftware) - -## 0.3.0 (2014-05-19) - -### Enhancements - -* Adopted new CLAide release. - [Fabio Pelosin](https://github.com/irrationalfab) - -## 0.2.0 (2014-03-28) - -### Enhancements - -* Added support for the specification of an URL instead of the name of a Pod. - [David Grandinetti](https://github.com/dbgrandi) - [Fabio Pelosin](https://github.com/irrationalfab) - -## 0.1.2 - -### Enhancements - -* Prefer workspaces over projects. - [Kyle Fuller](https://github.com/kylef) - -* Open workspaces if available. - [Kyle Fuller](https://github.com/kylef) - -### Fixes - -* Don't consider workspaces in bundles. - [Eloy Durán](https://github.com/alloy) - -* Typo fixes. - [Mark Townsend](https://github.com/markltownsend) - -## 0.1.0 (2013-12-02) - -* Initial implementation. - [Fabio Pelosin](https://github.com/fabiopelosin) diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/Gemfile b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/Gemfile deleted file mode 100644 index 8a73433..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/Gemfile +++ /dev/null @@ -1,16 +0,0 @@ -source 'https://rubygems.org' - -gemspec - -group :development do - gem 'claide', :git => 'https://github.com/CocoaPods/CLAide.git', :branch => 'master' - gem 'cocoapods', :git => 'https://github.com/CocoaPods/CocoaPods.git', :branch => 'master' - gem 'cocoapods-core', :git => 'https://github.com/CocoaPods/Core.git', :branch => 'master' - - gem 'bacon' - gem 'mocha' - gem 'mocha-on-bacon' - gem 'prettybacon' - - gem 'rubocop', '0.50.0' -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/Gemfile.lock b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/Gemfile.lock deleted file mode 100644 index 0cc12aa..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/Gemfile.lock +++ /dev/null @@ -1,148 +0,0 @@ -GIT - remote: https://github.com/CocoaPods/CLAide.git - revision: b5ced9cc141df732e8027078543eb92fc6447567 - branch: master - specs: - claide (1.0.3) - -GIT - remote: https://github.com/CocoaPods/CocoaPods.git - revision: c75c4a6dd226c45e0ad876caa926bff51a3f00d9 - branch: master - specs: - cocoapods (1.9.1) - activesupport (>= 4.0.2, < 5) - claide (>= 1.0.2, < 2.0) - cocoapods-core (= 1.9.1) - cocoapods-deintegrate (>= 1.0.3, < 2.0) - cocoapods-downloader (>= 1.2.2, < 2.0) - cocoapods-plugins (>= 1.0.0, < 2.0) - cocoapods-search (>= 1.0.0, < 2.0) - cocoapods-trunk (>= 1.4.0, < 2.0) - cocoapods-try (= 1.2.0) - colored2 (~> 3.1) - escape (~> 0.0.4) - fourflusher (>= 2.3.0, < 3.0) - gh_inspector (~> 1.0) - molinillo (~> 0.6.6) - nap (~> 1.0) - ruby-macho (~> 1.4) - xcodeproj (>= 1.14.0, < 2.0) - -GIT - remote: https://github.com/CocoaPods/Core.git - revision: 8923c0cdca68d4bc7126cd64106a5fc1e9217ced - branch: master - specs: - cocoapods-core (1.9.1) - activesupport (>= 4.0.2, < 6) - addressable (~> 2.6) - algoliasearch (~> 1.0) - concurrent-ruby (~> 1.1) - fuzzy_match (~> 2.0.4) - nap (~> 1.0) - netrc (~> 0.11) - public_suffix (~> 2.0) - typhoeus (~> 1.0) - -PATH - remote: . - specs: - cocoapods-try (1.2.0) - -GEM - remote: https://rubygems.org/ - specs: - CFPropertyList (3.0.2) - activesupport (4.2.11.1) - i18n (~> 0.7) - minitest (~> 5.1) - thread_safe (~> 0.3, >= 0.3.4) - tzinfo (~> 1.1) - addressable (2.7.0) - public_suffix (>= 2.0.2, < 5.0) - algoliasearch (1.27.1) - httpclient (~> 2.8, >= 2.8.3) - json (>= 1.5.1) - ast (2.4.0) - atomos (0.1.3) - bacon (1.2.0) - cocoapods-deintegrate (1.0.4) - cocoapods-downloader (1.3.0) - cocoapods-plugins (1.0.0) - nap - cocoapods-search (1.0.0) - cocoapods-trunk (1.4.1) - nap (>= 0.8, < 2.0) - netrc (~> 0.11) - colored2 (3.1.2) - concurrent-ruby (1.1.6) - escape (0.0.4) - ethon (0.12.0) - ffi (>= 1.3.0) - ffi (1.12.2) - fourflusher (2.3.1) - fuzzy_match (2.0.4) - gh_inspector (1.1.3) - httpclient (2.8.3) - i18n (0.9.5) - concurrent-ruby (~> 1.0) - json (2.3.0) - minitest (5.8.4) - mocha (1.11.2) - mocha-on-bacon (0.2.3) - mocha (>= 0.13.0) - molinillo (0.6.6) - nanaimo (0.2.6) - nap (1.1.0) - netrc (0.11.0) - parallel (1.10.0) - parser (2.7.1.1) - ast (~> 2.4.0) - powerpack (0.1.2) - prettybacon (0.0.2) - bacon (~> 1.2) - public_suffix (2.0.5) - rainbow (2.2.2) - rake - rake (10.5.0) - rubocop (0.50.0) - parallel (~> 1.10) - parser (>= 2.3.3.1, < 3.0) - powerpack (~> 0.1) - rainbow (>= 2.2.2, < 3.0) - ruby-progressbar (~> 1.7) - unicode-display_width (~> 1.0, >= 1.0.1) - ruby-macho (1.4.0) - ruby-progressbar (1.10.1) - thread_safe (0.3.6) - typhoeus (1.3.1) - ethon (>= 0.9.0) - tzinfo (1.2.7) - thread_safe (~> 0.1) - unicode-display_width (1.7.0) - xcodeproj (1.16.0) - CFPropertyList (>= 2.3.3, < 4.0) - atomos (~> 0.1.3) - claide (>= 1.0.2, < 2.0) - colored2 (~> 3.1) - nanaimo (~> 0.2.6) - -PLATFORMS - ruby - -DEPENDENCIES - bacon - bundler (~> 1.3) - claide! - cocoapods! - cocoapods-core! - cocoapods-try! - mocha - mocha-on-bacon - prettybacon - rake (~> 10.0) - rubocop (= 0.50.0) - -BUNDLED WITH - 1.17.2 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/LICENSE b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/LICENSE deleted file mode 100644 index c000bf0..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2013 Fabio Pelosin - -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/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/README.md b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/README.md deleted file mode 100644 index b61acde..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# Cocoapods try - -[![Build Status](https://img.shields.io/travis/CocoaPods/cocoapods-try/master.svg?style=flat)](https://travis-ci.org/CocoaPods/cocoapods-try) - -CocoaPods plugin which allows to quickly try the demo project of a Pod. - -![](http://i.imgur.com/xxWNUrg.gif) - -## Usage - - $ pod try POD_NAME - -## Installation - - $ gem install cocoapods-try - - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/Rakefile b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/Rakefile deleted file mode 100644 index 9f8fa94..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/Rakefile +++ /dev/null @@ -1,54 +0,0 @@ -# Bootstrap -#-----------------------------------------------------------------------------# - -task :bootstrap, :use_bundle_dir? do |_t, args| - if system('which bundle') - if args[:use_bundle_dir?] - sh 'bundle install --path ./travis_bundle_dir' - else - sh 'bundle install' - end - else - $stderr.puts "\033[0;31m" \ - "[!] Please install the bundler gem manually:\n" \ - ' $ [sudo] gem install bundler' \ - "\e[0m" - exit 1 - end -end - -begin - require 'bundler/gem_tasks' - - task :default => 'spec' - - # Spec - #-----------------------------------------------------------------------------# - - desc 'Runs all the specs' - task :spec do - puts "\033[0;32mUsing #{`ruby --version`}\033[0m" - start_time = Time.now - sh "bundle exec bacon #{specs('**')}" - duration = Time.now - start_time - puts "Tests completed in #{duration}s" - - Rake::Task['rubocop'].invoke if RUBY_VERSION >= '1.9.3' - end - - def specs(dir) - FileList["spec/#{dir}/*_spec.rb"].shuffle.join(' ') - end - - #-- Rubocop ----------------------------------------------------------------# - - if RUBY_VERSION >= '1.9.3' - require 'rubocop/rake_task' - RuboCop::RakeTask.new - end -rescue LoadError - $stderr.puts "\033[0;31m" \ - '[!] Some Rake tasks haven been disabled because the environment' \ - ' couldn’t be loaded. Be sure to run `rake bootstrap` first.' \ - "\e[0m" -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/cocoapods-try.gemspec b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/cocoapods-try.gemspec deleted file mode 100644 index 220b951..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/cocoapods-try.gemspec +++ /dev/null @@ -1,21 +0,0 @@ -# coding: utf-8 -lib = File.expand_path('../lib', __FILE__) -$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) -require 'cocoapods_try.rb' - -Gem::Specification.new do |spec| - spec.name = "cocoapods-try" - spec.version = CocoapodsTry::VERSION - spec.authors = ["Fabio Pelosin"] - spec.summary = %q{CocoaPods plugin which allows to quickly try the demo project of a Pod.} - spec.homepage = "https://github.com/cocoapods/cocoapods-try" - spec.license = "MIT" - - spec.files = `git ls-files`.split($/) - spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } - spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) - spec.require_paths = ["lib"] - - spec.add_development_dependency "bundler", "~> 1.3" - spec.add_development_dependency "rake", '~> 10.0' -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/spec/command/try_settings_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/spec/command/try_settings_spec.rb deleted file mode 100644 index d206186..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/spec/command/try_settings_spec.rb +++ /dev/null @@ -1,105 +0,0 @@ -require 'tmpdir' -require File.expand_path('../../spec_helper', __FILE__) - -# The CocoaPods namespace -# -module Pod - describe TrySettings do - it 'returns an instance with empty defaults when there are no yml settings files' do - Dir.mktmpdir do |dir| - settings = TrySettings.settings_from_folder dir - settings.should.be.instance_of TrySettings - settings.pre_install_commands.should.be.nil? - settings.project_path.should.be.nil? - end - end - - it 'returns an instance with the right defaults when there are no yml settings files' do - Dir.mktmpdir do |dir| - yaml = < 'ARAnalytics') - Pod::Specification.stubs(:from_file).with(spec_file).returns(stub_spec) - - command = Pod::Command.parse(['try', 'https://github.com/orta/ARAnalytics.git']) - Installer::PodSourceInstaller.any_instance.expects(:install!) - command.expects(:update_specs_repos).never - command.expects(:pick_demo_project).returns(XCODE_PROJECT) - command.expects(:open_project).with(XCODE_PROJECT) - command.run - end - - describe 'updates of the spec repos' do - it 'updates the spec repos by default' do - command = Pod::Command.parse(%w(try ARAnalytics)) - Installer::PodSourceInstaller.any_instance.expects(:install!) - command.config.sources_manager.expects(:update) - command.expects(:pick_demo_project).returns(XCODE_PROJECT) - command.expects(:open_project).with(XCODE_PROJECT) - command.run - end - - it "doesn't update the spec repos if that option was given" do - command = Pod::Command.parse(%w(try ARAnalytics --no-repo-update)) - Installer::PodSourceInstaller.any_instance.expects(:install!) - command.config.sources_manager.expects(:update).never - command.expects(:pick_demo_project).returns(XCODE_PROJECT) - command.expects(:open_project).with(XCODE_PROJECT) - command.run - end - end - end - - describe 'Helpers' do - before do - @sut = Pod::Command.parse(['try']) - end - - it 'returns the spec with the given name' do - spec = @sut.spec_with_name('ARAnalytics') - spec.name.should == 'ARAnalytics' - end - - describe '#spec_at_url' do - it 'returns a spec for an https git repo' do - require 'cocoapods-downloader/git' - Pod::Downloader::Git.any_instance.expects(:download) - spec_file = Pod::Command::Try::TRY_TMP_DIR + 'ARAnalytics/ARAnalytics.podspec' - Pathname.stubs(:glob).once.returns([spec_file]) - stub_spec = stub - Pod::Specification.stubs(:from_file).with(spec_file).returns(stub_spec) - spec = @sut.spec_with_url('https://github.com/orta/ARAnalytics.git') - spec.should == stub_spec - end - - it 'returns a spec for an https git repo with podspec_name option' do - require 'cocoapods-downloader/git' - Pod::Downloader::Git.any_instance.expects(:download) - spec_file = Pod::Command::Try::TRY_TMP_DIR + 'ARAnalytics/Analytics.podspec' - Pathname.stubs(:glob).once.returns([spec_file]) - stub_spec = stub - Pod::Specification.stubs(:from_file).with(spec_file).returns(stub_spec) - spec = @sut.spec_with_url('https://github.com/orta/ARAnalytics.git', 'Analytics') - spec.should == stub_spec - end - end - - it 'installs the pod' do - Installer::PodSourceInstaller.any_instance.expects(:install!) - spec = stub(:name => 'ARAnalytics') - sandbox_root = Pathname.new(Pod::Command::Try::TRY_TMP_DIR) - sandbox = Sandbox.new(sandbox_root) - path = @sut.install_pod(spec, sandbox) - path.should == sandbox.root + 'ARAnalytics' - end - - it 'installs the pod on older versions of CocoaPods' do - @sut.stubs(:cocoapods_version).returns(Pod::Version.new('1.7.0')) - spec = stub(:name => 'ARAnalytics') - sandbox_root = Pathname.new(Pod::Command::Try::TRY_TMP_DIR) - sandbox = Sandbox.new(sandbox_root) - installer = stub('Installer') - installer.stubs(:install!) - Pod::Installer::PodSourceInstaller.expects(:new).with(any_parameters) do |*args| - args.size == 3 - end.returns(installer).once - @sut.install_pod(spec, sandbox) - - @sut.stubs(:cocoapods_version).returns(Pod::Version.new('1.8.0')) - Pod::Installer::PodSourceInstaller.expects(:new).with(any_parameters) do |*args| - args.size == 4 - end.returns(installer) - @sut.install_pod(spec, sandbox) - end - - describe '#pick_demo_project' do - it 'raises if no demo project could be found' do - @sut.stubs(:projects_in_dir).returns([]) - should.raise Informative do - @sut.pick_demo_project('.') - end.message.should.match(/Unable to find any project/) - end - - it 'picks a demo project' do - projects = ['Demo.xcodeproj'] - Dir.stubs(:glob).returns(projects) - path = @sut.pick_demo_project('.') - path.should == 'Demo.xcodeproj' - end - - it 'is not case sensitive' do - projects = ['demo.xcodeproj'] - Dir.stubs(:glob).returns(projects) - path = @sut.pick_demo_project('.') - path.should == 'demo.xcodeproj' - end - - it 'considers also projects named example' do - projects = ['Example.xcodeproj'] - Dir.stubs(:glob).returns(projects) - path = @sut.pick_demo_project('.') - path.should == 'Example.xcodeproj' - end - - it 'returns the project if only one is found' do - projects = [Pathname.new('Lib.xcodeproj')] - @sut.stubs(:projects_in_dir).returns(projects) - path = @sut.pick_demo_project('.') - path.to_s.should == 'Lib.xcodeproj' - end - - it 'asks the user which project would like to open if not a single suitable one is found' do - projects = ['Lib_1.xcodeproj', 'Lib_2.xcodeproj'] - @sut.stubs(:projects_in_dir).returns(projects) - UI.stubs(:choose_from_array).returns(0) - path = @sut.pick_demo_project('.') - path.to_s.should == 'Lib_1.xcodeproj' - - UI.stubs(:choose_from_array).returns(1) - path = @sut.pick_demo_project('.') - path.to_s.should == 'Lib_2.xcodeproj' - end - - it 'should prefer demo or example workspaces' do - @sut.stubs(:projects_in_dir).returns(['Project Demo.xcodeproj', 'Project Demo.xcworkspace']) - path = @sut.pick_demo_project('.') - path.should == 'Project Demo.xcworkspace' - end - - it 'should not show workspaces inside a project' do - Dir.stubs(:glob).returns(['Project Demo.xcodeproj', 'Project Demo.xcodeproj/project.xcworkspace']) - path = @sut.pick_demo_project('.') - path.should == 'Project Demo.xcodeproj' - end - - it 'should prefer workspaces over projects with the same name' do - @sut.stubs(:projects_in_dir).returns(['Project Demo.xcodeproj', 'Project Demo.xcworkspace']) - path = @sut.pick_demo_project('.') - path.should == 'Project Demo.xcworkspace' - end - end - - describe '#install_podfile' do - it 'returns the original project if no Podfile could be found' do - Pathname.any_instance.stubs(:exist?).returns(false) - proj = XCODE_PROJECT - path = @sut.install_podfile(proj) - path.should == proj - end - - it 'performs an installation and returns the path of the workspace' do - Pathname.any_instance.stubs(:exist?).returns(true) - proj = XCODE_PROJECT - @sut.expects(:perform_cocoapods_installation) - Podfile.stubs(:from_file).returns(stub('Workspace', :workspace_path => XCODE_WORKSPACE)) - path = @sut.install_podfile(proj) - path.to_s.should == XCODE_WORKSPACE.to_s - end - - it 'returns the default workspace if one is not set' do - Pathname.any_instance.stubs(:exist?).returns(true) - proj = XCODE_PROJECT - Podfile.stubs(:from_file).returns(stub('Workspace', :workspace_path => nil)) - @sut.expects(:perform_cocoapods_installation).once - path = @sut.install_podfile(proj) - path.to_s.should == XCODE_WORKSPACE.to_s - end - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/spec/spec_helper.rb b/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/spec/spec_helper.rb deleted file mode 100644 index 313584d..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/cocoapods-try-1.2.0/spec/spec_helper.rb +++ /dev/null @@ -1,49 +0,0 @@ - -# Set up -#-----------------------------------------------------------------------------# - -require 'bundler/setup' -require 'pathname' -require 'bacon' -require 'mocha-on-bacon' -require 'pretty_bacon' -require 'cocoapods' - -ROOT = Pathname.new(File.expand_path('../../', __FILE__)) -$LOAD_PATH.unshift((ROOT + 'lib').to_s) -$LOAD_PATH.unshift((ROOT + 'spec').to_s) -require 'cocoapods_plugin' - -#-----------------------------------------------------------------------------# - -module Pod - # Disable the wrapping so the output is deterministic in the tests. - # - UI.disable_wrap = true - - # Redirects the messages to an internal store. - # - module UI - @output = '' - @warnings = '' - - class << self - attr_accessor :output - attr_accessor :warnings - - def puts(message = '') - @output << "#{message}\n" - end - - def warn(message = '', _actions = []) - @warnings << "#{message}\n" - end - - def print(message) - @output << message - end - end - end -end - -#-----------------------------------------------------------------------------# diff --git a/example/vendor/bundle/ruby/2.7.0/gems/colored2-3.1.2/LICENSE b/example/vendor/bundle/ruby/2.7.0/gems/colored2-3.1.2/LICENSE deleted file mode 100644 index e543acb..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/colored2-3.1.2/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -Copyright (c) 2010 Chris Wanstrath -Copyright (c) 2016 Konstantin Gredeskoul - -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/example/vendor/bundle/ruby/2.7.0/gems/colored2-3.1.2/README.md b/example/vendor/bundle/ruby/2.7.0/gems/colored2-3.1.2/README.md deleted file mode 100644 index f2da87b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/colored2-3.1.2/README.md +++ /dev/null @@ -1,93 +0,0 @@ -[![Gem Version](https://badge.fury.io/rb/colored2.svg)](https://badge.fury.io/rb/colored2) -[![Downloads](http://ruby-gem-downloads-badge.herokuapp.com/colored2?type=total)](https://rubygems.org/gems/colored2) -[![Gitter](https://img.shields.io/gitter/room/gitterHQ/gitter.svg)](https://gitter.im/colored2) - -[![Build Status](https://travis-ci.org/kigster/colored2.svg?branch=master)](https://travis-ci.org/kigster/colored2) -[![Test Coverage](https://codeclimate.com/github/kigster/colored2/badges/coverage.svg)](https://codeclimate.com/github/kigster/colored2/coverage) -[![Code Climate](https://codeclimate.com/github/kigster/colored2/badges/gpa.svg)](https://codeclimate.com/github/kigster/colored2) -[![Issue Count](https://codeclimate.com/github/kigster/colored2/badges/issue_count.svg)](https://codeclimate.com/github/kigster/colored2) - -## Colored2 - -This is an actively maintained fork of Chris (defunkt) Wanstrath's gem [colored](https://github.com/defunkt/colored), which appears to be no longer supported. - -This fork comes with a slightly spruced up syntax, some additional features, and a test suite written in [RSpec](http://rspec.info/). - -## Usage - -In addition to the simple syntax of the original gem, which affected only the string to the left of the method call, the new "bang" syntax affects a string to the right. If the block or a method argument is provided, the contents is wrapped in the color, and the color is then reset back. - -If no block or argument is provided, the color is left open-ended, and must be explicitly reset – when using the 'bang' notation. - -![](doc/colored2-session1.png) - -### Complete set of colors: - - * black - * red - * green - * yellow - * blue - * magenta - * cyan - * white - -### Complete Set of Effects - -> Note: previous versions used method name `clear` instead of `no_color`, which clashed with many 3rd party frameworks that defined similarly named method in the global namespace. -> This highlights the dangers of introducing so many words into the `String` namespace. - - * no_color - * bold - * dark - * italic - * underlined - * reversed - * plain - * normal - -## Usage in Other Classes - -With this gem you can add color to not just strings, but to any other class. `String` class is automatically decorated as soon as `require 'colored2'` is parsed by the ruby interpreter. Note that future versions may refrain from auto-requiring `colored2/strings`, and rely on explicitly requiring components they need colorized, eg `require 'colored2/numbers'`. - -To color numbers, require the following file, which automatically decorates `Integer` and `Float`. You can also add color methods to the `Object`. Finally, you can add the methods to any custom class by including the `Colored2` Module. - -Below is an `IRB` — session that shows a slightly more advanced usage. - -![](doc/colored2-session2.png) - -## Additional Helpers - -There are several additional helpers tucked onto the `String` class. - - * `#to_bol` (to beginning of the line) will rewind the cursor back to the beginning of the current line. - * `#to_eol` (to end of line) - -## Installation - -Add this line to your application's Gemfile: - - - gem 'colored2' - - -And then execute: - - $ bundle - -Or install it yourself as: - - $ gem install colored2 - - -## Development - -To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org). - -## Contributing - -Bug reports and pull requests are welcome on GitHub at [https://github.com/kigster/colored2](https://github.com/kigster/colored2). - -## License - -The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT). diff --git a/example/vendor/bundle/ruby/2.7.0/gems/colored2-3.1.2/Rakefile b/example/vendor/bundle/ruby/2.7.0/gems/colored2-3.1.2/Rakefile deleted file mode 100644 index 47ca61b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/colored2-3.1.2/Rakefile +++ /dev/null @@ -1,13 +0,0 @@ -require 'bundler' -require 'bundler/gem_tasks' -require 'rake/clean' - -CLEAN.include %w(pkg coverage *.gem) - -begin - require 'rspec/core/rake_task' - RSpec::Core::RakeTask.new(:spec) -rescue LoadError -end - -task :default => [:spec] diff --git a/example/vendor/bundle/ruby/2.7.0/gems/colored2-3.1.2/spec/colored2/numbers_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/colored2-3.1.2/spec/colored2/numbers_spec.rb deleted file mode 100644 index f686bfa..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/colored2-3.1.2/spec/colored2/numbers_spec.rb +++ /dev/null @@ -1,26 +0,0 @@ -require File.expand_path('spec/spec_helper') -require 'colored2/numbers' -require 'colored2/strings' - -RSpec.describe Colored2.integer_class do - describe 'with foreground and background colors' do - it 'should work with one color' do - expect(32.red).to eql('32'.red) - end - it 'should insert escape sequences' do - expect(32.red).to eql("\e[31m32\e[0m") - end - end -end - -RSpec.describe Float do - describe 'with foreground and background colors' do - it 'should add two colors chained' do - expect((32.5).blue.on.red).to eql('32.5'.blue.on.red) - end - - it 'should insert escape sequences' do - expect((32.5).blue.on.red).to eql("\e[41m\e[34m32.5\e[0m") - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/colored2-3.1.2/spec/colored2/object_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/colored2-3.1.2/spec/colored2/object_spec.rb deleted file mode 100644 index 6256254..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/colored2-3.1.2/spec/colored2/object_spec.rb +++ /dev/null @@ -1,24 +0,0 @@ -require File.expand_path('spec/spec_helper') -require 'colored2/object' - -subject1 = red('hello') -subject2 = red('blue').on.blue -subject3 = on.yellow('on yellow') - -RSpec.describe Object do - - describe 'with foreground and background colors' do - it 'should work with one color' do - expect(subject1).to eql('hello'.red) - end - - it 'should work with color on color' do - expect(subject2).to eql('blue'.red.on.blue) - end - - it 'should add background color using on_' do - expect(subject3).to eql('on yellow'.on.yellow) - end - - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/colored2-3.1.2/spec/colored2/strings_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/colored2-3.1.2/spec/colored2/strings_spec.rb deleted file mode 100644 index 10da2a4..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/colored2-3.1.2/spec/colored2/strings_spec.rb +++ /dev/null @@ -1,77 +0,0 @@ -require File.expand_path('spec/spec_helper') -require 'colored2/strings' - -RSpec.describe String do - before do - Colored2.decorate(String) - end - - describe 'with foreground and background colors' do - it 'should work with one color' do - expect('red'.red).to eql("\e[31mred\e[0m") - end - - it 'should add two colors chained' do - expect('blue'.red.blue).to eql("\e[34m\e[31mblue\e[0m") - end - - it 'should add background color using on_' do - expect('on yellow'.on.yellow).to eql("\e[43mon yellow\e[0m") - end - - it 'should work with _on_ syntax' do - expect('red on blue'.red.on.blue).to eql("\e[44m\e[31mred on blue\e[0m") - end - end - - describe 'with effects' do - it 'should add a bold modifier' do - expect('way bold'.bold).to eql("\e[1mway bold\e[0m") - end - - it 'should let modifiers stack' do - expect('underlinedd bold'.bold.underlined).to eql("\e[4m\e[1munderlinedd bold\e[0m") - end - - it 'should let modifiers stack with colors' do - expect('cyan underlinedd bold'.bold.underlined.cyan).to eql("\e[36m\e[4m\e[1mcyan underlinedd bold\e[0m") - end - end - - describe 'new block syntax' do - it 'should defined block syntax nested colors' do - expect('No Color, then'.blue!('blue inside')).to eql('No Color, then' + 'blue inside'.blue) - end - - it 'should defined block syntax nested colors two levels deep' do - expect('regular here'.blue! + 'blue here'.no_color!).to eql('regular here' << 'blue here'.blue) - end - - it 'should defined block syntax nested colors two levels deep' do - expect('regular here'.blue! { 'something else'.red!('red riding hood') }).to eql('regular here'.blue! << 'something else'.red! << 'red riding hood'.no_color!) - end - - it 'should defined block syntax nested colors two levels deep' do - expectation = 'this is regular, but '.red! do - 'this is red '.yellow! do - ' and yellow'.no_color! - end - end - expect(expectation).to eql('this is regular, but '.red! << 'this is red '.yellow! << ' and yellow'.no_color!) - end - end - - describe 'end of line' do - it 'should work with eol' do - expect('nothing to see here really.'.to_eol).to eql("\e[2Knothing to see here really.") - end - - it 'should work with eol_with_with_two_colors' do - expect('blue'.red.blue.to_eol).to eql("\e[34m\e[31m\e[2Kblue\e[0m") - end - - it 'should work with eol_with_modifiers_stack_with_colors' do - expect('cyan underlinedd bold'.bold.underlined.cyan.to_eol).to eql("\e[36m\e[4m\e[1m\e[2Kcyan underlinedd bold\e[0m") - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/colored2-3.1.2/spec/colored2_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/colored2-3.1.2/spec/colored2_spec.rb deleted file mode 100644 index 3b55f07..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/colored2-3.1.2/spec/colored2_spec.rb +++ /dev/null @@ -1,23 +0,0 @@ -require 'spec_helper' -require 'colored2/strings' - -RSpec.describe Colored2 do - describe 'global enable and disable' do - before do - Colored2.disable! - end - after do - Colored2.enable! - end - let(:sample) { 'sample string' } - - describe 'colors' do - subject { sample.red.on.blue } - it { should eql(sample) } - end - describe 'effects' do - subject { sample.bold.on.red } - it { should eql(sample) } - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/colored2-3.1.2/spec/spec_helper.rb b/example/vendor/bundle/ruby/2.7.0/gems/colored2-3.1.2/spec/spec_helper.rb deleted file mode 100644 index 3f2faa0..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/colored2-3.1.2/spec/spec_helper.rb +++ /dev/null @@ -1,5 +0,0 @@ -require 'simplecov' -SimpleCov.start - -require 'rspec/core' - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/CHANGELOG.md b/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/CHANGELOG.md deleted file mode 100644 index 17a2a64..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/CHANGELOG.md +++ /dev/null @@ -1,561 +0,0 @@ -## Current - -## Release v1.2.2 (24 Feb 2023) - -* (#993) Fix arguments passed to `Concurrent::Map`'s `default_proc`. - -## Release v1.2.1 (24 Feb 2023) - -* (#990) Add missing `require 'fiber'` for `FiberLocalVar`. -* (#989) Optimize `Concurrent::Map#[]` on CRuby by letting the backing Hash handle the `default_proc`. - -## Release v1.2.0 (23 Jan 2023) - -* (#962) Fix ReentrantReadWriteLock to use the same granularity for locals as for Mutex it uses. -* (#983) Add FiberLocalVar -* (#934) concurrent-ruby now supports requiring individual classes (public classes listed in the docs), e.g., `require 'concurrent/map'` -* (#976) Let `Promises.any_fulfilled_future` take an `Event` -* Improve documentation of various classes -* (#975) Set the Ruby compatibility version at 2.3 -* (#972) Remove Rubinius-related code - -## Release v1.1.10 (22 Mar 2022) - -concurrent-ruby: - -* (#951) Set the Ruby compatibility version at 2.2 -* (#939, #933) The `caller_runs` fallback policy no longer blocks reads from the job queue by worker threads -* (#938, #761, #652) You can now explicitly `prune_pool` a thread pool (Sylvain Joyeux) -* (#937, #757, #670) We switched the Yahoo stock API for demos to Alpha Vantage (Gustavo Caso) -* (#932, #931) We changed how `SafeTaskExecutor` handles local jump errors (Aaron Jensen) -* (#927) You can use keyword arguments in your initialize when using `Async` (Matt Larraz) -* (#926, #639) We removed timeout from `TimerTask` because it wasn't sound, and now it's a no-op with a warning (Jacob Atzen) -* (#919) If you double-lock a re-entrant read-write lock, we promote to locked for writing (zp yuan) -* (#915) `monotonic_time` now accepts an optional unit parameter, as Ruby's `clock_gettime` (Jean Boussier) - -## Release v1.1.9 (5 Jun 2021) - -concurrent-ruby: - -* (#866) Child promise state not set to :pending immediately after #execute when parent has completed -* (#905, #872) Fix RubyNonConcurrentPriorityQueue#delete method -* (2df0337d) Make sure locks are not shared on shared when objects are dup/cloned -* (#900, #906, #796, #847, #911) Fix Concurrent::Set tread-safety issues on CRuby -* (#907) Add new ConcurrentMap backend for TruffleRuby - -## Release v1.1.8 (20 January 2021) - -concurrent-ruby: - -* (#885) Fix race condition in TVar for stale reads -* (#884) RubyThreadLocalVar: Do not iterate over hash which might conflict with new pair addition - -## Release v1.1.7 (6 August 2020) - -concurrent-ruby: - -* (#879) Consider falsy value on `Concurrent::Map#compute_if_absent` for fast non-blocking path -* (#876) Reset Async queue on forking, makes Async fork-safe -* (#856) Avoid running problematic code in RubyThreadLocalVar on MRI that occasionally results in segfault -* (#853) Introduce ThreadPoolExecutor without a Queue - -## Release v1.1.6, edge v0.6.0 (10 Feb 2020) - -concurrent-ruby: - -* (#841) Concurrent.disable_at_exit_handlers! is no longer needed and was deprecated. -* (#841) AbstractExecutorService#auto_terminate= was deprecated and has no effect. - Set :auto_terminate option instead when executor is initialized. - -## Release v1.1.6.pre1, edge v0.6.0.pre1 (26 Jan 2020) - -concurrent-ruby: - -* (#828) Allow to name executors, the name is also used to name their threads -* (#838) Implement #dup and #clone for structs -* (#821) Safer finalizers for thread local variables -* Documentation fixes -* (#814) Use Ruby's Etc.nprocessors if available -* (#812) Fix directory structure not to mess with packaging tools -* (#840) Fix termination of pools on JRuby - -concurrent-ruby-edge: - -* Add WrappingExecutor (#830) - -## Release v1.1.5, edge v0.5.0 (10 Mar 2019) - -concurrent-ruby: - -* fix potential leak of context on JRuby and Java 7 - -concurrent-ruby-edge: - -* Add finalized Concurrent::Cancellation -* Add finalized Concurrent::Throttle -* Add finalized Concurrent::Promises::Channel -* Add new Concurrent::ErlangActor - -## Release v1.1.4 (14 Dec 2018) - -* (#780) Remove java_alias of 'submit' method of Runnable to let executor service work on java 11 -* (#776) Fix NameError on defining a struct with a name which is already taken in an ancestor - -## Release v1.1.3 (7 Nov 2018) - -* (#775) fix partial require of the gem (although not officially supported) - -## Release v1.1.2 (6 Nov 2018) - -* (#773) more defensive 1.9.3 support - -## Release v1.1.1, edge v0.4.1 (1 Nov 2018) - -* (#768) add support for 1.9.3 back - -## Release v1.1.0, edge v0.4.0 (31 OCt 2018) (yanked) - -* (#768) yanked because of issues with removed 1.9.3 support - -## Release v1.1.0.pre2, edge v0.4.0.pre2 (18 Sep 2018) - -concurrent-ruby: - -* fixed documentation and README links -* fix Set for TruffleRuby and Rubinius -* use properly supported TruffleRuby APIs - -concurrent-ruby-edge: - -* add Promises.zip_futures_over_on - -## Release v1.1.0.pre1, edge v0.4.0.pre1 (15 Aug 2018) - -concurrent-ruby: - -* requires at least Ruby 2.0 -* [Promises](http://ruby-concurrency.github.io/concurrent-ruby/1.1.0/Concurrent/Promises.html) - are moved from `concurrent-ruby-edge` to `concurrent-ruby` -* Add support for TruffleRuby - * (#734) Fix Array/Hash/Set construction broken on TruffleRuby - * AtomicReference fixed -* CI stabilization -* remove sharp dependency edge -> core -* remove warnings -* documentation updates -* Exchanger is no longer documented as edge since it was already available in - `concurrent-ruby` -* (#644) Fix Map#each and #each_pair not returning enumerator outside of MRI -* (#659) Edge promises fail during error handling -* (#741) Raise on recursive Delay#value call -* (#727) #717 fix global IO executor on JRuby -* (#740) Drop support for CRuby 1.9, JRuby 1.7, Rubinius. -* (#737) Move AtomicMarkableReference out of Edge -* (#708) Prefer platform specific memory barriers -* (#735) Fix wrong expected exception in channel spec assertion -* (#729) Allow executor option in `Promise#then` -* (#725) fix timeout check to use timeout_interval -* (#719) update engine detection -* (#660) Add specs for Promise#zip/Promise.zip ordering -* (#654) Promise.zip execution changes -* (#666) Add thread safe set implementation -* (#651) #699 #to_s, #inspect should not output negative object IDs. -* (#685) Avoid RSpec warnings about raise_error -* (#680) Avoid RSpec monkey patching, persist spec results locally, use RSpec - v3.7.0 -* (#665) Initialize the monitor for new subarrays on Rubinius -* (#661) Fix error handling in edge promises - -concurrent-ruby-edge: - -* (#659) Edge promises fail during error handling -* Edge files clearly separated in `lib-edge` -* added ReInclude - -## Release v1.0.5, edge v0.3.1 (26 Feb 2017) - -concurrent-ruby: - -* Documentation for Event and Semaphore -* Use Unsafe#fullFence and #loadFence directly since the shortcuts were removed in JRuby -* Do not depend on org.jruby.util.unsafe.UnsafeHolder - -concurrent-ruby-edge: - -* (#620) Actors on Pool raise an error -* (#624) Delayed promises did not interact correctly with flatting - * Fix arguments yielded by callback methods -* Overridable default executor in promises factory methods -* Asking actor to terminate will always resolve to `true` - -## Release v1.0.4, edge v0.3.0 (27 Dec 2016) - -concurrent-ruby: - -* Nothing - -concurrent-ruby-edge: - -* New promises' API renamed, lots of improvements, edge bumped to 0.3.0 - * **Incompatible** with previous 0.2.3 version - * see https://github.com/ruby-concurrency/concurrent-ruby/pull/522 - -## Release v1.0.3 (17 Dec 2016) - -* Trigger execution of flattened delayed futures -* Avoid forking for processor_count if possible -* Semaphore Mutex and JRuby parity -* Adds Map#each as alias to Map#each_pair -* Fix uninitialized instance variables -* Make Fixnum, Bignum merger ready -* Allows Promise#then to receive an executor -* TimerSet now survives a fork -* Reject promise on any exception -* Allow ThreadLocalVar to be initialized with a block -* Support Alpha with `Concurrent::processor_count` -* Fixes format-security error when compiling ruby_193_compatible.h -* Concurrent::Atom#swap fixed: reraise the exceptions from block - -## Release v1.0.2 (2 May 2016) - -* Fix bug with `Concurrent::Map` MRI backend `#inspect` method -* Fix bug with `Concurrent::Map` MRI backend using `Hash#value?` -* Improved documentation and examples -* Minor updates to Edge - -## Release v1.0.1 (27 February 2016) - -* Fix "uninitialized constant Concurrent::ReentrantReadWriteLock" error. -* Better handling of `autoload` vs. `require`. -* Improved API for Edge `Future` zipping. -* Fix reference leak in Edge `Future` constructor . -* Fix bug which prevented thread pools from surviving a `fork`. -* Fix bug in which `TimerTask` did not correctly specify all its dependencies. -* Improved support for JRuby+Truffle -* Improved error messages. -* Improved documentation. -* Updated README and CONTRIBUTING. - -## Release v1.0.0 (13 November 2015) - -* Rename `attr_volatile_with_cas` to `attr_atomic` -* Add `clear_each` to `LockFreeStack` -* Update `AtomicReference` documentation -* Further updates and improvements to the synchronization layer. -* Performance and memory usage performance with `Actor` logging. -* Fixed `ThreadPoolExecutor` task count methods. -* Improved `Async` performance for both short and long-lived objects. -* Fixed bug in `LockFreeLinkedSet`. -* Fixed bug in which `Agent#await` triggered a validation failure. -* Further `Channel` updates. -* Adopted a project Code of Conduct -* Cleared interpreter warnings -* Fixed bug in `ThreadPoolExecutor` task count methods -* Fixed bug in 'LockFreeLinkedSet' -* Improved Java extension loading -* Handle Exception children in Edge::Future -* Continued improvements to channel -* Removed interpreter warnings. -* Shared constants now in `lib/concurrent/constants.rb` -* Refactored many tests. -* Improved synchronization layer/memory model documentation. -* Bug fix in Edge `Future#flat` -* Brand new `Channel` implementation in Edge gem. -* Simplification of `RubySingleThreadExecutor` -* `Async` improvements - - Each object uses its own `SingleThreadExecutor` instead of the global thread pool. - - No longers supports executor injection - - Much better documentation -* `Atom` updates - - No longer `Dereferenceable` - - Now `Observable` - - Added a `#reset` method -* Brand new `Agent` API and implementation. Now functionally equivalent to Clojure. -* Continued improvements to the synchronization layer -* Merged in the `thread_safe` gem - - `Concurrent::Array` - - `Concurrent::Hash` - - `Concurrent::Map` (formerly ThreadSafe::Cache) - - `Concurrent::Tuple` -* Minor improvements to Concurrent::Map -* Complete rewrite of `Exchanger` -* Removed all deprecated code (classes, methods, constants, etc.) -* Updated Agent, MutexAtomic, and BufferedChannel to inherit from Synchronization::Object. -* Many improved tests -* Some internal reorganization - -## Release v0.9.1 (09 August 2015) - -* Fixed a Rubiniux bug in synchronization object -* Fixed all interpreter warnings (except circular references) -* Fixed require statements when requiring `Atom` alone -* Significantly improved `ThreadLocalVar` on non-JRuby platforms -* Fixed error handling in Edge `Concurrent.zip` -* `AtomicFixnum` methods `#increment` and `#decrement` now support optional delta -* New `AtomicFixnum#update` method -* Minor optimizations in `ReadWriteLock` -* New `ReentrantReadWriteLock` class -* `ThreadLocalVar#bind` method is now public -* Refactored many tests - -## Release v0.9.0 (10 July 2015) - -* Updated `AtomicReference` - - `AtomicReference#try_update` now simply returns instead of raising exception - - `AtomicReference#try_update!` was added to raise exceptions if an update - fails. Note: this is the same behavior as the old `try_update` -* Pure Java implementations of - - `AtomicBoolean` - - `AtomicFixnum` - - `Semaphore` -* Fixed bug when pruning Ruby thread pools -* Fixed bug in time calculations within `ScheduledTask` -* Default `count` in `CountDownLatch` to 1 -* Use monotonic clock for all timers via `Concurrent.monotonic_time` - - Use `Process.clock_gettime(Process::CLOCK_MONOTONIC)` when available - - Fallback to `java.lang.System.nanoTime()` on unsupported JRuby versions - - Pure Ruby implementation for everything else - - Effects `Concurrent.timer`, `Concurrent.timeout`, `TimerSet`, `TimerTask`, and `ScheduledTask` -* Deprecated all clock-time based timer scheduling - - Only support scheduling by delay - - Effects `Concurrent.timer`, `TimerSet`, and `ScheduledTask` -* Added new `ReadWriteLock` class -* Consistent `at_exit` behavior for Java and Ruby thread pools. -* Added `at_exit` handler to Ruby thread pools (already in Java thread pools) - - Ruby handler stores the object id and retrieves from `ObjectSpace` - - JRuby disables `ObjectSpace` by default so that handler stores the object reference -* Added a `:stop_on_exit` option to thread pools to enable/disable `at_exit` handler -* Updated thread pool docs to better explain shutting down thread pools -* Simpler `:executor` option syntax for all abstractions which support this option -* Added `Executor#auto_terminate?` predicate method (for thread pools) -* Added `at_exit` handler to `TimerSet` -* Simplified auto-termination of the global executors - - Can now disable auto-termination of global executors - - Added shutdown/kill/wait_for_termination variants for global executors -* Can now disable auto-termination for *all* executors (the nuclear option) -* Simplified auto-termination of the global executors -* Deprecated terms "task pool" and "operation pool" - - New terms are "io executor" and "fast executor" - - New functions added with new names - - Deprecation warnings added to functions referencing old names -* Moved all thread pool related functions from `Concurrent::Configuration` to `Concurrent` - - Old functions still exist with deprecation warnings - - New functions have updated names as appropriate -* All high-level abstractions default to the "io executor" -* Fixed bug in `Actor` causing it to prematurely warm global thread pools on gem load - - This also fixed a `RejectedExecutionError` bug when running with minitest/autorun via JRuby -* Moved global logger up to the `Concurrent` namespace and refactored the code -* Optimized the performance of `Delay` - - Fixed a bug in which no executor option on construction caused block execution on a global thread pool -* Numerous improvements and bug fixes to `TimerSet` -* Fixed deadlock of `Future` when the handler raises Exception -* Added shared specs for more classes -* New concurrency abstractions including: - - `Atom` - - `Maybe` - - `ImmutableStruct` - - `MutableStruct` - - `SettableStruct` -* Created an Edge gem for unstable abstractions including - - `Actor` - - `Agent` - - `Channel` - - `Exchanger` - - `LazyRegister` - - **new Future Framework** - unified - implementation of Futures and Promises which combines Features of previous `Future`, - `Promise`, `IVar`, `Event`, `Probe`, `dataflow`, `Delay`, `TimerTask` into single framework. It uses extensively - new synchronization layer to make all the paths **lock-free** with exception of blocking threads on `#wait`. - It offers better performance and does not block threads when not required. -* Actor framework changes: - - fixed reset loop in Pool - - Pool can use any actor as a worker, abstract worker class is no longer needed. - - Actor events not have format `[:event_name, *payload]` instead of just the Symbol. - - Actor now uses new Future/Promise Framework instead of `IVar` for better interoperability - - Behaviour definition array was simplified to `[BehaviourClass1, [BehaviourClass2, *initialization_args]]` - - Linking behavior responds to :linked message by returning array of linked actors - - Supervised behavior is removed in favour of just Linking - - RestartingContext is supervised by default now, `supervise: true` is not required any more - - Events can be private and public, so far only difference is that Linking will - pass to linked actors only public messages. Adding private :restarting and - :resetting events which are send before the actor restarts or resets allowing - to add callbacks to cleanup current child actors. - - Print also object_id in Reference to_s - - Add AbstractContext#default_executor to be able to override executor class wide - - Add basic IO example - - Documentation somewhat improved - - All messages should have same priority. It's now possible to send `actor << job1 << job2 << :terminate!` and - be sure that both jobs are processed first. -* Refactored `Channel` to use newer synchronization objects -* Added `#reset` and `#cancel` methods to `TimerSet` -* Added `#cancel` method to `Future` and `ScheduledTask` -* Refactored `TimerSet` to use `ScheduledTask` -* Updated `Async` with a factory that initializes the object -* Deprecated `Concurrent.timer` and `Concurrent.timeout` -* Reduced max threads on pure-Ruby thread pools (abends around 14751 threads) -* Moved many private/internal classes/modules into "namespace" modules -* Removed brute-force killing of threads in tests -* Fixed a thread pool bug when the operating system cannot allocate more threads - -## Release v0.8.0 (25 January 2015) - -* C extension for MRI have been extracted into the `concurrent-ruby-ext` companion gem. - Please see the README for more detail. -* Better variable isolation in `Promise` and `Future` via an `:args` option -* Continued to update intermittently failing tests - -## Release v0.7.2 (24 January 2015) - -* New `Semaphore` class based on [java.util.concurrent.Semaphore](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html) -* New `Promise.all?` and `Promise.any?` class methods -* Renamed `:overflow_policy` on thread pools to `:fallback_policy` -* Thread pools still accept the `:overflow_policy` option but display a warning -* Thread pools now implement `fallback_policy` behavior when not running (rather than universally rejecting tasks) -* Fixed minor `set_deref_options` constructor bug in `Promise` class -* Fixed minor `require` bug in `ThreadLocalVar` class -* Fixed race condition bug in `TimerSet` class -* Fixed race condition bug in `TimerSet` class -* Fixed signal bug in `TimerSet#post` method -* Numerous non-functional updates to clear warning when running in debug mode -* Fixed more intermittently failing tests -* Tests now run on new Travis build environment -* Multiple documentation updates - -## Release v0.7.1 (4 December 2014) - -Please see the [roadmap](https://github.com/ruby-concurrency/concurrent-ruby/issues/142) for more information on the next planned release. - -* Added `flat_map` method to `Promise` -* Added `zip` method to `Promise` -* Fixed bug with logging in `Actor` -* Improvements to `Promise` tests -* Removed actor-experimental warning -* Added an `IndirectImmediateExecutor` class -* Allow disabling auto termination of global executors -* Fix thread leaking in `ThreadLocalVar` (uses `Ref` gem on non-JRuby systems) -* Fix thread leaking when pruning pure-Ruby thread pools -* Prevent `Actor` from using an `ImmediateExecutor` (causes deadlock) -* Added missing synchronizations to `TimerSet` -* Fixed bug with return value of `Concurrent::Actor::Utils::Pool#ask` -* Fixed timing bug in `TimerTask` -* Fixed bug when creating a `JavaThreadPoolExecutor` with minimum pool size of zero -* Removed confusing warning when not using native extenstions -* Improved documentation - -## Release v0.7.0 (13 August 2014) - -* Merge the [atomic](https://github.com/ruby-concurrency/atomic) gem - - Pure Ruby `MutexAtomic` atomic reference class - - Platform native atomic reference classes `CAtomic`, `JavaAtomic`, and `RbxAtomic` - - Automated [build process](https://github.com/ruby-concurrency/rake-compiler-dev-box) - - Fat binary releases for [multiple platforms](https://rubygems.org/gems/concurrent-ruby/versions) including Windows (32/64), Linux (32/64), OS X (64-bit), Solaris (64-bit), and JRuby -* C native `CAtomicBoolean` -* C native `CAtomicFixnum` -* Refactored intermittently failing tests -* Added `dataflow!` and `dataflow_with!` methods to match `Future#value!` method -* Better handling of timeout in `Agent` -* Actor Improvements - - Fine-grained implementation using chain of behaviors. Each behavior is responsible for single aspect like: `Termination`, `Pausing`, `Linking`, `Supervising`, etc. Users can create custom Actors easily based on their needs. - - Supervision was added. `RestartingContext` will pause on error waiting on its supervisor to decide what to do next ( options are `:terminate!`, `:resume!`, `:reset!`, `:restart!`). Supervising behavior also supports strategies `:one_for_one` and `:one_for_all`. - - Linking was added to be able to monitor actor's events like: `:terminated`, `:paused`, `:restarted`, etc. - - Dead letter routing added. Rejected envelopes are collected in a configurable actor (default: `Concurrent::Actor.root.ask!(:dead_letter_routing)`) - - Old `Actor` class removed and replaced by new implementation previously called `Actress`. `Actress` was kept as an alias for `Actor` to keep compatibility. - - `Utils::Broadcast` actor which allows Publish–subscribe pattern. -* More executors for managing serialized operations - - `SerializedExecution` mixin module - - `SerializedExecutionDelegator` for serializing *any* executor -* Updated `Async` with serialized execution -* Updated `ImmediateExecutor` and `PerThreadExecutor` with full executor service lifecycle -* Added a `Delay` to root `Actress` initialization -* Minor bug fixes to thread pools -* Refactored many intermittently failing specs -* Removed Java interop warning `executor.rb:148 warning: ambiguous Java methods found, using submit(java.lang.Runnable)` -* Fixed minor bug in `RubyCachedThreadPool` overflow policy -* Updated tests to use [RSpec 3.0](http://myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3) -* Removed deprecated `Actor` class -* Better support for Rubinius - -## Release v0.6.1 (14 June 2014) - -* Many improvements to `Concurrent::Actress` -* Bug fixes to `Concurrent::RubyThreadPoolExecutor` -* Fixed several brittle tests -* Moved documentation to http://ruby-concurrency.github.io/concurrent-ruby/frames.html - -## Release v0.6.0 (25 May 2014) - -* Added `Concurrent::Observable` to encapsulate our thread safe observer sets -* Improvements to new `Channel` -* Major improvements to `CachedThreadPool` and `FixedThreadPool` -* Added `SingleThreadExecutor` -* Added `Current::timer` function -* Added `TimerSet` executor -* Added `AtomicBoolean` -* `ScheduledTask` refactoring -* Pure Ruby and JRuby-optimized `PriorityQueue` classes -* Updated `Agent` behavior to more closely match Clojure -* Observer sets support block callbacks to the `add_observer` method -* New algorithm for thread creation in `RubyThreadPoolExecutor` -* Minor API updates to `Event` -* Rewritten `TimerTask` now an `Executor` instead of a `Runnable` -* Fixed many brittle specs -* Renamed `FixedThreadPool` and `CachedThreadPool` to `RubyFixedThreadPool` and `RubyCachedThreadPool` -* Created JRuby optimized `JavaFixedThreadPool` and `JavaCachedThreadPool` -* Consolidated fixed thread pool tests into `spec/concurrent/fixed_thread_pool_shared.rb` and `spec/concurrent/cached_thread_pool_shared.rb` -* `FixedThreadPool` now subclasses `RubyFixedThreadPool` or `JavaFixedThreadPool` as appropriate -* `CachedThreadPool` now subclasses `RubyCachedThreadPool` or `JavaCachedThreadPool` as appropriate -* New `Delay` class -* `Concurrent::processor_count` helper function -* New `Async` module -* Renamed `NullThreadPool` to `PerThreadExecutor` -* Deprecated `Channel` (we are planning a new implementation based on [Go](http://golangtutorials.blogspot.com/2011/06/channels-in-go.html)) -* Added gem-level [configuration](http://robots.thoughtbot.com/mygem-configure-block) -* Deprecated `$GLOBAL_THREAD_POOL` in lieu of gem-level configuration -* Removed support for Ruby [1.9.2](https://www.ruby-lang.org/en/news/2013/12/17/maintenance-of-1-8-7-and-1-9-2/) -* New `RubyThreadPoolExecutor` and `JavaThreadPoolExecutor` classes -* All thread pools now extend the appropriate thread pool executor classes -* All thread pools now support `:overflow_policy` (based on Java's [reject policies](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html)) -* Deprecated `UsesGlobalThreadPool` in lieu of explicit `:executor` option (dependency injection) on `Future`, `Promise`, and `Agent` -* Added `Concurrent::dataflow_with(executor, *inputs)` method to support executor dependency injection for dataflow -* Software transactional memory with `TVar` and `Concurrent::atomically` -* First implementation of [new, high-performance](https://github.com/ruby-concurrency/concurrent-ruby/pull/49) `Channel` -* `Actor` is deprecated in favor of new experimental actor implementation [#73](https://github.com/ruby-concurrency/concurrent-ruby/pull/73). To avoid namespace collision it is living in `Actress` namespace until `Actor` is removed in next release. - -## Release v0.5.0 - -This is the most significant release of this gem since its inception. This release includes many improvements and optimizations. It also includes several bug fixes. The major areas of focus for this release were: - -* Stability improvements on Ruby versions with thread-level parallelism ([JRuby](http://jruby.org/) and [Rubinius](http://rubini.us/)) -* Creation of new low-level concurrency abstractions -* Internal refactoring to use the new low-level abstractions - -Most of these updates had no effect on the gem API. There are a few notable exceptions which were unavoidable. Please read the [release notes](API-Updates-in-v0.5.0) for more information. - -Specific changes include: - -* New class `IVar` -* New class `MVar` -* New class `ThreadLocalVar` -* New class `AtomicFixnum` -* New class method `dataflow` -* New class `Condition` -* New class `CountDownLatch` -* New class `DependencyCounter` -* New class `SafeTaskExecutor` -* New class `CopyOnNotifyObserverSet` -* New class `CopyOnWriteObserverSet` -* `Future` updated with `execute` API -* `ScheduledTask` updated with `execute` API -* New `Promise` API -* `Future` now extends `IVar` -* `Postable#post?` now returns an `IVar` -* Thread safety fixes to `Dereferenceable` -* Thread safety fixes to `Obligation` -* Thread safety fixes to `Supervisor` -* Thread safety fixes to `Event` -* Various other thread safety (race condition) fixes -* Refactored brittle tests -* Implemented pending tests -* Added JRuby and Rubinius as Travis CI build targets -* Added [CodeClimate](https://codeclimate.com/) code review -* Improved YARD documentation diff --git a/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/Gemfile b/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/Gemfile deleted file mode 100644 index b336031..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/Gemfile +++ /dev/null @@ -1,36 +0,0 @@ -source 'https://rubygems.org' - -require File.join(File.dirname(__FILE__), 'lib/concurrent-ruby/concurrent/version') -require File.join(File.dirname(__FILE__ ), 'lib/concurrent-ruby-edge/concurrent/edge/version') - -no_path = ENV['NO_PATH'] -options = no_path ? {} : { path: '.' } - -gem 'concurrent-ruby', Concurrent::VERSION, options -gem 'concurrent-ruby-edge', Concurrent::EDGE_VERSION, options -gem 'concurrent-ruby-ext', Concurrent::VERSION, options.merge(platform: :mri) - -group :development do - gem 'rake', '~> 13.0' - gem 'rake-compiler', '~> 1.0', '>= 1.0.7' - gem 'rake-compiler-dock', '~> 1.0' - gem 'pry', '~> 0.11', platforms: :mri -end - -group :documentation, optional: true do - gem 'yard', '~> 0.9.0', require: false - gem 'redcarpet', '~> 3.0', platforms: :mri # understands github markdown - gem 'md-ruby-eval', '~> 0.6' -end - -group :testing do - gem 'rspec', '~> 3.7' - gem 'timecop', '~> 0.9' - gem 'sigdump', require: false -end - -# made opt-in since it will not install on jruby 1.7 -group :coverage, optional: !ENV['COVERAGE'] do - gem 'simplecov', '~> 0.16.0', require: false - gem 'coveralls', '~> 0.8.2', require: false -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/LICENSE.txt b/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/LICENSE.txt deleted file mode 100644 index 1026f28..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -Copyright (c) Jerry D'Antonio -- released under the MIT license. - -http://www.opensource.org/licenses/mit-license.php - -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/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/README.md b/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/README.md deleted file mode 100644 index 15f011b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/README.md +++ /dev/null @@ -1,405 +0,0 @@ -# Concurrent Ruby - -[![Gem Version](https://badge.fury.io/rb/concurrent-ruby.svg)](http://badge.fury.io/rb/concurrent-ruby) -[![License](https://img.shields.io/badge/license-MIT-green.svg)](http://opensource.org/licenses/MIT) -[![Gitter chat](https://img.shields.io/badge/IRC%20(gitter)-devs%20%26%20users-brightgreen.svg)](https://gitter.im/ruby-concurrency/concurrent-ruby) - -Modern concurrency tools for Ruby. Inspired by -[Erlang](http://www.erlang.org/doc/reference_manual/processes.html), -[Clojure](http://clojure.org/concurrent_programming), -[Scala](http://akka.io/), -[Haskell](http://www.haskell.org/haskellwiki/Applications_and_libraries/Concurrency_and_parallelism#Concurrent_Haskell), -[F#](http://blogs.msdn.com/b/dsyme/archive/2010/02/15/async-and-parallel-design-patterns-in-f-part-3-agents.aspx), -[C#](http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx), -[Java](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/package-summary.html), -and classic concurrency patterns. - - - -The design goals of this gem are: - -* Be an 'unopinionated' toolbox that provides useful utilities without debating which is better - or why -* Remain free of external gem dependencies -* Stay true to the spirit of the languages providing inspiration -* But implement in a way that makes sense for Ruby -* Keep the semantics as idiomatic Ruby as possible -* Support features that make sense in Ruby -* Exclude features that don't make sense in Ruby -* Be small, lean, and loosely coupled -* Thread-safety -* Backward compatibility - -## Contributing - -**This gem depends on -[contributions](https://github.com/ruby-concurrency/concurrent-ruby/graphs/contributors) and we -appreciate your help. Would you like to contribute? Great! Have a look at -[issues with `looking-for-contributor` label](https://github.com/ruby-concurrency/concurrent-ruby/issues?q=is%3Aissue+is%3Aopen+label%3Alooking-for-contributor).** And if you pick something up let us know on the issue. - -You can also get started by triaging issues which may include reproducing bug reports or asking for vital information, such as version numbers or reproduction instructions. If you would like to start triaging issues, one easy way to get started is to [subscribe to concurrent-ruby on CodeTriage](https://www.codetriage.com/ruby-concurrency/concurrent-ruby). [![Open Source Helpers](https://www.codetriage.com/ruby-concurrency/concurrent-ruby/badges/users.svg)](https://www.codetriage.com/ruby-concurrency/concurrent-ruby) - -## Thread Safety - -*Concurrent Ruby makes one of the strongest thread safety guarantees of any Ruby concurrency -library, providing consistent behavior and guarantees on all three main Ruby interpreters -(MRI/CRuby, JRuby, TruffleRuby).* - -Every abstraction in this library is thread safe. Specific thread safety guarantees are documented -with each abstraction. - -It is critical to remember, however, that Ruby is a language of mutable references. *No* -concurrency library for Ruby can ever prevent the user from making thread safety mistakes (such as -sharing a mutable object between threads and modifying it on both threads) or from creating -deadlocks through incorrect use of locks. All the library can do is provide safe abstractions which -encourage safe practices. Concurrent Ruby provides more safe concurrency abstractions than any -other Ruby library, many of which support the mantra of -["Do not communicate by sharing memory; instead, share memory by communicating"](https://blog.golang.org/share-memory-by-communicating). -Concurrent Ruby is also the only Ruby library which provides a full suite of thread safe and -immutable variable types and data structures. - -We've also initiated discussion to document the [memory model](docs-source/synchronization.md) of Ruby which -would provide consistent behaviour and guarantees on all three main Ruby interpreters -(MRI/CRuby, JRuby, TruffleRuby). - -## Features & Documentation - -**The primary site for documentation is the automatically generated -[API documentation](http://ruby-concurrency.github.io/concurrent-ruby/index.html) which is up to -date with latest release.** This readme matches the master so may contain new stuff not yet -released. - -We also have a [IRC (gitter)](https://gitter.im/ruby-concurrency/concurrent-ruby). - -### Versioning - -* `concurrent-ruby` uses [Semantic Versioning](http://semver.org/) -* `concurrent-ruby-ext` has always same version as `concurrent-ruby` -* `concurrent-ruby-edge` will always be 0.y.z therefore following - [point 4](http://semver.org/#spec-item-4) applies *"Major version zero - (0.y.z) is for initial development. Anything may change at any time. The - public API should not be considered stable."* However we additionally use - following rules: - * Minor version increment means incompatible changes were made - * Patch version increment means only compatible changes were made - - -#### General-purpose Concurrency Abstractions - -* [Async](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Async.html): - A mixin module that provides simple asynchronous behavior to a class. Loosely based on Erlang's - [gen_server](http://www.erlang.org/doc/man/gen_server.html). -* [ScheduledTask](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/ScheduledTask.html): - Like a Future scheduled for a specific future time. -* [TimerTask](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/TimerTask.html): - A Thread that periodically wakes up to perform work at regular intervals. -* [Promises](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Promises.html): - Unified implementation of futures and promises which combines features of previous `Future`, - `Promise`, `IVar`, `Event`, `dataflow`, `Delay`, and (partially) `TimerTask` into a single - framework. It extensively uses the new synchronization layer to make all the features - **non-blocking** and **lock-free**, with the exception of obviously blocking operations like - `#wait`, `#value`. It also offers better performance. - -#### Thread-safe Value Objects, Structures, and Collections - -Collection classes that were originally part of the (deprecated) `thread_safe` gem: - -* [Array](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Array.html) A thread-safe - subclass of Ruby's standard [Array](http://ruby-doc.org/core/Array.html). -* [Hash](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Hash.html) A thread-safe - subclass of Ruby's standard [Hash](http://ruby-doc.org/core/Hash.html). -* [Set](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Set.html) A thread-safe - subclass of Ruby's standard [Set](http://ruby-doc.org/stdlib-2.4.0/libdoc/set/rdoc/Set.html). -* [Map](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Map.html) A hash-like object - that should have much better performance characteristics, especially under high concurrency, - than `Concurrent::Hash`. -* [Tuple](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Tuple.html) A fixed size - array with volatile (synchronized, thread safe) getters/setters. - -Value objects inspired by other languages: - -* [Maybe](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Maybe.html) A thread-safe, - immutable object representing an optional value, based on - [Haskell Data.Maybe](https://hackage.haskell.org/package/base-4.2.0.1/docs/Data-Maybe.html). - -Structure classes derived from Ruby's [Struct](http://ruby-doc.org/core/Struct.html): - -* [ImmutableStruct](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/ImmutableStruct.html) - Immutable struct where values are set at construction and cannot be changed later. -* [MutableStruct](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/MutableStruct.html) - Synchronized, mutable struct where values can be safely changed at any time. -* [SettableStruct](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/SettableStruct.html) - Synchronized, write-once struct where values can be set at most once, either at construction - or any time thereafter. - -Thread-safe variables: - -* [Agent](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Agent.html): A way to - manage shared, mutable, *asynchronous*, independent state. Based on Clojure's - [Agent](http://clojure.org/agents). -* [Atom](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Atom.html): A way to manage - shared, mutable, *synchronous*, independent state. Based on Clojure's - [Atom](http://clojure.org/atoms). -* [AtomicBoolean](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/AtomicBoolean.html) - A boolean value that can be updated atomically. -* [AtomicFixnum](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/AtomicFixnum.html) - A numeric value that can be updated atomically. -* [AtomicReference](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/AtomicReference.html) - An object reference that may be updated atomically. -* [Exchanger](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Exchanger.html) - A synchronization point at which threads can pair and swap elements within pairs. Based on - Java's [Exchanger](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Exchanger.html). -* [MVar](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/MVar.html) A synchronized - single element container. Based on Haskell's - [MVar](https://hackage.haskell.org/package/base-4.8.1.0/docs/Control-Concurrent-MVar.html) and - Scala's [MVar](http://docs.typelevel.org/api/scalaz/nightly/index.html#scalaz.concurrent.MVar$). -* [ThreadLocalVar](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/ThreadLocalVar.html) - A variable where the value is different for each thread. -* [TVar](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/TVar.html) A transactional - variable implementing software transactional memory (STM). Based on Clojure's - [Ref](http://clojure.org/refs). - -#### Java-inspired ThreadPools and Other Executors - -* See the [thread pool](http://ruby-concurrency.github.io/concurrent-ruby/master/file.thread_pools.html) - overview, which also contains a list of other Executors available. - -#### Thread Synchronization Classes and Algorithms - -* [CountDownLatch](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/CountDownLatch.html) - A synchronization object that allows one thread to wait on multiple other threads. -* [CyclicBarrier](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/CyclicBarrier.html) - A synchronization aid that allows a set of threads to all wait for each other to reach a common barrier point. -* [Event](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Event.html) Old school - kernel-style event. -* [ReadWriteLock](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/ReadWriteLock.html) - A lock that supports multiple readers but only one writer. -* [ReentrantReadWriteLock](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/ReentrantReadWriteLock.html) - A read/write lock with reentrant and upgrade features. -* [Semaphore](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Semaphore.html) - A counting-based locking mechanism that uses permits. -* [AtomicMarkableReference](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/AtomicMarkableReference.html) - -#### Deprecated - -Deprecated features are still available and bugs are being fixed, but new features will not be added. - -* ~~[Future](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Future.html): - An asynchronous operation that produces a value.~~ Replaced by - [Promises](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Promises.html). - * ~~[.dataflow](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent.html#dataflow-class_method): - Built on Futures, Dataflow allows you to create a task that will be scheduled when all of - its data dependencies are available.~~ Replaced by - [Promises](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Promises.html). -* ~~[Promise](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Promise.html): Similar - to Futures, with more features.~~ Replaced by - [Promises](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Promises.html). -* ~~[Delay](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Delay.html) Lazy evaluation - of a block yielding an immutable result. Based on Clojure's - [delay](https://clojuredocs.org/clojure.core/delay).~~ Replaced by - [Promises](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Promises.html). -* ~~[IVar](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/IVar.html) Similar to a - "future" but can be manually assigned once, after which it becomes immutable.~~ Replaced by - [Promises](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Promises.html). - -### Edge Features - -These are available in the `concurrent-ruby-edge` companion gem. - -These features are under active development and may change frequently. They are expected not to -keep backward compatibility (there may also lack tests and documentation). Semantic versions will -be obeyed though. Features developed in `concurrent-ruby-edge` are expected to move to -`concurrent-ruby` when final. - -* [Actor](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Actor.html): Implements - the Actor Model, where concurrent actors exchange messages. - *Status: Partial documentation and tests; depends on new future/promise framework; stability is good.* -* [Channel](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Channel.html): - Communicating Sequential Processes ([CSP](https://en.wikipedia.org/wiki/Communicating_sequential_processes)). - Functionally equivalent to Go [channels](https://tour.golang.org/concurrency/2) with additional - inspiration from Clojure [core.async](https://clojure.github.io/core.async/). - *Status: Partial documentation and tests.* -* [LazyRegister](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/LazyRegister.html) -* [LockFreeLinkedSet](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Edge/LockFreeLinkedSet.html) - *Status: will be moved to core soon.* -* [LockFreeStack](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/LockFreeStack.html) - *Status: missing documentation and tests.* -* [Promises::Channel](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Promises/Channel.html) - A first in first out channel that accepts messages with push family of methods and returns - messages with pop family of methods. - Pop and push operations can be represented as futures, see `#pop_op` and `#push_op`. - The capacity of the channel can be limited to support back pressure, use capacity option in `#initialize`. - `#pop` method blocks ans `#pop_op` returns pending future if there is no message in the channel. - If the capacity is limited the `#push` method blocks and `#push_op` returns pending future. -* [Cancellation](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Cancellation.html) - The Cancellation abstraction provides cooperative cancellation. - - The standard methods `Thread#raise` of `Thread#kill` available in Ruby - are very dangerous (see linked the blog posts bellow). - Therefore concurrent-ruby provides an alternative. - - * - * - * - - It provides an object which represents a task which can be executed, - the task has to get the reference to the object and periodically cooperatively check that it is not cancelled. - Good practices to make tasks cancellable: - * check cancellation every cycle of a loop which does significant work, - * do all blocking actions in a loop with a timeout then on timeout check cancellation - and if ok block again with the timeout -* [Throttle](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Throttle.html) - A tool managing concurrency level of tasks. -* [ErlangActor](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/ErlangActor.html) - Actor implementation which precisely matches Erlang actor behaviour. - Requires at least Ruby 2.1 otherwise it's not loaded. -* [WrappingExecutor](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/WrappingExecutor.html) - A delegating executor which modifies each task before the task is given to - the target executor it delegates to. - -## Supported Ruby versions - -* MRI 2.3 and above -* Latest JRuby 9000 -* Latest TruffleRuby - -## Usage - -Everything within this gem can be loaded simply by requiring it: - -```ruby -require 'concurrent' -``` - -You can also require a specific abstraction [part of the public documentation](https://ruby-concurrency.github.io/concurrent-ruby/master/index.html) since concurrent-ruby 1.2.0, for example: -```ruby -require 'concurrent/map' -require 'concurrent/atomic/atomic_reference' -require 'concurrent/executor/fixed_thread_pool' -``` - -To use the tools in the Edge gem it must be required separately: - -```ruby -require 'concurrent-edge' -``` - -If the library does not behave as expected, `Concurrent.use_stdlib_logger(Logger::DEBUG)` could -help to reveal the problem. - -## Installation - -```shell -gem install concurrent-ruby -``` - -or add the following line to Gemfile: - -```ruby -gem 'concurrent-ruby', require: 'concurrent' -``` - -and run `bundle install` from your shell. - -### Edge Gem Installation - -The Edge gem must be installed separately from the core gem: - -```shell -gem install concurrent-ruby-edge -``` - -or add the following line to Gemfile: - -```ruby -gem 'concurrent-ruby-edge', require: 'concurrent-edge' -``` - -and run `bundle install` from your shell. - - -### C Extensions for MRI - -Potential performance improvements may be achieved under MRI by installing optional C extensions. -To minimise installation errors the C extensions are available in the `concurrent-ruby-ext` -extension gem. `concurrent-ruby` and `concurrent-ruby-ext` are always released together with same -version. Simply install the extension gem too: - -```ruby -gem install concurrent-ruby-ext -``` - -or add the following line to Gemfile: - -```ruby -gem 'concurrent-ruby-ext' -``` - -and run `bundle install` from your shell. - -In code it is only necessary to - -```ruby -require 'concurrent' -``` - -The `concurrent-ruby` gem will automatically detect the presence of the `concurrent-ruby-ext` gem -and load the appropriate C extensions. - -#### Note For gem developers - -No gems should depend on `concurrent-ruby-ext`. Doing so will force C extensions on your users. The -best practice is to depend on `concurrent-ruby` and let users to decide if they want C extensions. - -## Building the gem - -### Requirements - -* Recent CRuby -* JRuby, `rbenv install jruby-9.2.17.0` -* Set env variable `CONCURRENT_JRUBY_HOME` to point to it, e.g. `/usr/local/opt/rbenv/versions/jruby-9.2.17.0` -* Install Docker, required for Windows builds - -### Publishing the Gem - -* Update `version.rb` -* Update the CHANGELOG -* Add the new version to `docs-source/signpost.md`. Needs to be done only if there are visible changes in the documentation. -* Commit (and push) the changes. -* Use `bundle exec rake release` to release the gem. - It consists of `['release:checks', 'release:build', 'release:test', 'release:publish']` steps. - It will ask at the end before publishing anything. Steps can also be executed individually. - -## Maintainers - -* [Benoit Daloze](https://github.com/eregon) -* [Matthew Draper](https://github.com/matthewd) -* [Rafael França](https://github.com/rafaelfranca) -* [Samuel Williams](https://github.com/ioquatix) - -### Special Thanks to - -* [Jerry D'Antonio](https://github.com/jdantonio) for creating the gem -* [Brian Durand](https://github.com/bdurand) for the `ref` gem -* [Charles Oliver Nutter](https://github.com/headius) for the `atomic` and `thread_safe` gems -* [thedarkone](https://github.com/thedarkone) for the `thread_safe` gem - -to the past maintainers - -* [Chris Seaton](https://github.com/chrisseaton) -* [Petr Chalupa](https://github.com/pitr-ch) -* [Michele Della Torre](https://github.com/mighe) -* [Paweł Obrok](https://github.com/obrok) -* [Lucas Allan](https://github.com/lucasallan) - -and to [Ruby Association](https://www.ruby.or.jp/en/) for sponsoring a project -["Enhancing Ruby’s concurrency tooling"](https://www.ruby.or.jp/en/news/20181106) in 2018. - -## License and Copyright - -*Concurrent Ruby* is free software released under the -[MIT License](http://www.opensource.org/licenses/MIT). - -The *Concurrent Ruby* [logo](https://raw.githubusercontent.com/ruby-concurrency/concurrent-ruby/master/docs-source/logo/concurrent-ruby-logo-300x300.png) was -designed by [David Jones](https://twitter.com/zombyboy). It is Copyright © 2014 -[Jerry D'Antonio](https://twitter.com/jerrydantonio). All Rights Reserved. diff --git a/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/Rakefile b/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/Rakefile deleted file mode 100644 index f167f46..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/Rakefile +++ /dev/null @@ -1,319 +0,0 @@ -require_relative 'lib/concurrent-ruby/concurrent/version' -require_relative 'lib/concurrent-ruby-edge/concurrent/edge/version' -require_relative 'lib/concurrent-ruby/concurrent/utility/engine' - -core_gemspec = Gem::Specification.load File.join(__dir__, 'concurrent-ruby.gemspec') -ext_gemspec = Gem::Specification.load File.join(__dir__, 'concurrent-ruby-ext.gemspec') -edge_gemspec = Gem::Specification.load File.join(__dir__, 'concurrent-ruby-edge.gemspec') - -require 'rake/javaextensiontask' - -ENV['JRUBY_HOME'] = ENV['CONCURRENT_JRUBY_HOME'] if ENV['CONCURRENT_JRUBY_HOME'] && !Concurrent.on_jruby? - -Rake::JavaExtensionTask.new('concurrent_ruby', core_gemspec) do |ext| - ext.ext_dir = 'ext/concurrent-ruby' - ext.lib_dir = 'lib/concurrent-ruby/concurrent' -end - -unless Concurrent.on_jruby? || Concurrent.on_truffleruby? - require 'rake/extensiontask' - - Rake::ExtensionTask.new('concurrent_ruby_ext', ext_gemspec) do |ext| - ext.ext_dir = 'ext/concurrent-ruby-ext' - ext.lib_dir = 'lib/concurrent-ruby/concurrent' - ext.source_pattern = '*.{c,h}' - - ext.cross_compile = true - ext.cross_platform = ['x86-mingw32', 'x64-mingw32'] - end -end - -require 'rake_compiler_dock' -namespace :repackage do - desc '* with Windows fat distributions' - task :all do - Dir.chdir(__dir__) do - # store gems in vendor cache for docker - Bundler.with_original_env do - sh 'bundle package' - end - - # build only the jar file not the whole gem for java platform, the jar is part the concurrent-ruby-x.y.z.gem - Rake::Task['lib/concurrent-ruby/concurrent/concurrent_ruby.jar'].invoke - - # build all gem files - %w[x86-mingw32 x64-mingw32].each do |plat| - RakeCompilerDock.sh( - "bundle install --local && bundle exec rake native:#{plat} gem --trace", - platform: plat, - options: ['--privileged'], # otherwise the directory in the image is empty - runas: false) - end - end - end -end - -require 'rubygems' -require 'rubygems/package_task' - -Gem::PackageTask.new(core_gemspec) {} if core_gemspec -Gem::PackageTask.new(ext_gemspec) {} if ext_gemspec && !Concurrent.on_jruby? -Gem::PackageTask.new(edge_gemspec) {} if edge_gemspec - -CLEAN.include( - 'lib/concurrent-ruby/concurrent/concurrent_ruby_ext.*', - 'lib/concurrent-ruby/concurrent/2.*', - 'lib/concurrent-ruby/concurrent/*.jar') - -begin - require 'rspec' - require 'rspec/core/rake_task' - - RSpec::Core::RakeTask.new(:spec) - - namespace :spec do - desc '* Configured for ci' - RSpec::Core::RakeTask.new(:ci) do |t| - options = %w[ --color - --backtrace - --order defined - --format documentation ] - t.rspec_opts = [*options].join(' ') - end - - desc '* test packaged and installed gems instead of local files' - task :installed do - Bundler.with_original_env do - Dir.chdir(__dir__) do - sh "gem install pkg/concurrent-ruby-#{Concurrent::VERSION}.gem" - sh "gem install pkg/concurrent-ruby-ext-#{Concurrent::VERSION}.gem" if Concurrent.on_cruby? - sh "gem install pkg/concurrent-ruby-edge-#{Concurrent::EDGE_VERSION}.gem" - ENV['NO_PATH'] = 'true' - sh 'bundle update' - sh 'bundle exec rake spec:ci' - end - end - end - end - - desc 'executed in CI' - task :ci => [:compile, 'spec:ci'] - - desc 'run each spec file in a separate process to help find missing requires' - task 'spec:isolated' do - glob = "#{ENV['DIR'] || 'spec'}/**/*_spec.rb" - from = ENV['FROM'] - env = { 'ISOLATED' => 'true' } - Dir[glob].each do |spec| - next if from and from != spec - from = nil if from == spec - - sh env, 'rspec', spec - end - end - - task :default => [:clobber, :compile, :spec] -rescue LoadError => e - puts 'RSpec is not installed, skipping test task definitions: ' + e.message -end - -current_yard_version_name = Concurrent::VERSION - -begin - require 'yard' - require 'md_ruby_eval' - require_relative 'support/yard_full_types' - - common_yard_options = ['--no-yardopts', - '--no-document', - '--no-private', - '--embed-mixins', - '--markup', 'markdown', - '--title', 'Concurrent Ruby', - '--template', 'default', - '--template-path', 'yard-template', - '--default-return', 'undocumented'] - - desc 'Generate YARD Documentation (signpost, master)' - task :yard => ['yard:signpost', 'yard:master'] - - namespace :yard do - - desc '* eval markdown files' - task :eval_md do - Dir.chdir File.join(__dir__, 'docs-source') do - sh 'bundle exec md-ruby-eval --auto' - end - end - - task :update_readme do - Dir.chdir __dir__ do - content = File.read(File.join('README.md')). - gsub(/\[([\w ]+)\]\(http:\/\/ruby-concurrency\.github\.io\/concurrent-ruby\/master\/.*\)/) do |_| - case $1 - when 'LockFreeLinkedSet' - "{Concurrent::Edge::#{$1} #{$1}}" - when '.dataflow' - '{Concurrent.dataflow Concurrent.dataflow}' - when 'thread pool' - '{file:thread_pools.md thread pool}' - else - "{Concurrent::#{$1} #{$1}}" - end - end - FileUtils.mkpath 'tmp' - File.write 'tmp/README.md', content - end - end - - define_yard_task = -> name do - output_dir = "docs/#{name}" - - removal_name = "remove.#{name}" - task removal_name do - Dir.chdir __dir__ do - FileUtils.rm_rf output_dir - end - end - - desc "* of #{name} into subdir #{name}" - YARD::Rake::YardocTask.new(name) do |yard| - yard.options.push( - '--output-dir', output_dir, - '--main', 'tmp/README.md', - *common_yard_options) - yard.files = ['./lib/concurrent-ruby/**/*.rb', - './lib/concurrent-ruby-edge/**/*.rb', - './ext/concurrent_ruby_ext/**/*.c', - '-', - 'docs-source/thread_pools.md', - 'docs-source/promises.out.md', - 'docs-source/medium-example.out.rb', - 'LICENSE.txt', - 'CHANGELOG.md'] - end - Rake::Task[name].prerequisites.push removal_name, - # 'yard:eval_md', - 'yard:update_readme' - end - - define_yard_task.call current_yard_version_name - define_yard_task.call 'master' - - desc "* signpost for versions" - YARD::Rake::YardocTask.new(:signpost) do |yard| - yard.options.push( - '--output-dir', 'docs', - '--main', 'docs-source/signpost.md', - *common_yard_options) - yard.files = ['no-lib'] - end - end - -rescue LoadError => e - puts 'YARD is not installed, skipping documentation task definitions: ' + e.message -end - -desc 'build, test, and publish the gem' -task :release => ['release:checks', 'release:build', 'release:test', 'release:publish'] - -namespace :release do - # Depends on environment of @pitr-ch - - task :checks do - Dir.chdir(__dir__) do - sh 'test -z "$(git status --porcelain)"' do |ok, res| - unless ok - begin - status = `git status --porcelain` - STDOUT.puts 'There are local changes that you might want to commit.', status, 'Continue? (y/n)' - input = STDIN.gets.strip.downcase - end until %w(y n).include?(input) - exit 1 if input == 'n' - end - end - sh 'git fetch' - sh 'test $(git show-ref --verify --hash refs/heads/master) = ' + - '$(git show-ref --verify --hash refs/remotes/origin/master)' do |ok, res| - unless ok - begin - STDOUT.puts 'Local master branch is not pushed to origin.', 'Continue? (y/n)' - input = STDIN.gets.strip.downcase - end until %w(y n).include?(input) - exit 1 if input == 'n' - end - end - end - end - - desc '* build all *.gem files necessary for release' - task :build => [:clobber, 'repackage:all'] - - desc '* test actual installed gems instead of cloned repository on MRI and JRuby' - task :test do - Dir.chdir(__dir__) do - puts "Testing with the installed gem" - - Bundler.with_original_env do - sh 'ruby -v' - sh 'bundle exec rake spec:installed' - - env = { "PATH" => "#{ENV['CONCURRENT_JRUBY_HOME']}/bin:#{ENV['PATH']}" } - sh env, 'ruby -v' - sh env, 'bundle exec rake spec:installed' - end - - puts 'Windows build is untested' - end - end - - desc '* do all nested steps' - task :publish => ['publish:ask', 'publish:tag', 'publish:rubygems', 'publish:post_steps'] - - namespace :publish do - publish_base = true - publish_edge = false - - task :ask do - begin - STDOUT.puts 'Do you want to publish anything now? (y/n)' - input = STDIN.gets.strip.downcase - end until %w(y n).include?(input) - exit 1 if input == 'n' - begin - STDOUT.puts 'It will publish `concurrent-ruby`. Do you want to publish `concurrent-ruby-edge`? (y/n)' - input = STDIN.gets.strip.downcase - end until %w(y n).include?(input) - publish_edge = input == 'y' - end - - desc '** tag HEAD with current version and push to github' - task :tag => :ask do - Dir.chdir(__dir__) do - sh "git tag v#{Concurrent::VERSION}" if publish_base - sh "git push origin v#{Concurrent::VERSION}" if publish_base - sh "git tag edge-v#{Concurrent::EDGE_VERSION}" if publish_edge - sh "git push origin edge-v#{Concurrent::EDGE_VERSION}" if publish_edge - end - end - - desc '** push all *.gem files to rubygems' - task :rubygems => :ask do - Dir.chdir(__dir__) do - sh "gem push pkg/concurrent-ruby-#{Concurrent::VERSION}.gem" if publish_base - sh "gem push pkg/concurrent-ruby-edge-#{Concurrent::EDGE_VERSION}.gem" if publish_edge - sh "gem push pkg/concurrent-ruby-ext-#{Concurrent::VERSION}.gem" if publish_base - sh "gem push pkg/concurrent-ruby-ext-#{Concurrent::VERSION}-x64-mingw32.gem" if publish_base - sh "gem push pkg/concurrent-ruby-ext-#{Concurrent::VERSION}-x86-mingw32.gem" if publish_base - end - end - - desc '** print post release steps' - task :post_steps do - # TODO: (petr 05-Jun-2021) automate and renew the process - puts 'Manually: create a release on GitHub with relevant changelog part' - puts 'Manually: send email same as release with relevant changelog part' - puts 'Manually: tweet' - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/ConcurrentRubyService.java b/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/ConcurrentRubyService.java deleted file mode 100644 index fb6be96..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/ConcurrentRubyService.java +++ /dev/null @@ -1,17 +0,0 @@ -import org.jruby.Ruby; -import org.jruby.runtime.load.BasicLibraryService; - -import java.io.IOException; - -public class ConcurrentRubyService implements BasicLibraryService { - - public boolean basicLoad(final Ruby runtime) throws IOException { - new com.concurrent_ruby.ext.AtomicReferenceLibrary().load(runtime, false); - new com.concurrent_ruby.ext.JavaAtomicBooleanLibrary().load(runtime, false); - new com.concurrent_ruby.ext.JavaAtomicFixnumLibrary().load(runtime, false); - new com.concurrent_ruby.ext.JavaSemaphoreLibrary().load(runtime, false); - new com.concurrent_ruby.ext.SynchronizationLibrary().load(runtime, false); - new com.concurrent_ruby.ext.JRubyMapBackendLibrary().load(runtime, false); - return true; - } -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/AtomicReferenceLibrary.java b/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/AtomicReferenceLibrary.java deleted file mode 100644 index dfa9e77..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/AtomicReferenceLibrary.java +++ /dev/null @@ -1,175 +0,0 @@ -package com.concurrent_ruby.ext; - -import java.lang.reflect.Field; -import java.io.IOException; -import java.util.concurrent.atomic.AtomicReferenceFieldUpdater; -import org.jruby.Ruby; -import org.jruby.RubyClass; -import org.jruby.RubyModule; -import org.jruby.RubyNumeric; -import org.jruby.RubyObject; -import org.jruby.anno.JRubyClass; -import org.jruby.anno.JRubyMethod; -import org.jruby.runtime.ObjectAllocator; -import org.jruby.runtime.ThreadContext; -import org.jruby.runtime.builtin.IRubyObject; -import org.jruby.runtime.load.Library; - -/** - * This library adds an atomic reference type to JRuby for use in the atomic - * library. We do a native version to avoid the implicit value coercion that - * normally happens through JI. - * - * @author headius - */ -public class AtomicReferenceLibrary implements Library { - public void load(Ruby runtime, boolean wrap) throws IOException { - RubyModule concurrentMod = runtime.defineModule("Concurrent"); - RubyClass atomicCls = concurrentMod.defineClassUnder("JavaAtomicReference", runtime.getObject(), JRUBYREFERENCE_ALLOCATOR); - try { - sun.misc.Unsafe.class.getMethod("getAndSetObject", Object.class); - atomicCls.setAllocator(JRUBYREFERENCE8_ALLOCATOR); - } catch (Exception e) { - // leave it as Java 6/7 version - } - atomicCls.defineAnnotatedMethods(JRubyReference.class); - } - - private static final ObjectAllocator JRUBYREFERENCE_ALLOCATOR = new ObjectAllocator() { - public IRubyObject allocate(Ruby runtime, RubyClass klazz) { - return new JRubyReference(runtime, klazz); - } - }; - - private static final ObjectAllocator JRUBYREFERENCE8_ALLOCATOR = new ObjectAllocator() { - public IRubyObject allocate(Ruby runtime, RubyClass klazz) { - return new JRubyReference8(runtime, klazz); - } - }; - - @JRubyClass(name="JRubyReference", parent="Object") - public static class JRubyReference extends RubyObject { - volatile IRubyObject reference; - - static final sun.misc.Unsafe UNSAFE; - static final long referenceOffset; - - static { - try { - UNSAFE = UnsafeHolder.U; - Class k = JRubyReference.class; - referenceOffset = UNSAFE.objectFieldOffset(k.getDeclaredField("reference")); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - public JRubyReference(Ruby runtime, RubyClass klass) { - super(runtime, klass); - } - - @JRubyMethod - public IRubyObject initialize(ThreadContext context) { - UNSAFE.putObject(this, referenceOffset, context.nil); - return context.nil; - } - - @JRubyMethod - public IRubyObject initialize(ThreadContext context, IRubyObject value) { - UNSAFE.putObject(this, referenceOffset, value); - return context.nil; - } - - @JRubyMethod(name = {"get", "value"}) - public IRubyObject get() { - return reference; - } - - @JRubyMethod(name = {"set", "value="}) - public IRubyObject set(IRubyObject newValue) { - UNSAFE.putObjectVolatile(this, referenceOffset, newValue); - return newValue; - } - - @JRubyMethod(name = {"compare_and_set", "compare_and_swap"}) - public IRubyObject compare_and_set(ThreadContext context, IRubyObject expectedValue, IRubyObject newValue) { - Ruby runtime = context.runtime; - - if (expectedValue instanceof RubyNumeric) { - // numerics are not always idempotent in Ruby, so we need to do slower logic - return compareAndSetNumeric(context, expectedValue, newValue); - } - - return runtime.newBoolean(UNSAFE.compareAndSwapObject(this, referenceOffset, expectedValue, newValue)); - } - - @JRubyMethod(name = {"get_and_set", "swap"}) - public IRubyObject get_and_set(ThreadContext context, IRubyObject newValue) { - // less-efficient version for Java 6 and 7 - while (true) { - IRubyObject oldValue = get(); - if (UNSAFE.compareAndSwapObject(this, referenceOffset, oldValue, newValue)) { - return oldValue; - } - } - } - - private IRubyObject compareAndSetNumeric(ThreadContext context, IRubyObject expectedValue, IRubyObject newValue) { - Ruby runtime = context.runtime; - - // loop until: - // * reference CAS would succeed for same-valued objects - // * current and expected have different values as determined by #equals - while (true) { - IRubyObject current = reference; - - if (!(current instanceof RubyNumeric)) { - // old value is not numeric, CAS fails - return runtime.getFalse(); - } - - RubyNumeric currentNumber = (RubyNumeric)current; - if (!currentNumber.equals(expectedValue)) { - // current number does not equal expected, fail CAS - return runtime.getFalse(); - } - - // check that current has not changed, or else allow loop to repeat - boolean success = UNSAFE.compareAndSwapObject(this, referenceOffset, current, newValue); - if (success) { - // value is same and did not change in interim...success - return runtime.getTrue(); - } - } - } - } - - private static final class UnsafeHolder { - private UnsafeHolder(){} - - public static final sun.misc.Unsafe U = loadUnsafe(); - - private static sun.misc.Unsafe loadUnsafe() { - try { - Class unsafeClass = Class.forName("sun.misc.Unsafe"); - Field f = unsafeClass.getDeclaredField("theUnsafe"); - f.setAccessible(true); - return (sun.misc.Unsafe) f.get(null); - } catch (Exception e) { - return null; - } - } - } - - public static class JRubyReference8 extends JRubyReference { - public JRubyReference8(Ruby runtime, RubyClass klass) { - super(runtime, klass); - } - - @Override - public IRubyObject get_and_set(ThreadContext context, IRubyObject newValue) { - // efficient version for Java 8 - return (IRubyObject)UNSAFE.getAndSetObject(this, referenceOffset, newValue); - } - } -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/JRubyMapBackendLibrary.java b/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/JRubyMapBackendLibrary.java deleted file mode 100644 index a09f916..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/JRubyMapBackendLibrary.java +++ /dev/null @@ -1,248 +0,0 @@ -package com.concurrent_ruby.ext; - -import org.jruby.*; -import org.jruby.anno.JRubyClass; -import org.jruby.anno.JRubyMethod; -import com.concurrent_ruby.ext.jsr166e.ConcurrentHashMap; -import com.concurrent_ruby.ext.jsr166e.ConcurrentHashMapV8; -import com.concurrent_ruby.ext.jsr166e.nounsafe.*; -import org.jruby.runtime.Block; -import org.jruby.runtime.ObjectAllocator; -import org.jruby.runtime.ThreadContext; -import org.jruby.runtime.builtin.IRubyObject; -import org.jruby.runtime.load.Library; - -import java.io.IOException; -import java.util.Map; - -import static org.jruby.runtime.Visibility.PRIVATE; - -/** - * Native Java implementation to avoid the JI overhead. - * - * @author thedarkone - */ -public class JRubyMapBackendLibrary implements Library { - public void load(Ruby runtime, boolean wrap) throws IOException { - - RubyModule concurrentMod = runtime.defineModule("Concurrent"); - RubyModule thread_safeMod = concurrentMod.defineModuleUnder("Collection"); - RubyClass jrubyRefClass = thread_safeMod.defineClassUnder("JRubyMapBackend", runtime.getObject(), BACKEND_ALLOCATOR); - jrubyRefClass.setAllocator(BACKEND_ALLOCATOR); - jrubyRefClass.defineAnnotatedMethods(JRubyMapBackend.class); - } - - private static final ObjectAllocator BACKEND_ALLOCATOR = new ObjectAllocator() { - public IRubyObject allocate(Ruby runtime, RubyClass klazz) { - return new JRubyMapBackend(runtime, klazz); - } - }; - - @JRubyClass(name="JRubyMapBackend", parent="Object") - public static class JRubyMapBackend extends RubyObject { - // Defaults used by the CHM - static final int DEFAULT_INITIAL_CAPACITY = 16; - static final float DEFAULT_LOAD_FACTOR = 0.75f; - - public static final boolean CAN_USE_UNSAFE_CHM = canUseUnsafeCHM(); - - private ConcurrentHashMap map; - - private static ConcurrentHashMap newCHM(int initialCapacity, float loadFactor) { - if (CAN_USE_UNSAFE_CHM) { - return new ConcurrentHashMapV8(initialCapacity, loadFactor); - } else { - return new com.concurrent_ruby.ext.jsr166e.nounsafe.ConcurrentHashMapV8(initialCapacity, loadFactor); - } - } - - private static ConcurrentHashMap newCHM() { - return newCHM(DEFAULT_INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR); - } - - private static boolean canUseUnsafeCHM() { - try { - new com.concurrent_ruby.ext.jsr166e.ConcurrentHashMapV8(); // force class load and initialization - return true; - } catch (Throwable t) { // ensuring we really do catch everything - // Doug's Unsafe setup errors always have this "Could not ini.." message - if (isCausedBySecurityException(t)) { - return false; - } - throw (t instanceof RuntimeException ? (RuntimeException) t : new RuntimeException(t)); - } - } - - private static boolean isCausedBySecurityException(Throwable t) { - while (t != null) { - if ((t.getMessage() != null && t.getMessage().contains("Could not initialize intrinsics")) || t instanceof SecurityException) { - return true; - } - t = t.getCause(); - } - return false; - } - - public JRubyMapBackend(Ruby runtime, RubyClass klass) { - super(runtime, klass); - } - - @JRubyMethod - public IRubyObject initialize(ThreadContext context) { - map = newCHM(); - return context.getRuntime().getNil(); - } - - @JRubyMethod - public IRubyObject initialize(ThreadContext context, IRubyObject options) { - map = toCHM(context, options); - return context.getRuntime().getNil(); - } - - private ConcurrentHashMap toCHM(ThreadContext context, IRubyObject options) { - Ruby runtime = context.getRuntime(); - if (!options.isNil() && options.respondsTo("[]")) { - IRubyObject rInitialCapacity = options.callMethod(context, "[]", runtime.newSymbol("initial_capacity")); - IRubyObject rLoadFactor = options.callMethod(context, "[]", runtime.newSymbol("load_factor")); - int initialCapacity = !rInitialCapacity.isNil() ? RubyNumeric.num2int(rInitialCapacity.convertToInteger()) : DEFAULT_INITIAL_CAPACITY; - float loadFactor = !rLoadFactor.isNil() ? (float)RubyNumeric.num2dbl(rLoadFactor.convertToFloat()) : DEFAULT_LOAD_FACTOR; - return newCHM(initialCapacity, loadFactor); - } else { - return newCHM(); - } - } - - @JRubyMethod(name = "[]", required = 1) - public IRubyObject op_aref(ThreadContext context, IRubyObject key) { - IRubyObject value; - return ((value = map.get(key)) == null) ? context.getRuntime().getNil() : value; - } - - @JRubyMethod(name = {"[]="}, required = 2) - public IRubyObject op_aset(IRubyObject key, IRubyObject value) { - map.put(key, value); - return value; - } - - @JRubyMethod - public IRubyObject put_if_absent(IRubyObject key, IRubyObject value) { - IRubyObject result = map.putIfAbsent(key, value); - return result == null ? getRuntime().getNil() : result; - } - - @JRubyMethod - public IRubyObject compute_if_absent(final ThreadContext context, final IRubyObject key, final Block block) { - return map.computeIfAbsent(key, new ConcurrentHashMap.Fun() { - @Override - public IRubyObject apply(IRubyObject key) { - return block.yieldSpecific(context); - } - }); - } - - @JRubyMethod - public IRubyObject compute_if_present(final ThreadContext context, final IRubyObject key, final Block block) { - IRubyObject result = map.computeIfPresent(key, new ConcurrentHashMap.BiFun() { - @Override - public IRubyObject apply(IRubyObject key, IRubyObject oldValue) { - IRubyObject result = block.yieldSpecific(context, oldValue == null ? context.getRuntime().getNil() : oldValue); - return result.isNil() ? null : result; - } - }); - return result == null ? context.getRuntime().getNil() : result; - } - - @JRubyMethod - public IRubyObject compute(final ThreadContext context, final IRubyObject key, final Block block) { - IRubyObject result = map.compute(key, new ConcurrentHashMap.BiFun() { - @Override - public IRubyObject apply(IRubyObject key, IRubyObject oldValue) { - IRubyObject result = block.yieldSpecific(context, oldValue == null ? context.getRuntime().getNil() : oldValue); - return result.isNil() ? null : result; - } - }); - return result == null ? context.getRuntime().getNil() : result; - } - - @JRubyMethod - public IRubyObject merge_pair(final ThreadContext context, final IRubyObject key, final IRubyObject value, final Block block) { - IRubyObject result = map.merge(key, value, new ConcurrentHashMap.BiFun() { - @Override - public IRubyObject apply(IRubyObject oldValue, IRubyObject newValue) { - IRubyObject result = block.yieldSpecific(context, oldValue == null ? context.getRuntime().getNil() : oldValue); - return result.isNil() ? null : result; - } - }); - return result == null ? context.getRuntime().getNil() : result; - } - - @JRubyMethod - public RubyBoolean replace_pair(IRubyObject key, IRubyObject oldValue, IRubyObject newValue) { - return getRuntime().newBoolean(map.replace(key, oldValue, newValue)); - } - - @JRubyMethod(name = "key?", required = 1) - public RubyBoolean has_key_p(IRubyObject key) { - return map.containsKey(key) ? getRuntime().getTrue() : getRuntime().getFalse(); - } - - @JRubyMethod - public IRubyObject key(IRubyObject value) { - final IRubyObject key = map.findKey(value); - return key == null ? getRuntime().getNil() : key; - } - - @JRubyMethod - public IRubyObject replace_if_exists(IRubyObject key, IRubyObject value) { - IRubyObject result = map.replace(key, value); - return result == null ? getRuntime().getNil() : result; - } - - @JRubyMethod - public IRubyObject get_and_set(IRubyObject key, IRubyObject value) { - IRubyObject result = map.put(key, value); - return result == null ? getRuntime().getNil() : result; - } - - @JRubyMethod - public IRubyObject delete(IRubyObject key) { - IRubyObject result = map.remove(key); - return result == null ? getRuntime().getNil() : result; - } - - @JRubyMethod - public RubyBoolean delete_pair(IRubyObject key, IRubyObject value) { - return getRuntime().newBoolean(map.remove(key, value)); - } - - @JRubyMethod - public IRubyObject clear() { - map.clear(); - return this; - } - - @JRubyMethod - public IRubyObject each_pair(ThreadContext context, Block block) { - for (Map.Entry entry : map.entrySet()) { - block.yieldSpecific(context, entry.getKey(), entry.getValue()); - } - return this; - } - - @JRubyMethod - public RubyFixnum size(ThreadContext context) { - return context.getRuntime().newFixnum(map.size()); - } - - @JRubyMethod - public IRubyObject get_or_default(IRubyObject key, IRubyObject defaultValue) { - return map.getValueOrDefault(key, defaultValue); - } - - @JRubyMethod(visibility = PRIVATE) - public JRubyMapBackend initialize_copy(ThreadContext context, IRubyObject other) { - map = newCHM(); - return this; - } - } -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/JavaAtomicBooleanLibrary.java b/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/JavaAtomicBooleanLibrary.java deleted file mode 100644 index b566076..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/JavaAtomicBooleanLibrary.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.concurrent_ruby.ext; - -import org.jruby.Ruby; -import org.jruby.RubyBoolean; -import org.jruby.RubyClass; -import org.jruby.RubyModule; -import org.jruby.RubyNil; -import org.jruby.RubyObject; -import org.jruby.anno.JRubyClass; -import org.jruby.anno.JRubyMethod; -import org.jruby.runtime.ObjectAllocator; -import org.jruby.runtime.ThreadContext; -import org.jruby.runtime.builtin.IRubyObject; -import org.jruby.runtime.load.Library; - -import java.io.IOException; -import java.util.concurrent.atomic.AtomicBoolean; - -public class JavaAtomicBooleanLibrary implements Library { - - public void load(Ruby runtime, boolean wrap) throws IOException { - RubyModule concurrentMod = runtime.defineModule("Concurrent"); - RubyClass atomicCls = concurrentMod.defineClassUnder("JavaAtomicBoolean", runtime.getObject(), JRUBYREFERENCE_ALLOCATOR); - atomicCls.defineAnnotatedMethods(JavaAtomicBoolean.class); - } - - private static final ObjectAllocator JRUBYREFERENCE_ALLOCATOR = new ObjectAllocator() { - public IRubyObject allocate(Ruby runtime, RubyClass klazz) { - return new JavaAtomicBoolean(runtime, klazz); - } - }; - - @JRubyClass(name = "JavaAtomicBoolean", parent = "Object") - public static class JavaAtomicBoolean extends RubyObject { - - private AtomicBoolean atomicBoolean; - - public JavaAtomicBoolean(Ruby runtime, RubyClass metaClass) { - super(runtime, metaClass); - } - - @JRubyMethod - public IRubyObject initialize(ThreadContext context, IRubyObject value) { - atomicBoolean = new AtomicBoolean(convertRubyBooleanToJavaBoolean(value)); - return context.nil; - } - - @JRubyMethod - public IRubyObject initialize(ThreadContext context) { - atomicBoolean = new AtomicBoolean(); - return context.nil; - } - - @JRubyMethod(name = "value") - public IRubyObject value() { - return getRuntime().newBoolean(atomicBoolean.get()); - } - - @JRubyMethod(name = "true?") - public IRubyObject isAtomicTrue() { - return getRuntime().newBoolean(atomicBoolean.get()); - } - - @JRubyMethod(name = "false?") - public IRubyObject isAtomicFalse() { - return getRuntime().newBoolean((atomicBoolean.get() == false)); - } - - @JRubyMethod(name = "value=") - public IRubyObject setAtomic(ThreadContext context, IRubyObject newValue) { - atomicBoolean.set(convertRubyBooleanToJavaBoolean(newValue)); - return context.nil; - } - - @JRubyMethod(name = "make_true") - public IRubyObject makeTrue() { - return getRuntime().newBoolean(atomicBoolean.compareAndSet(false, true)); - } - - @JRubyMethod(name = "make_false") - public IRubyObject makeFalse() { - return getRuntime().newBoolean(atomicBoolean.compareAndSet(true, false)); - } - - private boolean convertRubyBooleanToJavaBoolean(IRubyObject newValue) { - if (newValue instanceof RubyBoolean.False || newValue instanceof RubyNil) { - return false; - } else { - return true; - } - } - } -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/JavaAtomicFixnumLibrary.java b/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/JavaAtomicFixnumLibrary.java deleted file mode 100644 index 672bfc0..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/JavaAtomicFixnumLibrary.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.concurrent_ruby.ext; - -import java.io.IOException; -import java.util.concurrent.atomic.AtomicLong; -import org.jruby.Ruby; -import org.jruby.RubyClass; -import org.jruby.RubyFixnum; -import org.jruby.RubyModule; -import org.jruby.RubyObject; -import org.jruby.anno.JRubyClass; -import org.jruby.anno.JRubyMethod; -import org.jruby.runtime.ObjectAllocator; -import org.jruby.runtime.ThreadContext; -import org.jruby.runtime.builtin.IRubyObject; -import org.jruby.runtime.load.Library; -import org.jruby.runtime.Block; - -public class JavaAtomicFixnumLibrary implements Library { - - public void load(Ruby runtime, boolean wrap) throws IOException { - RubyModule concurrentMod = runtime.defineModule("Concurrent"); - RubyClass atomicCls = concurrentMod.defineClassUnder("JavaAtomicFixnum", runtime.getObject(), JRUBYREFERENCE_ALLOCATOR); - - atomicCls.defineAnnotatedMethods(JavaAtomicFixnum.class); - } - - private static final ObjectAllocator JRUBYREFERENCE_ALLOCATOR = new ObjectAllocator() { - public IRubyObject allocate(Ruby runtime, RubyClass klazz) { - return new JavaAtomicFixnum(runtime, klazz); - } - }; - - @JRubyClass(name = "JavaAtomicFixnum", parent = "Object") - public static class JavaAtomicFixnum extends RubyObject { - - private AtomicLong atomicLong; - - public JavaAtomicFixnum(Ruby runtime, RubyClass metaClass) { - super(runtime, metaClass); - } - - @JRubyMethod - public IRubyObject initialize(ThreadContext context) { - this.atomicLong = new AtomicLong(0); - return context.nil; - } - - @JRubyMethod - public IRubyObject initialize(ThreadContext context, IRubyObject value) { - this.atomicLong = new AtomicLong(rubyFixnumToLong(value)); - return context.nil; - } - - @JRubyMethod(name = "value") - public IRubyObject getValue() { - return getRuntime().newFixnum(atomicLong.get()); - } - - @JRubyMethod(name = "value=") - public IRubyObject setValue(ThreadContext context, IRubyObject newValue) { - atomicLong.set(rubyFixnumToLong(newValue)); - return context.nil; - } - - @JRubyMethod(name = {"increment", "up"}) - public IRubyObject increment() { - return getRuntime().newFixnum(atomicLong.incrementAndGet()); - } - - @JRubyMethod(name = {"increment", "up"}) - public IRubyObject increment(IRubyObject value) { - long delta = rubyFixnumToLong(value); - return getRuntime().newFixnum(atomicLong.addAndGet(delta)); - } - - @JRubyMethod(name = {"decrement", "down"}) - public IRubyObject decrement() { - return getRuntime().newFixnum(atomicLong.decrementAndGet()); - } - - @JRubyMethod(name = {"decrement", "down"}) - public IRubyObject decrement(IRubyObject value) { - long delta = rubyFixnumToLong(value); - return getRuntime().newFixnum(atomicLong.addAndGet(-delta)); - } - - @JRubyMethod(name = "compare_and_set") - public IRubyObject compareAndSet(ThreadContext context, IRubyObject expect, IRubyObject update) { - return getRuntime().newBoolean(atomicLong.compareAndSet(rubyFixnumToLong(expect), rubyFixnumToLong(update))); - } - - @JRubyMethod - public IRubyObject update(ThreadContext context, Block block) { - for (;;) { - long _oldValue = atomicLong.get(); - IRubyObject oldValue = getRuntime().newFixnum(_oldValue); - IRubyObject newValue = block.yield(context, oldValue); - if (atomicLong.compareAndSet(_oldValue, rubyFixnumToLong(newValue))) { - return newValue; - } - } - } - - private long rubyFixnumToLong(IRubyObject value) { - if (value instanceof RubyFixnum) { - RubyFixnum fixNum = (RubyFixnum) value; - return fixNum.getLongValue(); - } else { - throw getRuntime().newArgumentError("value must be a Fixnum"); - } - } - } -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/JavaSemaphoreLibrary.java b/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/JavaSemaphoreLibrary.java deleted file mode 100644 index d887f25..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/JavaSemaphoreLibrary.java +++ /dev/null @@ -1,189 +0,0 @@ -package com.concurrent_ruby.ext; - -import java.io.IOException; -import java.util.concurrent.Semaphore; -import org.jruby.Ruby; -import org.jruby.RubyClass; -import org.jruby.RubyFixnum; -import org.jruby.RubyModule; -import org.jruby.RubyNumeric; -import org.jruby.RubyObject; -import org.jruby.anno.JRubyClass; -import org.jruby.anno.JRubyMethod; -import org.jruby.runtime.Block; -import org.jruby.runtime.ObjectAllocator; -import org.jruby.runtime.ThreadContext; -import org.jruby.runtime.builtin.IRubyObject; - -public class JavaSemaphoreLibrary { - - public void load(Ruby runtime, boolean wrap) throws IOException { - RubyModule concurrentMod = runtime.defineModule("Concurrent"); - RubyClass atomicCls = concurrentMod.defineClassUnder("JavaSemaphore", runtime.getObject(), JRUBYREFERENCE_ALLOCATOR); - - atomicCls.defineAnnotatedMethods(JavaSemaphore.class); - } - - private static final ObjectAllocator JRUBYREFERENCE_ALLOCATOR = new ObjectAllocator() { - public IRubyObject allocate(Ruby runtime, RubyClass klazz) { - return new JavaSemaphore(runtime, klazz); - } - }; - - @JRubyClass(name = "JavaSemaphore", parent = "Object") - public static class JavaSemaphore extends RubyObject { - - private JRubySemaphore semaphore; - - public JavaSemaphore(Ruby runtime, RubyClass metaClass) { - super(runtime, metaClass); - } - - @JRubyMethod - public IRubyObject initialize(ThreadContext context, IRubyObject value) { - this.semaphore = new JRubySemaphore(rubyFixnumInt(value, "count")); - return context.nil; - } - - @JRubyMethod - public IRubyObject acquire(ThreadContext context, final Block block) throws InterruptedException { - return this.acquire(context, 1, block); - } - - @JRubyMethod - public IRubyObject acquire(ThreadContext context, IRubyObject permits, final Block block) throws InterruptedException { - return this.acquire(context, rubyFixnumToPositiveInt(permits, "permits"), block); - } - - @JRubyMethod(name = "available_permits") - public IRubyObject availablePermits(ThreadContext context) { - return getRuntime().newFixnum(this.semaphore.availablePermits()); - } - - @JRubyMethod(name = "drain_permits") - public IRubyObject drainPermits(ThreadContext context) { - return getRuntime().newFixnum(this.semaphore.drainPermits()); - } - - @JRubyMethod(name = "try_acquire") - public IRubyObject tryAcquire(ThreadContext context, final Block block) throws InterruptedException { - int permitsInt = 1; - boolean acquired = semaphore.tryAcquire(permitsInt); - - return triedAcquire(context, permitsInt, acquired, block); - } - - @JRubyMethod(name = "try_acquire") - public IRubyObject tryAcquire(ThreadContext context, IRubyObject permits, final Block block) throws InterruptedException { - int permitsInt = rubyFixnumToPositiveInt(permits, "permits"); - boolean acquired = semaphore.tryAcquire(permitsInt); - - return triedAcquire(context, permitsInt, acquired, block); - } - - @JRubyMethod(name = "try_acquire") - public IRubyObject tryAcquire(ThreadContext context, IRubyObject permits, IRubyObject timeout, final Block block) throws InterruptedException { - int permitsInt = rubyFixnumToPositiveInt(permits, "permits"); - boolean acquired = semaphore.tryAcquire( - permitsInt, - rubyNumericToLong(timeout, "timeout"), - java.util.concurrent.TimeUnit.SECONDS - ); - - return triedAcquire(context, permitsInt, acquired, block); - } - - @JRubyMethod - public IRubyObject release(ThreadContext context) { - this.semaphore.release(1); - return getRuntime().newBoolean(true); - } - - @JRubyMethod - public IRubyObject release(ThreadContext context, IRubyObject permits) { - this.semaphore.release(rubyFixnumToPositiveInt(permits, "permits")); - return getRuntime().newBoolean(true); - } - - @JRubyMethod(name = "reduce_permits") - public IRubyObject reducePermits(ThreadContext context, IRubyObject reduction) throws InterruptedException { - this.semaphore.publicReducePermits(rubyFixnumToNonNegativeInt(reduction, "reduction")); - return context.nil; - } - - private IRubyObject acquire(ThreadContext context, int permits, final Block block) throws InterruptedException { - this.semaphore.acquire(permits); - - if (!block.isGiven()) return context.nil; - - try { - return block.yieldSpecific(context); - } finally { - this.semaphore.release(permits); - } - } - - private IRubyObject triedAcquire(ThreadContext context, int permits, boolean acquired, final Block block) { - if (!block.isGiven()) return getRuntime().newBoolean(acquired); - if (!acquired) return context.nil; - - try { - return block.yieldSpecific(context); - } finally { - this.semaphore.release(permits); - } - } - - private int rubyFixnumInt(IRubyObject value, String paramName) { - if (value instanceof RubyFixnum) { - RubyFixnum fixNum = (RubyFixnum) value; - return (int) fixNum.getLongValue(); - } else { - throw getRuntime().newArgumentError(paramName + " must be integer"); - } - } - - private int rubyFixnumToNonNegativeInt(IRubyObject value, String paramName) { - if (value instanceof RubyFixnum && ((RubyFixnum) value).getLongValue() >= 0) { - RubyFixnum fixNum = (RubyFixnum) value; - return (int) fixNum.getLongValue(); - } else { - throw getRuntime().newArgumentError(paramName + " must be a non-negative integer"); - } - } - - private int rubyFixnumToPositiveInt(IRubyObject value, String paramName) { - if (value instanceof RubyFixnum && ((RubyFixnum) value).getLongValue() > 0) { - RubyFixnum fixNum = (RubyFixnum) value; - return (int) fixNum.getLongValue(); - } else { - throw getRuntime().newArgumentError(paramName + " must be an integer greater than zero"); - } - } - - private long rubyNumericToLong(IRubyObject value, String paramName) { - if (value instanceof RubyNumeric && ((RubyNumeric) value).getDoubleValue() > 0) { - RubyNumeric fixNum = (RubyNumeric) value; - return fixNum.getLongValue(); - } else { - throw getRuntime().newArgumentError(paramName + " must be a float greater than zero"); - } - } - - class JRubySemaphore extends Semaphore { - - public JRubySemaphore(int permits) { - super(permits); - } - - public JRubySemaphore(int permits, boolean value) { - super(permits, value); - } - - public void publicReducePermits(int i) { - reducePermits(i); - } - - } - } -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/SynchronizationLibrary.java b/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/SynchronizationLibrary.java deleted file mode 100644 index f0c75ee..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/SynchronizationLibrary.java +++ /dev/null @@ -1,292 +0,0 @@ -package com.concurrent_ruby.ext; - -import org.jruby.Ruby; -import org.jruby.RubyBasicObject; -import org.jruby.RubyClass; -import org.jruby.RubyModule; -import org.jruby.RubyObject; -import org.jruby.RubyThread; -import org.jruby.anno.JRubyClass; -import org.jruby.anno.JRubyMethod; -import org.jruby.runtime.Block; -import org.jruby.runtime.ObjectAllocator; -import org.jruby.runtime.ThreadContext; -import org.jruby.runtime.Visibility; -import org.jruby.runtime.builtin.IRubyObject; -import org.jruby.runtime.load.Library; -import sun.misc.Unsafe; - -import java.io.IOException; -import java.lang.reflect.Field; -import java.lang.reflect.Method; - -public class SynchronizationLibrary implements Library { - - private static final Unsafe UNSAFE = loadUnsafe(); - private static final boolean FULL_FENCE = supportsFences(); - - private static Unsafe loadUnsafe() { - try { - Class ncdfe = Class.forName("sun.misc.Unsafe"); - Field f = ncdfe.getDeclaredField("theUnsafe"); - f.setAccessible(true); - return (Unsafe) f.get((java.lang.Object) null); - } catch (Exception var2) { - return null; - } catch (NoClassDefFoundError var3) { - return null; - } - } - - private static boolean supportsFences() { - if (UNSAFE == null) { - return false; - } else { - try { - Method m = UNSAFE.getClass().getDeclaredMethod("fullFence", new Class[0]); - if (m != null) { - return true; - } - } catch (Exception var1) { - // nothing - } - - return false; - } - } - - private static final ObjectAllocator OBJECT_ALLOCATOR = new ObjectAllocator() { - public IRubyObject allocate(Ruby runtime, RubyClass klazz) { - return new Object(runtime, klazz); - } - }; - - private static final ObjectAllocator ABSTRACT_LOCKABLE_OBJECT_ALLOCATOR = new ObjectAllocator() { - public IRubyObject allocate(Ruby runtime, RubyClass klazz) { - return new AbstractLockableObject(runtime, klazz); - } - }; - - private static final ObjectAllocator JRUBY_LOCKABLE_OBJECT_ALLOCATOR = new ObjectAllocator() { - public IRubyObject allocate(Ruby runtime, RubyClass klazz) { - return new JRubyLockableObject(runtime, klazz); - } - }; - - public void load(Ruby runtime, boolean wrap) throws IOException { - RubyModule synchronizationModule = runtime. - defineModule("Concurrent"). - defineModuleUnder("Synchronization"); - - RubyModule jrubyAttrVolatileModule = synchronizationModule.defineModuleUnder("JRubyAttrVolatile"); - jrubyAttrVolatileModule.defineAnnotatedMethods(JRubyAttrVolatile.class); - - defineClass(runtime, synchronizationModule, "AbstractObject", "Object", - Object.class, OBJECT_ALLOCATOR); - - defineClass(runtime, synchronizationModule, "Object", "AbstractLockableObject", - AbstractLockableObject.class, ABSTRACT_LOCKABLE_OBJECT_ALLOCATOR); - - defineClass(runtime, synchronizationModule, "AbstractLockableObject", "JRubyLockableObject", - JRubyLockableObject.class, JRUBY_LOCKABLE_OBJECT_ALLOCATOR); - - defineClass(runtime, synchronizationModule, "Object", "JRuby", - JRuby.class, new ObjectAllocator() { - @Override - public IRubyObject allocate(Ruby runtime, RubyClass klazz) { - return new JRuby(runtime, klazz); - } - }); - } - - private RubyClass defineClass( - Ruby runtime, - RubyModule namespace, - String parentName, - String name, - Class javaImplementation, - ObjectAllocator allocator) { - final RubyClass parentClass = namespace.getClass(parentName); - - if (parentClass == null) { - System.out.println("not found " + parentName); - throw runtime.newRuntimeError(namespace.toString() + "::" + parentName + " is missing"); - } - - final RubyClass newClass = namespace.defineClassUnder(name, parentClass, allocator); - newClass.defineAnnotatedMethods(javaImplementation); - return newClass; - } - - // Facts: - // - all ivar reads are without any synchronisation of fences see - // https://github.com/jruby/jruby/blob/master/core/src/main/java/org/jruby/runtime/ivars/VariableAccessor.java#L110-110 - // - writes depend on UnsafeHolder.U, null -> SynchronizedVariableAccessor, !null -> StampedVariableAccessor - // SynchronizedVariableAccessor wraps with synchronized block, StampedVariableAccessor uses fullFence or - // volatilePut - // TODO (pitr 16-Sep-2015): what do we do in Java 9 ? - - // module JRubyAttrVolatile - public static class JRubyAttrVolatile { - - // volatile threadContext is used as a memory barrier per the JVM memory model happens-before semantic - // on volatile fields. any volatile field could have been used but using the thread context is an - // attempt to avoid code elimination. - private static volatile int volatileField; - - @JRubyMethod(name = "full_memory_barrier", visibility = Visibility.PUBLIC, module = true) - public static IRubyObject fullMemoryBarrier(ThreadContext context, IRubyObject module) { - // Prevent reordering of ivar writes with publication of this instance - if (!FULL_FENCE) { - // Assuming that following volatile read and write is not eliminated it simulates fullFence. - // If it's eliminated it'll cause problems only on non-x86 platforms. - // http://shipilev.net/blog/2014/jmm-pragmatics/#_happens_before_test_your_understanding - final int volatileRead = volatileField; - volatileField = context.getLine(); - } else { - UNSAFE.fullFence(); - } - return context.nil; - } - - @JRubyMethod(name = "instance_variable_get_volatile", visibility = Visibility.PUBLIC, module = true) - public static IRubyObject instanceVariableGetVolatile( - ThreadContext context, - IRubyObject module, - IRubyObject self, - IRubyObject name) { - // Ensure we ses latest value with loadFence - if (!FULL_FENCE) { - // piggybacking on volatile read, simulating loadFence - final int volatileRead = volatileField; - return ((RubyBasicObject) self).instance_variable_get(context, name); - } else { - UNSAFE.loadFence(); - return ((RubyBasicObject) self).instance_variable_get(context, name); - } - } - - @JRubyMethod(name = "instance_variable_set_volatile", visibility = Visibility.PUBLIC, module = true) - public static IRubyObject InstanceVariableSetVolatile( - ThreadContext context, - IRubyObject module, - IRubyObject self, - IRubyObject name, - IRubyObject value) { - // Ensure we make last update visible - if (!FULL_FENCE) { - // piggybacking on volatile write, simulating storeFence - final IRubyObject result = ((RubyBasicObject) self).instance_variable_set(name, value); - volatileField = context.getLine(); - return result; - } else { - // JRuby uses StampedVariableAccessor which calls fullFence - // so no additional steps needed. - // See https://github.com/jruby/jruby/blob/master/core/src/main/java/org/jruby/runtime/ivars/StampedVariableAccessor.java#L151-L159 - return ((RubyBasicObject) self).instance_variable_set(name, value); - } - } - } - - @JRubyClass(name = "Object", parent = "AbstractObject") - public static class Object extends RubyObject { - - public Object(Ruby runtime, RubyClass metaClass) { - super(runtime, metaClass); - } - } - - @JRubyClass(name = "AbstractLockableObject", parent = "Object") - public static class AbstractLockableObject extends Object { - - public AbstractLockableObject(Ruby runtime, RubyClass metaClass) { - super(runtime, metaClass); - } - } - - @JRubyClass(name = "JRubyLockableObject", parent = "AbstractLockableObject") - public static class JRubyLockableObject extends AbstractLockableObject { - - public JRubyLockableObject(Ruby runtime, RubyClass metaClass) { - super(runtime, metaClass); - } - - @JRubyMethod(name = "synchronize", visibility = Visibility.PROTECTED) - public IRubyObject rubySynchronize(ThreadContext context, Block block) { - synchronized (this) { - return block.yield(context, null); - } - } - - @JRubyMethod(name = "ns_wait", optional = 1, visibility = Visibility.PROTECTED) - public IRubyObject nsWait(ThreadContext context, IRubyObject[] args) { - Ruby runtime = context.runtime; - if (args.length > 1) { - throw runtime.newArgumentError(args.length, 1); - } - Double timeout = null; - if (args.length > 0 && !args[0].isNil()) { - timeout = args[0].convertToFloat().getDoubleValue(); - if (timeout < 0) { - throw runtime.newArgumentError("time interval must be positive"); - } - } - if (Thread.interrupted()) { - throw runtime.newConcurrencyError("thread interrupted"); - } - boolean success = false; - try { - success = context.getThread().wait_timeout(this, timeout); - } catch (InterruptedException ie) { - throw runtime.newConcurrencyError(ie.getLocalizedMessage()); - } finally { - // An interrupt or timeout may have caused us to miss - // a notify that we consumed, so do another notify in - // case someone else is available to pick it up. - if (!success) { - this.notify(); - } - } - return this; - } - - @JRubyMethod(name = "ns_signal", visibility = Visibility.PROTECTED) - public IRubyObject nsSignal(ThreadContext context) { - notify(); - return this; - } - - @JRubyMethod(name = "ns_broadcast", visibility = Visibility.PROTECTED) - public IRubyObject nsBroadcast(ThreadContext context) { - notifyAll(); - return this; - } - } - - @JRubyClass(name = "JRuby") - public static class JRuby extends RubyObject { - public JRuby(Ruby runtime, RubyClass metaClass) { - super(runtime, metaClass); - } - - @JRubyMethod(name = "sleep_interruptibly", visibility = Visibility.PUBLIC, module = true) - public static IRubyObject sleepInterruptibly(final ThreadContext context, IRubyObject receiver, final Block block) { - try { - context.getThread().executeBlockingTask(new RubyThread.BlockingTask() { - @Override - public void run() throws InterruptedException { - block.call(context); - } - - @Override - public void wakeup() { - context.getThread().getNativeThread().interrupt(); - } - }); - } catch (InterruptedException e) { - throw context.runtime.newThreadError("interrupted in Concurrent::Synchronization::JRuby.sleep_interruptibly"); - } - return context.nil; - } - } -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/ConcurrentHashMap.java b/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/ConcurrentHashMap.java deleted file mode 100644 index e11e15a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/ConcurrentHashMap.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.concurrent_ruby.ext.jsr166e; - -import java.util.Map; -import java.util.Set; - -public interface ConcurrentHashMap { - /** Interface describing a function of one argument */ - public interface Fun { T apply(A a); } - /** Interface describing a function of two arguments */ - public interface BiFun { T apply(A a, B b); } - - public V get(K key); - public V put(K key, V value); - public V putIfAbsent(K key, V value); - public V computeIfAbsent(K key, Fun mf); - public V computeIfPresent(K key, BiFun mf); - public V compute(K key, BiFun mf); - public V merge(K key, V value, BiFun mf); - public boolean replace(K key, V oldVal, V newVal); - public V replace(K key, V value); - public boolean containsKey(K key); - public boolean remove(Object key, Object value); - public V remove(K key); - public void clear(); - public Set> entrySet(); - public int size(); - public V getValueOrDefault(Object key, V defaultValue); - - public boolean containsValue(V value); - public K findKey(V value); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/ConcurrentHashMapV8.java b/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/ConcurrentHashMapV8.java deleted file mode 100644 index 86aa4eb..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/ConcurrentHashMapV8.java +++ /dev/null @@ -1,3863 +0,0 @@ -/* - * Written by Doug Lea with assistance from members of JCP JSR-166 - * Expert Group and released to the public domain, as explained at - * http://creativecommons.org/publicdomain/zero/1.0/ - */ - -// This is based on the 1.79 version. - -package com.concurrent_ruby.ext.jsr166e; - -import org.jruby.RubyClass; -import org.jruby.RubyNumeric; -import org.jruby.RubyObject; -import org.jruby.exceptions.RaiseException; -import com.concurrent_ruby.ext.jsr166y.ThreadLocalRandom; -import org.jruby.runtime.ThreadContext; -import org.jruby.runtime.builtin.IRubyObject; - -import java.util.Arrays; -import java.util.Map; -import java.util.Set; -import java.util.Collection; -import java.util.Hashtable; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Enumeration; -import java.util.ConcurrentModificationException; -import java.util.NoSuchElementException; -import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.locks.AbstractQueuedSynchronizer; - -import java.io.Serializable; - -/** - * A hash table supporting full concurrency of retrievals and - * high expected concurrency for updates. This class obeys the - * same functional specification as {@link java.util.Hashtable}, and - * includes versions of methods corresponding to each method of - * {@code Hashtable}. However, even though all operations are - * thread-safe, retrieval operations do not entail locking, - * and there is not any support for locking the entire table - * in a way that prevents all access. This class is fully - * interoperable with {@code Hashtable} in programs that rely on its - * thread safety but not on its synchronization details. - * - *

    Retrieval operations (including {@code get}) generally do not - * block, so may overlap with update operations (including {@code put} - * and {@code remove}). Retrievals reflect the results of the most - * recently completed update operations holding upon their - * onset. (More formally, an update operation for a given key bears a - * happens-before relation with any (non-null) retrieval for - * that key reporting the updated value.) For aggregate operations - * such as {@code putAll} and {@code clear}, concurrent retrievals may - * reflect insertion or removal of only some entries. Similarly, - * Iterators and Enumerations return elements reflecting the state of - * the hash table at some point at or since the creation of the - * iterator/enumeration. They do not throw {@link - * ConcurrentModificationException}. However, iterators are designed - * to be used by only one thread at a time. Bear in mind that the - * results of aggregate status methods including {@code size}, {@code - * isEmpty}, and {@code containsValue} are typically useful only when - * a map is not undergoing concurrent updates in other threads. - * Otherwise the results of these methods reflect transient states - * that may be adequate for monitoring or estimation purposes, but not - * for program control. - * - *

    The table is dynamically expanded when there are too many - * collisions (i.e., keys that have distinct hash codes but fall into - * the same slot modulo the table size), with the expected average - * effect of maintaining roughly two bins per mapping (corresponding - * to a 0.75 load factor threshold for resizing). There may be much - * variance around this average as mappings are added and removed, but - * overall, this maintains a commonly accepted time/space tradeoff for - * hash tables. However, resizing this or any other kind of hash - * table may be a relatively slow operation. When possible, it is a - * good idea to provide a size estimate as an optional {@code - * initialCapacity} constructor argument. An additional optional - * {@code loadFactor} constructor argument provides a further means of - * customizing initial table capacity by specifying the table density - * to be used in calculating the amount of space to allocate for the - * given number of elements. Also, for compatibility with previous - * versions of this class, constructors may optionally specify an - * expected {@code concurrencyLevel} as an additional hint for - * internal sizing. Note that using many keys with exactly the same - * {@code hashCode()} is a sure way to slow down performance of any - * hash table. - * - *

    A {@link Set} projection of a ConcurrentHashMapV8 may be created - * (using {@link #newKeySet()} or {@link #newKeySet(int)}), or viewed - * (using {@link #keySet(Object)} when only keys are of interest, and the - * mapped values are (perhaps transiently) not used or all take the - * same mapping value. - * - *

    A ConcurrentHashMapV8 can be used as scalable frequency map (a - * form of histogram or multiset) by using {@link LongAdder} values - * and initializing via {@link #computeIfAbsent}. For example, to add - * a count to a {@code ConcurrentHashMapV8 freqs}, you - * can use {@code freqs.computeIfAbsent(k -> new - * LongAdder()).increment();} - * - *

    This class and its views and iterators implement all of the - * optional methods of the {@link Map} and {@link Iterator} - * interfaces. - * - *

    Like {@link Hashtable} but unlike {@link HashMap}, this class - * does not allow {@code null} to be used as a key or value. - * - *

    ConcurrentHashMapV8s support parallel operations using the {@link - * ForkJoinPool#commonPool}. (Tasks that may be used in other contexts - * are available in class {@link ForkJoinTasks}). These operations are - * designed to be safely, and often sensibly, applied even with maps - * that are being concurrently updated by other threads; for example, - * when computing a snapshot summary of the values in a shared - * registry. There are three kinds of operation, each with four - * forms, accepting functions with Keys, Values, Entries, and (Key, - * Value) arguments and/or return values. (The first three forms are - * also available via the {@link #keySet()}, {@link #values()} and - * {@link #entrySet()} views). Because the elements of a - * ConcurrentHashMapV8 are not ordered in any particular way, and may be - * processed in different orders in different parallel executions, the - * correctness of supplied functions should not depend on any - * ordering, or on any other objects or values that may transiently - * change while computation is in progress; and except for forEach - * actions, should ideally be side-effect-free. - * - *

      - *
    • forEach: Perform a given action on each element. - * A variant form applies a given transformation on each element - * before performing the action.
    • - * - *
    • search: Return the first available non-null result of - * applying a given function on each element; skipping further - * search when a result is found.
    • - * - *
    • reduce: Accumulate each element. The supplied reduction - * function cannot rely on ordering (more formally, it should be - * both associative and commutative). There are five variants: - * - *
        - * - *
      • Plain reductions. (There is not a form of this method for - * (key, value) function arguments since there is no corresponding - * return type.)
      • - * - *
      • Mapped reductions that accumulate the results of a given - * function applied to each element.
      • - * - *
      • Reductions to scalar doubles, longs, and ints, using a - * given basis value.
      • - * - * - *
      - *
    - * - *

    The concurrency properties of bulk operations follow - * from those of ConcurrentHashMapV8: Any non-null result returned - * from {@code get(key)} and related access methods bears a - * happens-before relation with the associated insertion or - * update. The result of any bulk operation reflects the - * composition of these per-element relations (but is not - * necessarily atomic with respect to the map as a whole unless it - * is somehow known to be quiescent). Conversely, because keys - * and values in the map are never null, null serves as a reliable - * atomic indicator of the current lack of any result. To - * maintain this property, null serves as an implicit basis for - * all non-scalar reduction operations. For the double, long, and - * int versions, the basis should be one that, when combined with - * any other value, returns that other value (more formally, it - * should be the identity element for the reduction). Most common - * reductions have these properties; for example, computing a sum - * with basis 0 or a minimum with basis MAX_VALUE. - * - *

    Search and transformation functions provided as arguments - * should similarly return null to indicate the lack of any result - * (in which case it is not used). In the case of mapped - * reductions, this also enables transformations to serve as - * filters, returning null (or, in the case of primitive - * specializations, the identity basis) if the element should not - * be combined. You can create compound transformations and - * filterings by composing them yourself under this "null means - * there is nothing there now" rule before using them in search or - * reduce operations. - * - *

    Methods accepting and/or returning Entry arguments maintain - * key-value associations. They may be useful for example when - * finding the key for the greatest value. Note that "plain" Entry - * arguments can be supplied using {@code new - * AbstractMap.SimpleEntry(k,v)}. - * - *

    Bulk operations may complete abruptly, throwing an - * exception encountered in the application of a supplied - * function. Bear in mind when handling such exceptions that other - * concurrently executing functions could also have thrown - * exceptions, or would have done so if the first exception had - * not occurred. - * - *

    Parallel speedups for bulk operations compared to sequential - * processing are common but not guaranteed. Operations involving - * brief functions on small maps may execute more slowly than - * sequential loops if the underlying work to parallelize the - * computation is more expensive than the computation itself. - * Similarly, parallelization may not lead to much actual parallelism - * if all processors are busy performing unrelated tasks. - * - *

    All arguments to all task methods must be non-null. - * - *

    jsr166e note: During transition, this class - * uses nested functional interfaces with different names but the - * same forms as those expected for JDK8. - * - *

    This class is a member of the - * - * Java Collections Framework. - * - * @since 1.5 - * @author Doug Lea - * @param the type of keys maintained by this map - * @param the type of mapped values - */ -public class ConcurrentHashMapV8 - implements ConcurrentMap, Serializable, ConcurrentHashMap { - private static final long serialVersionUID = 7249069246763182397L; - - /** - * A partitionable iterator. A Spliterator can be traversed - * directly, but can also be partitioned (before traversal) by - * creating another Spliterator that covers a non-overlapping - * portion of the elements, and so may be amenable to parallel - * execution. - * - *

    This interface exports a subset of expected JDK8 - * functionality. - * - *

    Sample usage: Here is one (of the several) ways to compute - * the sum of the values held in a map using the ForkJoin - * framework. As illustrated here, Spliterators are well suited to - * designs in which a task repeatedly splits off half its work - * into forked subtasks until small enough to process directly, - * and then joins these subtasks. Variants of this style can also - * be used in completion-based designs. - * - *

    -     * {@code ConcurrentHashMapV8 m = ...
    -     * // split as if have 8 * parallelism, for load balance
    -     * int n = m.size();
    -     * int p = aForkJoinPool.getParallelism() * 8;
    -     * int split = (n < p)? n : p;
    -     * long sum = aForkJoinPool.invoke(new SumValues(m.valueSpliterator(), split, null));
    -     * // ...
    -     * static class SumValues extends RecursiveTask {
    -     *   final Spliterator s;
    -     *   final int split;             // split while > 1
    -     *   final SumValues nextJoin;    // records forked subtasks to join
    -     *   SumValues(Spliterator s, int depth, SumValues nextJoin) {
    -     *     this.s = s; this.depth = depth; this.nextJoin = nextJoin;
    -     *   }
    -     *   public Long compute() {
    -     *     long sum = 0;
    -     *     SumValues subtasks = null; // fork subtasks
    -     *     for (int s = split >>> 1; s > 0; s >>>= 1)
    -     *       (subtasks = new SumValues(s.split(), s, subtasks)).fork();
    -     *     while (s.hasNext())        // directly process remaining elements
    -     *       sum += s.next();
    -     *     for (SumValues t = subtasks; t != null; t = t.nextJoin)
    -     *       sum += t.join();         // collect subtask results
    -     *     return sum;
    -     *   }
    -     * }
    -     * }
    - */ - public static interface Spliterator extends Iterator { - /** - * Returns a Spliterator covering approximately half of the - * elements, guaranteed not to overlap with those subsequently - * returned by this Spliterator. After invoking this method, - * the current Spliterator will not produce any of - * the elements of the returned Spliterator, but the two - * Spliterators together will produce all of the elements that - * would have been produced by this Spliterator had this - * method not been called. The exact number of elements - * produced by the returned Spliterator is not guaranteed, and - * may be zero (i.e., with {@code hasNext()} reporting {@code - * false}) if this Spliterator cannot be further split. - * - * @return a Spliterator covering approximately half of the - * elements - * @throws IllegalStateException if this Spliterator has - * already commenced traversing elements - */ - Spliterator split(); - } - - - /* - * Overview: - * - * The primary design goal of this hash table is to maintain - * concurrent readability (typically method get(), but also - * iterators and related methods) while minimizing update - * contention. Secondary goals are to keep space consumption about - * the same or better than java.util.HashMap, and to support high - * initial insertion rates on an empty table by many threads. - * - * Each key-value mapping is held in a Node. Because Node fields - * can contain special values, they are defined using plain Object - * types. Similarly in turn, all internal methods that use them - * work off Object types. And similarly, so do the internal - * methods of auxiliary iterator and view classes. All public - * generic typed methods relay in/out of these internal methods, - * supplying null-checks and casts as needed. This also allows - * many of the public methods to be factored into a smaller number - * of internal methods (although sadly not so for the five - * variants of put-related operations). The validation-based - * approach explained below leads to a lot of code sprawl because - * retry-control precludes factoring into smaller methods. - * - * The table is lazily initialized to a power-of-two size upon the - * first insertion. Each bin in the table normally contains a - * list of Nodes (most often, the list has only zero or one Node). - * Table accesses require volatile/atomic reads, writes, and - * CASes. Because there is no other way to arrange this without - * adding further indirections, we use intrinsics - * (sun.misc.Unsafe) operations. The lists of nodes within bins - * are always accurately traversable under volatile reads, so long - * as lookups check hash code and non-nullness of value before - * checking key equality. - * - * We use the top two bits of Node hash fields for control - * purposes -- they are available anyway because of addressing - * constraints. As explained further below, these top bits are - * used as follows: - * 00 - Normal - * 01 - Locked - * 11 - Locked and may have a thread waiting for lock - * 10 - Node is a forwarding node - * - * The lower 30 bits of each Node's hash field contain a - * transformation of the key's hash code, except for forwarding - * nodes, for which the lower bits are zero (and so always have - * hash field == MOVED). - * - * Insertion (via put or its variants) of the first node in an - * empty bin is performed by just CASing it to the bin. This is - * by far the most common case for put operations under most - * key/hash distributions. Other update operations (insert, - * delete, and replace) require locks. We do not want to waste - * the space required to associate a distinct lock object with - * each bin, so instead use the first node of a bin list itself as - * a lock. Blocking support for these locks relies on the builtin - * "synchronized" monitors. However, we also need a tryLock - * construction, so we overlay these by using bits of the Node - * hash field for lock control (see above), and so normally use - * builtin monitors only for blocking and signalling using - * wait/notifyAll constructions. See Node.tryAwaitLock. - * - * Using the first node of a list as a lock does not by itself - * suffice though: When a node is locked, any update must first - * validate that it is still the first node after locking it, and - * retry if not. Because new nodes are always appended to lists, - * once a node is first in a bin, it remains first until deleted - * or the bin becomes invalidated (upon resizing). However, - * operations that only conditionally update may inspect nodes - * until the point of update. This is a converse of sorts to the - * lazy locking technique described by Herlihy & Shavit. - * - * The main disadvantage of per-bin locks is that other update - * operations on other nodes in a bin list protected by the same - * lock can stall, for example when user equals() or mapping - * functions take a long time. However, statistically, under - * random hash codes, this is not a common problem. Ideally, the - * frequency of nodes in bins follows a Poisson distribution - * (http://en.wikipedia.org/wiki/Poisson_distribution) with a - * parameter of about 0.5 on average, given the resizing threshold - * of 0.75, although with a large variance because of resizing - * granularity. Ignoring variance, the expected occurrences of - * list size k are (exp(-0.5) * pow(0.5, k) / factorial(k)). The - * first values are: - * - * 0: 0.60653066 - * 1: 0.30326533 - * 2: 0.07581633 - * 3: 0.01263606 - * 4: 0.00157952 - * 5: 0.00015795 - * 6: 0.00001316 - * 7: 0.00000094 - * 8: 0.00000006 - * more: less than 1 in ten million - * - * Lock contention probability for two threads accessing distinct - * elements is roughly 1 / (8 * #elements) under random hashes. - * - * Actual hash code distributions encountered in practice - * sometimes deviate significantly from uniform randomness. This - * includes the case when N > (1<<30), so some keys MUST collide. - * Similarly for dumb or hostile usages in which multiple keys are - * designed to have identical hash codes. Also, although we guard - * against the worst effects of this (see method spread), sets of - * hashes may differ only in bits that do not impact their bin - * index for a given power-of-two mask. So we use a secondary - * strategy that applies when the number of nodes in a bin exceeds - * a threshold, and at least one of the keys implements - * Comparable. These TreeBins use a balanced tree to hold nodes - * (a specialized form of red-black trees), bounding search time - * to O(log N). Each search step in a TreeBin is around twice as - * slow as in a regular list, but given that N cannot exceed - * (1<<64) (before running out of addresses) this bounds search - * steps, lock hold times, etc, to reasonable constants (roughly - * 100 nodes inspected per operation worst case) so long as keys - * are Comparable (which is very common -- String, Long, etc). - * TreeBin nodes (TreeNodes) also maintain the same "next" - * traversal pointers as regular nodes, so can be traversed in - * iterators in the same way. - * - * The table is resized when occupancy exceeds a percentage - * threshold (nominally, 0.75, but see below). Only a single - * thread performs the resize (using field "sizeCtl", to arrange - * exclusion), but the table otherwise remains usable for reads - * and updates. Resizing proceeds by transferring bins, one by - * one, from the table to the next table. Because we are using - * power-of-two expansion, the elements from each bin must either - * stay at same index, or move with a power of two offset. We - * eliminate unnecessary node creation by catching cases where old - * nodes can be reused because their next fields won't change. On - * average, only about one-sixth of them need cloning when a table - * doubles. The nodes they replace will be garbage collectable as - * soon as they are no longer referenced by any reader thread that - * may be in the midst of concurrently traversing table. Upon - * transfer, the old table bin contains only a special forwarding - * node (with hash field "MOVED") that contains the next table as - * its key. On encountering a forwarding node, access and update - * operations restart, using the new table. - * - * Each bin transfer requires its bin lock. However, unlike other - * cases, a transfer can skip a bin if it fails to acquire its - * lock, and revisit it later (unless it is a TreeBin). Method - * rebuild maintains a buffer of TRANSFER_BUFFER_SIZE bins that - * have been skipped because of failure to acquire a lock, and - * blocks only if none are available (i.e., only very rarely). - * The transfer operation must also ensure that all accessible - * bins in both the old and new table are usable by any traversal. - * When there are no lock acquisition failures, this is arranged - * simply by proceeding from the last bin (table.length - 1) up - * towards the first. Upon seeing a forwarding node, traversals - * (see class Iter) arrange to move to the new table - * without revisiting nodes. However, when any node is skipped - * during a transfer, all earlier table bins may have become - * visible, so are initialized with a reverse-forwarding node back - * to the old table until the new ones are established. (This - * sometimes requires transiently locking a forwarding node, which - * is possible under the above encoding.) These more expensive - * mechanics trigger only when necessary. - * - * The traversal scheme also applies to partial traversals of - * ranges of bins (via an alternate Traverser constructor) - * to support partitioned aggregate operations. Also, read-only - * operations give up if ever forwarded to a null table, which - * provides support for shutdown-style clearing, which is also not - * currently implemented. - * - * Lazy table initialization minimizes footprint until first use, - * and also avoids resizings when the first operation is from a - * putAll, constructor with map argument, or deserialization. - * These cases attempt to override the initial capacity settings, - * but harmlessly fail to take effect in cases of races. - * - * The element count is maintained using a LongAdder, which avoids - * contention on updates but can encounter cache thrashing if read - * too frequently during concurrent access. To avoid reading so - * often, resizing is attempted either when a bin lock is - * contended, or upon adding to a bin already holding two or more - * nodes (checked before adding in the xIfAbsent methods, after - * adding in others). Under uniform hash distributions, the - * probability of this occurring at threshold is around 13%, - * meaning that only about 1 in 8 puts check threshold (and after - * resizing, many fewer do so). But this approximation has high - * variance for small table sizes, so we check on any collision - * for sizes <= 64. The bulk putAll operation further reduces - * contention by only committing count updates upon these size - * checks. - * - * Maintaining API and serialization compatibility with previous - * versions of this class introduces several oddities. Mainly: We - * leave untouched but unused constructor arguments refering to - * concurrencyLevel. We accept a loadFactor constructor argument, - * but apply it only to initial table capacity (which is the only - * time that we can guarantee to honor it.) We also declare an - * unused "Segment" class that is instantiated in minimal form - * only when serializing. - */ - - /* ---------------- Constants -------------- */ - - /** - * The largest possible table capacity. This value must be - * exactly 1<<30 to stay within Java array allocation and indexing - * bounds for power of two table sizes, and is further required - * because the top two bits of 32bit hash fields are used for - * control purposes. - */ - private static final int MAXIMUM_CAPACITY = 1 << 30; - - /** - * The default initial table capacity. Must be a power of 2 - * (i.e., at least 1) and at most MAXIMUM_CAPACITY. - */ - private static final int DEFAULT_CAPACITY = 16; - - /** - * The largest possible (non-power of two) array size. - * Needed by toArray and related methods. - */ - static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; - - /** - * The default concurrency level for this table. Unused but - * defined for compatibility with previous versions of this class. - */ - private static final int DEFAULT_CONCURRENCY_LEVEL = 16; - - /** - * The load factor for this table. Overrides of this value in - * constructors affect only the initial table capacity. The - * actual floating point value isn't normally used -- it is - * simpler to use expressions such as {@code n - (n >>> 2)} for - * the associated resizing threshold. - */ - private static final float LOAD_FACTOR = 0.75f; - - /** - * The buffer size for skipped bins during transfers. The - * value is arbitrary but should be large enough to avoid - * most locking stalls during resizes. - */ - private static final int TRANSFER_BUFFER_SIZE = 32; - - /** - * The bin count threshold for using a tree rather than list for a - * bin. The value reflects the approximate break-even point for - * using tree-based operations. - * Note that Doug's version defaults to 8, but when dealing with - * Ruby objects it is actually beneficial to avoid TreeNodes - * as long as possible as it usually means going into Ruby land. - */ - private static final int TREE_THRESHOLD = 16; - - /* - * Encodings for special uses of Node hash fields. See above for - * explanation. - */ - static final int MOVED = 0x80000000; // hash field for forwarding nodes - static final int LOCKED = 0x40000000; // set/tested only as a bit - static final int WAITING = 0xc0000000; // both bits set/tested together - static final int HASH_BITS = 0x3fffffff; // usable bits of normal node hash - - /* ---------------- Fields -------------- */ - - /** - * The array of bins. Lazily initialized upon first insertion. - * Size is always a power of two. Accessed directly by iterators. - */ - transient volatile Node[] table; - - /** - * The counter maintaining number of elements. - */ - private transient final LongAdder counter; - - /** - * Table initialization and resizing control. When negative, the - * table is being initialized or resized. Otherwise, when table is - * null, holds the initial table size to use upon creation, or 0 - * for default. After initialization, holds the next element count - * value upon which to resize the table. - */ - private transient volatile int sizeCtl; - - // views - private transient KeySetView keySet; - private transient ValuesView values; - private transient EntrySetView entrySet; - - /** For serialization compatibility. Null unless serialized; see below */ - private Segment[] segments; - - /* ---------------- Table element access -------------- */ - - /* - * Volatile access methods are used for table elements as well as - * elements of in-progress next table while resizing. Uses are - * null checked by callers, and implicitly bounds-checked, relying - * on the invariants that tab arrays have non-zero size, and all - * indices are masked with (tab.length - 1) which is never - * negative and always less than length. Note that, to be correct - * wrt arbitrary concurrency errors by users, bounds checks must - * operate on local variables, which accounts for some odd-looking - * inline assignments below. - */ - - static final Node tabAt(Node[] tab, int i) { // used by Iter - return (Node)UNSAFE.getObjectVolatile(tab, ((long)i< 1 ? 64 : 1; - - /** - * Spins a while if LOCKED bit set and this node is the first - * of its bin, and then sets WAITING bits on hash field and - * blocks (once) if they are still set. It is OK for this - * method to return even if lock is not available upon exit, - * which enables these simple single-wait mechanics. - * - * The corresponding signalling operation is performed within - * callers: Upon detecting that WAITING has been set when - * unlocking lock (via a failed CAS from non-waiting LOCKED - * state), unlockers acquire the sync lock and perform a - * notifyAll. - * - * The initial sanity check on tab and bounds is not currently - * necessary in the only usages of this method, but enables - * use in other future contexts. - */ - final void tryAwaitLock(Node[] tab, int i) { - if (tab != null && i >= 0 && i < tab.length) { // sanity check - int r = ThreadLocalRandom.current().nextInt(); // randomize spins - int spins = MAX_SPINS, h; - while (tabAt(tab, i) == this && ((h = hash) & LOCKED) != 0) { - if (spins >= 0) { - r ^= r << 1; r ^= r >>> 3; r ^= r << 10; // xorshift - if (r >= 0 && --spins == 0) - Thread.yield(); // yield before block - } - else if (casHash(h, h | WAITING)) { - synchronized (this) { - if (tabAt(tab, i) == this && - (hash & WAITING) == WAITING) { - try { - wait(); - } catch (InterruptedException ie) { - Thread.currentThread().interrupt(); - } - } - else - notifyAll(); // possibly won race vs signaller - } - break; - } - } - } - } - - // Unsafe mechanics for casHash - private static final sun.misc.Unsafe UNSAFE; - private static final long hashOffset; - - static { - try { - UNSAFE = getUnsafe(); - Class k = Node.class; - hashOffset = UNSAFE.objectFieldOffset - (k.getDeclaredField("hash")); - } catch (Exception e) { - throw new Error(e); - } - } - } - - /* ---------------- TreeBins -------------- */ - - /** - * Nodes for use in TreeBins - */ - static final class TreeNode extends Node { - TreeNode parent; // red-black tree links - TreeNode left; - TreeNode right; - TreeNode prev; // needed to unlink next upon deletion - boolean red; - - TreeNode(int hash, Object key, Object val, Node next, TreeNode parent) { - super(hash, key, val, next); - this.parent = parent; - } - } - - /** - * A specialized form of red-black tree for use in bins - * whose size exceeds a threshold. - * - * TreeBins use a special form of comparison for search and - * related operations (which is the main reason we cannot use - * existing collections such as TreeMaps). TreeBins contain - * Comparable elements, but may contain others, as well as - * elements that are Comparable but not necessarily Comparable - * for the same T, so we cannot invoke compareTo among them. To - * handle this, the tree is ordered primarily by hash value, then - * by getClass().getName() order, and then by Comparator order - * among elements of the same class. On lookup at a node, if - * elements are not comparable or compare as 0, both left and - * right children may need to be searched in the case of tied hash - * values. (This corresponds to the full list search that would be - * necessary if all elements were non-Comparable and had tied - * hashes.) The red-black balancing code is updated from - * pre-jdk-collections - * (http://gee.cs.oswego.edu/dl/classes/collections/RBCell.java) - * based in turn on Cormen, Leiserson, and Rivest "Introduction to - * Algorithms" (CLR). - * - * TreeBins also maintain a separate locking discipline than - * regular bins. Because they are forwarded via special MOVED - * nodes at bin heads (which can never change once established), - * we cannot use those nodes as locks. Instead, TreeBin - * extends AbstractQueuedSynchronizer to support a simple form of - * read-write lock. For update operations and table validation, - * the exclusive form of lock behaves in the same way as bin-head - * locks. However, lookups use shared read-lock mechanics to allow - * multiple readers in the absence of writers. Additionally, - * these lookups do not ever block: While the lock is not - * available, they proceed along the slow traversal path (via - * next-pointers) until the lock becomes available or the list is - * exhausted, whichever comes first. (These cases are not fast, - * but maximize aggregate expected throughput.) The AQS mechanics - * for doing this are straightforward. The lock state is held as - * AQS getState(). Read counts are negative; the write count (1) - * is positive. There are no signalling preferences among readers - * and writers. Since we don't need to export full Lock API, we - * just override the minimal AQS methods and use them directly. - */ - static final class TreeBin extends AbstractQueuedSynchronizer { - private static final long serialVersionUID = 2249069246763182397L; - transient TreeNode root; // root of tree - transient TreeNode first; // head of next-pointer list - - /* AQS overrides */ - public final boolean isHeldExclusively() { return getState() > 0; } - public final boolean tryAcquire(int ignore) { - if (compareAndSetState(0, 1)) { - setExclusiveOwnerThread(Thread.currentThread()); - return true; - } - return false; - } - public final boolean tryRelease(int ignore) { - setExclusiveOwnerThread(null); - setState(0); - return true; - } - public final int tryAcquireShared(int ignore) { - for (int c;;) { - if ((c = getState()) > 0) - return -1; - if (compareAndSetState(c, c -1)) - return 1; - } - } - public final boolean tryReleaseShared(int ignore) { - int c; - do {} while (!compareAndSetState(c = getState(), c + 1)); - return c == -1; - } - - /** From CLR */ - private void rotateLeft(TreeNode p) { - if (p != null) { - TreeNode r = p.right, pp, rl; - if ((rl = p.right = r.left) != null) - rl.parent = p; - if ((pp = r.parent = p.parent) == null) - root = r; - else if (pp.left == p) - pp.left = r; - else - pp.right = r; - r.left = p; - p.parent = r; - } - } - - /** From CLR */ - private void rotateRight(TreeNode p) { - if (p != null) { - TreeNode l = p.left, pp, lr; - if ((lr = p.left = l.right) != null) - lr.parent = p; - if ((pp = l.parent = p.parent) == null) - root = l; - else if (pp.right == p) - pp.right = l; - else - pp.left = l; - l.right = p; - p.parent = l; - } - } - - @SuppressWarnings("unchecked") final TreeNode getTreeNode - (int h, Object k, TreeNode p) { - return getTreeNode(h, (RubyObject)k, p); - } - - /** - * Returns the TreeNode (or null if not found) for the given key - * starting at given root. - */ - @SuppressWarnings("unchecked") final TreeNode getTreeNode - (int h, RubyObject k, TreeNode p) { - RubyClass c = k.getMetaClass(); boolean kNotComparable = !k.respondsTo("<=>"); - while (p != null) { - int dir, ph; RubyObject pk; RubyClass pc; - if ((ph = p.hash) == h) { - if ((pk = (RubyObject)p.key) == k || k.equals(pk)) - return p; - if (c != (pc = (RubyClass)pk.getMetaClass()) || - kNotComparable || - (dir = rubyCompare(k, pk)) == 0) { - dir = (c == pc) ? 0 : c.getName().compareTo(pc.getName()); - if (dir == 0) { // if still stuck, need to check both sides - TreeNode r = null, pl, pr; - // try to recurse on the right - if ((pr = p.right) != null && h >= pr.hash && (r = getTreeNode(h, k, pr)) != null) - return r; - // try to continue iterating on the left side - else if ((pl = p.left) != null && h <= pl.hash) - dir = -1; - else // no matching node found - return null; - } - } - } - else - dir = (h < ph) ? -1 : 1; - p = (dir > 0) ? p.right : p.left; - } - return null; - } - - int rubyCompare(RubyObject l, RubyObject r) { - ThreadContext context = l.getMetaClass().getRuntime().getCurrentContext(); - IRubyObject result; - try { - result = l.callMethod(context, "<=>", r); - } catch (RaiseException e) { - // handle objects "lying" about responding to <=>, ie: an Array containing non-comparable keys - if (context.runtime.getNoMethodError().isInstance(e.getException())) { - return 0; - } - throw e; - } - - return result.isNil() ? 0 : RubyNumeric.num2int(result.convertToInteger()); - } - - /** - * Wrapper for getTreeNode used by CHM.get. Tries to obtain - * read-lock to call getTreeNode, but during failure to get - * lock, searches along next links. - */ - final Object getValue(int h, Object k) { - Node r = null; - int c = getState(); // Must read lock state first - for (Node e = first; e != null; e = e.next) { - if (c <= 0 && compareAndSetState(c, c - 1)) { - try { - r = getTreeNode(h, k, root); - } finally { - releaseShared(0); - } - break; - } - else if ((e.hash & HASH_BITS) == h && k.equals(e.key)) { - r = e; - break; - } - else - c = getState(); - } - return r == null ? null : r.val; - } - - @SuppressWarnings("unchecked") final TreeNode putTreeNode - (int h, Object k, Object v) { - return putTreeNode(h, (RubyObject)k, v); - } - - /** - * Finds or adds a node. - * @return null if added - */ - @SuppressWarnings("unchecked") final TreeNode putTreeNode - (int h, RubyObject k, Object v) { - RubyClass c = k.getMetaClass(); - boolean kNotComparable = !k.respondsTo("<=>"); - TreeNode pp = root, p = null; - int dir = 0; - while (pp != null) { // find existing node or leaf to insert at - int ph; RubyObject pk; RubyClass pc; - p = pp; - if ((ph = p.hash) == h) { - if ((pk = (RubyObject)p.key) == k || k.equals(pk)) - return p; - if (c != (pc = pk.getMetaClass()) || - kNotComparable || - (dir = rubyCompare(k, pk)) == 0) { - dir = (c == pc) ? 0 : c.getName().compareTo(pc.getName()); - if (dir == 0) { // if still stuck, need to check both sides - TreeNode r = null, pr; - // try to recurse on the right - if ((pr = p.right) != null && h >= pr.hash && (r = getTreeNode(h, k, pr)) != null) - return r; - else // continue descending down the left subtree - dir = -1; - } - } - } - else - dir = (h < ph) ? -1 : 1; - pp = (dir > 0) ? p.right : p.left; - } - - TreeNode f = first; - TreeNode x = first = new TreeNode(h, (Object)k, v, f, p); - if (p == null) - root = x; - else { // attach and rebalance; adapted from CLR - TreeNode xp, xpp; - if (f != null) - f.prev = x; - if (dir <= 0) - p.left = x; - else - p.right = x; - x.red = true; - while (x != null && (xp = x.parent) != null && xp.red && - (xpp = xp.parent) != null) { - TreeNode xppl = xpp.left; - if (xp == xppl) { - TreeNode y = xpp.right; - if (y != null && y.red) { - y.red = false; - xp.red = false; - xpp.red = true; - x = xpp; - } - else { - if (x == xp.right) { - rotateLeft(x = xp); - xpp = (xp = x.parent) == null ? null : xp.parent; - } - if (xp != null) { - xp.red = false; - if (xpp != null) { - xpp.red = true; - rotateRight(xpp); - } - } - } - } - else { - TreeNode y = xppl; - if (y != null && y.red) { - y.red = false; - xp.red = false; - xpp.red = true; - x = xpp; - } - else { - if (x == xp.left) { - rotateRight(x = xp); - xpp = (xp = x.parent) == null ? null : xp.parent; - } - if (xp != null) { - xp.red = false; - if (xpp != null) { - xpp.red = true; - rotateLeft(xpp); - } - } - } - } - } - TreeNode r = root; - if (r != null && r.red) - r.red = false; - } - return null; - } - - /** - * Removes the given node, that must be present before this - * call. This is messier than typical red-black deletion code - * because we cannot swap the contents of an interior node - * with a leaf successor that is pinned by "next" pointers - * that are accessible independently of lock. So instead we - * swap the tree linkages. - */ - final void deleteTreeNode(TreeNode p) { - TreeNode next = (TreeNode)p.next; // unlink traversal pointers - TreeNode pred = p.prev; - if (pred == null) - first = next; - else - pred.next = next; - if (next != null) - next.prev = pred; - TreeNode replacement; - TreeNode pl = p.left; - TreeNode pr = p.right; - if (pl != null && pr != null) { - TreeNode s = pr, sl; - while ((sl = s.left) != null) // find successor - s = sl; - boolean c = s.red; s.red = p.red; p.red = c; // swap colors - TreeNode sr = s.right; - TreeNode pp = p.parent; - if (s == pr) { // p was s's direct parent - p.parent = s; - s.right = p; - } - else { - TreeNode sp = s.parent; - if ((p.parent = sp) != null) { - if (s == sp.left) - sp.left = p; - else - sp.right = p; - } - if ((s.right = pr) != null) - pr.parent = s; - } - p.left = null; - if ((p.right = sr) != null) - sr.parent = p; - if ((s.left = pl) != null) - pl.parent = s; - if ((s.parent = pp) == null) - root = s; - else if (p == pp.left) - pp.left = s; - else - pp.right = s; - replacement = sr; - } - else - replacement = (pl != null) ? pl : pr; - TreeNode pp = p.parent; - if (replacement == null) { - if (pp == null) { - root = null; - return; - } - replacement = p; - } - else { - replacement.parent = pp; - if (pp == null) - root = replacement; - else if (p == pp.left) - pp.left = replacement; - else - pp.right = replacement; - p.left = p.right = p.parent = null; - } - if (!p.red) { // rebalance, from CLR - TreeNode x = replacement; - while (x != null) { - TreeNode xp, xpl; - if (x.red || (xp = x.parent) == null) { - x.red = false; - break; - } - if (x == (xpl = xp.left)) { - TreeNode sib = xp.right; - if (sib != null && sib.red) { - sib.red = false; - xp.red = true; - rotateLeft(xp); - sib = (xp = x.parent) == null ? null : xp.right; - } - if (sib == null) - x = xp; - else { - TreeNode sl = sib.left, sr = sib.right; - if ((sr == null || !sr.red) && - (sl == null || !sl.red)) { - sib.red = true; - x = xp; - } - else { - if (sr == null || !sr.red) { - if (sl != null) - sl.red = false; - sib.red = true; - rotateRight(sib); - sib = (xp = x.parent) == null ? null : xp.right; - } - if (sib != null) { - sib.red = (xp == null) ? false : xp.red; - if ((sr = sib.right) != null) - sr.red = false; - } - if (xp != null) { - xp.red = false; - rotateLeft(xp); - } - x = root; - } - } - } - else { // symmetric - TreeNode sib = xpl; - if (sib != null && sib.red) { - sib.red = false; - xp.red = true; - rotateRight(xp); - sib = (xp = x.parent) == null ? null : xp.left; - } - if (sib == null) - x = xp; - else { - TreeNode sl = sib.left, sr = sib.right; - if ((sl == null || !sl.red) && - (sr == null || !sr.red)) { - sib.red = true; - x = xp; - } - else { - if (sl == null || !sl.red) { - if (sr != null) - sr.red = false; - sib.red = true; - rotateLeft(sib); - sib = (xp = x.parent) == null ? null : xp.left; - } - if (sib != null) { - sib.red = (xp == null) ? false : xp.red; - if ((sl = sib.left) != null) - sl.red = false; - } - if (xp != null) { - xp.red = false; - rotateRight(xp); - } - x = root; - } - } - } - } - } - if (p == replacement && (pp = p.parent) != null) { - if (p == pp.left) // detach pointers - pp.left = null; - else if (p == pp.right) - pp.right = null; - p.parent = null; - } - } - } - - /* ---------------- Collision reduction methods -------------- */ - - /** - * Spreads higher bits to lower, and also forces top 2 bits to 0. - * Because the table uses power-of-two masking, sets of hashes - * that vary only in bits above the current mask will always - * collide. (Among known examples are sets of Float keys holding - * consecutive whole numbers in small tables.) To counter this, - * we apply a transform that spreads the impact of higher bits - * downward. There is a tradeoff between speed, utility, and - * quality of bit-spreading. Because many common sets of hashes - * are already reasonably distributed across bits (so don't benefit - * from spreading), and because we use trees to handle large sets - * of collisions in bins, we don't need excessively high quality. - */ - private static final int spread(int h) { - h ^= (h >>> 18) ^ (h >>> 12); - return (h ^ (h >>> 10)) & HASH_BITS; - } - - /** - * Replaces a list bin with a tree bin. Call only when locked. - * Fails to replace if the given key is non-comparable or table - * is, or needs, resizing. - */ - private final void replaceWithTreeBin(Node[] tab, int index, Object key) { - if ((key instanceof Comparable) && - (tab.length >= MAXIMUM_CAPACITY || counter.sum() < (long)sizeCtl)) { - TreeBin t = new TreeBin(); - for (Node e = tabAt(tab, index); e != null; e = e.next) - t.putTreeNode(e.hash & HASH_BITS, e.key, e.val); - setTabAt(tab, index, new Node(MOVED, t, null, null)); - } - } - - /* ---------------- Internal access and update methods -------------- */ - - /** Implementation for get and containsKey */ - private final Object internalGet(Object k) { - int h = spread(k.hashCode()); - retry: for (Node[] tab = table; tab != null;) { - Node e, p; Object ek, ev; int eh; // locals to read fields once - for (e = tabAt(tab, (tab.length - 1) & h); e != null; e = e.next) { - if ((eh = e.hash) == MOVED) { - if ((ek = e.key) instanceof TreeBin) // search TreeBin - return ((TreeBin)ek).getValue(h, k); - else { // restart with new table - tab = (Node[])ek; - continue retry; - } - } - else if ((eh & HASH_BITS) == h && (ev = e.val) != null && - ((ek = e.key) == k || k.equals(ek))) - return ev; - } - break; - } - return null; - } - - /** - * Implementation for the four public remove/replace methods: - * Replaces node value with v, conditional upon match of cv if - * non-null. If resulting value is null, delete. - */ - private final Object internalReplace(Object k, Object v, Object cv) { - int h = spread(k.hashCode()); - Object oldVal = null; - for (Node[] tab = table;;) { - Node f; int i, fh; Object fk; - if (tab == null || - (f = tabAt(tab, i = (tab.length - 1) & h)) == null) - break; - else if ((fh = f.hash) == MOVED) { - if ((fk = f.key) instanceof TreeBin) { - TreeBin t = (TreeBin)fk; - boolean validated = false; - boolean deleted = false; - t.acquire(0); - try { - if (tabAt(tab, i) == f) { - validated = true; - TreeNode p = t.getTreeNode(h, k, t.root); - if (p != null) { - Object pv = p.val; - if (cv == null || cv == pv || cv.equals(pv)) { - oldVal = pv; - if ((p.val = v) == null) { - deleted = true; - t.deleteTreeNode(p); - } - } - } - } - } finally { - t.release(0); - } - if (validated) { - if (deleted) - counter.add(-1L); - break; - } - } - else - tab = (Node[])fk; - } - else if ((fh & HASH_BITS) != h && f.next == null) // precheck - break; // rules out possible existence - else if ((fh & LOCKED) != 0) { - checkForResize(); // try resizing if can't get lock - f.tryAwaitLock(tab, i); - } - else if (f.casHash(fh, fh | LOCKED)) { - boolean validated = false; - boolean deleted = false; - try { - if (tabAt(tab, i) == f) { - validated = true; - for (Node e = f, pred = null;;) { - Object ek, ev; - if ((e.hash & HASH_BITS) == h && - ((ev = e.val) != null) && - ((ek = e.key) == k || k.equals(ek))) { - if (cv == null || cv == ev || cv.equals(ev)) { - oldVal = ev; - if ((e.val = v) == null) { - deleted = true; - Node en = e.next; - if (pred != null) - pred.next = en; - else - setTabAt(tab, i, en); - } - } - break; - } - pred = e; - if ((e = e.next) == null) - break; - } - } - } finally { - if (!f.casHash(fh | LOCKED, fh)) { - f.hash = fh; - synchronized (f) { f.notifyAll(); }; - } - } - if (validated) { - if (deleted) - counter.add(-1L); - break; - } - } - } - return oldVal; - } - - /* - * Internal versions of the six insertion methods, each a - * little more complicated than the last. All have - * the same basic structure as the first (internalPut): - * 1. If table uninitialized, create - * 2. If bin empty, try to CAS new node - * 3. If bin stale, use new table - * 4. if bin converted to TreeBin, validate and relay to TreeBin methods - * 5. Lock and validate; if valid, scan and add or update - * - * The others interweave other checks and/or alternative actions: - * * Plain put checks for and performs resize after insertion. - * * putIfAbsent prescans for mapping without lock (and fails to add - * if present), which also makes pre-emptive resize checks worthwhile. - * * computeIfAbsent extends form used in putIfAbsent with additional - * mechanics to deal with, calls, potential exceptions and null - * returns from function call. - * * compute uses the same function-call mechanics, but without - * the prescans - * * merge acts as putIfAbsent in the absent case, but invokes the - * update function if present - * * putAll attempts to pre-allocate enough table space - * and more lazily performs count updates and checks. - * - * Someday when details settle down a bit more, it might be worth - * some factoring to reduce sprawl. - */ - - /** Implementation for put */ - private final Object internalPut(Object k, Object v) { - int h = spread(k.hashCode()); - int count = 0; - for (Node[] tab = table;;) { - int i; Node f; int fh; Object fk; - if (tab == null) - tab = initTable(); - else if ((f = tabAt(tab, i = (tab.length - 1) & h)) == null) { - if (casTabAt(tab, i, null, new Node(h, k, v, null))) - break; // no lock when adding to empty bin - } - else if ((fh = f.hash) == MOVED) { - if ((fk = f.key) instanceof TreeBin) { - TreeBin t = (TreeBin)fk; - Object oldVal = null; - t.acquire(0); - try { - if (tabAt(tab, i) == f) { - count = 2; - TreeNode p = t.putTreeNode(h, k, v); - if (p != null) { - oldVal = p.val; - p.val = v; - } - } - } finally { - t.release(0); - } - if (count != 0) { - if (oldVal != null) - return oldVal; - break; - } - } - else - tab = (Node[])fk; - } - else if ((fh & LOCKED) != 0) { - checkForResize(); - f.tryAwaitLock(tab, i); - } - else if (f.casHash(fh, fh | LOCKED)) { - Object oldVal = null; - try { // needed in case equals() throws - if (tabAt(tab, i) == f) { - count = 1; - for (Node e = f;; ++count) { - Object ek, ev; - if ((e.hash & HASH_BITS) == h && - (ev = e.val) != null && - ((ek = e.key) == k || k.equals(ek))) { - oldVal = ev; - e.val = v; - break; - } - Node last = e; - if ((e = e.next) == null) { - last.next = new Node(h, k, v, null); - if (count >= TREE_THRESHOLD) - replaceWithTreeBin(tab, i, k); - break; - } - } - } - } finally { // unlock and signal if needed - if (!f.casHash(fh | LOCKED, fh)) { - f.hash = fh; - synchronized (f) { f.notifyAll(); }; - } - } - if (count != 0) { - if (oldVal != null) - return oldVal; - if (tab.length <= 64) - count = 2; - break; - } - } - } - counter.add(1L); - if (count > 1) - checkForResize(); - return null; - } - - /** Implementation for putIfAbsent */ - private final Object internalPutIfAbsent(Object k, Object v) { - int h = spread(k.hashCode()); - int count = 0; - for (Node[] tab = table;;) { - int i; Node f; int fh; Object fk, fv; - if (tab == null) - tab = initTable(); - else if ((f = tabAt(tab, i = (tab.length - 1) & h)) == null) { - if (casTabAt(tab, i, null, new Node(h, k, v, null))) - break; - } - else if ((fh = f.hash) == MOVED) { - if ((fk = f.key) instanceof TreeBin) { - TreeBin t = (TreeBin)fk; - Object oldVal = null; - t.acquire(0); - try { - if (tabAt(tab, i) == f) { - count = 2; - TreeNode p = t.putTreeNode(h, k, v); - if (p != null) - oldVal = p.val; - } - } finally { - t.release(0); - } - if (count != 0) { - if (oldVal != null) - return oldVal; - break; - } - } - else - tab = (Node[])fk; - } - else if ((fh & HASH_BITS) == h && (fv = f.val) != null && - ((fk = f.key) == k || k.equals(fk))) - return fv; - else { - Node g = f.next; - if (g != null) { // at least 2 nodes -- search and maybe resize - for (Node e = g;;) { - Object ek, ev; - if ((e.hash & HASH_BITS) == h && (ev = e.val) != null && - ((ek = e.key) == k || k.equals(ek))) - return ev; - if ((e = e.next) == null) { - checkForResize(); - break; - } - } - } - if (((fh = f.hash) & LOCKED) != 0) { - checkForResize(); - f.tryAwaitLock(tab, i); - } - else if (tabAt(tab, i) == f && f.casHash(fh, fh | LOCKED)) { - Object oldVal = null; - try { - if (tabAt(tab, i) == f) { - count = 1; - for (Node e = f;; ++count) { - Object ek, ev; - if ((e.hash & HASH_BITS) == h && - (ev = e.val) != null && - ((ek = e.key) == k || k.equals(ek))) { - oldVal = ev; - break; - } - Node last = e; - if ((e = e.next) == null) { - last.next = new Node(h, k, v, null); - if (count >= TREE_THRESHOLD) - replaceWithTreeBin(tab, i, k); - break; - } - } - } - } finally { - if (!f.casHash(fh | LOCKED, fh)) { - f.hash = fh; - synchronized (f) { f.notifyAll(); }; - } - } - if (count != 0) { - if (oldVal != null) - return oldVal; - if (tab.length <= 64) - count = 2; - break; - } - } - } - } - counter.add(1L); - if (count > 1) - checkForResize(); - return null; - } - - /** Implementation for computeIfAbsent */ - private final Object internalComputeIfAbsent(K k, - Fun mf) { - int h = spread(k.hashCode()); - Object val = null; - int count = 0; - for (Node[] tab = table;;) { - Node f; int i, fh; Object fk, fv; - if (tab == null) - tab = initTable(); - else if ((f = tabAt(tab, i = (tab.length - 1) & h)) == null) { - Node node = new Node(fh = h | LOCKED, k, null, null); - if (casTabAt(tab, i, null, node)) { - count = 1; - try { - if ((val = mf.apply(k)) != null) - node.val = val; - } finally { - if (val == null) - setTabAt(tab, i, null); - if (!node.casHash(fh, h)) { - node.hash = h; - synchronized (node) { node.notifyAll(); }; - } - } - } - if (count != 0) - break; - } - else if ((fh = f.hash) == MOVED) { - if ((fk = f.key) instanceof TreeBin) { - TreeBin t = (TreeBin)fk; - boolean added = false; - t.acquire(0); - try { - if (tabAt(tab, i) == f) { - count = 1; - TreeNode p = t.getTreeNode(h, k, t.root); - if (p != null) - val = p.val; - else if ((val = mf.apply(k)) != null) { - added = true; - count = 2; - t.putTreeNode(h, k, val); - } - } - } finally { - t.release(0); - } - if (count != 0) { - if (!added) - return val; - break; - } - } - else - tab = (Node[])fk; - } - else if ((fh & HASH_BITS) == h && (fv = f.val) != null && - ((fk = f.key) == k || k.equals(fk))) - return fv; - else { - Node g = f.next; - if (g != null) { - for (Node e = g;;) { - Object ek, ev; - if ((e.hash & HASH_BITS) == h && (ev = e.val) != null && - ((ek = e.key) == k || k.equals(ek))) - return ev; - if ((e = e.next) == null) { - checkForResize(); - break; - } - } - } - if (((fh = f.hash) & LOCKED) != 0) { - checkForResize(); - f.tryAwaitLock(tab, i); - } - else if (tabAt(tab, i) == f && f.casHash(fh, fh | LOCKED)) { - boolean added = false; - try { - if (tabAt(tab, i) == f) { - count = 1; - for (Node e = f;; ++count) { - Object ek, ev; - if ((e.hash & HASH_BITS) == h && - (ev = e.val) != null && - ((ek = e.key) == k || k.equals(ek))) { - val = ev; - break; - } - Node last = e; - if ((e = e.next) == null) { - if ((val = mf.apply(k)) != null) { - added = true; - last.next = new Node(h, k, val, null); - if (count >= TREE_THRESHOLD) - replaceWithTreeBin(tab, i, k); - } - break; - } - } - } - } finally { - if (!f.casHash(fh | LOCKED, fh)) { - f.hash = fh; - synchronized (f) { f.notifyAll(); }; - } - } - if (count != 0) { - if (!added) - return val; - if (tab.length <= 64) - count = 2; - break; - } - } - } - } - if (val != null) { - counter.add(1L); - if (count > 1) - checkForResize(); - } - return val; - } - - /** Implementation for compute */ - @SuppressWarnings("unchecked") private final Object internalCompute - (K k, boolean onlyIfPresent, BiFun mf) { - int h = spread(k.hashCode()); - Object val = null; - int delta = 0; - int count = 0; - for (Node[] tab = table;;) { - Node f; int i, fh; Object fk; - if (tab == null) - tab = initTable(); - else if ((f = tabAt(tab, i = (tab.length - 1) & h)) == null) { - if (onlyIfPresent) - break; - Node node = new Node(fh = h | LOCKED, k, null, null); - if (casTabAt(tab, i, null, node)) { - try { - count = 1; - if ((val = mf.apply(k, null)) != null) { - node.val = val; - delta = 1; - } - } finally { - if (delta == 0) - setTabAt(tab, i, null); - if (!node.casHash(fh, h)) { - node.hash = h; - synchronized (node) { node.notifyAll(); }; - } - } - } - if (count != 0) - break; - } - else if ((fh = f.hash) == MOVED) { - if ((fk = f.key) instanceof TreeBin) { - TreeBin t = (TreeBin)fk; - t.acquire(0); - try { - if (tabAt(tab, i) == f) { - count = 1; - TreeNode p = t.getTreeNode(h, k, t.root); - Object pv; - if (p == null) { - if (onlyIfPresent) - break; - pv = null; - } else - pv = p.val; - if ((val = mf.apply(k, (V)pv)) != null) { - if (p != null) - p.val = val; - else { - count = 2; - delta = 1; - t.putTreeNode(h, k, val); - } - } - else if (p != null) { - delta = -1; - t.deleteTreeNode(p); - } - } - } finally { - t.release(0); - } - if (count != 0) - break; - } - else - tab = (Node[])fk; - } - else if ((fh & LOCKED) != 0) { - checkForResize(); - f.tryAwaitLock(tab, i); - } - else if (f.casHash(fh, fh | LOCKED)) { - try { - if (tabAt(tab, i) == f) { - count = 1; - for (Node e = f, pred = null;; ++count) { - Object ek, ev; - if ((e.hash & HASH_BITS) == h && - (ev = e.val) != null && - ((ek = e.key) == k || k.equals(ek))) { - val = mf.apply(k, (V)ev); - if (val != null) - e.val = val; - else { - delta = -1; - Node en = e.next; - if (pred != null) - pred.next = en; - else - setTabAt(tab, i, en); - } - break; - } - pred = e; - if ((e = e.next) == null) { - if (!onlyIfPresent && (val = mf.apply(k, null)) != null) { - pred.next = new Node(h, k, val, null); - delta = 1; - if (count >= TREE_THRESHOLD) - replaceWithTreeBin(tab, i, k); - } - break; - } - } - } - } finally { - if (!f.casHash(fh | LOCKED, fh)) { - f.hash = fh; - synchronized (f) { f.notifyAll(); }; - } - } - if (count != 0) { - if (tab.length <= 64) - count = 2; - break; - } - } - } - if (delta != 0) { - counter.add((long)delta); - if (count > 1) - checkForResize(); - } - return val; - } - - /** Implementation for merge */ - @SuppressWarnings("unchecked") private final Object internalMerge - (K k, V v, BiFun mf) { - int h = spread(k.hashCode()); - Object val = null; - int delta = 0; - int count = 0; - for (Node[] tab = table;;) { - int i; Node f; int fh; Object fk, fv; - if (tab == null) - tab = initTable(); - else if ((f = tabAt(tab, i = (tab.length - 1) & h)) == null) { - if (casTabAt(tab, i, null, new Node(h, k, v, null))) { - delta = 1; - val = v; - break; - } - } - else if ((fh = f.hash) == MOVED) { - if ((fk = f.key) instanceof TreeBin) { - TreeBin t = (TreeBin)fk; - t.acquire(0); - try { - if (tabAt(tab, i) == f) { - count = 1; - TreeNode p = t.getTreeNode(h, k, t.root); - val = (p == null) ? v : mf.apply((V)p.val, v); - if (val != null) { - if (p != null) - p.val = val; - else { - count = 2; - delta = 1; - t.putTreeNode(h, k, val); - } - } - else if (p != null) { - delta = -1; - t.deleteTreeNode(p); - } - } - } finally { - t.release(0); - } - if (count != 0) - break; - } - else - tab = (Node[])fk; - } - else if ((fh & LOCKED) != 0) { - checkForResize(); - f.tryAwaitLock(tab, i); - } - else if (f.casHash(fh, fh | LOCKED)) { - try { - if (tabAt(tab, i) == f) { - count = 1; - for (Node e = f, pred = null;; ++count) { - Object ek, ev; - if ((e.hash & HASH_BITS) == h && - (ev = e.val) != null && - ((ek = e.key) == k || k.equals(ek))) { - val = mf.apply((V)ev, v); - if (val != null) - e.val = val; - else { - delta = -1; - Node en = e.next; - if (pred != null) - pred.next = en; - else - setTabAt(tab, i, en); - } - break; - } - pred = e; - if ((e = e.next) == null) { - val = v; - pred.next = new Node(h, k, val, null); - delta = 1; - if (count >= TREE_THRESHOLD) - replaceWithTreeBin(tab, i, k); - break; - } - } - } - } finally { - if (!f.casHash(fh | LOCKED, fh)) { - f.hash = fh; - synchronized (f) { f.notifyAll(); }; - } - } - if (count != 0) { - if (tab.length <= 64) - count = 2; - break; - } - } - } - if (delta != 0) { - counter.add((long)delta); - if (count > 1) - checkForResize(); - } - return val; - } - - /** Implementation for putAll */ - private final void internalPutAll(Map m) { - tryPresize(m.size()); - long delta = 0L; // number of uncommitted additions - boolean npe = false; // to throw exception on exit for nulls - try { // to clean up counts on other exceptions - for (Map.Entry entry : m.entrySet()) { - Object k, v; - if (entry == null || (k = entry.getKey()) == null || - (v = entry.getValue()) == null) { - npe = true; - break; - } - int h = spread(k.hashCode()); - for (Node[] tab = table;;) { - int i; Node f; int fh; Object fk; - if (tab == null) - tab = initTable(); - else if ((f = tabAt(tab, i = (tab.length - 1) & h)) == null){ - if (casTabAt(tab, i, null, new Node(h, k, v, null))) { - ++delta; - break; - } - } - else if ((fh = f.hash) == MOVED) { - if ((fk = f.key) instanceof TreeBin) { - TreeBin t = (TreeBin)fk; - boolean validated = false; - t.acquire(0); - try { - if (tabAt(tab, i) == f) { - validated = true; - TreeNode p = t.getTreeNode(h, k, t.root); - if (p != null) - p.val = v; - else { - t.putTreeNode(h, k, v); - ++delta; - } - } - } finally { - t.release(0); - } - if (validated) - break; - } - else - tab = (Node[])fk; - } - else if ((fh & LOCKED) != 0) { - counter.add(delta); - delta = 0L; - checkForResize(); - f.tryAwaitLock(tab, i); - } - else if (f.casHash(fh, fh | LOCKED)) { - int count = 0; - try { - if (tabAt(tab, i) == f) { - count = 1; - for (Node e = f;; ++count) { - Object ek, ev; - if ((e.hash & HASH_BITS) == h && - (ev = e.val) != null && - ((ek = e.key) == k || k.equals(ek))) { - e.val = v; - break; - } - Node last = e; - if ((e = e.next) == null) { - ++delta; - last.next = new Node(h, k, v, null); - if (count >= TREE_THRESHOLD) - replaceWithTreeBin(tab, i, k); - break; - } - } - } - } finally { - if (!f.casHash(fh | LOCKED, fh)) { - f.hash = fh; - synchronized (f) { f.notifyAll(); }; - } - } - if (count != 0) { - if (count > 1) { - counter.add(delta); - delta = 0L; - checkForResize(); - } - break; - } - } - } - } - } finally { - if (delta != 0) - counter.add(delta); - } - if (npe) - throw new NullPointerException(); - } - - /* ---------------- Table Initialization and Resizing -------------- */ - - /** - * Returns a power of two table size for the given desired capacity. - * See Hackers Delight, sec 3.2 - */ - private static final int tableSizeFor(int c) { - int n = c - 1; - n |= n >>> 1; - n |= n >>> 2; - n |= n >>> 4; - n |= n >>> 8; - n |= n >>> 16; - return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1; - } - - /** - * Initializes table, using the size recorded in sizeCtl. - */ - private final Node[] initTable() { - Node[] tab; int sc; - while ((tab = table) == null) { - if ((sc = sizeCtl) < 0) - Thread.yield(); // lost initialization race; just spin - else if (UNSAFE.compareAndSwapInt(this, sizeCtlOffset, sc, -1)) { - try { - if ((tab = table) == null) { - int n = (sc > 0) ? sc : DEFAULT_CAPACITY; - tab = table = new Node[n]; - sc = n - (n >>> 2); - } - } finally { - sizeCtl = sc; - } - break; - } - } - return tab; - } - - /** - * If table is too small and not already resizing, creates next - * table and transfers bins. Rechecks occupancy after a transfer - * to see if another resize is already needed because resizings - * are lagging additions. - */ - private final void checkForResize() { - Node[] tab; int n, sc; - while ((tab = table) != null && - (n = tab.length) < MAXIMUM_CAPACITY && - (sc = sizeCtl) >= 0 && counter.sum() >= (long)sc && - UNSAFE.compareAndSwapInt(this, sizeCtlOffset, sc, -1)) { - try { - if (tab == table) { - table = rebuild(tab); - sc = (n << 1) - (n >>> 1); - } - } finally { - sizeCtl = sc; - } - } - } - - /** - * Tries to presize table to accommodate the given number of elements. - * - * @param size number of elements (doesn't need to be perfectly accurate) - */ - private final void tryPresize(int size) { - int c = (size >= (MAXIMUM_CAPACITY >>> 1)) ? MAXIMUM_CAPACITY : - tableSizeFor(size + (size >>> 1) + 1); - int sc; - while ((sc = sizeCtl) >= 0) { - Node[] tab = table; int n; - if (tab == null || (n = tab.length) == 0) { - n = (sc > c) ? sc : c; - if (UNSAFE.compareAndSwapInt(this, sizeCtlOffset, sc, -1)) { - try { - if (table == tab) { - table = new Node[n]; - sc = n - (n >>> 2); - } - } finally { - sizeCtl = sc; - } - } - } - else if (c <= sc || n >= MAXIMUM_CAPACITY) - break; - else if (UNSAFE.compareAndSwapInt(this, sizeCtlOffset, sc, -1)) { - try { - if (table == tab) { - table = rebuild(tab); - sc = (n << 1) - (n >>> 1); - } - } finally { - sizeCtl = sc; - } - } - } - } - - /* - * Moves and/or copies the nodes in each bin to new table. See - * above for explanation. - * - * @return the new table - */ - private static final Node[] rebuild(Node[] tab) { - int n = tab.length; - Node[] nextTab = new Node[n << 1]; - Node fwd = new Node(MOVED, nextTab, null, null); - int[] buffer = null; // holds bins to revisit; null until needed - Node rev = null; // reverse forwarder; null until needed - int nbuffered = 0; // the number of bins in buffer list - int bufferIndex = 0; // buffer index of current buffered bin - int bin = n - 1; // current non-buffered bin or -1 if none - - for (int i = bin;;) { // start upwards sweep - int fh; Node f; - if ((f = tabAt(tab, i)) == null) { - if (bin >= 0) { // Unbuffered; no lock needed (or available) - if (!casTabAt(tab, i, f, fwd)) - continue; - } - else { // transiently use a locked forwarding node - Node g = new Node(MOVED|LOCKED, nextTab, null, null); - if (!casTabAt(tab, i, f, g)) - continue; - setTabAt(nextTab, i, null); - setTabAt(nextTab, i + n, null); - setTabAt(tab, i, fwd); - if (!g.casHash(MOVED|LOCKED, MOVED)) { - g.hash = MOVED; - synchronized (g) { g.notifyAll(); } - } - } - } - else if ((fh = f.hash) == MOVED) { - Object fk = f.key; - if (fk instanceof TreeBin) { - TreeBin t = (TreeBin)fk; - boolean validated = false; - t.acquire(0); - try { - if (tabAt(tab, i) == f) { - validated = true; - splitTreeBin(nextTab, i, t); - setTabAt(tab, i, fwd); - } - } finally { - t.release(0); - } - if (!validated) - continue; - } - } - else if ((fh & LOCKED) == 0 && f.casHash(fh, fh|LOCKED)) { - boolean validated = false; - try { // split to lo and hi lists; copying as needed - if (tabAt(tab, i) == f) { - validated = true; - splitBin(nextTab, i, f); - setTabAt(tab, i, fwd); - } - } finally { - if (!f.casHash(fh | LOCKED, fh)) { - f.hash = fh; - synchronized (f) { f.notifyAll(); }; - } - } - if (!validated) - continue; - } - else { - if (buffer == null) // initialize buffer for revisits - buffer = new int[TRANSFER_BUFFER_SIZE]; - if (bin < 0 && bufferIndex > 0) { - int j = buffer[--bufferIndex]; - buffer[bufferIndex] = i; - i = j; // swap with another bin - continue; - } - if (bin < 0 || nbuffered >= TRANSFER_BUFFER_SIZE) { - f.tryAwaitLock(tab, i); - continue; // no other options -- block - } - if (rev == null) // initialize reverse-forwarder - rev = new Node(MOVED, tab, null, null); - if (tabAt(tab, i) != f || (f.hash & LOCKED) == 0) - continue; // recheck before adding to list - buffer[nbuffered++] = i; - setTabAt(nextTab, i, rev); // install place-holders - setTabAt(nextTab, i + n, rev); - } - - if (bin > 0) - i = --bin; - else if (buffer != null && nbuffered > 0) { - bin = -1; - i = buffer[bufferIndex = --nbuffered]; - } - else - return nextTab; - } - } - - /** - * Splits a normal bin with list headed by e into lo and hi parts; - * installs in given table. - */ - private static void splitBin(Node[] nextTab, int i, Node e) { - int bit = nextTab.length >>> 1; // bit to split on - int runBit = e.hash & bit; - Node lastRun = e, lo = null, hi = null; - for (Node p = e.next; p != null; p = p.next) { - int b = p.hash & bit; - if (b != runBit) { - runBit = b; - lastRun = p; - } - } - if (runBit == 0) - lo = lastRun; - else - hi = lastRun; - for (Node p = e; p != lastRun; p = p.next) { - int ph = p.hash & HASH_BITS; - Object pk = p.key, pv = p.val; - if ((ph & bit) == 0) - lo = new Node(ph, pk, pv, lo); - else - hi = new Node(ph, pk, pv, hi); - } - setTabAt(nextTab, i, lo); - setTabAt(nextTab, i + bit, hi); - } - - /** - * Splits a tree bin into lo and hi parts; installs in given table. - */ - private static void splitTreeBin(Node[] nextTab, int i, TreeBin t) { - int bit = nextTab.length >>> 1; - TreeBin lt = new TreeBin(); - TreeBin ht = new TreeBin(); - int lc = 0, hc = 0; - for (Node e = t.first; e != null; e = e.next) { - int h = e.hash & HASH_BITS; - Object k = e.key, v = e.val; - if ((h & bit) == 0) { - ++lc; - lt.putTreeNode(h, k, v); - } - else { - ++hc; - ht.putTreeNode(h, k, v); - } - } - Node ln, hn; // throw away trees if too small - if (lc <= (TREE_THRESHOLD >>> 1)) { - ln = null; - for (Node p = lt.first; p != null; p = p.next) - ln = new Node(p.hash, p.key, p.val, ln); - } - else - ln = new Node(MOVED, lt, null, null); - setTabAt(nextTab, i, ln); - if (hc <= (TREE_THRESHOLD >>> 1)) { - hn = null; - for (Node p = ht.first; p != null; p = p.next) - hn = new Node(p.hash, p.key, p.val, hn); - } - else - hn = new Node(MOVED, ht, null, null); - setTabAt(nextTab, i + bit, hn); - } - - /** - * Implementation for clear. Steps through each bin, removing all - * nodes. - */ - private final void internalClear() { - long delta = 0L; // negative number of deletions - int i = 0; - Node[] tab = table; - while (tab != null && i < tab.length) { - int fh; Object fk; - Node f = tabAt(tab, i); - if (f == null) - ++i; - else if ((fh = f.hash) == MOVED) { - if ((fk = f.key) instanceof TreeBin) { - TreeBin t = (TreeBin)fk; - t.acquire(0); - try { - if (tabAt(tab, i) == f) { - for (Node p = t.first; p != null; p = p.next) { - if (p.val != null) { // (currently always true) - p.val = null; - --delta; - } - } - t.first = null; - t.root = null; - ++i; - } - } finally { - t.release(0); - } - } - else - tab = (Node[])fk; - } - else if ((fh & LOCKED) != 0) { - counter.add(delta); // opportunistically update count - delta = 0L; - f.tryAwaitLock(tab, i); - } - else if (f.casHash(fh, fh | LOCKED)) { - try { - if (tabAt(tab, i) == f) { - for (Node e = f; e != null; e = e.next) { - if (e.val != null) { // (currently always true) - e.val = null; - --delta; - } - } - setTabAt(tab, i, null); - ++i; - } - } finally { - if (!f.casHash(fh | LOCKED, fh)) { - f.hash = fh; - synchronized (f) { f.notifyAll(); }; - } - } - } - } - if (delta != 0) - counter.add(delta); - } - - /* ----------------Table Traversal -------------- */ - - /** - * Encapsulates traversal for methods such as containsValue; also - * serves as a base class for other iterators and bulk tasks. - * - * At each step, the iterator snapshots the key ("nextKey") and - * value ("nextVal") of a valid node (i.e., one that, at point of - * snapshot, has a non-null user value). Because val fields can - * change (including to null, indicating deletion), field nextVal - * might not be accurate at point of use, but still maintains the - * weak consistency property of holding a value that was once - * valid. To support iterator.remove, the nextKey field is not - * updated (nulled out) when the iterator cannot advance. - * - * Internal traversals directly access these fields, as in: - * {@code while (it.advance() != null) { process(it.nextKey); }} - * - * Exported iterators must track whether the iterator has advanced - * (in hasNext vs next) (by setting/checking/nulling field - * nextVal), and then extract key, value, or key-value pairs as - * return values of next(). - * - * The iterator visits once each still-valid node that was - * reachable upon iterator construction. It might miss some that - * were added to a bin after the bin was visited, which is OK wrt - * consistency guarantees. Maintaining this property in the face - * of possible ongoing resizes requires a fair amount of - * bookkeeping state that is difficult to optimize away amidst - * volatile accesses. Even so, traversal maintains reasonable - * throughput. - * - * Normally, iteration proceeds bin-by-bin traversing lists. - * However, if the table has been resized, then all future steps - * must traverse both the bin at the current index as well as at - * (index + baseSize); and so on for further resizings. To - * paranoically cope with potential sharing by users of iterators - * across threads, iteration terminates if a bounds checks fails - * for a table read. - * - * This class extends ForkJoinTask to streamline parallel - * iteration in bulk operations (see BulkTask). This adds only an - * int of space overhead, which is close enough to negligible in - * cases where it is not needed to not worry about it. Because - * ForkJoinTask is Serializable, but iterators need not be, we - * need to add warning suppressions. - */ - @SuppressWarnings("serial") static class Traverser { - final ConcurrentHashMapV8 map; - Node next; // the next entry to use - K nextKey; // cached key field of next - V nextVal; // cached val field of next - Node[] tab; // current table; updated if resized - int index; // index of bin to use next - int baseIndex; // current index of initial table - int baseLimit; // index bound for initial table - int baseSize; // initial table size - - /** Creates iterator for all entries in the table. */ - Traverser(ConcurrentHashMapV8 map) { - this.map = map; - } - - /** Creates iterator for split() methods */ - Traverser(Traverser it) { - ConcurrentHashMapV8 m; Node[] t; - if ((m = this.map = it.map) == null) - t = null; - else if ((t = it.tab) == null && // force parent tab initialization - (t = it.tab = m.table) != null) - it.baseLimit = it.baseSize = t.length; - this.tab = t; - this.baseSize = it.baseSize; - it.baseLimit = this.index = this.baseIndex = - ((this.baseLimit = it.baseLimit) + it.baseIndex + 1) >>> 1; - } - - /** - * Advances next; returns nextVal or null if terminated. - * See above for explanation. - */ - final V advance() { - Node e = next; - V ev = null; - outer: do { - if (e != null) // advance past used/skipped node - e = e.next; - while (e == null) { // get to next non-null bin - ConcurrentHashMapV8 m; - Node[] t; int b, i, n; Object ek; // checks must use locals - if ((t = tab) != null) - n = t.length; - else if ((m = map) != null && (t = tab = m.table) != null) - n = baseLimit = baseSize = t.length; - else - break outer; - if ((b = baseIndex) >= baseLimit || - (i = index) < 0 || i >= n) - break outer; - if ((e = tabAt(t, i)) != null && e.hash == MOVED) { - if ((ek = e.key) instanceof TreeBin) - e = ((TreeBin)ek).first; - else { - tab = (Node[])ek; - continue; // restarts due to null val - } - } // visit upper slots if present - index = (i += baseSize) < n ? i : (baseIndex = b + 1); - } - nextKey = (K) e.key; - } while ((ev = (V) e.val) == null); // skip deleted or special nodes - next = e; - return nextVal = ev; - } - - public final void remove() { - Object k = nextKey; - if (k == null && (advance() == null || (k = nextKey) == null)) - throw new IllegalStateException(); - map.internalReplace(k, null, null); - } - - public final boolean hasNext() { - return nextVal != null || advance() != null; - } - - public final boolean hasMoreElements() { return hasNext(); } - public final void setRawResult(Object x) { } - public R getRawResult() { return null; } - public boolean exec() { return true; } - } - - /* ---------------- Public operations -------------- */ - - /** - * Creates a new, empty map with the default initial table size (16). - */ - public ConcurrentHashMapV8() { - this.counter = new LongAdder(); - } - - /** - * Creates a new, empty map with an initial table size - * accommodating the specified number of elements without the need - * to dynamically resize. - * - * @param initialCapacity The implementation performs internal - * sizing to accommodate this many elements. - * @throws IllegalArgumentException if the initial capacity of - * elements is negative - */ - public ConcurrentHashMapV8(int initialCapacity) { - if (initialCapacity < 0) - throw new IllegalArgumentException(); - int cap = ((initialCapacity >= (MAXIMUM_CAPACITY >>> 1)) ? - MAXIMUM_CAPACITY : - tableSizeFor(initialCapacity + (initialCapacity >>> 1) + 1)); - this.counter = new LongAdder(); - this.sizeCtl = cap; - } - - /** - * Creates a new map with the same mappings as the given map. - * - * @param m the map - */ - public ConcurrentHashMapV8(Map m) { - this.counter = new LongAdder(); - this.sizeCtl = DEFAULT_CAPACITY; - internalPutAll(m); - } - - /** - * Creates a new, empty map with an initial table size based on - * the given number of elements ({@code initialCapacity}) and - * initial table density ({@code loadFactor}). - * - * @param initialCapacity the initial capacity. The implementation - * performs internal sizing to accommodate this many elements, - * given the specified load factor. - * @param loadFactor the load factor (table density) for - * establishing the initial table size - * @throws IllegalArgumentException if the initial capacity of - * elements is negative or the load factor is nonpositive - * - * @since 1.6 - */ - public ConcurrentHashMapV8(int initialCapacity, float loadFactor) { - this(initialCapacity, loadFactor, 1); - } - - /** - * Creates a new, empty map with an initial table size based on - * the given number of elements ({@code initialCapacity}), table - * density ({@code loadFactor}), and number of concurrently - * updating threads ({@code concurrencyLevel}). - * - * @param initialCapacity the initial capacity. The implementation - * performs internal sizing to accommodate this many elements, - * given the specified load factor. - * @param loadFactor the load factor (table density) for - * establishing the initial table size - * @param concurrencyLevel the estimated number of concurrently - * updating threads. The implementation may use this value as - * a sizing hint. - * @throws IllegalArgumentException if the initial capacity is - * negative or the load factor or concurrencyLevel are - * nonpositive - */ - public ConcurrentHashMapV8(int initialCapacity, - float loadFactor, int concurrencyLevel) { - if (!(loadFactor > 0.0f) || initialCapacity < 0 || concurrencyLevel <= 0) - throw new IllegalArgumentException(); - if (initialCapacity < concurrencyLevel) // Use at least as many bins - initialCapacity = concurrencyLevel; // as estimated threads - long size = (long)(1.0 + (long)initialCapacity / loadFactor); - int cap = (size >= (long)MAXIMUM_CAPACITY) ? - MAXIMUM_CAPACITY : tableSizeFor((int)size); - this.counter = new LongAdder(); - this.sizeCtl = cap; - } - - /** - * Creates a new {@link Set} backed by a ConcurrentHashMapV8 - * from the given type to {@code Boolean.TRUE}. - * - * @return the new set - */ - public static KeySetView newKeySet() { - return new KeySetView(new ConcurrentHashMapV8(), - Boolean.TRUE); - } - - /** - * Creates a new {@link Set} backed by a ConcurrentHashMapV8 - * from the given type to {@code Boolean.TRUE}. - * - * @param initialCapacity The implementation performs internal - * sizing to accommodate this many elements. - * @throws IllegalArgumentException if the initial capacity of - * elements is negative - * @return the new set - */ - public static KeySetView newKeySet(int initialCapacity) { - return new KeySetView(new ConcurrentHashMapV8(initialCapacity), - Boolean.TRUE); - } - - /** - * {@inheritDoc} - */ - public boolean isEmpty() { - return counter.sum() <= 0L; // ignore transient negative values - } - - /** - * {@inheritDoc} - */ - public int size() { - long n = counter.sum(); - return ((n < 0L) ? 0 : - (n > (long)Integer.MAX_VALUE) ? Integer.MAX_VALUE : - (int)n); - } - - /** - * Returns the number of mappings. This method should be used - * instead of {@link #size} because a ConcurrentHashMapV8 may - * contain more mappings than can be represented as an int. The - * value returned is a snapshot; the actual count may differ if - * there are ongoing concurrent insertions or removals. - * - * @return the number of mappings - */ - public long mappingCount() { - long n = counter.sum(); - return (n < 0L) ? 0L : n; // ignore transient negative values - } - - /** - * Returns the value to which the specified key is mapped, - * or {@code null} if this map contains no mapping for the key. - * - *

    More formally, if this map contains a mapping from a key - * {@code k} to a value {@code v} such that {@code key.equals(k)}, - * then this method returns {@code v}; otherwise it returns - * {@code null}. (There can be at most one such mapping.) - * - * @throws NullPointerException if the specified key is null - */ - @SuppressWarnings("unchecked") public V get(Object key) { - if (key == null) - throw new NullPointerException(); - return (V)internalGet(key); - } - - /** - * Returns the value to which the specified key is mapped, - * or the given defaultValue if this map contains no mapping for the key. - * - * @param key the key - * @param defaultValue the value to return if this map contains - * no mapping for the given key - * @return the mapping for the key, if present; else the defaultValue - * @throws NullPointerException if the specified key is null - */ - @SuppressWarnings("unchecked") public V getValueOrDefault(Object key, V defaultValue) { - if (key == null) - throw new NullPointerException(); - V v = (V) internalGet(key); - return v == null ? defaultValue : v; - } - - /** - * Tests if the specified object is a key in this table. - * - * @param key possible key - * @return {@code true} if and only if the specified object - * is a key in this table, as determined by the - * {@code equals} method; {@code false} otherwise - * @throws NullPointerException if the specified key is null - */ - public boolean containsKey(Object key) { - if (key == null) - throw new NullPointerException(); - return internalGet(key) != null; - } - - /** - * Returns {@code true} if this map maps one or more keys to the - * specified value. Note: This method may require a full traversal - * of the map, and is much slower than method {@code containsKey}. - * - * @param value value whose presence in this map is to be tested - * @return {@code true} if this map maps one or more keys to the - * specified value - * @throws NullPointerException if the specified value is null - */ - public boolean containsValue(Object value) { - if (value == null) - throw new NullPointerException(); - Object v; - Traverser it = new Traverser(this); - while ((v = it.advance()) != null) { - if (v == value || value.equals(v)) - return true; - } - return false; - } - - public K findKey(Object value) { - if (value == null) - throw new NullPointerException(); - Object v; - Traverser it = new Traverser(this); - while ((v = it.advance()) != null) { - if (v == value || value.equals(v)) - return it.nextKey; - } - return null; - } - - /** - * Legacy method testing if some key maps into the specified value - * in this table. This method is identical in functionality to - * {@link #containsValue}, and exists solely to ensure - * full compatibility with class {@link java.util.Hashtable}, - * which supported this method prior to introduction of the - * Java Collections framework. - * - * @param value a value to search for - * @return {@code true} if and only if some key maps to the - * {@code value} argument in this table as - * determined by the {@code equals} method; - * {@code false} otherwise - * @throws NullPointerException if the specified value is null - */ - public boolean contains(Object value) { - return containsValue(value); - } - - /** - * Maps the specified key to the specified value in this table. - * Neither the key nor the value can be null. - * - *

    The value can be retrieved by calling the {@code get} method - * with a key that is equal to the original key. - * - * @param key key with which the specified value is to be associated - * @param value value to be associated with the specified key - * @return the previous value associated with {@code key}, or - * {@code null} if there was no mapping for {@code key} - * @throws NullPointerException if the specified key or value is null - */ - @SuppressWarnings("unchecked") public V put(K key, V value) { - if (key == null || value == null) - throw new NullPointerException(); - return (V)internalPut(key, value); - } - - /** - * {@inheritDoc} - * - * @return the previous value associated with the specified key, - * or {@code null} if there was no mapping for the key - * @throws NullPointerException if the specified key or value is null - */ - @SuppressWarnings("unchecked") public V putIfAbsent(K key, V value) { - if (key == null || value == null) - throw new NullPointerException(); - return (V)internalPutIfAbsent(key, value); - } - - /** - * Copies all of the mappings from the specified map to this one. - * These mappings replace any mappings that this map had for any of the - * keys currently in the specified map. - * - * @param m mappings to be stored in this map - */ - public void putAll(Map m) { - internalPutAll(m); - } - - /** - * If the specified key is not already associated with a value, - * computes its value using the given mappingFunction and enters - * it into the map unless null. This is equivalent to - *

     {@code
    -     * if (map.containsKey(key))
    -     *   return map.get(key);
    -     * value = mappingFunction.apply(key);
    -     * if (value != null)
    -     *   map.put(key, value);
    -     * return value;}
    - * - * except that the action is performed atomically. If the - * function returns {@code null} no mapping is recorded. If the - * function itself throws an (unchecked) exception, the exception - * is rethrown to its caller, and no mapping is recorded. Some - * attempted update operations on this map by other threads may be - * blocked while computation is in progress, so the computation - * should be short and simple, and must not attempt to update any - * other mappings of this Map. The most appropriate usage is to - * construct a new object serving as an initial mapped value, or - * memoized result, as in: - * - *
     {@code
    -     * map.computeIfAbsent(key, new Fun() {
    -     *   public V map(K k) { return new Value(f(k)); }});}
    - * - * @param key key with which the specified value is to be associated - * @param mappingFunction the function to compute a value - * @return the current (existing or computed) value associated with - * the specified key, or null if the computed value is null - * @throws NullPointerException if the specified key or mappingFunction - * is null - * @throws IllegalStateException if the computation detectably - * attempts a recursive update to this map that would - * otherwise never complete - * @throws RuntimeException or Error if the mappingFunction does so, - * in which case the mapping is left unestablished - */ - @SuppressWarnings("unchecked") public V computeIfAbsent - (K key, Fun mappingFunction) { - if (key == null || mappingFunction == null) - throw new NullPointerException(); - return (V)internalComputeIfAbsent(key, mappingFunction); - } - - /** - * If the given key is present, computes a new mapping value given a key and - * its current mapped value. This is equivalent to - *
     {@code
    -     *   if (map.containsKey(key)) {
    -     *     value = remappingFunction.apply(key, map.get(key));
    -     *     if (value != null)
    -     *       map.put(key, value);
    -     *     else
    -     *       map.remove(key);
    -     *   }
    -     * }
    - * - * except that the action is performed atomically. If the - * function returns {@code null}, the mapping is removed. If the - * function itself throws an (unchecked) exception, the exception - * is rethrown to its caller, and the current mapping is left - * unchanged. Some attempted update operations on this map by - * other threads may be blocked while computation is in progress, - * so the computation should be short and simple, and must not - * attempt to update any other mappings of this Map. For example, - * to either create or append new messages to a value mapping: - * - * @param key key with which the specified value is to be associated - * @param remappingFunction the function to compute a value - * @return the new value associated with the specified key, or null if none - * @throws NullPointerException if the specified key or remappingFunction - * is null - * @throws IllegalStateException if the computation detectably - * attempts a recursive update to this map that would - * otherwise never complete - * @throws RuntimeException or Error if the remappingFunction does so, - * in which case the mapping is unchanged - */ - @SuppressWarnings("unchecked") public V computeIfPresent - (K key, BiFun remappingFunction) { - if (key == null || remappingFunction == null) - throw new NullPointerException(); - return (V)internalCompute(key, true, remappingFunction); - } - - /** - * Computes a new mapping value given a key and - * its current mapped value (or {@code null} if there is no current - * mapping). This is equivalent to - *
     {@code
    -     *   value = remappingFunction.apply(key, map.get(key));
    -     *   if (value != null)
    -     *     map.put(key, value);
    -     *   else
    -     *     map.remove(key);
    -     * }
    - * - * except that the action is performed atomically. If the - * function returns {@code null}, the mapping is removed. If the - * function itself throws an (unchecked) exception, the exception - * is rethrown to its caller, and the current mapping is left - * unchanged. Some attempted update operations on this map by - * other threads may be blocked while computation is in progress, - * so the computation should be short and simple, and must not - * attempt to update any other mappings of this Map. For example, - * to either create or append new messages to a value mapping: - * - *
     {@code
    -     * Map map = ...;
    -     * final String msg = ...;
    -     * map.compute(key, new BiFun() {
    -     *   public String apply(Key k, String v) {
    -     *    return (v == null) ? msg : v + msg;});}}
    - * - * @param key key with which the specified value is to be associated - * @param remappingFunction the function to compute a value - * @return the new value associated with the specified key, or null if none - * @throws NullPointerException if the specified key or remappingFunction - * is null - * @throws IllegalStateException if the computation detectably - * attempts a recursive update to this map that would - * otherwise never complete - * @throws RuntimeException or Error if the remappingFunction does so, - * in which case the mapping is unchanged - */ - @SuppressWarnings("unchecked") public V compute - (K key, BiFun remappingFunction) { - if (key == null || remappingFunction == null) - throw new NullPointerException(); - return (V)internalCompute(key, false, remappingFunction); - } - - /** - * If the specified key is not already associated - * with a value, associate it with the given value. - * Otherwise, replace the value with the results of - * the given remapping function. This is equivalent to: - *
     {@code
    -     *   if (!map.containsKey(key))
    -     *     map.put(value);
    -     *   else {
    -     *     newValue = remappingFunction.apply(map.get(key), value);
    -     *     if (value != null)
    -     *       map.put(key, value);
    -     *     else
    -     *       map.remove(key);
    -     *   }
    -     * }
    - * except that the action is performed atomically. If the - * function returns {@code null}, the mapping is removed. If the - * function itself throws an (unchecked) exception, the exception - * is rethrown to its caller, and the current mapping is left - * unchanged. Some attempted update operations on this map by - * other threads may be blocked while computation is in progress, - * so the computation should be short and simple, and must not - * attempt to update any other mappings of this Map. - */ - @SuppressWarnings("unchecked") public V merge - (K key, V value, BiFun remappingFunction) { - if (key == null || value == null || remappingFunction == null) - throw new NullPointerException(); - return (V)internalMerge(key, value, remappingFunction); - } - - /** - * Removes the key (and its corresponding value) from this map. - * This method does nothing if the key is not in the map. - * - * @param key the key that needs to be removed - * @return the previous value associated with {@code key}, or - * {@code null} if there was no mapping for {@code key} - * @throws NullPointerException if the specified key is null - */ - @SuppressWarnings("unchecked") public V remove(Object key) { - if (key == null) - throw new NullPointerException(); - return (V)internalReplace(key, null, null); - } - - /** - * {@inheritDoc} - * - * @throws NullPointerException if the specified key is null - */ - public boolean remove(Object key, Object value) { - if (key == null) - throw new NullPointerException(); - if (value == null) - return false; - return internalReplace(key, null, value) != null; - } - - /** - * {@inheritDoc} - * - * @throws NullPointerException if any of the arguments are null - */ - public boolean replace(K key, V oldValue, V newValue) { - if (key == null || oldValue == null || newValue == null) - throw new NullPointerException(); - return internalReplace(key, newValue, oldValue) != null; - } - - /** - * {@inheritDoc} - * - * @return the previous value associated with the specified key, - * or {@code null} if there was no mapping for the key - * @throws NullPointerException if the specified key or value is null - */ - @SuppressWarnings("unchecked") public V replace(K key, V value) { - if (key == null || value == null) - throw new NullPointerException(); - return (V)internalReplace(key, value, null); - } - - /** - * Removes all of the mappings from this map. - */ - public void clear() { - internalClear(); - } - - /** - * Returns a {@link Set} view of the keys contained in this map. - * The set is backed by the map, so changes to the map are - * reflected in the set, and vice-versa. - * - * @return the set view - */ - public KeySetView keySet() { - KeySetView ks = keySet; - return (ks != null) ? ks : (keySet = new KeySetView(this, null)); - } - - /** - * Returns a {@link Set} view of the keys in this map, using the - * given common mapped value for any additions (i.e., {@link - * Collection#add} and {@link Collection#addAll}). This is of - * course only appropriate if it is acceptable to use the same - * value for all additions from this view. - * - * @param mappedValue the mapped value to use for any - * additions. - * @return the set view - * @throws NullPointerException if the mappedValue is null - */ - public KeySetView keySet(V mappedValue) { - if (mappedValue == null) - throw new NullPointerException(); - return new KeySetView(this, mappedValue); - } - - /** - * Returns a {@link Collection} view of the values contained in this map. - * The collection is backed by the map, so changes to the map are - * reflected in the collection, and vice-versa. - */ - public ValuesView values() { - ValuesView vs = values; - return (vs != null) ? vs : (values = new ValuesView(this)); - } - - /** - * Returns a {@link Set} view of the mappings contained in this map. - * The set is backed by the map, so changes to the map are - * reflected in the set, and vice-versa. The set supports element - * removal, which removes the corresponding mapping from the map, - * via the {@code Iterator.remove}, {@code Set.remove}, - * {@code removeAll}, {@code retainAll}, and {@code clear} - * operations. It does not support the {@code add} or - * {@code addAll} operations. - * - *

    The view's {@code iterator} is a "weakly consistent" iterator - * that will never throw {@link ConcurrentModificationException}, - * and guarantees to traverse elements as they existed upon - * construction of the iterator, and may (but is not guaranteed to) - * reflect any modifications subsequent to construction. - */ - public Set> entrySet() { - EntrySetView es = entrySet; - return (es != null) ? es : (entrySet = new EntrySetView(this)); - } - - /** - * Returns an enumeration of the keys in this table. - * - * @return an enumeration of the keys in this table - * @see #keySet() - */ - public Enumeration keys() { - return new KeyIterator(this); - } - - /** - * Returns an enumeration of the values in this table. - * - * @return an enumeration of the values in this table - * @see #values() - */ - public Enumeration elements() { - return new ValueIterator(this); - } - - /** - * Returns a partitionable iterator of the keys in this map. - * - * @return a partitionable iterator of the keys in this map - */ - public Spliterator keySpliterator() { - return new KeyIterator(this); - } - - /** - * Returns a partitionable iterator of the values in this map. - * - * @return a partitionable iterator of the values in this map - */ - public Spliterator valueSpliterator() { - return new ValueIterator(this); - } - - /** - * Returns a partitionable iterator of the entries in this map. - * - * @return a partitionable iterator of the entries in this map - */ - public Spliterator> entrySpliterator() { - return new EntryIterator(this); - } - - /** - * Returns the hash code value for this {@link Map}, i.e., - * the sum of, for each key-value pair in the map, - * {@code key.hashCode() ^ value.hashCode()}. - * - * @return the hash code value for this map - */ - public int hashCode() { - int h = 0; - Traverser it = new Traverser(this); - Object v; - while ((v = it.advance()) != null) { - h += it.nextKey.hashCode() ^ v.hashCode(); - } - return h; - } - - /** - * Returns a string representation of this map. The string - * representation consists of a list of key-value mappings (in no - * particular order) enclosed in braces ("{@code {}}"). Adjacent - * mappings are separated by the characters {@code ", "} (comma - * and space). Each key-value mapping is rendered as the key - * followed by an equals sign ("{@code =}") followed by the - * associated value. - * - * @return a string representation of this map - */ - public String toString() { - Traverser it = new Traverser(this); - StringBuilder sb = new StringBuilder(); - sb.append('{'); - Object v; - if ((v = it.advance()) != null) { - for (;;) { - Object k = it.nextKey; - sb.append(k == this ? "(this Map)" : k); - sb.append('='); - sb.append(v == this ? "(this Map)" : v); - if ((v = it.advance()) == null) - break; - sb.append(',').append(' '); - } - } - return sb.append('}').toString(); - } - - /** - * Compares the specified object with this map for equality. - * Returns {@code true} if the given object is a map with the same - * mappings as this map. This operation may return misleading - * results if either map is concurrently modified during execution - * of this method. - * - * @param o object to be compared for equality with this map - * @return {@code true} if the specified object is equal to this map - */ - public boolean equals(Object o) { - if (o != this) { - if (!(o instanceof Map)) - return false; - Map m = (Map) o; - Traverser it = new Traverser(this); - Object val; - while ((val = it.advance()) != null) { - Object v = m.get(it.nextKey); - if (v == null || (v != val && !v.equals(val))) - return false; - } - for (Map.Entry e : m.entrySet()) { - Object mk, mv, v; - if ((mk = e.getKey()) == null || - (mv = e.getValue()) == null || - (v = internalGet(mk)) == null || - (mv != v && !mv.equals(v))) - return false; - } - } - return true; - } - - /* ----------------Iterators -------------- */ - - @SuppressWarnings("serial") static final class KeyIterator extends Traverser - implements Spliterator, Enumeration { - KeyIterator(ConcurrentHashMapV8 map) { super(map); } - KeyIterator(Traverser it) { - super(it); - } - public KeyIterator split() { - if (nextKey != null) - throw new IllegalStateException(); - return new KeyIterator(this); - } - @SuppressWarnings("unchecked") public final K next() { - if (nextVal == null && advance() == null) - throw new NoSuchElementException(); - Object k = nextKey; - nextVal = null; - return (K) k; - } - - public final K nextElement() { return next(); } - } - - @SuppressWarnings("serial") static final class ValueIterator extends Traverser - implements Spliterator, Enumeration { - ValueIterator(ConcurrentHashMapV8 map) { super(map); } - ValueIterator(Traverser it) { - super(it); - } - public ValueIterator split() { - if (nextKey != null) - throw new IllegalStateException(); - return new ValueIterator(this); - } - - @SuppressWarnings("unchecked") public final V next() { - Object v; - if ((v = nextVal) == null && (v = advance()) == null) - throw new NoSuchElementException(); - nextVal = null; - return (V) v; - } - - public final V nextElement() { return next(); } - } - - @SuppressWarnings("serial") static final class EntryIterator extends Traverser - implements Spliterator> { - EntryIterator(ConcurrentHashMapV8 map) { super(map); } - EntryIterator(Traverser it) { - super(it); - } - public EntryIterator split() { - if (nextKey != null) - throw new IllegalStateException(); - return new EntryIterator(this); - } - - @SuppressWarnings("unchecked") public final Map.Entry next() { - Object v; - if ((v = nextVal) == null && (v = advance()) == null) - throw new NoSuchElementException(); - Object k = nextKey; - nextVal = null; - return new MapEntry((K)k, (V)v, map); - } - } - - /** - * Exported Entry for iterators - */ - static final class MapEntry implements Map.Entry { - final K key; // non-null - V val; // non-null - final ConcurrentHashMapV8 map; - MapEntry(K key, V val, ConcurrentHashMapV8 map) { - this.key = key; - this.val = val; - this.map = map; - } - public final K getKey() { return key; } - public final V getValue() { return val; } - public final int hashCode() { return key.hashCode() ^ val.hashCode(); } - public final String toString(){ return key + "=" + val; } - - public final boolean equals(Object o) { - Object k, v; Map.Entry e; - return ((o instanceof Map.Entry) && - (k = (e = (Map.Entry)o).getKey()) != null && - (v = e.getValue()) != null && - (k == key || k.equals(key)) && - (v == val || v.equals(val))); - } - - /** - * Sets our entry's value and writes through to the map. The - * value to return is somewhat arbitrary here. Since we do not - * necessarily track asynchronous changes, the most recent - * "previous" value could be different from what we return (or - * could even have been removed in which case the put will - * re-establish). We do not and cannot guarantee more. - */ - public final V setValue(V value) { - if (value == null) throw new NullPointerException(); - V v = val; - val = value; - map.put(key, value); - return v; - } - } - - /* ---------------- Serialization Support -------------- */ - - /** - * Stripped-down version of helper class used in previous version, - * declared for the sake of serialization compatibility - */ - static class Segment implements Serializable { - private static final long serialVersionUID = 2249069246763182397L; - final float loadFactor; - Segment(float lf) { this.loadFactor = lf; } - } - - /** - * Saves the state of the {@code ConcurrentHashMapV8} instance to a - * stream (i.e., serializes it). - * @param s the stream - * @serialData - * the key (Object) and value (Object) - * for each key-value mapping, followed by a null pair. - * The key-value mappings are emitted in no particular order. - */ - @SuppressWarnings("unchecked") private void writeObject(java.io.ObjectOutputStream s) - throws java.io.IOException { - if (segments == null) { // for serialization compatibility - segments = (Segment[]) - new Segment[DEFAULT_CONCURRENCY_LEVEL]; - for (int i = 0; i < segments.length; ++i) - segments[i] = new Segment(LOAD_FACTOR); - } - s.defaultWriteObject(); - Traverser it = new Traverser(this); - Object v; - while ((v = it.advance()) != null) { - s.writeObject(it.nextKey); - s.writeObject(v); - } - s.writeObject(null); - s.writeObject(null); - segments = null; // throw away - } - - /** - * Reconstitutes the instance from a stream (that is, deserializes it). - * @param s the stream - */ - @SuppressWarnings("unchecked") private void readObject(java.io.ObjectInputStream s) - throws java.io.IOException, ClassNotFoundException { - s.defaultReadObject(); - this.segments = null; // unneeded - // initialize transient final field - UNSAFE.putObjectVolatile(this, counterOffset, new LongAdder()); - - // Create all nodes, then place in table once size is known - long size = 0L; - Node p = null; - for (;;) { - K k = (K) s.readObject(); - V v = (V) s.readObject(); - if (k != null && v != null) { - int h = spread(k.hashCode()); - p = new Node(h, k, v, p); - ++size; - } - else - break; - } - if (p != null) { - boolean init = false; - int n; - if (size >= (long)(MAXIMUM_CAPACITY >>> 1)) - n = MAXIMUM_CAPACITY; - else { - int sz = (int)size; - n = tableSizeFor(sz + (sz >>> 1) + 1); - } - int sc = sizeCtl; - boolean collide = false; - if (n > sc && - UNSAFE.compareAndSwapInt(this, sizeCtlOffset, sc, -1)) { - try { - if (table == null) { - init = true; - Node[] tab = new Node[n]; - int mask = n - 1; - while (p != null) { - int j = p.hash & mask; - Node next = p.next; - Node q = p.next = tabAt(tab, j); - setTabAt(tab, j, p); - if (!collide && q != null && q.hash == p.hash) - collide = true; - p = next; - } - table = tab; - counter.add(size); - sc = n - (n >>> 2); - } - } finally { - sizeCtl = sc; - } - if (collide) { // rescan and convert to TreeBins - Node[] tab = table; - for (int i = 0; i < tab.length; ++i) { - int c = 0; - for (Node e = tabAt(tab, i); e != null; e = e.next) { - if (++c > TREE_THRESHOLD && - (e.key instanceof Comparable)) { - replaceWithTreeBin(tab, i, e.key); - break; - } - } - } - } - } - if (!init) { // Can only happen if unsafely published. - while (p != null) { - internalPut(p.key, p.val); - p = p.next; - } - } - } - } - - - // ------------------------------------------------------- - - // Sams - /** Interface describing a void action of one argument */ - public interface Action { void apply(A a); } - /** Interface describing a void action of two arguments */ - public interface BiAction { void apply(A a, B b); } - /** Interface describing a function of one argument */ - public interface Generator { T apply(); } - /** Interface describing a function mapping its argument to a double */ - public interface ObjectToDouble { double apply(A a); } - /** Interface describing a function mapping its argument to a long */ - public interface ObjectToLong { long apply(A a); } - /** Interface describing a function mapping its argument to an int */ - public interface ObjectToInt {int apply(A a); } - /** Interface describing a function mapping two arguments to a double */ - public interface ObjectByObjectToDouble { double apply(A a, B b); } - /** Interface describing a function mapping two arguments to a long */ - public interface ObjectByObjectToLong { long apply(A a, B b); } - /** Interface describing a function mapping two arguments to an int */ - public interface ObjectByObjectToInt {int apply(A a, B b); } - /** Interface describing a function mapping a double to a double */ - public interface DoubleToDouble { double apply(double a); } - /** Interface describing a function mapping a long to a long */ - public interface LongToLong { long apply(long a); } - /** Interface describing a function mapping an int to an int */ - public interface IntToInt { int apply(int a); } - /** Interface describing a function mapping two doubles to a double */ - public interface DoubleByDoubleToDouble { double apply(double a, double b); } - /** Interface describing a function mapping two longs to a long */ - public interface LongByLongToLong { long apply(long a, long b); } - /** Interface describing a function mapping two ints to an int */ - public interface IntByIntToInt { int apply(int a, int b); } - - - /* ----------------Views -------------- */ - - /** - * Base class for views. - */ - static abstract class CHMView { - final ConcurrentHashMapV8 map; - CHMView(ConcurrentHashMapV8 map) { this.map = map; } - - /** - * Returns the map backing this view. - * - * @return the map backing this view - */ - public ConcurrentHashMapV8 getMap() { return map; } - - public final int size() { return map.size(); } - public final boolean isEmpty() { return map.isEmpty(); } - public final void clear() { map.clear(); } - - // implementations below rely on concrete classes supplying these - abstract public Iterator iterator(); - abstract public boolean contains(Object o); - abstract public boolean remove(Object o); - - private static final String oomeMsg = "Required array size too large"; - - public final Object[] toArray() { - long sz = map.mappingCount(); - if (sz > (long)(MAX_ARRAY_SIZE)) - throw new OutOfMemoryError(oomeMsg); - int n = (int)sz; - Object[] r = new Object[n]; - int i = 0; - Iterator it = iterator(); - while (it.hasNext()) { - if (i == n) { - if (n >= MAX_ARRAY_SIZE) - throw new OutOfMemoryError(oomeMsg); - if (n >= MAX_ARRAY_SIZE - (MAX_ARRAY_SIZE >>> 1) - 1) - n = MAX_ARRAY_SIZE; - else - n += (n >>> 1) + 1; - r = Arrays.copyOf(r, n); - } - r[i++] = it.next(); - } - return (i == n) ? r : Arrays.copyOf(r, i); - } - - @SuppressWarnings("unchecked") public final T[] toArray(T[] a) { - long sz = map.mappingCount(); - if (sz > (long)(MAX_ARRAY_SIZE)) - throw new OutOfMemoryError(oomeMsg); - int m = (int)sz; - T[] r = (a.length >= m) ? a : - (T[])java.lang.reflect.Array - .newInstance(a.getClass().getComponentType(), m); - int n = r.length; - int i = 0; - Iterator it = iterator(); - while (it.hasNext()) { - if (i == n) { - if (n >= MAX_ARRAY_SIZE) - throw new OutOfMemoryError(oomeMsg); - if (n >= MAX_ARRAY_SIZE - (MAX_ARRAY_SIZE >>> 1) - 1) - n = MAX_ARRAY_SIZE; - else - n += (n >>> 1) + 1; - r = Arrays.copyOf(r, n); - } - r[i++] = (T)it.next(); - } - if (a == r && i < n) { - r[i] = null; // null-terminate - return r; - } - return (i == n) ? r : Arrays.copyOf(r, i); - } - - public final int hashCode() { - int h = 0; - for (Iterator it = iterator(); it.hasNext();) - h += it.next().hashCode(); - return h; - } - - public final String toString() { - StringBuilder sb = new StringBuilder(); - sb.append('['); - Iterator it = iterator(); - if (it.hasNext()) { - for (;;) { - Object e = it.next(); - sb.append(e == this ? "(this Collection)" : e); - if (!it.hasNext()) - break; - sb.append(',').append(' '); - } - } - return sb.append(']').toString(); - } - - public final boolean containsAll(Collection c) { - if (c != this) { - for (Iterator it = c.iterator(); it.hasNext();) { - Object e = it.next(); - if (e == null || !contains(e)) - return false; - } - } - return true; - } - - public final boolean removeAll(Collection c) { - boolean modified = false; - for (Iterator it = iterator(); it.hasNext();) { - if (c.contains(it.next())) { - it.remove(); - modified = true; - } - } - return modified; - } - - public final boolean retainAll(Collection c) { - boolean modified = false; - for (Iterator it = iterator(); it.hasNext();) { - if (!c.contains(it.next())) { - it.remove(); - modified = true; - } - } - return modified; - } - - } - - /** - * A view of a ConcurrentHashMapV8 as a {@link Set} of keys, in - * which additions may optionally be enabled by mapping to a - * common value. This class cannot be directly instantiated. See - * {@link #keySet}, {@link #keySet(Object)}, {@link #newKeySet()}, - * {@link #newKeySet(int)}. - */ - public static class KeySetView extends CHMView implements Set, java.io.Serializable { - private static final long serialVersionUID = 7249069246763182397L; - private final V value; - KeySetView(ConcurrentHashMapV8 map, V value) { // non-public - super(map); - this.value = value; - } - - /** - * Returns the default mapped value for additions, - * or {@code null} if additions are not supported. - * - * @return the default mapped value for additions, or {@code null} - * if not supported. - */ - public V getMappedValue() { return value; } - - // implement Set API - - public boolean contains(Object o) { return map.containsKey(o); } - public boolean remove(Object o) { return map.remove(o) != null; } - - /** - * Returns a "weakly consistent" iterator that will never - * throw {@link ConcurrentModificationException}, and - * guarantees to traverse elements as they existed upon - * construction of the iterator, and may (but is not - * guaranteed to) reflect any modifications subsequent to - * construction. - * - * @return an iterator over the keys of this map - */ - public Iterator iterator() { return new KeyIterator(map); } - public boolean add(K e) { - V v; - if ((v = value) == null) - throw new UnsupportedOperationException(); - if (e == null) - throw new NullPointerException(); - return map.internalPutIfAbsent(e, v) == null; - } - public boolean addAll(Collection c) { - boolean added = false; - V v; - if ((v = value) == null) - throw new UnsupportedOperationException(); - for (K e : c) { - if (e == null) - throw new NullPointerException(); - if (map.internalPutIfAbsent(e, v) == null) - added = true; - } - return added; - } - public boolean equals(Object o) { - Set c; - return ((o instanceof Set) && - ((c = (Set)o) == this || - (containsAll(c) && c.containsAll(this)))); - } - } - - /** - * A view of a ConcurrentHashMapV8 as a {@link Collection} of - * values, in which additions are disabled. This class cannot be - * directly instantiated. See {@link #values}, - * - *

    The view's {@code iterator} is a "weakly consistent" iterator - * that will never throw {@link ConcurrentModificationException}, - * and guarantees to traverse elements as they existed upon - * construction of the iterator, and may (but is not guaranteed to) - * reflect any modifications subsequent to construction. - */ - public static final class ValuesView extends CHMView - implements Collection { - ValuesView(ConcurrentHashMapV8 map) { super(map); } - public final boolean contains(Object o) { return map.containsValue(o); } - public final boolean remove(Object o) { - if (o != null) { - Iterator it = new ValueIterator(map); - while (it.hasNext()) { - if (o.equals(it.next())) { - it.remove(); - return true; - } - } - } - return false; - } - - /** - * Returns a "weakly consistent" iterator that will never - * throw {@link ConcurrentModificationException}, and - * guarantees to traverse elements as they existed upon - * construction of the iterator, and may (but is not - * guaranteed to) reflect any modifications subsequent to - * construction. - * - * @return an iterator over the values of this map - */ - public final Iterator iterator() { - return new ValueIterator(map); - } - public final boolean add(V e) { - throw new UnsupportedOperationException(); - } - public final boolean addAll(Collection c) { - throw new UnsupportedOperationException(); - } - } - - /** - * A view of a ConcurrentHashMapV8 as a {@link Set} of (key, value) - * entries. This class cannot be directly instantiated. See - * {@link #entrySet}. - */ - public static final class EntrySetView extends CHMView - implements Set> { - EntrySetView(ConcurrentHashMapV8 map) { super(map); } - public final boolean contains(Object o) { - Object k, v, r; Map.Entry e; - return ((o instanceof Map.Entry) && - (k = (e = (Map.Entry)o).getKey()) != null && - (r = map.get(k)) != null && - (v = e.getValue()) != null && - (v == r || v.equals(r))); - } - public final boolean remove(Object o) { - Object k, v; Map.Entry e; - return ((o instanceof Map.Entry) && - (k = (e = (Map.Entry)o).getKey()) != null && - (v = e.getValue()) != null && - map.remove(k, v)); - } - - /** - * Returns a "weakly consistent" iterator that will never - * throw {@link ConcurrentModificationException}, and - * guarantees to traverse elements as they existed upon - * construction of the iterator, and may (but is not - * guaranteed to) reflect any modifications subsequent to - * construction. - * - * @return an iterator over the entries of this map - */ - public final Iterator> iterator() { - return new EntryIterator(map); - } - - public final boolean add(Entry e) { - K key = e.getKey(); - V value = e.getValue(); - if (key == null || value == null) - throw new NullPointerException(); - return map.internalPut(key, value) == null; - } - public final boolean addAll(Collection> c) { - boolean added = false; - for (Entry e : c) { - if (add(e)) - added = true; - } - return added; - } - public boolean equals(Object o) { - Set c; - return ((o instanceof Set) && - ((c = (Set)o) == this || - (containsAll(c) && c.containsAll(this)))); - } - } - - // Unsafe mechanics - private static final sun.misc.Unsafe UNSAFE; - private static final long counterOffset; - private static final long sizeCtlOffset; - private static final long ABASE; - private static final int ASHIFT; - - static { - int ss; - try { - UNSAFE = getUnsafe(); - Class k = ConcurrentHashMapV8.class; - counterOffset = UNSAFE.objectFieldOffset - (k.getDeclaredField("counter")); - sizeCtlOffset = UNSAFE.objectFieldOffset - (k.getDeclaredField("sizeCtl")); - Class sc = Node[].class; - ABASE = UNSAFE.arrayBaseOffset(sc); - ss = UNSAFE.arrayIndexScale(sc); - } catch (Exception e) { - throw new Error(e); - } - if ((ss & (ss-1)) != 0) - throw new Error("data type scale not a power of two"); - ASHIFT = 31 - Integer.numberOfLeadingZeros(ss); - } - - /** - * Returns a sun.misc.Unsafe. Suitable for use in a 3rd party package. - * Replace with a simple call to Unsafe.getUnsafe when integrating - * into a jdk. - * - * @return a sun.misc.Unsafe - */ - private static sun.misc.Unsafe getUnsafe() { - try { - return sun.misc.Unsafe.getUnsafe(); - } catch (SecurityException se) { - try { - return java.security.AccessController.doPrivileged - (new java.security - .PrivilegedExceptionAction() { - public sun.misc.Unsafe run() throws Exception { - java.lang.reflect.Field f = sun.misc - .Unsafe.class.getDeclaredField("theUnsafe"); - f.setAccessible(true); - return (sun.misc.Unsafe) f.get(null); - }}); - } catch (java.security.PrivilegedActionException e) { - throw new RuntimeException("Could not initialize intrinsics", - e.getCause()); - } - } - } -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/LongAdder.java b/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/LongAdder.java deleted file mode 100644 index 47a923c..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/LongAdder.java +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Written by Doug Lea with assistance from members of JCP JSR-166 - * Expert Group and released to the public domain, as explained at - * http://creativecommons.org/publicdomain/zero/1.0/ - */ - -// This is based on 1.9 version. - -package com.concurrent_ruby.ext.jsr166e; -import java.util.concurrent.atomic.AtomicLong; -import java.io.IOException; -import java.io.Serializable; -import java.io.ObjectInputStream; - -/** - * One or more variables that together maintain an initially zero - * {@code long} sum. When updates (method {@link #add}) are contended - * across threads, the set of variables may grow dynamically to reduce - * contention. Method {@link #sum} (or, equivalently, {@link - * #longValue}) returns the current total combined across the - * variables maintaining the sum. - * - *

    This class is usually preferable to {@link AtomicLong} when - * multiple threads update a common sum that is used for purposes such - * as collecting statistics, not for fine-grained synchronization - * control. Under low update contention, the two classes have similar - * characteristics. But under high contention, expected throughput of - * this class is significantly higher, at the expense of higher space - * consumption. - * - *

    This class extends {@link Number}, but does not define - * methods such as {@code hashCode} and {@code compareTo} because - * instances are expected to be mutated, and so are not useful as - * collection keys. - * - *

    jsr166e note: This class is targeted to be placed in - * java.util.concurrent.atomic. - * - * @since 1.8 - * @author Doug Lea - */ -public class LongAdder extends Striped64 implements Serializable { - private static final long serialVersionUID = 7249069246863182397L; - - /** - * Version of plus for use in retryUpdate - */ - final long fn(long v, long x) { return v + x; } - - /** - * Creates a new adder with initial sum of zero. - */ - public LongAdder() { - } - - /** - * Adds the given value. - * - * @param x the value to add - */ - public void add(long x) { - Cell[] as; long b, v; HashCode hc; Cell a; int n; - if ((as = cells) != null || !casBase(b = base, b + x)) { - boolean uncontended = true; - int h = (hc = threadHashCode.get()).code; - if (as == null || (n = as.length) < 1 || - (a = as[(n - 1) & h]) == null || - !(uncontended = a.cas(v = a.value, v + x))) - retryUpdate(x, hc, uncontended); - } - } - - /** - * Equivalent to {@code add(1)}. - */ - public void increment() { - add(1L); - } - - /** - * Equivalent to {@code add(-1)}. - */ - public void decrement() { - add(-1L); - } - - /** - * Returns the current sum. The returned value is NOT an - * atomic snapshot: Invocation in the absence of concurrent - * updates returns an accurate result, but concurrent updates that - * occur while the sum is being calculated might not be - * incorporated. - * - * @return the sum - */ - public long sum() { - long sum = base; - Cell[] as = cells; - if (as != null) { - int n = as.length; - for (int i = 0; i < n; ++i) { - Cell a = as[i]; - if (a != null) - sum += a.value; - } - } - return sum; - } - - /** - * Resets variables maintaining the sum to zero. This method may - * be a useful alternative to creating a new adder, but is only - * effective if there are no concurrent updates. Because this - * method is intrinsically racy, it should only be used when it is - * known that no threads are concurrently updating. - */ - public void reset() { - internalReset(0L); - } - - /** - * Equivalent in effect to {@link #sum} followed by {@link - * #reset}. This method may apply for example during quiescent - * points between multithreaded computations. If there are - * updates concurrent with this method, the returned value is - * not guaranteed to be the final value occurring before - * the reset. - * - * @return the sum - */ - public long sumThenReset() { - long sum = base; - Cell[] as = cells; - base = 0L; - if (as != null) { - int n = as.length; - for (int i = 0; i < n; ++i) { - Cell a = as[i]; - if (a != null) { - sum += a.value; - a.value = 0L; - } - } - } - return sum; - } - - /** - * Returns the String representation of the {@link #sum}. - * @return the String representation of the {@link #sum} - */ - public String toString() { - return Long.toString(sum()); - } - - /** - * Equivalent to {@link #sum}. - * - * @return the sum - */ - public long longValue() { - return sum(); - } - - /** - * Returns the {@link #sum} as an {@code int} after a narrowing - * primitive conversion. - */ - public int intValue() { - return (int)sum(); - } - - /** - * Returns the {@link #sum} as a {@code float} - * after a widening primitive conversion. - */ - public float floatValue() { - return (float)sum(); - } - - /** - * Returns the {@link #sum} as a {@code double} after a widening - * primitive conversion. - */ - public double doubleValue() { - return (double)sum(); - } - - private void writeObject(java.io.ObjectOutputStream s) - throws java.io.IOException { - s.defaultWriteObject(); - s.writeLong(sum()); - } - - private void readObject(ObjectInputStream s) - throws IOException, ClassNotFoundException { - s.defaultReadObject(); - busy = 0; - cells = null; - base = s.readLong(); - } - -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/Striped64.java b/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/Striped64.java deleted file mode 100644 index 93a277f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/Striped64.java +++ /dev/null @@ -1,342 +0,0 @@ -/* - * Written by Doug Lea with assistance from members of JCP JSR-166 - * Expert Group and released to the public domain, as explained at - * http://creativecommons.org/publicdomain/zero/1.0/ - */ - -// This is based on 1.5 version. - -package com.concurrent_ruby.ext.jsr166e; -import java.util.Random; - -/** - * A package-local class holding common representation and mechanics - * for classes supporting dynamic striping on 64bit values. The class - * extends Number so that concrete subclasses must publicly do so. - */ -abstract class Striped64 extends Number { - /* - * This class maintains a lazily-initialized table of atomically - * updated variables, plus an extra "base" field. The table size - * is a power of two. Indexing uses masked per-thread hash codes. - * Nearly all declarations in this class are package-private, - * accessed directly by subclasses. - * - * Table entries are of class Cell; a variant of AtomicLong padded - * to reduce cache contention on most processors. Padding is - * overkill for most Atomics because they are usually irregularly - * scattered in memory and thus don't interfere much with each - * other. But Atomic objects residing in arrays will tend to be - * placed adjacent to each other, and so will most often share - * cache lines (with a huge negative performance impact) without - * this precaution. - * - * In part because Cells are relatively large, we avoid creating - * them until they are needed. When there is no contention, all - * updates are made to the base field. Upon first contention (a - * failed CAS on base update), the table is initialized to size 2. - * The table size is doubled upon further contention until - * reaching the nearest power of two greater than or equal to the - * number of CPUS. Table slots remain empty (null) until they are - * needed. - * - * A single spinlock ("busy") is used for initializing and - * resizing the table, as well as populating slots with new Cells. - * There is no need for a blocking lock: When the lock is not - * available, threads try other slots (or the base). During these - * retries, there is increased contention and reduced locality, - * which is still better than alternatives. - * - * Per-thread hash codes are initialized to random values. - * Contention and/or table collisions are indicated by failed - * CASes when performing an update operation (see method - * retryUpdate). Upon a collision, if the table size is less than - * the capacity, it is doubled in size unless some other thread - * holds the lock. If a hashed slot is empty, and lock is - * available, a new Cell is created. Otherwise, if the slot - * exists, a CAS is tried. Retries proceed by "double hashing", - * using a secondary hash (Marsaglia XorShift) to try to find a - * free slot. - * - * The table size is capped because, when there are more threads - * than CPUs, supposing that each thread were bound to a CPU, - * there would exist a perfect hash function mapping threads to - * slots that eliminates collisions. When we reach capacity, we - * search for this mapping by randomly varying the hash codes of - * colliding threads. Because search is random, and collisions - * only become known via CAS failures, convergence can be slow, - * and because threads are typically not bound to CPUS forever, - * may not occur at all. However, despite these limitations, - * observed contention rates are typically low in these cases. - * - * It is possible for a Cell to become unused when threads that - * once hashed to it terminate, as well as in the case where - * doubling the table causes no thread to hash to it under - * expanded mask. We do not try to detect or remove such cells, - * under the assumption that for long-running instances, observed - * contention levels will recur, so the cells will eventually be - * needed again; and for short-lived ones, it does not matter. - */ - - /** - * Padded variant of AtomicLong supporting only raw accesses plus CAS. - * The value field is placed between pads, hoping that the JVM doesn't - * reorder them. - * - * JVM intrinsics note: It would be possible to use a release-only - * form of CAS here, if it were provided. - */ - static final class Cell { - volatile long p0, p1, p2, p3, p4, p5, p6; - volatile long value; - volatile long q0, q1, q2, q3, q4, q5, q6; - Cell(long x) { value = x; } - - final boolean cas(long cmp, long val) { - return UNSAFE.compareAndSwapLong(this, valueOffset, cmp, val); - } - - // Unsafe mechanics - private static final sun.misc.Unsafe UNSAFE; - private static final long valueOffset; - static { - try { - UNSAFE = getUnsafe(); - Class ak = Cell.class; - valueOffset = UNSAFE.objectFieldOffset - (ak.getDeclaredField("value")); - } catch (Exception e) { - throw new Error(e); - } - } - - } - - /** - * Holder for the thread-local hash code. The code is initially - * random, but may be set to a different value upon collisions. - */ - static final class HashCode { - static final Random rng = new Random(); - int code; - HashCode() { - int h = rng.nextInt(); // Avoid zero to allow xorShift rehash - code = (h == 0) ? 1 : h; - } - } - - /** - * The corresponding ThreadLocal class - */ - static final class ThreadHashCode extends ThreadLocal { - public HashCode initialValue() { return new HashCode(); } - } - - /** - * Static per-thread hash codes. Shared across all instances to - * reduce ThreadLocal pollution and because adjustments due to - * collisions in one table are likely to be appropriate for - * others. - */ - static final ThreadHashCode threadHashCode = new ThreadHashCode(); - - /** Number of CPUS, to place bound on table size */ - static final int NCPU = Runtime.getRuntime().availableProcessors(); - - /** - * Table of cells. When non-null, size is a power of 2. - */ - transient volatile Cell[] cells; - - /** - * Base value, used mainly when there is no contention, but also as - * a fallback during table initialization races. Updated via CAS. - */ - transient volatile long base; - - /** - * Spinlock (locked via CAS) used when resizing and/or creating Cells. - */ - transient volatile int busy; - - /** - * Package-private default constructor - */ - Striped64() { - } - - /** - * CASes the base field. - */ - final boolean casBase(long cmp, long val) { - return UNSAFE.compareAndSwapLong(this, baseOffset, cmp, val); - } - - /** - * CASes the busy field from 0 to 1 to acquire lock. - */ - final boolean casBusy() { - return UNSAFE.compareAndSwapInt(this, busyOffset, 0, 1); - } - - /** - * Computes the function of current and new value. Subclasses - * should open-code this update function for most uses, but the - * virtualized form is needed within retryUpdate. - * - * @param currentValue the current value (of either base or a cell) - * @param newValue the argument from a user update call - * @return result of the update function - */ - abstract long fn(long currentValue, long newValue); - - /** - * Handles cases of updates involving initialization, resizing, - * creating new Cells, and/or contention. See above for - * explanation. This method suffers the usual non-modularity - * problems of optimistic retry code, relying on rechecked sets of - * reads. - * - * @param x the value - * @param hc the hash code holder - * @param wasUncontended false if CAS failed before call - */ - final void retryUpdate(long x, HashCode hc, boolean wasUncontended) { - int h = hc.code; - boolean collide = false; // True if last slot nonempty - for (;;) { - Cell[] as; Cell a; int n; long v; - if ((as = cells) != null && (n = as.length) > 0) { - if ((a = as[(n - 1) & h]) == null) { - if (busy == 0) { // Try to attach new Cell - Cell r = new Cell(x); // Optimistically create - if (busy == 0 && casBusy()) { - boolean created = false; - try { // Recheck under lock - Cell[] rs; int m, j; - if ((rs = cells) != null && - (m = rs.length) > 0 && - rs[j = (m - 1) & h] == null) { - rs[j] = r; - created = true; - } - } finally { - busy = 0; - } - if (created) - break; - continue; // Slot is now non-empty - } - } - collide = false; - } - else if (!wasUncontended) // CAS already known to fail - wasUncontended = true; // Continue after rehash - else if (a.cas(v = a.value, fn(v, x))) - break; - else if (n >= NCPU || cells != as) - collide = false; // At max size or stale - else if (!collide) - collide = true; - else if (busy == 0 && casBusy()) { - try { - if (cells == as) { // Expand table unless stale - Cell[] rs = new Cell[n << 1]; - for (int i = 0; i < n; ++i) - rs[i] = as[i]; - cells = rs; - } - } finally { - busy = 0; - } - collide = false; - continue; // Retry with expanded table - } - h ^= h << 13; // Rehash - h ^= h >>> 17; - h ^= h << 5; - } - else if (busy == 0 && cells == as && casBusy()) { - boolean init = false; - try { // Initialize table - if (cells == as) { - Cell[] rs = new Cell[2]; - rs[h & 1] = new Cell(x); - cells = rs; - init = true; - } - } finally { - busy = 0; - } - if (init) - break; - } - else if (casBase(v = base, fn(v, x))) - break; // Fall back on using base - } - hc.code = h; // Record index for next time - } - - - /** - * Sets base and all cells to the given value. - */ - final void internalReset(long initialValue) { - Cell[] as = cells; - base = initialValue; - if (as != null) { - int n = as.length; - for (int i = 0; i < n; ++i) { - Cell a = as[i]; - if (a != null) - a.value = initialValue; - } - } - } - - // Unsafe mechanics - private static final sun.misc.Unsafe UNSAFE; - private static final long baseOffset; - private static final long busyOffset; - static { - try { - UNSAFE = getUnsafe(); - Class sk = Striped64.class; - baseOffset = UNSAFE.objectFieldOffset - (sk.getDeclaredField("base")); - busyOffset = UNSAFE.objectFieldOffset - (sk.getDeclaredField("busy")); - } catch (Exception e) { - throw new Error(e); - } - } - - /** - * Returns a sun.misc.Unsafe. Suitable for use in a 3rd party package. - * Replace with a simple call to Unsafe.getUnsafe when integrating - * into a jdk. - * - * @return a sun.misc.Unsafe - */ - private static sun.misc.Unsafe getUnsafe() { - try { - return sun.misc.Unsafe.getUnsafe(); - } catch (SecurityException se) { - try { - return java.security.AccessController.doPrivileged - (new java.security - .PrivilegedExceptionAction() { - public sun.misc.Unsafe run() throws Exception { - java.lang.reflect.Field f = sun.misc - .Unsafe.class.getDeclaredField("theUnsafe"); - f.setAccessible(true); - return (sun.misc.Unsafe) f.get(null); - }}); - } catch (java.security.PrivilegedActionException e) { - throw new RuntimeException("Could not initialize intrinsics", - e.getCause()); - } - } - } - -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/nounsafe/ConcurrentHashMapV8.java b/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/nounsafe/ConcurrentHashMapV8.java deleted file mode 100644 index b7fc5a9..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/nounsafe/ConcurrentHashMapV8.java +++ /dev/null @@ -1,3800 +0,0 @@ -/* - * Written by Doug Lea with assistance from members of JCP JSR-166 - * Expert Group and released to the public domain, as explained at - * http://creativecommons.org/publicdomain/zero/1.0/ - */ - -// This is based on the 1.79 version. - -package com.concurrent_ruby.ext.jsr166e.nounsafe; - -import org.jruby.RubyClass; -import org.jruby.RubyNumeric; -import org.jruby.RubyObject; -import org.jruby.exceptions.RaiseException; -import com.concurrent_ruby.ext.jsr166e.ConcurrentHashMap; -import com.concurrent_ruby.ext.jsr166y.ThreadLocalRandom; -import org.jruby.runtime.ThreadContext; -import org.jruby.runtime.builtin.IRubyObject; - -import java.util.Arrays; -import java.util.Map; -import java.util.Set; -import java.util.Collection; -import java.util.Hashtable; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Enumeration; -import java.util.ConcurrentModificationException; -import java.util.NoSuchElementException; -import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; -import java.util.concurrent.atomic.AtomicReferenceArray; -import java.util.concurrent.locks.AbstractQueuedSynchronizer; - -import java.io.Serializable; - -/** - * A hash table supporting full concurrency of retrievals and - * high expected concurrency for updates. This class obeys the - * same functional specification as {@link java.util.Hashtable}, and - * includes versions of methods corresponding to each method of - * {@code Hashtable}. However, even though all operations are - * thread-safe, retrieval operations do not entail locking, - * and there is not any support for locking the entire table - * in a way that prevents all access. This class is fully - * interoperable with {@code Hashtable} in programs that rely on its - * thread safety but not on its synchronization details. - * - *

    Retrieval operations (including {@code get}) generally do not - * block, so may overlap with update operations (including {@code put} - * and {@code remove}). Retrievals reflect the results of the most - * recently completed update operations holding upon their - * onset. (More formally, an update operation for a given key bears a - * happens-before relation with any (non-null) retrieval for - * that key reporting the updated value.) For aggregate operations - * such as {@code putAll} and {@code clear}, concurrent retrievals may - * reflect insertion or removal of only some entries. Similarly, - * Iterators and Enumerations return elements reflecting the state of - * the hash table at some point at or since the creation of the - * iterator/enumeration. They do not throw {@link - * ConcurrentModificationException}. However, iterators are designed - * to be used by only one thread at a time. Bear in mind that the - * results of aggregate status methods including {@code size}, {@code - * isEmpty}, and {@code containsValue} are typically useful only when - * a map is not undergoing concurrent updates in other threads. - * Otherwise the results of these methods reflect transient states - * that may be adequate for monitoring or estimation purposes, but not - * for program control. - * - *

    The table is dynamically expanded when there are too many - * collisions (i.e., keys that have distinct hash codes but fall into - * the same slot modulo the table size), with the expected average - * effect of maintaining roughly two bins per mapping (corresponding - * to a 0.75 load factor threshold for resizing). There may be much - * variance around this average as mappings are added and removed, but - * overall, this maintains a commonly accepted time/space tradeoff for - * hash tables. However, resizing this or any other kind of hash - * table may be a relatively slow operation. When possible, it is a - * good idea to provide a size estimate as an optional {@code - * initialCapacity} constructor argument. An additional optional - * {@code loadFactor} constructor argument provides a further means of - * customizing initial table capacity by specifying the table density - * to be used in calculating the amount of space to allocate for the - * given number of elements. Also, for compatibility with previous - * versions of this class, constructors may optionally specify an - * expected {@code concurrencyLevel} as an additional hint for - * internal sizing. Note that using many keys with exactly the same - * {@code hashCode()} is a sure way to slow down performance of any - * hash table. - * - *

    A {@link Set} projection of a ConcurrentHashMapV8 may be created - * (using {@link #newKeySet()} or {@link #newKeySet(int)}), or viewed - * (using {@link #keySet(Object)} when only keys are of interest, and the - * mapped values are (perhaps transiently) not used or all take the - * same mapping value. - * - *

    A ConcurrentHashMapV8 can be used as scalable frequency map (a - * form of histogram or multiset) by using {@link LongAdder} values - * and initializing via {@link #computeIfAbsent}. For example, to add - * a count to a {@code ConcurrentHashMapV8 freqs}, you - * can use {@code freqs.computeIfAbsent(k -> new - * LongAdder()).increment();} - * - *

    This class and its views and iterators implement all of the - * optional methods of the {@link Map} and {@link Iterator} - * interfaces. - * - *

    Like {@link Hashtable} but unlike {@link HashMap}, this class - * does not allow {@code null} to be used as a key or value. - * - *

    ConcurrentHashMapV8s support parallel operations using the {@link - * ForkJoinPool#commonPool}. (Tasks that may be used in other contexts - * are available in class {@link ForkJoinTasks}). These operations are - * designed to be safely, and often sensibly, applied even with maps - * that are being concurrently updated by other threads; for example, - * when computing a snapshot summary of the values in a shared - * registry. There are three kinds of operation, each with four - * forms, accepting functions with Keys, Values, Entries, and (Key, - * Value) arguments and/or return values. (The first three forms are - * also available via the {@link #keySet()}, {@link #values()} and - * {@link #entrySet()} views). Because the elements of a - * ConcurrentHashMapV8 are not ordered in any particular way, and may be - * processed in different orders in different parallel executions, the - * correctness of supplied functions should not depend on any - * ordering, or on any other objects or values that may transiently - * change while computation is in progress; and except for forEach - * actions, should ideally be side-effect-free. - * - *

    - * - *

    The concurrency properties of bulk operations follow - * from those of ConcurrentHashMapV8: Any non-null result returned - * from {@code get(key)} and related access methods bears a - * happens-before relation with the associated insertion or - * update. The result of any bulk operation reflects the - * composition of these per-element relations (but is not - * necessarily atomic with respect to the map as a whole unless it - * is somehow known to be quiescent). Conversely, because keys - * and values in the map are never null, null serves as a reliable - * atomic indicator of the current lack of any result. To - * maintain this property, null serves as an implicit basis for - * all non-scalar reduction operations. For the double, long, and - * int versions, the basis should be one that, when combined with - * any other value, returns that other value (more formally, it - * should be the identity element for the reduction). Most common - * reductions have these properties; for example, computing a sum - * with basis 0 or a minimum with basis MAX_VALUE. - * - *

    Search and transformation functions provided as arguments - * should similarly return null to indicate the lack of any result - * (in which case it is not used). In the case of mapped - * reductions, this also enables transformations to serve as - * filters, returning null (or, in the case of primitive - * specializations, the identity basis) if the element should not - * be combined. You can create compound transformations and - * filterings by composing them yourself under this "null means - * there is nothing there now" rule before using them in search or - * reduce operations. - * - *

    Methods accepting and/or returning Entry arguments maintain - * key-value associations. They may be useful for example when - * finding the key for the greatest value. Note that "plain" Entry - * arguments can be supplied using {@code new - * AbstractMap.SimpleEntry(k,v)}. - * - *

    Bulk operations may complete abruptly, throwing an - * exception encountered in the application of a supplied - * function. Bear in mind when handling such exceptions that other - * concurrently executing functions could also have thrown - * exceptions, or would have done so if the first exception had - * not occurred. - * - *

    Parallel speedups for bulk operations compared to sequential - * processing are common but not guaranteed. Operations involving - * brief functions on small maps may execute more slowly than - * sequential loops if the underlying work to parallelize the - * computation is more expensive than the computation itself. - * Similarly, parallelization may not lead to much actual parallelism - * if all processors are busy performing unrelated tasks. - * - *

    All arguments to all task methods must be non-null. - * - *

    jsr166e note: During transition, this class - * uses nested functional interfaces with different names but the - * same forms as those expected for JDK8. - * - *

    This class is a member of the - * - * Java Collections Framework. - * - * @since 1.5 - * @author Doug Lea - * @param the type of keys maintained by this map - * @param the type of mapped values - */ -public class ConcurrentHashMapV8 - implements ConcurrentMap, Serializable, ConcurrentHashMap { - private static final long serialVersionUID = 7249069246763182397L; - - /** - * A partitionable iterator. A Spliterator can be traversed - * directly, but can also be partitioned (before traversal) by - * creating another Spliterator that covers a non-overlapping - * portion of the elements, and so may be amenable to parallel - * execution. - * - *

    This interface exports a subset of expected JDK8 - * functionality. - * - *

    Sample usage: Here is one (of the several) ways to compute - * the sum of the values held in a map using the ForkJoin - * framework. As illustrated here, Spliterators are well suited to - * designs in which a task repeatedly splits off half its work - * into forked subtasks until small enough to process directly, - * and then joins these subtasks. Variants of this style can also - * be used in completion-based designs. - * - *

    -     * {@code ConcurrentHashMapV8 m = ...
    -     * // split as if have 8 * parallelism, for load balance
    -     * int n = m.size();
    -     * int p = aForkJoinPool.getParallelism() * 8;
    -     * int split = (n < p)? n : p;
    -     * long sum = aForkJoinPool.invoke(new SumValues(m.valueSpliterator(), split, null));
    -     * // ...
    -     * static class SumValues extends RecursiveTask {
    -     *   final Spliterator s;
    -     *   final int split;             // split while > 1
    -     *   final SumValues nextJoin;    // records forked subtasks to join
    -     *   SumValues(Spliterator s, int depth, SumValues nextJoin) {
    -     *     this.s = s; this.depth = depth; this.nextJoin = nextJoin;
    -     *   }
    -     *   public Long compute() {
    -     *     long sum = 0;
    -     *     SumValues subtasks = null; // fork subtasks
    -     *     for (int s = split >>> 1; s > 0; s >>>= 1)
    -     *       (subtasks = new SumValues(s.split(), s, subtasks)).fork();
    -     *     while (s.hasNext())        // directly process remaining elements
    -     *       sum += s.next();
    -     *     for (SumValues t = subtasks; t != null; t = t.nextJoin)
    -     *       sum += t.join();         // collect subtask results
    -     *     return sum;
    -     *   }
    -     * }
    -     * }
    - */ - public static interface Spliterator extends Iterator { - /** - * Returns a Spliterator covering approximately half of the - * elements, guaranteed not to overlap with those subsequently - * returned by this Spliterator. After invoking this method, - * the current Spliterator will not produce any of - * the elements of the returned Spliterator, but the two - * Spliterators together will produce all of the elements that - * would have been produced by this Spliterator had this - * method not been called. The exact number of elements - * produced by the returned Spliterator is not guaranteed, and - * may be zero (i.e., with {@code hasNext()} reporting {@code - * false}) if this Spliterator cannot be further split. - * - * @return a Spliterator covering approximately half of the - * elements - * @throws IllegalStateException if this Spliterator has - * already commenced traversing elements - */ - Spliterator split(); - } - - - /* - * Overview: - * - * The primary design goal of this hash table is to maintain - * concurrent readability (typically method get(), but also - * iterators and related methods) while minimizing update - * contention. Secondary goals are to keep space consumption about - * the same or better than java.util.HashMap, and to support high - * initial insertion rates on an empty table by many threads. - * - * Each key-value mapping is held in a Node. Because Node fields - * can contain special values, they are defined using plain Object - * types. Similarly in turn, all internal methods that use them - * work off Object types. And similarly, so do the internal - * methods of auxiliary iterator and view classes. All public - * generic typed methods relay in/out of these internal methods, - * supplying null-checks and casts as needed. This also allows - * many of the public methods to be factored into a smaller number - * of internal methods (although sadly not so for the five - * variants of put-related operations). The validation-based - * approach explained below leads to a lot of code sprawl because - * retry-control precludes factoring into smaller methods. - * - * The table is lazily initialized to a power-of-two size upon the - * first insertion. Each bin in the table normally contains a - * list of Nodes (most often, the list has only zero or one Node). - * Table accesses require volatile/atomic reads, writes, and - * CASes. Because there is no other way to arrange this without - * adding further indirections, we use intrinsics - * (sun.misc.Unsafe) operations. The lists of nodes within bins - * are always accurately traversable under volatile reads, so long - * as lookups check hash code and non-nullness of value before - * checking key equality. - * - * We use the top two bits of Node hash fields for control - * purposes -- they are available anyway because of addressing - * constraints. As explained further below, these top bits are - * used as follows: - * 00 - Normal - * 01 - Locked - * 11 - Locked and may have a thread waiting for lock - * 10 - Node is a forwarding node - * - * The lower 30 bits of each Node's hash field contain a - * transformation of the key's hash code, except for forwarding - * nodes, for which the lower bits are zero (and so always have - * hash field == MOVED). - * - * Insertion (via put or its variants) of the first node in an - * empty bin is performed by just CASing it to the bin. This is - * by far the most common case for put operations under most - * key/hash distributions. Other update operations (insert, - * delete, and replace) require locks. We do not want to waste - * the space required to associate a distinct lock object with - * each bin, so instead use the first node of a bin list itself as - * a lock. Blocking support for these locks relies on the builtin - * "synchronized" monitors. However, we also need a tryLock - * construction, so we overlay these by using bits of the Node - * hash field for lock control (see above), and so normally use - * builtin monitors only for blocking and signalling using - * wait/notifyAll constructions. See Node.tryAwaitLock. - * - * Using the first node of a list as a lock does not by itself - * suffice though: When a node is locked, any update must first - * validate that it is still the first node after locking it, and - * retry if not. Because new nodes are always appended to lists, - * once a node is first in a bin, it remains first until deleted - * or the bin becomes invalidated (upon resizing). However, - * operations that only conditionally update may inspect nodes - * until the point of update. This is a converse of sorts to the - * lazy locking technique described by Herlihy & Shavit. - * - * The main disadvantage of per-bin locks is that other update - * operations on other nodes in a bin list protected by the same - * lock can stall, for example when user equals() or mapping - * functions take a long time. However, statistically, under - * random hash codes, this is not a common problem. Ideally, the - * frequency of nodes in bins follows a Poisson distribution - * (http://en.wikipedia.org/wiki/Poisson_distribution) with a - * parameter of about 0.5 on average, given the resizing threshold - * of 0.75, although with a large variance because of resizing - * granularity. Ignoring variance, the expected occurrences of - * list size k are (exp(-0.5) * pow(0.5, k) / factorial(k)). The - * first values are: - * - * 0: 0.60653066 - * 1: 0.30326533 - * 2: 0.07581633 - * 3: 0.01263606 - * 4: 0.00157952 - * 5: 0.00015795 - * 6: 0.00001316 - * 7: 0.00000094 - * 8: 0.00000006 - * more: less than 1 in ten million - * - * Lock contention probability for two threads accessing distinct - * elements is roughly 1 / (8 * #elements) under random hashes. - * - * Actual hash code distributions encountered in practice - * sometimes deviate significantly from uniform randomness. This - * includes the case when N > (1<<30), so some keys MUST collide. - * Similarly for dumb or hostile usages in which multiple keys are - * designed to have identical hash codes. Also, although we guard - * against the worst effects of this (see method spread), sets of - * hashes may differ only in bits that do not impact their bin - * index for a given power-of-two mask. So we use a secondary - * strategy that applies when the number of nodes in a bin exceeds - * a threshold, and at least one of the keys implements - * Comparable. These TreeBins use a balanced tree to hold nodes - * (a specialized form of red-black trees), bounding search time - * to O(log N). Each search step in a TreeBin is around twice as - * slow as in a regular list, but given that N cannot exceed - * (1<<64) (before running out of addresses) this bounds search - * steps, lock hold times, etc, to reasonable constants (roughly - * 100 nodes inspected per operation worst case) so long as keys - * are Comparable (which is very common -- String, Long, etc). - * TreeBin nodes (TreeNodes) also maintain the same "next" - * traversal pointers as regular nodes, so can be traversed in - * iterators in the same way. - * - * The table is resized when occupancy exceeds a percentage - * threshold (nominally, 0.75, but see below). Only a single - * thread performs the resize (using field "sizeCtl", to arrange - * exclusion), but the table otherwise remains usable for reads - * and updates. Resizing proceeds by transferring bins, one by - * one, from the table to the next table. Because we are using - * power-of-two expansion, the elements from each bin must either - * stay at same index, or move with a power of two offset. We - * eliminate unnecessary node creation by catching cases where old - * nodes can be reused because their next fields won't change. On - * average, only about one-sixth of them need cloning when a table - * doubles. The nodes they replace will be garbage collectable as - * soon as they are no longer referenced by any reader thread that - * may be in the midst of concurrently traversing table. Upon - * transfer, the old table bin contains only a special forwarding - * node (with hash field "MOVED") that contains the next table as - * its key. On encountering a forwarding node, access and update - * operations restart, using the new table. - * - * Each bin transfer requires its bin lock. However, unlike other - * cases, a transfer can skip a bin if it fails to acquire its - * lock, and revisit it later (unless it is a TreeBin). Method - * rebuild maintains a buffer of TRANSFER_BUFFER_SIZE bins that - * have been skipped because of failure to acquire a lock, and - * blocks only if none are available (i.e., only very rarely). - * The transfer operation must also ensure that all accessible - * bins in both the old and new table are usable by any traversal. - * When there are no lock acquisition failures, this is arranged - * simply by proceeding from the last bin (table.length - 1) up - * towards the first. Upon seeing a forwarding node, traversals - * (see class Iter) arrange to move to the new table - * without revisiting nodes. However, when any node is skipped - * during a transfer, all earlier table bins may have become - * visible, so are initialized with a reverse-forwarding node back - * to the old table until the new ones are established. (This - * sometimes requires transiently locking a forwarding node, which - * is possible under the above encoding.) These more expensive - * mechanics trigger only when necessary. - * - * The traversal scheme also applies to partial traversals of - * ranges of bins (via an alternate Traverser constructor) - * to support partitioned aggregate operations. Also, read-only - * operations give up if ever forwarded to a null table, which - * provides support for shutdown-style clearing, which is also not - * currently implemented. - * - * Lazy table initialization minimizes footprint until first use, - * and also avoids resizings when the first operation is from a - * putAll, constructor with map argument, or deserialization. - * These cases attempt to override the initial capacity settings, - * but harmlessly fail to take effect in cases of races. - * - * The element count is maintained using a LongAdder, which avoids - * contention on updates but can encounter cache thrashing if read - * too frequently during concurrent access. To avoid reading so - * often, resizing is attempted either when a bin lock is - * contended, or upon adding to a bin already holding two or more - * nodes (checked before adding in the xIfAbsent methods, after - * adding in others). Under uniform hash distributions, the - * probability of this occurring at threshold is around 13%, - * meaning that only about 1 in 8 puts check threshold (and after - * resizing, many fewer do so). But this approximation has high - * variance for small table sizes, so we check on any collision - * for sizes <= 64. The bulk putAll operation further reduces - * contention by only committing count updates upon these size - * checks. - * - * Maintaining API and serialization compatibility with previous - * versions of this class introduces several oddities. Mainly: We - * leave untouched but unused constructor arguments refering to - * concurrencyLevel. We accept a loadFactor constructor argument, - * but apply it only to initial table capacity (which is the only - * time that we can guarantee to honor it.) We also declare an - * unused "Segment" class that is instantiated in minimal form - * only when serializing. - */ - - /* ---------------- Constants -------------- */ - - /** - * The largest possible table capacity. This value must be - * exactly 1<<30 to stay within Java array allocation and indexing - * bounds for power of two table sizes, and is further required - * because the top two bits of 32bit hash fields are used for - * control purposes. - */ - private static final int MAXIMUM_CAPACITY = 1 << 30; - - /** - * The default initial table capacity. Must be a power of 2 - * (i.e., at least 1) and at most MAXIMUM_CAPACITY. - */ - private static final int DEFAULT_CAPACITY = 16; - - /** - * The largest possible (non-power of two) array size. - * Needed by toArray and related methods. - */ - static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; - - /** - * The default concurrency level for this table. Unused but - * defined for compatibility with previous versions of this class. - */ - private static final int DEFAULT_CONCURRENCY_LEVEL = 16; - - /** - * The load factor for this table. Overrides of this value in - * constructors affect only the initial table capacity. The - * actual floating point value isn't normally used -- it is - * simpler to use expressions such as {@code n - (n >>> 2)} for - * the associated resizing threshold. - */ - private static final float LOAD_FACTOR = 0.75f; - - /** - * The buffer size for skipped bins during transfers. The - * value is arbitrary but should be large enough to avoid - * most locking stalls during resizes. - */ - private static final int TRANSFER_BUFFER_SIZE = 32; - - /** - * The bin count threshold for using a tree rather than list for a - * bin. The value reflects the approximate break-even point for - * using tree-based operations. - * Note that Doug's version defaults to 8, but when dealing with - * Ruby objects it is actually beneficial to avoid TreeNodes - * as long as possible as it usually means going into Ruby land. - */ - private static final int TREE_THRESHOLD = 16; - - /* - * Encodings for special uses of Node hash fields. See above for - * explanation. - */ - static final int MOVED = 0x80000000; // hash field for forwarding nodes - static final int LOCKED = 0x40000000; // set/tested only as a bit - static final int WAITING = 0xc0000000; // both bits set/tested together - static final int HASH_BITS = 0x3fffffff; // usable bits of normal node hash - - /* ---------------- Fields -------------- */ - - /** - * The array of bins. Lazily initialized upon first insertion. - * Size is always a power of two. Accessed directly by iterators. - */ - transient volatile AtomicReferenceArray table; - - /** - * The counter maintaining number of elements. - */ - private transient LongAdder counter; - - /** - * Table initialization and resizing control. When negative, the - * table is being initialized or resized. Otherwise, when table is - * null, holds the initial table size to use upon creation, or 0 - * for default. After initialization, holds the next element count - * value upon which to resize the table. - */ - private transient volatile int sizeCtl; - - // views - private transient KeySetView keySet; - private transient ValuesView values; - private transient EntrySetView entrySet; - - /** For serialization compatibility. Null unless serialized; see below */ - private Segment[] segments; - - static AtomicIntegerFieldUpdater SIZE_CTRL_UPDATER = AtomicIntegerFieldUpdater.newUpdater(ConcurrentHashMapV8.class, "sizeCtl"); - - /* ---------------- Table element access -------------- */ - - /* - * Volatile access methods are used for table elements as well as - * elements of in-progress next table while resizing. Uses are - * null checked by callers, and implicitly bounds-checked, relying - * on the invariants that tab arrays have non-zero size, and all - * indices are masked with (tab.length - 1) which is never - * negative and always less than length. Note that, to be correct - * wrt arbitrary concurrency errors by users, bounds checks must - * operate on local variables, which accounts for some odd-looking - * inline assignments below. - */ - - static final Node tabAt(AtomicReferenceArray tab, int i) { // used by Iter - return tab.get(i); - } - - private static final boolean casTabAt(AtomicReferenceArray tab, int i, Node c, Node v) { - return tab.compareAndSet(i, c, v); - } - - private static final void setTabAt(AtomicReferenceArray tab, int i, Node v) { - tab.set(i, v); - } - - /* ---------------- Nodes -------------- */ - - /** - * Key-value entry. Note that this is never exported out as a - * user-visible Map.Entry (see MapEntry below). Nodes with a hash - * field of MOVED are special, and do not contain user keys or - * values. Otherwise, keys are never null, and null val fields - * indicate that a node is in the process of being deleted or - * created. For purposes of read-only access, a key may be read - * before a val, but can only be used after checking val to be - * non-null. - */ - static class Node { - volatile int hash; - final Object key; - volatile Object val; - volatile Node next; - - static AtomicIntegerFieldUpdater HASH_UPDATER = AtomicIntegerFieldUpdater.newUpdater(Node.class, "hash"); - - Node(int hash, Object key, Object val, Node next) { - this.hash = hash; - this.key = key; - this.val = val; - this.next = next; - } - - /** CompareAndSet the hash field */ - final boolean casHash(int cmp, int val) { - return HASH_UPDATER.compareAndSet(this, cmp, val); - } - - /** The number of spins before blocking for a lock */ - static final int MAX_SPINS = - Runtime.getRuntime().availableProcessors() > 1 ? 64 : 1; - - /** - * Spins a while if LOCKED bit set and this node is the first - * of its bin, and then sets WAITING bits on hash field and - * blocks (once) if they are still set. It is OK for this - * method to return even if lock is not available upon exit, - * which enables these simple single-wait mechanics. - * - * The corresponding signalling operation is performed within - * callers: Upon detecting that WAITING has been set when - * unlocking lock (via a failed CAS from non-waiting LOCKED - * state), unlockers acquire the sync lock and perform a - * notifyAll. - * - * The initial sanity check on tab and bounds is not currently - * necessary in the only usages of this method, but enables - * use in other future contexts. - */ - final void tryAwaitLock(AtomicReferenceArray tab, int i) { - if (tab != null && i >= 0 && i < tab.length()) { // sanity check - int r = ThreadLocalRandom.current().nextInt(); // randomize spins - int spins = MAX_SPINS, h; - while (tabAt(tab, i) == this && ((h = hash) & LOCKED) != 0) { - if (spins >= 0) { - r ^= r << 1; r ^= r >>> 3; r ^= r << 10; // xorshift - if (r >= 0 && --spins == 0) - Thread.yield(); // yield before block - } - else if (casHash(h, h | WAITING)) { - synchronized (this) { - if (tabAt(tab, i) == this && - (hash & WAITING) == WAITING) { - try { - wait(); - } catch (InterruptedException ie) { - Thread.currentThread().interrupt(); - } - } - else - notifyAll(); // possibly won race vs signaller - } - break; - } - } - } - } - } - - /* ---------------- TreeBins -------------- */ - - /** - * Nodes for use in TreeBins - */ - static final class TreeNode extends Node { - TreeNode parent; // red-black tree links - TreeNode left; - TreeNode right; - TreeNode prev; // needed to unlink next upon deletion - boolean red; - - TreeNode(int hash, Object key, Object val, Node next, TreeNode parent) { - super(hash, key, val, next); - this.parent = parent; - } - } - - /** - * A specialized form of red-black tree for use in bins - * whose size exceeds a threshold. - * - * TreeBins use a special form of comparison for search and - * related operations (which is the main reason we cannot use - * existing collections such as TreeMaps). TreeBins contain - * Comparable elements, but may contain others, as well as - * elements that are Comparable but not necessarily Comparable - * for the same T, so we cannot invoke compareTo among them. To - * handle this, the tree is ordered primarily by hash value, then - * by getClass().getName() order, and then by Comparator order - * among elements of the same class. On lookup at a node, if - * elements are not comparable or compare as 0, both left and - * right children may need to be searched in the case of tied hash - * values. (This corresponds to the full list search that would be - * necessary if all elements were non-Comparable and had tied - * hashes.) The red-black balancing code is updated from - * pre-jdk-collections - * (http://gee.cs.oswego.edu/dl/classes/collections/RBCell.java) - * based in turn on Cormen, Leiserson, and Rivest "Introduction to - * Algorithms" (CLR). - * - * TreeBins also maintain a separate locking discipline than - * regular bins. Because they are forwarded via special MOVED - * nodes at bin heads (which can never change once established), - * we cannot use those nodes as locks. Instead, TreeBin - * extends AbstractQueuedSynchronizer to support a simple form of - * read-write lock. For update operations and table validation, - * the exclusive form of lock behaves in the same way as bin-head - * locks. However, lookups use shared read-lock mechanics to allow - * multiple readers in the absence of writers. Additionally, - * these lookups do not ever block: While the lock is not - * available, they proceed along the slow traversal path (via - * next-pointers) until the lock becomes available or the list is - * exhausted, whichever comes first. (These cases are not fast, - * but maximize aggregate expected throughput.) The AQS mechanics - * for doing this are straightforward. The lock state is held as - * AQS getState(). Read counts are negative; the write count (1) - * is positive. There are no signalling preferences among readers - * and writers. Since we don't need to export full Lock API, we - * just override the minimal AQS methods and use them directly. - */ - static final class TreeBin extends AbstractQueuedSynchronizer { - private static final long serialVersionUID = 2249069246763182397L; - transient TreeNode root; // root of tree - transient TreeNode first; // head of next-pointer list - - /* AQS overrides */ - public final boolean isHeldExclusively() { return getState() > 0; } - public final boolean tryAcquire(int ignore) { - if (compareAndSetState(0, 1)) { - setExclusiveOwnerThread(Thread.currentThread()); - return true; - } - return false; - } - public final boolean tryRelease(int ignore) { - setExclusiveOwnerThread(null); - setState(0); - return true; - } - public final int tryAcquireShared(int ignore) { - for (int c;;) { - if ((c = getState()) > 0) - return -1; - if (compareAndSetState(c, c -1)) - return 1; - } - } - public final boolean tryReleaseShared(int ignore) { - int c; - do {} while (!compareAndSetState(c = getState(), c + 1)); - return c == -1; - } - - /** From CLR */ - private void rotateLeft(TreeNode p) { - if (p != null) { - TreeNode r = p.right, pp, rl; - if ((rl = p.right = r.left) != null) - rl.parent = p; - if ((pp = r.parent = p.parent) == null) - root = r; - else if (pp.left == p) - pp.left = r; - else - pp.right = r; - r.left = p; - p.parent = r; - } - } - - /** From CLR */ - private void rotateRight(TreeNode p) { - if (p != null) { - TreeNode l = p.left, pp, lr; - if ((lr = p.left = l.right) != null) - lr.parent = p; - if ((pp = l.parent = p.parent) == null) - root = l; - else if (pp.right == p) - pp.right = l; - else - pp.left = l; - l.right = p; - p.parent = l; - } - } - - @SuppressWarnings("unchecked") final TreeNode getTreeNode - (int h, Object k, TreeNode p) { - return getTreeNode(h, (RubyObject)k, p); - } - - /** - * Returns the TreeNode (or null if not found) for the given key - * starting at given root. - */ - @SuppressWarnings("unchecked") final TreeNode getTreeNode - (int h, RubyObject k, TreeNode p) { - RubyClass c = k.getMetaClass(); boolean kNotComparable = !k.respondsTo("<=>"); - while (p != null) { - int dir, ph; RubyObject pk; RubyClass pc; - if ((ph = p.hash) == h) { - if ((pk = (RubyObject)p.key) == k || k.equals(pk)) - return p; - if (c != (pc = (RubyClass)pk.getMetaClass()) || - kNotComparable || - (dir = rubyCompare(k, pk)) == 0) { - dir = (c == pc) ? 0 : c.getName().compareTo(pc.getName()); - if (dir == 0) { // if still stuck, need to check both sides - TreeNode r = null, pl, pr; - // try to recurse on the right - if ((pr = p.right) != null && h >= pr.hash && (r = getTreeNode(h, k, pr)) != null) - return r; - // try to continue iterating on the left side - else if ((pl = p.left) != null && h <= pl.hash) - dir = -1; - else // no matching node found - return null; - } - } - } - else - dir = (h < ph) ? -1 : 1; - p = (dir > 0) ? p.right : p.left; - } - return null; - } - - int rubyCompare(RubyObject l, RubyObject r) { - ThreadContext context = l.getMetaClass().getRuntime().getCurrentContext(); - IRubyObject result; - try { - result = l.callMethod(context, "<=>", r); - } catch (RaiseException e) { - // handle objects "lying" about responding to <=>, ie: an Array containing non-comparable keys - if (context.runtime.getNoMethodError().isInstance(e.getException())) { - return 0; - } - throw e; - } - - return result.isNil() ? 0 : RubyNumeric.num2int(result.convertToInteger()); - } - - /** - * Wrapper for getTreeNode used by CHM.get. Tries to obtain - * read-lock to call getTreeNode, but during failure to get - * lock, searches along next links. - */ - final Object getValue(int h, Object k) { - Node r = null; - int c = getState(); // Must read lock state first - for (Node e = first; e != null; e = e.next) { - if (c <= 0 && compareAndSetState(c, c - 1)) { - try { - r = getTreeNode(h, k, root); - } finally { - releaseShared(0); - } - break; - } - else if ((e.hash & HASH_BITS) == h && k.equals(e.key)) { - r = e; - break; - } - else - c = getState(); - } - return r == null ? null : r.val; - } - - @SuppressWarnings("unchecked") final TreeNode putTreeNode - (int h, Object k, Object v) { - return putTreeNode(h, (RubyObject)k, v); - } - - /** - * Finds or adds a node. - * @return null if added - */ - @SuppressWarnings("unchecked") final TreeNode putTreeNode - (int h, RubyObject k, Object v) { - RubyClass c = k.getMetaClass(); - boolean kNotComparable = !k.respondsTo("<=>"); - TreeNode pp = root, p = null; - int dir = 0; - while (pp != null) { // find existing node or leaf to insert at - int ph; RubyObject pk; RubyClass pc; - p = pp; - if ((ph = p.hash) == h) { - if ((pk = (RubyObject)p.key) == k || k.equals(pk)) - return p; - if (c != (pc = pk.getMetaClass()) || - kNotComparable || - (dir = rubyCompare(k, pk)) == 0) { - dir = (c == pc) ? 0 : c.getName().compareTo(pc.getName()); - if (dir == 0) { // if still stuck, need to check both sides - TreeNode r = null, pr; - // try to recurse on the right - if ((pr = p.right) != null && h >= pr.hash && (r = getTreeNode(h, k, pr)) != null) - return r; - else // continue descending down the left subtree - dir = -1; - } - } - } - else - dir = (h < ph) ? -1 : 1; - pp = (dir > 0) ? p.right : p.left; - } - - TreeNode f = first; - TreeNode x = first = new TreeNode(h, (Object)k, v, f, p); - if (p == null) - root = x; - else { // attach and rebalance; adapted from CLR - TreeNode xp, xpp; - if (f != null) - f.prev = x; - if (dir <= 0) - p.left = x; - else - p.right = x; - x.red = true; - while (x != null && (xp = x.parent) != null && xp.red && - (xpp = xp.parent) != null) { - TreeNode xppl = xpp.left; - if (xp == xppl) { - TreeNode y = xpp.right; - if (y != null && y.red) { - y.red = false; - xp.red = false; - xpp.red = true; - x = xpp; - } - else { - if (x == xp.right) { - rotateLeft(x = xp); - xpp = (xp = x.parent) == null ? null : xp.parent; - } - if (xp != null) { - xp.red = false; - if (xpp != null) { - xpp.red = true; - rotateRight(xpp); - } - } - } - } - else { - TreeNode y = xppl; - if (y != null && y.red) { - y.red = false; - xp.red = false; - xpp.red = true; - x = xpp; - } - else { - if (x == xp.left) { - rotateRight(x = xp); - xpp = (xp = x.parent) == null ? null : xp.parent; - } - if (xp != null) { - xp.red = false; - if (xpp != null) { - xpp.red = true; - rotateLeft(xpp); - } - } - } - } - } - TreeNode r = root; - if (r != null && r.red) - r.red = false; - } - return null; - } - - /** - * Removes the given node, that must be present before this - * call. This is messier than typical red-black deletion code - * because we cannot swap the contents of an interior node - * with a leaf successor that is pinned by "next" pointers - * that are accessible independently of lock. So instead we - * swap the tree linkages. - */ - final void deleteTreeNode(TreeNode p) { - TreeNode next = (TreeNode)p.next; // unlink traversal pointers - TreeNode pred = p.prev; - if (pred == null) - first = next; - else - pred.next = next; - if (next != null) - next.prev = pred; - TreeNode replacement; - TreeNode pl = p.left; - TreeNode pr = p.right; - if (pl != null && pr != null) { - TreeNode s = pr, sl; - while ((sl = s.left) != null) // find successor - s = sl; - boolean c = s.red; s.red = p.red; p.red = c; // swap colors - TreeNode sr = s.right; - TreeNode pp = p.parent; - if (s == pr) { // p was s's direct parent - p.parent = s; - s.right = p; - } - else { - TreeNode sp = s.parent; - if ((p.parent = sp) != null) { - if (s == sp.left) - sp.left = p; - else - sp.right = p; - } - if ((s.right = pr) != null) - pr.parent = s; - } - p.left = null; - if ((p.right = sr) != null) - sr.parent = p; - if ((s.left = pl) != null) - pl.parent = s; - if ((s.parent = pp) == null) - root = s; - else if (p == pp.left) - pp.left = s; - else - pp.right = s; - replacement = sr; - } - else - replacement = (pl != null) ? pl : pr; - TreeNode pp = p.parent; - if (replacement == null) { - if (pp == null) { - root = null; - return; - } - replacement = p; - } - else { - replacement.parent = pp; - if (pp == null) - root = replacement; - else if (p == pp.left) - pp.left = replacement; - else - pp.right = replacement; - p.left = p.right = p.parent = null; - } - if (!p.red) { // rebalance, from CLR - TreeNode x = replacement; - while (x != null) { - TreeNode xp, xpl; - if (x.red || (xp = x.parent) == null) { - x.red = false; - break; - } - if (x == (xpl = xp.left)) { - TreeNode sib = xp.right; - if (sib != null && sib.red) { - sib.red = false; - xp.red = true; - rotateLeft(xp); - sib = (xp = x.parent) == null ? null : xp.right; - } - if (sib == null) - x = xp; - else { - TreeNode sl = sib.left, sr = sib.right; - if ((sr == null || !sr.red) && - (sl == null || !sl.red)) { - sib.red = true; - x = xp; - } - else { - if (sr == null || !sr.red) { - if (sl != null) - sl.red = false; - sib.red = true; - rotateRight(sib); - sib = (xp = x.parent) == null ? null : xp.right; - } - if (sib != null) { - sib.red = (xp == null) ? false : xp.red; - if ((sr = sib.right) != null) - sr.red = false; - } - if (xp != null) { - xp.red = false; - rotateLeft(xp); - } - x = root; - } - } - } - else { // symmetric - TreeNode sib = xpl; - if (sib != null && sib.red) { - sib.red = false; - xp.red = true; - rotateRight(xp); - sib = (xp = x.parent) == null ? null : xp.left; - } - if (sib == null) - x = xp; - else { - TreeNode sl = sib.left, sr = sib.right; - if ((sl == null || !sl.red) && - (sr == null || !sr.red)) { - sib.red = true; - x = xp; - } - else { - if (sl == null || !sl.red) { - if (sr != null) - sr.red = false; - sib.red = true; - rotateLeft(sib); - sib = (xp = x.parent) == null ? null : xp.left; - } - if (sib != null) { - sib.red = (xp == null) ? false : xp.red; - if ((sl = sib.left) != null) - sl.red = false; - } - if (xp != null) { - xp.red = false; - rotateRight(xp); - } - x = root; - } - } - } - } - } - if (p == replacement && (pp = p.parent) != null) { - if (p == pp.left) // detach pointers - pp.left = null; - else if (p == pp.right) - pp.right = null; - p.parent = null; - } - } - } - - /* ---------------- Collision reduction methods -------------- */ - - /** - * Spreads higher bits to lower, and also forces top 2 bits to 0. - * Because the table uses power-of-two masking, sets of hashes - * that vary only in bits above the current mask will always - * collide. (Among known examples are sets of Float keys holding - * consecutive whole numbers in small tables.) To counter this, - * we apply a transform that spreads the impact of higher bits - * downward. There is a tradeoff between speed, utility, and - * quality of bit-spreading. Because many common sets of hashes - * are already reasonably distributed across bits (so don't benefit - * from spreading), and because we use trees to handle large sets - * of collisions in bins, we don't need excessively high quality. - */ - private static final int spread(int h) { - h ^= (h >>> 18) ^ (h >>> 12); - return (h ^ (h >>> 10)) & HASH_BITS; - } - - /** - * Replaces a list bin with a tree bin. Call only when locked. - * Fails to replace if the given key is non-comparable or table - * is, or needs, resizing. - */ - private final void replaceWithTreeBin(AtomicReferenceArray tab, int index, Object key) { - if ((key instanceof Comparable) && - (tab.length() >= MAXIMUM_CAPACITY || counter.sum() < (long)sizeCtl)) { - TreeBin t = new TreeBin(); - for (Node e = tabAt(tab, index); e != null; e = e.next) - t.putTreeNode(e.hash & HASH_BITS, e.key, e.val); - setTabAt(tab, index, new Node(MOVED, t, null, null)); - } - } - - /* ---------------- Internal access and update methods -------------- */ - - /** Implementation for get and containsKey */ - private final Object internalGet(Object k) { - int h = spread(k.hashCode()); - retry: for (AtomicReferenceArray tab = table; tab != null;) { - Node e, p; Object ek, ev; int eh; // locals to read fields once - for (e = tabAt(tab, (tab.length() - 1) & h); e != null; e = e.next) { - if ((eh = e.hash) == MOVED) { - if ((ek = e.key) instanceof TreeBin) // search TreeBin - return ((TreeBin)ek).getValue(h, k); - else { // restart with new table - tab = (AtomicReferenceArray)ek; - continue retry; - } - } - else if ((eh & HASH_BITS) == h && (ev = e.val) != null && - ((ek = e.key) == k || k.equals(ek))) - return ev; - } - break; - } - return null; - } - - /** - * Implementation for the four public remove/replace methods: - * Replaces node value with v, conditional upon match of cv if - * non-null. If resulting value is null, delete. - */ - private final Object internalReplace(Object k, Object v, Object cv) { - int h = spread(k.hashCode()); - Object oldVal = null; - for (AtomicReferenceArray tab = table;;) { - Node f; int i, fh; Object fk; - if (tab == null || - (f = tabAt(tab, i = (tab.length() - 1) & h)) == null) - break; - else if ((fh = f.hash) == MOVED) { - if ((fk = f.key) instanceof TreeBin) { - TreeBin t = (TreeBin)fk; - boolean validated = false; - boolean deleted = false; - t.acquire(0); - try { - if (tabAt(tab, i) == f) { - validated = true; - TreeNode p = t.getTreeNode(h, k, t.root); - if (p != null) { - Object pv = p.val; - if (cv == null || cv == pv || cv.equals(pv)) { - oldVal = pv; - if ((p.val = v) == null) { - deleted = true; - t.deleteTreeNode(p); - } - } - } - } - } finally { - t.release(0); - } - if (validated) { - if (deleted) - counter.add(-1L); - break; - } - } - else - tab = (AtomicReferenceArray)fk; - } - else if ((fh & HASH_BITS) != h && f.next == null) // precheck - break; // rules out possible existence - else if ((fh & LOCKED) != 0) { - checkForResize(); // try resizing if can't get lock - f.tryAwaitLock(tab, i); - } - else if (f.casHash(fh, fh | LOCKED)) { - boolean validated = false; - boolean deleted = false; - try { - if (tabAt(tab, i) == f) { - validated = true; - for (Node e = f, pred = null;;) { - Object ek, ev; - if ((e.hash & HASH_BITS) == h && - ((ev = e.val) != null) && - ((ek = e.key) == k || k.equals(ek))) { - if (cv == null || cv == ev || cv.equals(ev)) { - oldVal = ev; - if ((e.val = v) == null) { - deleted = true; - Node en = e.next; - if (pred != null) - pred.next = en; - else - setTabAt(tab, i, en); - } - } - break; - } - pred = e; - if ((e = e.next) == null) - break; - } - } - } finally { - if (!f.casHash(fh | LOCKED, fh)) { - f.hash = fh; - synchronized (f) { f.notifyAll(); }; - } - } - if (validated) { - if (deleted) - counter.add(-1L); - break; - } - } - } - return oldVal; - } - - /* - * Internal versions of the six insertion methods, each a - * little more complicated than the last. All have - * the same basic structure as the first (internalPut): - * 1. If table uninitialized, create - * 2. If bin empty, try to CAS new node - * 3. If bin stale, use new table - * 4. if bin converted to TreeBin, validate and relay to TreeBin methods - * 5. Lock and validate; if valid, scan and add or update - * - * The others interweave other checks and/or alternative actions: - * * Plain put checks for and performs resize after insertion. - * * putIfAbsent prescans for mapping without lock (and fails to add - * if present), which also makes pre-emptive resize checks worthwhile. - * * computeIfAbsent extends form used in putIfAbsent with additional - * mechanics to deal with, calls, potential exceptions and null - * returns from function call. - * * compute uses the same function-call mechanics, but without - * the prescans - * * merge acts as putIfAbsent in the absent case, but invokes the - * update function if present - * * putAll attempts to pre-allocate enough table space - * and more lazily performs count updates and checks. - * - * Someday when details settle down a bit more, it might be worth - * some factoring to reduce sprawl. - */ - - /** Implementation for put */ - private final Object internalPut(Object k, Object v) { - int h = spread(k.hashCode()); - int count = 0; - for (AtomicReferenceArray tab = table;;) { - int i; Node f; int fh; Object fk; - if (tab == null) - tab = initTable(); - else if ((f = tabAt(tab, i = (tab.length() - 1) & h)) == null) { - if (casTabAt(tab, i, null, new Node(h, k, v, null))) - break; // no lock when adding to empty bin - } - else if ((fh = f.hash) == MOVED) { - if ((fk = f.key) instanceof TreeBin) { - TreeBin t = (TreeBin)fk; - Object oldVal = null; - t.acquire(0); - try { - if (tabAt(tab, i) == f) { - count = 2; - TreeNode p = t.putTreeNode(h, k, v); - if (p != null) { - oldVal = p.val; - p.val = v; - } - } - } finally { - t.release(0); - } - if (count != 0) { - if (oldVal != null) - return oldVal; - break; - } - } - else - tab = (AtomicReferenceArray)fk; - } - else if ((fh & LOCKED) != 0) { - checkForResize(); - f.tryAwaitLock(tab, i); - } - else if (f.casHash(fh, fh | LOCKED)) { - Object oldVal = null; - try { // needed in case equals() throws - if (tabAt(tab, i) == f) { - count = 1; - for (Node e = f;; ++count) { - Object ek, ev; - if ((e.hash & HASH_BITS) == h && - (ev = e.val) != null && - ((ek = e.key) == k || k.equals(ek))) { - oldVal = ev; - e.val = v; - break; - } - Node last = e; - if ((e = e.next) == null) { - last.next = new Node(h, k, v, null); - if (count >= TREE_THRESHOLD) - replaceWithTreeBin(tab, i, k); - break; - } - } - } - } finally { // unlock and signal if needed - if (!f.casHash(fh | LOCKED, fh)) { - f.hash = fh; - synchronized (f) { f.notifyAll(); }; - } - } - if (count != 0) { - if (oldVal != null) - return oldVal; - if (tab.length() <= 64) - count = 2; - break; - } - } - } - counter.add(1L); - if (count > 1) - checkForResize(); - return null; - } - - /** Implementation for putIfAbsent */ - private final Object internalPutIfAbsent(Object k, Object v) { - int h = spread(k.hashCode()); - int count = 0; - for (AtomicReferenceArray tab = table;;) { - int i; Node f; int fh; Object fk, fv; - if (tab == null) - tab = initTable(); - else if ((f = tabAt(tab, i = (tab.length() - 1) & h)) == null) { - if (casTabAt(tab, i, null, new Node(h, k, v, null))) - break; - } - else if ((fh = f.hash) == MOVED) { - if ((fk = f.key) instanceof TreeBin) { - TreeBin t = (TreeBin)fk; - Object oldVal = null; - t.acquire(0); - try { - if (tabAt(tab, i) == f) { - count = 2; - TreeNode p = t.putTreeNode(h, k, v); - if (p != null) - oldVal = p.val; - } - } finally { - t.release(0); - } - if (count != 0) { - if (oldVal != null) - return oldVal; - break; - } - } - else - tab = (AtomicReferenceArray)fk; - } - else if ((fh & HASH_BITS) == h && (fv = f.val) != null && - ((fk = f.key) == k || k.equals(fk))) - return fv; - else { - Node g = f.next; - if (g != null) { // at least 2 nodes -- search and maybe resize - for (Node e = g;;) { - Object ek, ev; - if ((e.hash & HASH_BITS) == h && (ev = e.val) != null && - ((ek = e.key) == k || k.equals(ek))) - return ev; - if ((e = e.next) == null) { - checkForResize(); - break; - } - } - } - if (((fh = f.hash) & LOCKED) != 0) { - checkForResize(); - f.tryAwaitLock(tab, i); - } - else if (tabAt(tab, i) == f && f.casHash(fh, fh | LOCKED)) { - Object oldVal = null; - try { - if (tabAt(tab, i) == f) { - count = 1; - for (Node e = f;; ++count) { - Object ek, ev; - if ((e.hash & HASH_BITS) == h && - (ev = e.val) != null && - ((ek = e.key) == k || k.equals(ek))) { - oldVal = ev; - break; - } - Node last = e; - if ((e = e.next) == null) { - last.next = new Node(h, k, v, null); - if (count >= TREE_THRESHOLD) - replaceWithTreeBin(tab, i, k); - break; - } - } - } - } finally { - if (!f.casHash(fh | LOCKED, fh)) { - f.hash = fh; - synchronized (f) { f.notifyAll(); }; - } - } - if (count != 0) { - if (oldVal != null) - return oldVal; - if (tab.length() <= 64) - count = 2; - break; - } - } - } - } - counter.add(1L); - if (count > 1) - checkForResize(); - return null; - } - - /** Implementation for computeIfAbsent */ - private final Object internalComputeIfAbsent(K k, - Fun mf) { - int h = spread(k.hashCode()); - Object val = null; - int count = 0; - for (AtomicReferenceArray tab = table;;) { - Node f; int i, fh; Object fk, fv; - if (tab == null) - tab = initTable(); - else if ((f = tabAt(tab, i = (tab.length() - 1) & h)) == null) { - Node node = new Node(fh = h | LOCKED, k, null, null); - if (casTabAt(tab, i, null, node)) { - count = 1; - try { - if ((val = mf.apply(k)) != null) - node.val = val; - } finally { - if (val == null) - setTabAt(tab, i, null); - if (!node.casHash(fh, h)) { - node.hash = h; - synchronized (node) { node.notifyAll(); }; - } - } - } - if (count != 0) - break; - } - else if ((fh = f.hash) == MOVED) { - if ((fk = f.key) instanceof TreeBin) { - TreeBin t = (TreeBin)fk; - boolean added = false; - t.acquire(0); - try { - if (tabAt(tab, i) == f) { - count = 1; - TreeNode p = t.getTreeNode(h, k, t.root); - if (p != null) - val = p.val; - else if ((val = mf.apply(k)) != null) { - added = true; - count = 2; - t.putTreeNode(h, k, val); - } - } - } finally { - t.release(0); - } - if (count != 0) { - if (!added) - return val; - break; - } - } - else - tab = (AtomicReferenceArray)fk; - } - else if ((fh & HASH_BITS) == h && (fv = f.val) != null && - ((fk = f.key) == k || k.equals(fk))) - return fv; - else { - Node g = f.next; - if (g != null) { - for (Node e = g;;) { - Object ek, ev; - if ((e.hash & HASH_BITS) == h && (ev = e.val) != null && - ((ek = e.key) == k || k.equals(ek))) - return ev; - if ((e = e.next) == null) { - checkForResize(); - break; - } - } - } - if (((fh = f.hash) & LOCKED) != 0) { - checkForResize(); - f.tryAwaitLock(tab, i); - } - else if (tabAt(tab, i) == f && f.casHash(fh, fh | LOCKED)) { - boolean added = false; - try { - if (tabAt(tab, i) == f) { - count = 1; - for (Node e = f;; ++count) { - Object ek, ev; - if ((e.hash & HASH_BITS) == h && - (ev = e.val) != null && - ((ek = e.key) == k || k.equals(ek))) { - val = ev; - break; - } - Node last = e; - if ((e = e.next) == null) { - if ((val = mf.apply(k)) != null) { - added = true; - last.next = new Node(h, k, val, null); - if (count >= TREE_THRESHOLD) - replaceWithTreeBin(tab, i, k); - } - break; - } - } - } - } finally { - if (!f.casHash(fh | LOCKED, fh)) { - f.hash = fh; - synchronized (f) { f.notifyAll(); }; - } - } - if (count != 0) { - if (!added) - return val; - if (tab.length() <= 64) - count = 2; - break; - } - } - } - } - if (val != null) { - counter.add(1L); - if (count > 1) - checkForResize(); - } - return val; - } - - /** Implementation for compute */ - @SuppressWarnings("unchecked") private final Object internalCompute - (K k, boolean onlyIfPresent, BiFun mf) { - int h = spread(k.hashCode()); - Object val = null; - int delta = 0; - int count = 0; - for (AtomicReferenceArray tab = table;;) { - Node f; int i, fh; Object fk; - if (tab == null) - tab = initTable(); - else if ((f = tabAt(tab, i = (tab.length() - 1) & h)) == null) { - if (onlyIfPresent) - break; - Node node = new Node(fh = h | LOCKED, k, null, null); - if (casTabAt(tab, i, null, node)) { - try { - count = 1; - if ((val = mf.apply(k, null)) != null) { - node.val = val; - delta = 1; - } - } finally { - if (delta == 0) - setTabAt(tab, i, null); - if (!node.casHash(fh, h)) { - node.hash = h; - synchronized (node) { node.notifyAll(); }; - } - } - } - if (count != 0) - break; - } - else if ((fh = f.hash) == MOVED) { - if ((fk = f.key) instanceof TreeBin) { - TreeBin t = (TreeBin)fk; - t.acquire(0); - try { - if (tabAt(tab, i) == f) { - count = 1; - TreeNode p = t.getTreeNode(h, k, t.root); - Object pv; - if (p == null) { - if (onlyIfPresent) - break; - pv = null; - } else - pv = p.val; - if ((val = mf.apply(k, (V)pv)) != null) { - if (p != null) - p.val = val; - else { - count = 2; - delta = 1; - t.putTreeNode(h, k, val); - } - } - else if (p != null) { - delta = -1; - t.deleteTreeNode(p); - } - } - } finally { - t.release(0); - } - if (count != 0) - break; - } - else - tab = (AtomicReferenceArray)fk; - } - else if ((fh & LOCKED) != 0) { - checkForResize(); - f.tryAwaitLock(tab, i); - } - else if (f.casHash(fh, fh | LOCKED)) { - try { - if (tabAt(tab, i) == f) { - count = 1; - for (Node e = f, pred = null;; ++count) { - Object ek, ev; - if ((e.hash & HASH_BITS) == h && - (ev = e.val) != null && - ((ek = e.key) == k || k.equals(ek))) { - val = mf.apply(k, (V)ev); - if (val != null) - e.val = val; - else { - delta = -1; - Node en = e.next; - if (pred != null) - pred.next = en; - else - setTabAt(tab, i, en); - } - break; - } - pred = e; - if ((e = e.next) == null) { - if (!onlyIfPresent && (val = mf.apply(k, null)) != null) { - pred.next = new Node(h, k, val, null); - delta = 1; - if (count >= TREE_THRESHOLD) - replaceWithTreeBin(tab, i, k); - } - break; - } - } - } - } finally { - if (!f.casHash(fh | LOCKED, fh)) { - f.hash = fh; - synchronized (f) { f.notifyAll(); }; - } - } - if (count != 0) { - if (tab.length() <= 64) - count = 2; - break; - } - } - } - if (delta != 0) { - counter.add((long)delta); - if (count > 1) - checkForResize(); - } - return val; - } - - /** Implementation for merge */ - @SuppressWarnings("unchecked") private final Object internalMerge - (K k, V v, BiFun mf) { - int h = spread(k.hashCode()); - Object val = null; - int delta = 0; - int count = 0; - for (AtomicReferenceArray tab = table;;) { - int i; Node f; int fh; Object fk, fv; - if (tab == null) - tab = initTable(); - else if ((f = tabAt(tab, i = (tab.length() - 1) & h)) == null) { - if (casTabAt(tab, i, null, new Node(h, k, v, null))) { - delta = 1; - val = v; - break; - } - } - else if ((fh = f.hash) == MOVED) { - if ((fk = f.key) instanceof TreeBin) { - TreeBin t = (TreeBin)fk; - t.acquire(0); - try { - if (tabAt(tab, i) == f) { - count = 1; - TreeNode p = t.getTreeNode(h, k, t.root); - val = (p == null) ? v : mf.apply((V)p.val, v); - if (val != null) { - if (p != null) - p.val = val; - else { - count = 2; - delta = 1; - t.putTreeNode(h, k, val); - } - } - else if (p != null) { - delta = -1; - t.deleteTreeNode(p); - } - } - } finally { - t.release(0); - } - if (count != 0) - break; - } - else - tab = (AtomicReferenceArray)fk; - } - else if ((fh & LOCKED) != 0) { - checkForResize(); - f.tryAwaitLock(tab, i); - } - else if (f.casHash(fh, fh | LOCKED)) { - try { - if (tabAt(tab, i) == f) { - count = 1; - for (Node e = f, pred = null;; ++count) { - Object ek, ev; - if ((e.hash & HASH_BITS) == h && - (ev = e.val) != null && - ((ek = e.key) == k || k.equals(ek))) { - val = mf.apply((V)ev, v); - if (val != null) - e.val = val; - else { - delta = -1; - Node en = e.next; - if (pred != null) - pred.next = en; - else - setTabAt(tab, i, en); - } - break; - } - pred = e; - if ((e = e.next) == null) { - val = v; - pred.next = new Node(h, k, val, null); - delta = 1; - if (count >= TREE_THRESHOLD) - replaceWithTreeBin(tab, i, k); - break; - } - } - } - } finally { - if (!f.casHash(fh | LOCKED, fh)) { - f.hash = fh; - synchronized (f) { f.notifyAll(); }; - } - } - if (count != 0) { - if (tab.length() <= 64) - count = 2; - break; - } - } - } - if (delta != 0) { - counter.add((long)delta); - if (count > 1) - checkForResize(); - } - return val; - } - - /** Implementation for putAll */ - private final void internalPutAll(Map m) { - tryPresize(m.size()); - long delta = 0L; // number of uncommitted additions - boolean npe = false; // to throw exception on exit for nulls - try { // to clean up counts on other exceptions - for (Map.Entry entry : m.entrySet()) { - Object k, v; - if (entry == null || (k = entry.getKey()) == null || - (v = entry.getValue()) == null) { - npe = true; - break; - } - int h = spread(k.hashCode()); - for (AtomicReferenceArray tab = table;;) { - int i; Node f; int fh; Object fk; - if (tab == null) - tab = initTable(); - else if ((f = tabAt(tab, i = (tab.length() - 1) & h)) == null){ - if (casTabAt(tab, i, null, new Node(h, k, v, null))) { - ++delta; - break; - } - } - else if ((fh = f.hash) == MOVED) { - if ((fk = f.key) instanceof TreeBin) { - TreeBin t = (TreeBin)fk; - boolean validated = false; - t.acquire(0); - try { - if (tabAt(tab, i) == f) { - validated = true; - TreeNode p = t.getTreeNode(h, k, t.root); - if (p != null) - p.val = v; - else { - t.putTreeNode(h, k, v); - ++delta; - } - } - } finally { - t.release(0); - } - if (validated) - break; - } - else - tab = (AtomicReferenceArray)fk; - } - else if ((fh & LOCKED) != 0) { - counter.add(delta); - delta = 0L; - checkForResize(); - f.tryAwaitLock(tab, i); - } - else if (f.casHash(fh, fh | LOCKED)) { - int count = 0; - try { - if (tabAt(tab, i) == f) { - count = 1; - for (Node e = f;; ++count) { - Object ek, ev; - if ((e.hash & HASH_BITS) == h && - (ev = e.val) != null && - ((ek = e.key) == k || k.equals(ek))) { - e.val = v; - break; - } - Node last = e; - if ((e = e.next) == null) { - ++delta; - last.next = new Node(h, k, v, null); - if (count >= TREE_THRESHOLD) - replaceWithTreeBin(tab, i, k); - break; - } - } - } - } finally { - if (!f.casHash(fh | LOCKED, fh)) { - f.hash = fh; - synchronized (f) { f.notifyAll(); }; - } - } - if (count != 0) { - if (count > 1) { - counter.add(delta); - delta = 0L; - checkForResize(); - } - break; - } - } - } - } - } finally { - if (delta != 0) - counter.add(delta); - } - if (npe) - throw new NullPointerException(); - } - - /* ---------------- Table Initialization and Resizing -------------- */ - - /** - * Returns a power of two table size for the given desired capacity. - * See Hackers Delight, sec 3.2 - */ - private static final int tableSizeFor(int c) { - int n = c - 1; - n |= n >>> 1; - n |= n >>> 2; - n |= n >>> 4; - n |= n >>> 8; - n |= n >>> 16; - return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1; - } - - /** - * Initializes table, using the size recorded in sizeCtl. - */ - private final AtomicReferenceArray initTable() { - AtomicReferenceArray tab; int sc; - while ((tab = table) == null) { - if ((sc = sizeCtl) < 0) - Thread.yield(); // lost initialization race; just spin - else if (SIZE_CTRL_UPDATER.compareAndSet(this, sc, -1)) { - try { - if ((tab = table) == null) { - int n = (sc > 0) ? sc : DEFAULT_CAPACITY; - tab = table = new AtomicReferenceArray(n); - sc = n - (n >>> 2); - } - } finally { - sizeCtl = sc; - } - break; - } - } - return tab; - } - - /** - * If table is too small and not already resizing, creates next - * table and transfers bins. Rechecks occupancy after a transfer - * to see if another resize is already needed because resizings - * are lagging additions. - */ - private final void checkForResize() { - AtomicReferenceArray tab; int n, sc; - while ((tab = table) != null && - (n = tab.length()) < MAXIMUM_CAPACITY && - (sc = sizeCtl) >= 0 && counter.sum() >= (long)sc && - SIZE_CTRL_UPDATER.compareAndSet(this, sc, -1)) { - try { - if (tab == table) { - table = rebuild(tab); - sc = (n << 1) - (n >>> 1); - } - } finally { - sizeCtl = sc; - } - } - } - - /** - * Tries to presize table to accommodate the given number of elements. - * - * @param size number of elements (doesn't need to be perfectly accurate) - */ - private final void tryPresize(int size) { - int c = (size >= (MAXIMUM_CAPACITY >>> 1)) ? MAXIMUM_CAPACITY : - tableSizeFor(size + (size >>> 1) + 1); - int sc; - while ((sc = sizeCtl) >= 0) { - AtomicReferenceArray tab = table; int n; - if (tab == null || (n = tab.length()) == 0) { - n = (sc > c) ? sc : c; - if (SIZE_CTRL_UPDATER.compareAndSet(this, sc, -1)) { - try { - if (table == tab) { - table = new AtomicReferenceArray(n); - sc = n - (n >>> 2); - } - } finally { - sizeCtl = sc; - } - } - } - else if (c <= sc || n >= MAXIMUM_CAPACITY) - break; - else if (SIZE_CTRL_UPDATER.compareAndSet(this, sc, -1)) { - try { - if (table == tab) { - table = rebuild(tab); - sc = (n << 1) - (n >>> 1); - } - } finally { - sizeCtl = sc; - } - } - } - } - - /* - * Moves and/or copies the nodes in each bin to new table. See - * above for explanation. - * - * @return the new table - */ - private static final AtomicReferenceArray rebuild(AtomicReferenceArray tab) { - int n = tab.length(); - AtomicReferenceArray nextTab = new AtomicReferenceArray(n << 1); - Node fwd = new Node(MOVED, nextTab, null, null); - int[] buffer = null; // holds bins to revisit; null until needed - Node rev = null; // reverse forwarder; null until needed - int nbuffered = 0; // the number of bins in buffer list - int bufferIndex = 0; // buffer index of current buffered bin - int bin = n - 1; // current non-buffered bin or -1 if none - - for (int i = bin;;) { // start upwards sweep - int fh; Node f; - if ((f = tabAt(tab, i)) == null) { - if (bin >= 0) { // Unbuffered; no lock needed (or available) - if (!casTabAt(tab, i, f, fwd)) - continue; - } - else { // transiently use a locked forwarding node - Node g = new Node(MOVED|LOCKED, nextTab, null, null); - if (!casTabAt(tab, i, f, g)) - continue; - setTabAt(nextTab, i, null); - setTabAt(nextTab, i + n, null); - setTabAt(tab, i, fwd); - if (!g.casHash(MOVED|LOCKED, MOVED)) { - g.hash = MOVED; - synchronized (g) { g.notifyAll(); } - } - } - } - else if ((fh = f.hash) == MOVED) { - Object fk = f.key; - if (fk instanceof TreeBin) { - TreeBin t = (TreeBin)fk; - boolean validated = false; - t.acquire(0); - try { - if (tabAt(tab, i) == f) { - validated = true; - splitTreeBin(nextTab, i, t); - setTabAt(tab, i, fwd); - } - } finally { - t.release(0); - } - if (!validated) - continue; - } - } - else if ((fh & LOCKED) == 0 && f.casHash(fh, fh|LOCKED)) { - boolean validated = false; - try { // split to lo and hi lists; copying as needed - if (tabAt(tab, i) == f) { - validated = true; - splitBin(nextTab, i, f); - setTabAt(tab, i, fwd); - } - } finally { - if (!f.casHash(fh | LOCKED, fh)) { - f.hash = fh; - synchronized (f) { f.notifyAll(); }; - } - } - if (!validated) - continue; - } - else { - if (buffer == null) // initialize buffer for revisits - buffer = new int[TRANSFER_BUFFER_SIZE]; - if (bin < 0 && bufferIndex > 0) { - int j = buffer[--bufferIndex]; - buffer[bufferIndex] = i; - i = j; // swap with another bin - continue; - } - if (bin < 0 || nbuffered >= TRANSFER_BUFFER_SIZE) { - f.tryAwaitLock(tab, i); - continue; // no other options -- block - } - if (rev == null) // initialize reverse-forwarder - rev = new Node(MOVED, tab, null, null); - if (tabAt(tab, i) != f || (f.hash & LOCKED) == 0) - continue; // recheck before adding to list - buffer[nbuffered++] = i; - setTabAt(nextTab, i, rev); // install place-holders - setTabAt(nextTab, i + n, rev); - } - - if (bin > 0) - i = --bin; - else if (buffer != null && nbuffered > 0) { - bin = -1; - i = buffer[bufferIndex = --nbuffered]; - } - else - return nextTab; - } - } - - /** - * Splits a normal bin with list headed by e into lo and hi parts; - * installs in given table. - */ - private static void splitBin(AtomicReferenceArray nextTab, int i, Node e) { - int bit = nextTab.length() >>> 1; // bit to split on - int runBit = e.hash & bit; - Node lastRun = e, lo = null, hi = null; - for (Node p = e.next; p != null; p = p.next) { - int b = p.hash & bit; - if (b != runBit) { - runBit = b; - lastRun = p; - } - } - if (runBit == 0) - lo = lastRun; - else - hi = lastRun; - for (Node p = e; p != lastRun; p = p.next) { - int ph = p.hash & HASH_BITS; - Object pk = p.key, pv = p.val; - if ((ph & bit) == 0) - lo = new Node(ph, pk, pv, lo); - else - hi = new Node(ph, pk, pv, hi); - } - setTabAt(nextTab, i, lo); - setTabAt(nextTab, i + bit, hi); - } - - /** - * Splits a tree bin into lo and hi parts; installs in given table. - */ - private static void splitTreeBin(AtomicReferenceArray nextTab, int i, TreeBin t) { - int bit = nextTab.length() >>> 1; - TreeBin lt = new TreeBin(); - TreeBin ht = new TreeBin(); - int lc = 0, hc = 0; - for (Node e = t.first; e != null; e = e.next) { - int h = e.hash & HASH_BITS; - Object k = e.key, v = e.val; - if ((h & bit) == 0) { - ++lc; - lt.putTreeNode(h, k, v); - } - else { - ++hc; - ht.putTreeNode(h, k, v); - } - } - Node ln, hn; // throw away trees if too small - if (lc <= (TREE_THRESHOLD >>> 1)) { - ln = null; - for (Node p = lt.first; p != null; p = p.next) - ln = new Node(p.hash, p.key, p.val, ln); - } - else - ln = new Node(MOVED, lt, null, null); - setTabAt(nextTab, i, ln); - if (hc <= (TREE_THRESHOLD >>> 1)) { - hn = null; - for (Node p = ht.first; p != null; p = p.next) - hn = new Node(p.hash, p.key, p.val, hn); - } - else - hn = new Node(MOVED, ht, null, null); - setTabAt(nextTab, i + bit, hn); - } - - /** - * Implementation for clear. Steps through each bin, removing all - * nodes. - */ - private final void internalClear() { - long delta = 0L; // negative number of deletions - int i = 0; - AtomicReferenceArray tab = table; - while (tab != null && i < tab.length()) { - int fh; Object fk; - Node f = tabAt(tab, i); - if (f == null) - ++i; - else if ((fh = f.hash) == MOVED) { - if ((fk = f.key) instanceof TreeBin) { - TreeBin t = (TreeBin)fk; - t.acquire(0); - try { - if (tabAt(tab, i) == f) { - for (Node p = t.first; p != null; p = p.next) { - if (p.val != null) { // (currently always true) - p.val = null; - --delta; - } - } - t.first = null; - t.root = null; - ++i; - } - } finally { - t.release(0); - } - } - else - tab = (AtomicReferenceArray)fk; - } - else if ((fh & LOCKED) != 0) { - counter.add(delta); // opportunistically update count - delta = 0L; - f.tryAwaitLock(tab, i); - } - else if (f.casHash(fh, fh | LOCKED)) { - try { - if (tabAt(tab, i) == f) { - for (Node e = f; e != null; e = e.next) { - if (e.val != null) { // (currently always true) - e.val = null; - --delta; - } - } - setTabAt(tab, i, null); - ++i; - } - } finally { - if (!f.casHash(fh | LOCKED, fh)) { - f.hash = fh; - synchronized (f) { f.notifyAll(); }; - } - } - } - } - if (delta != 0) - counter.add(delta); - } - - /* ----------------Table Traversal -------------- */ - - /** - * Encapsulates traversal for methods such as containsValue; also - * serves as a base class for other iterators and bulk tasks. - * - * At each step, the iterator snapshots the key ("nextKey") and - * value ("nextVal") of a valid node (i.e., one that, at point of - * snapshot, has a non-null user value). Because val fields can - * change (including to null, indicating deletion), field nextVal - * might not be accurate at point of use, but still maintains the - * weak consistency property of holding a value that was once - * valid. To support iterator.remove, the nextKey field is not - * updated (nulled out) when the iterator cannot advance. - * - * Internal traversals directly access these fields, as in: - * {@code while (it.advance() != null) { process(it.nextKey); }} - * - * Exported iterators must track whether the iterator has advanced - * (in hasNext vs next) (by setting/checking/nulling field - * nextVal), and then extract key, value, or key-value pairs as - * return values of next(). - * - * The iterator visits once each still-valid node that was - * reachable upon iterator construction. It might miss some that - * were added to a bin after the bin was visited, which is OK wrt - * consistency guarantees. Maintaining this property in the face - * of possible ongoing resizes requires a fair amount of - * bookkeeping state that is difficult to optimize away amidst - * volatile accesses. Even so, traversal maintains reasonable - * throughput. - * - * Normally, iteration proceeds bin-by-bin traversing lists. - * However, if the table has been resized, then all future steps - * must traverse both the bin at the current index as well as at - * (index + baseSize); and so on for further resizings. To - * paranoically cope with potential sharing by users of iterators - * across threads, iteration terminates if a bounds checks fails - * for a table read. - * - * This class extends ForkJoinTask to streamline parallel - * iteration in bulk operations (see BulkTask). This adds only an - * int of space overhead, which is close enough to negligible in - * cases where it is not needed to not worry about it. Because - * ForkJoinTask is Serializable, but iterators need not be, we - * need to add warning suppressions. - */ - @SuppressWarnings("serial") static class Traverser { - final ConcurrentHashMapV8 map; - Node next; // the next entry to use - K nextKey; // cached key field of next - V nextVal; // cached val field of next - AtomicReferenceArray tab; // current table; updated if resized - int index; // index of bin to use next - int baseIndex; // current index of initial table - int baseLimit; // index bound for initial table - int baseSize; // initial table size - - /** Creates iterator for all entries in the table. */ - Traverser(ConcurrentHashMapV8 map) { - this.map = map; - } - - /** Creates iterator for split() methods */ - Traverser(Traverser it) { - ConcurrentHashMapV8 m; AtomicReferenceArray t; - if ((m = this.map = it.map) == null) - t = null; - else if ((t = it.tab) == null && // force parent tab initialization - (t = it.tab = m.table) != null) - it.baseLimit = it.baseSize = t.length(); - this.tab = t; - this.baseSize = it.baseSize; - it.baseLimit = this.index = this.baseIndex = - ((this.baseLimit = it.baseLimit) + it.baseIndex + 1) >>> 1; - } - - /** - * Advances next; returns nextVal or null if terminated. - * See above for explanation. - */ - final V advance() { - Node e = next; - V ev = null; - outer: do { - if (e != null) // advance past used/skipped node - e = e.next; - while (e == null) { // get to next non-null bin - ConcurrentHashMapV8 m; - AtomicReferenceArray t; int b, i, n; Object ek; // checks must use locals - if ((t = tab) != null) - n = t.length(); - else if ((m = map) != null && (t = tab = m.table) != null) - n = baseLimit = baseSize = t.length(); - else - break outer; - if ((b = baseIndex) >= baseLimit || - (i = index) < 0 || i >= n) - break outer; - if ((e = tabAt(t, i)) != null && e.hash == MOVED) { - if ((ek = e.key) instanceof TreeBin) - e = ((TreeBin)ek).first; - else { - tab = (AtomicReferenceArray)ek; - continue; // restarts due to null val - } - } // visit upper slots if present - index = (i += baseSize) < n ? i : (baseIndex = b + 1); - } - nextKey = (K) e.key; - } while ((ev = (V) e.val) == null); // skip deleted or special nodes - next = e; - return nextVal = ev; - } - - public final void remove() { - Object k = nextKey; - if (k == null && (advance() == null || (k = nextKey) == null)) - throw new IllegalStateException(); - map.internalReplace(k, null, null); - } - - public final boolean hasNext() { - return nextVal != null || advance() != null; - } - - public final boolean hasMoreElements() { return hasNext(); } - public final void setRawResult(Object x) { } - public R getRawResult() { return null; } - public boolean exec() { return true; } - } - - /* ---------------- Public operations -------------- */ - - /** - * Creates a new, empty map with the default initial table size (16). - */ - public ConcurrentHashMapV8() { - this.counter = new LongAdder(); - } - - /** - * Creates a new, empty map with an initial table size - * accommodating the specified number of elements without the need - * to dynamically resize. - * - * @param initialCapacity The implementation performs internal - * sizing to accommodate this many elements. - * @throws IllegalArgumentException if the initial capacity of - * elements is negative - */ - public ConcurrentHashMapV8(int initialCapacity) { - if (initialCapacity < 0) - throw new IllegalArgumentException(); - int cap = ((initialCapacity >= (MAXIMUM_CAPACITY >>> 1)) ? - MAXIMUM_CAPACITY : - tableSizeFor(initialCapacity + (initialCapacity >>> 1) + 1)); - this.counter = new LongAdder(); - this.sizeCtl = cap; - } - - /** - * Creates a new map with the same mappings as the given map. - * - * @param m the map - */ - public ConcurrentHashMapV8(Map m) { - this.counter = new LongAdder(); - this.sizeCtl = DEFAULT_CAPACITY; - internalPutAll(m); - } - - /** - * Creates a new, empty map with an initial table size based on - * the given number of elements ({@code initialCapacity}) and - * initial table density ({@code loadFactor}). - * - * @param initialCapacity the initial capacity. The implementation - * performs internal sizing to accommodate this many elements, - * given the specified load factor. - * @param loadFactor the load factor (table density) for - * establishing the initial table size - * @throws IllegalArgumentException if the initial capacity of - * elements is negative or the load factor is nonpositive - * - * @since 1.6 - */ - public ConcurrentHashMapV8(int initialCapacity, float loadFactor) { - this(initialCapacity, loadFactor, 1); - } - - /** - * Creates a new, empty map with an initial table size based on - * the given number of elements ({@code initialCapacity}), table - * density ({@code loadFactor}), and number of concurrently - * updating threads ({@code concurrencyLevel}). - * - * @param initialCapacity the initial capacity. The implementation - * performs internal sizing to accommodate this many elements, - * given the specified load factor. - * @param loadFactor the load factor (table density) for - * establishing the initial table size - * @param concurrencyLevel the estimated number of concurrently - * updating threads. The implementation may use this value as - * a sizing hint. - * @throws IllegalArgumentException if the initial capacity is - * negative or the load factor or concurrencyLevel are - * nonpositive - */ - public ConcurrentHashMapV8(int initialCapacity, - float loadFactor, int concurrencyLevel) { - if (!(loadFactor > 0.0f) || initialCapacity < 0 || concurrencyLevel <= 0) - throw new IllegalArgumentException(); - if (initialCapacity < concurrencyLevel) // Use at least as many bins - initialCapacity = concurrencyLevel; // as estimated threads - long size = (long)(1.0 + (long)initialCapacity / loadFactor); - int cap = (size >= (long)MAXIMUM_CAPACITY) ? - MAXIMUM_CAPACITY : tableSizeFor((int)size); - this.counter = new LongAdder(); - this.sizeCtl = cap; - } - - /** - * Creates a new {@link Set} backed by a ConcurrentHashMapV8 - * from the given type to {@code Boolean.TRUE}. - * - * @return the new set - */ - public static KeySetView newKeySet() { - return new KeySetView(new ConcurrentHashMapV8(), - Boolean.TRUE); - } - - /** - * Creates a new {@link Set} backed by a ConcurrentHashMapV8 - * from the given type to {@code Boolean.TRUE}. - * - * @param initialCapacity The implementation performs internal - * sizing to accommodate this many elements. - * @throws IllegalArgumentException if the initial capacity of - * elements is negative - * @return the new set - */ - public static KeySetView newKeySet(int initialCapacity) { - return new KeySetView(new ConcurrentHashMapV8(initialCapacity), - Boolean.TRUE); - } - - /** - * {@inheritDoc} - */ - public boolean isEmpty() { - return counter.sum() <= 0L; // ignore transient negative values - } - - /** - * {@inheritDoc} - */ - public int size() { - long n = counter.sum(); - return ((n < 0L) ? 0 : - (n > (long)Integer.MAX_VALUE) ? Integer.MAX_VALUE : - (int)n); - } - - /** - * Returns the number of mappings. This method should be used - * instead of {@link #size} because a ConcurrentHashMapV8 may - * contain more mappings than can be represented as an int. The - * value returned is a snapshot; the actual count may differ if - * there are ongoing concurrent insertions or removals. - * - * @return the number of mappings - */ - public long mappingCount() { - long n = counter.sum(); - return (n < 0L) ? 0L : n; // ignore transient negative values - } - - /** - * Returns the value to which the specified key is mapped, - * or {@code null} if this map contains no mapping for the key. - * - *

    More formally, if this map contains a mapping from a key - * {@code k} to a value {@code v} such that {@code key.equals(k)}, - * then this method returns {@code v}; otherwise it returns - * {@code null}. (There can be at most one such mapping.) - * - * @throws NullPointerException if the specified key is null - */ - @SuppressWarnings("unchecked") public V get(Object key) { - if (key == null) - throw new NullPointerException(); - return (V)internalGet(key); - } - - /** - * Returns the value to which the specified key is mapped, - * or the given defaultValue if this map contains no mapping for the key. - * - * @param key the key - * @param defaultValue the value to return if this map contains - * no mapping for the given key - * @return the mapping for the key, if present; else the defaultValue - * @throws NullPointerException if the specified key is null - */ - @SuppressWarnings("unchecked") public V getValueOrDefault(Object key, V defaultValue) { - if (key == null) - throw new NullPointerException(); - V v = (V) internalGet(key); - return v == null ? defaultValue : v; - } - - /** - * Tests if the specified object is a key in this table. - * - * @param key possible key - * @return {@code true} if and only if the specified object - * is a key in this table, as determined by the - * {@code equals} method; {@code false} otherwise - * @throws NullPointerException if the specified key is null - */ - public boolean containsKey(Object key) { - if (key == null) - throw new NullPointerException(); - return internalGet(key) != null; - } - - /** - * Returns {@code true} if this map maps one or more keys to the - * specified value. Note: This method may require a full traversal - * of the map, and is much slower than method {@code containsKey}. - * - * @param value value whose presence in this map is to be tested - * @return {@code true} if this map maps one or more keys to the - * specified value - * @throws NullPointerException if the specified value is null - */ - public boolean containsValue(Object value) { - if (value == null) - throw new NullPointerException(); - Object v; - Traverser it = new Traverser(this); - while ((v = it.advance()) != null) { - if (v == value || value.equals(v)) - return true; - } - return false; - } - - public K findKey(Object value) { - if (value == null) - throw new NullPointerException(); - Object v; - Traverser it = new Traverser(this); - while ((v = it.advance()) != null) { - if (v == value || value.equals(v)) - return it.nextKey; - } - return null; - } - - /** - * Legacy method testing if some key maps into the specified value - * in this table. This method is identical in functionality to - * {@link #containsValue}, and exists solely to ensure - * full compatibility with class {@link java.util.Hashtable}, - * which supported this method prior to introduction of the - * Java Collections framework. - * - * @param value a value to search for - * @return {@code true} if and only if some key maps to the - * {@code value} argument in this table as - * determined by the {@code equals} method; - * {@code false} otherwise - * @throws NullPointerException if the specified value is null - */ - public boolean contains(Object value) { - return containsValue(value); - } - - /** - * Maps the specified key to the specified value in this table. - * Neither the key nor the value can be null. - * - *

    The value can be retrieved by calling the {@code get} method - * with a key that is equal to the original key. - * - * @param key key with which the specified value is to be associated - * @param value value to be associated with the specified key - * @return the previous value associated with {@code key}, or - * {@code null} if there was no mapping for {@code key} - * @throws NullPointerException if the specified key or value is null - */ - @SuppressWarnings("unchecked") public V put(K key, V value) { - if (key == null || value == null) - throw new NullPointerException(); - return (V)internalPut(key, value); - } - - /** - * {@inheritDoc} - * - * @return the previous value associated with the specified key, - * or {@code null} if there was no mapping for the key - * @throws NullPointerException if the specified key or value is null - */ - @SuppressWarnings("unchecked") public V putIfAbsent(K key, V value) { - if (key == null || value == null) - throw new NullPointerException(); - return (V)internalPutIfAbsent(key, value); - } - - /** - * Copies all of the mappings from the specified map to this one. - * These mappings replace any mappings that this map had for any of the - * keys currently in the specified map. - * - * @param m mappings to be stored in this map - */ - public void putAll(Map m) { - internalPutAll(m); - } - - /** - * If the specified key is not already associated with a value, - * computes its value using the given mappingFunction and enters - * it into the map unless null. This is equivalent to - *

     {@code
    -     * if (map.containsKey(key))
    -     *   return map.get(key);
    -     * value = mappingFunction.apply(key);
    -     * if (value != null)
    -     *   map.put(key, value);
    -     * return value;}
    - * - * except that the action is performed atomically. If the - * function returns {@code null} no mapping is recorded. If the - * function itself throws an (unchecked) exception, the exception - * is rethrown to its caller, and no mapping is recorded. Some - * attempted update operations on this map by other threads may be - * blocked while computation is in progress, so the computation - * should be short and simple, and must not attempt to update any - * other mappings of this Map. The most appropriate usage is to - * construct a new object serving as an initial mapped value, or - * memoized result, as in: - * - *
     {@code
    -     * map.computeIfAbsent(key, new Fun() {
    -     *   public V map(K k) { return new Value(f(k)); }});}
    - * - * @param key key with which the specified value is to be associated - * @param mappingFunction the function to compute a value - * @return the current (existing or computed) value associated with - * the specified key, or null if the computed value is null - * @throws NullPointerException if the specified key or mappingFunction - * is null - * @throws IllegalStateException if the computation detectably - * attempts a recursive update to this map that would - * otherwise never complete - * @throws RuntimeException or Error if the mappingFunction does so, - * in which case the mapping is left unestablished - */ - @SuppressWarnings("unchecked") public V computeIfAbsent - (K key, Fun mappingFunction) { - if (key == null || mappingFunction == null) - throw new NullPointerException(); - return (V)internalComputeIfAbsent(key, mappingFunction); - } - - /** - * If the given key is present, computes a new mapping value given a key and - * its current mapped value. This is equivalent to - *
     {@code
    -     *   if (map.containsKey(key)) {
    -     *     value = remappingFunction.apply(key, map.get(key));
    -     *     if (value != null)
    -     *       map.put(key, value);
    -     *     else
    -     *       map.remove(key);
    -     *   }
    -     * }
    - * - * except that the action is performed atomically. If the - * function returns {@code null}, the mapping is removed. If the - * function itself throws an (unchecked) exception, the exception - * is rethrown to its caller, and the current mapping is left - * unchanged. Some attempted update operations on this map by - * other threads may be blocked while computation is in progress, - * so the computation should be short and simple, and must not - * attempt to update any other mappings of this Map. For example, - * to either create or append new messages to a value mapping: - * - * @param key key with which the specified value is to be associated - * @param remappingFunction the function to compute a value - * @return the new value associated with the specified key, or null if none - * @throws NullPointerException if the specified key or remappingFunction - * is null - * @throws IllegalStateException if the computation detectably - * attempts a recursive update to this map that would - * otherwise never complete - * @throws RuntimeException or Error if the remappingFunction does so, - * in which case the mapping is unchanged - */ - @SuppressWarnings("unchecked") public V computeIfPresent - (K key, BiFun remappingFunction) { - if (key == null || remappingFunction == null) - throw new NullPointerException(); - return (V)internalCompute(key, true, remappingFunction); - } - - /** - * Computes a new mapping value given a key and - * its current mapped value (or {@code null} if there is no current - * mapping). This is equivalent to - *
     {@code
    -     *   value = remappingFunction.apply(key, map.get(key));
    -     *   if (value != null)
    -     *     map.put(key, value);
    -     *   else
    -     *     map.remove(key);
    -     * }
    - * - * except that the action is performed atomically. If the - * function returns {@code null}, the mapping is removed. If the - * function itself throws an (unchecked) exception, the exception - * is rethrown to its caller, and the current mapping is left - * unchanged. Some attempted update operations on this map by - * other threads may be blocked while computation is in progress, - * so the computation should be short and simple, and must not - * attempt to update any other mappings of this Map. For example, - * to either create or append new messages to a value mapping: - * - *
     {@code
    -     * Map map = ...;
    -     * final String msg = ...;
    -     * map.compute(key, new BiFun() {
    -     *   public String apply(Key k, String v) {
    -     *    return (v == null) ? msg : v + msg;});}}
    - * - * @param key key with which the specified value is to be associated - * @param remappingFunction the function to compute a value - * @return the new value associated with the specified key, or null if none - * @throws NullPointerException if the specified key or remappingFunction - * is null - * @throws IllegalStateException if the computation detectably - * attempts a recursive update to this map that would - * otherwise never complete - * @throws RuntimeException or Error if the remappingFunction does so, - * in which case the mapping is unchanged - */ - @SuppressWarnings("unchecked") public V compute - (K key, BiFun remappingFunction) { - if (key == null || remappingFunction == null) - throw new NullPointerException(); - return (V)internalCompute(key, false, remappingFunction); - } - - /** - * If the specified key is not already associated - * with a value, associate it with the given value. - * Otherwise, replace the value with the results of - * the given remapping function. This is equivalent to: - *
     {@code
    -     *   if (!map.containsKey(key))
    -     *     map.put(value);
    -     *   else {
    -     *     newValue = remappingFunction.apply(map.get(key), value);
    -     *     if (value != null)
    -     *       map.put(key, value);
    -     *     else
    -     *       map.remove(key);
    -     *   }
    -     * }
    - * except that the action is performed atomically. If the - * function returns {@code null}, the mapping is removed. If the - * function itself throws an (unchecked) exception, the exception - * is rethrown to its caller, and the current mapping is left - * unchanged. Some attempted update operations on this map by - * other threads may be blocked while computation is in progress, - * so the computation should be short and simple, and must not - * attempt to update any other mappings of this Map. - */ - @SuppressWarnings("unchecked") public V merge - (K key, V value, BiFun remappingFunction) { - if (key == null || value == null || remappingFunction == null) - throw new NullPointerException(); - return (V)internalMerge(key, value, remappingFunction); - } - - /** - * Removes the key (and its corresponding value) from this map. - * This method does nothing if the key is not in the map. - * - * @param key the key that needs to be removed - * @return the previous value associated with {@code key}, or - * {@code null} if there was no mapping for {@code key} - * @throws NullPointerException if the specified key is null - */ - @SuppressWarnings("unchecked") public V remove(Object key) { - if (key == null) - throw new NullPointerException(); - return (V)internalReplace(key, null, null); - } - - /** - * {@inheritDoc} - * - * @throws NullPointerException if the specified key is null - */ - public boolean remove(Object key, Object value) { - if (key == null) - throw new NullPointerException(); - if (value == null) - return false; - return internalReplace(key, null, value) != null; - } - - /** - * {@inheritDoc} - * - * @throws NullPointerException if any of the arguments are null - */ - public boolean replace(K key, V oldValue, V newValue) { - if (key == null || oldValue == null || newValue == null) - throw new NullPointerException(); - return internalReplace(key, newValue, oldValue) != null; - } - - /** - * {@inheritDoc} - * - * @return the previous value associated with the specified key, - * or {@code null} if there was no mapping for the key - * @throws NullPointerException if the specified key or value is null - */ - @SuppressWarnings("unchecked") public V replace(K key, V value) { - if (key == null || value == null) - throw new NullPointerException(); - return (V)internalReplace(key, value, null); - } - - /** - * Removes all of the mappings from this map. - */ - public void clear() { - internalClear(); - } - - /** - * Returns a {@link Set} view of the keys contained in this map. - * The set is backed by the map, so changes to the map are - * reflected in the set, and vice-versa. - * - * @return the set view - */ - public KeySetView keySet() { - KeySetView ks = keySet; - return (ks != null) ? ks : (keySet = new KeySetView(this, null)); - } - - /** - * Returns a {@link Set} view of the keys in this map, using the - * given common mapped value for any additions (i.e., {@link - * Collection#add} and {@link Collection#addAll}). This is of - * course only appropriate if it is acceptable to use the same - * value for all additions from this view. - * - * @param mappedValue the mapped value to use for any - * additions. - * @return the set view - * @throws NullPointerException if the mappedValue is null - */ - public KeySetView keySet(V mappedValue) { - if (mappedValue == null) - throw new NullPointerException(); - return new KeySetView(this, mappedValue); - } - - /** - * Returns a {@link Collection} view of the values contained in this map. - * The collection is backed by the map, so changes to the map are - * reflected in the collection, and vice-versa. - */ - public ValuesView values() { - ValuesView vs = values; - return (vs != null) ? vs : (values = new ValuesView(this)); - } - - /** - * Returns a {@link Set} view of the mappings contained in this map. - * The set is backed by the map, so changes to the map are - * reflected in the set, and vice-versa. The set supports element - * removal, which removes the corresponding mapping from the map, - * via the {@code Iterator.remove}, {@code Set.remove}, - * {@code removeAll}, {@code retainAll}, and {@code clear} - * operations. It does not support the {@code add} or - * {@code addAll} operations. - * - *

    The view's {@code iterator} is a "weakly consistent" iterator - * that will never throw {@link ConcurrentModificationException}, - * and guarantees to traverse elements as they existed upon - * construction of the iterator, and may (but is not guaranteed to) - * reflect any modifications subsequent to construction. - */ - public Set> entrySet() { - EntrySetView es = entrySet; - return (es != null) ? es : (entrySet = new EntrySetView(this)); - } - - /** - * Returns an enumeration of the keys in this table. - * - * @return an enumeration of the keys in this table - * @see #keySet() - */ - public Enumeration keys() { - return new KeyIterator(this); - } - - /** - * Returns an enumeration of the values in this table. - * - * @return an enumeration of the values in this table - * @see #values() - */ - public Enumeration elements() { - return new ValueIterator(this); - } - - /** - * Returns a partitionable iterator of the keys in this map. - * - * @return a partitionable iterator of the keys in this map - */ - public Spliterator keySpliterator() { - return new KeyIterator(this); - } - - /** - * Returns a partitionable iterator of the values in this map. - * - * @return a partitionable iterator of the values in this map - */ - public Spliterator valueSpliterator() { - return new ValueIterator(this); - } - - /** - * Returns a partitionable iterator of the entries in this map. - * - * @return a partitionable iterator of the entries in this map - */ - public Spliterator> entrySpliterator() { - return new EntryIterator(this); - } - - /** - * Returns the hash code value for this {@link Map}, i.e., - * the sum of, for each key-value pair in the map, - * {@code key.hashCode() ^ value.hashCode()}. - * - * @return the hash code value for this map - */ - public int hashCode() { - int h = 0; - Traverser it = new Traverser(this); - Object v; - while ((v = it.advance()) != null) { - h += it.nextKey.hashCode() ^ v.hashCode(); - } - return h; - } - - /** - * Returns a string representation of this map. The string - * representation consists of a list of key-value mappings (in no - * particular order) enclosed in braces ("{@code {}}"). Adjacent - * mappings are separated by the characters {@code ", "} (comma - * and space). Each key-value mapping is rendered as the key - * followed by an equals sign ("{@code =}") followed by the - * associated value. - * - * @return a string representation of this map - */ - public String toString() { - Traverser it = new Traverser(this); - StringBuilder sb = new StringBuilder(); - sb.append('{'); - Object v; - if ((v = it.advance()) != null) { - for (;;) { - Object k = it.nextKey; - sb.append(k == this ? "(this Map)" : k); - sb.append('='); - sb.append(v == this ? "(this Map)" : v); - if ((v = it.advance()) == null) - break; - sb.append(',').append(' '); - } - } - return sb.append('}').toString(); - } - - /** - * Compares the specified object with this map for equality. - * Returns {@code true} if the given object is a map with the same - * mappings as this map. This operation may return misleading - * results if either map is concurrently modified during execution - * of this method. - * - * @param o object to be compared for equality with this map - * @return {@code true} if the specified object is equal to this map - */ - public boolean equals(Object o) { - if (o != this) { - if (!(o instanceof Map)) - return false; - Map m = (Map) o; - Traverser it = new Traverser(this); - Object val; - while ((val = it.advance()) != null) { - Object v = m.get(it.nextKey); - if (v == null || (v != val && !v.equals(val))) - return false; - } - for (Map.Entry e : m.entrySet()) { - Object mk, mv, v; - if ((mk = e.getKey()) == null || - (mv = e.getValue()) == null || - (v = internalGet(mk)) == null || - (mv != v && !mv.equals(v))) - return false; - } - } - return true; - } - - /* ----------------Iterators -------------- */ - - @SuppressWarnings("serial") static final class KeyIterator extends Traverser - implements Spliterator, Enumeration { - KeyIterator(ConcurrentHashMapV8 map) { super(map); } - KeyIterator(Traverser it) { - super(it); - } - public KeyIterator split() { - if (nextKey != null) - throw new IllegalStateException(); - return new KeyIterator(this); - } - @SuppressWarnings("unchecked") public final K next() { - if (nextVal == null && advance() == null) - throw new NoSuchElementException(); - Object k = nextKey; - nextVal = null; - return (K) k; - } - - public final K nextElement() { return next(); } - } - - @SuppressWarnings("serial") static final class ValueIterator extends Traverser - implements Spliterator, Enumeration { - ValueIterator(ConcurrentHashMapV8 map) { super(map); } - ValueIterator(Traverser it) { - super(it); - } - public ValueIterator split() { - if (nextKey != null) - throw new IllegalStateException(); - return new ValueIterator(this); - } - - @SuppressWarnings("unchecked") public final V next() { - Object v; - if ((v = nextVal) == null && (v = advance()) == null) - throw new NoSuchElementException(); - nextVal = null; - return (V) v; - } - - public final V nextElement() { return next(); } - } - - @SuppressWarnings("serial") static final class EntryIterator extends Traverser - implements Spliterator> { - EntryIterator(ConcurrentHashMapV8 map) { super(map); } - EntryIterator(Traverser it) { - super(it); - } - public EntryIterator split() { - if (nextKey != null) - throw new IllegalStateException(); - return new EntryIterator(this); - } - - @SuppressWarnings("unchecked") public final Map.Entry next() { - Object v; - if ((v = nextVal) == null && (v = advance()) == null) - throw new NoSuchElementException(); - Object k = nextKey; - nextVal = null; - return new MapEntry((K)k, (V)v, map); - } - } - - /** - * Exported Entry for iterators - */ - static final class MapEntry implements Map.Entry { - final K key; // non-null - V val; // non-null - final ConcurrentHashMapV8 map; - MapEntry(K key, V val, ConcurrentHashMapV8 map) { - this.key = key; - this.val = val; - this.map = map; - } - public final K getKey() { return key; } - public final V getValue() { return val; } - public final int hashCode() { return key.hashCode() ^ val.hashCode(); } - public final String toString(){ return key + "=" + val; } - - public final boolean equals(Object o) { - Object k, v; Map.Entry e; - return ((o instanceof Map.Entry) && - (k = (e = (Map.Entry)o).getKey()) != null && - (v = e.getValue()) != null && - (k == key || k.equals(key)) && - (v == val || v.equals(val))); - } - - /** - * Sets our entry's value and writes through to the map. The - * value to return is somewhat arbitrary here. Since we do not - * necessarily track asynchronous changes, the most recent - * "previous" value could be different from what we return (or - * could even have been removed in which case the put will - * re-establish). We do not and cannot guarantee more. - */ - public final V setValue(V value) { - if (value == null) throw new NullPointerException(); - V v = val; - val = value; - map.put(key, value); - return v; - } - } - - /* ---------------- Serialization Support -------------- */ - - /** - * Stripped-down version of helper class used in previous version, - * declared for the sake of serialization compatibility - */ - static class Segment implements Serializable { - private static final long serialVersionUID = 2249069246763182397L; - final float loadFactor; - Segment(float lf) { this.loadFactor = lf; } - } - - /** - * Saves the state of the {@code ConcurrentHashMapV8} instance to a - * stream (i.e., serializes it). - * @param s the stream - * @serialData - * the key (Object) and value (Object) - * for each key-value mapping, followed by a null pair. - * The key-value mappings are emitted in no particular order. - */ - @SuppressWarnings("unchecked") private void writeObject(java.io.ObjectOutputStream s) - throws java.io.IOException { - if (segments == null) { // for serialization compatibility - segments = (Segment[]) - new Segment[DEFAULT_CONCURRENCY_LEVEL]; - for (int i = 0; i < segments.length; ++i) - segments[i] = new Segment(LOAD_FACTOR); - } - s.defaultWriteObject(); - Traverser it = new Traverser(this); - Object v; - while ((v = it.advance()) != null) { - s.writeObject(it.nextKey); - s.writeObject(v); - } - s.writeObject(null); - s.writeObject(null); - segments = null; // throw away - } - - /** - * Reconstitutes the instance from a stream (that is, deserializes it). - * @param s the stream - */ - @SuppressWarnings("unchecked") private void readObject(java.io.ObjectInputStream s) - throws java.io.IOException, ClassNotFoundException { - s.defaultReadObject(); - this.segments = null; // unneeded - // initialize transient final field - this.counter = new LongAdder(); - - // Create all nodes, then place in table once size is known - long size = 0L; - Node p = null; - for (;;) { - K k = (K) s.readObject(); - V v = (V) s.readObject(); - if (k != null && v != null) { - int h = spread(k.hashCode()); - p = new Node(h, k, v, p); - ++size; - } - else - break; - } - if (p != null) { - boolean init = false; - int n; - if (size >= (long)(MAXIMUM_CAPACITY >>> 1)) - n = MAXIMUM_CAPACITY; - else { - int sz = (int)size; - n = tableSizeFor(sz + (sz >>> 1) + 1); - } - int sc = sizeCtl; - boolean collide = false; - if (n > sc && - SIZE_CTRL_UPDATER.compareAndSet(this, sc, -1)) { - try { - if (table == null) { - init = true; - AtomicReferenceArray tab = new AtomicReferenceArray(n); - int mask = n - 1; - while (p != null) { - int j = p.hash & mask; - Node next = p.next; - Node q = p.next = tabAt(tab, j); - setTabAt(tab, j, p); - if (!collide && q != null && q.hash == p.hash) - collide = true; - p = next; - } - table = tab; - counter.add(size); - sc = n - (n >>> 2); - } - } finally { - sizeCtl = sc; - } - if (collide) { // rescan and convert to TreeBins - AtomicReferenceArray tab = table; - for (int i = 0; i < tab.length(); ++i) { - int c = 0; - for (Node e = tabAt(tab, i); e != null; e = e.next) { - if (++c > TREE_THRESHOLD && - (e.key instanceof Comparable)) { - replaceWithTreeBin(tab, i, e.key); - break; - } - } - } - } - } - if (!init) { // Can only happen if unsafely published. - while (p != null) { - internalPut(p.key, p.val); - p = p.next; - } - } - } - } - - - // ------------------------------------------------------- - - // Sams - /** Interface describing a void action of one argument */ - public interface Action { void apply(A a); } - /** Interface describing a void action of two arguments */ - public interface BiAction { void apply(A a, B b); } - /** Interface describing a function of one argument */ - public interface Generator { T apply(); } - /** Interface describing a function mapping its argument to a double */ - public interface ObjectToDouble { double apply(A a); } - /** Interface describing a function mapping its argument to a long */ - public interface ObjectToLong { long apply(A a); } - /** Interface describing a function mapping its argument to an int */ - public interface ObjectToInt {int apply(A a); } - /** Interface describing a function mapping two arguments to a double */ - public interface ObjectByObjectToDouble { double apply(A a, B b); } - /** Interface describing a function mapping two arguments to a long */ - public interface ObjectByObjectToLong { long apply(A a, B b); } - /** Interface describing a function mapping two arguments to an int */ - public interface ObjectByObjectToInt {int apply(A a, B b); } - /** Interface describing a function mapping a double to a double */ - public interface DoubleToDouble { double apply(double a); } - /** Interface describing a function mapping a long to a long */ - public interface LongToLong { long apply(long a); } - /** Interface describing a function mapping an int to an int */ - public interface IntToInt { int apply(int a); } - /** Interface describing a function mapping two doubles to a double */ - public interface DoubleByDoubleToDouble { double apply(double a, double b); } - /** Interface describing a function mapping two longs to a long */ - public interface LongByLongToLong { long apply(long a, long b); } - /** Interface describing a function mapping two ints to an int */ - public interface IntByIntToInt { int apply(int a, int b); } - - - /* ----------------Views -------------- */ - - /** - * Base class for views. - */ - static abstract class CHMView { - final ConcurrentHashMapV8 map; - CHMView(ConcurrentHashMapV8 map) { this.map = map; } - - /** - * Returns the map backing this view. - * - * @return the map backing this view - */ - public ConcurrentHashMapV8 getMap() { return map; } - - public final int size() { return map.size(); } - public final boolean isEmpty() { return map.isEmpty(); } - public final void clear() { map.clear(); } - - // implementations below rely on concrete classes supplying these - abstract public Iterator iterator(); - abstract public boolean contains(Object o); - abstract public boolean remove(Object o); - - private static final String oomeMsg = "Required array size too large"; - - public final Object[] toArray() { - long sz = map.mappingCount(); - if (sz > (long)(MAX_ARRAY_SIZE)) - throw new OutOfMemoryError(oomeMsg); - int n = (int)sz; - Object[] r = new Object[n]; - int i = 0; - Iterator it = iterator(); - while (it.hasNext()) { - if (i == n) { - if (n >= MAX_ARRAY_SIZE) - throw new OutOfMemoryError(oomeMsg); - if (n >= MAX_ARRAY_SIZE - (MAX_ARRAY_SIZE >>> 1) - 1) - n = MAX_ARRAY_SIZE; - else - n += (n >>> 1) + 1; - r = Arrays.copyOf(r, n); - } - r[i++] = it.next(); - } - return (i == n) ? r : Arrays.copyOf(r, i); - } - - @SuppressWarnings("unchecked") public final T[] toArray(T[] a) { - long sz = map.mappingCount(); - if (sz > (long)(MAX_ARRAY_SIZE)) - throw new OutOfMemoryError(oomeMsg); - int m = (int)sz; - T[] r = (a.length >= m) ? a : - (T[])java.lang.reflect.Array - .newInstance(a.getClass().getComponentType(), m); - int n = r.length; - int i = 0; - Iterator it = iterator(); - while (it.hasNext()) { - if (i == n) { - if (n >= MAX_ARRAY_SIZE) - throw new OutOfMemoryError(oomeMsg); - if (n >= MAX_ARRAY_SIZE - (MAX_ARRAY_SIZE >>> 1) - 1) - n = MAX_ARRAY_SIZE; - else - n += (n >>> 1) + 1; - r = Arrays.copyOf(r, n); - } - r[i++] = (T)it.next(); - } - if (a == r && i < n) { - r[i] = null; // null-terminate - return r; - } - return (i == n) ? r : Arrays.copyOf(r, i); - } - - public final int hashCode() { - int h = 0; - for (Iterator it = iterator(); it.hasNext();) - h += it.next().hashCode(); - return h; - } - - public final String toString() { - StringBuilder sb = new StringBuilder(); - sb.append('['); - Iterator it = iterator(); - if (it.hasNext()) { - for (;;) { - Object e = it.next(); - sb.append(e == this ? "(this Collection)" : e); - if (!it.hasNext()) - break; - sb.append(',').append(' '); - } - } - return sb.append(']').toString(); - } - - public final boolean containsAll(Collection c) { - if (c != this) { - for (Iterator it = c.iterator(); it.hasNext();) { - Object e = it.next(); - if (e == null || !contains(e)) - return false; - } - } - return true; - } - - public final boolean removeAll(Collection c) { - boolean modified = false; - for (Iterator it = iterator(); it.hasNext();) { - if (c.contains(it.next())) { - it.remove(); - modified = true; - } - } - return modified; - } - - public final boolean retainAll(Collection c) { - boolean modified = false; - for (Iterator it = iterator(); it.hasNext();) { - if (!c.contains(it.next())) { - it.remove(); - modified = true; - } - } - return modified; - } - - } - - /** - * A view of a ConcurrentHashMapV8 as a {@link Set} of keys, in - * which additions may optionally be enabled by mapping to a - * common value. This class cannot be directly instantiated. See - * {@link #keySet}, {@link #keySet(Object)}, {@link #newKeySet()}, - * {@link #newKeySet(int)}. - */ - public static class KeySetView extends CHMView implements Set, java.io.Serializable { - private static final long serialVersionUID = 7249069246763182397L; - private final V value; - KeySetView(ConcurrentHashMapV8 map, V value) { // non-public - super(map); - this.value = value; - } - - /** - * Returns the default mapped value for additions, - * or {@code null} if additions are not supported. - * - * @return the default mapped value for additions, or {@code null} - * if not supported. - */ - public V getMappedValue() { return value; } - - // implement Set API - - public boolean contains(Object o) { return map.containsKey(o); } - public boolean remove(Object o) { return map.remove(o) != null; } - - /** - * Returns a "weakly consistent" iterator that will never - * throw {@link ConcurrentModificationException}, and - * guarantees to traverse elements as they existed upon - * construction of the iterator, and may (but is not - * guaranteed to) reflect any modifications subsequent to - * construction. - * - * @return an iterator over the keys of this map - */ - public Iterator iterator() { return new KeyIterator(map); } - public boolean add(K e) { - V v; - if ((v = value) == null) - throw new UnsupportedOperationException(); - if (e == null) - throw new NullPointerException(); - return map.internalPutIfAbsent(e, v) == null; - } - public boolean addAll(Collection c) { - boolean added = false; - V v; - if ((v = value) == null) - throw new UnsupportedOperationException(); - for (K e : c) { - if (e == null) - throw new NullPointerException(); - if (map.internalPutIfAbsent(e, v) == null) - added = true; - } - return added; - } - public boolean equals(Object o) { - Set c; - return ((o instanceof Set) && - ((c = (Set)o) == this || - (containsAll(c) && c.containsAll(this)))); - } - } - - /** - * A view of a ConcurrentHashMapV8 as a {@link Collection} of - * values, in which additions are disabled. This class cannot be - * directly instantiated. See {@link #values}, - * - *

    The view's {@code iterator} is a "weakly consistent" iterator - * that will never throw {@link ConcurrentModificationException}, - * and guarantees to traverse elements as they existed upon - * construction of the iterator, and may (but is not guaranteed to) - * reflect any modifications subsequent to construction. - */ - public static final class ValuesView extends CHMView - implements Collection { - ValuesView(ConcurrentHashMapV8 map) { super(map); } - public final boolean contains(Object o) { return map.containsValue(o); } - public final boolean remove(Object o) { - if (o != null) { - Iterator it = new ValueIterator(map); - while (it.hasNext()) { - if (o.equals(it.next())) { - it.remove(); - return true; - } - } - } - return false; - } - - /** - * Returns a "weakly consistent" iterator that will never - * throw {@link ConcurrentModificationException}, and - * guarantees to traverse elements as they existed upon - * construction of the iterator, and may (but is not - * guaranteed to) reflect any modifications subsequent to - * construction. - * - * @return an iterator over the values of this map - */ - public final Iterator iterator() { - return new ValueIterator(map); - } - public final boolean add(V e) { - throw new UnsupportedOperationException(); - } - public final boolean addAll(Collection c) { - throw new UnsupportedOperationException(); - } - } - - /** - * A view of a ConcurrentHashMapV8 as a {@link Set} of (key, value) - * entries. This class cannot be directly instantiated. See - * {@link #entrySet}. - */ - public static final class EntrySetView extends CHMView - implements Set> { - EntrySetView(ConcurrentHashMapV8 map) { super(map); } - public final boolean contains(Object o) { - Object k, v, r; Map.Entry e; - return ((o instanceof Map.Entry) && - (k = (e = (Map.Entry)o).getKey()) != null && - (r = map.get(k)) != null && - (v = e.getValue()) != null && - (v == r || v.equals(r))); - } - public final boolean remove(Object o) { - Object k, v; Map.Entry e; - return ((o instanceof Map.Entry) && - (k = (e = (Map.Entry)o).getKey()) != null && - (v = e.getValue()) != null && - map.remove(k, v)); - } - - /** - * Returns a "weakly consistent" iterator that will never - * throw {@link ConcurrentModificationException}, and - * guarantees to traverse elements as they existed upon - * construction of the iterator, and may (but is not - * guaranteed to) reflect any modifications subsequent to - * construction. - * - * @return an iterator over the entries of this map - */ - public final Iterator> iterator() { - return new EntryIterator(map); - } - - public final boolean add(Entry e) { - K key = e.getKey(); - V value = e.getValue(); - if (key == null || value == null) - throw new NullPointerException(); - return map.internalPut(key, value) == null; - } - public final boolean addAll(Collection> c) { - boolean added = false; - for (Entry e : c) { - if (add(e)) - added = true; - } - return added; - } - public boolean equals(Object o) { - Set c; - return ((o instanceof Set) && - ((c = (Set)o) == this || - (containsAll(c) && c.containsAll(this)))); - } - } -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/nounsafe/LongAdder.java b/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/nounsafe/LongAdder.java deleted file mode 100644 index ecf552a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/nounsafe/LongAdder.java +++ /dev/null @@ -1,204 +0,0 @@ -/* - * Written by Doug Lea with assistance from members of JCP JSR-166 - * Expert Group and released to the public domain, as explained at - * http://creativecommons.org/publicdomain/zero/1.0/ - */ - -// This is based on 1.9 version. - -package com.concurrent_ruby.ext.jsr166e.nounsafe; - -import java.util.concurrent.atomic.AtomicLong; -import java.io.IOException; -import java.io.Serializable; -import java.io.ObjectInputStream; - -/** - * One or more variables that together maintain an initially zero - * {@code long} sum. When updates (method {@link #add}) are contended - * across threads, the set of variables may grow dynamically to reduce - * contention. Method {@link #sum} (or, equivalently, {@link - * #longValue}) returns the current total combined across the - * variables maintaining the sum. - * - *

    This class is usually preferable to {@link AtomicLong} when - * multiple threads update a common sum that is used for purposes such - * as collecting statistics, not for fine-grained synchronization - * control. Under low update contention, the two classes have similar - * characteristics. But under high contention, expected throughput of - * this class is significantly higher, at the expense of higher space - * consumption. - * - *

    This class extends {@link Number}, but does not define - * methods such as {@code hashCode} and {@code compareTo} because - * instances are expected to be mutated, and so are not useful as - * collection keys. - * - *

    jsr166e note: This class is targeted to be placed in - * java.util.concurrent.atomic. - * - * @since 1.8 - * @author Doug Lea - */ -public class LongAdder extends Striped64 implements Serializable { - private static final long serialVersionUID = 7249069246863182397L; - - /** - * Version of plus for use in retryUpdate - */ - final long fn(long v, long x) { return v + x; } - - /** - * Creates a new adder with initial sum of zero. - */ - public LongAdder() { - } - - /** - * Adds the given value. - * - * @param x the value to add - */ - public void add(long x) { - Cell[] as; long b, v; HashCode hc; Cell a; int n; - if ((as = cells) != null || !casBase(b = base, b + x)) { - boolean uncontended = true; - int h = (hc = threadHashCode.get()).code; - if (as == null || (n = as.length) < 1 || - (a = as[(n - 1) & h]) == null || - !(uncontended = a.cas(v = a.value, v + x))) - retryUpdate(x, hc, uncontended); - } - } - - /** - * Equivalent to {@code add(1)}. - */ - public void increment() { - add(1L); - } - - /** - * Equivalent to {@code add(-1)}. - */ - public void decrement() { - add(-1L); - } - - /** - * Returns the current sum. The returned value is NOT an - * atomic snapshot: Invocation in the absence of concurrent - * updates returns an accurate result, but concurrent updates that - * occur while the sum is being calculated might not be - * incorporated. - * - * @return the sum - */ - public long sum() { - long sum = base; - Cell[] as = cells; - if (as != null) { - int n = as.length; - for (int i = 0; i < n; ++i) { - Cell a = as[i]; - if (a != null) - sum += a.value; - } - } - return sum; - } - - /** - * Resets variables maintaining the sum to zero. This method may - * be a useful alternative to creating a new adder, but is only - * effective if there are no concurrent updates. Because this - * method is intrinsically racy, it should only be used when it is - * known that no threads are concurrently updating. - */ - public void reset() { - internalReset(0L); - } - - /** - * Equivalent in effect to {@link #sum} followed by {@link - * #reset}. This method may apply for example during quiescent - * points between multithreaded computations. If there are - * updates concurrent with this method, the returned value is - * not guaranteed to be the final value occurring before - * the reset. - * - * @return the sum - */ - public long sumThenReset() { - long sum = base; - Cell[] as = cells; - base = 0L; - if (as != null) { - int n = as.length; - for (int i = 0; i < n; ++i) { - Cell a = as[i]; - if (a != null) { - sum += a.value; - a.value = 0L; - } - } - } - return sum; - } - - /** - * Returns the String representation of the {@link #sum}. - * @return the String representation of the {@link #sum} - */ - public String toString() { - return Long.toString(sum()); - } - - /** - * Equivalent to {@link #sum}. - * - * @return the sum - */ - public long longValue() { - return sum(); - } - - /** - * Returns the {@link #sum} as an {@code int} after a narrowing - * primitive conversion. - */ - public int intValue() { - return (int)sum(); - } - - /** - * Returns the {@link #sum} as a {@code float} - * after a widening primitive conversion. - */ - public float floatValue() { - return (float)sum(); - } - - /** - * Returns the {@link #sum} as a {@code double} after a widening - * primitive conversion. - */ - public double doubleValue() { - return (double)sum(); - } - - private void writeObject(java.io.ObjectOutputStream s) - throws java.io.IOException { - s.defaultWriteObject(); - s.writeLong(sum()); - } - - private void readObject(ObjectInputStream s) - throws IOException, ClassNotFoundException { - s.defaultReadObject(); - busy = 0; - cells = null; - base = s.readLong(); - } - -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/nounsafe/Striped64.java b/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/nounsafe/Striped64.java deleted file mode 100644 index f521642..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/nounsafe/Striped64.java +++ /dev/null @@ -1,291 +0,0 @@ -/* - * Written by Doug Lea with assistance from members of JCP JSR-166 - * Expert Group and released to the public domain, as explained at - * http://creativecommons.org/publicdomain/zero/1.0/ - */ - -// This is based on 1.5 version. - -package com.concurrent_ruby.ext.jsr166e.nounsafe; - -import java.util.Random; -import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; -import java.util.concurrent.atomic.AtomicLongFieldUpdater; - -/** - * A package-local class holding common representation and mechanics - * for classes supporting dynamic striping on 64bit values. The class - * extends Number so that concrete subclasses must publicly do so. - */ -abstract class Striped64 extends Number { - /* - * This class maintains a lazily-initialized table of atomically - * updated variables, plus an extra "base" field. The table size - * is a power of two. Indexing uses masked per-thread hash codes. - * Nearly all declarations in this class are package-private, - * accessed directly by subclasses. - * - * Table entries are of class Cell; a variant of AtomicLong padded - * to reduce cache contention on most processors. Padding is - * overkill for most Atomics because they are usually irregularly - * scattered in memory and thus don't interfere much with each - * other. But Atomic objects residing in arrays will tend to be - * placed adjacent to each other, and so will most often share - * cache lines (with a huge negative performance impact) without - * this precaution. - * - * In part because Cells are relatively large, we avoid creating - * them until they are needed. When there is no contention, all - * updates are made to the base field. Upon first contention (a - * failed CAS on base update), the table is initialized to size 2. - * The table size is doubled upon further contention until - * reaching the nearest power of two greater than or equal to the - * number of CPUS. Table slots remain empty (null) until they are - * needed. - * - * A single spinlock ("busy") is used for initializing and - * resizing the table, as well as populating slots with new Cells. - * There is no need for a blocking lock: When the lock is not - * available, threads try other slots (or the base). During these - * retries, there is increased contention and reduced locality, - * which is still better than alternatives. - * - * Per-thread hash codes are initialized to random values. - * Contention and/or table collisions are indicated by failed - * CASes when performing an update operation (see method - * retryUpdate). Upon a collision, if the table size is less than - * the capacity, it is doubled in size unless some other thread - * holds the lock. If a hashed slot is empty, and lock is - * available, a new Cell is created. Otherwise, if the slot - * exists, a CAS is tried. Retries proceed by "double hashing", - * using a secondary hash (Marsaglia XorShift) to try to find a - * free slot. - * - * The table size is capped because, when there are more threads - * than CPUs, supposing that each thread were bound to a CPU, - * there would exist a perfect hash function mapping threads to - * slots that eliminates collisions. When we reach capacity, we - * search for this mapping by randomly varying the hash codes of - * colliding threads. Because search is random, and collisions - * only become known via CAS failures, convergence can be slow, - * and because threads are typically not bound to CPUS forever, - * may not occur at all. However, despite these limitations, - * observed contention rates are typically low in these cases. - * - * It is possible for a Cell to become unused when threads that - * once hashed to it terminate, as well as in the case where - * doubling the table causes no thread to hash to it under - * expanded mask. We do not try to detect or remove such cells, - * under the assumption that for long-running instances, observed - * contention levels will recur, so the cells will eventually be - * needed again; and for short-lived ones, it does not matter. - */ - - /** - * Padded variant of AtomicLong supporting only raw accesses plus CAS. - * The value field is placed between pads, hoping that the JVM doesn't - * reorder them. - * - * JVM intrinsics note: It would be possible to use a release-only - * form of CAS here, if it were provided. - */ - static final class Cell { - volatile long p0, p1, p2, p3, p4, p5, p6; - volatile long value; - volatile long q0, q1, q2, q3, q4, q5, q6; - - static AtomicLongFieldUpdater VALUE_UPDATER = AtomicLongFieldUpdater.newUpdater(Cell.class, "value"); - - Cell(long x) { value = x; } - - final boolean cas(long cmp, long val) { - return VALUE_UPDATER.compareAndSet(this, cmp, val); - } - - } - - /** - * Holder for the thread-local hash code. The code is initially - * random, but may be set to a different value upon collisions. - */ - static final class HashCode { - static final Random rng = new Random(); - int code; - HashCode() { - int h = rng.nextInt(); // Avoid zero to allow xorShift rehash - code = (h == 0) ? 1 : h; - } - } - - /** - * The corresponding ThreadLocal class - */ - static final class ThreadHashCode extends ThreadLocal { - public HashCode initialValue() { return new HashCode(); } - } - - /** - * Static per-thread hash codes. Shared across all instances to - * reduce ThreadLocal pollution and because adjustments due to - * collisions in one table are likely to be appropriate for - * others. - */ - static final ThreadHashCode threadHashCode = new ThreadHashCode(); - - /** Number of CPUS, to place bound on table size */ - static final int NCPU = Runtime.getRuntime().availableProcessors(); - - /** - * Table of cells. When non-null, size is a power of 2. - */ - transient volatile Cell[] cells; - - /** - * Base value, used mainly when there is no contention, but also as - * a fallback during table initialization races. Updated via CAS. - */ - transient volatile long base; - - /** - * Spinlock (locked via CAS) used when resizing and/or creating Cells. - */ - transient volatile int busy; - - AtomicLongFieldUpdater BASE_UPDATER = AtomicLongFieldUpdater.newUpdater(Striped64.class, "base"); - AtomicIntegerFieldUpdater BUSY_UPDATER = AtomicIntegerFieldUpdater.newUpdater(Striped64.class, "busy"); - - /** - * Package-private default constructor - */ - Striped64() { - } - - /** - * CASes the base field. - */ - final boolean casBase(long cmp, long val) { - return BASE_UPDATER.compareAndSet(this, cmp, val); - } - - /** - * CASes the busy field from 0 to 1 to acquire lock. - */ - final boolean casBusy() { - return BUSY_UPDATER.compareAndSet(this, 0, 1); - } - - /** - * Computes the function of current and new value. Subclasses - * should open-code this update function for most uses, but the - * virtualized form is needed within retryUpdate. - * - * @param currentValue the current value (of either base or a cell) - * @param newValue the argument from a user update call - * @return result of the update function - */ - abstract long fn(long currentValue, long newValue); - - /** - * Handles cases of updates involving initialization, resizing, - * creating new Cells, and/or contention. See above for - * explanation. This method suffers the usual non-modularity - * problems of optimistic retry code, relying on rechecked sets of - * reads. - * - * @param x the value - * @param hc the hash code holder - * @param wasUncontended false if CAS failed before call - */ - final void retryUpdate(long x, HashCode hc, boolean wasUncontended) { - int h = hc.code; - boolean collide = false; // True if last slot nonempty - for (;;) { - Cell[] as; Cell a; int n; long v; - if ((as = cells) != null && (n = as.length) > 0) { - if ((a = as[(n - 1) & h]) == null) { - if (busy == 0) { // Try to attach new Cell - Cell r = new Cell(x); // Optimistically create - if (busy == 0 && casBusy()) { - boolean created = false; - try { // Recheck under lock - Cell[] rs; int m, j; - if ((rs = cells) != null && - (m = rs.length) > 0 && - rs[j = (m - 1) & h] == null) { - rs[j] = r; - created = true; - } - } finally { - busy = 0; - } - if (created) - break; - continue; // Slot is now non-empty - } - } - collide = false; - } - else if (!wasUncontended) // CAS already known to fail - wasUncontended = true; // Continue after rehash - else if (a.cas(v = a.value, fn(v, x))) - break; - else if (n >= NCPU || cells != as) - collide = false; // At max size or stale - else if (!collide) - collide = true; - else if (busy == 0 && casBusy()) { - try { - if (cells == as) { // Expand table unless stale - Cell[] rs = new Cell[n << 1]; - for (int i = 0; i < n; ++i) - rs[i] = as[i]; - cells = rs; - } - } finally { - busy = 0; - } - collide = false; - continue; // Retry with expanded table - } - h ^= h << 13; // Rehash - h ^= h >>> 17; - h ^= h << 5; - } - else if (busy == 0 && cells == as && casBusy()) { - boolean init = false; - try { // Initialize table - if (cells == as) { - Cell[] rs = new Cell[2]; - rs[h & 1] = new Cell(x); - cells = rs; - init = true; - } - } finally { - busy = 0; - } - if (init) - break; - } - else if (casBase(v = base, fn(v, x))) - break; // Fall back on using base - } - hc.code = h; // Record index for next time - } - - - /** - * Sets base and all cells to the given value. - */ - final void internalReset(long initialValue) { - Cell[] as = cells; - base = initialValue; - if (as != null) { - int n = as.length; - for (int i = 0; i < n; ++i) { - Cell a = as[i]; - if (a != null) - a.value = initialValue; - } - } - } -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166y/ThreadLocalRandom.java b/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166y/ThreadLocalRandom.java deleted file mode 100644 index 3ea409f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/concurrent-ruby-1.2.2/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166y/ThreadLocalRandom.java +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Written by Doug Lea with assistance from members of JCP JSR-166 - * Expert Group and released to the public domain, as explained at - * http://creativecommons.org/publicdomain/zero/1.0/ - */ - -// This is based on 1.16 version - -package com.concurrent_ruby.ext.jsr166y; - -import java.util.Random; - -/** - * A random number generator isolated to the current thread. Like the - * global {@link java.util.Random} generator used by the {@link - * java.lang.Math} class, a {@code ThreadLocalRandom} is initialized - * with an internally generated seed that may not otherwise be - * modified. When applicable, use of {@code ThreadLocalRandom} rather - * than shared {@code Random} objects in concurrent programs will - * typically encounter much less overhead and contention. Use of - * {@code ThreadLocalRandom} is particularly appropriate when multiple - * tasks (for example, each a {@link ForkJoinTask}) use random numbers - * in parallel in thread pools. - * - *

    Usages of this class should typically be of the form: - * {@code ThreadLocalRandom.current().nextX(...)} (where - * {@code X} is {@code Int}, {@code Long}, etc). - * When all usages are of this form, it is never possible to - * accidently share a {@code ThreadLocalRandom} across multiple threads. - * - *

    This class also provides additional commonly used bounded random - * generation methods. - * - * @since 1.7 - * @author Doug Lea - */ -public class ThreadLocalRandom extends Random { - // same constants as Random, but must be redeclared because private - private static final long multiplier = 0x5DEECE66DL; - private static final long addend = 0xBL; - private static final long mask = (1L << 48) - 1; - - /** - * The random seed. We can't use super.seed. - */ - private long rnd; - - /** - * Initialization flag to permit calls to setSeed to succeed only - * while executing the Random constructor. We can't allow others - * since it would cause setting seed in one part of a program to - * unintentionally impact other usages by the thread. - */ - boolean initialized; - - // Padding to help avoid memory contention among seed updates in - // different TLRs in the common case that they are located near - // each other. - private long pad0, pad1, pad2, pad3, pad4, pad5, pad6, pad7; - - /** - * The actual ThreadLocal - */ - private static final ThreadLocal localRandom = - new ThreadLocal() { - protected ThreadLocalRandom initialValue() { - return new ThreadLocalRandom(); - } - }; - - - /** - * Constructor called only by localRandom.initialValue. - */ - ThreadLocalRandom() { - super(); - initialized = true; - } - - /** - * Returns the current thread's {@code ThreadLocalRandom}. - * - * @return the current thread's {@code ThreadLocalRandom} - */ - public static ThreadLocalRandom current() { - return localRandom.get(); - } - - /** - * Throws {@code UnsupportedOperationException}. Setting seeds in - * this generator is not supported. - * - * @throws UnsupportedOperationException always - */ - public void setSeed(long seed) { - if (initialized) - throw new UnsupportedOperationException(); - rnd = (seed ^ multiplier) & mask; - } - - protected int next(int bits) { - rnd = (rnd * multiplier + addend) & mask; - return (int) (rnd >>> (48-bits)); - } - - /** - * Returns a pseudorandom, uniformly distributed value between the - * given least value (inclusive) and bound (exclusive). - * - * @param least the least value returned - * @param bound the upper bound (exclusive) - * @throws IllegalArgumentException if least greater than or equal - * to bound - * @return the next value - */ - public int nextInt(int least, int bound) { - if (least >= bound) - throw new IllegalArgumentException(); - return nextInt(bound - least) + least; - } - - /** - * Returns a pseudorandom, uniformly distributed value - * between 0 (inclusive) and the specified value (exclusive). - * - * @param n the bound on the random number to be returned. Must be - * positive. - * @return the next value - * @throws IllegalArgumentException if n is not positive - */ - public long nextLong(long n) { - if (n <= 0) - throw new IllegalArgumentException("n must be positive"); - // Divide n by two until small enough for nextInt. On each - // iteration (at most 31 of them but usually much less), - // randomly choose both whether to include high bit in result - // (offset) and whether to continue with the lower vs upper - // half (which makes a difference only if odd). - long offset = 0; - while (n >= Integer.MAX_VALUE) { - int bits = next(2); - long half = n >>> 1; - long nextn = ((bits & 2) == 0) ? half : n - half; - if ((bits & 1) == 0) - offset += n - nextn; - n = nextn; - } - return offset + nextInt((int) n); - } - - /** - * Returns a pseudorandom, uniformly distributed value between the - * given least value (inclusive) and bound (exclusive). - * - * @param least the least value returned - * @param bound the upper bound (exclusive) - * @return the next value - * @throws IllegalArgumentException if least greater than or equal - * to bound - */ - public long nextLong(long least, long bound) { - if (least >= bound) - throw new IllegalArgumentException(); - return nextLong(bound - least) + least; - } - - /** - * Returns a pseudorandom, uniformly distributed {@code double} value - * between 0 (inclusive) and the specified value (exclusive). - * - * @param n the bound on the random number to be returned. Must be - * positive. - * @return the next value - * @throws IllegalArgumentException if n is not positive - */ - public double nextDouble(double n) { - if (n <= 0) - throw new IllegalArgumentException("n must be positive"); - return nextDouble() * n; - } - - /** - * Returns a pseudorandom, uniformly distributed value between the - * given least value (inclusive) and bound (exclusive). - * - * @param least the least value returned - * @param bound the upper bound (exclusive) - * @return the next value - * @throws IllegalArgumentException if least greater than or equal - * to bound - */ - public double nextDouble(double least, double bound) { - if (least >= bound) - throw new IllegalArgumentException(); - return nextDouble() * (bound - least) + least; - } - - private static final long serialVersionUID = -5851777807851030925L; -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/escape-0.0.4/Readme b/example/vendor/bundle/ruby/2.7.0/gems/escape-0.0.4/Readme deleted file mode 100644 index 124e79b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/escape-0.0.4/Readme +++ /dev/null @@ -1,21 +0,0 @@ -= Escape - -[Home page:] http://__.rubyforge.org/ -[Project site:] http://rubyforge.org/projects/__ -[Gem install:] gem install escape -[Wiki:] http://wiki.qualitysmith.com/__ -[Author:] Your name -[Copyright:] 2007 QualitySmith, Inc. -[License:] {GNU General Public License}[http://www.gnu.org/copyleft/gpl.html] - -== Introduction - -... - -== Installation - -... - -== Usage - -... diff --git a/example/vendor/bundle/ruby/2.7.0/gems/escape-0.0.4/doc_include/template/qualitysmith.rb b/example/vendor/bundle/ruby/2.7.0/gems/escape-0.0.4/doc_include/template/qualitysmith.rb deleted file mode 100644 index 0f53b9b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/escape-0.0.4/doc_include/template/qualitysmith.rb +++ /dev/null @@ -1,631 +0,0 @@ -module RDoc -module Page - -FONTS = "\"Bitstream Vera Sans\", Verdana, Arial, Helvetica, sans-serif" - -STYLE = < pre { - padding: 0.5em; - border: 1px dotted black; - background: #FFE; -} - -CSS - -XHTML_PREAMBLE = %{ - -} - -HEADER = XHTML_PREAMBLE + < - - %title% - - - - - - - -ENDHEADER - -FILE_PAGE = < - - - - -
    File
    %short_name%
    - - - - - - - - - -
    Path:%full_path% -IF:cvsurl -  (CVS) -ENDIF:cvsurl -
    Modified:%dtm_modified%
    -
    - -
    -HTML - -################################################################### - -CLASS_PAGE = < - %classmod%
    %full_name% - - - - - - -IF:parent - - - - -ENDIF:parent -
    In: -START:infiles -HREF:full_path_url:full_path: -IF:cvsurl - (CVS) -ENDIF:cvsurl -END:infiles -
    Parent: -IF:par_url - -ENDIF:par_url -%parent% -IF:par_url - -ENDIF:par_url -
    - - - -HTML - -################################################################### - -METHOD_LIST = < -IF:diagram -
    - %diagram% -
    -ENDIF:diagram - -IF:description -

    -ENDIF:description - -IF:requires -
    Required Files
    -
      -START:requires -
    • HREF:aref:name:
    • -END:requires -
    -ENDIF:requires - -IF:toc -
    Contents
    -
    -ENDIF:toc - -IF:methods -
    Methods
    -
      -START:methods -
    • HREF:aref:name:
    • -END:methods -
    -ENDIF:methods - -IF:includes -
    Included Modules
    -
      -START:includes -
    • HREF:aref:name:
    • -END:includes -
    -ENDIF:includes - -START:sections -IF:sectitle - -IF:seccomment -
    -%seccomment% -
    -ENDIF:seccomment -ENDIF:sectitle - -IF:classlist -
    Classes and Modules
    - %classlist% -ENDIF:classlist - -IF:constants -
    Constants
    - -START:constants - - - - - -IF:desc - - - - -ENDIF:desc -END:constants -
    %name%=%value%
     %desc%
    -ENDIF:constants - -IF:attributes -
    Attributes
    - -START:attributes - - - - - -END:attributes -
    -IF:rw -[%rw%] -ENDIF:rw - %name%%a_desc%
    -ENDIF:attributes - -IF:method_list -START:method_list -IF:methods -
    %type% %category% methods
    -START:methods -
    -
    -IF:callseq - %callseq% -ENDIF:callseq -IFNOT:callseq - %name%%params% -ENDIF:callseq -IF:codeurl -[ source ] -ENDIF:codeurl -
    -IF:m_desc -
    - %m_desc% -
    -ENDIF:m_desc -IF:aka -
    - This method is also aliased as -START:aka - %name% -END:aka -
    -ENDIF:aka -IF:sourcecode -
    - -
    -
    -%sourcecode%
    -
    -
    -
    -ENDIF:sourcecode -
    -END:methods -ENDIF:methods -END:method_list -ENDIF:method_list -END:sections - -HTML - -FOOTER = < - -ENDFOOTER - -BODY = HEADER + < - -
    - #{METHOD_LIST} -
    - - #{FOOTER} -ENDBODY - -########################## Source code ########################## - -SRC_PAGE = XHTML_PREAMBLE + < -%title% - - - - -
    %code%
    - - -HTML - -########################## Index ################################ - -FR_INDEX_BODY = < - - - - - - - - - - -
    -START:entries -%name% -END:entries -
    - -HTML - -CLASS_INDEX = FILE_INDEX -METHOD_INDEX = FILE_INDEX - -INDEX = XHTML_PREAMBLE + < - - %title% - - - - - - - - - - -IF:inline_source - -ENDIF:inline_source -IFNOT:inline_source - - - - -ENDIF:inline_source - - <body bgcolor="white"> - Click <a href="html/index.html">here</a> for a non-frames - version of this page. - </body> - - - - -HTML - -end -end - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/.github/workflows/ruby.yml b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/.github/workflows/ruby.yml deleted file mode 100644 index d35c188..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/.github/workflows/ruby.yml +++ /dev/null @@ -1,41 +0,0 @@ -# This workflow uses actions that are not certified by GitHub. -# They are provided by a third-party and are governed by -# separate terms of service, privacy policy, and support -# documentation. -# This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake -# For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby - -name: Ruby - -on: - push: - branches: [ master ] - pull_request: - branches: [ master ] - -jobs: - test: - runs-on: ${{ matrix.os }}-latest - strategy: - fail-fast: false - matrix: - os: [ubuntu, macos] - ruby-version: [2.5, 2.6, 2.7, 3.0, head, debug, truffleruby] - continue-on-error: ${{ endsWith(matrix.ruby, 'head') || matrix.ruby == 'debug' }} - steps: - - uses: actions/checkout@v2 - - name: Install libcurl header - run: | - if ${{ matrix.os == 'macos' }} - then - brew install curl - else - sudo apt update && sudo apt install -y --no-install-recommends libcurl4-openssl-dev - fi - - name: Set up Ruby - uses: ruby/setup-ruby@v1 - with: - ruby-version: ${{ matrix.ruby-version }} - bundler-cache: true # runs 'bundle install' and caches installed gems automatically - - name: Run tests - run: bundle exec rake diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/.gitignore b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/.gitignore deleted file mode 100644 index 75a08dc..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -*.gem -.bundle -Gemfile.lock -.DS_Store -.yardoc -doc -coverage -.idea diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/.rspec b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/.rspec deleted file mode 100644 index 7d8b8b7..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/.rspec +++ /dev/null @@ -1,3 +0,0 @@ ---tty ---color ---format documentation diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/CHANGELOG.md b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/CHANGELOG.md deleted file mode 100644 index 8059799..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/CHANGELOG.md +++ /dev/null @@ -1,375 +0,0 @@ -# Changelog - -## Master - -[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.15.0...master) - -* Added `redirect_url` value to available informations and `Easy::Mirror`. - ([Adrien Rey-Jarthon](https://github.com/jarthod) - -## 0.15.0 - -[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.14.0...v0.15.0) - -## 0.12.0 - -[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.11.0...v0.12.0) - -- Removed deprecated `CURLE_SSL_CACERT` pinned in curl v7.62.0 ([@arku](https://github.com/arku) in [#158](https://github.com/typhoeus/ethon/pull/158)) - - -## 0.11.0 - -[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.10.1...v0.11.0) - -## 0.10.1 - -[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.10.0...v0.10.1) - -## 0.10.0 - -[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.9.1...v0.10.0) - -## 0.9.1 - -[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.9.0...v0.9.1) - -## 0.9.0 - -[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.8.1...v0.9.0) - -## 0.8.1 - -[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.8.0...v0.8.1) - -* Support optional escaping of params. - ([Tasos Laskos](https://github.com/zapotek) -* `Easy::Mirror`: Reduced object allocations and method calls during info handling. - ([Tasos Laskos](https://github.com/zapotek) - -## 0.8.0 - -[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.7.3...v0.7.4) - -* `Easy::Mirror`: Reduced object allocations and method calls during info handling. - ([Tasos Laskos](https://github.com/zapotek) - -## 0.7.4 - -[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.7.3...v0.7.4) - -* Support different array encodings for params. - ([Marcello Barnaba](https://github.com/ifad), [\#104](https://github.com/typhoeus/ethon/pull/104)) -* Programtic access to version infos. - ([Jonas Wagner](https://github.com/jwagner), [\#90](https://github.com/typhoeus/ethon/pull/90)) - - -## 0.7.3 - -[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.7.2...v0.7.3) - -* `Ethon::Curl::FDSet` - * Set `:fd_array` size to the current MS Windows `FD_SETSIZE` (2048). - ([Tasos Laskos](https://github.com/zapotek) - -* Added `redirect_time` value to available informations and `Easy::Mirror`. - ([Adrien Jarthon](https://github.com/jarthod) - -## 0.7.2 - -[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.7.1...v0.7.2) - -* FFI data-types updated to be more correct. - -## 0.7.1 - -* MS Windows determination delegated to `Gem.windows?` for better accuracy. -* FFI data-types updated to work on MS Windows. - -## 0.7.0 - -Not backwards compatible changes: - -* `mime-types` are no longer a dependency. The gem will be still used if available to determine the mime type of a file which is uploaded. That means you have to have take care of the gem installation yourself. - -[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.6.3...v0.7.0) - -## 0.6.3 - -[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.6.2...v0.6.3) - -## 0.6.2 - -[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.6.1...v0.6.2) - -## 0.6.1 - -[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.6.0...v0.6.1) - -The changelog entries are coming soon! - -## 0.6.0 - -[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.5.12...v0.6.0) - -The changelog entries are coming soon! - -Bugfixes: - - * URL-encode nullbytes in parameters instead of escaping them to `\\0`. - ([Tasos Laskos](https://github.com/zapotek) - -## 0.5.12 - -[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.5.11...v0.5.12) - -Enhancements: - -* Performance optimizations. - ([Kyle Oppenheim](https://github.com/koppenheim) and [Richie Vos](https://github.com/richievos), [\#48](https://github.com/typhoeus/ethon/pull/48)) -* Reuse memory pointer. - ([Richie Vos](https://github.com/richievos), [\#49](https://github.com/typhoeus/ethon/pull/49)) - -Bugfixes: - -* Fix windows install. - ([Derik Olsson](https://github.com/derikolsson), [\#47](https://github.com/typhoeus/ethon/pull/47)) -* Handle urls that already contain query params. - ([Turner King](https://github.com/turnerking ), [\#45](https://github.com/typhoeus/ethon/pull/45)) - -## 0.5.11 - -[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.5.10...v0.5.11) - -Enhancements: - -* Add support for postredirs, unrestricted_auth. -* Add support for cookie, cookiejar, cookiefile. - ([erwanlr](https://github.com/erwanlr), [\#46](https://github.com/typhoeus/ethon/pull/46)) -* Relax ffi requirements. - ([voxik](https://github.com/voxik), [\#40](https://github.com/typhoeus/ethon/pull/40)) -* Various documentation improvements. - ([Craig Little](https://github.com/craiglittle)) - -Bugfixes: - -* Fix the memory leaks. - ([Richie Vos](https://github.com/richievos), [\#45](https://github.com/typhoeus/ethon/pull/45)) - -## 0.5.10 - -[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.5.9...v0.5.10) - -Enhancements: - -* Allow custom requests. - ([Nathan Sutton](https://github.com/nate), [\#36](https://github.com/typhoeus/ethon/pull/36)) -* Use updated version of FFI. - -Bugfixes: - -* Fix windows install issue. - ([brainsucker](https://github.com/brainsucker), [\#38](https://github.com/typhoeus/ethon/pull/38)) - -## 0.5.9 - -[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.5.8...v0.5.9) - -Enhancements: - -* Allow to set multiple protocols. - -## 0.5.8 - -[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.5.7...v0.5.8) - -Enhancements: - -* Add support for protocols and redir_protocols( - [libcurl SASL buffer overflow vulnerability](http://curl.haxx.se/docs/adv_20130206.html)). -* Add max_send_speed_large and max_recv_speed_large([Paul Schuegraf](https://github.com/pschuegr), [\#33](https://github.com/typhoeus/ethon/pull/33)) - -## 0.5.7 - -[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.5.6...v0.5.7) - -Enhancements: - -* Use new version of ffi. - -## 0.5.6 - -[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.5.4...v0.5.6) - -Bugfixes: - -* Easy#reset resets on_complete callbacks. - -## 0.5.4 - -[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.5.3...v0.5.4) - -Enhancements: - -* Use Libc#getdtablesize to get the FDSet size. -* New libcurl option accept_encoding. -* Documentation updates. - -## 0.5.3 - -[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.5.2...v0.5.3) - -Enhancements: - -* Deprecate Easy#prepare. It is no longer necessary. -* Unroll metaprogramming for easy and multi options. -* More specs. - -Bugfixes: - -* Correct size for FDSets -* Add proxytypes to enums. - -## 0.5.2 - -[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.5.1...v0.5.2) - -Enhancements: - -* New libcurl option keypasswd. - -Bugfixes: - -* Correct request logging when using multi interface. -* Remove invalid libcurl option sslcertpasswd. - -## 0.5.1 - -[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.5.0...v0.5.1) - -Bugfixes: - -* Mark Curl.select and Curl.easy_perform as blocking so that the GIL is - released by ffi. - -## 0.5.0 - -[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.4.4...v0.5.0) - -Enhancements: - -* New libcurl option proxyuserpwd -* Rename response_header to response_headers - -Bugfixes: - -* Mark Curl.select and Curl.easy_perform as blocking so that the GIL is - released by ffi. - -## 0.4.4 - -[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.4.3...v0.4.4) - -Enhancements: - -* Prepare multi explicit like easy - -## 0.4.3 - -[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.4.2...v0.4.3) - -Enhancements: - -* Remove deprecated libcurl option put -* More documentation -* New libcurl option connecttimeout_ms and timeout_ms -* Support multi options - -Bugfixes: - -* Handle nil values in query params - -## 0.4.2 - -[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.4.1...v0.4.2) - -Enhancements: - -* New libcurl option forbid_reuse -* Use libcurls escape instead of CGI::escape - -## 0.4.1 - -[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.4.0...v0.4.1) - -Bugfixes: - -* Handle nested hash in an array in params correct - ( [\#201](https://github.com/typhoeus/typhoeus/issues/201) ) - -## 0.4.0 - -[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.3.0...v0.4.0) - -Enhancements: - -* ruby 1.8.7 compatible -* Ethon.logger -* Deal with string param/body -* More documentation - -Bugfixes: - -* Add multi_cleanup to curl - -## 0.3.0 - -[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.2.0...v0.3.0) - -Enhancements: - -* New libcurl option proxyport -* Raise invalid value error when providing a wrong key for sslversion or httpauth - -Bugfixes: - -* Libcurl option sslversion is handled correct - -## 0.2.0 - -[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.1.0...v0.2.0) - -Enhancements: - -* GET requests are using custom requests only when there is a request body -* Easy#on_complete takes multiple callbacks -* raise Errors::GlobalInit when libcurls global_init failed instead of - runtime error -* raise Errors::InvalidOption if option is invalid - -## 0.1.0 - -[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.0.2...v0.1.0) - -Enhancements: - -* Documentation - ( [Alex P](https://github.com/ifesdjeen), [\#13](https://github.com/typhoeus/ethon/issues/13) ) -* New libcurl option dns_cache_timeout - ( [Chris Heald](https://github.com/cheald), [\#192](https://github.com/typhoeus/typhoeus/pull/192) ) - -Bugfixes: - -* Libcurl option ssl_verifyhost takes an integer. -* Add space between header key and value. - -## 0.0.2 - -[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.0.1...v0.0.2) - -Bugfixes: - -* Add libcurl.so.4 to ffi_lib in order to load correct lib on Debian. -* Escape zero bytes. - -## 0.0.1 Initial version diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/Gemfile b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/Gemfile deleted file mode 100644 index a2f41e1..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/Gemfile +++ /dev/null @@ -1,43 +0,0 @@ -# frozen_string_literal: true -source "https://rubygems.org" -gemspec - -if Gem.ruby_version < Gem::Version.new("1.9.3") - gem "rake", "< 11" -else - gem "rake" -end - -group :development, :test do - gem "rspec", "~> 3.4" - - gem "sinatra" - - if Gem.ruby_version < Gem::Version.new("2.0.0") - gem "json", "< 2" - else - gem "json" - end - - if Gem.ruby_version >= Gem::Version.new("2.0.0") - gem "mime-types", "~> 1.18" - end - - if Gem.ruby_version >= Gem::Version.new("2.2.0") - gem "mustermann" - elsif Gem.ruby_version >= Gem::Version.new("2.1.0") - gem "mustermann", "0.4.0" - elsif Gem.ruby_version >= Gem::Version.new("2.0.0") - gem "mustermann", "0.3.1" - end - - if Gem.ruby_version >= Gem::Version.new("3.0.0") - gem "webrick" - end -end - -group :perf do - gem "benchmark-ips" - gem "patron" - gem "curb" -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/Guardfile b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/Guardfile deleted file mode 100644 index 37d79f0..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/Guardfile +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true -# vim:set filetype=ruby: -guard( - "rspec", - :all_after_pass => false, - :cli => "--fail-fast --tty --format documentation --colour") do - - watch(%r{^spec/.+_spec\.rb$}) - watch(%r{^lib/(.+)\.rb$}) { |match| "spec/#{match[1]}_spec.rb" } -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/LICENSE b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/LICENSE deleted file mode 100644 index f064c17..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2012-2016 Hans Hasselberg - -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/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/README.md b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/README.md deleted file mode 100644 index 9f9f567..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/README.md +++ /dev/null @@ -1,118 +0,0 @@ -[![Gem Version](https://badge.fury.io/rb/ethon.svg)](https://badge.fury.io/rb/ethon) -[![Build Status](https://github.com/typhoeus/ethon/workflows/Ruby/badge.svg)](https://github.com/typhoeus/ethon/actions/workflows/ruby.yml) - -# Ethon - -In Greek mythology, Ethon, the son of Typhoeus and Echidna, is a gigantic eagle. So much for the history. -In the modern world, Ethon is a very basic libcurl wrapper using ffi. - -* [Documentation](http://rubydoc.info/github/typhoeus/ethon/frames/Ethon) -* [Website](http://typhoeus.github.com/) -* [Mailing list](http://groups.google.com/group/typhoeus) - -## Installation - -With bundler: - - gem "ethon" - -With rubygems: - - gem install ethon - -## Usage - -Making the first request is simple: - -```ruby -easy = Ethon::Easy.new(url: "www.example.com") -easy.perform -#=> :ok -``` - -You have access to various options, such as following redirects: - -```ruby -easy = Ethon::Easy.new(url: "www.example.com", followlocation: true) -easy.perform -#=> :ok -``` - -Once you're done you can inspect the response code and body: - -```ruby -easy = Ethon::Easy.new(url: "www.example.com", followlocation: true) -easy.perform -easy.response_code -#=> 200 -easy.response_body -#=> " :ok -``` - -```ruby -easy = Ethon::Easy.new -easy.http_request("www.example.com", :post, { params: { a: 1 }, body: { b: 2 } }) -easy.perform -#=> :ok -``` - -This is really handy when making requests since you don't have to care about setting -everything up correctly. - -## Http2 -Standard http2 servers require the client to connect once and create a session (multi) and then add simple requests to the multi handler. -The `perform` method then takes all the requests in the multi handler and sends them to the server. - -See the following example -```ruby -multi = Ethon::Multi.new -easy = Ethon::Easy.new - -easy.http_request("www.example.com/get", :get, { http_version: :httpv2_0 }) - -# Sending a request with http version 2 will send an Upgrade header to the server, which many older servers will not support -# See below for more info: https://everything.curl.dev/http/http2 -# If this is a problem, send the below: -easy.http_request("www.example.com/get", :get, { http_version: :httpv2_prior_knowledge }) - -# To set the server to use http2 with https and http1 with http, send the following: -easy.http_request("www.example.com/get", :get, { http_version: :httpv2_tls } - -multi.add(easy) -multi.perform -``` - -## LICENSE - -(The MIT License) - -Copyright © 2012-2016 [Hans Hasselberg](http://www.hans.io) - -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/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/Rakefile b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/Rakefile deleted file mode 100644 index a5bc61b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/Rakefile +++ /dev/null @@ -1,40 +0,0 @@ -# frozen_string_literal: true -require "bundler" -Bundler.setup - -require "rake" -require "rspec/core/rake_task" -$LOAD_PATH.unshift File.expand_path("../lib", __FILE__) -require "ethon/version" - -task :gem => :build -task :build do - system "gem build ethon.gemspec" -end - -task :install => :build do - system "gem install ethon-#{Ethon::VERSION}.gem" -end - -task :release => :build do - system "git tag -a v#{Ethon::VERSION} -m 'Tagging #{Ethon::VERSION}'" - system "git push --tags" - system "gem push ethon-#{Ethon::VERSION}.gem" -end - -RSpec::Core::RakeTask.new(:spec) do |t| - t.verbose = false - t.ruby_opts = "-W -I./spec -rspec_helper" -end - -desc "Start up the test servers" -task :start do - require_relative 'spec/support/boot' - begin - Boot.start_servers(:rake) - rescue Exception - end -end - -task :default => :spec - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/ethon.gemspec b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/ethon.gemspec deleted file mode 100644 index 561330b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/ethon.gemspec +++ /dev/null @@ -1,26 +0,0 @@ -# encoding: utf-8 -# frozen_string_literal: true -lib = File.expand_path('../lib/', __FILE__) -$:.unshift lib unless $:.include?(lib) - -require 'ethon/version' - -Gem::Specification.new do |s| - s.name = "ethon" - s.version = Ethon::VERSION - s.platform = Gem::Platform::RUBY - s.authors = ["Hans Hasselberg"] - s.email = ["me@hans.io"] - s.homepage = "https://github.com/typhoeus/ethon" - s.summary = "Libcurl wrapper." - s.description = "Very lightweight libcurl wrapper." - - s.required_rubygems_version = ">= 1.3.6" - s.license = 'MIT' - - s.add_dependency('ffi', ['>= 1.15.0']) - - s.files = `git ls-files`.split("\n") - s.test_files = `git ls-files -- spec/*`.split("\n") - s.require_path = 'lib' -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/profile/benchmarks.rb b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/profile/benchmarks.rb deleted file mode 100644 index 6cd68ca..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/profile/benchmarks.rb +++ /dev/null @@ -1,104 +0,0 @@ -# encoding: utf-8 -# frozen_string_literal: true -require 'ethon' -require 'open-uri' -require 'patron' -require 'curb' -require 'net/http' -require 'cgi' -require 'benchmark/ips' - -require_relative '../spec/support/server' -require_relative '../spec/support/localhost_server' - -LocalhostServer.new(TESTSERVER.new, 3000) -LocalhostServer.new(TESTSERVER.new, 3001) -LocalhostServer.new(TESTSERVER.new, 3002) - -url = 'http://localhost:3000/'.freeze -uri = URI.parse('http://localhost:3000/').freeze -ethon = Ethon::Easy.new(url: url) -patron = Patron::Session.new -patron_url = Patron::Session.new(base_url: url) -curb = Curl::Easy.new(url) - -puts '[Creation]' -Benchmark.ips do |x| - x.report('String.new') { '' } - x.report('Easy.new') { Ethon::Easy.new } -end - -puts '[Escape]' -Benchmark.ips do |x| - x.report('CGI.escape') { CGI.escape("まつもと") } - x.report('Easy.escape') { ethon.escape("まつもと") } -end - -puts '[Requests]' -Benchmark.ips do |x| - x.report('net/http') { Net::HTTP.get_response(uri) } - x.report('open-uri') { open url } - - x.report('patron') do - patron.base_url = url - patron.get('/') - end - - x.report('patron reuse') { patron_url.get('/') } - - x.report('curb') do - curb.url = url - curb.perform - end - - x.report('curb reuse') { curb.perform } - - x.report('Easy.perform') do - ethon.url = url - ethon.perform - end - - x.report('Easy.perform reuse') { ethon.perform } -end - -puts "[ 4 delayed Requests ]" -Benchmark.ips do |x| - x.report('net/http') do - 3.times do |i| - uri = URI.parse("http://localhost:300#{i}/?delay=1") - Net::HTTP.get_response(uri) - end - end - - x.report("open-uri") do - 3.times do |i| - open("http://localhost:300#{i}/?delay=1") - end - end - - x.report("patron") do - sess = Patron::Session.new - 3.times do |i| - sess.base_url = "http://localhost:300#{i}/?delay=1" - sess.get("/") - end - end - - x.report("Easy.perform") do - easy = Ethon::Easy.new - 3.times do |i| - easy.url = "http://localhost:300#{i}/?delay=1" - easy.perform - end - end - - x.report("Multi.perform") do - multi = Ethon::Multi.new - 3.times do |i| - easy = Ethon::Easy.new - easy.url = "http://localhost:300#{i}/?delay=1" - multi.add(easy) - end - multi.perform - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/profile/memory_leaks.rb b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/profile/memory_leaks.rb deleted file mode 100644 index 32000b8..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/profile/memory_leaks.rb +++ /dev/null @@ -1,114 +0,0 @@ -# frozen_string_literal: true -require 'ethon' -require 'ethon/easy' - -require_relative 'perf_spec_helper' -require 'rspec/autorun' - -describe "low-level interactions with libcurl" do - describe Ethon::Multi do - memory_leak_test("init") do - Ethon::Multi.new - end - - memory_leak_test("handle") do - Ethon::Multi.new.handle - end - end - - describe Ethon::Easy do - memory_leak_test("init") do - Ethon::Easy.new - end - - memory_leak_test("handle") do - Ethon::Easy.new.handle - end - - memory_leak_test("headers") do - Ethon::Easy.new.headers = { "a" => 1, "b" => 2, "c" => 3, "d" => 4} - end - - memory_leak_test("escape") do - Ethon::Easy.new.escape("the_sky&is_blue") - end - end - - - describe Ethon::Easy::Form do - memory_leak_test("init") do - Ethon::Easy::Form.new(nil, {}) - end - - memory_leak_test("first") do - Ethon::Easy::Form.new(nil, {}).first - end - - memory_leak_test("last") do - Ethon::Easy::Form.new(nil, {}).last - end - - memory_leak_test("materialized with some params") do - form = Ethon::Easy::Form.new(nil, { "a" => "1" }) - form.materialize - end - - memory_leak_test("materialized with a file") do - File.open(__FILE__, "r") do |file| - form = Ethon::Easy::Form.new(nil, { "a" => file }) - form.materialize - end - end - end -end - -describe "higher level operations" do - memory_leak_test("a simple request") do - Ethon::Easy.new(:url => "http://localhost:3001/", - :forbid_reuse => true).perform - end - - memory_leak_test("a request with headers") do - Ethon::Easy.new(:url => "http://localhost:3001/", - :headers => { "Content-Type" => "application/json", - "Something" => "1", - "Else" => "qwerty", - "Long-String" => "aassddffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz"}, - :forbid_reuse => true).perform - end - - memory_leak_test("a request with headers and params") do - easy = Ethon::Easy.new(:url => "http://localhost:3001/", - :headers => { "Content-Type" => "application/json", - "Something" => "1", - "Else" => "qwerty", - "Long-String" => "aassddffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz"}, - :forbid_reuse => true) - easy.http_request("http://localhost:3001/", - :get, - :params => { "param1" => "value1", - "param2" => "value2", - "param3" => "value3", - "param4" => "value4"}) - end - - memory_leak_test("a request with headers, params, and body") do - easy = Ethon::Easy.new(:url => "http://localhost:3001/", - :headers => { "Content-Type" => "application/json", - "Something" => "1", - "Else" => "qwerty", - "Long-String" => "aassddffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz"}, - :forbid_reuse => true) - easy.http_request("http://localhost:3001/", - :get, - :params => { "param1" => "value1", - "param2" => "value2", - "param3" => "value3", - "param4" => "value4"}, - :body => { - "body1" => "value1", - "body2" => "value2", - "body3" => "value3" - }) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/profile/perf_spec_helper.rb b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/profile/perf_spec_helper.rb deleted file mode 100644 index 35fd623..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/profile/perf_spec_helper.rb +++ /dev/null @@ -1,37 +0,0 @@ -# frozen_string_literal: true -#### SETUP -require 'bundler' -Bundler.setup -require 'rspec' - -require 'support/localhost_server' -require 'support/server' -require_relative 'support/memory_test_helpers' - -require 'logger' - -if ENV['VERBOSE'] - Ethon.logger = Logger.new($stdout) - Ethon.logger.level = Logger::DEBUG -end - -RSpec.configure do |config| - config.before(:suite) do - LocalhostServer.new(TESTSERVER.new, 3001) - end - config.include(MemoryTestHelpers) - config.extend(MemoryTestHelpers::TestMethods) -end - -MemoryTestHelpers.setup -MemoryTestHelpers.logger = Logger.new($stdout) -MemoryTestHelpers.logger.level = Logger::INFO -MemoryTestHelpers.logger.formatter = proc do |severity, datetime, progname, msg| - "\t\t#{msg}\n" -end - -if ENV['VERBOSE'] - MemoryTestHelpers.logger.level = Logger::DEBUG -end - -MemoryTestHelpers.iterations = ENV.fetch("ITERATIONS", 10_000).to_i diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/profile/support/memory_test_helpers.rb b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/profile/support/memory_test_helpers.rb deleted file mode 100644 index bfb6ff4..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/profile/support/memory_test_helpers.rb +++ /dev/null @@ -1,76 +0,0 @@ -# frozen_string_literal: true -require_relative 'ruby_object_leak_tracker' -require_relative 'os_memory_leak_tracker' - -module MemoryTestHelpers - class << self - attr_accessor :gc_proc, :iterations, :logger - - def setup - if RUBY_PLATFORM == "java" - # for leak detection - JRuby.objectspace = true if defined?(JRuby) - # for gc - require 'java' - java_import 'java.lang.System' - self.gc_proc = proc { System.gc } - else - self.gc_proc = proc { GC.start } - end - end - end - - module TestMethods - def memory_leak_test(description, &block) - context(description) do - it "doesn't leak ruby objects" do - object_leak_tracker = RubyObjectLeakTracker.new - track_memory_usage(object_leak_tracker, &block) - object_leak_tracker.total_difference_between_runs.should be <= 10 - end - - it "doesn't leak OS memory (C interop check)" do - os_memory_leak_tracker = OSMemoryLeakTracker.new - track_memory_usage(os_memory_leak_tracker, &block) - os_memory_leak_tracker.total_difference_between_runs.should be <= 10 - end - end - end - end - - def track_memory_usage(tracker) - # Intentionally do all this setup before we do any testing - logger = MemoryTestHelpers.logger - iterations = MemoryTestHelpers.iterations - - checkpoint_frequency = (iterations / 10.0).to_i - gc_frequency = 20 - - warmup_iterations = [(iterations / 3.0).to_i, 500].min - logger.info "Performing #{warmup_iterations} warmup iterations" - warmup_iterations.times do - yield - MemoryTestHelpers.gc_proc.call - end - tracker.capture_initial_memory_usage - - logger.info "Performing #{iterations} iterations (checkpoint every #{checkpoint_frequency})" - - iterations.times do |i| - yield - - last_iteration = (i == iterations - 1) - checkpoint = last_iteration || (i % checkpoint_frequency == 0) - - if checkpoint || (i % gc_frequency == 0) - MemoryTestHelpers.gc_proc.call - end - - if checkpoint - logger.info "Iteration #{i} checkpoint" - tracker.capture_memory_usage - tracker.dump_status(logger) - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/profile/support/os_memory_leak_tracker.rb b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/profile/support/os_memory_leak_tracker.rb deleted file mode 100644 index d9e62d4..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/profile/support/os_memory_leak_tracker.rb +++ /dev/null @@ -1,48 +0,0 @@ -# frozen_string_literal: true -class OSMemoryLeakTracker - attr_reader :current_run - - def initialize - @previous_run = @current_run = 0 - end - - def difference_between_runs(basis=@previous_run) - @current_run - basis - end - - def total_difference_between_runs - difference_between_runs(@initial_count_run) - end - - def capture_initial_memory_usage - capture_memory_usage - @initial_count_run = @current_run - end - - def capture_memory_usage - @previous_run = @current_run - @current_run = rss_bytes - end - - def dump_status(logger) - delta = difference_between_runs - logger.add(log_level(delta), sprintf("\tTotal memory usage (kb): %d (%+d)", current_run, delta)) - end - - private - # amount of memory the current process "is using", in RAM - # (doesn't include any swap memory that it may be using, just that in actual RAM) - # Code loosely based on https://github.com/rdp/os/blob/master/lib/os.rb - # returns 0 on windows - def rss_bytes - if ENV['OS'] == 'Windows_NT' - 0 - else - `ps -o rss= -p #{Process.pid}`.to_i # in kilobytes - end - end - - def log_level(delta) - delta > 0 ? Logger::WARN : Logger::DEBUG - end -end \ No newline at end of file diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/profile/support/ruby_object_leak_tracker.rb b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/profile/support/ruby_object_leak_tracker.rb deleted file mode 100644 index afcce5a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/profile/support/ruby_object_leak_tracker.rb +++ /dev/null @@ -1,49 +0,0 @@ -# frozen_string_literal: true -class RubyObjectLeakTracker - attr_reader :previous_count_hash, :current_count_hash - - def initialize - @previous_count_hash = @current_count_hash = {} - end - - def difference_between_runs(basis=@previous_count_hash) - @difference_between_runs ||= Hash[@current_count_hash.map do |object_class, count| - [object_class, count - (basis[object_class] || 0)] - end] - end - - def total_difference_between_runs - difference_between_runs(@initial_count_hash).values.inject(0) { |sum, count| sum + count } - end - - def capture_initial_memory_usage - capture_memory_usage - @initial_count_hash = @current_count_hash - end - - def capture_memory_usage - @difference_between_runs = nil - @previous_count_hash = @current_count_hash - - class_to_count = Hash.new { |hash, key| hash[key] = 0 } - ObjectSpace.each_object { |obj| class_to_count[obj.class] += 1 } - - sorted_class_to_count = class_to_count.sort_by { |k, v| -v } - @current_count_hash = Hash[sorted_class_to_count] - end - - def dump_status(logger) - diff = difference_between_runs - most_used_objects = current_count_hash.to_a.sort_by(&:last).reverse[0, 20] - - most_used_objects.each do |object_class, count| - delta = diff[object_class] - logger.add(log_level(delta), sprintf("\t%s: %d (%+d)", object_class, count, delta)) - end - end - - private - def log_level(delta) - delta > 0 ? Logger::WARN : Logger::DEBUG - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/curl_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/curl_spec.rb deleted file mode 100644 index 24d3726..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/curl_spec.rb +++ /dev/null @@ -1,38 +0,0 @@ -# frozen_string_literal: true -require 'spec_helper' - -describe Ethon::Curl do - describe ".init" do - before { Ethon::Curl.send(:class_variable_set, :@@initialized, false) } - - context "when global_init fails" do - it "raises global init error" do - expect(Ethon::Curl).to receive(:global_init).and_return(1) - expect{ Ethon::Curl.init }.to raise_error(Ethon::Errors::GlobalInit) - end - end - - context "when global_init works" do - before { expect(Ethon::Curl).to receive(:global_init).and_return(0) } - - it "doesn't raises global init error" do - expect{ Ethon::Curl.init }.to_not raise_error - end - - it "logs" do - expect(Ethon.logger).to receive(:debug) - Ethon::Curl.init - end - end - - context "when global_cleanup is called" do - before { expect(Ethon::Curl).to receive(:global_cleanup) } - - it "logs" do - expect(Ethon.logger).to receive(:debug).twice - Ethon::Curl.init - Ethon::Curl.cleanup - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/callbacks_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/callbacks_spec.rb deleted file mode 100644 index 2fa75da..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/callbacks_spec.rb +++ /dev/null @@ -1,81 +0,0 @@ -# frozen_string_literal: true -require 'spec_helper' - -describe Ethon::Easy::Callbacks do - let!(:easy) { Ethon::Easy.new } - - describe "#set_callbacks" do - before do - expect(Ethon::Curl).to receive(:set_option).exactly(3).times - end - - it "sets write-, debug-, and headerfunction" do - easy.set_callbacks - end - - it "resets @response_body" do - easy.set_callbacks - expect(easy.instance_variable_get(:@response_body)).to eq("") - end - - it "resets @response_headers" do - easy.set_callbacks - expect(easy.instance_variable_get(:@response_headers)).to eq("") - end - - it "resets @debug_info" do - easy.set_callbacks - expect(easy.instance_variable_get(:@debug_info).to_a).to eq([]) - end - end - - describe "#progress_callback" do - it "returns 0" do - expect(easy.progress_callback.call(0,1,1,1,1)).to be(0) - end - end - - describe "#body_write_callback" do - let(:body_write_callback) { easy.instance_variable_get(:@body_write_callback) } - let(:stream) { double(:read_string => "") } - context "when body returns not :abort" do - it "returns number bigger than 0" do - expect(body_write_callback.call(stream, 1, 1, nil) > 0).to be(true) - end - end - - context "when body returns :abort" do - before do - easy.on_body.clear - easy.on_body { :abort } - end - let(:body_write_callback) { easy.instance_variable_get(:@body_write_callback) } - - it "returns -1 to indicate abort to libcurl" do - expect(body_write_callback.call(stream, 1, 1, nil)).to eq(-1) - end - end - end - - describe "#header_write_callback" do - let(:header_write_callback) { easy.instance_variable_get(:@header_write_callback) } - let(:stream) { double(:read_string => "") } - context "when header returns not :abort" do - it "returns number bigger than 0" do - expect(header_write_callback.call(stream, 1, 1, nil) > 0).to be(true) - end - end - - context "when header returns :abort" do - before do - easy.on_headers.clear - easy.on_headers { :abort } - end - let(:header_write_callback) { easy.instance_variable_get(:@header_write_callback) } - - it "returns -1 to indicate abort to libcurl" do - expect(header_write_callback.call(stream, 1, 1, nil)).to eq(-1) - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/debug_info_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/debug_info_spec.rb deleted file mode 100644 index 8dccc38..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/debug_info_spec.rb +++ /dev/null @@ -1,54 +0,0 @@ -# frozen_string_literal: true -require 'spec_helper' - -describe Ethon::Easy::DebugInfo do - let(:easy) { Ethon::Easy.new } - - before do - easy.url = "http://localhost:3001/" - easy.perform - end - - describe "#debug_info" do - context "when verbose is not set to true" do - it "does not save any debug info after a request" do - expect(easy.debug_info.to_a.length).to eq(0) - expect(easy.debug_info.to_h.values.flatten.length).to eq(0) - end - end - - context "when verbose is set to true" do - before do - easy.verbose = true - easy.perform - end - - after do - easy.verbose = false - easy.reset - end - - it "saves debug info after a request" do - expect(easy.debug_info.to_a.length).to be > 0 - end - - it "saves request headers" do - expect(easy.debug_info.header_out.join).to include('GET / HTTP/1.1') - end - - it "saves response headers" do - expect(easy.debug_info.header_in.length).to be > 0 - expect(easy.response_headers).to include(easy.debug_info.header_in.join) - end - - it "saves incoming data" do - expect(easy.debug_info.data_in.length).to be > 0 - expect(easy.response_body).to include(easy.debug_info.data_in.join) - end - - it "saves debug text" do - expect(easy.debug_info.text.length).to be > 0 - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/features_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/features_spec.rb deleted file mode 100644 index b174948..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/features_spec.rb +++ /dev/null @@ -1,24 +0,0 @@ -# frozen_string_literal: true -require 'spec_helper' - -describe Ethon::Easy::Informations do - - describe "#supports_asynch_dns?" do - it "returns boolean" do - expect([true, false].include? Ethon::Easy.supports_asynch_dns?).to be_truthy - end - end - - describe "#supports_zlib?" do - it "returns boolean" do - expect([true, false].include? Ethon::Easy.supports_zlib?).to be_truthy - end - end - - describe "#supports_timeout_ms?" do - it "returns boolean" do - expect([true, false].include? Ethon::Easy.supports_timeout_ms?).to be_truthy - end - end - -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/form_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/form_spec.rb deleted file mode 100644 index 4cd34d9..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/form_spec.rb +++ /dev/null @@ -1,104 +0,0 @@ -# frozen_string_literal: true -require 'spec_helper' - -describe Ethon::Easy::Form do - let(:hash) { {} } - let!(:easy) { Ethon::Easy.new } - let(:form) { Ethon::Easy::Form.new(easy, hash) } - - describe ".new" do - it "assigns attribute to @params" do - expect(form.instance_variable_get(:@params)).to eq(hash) - end - end - - describe "#first" do - it "returns a pointer" do - expect(form.first).to be_a(FFI::Pointer) - end - end - - describe "#last" do - it "returns a pointer" do - expect(form.first).to be_a(FFI::Pointer) - end - end - - describe "#multipart?" do - before { form.instance_variable_set(:@query_pairs, pairs) } - - context "when query_pairs contains string values" do - let(:pairs) { [['a', '1'], ['b', '2']] } - - it "returns false" do - expect(form.multipart?).to be_falsey - end - end - - context "when query_pairs contains file" do - let(:pairs) { [['a', '1'], ['b', ['path', 'encoding', 'abs_path']]] } - - it "returns true" do - expect(form.multipart?).to be_truthy - end - end - - context "when options contains multipart=true" do - before { form.instance_variable_set(:@multipart, true) } - let(:pairs) { [['a', '1'], ['b', '2']] } - - it "returns true" do - expect(form.multipart?).to be_truthy - end - end - end - - describe "#materialize" do - before { form.instance_variable_set(:@query_pairs, pairs) } - - context "when query_pairs contains string values" do - let(:pairs) { [['a', '1']] } - - it "adds params to form" do - expect(Ethon::Curl).to receive(:formadd) - form.materialize - end - end - - context "when query_pairs contains nil" do - let(:pairs) { [['a', nil]] } - - it "adds params to form" do - expect(Ethon::Curl).to receive(:formadd) - form.materialize - end - end - - context "when query_pairs contains file" do - let(:pairs) { [['a', ["file", "type", "path/file"]]] } - - it "adds file to form" do - expect(Ethon::Curl).to receive(:formadd) - form.materialize - end - end - - context "when query_pairs contains file and string values" do - let(:pairs) { [['a', ["file", "type", "path/file"]], ['b', '1']] } - - it "adds file to form" do - expect(Ethon::Curl).to receive(:formadd).twice - form.materialize - end - end - - context "when query_pairs contains file, string and int values" do - let(:pairs) { [['a', ["file", "type", "path/file"]], ['b', '1'], ['c', 1]] } - - it "adds file to form" do - expect(Ethon::Curl).to receive(:formadd).exactly(3).times - form.materialize - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/header_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/header_spec.rb deleted file mode 100644 index 4931fc7..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/header_spec.rb +++ /dev/null @@ -1,79 +0,0 @@ -# frozen_string_literal: true -require 'spec_helper' - -describe Ethon::Easy::Header do - let(:easy) { Ethon::Easy.new } - - describe "#headers=" do - let(:headers) { { 'User-Agent' => 'Ethon' } } - - it "sets header" do - expect_any_instance_of(Ethon::Easy).to receive(:set_callbacks) - expect(Ethon::Curl).to receive(:set_option) - easy.headers = headers - end - - context "when requesting" do - before do - easy.headers = headers - easy.url = "http://localhost:3001" - easy.perform - end - - it "sends" do - expect(easy.response_body).to include('"HTTP_USER_AGENT":"Ethon"') - end - - context "when header value contains null byte" do - let(:headers) { { 'User-Agent' => "Ethon\0" } } - - it "escapes" do - expect(easy.response_body).to include('"HTTP_USER_AGENT":"Ethon\\\\0"') - end - end - - context "when header value has leading whitespace" do - let(:headers) { { 'User-Agent' => " Ethon" } } - - it "removes" do - expect(easy.response_body).to include('"HTTP_USER_AGENT":"Ethon"') - end - end - - context "when header value has traiing whitespace" do - let(:headers) { { 'User-Agent' => "Ethon " } } - - it "removes" do - expect(easy.response_body).to include('"HTTP_USER_AGENT":"Ethon"') - end - end - end - end - - describe "#compose_header" do - it "has space in between" do - expect(easy.compose_header('a', 'b')).to eq('a: b') - end - - context "when value is a symbol" do - it "works" do - expect{ easy.compose_header('a', :b) }.to_not raise_error - end - end - end - - describe "#header_list" do - context "when no set_headers" do - it "returns nil" do - expect(easy.header_list).to eq(nil) - end - end - - context "when set_headers" do - it "returns pointer to header list" do - easy.headers = {'User-Agent' => 'Custom'} - expect(easy.header_list).to be_a(FFI::Pointer) - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/http/custom_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/http/custom_spec.rb deleted file mode 100644 index ba0978b..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/http/custom_spec.rb +++ /dev/null @@ -1,177 +0,0 @@ -# frozen_string_literal: true -require 'spec_helper' - -describe Ethon::Easy::Http::Custom do - let(:easy) { Ethon::Easy.new } - let(:url) { "http://localhost:3001/" } - let(:params) { nil } - let(:form) { nil } - let(:custom) { described_class.new("PURGE", url, {:params => params, :body => form}) } - - describe "#setup" do - context "when nothing" do - it "sets url" do - custom.setup(easy) - expect(easy.url).to eq(url) - end - - it "makes a custom request" do - custom.setup(easy) - easy.perform - expect(easy.response_body).to include('"REQUEST_METHOD":"PURGE"') - end - end - - context "when params" do - let(:params) { {:a => "1&"} } - - it "attaches escaped to url" do - custom.setup(easy) - expect(easy.url).to eq("#{url}?a=1%26") - end - - context "when requesting" do - before do - easy.headers = { 'Expect' => '' } - custom.setup(easy) - easy.perform - end - - it "is a custom verb" do - expect(easy.response_body).to include('"REQUEST_METHOD":"PURGE"') - end - - it "does not use application/x-www-form-urlencoded content type" do - expect(easy.response_body).to_not include('"CONTENT_TYPE":"application/x-www-form-urlencoded"') - end - - it "requests parameterized url" do - expect(easy.response_body).to include('"REQUEST_URI":"http://localhost:3001/?a=1%26"') - end - end - end - - context "when body" do - context "when multipart" do - let(:form) { {:a => File.open(__FILE__, 'r')} } - - it "sets httppost" do - expect(easy).to receive(:httppost=) - custom.setup(easy) - end - - context "when requesting" do - before do - easy.headers = { 'Expect' => '' } - custom.setup(easy) - easy.perform - end - - it "returns ok" do - expect(easy.return_code).to eq(:ok) - end - - it "is a custom verb" do - expect(easy.response_body).to include('"REQUEST_METHOD":"PURGE"') - end - - it "uses multipart/form-data content type" do - expect(easy.response_body).to include('"CONTENT_TYPE":"multipart/form-data') - end - - it "submits a body" do - expect(easy.response_body).to match('"body":".+"') - end - - it "submits the data" do - expect(easy.response_body).to include('"filename":"custom_spec.rb"') - end - end - end - - context "when not multipart" do - let(:form) { {:a => "1&b=2"} } - let(:encoded) { "a=1%26b%3D2" } - - it "sets escaped copypostfields" do - expect(easy).to receive(:copypostfields=).with(encoded) - custom.setup(easy) - end - - it "sets postfieldsize" do - expect(easy).to receive(:postfieldsize=).with(encoded.bytesize) - custom.setup(easy) - end - - context "when requesting" do - before do - easy.headers = { 'Expect' => '' } - custom.setup(easy) - easy.perform - end - - it "returns ok" do - expect(easy.return_code).to eq(:ok) - end - - it "is a custom verb" do - expect(easy.response_body).to include('"REQUEST_METHOD":"PURGE"') - end - - it "uses multipart/form-data content type" do - expect(easy.response_body).to include('"CONTENT_TYPE":"application/x-www-form-urlencoded') - end - - it "submits a body" do - expect(easy.response_body).to match('"body":"a=1%26b%3D2"') - end - - it "submits the data" do - expect(easy.response_body).to include('"rack.request.form_hash":{"a":"1&b=2"}') - end - end - end - - context "when string" do - let(:form) { "{a: 1}" } - - context "when requesting" do - before do - easy.headers = { 'Expect' => '' } - custom.setup(easy) - easy.perform - end - - it "returns ok" do - expect(easy.return_code).to eq(:ok) - end - - it "sends string" do - expect(easy.response_body).to include('"body":"{a: 1}"') - end - end - end - end - - context "when params and body" do - let(:form) { {:a => "1"} } - let(:params) { {:b => "2"} } - - context "when requesting" do - before do - easy.headers = { 'Expect' => '' } - custom.setup(easy) - easy.perform - end - - it "url contains params" do - expect(easy.response_body).to include('"REQUEST_URI":"http://localhost:3001/?b=2"') - end - - it "body contains form" do - expect(easy.response_body).to include('"body":"a=1"') - end - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/http/delete_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/http/delete_spec.rb deleted file mode 100644 index fe7e55e..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/http/delete_spec.rb +++ /dev/null @@ -1,21 +0,0 @@ -# frozen_string_literal: true -require 'spec_helper' - -describe Ethon::Easy::Http::Delete do - let(:easy) { Ethon::Easy.new } - let(:url) { "http://localhost:3001/" } - let(:params) { nil } - let(:form) { nil } - let(:delete) { described_class.new(url, {:params => params, :body => form}) } - - context "when requesting" do - before do - delete.setup(easy) - easy.perform - end - - it "makes a delete request" do - expect(easy.response_body).to include('"REQUEST_METHOD":"DELETE"') - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/http/get_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/http/get_spec.rb deleted file mode 100644 index e3a7e4f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/http/get_spec.rb +++ /dev/null @@ -1,126 +0,0 @@ -# frozen_string_literal: true -require 'spec_helper' - -describe Ethon::Easy::Http::Get do - let(:easy) { Ethon::Easy.new } - let(:url) { "http://localhost:3001/" } - let(:params) { nil } - let(:form) { nil } - let(:options) { {} } - let(:get) { described_class.new(url, {:params => params, :body => form}.merge(options)) } - - describe "#setup" do - it "sets url" do - get.setup(easy) - expect(easy.url).to eq(url) - end - - context "when body" do - let(:form) { { :a => 1 } } - - it "sets customrequest" do - expect(easy).to receive(:customrequest=).with("GET") - get.setup(easy) - end - end - - context "when no body" do - it "doesn't set customrequest" do - expect(easy).to receive(:customrequest=).never - get.setup(easy) - end - end - - context "when requesting" do - before do - get.setup(easy) - easy.perform - end - - context "when url already contains params" do - let(:url) { "http://localhost:3001/?query=here" } - let(:params) { {:a => "1&b=2"} } - - it "returns ok" do - expect(easy.return_code).to eq(:ok) - end - - it "is a get request" do - expect(easy.response_body).to include('"REQUEST_METHOD":"GET"') - end - - it "requests parameterized url" do - expect(easy.effective_url).to eq("http://localhost:3001/?query=here&a=1%26b%3D2") - end - end - - context "when params and no body" do - let(:params) { {:a => "1&b=2"} } - - it "returns ok" do - expect(easy.return_code).to eq(:ok) - end - - it "is a get request" do - expect(easy.response_body).to include('"REQUEST_METHOD":"GET"') - end - - it "requests parameterized url" do - expect(easy.effective_url).to eq("http://localhost:3001/?a=1%26b%3D2") - end - end - - context "when params and body" do - let(:params) { {:a => "1&b=2"} } - let(:form) { {:b => "2"} } - - it "returns ok" do - expect(easy.return_code).to eq(:ok) - end - - it "is a get request" do - expect(easy.response_body).to include('"REQUEST_METHOD":"GET"') - end - - it "requests parameterized url" do - expect(easy.effective_url).to eq("http://localhost:3001/?a=1%26b%3D2") - end - end - - context "with :escape" do - let(:params) { {:a => "1&b=2"} } - - context 'missing' do - it "escapes values" do - expect(easy.url).to eq("#{url}?a=1%26b%3D2") - end - end - - context 'nil' do - let(:options) { {:escape => nil} } - - it "escapes values" do - expect(easy.url).to eq("#{url}?a=1%26b%3D2") - end - end - - context 'true' do - let(:options) { {:escape => true} } - - it "escapes values" do - expect(easy.url).to eq("#{url}?a=1%26b%3D2") - end - end - - context 'false' do - let(:options) { {:escape => false} } - - it "sends raw values" do - expect(easy.url).to eq("#{url}?a=1&b=2") - end - end - end - - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/http/head_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/http/head_spec.rb deleted file mode 100644 index 5a04f06..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/http/head_spec.rb +++ /dev/null @@ -1,80 +0,0 @@ -# frozen_string_literal: true -require 'spec_helper' - -describe Ethon::Easy::Http::Head do - let(:easy) { Ethon::Easy.new } - let(:url) { "http://localhost:3001/" } - let(:params) { nil } - let(:form) { nil } - let(:head) { described_class.new(url, {:params => params, :body => form}) } - - describe "#setup" do - context "when nothing" do - it "sets nobody" do - expect(easy).to receive(:nobody=).with(true) - head.setup(easy) - end - - it "sets url" do - head.setup(easy) - expect(easy.url).to eq(url) - end - end - - context "when params" do - let(:params) { {:a => "1&b=2"} } - - it "sets nobody" do - expect(easy).to receive(:nobody=).with(true) - head.setup(easy) - end - - it "attaches escaped to url" do - head.setup(easy) - expect(easy.url).to eq("#{url}?a=1%26b%3D2") - end - - context "when requesting" do - before do - head.setup(easy) - easy.perform - end - - it "returns ok" do - expect(easy.return_code).to eq(:ok) - end - - it "has no body" do - expect(easy.response_body).to be_empty - end - - it "requests parameterized url" do - expect(easy.effective_url).to eq("http://localhost:3001/?a=1%26b%3D2") - end - - context "when url already contains params" do - let(:url) { "http://localhost:3001/?query=here" } - - it "requests parameterized url" do - expect(easy.effective_url).to eq("http://localhost:3001/?query=here&a=1%26b%3D2") - end - end - end - end - - context "when body" do - let(:form) { {:a => 1} } - - context "when requesting" do - before do - head.setup(easy) - easy.perform - end - - it "returns ok" do - expect(easy.return_code).to eq(:ok) - end - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/http/options_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/http/options_spec.rb deleted file mode 100644 index 99ca96f..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/http/options_spec.rb +++ /dev/null @@ -1,51 +0,0 @@ -# frozen_string_literal: true -require 'spec_helper' - -describe Ethon::Easy::Http::Options do - let(:easy) { Ethon::Easy.new } - let(:url) { "http://localhost:3001/" } - let(:params) { nil } - let(:form) { nil } - let(:options) { described_class.new(url, {:params => params, :body => form}) } - - describe "#setup" do - it "sets customrequest" do - expect(easy).to receive(:customrequest=).with("OPTIONS") - options.setup(easy) - end - - it "sets url" do - options.setup(easy) - expect(easy.url).to eq(url) - end - - context "when requesting" do - let(:params) { {:a => "1&b=2"} } - - before do - options.setup(easy) - easy.perform - end - - it "returns ok" do - expect(easy.return_code).to eq(:ok) - end - - it "is a options request" do - expect(easy.response_body).to include('"REQUEST_METHOD":"OPTIONS"') - end - - it "requests parameterized url" do - expect(easy.effective_url).to eq("http://localhost:3001/?a=1%26b%3D2") - end - - context "when url already contains params" do - let(:url) { "http://localhost:3001/?query=here" } - - it "requests parameterized url" do - expect(easy.effective_url).to eq("http://localhost:3001/?query=here&a=1%26b%3D2") - end - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/http/patch_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/http/patch_spec.rb deleted file mode 100644 index a74cec7..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/http/patch_spec.rb +++ /dev/null @@ -1,51 +0,0 @@ -# frozen_string_literal: true -require 'spec_helper' - -describe Ethon::Easy::Http::Patch do - let(:easy) { Ethon::Easy.new } - let(:url) { "http://localhost:3001/" } - let(:params) { nil } - let(:form) { nil } - let(:patch) { described_class.new(url, {:params => params, :body => form}) } - - describe "#setup" do - it "sets customrequest" do - expect(easy).to receive(:customrequest=).with("PATCH") - patch.setup(easy) - end - - it "sets url" do - patch.setup(easy) - expect(easy.url).to eq(url) - end - - context "when requesting" do - let(:params) { {:a => "1&b=2"} } - - before do - patch.setup(easy) - easy.perform - end - - it "returns ok" do - expect(easy.return_code).to eq(:ok) - end - - it "is a patch request" do - expect(easy.response_body).to include('"REQUEST_METHOD":"PATCH"') - end - - it "requests parameterized url" do - expect(easy.effective_url).to eq("http://localhost:3001/?a=1%26b%3D2") - end - - context "when url already contains params" do - let(:url) { "http://localhost:3001/?query=here" } - - it "requests parameterized url" do - expect(easy.effective_url).to eq("http://localhost:3001/?query=here&a=1%26b%3D2") - end - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/http/post_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/http/post_spec.rb deleted file mode 100644 index a65ceff..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/http/post_spec.rb +++ /dev/null @@ -1,317 +0,0 @@ -# frozen_string_literal: true -require 'spec_helper' - -describe Ethon::Easy::Http::Post do - let(:easy) { Ethon::Easy.new } - let(:url) { "http://localhost:3001/" } - let(:params) { nil } - let(:form) { nil } - let(:options) { Hash.new } - let(:post) { described_class.new(url, options.merge({:params => params, :body => form})) } - - describe "#setup" do - context "when nothing" do - it "sets url" do - post.setup(easy) - expect(easy.url).to eq(url) - end - - it "sets postfield_size" do - expect(easy).to receive(:postfieldsize=).with(0) - post.setup(easy) - end - - it "sets copy_postfields" do - expect(easy).to receive(:copypostfields=).with("") - post.setup(easy) - end - - it "makes a post request" do - post.setup(easy) - easy.perform - expect(easy.response_body).to include('"REQUEST_METHOD":"POST"') - end - end - - context "when params" do - let(:params) { {:a => "1&"} } - - it "attaches escaped to url" do - post.setup(easy) - expect(easy.url).to eq("#{url}?a=1%26") - end - - context "with arrays" do - let(:params) { {:a => %w( foo bar )} } - - context "by default" do - it "encodes them with indexes" do - post.setup(easy) - expect(easy.url).to eq("#{url}?a%5B0%5D=foo&a%5B1%5D=bar") - end - end - - context "when params_encoding is :rack" do - let(:options) { {:params_encoding => :rack} } - it "encodes them without indexes" do - post.setup(easy) - expect(easy.url).to eq("#{url}?a%5B%5D=foo&a%5B%5D=bar") - end - end - end - - context "with :escape" do - context 'missing' do - it "escapes values" do - post.setup(easy) - expect(easy.url).to eq("#{url}?a=1%26") - end - end - - context 'nil' do - let(:options) { {:escape => nil} } - - it "escapes values" do - post.setup(easy) - expect(easy.url).to eq("#{url}?a=1%26") - end - end - - context 'true' do - let(:options) { {:escape => true} } - - it "escapes values" do - post.setup(easy) - expect(easy.url).to eq("#{url}?a=1%26") - end - end - - context 'false' do - let(:options) { {:escape => false} } - - it "sends raw values" do - post.setup(easy) - expect(easy.url).to eq("#{url}?a=1&") - end - end - end - - it "sets postfieldsize" do - expect(easy).to receive(:postfieldsize=).with(0) - post.setup(easy) - end - - it "sets copypostfields" do - expect(easy).to receive(:copypostfields=).with("") - post.setup(easy) - end - - context "when requesting" do - let(:postredir) { nil } - - before do - easy.headers = { 'Expect' => '' } - post.setup(easy) - easy.postredir = postredir - easy.followlocation = true - easy.perform - end - - it "is a post" do - expect(easy.response_body).to include('"REQUEST_METHOD":"POST"') - end - - it "uses application/x-www-form-urlencoded content type" do - expect(easy.response_body).to include('"CONTENT_TYPE":"application/x-www-form-urlencoded"') - end - - it "requests parameterized url" do - expect(easy.response_body).to include('"REQUEST_URI":"http://localhost:3001/?a=1%26"') - end - - context "when redirection" do - let(:url) { "localhost:3001/redirect" } - - context "when no postredirs" do - it "is a get" do - expect(easy.response_body).to include('"REQUEST_METHOD":"GET"') - end - end - - unless ENV['TRAVIS'] - context "when postredirs" do - let(:postredir) { :post_all } - - it "is a post" do - expect(easy.response_body).to include('"REQUEST_METHOD":"POST"') - end - end - end - end - end - end - - context "when body" do - context "when multipart" do - let(:form) { {:a => File.open(__FILE__, 'r')} } - - it "sets httppost" do - expect(easy).to receive(:httppost=) - post.setup(easy) - end - - context "when requesting" do - before do - easy.headers = { 'Expect' => '' } - post.setup(easy) - easy.perform - end - - it "returns ok" do - expect(easy.return_code).to eq(:ok) - end - - it "is a post" do - expect(easy.response_body).to include('"REQUEST_METHOD":"POST"') - end - - it "uses multipart/form-data content type" do - expect(easy.response_body).to include('"CONTENT_TYPE":"multipart/form-data') - end - - it "submits a body" do - expect(easy.response_body).to match('"body":".+"') - end - - it "submits the data" do - expect(easy.response_body).to include('"filename":"post_spec.rb"') - end - end - end - - context "when not multipart" do - let(:form) { {:a => "1&b=2"} } - let(:encoded) { "a=1%26b%3D2" } - - it "sets escaped copypostfields" do - expect(easy).to receive(:copypostfields=).with(encoded) - post.setup(easy) - end - - it "sets postfieldsize" do - expect(easy).to receive(:postfieldsize=).with(encoded.bytesize) - post.setup(easy) - end - - context "when requesting" do - before do - easy.headers = { 'Expect' => '' } - post.setup(easy) - easy.perform - end - - it "returns ok" do - expect(easy.return_code).to eq(:ok) - end - - it "is a post" do - expect(easy.response_body).to include('"REQUEST_METHOD":"POST"') - end - - it "uses multipart/form-data content type" do - expect(easy.response_body).to include('"CONTENT_TYPE":"application/x-www-form-urlencoded') - end - - it "submits a body" do - expect(easy.response_body).to match('"body":"a=1%26b%3D2"') - end - - it "submits the data" do - expect(easy.response_body).to include('"rack.request.form_hash":{"a":"1&b=2"}') - end - end - end - - context "when string" do - let(:form) { "{a: 1}" } - - context "when requesting" do - before do - easy.headers = { 'Expect' => '' } - post.setup(easy) - easy.perform - end - - it "returns ok" do - expect(easy.return_code).to eq(:ok) - end - - it "sends string" do - expect(easy.response_body).to include('"body":"{a: 1}"') - end - end - end - - context "when binary with null bytes" do - let(:form) { [1, 0, 1].pack('c*') } - - context "when requesting" do - before do - easy.headers = { 'Expect' => '' } - post.setup(easy) - easy.perform - end - - it "returns ok" do - expect(easy.return_code).to eq(:ok) - end - - it "sends binary data" do - expect(easy.response_body).to include('"body":"\\u0001\\u0000\\u0001"') - end - end - end - - context "when arrays" do - let(:form) { {:a => %w( foo bar )} } - - context "by default" do - it "sets copypostfields with indexed, escaped representation" do - expect(easy).to receive(:copypostfields=).with('a%5B0%5D=foo&a%5B1%5D=bar') - post.setup(easy) - end - end - - context "when params_encoding is :rack" do - let(:options) { {:params_encoding => :rack} } - - it "sets copypostfields with non-indexed, escaped representation" do - expect(easy).to receive(:copypostfields=).with('a%5B%5D=foo&a%5B%5D=bar') - post.setup(easy) - end - end - end - end - - context "when params and body" do - let(:form) { {:a => "1"} } - let(:params) { {:b => "2"} } - - context "when requesting" do - before do - easy.headers = { 'Expect' => '' } - post.setup(easy) - easy.perform - end - - it "url contains params" do - expect(easy.response_body).to include('"REQUEST_URI":"http://localhost:3001/?b=2"') - end - - it "body contains form" do - expect(easy.response_body).to include('"body":"a=1"') - end - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/http/put_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/http/put_spec.rb deleted file mode 100644 index f294c37..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/http/put_spec.rb +++ /dev/null @@ -1,168 +0,0 @@ -# frozen_string_literal: true -require 'spec_helper' - -describe Ethon::Easy::Http::Put do - let(:easy) { Ethon::Easy.new } - let(:url) { "http://localhost:3001/" } - let(:params) { nil } - let(:form) { nil } - let(:options) { Hash.new } - let(:put) { described_class.new(url, options.merge({:params => params, :body => form})) } - - describe "#setup" do - context "when nothing" do - it "sets url" do - put.setup(easy) - expect(easy.url).to eq(url) - end - - it "sets upload" do - expect(easy).to receive(:upload=).with(true) - put.setup(easy) - end - - it "sets infilesize" do - expect(easy).to receive(:infilesize=).with(0) - put.setup(easy) - end - - context "when requesting" do - it "makes a put request" do - put.setup(easy) - easy.perform - expect(easy.response_body).to include('"REQUEST_METHOD":"PUT"') - end - end - end - - context "when params" do - let(:params) { {:a => "1&"} } - - it "attaches escaped to url" do - put.setup(easy) - expect(easy.url).to eq("#{url}?a=1%26") - end - - context "with arrays" do - let(:params) { {:a => %w( foo bar )} } - - context "by default" do - it "encodes them with indexes" do - put.setup(easy) - expect(easy.url).to eq("#{url}?a%5B0%5D=foo&a%5B1%5D=bar") - end - end - - context "when params_encoding is :rack" do - let(:options) { {:params_encoding => :rack} } - it "encodes them without indexes" do - put.setup(easy) - expect(easy.url).to eq("#{url}?a%5B%5D=foo&a%5B%5D=bar") - end - end - end - - it "sets upload" do - expect(easy).to receive(:upload=).with(true) - put.setup(easy) - end - - it "sets infilesize" do - expect(easy).to receive(:infilesize=).with(0) - put.setup(easy) - end - - context "when requesting" do - before do - put.setup(easy) - easy.perform - end - - it "makes a put request" do - expect(easy.response_body).to include('"REQUEST_METHOD":"PUT"') - end - end - end - - context "when body" do - let(:form) { {:a => "1&b=2"} } - - it "sets infilesize" do - expect(easy).to receive(:infilesize=).with(11) - put.setup(easy) - end - - it "sets readfunction" do - expect(easy).to receive(:readfunction) - put.setup(easy) - end - - it "sets upload" do - expect(easy).to receive(:upload=).with(true) - put.setup(easy) - end - - context "when requesting" do - context "sending string body" do - before do - easy.headers = { 'Expect' => '' } - put.setup(easy) - easy.perform - end - - it "makes a put request" do - expect(easy.response_body).to include('"REQUEST_METHOD":"PUT"') - end - - it "submits a body" do - expect(easy.response_body).to include('"body":"a=1%26b%3D2"') - end - end - - context "when injecting a file as body" do - let(:file) { File.open(__FILE__) } - let(:easy) do - e = Ethon::Easy.new(:url => url, :upload => true) - e.set_read_callback(file) - e.infilesize = File.size(file.path) - e - end - - before do - easy.headers = { 'Expect' => '' } - easy.perform - end - - it "submits file" do - expect(easy.response_body).to include("injecting") - end - end - end - - context "when arrays" do - let(:form) { {:a => %w( foo bar )} } - - before do - put.setup(easy) - easy.perform - end - - context "by default" do - it "submits an indexed, escaped representation" do - expect(easy.response_body).to include('"body":"a%5B0%5D=foo&a%5B1%5D=bar"') - end - end - - context "when params_encoding is :rack" do - let(:options) { {:params_encoding => :rack} } - - it "submits an non-indexed, escaped representation" do - expect(easy.response_body).to include('"body":"a%5B%5D=foo&a%5B%5D=bar"') - end - end - end - end - - context "when params and body" - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/http_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/http_spec.rb deleted file mode 100644 index b74a2df..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/http_spec.rb +++ /dev/null @@ -1,64 +0,0 @@ -# frozen_string_literal: true -require 'spec_helper' - -describe Ethon::Easy::Http do - let(:easy) { Ethon::Easy.new } - - describe "#http_request" do - let(:url) { "http://localhost:3001/" } - let(:action_name) { :get } - let(:options) { {} } - - let(:get) { double(:setup) } - let(:get_class) { Ethon::Easy::Http::Get } - - it "instanciates action" do - expect(get).to receive(:setup) - expect(get_class).to receive(:new).and_return(get) - easy.http_request(url, action_name, options) - end - - context "when requesting" do - [ :get, :post, :put, :delete, :head, :patch, :options ].map do |action| - it "returns ok" do - easy.http_request(url, action, options) - easy.perform - expect(easy.return_code).to be(:ok) - end - - unless action == :head - it "makes a #{action.to_s.upcase} request" do - easy.http_request(url, action, options) - easy.perform - expect(easy.response_body).to include("\"REQUEST_METHOD\":\"#{action.to_s.upcase}\"") - end - - it "streams the response body from the #{action.to_s.upcase} request" do - bytes_read = 0 - easy.on_body { |chunk, response| bytes_read += chunk.bytesize } - easy.http_request(url, action, options) - easy.perform - content_length = ((easy.response_headers =~ /Content-Length: (\d+)/) && $1.to_i) - expect(bytes_read).to eq(content_length) - expect(easy.response_body).to eq("") - end - - it "notifies when headers are ready" do - headers = [] - easy.on_headers { |r| headers << r.response_headers } - easy.http_request(url, action, options) - easy.perform - expect(headers).to eq([easy.response_headers]) - expect(headers.first).to match(/Content-Length: (\d+)/) - end - end - end - - it "makes requests with custom HTTP verbs" do - easy.http_request(url, :purge, options) - easy.perform - expect(easy.response_body).to include(%{"REQUEST_METHOD":"PURGE"}) - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/informations_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/informations_spec.rb deleted file mode 100644 index 3526847..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/informations_spec.rb +++ /dev/null @@ -1,126 +0,0 @@ -# frozen_string_literal: true -require 'spec_helper' - -describe Ethon::Easy::Informations do - let(:easy) { Ethon::Easy.new } - - before do - easy.url = "http://localhost:3001" - easy.perform - end - - describe "#httpauth_avail" do - it "returns" do - expect(easy.httpauth_avail).to be - end - end - - describe "#total_time" do - it "returns float" do - expect(easy.total_time).to be_a(Float) - end - end - - describe "#starttransfer_time" do - it "returns float" do - expect(easy.starttransfer_time).to be_a(Float) - end - end - - describe "#appconnect_time" do - it "returns float" do - expect(easy.appconnect_time).to be_a(Float) - end - end - - describe "#pretransfer_time" do - it "returns float" do - expect(easy.pretransfer_time).to be_a(Float) - end - end - - describe "#connect_time" do - it "returns float" do - expect(easy.connect_time).to be_a(Float) - end - end - - describe "#namelookup_time" do - it "returns float" do - expect(easy.namelookup_time).to be_a(Float) - end - end - - describe "#redirect_time" do - it "returns float" do - expect(easy.redirect_time).to be_a(Float) - end - end - - describe "#effective_url" do - it "returns url" do - expect(easy.effective_url).to match(/^http:\/\/localhost:3001\/?/) - end - end - - describe "#primary_ip" do - it "returns localhost" do - expect(easy.primary_ip).to match(/::1|127\.0\.0\.1/) - end - end - - describe "#response_code" do - it "returns 200" do - expect(easy.response_code).to eq(200) - end - end - - describe "#redirect_count" do - it "returns 0" do - expect(easy.redirect_count).to eq(0) - end - end - - describe "#redirect_url" do - it "returns nil as there is no redirect" do - expect(easy.redirect_url).to be(nil) - end - end - - describe "#request_size" do - it "returns 53" do - expect(easy.request_size).to eq(53) - end - end - - describe "#supports_zlib?" do - it "returns true" do - expect(Kernel).to receive(:warn) - expect(easy.supports_zlib?).to be_truthy - end - end - - describe "#size_upload" do - it "returns float" do - expect(easy.size_upload).to be_a(Float) - end - end - - describe "#size_download" do - it "returns float" do - expect(easy.size_download).to be_a(Float) - end - end - - describe "#speed_upload" do - it "returns float" do - expect(easy.speed_upload).to be_a(Float) - end - end - - describe "#speed_download" do - it "returns float" do - expect(easy.speed_download).to be_a(Float) - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/mirror_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/mirror_spec.rb deleted file mode 100644 index 29d150d..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/mirror_spec.rb +++ /dev/null @@ -1,47 +0,0 @@ -# frozen_string_literal: true -require 'spec_helper' - -describe Ethon::Easy::Mirror do - let(:options) { nil } - let(:mirror) { described_class.new(options) } - - describe "::INFORMATIONS_TO_LOG" do - [ - :return_code, :response_code, :response_body, :response_headers, - :total_time, :starttransfer_time, :appconnect_time, - :pretransfer_time, :connect_time, :namelookup_time, :redirect_time, - :size_upload, :size_download, :speed_upload, :speed_upload, - :effective_url, :primary_ip, :redirect_count, :redirect_url, :debug_info - ].each do |name| - it "contains #{name}" do - expect(described_class::INFORMATIONS_TO_MIRROR).to include(name) - end - end - end - - describe "#to_hash" do - let(:options) { {:return_code => 1} } - - it "returns mirror as hash" do - expect(mirror.to_hash).to eq(options) - end - end - - describe "#log_informations" do - let(:options) { {:return_code => 1} } - - it "returns hash" do - expect(mirror.log_informations).to be_a(Hash) - end - - it "only calls methods that exist" do - described_class::INFORMATIONS_TO_LOG.each do |method_name| - expect(mirror.respond_to? method_name).to eql(true) - end - end - - it "includes return code" do - expect(mirror.log_informations).to include(options) - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/operations_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/operations_spec.rb deleted file mode 100644 index a3ddc86..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/operations_spec.rb +++ /dev/null @@ -1,271 +0,0 @@ -# frozen_string_literal: true -require 'spec_helper' - -describe Ethon::Easy::Operations do - let(:easy) { Ethon::Easy.new } - - describe "#handle" do - it "returns a pointer" do - expect(easy.handle).to be_a(FFI::Pointer) - end - end - - - describe "#perform" do - let(:url) { nil } - let(:timeout) { nil } - let(:connect_timeout) { nil } - let(:follow_location) { nil } - let(:max_redirs) { nil } - let(:user_pwd) { nil } - let(:http_auth) { nil } - let(:headers) { nil } - let(:protocols) { nil } - let(:redir_protocols) { nil } - let(:username) { nil } - let(:password) { nil } - - before do - Ethon.logger.level = Logger::DEBUG - easy.url = url - easy.timeout = timeout - easy.connecttimeout = connect_timeout - easy.followlocation = follow_location - easy.maxredirs = max_redirs - easy.httpauth = http_auth - easy.headers = headers - easy.protocols = protocols - easy.redir_protocols = redir_protocols - - if user_pwd - easy.userpwd = user_pwd - else - easy.username = username - easy.password = password - end - - easy.perform - end - - it "calls Curl.easy_perform" do - expect(Ethon::Curl).to receive(:easy_perform) - easy.perform - end - - it "calls Curl.easy_cleanup" do - expect_any_instance_of(FFI::AutoPointer).to receive(:free) - easy.cleanup - end - - it "logs" do - expect(Ethon.logger).to receive(:debug) - easy.perform - end - - it "doesn't log after completing because completing could reset" do - easy.on_complete{ expect(Ethon.logger).to receive(:debug).never } - easy.perform - end - - context "when url" do - let(:url) { "http://localhost:3001/" } - - it "returns ok" do - expect(easy.return_code).to eq(:ok) - end - - it "sets response body" do - expect(easy.response_body).to be - end - - it "sets response headers" do - expect(easy.response_headers).to be - end - - context "when request timed out" do - let(:url) { "http://localhost:3001/?delay=1" } - let(:timeout) { 1 } - - it "returns operation_timedout" do - expect(easy.return_code).to eq(:operation_timedout) - end - end - - context "when connection timed out" do - let(:url) { "http://localhost:3009" } - let(:connect_timeout) { 1 } - - it "returns couldnt_connect" do - expect(easy.return_code).to eq(:couldnt_connect) - end - end - - context "when no follow location" do - let(:url) { "http://localhost:3001/redirect" } - let(:follow_location) { false } - - it "doesn't follow" do - expect(easy.response_code).to eq(302) - expect(easy.redirect_url).to eq("http://localhost:3001/") - end - end - - context "when follow location" do - let(:url) { "http://localhost:3001/redirect" } - let(:follow_location) { true } - - it "follows" do - expect(easy.response_code).to eq(200) - expect(easy.redirect_url).to eq(nil) - end - - context "when infinite redirect loop" do - let(:url) { "http://localhost:3001/bad_redirect" } - let(:max_redirs) { 5 } - - context "when max redirect set" do - it "follows only x times" do - expect(easy.response_code).to eq(302) - expect(easy.redirect_url).to eq("http://localhost:3001/bad_redirect") - end - end - end - end - - context "when user agent" do - let(:headers) { { 'User-Agent' => 'Ethon' } } - - it "sets" do - expect(easy.response_body).to include('"HTTP_USER_AGENT":"Ethon"') - end - end - end - - context "when auth url" do - before { easy.url = url } - - context "when basic auth" do - let(:url) { "http://localhost:3001/auth_basic/username/password" } - - context "when no user_pwd" do - it "returns 401" do - expect(easy.response_code).to eq(401) - end - end - - context "when invalid user_pwd" do - let(:user_pwd) { "invalid:invalid" } - - it "returns 401" do - expect(easy.response_code).to eq(401) - end - end - - context "when valid user_pwd" do - let(:user_pwd) { "username:password" } - - it "returns 200" do - expect(easy.response_code).to eq(200) - end - end - - context "when user and password" do - let(:username) { "username" } - let(:password) { "password" } - - it "returns 200" do - expect(easy.response_code).to eq(200) - end - end - end - - context "when ntlm" do - let(:url) { "http://localhost:3001/auth_ntlm" } - let(:http_auth) { :ntlm } - - context "when no user_pwd" do - it "returns 401" do - expect(easy.response_code).to eq(401) - end - end - - context "when user_pwd" do - let(:user_pwd) { "username:password" } - - it "returns 200" do - expect(easy.response_code).to eq(200) - end - end - end - end - - context "when protocols" do - context "when asking for a allowed url" do - let(:url) { "http://localhost:3001" } - let(:protocols) { :http } - - it "returns ok" do - expect(easy.return_code).to be(:ok) - end - end - - context "when asking for a not allowed url" do - let(:url) { "http://localhost:3001" } - let(:protocols) { :https } - - it "returns unsupported_protocol" do - expect(easy.return_code).to be(:unsupported_protocol) - end - end - end - - context "when multiple protocols" do - context "when asking for a allowed url" do - let(:protocols) { [:http, :https] } - - context "when http" do - let(:url) { "http://localhost:3001" } - - it "returns ok for http" do - expect(easy.return_code).to be(:ok) - end - end - - context "when https" do - let(:url) { "https://localhost:3001" } - - it "returns ssl_connect_error for https" do - expect(easy.return_code).to be(:ssl_connect_error) - end - end - end - - context "when asking for a not allowed url" do - let(:url) { "ssh://localhost" } - let(:protocols) { [:https, :http] } - - it "returns unsupported_protocol" do - expect(easy.return_code).to be(:unsupported_protocol) - end - end - end - - context "when redir_protocols" do - context "when redirecting to a not allowed url" do - let(:url) { "http://localhost:3001/redirect" } - let(:follow_location) { true } - let(:redir_protocols) { :https } - - it "returns unsupported_protocol" do - expect(easy.return_code).to be(:unsupported_protocol) - end - end - end - - context "when no url" do - it "returns url_malformat" do - expect(easy.perform).to eq(:url_malformat) - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/options_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/options_spec.rb deleted file mode 100644 index e135bd9..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/options_spec.rb +++ /dev/null @@ -1,193 +0,0 @@ -# frozen_string_literal: true -require 'spec_helper' - -describe Ethon::Easy::Options do - let(:easy) { Ethon::Easy.new } - - [ - :accept_encoding, :cainfo, :capath, :connecttimeout, :connecttimeout_ms, :cookie, - :cookiejar, :cookiefile, :copypostfields, :customrequest, :dns_cache_timeout, - :followlocation, :forbid_reuse, :http_version, :httpauth, :httpget, :httppost, - :infilesize, :interface, :keypasswd, :maxredirs, :nobody, :nosignal, - :postfieldsize, :postredir, :protocols, :proxy, :proxyauth, :proxyport, :proxytype, - :proxyuserpwd, :readdata, :readfunction, :redir_protocols, :ssl_verifyhost, - :ssl_verifypeer, :sslcert, :sslcerttype, :sslkey, :sslkeytype, :sslversion, - :timeout, :timeout_ms, :unrestricted_auth, :upload, :url, :useragent, - :userpwd, :verbose, :pipewait, :dns_shuffle_addresses, :path_as_is - ].each do |name| - describe "#{name}=" do - it "responds_to" do - expect(easy).to respond_to("#{name}=") - end - - it "sets option" do - expect_any_instance_of(Ethon::Easy).to receive(:set_callbacks) - expect(Ethon::Curl).to receive(:set_option).with(name, anything, anything) - value = case name - when :http_version - :httpv1_0 - when :httpauth - :basic - when :protocols, :redir_protocols - :http - when :postredir - :post_301 - when :proxytype - :http - when :sslversion - :default - when :httppost - FFI::Pointer::NULL - else - 1 - end - easy.method("#{name}=").call(value) - end - end - end - - describe '#escape?' do - context 'by default' do - it 'returns true' do - expect(easy.escape?).to be_truthy - end - end - - context 'when #escape=nil' do - it 'returns true' do - easy.escape = nil - expect(easy.escape?).to be_truthy - end - end - - context 'when #escape=true' do - it 'returns true' do - easy.escape = true - expect(easy.escape?).to be_truthy - end - end - - context 'when #escape=false' do - it 'returns true' do - easy.escape = false - expect(easy.escape?).to be_falsey - end - end - end - - describe '#multipart?' do - context 'by default' do - it 'returns false' do - expect(easy.multipart?).to be_falsey - end - end - - context 'when #multipart=nil' do - it 'returns false' do - easy.multipart = nil - expect(easy.multipart?).to be_falsey - end - end - - context 'when #multipart=true' do - it 'returns true' do - easy.multipart = true - expect(easy.multipart?).to be_truthy - end - end - - context 'when #multipart=false' do - it 'returns false' do - easy.multipart = false - expect(easy.multipart?).to be_falsey - end - end - end - - describe "#httppost=" do - it "raises unless given a FFI::Pointer" do - expect{ easy.httppost = 1 }.to raise_error(Ethon::Errors::InvalidValue) - end - end - - context "when requesting" do - let(:url) { "localhost:3001" } - let(:timeout) { nil } - let(:timeout_ms) { nil } - let(:connecttimeout) { nil } - let(:connecttimeout_ms) { nil } - let(:userpwd) { nil } - - before do - easy.url = url - easy.timeout = timeout - easy.timeout_ms = timeout_ms - easy.connecttimeout = connecttimeout - easy.connecttimeout_ms = connecttimeout_ms - easy.userpwd = userpwd - easy.perform - end - - context "when userpwd" do - context "when contains /" do - let(:url) { "localhost:3001/auth_basic/test/te%2Fst" } - let(:userpwd) { "test:te/st" } - - it "works" do - expect(easy.response_code).to eq(200) - end - end - end - - context "when timeout" do - let(:timeout) { 1 } - - context "when request takes longer" do - let(:url) { "localhost:3001?delay=2" } - - it "times out" do - expect(easy.return_code).to eq(:operation_timedout) - end - end - end - - context "when connecttimeout" do - let(:connecttimeout) { 1 } - - context "when cannot connect" do - let(:url) { "localhost:3002" } - - it "times out" do - expect(easy.return_code).to eq(:couldnt_connect) - end - end - end - - if Ethon::Easy.supports_timeout_ms? - context "when timeout_ms" do - let(:timeout_ms) { 100 } - - context "when request takes longer" do - let(:url) { "localhost:3001?delay=1" } - - it "times out" do - expect(easy.return_code).to eq(:operation_timedout) - end - end - end - - context "when connecttimeout_ms" do - let(:connecttimeout_ms) { 100 } - - context "when cannot connect" do - let(:url) { "localhost:3002" } - - it "times out" do - # this can either lead to a timeout or couldnt connect depending on which happens first - expect([:couldnt_connect, :operation_timedout]).to include(easy.return_code) - end - end - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/queryable_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/queryable_spec.rb deleted file mode 100644 index 89c4d11..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/queryable_spec.rb +++ /dev/null @@ -1,235 +0,0 @@ -# encoding: utf-8 -# frozen_string_literal: true -require 'spec_helper' - -describe Ethon::Easy::Queryable do - let(:hash) { {} } - let!(:easy) { Ethon::Easy.new } - let(:params) { Ethon::Easy::Params.new(easy, hash) } - - describe "#to_s" do - context "when query_pairs empty" do - before { params.instance_variable_set(:@query_pairs, []) } - - it "returns empty string" do - expect(params.to_s).to eq("") - end - end - - context "when query_pairs not empty" do - context "when escape" do - before do - params.escape = true - end - - { - '!' => '%21', '*' => '%2A', "'" => '%27', '(' => '%28', - ')' => '%29', ';' => '%3B', ':' => '%3A', '@' => '%40', - '&' => '%26', '=' => '%3D', '+' => '%2B', '$' => '%24', - ',' => '%2C', '/' => '%2F', '?' => '%3F', '#' => '%23', - '[' => '%5B', ']' => '%5D', - - '<' => '%3C', '>' => '%3E', '"' => '%22', '{' => '%7B', - '}' => '%7D', '|' => '%7C', '\\' => '%5C', '`' => '%60', - '^' => '%5E', '%' => '%25', ' ' => '%20', "\0" => '%00', - - 'まつもと' => '%E3%81%BE%E3%81%A4%E3%82%82%E3%81%A8', - }.each do |value, percent| - it "turns #{value.inspect} into #{percent}" do - params.instance_variable_set(:@query_pairs, [[:a, value]]) - expect(params.to_s).to eq("a=#{percent}") - end - end - - { - '.' => '%2E', '-' => '%2D', '_' => '%5F', '~' => '%7E', - }.each do |value, percent| - it "leaves #{value.inspect} instead of turning into #{percent}" do - params.instance_variable_set(:@query_pairs, [[:a, value]]) - expect(params.to_s).to eq("a=#{value}") - end - end - end - - context "when no escape" do - before { params.instance_variable_set(:@query_pairs, [[:a, 1], [:b, 2]]) } - - it "returns concatenated query string" do - expect(params.to_s).to eq("a=1&b=2") - end - end - end - - context "when query_pairs contains a string" do - before { params.instance_variable_set(:@query_pairs, ["{a: 1}"]) } - - it "returns correct string" do - expect(params.to_s).to eq("{a: 1}") - end - end - end - - describe "#build_query_pairs" do - let(:pairs) { params.method(:build_query_pairs).call(hash) } - - context "when params is empty" do - it "returns empty array" do - expect(pairs).to eq([]) - end - end - - context "when params is string" do - let(:hash) { "{a: 1}" } - - it "wraps it in an array" do - expect(pairs).to eq([hash]) - end - end - - context "when params is simple hash" do - let(:hash) { {:a => 1, :b => 2} } - - it "transforms" do - expect(pairs).to include([:a, 1]) - expect(pairs).to include([:b, 2]) - end - end - - context "when params is a nested hash" do - let(:hash) { {:a => 1, :b => {:c => 2}} } - - it "transforms" do - expect(pairs).to include([:a, 1]) - expect(pairs).to include(["b[c]", 2]) - end - end - - context "when params contains an array" do - let(:hash) { {:a => 1, :b => [2, 3]} } - - context "by default" do - it "transforms" do - expect(pairs).to include([:a, 1]) - expect(pairs).to include(["b[0]", 2]) - expect(pairs).to include(["b[1]", 3]) - end - end - - context "when params_encoding is :rack" do - before { params.params_encoding = :rack } - it "transforms without indexes" do - expect(pairs).to include([:a, 1]) - expect(pairs).to include(["b[]", 2]) - expect(pairs).to include(["b[]", 3]) - end - end - - context "when params_encoding is :none" do - before { params.params_encoding = :none } - it "does no transformation" do - expect(pairs).to include([:a, 1]) - expect(pairs).to include([:b, [2, 3]]) - end - end - end - - context "when params contains something nested in an array" do - context "when string" do - let(:hash) { {:a => {:b => ["hello", "world"]}} } - - it "transforms" do - expect(pairs).to eq([["a[b][0]", "hello"], ["a[b][1]", "world"]]) - end - end - - context "when hash" do - let(:hash) { {:a => {:b => [{:c =>1}, {:d => 2}]}} } - - it "transforms" do - expect(pairs).to eq([["a[b][0][c]", 1], ["a[b][1][d]", 2]]) - end - end - - context "when file" do - let(:file) { File.open("spec/spec_helper.rb") } - let(:file_info) { params.method(:file_info).call(file) } - let(:hash) { {:a => {:b => [file]}} } - let(:mime_type) { file_info[1] } - - it "transforms" do - expect(pairs).to eq([["a[b][0]", file_info]]) - end - - context "when MIME" do - if defined?(MIME) - context "when mime type" do - it "sets mime type to text" do - expect(mime_type).to eq("application/x-ruby") - end - end - end - - context "when no mime type" do - let(:file) { Tempfile.new("fubar") } - - it "sets mime type to default application/octet-stream" do - expect(mime_type).to eq("application/octet-stream") - end - end - end - - context "when no MIME" do - before { hide_const("MIME") } - - it "sets mime type to default application/octet-stream" do - expect(mime_type).to eq("application/octet-stream") - end - end - end - end - - - context "when params contains file" do - let(:file) { Tempfile.new("fubar") } - let(:file_info) { params.method(:file_info).call(file) } - let(:hash) { {:a => 1, :b => file} } - - it "transforms" do - expect(pairs).to include([:a, 1]) - expect(pairs).to include([:b, file_info]) - end - end - - context "when params key contains a null byte" do - let(:hash) { {:a => "1\0" } } - - it "preserves" do - expect(pairs).to eq([[:a, "1\0"]]) - end - end - - context "when params value contains a null byte" do - let(:hash) { {"a\0" => 1 } } - - it "preserves" do - expect(pairs).to eq([["a\0", 1]]) - end - end - end - - describe "#empty?" do - context "when params empty" do - it "returns true" do - expect(params.empty?).to be_truthy - end - end - - context "when params not empty" do - let(:hash) { {:a => 1} } - - it "returns false" do - expect(params.empty?).to be_falsey - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/response_callbacks_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/response_callbacks_spec.rb deleted file mode 100644 index f142fad..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/response_callbacks_spec.rb +++ /dev/null @@ -1,152 +0,0 @@ -# frozen_string_literal: true -require 'spec_helper' - -describe Ethon::Easy::ResponseCallbacks do - let(:easy) { Ethon::Easy.new } - - [:on_complete, :on_headers, :on_body, :on_progress].each do |callback_type| - describe "##{callback_type}" do - it "responds" do - expect(easy).to respond_to("#{callback_type}") - end - - context "when no block given" do - it "returns @#{callback_type}" do - expect(easy.send("#{callback_type}")).to eq([]) - end - end - - context "when block given" do - it "stores" do - easy.send(callback_type) { p 1 } - expect(easy.instance_variable_get("@#{callback_type}").size).to eq(1) - end - end - - context "when multiple blocks given" do - it "stores" do - easy.send(callback_type) { p 1 } - easy.send(callback_type) { p 2 } - expect(easy.instance_variable_get("@#{callback_type}").size).to eq(2) - end - end - end - end - - describe "#complete" do - before do - easy.on_complete {|r| String.new(r.url) } - end - - it "executes blocks and passes self" do - expect(String).to receive(:new).with(easy.url) - easy.complete - end - - context "when @on_complete nil" do - it "doesn't raise" do - easy.instance_variable_set(:@on_complete, nil) - expect{ easy.complete }.to_not raise_error - end - end - end - - describe "#headers" do - before do - easy.on_headers {|r| String.new(r.url) } - end - - it "executes blocks and passes self" do - expect(String).to receive(:new).with(easy.url) - easy.headers - end - - context "when @on_headers nil" do - it "doesn't raise" do - easy.instance_variable_set(:@on_headers, nil) - expect{ easy.headers }.to_not raise_error - end - end - end - - describe "#progress" do - context "when requesting for realz" do - it "executes callback" do - post = Ethon::Easy::Http::Post.new("http://localhost:3001", {:body => "bar=fu"}) - post.setup(easy) - @called = false - @has_dltotal = false - @has_ultotal = false - easy.on_progress { @called = true } - easy.on_progress { |dltotal, _, _, _| @has_dltotal ||= true } - easy.on_progress { |_, _, ultotal, _| @has_ultotal ||= true } - easy.perform - expect(@called).to be true - expect(@has_dltotal).to be true - expect(@has_ultotal).to be true - end - end - - context "when pretending" do - before do - @dltotal = nil - @dlnow = nil - @ultotal = nil - @ulnow = nil - easy.on_progress { |dltotal, dlnow, ultotal, ulnow| @dltotal = dltotal ; @dlnow = dlnow; @ultotal = ultotal; @ulnow = ulnow } - end - - it "executes blocks and passes dltotal" do - easy.progress(1, 2, 3, 4) - expect(@dltotal).to eq(1) - end - - it "executes blocks and passes dlnow" do - easy.progress(1, 2, 3, 4) - expect(@dlnow).to eq(2) - end - - it "executes blocks and passes ultotal" do - easy.progress(1, 2, 3, 4) - expect(@ultotal).to eq(3) - end - - it "executes blocks and passes ulnow" do - easy.progress(1, 2, 3, 4) - expect(@ulnow).to eq(4) - end - - context "when @on_progress nil" do - it "doesn't raise" do - easy.instance_variable_set(:@on_progress, nil) - expect{ easy.progress(1, 2, 3, 4) }.to_not raise_error - end - end - end - end - - describe "#body" do - before do - @chunk = nil - @r = nil - easy.on_body { |chunk, r| @chunk = chunk ; @r = r } - end - - it "executes blocks and passes self" do - easy.body("the chunk") - expect(@r).to be(easy) - end - - it "executes blocks and passes chunk" do - easy.body("the chunk") - expect(@chunk).to eq("the chunk") - end - - context "when @on_body nil" do - it "doesn't raise" do - easy.instance_variable_set(:@on_body, nil) - expect{ easy.body("the chunk") }.to_not raise_error - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/util_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/util_spec.rb deleted file mode 100644 index 048c5bd..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy/util_spec.rb +++ /dev/null @@ -1,28 +0,0 @@ -# frozen_string_literal: true -require 'spec_helper' - -describe Ethon::Easy::Util do - class Dummy - include Ethon::Easy::Util - end - - let(:klass) { Dummy.new } - - describe "escape_zero_byte" do - context "when value has no zero byte" do - let(:value) { "hello world" } - - it "returns same value" do - expect(klass.escape_zero_byte(value)).to be(value) - end - end - - context "when value has zero byte" do - let(:value) { "hello \0world" } - - it "returns escaped" do - expect(klass.escape_zero_byte(value)).to eq("hello \\0world") - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy_spec.rb deleted file mode 100644 index c0e9565..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/easy_spec.rb +++ /dev/null @@ -1,203 +0,0 @@ -# frozen_string_literal: true -require 'spec_helper' - -describe Ethon::Easy do - let(:easy) { Ethon::Easy.new } - - describe ".new" do - it "inits curl" do - expect(Ethon::Curl).to receive(:init) - easy - end - - context "when options are empty" do - it "sets only callbacks" do - expect_any_instance_of(Ethon::Easy).to receive(:set_callbacks) - expect(Ethon::Easy).to receive(:set_option).never - easy - end - end - - context "when options not empty" do - context "when followlocation is set" do - let(:options) { { :followlocation => true } } - let(:easy) { Ethon::Easy.new(options) } - - it "sets followlocation" do - expect_any_instance_of(Ethon::Easy).to receive(:set_callbacks) - expect(Ethon::Curl).to receive(:set_option).with(:followlocation, true, anything) - easy - end - end - end - end - - describe "#set_attributes" do - context "when options are empty" do - it "sets only callbacks" do - expect_any_instance_of(Ethon::Easy).to receive(:set_callbacks) - expect(Ethon::Easy).to receive(:set_option).never - easy - end - end - - context "when options aren't empty" do - context "when valid key" do - it "sets" do - expect(easy).to receive(:verbose=).with(true) - easy.set_attributes({:verbose => true}) - end - end - - context "when invalid key" do - it "raises invalid option error" do - expect{ easy.set_attributes({:fubar => 1}) }.to raise_error(Ethon::Errors::InvalidOption) - end - end - end - end - - describe "#reset" do - before { easy.url = "www.example.com" } - - it "resets url" do - easy.reset - expect(easy.url).to be_nil - end - - it "resets escape?" do - easy.escape = false - easy.reset - expect(easy.escape?).to be_truthy - end - - it "resets hash" do - easy.reset - expect(easy.instance_variable_get(:@hash)).to be_nil - end - - it "resets easy handle" do - expect(Ethon::Curl).to receive(:easy_reset) - easy.reset - end - - it "resets on_complete" do - easy.on_complete { p 1 } - easy.reset - expect(easy.on_complete).to be_empty - end - - it "resets on_headers" do - easy.on_headers { p 1 } - easy.reset - expect(easy.on_headers).to be_empty - end - - it "resets on_body" do - easy.on_body { p 1 } - easy.reset - expect(easy.on_body).to be_empty - end - end - - describe "#dup" do - let!(:easy) do - easy = Ethon::Easy.new - easy.url = "http://localhost:3001/" - easy.on_complete { 'on_complete' } - easy.on_headers { 'on_headers' } - easy.on_progress { 'on_progress' } - easy.response_body = String.new('test_body') - easy.response_headers = String.new('test_headers') - easy - end - let!(:e) { easy.dup } - - it "sets a new handle" do - expect(e.handle).not_to eq(easy.handle) - end - - it "preserves url" do - expect(e.url).to eq(easy.url) - end - - it "preserves on_complete callback" do - expect(e.on_complete).to be(easy.on_complete) - end - - it "preserves on_headers callback" do - expect(e.on_headers).to be(easy.on_headers) - end - - it 'preserves body_write_callback of original handle' do - expect { easy.perform }.to change { easy.response_body } - expect { easy.perform }.not_to change { e.response_body } - end - - it "preserves on_progress callback" do - expect(e.on_progress).to be(easy.on_progress) - end - - it 'sets new body_write_callback of duplicated handle' do - expect { e.perform }.to change { e.response_body } - expect { e.perform }.not_to change { easy.response_body } - end - - it 'preserves headers_write_callback of original handle' do - expect { easy.perform }.to change { easy.response_headers } - expect { easy.perform }.not_to change { e.response_headers } - end - - it 'sets new headers_write_callback of duplicated handle' do - expect { e.perform }.to change { e.response_headers } - expect { e.perform }.not_to change { easy.response_headers } - end - - it "resets response_body" do - expect(e.response_body).to be_empty - end - - it "resets response_headers" do - expect(e.response_headers).to be_empty - end - - it "sets response_body for duplicated Easy" do - e.perform - expect(e.response_body).not_to be_empty - end - - it "sets response_headers for duplicated Easy" do - e.perform - expect(e.response_headers).not_to be_empty - end - - it "preserves response_body for original Easy" do - e.perform - expect(easy.response_body).to eq('test_body') - end - - it "preserves response_headers for original Easy" do - e.perform - expect(easy.response_headers).to eq('test_headers') - end - end - - describe "#mirror" do - it "returns a Mirror" do - expect(easy.mirror).to be_a(Ethon::Easy::Mirror) - end - - it "builds from easy" do - expect(Ethon::Easy::Mirror).to receive(:from_easy).with(easy) - easy.mirror - end - end - - describe "#log_inspect" do - [ :url, :response_code, :return_code, :total_time ].each do |name| - it "contains #{name}" do - expect(easy.log_inspect).to match name.to_s - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/libc_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/libc_spec.rb deleted file mode 100644 index a323151..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/libc_spec.rb +++ /dev/null @@ -1,14 +0,0 @@ -# frozen_string_literal: true -require 'spec_helper' - -describe Ethon::Libc do - describe "#getdtablesize", :if => !Ethon::Curl.windows? do - it "returns an integer" do - expect(Ethon::Libc.getdtablesize).to be_a(Integer) - end - - it "returns bigger zero", :if => !Ethon::Curl.windows? do - expect(Ethon::Libc.getdtablesize).to_not be_zero - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/loggable_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/loggable_spec.rb deleted file mode 100644 index 117cba3..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/loggable_spec.rb +++ /dev/null @@ -1,22 +0,0 @@ -# frozen_string_literal: true -require "spec_helper" - -describe Ethon::Loggable do - - describe "#logger=" do - - let(:logger) do - Logger.new($stdout).tap do |log| - log.level = Logger::INFO - end - end - - before do - Ethon.logger = logger - end - - it "sets the logger" do - expect(Ethon.logger).to eq(logger) - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/multi/operations_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/multi/operations_spec.rb deleted file mode 100644 index 781b62a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/multi/operations_spec.rb +++ /dev/null @@ -1,298 +0,0 @@ -# frozen_string_literal: true -require 'spec_helper' - -describe Ethon::Multi::Operations do - let(:multi) { Ethon::Multi.new } - let(:easy) { Ethon::Easy.new } - let(:pointer) { FFI::MemoryPointer.new(:int) } - - describe "#handle" do - it "returns a pointer" do - expect(multi.handle).to be_a(FFI::Pointer) - end - end - - describe "#running_count" do - context "when hydra has no easy" do - it "returns nil" do - expect(multi.send(:running_count)).to be_nil - end - end - - context "when hydra has easy" do - before do - easy.url = "http://localhost:3001/" - multi.add(easy) - multi.send(:trigger, pointer) - end - - it "returns 1" do - expect(multi.send(:running_count)).to eq(1) - end - end - - context "when hydra has more easys" do - let(:another_easy) { Ethon::Easy.new } - - before do - easy.url = "http://localhost:3001/" - another_easy.url = "http://localhost:3001/" - multi.add(easy) - multi.add(another_easy) - multi.send(:trigger, pointer) - end - - it "returns 2" do - expect(multi.send(:running_count)).to eq(2) - end - end - end - - describe "#get_timeout" do - context "when code ok" do - let(:timeout) { 1 } - - before do - expect(Ethon::Curl).to receive(:multi_timeout).and_return(:ok) - multi.instance_variable_set(:@timeout, double(:read_long => timeout)) - end - - it "doesn't raise" do - expect{ multi.send(:get_timeout) }.to_not raise_error - end - - context "when timeout smaller zero" do - let(:timeout) { -1 } - - it "returns 1" do - expect(multi.send(:get_timeout)).to eq(1) - end - end - - context "when timeout bigger or equal zero" do - let(:timeout) { 2 } - - it "returns timeout" do - expect(multi.send(:get_timeout)).to eq(timeout) - end - end - end - - context "when code not ok" do - before { expect(Ethon::Curl).to receive(:multi_timeout).and_return(:not_ok) } - - it "raises MultiTimeout error" do - expect{ multi.send(:get_timeout) }.to raise_error(Ethon::Errors::MultiTimeout) - end - end - end - - describe "#set_fds" do - let(:timeout) { 1 } - let(:max_fd) { 1 } - - context "when code ok" do - before { expect(Ethon::Curl).to receive(:multi_fdset).and_return(:ok) } - - it "doesn't raise" do - expect{ multi.method(:set_fds).call(timeout) }.to_not raise_error - end - - context "when max_fd -1" do - let(:max_fd) { -1 } - - before do - multi.instance_variable_set(:@max_fd, double(:read_int => max_fd)) - expect(multi).to receive(:sleep).with(0.001) - end - - it "waits 100ms" do - multi.method(:set_fds).call(timeout) - end - end - - context "when max_fd not -1" do - context "when code smaller zero" do - before { expect(Ethon::Curl).to receive(:select).and_return(-1) } - - it "raises Select error" do - expect{ multi.method(:set_fds).call(timeout) }.to raise_error(Ethon::Errors::Select) - end - end - - context "when code bigger or equal zero" do - before { expect(Ethon::Curl).to receive(:select).and_return(0) } - - it "doesn't raise" do - expect{ multi.method(:set_fds).call(timeout) }.to_not raise_error - end - end - end - end - - context "when code not ok" do - before { expect(Ethon::Curl).to receive(:multi_fdset).and_return(:not_ok) } - - it "raises MultiFdset error" do - expect{ multi.method(:set_fds).call(timeout) }.to raise_error(Ethon::Errors::MultiFdset) - end - end - end - - describe "#perform" do - context "when no easy handles" do - it "returns nil" do - expect(multi.perform).to be_nil - end - - it "logs" do - expect(Ethon.logger).to receive(:debug).twice - multi.perform - end - end - - context "when easy handle" do - before do - easy.url = "http://localhost:3001/" - multi.add(easy) - end - - it "requests" do - multi.perform - end - - it "sets easy" do - multi.perform - expect(easy.response_code).to eq(200) - end - end - - context "when four easy handles" do - let(:easies) do - ary = [] - 4.times do - ary << another_easy = Ethon::Easy.new - another_easy.url = "http://localhost:3001/" - end - ary - end - - before do - easies.each { |e| multi.add(e) } - multi.perform - end - - it "sets response codes" do - expect(easies.all?{ |e| e.response_code == 200 }).to be_truthy - end - end - end - - describe "#ongoing?" do - context "when easy_handles" do - before { multi.easy_handles << 1 } - - context "when running_count not greater 0" do - before { multi.instance_variable_set(:@running_count, 0) } - - it "returns true" do - expect(multi.method(:ongoing?).call).to be_truthy - end - end - - context "when running_count greater 0" do - before { multi.instance_variable_set(:@running_count, 1) } - - it "returns true" do - expect(multi.method(:ongoing?).call).to be_truthy - end - end - end - - context "when no easy_handles" do - context "when running_count not greater 0" do - before { multi.instance_variable_set(:@running_count, 0) } - - it "returns false" do - expect(multi.method(:ongoing?).call).to be_falsey - end - end - - context "when running_count greater 0" do - before { multi.instance_variable_set(:@running_count, 1) } - - it "returns true" do - expect(multi.method(:ongoing?).call).to be_truthy - end - end - end - end - - describe "#init_vars" do - it "sets @timeout" do - expect(multi.instance_variable_get(:@timeout)).to be_a(FFI::MemoryPointer) - end - - it "sets @timeval" do - expect(multi.instance_variable_get(:@timeval)).to be_a(Ethon::Curl::Timeval) - end - - it "sets @fd_read" do - expect(multi.instance_variable_get(:@fd_read)).to be_a(Ethon::Curl::FDSet) - end - - it "sets @fd_write" do - expect(multi.instance_variable_get(:@fd_write)).to be_a(Ethon::Curl::FDSet) - end - - it "sets @fd_excep" do - expect(multi.instance_variable_get(:@fd_excep)).to be_a(Ethon::Curl::FDSet) - end - - it "sets @max_fd" do - expect(multi.instance_variable_get(:@max_fd)).to be_a(FFI::MemoryPointer) - end - end - - describe "#reset_fds" do - after { multi.method(:reset_fds).call } - - it "resets @fd_read" do - expect(multi.instance_variable_get(:@fd_read)).to receive(:clear) - end - - it "resets @fd_write" do - expect(multi.instance_variable_get(:@fd_write)).to receive(:clear) - end - - it "resets @fd_excep" do - expect(multi.instance_variable_get(:@fd_excep)).to receive(:clear) - end - end - - describe "#check" do - it { skip("untested") } - end - - describe "#run" do - it { skip("untested") } - end - - describe "#trigger" do - it "calls multi perform" do - expect(Ethon::Curl).to receive(:multi_perform) - multi.send(:trigger, pointer) - end - - it "sets running count" do - multi.instance_variable_set(:@running_count, nil) - multi.send(:trigger, pointer) - expect(multi.instance_variable_get(:@running_count)).to_not be_nil - end - - it "returns multi perform code" do - expect(Ethon::Curl).to receive(:multi_perform).and_return(:ok) - expect(multi.send(:trigger, pointer)).to eq(:ok) - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/multi/options_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/multi/options_spec.rb deleted file mode 100644 index b4832c6..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/multi/options_spec.rb +++ /dev/null @@ -1,182 +0,0 @@ -# frozen_string_literal: true -require 'spec_helper' - -describe Ethon::Multi::Options do - let(:multi) { Ethon::Multi.new } - - [ - :maxconnects, :pipelining, :socketdata, :socketfunction, - :timerdata, :timerfunction, :max_total_connections - ].each do |name| - describe "#{name}=" do - it "responds_to" do - expect(multi).to respond_to("#{name}=") - end - - it "sets option" do - expect(Ethon::Curl).to receive(:set_option).with(name, anything, anything, anything) - multi.method("#{name}=").call(1) - end - end - end - - context "socket_action mode" do - let(:multi) { Ethon::Multi.new(execution_mode: :socket_action) } - - describe "#socketfunction callbacks" do - it "allows multi_code return values" do - calls = [] - multi.socketfunction = proc do |handle, sock, what, userp, socketp| - calls << what - :ok - end - - easy = Ethon::Easy.new - easy.url = "http://localhost:3001/?delay=1" - multi.add(easy) - expect(calls).to eq([]) - 5.times do - multi.socket_action - break unless calls.empty? - sleep 0.1 - end - expect(calls.last).to eq(:in).or(eq(:out)) - multi.delete(easy) - expect(calls.last).to eq(:remove) - end - - it "allows integer return values (compatibility)" do - called = false - multi.socketfunction = proc do |handle, sock, what, userp, socketp| - called = true - 0 - end - - easy = Ethon::Easy.new - easy.url = "http://localhost:3001/?delay=1" - multi.add(easy) - 5.times do - multi.socket_action - break if called - sleep 0.1 - end - multi.delete(easy) - - expect(called).to be_truthy - end - - it "errors on invalid return codes" do - called = false - multi.socketfunction = proc do |handle, sock, what, userp, socketp| - called = true - "hi" - end - - easy = Ethon::Easy.new - easy.url = "http://localhost:3001/?delay=1" - multi.add(easy) - expect { - 5.times do - multi.socket_action - break if called - sleep 0.1 - end - }.to raise_error(ArgumentError) - expect { multi.delete(easy) }.to raise_error(ArgumentError) - end - end - - describe "#timerfunction callbacks" do - it "allows multi_code return values" do - calls = [] - multi.timerfunction = proc do |handle, timeout_ms, userp| - calls << timeout_ms - :ok - end - - easy = Ethon::Easy.new - easy.url = "http://localhost:3001/?delay=1" - multi.add(easy) - expect(calls.last).to be >= 0 # adds an immediate timeout - - multi.delete(easy) - expect(calls.last).to eq(-1) # cancels the timer - end - - it "allows integer return values (compatibility)" do - called = false - multi.timerfunction = proc do |handle, timeout_ms, userp| - called = true - 0 - end - - easy = Ethon::Easy.new - easy.url = "http://localhost:3001/?delay=1" - multi.add(easy) - multi.socket_action - multi.delete(easy) - - expect(called).to be_truthy - end - - it "errors on invalid return codes" do - called = false - multi.timerfunction = proc do |handle, timeout_ms, userp| - called = true - "hi" - end - - easy = Ethon::Easy.new - easy.url = "http://localhost:3001/?delay=1" - expect { multi.add(easy) }.to raise_error(ArgumentError) - end - end - end - - describe "#value_for" do - context "when option in bool" do - context "when value true" do - let(:value) { true } - - it "returns 1" do - expect(multi.method(:value_for).call(value, :bool)).to eq(1) - end - end - - context "when value false" do - let(:value) { false } - - it "returns 0" do - expect(multi.method(:value_for).call(value, :bool)).to eq(0) - end - end - end - - - context "when value in int" do - let(:value) { "2" } - - it "returns value casted to int" do - expect(multi.method(:value_for).call(value, :int)).to eq(2) - end - end - - context "when value in unspecific_options" do - context "when value a string" do - let(:value) { "www.example.\0com" } - - it "returns zero byte escaped string" do - expect(multi.method(:value_for).call(value, nil)).to eq("www.example.\\0com") - end - end - - context "when value not a string" do - let(:value) { 1 } - - it "returns value" do - expect(multi.method(:value_for).call(value, nil)).to eq(1) - end - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/multi/stack_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/multi/stack_spec.rb deleted file mode 100644 index 5eb5900..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/multi/stack_spec.rb +++ /dev/null @@ -1,80 +0,0 @@ -# frozen_string_literal: true -require 'spec_helper' - -describe Ethon::Multi::Stack do - let(:multi) { Ethon::Multi.new } - let(:easy) { Ethon::Easy.new } - - describe "#add" do - context "when easy already added" do - before { multi.add(easy) } - - it "returns nil" do - expect(multi.add(easy)).to be_nil - end - end - - context "when easy new" do - it "adds easy to multi" do - expect(Ethon::Curl).to receive(:multi_add_handle).and_return(:ok) - multi.add(easy) - end - - it "adds easy to easy_handles" do - multi.add(easy) - expect(multi.easy_handles).to include(easy) - end - end - - context "when multi_add_handle fails" do - it "raises multi add error" do - expect(Ethon::Curl).to receive(:multi_add_handle).and_return(:bad_easy_handle) - expect{ multi.add(easy) }.to raise_error(Ethon::Errors::MultiAdd) - end - end - - context "when multi cleaned up before" do - it "raises multi add error" do - Ethon::Curl.multi_cleanup(multi.handle) - expect{ multi.add(easy) }.to raise_error(Ethon::Errors::MultiAdd) - end - end - end - - describe "#delete" do - context "when easy in easy_handles" do - before { multi.add(easy) } - - it "deletes easy from multi" do - expect(Ethon::Curl).to receive(:multi_remove_handle).and_return(:ok) - multi.delete(easy) - end - - it "deletes easy from easy_handles" do - multi.delete(easy) - expect(multi.easy_handles).to_not include(easy) - end - end - - context "when easy is not in easy_handles" do - it "does nothing" do - expect(Ethon::Curl).to receive(:multi_add_handle).and_return(:ok) - multi.add(easy) - end - - it "adds easy to easy_handles" do - multi.add(easy) - expect(multi.easy_handles).to include(easy) - end - end - - context "when multi_remove_handle fails" do - before { multi.add(easy) } - - it "raises multi remove error" do - expect(Ethon::Curl).to receive(:multi_remove_handle).and_return(:bad_easy_handle) - expect{ multi.delete(easy) }.to raise_error(Ethon::Errors::MultiRemove) - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/multi_spec.rb b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/multi_spec.rb deleted file mode 100644 index a483357..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/ethon/multi_spec.rb +++ /dev/null @@ -1,152 +0,0 @@ -# frozen_string_literal: true -require 'spec_helper' - -describe Ethon::Multi do - describe ".new" do - it "inits curl" do - expect(Ethon::Curl).to receive(:init) - Ethon::Multi.new - end - - context "with default options" do - it "allows running #perform with the default execution_mode" do - Ethon::Multi.new.perform - end - - it "refuses to run #socket_action" do - expect { Ethon::Multi.new.socket_action }.to raise_error(ArgumentError) - end - end - - context "when options not empty" do - context "when pipelining is set" do - let(:options) { { :pipelining => true } } - - it "sets pipelining" do - expect_any_instance_of(Ethon::Multi).to receive(:pipelining=).with(true) - Ethon::Multi.new(options) - end - end - - context "when execution_mode option is :socket_action" do - let(:options) { { :execution_mode => :socket_action } } - let(:multi) { Ethon::Multi.new(options) } - - it "refuses to run #perform" do - expect { multi.perform }.to raise_error(ArgumentError) - end - - it "allows running #socket_action" do - multi.socket_action - end - end - end - end - - describe "#socket_action" do - let(:options) { { :execution_mode => :socket_action } } - let(:select_state) { { :readers => [], :writers => [], :timeout => 0 } } - let(:multi) { - multi = Ethon::Multi.new(options) - multi.timerfunction = proc do |handle, timeout_ms, userp| - timeout_ms = nil if timeout_ms == -1 - select_state[:timeout] = timeout_ms - :ok - end - multi.socketfunction = proc do |handle, sock, what, userp, socketp| - case what - when :remove - select_state[:readers].delete(sock) - select_state[:writers].delete(sock) - when :in - select_state[:readers].push(sock) unless select_state[:readers].include? sock - select_state[:writers].delete(sock) - when :out - select_state[:readers].delete(sock) - select_state[:writers].push(sock) unless select_state[:writers].include? sock - when :inout - select_state[:readers].push(sock) unless select_state[:readers].include? sock - select_state[:writers].push(sock) unless select_state[:writers].include? sock - else - raise ArgumentError, "invalid value for 'what' in socketfunction callback" - end - :ok - end - multi - } - - def fds_to_ios(fds) - fds.map do |fd| - IO.for_fd(fd).tap { |io| io.autoclose = false } - end - end - - def perform_socket_action_until_complete - multi.socket_action # start things off - - while multi.ongoing? - readers, writers, _ = IO.select( - fds_to_ios(select_state[:readers]), - fds_to_ios(select_state[:writers]), - [], - select_state[:timeout] - ) - - to_notify = Hash.new { |hash, key| hash[key] = [] } - unless readers.nil? - readers.each do |reader| - to_notify[reader] << :in - end - end - unless writers.nil? - writers.each do |writer| - to_notify[writer] << :out - end - end - - to_notify.each do |io, readiness| - multi.socket_action(io, readiness) - end - - # if we didn't have anything to notify, then we timed out - multi.socket_action if to_notify.empty? - end - ensure - multi.easy_handles.dup.each do |h| - multi.delete(h) - end - end - - it "supports an end-to-end request" do - easy = Ethon::Easy.new - easy.url = "http://localhost:3001/" - multi.add(easy) - - perform_socket_action_until_complete - - expect(multi.ongoing?).to eq(false) - end - - it "supports multiple concurrent requests" do - handles = [] - 10.times do - easy = Ethon::Easy.new - easy.url = "http://localhost:3001/?delay=1" - multi.add(easy) - handles << easy - end - - start = Time.now - perform_socket_action_until_complete - duration = Time.now - start - - # these should have happened concurrently - expect(duration).to be < 2 - expect(multi.ongoing?).to eq(false) - - handles.each do |handle| - expect(handle.response_code).to eq(200) - end - end - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/spec_helper.rb b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/spec_helper.rb deleted file mode 100644 index 55bc9ec..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/spec_helper.rb +++ /dev/null @@ -1,28 +0,0 @@ -# frozen_string_literal: true -$LOAD_PATH.unshift(File.dirname(__FILE__)) -$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) - -require 'bundler' -Bundler.setup -require "ethon" -require 'rspec' - -if defined? require_relative - require_relative 'support/localhost_server' - require_relative 'support/server' -else - require 'support/localhost_server' - require 'support/server' -end - -# Ethon.logger = Logger.new($stdout).tap do |log| -# log.level = Logger::DEBUG -# end - -RSpec.configure do |config| - # config.order = :rand - - config.before(:suite) do - LocalhostServer.new(TESTSERVER.new, 3001) - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/support/localhost_server.rb b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/support/localhost_server.rb deleted file mode 100644 index a7b119a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/support/localhost_server.rb +++ /dev/null @@ -1,95 +0,0 @@ -# frozen_string_literal: true -require 'rack' -require 'rack/handler/webrick' -require 'net/http' - -# The code for this is inspired by Capybara's server: -# http://github.com/jnicklas/capybara/blob/0.3.9/lib/capybara/server.rb -class LocalhostServer - READY_MESSAGE = "Server ready" - - class Identify - def initialize(app) - @app = app - end - - def call(env) - if env["PATH_INFO"] == "/__identify__" - [200, {}, [LocalhostServer::READY_MESSAGE]] - else - @app.call(env) - end - end - end - - attr_reader :port - - def initialize(rack_app, port = nil) - @port = port || find_available_port - @rack_app = rack_app - concurrently { boot } - wait_until(10, "Boot failed.") { booted? } - end - - private - - def find_available_port - server = TCPServer.new('127.0.0.1', 0) - server.addr[1] - ensure - server.close if server - end - - def boot - # Use WEBrick since it's part of the ruby standard library and is available on all ruby interpreters. - options = { :Port => port } - options.merge!(:AccessLog => [], :Logger => WEBrick::BasicLog.new(StringIO.new)) unless ENV['VERBOSE_SERVER'] - Rack::Handler::WEBrick.run(Identify.new(@rack_app), **options) - end - - def booted? - res = ::Net::HTTP.get_response("localhost", '/__identify__', port) - if res.is_a?(::Net::HTTPSuccess) or res.is_a?(::Net::HTTPRedirection) - return res.body == READY_MESSAGE - end - rescue Errno::ECONNREFUSED, Errno::EBADF - return false - end - - def concurrently - if should_use_subprocess? - pid = Process.fork do - trap(:INT) { ::Rack::Handler::WEBrick.shutdown } - yield - exit # manually exit; otherwise this sub-process will re-run the specs that haven't run yet. - end - - at_exit do - Process.kill('INT', pid) - begin - Process.wait(pid) - rescue Errno::ECHILD - # ignore this error...I think it means the child process has already exited. - end - end - else - Thread.new { yield } - end - end - - def should_use_subprocess? - # !ENV['THREADED'] - false - end - - def wait_until(timeout, error_message, &block) - start_time = Time.now - - while true - return if yield - raise TimeoutError.new(error_message) if (Time.now - start_time) > timeout - sleep(0.05) - end - end -end - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/support/server.rb b/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/support/server.rb deleted file mode 100644 index ab8ffd3..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ethon-0.16.0/spec/support/server.rb +++ /dev/null @@ -1,115 +0,0 @@ -#!/usr/bin/env ruby -# frozen_string_literal: true -require 'json' -require 'zlib' -require 'sinatra/base' - -TESTSERVER = Sinatra.new do - set :logging, nil - - fail_count = 0 - - post '/file' do - { - 'content-type' => params[:file][:type], - 'filename' => params[:file][:filename], - 'content' => params[:file][:tempfile].read, - 'request-content-type' => request.env['CONTENT_TYPE'] - }.to_json - end - - get '/multiple-headers' do - [200, { 'Set-Cookie' => %w[ foo bar ], 'Content-Type' => 'text/plain' }, ['']] - end - - get '/fail/:number' do - if fail_count >= params[:number].to_i - "ok" - else - fail_count += 1 - error 500, "oh noes!" - end - end - - get '/fail_forever' do - error 500, "oh noes!" - end - - get '/redirect' do - redirect '/' - end - - post '/redirect' do - redirect '/' - end - - get '/bad_redirect' do - redirect '/bad_redirect' - end - - get '/auth_basic/:username/:password' do - @auth ||= Rack::Auth::Basic::Request.new(request.env) - # Check that we've got a basic auth, and that it's credentials match the ones - # provided in the request - if @auth.provided? && @auth.basic? && @auth.credentials == [ params[:username], params[:password] ] - # auth is valid - confirm it - true - else - # invalid auth - request the authentication - response['WWW-Authenticate'] = %(Basic realm="Testing HTTP Auth") - throw(:halt, [401, "Not authorized\n"]) - end - end - - get '/auth_ntlm' do - # we're just checking for the existence if NTLM auth header here. It's validation - # is too troublesome and really doesn't bother is much, it's up to libcurl to make - # it valid - response['WWW-Authenticate'] = 'NTLM' - is_ntlm_auth = /^NTLM/ =~ request.env['HTTP_AUTHORIZATION'] - true if is_ntlm_auth - throw(:halt, [401, "Not authorized\n"]) if !is_ntlm_auth - end - - get '/gzipped' do - req_env = request.env.to_json - z = Zlib::Deflate.new - gzipped_env = z.deflate(req_env, Zlib::FINISH) - z.close - response['Content-Encoding'] = 'gzip' - gzipped_env - end - - get '/**' do - sleep params["delay"].to_i if params.has_key?("delay") - request.env.merge!(:body => request.body.read).to_json - end - - head '/**' do - sleep params["delay"].to_i if params.has_key?("delay") - end - - put '/**' do - request.env.merge!(:body => request.body.read).to_json - end - - post '/**' do - request.env.merge!(:body => request.body.read).to_json - end - - delete '/**' do - request.env.merge!(:body => request.body.read).to_json - end - - patch '/**' do - request.env.merge!(:body => request.body.read).to_json - end - - options '/**' do - request.env.merge!(:body => request.body.read).to_json - end - - route 'PURGE', '/**' do - request.env.merge!(:body => request.body.read).to_json - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/CHANGELOG.md b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/CHANGELOG.md deleted file mode 100644 index 26b9ce7..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/CHANGELOG.md +++ /dev/null @@ -1,338 +0,0 @@ -1.15.5 / 2022-01-10 -------------------- - -Fixed: -* Fix long double argument or return values on 32bit i686. #849 -* FFI::ConstGenerator: avoid usage of the same binary file simultaneously. #929 - -Added: -* Add Windows fat binary gem for Ruby-3.1 - -Removed: -* Remove Windows fat binary gem for Ruby < 2.4 - - -1.15.4 / 2021-09-01 -------------------- - -Fixed: -* Fix build for uClibc. #913 -* Correct module lookup when including `ffi-module` gem. #912 - -Changed: -* Use ruby code of the ffi gem in JRuby-9.2.20+. #915 - - -1.15.3 / 2021-06-16 -------------------- - -Fixed: -* Fix temporary packaging issue with libffi. #904 - - -1.15.2 / 2021-06-16 -------------------- - -Added: -* Add support for Windows MINGW-UCRT build. #903 -* Add `/opt/homebrew/lib/` to fallback search paths to improve homebrew support. #880 #882 - -Changed: -* Regenerate `types.conf` for FreeBSD12 aarch64. #902 - - -1.15.1 / 2021-05-22 -------------------- - -Fixed: -* Append -pthread to linker options. #893 -* Use arm or aarch64 to identify Apple ARM CPU arch. #899 -* Allow overriding `gcc` with the `CC` env var in `const_generator.rb` and `struct_generator.rb`. #897 - - -1.15.0 / 2021-03-05 -------------------- - -Fixed: -* Fix MSVC build -* Fix async callbacks in conjunction with fork(). #884 - -Added: -* Allow to pass callbacks in varargs. #885 -* Name the threads for FFI callback dispatcher and async thread calls for easier debugging. #883 - The name can be retrieved by Thread.name and is shown by Thread.list.inspect etc. - Even gdb shows the thread name on supported operating systems. -* Add types.conf for powerpc64le-linux -* Add types.conf for riscv64-linux -* More release automation of ffi gems - -Changed: -* Switch from rubygems-tasks to bundler/gem_helper - -Removed: -* Remove unused VariadicInvoker#init - - -1.14.2 / 2020-12-21 -------------------- - -Fixed: -* Fix builtin libffi on newer Ubuntu caused by an outdated Makefile.in . #863 - - -1.14.1 / 2020-12-19 -------------------- - -Changed: -* Revert changes to FFI::Pointer#write_string made in ffi-1.14.0. - It breaks compatibilty in a way that can cause hard to find errors. #857 - - -1.14.0 / 2020-12-18 -------------------- - -Added: -* Add types.conf for x86_64-msys, x86_64-haiku, aarch64-openbsd and aarch64-darwin (alias arm64-darwin) -* Add method AbstractMemory#size_limit? . #829 -* Add new extconf option --enable-libffi-alloc which is enabled per default on Apple M1 (arm64-darwin). - -Changed: -* Do NULL pointer check only when array length > 0 . #305 -* Raise an error on an unknown order argument. #830 -* Change FFI::Pointer#write_string to terminate with a NUL byte like other string methods. #805 -* Update bundled libffi to latest master. - -Removed: -* Remove win32/stdint.h and stdbool.h because of copyright issue. #693 - -Fixed: -* Fix possible UTF-8 load error in loader script interpretation. #792 -* Fix segfault on non-array argument to #write_array_of_* -* Fix memory leak in MethodHandle . #815 -* Fix possible segfault in combination with fiddle or other libffi using gems . #835 -* Fix possibility to use ffi ruby gem with JRuby-9.3 . #763 -* Fix a GC issue, when a callback Proc is used on more than 2 callback signatures. #820 - - -1.13.1 / 2020-06-09 -------------------- - -Changed: -* Revert use of `ucrtbase.dll` as default C library on Windows-MINGW. - `ucrtbase.dll` is still used on MSWIN target. #790 -* Test for `ffi_prep_closure_loc()` to make sure we can use this function. - This fixes incorrect use of system libffi on MacOS Mojave (10.14). #787 -* Update types.conf on x86_64-dragonflybsd - - -1.13.0 / 2020-06-01 -------------------- - -Added: -* Add TruffleRuby support. Almost all specs are running on TruffleRuby and succeed. #768 -* Add ruby source files to the java gem. This allows to ship the Ruby library code per platform java gem and add it as a default gem to JRuby. #763 -* Add FFI::Platform::LONG_DOUBLE_SIZE -* Add bounds checks for writing to an inline char[] . #756 -* Add long double as callback return value. #771 -* Update type definitions and add types from stdint.h and stddef.h on i386-windows, x86_64-windows, x86_64-darwin, x86_64-linux, arm-linux, powerpc-linux. #749 -* Add new type definitions for powerpc-openbsd and sparcv9-openbsd. #775, #778 - -Changed: -* Raise required ruby version to >= 2.3. -* Lots of cleanups and improvements in library, specs and benchmarks. -* Fix a lot of compiler warnings at the C-extension -* Fix several install issues on MacOS: - * Look for libffi in SDK paths, since recent versions of macOS removed it from `/usr/include` . #757 - * Fix error `ld: library not found for -lgcc_s.10.4` - * Don't built for i386 architecture as it is deprecated -* Several fixes for MSVC build on Windows. #779 -* Use `ucrtbase.dll` as default C library on Windows instead of old `msvcrt.dll`. #779 -* Update builtin libffi to fix a Powerpc issue with parameters of type long -* Allow unmodified sourcing of (the ruby code of) this gem in JRuby and TruffleRuby as a default gem. #747 -* Improve check to detect if a module has a #find_type method suitable for FFI. This fixes compatibility with stdlib `mkmf` . #776 - -Removed: -* Reject callback with `:string` return type at definition, because it didn't work so far and is not save to use. #751, #782 - - -1.12.2 / 2020-02-01 -------------------- - -* Fix possible segfault at FFI::Struct#[] and []= after GC.compact . #742 - - -1.12.1 / 2020-01-14 -------------------- - -Added: -* Add binary gem support for ruby-2.7 on Windows - - -1.12.0 / 2020-01-14 -------------------- - -Added: -* FFI::VERSION is defined as part of `require 'ffi'` now. - It is no longer necessary to `require 'ffi/version'` . - -Changed: -* Update libffi to latest master. - -Deprecated: -* Overwriting struct layouts is now warned and will be disallowed in ffi-2.0. #734, #735 - - -1.11.3 / 2019-11-25 -------------------- - -Removed: -* Remove support for tainted objects which cause deprecation warnings in ruby-2.7. #730 - - -1.11.2 / 2019-11-11 -------------------- - -Added: -* Add DragonFlyBSD as a platform. #724 - -Changed: -* Sort all types.conf files, so that files and changes are easier to compare. -* Regenerated type conf for freebsd12 and x86_64-linux targets. #722 -* Remove MACOSX_DEPLOYMENT_TARGET that was targeting very old version 10.4. #647 -* Fix library name mangling for non glibc Linux/UNIX. #727 -* Fix compiler warnings raised by ruby-2.7 -* Update libffi to latest master. - - -1.11.1 / 2019-05-20 -------------------- - -Changed: -* Raise required ruby version to >=2.0. #699, #700 -* Fix a possible linker error on ruby < 2.3 on Linux. - - -1.11.0 / 2019-05-17 -------------------- -This version was yanked on 2019-05-20 to fix an install issue on ruby-1.9.3. #700 - -Added: -* Add ability to disable or force use of system libffi. #669 - Use like `gem inst ffi -- --enable-system-libffi` . -* Add ability to call FFI callbacks from outside of FFI call frame. #584 -* Add proper documentation to FFI::Generator and ::Task -* Add gemspec metadata. #696, #698 - -Changed: -* Fix stdcall on Win32. #649, #669 -* Fix load paths for FFI::Generator::Task -* Fix FFI::Pointer#read_string(0) to return a binary String. #692 -* Fix benchmark suite so that it runs on ruby-2.x -* Move FFI::Platform::CPU from C to Ruby. #663 -* Move FFI::StructByReference to Ruby. #681 -* Move FFI::DataConverter to Ruby (#661) -* Various cleanups and improvements of specs and benchmarks - -Removed: -* Remove ruby-1.8 and 1.9 compatibility code. #683 -* Remove unused spec files. #684 - - -1.10.0 / 2019-01-06 -------------------- - -Added: -* Add /opt/local/lib/ to ffi's fallback library search path. #638 -* Add binary gem support for ruby-2.6 on Windows -* Add FreeBSD on AArch64 and ARM support. #644 -* Add FFI::LastError.winapi_error on Windows native or Cygwin. #633 - -Changed: -* Update to rake-compiler-dock-0.7.0 -* Use 64-bit inodes on FreeBSD >= 12. #644 -* Switch time_t and suseconds_t types to long on FreeBSD. #627 -* Make register_t long_long on 64-bit FreeBSD. #644 -* Fix Pointer#write_array_of_type #637 - -Removed: -* Drop binary gem support for ruby-2.0 and 2.1 on Windows - - -1.9.25 / 2018-06-03 -------------------- - -Changed: -* Revert closures via libffi. - This re-adds ClosurePool and fixes compat with SELinux enabled systems. #621 - - -1.9.24 / 2018-06-02 -------------------- - -Security Note: - -This update addresses vulnerability CVE-2018-1000201: DLL loading issue which can be hijacked on Windows OS, when a Symbol is used as DLL name instead of a String. Found by Matthew Bush. - -Added: -* Added a CHANGELOG file -* Add mips64(eb) support, and mips r6 support. (#601) - -Changed: -* Update libffi to latest changes on master. -* Don't search in hardcoded /usr paths on Windows. -* Don't treat Symbol args different to Strings in ffi_lib. -* Make sure size_t is defined in Thread.c. Fixes #609 - - -1.9.23 / 2018-02-25 -------------------- - -Changed: -* Fix unnecessary rebuild of configure in darwin multi arch. Fixes #605 - - -1.9.22 / 2018-02-22 -------------------- - -Changed: -* Update libffi to latest changes on master. -* Update detection of system libffi to match new requirements. Fixes #617 -* Prefer bundled libffi over system libffi on Mac OS. -* Do closures via libffi. This removes ClosurePool and fixes compat with PaX. #540 -* Use a more deterministic gem packaging. -* Fix unnecessary update of autoconf files at gem install. - - -1.9.21 / 2018-02-06 -------------------- - -Added: -* Ruby-2.5 support by Windows binary gems. Fixes #598 -* Add missing win64 types. -* Added support for Bitmask. (#573) -* Add support for MSYS2 (#572) and Sparc64 Linux. (#574) - -Changed: -* Fix read_string to not throw an error on length 0. -* Don't use absolute paths for sh and env. Fixes usage on Adroid #528 -* Use Ruby implementation for `which` for better compat with Windows. Fixes #315 -* Fix compatibility with PPC64LE platform. (#577) -* Normalize sparc64 to sparcv9. (#575) - -Removed: -* Drop Ruby 1.8.7 support (#480) - - -1.9.18 / 2017-03-03 -------------------- - -Added: -* Add compatibility with Ruby-2.4. - -Changed: -* Add missing shlwapi.h include to fix Windows build. -* Avoid undefined behaviour of LoadLibrary() on Windows. #553 - - -1.9.17 / 2017-01-13 -------------------- diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/COPYING b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/COPYING deleted file mode 100644 index 7622318..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/COPYING +++ /dev/null @@ -1,49 +0,0 @@ -Copyright (c) 2008-2013, Ruby FFI project contributors -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 the Ruby FFI project 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 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. - -libffi, used by this project, is licensed under the MIT license: - -libffi - Copyright (c) 1996-2011 Anthony Green, Red Hat, Inc and others. -See source files for details. - -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/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/Gemfile b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/Gemfile deleted file mode 100644 index ad819ef..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/Gemfile +++ /dev/null @@ -1,14 +0,0 @@ -source 'https://rubygems.org' - -group :development do - gem 'rake', '~> 13.0' - gem 'rake-compiler', '~> 1.0.3' - gem 'rake-compiler-dock', '~> 1.0' - gem 'rspec', '~> 3.0' - gem 'bundler', '>= 1.16', '< 3' -end - -group :doc do - gem 'kramdown' - gem 'yard', '~> 0.9' -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/LICENSE b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/LICENSE deleted file mode 100644 index 20185fd..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/LICENSE +++ /dev/null @@ -1,24 +0,0 @@ -Copyright (c) 2008-2016, Ruby FFI project contributors -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 the Ruby FFI project 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 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/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/LICENSE.SPECS b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/LICENSE.SPECS deleted file mode 100644 index 5c9ffce..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/LICENSE.SPECS +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2008-2012 Ruby-FFI contributors - -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/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/README.md b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/README.md deleted file mode 100644 index 5845f26..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/README.md +++ /dev/null @@ -1,136 +0,0 @@ -# Ruby-FFI https://github.com/ffi/ffi/wiki [![Build Status](https://travis-ci.com/ffi/ffi.svg?branch=master)](https://travis-ci.com/ffi/ffi) [![Build status Windows](https://ci.appveyor.com/api/projects/status/r8wxn1sd4s794gg1/branch/master?svg=true)](https://ci.appveyor.com/project/larskanis/ffi-aofqa/branch/master) - -## Description - -Ruby-FFI is a gem for programmatically loading dynamically-linked native -libraries, binding functions within them, and calling those functions -from Ruby code. Moreover, a Ruby-FFI extension works without changes -on CRuby (MRI), JRuby, Rubinius and TruffleRuby. [Discover why you should write your next extension -using Ruby-FFI](https://github.com/ffi/ffi/wiki/why-use-ffi). - -## Features - -* Intuitive DSL -* Supports all C native types -* C structs (also nested), enums and global variables -* Callbacks from C to Ruby -* Automatic garbage collection of native memory - -## Synopsis - -```ruby -require 'ffi' - -module MyLib - extend FFI::Library - ffi_lib 'c' - attach_function :puts, [ :string ], :int -end - -MyLib.puts 'Hello, World using libc!' -``` - -For less minimalistic and more examples you may look at: - -* the `samples/` folder -* the examples on the [wiki](https://github.com/ffi/ffi/wiki) -* the projects using FFI listed on the wiki: https://github.com/ffi/ffi/wiki/projects-using-ffi - -## Requirements - -When installing the gem on CRuby (MRI), you will need: -* A C compiler (e.g., Xcode on macOS, `gcc` or `clang` on everything else) -Optionally (speeds up installation): -* The `libffi` library and development headers - this is commonly in the `libffi-dev` or `libffi-devel` packages - -The ffi gem comes with a builtin libffi version, which is used, when the system libffi library is not available or too old. -Use of the system libffi can be enforced by: -``` -gem install ffi -- --enable-system-libffi # to install the gem manually -bundle config build.ffi --enable-system-libffi # for bundle install -``` -or prevented by `--disable-system-libffi`. - -On Linux systems running with [PaX](https://en.wikipedia.org/wiki/PaX) (Gentoo, Alpine, etc.), FFI may trigger `mprotect` errors. You may need to disable [mprotect](https://en.wikibooks.org/wiki/Grsecurity/Appendix/Grsecurity_and_PaX_Configuration_Options#Restrict_mprotect.28.29) for ruby (`paxctl -m [/path/to/ruby]`) for the time being until a solution is found. - -On FreeBSD systems pkgconf must be installed for the gem to be able to compile using clang. Install either via packages `pkg install pkgconf` or from ports via `devel/pkgconf`. - -On JRuby and TruffleRuby, there are no requirements to install the FFI gem, and `require 'ffi'` works even without installing the gem (i.e., the gem is preinstalled on these implementations). - -## Installation - -From rubygems: - - [sudo] gem install ffi - -From a Gemfile using git or GitHub - - gem 'ffi', github: 'ffi/ffi', submodules: true - -or from the git repository on github: - - git clone git://github.com/ffi/ffi.git - cd ffi - git submodule update --init --recursive - bundle install - rake install - -### Install options: - -* `--enable-system-libffi` : Force usage of system libffi -* `--disable-system-libffi` : Force usage of builtin libffi -* `--enable-libffi-alloc` : Force closure allocation by libffi -* `--disable-libffi-alloc` : Force closure allocation by builtin method - -## License - -The ffi library is covered by the BSD license, also see the LICENSE file. -The specs are covered by the same license as [ruby/spec](https://github.com/ruby/spec), the MIT license. - -## Credits - -The following people have submitted code, bug reports, or otherwise contributed to the success of this project: - -* Alban Peignier -* Aman Gupta -* Andrea Fazzi -* Andreas Niederl -* Andrew Cholakian -* Antonio Terceiro -* Benoit Daloze -* Brian Candler -* Brian D. Burns -* Bryan Kearney -* Charlie Savage -* Chikanaga Tomoyuki -* Hongli Lai -* Ian MacLeod -* Jake Douglas -* Jean-Dominique Morani -* Jeremy Hinegardner -* Jesús García Sáez -* Joe Khoobyar -* Jurij Smakov -* KISHIMOTO, Makoto -* Kim Burgestrand -* Lars Kanis -* Luc Heinrich -* Luis Lavena -* Matijs van Zuijlen -* Matthew King -* Mike Dalessio -* NARUSE, Yui -* Park Heesob -* Shin Yee -* Stephen Bannasch -* Suraj N. Kurapati -* Sylvain Daubert -* Victor Costan -* beoran@gmail.com -* ctide -* emboss -* hobophobe -* meh -* postmodern -* wycats@gmail.com -* Wayne Meissner diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/Rakefile b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/Rakefile deleted file mode 100644 index 7175060..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/Rakefile +++ /dev/null @@ -1,191 +0,0 @@ -require 'rbconfig' -require 'date' -require 'fileutils' -require 'rbconfig' -require 'rspec/core/rake_task' -require 'rubygems/package_task' -require 'rake/extensiontask' -require_relative "lib/ffi/version" -require_relative "rakelib/ffi_gem_helper" - -BUILD_DIR = "build" -BUILD_EXT_DIR = File.join(BUILD_DIR, "#{RbConfig::CONFIG['arch']}", 'ffi_c', RUBY_VERSION) - -gem_spec = Bundler.load_gemspec('ffi.gemspec') - -RSpec::Core::RakeTask.new(:spec => :compile) do |config| - config.rspec_opts = YAML.load_file 'spec/spec.opts' -end - -desc "Build all packages" -task :package => %w[ gem:java gem:native ] - -CLOBBER.include 'lib/ffi/types.conf' -CLOBBER.include 'pkg' -CLOBBER.include 'log' - -CLEAN.include 'build' -CLEAN.include 'conftest.dSYM' -CLEAN.include 'spec/ffi/fixtures/libtest.{dylib,so,dll}' -CLEAN.include 'spec/ffi/fixtures/*.o' -CLEAN.include 'spec/ffi/embed-test/ext/*.{o,def}' -CLEAN.include 'spec/ffi/embed-test/ext/Makefile' -CLEAN.include "pkg/ffi-*-{mingw32,java}" -CLEAN.include 'lib/1.*' -CLEAN.include 'lib/2.*' - -# clean all shipped files, that are not in git -CLEAN.include( - gem_spec.files - - `git --git-dir ext/ffi_c/libffi/.git ls-files -z`.split("\x0").map { |f| File.join("ext/ffi_c/libffi", f) } - - `git ls-files -z`.split("\x0") -) - -task :distclean => :clobber - -desc "Test the extension" -task :test => [ :spec ] - - -namespace :bench do - ITER = ENV['ITER'] ? ENV['ITER'].to_i : 100000 - bench_files = Dir["bench/bench_*.rb"].sort.reject { |f| f == "bench/bench_helper.rb" } - bench_files.each do |bench| - task File.basename(bench, ".rb")[6..-1] => :compile do - sh %{#{Gem.ruby} #{bench} #{ITER}} - end - end - task :all => :compile do - bench_files.each do |bench| - sh %{#{Gem.ruby} #{bench}} - end - end -end - -task 'spec:run' => :compile -task 'spec:specdoc' => :compile - -task :default => :spec - -namespace 'java' do - - java_gem_spec = gem_spec.dup.tap do |s| - s.files.reject! { |f| File.fnmatch?("ext/*", f) } - s.extensions = [] - s.platform = 'java' - end - - Gem::PackageTask.new(java_gem_spec) do |pkg| - pkg.need_zip = true - pkg.need_tar = true - pkg.package_dir = 'pkg' - end -end - -task 'gem:java' => 'java:gem' - -FfiGemHelper.install_tasks -# Register windows gems to be pushed to rubygems.org -Bundler::GemHelper.instance.cross_platforms = %w[x86-mingw32 x64-mingw-ucrt x64-mingw32] - -if RUBY_ENGINE == 'ruby' || RUBY_ENGINE == 'rbx' - require 'rake/extensiontask' - Rake::ExtensionTask.new('ffi_c', gem_spec) do |ext| - ext.name = 'ffi_c' # indicate the name of the extension. - # ext.lib_dir = BUILD_DIR # put binaries into this folder. - ext.tmp_dir = BUILD_DIR # temporary folder used during compilation. - ext.cross_compile = true # enable cross compilation (requires cross compile toolchain) - ext.cross_platform = Bundler::GemHelper.instance.cross_platforms - ext.cross_compiling do |spec| - spec.files.reject! { |path| File.fnmatch?('ext/*', path) } - end - - end -else - task :compile do - STDERR.puts "Nothing to compile on #{RUBY_ENGINE}" - end -end - - -namespace "gem" do - task 'prepare' do - require 'rake_compiler_dock' - sh "bundle package --all" - end - - Bundler::GemHelper.instance.cross_platforms.each do |plat| - desc "Build all native binary gems in parallel" - multitask 'native' => plat - - desc "Build the native gem for #{plat}" - task plat => ['prepare', 'build'] do - RakeCompilerDock.sh <<-EOT, platform: plat - sudo apt-get update && - sudo apt-get install -y libltdl-dev && bundle --local && - rake cross native gem MAKE='nice make -j`nproc`' RUBY_CC_VERSION=${RUBY_CC_VERSION/:2.2.2/} - EOT - end - end -end - -directory "ext/ffi_c/libffi" -file "ext/ffi_c/libffi/autogen.sh" => "ext/ffi_c/libffi" do - warn "Downloading libffi ..." - sh "git submodule update --init --recursive" -end -task :libffi => "ext/ffi_c/libffi/autogen.sh" - -LIBFFI_GIT_FILES = `git --git-dir ext/ffi_c/libffi/.git ls-files -z`.split("\x0") - -# Generate files which are in the gemspec but not in libffi's git repo by running autogen.sh -gem_spec.files.select do |f| - f =~ /ext\/ffi_c\/libffi\/(.*)/ && !LIBFFI_GIT_FILES.include?($1) -end.each do |f| - file f => "ext/ffi_c/libffi/autogen.sh" do - chdir "ext/ffi_c/libffi" do - sh "sh ./autogen.sh" - end - touch f - if gem_spec.files != Gem::Specification.load('./ffi.gemspec').files - warn "gemspec files have changed -> Please restart rake!" - exit 1 - end - end -end - -# Make sure we have all gemspec files before packaging -task :build => gem_spec.files -task :gem => :build - - -require_relative "lib/ffi/platform" -types_conf = File.expand_path(File.join(FFI::Platform::CONF_DIR, 'types.conf')) -logfile = File.join(File.dirname(__FILE__), 'types_log') - -task types_conf do |task| - require 'fileutils' - require_relative "lib/ffi/tools/types_generator" - options = {} - FileUtils.mkdir_p(File.dirname(task.name), mode: 0755 ) - File.open(task.name, File::CREAT|File::TRUNC|File::RDWR, 0644) do |f| - f.puts FFI::TypesGenerator.generate(options) - end - File.open(logfile, 'w') do |log| - log.puts(types_conf) - end -end - -desc "Create or update type information for platform #{FFI::Platform::NAME}" -task :types_conf => types_conf - -begin - require 'yard' - - namespace :doc do - YARD::Rake::YardocTask.new do |yard| - end - end -rescue LoadError - warn "[warn] YARD unavailable" -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/.sitearchdir.time b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/.sitearchdir.time deleted file mode 100644 index e69de29..0000000 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/AbstractMemory.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/AbstractMemory.c deleted file mode 100644 index 1a7fcde..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/AbstractMemory.c +++ /dev/null @@ -1,1104 +0,0 @@ -/* - * Copyright (c) 2008, 2009, Wayne Meissner - * Copyright (C) 2009 Jake Douglas - * Copyright (C) 2008 Luc Heinrich - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * 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 the Ruby FFI project 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 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. - */ - -#include -#ifndef _MSC_VER -# include -#endif -#include -#include - -#include -#include - -#include "rbffi.h" -#include "compat.h" -#include "AbstractMemory.h" -#include "Pointer.h" -#include "Function.h" -#include "LongDouble.h" - -#ifdef PRIsVALUE -# define RB_OBJ_CLASSNAME(obj) rb_obj_class(obj) -# define RB_OBJ_STRING(obj) (obj) -#else -# define PRIsVALUE "s" -# define RB_OBJ_CLASSNAME(obj) rb_obj_classname(obj) -# define RB_OBJ_STRING(obj) StringValueCStr(obj) -#endif - -static inline char* memory_address(VALUE self); -VALUE rbffi_AbstractMemoryClass = Qnil; -static VALUE NullPointerErrorClass = Qnil; -static ID id_to_ptr = 0, id_plus = 0, id_call = 0; - -static VALUE -memory_allocate(VALUE klass) -{ - AbstractMemory* memory; - VALUE obj; - obj = Data_Make_Struct(klass, AbstractMemory, NULL, -1, memory); - memory->flags = MEM_RD | MEM_WR; - - return obj; -} -#define VAL(x, swap) (unlikely(((memory->flags & MEM_SWAP) != 0)) ? swap((x)) : (x)) - -#define NUM_OP(name, type, toNative, fromNative, swap) \ -static void memory_op_put_##name(AbstractMemory* memory, long off, VALUE value); \ -static void \ -memory_op_put_##name(AbstractMemory* memory, long off, VALUE value) \ -{ \ - type tmp = (type) VAL(toNative(value), swap); \ - checkWrite(memory); \ - checkBounds(memory, off, sizeof(type)); \ - memcpy(memory->address + off, &tmp, sizeof(tmp)); \ -} \ -static VALUE memory_put_##name(VALUE self, VALUE offset, VALUE value); \ -static VALUE \ -memory_put_##name(VALUE self, VALUE offset, VALUE value) \ -{ \ - AbstractMemory* memory; \ - Data_Get_Struct(self, AbstractMemory, memory); \ - memory_op_put_##name(memory, NUM2LONG(offset), value); \ - return self; \ -} \ -static VALUE memory_write_##name(VALUE self, VALUE value); \ -static VALUE \ -memory_write_##name(VALUE self, VALUE value) \ -{ \ - AbstractMemory* memory; \ - Data_Get_Struct(self, AbstractMemory, memory); \ - memory_op_put_##name(memory, 0, value); \ - return self; \ -} \ -static VALUE memory_op_get_##name(AbstractMemory* memory, long off); \ -static VALUE \ -memory_op_get_##name(AbstractMemory* memory, long off) \ -{ \ - type tmp; \ - checkRead(memory); \ - checkBounds(memory, off, sizeof(type)); \ - memcpy(&tmp, memory->address + off, sizeof(tmp)); \ - return fromNative(VAL(tmp, swap)); \ -} \ -static VALUE memory_get_##name(VALUE self, VALUE offset); \ -static VALUE \ -memory_get_##name(VALUE self, VALUE offset) \ -{ \ - AbstractMemory* memory; \ - Data_Get_Struct(self, AbstractMemory, memory); \ - return memory_op_get_##name(memory, NUM2LONG(offset)); \ -} \ -static VALUE memory_read_##name(VALUE self); \ -static VALUE \ -memory_read_##name(VALUE self) \ -{ \ - AbstractMemory* memory; \ - Data_Get_Struct(self, AbstractMemory, memory); \ - return memory_op_get_##name(memory, 0); \ -} \ -static MemoryOp memory_op_##name = { memory_op_get_##name, memory_op_put_##name }; \ -\ -static VALUE memory_put_array_of_##name(VALUE self, VALUE offset, VALUE ary); \ -static VALUE \ -memory_put_array_of_##name(VALUE self, VALUE offset, VALUE ary) \ -{ \ - long count; \ - long off = NUM2LONG(offset); \ - AbstractMemory* memory = MEMORY(self); \ - long i; \ - Check_Type(ary, T_ARRAY); \ - count = RARRAY_LEN(ary); \ - if (likely(count > 0)) checkWrite(memory); \ - checkBounds(memory, off, count * sizeof(type)); \ - for (i = 0; i < count; i++) { \ - type tmp = (type) VAL(toNative(RARRAY_PTR(ary)[i]), swap); \ - memcpy(memory->address + off + (i * sizeof(type)), &tmp, sizeof(tmp)); \ - } \ - return self; \ -} \ -static VALUE memory_write_array_of_##name(VALUE self, VALUE ary); \ -static VALUE \ -memory_write_array_of_##name(VALUE self, VALUE ary) \ -{ \ - return memory_put_array_of_##name(self, INT2FIX(0), ary); \ -} \ -static VALUE memory_get_array_of_##name(VALUE self, VALUE offset, VALUE length); \ -static VALUE \ -memory_get_array_of_##name(VALUE self, VALUE offset, VALUE length) \ -{ \ - long count = NUM2LONG(length); \ - long off = NUM2LONG(offset); \ - AbstractMemory* memory = MEMORY(self); \ - VALUE retVal = rb_ary_new2(count); \ - long i; \ - if (likely(count > 0)) checkRead(memory); \ - checkBounds(memory, off, count * sizeof(type)); \ - for (i = 0; i < count; ++i) { \ - type tmp; \ - memcpy(&tmp, memory->address + off + (i * sizeof(type)), sizeof(tmp)); \ - rb_ary_push(retVal, fromNative(VAL(tmp, swap))); \ - } \ - return retVal; \ -} \ -static VALUE memory_read_array_of_##name(VALUE self, VALUE length); \ -static VALUE \ -memory_read_array_of_##name(VALUE self, VALUE length) \ -{ \ - return memory_get_array_of_##name(self, INT2FIX(0), length); \ -} - -#define NOSWAP(x) (x) -#define bswap16(x) (((x) >> 8) & 0xff) | (((x) << 8) & 0xff00); -static inline int16_t -SWAPS16(int16_t x) -{ - return bswap16(x); -} - -static inline uint16_t -SWAPU16(uint16_t x) -{ - return bswap16(x); -} - -#if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 3) -#define bswap32(x) \ - (((x << 24) & 0xff000000) | \ - ((x << 8) & 0x00ff0000) | \ - ((x >> 8) & 0x0000ff00) | \ - ((x >> 24) & 0x000000ff)) - -#define bswap64(x) \ - (((x << 56) & 0xff00000000000000ULL) | \ - ((x << 40) & 0x00ff000000000000ULL) | \ - ((x << 24) & 0x0000ff0000000000ULL) | \ - ((x << 8) & 0x000000ff00000000ULL) | \ - ((x >> 8) & 0x00000000ff000000ULL) | \ - ((x >> 24) & 0x0000000000ff0000ULL) | \ - ((x >> 40) & 0x000000000000ff00ULL) | \ - ((x >> 56) & 0x00000000000000ffULL)) - -static inline int32_t -SWAPS32(int32_t x) -{ - return bswap32(x); -} - -static inline uint32_t -SWAPU32(uint32_t x) -{ - return bswap32(x); -} - -static inline int64_t -SWAPS64(int64_t x) -{ - return bswap64(x); -} - -static inline uint64_t -SWAPU64(uint64_t x) -{ - return bswap64(x); -} - -#else -# define SWAPS32(x) ((int32_t) __builtin_bswap32(x)) -# define SWAPU32(x) ((uint32_t) __builtin_bswap32(x)) -# define SWAPS64(x) ((int64_t) __builtin_bswap64(x)) -# define SWAPU64(x) ((uint64_t) __builtin_bswap64(x)) -#endif - -#if LONG_MAX > INT_MAX -# define SWAPSLONG SWAPS64 -# define SWAPULONG SWAPU64 -#else -# define SWAPSLONG SWAPS32 -# define SWAPULONG SWAPU32 -#endif - -NUM_OP(int8, int8_t, NUM2INT, INT2NUM, NOSWAP); -NUM_OP(uint8, uint8_t, NUM2UINT, UINT2NUM, NOSWAP); -NUM_OP(int16, int16_t, NUM2INT, INT2NUM, SWAPS16); -NUM_OP(uint16, uint16_t, NUM2UINT, UINT2NUM, SWAPU16); -NUM_OP(int32, int32_t, NUM2INT, INT2NUM, SWAPS32); -NUM_OP(uint32, uint32_t, NUM2UINT, UINT2NUM, SWAPU32); -NUM_OP(int64, int64_t, NUM2LL, LL2NUM, SWAPS64); -NUM_OP(uint64, uint64_t, NUM2ULL, ULL2NUM, SWAPU64); -NUM_OP(long, long, NUM2LONG, LONG2NUM, SWAPSLONG); -NUM_OP(ulong, unsigned long, NUM2ULONG, ULONG2NUM, SWAPULONG); -NUM_OP(float32, float, NUM2DBL, rb_float_new, NOSWAP); -NUM_OP(float64, double, NUM2DBL, rb_float_new, NOSWAP); -NUM_OP(longdouble, long double, rbffi_num2longdouble, rbffi_longdouble_new, NOSWAP); - -static inline void* -get_pointer_value(VALUE value) -{ - const int type = TYPE(value); - if (type == T_DATA && rb_obj_is_kind_of(value, rbffi_PointerClass)) { - return memory_address(value); - } else if (type == T_NIL) { - return NULL; - } else if (type == T_FIXNUM) { - return (void *) (uintptr_t) FIX2ULONG(value); - } else if (type == T_BIGNUM) { - return (void *) (uintptr_t) NUM2ULL(value); - } else if (rb_respond_to(value, id_to_ptr)) { - return MEMORY_PTR(rb_funcall2(value, id_to_ptr, 0, NULL)); - } else { - rb_raise(rb_eArgError, "value is not a pointer"); - return NULL; - } -} - -NUM_OP(pointer, void *, get_pointer_value, rbffi_Pointer_NewInstance, NOSWAP); - -static inline uint8_t -rbffi_bool_value(VALUE value) -{ - return RTEST(value); -} - -static inline VALUE -rbffi_bool_new(uint8_t value) -{ - return (value & 1) != 0 ? Qtrue : Qfalse; -} - -NUM_OP(bool, unsigned char, rbffi_bool_value, rbffi_bool_new, NOSWAP); - - -/* - * call-seq: memory.clear - * Set the memory to all-zero. - * @return [self] - */ -static VALUE -memory_clear(VALUE self) -{ - AbstractMemory* ptr = MEMORY(self); - memset(ptr->address, 0, ptr->size); - return self; -} - -/* - * call-seq: memory.size - * Return memory size in bytes (alias: #total) - * @return [Numeric] - */ -static VALUE -memory_size(VALUE self) -{ - AbstractMemory* ptr; - - Data_Get_Struct(self, AbstractMemory, ptr); - - return LONG2NUM(ptr->size); -} - -/* - * call-seq: memory.get(type, offset) - * Return data of given type contained in memory. - * @param [Symbol, Type] type_name type of data to get - * @param [Numeric] offset point in buffer to start from - * @return [Object] - * @raise {ArgumentError} if type is not supported - */ -static VALUE -memory_get(VALUE self, VALUE type_name, VALUE offset) -{ - AbstractMemory* ptr; - VALUE nType; - Type *type; - - nType = rbffi_Type_Lookup(type_name); - if(NIL_P(nType)) goto undefined_type; - - Data_Get_Struct(self, AbstractMemory, ptr); - Data_Get_Struct(nType, Type, type); - - MemoryOp *op = get_memory_op(type); - if(op == NULL) goto undefined_type; - - return op->get(ptr, NUM2LONG(offset)); - -undefined_type: { - VALUE msg = rb_sprintf("undefined type '%" PRIsVALUE "'", type_name); - rb_exc_raise(rb_exc_new3(rb_eArgError, msg)); - return Qnil; - } -} - -/* - * call-seq: memory.put(type, offset, value) - * @param [Symbol, Type] type_name type of data to put - * @param [Numeric] offset point in buffer to start from - * @return [nil] - * @raise {ArgumentError} if type is not supported - */ -static VALUE -memory_put(VALUE self, VALUE type_name, VALUE offset, VALUE value) -{ - AbstractMemory* ptr; - VALUE nType; - Type *type; - - nType = rbffi_Type_Lookup(type_name); - if(NIL_P(nType)) goto undefined_type; - - Data_Get_Struct(self, AbstractMemory, ptr); - Data_Get_Struct(nType, Type, type); - - MemoryOp *op = get_memory_op(type); - if(op == NULL) goto undefined_type; - - op->put(ptr, NUM2LONG(offset), value); - return Qnil; - -undefined_type: { - VALUE msg = rb_sprintf("unsupported type '%" PRIsVALUE "'", type_name); - rb_exc_raise(rb_exc_new3(rb_eArgError, msg)); - return Qnil; - } -} - -/* - * call-seq: memory.get_string(offset, length=nil) - * Return string contained in memory. - * @param [Numeric] offset point in buffer to start from - * @param [Numeric] length string's length in bytes. If nil, a (memory size - offset) length string is returned). - * @return [String] - * @raise {IndexError} if +length+ is too great - * @raise {NullPointerError} if memory not initialized - */ -static VALUE -memory_get_string(int argc, VALUE* argv, VALUE self) -{ - VALUE length = Qnil, offset = Qnil; - AbstractMemory* ptr = MEMORY(self); - long off, len; - char* end; - int nargs = rb_scan_args(argc, argv, "11", &offset, &length); - - off = NUM2LONG(offset); - len = nargs > 1 && length != Qnil ? NUM2LONG(length) : (ptr->size - off); - checkRead(ptr); - checkBounds(ptr, off, len); - - end = memchr(ptr->address + off, 0, len); - return rb_str_new((char *) ptr->address + off, - (end != NULL ? end - ptr->address - off : len)); -} - -/* - * call-seq: memory.get_array_of_string(offset, count=nil) - * Return an array of strings contained in memory. - * @param [Numeric] offset point in memory to start from - * @param [Numeric] count number of strings to get. If nil, return all strings - * @return [Array] - * @raise {IndexError} if +offset+ is too great - * @raise {NullPointerError} if memory not initialized - */ -static VALUE -memory_get_array_of_string(int argc, VALUE* argv, VALUE self) -{ - VALUE offset = Qnil, countnum = Qnil, retVal = Qnil; - AbstractMemory* ptr; - long off; - int count; - - rb_scan_args(argc, argv, "11", &offset, &countnum); - off = NUM2LONG(offset); - count = (countnum == Qnil ? 0 : NUM2INT(countnum)); - retVal = rb_ary_new2(count); - - Data_Get_Struct(self, AbstractMemory, ptr); - checkRead(ptr); - - if (countnum != Qnil) { - int i; - - checkBounds(ptr, off, count * sizeof (char*)); - - for (i = 0; i < count; ++i) { - const char* strptr = *((const char**) (ptr->address + off) + i); - rb_ary_push(retVal, (strptr == NULL ? Qnil : rb_str_new2(strptr))); - } - - } else { - checkBounds(ptr, off, sizeof (char*)); - for ( ; off < ptr->size - (long) sizeof (void *); off += (long) sizeof (void *)) { - const char* strptr = *(const char**) (ptr->address + off); - if (strptr == NULL) { - break; - } - rb_ary_push(retVal, rb_str_new2(strptr)); - } - } - - return retVal; -} - -/* - * call-seq: memory.read_array_of_string(count=nil) - * Return an array of strings contained in memory. Same as: - * memory.get_array_of_string(0, count) - * @param [Numeric] count number of strings to get. If nil, return all strings - * @return [Array] - */ -static VALUE -memory_read_array_of_string(int argc, VALUE* argv, VALUE self) -{ - VALUE* rargv = ALLOCA_N(VALUE, argc + 1); - int i; - - rargv[0] = INT2FIX(0); - for (i = 0; i < argc; i++) { - rargv[i + 1] = argv[i]; - } - - return memory_get_array_of_string(argc + 1, rargv, self); -} - - -/* - * call-seq: memory.put_string(offset, str) - * @param [Numeric] offset - * @param [String] str - * @return [self] - * @raise {SecurityError} when writing unsafe string to memory - * @raise {IndexError} if +offset+ is too great - * @raise {NullPointerError} if memory not initialized - * Put a string in memory. - */ -static VALUE -memory_put_string(VALUE self, VALUE offset, VALUE str) -{ - AbstractMemory* ptr = MEMORY(self); - long off, len; - - Check_Type(str, T_STRING); - off = NUM2LONG(offset); - len = RSTRING_LEN(str); - - checkWrite(ptr); - checkBounds(ptr, off, len + 1); - - memcpy(ptr->address + off, RSTRING_PTR(str), len); - *((char *) ptr->address + off + len) = '\0'; - - return self; -} - -/* - * call-seq: memory.get_bytes(offset, length) - * Return string contained in memory. - * @param [Numeric] offset point in buffer to start from - * @param [Numeric] length string's length in bytes. - * @return [String] - * @raise {IndexError} if +length+ is too great - * @raise {NullPointerError} if memory not initialized - */ -static VALUE -memory_get_bytes(VALUE self, VALUE offset, VALUE length) -{ - AbstractMemory* ptr = MEMORY(self); - long off, len; - - off = NUM2LONG(offset); - len = NUM2LONG(length); - - checkRead(ptr); - checkBounds(ptr, off, len); - - return rb_str_new((char *) ptr->address + off, len); -} - -/* - * call-seq: memory.put_bytes(offset, str, index=0, length=nil) - * Put a string in memory. - * @param [Numeric] offset point in buffer to start from - * @param [String] str string to put to memory - * @param [Numeric] index - * @param [Numeric] length string's length in bytes. If nil, a (memory size - offset) length string is returned). - * @return [self] - * @raise {IndexError} if +length+ is too great - * @raise {NullPointerError} if memory not initialized - * @raise {RangeError} if +index+ is negative, or if index+length is greater than size of string - * @raise {SecurityError} when writing unsafe string to memory - */ -static VALUE -memory_put_bytes(int argc, VALUE* argv, VALUE self) -{ - AbstractMemory* ptr = MEMORY(self); - VALUE offset = Qnil, str = Qnil, rbIndex = Qnil, rbLength = Qnil; - long off, len, idx; - int nargs = rb_scan_args(argc, argv, "22", &offset, &str, &rbIndex, &rbLength); - - Check_Type(str, T_STRING); - - off = NUM2LONG(offset); - idx = nargs > 2 ? NUM2LONG(rbIndex) : 0; - if (idx < 0) { - rb_raise(rb_eRangeError, "index cannot be less than zero"); - return Qnil; - } - len = nargs > 3 ? NUM2LONG(rbLength) : (RSTRING_LEN(str) - idx); - if ((idx + len) > RSTRING_LEN(str)) { - rb_raise(rb_eRangeError, "index+length is greater than size of string"); - return Qnil; - } - - checkWrite(ptr); - checkBounds(ptr, off, len); - - memcpy(ptr->address + off, RSTRING_PTR(str) + idx, len); - - return self; -} - -/* - * call-seq: memory.read_bytes(length) - * @param [Numeric] length of string to return - * @return [String] - * equivalent to : - * memory.get_bytes(0, length) - */ -static VALUE -memory_read_bytes(VALUE self, VALUE length) -{ - return memory_get_bytes(self, INT2FIX(0), length); -} - -/* - * call-seq: memory.write_bytes(str, index=0, length=nil) - * @param [String] str string to put to memory - * @param [Numeric] index - * @param [Numeric] length string's length in bytes. If nil, a (memory size - offset) length string is returned). - * @return [self] - * equivalent to : - * memory.put_bytes(0, str, index, length) - */ -static VALUE -memory_write_bytes(int argc, VALUE* argv, VALUE self) -{ - VALUE* wargv = ALLOCA_N(VALUE, argc + 1); - int i; - - wargv[0] = INT2FIX(0); - for (i = 0; i < argc; i++) { - wargv[i + 1] = argv[i]; - } - - return memory_put_bytes(argc + 1, wargv, self); -} - -/* - * call-seq: memory.type_size - * @return [Numeric] type size in bytes - * Get the memory's type size. - */ -static VALUE -memory_type_size(VALUE self) -{ - AbstractMemory* ptr; - - Data_Get_Struct(self, AbstractMemory, ptr); - - return INT2NUM(ptr->typeSize); -} - -/* - * Document-method: [] - * call-seq: memory[idx] - * @param [Numeric] idx index to access in memory - * @return - * Memory read accessor. - */ -static VALUE -memory_aref(VALUE self, VALUE idx) -{ - AbstractMemory* ptr; - VALUE rbOffset = Qnil; - - Data_Get_Struct(self, AbstractMemory, ptr); - - rbOffset = ULONG2NUM(NUM2ULONG(idx) * ptr->typeSize); - - return rb_funcall2(self, id_plus, 1, &rbOffset); -} - -static inline char* -memory_address(VALUE obj) -{ - return ((AbstractMemory *) DATA_PTR(obj))->address; -} - -static VALUE -memory_copy_from(VALUE self, VALUE rbsrc, VALUE rblen) -{ - AbstractMemory* dst; - - Data_Get_Struct(self, AbstractMemory, dst); - - memcpy(dst->address, rbffi_AbstractMemory_Cast(rbsrc, rbffi_AbstractMemoryClass)->address, NUM2INT(rblen)); - - return self; -} - -AbstractMemory* -rbffi_AbstractMemory_Cast(VALUE obj, VALUE klass) -{ - if (rb_obj_is_kind_of(obj, klass)) { - AbstractMemory* memory; - Data_Get_Struct(obj, AbstractMemory, memory); - return memory; - } - - rb_raise(rb_eArgError, "Invalid Memory object"); - return NULL; -} - -void -rbffi_AbstractMemory_Error(AbstractMemory *mem, int op) -{ - VALUE rbErrorClass = mem->address == NULL ? NullPointerErrorClass : rb_eRuntimeError; - if (op == MEM_RD) { - rb_raise(rbErrorClass, "invalid memory read at address=%p", mem->address); - } else if (op == MEM_WR) { - rb_raise(rbErrorClass, "invalid memory write at address=%p", mem->address); - } else { - rb_raise(rbErrorClass, "invalid memory access at address=%p", mem->address); - } -} - -static VALUE -memory_op_get_strptr(AbstractMemory* ptr, long offset) -{ - void* tmp = NULL; - - if (ptr != NULL && ptr->address != NULL) { - checkRead(ptr); - checkBounds(ptr, offset, sizeof(tmp)); - memcpy(&tmp, ptr->address + offset, sizeof(tmp)); - } - - return tmp != NULL ? rb_str_new2(tmp) : Qnil; -} - -static void -memory_op_put_strptr(AbstractMemory* ptr, long offset, VALUE value) -{ - rb_raise(rb_eArgError, "Cannot set :string fields"); -} - -static MemoryOp memory_op_strptr = { memory_op_get_strptr, memory_op_put_strptr }; - - -MemoryOps rbffi_AbstractMemoryOps = { - &memory_op_int8, /*.int8 */ - &memory_op_uint8, /* .uint8 */ - &memory_op_int16, /* .int16 */ - &memory_op_uint16, /* .uint16 */ - &memory_op_int32, /* .int32 */ - &memory_op_uint32, /* .uint32 */ - &memory_op_int64, /* .int64 */ - &memory_op_uint64, /* .uint64 */ - &memory_op_long, /* .slong */ - &memory_op_ulong, /* .uslong */ - &memory_op_float32, /* .float32 */ - &memory_op_float64, /* .float64 */ - &memory_op_longdouble, /* .longdouble */ - &memory_op_pointer, /* .pointer */ - &memory_op_strptr, /* .strptr */ - &memory_op_bool /* .boolOp */ -}; - -void -rbffi_AbstractMemory_Init(VALUE moduleFFI) -{ - /* - * Document-class: FFI::AbstractMemory - * - * {AbstractMemory} is the base class for many memory management classes such as {Buffer}. - * - * This class has a lot of methods to work with integers : - * * put_intsize(offset, value) - * * get_intsize(offset) - * * put_uintsize(offset, value) - * * get_uintsize(offset) - * * writeuintsize(value) - * * read_intsize - * * write_uintsize(value) - * * read_uintsize - * * put_array_of_intsize(offset, ary) - * * get_array_of_intsize(offset, length) - * * put_array_of_uintsize(offset, ary) - * * get_array_of_uintsize(offset, length) - * * write_array_of_intsize(ary) - * * read_array_of_intsize(length) - * * write_array_of_uintsize(ary) - * * read_array_of_uintsize(length) - * where _size_ is 8, 16, 32 or 64. Same methods exist for long type. - * - * Aliases exist : _char_ for _int8_, _short_ for _int16_, _int_ for _int32_ and long_long for _int64_. - * - * Others methods are listed below. - */ - VALUE classMemory = rb_define_class_under(moduleFFI, "AbstractMemory", rb_cObject); - rbffi_AbstractMemoryClass = classMemory; - /* - * Document-variable: FFI::AbstractMemory - */ - rb_global_variable(&rbffi_AbstractMemoryClass); - rb_define_alloc_func(classMemory, memory_allocate); - - NullPointerErrorClass = rb_define_class_under(moduleFFI, "NullPointerError", rb_eRuntimeError); - /* Document-variable: NullPointerError */ - rb_global_variable(&NullPointerErrorClass); - - -#undef INT -#define INT(type) \ - rb_define_method(classMemory, "put_" #type, memory_put_##type, 2); \ - rb_define_method(classMemory, "get_" #type, memory_get_##type, 1); \ - rb_define_method(classMemory, "put_u" #type, memory_put_u##type, 2); \ - rb_define_method(classMemory, "get_u" #type, memory_get_u##type, 1); \ - rb_define_method(classMemory, "write_" #type, memory_write_##type, 1); \ - rb_define_method(classMemory, "read_" #type, memory_read_##type, 0); \ - rb_define_method(classMemory, "write_u" #type, memory_write_u##type, 1); \ - rb_define_method(classMemory, "read_u" #type, memory_read_u##type, 0); \ - rb_define_method(classMemory, "put_array_of_" #type, memory_put_array_of_##type, 2); \ - rb_define_method(classMemory, "get_array_of_" #type, memory_get_array_of_##type, 2); \ - rb_define_method(classMemory, "put_array_of_u" #type, memory_put_array_of_u##type, 2); \ - rb_define_method(classMemory, "get_array_of_u" #type, memory_get_array_of_u##type, 2); \ - rb_define_method(classMemory, "write_array_of_" #type, memory_write_array_of_##type, 1); \ - rb_define_method(classMemory, "read_array_of_" #type, memory_read_array_of_##type, 1); \ - rb_define_method(classMemory, "write_array_of_u" #type, memory_write_array_of_u##type, 1); \ - rb_define_method(classMemory, "read_array_of_u" #type, memory_read_array_of_u##type, 1); - - INT(int8); - INT(int16); - INT(int32); - INT(int64); - INT(long); - -#define ALIAS(name, old) \ - rb_define_alias(classMemory, "put_" #name, "put_" #old); \ - rb_define_alias(classMemory, "get_" #name, "get_" #old); \ - rb_define_alias(classMemory, "put_u" #name, "put_u" #old); \ - rb_define_alias(classMemory, "get_u" #name, "get_u" #old); \ - rb_define_alias(classMemory, "write_" #name, "write_" #old); \ - rb_define_alias(classMemory, "read_" #name, "read_" #old); \ - rb_define_alias(classMemory, "write_u" #name, "write_u" #old); \ - rb_define_alias(classMemory, "read_u" #name, "read_u" #old); \ - rb_define_alias(classMemory, "put_array_of_" #name, "put_array_of_" #old); \ - rb_define_alias(classMemory, "get_array_of_" #name, "get_array_of_" #old); \ - rb_define_alias(classMemory, "put_array_of_u" #name, "put_array_of_u" #old); \ - rb_define_alias(classMemory, "get_array_of_u" #name, "get_array_of_u" #old); \ - rb_define_alias(classMemory, "write_array_of_" #name, "write_array_of_" #old); \ - rb_define_alias(classMemory, "read_array_of_" #name, "read_array_of_" #old); \ - rb_define_alias(classMemory, "write_array_of_u" #name, "write_array_of_u" #old); \ - rb_define_alias(classMemory, "read_array_of_u" #name, "read_array_of_u" #old); - - ALIAS(char, int8); - ALIAS(short, int16); - ALIAS(int, int32); - ALIAS(long_long, int64); - - /* - * Document-method: put_float32 - * call-seq: memory.put_float32offset, value) - * @param [Numeric] offset - * @param [Numeric] value - * @return [self] - * Put +value+ as a 32-bit float in memory at offset +offset+ (alias: #put_float). - */ - rb_define_method(classMemory, "put_float32", memory_put_float32, 2); - /* - * Document-method: get_float32 - * call-seq: memory.get_float32(offset) - * @param [Numeric] offset - * @return [Float] - * Get a 32-bit float from memory at offset +offset+ (alias: #get_float). - */ - rb_define_method(classMemory, "get_float32", memory_get_float32, 1); - rb_define_alias(classMemory, "put_float", "put_float32"); - rb_define_alias(classMemory, "get_float", "get_float32"); - /* - * Document-method: write_float - * call-seq: memory.write_float(value) - * @param [Numeric] value - * @return [self] - * Write +value+ as a 32-bit float in memory. - * - * Same as: - * memory.put_float(0, value) - */ - rb_define_method(classMemory, "write_float", memory_write_float32, 1); - /* - * Document-method: read_float - * call-seq: memory.read_float - * @return [Float] - * Read a 32-bit float from memory. - * - * Same as: - * memory.get_float(0) - */ - rb_define_method(classMemory, "read_float", memory_read_float32, 0); - /* - * Document-method: put_array_of_float32 - * call-seq: memory.put_array_of_float32(offset, ary) - * @param [Numeric] offset - * @param [Array] ary - * @return [self] - * Put values from +ary+ as 32-bit floats in memory from offset +offset+ (alias: #put_array_of_float). - */ - rb_define_method(classMemory, "put_array_of_float32", memory_put_array_of_float32, 2); - /* - * Document-method: get_array_of_float32 - * call-seq: memory.get_array_of_float32(offset, length) - * @param [Numeric] offset - * @param [Numeric] length number of Float to get - * @return [Array] - * Get 32-bit floats in memory from offset +offset+ (alias: #get_array_of_float). - */ - rb_define_method(classMemory, "get_array_of_float32", memory_get_array_of_float32, 2); - /* - * Document-method: write_array_of_float - * call-seq: memory.write_array_of_float(ary) - * @param [Array] ary - * @return [self] - * Write values from +ary+ as 32-bit floats in memory. - * - * Same as: - * memory.put_array_of_float(0, ary) - */ - rb_define_method(classMemory, "write_array_of_float", memory_write_array_of_float32, 1); - /* - * Document-method: read_array_of_float - * call-seq: memory.read_array_of_float(length) - * @param [Numeric] length number of Float to read - * @return [Array] - * Read 32-bit floats from memory. - * - * Same as: - * memory.get_array_of_float(0, ary) - */ - rb_define_method(classMemory, "read_array_of_float", memory_read_array_of_float32, 1); - rb_define_alias(classMemory, "put_array_of_float", "put_array_of_float32"); - rb_define_alias(classMemory, "get_array_of_float", "get_array_of_float32"); - /* - * Document-method: put_float64 - * call-seq: memory.put_float64(offset, value) - * @param [Numeric] offset - * @param [Numeric] value - * @return [self] - * Put +value+ as a 64-bit float (double) in memory at offset +offset+ (alias: #put_double). - */ - rb_define_method(classMemory, "put_float64", memory_put_float64, 2); - /* - * Document-method: get_float64 - * call-seq: memory.get_float64(offset) - * @param [Numeric] offset - * @return [Float] - * Get a 64-bit float (double) from memory at offset +offset+ (alias: #get_double). - */ - rb_define_method(classMemory, "get_float64", memory_get_float64, 1); - rb_define_alias(classMemory, "put_double", "put_float64"); - rb_define_alias(classMemory, "get_double", "get_float64"); - /* - * Document-method: write_double - * call-seq: memory.write_double(value) - * @param [Numeric] value - * @return [self] - * Write +value+ as a 64-bit float (double) in memory. - * - * Same as: - * memory.put_double(0, value) - */ - rb_define_method(classMemory, "write_double", memory_write_float64, 1); - /* - * Document-method: read_double - * call-seq: memory.read_double - * @return [Float] - * Read a 64-bit float (double) from memory. - * - * Same as: - * memory.get_double(0) - */ - rb_define_method(classMemory, "read_double", memory_read_float64, 0); - /* - * Document-method: put_array_of_float64 - * call-seq: memory.put_array_of_float64(offset, ary) - * @param [Numeric] offset - * @param [Array] ary - * @return [self] - * Put values from +ary+ as 64-bit floats (doubles) in memory from offset +offset+ (alias: #put_array_of_double). - */ - rb_define_method(classMemory, "put_array_of_float64", memory_put_array_of_float64, 2); - /* - * Document-method: get_array_of_float64 - * call-seq: memory.get_array_of_float64(offset, length) - * @param [Numeric] offset - * @param [Numeric] length number of Float to get - * @return [Array] - * Get 64-bit floats (doubles) in memory from offset +offset+ (alias: #get_array_of_double). - */ - rb_define_method(classMemory, "get_array_of_float64", memory_get_array_of_float64, 2); - /* - * Document-method: write_array_of_double - * call-seq: memory.write_array_of_double(ary) - * @param [Array] ary - * @return [self] - * Write values from +ary+ as 64-bit floats (doubles) in memory. - * - * Same as: - * memory.put_array_of_double(0, ary) - */ - rb_define_method(classMemory, "write_array_of_double", memory_write_array_of_float64, 1); - /* - * Document-method: read_array_of_double - * call-seq: memory.read_array_of_double(length) - * @param [Numeric] length number of Float to read - * @return [Array] - * Read 64-bit floats (doubles) from memory. - * - * Same as: - * memory.get_array_of_double(0, ary) - */ - rb_define_method(classMemory, "read_array_of_double", memory_read_array_of_float64, 1); - rb_define_alias(classMemory, "put_array_of_double", "put_array_of_float64"); - rb_define_alias(classMemory, "get_array_of_double", "get_array_of_float64"); - /* - * Document-method: put_pointer - * call-seq: memory.put_pointer(offset, value) - * @param [Numeric] offset - * @param [nil,Pointer, Integer, #to_ptr] value - * @return [self] - * Put +value+ in memory from +offset+.. - */ - rb_define_method(classMemory, "put_pointer", memory_put_pointer, 2); - /* - * Document-method: get_pointer - * call-seq: memory.get_pointer(offset) - * @param [Numeric] offset - * @return [Pointer] - * Get a {Pointer} to the memory from +offset+. - */ - rb_define_method(classMemory, "get_pointer", memory_get_pointer, 1); - /* - * Document-method: write_pointer - * call-seq: memory.write_pointer(value) - * @param [nil,Pointer, Integer, #to_ptr] value - * @return [self] - * Write +value+ in memory. - * - * Equivalent to: - * memory.put_pointer(0, value) - */ - rb_define_method(classMemory, "write_pointer", memory_write_pointer, 1); - /* - * Document-method: read_pointer - * call-seq: memory.read_pointer - * @return [Pointer] - * Get a {Pointer} to the memory from base address. - * - * Equivalent to: - * memory.get_pointer(0) - */ - rb_define_method(classMemory, "read_pointer", memory_read_pointer, 0); - /* - * Document-method: put_array_of_pointer - * call-seq: memory.put_array_of_pointer(offset, ary) - * @param [Numeric] offset - * @param [Array<#to_ptr>] ary - * @return [self] - * Put an array of {Pointer} into memory from +offset+. - */ - rb_define_method(classMemory, "put_array_of_pointer", memory_put_array_of_pointer, 2); - /* - * Document-method: get_array_of_pointer - * call-seq: memory.get_array_of_pointer(offset, length) - * @param [Numeric] offset - * @param [Numeric] length - * @return [Array] - * Get an array of {Pointer} of length +length+ from +offset+. - */ - rb_define_method(classMemory, "get_array_of_pointer", memory_get_array_of_pointer, 2); - /* - * Document-method: write_array_of_pointer - * call-seq: memory.write_array_of_pointer(ary) - * @param [Array<#to_ptr>] ary - * @return [self] - * Write an array of {Pointer} into memory from +offset+. - * - * Same as : - * memory.put_array_of_pointer(0, ary) - */ - rb_define_method(classMemory, "write_array_of_pointer", memory_write_array_of_pointer, 1); - /* - * Document-method: read_array_of_pointer - * call-seq: memory.read_array_of_pointer(length) - * @param [Numeric] length - * @return [Array] - * Read an array of {Pointer} of length +length+. - * - * Same as: - * memory.get_array_of_pointer(0, length) - */ - rb_define_method(classMemory, "read_array_of_pointer", memory_read_array_of_pointer, 1); - - rb_define_method(classMemory, "get_string", memory_get_string, -1); - rb_define_method(classMemory, "put_string", memory_put_string, 2); - rb_define_method(classMemory, "get_bytes", memory_get_bytes, 2); - rb_define_method(classMemory, "put_bytes", memory_put_bytes, -1); - rb_define_method(classMemory, "read_bytes", memory_read_bytes, 1); - rb_define_method(classMemory, "write_bytes", memory_write_bytes, -1); - rb_define_method(classMemory, "get_array_of_string", memory_get_array_of_string, -1); - - rb_define_method(classMemory, "get", memory_get, 2); - rb_define_method(classMemory, "put", memory_put, 3); - - rb_define_method(classMemory, "clear", memory_clear, 0); - rb_define_method(classMemory, "total", memory_size, 0); - rb_define_alias(classMemory, "size", "total"); - rb_define_method(classMemory, "type_size", memory_type_size, 0); - rb_define_method(classMemory, "[]", memory_aref, 1); - rb_define_method(classMemory, "__copy_from__", memory_copy_from, 2); - - id_to_ptr = rb_intern("to_ptr"); - id_call = rb_intern("call"); - id_plus = rb_intern("+"); -} - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/AbstractMemory.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/AbstractMemory.h deleted file mode 100644 index 1119288..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/AbstractMemory.h +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright (c) 2008, 2009, Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * 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 the Ruby FFI project 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 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. - */ - -#ifndef RBFFI_ABSTRACTMEMORY_H -#define RBFFI_ABSTRACTMEMORY_H - -#ifndef _MSC_VER -#include -#endif -#include -#ifndef _MSC_VER -#include -#endif - -#include "compat.h" -#include "Types.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -#define MEM_RD 0x01 -#define MEM_WR 0x02 -#define MEM_CODE 0x04 -#define MEM_SWAP 0x08 -#define MEM_EMBED 0x10 - -typedef struct AbstractMemory_ AbstractMemory; - -typedef struct { - VALUE (*get)(AbstractMemory* ptr, long offset); - void (*put)(AbstractMemory* ptr, long offset, VALUE value); -} MemoryOp; - -typedef struct { - MemoryOp* int8; - MemoryOp* uint8; - MemoryOp* int16; - MemoryOp* uint16; - MemoryOp* int32; - MemoryOp* uint32; - MemoryOp* int64; - MemoryOp* uint64; - MemoryOp* slong; - MemoryOp* uslong; - MemoryOp* float32; - MemoryOp* float64; - MemoryOp* longdouble; - MemoryOp* pointer; - MemoryOp* strptr; - MemoryOp* boolOp; -} MemoryOps; - -struct AbstractMemory_ { - char* address; /* Use char* instead of void* to ensure adding to it works correctly */ - long size; - int flags; - int typeSize; -}; - - -extern VALUE rbffi_AbstractMemoryClass; -extern MemoryOps rbffi_AbstractMemoryOps; - -extern void rbffi_AbstractMemory_Init(VALUE ffiModule); - -extern AbstractMemory* rbffi_AbstractMemory_Cast(VALUE obj, VALUE klass); - -extern void rbffi_AbstractMemory_Error(AbstractMemory *, int op); - -static inline void -checkBounds(AbstractMemory* mem, long off, long len) -{ - if (unlikely((off | len | (off + len) | (mem->size - (off + len))) < 0)) { - rb_raise(rb_eIndexError, "Memory access offset=%ld size=%ld is out of bounds", - off, len); - } -} - -static inline void -checkRead(AbstractMemory* mem) -{ - if (unlikely((mem->flags & MEM_RD) == 0)) { - rbffi_AbstractMemory_Error(mem, MEM_RD); - } -} - -static inline void -checkWrite(AbstractMemory* mem) -{ - if (unlikely((mem->flags & MEM_WR) == 0)) { - rbffi_AbstractMemory_Error(mem, MEM_WR); - } -} - -static inline MemoryOp* -get_memory_op(Type* type) -{ - switch (type->nativeType) { - case NATIVE_INT8: - return rbffi_AbstractMemoryOps.int8; - case NATIVE_UINT8: - return rbffi_AbstractMemoryOps.uint8; - case NATIVE_INT16: - return rbffi_AbstractMemoryOps.int16; - case NATIVE_UINT16: - return rbffi_AbstractMemoryOps.uint16; - case NATIVE_INT32: - return rbffi_AbstractMemoryOps.int32; - case NATIVE_UINT32: - return rbffi_AbstractMemoryOps.uint32; - case NATIVE_INT64: - return rbffi_AbstractMemoryOps.int64; - case NATIVE_UINT64: - return rbffi_AbstractMemoryOps.uint64; - case NATIVE_LONG: - return rbffi_AbstractMemoryOps.slong; - case NATIVE_ULONG: - return rbffi_AbstractMemoryOps.uslong; - case NATIVE_FLOAT32: - return rbffi_AbstractMemoryOps.float32; - case NATIVE_FLOAT64: - return rbffi_AbstractMemoryOps.float64; - case NATIVE_LONGDOUBLE: - return rbffi_AbstractMemoryOps.longdouble; - case NATIVE_POINTER: - return rbffi_AbstractMemoryOps.pointer; - case NATIVE_STRING: - return rbffi_AbstractMemoryOps.strptr; - case NATIVE_BOOL: - return rbffi_AbstractMemoryOps.boolOp; - default: - return NULL; - } -} - -#define MEMORY(obj) rbffi_AbstractMemory_Cast((obj), rbffi_AbstractMemoryClass) -#define MEMORY_PTR(obj) MEMORY((obj))->address -#define MEMORY_LEN(obj) MEMORY((obj))->size - - - -#ifdef __cplusplus -} -#endif - -#endif /* RBFFI_ABSTRACTMEMORY_H */ - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/AbstractMemory.o b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/AbstractMemory.o deleted file mode 100644 index 01512e85b60ddb56c2c8be6f2239644bf5e20d8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 278440 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 xF!sA{ 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 R`k!j!Cr)TFcS1qI{{tOA5Geov diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/ArrayType.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/ArrayType.c deleted file mode 100644 index bfd666a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/ArrayType.c +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright (c) 2009, Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * 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 the Ruby FFI project 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 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. - */ - -#include -#include -#include "ArrayType.h" - -static VALUE array_type_s_allocate(VALUE klass); -static VALUE array_type_initialize(VALUE self, VALUE rbComponentType, VALUE rbLength); -static void array_type_mark(ArrayType *); -static void array_type_free(ArrayType *); - -VALUE rbffi_ArrayTypeClass = Qnil; - -static VALUE -array_type_s_allocate(VALUE klass) -{ - ArrayType* array; - VALUE obj; - - obj = Data_Make_Struct(klass, ArrayType, array_type_mark, array_type_free, array); - - array->base.nativeType = NATIVE_ARRAY; - array->base.ffiType = xcalloc(1, sizeof(*array->base.ffiType)); - array->base.ffiType->type = FFI_TYPE_STRUCT; - array->base.ffiType->size = 0; - array->base.ffiType->alignment = 0; - array->rbComponentType = Qnil; - - return obj; -} - -static void -array_type_mark(ArrayType *array) -{ - rb_gc_mark(array->rbComponentType); -} - -static void -array_type_free(ArrayType *array) -{ - xfree(array->base.ffiType); - xfree(array->ffiTypes); - xfree(array); -} - - -/* - * call-seq: initialize(component_type, length) - * @param [Type] component_type - * @param [Numeric] length - * @return [self] - * A new instance of ArrayType. - */ -static VALUE -array_type_initialize(VALUE self, VALUE rbComponentType, VALUE rbLength) -{ - ArrayType* array; - int i; - - Data_Get_Struct(self, ArrayType, array); - - array->length = NUM2UINT(rbLength); - array->rbComponentType = rbComponentType; - Data_Get_Struct(rbComponentType, Type, array->componentType); - - array->ffiTypes = xcalloc(array->length + 1, sizeof(*array->ffiTypes)); - array->base.ffiType->elements = array->ffiTypes; - array->base.ffiType->size = array->componentType->ffiType->size * array->length; - array->base.ffiType->alignment = array->componentType->ffiType->alignment; - - for (i = 0; i < array->length; ++i) { - array->ffiTypes[i] = array->componentType->ffiType; - } - - return self; -} - -/* - * call-seq: length - * @return [Numeric] - * Get array's length - */ -static VALUE -array_type_length(VALUE self) -{ - ArrayType* array; - - Data_Get_Struct(self, ArrayType, array); - - return UINT2NUM(array->length); -} - -/* - * call-seq: element_type - * @return [Type] - * Get element type. - */ -static VALUE -array_type_element_type(VALUE self) -{ - ArrayType* array; - - Data_Get_Struct(self, ArrayType, array); - - return array->rbComponentType; -} - -void -rbffi_ArrayType_Init(VALUE moduleFFI) -{ - VALUE ffi_Type; - - ffi_Type = rbffi_TypeClass; - - /* - * Document-class: FFI::ArrayType < FFI::Type - * - * This is a typed array. The type is a {NativeType native type}. - */ - rbffi_ArrayTypeClass = rb_define_class_under(moduleFFI, "ArrayType", ffi_Type); - /* - * Document-variable: FFI::ArrayType - */ - rb_global_variable(&rbffi_ArrayTypeClass); - /* - * Document-constant: FFI::Type::Array - */ - rb_define_const(ffi_Type, "Array", rbffi_ArrayTypeClass); - - rb_define_alloc_func(rbffi_ArrayTypeClass, array_type_s_allocate); - rb_define_method(rbffi_ArrayTypeClass, "initialize", array_type_initialize, 2); - rb_define_method(rbffi_ArrayTypeClass, "length", array_type_length, 0); - rb_define_method(rbffi_ArrayTypeClass, "elem_type", array_type_element_type, 0); -} - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/ArrayType.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/ArrayType.h deleted file mode 100644 index 356ffb1..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/ArrayType.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2009, Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * 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 the Ruby FFI project 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 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. - */ - -#ifndef RBFFI_ARRAYTYPE_H -#define RBFFI_ARRAYTYPE_H - -#include -#include -#include "Type.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -typedef struct ArrayType_ { - Type base; - int length; - ffi_type** ffiTypes; - Type* componentType; - VALUE rbComponentType; -} ArrayType; - -extern void rbffi_ArrayType_Init(VALUE moduleFFI); -extern VALUE rbffi_ArrayTypeClass; - - -#ifdef __cplusplus -} -#endif - -#endif /* RBFFI_ARRAYTYPE_H */ - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/ArrayType.o b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/ArrayType.o deleted file mode 100644 index d57194270f483b91549cfb9a3f7ef21921244c4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11400 zcmcgydvsgHnV+kxJCbZi@%s_y;gFYs*s_xVVTp_7S1d=ij4dY)getNuKZq>3lI$eB zV)B42kKLrCEl^6*mhL72b~&`A8(3JggANxuZMt&DBpne(PKwV+undprO8D2dF|tsX*-~{*RP-OLc{l8lo7y z12olnBt!{?($QUMo!0qaYkx4q8`L42PLV$%%U3d1Ln1qyB4m_MXfT`(8yxv>@dmva z-t;3y_aGQGqdt!cg(9hRax^|HHKEY#`0kN$t(N*@G&oC$2%8UJn7_|{t^S%i3gJH?`yQsQI_k79hHNWETK95iTK9Dk!*iYX8HT!XY`le zJwE4nUy=T9lTp0>zxsIJG!fr98XpXW{4JKTu#ts2_o@_*<9AF;alBgp-Ga;- zuUyZg@hCOP9&fvx|L5d-?!JJm7&{Js@)6DQw+1?Tgt`ukOVt-xEo8J*9!0x$U}{8m zAAzSXp1+8(X*8nc-Hl3RzN}RLR8K*kcbI`_4RiO_Bw1|PTnI(+P z99NF@IGya2Q-Mt>jj`yYwVw~SJcT|nPdC_3e6o)neqXhn{6JMslJ8s4hI~yHHkxxY zUC2)TLii~$^~a%qzL23#ox+B5Sds0f-E8JZym6+{MY_frm)1CQF`fb0?YPPL^-T(! zxwxQl_of22dx^%rbce!%&YK#)>_XhcV=)CU#F&13(tDxNK^wjr&4yPQ^DWm+szzcw^SM3Ds0HqN#apyGA*%+_u)~4Ih_$IM_-i88Hp9PHQSjnEGOP4 zRPe|Rvf30y405#;%{`&TQd@2|?AM)Upy6PHY0_fU>!`|UmM{IW{-YkMjRltP^5 zZ0nfn_7z=O@n^YLEQq?Ww zI7>Ut#$a6Y;fb-F5@i*R6}g(=@@N~KSER@`aO|EZA|S`>!Ok~zaFK87w1digQWs<- z#1>|(VZd0?O3_PkEyi5P8_Tb+(1)_B;>rq)nXwX$*~)Yo1y{Om7F*V?>?yhli?!Ux zY~?p&Ix5?#Ui2Rd^zAeUJvNzjezrcH(&w32C$G10~YZ#U@_kdSi%nh zmhx`^F5o8tEBWJq3;DBvi}+6g7xPyDmoR4mhV~{%<(S=73OXlu5g^NREdx?(0X~M- zSvSv)pK+b@BKLgY6vWPpnfq?g3n=o{`R)fmFD1IB-2K;}R}x)Y<^DcsS~E@$-ZeL) zVKD^u)$=NV^6hnQ9L3mCi0$>veF^B3M6Yo&m3EkmAW%2C=#i;U05pJi{Q0~#pmN7P zcQ^2R5IYVqcMP-(eL8M+x(^uiZ8`4SLFbeFU_MjnLH0qwmxyJ%4W!m)p9FH)TqUq_ zQ7`uUNN#sgC@vbSs}8F9&p}$Pr0n@W29bb7N!y*Q;0!pLMP+Vude(%U32Zo4y)ej`p@*L0V5Fxd`7L%%4g{VLcSOl|2aV8yV5H0)9vz<$#9(U0_kB-$BgTuORvTeM|L zWDku|=(fv|=9BIk=%PYbMuYWB9nHc9bAG-Gjd28}WwamDN!GC}Yuf=RXfo-YPlep9 z$13?5jImnvIiw)jg4am&jE!~`A!dt=ljS;yl(Dyh~cKp;ff&hrEb=c*dpU#xf;!su}`VDn?-L=!(Q|z*wP$CD|(wUdovE8qPM-X zduy4qx8=sU5_>UI5@qzTHk8yDt~ZeD6^}z|95z|yDsZk!eahHM<9JyoqFqDnn@Wa^ z_D$5jq72S=$?gS%+Xzusk;XWB((~H~adi`%uT$2*H%>vX-)mQy0zfftf_^({z5(Rq!hF^!aUS`G!jmuS<2HNNeo77aZ%@KPQ=sE zcsk{2iB3jiiScOC(;W+^hZ4!Ll&3Qs3H0{Yj!S{XrnhC2sZI^B;%e`cnl*#T%O5jd@zyp3{1oaV^L3XVqmvtP3>j1 zb)MlUq8J()t*NiAzohmO4{oA~4MkXTfUuclH^;)M6x;0e_qDQ#cxrSw9v!TTCE~*w zZZw`|UEZK?b8BdGz}I5XzOLYUgYL63pzANSYBC&DYu8v+84jvT*I88=&L8O7XlkrX zn?K;SI27#cW-WofCV#8ZxI2JeT6+w(t*@&&=nHfid{bXrTWe3qmn{hN1sW$q9pukH(}Biy}It)4tBm))t>P*c$5e_HNQ;ZNC1lzRpma z-@8!?Ftrd^EObG}qIYX&Q^0R&(%aqI?DP6Vz3slXpdRaFI5rX0Z)ZfD!BAJAt5xqI z7z#9Xv|_+g)9m;5_8LrQprsFwN~*-OG#ELDQq|MCv9-V3(CL#VRqfv1c0++iG`CXI zA_DR(B<_Te3#E8(NiXHufNx1^a(Rs z=re9`eO)cBZ3g4(Z0!sfOjn@A^x&H{M^^_rn|!9OGq4#e#0=edur#0$t?kTvEJKCZ zKp4wL+^-P`u{d6BlTjh)%8+uC~bC>9=0 zu^r+CHaHee?qGvM$!L^`&tzGzxsVUHhl=9K%Ph(9lGjUZV1Zh!;85J*~U4k4-3{J$NZEZe!a3S%iMA-NWHi40uA+uC8HiX&n>sPj;ti9LU zPA4Z^U5iQw3@Rj37>+2C#=b97dOFg5ib5JXSrBbM@Y^q5@xj*JuRpoqm!4ltT+Ywk zclB$R{dD{Mzj)y4%|BT78y?(o{hhGAAN66>=TToqeFOC)RJtT6N2NOe>X$AHsL+|5 z_y=)vr$T33A}RUF1N{nWCyo?UC?K*el{}qSh<{e{ltN0FK7ax`M{;l&)q0pS;GKaZQ z3sJYHuDkuf7q7j4_braoL-jk~dh_`oJ=FDLd7%C$@6P*|yEiu?J$;Chy zqt>I+$$ks!b*OanbqMv_sE?z*fchV(Z=+IDP=ZP~u~(qdC*Uw@8uckum@o}MK2A#e zNklgRxR#@qFc5#YJ>*0d5ap4Wa>YBh&`Rx&h)-kQE31dL{OnU$W*(f%0`R3F+Yit>Bh zAOq1PpenPE^sM&(IGgZHq>`S|cqBG481;mcWB;GsrFN%0Vq-}$kAHL^8BXrDq&?Wo z$HMVJKla{WA`we@EO}7<+FGPPvtq~If}d-0a*T4C(P&DfHZ_#mTxyPwHYFjd(-R-! zYe#6>y~YB++j7%VPy4FYRB<3%+6oY7z}jwa*qgm^w@ zQ~iiS5z{iV+nCE-lj=c5(eiVi(iT3WE#PN0jX$kb-wMGYMskiTW zLd(s0nyXhi&u9y|THm2nZqh3F6WS8)*Ou?o7VgtDKMX6++7(U9QJ>CnKCCUOW6(XhnQ4+HE4G`h%PfZP}AhY3d75t@LX(=(emwE7_|R@J-q>aMi$<0XKGNT^(9$ zhqeR|vgMFz+|Shq_K-vM*9^Q*XIJR#I+!f%fTd3i<5onKM8dZWH0VX+p&%}q88am|={|ERa{j0#(Kx^nA zf(_OGa~(I(H5oQ%|7jgJJPM3gYt3bT(;Fg9a99cq9ZjsTM#9dvM}@E_E1 z!+v1AfBjQBZrBA(cH_WU&iqE3T7WTR zf1{2Y)&rMAz8V-`x%|~SZdeYCLq-kej25mRHiR4UffwLDElWD-3Hf)} z9#oDi4%_|8F~Eb$oq$uye!$qc!!|hLum$@aw#F8Rt$MY?R=&`#=H(YVY(H0ChRJEg z`0UNT2WNEfH3~g4RrxYW}hfk-yt5f@zIX%jji$DMm!do@jtIi;BUUg z9{=@W^I>C@cR^TK)(pnV)9>2KN3!fmXVudIR$+~h>g5g~tDYDuPlswNzbT8qI?KK| zi)SHZY(_dO5>yhHi69ut(9B&-&w#U~`t_fb((b4WVxe04TO&C%daxwSAxnNJ@io2N diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Buffer.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Buffer.c deleted file mode 100644 index b5f39a4..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Buffer.c +++ /dev/null @@ -1,360 +0,0 @@ -/* - * Copyright (c) 2008-2010 Wayne Meissner - * Copyright (C) 2009 Aman Gupta - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * 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 the Ruby FFI project 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 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. - */ - -#include -#include -#include -#include -#include "rbffi.h" -#include "rbffi_endian.h" -#include "AbstractMemory.h" - -#define BUFFER_EMBED_MAXLEN (8) -typedef struct Buffer { - AbstractMemory memory; - - union { - VALUE rbParent; /* link to parent buffer */ - char* storage; /* start of malloc area */ - long embed[BUFFER_EMBED_MAXLEN / sizeof(long)]; /* storage for tiny allocations */ - } data; -} Buffer; - -static VALUE buffer_allocate(VALUE klass); -static VALUE buffer_initialize(int argc, VALUE* argv, VALUE self); -static void buffer_release(Buffer* ptr); -static void buffer_mark(Buffer* ptr); -static VALUE buffer_free(VALUE self); - -static VALUE BufferClass = Qnil; - -static VALUE -buffer_allocate(VALUE klass) -{ - Buffer* buffer; - VALUE obj; - - obj = Data_Make_Struct(klass, Buffer, NULL, buffer_release, buffer); - buffer->data.rbParent = Qnil; - buffer->memory.flags = MEM_RD | MEM_WR; - - return obj; -} - -static void -buffer_release(Buffer* ptr) -{ - if ((ptr->memory.flags & MEM_EMBED) == 0 && ptr->data.storage != NULL) { - xfree(ptr->data.storage); - ptr->data.storage = NULL; - } - - xfree(ptr); -} - -/* - * call-seq: initialize(size, count=1, clear=false) - * @param [Integer, Symbol, #size] Type or size in bytes of a buffer cell - * @param [Fixnum] count number of cell in the Buffer - * @param [Boolean] clear if true, set the buffer to all-zero - * @return [self] - * @raise {NoMemoryError} if failed to allocate memory for Buffer - * A new instance of Buffer. - */ -static VALUE -buffer_initialize(int argc, VALUE* argv, VALUE self) -{ - VALUE rbSize = Qnil, rbCount = Qnil, rbClear = Qnil; - Buffer* p; - int nargs; - - Data_Get_Struct(self, Buffer, p); - - nargs = rb_scan_args(argc, argv, "12", &rbSize, &rbCount, &rbClear); - p->memory.typeSize = rbffi_type_size(rbSize); - p->memory.size = p->memory.typeSize * (nargs > 1 ? NUM2LONG(rbCount) : 1); - - if (p->memory.size > BUFFER_EMBED_MAXLEN) { - p->data.storage = xmalloc(p->memory.size + 7); - if (p->data.storage == NULL) { - rb_raise(rb_eNoMemError, "Failed to allocate memory size=%lu bytes", p->memory.size); - return Qnil; - } - - /* ensure the memory is aligned on at least a 8 byte boundary */ - p->memory.address = (void *) (((uintptr_t) p->data.storage + 0x7) & (uintptr_t) ~0x7ULL); - - if (p->memory.size > 0 && (nargs < 3 || RTEST(rbClear))) { - memset(p->memory.address, 0, p->memory.size); - } - - } else { - p->memory.flags |= MEM_EMBED; - p->memory.address = (void *) &p->data.embed[0]; - } - - if (rb_block_given_p()) { - return rb_ensure(rb_yield, self, buffer_free, self); - } - - return self; -} - -/* - * call-seq: initialize_copy(other) - * @return [self] - * DO NOT CALL THIS METHOD. - */ -static VALUE -buffer_initialize_copy(VALUE self, VALUE other) -{ - AbstractMemory* src; - Buffer* dst; - - Data_Get_Struct(self, Buffer, dst); - src = rbffi_AbstractMemory_Cast(other, BufferClass); - if ((dst->memory.flags & MEM_EMBED) == 0 && dst->data.storage != NULL) { - xfree(dst->data.storage); - } - dst->data.storage = xmalloc(src->size + 7); - if (dst->data.storage == NULL) { - rb_raise(rb_eNoMemError, "failed to allocate memory size=%lu bytes", src->size); - return Qnil; - } - - dst->memory.address = (void *) (((uintptr_t) dst->data.storage + 0x7) & (uintptr_t) ~0x7ULL); - dst->memory.size = src->size; - dst->memory.typeSize = src->typeSize; - - /* finally, copy the actual buffer contents */ - memcpy(dst->memory.address, src->address, src->size); - - return self; -} - -static VALUE -buffer_alloc_inout(int argc, VALUE* argv, VALUE klass) -{ - return buffer_initialize(argc, argv, buffer_allocate(klass)); -} - -static VALUE -slice(VALUE self, long offset, long len) -{ - Buffer* ptr; - Buffer* result; - VALUE obj = Qnil; - - Data_Get_Struct(self, Buffer, ptr); - checkBounds(&ptr->memory, offset, len); - - obj = Data_Make_Struct(BufferClass, Buffer, buffer_mark, -1, result); - result->memory.address = ptr->memory.address + offset; - result->memory.size = len; - result->memory.flags = ptr->memory.flags; - result->memory.typeSize = ptr->memory.typeSize; - result->data.rbParent = self; - - return obj; -} - -/* - * call-seq: + offset - * @param [Numeric] offset - * @return [Buffer] a new instance of Buffer pointing from offset until end of previous buffer. - * Add a Buffer with an offset - */ -static VALUE -buffer_plus(VALUE self, VALUE rbOffset) -{ - Buffer* ptr; - long offset = NUM2LONG(rbOffset); - - Data_Get_Struct(self, Buffer, ptr); - - return slice(self, offset, ptr->memory.size - offset); -} - -/* - * call-seq: slice(offset, length) - * @param [Numeric] offset - * @param [Numeric] length - * @return [Buffer] a new instance of Buffer - * Slice an existing Buffer. - */ -static VALUE -buffer_slice(VALUE self, VALUE rbOffset, VALUE rbLength) -{ - return slice(self, NUM2LONG(rbOffset), NUM2LONG(rbLength)); -} - -/* - * call-seq: inspect - * @return [String] - * Inspect a Buffer. - */ -static VALUE -buffer_inspect(VALUE self) -{ - char tmp[100]; - Buffer* ptr; - - Data_Get_Struct(self, Buffer, ptr); - - snprintf(tmp, sizeof(tmp), "#", ptr, ptr->memory.address, ptr->memory.size); - - return rb_str_new2(tmp); -} - - -#if BYTE_ORDER == LITTLE_ENDIAN -# define SWAPPED_ORDER BIG_ENDIAN -#else -# define SWAPPED_ORDER LITTLE_ENDIAN -#endif - -/* - * Set or get endianness of Buffer. - * @overload order - * @return [:big, :little] - * Get endianness of Buffer. - * @overload order(order) - * @param [:big, :little, :network] order - * @return [self] - * Set endianness of Buffer (+:network+ is an alias for +:big+). - */ -static VALUE -buffer_order(int argc, VALUE* argv, VALUE self) -{ - Buffer* ptr; - - Data_Get_Struct(self, Buffer, ptr); - if (argc == 0) { - int order = (ptr->memory.flags & MEM_SWAP) == 0 ? BYTE_ORDER : SWAPPED_ORDER; - return order == BIG_ENDIAN ? ID2SYM(rb_intern("big")) : ID2SYM(rb_intern("little")); - } else { - VALUE rbOrder = Qnil; - int order = BYTE_ORDER; - - if (rb_scan_args(argc, argv, "1", &rbOrder) < 1) { - rb_raise(rb_eArgError, "need byte order"); - } - if (SYMBOL_P(rbOrder)) { - ID id = SYM2ID(rbOrder); - if (id == rb_intern("little")) { - order = LITTLE_ENDIAN; - - } else if (id == rb_intern("big") || id == rb_intern("network")) { - order = BIG_ENDIAN; - } - } - if (order != BYTE_ORDER) { - Buffer* p2; - VALUE retval = slice(self, 0, ptr->memory.size); - - Data_Get_Struct(retval, Buffer, p2); - p2->memory.flags |= MEM_SWAP; - return retval; - } - - return self; - } -} - -/* Only used to free the buffer if the yield in the initializer throws an exception */ -static VALUE -buffer_free(VALUE self) -{ - Buffer* ptr; - - Data_Get_Struct(self, Buffer, ptr); - if ((ptr->memory.flags & MEM_EMBED) == 0 && ptr->data.storage != NULL) { - xfree(ptr->data.storage); - ptr->data.storage = NULL; - } - - return self; -} - -static void -buffer_mark(Buffer* ptr) -{ - rb_gc_mark(ptr->data.rbParent); -} - -void -rbffi_Buffer_Init(VALUE moduleFFI) -{ - VALUE ffi_AbstractMemory = rbffi_AbstractMemoryClass; - - /* - * Document-class: FFI::Buffer < FFI::AbstractMemory - * - * A Buffer is a function argument type. It should be use with functions playing with C arrays. - */ - BufferClass = rb_define_class_under(moduleFFI, "Buffer", ffi_AbstractMemory); - - /* - * Document-variable: FFI::Buffer - */ - rb_global_variable(&BufferClass); - rb_define_alloc_func(BufferClass, buffer_allocate); - - /* - * Document-method: alloc_inout - * call-seq: alloc_inout(*args) - * Create a new Buffer for in and out arguments (alias : new_inout). - */ - rb_define_singleton_method(BufferClass, "alloc_inout", buffer_alloc_inout, -1); - /* - * Document-method: alloc_out - * call-seq: alloc_out(*args) - * Create a new Buffer for out arguments (alias : new_out). - */ - rb_define_singleton_method(BufferClass, "alloc_out", buffer_alloc_inout, -1); - /* - * Document-method: alloc_in - * call-seq: alloc_in(*args) - * Create a new Buffer for in arguments (alias : new_in). - */ - rb_define_singleton_method(BufferClass, "alloc_in", buffer_alloc_inout, -1); - rb_define_alias(rb_singleton_class(BufferClass), "new_in", "alloc_in"); - rb_define_alias(rb_singleton_class(BufferClass), "new_out", "alloc_out"); - rb_define_alias(rb_singleton_class(BufferClass), "new_inout", "alloc_inout"); - - rb_define_method(BufferClass, "initialize", buffer_initialize, -1); - rb_define_method(BufferClass, "initialize_copy", buffer_initialize_copy, 1); - rb_define_method(BufferClass, "order", buffer_order, -1); - rb_define_method(BufferClass, "inspect", buffer_inspect, 0); - rb_define_alias(BufferClass, "length", "total"); - rb_define_method(BufferClass, "+", buffer_plus, 1); - rb_define_method(BufferClass, "slice", buffer_slice, 2); -} - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Buffer.o b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Buffer.o deleted file mode 100644 index 24fbd15a985c6090b269e84553042ef441215113..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28512 zcmdsg3w%`7wf8>f%qvgwgaHB>Bw%>u2?mtW1i~X>ARz=rFLsj5Ody(9GZO@%B?8v8 z(t=8RspS@Y^cK)w{k2%}aj*C+t@xE%t=f9qptQxSR#dFPg5Lkyk28}qgU0XvzVG+@ zzC+GgkGdaJ&HBmh#Q`u|lZ0#bZ)!w_Zp#PpDRK8mz;CjSdhCQKwJ?~_^$^93DqO=u5|hKpG3O|2A~eX@dITo7YPpcZ@0-QDdWe`j+Cxfk!>VxbgN z{w*7xy{?w)cm-SiOJ5@N3#6H!*ALGg_piG-V6|6fvG@C7+KX)HPFUV6rM;iX@_zb- z_5xiU@GIi)?YyC_GwApGs$)y!lJV-39pS+hqQCV88N+x*howGb|7hzBQKGfH{dL4; zY@I{E5;;x{z@E%vh`ln1xp9iLG-Qqw2Q^#jTBo2_f<#gxId>~#KEPM6!}w`qECsj< z0d*ZZ$<{QS6L5anW6=Njfxlm+9XL~`A2`3!IB@=Hb{m@NPM21BR>uk3J7M=W*xi*4 zJgl?Znsjz{z{oyGye5694AJO{J9j}Y7w{p#6GqO#H;mka2J6dGIwO(xJDxT&E^QRj zKIUno;?hW8`SgY{%Jg9C7qa(x zdCiyh&TpKL`kIG&t2!{~e`fy?!~eVU8=p9E-k@@@o#^PdX|}!wo%Ov)`M5GF&n9Vo z4M}P2Y#VGOWwJ-kZ+w#LovHf|)Vp@z{CsxXhlY0WjKNS(!p4B1AB?s02GSDQ8bJM? zKzlg9u?l`YwI6xrd^TVE&EK!mL8DD=w81wG_Vt4w$vnvRP4J2QTbEUNmS81gvk2~W zu&-X9#2WXbEu9*{&JukSV~vI6J9OY*&H+c|*~OsWN?~X7wVdnkM*4wk)(*bqWM^G= zmPs-sOEjgw>0pfmBSbz&MzTk8H&xz2cAKH+fgN<;oPm_evrUXukPm1VIqY239j;Be zKRD`ujY;hNX*z3U<3wLLl8$`xfWQB>+mE0>JPCiUu(9{=(^%u)boSM)uzSi`c{cy- zrVr3T>4{_)<#9Bt@)4JoS9UauJ#w^#-F6hZl;+XcOu(Itq2I|iNils>_OlNWd+KxN zH&!F2^HKNn4j{(2QQcGgC!h>1ILX%Eulje$piVcUPj6+nok7e=U&Xr@@uohmp?{Mu z=}^7zpI14jpLr_wrB|M}`%x}c=6x|`-Uq*Lx~THNe#EAKWaT6K5z{Rs3mxI- zJor!rKcD99>@$Pf!_aZ&^V∋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 S6yqW#U+jB%i851K!u}gJrJtPu diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Call.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Call.c deleted file mode 100644 index bd6c277..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Call.c +++ /dev/null @@ -1,487 +0,0 @@ -/* - * Copyright (c) 2009, Wayne Meissner - * Copyright (c) 2009, Luc Heinrich - * Copyright (c) 2009, Mike Dalessio - * Copyright (c) 2009, Aman Gupta. - * Copyright (c) 2008-2013, Ruby FFI project contributors - * 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 the Ruby FFI project 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 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. - */ - -#ifndef _MSC_VER -#include -#endif -#include -#include -#include -#include -#include -#include -#include -#if defined(HAVE_NATIVETHREAD) && !defined(_WIN32) -# include -# include -#endif -#include -#include "extconf.h" -#include "rbffi.h" -#include "compat.h" -#include "AbstractMemory.h" -#include "Pointer.h" -#include "Struct.h" -#include "Function.h" -#include "Type.h" -#include "LastError.h" -#include "Call.h" -#include "MappedType.h" -#include "Thread.h" -#include "LongDouble.h" - -#ifdef USE_RAW -# ifndef __i386__ -# error "RAW argument packing only supported on i386" -# endif - -#define INT8_ADJ (4) -#define INT16_ADJ (4) -#define INT32_ADJ (4) -#define INT64_ADJ (8) -#define LONG_ADJ (sizeof(long)) -#define FLOAT32_ADJ (4) -#define FLOAT64_ADJ (8) -#define ADDRESS_ADJ (sizeof(void *)) -#define LONGDOUBLE_ADJ (ffi_type_longdouble.alignment > sizeof(long double) ? ffi_type_longdouble.alignment : sizeof(long double)) - -#endif /* USE_RAW */ - -#ifdef USE_RAW -# define ADJ(p, a) ((p) = (FFIStorage*) (((char *) p) + a##_ADJ)) -#else -# define ADJ(p, a) (++(p)) -#endif - -static void* callback_param(VALUE proc, VALUE cbinfo); -static inline void* getPointer(VALUE value, int type); - -static ID id_to_ptr, id_map_symbol, id_to_native; - -void -rbffi_SetupCallParams(int argc, VALUE* argv, int paramCount, Type** paramTypes, - FFIStorage* paramStorage, void** ffiValues, - VALUE* callbackParameters, int callbackCount, VALUE enums) -{ - VALUE callbackProc = Qnil; - FFIStorage* param = ¶mStorage[0]; - int i, argidx, cbidx, argCount; - - if (unlikely(paramCount != -1 && paramCount != argc)) { - if (argc == (paramCount - 1) && callbackCount == 1 && rb_block_given_p()) { - callbackProc = rb_block_proc(); - } else { - rb_raise(rb_eArgError, "wrong number of arguments (%d for %d)", argc, paramCount); - } - } - - argCount = paramCount != -1 ? paramCount : argc; - - for (i = 0, argidx = 0, cbidx = 0; i < argCount; ++i) { - Type* paramType = paramTypes[i]; - int type; - - - if (unlikely(paramType->nativeType == NATIVE_MAPPED)) { - VALUE values[] = { argv[argidx], Qnil }; - argv[argidx] = rb_funcall2(((MappedType *) paramType)->rbConverter, id_to_native, 2, values); - paramType = ((MappedType *) paramType)->type; - } - - type = argidx < argc ? TYPE(argv[argidx]) : T_NONE; - ffiValues[i] = param; - - switch (paramType->nativeType) { - - case NATIVE_INT8: - if (unlikely(type == T_SYMBOL && enums != Qnil)) { - VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); - param->s8 = NUM2INT(value); - } else { - param->s8 = NUM2INT(argv[argidx]); - } - - ++argidx; - ADJ(param, INT8); - break; - - case NATIVE_INT16: - if (unlikely(type == T_SYMBOL && enums != Qnil)) { - VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); - param->s16 = NUM2INT(value); - - } else { - param->s16 = NUM2INT(argv[argidx]); - } - - ++argidx; - ADJ(param, INT16); - break; - - case NATIVE_INT32: - if (unlikely(type == T_SYMBOL && enums != Qnil)) { - VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); - param->s32 = NUM2INT(value); - - } else { - param->s32 = NUM2INT(argv[argidx]); - } - - ++argidx; - ADJ(param, INT32); - break; - - case NATIVE_BOOL: - if (type != T_TRUE && type != T_FALSE) { - rb_raise(rb_eTypeError, "wrong argument type (expected a boolean parameter)"); - } - param->s8 = argv[argidx++] == Qtrue; - ADJ(param, INT8); - break; - - case NATIVE_UINT8: - if (unlikely(type == T_SYMBOL && enums != Qnil)) { - VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); - param->u8 = NUM2UINT(value); - } else { - param->u8 = NUM2UINT(argv[argidx]); - } - - ADJ(param, INT8); - ++argidx; - break; - - case NATIVE_UINT16: - if (unlikely(type == T_SYMBOL && enums != Qnil)) { - VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); - param->u16 = NUM2UINT(value); - } else { - param->u16 = NUM2UINT(argv[argidx]); - } - - ADJ(param, INT16); - ++argidx; - break; - - case NATIVE_UINT32: - if (unlikely(type == T_SYMBOL && enums != Qnil)) { - VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); - param->u32 = NUM2UINT(value); - } else { - param->u32 = NUM2UINT(argv[argidx]); - } - - ADJ(param, INT32); - ++argidx; - break; - - case NATIVE_INT64: - if (unlikely(type == T_SYMBOL && enums != Qnil)) { - VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); - param->i64 = NUM2LL(value); - } else { - param->i64 = NUM2LL(argv[argidx]); - } - - ADJ(param, INT64); - ++argidx; - break; - - case NATIVE_UINT64: - if (unlikely(type == T_SYMBOL && enums != Qnil)) { - VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); - param->u64 = NUM2ULL(value); - } else { - param->u64 = NUM2ULL(argv[argidx]); - } - - ADJ(param, INT64); - ++argidx; - break; - - case NATIVE_LONG: - if (unlikely(type == T_SYMBOL && enums != Qnil)) { - VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); - *(ffi_sarg *) param = NUM2LONG(value); - } else { - *(ffi_sarg *) param = NUM2LONG(argv[argidx]); - } - - ADJ(param, LONG); - ++argidx; - break; - - case NATIVE_ULONG: - if (unlikely(type == T_SYMBOL && enums != Qnil)) { - VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); - *(ffi_arg *) param = NUM2ULONG(value); - } else { - *(ffi_arg *) param = NUM2ULONG(argv[argidx]); - } - - ADJ(param, LONG); - ++argidx; - break; - - case NATIVE_FLOAT32: - if (unlikely(type == T_SYMBOL && enums != Qnil)) { - VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); - param->f32 = (float) NUM2DBL(value); - } else { - param->f32 = (float) NUM2DBL(argv[argidx]); - } - - ADJ(param, FLOAT32); - ++argidx; - break; - - case NATIVE_FLOAT64: - if (unlikely(type == T_SYMBOL && enums != Qnil)) { - VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); - param->f64 = NUM2DBL(value); - } else { - param->f64 = NUM2DBL(argv[argidx]); - } - - ADJ(param, FLOAT64); - ++argidx; - break; - - case NATIVE_LONGDOUBLE: - if (unlikely(type == T_SYMBOL && enums != Qnil)) { - VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); - param->ld = rbffi_num2longdouble(value); - } else { - param->ld = rbffi_num2longdouble(argv[argidx]); - } - - ADJ(param, LONGDOUBLE); - ++argidx; - break; - - - case NATIVE_STRING: - if (type == T_NIL) { - param->ptr = NULL; - - } else { - param->ptr = StringValueCStr(argv[argidx]); - } - - ADJ(param, ADDRESS); - ++argidx; - break; - - case NATIVE_POINTER: - case NATIVE_BUFFER_IN: - case NATIVE_BUFFER_OUT: - case NATIVE_BUFFER_INOUT: - param->ptr = getPointer(argv[argidx++], type); - ADJ(param, ADDRESS); - break; - - - case NATIVE_FUNCTION: - if (callbackProc != Qnil) { - param->ptr = callback_param(callbackProc, callbackParameters[cbidx++]); - } else { - param->ptr = callback_param(argv[argidx], callbackParameters[cbidx++]); - ++argidx; - } - ADJ(param, ADDRESS); - break; - - case NATIVE_STRUCT: - ffiValues[i] = getPointer(argv[argidx++], type); - break; - - default: - rb_raise(rb_eArgError, "Invalid parameter type: %d", paramType->nativeType); - } - } -} - -static void * -call_blocking_function(void* data) -{ - rbffi_blocking_call_t* b = (rbffi_blocking_call_t *) data; - ffi_call(&b->cif, FFI_FN(b->function), b->retval, b->ffiValues); - - return NULL; -} - -VALUE -rbffi_do_blocking_call(VALUE data) -{ - rb_thread_call_without_gvl(call_blocking_function, (void*)data, (rb_unblock_function_t *) -1, NULL); - - return Qnil; -} - -VALUE -rbffi_save_frame_exception(VALUE data, VALUE exc) -{ - rbffi_frame_t* frame = (rbffi_frame_t *) data; - frame->exc = exc; - return Qnil; -} - -VALUE -rbffi_CallFunction(int argc, VALUE* argv, void* function, FunctionType* fnInfo) -{ - void* retval; - void** ffiValues; - FFIStorage* params; - VALUE rbReturnValue; - rbffi_frame_t frame = { 0 }; - - retval = alloca(MAX(fnInfo->ffi_cif.rtype->size, FFI_SIZEOF_ARG)); - - if (unlikely(fnInfo->blocking)) { - rbffi_blocking_call_t* bc; - - /* allocate information passed to the blocking function on the stack */ - ffiValues = ALLOCA_N(void *, fnInfo->parameterCount); - params = ALLOCA_N(FFIStorage, fnInfo->parameterCount); - bc = ALLOCA_N(rbffi_blocking_call_t, 1); - bc->retval = retval; - bc->cif = fnInfo->ffi_cif; - bc->function = function; - bc->ffiValues = ffiValues; - bc->params = params; - bc->frame = &frame; - - rbffi_SetupCallParams(argc, argv, - fnInfo->parameterCount, fnInfo->parameterTypes, params, ffiValues, - fnInfo->callbackParameters, fnInfo->callbackCount, fnInfo->rbEnums); - - rbffi_frame_push(&frame); - rb_rescue2(rbffi_do_blocking_call, (VALUE) bc, rbffi_save_frame_exception, (VALUE) &frame, rb_eException, (VALUE) 0); - rbffi_frame_pop(&frame); - - } else { - - ffiValues = ALLOCA_N(void *, fnInfo->parameterCount); - params = ALLOCA_N(FFIStorage, fnInfo->parameterCount); - - rbffi_SetupCallParams(argc, argv, - fnInfo->parameterCount, fnInfo->parameterTypes, params, ffiValues, - fnInfo->callbackParameters, fnInfo->callbackCount, fnInfo->rbEnums); - - rbffi_frame_push(&frame); - ffi_call(&fnInfo->ffi_cif, FFI_FN(function), retval, ffiValues); - rbffi_frame_pop(&frame); - } - - if (unlikely(!fnInfo->ignoreErrno)) { - rbffi_save_errno(); - } - - if (RTEST(frame.exc) && frame.exc != Qnil) { - rb_exc_raise(frame.exc); - } - - RB_GC_GUARD(rbReturnValue) = rbffi_NativeValue_ToRuby(fnInfo->returnType, fnInfo->rbReturnType, retval); - RB_GC_GUARD(fnInfo->rbReturnType); - - return rbReturnValue; -} - -static inline void* -getPointer(VALUE value, int type) -{ - if (likely(type == T_DATA && rb_obj_is_kind_of(value, rbffi_AbstractMemoryClass))) { - - return ((AbstractMemory *) DATA_PTR(value))->address; - - } else if (type == T_DATA && rb_obj_is_kind_of(value, rbffi_StructClass)) { - - AbstractMemory* memory = ((Struct *) DATA_PTR(value))->pointer; - return memory != NULL ? memory->address : NULL; - - } else if (type == T_STRING) { - - return StringValuePtr(value); - - } else if (type == T_NIL) { - - return NULL; - - } else if (rb_respond_to(value, id_to_ptr)) { - - VALUE ptr = rb_funcall2(value, id_to_ptr, 0, NULL); - if (rb_obj_is_kind_of(ptr, rbffi_AbstractMemoryClass) && TYPE(ptr) == T_DATA) { - return ((AbstractMemory *) DATA_PTR(ptr))->address; - } - rb_raise(rb_eArgError, "to_ptr returned an invalid pointer"); - } - - rb_raise(rb_eArgError, ":pointer argument is not a valid pointer"); - return NULL; -} - -Invoker -rbffi_GetInvoker(FunctionType *fnInfo) -{ - return rbffi_CallFunction; -} - - -static void* -callback_param(VALUE proc, VALUE cbInfo) -{ - VALUE callback ; - if (unlikely(proc == Qnil)) { - return NULL ; - } - - /* Handle Function pointers here */ - if (rb_obj_is_kind_of(proc, rbffi_FunctionClass)) { - AbstractMemory* ptr; - Data_Get_Struct(proc, AbstractMemory, ptr); - return ptr->address; - } - - callback = rbffi_Function_ForProc(cbInfo, proc); - RB_GC_GUARD(callback); - - return ((AbstractMemory *) DATA_PTR(callback))->address; -} - - -void -rbffi_Call_Init(VALUE moduleFFI) -{ - id_to_ptr = rb_intern("to_ptr"); - id_to_native = rb_intern("to_native"); - id_map_symbol = rb_intern("__map_symbol"); -} - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Call.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Call.h deleted file mode 100644 index b892d85..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Call.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (c) 2009, Wayne Meissner - * Copyright (c) 2009, Luc Heinrich - * Copyright (c) 2009, Mike Dalessio - * Copyright (c) 2009, Aman Gupta. - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * 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 the Ruby FFI project 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 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. - */ - -#ifndef RBFFI_CALL_H -#define RBFFI_CALL_H - -#include "Thread.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(__i386__) && \ - (defined(HAVE_RAW_API) || defined(USE_INTERNAL_LIBFFI)) && \ - !defined(_WIN32) && !defined(__WIN32__) -# define USE_RAW -#endif - -#if (defined(__i386__) || defined(__x86_64__)) && !(defined(_WIN32) || defined(__WIN32__)) -# define BYPASS_FFI 1 -#endif - -typedef union { -#ifdef USE_RAW - signed int s8, s16, s32; - unsigned int u8, u16, u32; -#else - signed char s8; - unsigned char u8; - signed short s16; - unsigned short u16; - signed int s32; - unsigned int u32; -#endif - signed long long i64; - unsigned long long u64; - signed long sl; - unsigned long ul; - void* ptr; - float f32; - double f64; - long double ld; -} FFIStorage; - -extern void rbffi_Call_Init(VALUE moduleFFI); - -extern void rbffi_SetupCallParams(int argc, VALUE* argv, int paramCount, Type** paramTypes, - FFIStorage* paramStorage, void** ffiValues, - VALUE* callbackParameters, int callbackCount, VALUE enums); - -struct FunctionType_; -extern VALUE rbffi_CallFunction(int argc, VALUE* argv, void* function, struct FunctionType_* fnInfo); - -typedef VALUE (*Invoker)(int argc, VALUE* argv, void* function, struct FunctionType_* fnInfo); - -Invoker rbffi_GetInvoker(struct FunctionType_* fnInfo); - -extern VALUE rbffi_GetEnumValue(VALUE enums, VALUE value); -extern int rbffi_GetSignedIntValue(VALUE value, int type, int minValue, int maxValue, const char* typeName, VALUE enums); - -typedef struct rbffi_blocking_call { - rbffi_frame_t* frame; - void* function; - ffi_cif cif; - void **ffiValues; - void* retval; - void* params; -} rbffi_blocking_call_t; - -VALUE rbffi_do_blocking_call(VALUE data); -VALUE rbffi_save_frame_exception(VALUE data, VALUE exc); - -#ifdef __cplusplus -} -#endif - -#endif /* RBFFI_CALL_H */ - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Call.o b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Call.o deleted file mode 100644 index d534c727352403cd864741f62ee5ce2886001462..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33872 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 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/ClosurePool.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/ClosurePool.c deleted file mode 100644 index cfdcf6c..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/ClosurePool.c +++ /dev/null @@ -1,333 +0,0 @@ -/* - * Copyright (c) 2009, 2010 Wayne Meissner - * Copyright (c) 2008-2013, Ruby FFI project contributors - * 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 the Ruby FFI project 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 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. - */ - -#ifndef _MSC_VER -#include -#endif -#include -#if defined(__CYGWIN__) || !defined(_WIN32) -# include -#endif -#include -#include -#include -#if defined(__CYGWIN__) || !defined(_WIN32) -# include -#else -# include -# define _WINSOCKAPI_ -# include -#endif -#include -#include - -#include -#include "rbffi.h" -#include "compat.h" - -#include "Function.h" -#include "Types.h" -#include "Type.h" -#include "LastError.h" -#include "Call.h" - -#include "ClosurePool.h" - -#ifndef roundup -# define roundup(x, y) ((((x)+((y)-1))/(y))*(y)) -#endif - -typedef struct Memory { - void* code; - void* data; - struct Memory* next; -} Memory; - -struct ClosurePool_ { - void* ctx; - int closureSize; - bool (*prep)(void* ctx, void *code, Closure* closure, char* errbuf, size_t errbufsize); - struct Memory* blocks; /* Keeps track of all the allocated memory for this pool */ - Closure* list; - long refcnt; -}; - -static long pageSize; - -static void* allocatePage(void); -static bool freePage(void *); -static bool protectPage(void *); - -ClosurePool* -rbffi_ClosurePool_New(int closureSize, - bool (*prep)(void* ctx, void *code, Closure* closure, char* errbuf, size_t errbufsize), - void* ctx) -{ - ClosurePool* pool; - - pool = xcalloc(1, sizeof(*pool)); - pool->closureSize = closureSize; - pool->ctx = ctx; - pool->prep = prep; - pool->refcnt = 1; - - return pool; -} - -void -cleanup_closure_pool(ClosurePool* pool) -{ - Memory* memory; - - for (memory = pool->blocks; memory != NULL; ) { - Memory* next = memory->next; -#if !USE_FFI_ALLOC - freePage(memory->code); -#else - ffi_closure_free(memory->code); -#endif - free(memory->data); - free(memory); - memory = next; - } - xfree(pool); -} - -void -rbffi_ClosurePool_Free(ClosurePool* pool) -{ - if (pool != NULL) { - long refcnt = --(pool->refcnt); - if (refcnt == 0) { - cleanup_closure_pool(pool); - } - } -} - -#if !USE_FFI_ALLOC - -Closure* -rbffi_Closure_Alloc(ClosurePool* pool) -{ - Closure *list = NULL; - Memory* block = NULL; - void *code = NULL; - char errmsg[256]; - int nclosures; - long trampolineSize; - int i; - - if (pool->list != NULL) { - Closure* closure = pool->list; - pool->list = pool->list->next; - pool->refcnt++; - - return closure; - } - - trampolineSize = roundup(pool->closureSize, 8); - nclosures = (int) (pageSize / trampolineSize); - block = calloc(1, sizeof(*block)); - list = calloc(nclosures, sizeof(*list)); - code = allocatePage(); - - if (block == NULL || list == NULL || code == NULL) { - snprintf(errmsg, sizeof(errmsg), "failed to allocate a page. errno=%d (%s)", errno, strerror(errno)); - goto error; - } - - for (i = 0; i < nclosures; ++i) { - Closure* closure = &list[i]; - closure->next = &list[i + 1]; - closure->pool = pool; - closure->code = ((char *)code + (i * trampolineSize)); - closure->pcl = closure->code; - - if (!(*pool->prep)(pool->ctx, closure->code, closure, errmsg, sizeof(errmsg))) { - goto error; - } - } - - if (!protectPage(code)) { - goto error; - } - - /* Track the allocated page + Closure memory area */ - block->data = list; - block->code = code; - block->next = pool->blocks; - pool->blocks = block; - - /* Thread the new block onto the free list, apart from the first one. */ - list[nclosures - 1].next = pool->list; - pool->list = list->next; - pool->refcnt++; - - /* Use the first one as the new handle */ - return list; - -error: - free(block); - free(list); - if (code != NULL) { - freePage(code); - } - - - rb_raise(rb_eRuntimeError, "%s", errmsg); - return NULL; -} - -#else - -Closure* -rbffi_Closure_Alloc(ClosurePool* pool) -{ - Closure *closure = NULL; - Memory* block = NULL; - void *code = NULL; - void *pcl = NULL; - char errmsg[256]; - - block = calloc(1, sizeof(*block)); - closure = calloc(1, sizeof(*closure)); - pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - - if (block == NULL || closure == NULL || pcl == NULL) { - snprintf(errmsg, sizeof(errmsg), "failed to allocate a page. errno=%d (%s)", errno, strerror(errno)); - goto error; - } - - closure->pool = pool; - closure->code = code; - closure->pcl = pcl; - - if (!(*pool->prep)(pool->ctx, closure->code, closure, errmsg, sizeof(errmsg))) { - goto error; - } - - /* Track the allocated page + Closure memory area */ - block->data = closure; - block->code = pcl; - pool->blocks = block; - - /* Thread the new block onto the free list, apart from the first one. */ - pool->refcnt++; - - return closure; - -error: - free(block); - free(closure); - if (pcl != NULL) { - ffi_closure_free(pcl); - } - - rb_raise(rb_eRuntimeError, "%s", errmsg); - return NULL; -} - -#endif /* !USE_FFI_ALLOC */ - -void -rbffi_Closure_Free(Closure* closure) -{ - if (closure != NULL) { - ClosurePool* pool = closure->pool; - long refcnt; - /* Just push it on the front of the free list */ - closure->next = pool->list; - pool->list = closure; - refcnt = --(pool->refcnt); - if (refcnt == 0) { - cleanup_closure_pool(pool); - } - } -} - -void* -rbffi_Closure_CodeAddress(Closure* handle) -{ - return handle->code; -} - - -static long -getPageSize() -{ -#if !defined(__CYGWIN__) && (defined(_WIN32) || defined(__WIN32__)) - SYSTEM_INFO si; - GetSystemInfo(&si); - return si.dwPageSize; -#else - return sysconf(_SC_PAGESIZE); -#endif -} - -#if !USE_FFI_ALLOC - -static void* -allocatePage(void) -{ -#if !defined(__CYGWIN__) && (defined(_WIN32) || defined(__WIN32__)) - return VirtualAlloc(NULL, pageSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); -#else - void *page = mmap(NULL, pageSize, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); - return (page != (void *) -1) ? page : NULL; -#endif -} - -static bool -freePage(void *addr) -{ -#if !defined(__CYGWIN__) && (defined(_WIN32) || defined(__WIN32__)) - return VirtualFree(addr, 0, MEM_RELEASE); -#else - return munmap(addr, pageSize) == 0; -#endif -} - -static bool -protectPage(void* page) -{ -#if !defined(__CYGWIN__) && (defined(_WIN32) || defined(__WIN32__)) - DWORD oldProtect; - return VirtualProtect(page, pageSize, PAGE_EXECUTE_READ, &oldProtect); -#else - return mprotect(page, pageSize, PROT_READ | PROT_EXEC) == 0; -#endif -} - -#endif /* !USE_FFI_ALLOC */ - -void -rbffi_ClosurePool_Init(VALUE module) -{ - pageSize = getPageSize(); -} - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/ClosurePool.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/ClosurePool.h deleted file mode 100644 index 99e3a47..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/ClosurePool.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2009, 2010 Wayne Meissner - * Copyright (c) 2008-2013, Ruby FFI project contributors - * 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 the Ruby FFI project 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 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. - */ - -#ifndef RUBYFFI_CLOSUREPOOL_H -#define RUBYFFI_CLOSUREPOOL_H - -typedef struct ClosurePool_ ClosurePool; -typedef struct Closure_ Closure; - -struct Closure_ { - void* info; /* opaque handle for storing closure-instance specific data */ - void* function; /* closure-instance specific function, called by custom trampoline */ - void* code; /* Executable address for the native trampoline code location */ - void* pcl; /* Writeable address for the native trampoline code location */ - - struct ClosurePool_* pool; - Closure* next; -}; - -void rbffi_ClosurePool_Init(VALUE module); - -ClosurePool* rbffi_ClosurePool_New(int closureSize, - bool (*prep)(void* ctx, void *code, Closure* closure, char* errbuf, size_t errbufsize), - void* ctx); - -void rbffi_ClosurePool_Free(ClosurePool *); - -Closure* rbffi_Closure_Alloc(ClosurePool *); -void rbffi_Closure_Free(Closure *); - -void* rbffi_Closure_GetCodeAddress(Closure *); - -#endif /* RUBYFFI_CLOSUREPOOL_H */ - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/ClosurePool.o b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/ClosurePool.o deleted file mode 100644 index 9505669dbc47c01ab46a9a532c3b516d5f2dd2e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10280 zcmcgydvH|Oc|T|G-qlJgt%S5fTEt^{2!w-nC5#=WF-8K(K@YGHvXK+$)oS-jTC)#j z9~g`i6o?&929IH48aLy_s^dQp^dFNir5}AwcUhA94m#; z-*@ggyQ|f9Os12Z(YfF2eBb%bciw09^WT5;hjPX^L!yt4e9?}N4;jgeJV^Bak-odg z5;#c_Nzo<1DOV5^$uQF9zO;o~^g!p}K#o?}hc*i%dxV}?#@GsC+1UgEl?)@4N+%=n zQOPij+4hv3HBx?+oXJbFnk>gK!sc*h)QBcRf@c^VJKOv3%F63C3)LMK^f|L4h0HRk z>;;F1ljdG(|7?4UN-edwrBEPHDqCKoIjRte2oDg5Bk(7gz~CO}f6a#f9tQ5S!I zC1d-bM8mxgnG!8Ml*wiS`J?22YPc~#>lf2*;R zx3h_UA2N4L^ux>(wNCb84P!GNC!3k?VKdhcY=Un4)W1mt6T6xI{ zKPDL)$k!uZ((eCXy*Cc)uU|`4qir>4qX+S+ow~kRKlU-zjcMoPs2};n;f0^vaIqN? zC(Vk}Rg}q(8~J--Gdsp~OHQ#xnNx2dKaZUGcRqE&)ix6>V>4$Fr!$DtJ0W)LSBQt* z2OYlgtuq>1cYGV0I_E~2`J(N|&dz73f7d5iQje~NFO)ZO=LhX}Heki_9{4_hHtd+X zmgt{Cn~qUz5Z5Q>v$hurG6~VHDU7+Jn;1Jbjk-D23%TkevPX0V@t;P25w7CEQ13

    I#$ zk!~~k)3>H?OLypp)1L&jJAF_3zI3PleEMO3YWTu0D&DQGZteF!84eNFv6^Hj)E(2(jk+#$3N>2H??-y?hI{~P8Ry69&) zBtI!gyul0k&!qfEQvMNa=(ko*HFr=PqKU4(gm0e7~e;NV=cwaj%s6Pe7OSKb8K= zrTF*xtPyHD6$I@R|%IRl1 zlwZG$Z@QGPm-11vJkLt{vh=?|(o3cMpC$bVDSu7U?~oimw@LpGOZ|Q+e@5#6M$&gl z+Q6cNu11O{ro7oQKGomOkU!k2zwMIwss2Fg+7v9r%BzJxtgRUJQFVPEcnryY7f0tH zo>=)SadKJ@#mWhfrR99BvST?YORW69IQ@s?<`7!=o-WF|A#pGbR7M19965$aGZQ=9L@YVLO|y�Eboe984+ z;XDHAS%)m7+VJnL;sA&gsjtW4JPaAjvljtX9#Ory}QaGr;sAscp5 zM8-(|)NvNciXH)xjF>YZu^gd?;~qhN7DL2W9VPMaezdQS^sbf%)wo=q(Ba`U)2S2b zuq8D7EESH0;aCXHV~`JjYXApY#YrSOTg1$;<)oP#EPB~ zin@+DXcT24&JYfk<0KxeqQ_f^66bdai#e1;Wc=x=s5g1WCzhf9&};z=#b!bDEO)FP z9Rk0iPHbhh^##H$JXF~aa3H-sBsno>uH;E93RWuea*A_Z#2t3DN%Y8ql9@5>AWCwD zfC`FdGHGBTC1r|LTsF+dUnzWnWm7W4vbHb_DVc5wr+;bJu<7mUnWijDrhRG4V#^2! zeBfLmAFc%@7FJyPrM 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. - */ - -#ifndef RBFFI_COMPAT_H -#define RBFFI_COMPAT_H - -#include - -#ifndef RARRAY_LEN -# define RARRAY_LEN(ary) RARRAY(ary)->len -#endif - -#ifndef RARRAY_PTR -# define RARRAY_PTR(ary) RARRAY(ary)->ptr -#endif - -#ifndef RSTRING_LEN -# define RSTRING_LEN(s) RSTRING(s)->len -#endif - -#ifndef RSTRING_PTR -# define RSTRING_PTR(s) RSTRING(s)->ptr -#endif - -#ifndef NUM2ULL -# define NUM2ULL(x) rb_num2ull((VALUE)x) -#endif - -#ifndef roundup -# define roundup(x, y) ((((x)+((y)-1))/(y))*(y)) -#endif - -#ifdef __GNUC__ -# define likely(x) __builtin_expect((x), 1) -# define unlikely(x) __builtin_expect((x), 0) -#else -# define likely(x) (x) -# define unlikely(x) (x) -#endif - -#ifdef _MSC_VER -#define ffi_type_longdouble ffi_type_double -#endif - -#ifndef MAX -# define MAX(a, b) ((a) < (b) ? (b) : (a)) -#endif -#ifndef MIN -# define MIN(a, b) ((a) < (b) ? (a) : (b)) -#endif - -#ifndef RB_GC_GUARD -# define RB_GC_GUARD(x) (x) -#endif - -#endif /* RBFFI_COMPAT_H */ diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/extconf.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/extconf.h deleted file mode 100644 index 9a64b8d..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/extconf.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef EXTCONF_H -#define EXTCONF_H -#define HAVE_FFI_PREP_CIF_VAR 1 -#define HAVE_FFI_RAW_CALL 1 -#define HAVE_FFI_PREP_RAW_CLOSURE 1 -#define HAVE_RAW_API 1 -#define USE_FFI_ALLOC 1 -#endif diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/extconf.rb b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/extconf.rb deleted file mode 100644 index 720fb06..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/extconf.rb +++ /dev/null @@ -1,98 +0,0 @@ -#!/usr/bin/env ruby - -if RUBY_ENGINE == 'ruby' || RUBY_ENGINE == 'rbx' - require 'mkmf' - require 'rbconfig' - - def system_libffi_usable? - # We need pkg_config or ffi.h - libffi_ok = pkg_config("libffi") || - have_header("ffi.h") || - find_header("ffi.h", "/usr/local/include", "/usr/include/ffi", - "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/ffi", - "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/ffi") || - (find_header("ffi.h", `xcrun --sdk macosx --show-sdk-path`.strip + "/usr/include/ffi") rescue false) - - # Ensure we can link to ffi_prep_closure_loc - libffi_ok &&= have_library("ffi", "ffi_prep_closure_loc", [ "ffi.h" ]) || - have_library("libffi", "ffi_prep_closure_loc", [ "ffi.h" ]) || - have_library("libffi-8", "ffi_prep_closure_loc", [ "ffi.h" ]) - - if RbConfig::CONFIG['host_os'] =~ /mswin/ - have_library('libffi_convenience') - have_library('shlwapi') - end - - libffi_ok - end - - dir_config("ffi_c") - - # recent versions of ruby add restrictive ansi and warning flags on a whim - kill them all - $warnflags = '' - $CFLAGS.gsub!(/[\s+]-ansi/, '') - $CFLAGS.gsub!(/[\s+]-std=[^\s]+/, '') - # solaris 10 needs -c99 for - $CFLAGS << " -std=c99" if RbConfig::CONFIG['host_os'] =~ /solaris(!?2\.11)/ - - # Check whether we use system libffi - system_libffi = enable_config('system-libffi', :try) - - if system_libffi == :try - system_libffi = ENV['RUBY_CC_VERSION'].nil? && system_libffi_usable? - elsif system_libffi - abort "system libffi is not usable" unless system_libffi_usable? - end - - if system_libffi - have_func('ffi_prep_cif_var') - $defs << "-DHAVE_RAW_API" if have_func("ffi_raw_call") && have_func("ffi_prep_raw_closure") - else - $defs << "-DHAVE_FFI_PREP_CIF_VAR" - $defs << "-DUSE_INTERNAL_LIBFFI" - - # Ensure libffi symbols aren't exported when using static libffi. - # This is to avoid interference with other gems like fiddle. - # See https://github.com/ffi/ffi/issues/835 - append_ldflags "-Wl,--exclude-libs,ALL" - end - - # Some linux archs need explicit linking to pthread, see https://github.com/ffi/ffi/issues/893 - append_ldflags "-pthread" - - ffi_alloc_default = RbConfig::CONFIG['host_os'] =~ /darwin/i && RbConfig::CONFIG['host'] =~ /arm|aarch64/i - if enable_config('libffi-alloc', ffi_alloc_default) - $defs << "-DUSE_FFI_ALLOC" - end - - $defs << "-DHAVE_EXTCONF_H" if $defs.empty? # needed so create_header works - - create_header - create_makefile("ffi_c") - - unless system_libffi - File.open("Makefile", "a") do |mf| - mf.puts "LIBFFI_HOST=--host=#{RbConfig::CONFIG['host_alias']}" if RbConfig::CONFIG.has_key?("host_alias") - if RbConfig::CONFIG['host_os'] =~ /darwin/i - if RbConfig::CONFIG['host'] =~ /arm|aarch64/i - mf.puts "LIBFFI_HOST=--host=aarch64-apple-#{RbConfig::CONFIG['host_os']}" - end - mf.puts "include ${srcdir}/libffi.darwin.mk" - elsif RbConfig::CONFIG['host_os'] =~ /bsd/i - mf.puts '.include "${srcdir}/libffi.bsd.mk"' - elsif RbConfig::CONFIG['host_os'] =~ /mswin64/i - mf.puts '!include $(srcdir)/libffi.vc64.mk' - elsif RbConfig::CONFIG['host_os'] =~ /mswin32/i - mf.puts '!include $(srcdir)/libffi.vc.mk' - else - mf.puts "include ${srcdir}/libffi.mk" - end - end - end - -else - File.open("Makefile", "w") do |mf| - mf.puts "# Dummy makefile for non-mri rubies" - mf.puts "all install::\n" - end -end diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/ffi.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/ffi.c deleted file mode 100644 index 22ea3bf..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/ffi.c +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (c) 2008, 2009, Wayne Meissner - * Copyright (C) 2009 Luc Heinrich - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * 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 the Ruby FFI project 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 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. - */ - -#include -#include -#include - -#include - -#include "rbffi.h" -#include "AbstractMemory.h" -#include "Pointer.h" -#include "MemoryPointer.h" -#include "Struct.h" -#include "StructByValue.h" -#include "DynamicLibrary.h" -#include "Platform.h" -#include "Types.h" -#include "LastError.h" -#include "Function.h" -#include "ClosurePool.h" -#include "MethodHandle.h" -#include "Call.h" -#include "ArrayType.h" -#include "MappedType.h" - -void Init_ffi_c(void); - -VALUE rbffi_FFIModule = Qnil; - -static VALUE moduleFFI = Qnil; - -void -Init_ffi_c(void) -{ - /* - * Document-module: FFI - * - * This module embbed type constants from {FFI::NativeType}. - */ - rbffi_FFIModule = moduleFFI = rb_define_module("FFI"); - rb_global_variable(&rbffi_FFIModule); - - rbffi_Thread_Init(rbffi_FFIModule); - - /* FFI::Type needs to be initialized before most other classes */ - rbffi_Type_Init(moduleFFI); - - rbffi_ArrayType_Init(moduleFFI); - rbffi_LastError_Init(moduleFFI); - rbffi_Call_Init(moduleFFI); - rbffi_ClosurePool_Init(moduleFFI); - rbffi_MethodHandle_Init(moduleFFI); - rbffi_Platform_Init(moduleFFI); - rbffi_AbstractMemory_Init(moduleFFI); - rbffi_Pointer_Init(moduleFFI); - rbffi_Function_Init(moduleFFI); - rbffi_MemoryPointer_Init(moduleFFI); - rbffi_Buffer_Init(moduleFFI); - rbffi_StructByValue_Init(moduleFFI); - rbffi_Struct_Init(moduleFFI); - rbffi_DynamicLibrary_Init(moduleFFI); - rbffi_Variadic_Init(moduleFFI); - rbffi_Types_Init(moduleFFI); - rbffi_MappedType_Init(moduleFFI); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/ffi.o b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/ffi.o deleted file mode 100644 index cf347c2e247363c870b48f607aa8c06ea8222ef9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5624 zcmd5=Z)_Y#6`%X>Kj-tmB=$9FIaD{Hw0CDaX=;U-FvW4z$=2eHSc@>e$JE$V{xdi?!~J|4<%x!3bi$;W!-Hw3$*KP=iY^!r=o zh2G>|bM4Zf>*@2S*J>3*Gxe%bhmqgkIob>;Y70!OjUmPKyrVy>@N|)set+$4Bo$&v zg80S9^ykd4rWgJG(msEG`I!D1%e6bM_i^_34W3_n7dKkqTW`^-VqOicX+BdnOPZFS zXqgIemHnkycn1EQ{oKdF`=R$I_g|%K8q~$V-hU~7Jd0O&er+G&ZxlWTQROzH!DWXG zWE5jP=tnNe9oY?n-wnLp4;_SbOw6ECp{+@kY^l$B)K6M&9QfJA+s6VIZ|@N=pzj$} z!n5npJ`ohRFzlInP`q#y?Q5a_ACT^7aQ7|36aPne`&jPcjRU{@KIVm~%lF~Nefy?F zpf_+|qCXN!oLot~e>~AMurcxHcL%9X z29jS3K;4-MI6WgX?LcC)1KlmtHNzg3b#6(n$;4aO67t|_b2eIB z(7qc(eUV-Y%6SRSlkSQj89qvlvG&kaR)!9uF$hIqK70=#))skCneAu~U1KvoB84DF zf$Dac1jl191F%-7wEY}p8A@Tr|(;(qdCf@~#Y-Vx^B)Xr;TOhGClXpPcl((B8?f0>!9dqqC!sK3%&ik2c z2Z>KH*$>jCG)0imgRE(SBr;5%2kBN5T?OfRiZ!oMA7%D?klx2x^Damq&rRg$HcS;O zy19^AGVFTUGE*blGQ*jzsn0ml^vJg1t>B}h8OTTO7xVMwOi^U1W4Wj|(4n54D_SKZ zgPS$G$1)p+*{EkHj3uLD)eJj3Q_&mqmR+r9r}g52LvxuL3tTpbCLUW;*Gpd#Y)Q@R z6LrihTQkgsX4%Y6SjA@58DW;jv#JKtAw6xI*}7iES}?Edl3|uCJ6mX)rHYZYn}y}< zXy)O}aCX7KEUwe)9Wpji*9Rrd3Cp78au@(wchFEq1+^5(n(AxIf+xyqmV4%T=}y7UzDSn z&u)Hy?8Sk$TA?ukJsp)LR63~1{tKv7=u{?dItsCa z849&&?jig%3Oi|x5ag4_voBq_bv`qeD5lP>MP2svd zTQ-Z8W=Te{BN~>$Oc9+~BwvU@97ZTkbU}t;*8)h=wa}52f`(hIaFGIcph$@d5y`y4 z!4@(sBvAn&nI{ya$g}0$BH8wCb18E+vuw7uvE(8g6m*@)5*iOg?(KLZ^6BVnk@Y7d zk?2n&1E&D{BkQBn4&D{bGd{+0iJPJl?`BLgeu{C>C%=dJ0HdF)e#*}Vw%aH%7{_Ly z>$(p=ncoCr3HdjG8^P&{Y37l?!;;#VdCpM)9#3>O)_LIKAd=)qVPDusnUjib; z(r1}d;*ESSeVX}mz#i~Z%ufKZ-_tA1p9OY+H<;Ie$p6z7=8M2};3eiqfeG*<%;$jk z<&mCcJ_E#0+;pD#BoNtddV=|G;9cN5nU4XH-eel*I8(Kw9UZ#Bt1p zexszZCW?zZ)=oJ7Z3;MKDc@vVW~?x3j2z_Az0AiLA7JF8BHGJ5%=k|^PL%#1fGGM7 z;}ynVFA42?$jA4%!Kv zh1Xf|SK_d_rVPj)^(ylZeD*hpf^Nk+qVck93Co6oO({V87D_EDex!#@2pKK-p0*_GmoG4Eu0rGb~bvzqc=^x*p-4 z*2UwMujO;>(sNySOxNx>kF<3`c*L#5hyA)QIqHnb^H?toiFQU>sA6y gCjJ!I8H@8~PM0a0t~9E(tOV diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/ffi_c.bundle b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/ffi_c.bundle deleted file mode 100755 index 8587e28111f51dfbd2a4de2a46c76eb4fdcfff76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211065 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

    e+EAs?n*1sV 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 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/DynamicLibrary.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/DynamicLibrary.c deleted file mode 100644 index 78b3de6..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/DynamicLibrary.c +++ /dev/null @@ -1,334 +0,0 @@ -/* - * Copyright (c) 2008-2010 Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * 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 the Ruby FFI project 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 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. - */ - -#include -#include -#include -#if (defined(_WIN32) || defined(__WIN32__)) && !defined(__CYGWIN__) -# include -# define _WINSOCKAPI_ -# include -# include -#else -# include -#endif -#include - -#include - -#include "rbffi.h" -#include "compat.h" -#include "AbstractMemory.h" -#include "Pointer.h" -#include "DynamicLibrary.h" - -typedef struct LibrarySymbol_ { - Pointer base; - VALUE library; - VALUE name; -} LibrarySymbol; - -static VALUE library_initialize(VALUE self, VALUE libname, VALUE libflags); -static void library_free(Library* lib); - - -static VALUE symbol_allocate(VALUE klass); -static VALUE symbol_new(VALUE library, void* address, VALUE name); -static void symbol_mark(LibrarySymbol* sym); - -static VALUE LibraryClass = Qnil, SymbolClass = Qnil; - -#if (defined(_WIN32) || defined(__WIN32__)) && !defined(__CYGWIN__) -static void* dl_open(const char* name, int flags); -static void dl_error(char* buf, int size); -#define dl_sym(handle, name) GetProcAddress(handle, name) -#define dl_close(handle) FreeLibrary(handle) -#else -# define dl_open(name, flags) dlopen(name, flags != 0 ? flags : RTLD_LAZY) -# define dl_error(buf, size) do { snprintf(buf, size, "%s", dlerror()); } while(0) -# define dl_sym(handle, name) dlsym(handle, name) -# define dl_close(handle) dlclose(handle) -#endif - -static VALUE -library_allocate(VALUE klass) -{ - Library* library; - return Data_Make_Struct(klass, Library, NULL, library_free, library); -} - -/* - * call-seq: DynamicLibrary.open(libname, libflags) - * @param libname (see #initialize) - * @param libflags (see #initialize) - * @return [FFI::DynamicLibrary] - * @raise {LoadError} if +libname+ cannot be opened - * Open a library. - */ -static VALUE -library_open(VALUE klass, VALUE libname, VALUE libflags) -{ - return library_initialize(library_allocate(klass), libname, libflags); -} - -/* - * call-seq: initialize(libname, libflags) - * @param [String] libname name of library to open - * @param [Fixnum] libflags flags for library to open - * @return [FFI::DynamicLibrary] - * @raise {LoadError} if +libname+ cannot be opened - * A new DynamicLibrary instance. - */ -static VALUE -library_initialize(VALUE self, VALUE libname, VALUE libflags) -{ - Library* library; - int flags; - - Check_Type(libflags, T_FIXNUM); - - Data_Get_Struct(self, Library, library); - flags = libflags != Qnil ? NUM2UINT(libflags) : 0; - - library->handle = dl_open(libname != Qnil ? StringValueCStr(libname) : NULL, flags); - if (library->handle == NULL) { - char errmsg[1024]; - dl_error(errmsg, sizeof(errmsg)); - rb_raise(rb_eLoadError, "Could not open library '%s': %s", - libname != Qnil ? StringValueCStr(libname) : "[current process]", - errmsg); - } -#ifdef __CYGWIN__ - // On Cygwin 1.7.17 "dlsym(dlopen(0,0), 'getpid')" fails. (dlerror: "No such process") - // As a workaround we can use "dlsym(RTLD_DEFAULT, 'getpid')" instead. - // Since 0 == RTLD_DEFAULT we won't call dl_close later. - if (libname == Qnil) { - dl_close(library->handle); - library->handle = RTLD_DEFAULT; - } -#endif - rb_iv_set(self, "@name", libname != Qnil ? libname : rb_str_new2("[current process]")); - return self; -} - -static VALUE -library_dlsym(VALUE self, VALUE name) -{ - Library* library; - void* address = NULL; - Check_Type(name, T_STRING); - - Data_Get_Struct(self, Library, library); - address = dl_sym(library->handle, StringValueCStr(name)); - - return address != NULL ? symbol_new(self, address, name) : Qnil; -} - -/* - * call-seq: last_error - * @return [String] library's last error string - */ -static VALUE -library_dlerror(VALUE self) -{ - char errmsg[1024]; - dl_error(errmsg, sizeof(errmsg)); - return rb_str_new2(errmsg); -} - -static void -library_free(Library* library) -{ - /* dlclose() on MacOS tends to segfault - avoid it */ -#ifndef __APPLE__ - if (library->handle != NULL) { - dl_close(library->handle); - } -#endif - xfree(library); -} - -#if (defined(_WIN32) || defined(__WIN32__)) && !defined(__CYGWIN__) -static void* -dl_open(const char* name, int flags) -{ - if (name == NULL) { - return GetModuleHandle(NULL); - } else { - DWORD dwFlags = PathIsRelativeA(name) ? 0 : LOAD_WITH_ALTERED_SEARCH_PATH; - return LoadLibraryExA(name, NULL, dwFlags); - } -} - -static void -dl_error(char* buf, int size) -{ - FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), - 0, buf, size, NULL); -} -#endif - -static VALUE -symbol_allocate(VALUE klass) -{ - LibrarySymbol* sym; - VALUE obj = Data_Make_Struct(klass, LibrarySymbol, NULL, -1, sym); - sym->name = Qnil; - sym->library = Qnil; - sym->base.rbParent = Qnil; - - return obj; -} - - -/* - * call-seq: initialize_copy(other) - * @param [Object] other - * @return [nil] - * DO NOT CALL THIS METHOD - */ -static VALUE -symbol_initialize_copy(VALUE self, VALUE other) -{ - rb_raise(rb_eRuntimeError, "cannot duplicate symbol"); - return Qnil; -} - -static VALUE -symbol_new(VALUE library, void* address, VALUE name) -{ - LibrarySymbol* sym; - VALUE obj = Data_Make_Struct(SymbolClass, LibrarySymbol, symbol_mark, -1, sym); - - sym->base.memory.address = address; - sym->base.memory.size = LONG_MAX; - sym->base.memory.typeSize = 1; - sym->base.memory.flags = MEM_RD | MEM_WR; - sym->library = library; - sym->name = name; - - return obj; -} - -static void -symbol_mark(LibrarySymbol* sym) -{ - rb_gc_mark(sym->library); - rb_gc_mark(sym->name); -} - -/* - * call-seq: inspect - * @return [String] - * Inspect. - */ -static VALUE -symbol_inspect(VALUE self) -{ - LibrarySymbol* sym; - char buf[256]; - - Data_Get_Struct(self, LibrarySymbol, sym); - snprintf(buf, sizeof(buf), "#", - StringValueCStr(sym->name), sym->base.memory.address); - return rb_str_new2(buf); -} - -void -rbffi_DynamicLibrary_Init(VALUE moduleFFI) -{ - /* - * Document-class: FFI::DynamicLibrary - */ - LibraryClass = rb_define_class_under(moduleFFI, "DynamicLibrary", rb_cObject); - rb_global_variable(&LibraryClass); - /* - * Document-class: FFI::DynamicLibrary::Symbol < FFI::Pointer - * - * An instance of this class represents a library symbol. It may be a {Pointer pointer} to - * a function or to a variable. - */ - SymbolClass = rb_define_class_under(LibraryClass, "Symbol", rbffi_PointerClass); - rb_global_variable(&SymbolClass); - - /* - * Document-const: FFI::NativeLibrary - * Backward compatibility for FFI::DynamicLibrary - */ - rb_define_const(moduleFFI, "NativeLibrary", LibraryClass); /* backwards compat library */ - rb_define_alloc_func(LibraryClass, library_allocate); - rb_define_singleton_method(LibraryClass, "open", library_open, 2); - rb_define_singleton_method(LibraryClass, "last_error", library_dlerror, 0); - rb_define_method(LibraryClass, "initialize", library_initialize, 2); - /* - * Document-method: find_symbol - * call-seq: find_symbol(name) - * @param [String] name library symbol's name - * @return [FFI::DynamicLibrary::Symbol] library symbol - */ - rb_define_method(LibraryClass, "find_symbol", library_dlsym, 1); - /* - * Document-method: find_function - * call-seq: find_function(name) - * @param [String] name library function's name - * @return [FFI::DynamicLibrary::Symbol] library function symbol - */ - rb_define_method(LibraryClass, "find_function", library_dlsym, 1); - /* - * Document-method: find_variable - * call-seq: find_variable(name) - * @param [String] name library variable's name - * @return [FFI::DynamicLibrary::Symbol] library variable symbol - */ - rb_define_method(LibraryClass, "find_variable", library_dlsym, 1); - rb_define_method(LibraryClass, "last_error", library_dlerror, 0); - rb_define_attr(LibraryClass, "name", 1, 0); - - rb_define_alloc_func(SymbolClass, symbol_allocate); - rb_undef_method(SymbolClass, "new"); - rb_define_method(SymbolClass, "inspect", symbol_inspect, 0); - rb_define_method(SymbolClass, "initialize_copy", symbol_initialize_copy, 1); - -#define DEF(x) rb_define_const(LibraryClass, "RTLD_" #x, UINT2NUM(RTLD_##x)) - DEF(LAZY); - DEF(NOW); - DEF(GLOBAL); - DEF(LOCAL); - DEF(NOLOAD); - DEF(NODELETE); - DEF(FIRST); - DEF(DEEPBIND); - DEF(MEMBER); - DEF(BINDING_MASK); - DEF(LOCATION_MASK); - DEF(ALL_MASK); -#undef DEF - -} - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/DynamicLibrary.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/DynamicLibrary.h deleted file mode 100644 index 97bf7bc..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/DynamicLibrary.h +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (c) 2008-2010 Wayne Meissner - * Copyright (c) 2008-2013, Ruby FFI project contributors - * 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 the Ruby FFI project 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 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. - */ - -#ifndef _LIBRARY_H -#define _LIBRARY_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* if these aren't defined (eg. windows), we need sensible defaults */ -#ifndef RTLD_LAZY -#define RTLD_LAZY 1 -#endif - -#ifndef RTLD_NOW -#define RTLD_NOW 2 -#endif - -#ifndef RTLD_LOCAL -#define RTLD_LOCAL 4 -#endif - -#ifndef RTLD_GLOBAL -#define RTLD_GLOBAL 8 -#endif - -/* If these aren't defined, they're not supported so define as 0 */ -#ifndef RTLD_NOLOAD -#define RTLD_NOLOAD 0 -#endif - -#ifndef RTLD_NODELETE -#define RTLD_NODELETE 0 -#endif - -#ifndef RTLD_FIRST -#define RTLD_FIRST 0 -#endif - -#ifndef RTLD_DEEPBIND -#define RTLD_DEEPBIND 0 -#endif - -#ifndef RTLD_MEMBER -#define RTLD_MEMBER 0 -#endif - -/* convenience */ -#ifndef RTLD_BINDING_MASK -#define RTLD_BINDING_MASK (RTLD_LAZY | RTLD_NOW) -#endif - -#ifndef RTLD_LOCATION_MASK -#define RTLD_LOCATION_MASK (RTLD_LOCAL | RTLD_GLOBAL) -#endif - -#ifndef RTLD_ALL_MASK -#define RTLD_ALL_MASK (RTLD_BINDING_MASK | RTLD_LOCATION_MASK | RTLD_NOLOAD | RTLD_NODELETE | RTLD_FIRST | RTLD_DEEPBIND | RTLD_MEMBER) -#endif - -typedef struct Library { - void* handle; -} Library; - -extern void rbffi_DynamicLibrary_Init(VALUE ffiModule); - -#ifdef __cplusplus -} -#endif - -#endif /* _LIBRARY_H */ - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/DynamicLibrary.o b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/DynamicLibrary.o deleted file mode 100644 index a2d850459d4125b10d462c7f01f388fb1375bb15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18784 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 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Function.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Function.c deleted file mode 100644 index 1a57591..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Function.c +++ /dev/null @@ -1,917 +0,0 @@ -/* - * Copyright (c) 2009-2011 Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * 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 the Ruby FFI project 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 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. - */ - -#ifndef _MSC_VER -#include -#endif -#include -#ifndef _WIN32 -# include -# include -#endif - -#include -#include -#include -#include -#include - -#include -#if defined(HAVE_NATIVETHREAD) && !defined(_WIN32) -#include -#endif -#include - -#include "rbffi.h" -#include "compat.h" - -#include "AbstractMemory.h" -#include "Pointer.h" -#include "Struct.h" -#include "Platform.h" -#include "Type.h" -#include "LastError.h" -#include "Call.h" -#include "ClosurePool.h" -#include "MappedType.h" -#include "Thread.h" -#include "LongDouble.h" -#include "MethodHandle.h" -#include "Function.h" - -typedef struct Function_ { - Pointer base; - FunctionType* info; - MethodHandle* methodHandle; - bool autorelease; - Closure* closure; - VALUE rbProc; - VALUE rbFunctionInfo; -} Function; - -static void function_mark(Function *); -static void function_free(Function *); -static VALUE function_init(VALUE self, VALUE rbFunctionInfo, VALUE rbProc); -static void callback_invoke(ffi_cif* cif, void* retval, void** parameters, void* user_data); -static bool callback_prep(void* ctx, void* code, Closure* closure, char* errmsg, size_t errmsgsize); -static void* callback_with_gvl(void* data); -static VALUE invoke_callback(VALUE data); -static VALUE save_callback_exception(VALUE data, VALUE exc); - -#define DEFER_ASYNC_CALLBACK 1 - - -#if defined(DEFER_ASYNC_CALLBACK) -static VALUE async_cb_event(void *); -static VALUE async_cb_call(void *); -#endif - -extern int ruby_thread_has_gvl_p(void); -extern int ruby_native_thread_p(void); - -VALUE rbffi_FunctionClass = Qnil; - -#if defined(DEFER_ASYNC_CALLBACK) -static VALUE async_cb_thread = Qnil; -#endif - -static ID id_call = 0, id_to_native = 0, id_from_native = 0, id_cbtable = 0, id_cb_ref = 0; - -struct gvl_callback { - Closure* closure; - void* retval; - void** parameters; - bool done; - rbffi_frame_t *frame; -#if defined(DEFER_ASYNC_CALLBACK) - struct gvl_callback* next; -# ifndef _WIN32 - pthread_cond_t async_cond; - pthread_mutex_t async_mutex; -# else - HANDLE async_event; -# endif -#endif -}; - - -#if defined(DEFER_ASYNC_CALLBACK) -static struct gvl_callback* async_cb_list = NULL; -# ifndef _WIN32 - static pthread_mutex_t async_cb_mutex = PTHREAD_MUTEX_INITIALIZER; - static pthread_cond_t async_cb_cond = PTHREAD_COND_INITIALIZER; -# else - static HANDLE async_cb_cond; - static CRITICAL_SECTION async_cb_lock; -# endif -#endif - - -static VALUE -function_allocate(VALUE klass) -{ - Function *fn; - VALUE obj; - - obj = Data_Make_Struct(klass, Function, function_mark, function_free, fn); - - fn->base.memory.flags = MEM_RD; - fn->base.rbParent = Qnil; - fn->rbProc = Qnil; - fn->rbFunctionInfo = Qnil; - fn->autorelease = true; - - return obj; -} - -static void -function_mark(Function *fn) -{ - rb_gc_mark(fn->base.rbParent); - rb_gc_mark(fn->rbProc); - rb_gc_mark(fn->rbFunctionInfo); -} - -static void -function_free(Function *fn) -{ - if (fn->methodHandle != NULL) { - rbffi_MethodHandle_Free(fn->methodHandle); - } - - if (fn->closure != NULL && fn->autorelease) { - rbffi_Closure_Free(fn->closure); - } - - xfree(fn); -} - -/* - * @param [Type, Symbol] return_type return type for the function - * @param [Array] param_types array of parameters types - * @param [Hash] options see {FFI::FunctionType} for available options - * @return [self] - * A new Function instance. - * - * Define a function from a Proc or a block. - * - * @overload initialize(return_type, param_types, options = {}) { |i| ... } - * @yieldparam i parameters for the function - * @overload initialize(return_type, param_types, proc, options = {}) - * @param [Proc] proc - */ -static VALUE -function_initialize(int argc, VALUE* argv, VALUE self) -{ - - VALUE rbReturnType = Qnil, rbParamTypes = Qnil, rbProc = Qnil, rbOptions = Qnil; - VALUE rbFunctionInfo = Qnil; - VALUE infoArgv[3]; - int nargs; - - nargs = rb_scan_args(argc, argv, "22", &rbReturnType, &rbParamTypes, &rbProc, &rbOptions); - - /* - * Callback with block, - * e.g. Function.new(:int, [ :int ]) { |i| blah } - * or Function.new(:int, [ :int ], { :convention => :stdcall }) { |i| blah } - */ - if (rb_block_given_p()) { - if (nargs > 3) { - rb_raise(rb_eArgError, "cannot create function with both proc/address and block"); - } - rbOptions = rbProc; - rbProc = rb_block_proc(); - } else { - /* Callback with proc, or Function with address - * e.g. Function.new(:int, [ :int ], Proc.new { |i| }) - * Function.new(:int, [ :int ], Proc.new { |i| }, { :convention => :stdcall }) - * Function.new(:int, [ :int ], addr) - * Function.new(:int, [ :int ], addr, { :convention => :stdcall }) - */ - } - - infoArgv[0] = rbReturnType; - infoArgv[1] = rbParamTypes; - infoArgv[2] = rbOptions; - rbFunctionInfo = rb_class_new_instance(rbOptions != Qnil ? 3 : 2, infoArgv, rbffi_FunctionTypeClass); - - function_init(self, rbFunctionInfo, rbProc); - - return self; -} - -/* - * call-seq: initialize_copy(other) - * @return [nil] - * DO NOT CALL THIS METHOD - */ -static VALUE -function_initialize_copy(VALUE self, VALUE other) -{ - rb_raise(rb_eRuntimeError, "cannot duplicate function instances"); - return Qnil; -} - -VALUE -rbffi_Function_NewInstance(VALUE rbFunctionInfo, VALUE rbProc) -{ - return function_init(function_allocate(rbffi_FunctionClass), rbFunctionInfo, rbProc); -} - -VALUE -rbffi_Function_ForProc(VALUE rbFunctionInfo, VALUE proc) -{ - VALUE callback, cbref, cbTable; - - cbref = RTEST(rb_ivar_defined(proc, id_cb_ref)) ? rb_ivar_get(proc, id_cb_ref) : Qnil; - /* If the first callback reference has the same function function signature, use it */ - if (cbref != Qnil && CLASS_OF(cbref) == rbffi_FunctionClass) { - Function* fp; - Data_Get_Struct(cbref, Function, fp); - if (fp->rbFunctionInfo == rbFunctionInfo) { - return cbref; - } - } - - cbTable = RTEST(rb_ivar_defined(proc, id_cbtable)) ? rb_ivar_get(proc, id_cbtable) : Qnil; - if (cbTable != Qnil && (callback = rb_hash_aref(cbTable, rbFunctionInfo)) != Qnil) { - return callback; - } - - /* No existing function for the proc with that signature, create a new one and cache it */ - callback = rbffi_Function_NewInstance(rbFunctionInfo, proc); - if (cbref == Qnil) { - /* If there is no other cb already cached for this proc, we can use the ivar slot */ - rb_ivar_set(proc, id_cb_ref, callback); - } else { - /* The proc instance has been used as more than one type of callback, store extras in a hash */ - if(cbTable == Qnil) { - cbTable = rb_hash_new(); - rb_ivar_set(proc, id_cbtable, cbTable); - } - rb_hash_aset(cbTable, rbFunctionInfo, callback); - } - - return callback; -} - -#if !defined(_WIN32) && defined(DEFER_ASYNC_CALLBACK) -static void -after_fork_callback(void) -{ - /* Ensure that a new dispatcher thread is started in a forked process */ - async_cb_thread = Qnil; - pthread_mutex_init(&async_cb_mutex, NULL); - pthread_cond_init(&async_cb_cond, NULL); -} -#endif - -static VALUE -function_init(VALUE self, VALUE rbFunctionInfo, VALUE rbProc) -{ - Function* fn = NULL; - - Data_Get_Struct(self, Function, fn); - - fn->rbFunctionInfo = rbFunctionInfo; - - Data_Get_Struct(fn->rbFunctionInfo, FunctionType, fn->info); - - if (rb_obj_is_kind_of(rbProc, rbffi_PointerClass)) { - Pointer* orig; - Data_Get_Struct(rbProc, Pointer, orig); - fn->base.memory = orig->memory; - fn->base.rbParent = rbProc; - - } else if (rb_obj_is_kind_of(rbProc, rb_cProc) || rb_respond_to(rbProc, id_call)) { - if (fn->info->closurePool == NULL) { - fn->info->closurePool = rbffi_ClosurePool_New(sizeof(ffi_closure), callback_prep, fn->info); - if (fn->info->closurePool == NULL) { - rb_raise(rb_eNoMemError, "failed to create closure pool"); - } - } - -#if defined(DEFER_ASYNC_CALLBACK) - if (async_cb_thread == Qnil) { - -#if !defined(_WIN32) - if( pthread_atfork(NULL, NULL, after_fork_callback) ){ - rb_warn("FFI: unable to register fork callback"); - } -#endif - - async_cb_thread = rb_thread_create(async_cb_event, NULL); - /* Name thread, for better debugging */ - rb_funcall(async_cb_thread, rb_intern("name="), 1, rb_str_new2("FFI Callback Dispatcher")); - } -#endif - - fn->closure = rbffi_Closure_Alloc(fn->info->closurePool); - fn->closure->info = fn; - fn->base.memory.address = fn->closure->code; - fn->base.memory.size = sizeof(*fn->closure); - fn->autorelease = true; - - } else { - rb_raise(rb_eTypeError, "wrong argument type %s, expected pointer or proc", - rb_obj_classname(rbProc)); - } - - fn->rbProc = rbProc; - - return self; -} - -/* - * call-seq: call(*args) - * @param [Array] args function arguments - * @return [FFI::Type] - * Call the function - */ -static VALUE -function_call(int argc, VALUE* argv, VALUE self) -{ - Function* fn; - - Data_Get_Struct(self, Function, fn); - - return (*fn->info->invoke)(argc, argv, fn->base.memory.address, fn->info); -} - -/* - * call-seq: attach(m, name) - * @param [Module] m - * @param [String] name - * @return [self] - * Attach a Function to the Module +m+ as +name+. - */ -static VALUE -function_attach(VALUE self, VALUE module, VALUE name) -{ - Function* fn; - char var[1024]; - - Data_Get_Struct(self, Function, fn); - - if (fn->info->parameterCount == -1) { - rb_raise(rb_eRuntimeError, "cannot attach variadic functions"); - return Qnil; - } - - if (!rb_obj_is_kind_of(module, rb_cModule)) { - rb_raise(rb_eRuntimeError, "trying to attach function to non-module"); - return Qnil; - } - - if (fn->methodHandle == NULL) { - fn->methodHandle = rbffi_MethodHandle_Alloc(fn->info, fn->base.memory.address); - } - - /* - * Stash the Function in a module variable so it does not get garbage collected - */ - snprintf(var, sizeof(var), "@@%s", StringValueCStr(name)); - rb_cv_set(module, var, self); - - rb_define_singleton_method(module, StringValueCStr(name), - rbffi_MethodHandle_CodeAddress(fn->methodHandle), -1); - - - rb_define_method(module, StringValueCStr(name), - rbffi_MethodHandle_CodeAddress(fn->methodHandle), -1); - - return self; -} - -/* - * call-seq: autorelease = autorelease - * @param [Boolean] autorelease - * @return [self] - * Set +autorelease+ attribute (See {Pointer}). - */ -static VALUE -function_set_autorelease(VALUE self, VALUE autorelease) -{ - Function* fn; - - Data_Get_Struct(self, Function, fn); - - fn->autorelease = RTEST(autorelease); - - return self; -} - -static VALUE -function_autorelease_p(VALUE self) -{ - Function* fn; - - Data_Get_Struct(self, Function, fn); - - return fn->autorelease ? Qtrue : Qfalse; -} - -/* - * call-seq: free - * @return [self] - * Free memory allocated by Function. - */ -static VALUE -function_release(VALUE self) -{ - Function* fn; - - Data_Get_Struct(self, Function, fn); - - if (fn->closure == NULL) { - rb_raise(rb_eRuntimeError, "cannot free function which was not allocated"); - } - - rbffi_Closure_Free(fn->closure); - fn->closure = NULL; - - return self; -} - -static void -callback_invoke(ffi_cif* cif, void* retval, void** parameters, void* user_data) -{ - struct gvl_callback cb = { 0 }; - - cb.closure = (Closure *) user_data; - cb.retval = retval; - cb.parameters = parameters; - cb.done = false; - cb.frame = rbffi_frame_current(); - - if (cb.frame != NULL) cb.frame->exc = Qnil; - - if (ruby_native_thread_p()) { - if(ruby_thread_has_gvl_p()) { - callback_with_gvl(&cb); - } else { - rb_thread_call_with_gvl(callback_with_gvl, &cb); - } -#if defined(DEFER_ASYNC_CALLBACK) && !defined(_WIN32) - } else { - bool empty = false; - - pthread_mutex_init(&cb.async_mutex, NULL); - pthread_cond_init(&cb.async_cond, NULL); - - /* Now signal the async callback thread */ - pthread_mutex_lock(&async_cb_mutex); - empty = async_cb_list == NULL; - cb.next = async_cb_list; - async_cb_list = &cb; - - pthread_cond_signal(&async_cb_cond); - pthread_mutex_unlock(&async_cb_mutex); - - /* Wait for the thread executing the ruby callback to signal it is done */ - pthread_mutex_lock(&cb.async_mutex); - while (!cb.done) { - pthread_cond_wait(&cb.async_cond, &cb.async_mutex); - } - pthread_mutex_unlock(&cb.async_mutex); - pthread_cond_destroy(&cb.async_cond); - pthread_mutex_destroy(&cb.async_mutex); - -#elif defined(DEFER_ASYNC_CALLBACK) && defined(_WIN32) - } else { - bool empty = false; - - cb.async_event = CreateEvent(NULL, FALSE, FALSE, NULL); - - /* Now signal the async callback thread */ - EnterCriticalSection(&async_cb_lock); - empty = async_cb_list == NULL; - cb.next = async_cb_list; - async_cb_list = &cb; - LeaveCriticalSection(&async_cb_lock); - - SetEvent(async_cb_cond); - - /* Wait for the thread executing the ruby callback to signal it is done */ - WaitForSingleObject(cb.async_event, INFINITE); - CloseHandle(cb.async_event); -#endif - } -} - -#if defined(DEFER_ASYNC_CALLBACK) -struct async_wait { - void* cb; - bool stop; -}; - -static void * async_cb_wait(void *); -static void async_cb_stop(void *); - -static VALUE -async_cb_event(void* unused) -{ - struct async_wait w = { 0 }; - - w.stop = false; - while (!w.stop) { - rb_thread_call_without_gvl(async_cb_wait, &w, async_cb_stop, &w); - if (w.cb != NULL) { - /* Start up a new ruby thread to run the ruby callback */ - VALUE new_thread = rb_thread_create(async_cb_call, w.cb); - /* Name thread, for better debugging */ - rb_funcall(new_thread, rb_intern("name="), 1, rb_str_new2("FFI Callback Runner")); - } - } - - return Qnil; -} - -#ifdef _WIN32 -static void * -async_cb_wait(void *data) -{ - struct async_wait* w = (struct async_wait *) data; - - w->cb = NULL; - - EnterCriticalSection(&async_cb_lock); - - while (!w->stop && async_cb_list == NULL) { - LeaveCriticalSection(&async_cb_lock); - WaitForSingleObject(async_cb_cond, INFINITE); - EnterCriticalSection(&async_cb_lock); - } - - if (async_cb_list != NULL) { - w->cb = async_cb_list; - async_cb_list = async_cb_list->next; - } - - LeaveCriticalSection(&async_cb_lock); - - return NULL; -} - -static void -async_cb_stop(void *data) -{ - struct async_wait* w = (struct async_wait *) data; - - EnterCriticalSection(&async_cb_lock); - w->stop = true; - LeaveCriticalSection(&async_cb_lock); - SetEvent(async_cb_cond); -} - -#else -static void * -async_cb_wait(void *data) -{ - struct async_wait* w = (struct async_wait *) data; - - w->cb = NULL; - - pthread_mutex_lock(&async_cb_mutex); - - while (!w->stop && async_cb_list == NULL) { - pthread_cond_wait(&async_cb_cond, &async_cb_mutex); - } - - if (async_cb_list != NULL) { - w->cb = async_cb_list; - async_cb_list = async_cb_list->next; - } - - pthread_mutex_unlock(&async_cb_mutex); - - return NULL; -} - -static void -async_cb_stop(void *data) -{ - struct async_wait* w = (struct async_wait *) data; - - pthread_mutex_lock(&async_cb_mutex); - w->stop = true; - pthread_cond_signal(&async_cb_cond); - pthread_mutex_unlock(&async_cb_mutex); -} -#endif - -static VALUE -async_cb_call(void *data) -{ - struct gvl_callback* cb = (struct gvl_callback *) data; - - callback_with_gvl(data); - - /* Signal the original native thread that the ruby code has completed */ -#ifdef _WIN32 - SetEvent(cb->async_event); -#else - pthread_mutex_lock(&cb->async_mutex); - cb->done = true; - pthread_cond_signal(&cb->async_cond); - pthread_mutex_unlock(&cb->async_mutex); -#endif - - return Qnil; -} - -#endif - -static void * -callback_with_gvl(void* data) -{ - rb_rescue2(invoke_callback, (VALUE) data, save_callback_exception, (VALUE) data, rb_eException, (VALUE) 0); - return NULL; -} - -static VALUE -invoke_callback(VALUE data) -{ - struct gvl_callback* cb = (struct gvl_callback *) data; - - Function* fn = (Function *) cb->closure->info; - FunctionType *cbInfo = fn->info; - Type* returnType = cbInfo->returnType; - void* retval = cb->retval; - void** parameters = cb->parameters; - VALUE* rbParams; - VALUE rbReturnType = cbInfo->rbReturnType; - VALUE rbReturnValue; - int i; - - rbParams = ALLOCA_N(VALUE, cbInfo->parameterCount); - for (i = 0; i < cbInfo->parameterCount; ++i) { - VALUE param; - Type* paramType = cbInfo->parameterTypes[i]; - VALUE rbParamType = rb_ary_entry(cbInfo->rbParameterTypes, i); - - if (unlikely(paramType->nativeType == NATIVE_MAPPED)) { - rbParamType = ((MappedType *) paramType)->rbType; - paramType = ((MappedType *) paramType)->type; - } - - switch (paramType->nativeType) { - case NATIVE_INT8: - param = INT2NUM(*(int8_t *) parameters[i]); - break; - case NATIVE_UINT8: - param = UINT2NUM(*(uint8_t *) parameters[i]); - break; - case NATIVE_INT16: - param = INT2NUM(*(int16_t *) parameters[i]); - break; - case NATIVE_UINT16: - param = UINT2NUM(*(uint16_t *) parameters[i]); - break; - case NATIVE_INT32: - param = INT2NUM(*(int32_t *) parameters[i]); - break; - case NATIVE_UINT32: - param = UINT2NUM(*(uint32_t *) parameters[i]); - break; - case NATIVE_INT64: - param = LL2NUM(*(int64_t *) parameters[i]); - break; - case NATIVE_UINT64: - param = ULL2NUM(*(uint64_t *) parameters[i]); - break; - case NATIVE_LONG: - param = LONG2NUM(*(long *) parameters[i]); - break; - case NATIVE_ULONG: - param = ULONG2NUM(*(unsigned long *) parameters[i]); - break; - case NATIVE_FLOAT32: - param = rb_float_new(*(float *) parameters[i]); - break; - case NATIVE_FLOAT64: - param = rb_float_new(*(double *) parameters[i]); - break; - case NATIVE_LONGDOUBLE: - param = rbffi_longdouble_new(*(long double *) parameters[i]); - break; - case NATIVE_STRING: - param = (*(void **) parameters[i] != NULL) ? rb_str_new2(*(char **) parameters[i]) : Qnil; - break; - case NATIVE_POINTER: - param = rbffi_Pointer_NewInstance(*(void **) parameters[i]); - break; - case NATIVE_BOOL: - param = (*(uint8_t *) parameters[i]) ? Qtrue : Qfalse; - break; - - case NATIVE_FUNCTION: - case NATIVE_STRUCT: - param = rbffi_NativeValue_ToRuby(paramType, rbParamType, parameters[i]); - break; - - default: - param = Qnil; - break; - } - - /* Convert the native value into a custom ruby value */ - if (unlikely(cbInfo->parameterTypes[i]->nativeType == NATIVE_MAPPED)) { - VALUE values[] = { param, Qnil }; - param = rb_funcall2(((MappedType *) cbInfo->parameterTypes[i])->rbConverter, id_from_native, 2, values); - } - - rbParams[i] = param; - } - - rbReturnValue = rb_funcall2(fn->rbProc, id_call, cbInfo->parameterCount, rbParams); - - if (unlikely(returnType->nativeType == NATIVE_MAPPED)) { - VALUE values[] = { rbReturnValue, Qnil }; - rbReturnValue = rb_funcall2(((MappedType *) returnType)->rbConverter, id_to_native, 2, values); - rbReturnType = ((MappedType *) returnType)->rbType; - returnType = ((MappedType* ) returnType)->type; - } - - if (rbReturnValue == Qnil || TYPE(rbReturnValue) == T_NIL) { - memset(retval, 0, returnType->ffiType->size); - } else switch (returnType->nativeType) { - case NATIVE_INT8: - case NATIVE_INT16: - case NATIVE_INT32: - *((ffi_sarg *) retval) = NUM2INT(rbReturnValue); - break; - case NATIVE_UINT8: - case NATIVE_UINT16: - case NATIVE_UINT32: - *((ffi_arg *) retval) = NUM2UINT(rbReturnValue); - break; - case NATIVE_INT64: - *((int64_t *) retval) = NUM2LL(rbReturnValue); - break; - case NATIVE_UINT64: - *((uint64_t *) retval) = NUM2ULL(rbReturnValue); - break; - case NATIVE_LONG: - *((ffi_sarg *) retval) = NUM2LONG(rbReturnValue); - break; - case NATIVE_ULONG: - *((ffi_arg *) retval) = NUM2ULONG(rbReturnValue); - break; - case NATIVE_FLOAT32: - *((float *) retval) = (float) NUM2DBL(rbReturnValue); - break; - case NATIVE_FLOAT64: - *((double *) retval) = NUM2DBL(rbReturnValue); - break; - case NATIVE_LONGDOUBLE: - *((long double *) retval) = rbffi_num2longdouble(rbReturnValue); - break; - case NATIVE_POINTER: - if (TYPE(rbReturnValue) == T_DATA && rb_obj_is_kind_of(rbReturnValue, rbffi_PointerClass)) { - *((void **) retval) = ((AbstractMemory *) DATA_PTR(rbReturnValue))->address; - } else { - /* Default to returning NULL if not a value pointer object. handles nil case as well */ - *((void **) retval) = NULL; - } - break; - - case NATIVE_BOOL: - *((ffi_arg *) retval) = rbReturnValue == Qtrue; - break; - - case NATIVE_FUNCTION: - if (TYPE(rbReturnValue) == T_DATA && rb_obj_is_kind_of(rbReturnValue, rbffi_PointerClass)) { - - *((void **) retval) = ((AbstractMemory *) DATA_PTR(rbReturnValue))->address; - - } else if (rb_obj_is_kind_of(rbReturnValue, rb_cProc) || rb_respond_to(rbReturnValue, id_call)) { - VALUE function; - - function = rbffi_Function_ForProc(rbReturnType, rbReturnValue); - - *((void **) retval) = ((AbstractMemory *) DATA_PTR(function))->address; - } else { - *((void **) retval) = NULL; - } - break; - - case NATIVE_STRUCT: - if (TYPE(rbReturnValue) == T_DATA && rb_obj_is_kind_of(rbReturnValue, rbffi_StructClass)) { - AbstractMemory* memory = ((Struct *) DATA_PTR(rbReturnValue))->pointer; - - if (memory->address != NULL) { - memcpy(retval, memory->address, returnType->ffiType->size); - - } else { - memset(retval, 0, returnType->ffiType->size); - } - - } else { - memset(retval, 0, returnType->ffiType->size); - } - break; - - default: - *((ffi_arg *) retval) = 0; - break; - } - - return Qnil; -} - -static VALUE -save_callback_exception(VALUE data, VALUE exc) -{ - struct gvl_callback* cb = (struct gvl_callback *) data; - - memset(cb->retval, 0, ((Function *) cb->closure->info)->info->returnType->ffiType->size); - if (cb->frame != NULL) cb->frame->exc = exc; - - return Qnil; -} - -static bool -callback_prep(void* ctx, void* code, Closure* closure, char* errmsg, size_t errmsgsize) -{ - FunctionType* fnInfo = (FunctionType *) ctx; - ffi_status ffiStatus; - - ffiStatus = ffi_prep_closure_loc(closure->pcl, &fnInfo->ffi_cif, callback_invoke, closure, code); - if (ffiStatus != FFI_OK) { - snprintf(errmsg, errmsgsize, "ffi_prep_closure_loc failed. status=%#x", ffiStatus); - return false; - } - - return true; -} - -void -rbffi_Function_Init(VALUE moduleFFI) -{ - rbffi_FunctionInfo_Init(moduleFFI); - /* - * Document-class: FFI::Function < FFI::Pointer - */ - rbffi_FunctionClass = rb_define_class_under(moduleFFI, "Function", rbffi_PointerClass); - - rb_global_variable(&rbffi_FunctionClass); - rb_define_alloc_func(rbffi_FunctionClass, function_allocate); - - rb_define_method(rbffi_FunctionClass, "initialize", function_initialize, -1); - rb_define_method(rbffi_FunctionClass, "initialize_copy", function_initialize_copy, 1); - rb_define_method(rbffi_FunctionClass, "call", function_call, -1); - rb_define_method(rbffi_FunctionClass, "attach", function_attach, 2); - rb_define_method(rbffi_FunctionClass, "free", function_release, 0); - rb_define_method(rbffi_FunctionClass, "autorelease=", function_set_autorelease, 1); - /* - * call-seq: autorelease - * @return [Boolean] - * Get +autorelease+ attribute. - * Synonymous for {#autorelease?}. - */ - rb_define_method(rbffi_FunctionClass, "autorelease", function_autorelease_p, 0); - /* - * call-seq: autorelease? - * @return [Boolean] +autorelease+ attribute - * Get +autorelease+ attribute. - */ - rb_define_method(rbffi_FunctionClass, "autorelease?", function_autorelease_p, 0); - - id_call = rb_intern("call"); - id_cbtable = rb_intern("@__ffi_callback_table__"); - id_cb_ref = rb_intern("@__ffi_callback__"); - id_to_native = rb_intern("to_native"); - id_from_native = rb_intern("from_native"); -#if defined(_WIN32) - InitializeCriticalSection(&async_cb_lock); - async_cb_cond = CreateEvent(NULL, FALSE, FALSE, NULL); -#endif -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Function.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Function.h deleted file mode 100644 index 406b4d8..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Function.h +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (c) 2009, Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * 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 the Ruby FFI project 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 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. - */ - -#ifndef RBFFI_FUNCTION_H -#define RBFFI_FUNCTION_H - -#ifdef __cplusplus -extern "C" { -#endif - -# include - -#include - -typedef struct FunctionType_ FunctionType; - -#include "Type.h" -#include "Call.h" -#include "ClosurePool.h" - -struct FunctionType_ { - Type type; /* The native type of a FunctionInfo object */ - VALUE rbReturnType; - VALUE rbParameterTypes; - - Type* returnType; - Type** parameterTypes; - NativeType* nativeParameterTypes; - ffi_type* ffiReturnType; - ffi_type** ffiParameterTypes; - ffi_cif ffi_cif; - Invoker invoke; - ClosurePool* closurePool; - int parameterCount; - int flags; - ffi_abi abi; - int callbackCount; - VALUE* callbackParameters; - VALUE rbEnums; - bool ignoreErrno; - bool blocking; - bool hasStruct; -}; - -extern VALUE rbffi_FunctionTypeClass, rbffi_FunctionClass; - -void rbffi_Function_Init(VALUE moduleFFI); -VALUE rbffi_Function_NewInstance(VALUE functionInfo, VALUE proc); -VALUE rbffi_Function_ForProc(VALUE cbInfo, VALUE proc); -void rbffi_FunctionInfo_Init(VALUE moduleFFI); - -#ifdef __cplusplus -} -#endif - -#endif /* RBFFI_FUNCTION_H */ - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Function.o b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Function.o deleted file mode 100644 index e1278ba2610cc2bacb14572ac0ab687cb5b3a7da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56352 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%0DuSFKr9-%uG|il3FK6K%O_29&7_ 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 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/FunctionInfo.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/FunctionInfo.c deleted file mode 100644 index 64e9874..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/FunctionInfo.c +++ /dev/null @@ -1,266 +0,0 @@ -/* - * Copyright (c) 2009, Wayne Meissner - * Copyright (C) 2009 Andrea Fazzi - * Copyright (c) 2008-2013, Ruby FFI project contributors - * 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 the Ruby FFI project 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 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. - */ - -#ifndef _MSC_VER -# include -#endif -#include -#include - -#include -#include - -#include -#include - -#include -#include "rbffi.h" -#include "compat.h" - -#include "AbstractMemory.h" -#include "Types.h" -#include "Type.h" -#include "StructByValue.h" -#include "Function.h" - -static VALUE fntype_allocate(VALUE klass); -static VALUE fntype_initialize(int argc, VALUE* argv, VALUE self); -static void fntype_mark(FunctionType*); -static void fntype_free(FunctionType *); - -VALUE rbffi_FunctionTypeClass = Qnil; - -static VALUE -fntype_allocate(VALUE klass) -{ - FunctionType* fnInfo; - VALUE obj = Data_Make_Struct(klass, FunctionType, fntype_mark, fntype_free, fnInfo); - - fnInfo->type.ffiType = &ffi_type_pointer; - fnInfo->type.nativeType = NATIVE_FUNCTION; - fnInfo->rbReturnType = Qnil; - fnInfo->rbParameterTypes = Qnil; - fnInfo->rbEnums = Qnil; - fnInfo->invoke = rbffi_CallFunction; - fnInfo->closurePool = NULL; - - return obj; -} - -static void -fntype_mark(FunctionType* fnInfo) -{ - rb_gc_mark(fnInfo->rbReturnType); - rb_gc_mark(fnInfo->rbParameterTypes); - rb_gc_mark(fnInfo->rbEnums); - if (fnInfo->callbackCount > 0 && fnInfo->callbackParameters != NULL) { - rb_gc_mark_locations(&fnInfo->callbackParameters[0], &fnInfo->callbackParameters[fnInfo->callbackCount]); - } -} - -static void -fntype_free(FunctionType* fnInfo) -{ - xfree(fnInfo->parameterTypes); - xfree(fnInfo->ffiParameterTypes); - xfree(fnInfo->nativeParameterTypes); - xfree(fnInfo->callbackParameters); - if (fnInfo->closurePool != NULL) { - rbffi_ClosurePool_Free(fnInfo->closurePool); - } - xfree(fnInfo); -} - -/* - * call-seq: initialize(return_type, param_types, options={}) - * @param [Type, Symbol] return_type return type for the function - * @param [Array] param_types array of parameters types - * @param [Hash] options - * @option options [Boolean] :blocking set to true if the C function is a blocking call - * @option options [Symbol] :convention calling convention see {FFI::Library#calling_convention} - * @option options [FFI::Enums] :enums - * @return [self] - * A new FunctionType instance. - */ -static VALUE -fntype_initialize(int argc, VALUE* argv, VALUE self) -{ - FunctionType *fnInfo; - ffi_status status; - VALUE rbReturnType = Qnil, rbParamTypes = Qnil, rbOptions = Qnil; - VALUE rbEnums = Qnil, rbConvention = Qnil, rbBlocking = Qnil; -#if defined(X86_WIN32) - VALUE rbConventionStr; -#endif - int i, nargs; - - nargs = rb_scan_args(argc, argv, "21", &rbReturnType, &rbParamTypes, &rbOptions); - if (nargs >= 3 && rbOptions != Qnil) { - rbConvention = rb_hash_aref(rbOptions, ID2SYM(rb_intern("convention"))); - rbEnums = rb_hash_aref(rbOptions, ID2SYM(rb_intern("enums"))); - rbBlocking = rb_hash_aref(rbOptions, ID2SYM(rb_intern("blocking"))); - } - - Check_Type(rbParamTypes, T_ARRAY); - - Data_Get_Struct(self, FunctionType, fnInfo); - fnInfo->parameterCount = (int) RARRAY_LEN(rbParamTypes); - fnInfo->parameterTypes = xcalloc(fnInfo->parameterCount, sizeof(*fnInfo->parameterTypes)); - fnInfo->ffiParameterTypes = xcalloc(fnInfo->parameterCount, sizeof(ffi_type *)); - fnInfo->nativeParameterTypes = xcalloc(fnInfo->parameterCount, sizeof(*fnInfo->nativeParameterTypes)); - fnInfo->rbParameterTypes = rb_ary_new2(fnInfo->parameterCount); - fnInfo->rbEnums = rbEnums; - fnInfo->blocking = RTEST(rbBlocking); - fnInfo->hasStruct = false; - - for (i = 0; i < fnInfo->parameterCount; ++i) { - VALUE entry = rb_ary_entry(rbParamTypes, i); - VALUE type = rbffi_Type_Lookup(entry); - - if (!RTEST(type)) { - VALUE typeName = rb_funcall2(entry, rb_intern("inspect"), 0, NULL); - rb_raise(rb_eTypeError, "Invalid parameter type (%s)", RSTRING_PTR(typeName)); - } - - if (rb_obj_is_kind_of(type, rbffi_FunctionTypeClass)) { - REALLOC_N(fnInfo->callbackParameters, VALUE, fnInfo->callbackCount + 1); - fnInfo->callbackParameters[fnInfo->callbackCount++] = type; - } - - if (rb_obj_is_kind_of(type, rbffi_StructByValueClass)) { - fnInfo->hasStruct = true; - } - - rb_ary_push(fnInfo->rbParameterTypes, type); - Data_Get_Struct(type, Type, fnInfo->parameterTypes[i]); - fnInfo->ffiParameterTypes[i] = fnInfo->parameterTypes[i]->ffiType; - fnInfo->nativeParameterTypes[i] = fnInfo->parameterTypes[i]->nativeType; - } - - fnInfo->rbReturnType = rbffi_Type_Lookup(rbReturnType); - if (!RTEST(fnInfo->rbReturnType)) { - VALUE typeName = rb_funcall2(rbReturnType, rb_intern("inspect"), 0, NULL); - rb_raise(rb_eTypeError, "Invalid return type (%s)", RSTRING_PTR(typeName)); - } - - if (rb_obj_is_kind_of(fnInfo->rbReturnType, rbffi_StructByValueClass)) { - fnInfo->hasStruct = true; - } - - Data_Get_Struct(fnInfo->rbReturnType, Type, fnInfo->returnType); - fnInfo->ffiReturnType = fnInfo->returnType->ffiType; - -#if defined(X86_WIN32) - rbConventionStr = (rbConvention != Qnil) ? rb_funcall2(rbConvention, rb_intern("to_s"), 0, NULL) : Qnil; - fnInfo->abi = (rbConventionStr != Qnil && strcmp(StringValueCStr(rbConventionStr), "stdcall") == 0) - ? FFI_STDCALL : FFI_DEFAULT_ABI; -#else - fnInfo->abi = FFI_DEFAULT_ABI; -#endif - - status = ffi_prep_cif(&fnInfo->ffi_cif, fnInfo->abi, fnInfo->parameterCount, - fnInfo->ffiReturnType, fnInfo->ffiParameterTypes); - switch (status) { - case FFI_BAD_ABI: - rb_raise(rb_eArgError, "Invalid ABI specified"); - case FFI_BAD_TYPEDEF: - rb_raise(rb_eArgError, "Invalid argument type specified"); - case FFI_OK: - break; - default: - rb_raise(rb_eArgError, "Unknown FFI error"); - } - - fnInfo->invoke = rbffi_GetInvoker(fnInfo); - - return self; -} - -/* - * call-seq: result_type - * @return [Type] - * Get the return type of the function type - */ -static VALUE -fntype_result_type(VALUE self) -{ - FunctionType* ft; - - Data_Get_Struct(self, FunctionType, ft); - - return ft->rbReturnType; -} - -/* - * call-seq: param_types - * @return [Array] - * Get parameters types. - */ -static VALUE -fntype_param_types(VALUE self) -{ - FunctionType* ft; - - Data_Get_Struct(self, FunctionType, ft); - - return rb_ary_dup(ft->rbParameterTypes); -} - -void -rbffi_FunctionInfo_Init(VALUE moduleFFI) -{ - VALUE ffi_Type; - - ffi_Type = rbffi_TypeClass; - - /* - * Document-class: FFI::FunctionType < FFI::Type - */ - rbffi_FunctionTypeClass = rb_define_class_under(moduleFFI, "FunctionType",ffi_Type); - rb_global_variable(&rbffi_FunctionTypeClass); - /* - * Document-const: FFI::CallbackInfo = FFI::FunctionType - */ - rb_define_const(moduleFFI, "CallbackInfo", rbffi_FunctionTypeClass); - /* - * Document-const: FFI::FunctionInfo = FFI::FunctionType - */ - rb_define_const(moduleFFI, "FunctionInfo", rbffi_FunctionTypeClass); - /* - * Document-const: FFI::Type::Function = FFI::FunctionType - */ - rb_define_const(ffi_Type, "Function", rbffi_FunctionTypeClass); - - rb_define_alloc_func(rbffi_FunctionTypeClass, fntype_allocate); - rb_define_method(rbffi_FunctionTypeClass, "initialize", fntype_initialize, -1); - rb_define_method(rbffi_FunctionTypeClass, "result_type", fntype_result_type, 0); - rb_define_method(rbffi_FunctionTypeClass, "param_types", fntype_param_types, 0); - -} - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/FunctionInfo.o b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/FunctionInfo.o deleted file mode 100644 index 5d4fc77a9341864b87810f6d2b6e6ff7291666cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23408 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 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/LastError.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/LastError.c deleted file mode 100644 index 6beecef..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/LastError.c +++ /dev/null @@ -1,225 +0,0 @@ -/* - * Copyright (c) 2008, 2009, Wayne Meissner - * Copyright (C) 2009 Aman Gupta - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * 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 the Ruby FFI project 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 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. - */ - -#ifndef _MSC_VER -# include -#endif -#include -#include -#include -#include -#include -#include - -#include "LastError.h" - -#if defined(HAVE_NATIVETHREAD) && !defined(_WIN32) && !defined(__WIN32__) -# include -# define USE_PTHREAD_LOCAL -#endif - -#if defined(__CYGWIN__) -typedef uint32_t DWORD; -DWORD __stdcall GetLastError(void); -void __stdcall SetLastError(DWORD); -#endif - -typedef struct ThreadData { - int td_errno; -#if defined(_WIN32) || defined(__CYGWIN__) - DWORD td_winapi_errno; -#endif -} ThreadData; - -#if defined(USE_PTHREAD_LOCAL) -static pthread_key_t threadDataKey; -#endif - -static inline ThreadData* thread_data_get(void); - -#if defined(USE_PTHREAD_LOCAL) - -static ThreadData* -thread_data_init(void) -{ - ThreadData* td = xcalloc(1, sizeof(ThreadData)); - - pthread_setspecific(threadDataKey, td); - - return td; -} - - -static inline ThreadData* -thread_data_get(void) -{ - ThreadData* td = pthread_getspecific(threadDataKey); - return td != NULL ? td : thread_data_init(); -} - -static void -thread_data_free(void *ptr) -{ - xfree(ptr); -} - -#else -static ID id_thread_data; - -static ThreadData* -thread_data_init(void) -{ - ThreadData* td; - VALUE obj; - - obj = Data_Make_Struct(rb_cObject, ThreadData, NULL, -1, td); - rb_thread_local_aset(rb_thread_current(), id_thread_data, obj); - - return td; -} - -static inline ThreadData* -thread_data_get() -{ - VALUE obj = rb_thread_local_aref(rb_thread_current(), id_thread_data); - - if (obj != Qnil && TYPE(obj) == T_DATA) { - return (ThreadData *) DATA_PTR(obj); - } - - return thread_data_init(); -} - -#endif - - -/* - * call-seq: error - * @return [Numeric] - * Get +errno+ value. - */ -static VALUE -get_last_error(VALUE self) -{ - return INT2NUM(thread_data_get()->td_errno); -} - -#if defined(_WIN32) || defined(__CYGWIN__) -/* - * call-seq: winapi_error - * @return [Numeric] - * Get +GetLastError()+ value. Only Windows or Cygwin. - */ -static VALUE -get_last_winapi_error(VALUE self) -{ - return INT2NUM(thread_data_get()->td_winapi_errno); -} -#endif - - -/* - * call-seq: error(error) - * @param [Numeric] error - * @return [nil] - * Set +errno+ value. - */ -static VALUE -set_last_error(VALUE self, VALUE error) -{ - -#ifdef _WIN32 - SetLastError(NUM2INT(error)); -#else - errno = NUM2INT(error); -#endif - - return Qnil; -} - -#if defined(_WIN32) || defined(__CYGWIN__) -/* - * call-seq: error(error) - * @param [Numeric] error - * @return [nil] - * Set +GetLastError()+ value. Only on Windows and Cygwin. - */ -static VALUE -set_last_winapi_error(VALUE self, VALUE error) -{ - SetLastError(NUM2INT(error)); - return Qnil; -} -#endif - - -void -rbffi_save_errno(void) -{ - int error = 0; -#ifdef _WIN32 - error = GetLastError(); -#else - error = errno; -#endif - -#if defined(_WIN32) || defined(__CYGWIN__) - DWORD winapi_error = GetLastError(); - thread_data_get()->td_winapi_errno = winapi_error; -#endif - - thread_data_get()->td_errno = error; -} - -void -rbffi_LastError_Init(VALUE moduleFFI) -{ - /* - * Document-module: FFI::LastError - * This module defines a couple of method to set and get +errno+ - * for current thread. - */ - VALUE moduleError = rb_define_module_under(moduleFFI, "LastError"); - - rb_define_module_function(moduleError, "error", get_last_error, 0); - rb_define_module_function(moduleError, "error=", set_last_error, 1); - -#if defined(_WIN32) || defined(__CYGWIN__) - rb_define_module_function(moduleError, "winapi_error", get_last_winapi_error, 0); - rb_define_module_function(moduleError, "winapi_error=", set_last_winapi_error, 1); -#endif - -#if defined(USE_PTHREAD_LOCAL) - pthread_key_create(&threadDataKey, thread_data_free); -#else - id_thread_data = rb_intern("ffi_thread_local_data"); -#endif /* USE_PTHREAD_LOCAL */ -} - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/LastError.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/LastError.h deleted file mode 100644 index ee1dfbb..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/LastError.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2008, 2009, Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * 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 the Ruby FFI project 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 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. - */ - -#ifndef RBFFI_LASTERROR_H -#define RBFFI_LASTERROR_H - -#ifdef __cplusplus -extern "C" { -#endif - - -void rbffi_LastError_Init(VALUE moduleFFI); - -void rbffi_save_errno(void); - -#ifdef __cplusplus -} -#endif - -#endif /* RBFFI_LASTERROR_H */ - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/LastError.o b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/LastError.o deleted file mode 100644 index e997d034a4663a8c7bb8f09bf3de727f2256d10a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7776 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 X`!5r08-+Dh9}tiYHVFh|y%7He>iI1u diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/LongDouble.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/LongDouble.c deleted file mode 100644 index c95f2fd..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/LongDouble.c +++ /dev/null @@ -1,65 +0,0 @@ -#include "LongDouble.h" -#include -#include -#include - -#if defined (__CYGWIN__) || defined(__INTERIX) || defined(_MSC_VER) -# define strtold(str, endptr) ((long double) strtod((str), (endptr))) -#endif /* defined (__CYGWIN__) */ - -static VALUE rb_cBigDecimal = Qnil; -static VALUE bigdecimal_load(VALUE unused); -static VALUE bigdecimal_failed(VALUE value, VALUE exc); - -VALUE -rbffi_longdouble_new(long double ld) -{ - if (!RTEST(rb_cBigDecimal)) { - /* allow fallback if the bigdecimal library is unavailable in future ruby versions */ - rb_cBigDecimal = rb_rescue(bigdecimal_load, Qnil, bigdecimal_failed, rb_cObject); - } - - if (RTEST(rb_cBigDecimal) && rb_cBigDecimal != rb_cObject) { - char buf[128]; - return rb_funcall(rb_mKernel, rb_intern("BigDecimal"), 1, rb_str_new(buf, sprintf(buf, "%.35Le", ld))); - } - - /* Fall through to handling as a float */ - return rb_float_new(ld); -} - -long double -rbffi_num2longdouble(VALUE value) -{ - if (TYPE(value) == T_FLOAT) { - return rb_num2dbl(value); - } - - if (!RTEST(rb_cBigDecimal) && rb_const_defined(rb_cObject, rb_intern("BigDecimal"))) { - rb_cBigDecimal = rb_const_get(rb_cObject, rb_intern("BigDecimal")); - } - - if (RTEST(rb_cBigDecimal) && rb_cBigDecimal != rb_cObject && RTEST(rb_obj_is_kind_of(value, rb_cBigDecimal))) { - VALUE s = rb_funcall(value, rb_intern("to_s"), 1, rb_str_new2("E")); - long double ret = strtold(RSTRING_PTR(s), NULL); - RB_GC_GUARD(s); - return ret; - } - - /* Fall through to handling as a float */ - return rb_num2dbl(value); -} - - -static VALUE -bigdecimal_load(VALUE unused) -{ - rb_require("bigdecimal"); - return rb_const_get(rb_cObject, rb_intern("BigDecimal")); -} - -static VALUE -bigdecimal_failed(VALUE value, VALUE exc) -{ - return value; -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/LongDouble.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/LongDouble.h deleted file mode 100644 index 079e890..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/LongDouble.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2012, Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * 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 the Ruby FFI project 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 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. - */ - -#ifndef RBFFI_LONGDOUBLE_H -#define RBFFI_LONGDOUBLE_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern VALUE rbffi_longdouble_new(long double ld); -extern long double rbffi_num2longdouble(VALUE value); - -#ifdef __cplusplus -} -#endif - -#endif /* RBFFI_LONGDOUBLE_H */ - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/LongDouble.o b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/LongDouble.o deleted file mode 100644 index d3df443d9b6f1eeec206a01d80c3d92cefd5875c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10736 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 a1omrqfaYEMkM^~O8`qe=fWQ|%LjMm^m{)oL diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Makefile b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Makefile deleted file mode 100644 index 7e236fc..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Makefile +++ /dev/null @@ -1,267 +0,0 @@ - -SHELL = /bin/sh - -# V=0 quiet, V=1 verbose. other values don't work. -V = 0 -Q1 = $(V:1=) -Q = $(Q1:0=@) -ECHO1 = $(V:1=@ :) -ECHO = $(ECHO1:0=@ echo) -NULLCMD = : - -#### Start of system configuration section. #### - -srcdir = . -topdir = /Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0 -hdrdir = $(topdir) -arch_hdrdir = /Users/penguin/.rvm/rubies/ruby-2.7.6/include/ruby-2.7.0/arm64-darwin22 -PATH_SEPARATOR = : -VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby -prefix = $(DESTDIR)/Users/penguin/.rvm/rubies/ruby-2.7.6 -rubysitearchprefix = $(rubylibprefix)/$(sitearch) -rubyarchprefix = $(rubylibprefix)/$(arch) -rubylibprefix = $(libdir)/$(RUBY_BASE_NAME) -exec_prefix = $(prefix) -vendorarchhdrdir = $(vendorhdrdir)/$(sitearch) -sitearchhdrdir = $(sitehdrdir)/$(sitearch) -rubyarchhdrdir = $(rubyhdrdir)/$(arch) -vendorhdrdir = $(rubyhdrdir)/vendor_ruby -sitehdrdir = $(rubyhdrdir)/site_ruby -rubyhdrdir = $(includedir)/$(RUBY_VERSION_NAME) -vendorarchdir = $(vendorlibdir)/$(sitearch) -vendorlibdir = $(vendordir)/$(ruby_version) -vendordir = $(rubylibprefix)/vendor_ruby -sitearchdir = $(DESTDIR)./.gem.20230521-58859-cop2nu -sitelibdir = $(DESTDIR)./.gem.20230521-58859-cop2nu -sitedir = $(rubylibprefix)/site_ruby -rubyarchdir = $(rubylibdir)/$(arch) -rubylibdir = $(rubylibprefix)/$(ruby_version) -sitearchincludedir = $(includedir)/$(sitearch) -archincludedir = $(includedir)/$(arch) -sitearchlibdir = $(libdir)/$(sitearch) -archlibdir = $(libdir)/$(arch) -ridir = $(datarootdir)/$(RI_BASE_NAME) -mandir = $(datarootdir)/man -localedir = $(datarootdir)/locale -libdir = $(exec_prefix)/lib -psdir = $(docdir) -pdfdir = $(docdir) -dvidir = $(docdir) -htmldir = $(docdir) -infodir = $(datarootdir)/info -docdir = $(datarootdir)/doc/$(PACKAGE) -oldincludedir = $(SDKROOT)/usr/include -includedir = $(prefix)/include -runstatedir = $(localstatedir)/run -localstatedir = $(prefix)/var -sharedstatedir = $(prefix)/com -sysconfdir = $(prefix)/etc -datadir = $(datarootdir) -datarootdir = $(prefix)/share -libexecdir = $(exec_prefix)/libexec -sbindir = $(exec_prefix)/sbin -bindir = $(exec_prefix)/bin -archdir = $(rubyarchdir) - - -CC_WRAPPER = -CC = gcc -CXX = g++ -LIBRUBY = $(LIBRUBY_SO) -LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a -LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME) -LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static -framework Security -framework Foundation $(MAINLIBS) -empty = -OUTFLAG = -o $(empty) -COUTFLAG = -o $(empty) -CSRCFLAG = $(empty) - -RUBY_EXTCONF_H = extconf.h -cflags = $(optflags) $(debugflags) $(warnflags) -cxxflags = -optflags = -O3 -debugflags = -ggdb3 -warnflags = -cppflags = -CCDLFLAGS = -fno-common -CFLAGS = $(CCDLFLAGS) -g -O2 -fno-common -pipe $(ARCH_FLAG) -INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir) -I/Library/Developer/CommandLineTools/SDKs/MacOSX13.sdk/usr/include/ffi -DEFS = -CPPFLAGS = -DRUBY_EXTCONF_H=\"$(RUBY_EXTCONF_H)\" -I/opt/homebrew/opt/libyaml/include -I/opt/homebrew/opt/libksba/include -I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/zlib/include -I/opt/homebrew/opt/openssl@1.1/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT $(DEFS) $(cppflags) -CXXFLAGS = $(CCDLFLAGS) -g -O2 $(ARCH_FLAG) -ldflags = -L. -fstack-protector-strong -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -pthread -dldflags = -Wl,-multiply_defined,suppress -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -ARCH_FLAG = -m64 -DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG) -LDSHARED = $(CC) -dynamic -bundle -LDSHAREDXX = $(CXX) -dynamic -bundle -AR = libtool -static -EXEEXT = - -RUBY_INSTALL_NAME = $(RUBY_BASE_NAME) -RUBY_SO_NAME = ruby.2.7 -RUBYW_INSTALL_NAME = -RUBY_VERSION_NAME = $(RUBY_BASE_NAME)-$(ruby_version) -RUBYW_BASE_NAME = rubyw -RUBY_BASE_NAME = ruby - -arch = arm64-darwin22 -sitearch = $(arch) -ruby_version = 2.7.0 -ruby = $(bindir)/$(RUBY_BASE_NAME) -RUBY = $(ruby) -ruby_headers = $(hdrdir)/ruby.h $(hdrdir)/ruby/backward.h $(hdrdir)/ruby/ruby.h $(hdrdir)/ruby/defines.h $(hdrdir)/ruby/missing.h $(hdrdir)/ruby/intern.h $(hdrdir)/ruby/st.h $(hdrdir)/ruby/subst.h $(arch_hdrdir)/ruby/config.h $(RUBY_EXTCONF_H) - -RM = rm -f -RM_RF = $(RUBY) -run -e rm -- -rf -RMDIRS = rmdir -p -MAKEDIRS = /opt/homebrew/opt/coreutils/bin/gmkdir -p -INSTALL = /opt/homebrew/opt/coreutils/bin/ginstall -c -INSTALL_PROG = $(INSTALL) -m 0755 -INSTALL_DATA = $(INSTALL) -m 644 -COPY = cp -TOUCH = exit > - -#### End of system configuration section. #### - -preload = -libpath = . $(libdir) /opt/homebrew/opt/libyaml/lib /opt/homebrew/opt/libksba/lib /opt/homebrew/opt/readline/lib /opt/homebrew/opt/zlib/lib /opt/homebrew/opt/openssl@1.1/lib -LIBPATH = -L. -L$(libdir) -L/opt/homebrew/opt/libyaml/lib -L/opt/homebrew/opt/libksba/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/openssl@1.1/lib -DEFFILE = - -CLEANFILES = mkmf.log -DISTCLEANFILES = -DISTCLEANDIRS = - -extout = -extout_prefix = -target_prefix = -LOCAL_LIBS = -LIBS = $(LIBRUBYARG_SHARED) -lffi -lffi -ORIG_SRCS = AbstractMemory.c ArrayType.c Buffer.c Call.c ClosurePool.c DynamicLibrary.c Function.c FunctionInfo.c LastError.c LongDouble.c MappedType.c MemoryPointer.c MethodHandle.c Platform.c Pointer.c Struct.c StructByValue.c StructLayout.c Thread.c Type.c Types.c Variadic.c ffi.c -SRCS = $(ORIG_SRCS) -OBJS = AbstractMemory.o ArrayType.o Buffer.o Call.o ClosurePool.o DynamicLibrary.o Function.o FunctionInfo.o LastError.o LongDouble.o MappedType.o MemoryPointer.o MethodHandle.o Platform.o Pointer.o Struct.o StructByValue.o StructLayout.o Thread.o Type.o Types.o Variadic.o ffi.o -HDRS = $(srcdir)/Type.h $(srcdir)/rbffi_endian.h $(srcdir)/MappedType.h $(srcdir)/Types.h $(srcdir)/LastError.h $(srcdir)/ArrayType.h $(srcdir)/extconf.h $(srcdir)/StructByValue.h $(srcdir)/AbstractMemory.h $(srcdir)/ClosurePool.h $(srcdir)/Call.h $(srcdir)/MethodHandle.h $(srcdir)/Struct.h $(srcdir)/rbffi.h $(srcdir)/Thread.h $(srcdir)/compat.h $(srcdir)/DynamicLibrary.h $(srcdir)/Platform.h $(srcdir)/Function.h $(srcdir)/LongDouble.h $(srcdir)/MemoryPointer.h $(srcdir)/Pointer.h -LOCAL_HDRS = -TARGET = ffi_c -TARGET_NAME = ffi_c -TARGET_ENTRY = Init_$(TARGET_NAME) -DLLIB = $(TARGET).bundle -EXTSTATIC = -STATIC_LIB = - -TIMESTAMP_DIR = . -BINDIR = $(bindir) -RUBYCOMMONDIR = $(sitedir)$(target_prefix) -RUBYLIBDIR = $(sitelibdir)$(target_prefix) -RUBYARCHDIR = $(sitearchdir)$(target_prefix) -HDRDIR = $(rubyhdrdir)/ruby$(target_prefix) -ARCHHDRDIR = $(rubyhdrdir)/$(arch)/ruby$(target_prefix) -TARGET_SO_DIR = -TARGET_SO = $(TARGET_SO_DIR)$(DLLIB) -CLEANLIBS = $(TARGET_SO) -CLEANOBJS = *.o *.bak - -all: $(DLLIB) -static: $(STATIC_LIB) -.PHONY: all install static install-so install-rb -.PHONY: clean clean-so clean-static clean-rb - -clean-static:: -clean-rb-default:: -clean-rb:: -clean-so:: -clean: clean-so clean-static clean-rb-default clean-rb - -$(Q)$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) .*.time - -distclean-rb-default:: -distclean-rb:: -distclean-so:: -distclean-static:: -distclean: clean distclean-so distclean-static distclean-rb-default distclean-rb - -$(Q)$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log - -$(Q)$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES) - -$(Q)$(RMDIRS) $(DISTCLEANDIRS) 2> /dev/null || true - -realclean: distclean -install: install-so install-rb - -install-so: $(DLLIB) $(TIMESTAMP_DIR)/.sitearchdir.time - $(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR) -clean-static:: - -$(Q)$(RM) $(STATIC_LIB) -install-rb: pre-install-rb do-install-rb install-rb-default -install-rb-default: pre-install-rb-default do-install-rb-default -pre-install-rb: Makefile -pre-install-rb-default: Makefile -do-install-rb: -do-install-rb-default: -pre-install-rb-default: - @$(NULLCMD) -$(TIMESTAMP_DIR)/.sitearchdir.time: - $(Q) $(MAKEDIRS) $(@D) $(RUBYARCHDIR) - $(Q) $(TOUCH) $@ - -site-install: site-install-so site-install-rb -site-install-so: install-so -site-install-rb: install-rb - -.SUFFIXES: .c .m .cc .mm .cxx .cpp .o .S - -.cc.o: - $(ECHO) compiling $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.cc.S: - $(ECHO) translating $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.mm.o: - $(ECHO) compiling $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.mm.S: - $(ECHO) translating $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.cxx.o: - $(ECHO) compiling $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.cxx.S: - $(ECHO) translating $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.cpp.o: - $(ECHO) compiling $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.cpp.S: - $(ECHO) translating $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.c.o: - $(ECHO) compiling $(<) - $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.c.S: - $(ECHO) translating $(<) - $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.m.o: - $(ECHO) compiling $(<) - $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.m.S: - $(ECHO) translating $(<) - $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -$(TARGET_SO): $(OBJS) Makefile - $(ECHO) linking shared-object $(DLLIB) - -$(Q)$(RM) $(@) - $(Q) $(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS) - $(Q) $(POSTLINK) - - - -$(OBJS): $(HDRS) $(ruby_headers) diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/MappedType.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/MappedType.c deleted file mode 100644 index d1a4189..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/MappedType.c +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright (c) 2010, Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * 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 the Ruby FFI project 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 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. - */ - -#include - -#include -#include "rbffi.h" - -#include "Type.h" -#include "MappedType.h" - - -static VALUE mapped_allocate(VALUE); -static VALUE mapped_initialize(VALUE, VALUE); -static void mapped_mark(MappedType *); -static ID id_native_type, id_to_native, id_from_native; - -VALUE rbffi_MappedTypeClass = Qnil; - -static VALUE -mapped_allocate(VALUE klass) -{ - MappedType* m; - - VALUE obj = Data_Make_Struct(klass, MappedType, mapped_mark, -1, m); - - m->rbConverter = Qnil; - m->rbType = Qnil; - m->type = NULL; - m->base.nativeType = NATIVE_MAPPED; - m->base.ffiType = &ffi_type_void; - - return obj; -} - -/* - * call-seq: initialize(converter) - * @param [#native_type, #to_native, #from_native] converter +converter+ must respond to - * all these methods - * @return [self] - */ -static VALUE -mapped_initialize(VALUE self, VALUE rbConverter) -{ - MappedType* m = NULL; - - if (!rb_respond_to(rbConverter, id_native_type)) { - rb_raise(rb_eNoMethodError, "native_type method not implemented"); - } - - if (!rb_respond_to(rbConverter, id_to_native)) { - rb_raise(rb_eNoMethodError, "to_native method not implemented"); - } - - if (!rb_respond_to(rbConverter, id_from_native)) { - rb_raise(rb_eNoMethodError, "from_native method not implemented"); - } - - Data_Get_Struct(self, MappedType, m); - m->rbType = rb_funcall2(rbConverter, id_native_type, 0, NULL); - if (!(rb_obj_is_kind_of(m->rbType, rbffi_TypeClass))) { - rb_raise(rb_eTypeError, "native_type did not return instance of FFI::Type"); - } - - m->rbConverter = rbConverter; - Data_Get_Struct(m->rbType, Type, m->type); - m->base.ffiType = m->type->ffiType; - - return self; -} - -static void -mapped_mark(MappedType* m) -{ - rb_gc_mark(m->rbType); - rb_gc_mark(m->rbConverter); -} - -/* - * call-seq: mapped_type.native_type - * @return [Type] - * Get native type of mapped type. - */ -static VALUE -mapped_native_type(VALUE self) -{ - MappedType*m = NULL; - Data_Get_Struct(self, MappedType, m); - - return m->rbType; -} - -/* - * call-seq: mapped_type.to_native(*args) - * @param args depends on {FFI::DataConverter} used to initialize +self+ - */ -static VALUE -mapped_to_native(int argc, VALUE* argv, VALUE self) -{ - MappedType*m = NULL; - - Data_Get_Struct(self, MappedType, m); - - return rb_funcall2(m->rbConverter, id_to_native, argc, argv); -} - -/* - * call-seq: mapped_type.from_native(*args) - * @param args depends on {FFI::DataConverter} used to initialize +self+ - */ -static VALUE -mapped_from_native(int argc, VALUE* argv, VALUE self) -{ - MappedType*m = NULL; - - Data_Get_Struct(self, MappedType, m); - - return rb_funcall2(m->rbConverter, id_from_native, argc, argv); -} - -void -rbffi_MappedType_Init(VALUE moduleFFI) -{ - /* - * Document-class: FFI::Type::Mapped < FFI::Type - */ - rbffi_MappedTypeClass = rb_define_class_under(rbffi_TypeClass, "Mapped", rbffi_TypeClass); - - rb_global_variable(&rbffi_MappedTypeClass); - - id_native_type = rb_intern("native_type"); - id_to_native = rb_intern("to_native"); - id_from_native = rb_intern("from_native"); - - rb_define_alloc_func(rbffi_MappedTypeClass, mapped_allocate); - rb_define_method(rbffi_MappedTypeClass, "initialize", mapped_initialize, 1); - rb_define_method(rbffi_MappedTypeClass, "type", mapped_native_type, 0); - rb_define_method(rbffi_MappedTypeClass, "native_type", mapped_native_type, 0); - rb_define_method(rbffi_MappedTypeClass, "to_native", mapped_to_native, -1); - rb_define_method(rbffi_MappedTypeClass, "from_native", mapped_from_native, -1); -} - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/MappedType.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/MappedType.h deleted file mode 100644 index 4b26cc1..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/MappedType.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2010, Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * 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 the Ruby FFI project 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 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. - */ - -#ifndef RBFFI_MAPPEDTYPE_H -#define RBFFI_MAPPEDTYPE_H - - -#include - -#ifdef __cplusplus -extern "C" { -#endif - - -typedef struct MappedType_ { - Type base; - Type* type; - VALUE rbConverter; - VALUE rbType; - -} MappedType; - -void rbffi_MappedType_Init(VALUE moduleFFI); - -extern VALUE rbffi_MappedTypeClass; - - -#ifdef __cplusplus -} -#endif - -#endif /* RBFFI_MAPPEDTYPE_H */ - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/MappedType.o b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/MappedType.o deleted file mode 100644 index 00e151d666d20641b74d88276110e6e72602f054..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14168 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 Lu_~=tg}wcsE!}5t diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/MemoryPointer.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/MemoryPointer.c deleted file mode 100644 index 1a64f2e..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/MemoryPointer.c +++ /dev/null @@ -1,192 +0,0 @@ -/* - * Copyright (c) 2008, 2009, Wayne Meissner - * Copyright (C) 2009 Luc Heinrich - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * 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 the Ruby FFI project 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 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. - */ - -#include -#include -#include -#include -#include "rbffi.h" -#include "AbstractMemory.h" -#include "Pointer.h" -#include "MemoryPointer.h" - - -static VALUE memptr_allocate(VALUE klass); -static void memptr_release(Pointer* ptr); -static VALUE memptr_malloc(VALUE self, long size, long count, bool clear); -static VALUE memptr_free(VALUE self); - -VALUE rbffi_MemoryPointerClass; - -#define MEMPTR(obj) ((MemoryPointer *) rbffi_AbstractMemory_Cast(obj, rbffi_MemoryPointerClass)) - -VALUE -rbffi_MemoryPointer_NewInstance(long size, long count, bool clear) -{ - return memptr_malloc(memptr_allocate(rbffi_MemoryPointerClass), size, count, clear); -} - -static VALUE -memptr_allocate(VALUE klass) -{ - Pointer* p; - VALUE obj = Data_Make_Struct(klass, Pointer, NULL, memptr_release, p); - p->rbParent = Qnil; - p->memory.flags = MEM_RD | MEM_WR; - - return obj; -} - -/* - * call-seq: initialize(size, count=1, clear=true) - * @param [Fixnum, Bignum, Symbol, FFI::Type] size size of a memory cell (in bytes, or type whom size will be used) - * @param [Numeric] count number of cells in memory - * @param [Boolean] clear set memory to all-zero if +true+ - * @return [self] - * A new instance of FFI::MemoryPointer. - */ -static VALUE -memptr_initialize(int argc, VALUE* argv, VALUE self) -{ - VALUE size = Qnil, count = Qnil, clear = Qnil; - int nargs = rb_scan_args(argc, argv, "12", &size, &count, &clear); - - memptr_malloc(self, rbffi_type_size(size), nargs > 1 ? NUM2LONG(count) : 1, - RTEST(clear) || clear == Qnil); - - if (rb_block_given_p()) { - return rb_ensure(rb_yield, self, memptr_free, self); - } - - return self; -} - -static VALUE -memptr_malloc(VALUE self, long size, long count, bool clear) -{ - Pointer* p; - unsigned long msize; - - Data_Get_Struct(self, Pointer, p); - - msize = size * count; - - p->storage = xmalloc(msize + 7); - if (p->storage == NULL) { - rb_raise(rb_eNoMemError, "Failed to allocate memory size=%ld bytes", msize); - return Qnil; - } - p->autorelease = true; - p->memory.typeSize = (int) size; - p->memory.size = msize; - /* ensure the memory is aligned on at least a 8 byte boundary */ - p->memory.address = (char *) (((uintptr_t) p->storage + 0x7) & (uintptr_t) ~0x7ULL); - p->allocated = true; - - if (clear && p->memory.size > 0) { - memset(p->memory.address, 0, p->memory.size); - } - - return self; -} - -static VALUE -memptr_free(VALUE self) -{ - Pointer* ptr; - - Data_Get_Struct(self, Pointer, ptr); - - if (ptr->allocated) { - if (ptr->storage != NULL) { - xfree(ptr->storage); - ptr->storage = NULL; - } - ptr->allocated = false; - } - - return self; -} - -static void -memptr_release(Pointer* ptr) -{ - if (ptr->autorelease && ptr->allocated && ptr->storage != NULL) { - xfree(ptr->storage); - ptr->storage = NULL; - } - xfree(ptr); -} - -/* - * call-seq: from_string(s) - * @param [String] s string - * @return [MemoryPointer] - * Create a {MemoryPointer} with +s+ inside. - */ -static VALUE -memptr_s_from_string(VALUE klass, VALUE to_str) -{ - VALUE s = StringValue(to_str); - VALUE args[] = { INT2FIX(1), LONG2NUM(RSTRING_LEN(s) + 1), Qfalse }; - VALUE obj = rb_class_new_instance(3, args, klass); - rb_funcall(obj, rb_intern("put_string"), 2, INT2FIX(0), s); - - return obj; -} - -void -rbffi_MemoryPointer_Init(VALUE moduleFFI) -{ - VALUE ffi_Pointer; - - ffi_Pointer = rbffi_PointerClass; - - /* - * Document-class: FFI::MemoryPointer < FFI::Pointer - * A MemoryPointer is a specific {Pointer}. It points to a memory composed of cells. All cells have the - * same size. - * - * @example Create a new MemoryPointer - * mp = FFI::MemoryPointer.new(:long, 16) # Create a pointer on a memory of 16 long ints. - * @example Create a new MemoryPointer from a String - * mp1 = FFI::MemoryPointer.from_string("this is a string") - * # same as: - * mp2 = FFI::MemoryPointer.new(:char,16) - * mp2.put_string("this is a string") - */ - rbffi_MemoryPointerClass = rb_define_class_under(moduleFFI, "MemoryPointer", ffi_Pointer); - rb_global_variable(&rbffi_MemoryPointerClass); - - rb_define_alloc_func(rbffi_MemoryPointerClass, memptr_allocate); - rb_define_method(rbffi_MemoryPointerClass, "initialize", memptr_initialize, -1); - rb_define_singleton_method(rbffi_MemoryPointerClass, "from_string", memptr_s_from_string, 1); -} - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/MemoryPointer.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/MemoryPointer.h deleted file mode 100644 index 8106030..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/MemoryPointer.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 2008, 2009, Wayne Meissner - * Copyright (c) 2008, Luc Heinrich - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * 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 the Ruby FFI project 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 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. - */ - -#ifndef RBFFI_MEMORYPOINTER_H -#define RBFFI_MEMORYPOINTER_H - -# include -#include - -#ifdef __cplusplus -extern "C" { -#endif - - extern void rbffi_MemoryPointer_Init(VALUE moduleFFI); - extern VALUE rbffi_MemoryPointerClass; - extern VALUE rbffi_MemoryPointer_NewInstance(long size, long count, bool clear); -#ifdef __cplusplus -} -#endif - -#endif /* RBFFI_MEMORYPOINTER_H */ - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/MemoryPointer.o b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/MemoryPointer.o deleted file mode 100644 index af94e14b51615d51fcd27b3ea01ad269c9cc844a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17680 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 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. - */ - -#ifndef _MSC_VER -#include -#endif -#include -#ifndef _WIN32 -# include -#endif -#include -#include -#include -#ifndef _WIN32 -# include -#endif -#include -#include -#if defined(HAVE_NATIVETHREAD) && !defined(_WIN32) && !defined(__WIN32__) -# include -#endif - -#include -#include "rbffi.h" -#include "compat.h" - -#include "Function.h" -#include "Types.h" -#include "Type.h" -#include "LastError.h" -#include "Call.h" -#include "ClosurePool.h" -#include "MethodHandle.h" - - -#define MAX_METHOD_FIXED_ARITY (6) - -#ifndef roundup -# define roundup(x, y) ((((x)+((y)-1))/(y))*(y)) -#endif - -#ifdef USE_RAW -# define METHOD_CLOSURE ffi_raw_closure -# define METHOD_PARAMS ffi_raw* -#else -# define METHOD_CLOSURE ffi_closure -# define METHOD_PARAMS void** -#endif - - - -static bool prep_trampoline(void* ctx, void* code, Closure* closure, char* errmsg, size_t errmsgsize); -static long trampoline_size(void); - -#if defined(__x86_64__) && (defined(__linux__) || defined(__APPLE__)) -# define CUSTOM_TRAMPOLINE 1 -#endif - - -struct MethodHandle { - Closure* closure; -}; - -static ClosurePool* defaultClosurePool; - - -MethodHandle* -rbffi_MethodHandle_Alloc(FunctionType* fnInfo, void* function) -{ - MethodHandle* handle; - Closure* closure = rbffi_Closure_Alloc(defaultClosurePool); - if (closure == NULL) { - rb_raise(rb_eNoMemError, "failed to allocate closure from pool"); - return NULL; - } - - handle = xcalloc(1, sizeof(*handle)); - handle->closure = closure; - closure->info = fnInfo; - closure->function = function; - - return handle; -} - -void -rbffi_MethodHandle_Free(MethodHandle* handle) -{ - if (handle != NULL) { - rbffi_Closure_Free(handle->closure); - xfree(handle); - } -} - -rbffi_function_anyargs rbffi_MethodHandle_CodeAddress(MethodHandle* handle) -{ - return (rbffi_function_anyargs) handle->closure->code; -} - -#ifndef CUSTOM_TRAMPOLINE -static void attached_method_invoke(ffi_cif* cif, void* retval, METHOD_PARAMS parameters, void* user_data); - -static ffi_type* methodHandleParamTypes[3]; - -static ffi_cif mh_cif; - -static bool -prep_trampoline(void* ctx, void* code, Closure* closure, char* errmsg, size_t errmsgsize) -{ - ffi_status ffiStatus; - -#if defined(USE_RAW) - ffiStatus = ffi_prep_raw_closure(code, &mh_cif, attached_method_invoke, closure); -#else - ffiStatus = ffi_prep_closure_loc(closure->pcl, &mh_cif, attached_method_invoke, closure, code); -#endif - if (ffiStatus != FFI_OK) { - snprintf(errmsg, errmsgsize, "ffi_prep_closure_loc failed. status=%#x", ffiStatus); - return false; - } - - return true; -} - - -static long -trampoline_size(void) -{ - return sizeof(METHOD_CLOSURE); -} - -/* - * attached_method_invoke is used functions with more than 6 parameters, or - * with struct param or return values - */ -static void -attached_method_invoke(ffi_cif* cif, void* mretval, METHOD_PARAMS parameters, void* user_data) -{ - Closure* handle = (Closure *) user_data; - FunctionType* fnInfo = (FunctionType *) handle->info; - -#ifdef USE_RAW - int argc = parameters[0].sint; - VALUE* argv = *(VALUE **) ¶meters[1]; -#else - int argc = *(int *) parameters[0]; - VALUE* argv = *(VALUE **) parameters[1]; -#endif - - *(VALUE *) mretval = (*fnInfo->invoke)(argc, argv, handle->function, fnInfo); -} - -#endif - - - -#if defined(CUSTOM_TRAMPOLINE) -#if defined(__x86_64__) - -static VALUE custom_trampoline(int argc, VALUE* argv, VALUE self, Closure*); - -#define TRAMPOLINE_CTX_MAGIC (0xfee1deadcafebabe) -#define TRAMPOLINE_FUN_MAGIC (0xfeedfacebeeff00d) - -/* - * This is a hand-coded trampoline to speedup entry from ruby to the FFI translation - * layer for x86_64 arches. - * - * Since a ruby function has exactly 3 arguments, and the first 6 arguments are - * passed in registers for x86_64, we can tack on a context pointer by simply - * putting a value in %rcx, then jumping to the C trampoline code. - * - * This results in approx a 30% speedup for x86_64 FFI dispatch - */ -__asm__( - ".text\n\t" - ".globl ffi_trampoline\n\t" - ".globl _ffi_trampoline\n\t" - "ffi_trampoline:\n\t" - "_ffi_trampoline:\n\t" - "movabsq $0xfee1deadcafebabe, %rcx\n\t" - "movabsq $0xfeedfacebeeff00d, %r11\n\t" - "jmpq *%r11\n\t" - ".globl ffi_trampoline_end\n\t" - "ffi_trampoline_end:\n\t" - ".globl _ffi_trampoline_end\n\t" - "_ffi_trampoline_end:\n\t" -); - -static VALUE -custom_trampoline(int argc, VALUE* argv, VALUE self, Closure* handle) -{ - FunctionType* fnInfo = (FunctionType *) handle->info; - VALUE rbReturnValue; - - RB_GC_GUARD(rbReturnValue) = (*fnInfo->invoke)(argc, argv, handle->function, fnInfo); - RB_GC_GUARD(self); - - return rbReturnValue; -} - -#elif defined(__i386__) && 0 - -static VALUE custom_trampoline(void *args, Closure*); -#define TRAMPOLINE_CTX_MAGIC (0xfee1dead) -#define TRAMPOLINE_FUN_MAGIC (0xbeefcafe) - -/* - * This is a hand-coded trampoline to speed-up entry from ruby to the FFI translation - * layer for i386 arches. - * - * This does not make a discernible difference vs a raw closure, so for now, - * it is not enabled. - */ -__asm__( - ".text\n\t" - ".globl ffi_trampoline\n\t" - ".globl _ffi_trampoline\n\t" - "ffi_trampoline:\n\t" - "_ffi_trampoline:\n\t" - "subl $12, %esp\n\t" - "leal 16(%esp), %eax\n\t" - "movl %eax, (%esp)\n\t" - "movl $0xfee1dead, 4(%esp)\n\t" - "movl $0xbeefcafe, %eax\n\t" - "call *%eax\n\t" - "addl $12, %esp\n\t" - "ret\n\t" - ".globl ffi_trampoline_end\n\t" - "ffi_trampoline_end:\n\t" - ".globl _ffi_trampoline_end\n\t" - "_ffi_trampoline_end:\n\t" -); - -static VALUE -custom_trampoline(void *args, Closure* handle) -{ - FunctionType* fnInfo = (FunctionType *) handle->info; - return (*fnInfo->invoke)(*(int *) args, *(VALUE **) (args + 4), handle->function, fnInfo); -} - -#endif /* __x86_64__ else __i386__ */ - -extern void ffi_trampoline(int argc, VALUE* argv, VALUE self); -extern void ffi_trampoline_end(void); -static int trampoline_offsets(long *, long *); - -static long trampoline_ctx_offset, trampoline_func_offset; - -static long -trampoline_offset(int off, const long value) -{ - char *ptr; - for (ptr = (char *) &ffi_trampoline + off; ptr < (char *) &ffi_trampoline_end; ++ptr) { - if (*(long *) ptr == value) { - return ptr - (char *) &ffi_trampoline; - } - } - - return -1; -} - -static int -trampoline_offsets(long* ctxOffset, long* fnOffset) -{ - *ctxOffset = trampoline_offset(0, TRAMPOLINE_CTX_MAGIC); - if (*ctxOffset == -1) { - return -1; - } - - *fnOffset = trampoline_offset(0, TRAMPOLINE_FUN_MAGIC); - if (*fnOffset == -1) { - return -1; - } - - return 0; -} - -static bool -prep_trampoline(void* ctx, void* code, Closure* closure, char* errmsg, size_t errmsgsize) -{ - memcpy(code, (void*) &ffi_trampoline, trampoline_size()); - /* Patch the context and function addresses into the stub code */ - *(intptr_t *)((char*)code + trampoline_ctx_offset) = (intptr_t) closure; - *(intptr_t *)((char*)code + trampoline_func_offset) = (intptr_t) custom_trampoline; - - return true; -} - -static long -trampoline_size(void) -{ - return (char *) &ffi_trampoline_end - (char *) &ffi_trampoline; -} - -#endif /* CUSTOM_TRAMPOLINE */ - - -void -rbffi_MethodHandle_Init(VALUE module) -{ -#ifndef CUSTOM_TRAMPOLINE - ffi_status ffiStatus; -#endif - - defaultClosurePool = rbffi_ClosurePool_New((int) trampoline_size(), prep_trampoline, NULL); - -#if defined(CUSTOM_TRAMPOLINE) - if (trampoline_offsets(&trampoline_ctx_offset, &trampoline_func_offset) != 0) { - rb_raise(rb_eFatal, "Could not locate offsets in trampoline code"); - } -#else - methodHandleParamTypes[0] = &ffi_type_sint; - methodHandleParamTypes[1] = &ffi_type_pointer; - methodHandleParamTypes[2] = &ffi_type_ulong; - - ffiStatus = ffi_prep_cif(&mh_cif, FFI_DEFAULT_ABI, 3, &ffi_type_ulong, - methodHandleParamTypes); - if (ffiStatus != FFI_OK) { - rb_raise(rb_eFatal, "ffi_prep_cif failed. status=%#x", ffiStatus); - } - -#endif -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/MethodHandle.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/MethodHandle.h deleted file mode 100644 index 0dcc058..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/MethodHandle.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2009, Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * 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 the Ruby FFI project 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 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. - */ - -#ifndef RBFFI_METHODHANDLE_H -#define RBFFI_METHODHANDLE_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include "Function.h" - - -typedef struct MethodHandlePool MethodHandlePool; -typedef struct MethodHandle MethodHandle; -typedef VALUE (*rbffi_function_anyargs)(int argc, VALUE* argv, VALUE self); - - -MethodHandle* rbffi_MethodHandle_Alloc(FunctionType* fnInfo, void* function); -void rbffi_MethodHandle_Free(MethodHandle* handle); -rbffi_function_anyargs rbffi_MethodHandle_CodeAddress(MethodHandle* handle); -void rbffi_MethodHandle_Init(VALUE module); - -#ifdef __cplusplus -} -#endif - -#endif /* RBFFI_METHODHANDLE_H */ - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/MethodHandle.o b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/MethodHandle.o deleted file mode 100644 index f423aa83e71e0c889137c71bdb4ca5948961f9ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11848 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 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. - */ - -#ifndef _MSC_VER -# include -#endif -# include -#include -#include -#include -#include -#include "rbffi_endian.h" -#include "Platform.h" - -#if defined(__GNU__) || (defined(__GLIBC__) && !defined(__UCLIBC__)) -# include -#endif - -static VALUE PlatformModule = Qnil; - -static void -export_primitive_types(VALUE module) -{ -#define S(name, T) do { \ - typedef struct { char c; T v; } s; \ - rb_define_const(module, #name "_ALIGN", INT2NUM((sizeof(s) - sizeof(T)) * 8)); \ - rb_define_const(module, #name "_SIZE", INT2NUM(sizeof(T)* 8)); \ -} while(0) - S(INT8, char); - S(INT16, short); - S(INT32, int); - S(INT64, long long); - S(LONG, long); - S(FLOAT, float); - S(DOUBLE, double); - S(LONG_DOUBLE, long double); - S(ADDRESS, void*); -#undef S -} - -void -rbffi_Platform_Init(VALUE moduleFFI) -{ - PlatformModule = rb_define_module_under(moduleFFI, "Platform"); - rb_define_const(PlatformModule, "BYTE_ORDER", INT2FIX(BYTE_ORDER)); - rb_define_const(PlatformModule, "LITTLE_ENDIAN", INT2FIX(LITTLE_ENDIAN)); - rb_define_const(PlatformModule, "BIG_ENDIAN", INT2FIX(BIG_ENDIAN)); -#if defined(__GNU__) || (defined(__GLIBC__) && !defined(__UCLIBC__)) - rb_define_const(PlatformModule, "GNU_LIBC", rb_str_new2(LIBC_SO)); -#endif - export_primitive_types(PlatformModule); -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Platform.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Platform.h deleted file mode 100644 index 5575e34..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Platform.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2008-2010 Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * 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 the Ruby FFI project 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 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. - */ - -#ifndef RBFFI_PLATFORM_H -#define RBFFI_PLATFORM_H - -#ifdef __cplusplus -extern "C" { -#endif - - extern void rbffi_Platform_Init(VALUE moduleFFI); - - -#ifdef __cplusplus -} -#endif - -#endif /* RBFFI_PLATFORM_H */ - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Platform.o b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Platform.o deleted file mode 100644 index 7f0b5787286de584f45239ceb51e37d483c7d5f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6240 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 AB>(^b diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Pointer.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Pointer.c deleted file mode 100644 index 153fff1..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Pointer.c +++ /dev/null @@ -1,507 +0,0 @@ -/* - * Copyright (c) 2008, 2009, Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * 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 the Ruby FFI project 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 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. - */ - -#include -#include -#include -#include -#include "rbffi.h" -#include "rbffi_endian.h" -#include "AbstractMemory.h" -#include "Pointer.h" - -#define POINTER(obj) rbffi_AbstractMemory_Cast((obj), rbffi_PointerClass) - -VALUE rbffi_PointerClass = Qnil; -VALUE rbffi_NullPointerSingleton = Qnil; - -static void ptr_release(Pointer* ptr); -static void ptr_mark(Pointer* ptr); - -VALUE -rbffi_Pointer_NewInstance(void* addr) -{ - Pointer* p; - VALUE obj; - - if (addr == NULL) { - return rbffi_NullPointerSingleton; - } - - obj = Data_Make_Struct(rbffi_PointerClass, Pointer, NULL, -1, p); - p->memory.address = addr; - p->memory.size = LONG_MAX; - p->memory.flags = (addr == NULL) ? 0 : (MEM_RD | MEM_WR); - p->memory.typeSize = 1; - p->rbParent = Qnil; - - return obj; -} - -static VALUE -ptr_allocate(VALUE klass) -{ - Pointer* p; - VALUE obj; - - obj = Data_Make_Struct(klass, Pointer, ptr_mark, ptr_release, p); - p->rbParent = Qnil; - p->memory.flags = MEM_RD | MEM_WR; - - return obj; -} - -/* - * @overload initialize(pointer) - * @param [Pointer] pointer another pointer to initialize from - * Create a new pointer from another {Pointer}. - * @overload initialize(type, address) - * @param [Type] type type for pointer - * @param [Integer] address base address for pointer - * Create a new pointer from a {Type} and a base address - * @return [self] - * A new instance of Pointer. - */ -static VALUE -ptr_initialize(int argc, VALUE* argv, VALUE self) -{ - Pointer* p; - VALUE rbType = Qnil, rbAddress = Qnil; - int typeSize = 1; - - Data_Get_Struct(self, Pointer, p); - - switch (rb_scan_args(argc, argv, "11", &rbType, &rbAddress)) { - case 1: - rbAddress = rbType; - typeSize = 1; - break; - case 2: - typeSize = rbffi_type_size(rbType); - break; - default: - rb_raise(rb_eArgError, "Invalid arguments"); - } - - switch (TYPE(rbAddress)) { - case T_FIXNUM: - case T_BIGNUM: - p->memory.address = (void*) (uintptr_t) NUM2LL(rbAddress); - p->memory.size = LONG_MAX; - if (p->memory.address == NULL) { - p->memory.flags = 0; - } - break; - - default: - if (rb_obj_is_kind_of(rbAddress, rbffi_PointerClass)) { - Pointer* orig; - - p->rbParent = rbAddress; - Data_Get_Struct(rbAddress, Pointer, orig); - p->memory = orig->memory; - } else { - rb_raise(rb_eTypeError, "wrong argument type, expected Integer or FFI::Pointer"); - } - break; - } - - p->memory.typeSize = typeSize; - - return self; -} - -/* - * call-seq: ptr.initialize_copy(other) - * @param [Pointer] other source for cloning or dupping - * @return [self] - * @raise {RuntimeError} if +other+ is an unbounded memory area, or is unreadable/unwritable - * @raise {NoMemError} if failed to allocate memory for new object - * DO NOT CALL THIS METHOD. - * - * This method is internally used by #dup and #clone. Memory content is copied from +other+. - */ -static VALUE -ptr_initialize_copy(VALUE self, VALUE other) -{ - AbstractMemory* src; - Pointer* dst; - - Data_Get_Struct(self, Pointer, dst); - src = POINTER(other); - if (src->size == LONG_MAX) { - rb_raise(rb_eRuntimeError, "cannot duplicate unbounded memory area"); - return Qnil; - } - - if ((dst->memory.flags & (MEM_RD | MEM_WR)) != (MEM_RD | MEM_WR)) { - rb_raise(rb_eRuntimeError, "cannot duplicate unreadable/unwritable memory area"); - return Qnil; - } - - if (dst->storage != NULL) { - xfree(dst->storage); - dst->storage = NULL; - } - - dst->storage = xmalloc(src->size + 7); - if (dst->storage == NULL) { - rb_raise(rb_eNoMemError, "failed to allocate memory size=%lu bytes", src->size); - return Qnil; - } - - dst->allocated = true; - dst->autorelease = true; - dst->memory.address = (void *) (((uintptr_t) dst->storage + 0x7) & (uintptr_t) ~0x7ULL); - dst->memory.size = src->size; - dst->memory.typeSize = src->typeSize; - - /* finally, copy the actual memory contents */ - memcpy(dst->memory.address, src->address, src->size); - - return self; -} - -static VALUE -slice(VALUE self, long offset, long size) -{ - AbstractMemory* ptr; - Pointer* p; - VALUE retval; - - Data_Get_Struct(self, AbstractMemory, ptr); - checkBounds(ptr, offset, size == LONG_MAX ? 1 : size); - - retval = Data_Make_Struct(rbffi_PointerClass, Pointer, ptr_mark, -1, p); - - p->memory.address = ptr->address + offset; - p->memory.size = size; - p->memory.flags = ptr->flags; - p->memory.typeSize = ptr->typeSize; - p->rbParent = self; - - return retval; -} - -/* - * Document-method: + - * call-seq: ptr + offset - * @param [Numeric] offset - * @return [Pointer] - * Return a new {Pointer} from an existing pointer and an +offset+. - */ -static VALUE -ptr_plus(VALUE self, VALUE offset) -{ - AbstractMemory* ptr; - long off = NUM2LONG(offset); - - Data_Get_Struct(self, AbstractMemory, ptr); - - return slice(self, off, ptr->size == LONG_MAX ? LONG_MAX : ptr->size - off); -} - -/* - * call-seq: ptr.slice(offset, length) - * @param [Numeric] offset - * @param [Numeric] length - * @return [Pointer] - * Return a new {Pointer} from an existing one. This pointer points on same contents - * from +offset+ for a length +length+. - */ -static VALUE -ptr_slice(VALUE self, VALUE rbOffset, VALUE rbLength) -{ - return slice(self, NUM2LONG(rbOffset), NUM2LONG(rbLength)); -} - -/* - * call-seq: ptr.inspect - * @return [String] - * Inspect pointer object. - */ -static VALUE -ptr_inspect(VALUE self) -{ - char buf[100]; - Pointer* ptr; - - Data_Get_Struct(self, Pointer, ptr); - - if (ptr->memory.size != LONG_MAX) { - snprintf(buf, sizeof(buf), "#<%s address=%p size=%lu>", - rb_obj_classname(self), ptr->memory.address, ptr->memory.size); - } else { - snprintf(buf, sizeof(buf), "#<%s address=%p>", rb_obj_classname(self), ptr->memory.address); - } - - return rb_str_new2(buf); -} - -/* - * Document-method: null? - * call-seq: ptr.null? - * @return [Boolean] - * Return +true+ if +self+ is a {NULL} pointer. - */ -static VALUE -ptr_null_p(VALUE self) -{ - Pointer* ptr; - - Data_Get_Struct(self, Pointer, ptr); - - return ptr->memory.address == NULL ? Qtrue : Qfalse; -} - -/* - * Document-method: == - * call-seq: ptr == other - * @param [Pointer] other - * Check equality between +self+ and +other+. Equality is tested on {#address}. - */ -static VALUE -ptr_equals(VALUE self, VALUE other) -{ - Pointer* ptr; - - Data_Get_Struct(self, Pointer, ptr); - - if (NIL_P(other)) { - return ptr->memory.address == NULL ? Qtrue : Qfalse; - } - - return ptr->memory.address == POINTER(other)->address ? Qtrue : Qfalse; -} - -/* - * call-seq: ptr.address - * @return [Numeric] pointer's base address - * Return +self+'s base address (alias: #to_i). - */ -static VALUE -ptr_address(VALUE self) -{ - Pointer* ptr; - - Data_Get_Struct(self, Pointer, ptr); - - return ULL2NUM((uintptr_t) ptr->memory.address); -} - -#if BYTE_ORDER == LITTLE_ENDIAN -# define SWAPPED_ORDER BIG_ENDIAN -#else -# define SWAPPED_ORDER LITTLE_ENDIAN -#endif - -/* - * Get or set +self+'s endianness - * @overload order - * @return [:big, :little] endianness of +self+ - * @overload order(order) - * @param [Symbol] order endianness to set (+:little+, +:big+ or +:network+). +:big+ and +:network+ - * are synonymous. - * @return a new pointer with the new order - */ -static VALUE -ptr_order(int argc, VALUE* argv, VALUE self) -{ - Pointer* ptr; - - Data_Get_Struct(self, Pointer, ptr); - if (argc == 0) { - int order = (ptr->memory.flags & MEM_SWAP) == 0 ? BYTE_ORDER : SWAPPED_ORDER; - return order == BIG_ENDIAN ? ID2SYM(rb_intern("big")) : ID2SYM(rb_intern("little")); - } else { - VALUE rbOrder = Qnil; - int order = BYTE_ORDER; - - if (rb_scan_args(argc, argv, "1", &rbOrder) < 1) { - rb_raise(rb_eArgError, "need byte order"); - } - if (SYMBOL_P(rbOrder)) { - ID id = SYM2ID(rbOrder); - if (id == rb_intern("little")) { - order = LITTLE_ENDIAN; - - } else if (id == rb_intern("big") || id == rb_intern("network")) { - order = BIG_ENDIAN; - } else { - rb_raise(rb_eArgError, "unknown byte order"); - } - } - if (order != BYTE_ORDER) { - Pointer* p2; - VALUE retval = slice(self, 0, ptr->memory.size); - - Data_Get_Struct(retval, Pointer, p2); - p2->memory.flags |= MEM_SWAP; - return retval; - } - - return self; - } -} - - -/* - * call-seq: ptr.free - * @return [self] - * Free memory pointed by +self+. - */ -static VALUE -ptr_free(VALUE self) -{ - Pointer* ptr; - - Data_Get_Struct(self, Pointer, ptr); - - if (ptr->allocated) { - if (ptr->storage != NULL) { - xfree(ptr->storage); - ptr->storage = NULL; - } - ptr->allocated = false; - - } else { - VALUE caller = rb_funcall(rb_funcall(Qnil, rb_intern("caller"), 0), rb_intern("first"), 0); - - rb_warn("calling free on non allocated pointer %s from %s", RSTRING_PTR(ptr_inspect(self)), RSTRING_PTR(rb_str_to_str(caller))); - } - - return self; -} - -static VALUE -ptr_type_size(VALUE self) -{ - Pointer* ptr; - - Data_Get_Struct(self, Pointer, ptr); - - return INT2NUM(ptr->memory.typeSize); -} - -/* - * call-seq: ptr.autorelease = autorelease - * @param [Boolean] autorelease - * @return [Boolean] +autorelease+ - * Set +autorelease+ attribute. See also Autorelease section. - */ -static VALUE -ptr_autorelease(VALUE self, VALUE autorelease) -{ - Pointer* ptr; - - Data_Get_Struct(self, Pointer, ptr); - ptr->autorelease = autorelease == Qtrue; - - return autorelease; -} - -/* - * call-seq: ptr.autorelease? - * @return [Boolean] - * Get +autorelease+ attribute. See also Autorelease section. - */ -static VALUE -ptr_autorelease_p(VALUE self) -{ - Pointer* ptr; - - Data_Get_Struct(self, Pointer, ptr); - - return ptr->autorelease ? Qtrue : Qfalse; -} - - -static void -ptr_release(Pointer* ptr) -{ - if (ptr->autorelease && ptr->allocated && ptr->storage != NULL) { - xfree(ptr->storage); - ptr->storage = NULL; - } - xfree(ptr); -} - -static void -ptr_mark(Pointer* ptr) -{ - rb_gc_mark(ptr->rbParent); -} - -void -rbffi_Pointer_Init(VALUE moduleFFI) -{ - VALUE rbNullAddress = ULL2NUM(0); - VALUE ffi_AbstractMemory = rbffi_AbstractMemoryClass; - - /* - * Document-class: FFI::Pointer < FFI::AbstractMemory - * Pointer class is used to manage C pointers with ease. A {Pointer} object is defined by his - * {#address} (as a C pointer). It permits additions with an integer for pointer arithmetic. - * - * == Autorelease - * By default a pointer object frees its content when it's garbage collected. - * Therefore it's usually not necessary to call {#free} explicit. - * This behaviour may be changed with {#autorelease=} method. - * If it's set to +false+, the memory isn't freed by the garbage collector, but stays valid until +free()+ is called on C level or when the process terminates. - */ - rbffi_PointerClass = rb_define_class_under(moduleFFI, "Pointer", ffi_AbstractMemory); - /* - * Document-variable: Pointer - */ - rb_global_variable(&rbffi_PointerClass); - - rb_define_alloc_func(rbffi_PointerClass, ptr_allocate); - rb_define_method(rbffi_PointerClass, "initialize", ptr_initialize, -1); - rb_define_method(rbffi_PointerClass, "initialize_copy", ptr_initialize_copy, 1); - rb_define_method(rbffi_PointerClass, "inspect", ptr_inspect, 0); - rb_define_method(rbffi_PointerClass, "to_s", ptr_inspect, 0); - rb_define_method(rbffi_PointerClass, "+", ptr_plus, 1); - rb_define_method(rbffi_PointerClass, "slice", ptr_slice, 2); - rb_define_method(rbffi_PointerClass, "null?", ptr_null_p, 0); - rb_define_method(rbffi_PointerClass, "address", ptr_address, 0); - rb_define_alias(rbffi_PointerClass, "to_i", "address"); - rb_define_method(rbffi_PointerClass, "==", ptr_equals, 1); - rb_define_method(rbffi_PointerClass, "order", ptr_order, -1); - rb_define_method(rbffi_PointerClass, "autorelease=", ptr_autorelease, 1); - rb_define_method(rbffi_PointerClass, "autorelease?", ptr_autorelease_p, 0); - rb_define_method(rbffi_PointerClass, "free", ptr_free, 0); - rb_define_method(rbffi_PointerClass, "type_size", ptr_type_size, 0); - - rbffi_NullPointerSingleton = rb_class_new_instance(1, &rbNullAddress, rbffi_PointerClass); - /* - * NULL pointer - */ - rb_define_const(rbffi_PointerClass, "NULL", rbffi_NullPointerSingleton); -} - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Pointer.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Pointer.h deleted file mode 100644 index b3d6c85..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Pointer.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2008, 2009, Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * 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 the Ruby FFI project 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 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. - */ - -#ifndef RBFFI_POINTER_H -#define RBFFI_POINTER_H - -# include - -#ifdef __cplusplus -extern "C" { -#endif - -#include "AbstractMemory.h" - -extern void rbffi_Pointer_Init(VALUE moduleFFI); -extern VALUE rbffi_Pointer_NewInstance(void* addr); -extern VALUE rbffi_PointerClass; -extern VALUE rbffi_NullPointerSingleton; - -typedef struct Pointer { - AbstractMemory memory; - VALUE rbParent; - char* storage; /* start of malloc area */ - bool autorelease; - bool allocated; -} Pointer; - -#ifdef __cplusplus -} -#endif - -#endif /* RBFFI_POINTER_H */ - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Pointer.o b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Pointer.o deleted file mode 100644 index 3268b66bf7db1cd589e81e0cd2d3a079b9ff10db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36128 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 E0R@iLpa1{> diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Struct.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Struct.c deleted file mode 100644 index 92731c8..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Struct.c +++ /dev/null @@ -1,822 +0,0 @@ -/* - * Copyright (c) 2008, 2009, Wayne Meissner - * Copyright (C) 2009 Luc Heinrich - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * 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 the Ruby FFI project 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 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. - */ - -#include -#ifndef _MSC_VER -# include -#endif -#include -#include -#include -#include "rbffi.h" -#include "compat.h" -#include "AbstractMemory.h" -#include "Pointer.h" -#include "MemoryPointer.h" -#include "Function.h" -#include "Types.h" -#include "Function.h" -#include "StructByValue.h" -#include "ArrayType.h" -#include "MappedType.h" -#include "Struct.h" - -typedef struct InlineArray_ { - VALUE rbMemory; - VALUE rbField; - - AbstractMemory* memory; - StructField* field; - MemoryOp *op; - Type* componentType; - ArrayType* arrayType; - int length; -} InlineArray; - - -static void struct_mark(Struct *); -static void struct_free(Struct *); -static VALUE struct_class_layout(VALUE klass); -static void struct_malloc(Struct* s); -static void inline_array_mark(InlineArray *); -static void store_reference_value(StructField* f, Struct* s, VALUE value); - -VALUE rbffi_StructClass = Qnil; - -VALUE rbffi_StructInlineArrayClass = Qnil; -VALUE rbffi_StructLayoutCharArrayClass = Qnil; - -static ID id_pointer_ivar = 0, id_layout_ivar = 0; -static ID id_get = 0, id_put = 0, id_to_ptr = 0, id_to_s = 0, id_layout = 0; - -static inline char* -memory_address(VALUE self) -{ - return ((AbstractMemory *)DATA_PTR((self)))->address; -} - -static VALUE -struct_allocate(VALUE klass) -{ - Struct* s; - VALUE obj = Data_Make_Struct(klass, Struct, struct_mark, struct_free, s); - - s->rbPointer = Qnil; - s->rbLayout = Qnil; - - return obj; -} - -/* - * call-seq: initialize - * @overload initialize(pointer, *args) - * @param [AbstractMemory] pointer - * @param [Array] args - * @return [self] - */ -static VALUE -struct_initialize(int argc, VALUE* argv, VALUE self) -{ - Struct* s; - VALUE rbPointer = Qnil, rest = Qnil, klass = CLASS_OF(self); - int nargs; - - Data_Get_Struct(self, Struct, s); - - nargs = rb_scan_args(argc, argv, "01*", &rbPointer, &rest); - - /* Call up into ruby code to adjust the layout */ - if (nargs > 1) { - s->rbLayout = rb_funcall2(CLASS_OF(self), id_layout, (int) RARRAY_LEN(rest), RARRAY_PTR(rest)); - } else { - s->rbLayout = struct_class_layout(klass); - } - - if (!rb_obj_is_kind_of(s->rbLayout, rbffi_StructLayoutClass)) { - rb_raise(rb_eRuntimeError, "Invalid Struct layout"); - } - - Data_Get_Struct(s->rbLayout, StructLayout, s->layout); - - if (rbPointer != Qnil) { - s->pointer = MEMORY(rbPointer); - s->rbPointer = rbPointer; - } else { - struct_malloc(s); - } - - return self; -} - -/* - * call-seq: initialize_copy(other) - * @return [nil] - * DO NOT CALL THIS METHOD - */ -static VALUE -struct_initialize_copy(VALUE self, VALUE other) -{ - Struct* src; - Struct* dst; - - Data_Get_Struct(self, Struct, dst); - Data_Get_Struct(other, Struct, src); - if (dst == src) { - return self; - } - - dst->rbLayout = src->rbLayout; - dst->layout = src->layout; - - /* - * A new MemoryPointer instance is allocated here instead of just calling - * #dup on rbPointer, since the Pointer may not know its length, or may - * be longer than just this struct. - */ - if (src->pointer->address != NULL) { - dst->rbPointer = rbffi_MemoryPointer_NewInstance(1, src->layout->size, false); - dst->pointer = MEMORY(dst->rbPointer); - memcpy(dst->pointer->address, src->pointer->address, src->layout->size); - } else { - dst->rbPointer = src->rbPointer; - dst->pointer = src->pointer; - } - - if (src->layout->referenceFieldCount > 0) { - dst->rbReferences = ALLOC_N(VALUE, dst->layout->referenceFieldCount); - memcpy(dst->rbReferences, src->rbReferences, dst->layout->referenceFieldCount * sizeof(VALUE)); - } - - return self; -} - -static VALUE -struct_class_layout(VALUE klass) -{ - VALUE layout; - if (!rb_ivar_defined(klass, id_layout_ivar)) { - rb_raise(rb_eRuntimeError, "no Struct layout configured for %s", rb_class2name(klass)); - } - - layout = rb_ivar_get(klass, id_layout_ivar); - if (!rb_obj_is_kind_of(layout, rbffi_StructLayoutClass)) { - rb_raise(rb_eRuntimeError, "invalid Struct layout for %s", rb_class2name(klass)); - } - - return layout; -} - -static StructLayout* -struct_layout(VALUE self) -{ - Struct* s = (Struct *) DATA_PTR(self); - if (s->layout != NULL) { - return s->layout; - } - - if (s->layout == NULL) { - s->rbLayout = struct_class_layout(CLASS_OF(self)); - Data_Get_Struct(s->rbLayout, StructLayout, s->layout); - } - - return s->layout; -} - -static Struct* -struct_validate(VALUE self) -{ - Struct* s; - Data_Get_Struct(self, Struct, s); - - if (struct_layout(self) == NULL) { - rb_raise(rb_eRuntimeError, "struct layout == null"); - } - - if (s->pointer == NULL) { - struct_malloc(s); - } - - return s; -} - -static void -struct_malloc(Struct* s) -{ - if (s->rbPointer == Qnil) { - s->rbPointer = rbffi_MemoryPointer_NewInstance(s->layout->size, 1, true); - - } else if (!rb_obj_is_kind_of(s->rbPointer, rbffi_AbstractMemoryClass)) { - rb_raise(rb_eRuntimeError, "invalid pointer in struct"); - } - - s->pointer = (AbstractMemory *) DATA_PTR(s->rbPointer); -} - -static void -struct_mark(Struct *s) -{ - rb_gc_mark(s->rbPointer); - rb_gc_mark(s->rbLayout); - if (s->rbReferences != NULL) { - rb_gc_mark_locations(&s->rbReferences[0], &s->rbReferences[s->layout->referenceFieldCount]); - } -} - -static void -struct_free(Struct* s) -{ - xfree(s->rbReferences); - xfree(s); -} - - -static void -store_reference_value(StructField* f, Struct* s, VALUE value) -{ - if (unlikely(f->referenceIndex == -1)) { - rb_raise(rb_eRuntimeError, "put_reference_value called for non-reference type"); - return; - } - if (s->rbReferences == NULL) { - int i; - s->rbReferences = ALLOC_N(VALUE, s->layout->referenceFieldCount); - for (i = 0; i < s->layout->referenceFieldCount; ++i) { - s->rbReferences[i] = Qnil; - } - } - - s->rbReferences[f->referenceIndex] = value; -} - - -static StructField * -struct_field(Struct* s, VALUE fieldName) -{ - StructLayout* layout = s->layout; - struct field_cache_entry *p_ce = FIELD_CACHE_LOOKUP(layout, fieldName); - - /* Do a hash lookup only if cache entry is empty or fieldName is unexpected? */ - if (unlikely(!SYMBOL_P(fieldName) || !p_ce->fieldName || p_ce->fieldName != fieldName)) { - VALUE rbField = rb_hash_aref(layout->rbFieldMap, fieldName); - if (unlikely(NIL_P(rbField))) { - VALUE str = rb_funcall2(fieldName, id_to_s, 0, NULL); - rb_raise(rb_eArgError, "No such field '%s'", StringValueCStr(str)); - } - /* Write the retrieved coder to the cache */ - p_ce->fieldName = fieldName; - p_ce->field = (StructField *) DATA_PTR(rbField); - } - - return p_ce->field; -} - -/* - * call-seq: struct[field_name] - * @param field_name field to access - * Acces to a Struct field. - */ -static VALUE -struct_aref(VALUE self, VALUE fieldName) -{ - Struct* s; - StructField* f; - - s = struct_validate(self); - - f = struct_field(s, fieldName); - if (f->get != NULL) { - return (*f->get)(f, s); - - } else if (f->memoryOp != NULL) { - return (*f->memoryOp->get)(s->pointer, f->offset); - - } else { - VALUE rbField = rb_hash_aref(s->layout->rbFieldMap, fieldName); - /* call up to the ruby code to fetch the value */ - return rb_funcall2(rbField, id_get, 1, &s->rbPointer); - } -} - -/* - * call-seq: []=(field_name, value) - * @param field_name field to access - * @param value value to set to +field_name+ - * @return [value] - * Set a field in Struct. - */ -static VALUE -struct_aset(VALUE self, VALUE fieldName, VALUE value) -{ - Struct* s; - StructField* f; - - s = struct_validate(self); - - f = struct_field(s, fieldName); - if (f->put != NULL) { - (*f->put)(f, s, value); - - } else if (f->memoryOp != NULL) { - - (*f->memoryOp->put)(s->pointer, f->offset, value); - - } else { - VALUE rbField = rb_hash_aref(s->layout->rbFieldMap, fieldName); - /* call up to the ruby code to set the value */ - VALUE argv[2]; - argv[0] = s->rbPointer; - argv[1] = value; - rb_funcall2(rbField, id_put, 2, argv); - } - - if (f->referenceRequired) { - store_reference_value(f, s, value); - } - - return value; -} - -/* - * call-seq: pointer= pointer - * @param [AbstractMemory] pointer - * @return [self] - * Make Struct point to +pointer+. - */ -static VALUE -struct_set_pointer(VALUE self, VALUE pointer) -{ - Struct* s; - StructLayout* layout; - AbstractMemory* memory; - - if (!rb_obj_is_kind_of(pointer, rbffi_AbstractMemoryClass)) { - rb_raise(rb_eTypeError, "wrong argument type %s (expected Pointer or Buffer)", - rb_obj_classname(pointer)); - return Qnil; - } - - - Data_Get_Struct(self, Struct, s); - Data_Get_Struct(pointer, AbstractMemory, memory); - layout = struct_layout(self); - - if ((int) layout->base.ffiType->size > memory->size) { - rb_raise(rb_eArgError, "memory of %ld bytes too small for struct %s (expected at least %ld)", - memory->size, rb_obj_classname(self), (long) layout->base.ffiType->size); - } - - s->pointer = MEMORY(pointer); - s->rbPointer = pointer; - rb_ivar_set(self, id_pointer_ivar, pointer); - - return self; -} - -/* - * call-seq: pointer - * @return [AbstractMemory] - * Get pointer to Struct contents. - */ -static VALUE -struct_get_pointer(VALUE self) -{ - Struct* s; - - Data_Get_Struct(self, Struct, s); - - return s->rbPointer; -} - -/* - * call-seq: layout= layout - * @param [StructLayout] layout - * @return [self] - * Set the Struct's layout. - */ -static VALUE -struct_set_layout(VALUE self, VALUE layout) -{ - Struct* s; - Data_Get_Struct(self, Struct, s); - - if (!rb_obj_is_kind_of(layout, rbffi_StructLayoutClass)) { - rb_raise(rb_eTypeError, "wrong argument type %s (expected %s)", - rb_obj_classname(layout), rb_class2name(rbffi_StructLayoutClass)); - return Qnil; - } - - Data_Get_Struct(layout, StructLayout, s->layout); - rb_ivar_set(self, id_layout_ivar, layout); - - return self; -} - -/* - * call-seq: layout - * @return [StructLayout] - * Get the Struct's layout. - */ -static VALUE -struct_get_layout(VALUE self) -{ - Struct* s; - - Data_Get_Struct(self, Struct, s); - - return s->rbLayout; -} - -/* - * call-seq: null? - * @return [Boolean] - * Test if Struct's pointer is NULL - */ -static VALUE -struct_null_p(VALUE self) -{ - Struct* s; - - Data_Get_Struct(self, Struct, s); - - return s->pointer->address == NULL ? Qtrue : Qfalse; -} - -/* - * (see Pointer#order) - */ -static VALUE -struct_order(int argc, VALUE* argv, VALUE self) -{ - Struct* s; - - Data_Get_Struct(self, Struct, s); - if (argc == 0) { - return rb_funcall(s->rbPointer, rb_intern("order"), 0); - - } else { - VALUE retval = rb_obj_dup(self); - VALUE rbPointer = rb_funcall2(s->rbPointer, rb_intern("order"), argc, argv); - struct_set_pointer(retval, rbPointer); - - return retval; - } -} - -static VALUE -inline_array_allocate(VALUE klass) -{ - InlineArray* array; - VALUE obj; - - obj = Data_Make_Struct(klass, InlineArray, inline_array_mark, -1, array); - array->rbField = Qnil; - array->rbMemory = Qnil; - - return obj; -} - -static void -inline_array_mark(InlineArray* array) -{ - rb_gc_mark(array->rbField); - rb_gc_mark(array->rbMemory); -} - -/* - * Document-method: FFI::Struct::InlineArray#initialize - * call-seq: initialize(memory, field) - * @param [AbstractMemory] memory - * @param [StructField] field - * @return [self] - */ -static VALUE -inline_array_initialize(VALUE self, VALUE rbMemory, VALUE rbField) -{ - InlineArray* array; - - Data_Get_Struct(self, InlineArray, array); - array->rbMemory = rbMemory; - array->rbField = rbField; - - Data_Get_Struct(rbMemory, AbstractMemory, array->memory); - Data_Get_Struct(rbField, StructField, array->field); - Data_Get_Struct(array->field->rbType, ArrayType, array->arrayType); - Data_Get_Struct(array->arrayType->rbComponentType, Type, array->componentType); - - array->op = get_memory_op(array->componentType); - if (array->op == NULL && array->componentType->nativeType == NATIVE_MAPPED) { - array->op = get_memory_op(((MappedType *) array->componentType)->type); - } - - array->length = array->arrayType->length; - - return self; -} - -/* - * call-seq: size - * @return [Numeric] - * Get size - */ -static VALUE -inline_array_size(VALUE self) -{ - InlineArray* array; - - Data_Get_Struct(self, InlineArray, array); - - return UINT2NUM(((ArrayType *) array->field->type)->length); -} - -static int -inline_array_offset(InlineArray* array, int index) -{ - if (index < 0 || (index >= array->length && array->length > 0)) { - rb_raise(rb_eIndexError, "index %d out of bounds", index); - } - - return (int) array->field->offset + (index * (int) array->componentType->ffiType->size); -} - -/* - * call-seq: [](index) - * @param [Numeric] index - * @return [Type, Struct] - */ -static VALUE -inline_array_aref(VALUE self, VALUE rbIndex) -{ - InlineArray* array; - - Data_Get_Struct(self, InlineArray, array); - - if (array->op != NULL) { - VALUE rbNativeValue = array->op->get(array->memory, - inline_array_offset(array, NUM2INT(rbIndex))); - if (unlikely(array->componentType->nativeType == NATIVE_MAPPED)) { - return rb_funcall(((MappedType *) array->componentType)->rbConverter, - rb_intern("from_native"), 2, rbNativeValue, Qnil); - } else { - return rbNativeValue; - } - - } else if (array->componentType->nativeType == NATIVE_STRUCT) { - VALUE rbOffset = INT2NUM(inline_array_offset(array, NUM2INT(rbIndex))); - VALUE rbLength = INT2NUM(array->componentType->ffiType->size); - VALUE rbPointer = rb_funcall(array->rbMemory, rb_intern("slice"), 2, rbOffset, rbLength); - - return rb_class_new_instance(1, &rbPointer, ((StructByValue *) array->componentType)->rbStructClass); - } else { - - rb_raise(rb_eArgError, "get not supported for %s", rb_obj_classname(array->arrayType->rbComponentType)); - return Qnil; - } -} - -/* - * call-seq: []=(index, value) - * @param [Numeric] index - * @param [Type, Struct] - * @return [value] - */ -static VALUE -inline_array_aset(VALUE self, VALUE rbIndex, VALUE rbValue) -{ - InlineArray* array; - - Data_Get_Struct(self, InlineArray, array); - - if (array->op != NULL) { - if (unlikely(array->componentType->nativeType == NATIVE_MAPPED)) { - rbValue = rb_funcall(((MappedType *) array->componentType)->rbConverter, - rb_intern("to_native"), 2, rbValue, Qnil); - } - array->op->put(array->memory, inline_array_offset(array, NUM2INT(rbIndex)), - rbValue); - - } else if (array->componentType->nativeType == NATIVE_STRUCT) { - int offset = inline_array_offset(array, NUM2INT(rbIndex)); - Struct* s; - - if (!rb_obj_is_kind_of(rbValue, rbffi_StructClass)) { - rb_raise(rb_eTypeError, "argument not an instance of struct"); - return Qnil; - } - - checkWrite(array->memory); - checkBounds(array->memory, offset, array->componentType->ffiType->size); - - Data_Get_Struct(rbValue, Struct, s); - checkRead(s->pointer); - checkBounds(s->pointer, 0, array->componentType->ffiType->size); - - memcpy(array->memory->address + offset, s->pointer->address, array->componentType->ffiType->size); - - } else { - ArrayType* arrayType; - Data_Get_Struct(array->field->rbType, ArrayType, arrayType); - - rb_raise(rb_eArgError, "set not supported for %s", rb_obj_classname(arrayType->rbComponentType)); - return Qnil; - } - - return rbValue; -} - -/* - * call-seq: each - * Yield block for each element of +self+. - */ -static VALUE -inline_array_each(VALUE self) -{ - InlineArray* array; - - int i; - - Data_Get_Struct(self, InlineArray, array); - - for (i = 0; i < array->length; ++i) { - rb_yield(inline_array_aref(self, INT2FIX(i))); - } - - return self; -} - -/* - * call-seq: to_a - * @return [Array] - * Convert +self+ to an array. - */ -static VALUE -inline_array_to_a(VALUE self) -{ - InlineArray* array; - VALUE obj; - int i; - - Data_Get_Struct(self, InlineArray, array); - obj = rb_ary_new2(array->length); - - - for (i = 0; i < array->length; ++i) { - rb_ary_push(obj, inline_array_aref(self, INT2FIX(i))); - } - - return obj; -} - -/* - * Document-method: FFI::StructLayout::CharArray#to_s - * call-seq: to_s - * @return [String] - * Convert +self+ to a string. - */ -static VALUE -inline_array_to_s(VALUE self) -{ - InlineArray* array; - VALUE argv[2]; - - Data_Get_Struct(self, InlineArray, array); - - if (array->componentType->nativeType != NATIVE_INT8 && array->componentType->nativeType != NATIVE_UINT8) { - VALUE dummy = Qnil; - return rb_call_super(0, &dummy); - } - - argv[0] = UINT2NUM(array->field->offset); - argv[1] = UINT2NUM(array->length); - - return rb_funcall2(array->rbMemory, rb_intern("get_string"), 2, argv); -} - -/* - * call-seq: to_ptr - * @return [AbstractMemory] - * Get pointer to +self+ content. - */ -static VALUE -inline_array_to_ptr(VALUE self) -{ - InlineArray* array; - - Data_Get_Struct(self, InlineArray, array); - - return rb_funcall(array->rbMemory, rb_intern("slice"), 2, - UINT2NUM(array->field->offset), UINT2NUM(array->arrayType->base.ffiType->size)); -} - - -void -rbffi_Struct_Init(VALUE moduleFFI) -{ - VALUE StructClass; - - rbffi_StructLayout_Init(moduleFFI); - - /* - * Document-class: FFI::Struct - * - * A FFI::Struct means to mirror a C struct. - * - * A Struct is defined as: - * class MyStruct < FFI::Struct - * layout :value1, :int, - * :value2, :double - * end - * and is used as: - * my_struct = MyStruct.new - * my_struct[:value1] = 12 - * - * For more information, see http://github.com/ffi/ffi/wiki/Structs - */ - rbffi_StructClass = rb_define_class_under(moduleFFI, "Struct", rb_cObject); - StructClass = rbffi_StructClass; // put on a line alone to help RDoc - rb_global_variable(&rbffi_StructClass); - - /* - * Document-class: FFI::Struct::InlineArray - */ - rbffi_StructInlineArrayClass = rb_define_class_under(rbffi_StructClass, "InlineArray", rb_cObject); - rb_global_variable(&rbffi_StructInlineArrayClass); - - /* - * Document-class: FFI::StructLayout::CharArray < FFI::Struct::InlineArray - */ - rbffi_StructLayoutCharArrayClass = rb_define_class_under(rbffi_StructLayoutClass, "CharArray", - rbffi_StructInlineArrayClass); - rb_global_variable(&rbffi_StructLayoutCharArrayClass); - - - rb_define_alloc_func(StructClass, struct_allocate); - rb_define_method(StructClass, "initialize", struct_initialize, -1); - rb_define_method(StructClass, "initialize_copy", struct_initialize_copy, 1); - rb_define_method(StructClass, "order", struct_order, -1); - - rb_define_alias(rb_singleton_class(StructClass), "alloc_in", "new"); - rb_define_alias(rb_singleton_class(StructClass), "alloc_out", "new"); - rb_define_alias(rb_singleton_class(StructClass), "alloc_inout", "new"); - rb_define_alias(rb_singleton_class(StructClass), "new_in", "new"); - rb_define_alias(rb_singleton_class(StructClass), "new_out", "new"); - rb_define_alias(rb_singleton_class(StructClass), "new_inout", "new"); - - rb_define_method(StructClass, "pointer", struct_get_pointer, 0); - rb_define_private_method(StructClass, "pointer=", struct_set_pointer, 1); - - rb_define_method(StructClass, "layout", struct_get_layout, 0); - rb_define_private_method(StructClass, "layout=", struct_set_layout, 1); - - rb_define_method(StructClass, "[]", struct_aref, 1); - rb_define_method(StructClass, "[]=", struct_aset, 2); - rb_define_method(StructClass, "null?", struct_null_p, 0); - - rb_include_module(rbffi_StructInlineArrayClass, rb_mEnumerable); - rb_define_alloc_func(rbffi_StructInlineArrayClass, inline_array_allocate); - rb_define_method(rbffi_StructInlineArrayClass, "initialize", inline_array_initialize, 2); - rb_define_method(rbffi_StructInlineArrayClass, "[]", inline_array_aref, 1); - rb_define_method(rbffi_StructInlineArrayClass, "[]=", inline_array_aset, 2); - rb_define_method(rbffi_StructInlineArrayClass, "each", inline_array_each, 0); - rb_define_method(rbffi_StructInlineArrayClass, "size", inline_array_size, 0); - rb_define_method(rbffi_StructInlineArrayClass, "to_a", inline_array_to_a, 0); - rb_define_method(rbffi_StructInlineArrayClass, "to_ptr", inline_array_to_ptr, 0); - - rb_define_method(rbffi_StructLayoutCharArrayClass, "to_s", inline_array_to_s, 0); - rb_define_alias(rbffi_StructLayoutCharArrayClass, "to_str", "to_s"); - - id_pointer_ivar = rb_intern("@pointer"); - id_layout_ivar = rb_intern("@layout"); - id_layout = rb_intern("layout"); - id_get = rb_intern("get"); - id_put = rb_intern("put"); - id_to_ptr = rb_intern("to_ptr"); - id_to_s = rb_intern("to_s"); -} - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Struct.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Struct.h deleted file mode 100644 index eb6edf2..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Struct.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (c) 2008, 2009, Wayne Meissner - * Copyright (c) 2009, Luc Heinrich - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * 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 the Ruby FFI project 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 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. - */ - -#ifndef RBFFI_STRUCT_H -#define RBFFI_STRUCT_H - -#include "extconf.h" -#include "AbstractMemory.h" -#include "Type.h" -#include - -#ifdef __cplusplus -extern "C" { -#endif - - extern void rbffi_Struct_Init(VALUE ffiModule); - extern void rbffi_StructLayout_Init(VALUE ffiModule); - typedef struct StructField_ StructField; - typedef struct StructLayout_ StructLayout; - typedef struct Struct_ Struct; - - struct StructField_ { - Type* type; - unsigned int offset; - - int referenceIndex; - - bool referenceRequired; - VALUE rbType; - VALUE rbName; - - VALUE (*get)(StructField* field, Struct* s); - void (*put)(StructField* field, Struct* s, VALUE value); - - MemoryOp* memoryOp; - }; - - struct StructLayout_ { - Type base; - StructField** fields; - int fieldCount; - int size; - int align; - ffi_type** ffiTypes; - - /* - * We use the fieldName's minor 8 Bits as index to a 256 entry cache. - * This avoids full ruby hash lookups for repeated lookups. - */ - #define FIELD_CACHE_LOOKUP(this, sym) ( &(this)->cache_row[((sym) >> 8) & 0xff] ) - - struct field_cache_entry { - VALUE fieldName; - StructField *field; - } cache_row[0x100]; - - /** The number of reference tracking fields in this struct */ - int referenceFieldCount; - - VALUE rbFieldNames; - VALUE rbFieldMap; - VALUE rbFields; - }; - - struct Struct_ { - StructLayout* layout; - AbstractMemory* pointer; - VALUE* rbReferences; - - VALUE rbLayout; - VALUE rbPointer; - }; - - extern VALUE rbffi_StructClass, rbffi_StructLayoutClass; - extern VALUE rbffi_StructLayoutFieldClass, rbffi_StructLayoutFunctionFieldClass; - extern VALUE rbffi_StructLayoutArrayFieldClass; - extern VALUE rbffi_StructInlineArrayClass; - extern VALUE rbffi_StructLayoutCharArrayClass; - -#ifdef __cplusplus -} -#endif - -#endif /* RBFFI_STRUCT_H */ - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Struct.o b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Struct.o deleted file mode 100644 index d1111da6f028e8b16e2d97c131883116127837ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62288 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 s+NA-z6j?2q0s32xKlI4n$lwSH)OV diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/StructByValue.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/StructByValue.c deleted file mode 100644 index a3255f4..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/StructByValue.c +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright (c) 2009, Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * 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 the Ruby FFI project 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 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. - */ - -#ifndef _MSC_VER -#include -#endif -#include -#include -#include -#include -#include -#include - -#include -#include "rbffi.h" -#include "compat.h" - -#include "Type.h" -#include "StructByValue.h" -#include "Struct.h" - -#define FFI_ALIGN(v, a) (((((size_t) (v))-1) | ((a)-1))+1) - -static VALUE sbv_allocate(VALUE); -static VALUE sbv_initialize(VALUE, VALUE); -static void sbv_mark(StructByValue *); -static void sbv_free(StructByValue *); - -VALUE rbffi_StructByValueClass = Qnil; - -static VALUE -sbv_allocate(VALUE klass) -{ - StructByValue* sbv; - - VALUE obj = Data_Make_Struct(klass, StructByValue, sbv_mark, sbv_free, sbv); - - sbv->rbStructClass = Qnil; - sbv->rbStructLayout = Qnil; - sbv->base.nativeType = NATIVE_STRUCT; - - sbv->base.ffiType = xcalloc(1, sizeof(*sbv->base.ffiType)); - sbv->base.ffiType->size = 0; - sbv->base.ffiType->alignment = 1; - sbv->base.ffiType->type = FFI_TYPE_STRUCT; - - return obj; -} - -static VALUE -sbv_initialize(VALUE self, VALUE rbStructClass) -{ - StructByValue* sbv = NULL; - StructLayout* layout = NULL; - VALUE rbLayout = Qnil; - - rbLayout = rb_ivar_get(rbStructClass, rb_intern("@layout")); - if (!rb_obj_is_instance_of(rbLayout, rbffi_StructLayoutClass)) { - rb_raise(rb_eTypeError, "wrong type in @layout ivar (expected FFI::StructLayout)"); - } - - Data_Get_Struct(rbLayout, StructLayout, layout); - Data_Get_Struct(self, StructByValue, sbv); - sbv->rbStructClass = rbStructClass; - sbv->rbStructLayout = rbLayout; - - /* We can just use everything from the ffi_type directly */ - *sbv->base.ffiType = *layout->base.ffiType; - - return self; -} - -static void -sbv_mark(StructByValue *sbv) -{ - rb_gc_mark(sbv->rbStructClass); - rb_gc_mark(sbv->rbStructLayout); -} - -static void -sbv_free(StructByValue *sbv) -{ - xfree(sbv->base.ffiType); - xfree(sbv); -} - - -static VALUE -sbv_layout(VALUE self) -{ - StructByValue* sbv; - - Data_Get_Struct(self, StructByValue, sbv); - return sbv->rbStructLayout; -} - -static VALUE -sbv_struct_class(VALUE self) -{ - StructByValue* sbv; - - Data_Get_Struct(self, StructByValue, sbv); - - return sbv->rbStructClass; -} - -void -rbffi_StructByValue_Init(VALUE moduleFFI) -{ - rbffi_StructByValueClass = rb_define_class_under(moduleFFI, "StructByValue", rbffi_TypeClass); - rb_global_variable(&rbffi_StructByValueClass); - rb_define_const(rbffi_TypeClass, "Struct", rbffi_StructByValueClass); - - rb_define_alloc_func(rbffi_StructByValueClass, sbv_allocate); - rb_define_method(rbffi_StructByValueClass, "initialize", sbv_initialize, 1); - rb_define_method(rbffi_StructByValueClass, "layout", sbv_layout, 0); - rb_define_method(rbffi_StructByValueClass, "struct_class", sbv_struct_class, 0); -} - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/StructByValue.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/StructByValue.h deleted file mode 100644 index 07b2763..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/StructByValue.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2009, Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * 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 the Ruby FFI project 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 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. - */ - -#ifndef RBFFI_STRUCTBYVALUE_H -#define RBFFI_STRUCTBYVALUE_H - -#include -#include "Type.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct StructByValue_ { - Type base; - VALUE rbStructClass; - VALUE rbStructLayout; -} StructByValue; - -void rbffi_StructByValue_Init(VALUE moduleFFI); - -extern VALUE rbffi_StructByValueClass; - -#ifdef __cplusplus -} -#endif - -#endif /* RBFFI_STRUCTBYVALUE_H */ - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/StructByValue.o b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/StructByValue.o deleted file mode 100644 index d19bfe2d56f9a238a94dafbac36307705117453a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13640 zcmcgydw7)9nLpp$Clm4wNnpZ#xP^culW><3&7BNPG9ecUE&63LnLz4fCOb3XA}CQ5 z(RN#CaZ9&$#mlyUwzXD!5pCIaTiHIk(k_p+EA3*-Q{8PXRH;fWyZd|3Wp1Qa|JXgx zbKd)T&wDO&zVp4`y!fX#{=1MdjiC^*qOKy~MMar{dep+nalyL_gt(X5p!`nqcFsmP9$patLE+}oYu6?NDoDDp>SYb9f=Nn~MTgj6w%flw->IP%|A-(8>Kl^=%` zT|_YEjQT3dFv7`HVkovnY78Scz9TX&HH3F*a9KsF(-OnzPbSmc)$v_iAe1UT;8ixG{7xftW!Sl`)_HYt^jFGw8Cb}X!NLR9`j{r!o^HXdJ&KeHU48u!Pr zN%G3L{)S?Mak9&g?_sBCZF33yp4=E^KE`GX(YXGwC|sNG?^vm5G*$Z5rV2g_=J^Ya zj6@?wEHoUUb;ZVW|a+>Yyy$2SrR z=li=R&)?n;=r6T%WZdxvrN0>#5zv?as=si27;&YH(b)E(*nnXKnleLSY(&o2IVn6< zA@;MkTATwA=Z#nH=b>1Hn&gkSL&kHz+|NfB3dgC7KM zcV$=ou}i`4A3bR{UdoO=^n5p?Ec=~_$>OyTV>^I)@KrgMSD`<`=dF~_+aJN>$UETBFvqAg7tlX>&OGV(?Gz*UZx+|_c~<;Z z@TEQ4F^9G8^1s;XE_=0;wF{kfmz_>_nQ3FSBF+ZHR)6g6jX&UXqxxXf5Bi%e*D`y~ zDE90=*o3;v+2eg*TlD{aw#*^M)>o9V!`MpmeKL!%%bshpQ;&tNRAMxoYS?*0C^{Np zf@4Fmq0~?)I&@2fMMFE|qbY{t7iLB{8p6}8P71dt;;}7WI$69!F|U+*hqi?h-ipYM zkw`cd8Su8W_*btMegoW>`~f2fb<}7~{mR)h5L2_4q)9iaed^Tahp41g*G>8N zBAe2pup(REx4TtRtE|T9PN{m+zB?2dO^d>c9C_dFly)rLutSlD(xR{;55KQ3ZK5{6 zsKjb6x?^|Ig*`=X&$Oaf_e`0n72EI_UdGHt{*vpbtag3GWx@m5Jem1R%tgfF$2s&67)+)Fuw$+v0GDTD_m$!!Q_LMs!JB8%oPak)fHdIe&duH!aAQgacP<0WNcI&d(> zI!1vD#3XG2A}qCXZW0=?$t9X>gU&q@_~^;;DzIf~9b8OF>#X}Vozzn^5@M%itYN^| z^m5+I3@)~cU}vVAxaehW)+B^X5qV2AHJ;fTWQ@(3jn*q+GneMv<+=_%%)5Hdub;x_ ze0~*1fiA4H3TviFX?aGPmMw7cb;IRKDqT5E7G|38<@BQ4MOH*W&MB^IG6vG;-5Lh4 z80*6-ua1vLS49hVhc@MQ4a@1HbyZAtCWv%|%!EEI{8#JX$4MchOJoD;gIvnkV-gdh zy>2Ro;aV`Jl}@wT{ARjaTmywRXsH3RJFMzy@Xyd_!+m(>n%bzD?Rw~MLp60d&FT%% z{t7gc@ERj*?5m;w4i-ePj?aVrFZ#u7AP*IJ-O+>i>LI*Pe&6Lev&bIpK7pKMpCZO~RS*D{Dk(xML2o%ms_hwM%%bM=Ec zls4F)ttr$xOn2c2MT$rA6?@Tq6pHjw%%`mrX4;k_8imDNuJ=Qi}Y$hU9SUl>l*+k z>S4fQeLG-@eh*-&ejnf@{b9h#`V)X2{Ul(S{sQ0>X6b=zyTwhhzJhAep49XUAejCh zV5x4y0yuOx;4*zWpk1#9)bx5lv)&14(!+p-dJ53NxTm{8TD0G2`sY9}{b4{&|2m*a z|1O|ee;&}H{~XY&zXoX2anprw6Ro~p1nAVK0~Y9u0A2bDz(TzNaDpBLEYfcR)b$wP zM13bk&^ll2pTQ}t7T)ATcd)Ae5g&d@Ic&eX2}&SDd3I8JO& z?TDqg1$0Si8z7rh+y!L537`yG$KuK5Kwd|MXF2dEAa*Qd9@^J@8!vKuo>TNSWz76{ zFjx(NW%1hQFI<~=Ph^z?!L53*V5_Ur)7J6%=g*`w%dy`Fube?vAOsqkC@eH_)f zrrM(+l#@hXw~7_hMzd@NXSG-oKqjsDw`enq9F|g;rL;1vm_cWz`Mej^>6?5IsKU9~ zLq{tetj-&m=LqNyQs3n8`~vtNi8kCGI*oaNp)$`~ithKa;vO*OK7gaB1uG|i3#hDM zgXcM5a$L~K_Er)4`3`W0@$=->Z$l^pi46Gmy(bb z{}591X@CMd>Kd=R;95RQZ;)s;FV3&uLlzJsHo*o5n`kjlW4{)Fe#C-xB*1Pa?RBJed>ep2sMpYgdci5MRA?d`_W@{lHVRYb zdLGTrK}H2nW0TvPo~JjU61Nqu(psU>Y8abe4uy8yLVbym(D7Hg9DQ-XD%QZD@G>1k zrCddTE%Z~fPh0uvw1~n5Lq6F2I59KqbXyU#%XiHDTOfA*%$(_m4A}gAB)-j*5pyTy z_mh)OlZc46H@k+iG}@=LmSHios!PFQ7-+-afQ2bZ4(vN|R`9D4XB|HT%O`O(ecPc& zJrzn%o3>|eG;|4ZC>?GzbUWc&jak#LXK11gf0ugO&3k)Y^~PDpGRzh4?Y4Ap>NSq{ zHkRAlvT=K>RBvY$ytfyrw*mV`<$8czPk5vN*Du+;iWv2>#>!tt1J^V$gRD}$o(X5a zCTBO>>C(XCyqP~SVWV^319!o`H zsidzdvMmygk30OAc*`A;T3#77WJ5 z5QdqE8AAg`I27I*Vg9C!4Rox%zT1C8vvETZ3Q7ChyH_c?Cz}CXvm#rQ;ho!Wp z8kATSUb~IL%Tw=Kd2?HLls2p7?Dk|JXxO(iMEPQXav)7L;K zfp2Pt*%mYw-AiPsFAyVfe!jB$ z{$whF?~iSf;do+a9&51Bz(68`ZxrFJp#-0(E}G#)f2WEl2}Vv%qQ65r9lS#8M z%>3{v6kR0xIYTWeM$WW_Mifah+BRZ#BhC=;OnufF?oq}0>D2hK67=xoRdh8h)4%;%>zfA~2Dd7P-%E0GteBLo`;g;gi z+7XrvI>|Dj6@@i-ll5H*y@==K66%n?85v{=8pg&@653=cgdJqW2T6+g4&N+(J>U|d zA^h+tvZ(w%1rqxr^Noshd~?HkOIVO3<6E6S5O#2KI6g2Mjo>2{-~Y;o445S&(LvVQ zRo_aNTU?=drAr?bl4A}YbU1uyz(m> z%IfM~n6hPGm3zipPfnY7uEF=~z4Z!=Wr zm5%sMU@CM4CH@KNk8+*FZz3g%nnRLN$)7`-uMcBGpW^4D%71?_Tz%1>4cLk?BB6^y zGManxO~ax;0#L$}cxsRAGN;Rc>0cw$QR&|hvr);WdThU|=EXluc&++xcfa?&{mp;6 zFzfB}`+vUV%cpNm?7ZFn{8Q)3FT9!D#FqR1es}9@eP3$3_R8Cz@y&ekW64jRO?>n8 z<%g=$5A`<^iKnDvU&w7o%xKp)4MWC=)Z8OL%gQM3k+QB1+Veh_Y(3 zA*Dh|v7M76A)=R4DY8jl^cp)4Diq59 zP(wa|Y`l8G~i8@iGh<_6RyB1Y8q|_K$bs=Oa zq68F)=%|n)N=A{0;*&v8HiAU-TbEYla@dq|RaR0&ul>@BQbW{`az#=^304wO&Q&&~ zR2hjV2PdPaY$%B+Paqpo2Ao8c!IM^$q#_aJTcn7R<0M+1Sw~8Qk*E(?_DI=55>diX zippet znr7`RIAQhLp0>_>+G@3(uuj@*t+uVRTGv^p+Ma=Ao$Z9>cYh1&*DzJJwm)bZ)z3EjEuj)>xfr#BAnSPgA=B^A`)=w9eg& z78A|CK?_6&?e~Q4P)2t#tuu$8woWQ|i(5`Ybh3q#+18uf_#x66-+uwE*K}tvrh{;5e;31B`1_ z;IzQC&jaIb7dRzw?PI{WG*vzVjLTKvh`_b?1LN5gpi3-p?Ezr2+YgLKP~c91YsY|b z^apkeT$=(WyC^Vz3W2Qx*A4(%!1oDU+Y9W0T{kd(NP!N4Yg>WwzktdnU`%bGPT<;Q z!1zmVWd$&vFM)Xi*Ls0*@vEE;jG+hU5(r%D2A+%g#M}_R@pTLua@#8se?#IgNc<^@ z2PFh<+4fP%Uk{9Vw3SQ#q{K%g9+S9F;yQ`F5(Du#J_#r2 z(q=au(H_z4ro-C(fOl&90e6o9Y>nDYeFJt=N4MQn*JL-%tFW8OraMf9ZoBEUb_N!w zwC4d&o6eXl=1Zn`O@B7oP3O(8n=R&-&1cQ$unSPU=%)xBsqzI7MNl1qoQj9^;J+$) zD{RUB8KLIi2uS~w)c+B3(yRNx8)OgtNvQ|R_3A$GOR1+zHkD>nYOn4CrzEeQ|8cTM zRnPl6;;{f17f@@w+!2rd&PabhlKff8PXsPPRsTMr7Xh+Y<9#j9ADtt(Eu{aSJ%T>y zj}fXp&Im?(LzNkzvsm_tJpS=K{_AL%ZBH*-+5Ap!U#Hx&hw}9FQkrc~^PbKBIgekJ zXaCDQz9i3nW1jxrJf8kklHFf8kH;fBlWj1NR8Scgo=Ab - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * 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 the Ruby FFI project 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 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. - */ - -#include - -#ifndef _MSC_VER -# include -#endif -#include -#include -#include -#include "rbffi.h" -#include "compat.h" -#include "AbstractMemory.h" -#include "Pointer.h" -#include "MemoryPointer.h" -#include "Function.h" -#include "Types.h" -#include "StructByValue.h" -#include "ArrayType.h" -#include "Function.h" -#include "MappedType.h" -#include "Struct.h" - -#define FFI_ALIGN(v, a) (((((size_t) (v))-1) | ((a)-1))+1) - -static void struct_layout_mark(StructLayout *); -static void struct_layout_free(StructLayout *); -static void struct_field_mark(StructField* ); - -VALUE rbffi_StructLayoutFieldClass = Qnil; -VALUE rbffi_StructLayoutNumberFieldClass = Qnil, rbffi_StructLayoutPointerFieldClass = Qnil; -VALUE rbffi_StructLayoutStringFieldClass = Qnil; -VALUE rbffi_StructLayoutFunctionFieldClass = Qnil, rbffi_StructLayoutArrayFieldClass = Qnil; - -VALUE rbffi_StructLayoutClass = Qnil; - - -static VALUE -struct_field_allocate(VALUE klass) -{ - StructField* field; - VALUE obj; - - obj = Data_Make_Struct(klass, StructField, struct_field_mark, -1, field); - field->rbType = Qnil; - field->rbName = Qnil; - - return obj; -} - -static void -struct_field_mark(StructField* f) -{ - rb_gc_mark(f->rbType); - rb_gc_mark(f->rbName); -} - -/* - * call-seq: initialize(name, offset, type) - * @param [String,Symbol] name - * @param [Fixnum] offset - * @param [FFI::Type] type - * @return [self] - * A new FFI::StructLayout::Field instance. - */ -static VALUE -struct_field_initialize(int argc, VALUE* argv, VALUE self) -{ - VALUE rbOffset = Qnil, rbName = Qnil, rbType = Qnil; - StructField* field; - int nargs; - - Data_Get_Struct(self, StructField, field); - - nargs = rb_scan_args(argc, argv, "3", &rbName, &rbOffset, &rbType); - - if (TYPE(rbName) != T_SYMBOL && TYPE(rbName) != T_STRING) { - rb_raise(rb_eTypeError, "wrong argument type %s (expected Symbol/String)", - rb_obj_classname(rbName)); - } - - Check_Type(rbOffset, T_FIXNUM); - - if (!rb_obj_is_kind_of(rbType, rbffi_TypeClass)) { - rb_raise(rb_eTypeError, "wrong argument type %s (expected FFI::Type)", - rb_obj_classname(rbType)); - } - - field->offset = NUM2UINT(rbOffset); - field->rbName = (TYPE(rbName) == T_SYMBOL) ? rbName : rb_str_intern(rbName); - field->rbType = rbType; - Data_Get_Struct(field->rbType, Type, field->type); - field->memoryOp = get_memory_op(field->type); - field->referenceIndex = -1; - - switch (field->type->nativeType == NATIVE_MAPPED ? ((MappedType *) field->type)->type->nativeType : field->type->nativeType) { - case NATIVE_FUNCTION: - case NATIVE_POINTER: - field->referenceRequired = true; - break; - - default: - field->referenceRequired = (rb_respond_to(self, rb_intern("reference_required?")) - && RTEST(rb_funcall2(self, rb_intern("reference_required?"), 0, NULL))) - || (rb_respond_to(rbType, rb_intern("reference_required?")) - && RTEST(rb_funcall2(rbType, rb_intern("reference_required?"), 0, NULL))); - break; - } - - return self; -} - -/* - * call-seq: offset - * @return [Numeric] - * Get the field offset. - */ -static VALUE -struct_field_offset(VALUE self) -{ - StructField* field; - Data_Get_Struct(self, StructField, field); - return UINT2NUM(field->offset); -} - -/* - * call-seq: size - * @return [Numeric] - * Get the field size. - */ -static VALUE -struct_field_size(VALUE self) -{ - StructField* field; - Data_Get_Struct(self, StructField, field); - return UINT2NUM(field->type->ffiType->size); -} - -/* - * call-seq: alignment - * @return [Numeric] - * Get the field alignment. - */ -static VALUE -struct_field_alignment(VALUE self) -{ - StructField* field; - Data_Get_Struct(self, StructField, field); - return UINT2NUM(field->type->ffiType->alignment); -} - -/* - * call-seq: type - * @return [Type] - * Get the field type. - */ -static VALUE -struct_field_type(VALUE self) -{ - StructField* field; - Data_Get_Struct(self, StructField, field); - - return field->rbType; -} - -/* - * call-seq: name - * @return [Symbol] - * Get the field name. - */ -static VALUE -struct_field_name(VALUE self) -{ - StructField* field; - Data_Get_Struct(self, StructField, field); - return field->rbName; -} - -/* - * call-seq: get(pointer) - * @param [AbstractMemory] pointer pointer on a {Struct} - * @return [Object] - * Get an object of type {#type} from memory pointed by +pointer+. - */ -static VALUE -struct_field_get(VALUE self, VALUE pointer) -{ - StructField* f; - - Data_Get_Struct(self, StructField, f); - if (f->memoryOp == NULL) { - rb_raise(rb_eArgError, "get not supported for %s", rb_obj_classname(f->rbType)); - return Qnil; - } - - return (*f->memoryOp->get)(MEMORY(pointer), f->offset); -} - -/* - * call-seq: put(pointer, value) - * @param [AbstractMemory] pointer pointer on a {Struct} - * @param [Object] value this object must be a kind of {#type} - * @return [self] - * Put an object to memory pointed by +pointer+. - */ -static VALUE -struct_field_put(VALUE self, VALUE pointer, VALUE value) -{ - StructField* f; - - Data_Get_Struct(self, StructField, f); - if (f->memoryOp == NULL) { - rb_raise(rb_eArgError, "put not supported for %s", rb_obj_classname(f->rbType)); - return self; - } - - (*f->memoryOp->put)(MEMORY(pointer), f->offset, value); - - return self; -} - -/* - * call-seq: get(pointer) - * @param [AbstractMemory] pointer pointer on a {Struct} - * @return [Function] - * Get a {Function} from memory pointed by +pointer+. - */ -static VALUE -function_field_get(VALUE self, VALUE pointer) -{ - StructField* f; - - Data_Get_Struct(self, StructField, f); - - return rbffi_Function_NewInstance(f->rbType, (*rbffi_AbstractMemoryOps.pointer->get)(MEMORY(pointer), f->offset)); -} - -/* - * call-seq: put(pointer, proc) - * @param [AbstractMemory] pointer pointer to a {Struct} - * @param [Function, Proc] proc - * @return [Function] - * Set a {Function} to memory pointed by +pointer+ as a function. - * - * If a Proc is submitted as +proc+, it is automatically transformed to a {Function}. - */ -static VALUE -function_field_put(VALUE self, VALUE pointer, VALUE proc) -{ - StructField* f; - VALUE value = Qnil; - - Data_Get_Struct(self, StructField, f); - - if (NIL_P(proc) || rb_obj_is_kind_of(proc, rbffi_FunctionClass)) { - value = proc; - } else if (rb_obj_is_kind_of(proc, rb_cProc) || rb_respond_to(proc, rb_intern("call"))) { - value = rbffi_Function_ForProc(f->rbType, proc); - } else { - rb_raise(rb_eTypeError, "wrong type (expected Proc or Function)"); - } - - (*rbffi_AbstractMemoryOps.pointer->put)(MEMORY(pointer), f->offset, value); - - return self; -} - -static inline bool -isCharArray(ArrayType* arrayType) -{ - return arrayType->componentType->nativeType == NATIVE_INT8 - || arrayType->componentType->nativeType == NATIVE_UINT8; -} - -/* - * call-seq: get(pointer) - * @param [AbstractMemory] pointer pointer on a {Struct} - * @return [FFI::StructLayout::CharArray, FFI::Struct::InlineArray] - * Get an array from a {Struct}. - */ -static VALUE -array_field_get(VALUE self, VALUE pointer) -{ - StructField* f; - ArrayType* array; - VALUE argv[2]; - - Data_Get_Struct(self, StructField, f); - Data_Get_Struct(f->rbType, ArrayType, array); - - argv[0] = pointer; - argv[1] = self; - - return rb_class_new_instance(2, argv, isCharArray(array) - ? rbffi_StructLayoutCharArrayClass : rbffi_StructInlineArrayClass); -} - -/* - * call-seq: put(pointer, value) - * @param [AbstractMemory] pointer pointer on a {Struct} - * @param [String, Array] value +value+ may be a String only if array's type is a kind of +int8+ - * @return [value] - * Set an array in a {Struct}. - */ -static VALUE -array_field_put(VALUE self, VALUE pointer, VALUE value) -{ - StructField* f; - ArrayType* array; - - - Data_Get_Struct(self, StructField, f); - Data_Get_Struct(f->rbType, ArrayType, array); - - if (isCharArray(array) && rb_obj_is_instance_of(value, rb_cString)) { - VALUE argv[2]; - - argv[0] = INT2FIX(f->offset); - argv[1] = value; - - if (RSTRING_LEN(value) < array->length) { - rb_funcall2(pointer, rb_intern("put_string"), 2, argv); - } else if (RSTRING_LEN(value) == array->length) { - rb_funcall2(pointer, rb_intern("put_bytes"), 2, argv); - } else { - rb_raise(rb_eIndexError, "String is longer (%ld bytes) than the char array (%d bytes)", RSTRING_LEN(value), array->length); - } - } else { -#ifdef notyet - MemoryOp* op; - int count = RARRAY_LEN(value); - int i; - AbstractMemory* memory = MEMORY(pointer); - - if (count > array->length) { - rb_raise(rb_eIndexError, "array too large"); - } - - /* clear the contents in case of a short write */ - checkWrite(memory); - checkBounds(memory, f->offset, f->type->ffiType->size); - if (count < array->length) { - memset(memory->address + f->offset + (count * array->componentType->ffiType->size), - 0, (array->length - count) * array->componentType->ffiType->size); - } - - /* now copy each element in */ - if ((op = get_memory_op(array->componentType)) != NULL) { - - for (i = 0; i < count; ++i) { - (*op->put)(memory, f->offset + (i * array->componentType->ffiType->size), rb_ary_entry(value, i)); - } - - } else if (array->componentType->nativeType == NATIVE_STRUCT) { - - for (i = 0; i < count; ++i) { - VALUE entry = rb_ary_entry(value, i); - Struct* s; - - if (!rb_obj_is_kind_of(entry, rbffi_StructClass)) { - rb_raise(rb_eTypeError, "array element not an instance of FFI::Struct"); - break; - } - - Data_Get_Struct(entry, Struct, s); - checkRead(s->pointer); - checkBounds(s->pointer, 0, array->componentType->ffiType->size); - - memcpy(memory->address + f->offset + (i * array->componentType->ffiType->size), - s->pointer->address, array->componentType->ffiType->size); - } - - } else { - rb_raise(rb_eNotImpError, "put not supported for arrays of type %s", rb_obj_classname(array->rbComponentType)); - } -#else - rb_raise(rb_eNotImpError, "cannot set array field"); -#endif - } - - return value; -} - - -static VALUE -struct_layout_allocate(VALUE klass) -{ - StructLayout* layout; - VALUE obj; - - obj = Data_Make_Struct(klass, StructLayout, struct_layout_mark, struct_layout_free, layout); - layout->rbFieldMap = Qnil; - layout->rbFieldNames = Qnil; - layout->rbFields = Qnil; - layout->base.ffiType = xcalloc(1, sizeof(*layout->base.ffiType)); - layout->base.ffiType->size = 0; - layout->base.ffiType->alignment = 0; - layout->base.ffiType->type = FFI_TYPE_STRUCT; - - return obj; -} - -/* - * call-seq: initialize(fields, size, align) - * @param [Array] fields - * @param [Numeric] size - * @param [Numeric] align - * @return [self] - * A new StructLayout instance. - */ -static VALUE -struct_layout_initialize(VALUE self, VALUE fields, VALUE size, VALUE align) -{ - StructLayout* layout; - ffi_type* ltype; - int i; - - Data_Get_Struct(self, StructLayout, layout); - layout->fieldCount = (int) RARRAY_LEN(fields); - layout->rbFieldMap = rb_hash_new(); - layout->rbFieldNames = rb_ary_new2(layout->fieldCount); - layout->size = (int) FFI_ALIGN(NUM2INT(size), NUM2INT(align)); - layout->align = NUM2INT(align); - layout->fields = xcalloc(layout->fieldCount, sizeof(StructField *)); - layout->ffiTypes = xcalloc(layout->fieldCount + 1, sizeof(ffi_type *)); - layout->rbFields = rb_ary_new2(layout->fieldCount); - layout->referenceFieldCount = 0; - layout->base.ffiType->elements = layout->ffiTypes; - layout->base.ffiType->size = layout->size; - layout->base.ffiType->alignment = layout->align; - - ltype = layout->base.ffiType; - for (i = 0; i < (int) layout->fieldCount; ++i) { - VALUE rbField = rb_ary_entry(fields, i); - VALUE rbName; - StructField* field; - ffi_type* ftype; - - - if (!rb_obj_is_kind_of(rbField, rbffi_StructLayoutFieldClass)) { - rb_raise(rb_eTypeError, "wrong type for field %d.", i); - } - rbName = rb_funcall2(rbField, rb_intern("name"), 0, NULL); - - Data_Get_Struct(rbField, StructField, field); - layout->fields[i] = field; - - if (field->type == NULL || field->type->ffiType == NULL) { - rb_raise(rb_eRuntimeError, "type of field %d not supported", i); - } - - ftype = field->type->ffiType; - if (ftype->size == 0 && i < ((int) layout->fieldCount - 1)) { - rb_raise(rb_eTypeError, "type of field %d has zero size", i); - } - - if (field->referenceRequired) { - field->referenceIndex = layout->referenceFieldCount++; - } - - - layout->ffiTypes[i] = ftype->size > 0 ? ftype : NULL; - rb_hash_aset(layout->rbFieldMap, rbName, rbField); - rb_ary_push(layout->rbFields, rbField); - rb_ary_push(layout->rbFieldNames, rbName); - } - - if (ltype->size == 0) { - rb_raise(rb_eRuntimeError, "Struct size is zero"); - } - - return self; -} - -/* - * call-seq: [](field) - * @param [Symbol] field - * @return [StructLayout::Field] - * Get a field from the layout. - */ -static VALUE -struct_layout_union_bang(VALUE self) -{ - const ffi_type *alignment_types[] = { &ffi_type_sint8, &ffi_type_sint16, &ffi_type_sint32, &ffi_type_sint64, - &ffi_type_float, &ffi_type_double, &ffi_type_longdouble, NULL }; - StructLayout* layout; - ffi_type *t = NULL; - int count, i; - - Data_Get_Struct(self, StructLayout, layout); - - for (i = 0; alignment_types[i] != NULL; ++i) { - if (alignment_types[i]->alignment == layout->align) { - t = (ffi_type *) alignment_types[i]; - break; - } - } - if (t == NULL) { - rb_raise(rb_eRuntimeError, "cannot create libffi union representation for alignment %d", layout->align); - return Qnil; - } - - count = (int) layout->size / (int) t->size; - xfree(layout->ffiTypes); - layout->ffiTypes = xcalloc(count + 1, sizeof(ffi_type *)); - layout->base.ffiType->elements = layout->ffiTypes; - - for (i = 0; i < count; ++i) { - layout->ffiTypes[i] = t; - } - - return self; -} - -static VALUE -struct_layout_aref(VALUE self, VALUE field) -{ - StructLayout* layout; - - Data_Get_Struct(self, StructLayout, layout); - - return rb_hash_aref(layout->rbFieldMap, field); -} - -/* - * call-seq: fields - * @return [Array] - * Get fields list. - */ -static VALUE -struct_layout_fields(VALUE self) -{ - StructLayout* layout; - - Data_Get_Struct(self, StructLayout, layout); - - return rb_ary_dup(layout->rbFields); -} - -/* - * call-seq: members - * @return [Array] - * Get list of field names. - */ -static VALUE -struct_layout_members(VALUE self) -{ - StructLayout* layout; - - Data_Get_Struct(self, StructLayout, layout); - - return rb_ary_dup(layout->rbFieldNames); -} - -/* - * call-seq: to_a - * @return [Array] - * Get an array of fields. - */ -static VALUE -struct_layout_to_a(VALUE self) -{ - StructLayout* layout; - - Data_Get_Struct(self, StructLayout, layout); - - return rb_ary_dup(layout->rbFields); -} - -static void -struct_layout_mark(StructLayout *layout) -{ - rb_gc_mark(layout->rbFieldMap); - rb_gc_mark(layout->rbFieldNames); - rb_gc_mark(layout->rbFields); - /* Clear the cache, to be safe from changes of fieldName VALUE by GC.compact. - * TODO: Move cache clearing to compactation callback provided by Ruby-2.7+. - */ - memset(&layout->cache_row, 0, sizeof(layout->cache_row)); -} - -static void -struct_layout_free(StructLayout *layout) -{ - xfree(layout->ffiTypes); - xfree(layout->base.ffiType); - xfree(layout->fields); - xfree(layout); -} - - -void -rbffi_StructLayout_Init(VALUE moduleFFI) -{ - VALUE ffi_Type = rbffi_TypeClass; - - /* - * Document-class: FFI::StructLayout < FFI::Type - * - * This class aims at defining a struct layout. - */ - rbffi_StructLayoutClass = rb_define_class_under(moduleFFI, "StructLayout", ffi_Type); - rb_global_variable(&rbffi_StructLayoutClass); - - /* - * Document-class: FFI::StructLayout::Field - * A field in a {StructLayout}. - */ - rbffi_StructLayoutFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Field", rb_cObject); - rb_global_variable(&rbffi_StructLayoutFieldClass); - - /* - * Document-class: FFI::StructLayout::Number - * A numeric {Field} in a {StructLayout}. - */ - rbffi_StructLayoutNumberFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Number", rbffi_StructLayoutFieldClass); - rb_global_variable(&rbffi_StructLayoutNumberFieldClass); - - /* - * Document-class: FFI::StructLayout::String - * A string {Field} in a {StructLayout}. - */ - rbffi_StructLayoutStringFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "String", rbffi_StructLayoutFieldClass); - rb_global_variable(&rbffi_StructLayoutStringFieldClass); - - /* - * Document-class: FFI::StructLayout::Pointer - * A pointer {Field} in a {StructLayout}. - */ - rbffi_StructLayoutPointerFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Pointer", rbffi_StructLayoutFieldClass); - rb_global_variable(&rbffi_StructLayoutPointerFieldClass); - - /* - * Document-class: FFI::StructLayout::Function - * A function pointer {Field} in a {StructLayout}. - */ - rbffi_StructLayoutFunctionFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Function", rbffi_StructLayoutFieldClass); - rb_global_variable(&rbffi_StructLayoutFunctionFieldClass); - - /* - * Document-class: FFI::StructLayout::Array - * An array {Field} in a {StructLayout}. - */ - rbffi_StructLayoutArrayFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Array", rbffi_StructLayoutFieldClass); - rb_global_variable(&rbffi_StructLayoutArrayFieldClass); - - rb_define_alloc_func(rbffi_StructLayoutFieldClass, struct_field_allocate); - rb_define_method(rbffi_StructLayoutFieldClass, "initialize", struct_field_initialize, -1); - rb_define_method(rbffi_StructLayoutFieldClass, "offset", struct_field_offset, 0); - rb_define_method(rbffi_StructLayoutFieldClass, "size", struct_field_size, 0); - rb_define_method(rbffi_StructLayoutFieldClass, "alignment", struct_field_alignment, 0); - rb_define_method(rbffi_StructLayoutFieldClass, "name", struct_field_name, 0); - rb_define_method(rbffi_StructLayoutFieldClass, "type", struct_field_type, 0); - rb_define_method(rbffi_StructLayoutFieldClass, "put", struct_field_put, 2); - rb_define_method(rbffi_StructLayoutFieldClass, "get", struct_field_get, 1); - - rb_define_method(rbffi_StructLayoutFunctionFieldClass, "put", function_field_put, 2); - rb_define_method(rbffi_StructLayoutFunctionFieldClass, "get", function_field_get, 1); - - rb_define_method(rbffi_StructLayoutArrayFieldClass, "get", array_field_get, 1); - rb_define_method(rbffi_StructLayoutArrayFieldClass, "put", array_field_put, 2); - - rb_define_alloc_func(rbffi_StructLayoutClass, struct_layout_allocate); - rb_define_method(rbffi_StructLayoutClass, "initialize", struct_layout_initialize, 3); - rb_define_method(rbffi_StructLayoutClass, "[]", struct_layout_aref, 1); - rb_define_method(rbffi_StructLayoutClass, "fields", struct_layout_fields, 0); - rb_define_method(rbffi_StructLayoutClass, "members", struct_layout_members, 0); - rb_define_method(rbffi_StructLayoutClass, "to_a", struct_layout_to_a, 0); - rb_define_method(rbffi_StructLayoutClass, "__union!", struct_layout_union_bang, 0); - -} - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/StructLayout.o b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/StructLayout.o deleted file mode 100644 index 945bbed1109723942ee65704348b974eedbf8dda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45224 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 E-^ti)V*mgE diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Thread.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Thread.c deleted file mode 100644 index f6a8387..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Thread.c +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (c) 2010 Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * 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 the Ruby FFI project 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 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. - */ - -#include -#include - -#if defined(__CYGWIN__) || !defined(_WIN32) -# include -# include -# include -# include -#else -# include -# define _WINSOCKAPI_ -# include -#endif -#include -#include "Thread.h" - -#ifdef _WIN32 -static volatile DWORD frame_thread_key = TLS_OUT_OF_INDEXES; -#else -static pthread_key_t thread_data_key; -struct thread_data { - rbffi_frame_t* frame; -}; -static inline struct thread_data* thread_data_get(void); - -#endif - -rbffi_frame_t* -rbffi_frame_current(void) -{ -#ifdef _WIN32 - return (rbffi_frame_t *) TlsGetValue(frame_thread_key); -#else - struct thread_data* td = (struct thread_data *) pthread_getspecific(thread_data_key); - return td != NULL ? td->frame : NULL; -#endif -} - -void -rbffi_frame_push(rbffi_frame_t* frame) -{ - memset(frame, 0, sizeof(*frame)); - frame->exc = Qnil; - -#ifdef _WIN32 - frame->prev = TlsGetValue(frame_thread_key); - TlsSetValue(frame_thread_key, frame); -#else - frame->td = thread_data_get(); - frame->prev = frame->td->frame; - frame->td->frame = frame; -#endif -} - -void -rbffi_frame_pop(rbffi_frame_t* frame) -{ -#ifdef _WIN32 - TlsSetValue(frame_thread_key, frame->prev); -#else - frame->td->frame = frame->prev; -#endif -} - -#ifndef _WIN32 -static struct thread_data* thread_data_init(void); - -static inline struct thread_data* -thread_data_get(void) -{ - struct thread_data* td = (struct thread_data *) pthread_getspecific(thread_data_key); - return td != NULL ? td : thread_data_init(); -} - -static struct thread_data* -thread_data_init(void) -{ - struct thread_data* td = calloc(1, sizeof(struct thread_data)); - - pthread_setspecific(thread_data_key, td); - - return td; -} - -static void -thread_data_free(void *ptr) -{ - free(ptr); -} -#endif - -void -rbffi_Thread_Init(VALUE moduleFFI) -{ -#ifdef _WIN32 - frame_thread_key = TlsAlloc(); -#else - pthread_key_create(&thread_data_key, thread_data_free); -#endif -} diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Thread.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Thread.h deleted file mode 100644 index 8c335e4..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Thread.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (c) 2010 Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * 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 the Ruby FFI project 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 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. - */ - -#ifndef RBFFI_THREAD_H -#define RBFFI_THREAD_H - -#include -#include -#include "extconf.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -#ifdef _WIN32 -# include -#else -# include -#endif - -typedef struct { -#ifdef _WIN32 - DWORD id; -#else - pthread_t id; -#endif - bool valid; - bool has_gvl; - VALUE exc; -} rbffi_thread_t; - -typedef struct rbffi_frame { -#ifndef _WIN32 - struct thread_data* td; -#endif - struct rbffi_frame* prev; - VALUE exc; -} rbffi_frame_t; - -rbffi_frame_t* rbffi_frame_current(void); -void rbffi_frame_push(rbffi_frame_t* frame); -void rbffi_frame_pop(rbffi_frame_t* frame); - -#ifdef __cplusplus -} -#endif - -#endif /* RBFFI_THREAD_H */ - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Thread.o b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Thread.o deleted file mode 100644 index e053ce7fd28764da0524cda757e64ccb4b574698..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5656 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 diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Type.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Type.c deleted file mode 100644 index 7776bb0..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Type.c +++ /dev/null @@ -1,379 +0,0 @@ -/* - * Copyright (c) 2009, Wayne Meissner - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * 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 the Ruby FFI project 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 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. - */ - -#ifndef _MSC_VER -# include -#endif - -#include -#include -#include -#include "rbffi.h" -#include "compat.h" -#include "Types.h" -#include "Type.h" - - -typedef struct BuiltinType_ { - Type type; - char* name; -} BuiltinType; - -static void builtin_type_free(BuiltinType *); - -VALUE rbffi_TypeClass = Qnil; - -static VALUE classBuiltinType = Qnil; -static VALUE moduleNativeType = Qnil; -static VALUE typeMap = Qnil, sizeMap = Qnil; -static ID id_find_type = 0, id_type_size = 0, id_size = 0; - -static VALUE -type_allocate(VALUE klass) -{ - Type* type; - VALUE obj = Data_Make_Struct(klass, Type, NULL, -1, type); - - type->nativeType = -1; - type->ffiType = &ffi_type_void; - - return obj; -} - -/* - * Document-method: initialize - * call-seq: initialize(value) - * @param [Fixnum,Type] value - * @return [self] - */ -static VALUE -type_initialize(VALUE self, VALUE value) -{ - Type* type; - Type* other; - - Data_Get_Struct(self, Type, type); - - if (FIXNUM_P(value)) { - type->nativeType = FIX2INT(value); - } else if (rb_obj_is_kind_of(value, rbffi_TypeClass)) { - Data_Get_Struct(value, Type, other); - type->nativeType = other->nativeType; - type->ffiType = other->ffiType; - } else { - rb_raise(rb_eArgError, "wrong type"); - } - - return self; -} - -/* - * call-seq: type.size - * @return [Fixnum] - * Return type's size, in bytes. - */ -static VALUE -type_size(VALUE self) -{ - Type *type; - - Data_Get_Struct(self, Type, type); - - return INT2FIX(type->ffiType->size); -} - -/* - * call-seq: type.alignment - * @return [Fixnum] - * Get Type alignment. - */ -static VALUE -type_alignment(VALUE self) -{ - Type *type; - - Data_Get_Struct(self, Type, type); - - return INT2FIX(type->ffiType->alignment); -} - -/* - * call-seq: type.inspect - * @return [String] - * Inspect {Type} object. - */ -static VALUE -type_inspect(VALUE self) -{ - char buf[100]; - Type *type; - - Data_Get_Struct(self, Type, type); - - snprintf(buf, sizeof(buf), "#<%s:%p size=%d alignment=%d>", - rb_obj_classname(self), type, (int) type->ffiType->size, (int) type->ffiType->alignment); - - return rb_str_new2(buf); -} - -static VALUE -builtin_type_new(VALUE klass, int nativeType, ffi_type* ffiType, const char* name) -{ - BuiltinType* type; - VALUE obj = Qnil; - - obj = Data_Make_Struct(klass, BuiltinType, NULL, builtin_type_free, type); - - type->name = strdup(name); - type->type.nativeType = nativeType; - type->type.ffiType = ffiType; - - return obj; -} - -static void -builtin_type_free(BuiltinType *type) -{ - free(type->name); - xfree(type); -} - -/* - * call-seq: type.inspect - * @return [String] - * Inspect {Type::Builtin} object. - */ -static VALUE -builtin_type_inspect(VALUE self) -{ - char buf[100]; - BuiltinType *type; - - Data_Get_Struct(self, BuiltinType, type); - snprintf(buf, sizeof(buf), "#<%s:%s size=%d alignment=%d>", - rb_obj_classname(self), type->name, (int) type->type.ffiType->size, type->type.ffiType->alignment); - - return rb_str_new2(buf); -} - -int -rbffi_type_size(VALUE type) -{ - int t = TYPE(type); - - if (t == T_FIXNUM || t == T_BIGNUM) { - return NUM2INT(type); - - } else if (t == T_SYMBOL) { - /* - * Try looking up directly in the type and size maps - */ - VALUE nType; - if ((nType = rb_hash_lookup(typeMap, type)) != Qnil) { - if (rb_obj_is_kind_of(nType, rbffi_TypeClass)) { - Type* type; - Data_Get_Struct(nType, Type, type); - return (int) type->ffiType->size; - - } else if (rb_respond_to(nType, id_size)) { - return NUM2INT(rb_funcall2(nType, id_size, 0, NULL)); - } - } - - /* Not found - call up to the ruby version to resolve */ - return NUM2INT(rb_funcall2(rbffi_FFIModule, id_type_size, 1, &type)); - - } else { - return NUM2INT(rb_funcall2(type, id_size, 0, NULL)); - } -} - -VALUE -rbffi_Type_Lookup(VALUE name) -{ - int t = TYPE(name); - if (t == T_SYMBOL || t == T_STRING) { - /* - * Try looking up directly in the type Map - */ - VALUE nType; - if ((nType = rb_hash_lookup(typeMap, name)) != Qnil && rb_obj_is_kind_of(nType, rbffi_TypeClass)) { - return nType; - } - } else if (rb_obj_is_kind_of(name, rbffi_TypeClass)) { - - return name; - } - - /* Nothing found - let caller handle raising exceptions */ - return Qnil; -} - -void -rbffi_Type_Init(VALUE moduleFFI) -{ - /* - * Document-class: FFI::Type - * This class manages C types. - * - * It embbed {FFI::Type::Builtin} objects as constants (for names, - * see {FFI::NativeType}). - */ - rbffi_TypeClass = rb_define_class_under(moduleFFI, "Type", rb_cObject); - - /* - * Document-constant: FFI::TypeDefs - */ - rb_define_const(moduleFFI, "TypeDefs", typeMap = rb_hash_new()); - rb_define_const(moduleFFI, "SizeTypes", sizeMap = rb_hash_new()); - rb_global_variable(&typeMap); - rb_global_variable(&sizeMap); - id_find_type = rb_intern("find_type"); - id_type_size = rb_intern("type_size"); - id_size = rb_intern("size"); - - /* - * Document-class: FFI::Type::Builtin - * Class for Built-in types. - */ - classBuiltinType = rb_define_class_under(rbffi_TypeClass, "Builtin", rbffi_TypeClass); - /* - * Document-module: FFI::NativeType - * This module defines constants for native (C) types. - * - * ==Native type constants - * Native types are defined by constants : - * * INT8, SCHAR, CHAR - * * UINT8, UCHAR - * * INT16, SHORT, SSHORT - * * UINT16, USHORT - * * INT32,, INT, SINT - * * UINT32, UINT - * * INT64, LONG_LONG, SLONG_LONG - * * UINT64, ULONG_LONG - * * LONG, SLONG - * * ULONG - * * FLOAT32, FLOAT - * * FLOAT64, DOUBLE - * * POINTER - * * CALLBACK - * * FUNCTION - * * CHAR_ARRAY - * * BOOL - * * STRING (immutable string, nul terminated) - * * STRUCT (struct-b-value param or result) - * * ARRAY (array type definition) - * * MAPPED (custom native type) - * For function return type only : - * * VOID - * For function argument type only : - * * BUFFER_IN - * * BUFFER_OUT - * * VARARGS (function takes a variable number of arguments) - * - * All these constants are exported to {FFI} module prefixed with "TYPE_". - * They are objets from {FFI::Type::Builtin} class. - */ - moduleNativeType = rb_define_module_under(moduleFFI, "NativeType"); - - /* - * Document-global: FFI::Type - */ - rb_global_variable(&rbffi_TypeClass); - rb_global_variable(&classBuiltinType); - rb_global_variable(&moduleNativeType); - - rb_define_alloc_func(rbffi_TypeClass, type_allocate); - rb_define_method(rbffi_TypeClass, "initialize", type_initialize, 1); - rb_define_method(rbffi_TypeClass, "size", type_size, 0); - rb_define_method(rbffi_TypeClass, "alignment", type_alignment, 0); - rb_define_method(rbffi_TypeClass, "inspect", type_inspect, 0); - - /* Make Type::Builtin non-allocatable */ - rb_undef_method(CLASS_OF(classBuiltinType), "new"); - rb_define_method(classBuiltinType, "inspect", builtin_type_inspect, 0); - - rb_global_variable(&rbffi_TypeClass); - rb_global_variable(&classBuiltinType); - - /* Define all the builtin types */ - #define T(x, ffiType) do { \ - VALUE t = Qnil; \ - rb_define_const(rbffi_TypeClass, #x, t = builtin_type_new(classBuiltinType, NATIVE_##x, ffiType, #x)); \ - rb_define_const(moduleNativeType, #x, t); \ - rb_define_const(moduleFFI, "TYPE_" #x, t); \ - } while(0) - - #define A(old_type, new_type) do { \ - VALUE t = rb_const_get(rbffi_TypeClass, rb_intern(#old_type)); \ - rb_const_set(rbffi_TypeClass, rb_intern(#new_type), t); \ - } while(0) - - /* - * Document-constant: FFI::Type::Builtin::VOID - */ - T(VOID, &ffi_type_void); - T(INT8, &ffi_type_sint8); - A(INT8, SCHAR); - A(INT8, CHAR); - T(UINT8, &ffi_type_uint8); - A(UINT8, UCHAR); - - T(INT16, &ffi_type_sint16); - A(INT16, SHORT); - A(INT16, SSHORT); - T(UINT16, &ffi_type_uint16); - A(UINT16, USHORT); - T(INT32, &ffi_type_sint32); - A(INT32, INT); - A(INT32, SINT); - T(UINT32, &ffi_type_uint32); - A(UINT32, UINT); - T(INT64, &ffi_type_sint64); - A(INT64, LONG_LONG); - A(INT64, SLONG_LONG); - T(UINT64, &ffi_type_uint64); - A(UINT64, ULONG_LONG); - T(LONG, &ffi_type_slong); - A(LONG, SLONG); - T(ULONG, &ffi_type_ulong); - T(FLOAT32, &ffi_type_float); - A(FLOAT32, FLOAT); - T(FLOAT64, &ffi_type_double); - A(FLOAT64, DOUBLE); - T(LONGDOUBLE, &ffi_type_longdouble); - T(POINTER, &ffi_type_pointer); - T(STRING, &ffi_type_pointer); - T(BUFFER_IN, &ffi_type_pointer); - T(BUFFER_OUT, &ffi_type_pointer); - T(BUFFER_INOUT, &ffi_type_pointer); - T(BOOL, &ffi_type_uchar); - T(VARARGS, &ffi_type_void); -} - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Type.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Type.h deleted file mode 100644 index b81995a..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Type.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2009, Wayne Meissner - * Copyright (C) 2009 Luc Heinrich - * - * This file is part of ruby-ffi. - * - * 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 the Evan Phoenix 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. - * - */ - -#ifndef RBFFI_TYPE_H -#define RBFFI_TYPE_H - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct Type_ Type; - -#include "Types.h" - -struct Type_ { - NativeType nativeType; - ffi_type* ffiType; -}; - -extern VALUE rbffi_TypeClass; -extern VALUE rbffi_Type_Lookup(VALUE type); - -#ifdef __cplusplus -} -#endif - -#endif /* RBFFI_TYPE_H */ - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Type.o b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Type.o deleted file mode 100644 index 2d92963206f40488414bfdfb6d1e8a26d604daa1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50336 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 N)#*)%>E&70{|9F4-%$Vn diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Types.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Types.c deleted file mode 100644 index 77741e0..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Types.c +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright (c) 2009, Wayne Meissner - * Copyright (c) 2009, Luc Heinrich - * Copyright (c) 2009, Aman Gupta. - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * 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 the Ruby FFI project 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 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. - */ - -#include -#include "Pointer.h" -#include "rbffi.h" -#include "Function.h" -#include "StructByValue.h" -#include "Types.h" -#include "Struct.h" -#include "MappedType.h" -#include "MemoryPointer.h" -#include "LongDouble.h" - -static ID id_from_native = 0; - - -VALUE -rbffi_NativeValue_ToRuby(Type* type, VALUE rbType, const void* ptr) -{ - switch (type->nativeType) { - case NATIVE_VOID: - return Qnil; - case NATIVE_INT8: - return INT2NUM((signed char) *(ffi_sarg *) ptr); - case NATIVE_INT16: - return INT2NUM((signed short) *(ffi_sarg *) ptr); - case NATIVE_INT32: - return INT2NUM((signed int) *(ffi_sarg *) ptr); - case NATIVE_LONG: - return LONG2NUM((signed long) *(ffi_sarg *) ptr); - case NATIVE_INT64: - return LL2NUM(*(signed long long *) ptr); - - case NATIVE_UINT8: - return UINT2NUM((unsigned char) *(ffi_arg *) ptr); - case NATIVE_UINT16: - return UINT2NUM((unsigned short) *(ffi_arg *) ptr); - case NATIVE_UINT32: - return UINT2NUM((unsigned int) *(ffi_arg *) ptr); - case NATIVE_ULONG: - return ULONG2NUM((unsigned long) *(ffi_arg *) ptr); - case NATIVE_UINT64: - return ULL2NUM(*(unsigned long long *) ptr); - - case NATIVE_FLOAT32: - return rb_float_new(*(float *) ptr); - case NATIVE_FLOAT64: - return rb_float_new(*(double *) ptr); - - case NATIVE_LONGDOUBLE: - return rbffi_longdouble_new(*(long double *) ptr); - - case NATIVE_STRING: - return (*(void **) ptr != NULL) ? rb_str_new2(*(char **) ptr) : Qnil; - case NATIVE_POINTER: - return rbffi_Pointer_NewInstance(*(void **) ptr); - case NATIVE_BOOL: - return ((unsigned char) *(ffi_arg *) ptr) ? Qtrue : Qfalse; - - case NATIVE_FUNCTION: { - return *(void **) ptr != NULL - ? rbffi_Function_NewInstance(rbType, rbffi_Pointer_NewInstance(*(void **) ptr)) - : Qnil; - } - - case NATIVE_STRUCT: { - StructByValue* sbv = (StructByValue *)type; - AbstractMemory* mem; - VALUE rbMemory = rbffi_MemoryPointer_NewInstance(1, sbv->base.ffiType->size, false); - - Data_Get_Struct(rbMemory, AbstractMemory, mem); - memcpy(mem->address, ptr, sbv->base.ffiType->size); - RB_GC_GUARD(rbMemory); - RB_GC_GUARD(rbType); - - return rb_class_new_instance(1, &rbMemory, sbv->rbStructClass); - } - - case NATIVE_MAPPED: { - /* - * For mapped types, first convert to the real native type, then upcall to - * ruby to convert to the expected return type - */ - MappedType* m = (MappedType *) type; - VALUE values[2], rbReturnValue; - - values[0] = rbffi_NativeValue_ToRuby(m->type, m->rbType, ptr); - values[1] = Qnil; - - - rbReturnValue = rb_funcall2(m->rbConverter, id_from_native, 2, values); - RB_GC_GUARD(values[0]); - RB_GC_GUARD(rbType); - - return rbReturnValue; - } - - default: - rb_raise(rb_eRuntimeError, "Unknown type: %d", type->nativeType); - return Qnil; - } -} - -void -rbffi_Types_Init(VALUE moduleFFI) -{ - id_from_native = rb_intern("from_native"); -} - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Types.h b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Types.h deleted file mode 100644 index 4b72320..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Types.h +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (c) 2008, 2009, Wayne Meissner - * Copyright (c) 2009, Luc Heinrich - * - * Copyright (c) 2008-2013, Ruby FFI project contributors - * 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 the Ruby FFI project 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 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. - */ - -#ifndef RBFFI_TYPES_H -#define RBFFI_TYPES_H - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum { - NATIVE_VOID, - NATIVE_INT8, - NATIVE_UINT8, - NATIVE_INT16, - NATIVE_UINT16, - NATIVE_INT32, - NATIVE_UINT32, - NATIVE_INT64, - NATIVE_UINT64, - NATIVE_LONG, - NATIVE_ULONG, - NATIVE_FLOAT32, - NATIVE_FLOAT64, - NATIVE_LONGDOUBLE, - NATIVE_POINTER, - NATIVE_FUNCTION, - NATIVE_BUFFER_IN, - NATIVE_BUFFER_OUT, - NATIVE_BUFFER_INOUT, - NATIVE_CHAR_ARRAY, - NATIVE_BOOL, - - /** An immutable string. Nul terminated, but only copies in to the native function */ - NATIVE_STRING, - - /** The function takes a variable number of arguments */ - NATIVE_VARARGS, - - /** Struct-by-value param or result */ - NATIVE_STRUCT, - - /** An array type definition */ - NATIVE_ARRAY, - - /** Custom native type */ - NATIVE_MAPPED, -} NativeType; - -#include -#include "Type.h" - -VALUE rbffi_NativeValue_ToRuby(Type* type, VALUE rbType, const void* ptr); -void rbffi_Types_Init(VALUE moduleFFI); - -#ifdef __cplusplus -} -#endif - -#endif /* RBFFI_TYPES_H */ - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Types.o b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Types.o deleted file mode 100644 index f674f15a7cbca61a2f96664ee93e575614a5fa77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13944 zcmcgydwf*Yoj-T(JZ^4=BqV_Zc@0RAS29Te1qGXdBrqW_Cc{H3pUY%s5>h5Jab^PI zi-=Uw;)<2Fw$;+AwcxsItJwN3TG!eYSA4YU*1FKz%C2rp6|GTO`~98A%w!0kZvWW5 zpE>9E{+)Av_uO;O`Q3T(lmGr7H)9&ZMU?|(5mg=(ToX|C+c`RF<(VVc>&XUJfuvo) zsT2_tmu01+m!$_*UmtZ*uw?2GqGo@I^fpX%3SDR-MW#z3jBxtC={qTPeNRxARueAsaSW!y{9p>{4S23!c<%_kN(Wdzm&AK>K@U zYwQ**3ng>6?SHsMEBs1>HuYD#Y_Ola{Z^(mJn%eY<)9xiwoUB<@2kXnR`7<6r9$WF zT%Dyt=Lw~AmC$)a(jGPxU{`H_@FCDcXy!sx{N<@y!9O}|Ecl;j3uE2Wf_A7_TEV-%aV&ULH|`y+ zJ#K&M>Q@ewvWIxThqpg?z39giqxJh(DGRbg)2A3h=hSFAPmLYDuZYE{`o5Ag>W><` zr;5(3f7E0LKh(8*5zD=!_3fCO1&?8F9M#92DISZbYV6WowxPgLeb=|}aPoWNG1$S; z{DsWX`?AT|Fsvc|6jK|`2lVGdYPXmTUxRr`^#0O@Va&B*(zO8|)5}G_!|ayhE;fAp zY=RBLQz1LP{B&No2^;A0`v!m5W0Y?MF9g58g|E8LKmUe-wvOJV9oSfe`Hp!(efj`4 zze8Cj`}KipOE0_kOl{#AE~n>dv>5m>@ABu?A>I1bXmjxxJM&zmn5gH(Lu1z2FqV`( z(-@;?WA92VgtP{EP_W!ES~%CEY(lvVWk1U6D3vg(MG2zpL^+7^Hp+h3=ayL*)Djfp z4M=z#@MOo6SZg$_HS89wS$j6(89T%n9%r@(<(81Ve;aMI?trJU;Zs-m@GL*QpT@l= zzB!)Q8u!pU<9tt5g!Lp7{di-h`?l~k8a~i4uW6y}ROs6oR#>4YB+Jh3(mMAksvLu% zOJiY$dL&CIDvBZ?6&1R1grcGjWfc{Ac!Z*&PGl7o`q>CYMR^cN*|b9ENtWoNq9R#E zh0@KSODHPpzO14`A0DBosP**1#D(xEbhl&)kBZupReW5cN3$%2zBj^FxIVpJlpuX*J{--)d`KQKB4+!7rg-M^zI1GA}P>VK%r`8X)K~p zHLWN(fl($|WVA^Z*yoY=UCk_bROrT>DG}JGs6&~#6H%y|R-$P|shI_j3RTleC@M`V1oJ=1u+^P5wmShl&!eTo>!X-?snow>P) z6z$HabmljwtcRouB2}_a5j!OlAvP4A^>tdL((-BEB_ZAm3RP!jnl7FD@;jl8)vAih z9D31?D~tZLy{M#OV$ref6UJ(#I1$@wAT4z^R9-$oFFL>Qg2Hnqd|?8l*w!y#dXc}3 zcs9%cyMx&(go+=pJjY6Hd)ZZ(Y)(J3RbCAR*LdbH6AFwOGhlpSVIem41$NC}R#-@W z7&B*qKdBhIed6jxobO=FT?}K!#z4Y~$}}l}LGhSOFBX9;$;e#B&Ks_LH;yaC^Pcfq&Okc^i zm+jCdT%#f2XA?n@pFy`kajSAiu|(a&nUagU>MzT1&&ld$c(YF9U9TZVvvFhD91Zu1 zvANR_uk$d*d319N3ois(O^4Z0KBF-Yg2Q& z0W7V5CiY6U>vR*=+rhByD$pzEaAjt%#AMye<=8DVM={#ET|Nj-ZMAj*Cg6=woeW#8 z*YE(i482Bqnp>c&JXOIeFzxzGvjvcuYf)=vH)@-iK&_isqPCkiqIQ_yKm)x$K41*Pnr7*A8mtYe1O!JJjXoA5j}7EyN2< zT4h~kC2Gx_jaoO)M{P4#p>~^>pf(uylmKei{-BxLfiUwcs5SGOsBPvwsCDxoYPN4|k)a53vSL4jDqaJVGh59U$vLX}B$5Br*{}uIQ^L5ly%-^G)DsJhYfoeU*UjQ6- z<5K{q=BBr?>k6u{5ZLD$B>)b?7)QY7{s)Q<9z|kR0T`P5d!$PYPPr``V;H$~t50kOA$jqZF7++`v@SAZ^$GoCD0ZJUT#rpxnU_0tq@sq&g zgx4F)bq_}HAQ<{8cM3e$)u^5YZQM}wB0!~aZSfm`KLOkLGAsTNIPFr5>x|;h6@I;0 zY)AVqkj}0W=6V{)TM)XY@&NrFsI%GqGPrJX?|u`N>m5{cU}c_Hv>2e$TwUx3q)3zp*{SjBHhaNrSnm!TysF*}NnH$r#-TYtv*ei1CW0~rbj?@@A|?r^)@l1PT37|%LCJIUf;gN}2xzs?((0Jw2JmUM zp^M&XOPJ$!u;$6&aV_u>A?7$218T?!0=Au4A)bJ;3W-w-X!TC5ih#?g`le4ji_s=eU^Wk%RkCNWyIy9FD{;N44;HNTcXKSUn1_QTToM5Gv70d zbF1qX)XoQ8Uta@$-E0=5uN5_6<|WgUa7WkrngPkk(dlYjl@X^Ro0-%k)Vn5yo_PnN@!r9{xVJG8 z9_;5W1gX75e-s}DL)FQ+Hx=r~XwWb3mS{YZNP4>mVqAN$ZW_iZ>2p?^}&d#PrMt9dr4Mf9zp_moM zWK5@6V9m0NtkpfCSSl*YM?)~O8eJE)E$e8_G3n}TTJHC?T3svs%|X%EEuq+8)S?Wo@EWw*JKCER z-m$Eu2?ORM2wKZqeO+COXzOTPgIgs<{9Y(H3W|72TcPuL0Nu2xX z!jufBmu*{1(}9hkEY=;u%%!E4R~8c)e$Hs;$$pNa+X{;LWYIv2u5H1l=iJ3l@yw?+FC$!&S0 z#X^xtG777nSg1F}{dQ3g+OR}NBfOJY)PirkCh)$&dJCM31C60{h{oL)W`SiKZ07xl z^oNq0S)?Z!jj{;oV5O!Q*T)C@v1G^S>+}|44(4;gBLfS60EptNcyBb#fI^j`B*Msp zZv_(pEF#=-tiBI^g}W?{`BLBAhZjIRJ&;c3hBU)LWBh(w@#t3B1ocPU@f>Dn0w&R< z)gImI$66JNhoe%xc`zQPw`rcpLfpxo|NBL%ikmQ+D{EOI5u@(o1s2{c<^oX^O75jE z+o;up7DKU^h@KiF-m!9!uuF#eFcC$>=r*M+f4nbE{`n~4^^C7(DaL%}U(!i`YZ1oO?l96b{A~8ie5KRvzQS?>uO5goo$_S{NEq_ z=O?1Oev*a`cD-yb%H1djQJz706@`vbAdjq&f%DTj|)CPt8NMtidEsjcZ) z)vQZz+IEfW@Ut&m-}LQcmll`3qJRIpKX`t)?!`ZkdEwS254@kch|O%DU-ZeJrhfG4 zPj@x_y8F7DYKL|emURC3+nz5j9scEsi%S+qKHFV4{p|;KJTYZ{drMQpSG`kS{9CT!(MGsir3!ePNjGK}_J~Djk z`$s0eQ+v~uVb9mDd>Da!9_1~RKcm<&Nh(n0pe#k{L3o<{j43Y|4R zMJYlcr=cuBS%GpfNib^`K-?B2W6F^dM=`8YfwFWF;0IV5K4DX^C|^DzrowCFO`kxjJdc z^P*t!6D#R3MoCT5qLiQXMX5GoQSMC|dO#D45>rx((tpIFyrI;hj3lur*Ctt8B#Tbr z(hv&rqKpDmQIEVvr1(dXH^IWrpH)rMJ}nx<0H|FQZRDAe)i7^sUw1N;+?I3XT%PFf z55*&`*gypF(oA`C&Y*SkYjE`R4yKaczIZq`7>Uv`@&EYHJEFNzvj6|Hxzx6lm+ux* zc!edm^wXiaFPh?K=W04TpPLB;9k@8FR-CMfuGvIk=Q{-C25<><6H*nlxlUul98Fso z)42hBDI*b2cEAsDeU6W*-MjtVq7La!kD+#@dCt2xR{+pIE&!`Y&D>~NGi z^@X+>nqK(6zSUTg1&(rk+xvQd&)B9n7gewB5Lm$QRfSA|E8u7q(%QH@V)vg%t$*{IrU;V3OZXHQ(7El@1q|Mr+&ZL z;yC+SbYqPE${-wld%Lm3ss8~!A9Y^qeAKbj*~%S#WBa3yg--n>YjIo%4-;DS-Dtjo zGv+zl9gD%7{HSA$^D$wlUk9<~)UVahTm974#u6I0Q-2eoaO!tc9Bhv9PJKvgfe{Vg zcG(2Sc=IvmjuuBb`l&guwYjls$UAX2CLnH0>vsiQN?!@_YrPE>c2m`R0BIiW7I5iK zK>S*V1YBwWV!f-j17e1^k`Qp|NmSTX#ZCyg;XOe50!nFBd?l@Z1`xZx*dYNo+$QP0 zlHLed3cXH1>R+pXOJ@P%+jR8_F!4{?>em7BU;gUn04D-c(infiuHFks{`UyDffCHv z(N#A}euLyM0>mz_no`pQ4JpTTCHoDOzs7&-t6v8sf3FI-fs))~!QU_WcT4_GNe@Yy zGUIrqRxgtL1(HwcbL=#$Kf`?>zaI;@;XS}{;2)O!=On)o5GJh+0xm@ixgG6zVZY%% z@m_T9laTVn(03*!yhy@k32P*rCLzyj)8<&xABY#B^A8ffA>m;Oe=6Yv64D1HYA+?> z`4Uc&kiN{2{2dAJm+%@1&y(;w7!N}491!Dl1|>aT(laIWNC?3FJ_#f8Z`aE!C%J45 zjduMx?XY%4v+EygpJ_ujyMEC2u-+Wl0AJN#*WU!(Y2RhvZMW-( z?9bSr1Ki`->$uHfvmJIGf!n>V+g!K1AayFfa`h$uX|jj>U+`Sf^*GTv_V-G;vZr~7 zT>%@a68hAuV(`>O@g!R9GY){x5wlxB8}U7kI&a9R%!Y-83LGb)heWJRQ2URs3fs6>QR z$w@Vkcti#yX4QbEMy+UIFrMz~k2WQf3BehR$)pX5Gq?p0A!I|sn>JfLA*6pvN^fPJ z)FC2+=cV{bCUPKz<>XXAQWh!O(Hh}p#0La!b9&}Q+K$*Nj7a)Og;Dc6qFuFL8EKX~ qPM&39v2_2yd|ub{L5rN;Q*Ixm;jND!T diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Variadic.c b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Variadic.c deleted file mode 100644 index 8ad38b1..0000000 --- a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Variadic.c +++ /dev/null @@ -1,303 +0,0 @@ -/* - * Copyright (c) 2008-2010 Wayne Meissner - * Copyright (C) 2009 Andrea Fazzi - * Copyright (c) 2008-2013, Ruby FFI project contributors - * 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 the Ruby FFI project 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 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. - */ - -#ifndef _MSC_VER -#include -#endif -#include - -#include -#include -#include -#include - -#include -#include "rbffi.h" -#include "compat.h" - -#include "AbstractMemory.h" -#include "Pointer.h" -#include "Types.h" -#include "Type.h" -#include "LastError.h" -#include "MethodHandle.h" -#include "Call.h" -#include "Thread.h" - -typedef struct VariadicInvoker_ { - VALUE rbAddress; - VALUE rbReturnType; - VALUE rbEnums; - - Type* returnType; - ffi_abi abi; - void* function; - int paramCount; - bool blocking; -} VariadicInvoker; - - -static VALUE variadic_allocate(VALUE klass); -static VALUE variadic_initialize(VALUE self, VALUE rbFunction, VALUE rbParameterTypes, - VALUE rbReturnType, VALUE options); -static void variadic_mark(VariadicInvoker *); - -static VALUE classVariadicInvoker = Qnil; - - -static VALUE -variadic_allocate(VALUE klass) -{ - VariadicInvoker *invoker; - VALUE obj = Data_Make_Struct(klass, VariadicInvoker, variadic_mark, -1, invoker); - - invoker->rbAddress = Qnil; - invoker->rbEnums = Qnil; - invoker->rbReturnType = Qnil; - invoker->blocking = false; - - return obj; -} - -static void -variadic_mark(VariadicInvoker *invoker) -{ - rb_gc_mark(invoker->rbEnums); - rb_gc_mark(invoker->rbAddress); - rb_gc_mark(invoker->rbReturnType); -} - -static VALUE -variadic_initialize(VALUE self, VALUE rbFunction, VALUE rbParameterTypes, VALUE rbReturnType, VALUE options) -{ - VariadicInvoker* invoker = NULL; - VALUE retval = Qnil; - VALUE convention = Qnil; - VALUE fixed = Qnil; -#if defined(X86_WIN32) - VALUE rbConventionStr; -#endif - int i; - - Check_Type(options, T_HASH); - convention = rb_hash_aref(options, ID2SYM(rb_intern("convention"))); - - Data_Get_Struct(self, VariadicInvoker, invoker); - invoker->rbEnums = rb_hash_aref(options, ID2SYM(rb_intern("enums"))); - invoker->rbAddress = rbFunction; - invoker->function = rbffi_AbstractMemory_Cast(rbFunction, rbffi_PointerClass)->address; - invoker->blocking = RTEST(rb_hash_aref(options, ID2SYM(rb_intern("blocking")))); - -#if defined(X86_WIN32) - rbConventionStr = rb_funcall2(convention, rb_intern("to_s"), 0, NULL); - invoker->abi = (RTEST(convention) && strcmp(StringValueCStr(rbConventionStr), "stdcall") == 0) - ? FFI_STDCALL : FFI_DEFAULT_ABI; -#else - invoker->abi = FFI_DEFAULT_ABI; -#endif - - invoker->rbReturnType = rbffi_Type_Lookup(rbReturnType); - if (!RTEST(invoker->rbReturnType)) { - VALUE typeName = rb_funcall2(rbReturnType, rb_intern("inspect"), 0, NULL); - rb_raise(rb_eTypeError, "Invalid return type (%s)", RSTRING_PTR(typeName)); - } - - Data_Get_Struct(rbReturnType, Type, invoker->returnType); - - invoker->paramCount = -1; - - fixed = rb_ary_new2(RARRAY_LEN(rbParameterTypes) - 1); - for (i = 0; i < RARRAY_LEN(rbParameterTypes); ++i) { - VALUE entry = rb_ary_entry(rbParameterTypes, i); - VALUE rbType = rbffi_Type_Lookup(entry); - Type* type; - - if (!RTEST(rbType)) { - VALUE typeName = rb_funcall2(entry, rb_intern("inspect"), 0, NULL); - rb_raise(rb_eTypeError, "Invalid parameter type (%s)", RSTRING_PTR(typeName)); - } - Data_Get_Struct(rbType, Type, type); - if (type->nativeType != NATIVE_VARARGS) { - rb_ary_push(fixed, entry); - } - } - /* - * @fixed and @type_map are used by the parameter mangling ruby code - */ - rb_iv_set(self, "@fixed", fixed); - rb_iv_set(self, "@type_map", rb_hash_aref(options, ID2SYM(rb_intern("type_map")))); - - return retval; -} - -static VALUE -variadic_invoke(VALUE self, VALUE parameterTypes, VALUE parameterValues) -{ - VariadicInvoker* invoker; - FFIStorage* params; - void* retval; - ffi_cif cif; - void** ffiValues; - ffi_type** ffiParamTypes; - ffi_type* ffiReturnType; - Type** paramTypes; - VALUE* argv; - VALUE* callbackParameters; - int paramCount = 0, fixedCount = 0, callbackCount = 0, i; - ffi_status ffiStatus; - rbffi_frame_t frame = { 0 }; - - Check_Type(parameterTypes, T_ARRAY); - Check_Type(parameterValues, T_ARRAY); - - Data_Get_Struct(self, VariadicInvoker, invoker); - paramCount = (int) RARRAY_LEN(parameterTypes); - paramTypes = ALLOCA_N(Type *, paramCount); - ffiParamTypes = ALLOCA_N(ffi_type *, paramCount); - params = ALLOCA_N(FFIStorage, paramCount); - ffiValues = ALLOCA_N(void*, paramCount); - argv = ALLOCA_N(VALUE, paramCount); - callbackParameters = ALLOCA_N(VALUE, paramCount); - retval = alloca(MAX(invoker->returnType->ffiType->size, FFI_SIZEOF_ARG)); - - for (i = 0; i < paramCount; ++i) { - VALUE rbType = rb_ary_entry(parameterTypes, i); - - if (!rb_obj_is_kind_of(rbType, rbffi_TypeClass)) { - rb_raise(rb_eTypeError, "wrong type. Expected (FFI::Type)"); - } - Data_Get_Struct(rbType, Type, paramTypes[i]); - - switch (paramTypes[i]->nativeType) { - case NATIVE_INT8: - case NATIVE_INT16: - case NATIVE_INT32: - rbType = rb_const_get(rbffi_TypeClass, rb_intern("INT32")); - Data_Get_Struct(rbType, Type, paramTypes[i]); - break; - case NATIVE_UINT8: - case NATIVE_UINT16: - case NATIVE_UINT32: - rbType = rb_const_get(rbffi_TypeClass, rb_intern("UINT32")); - Data_Get_Struct(rbType, Type, paramTypes[i]); - break; - - case NATIVE_FLOAT32: - rbType = rb_const_get(rbffi_TypeClass, rb_intern("DOUBLE")); - Data_Get_Struct(rbType, Type, paramTypes[i]); - break; - - case NATIVE_FUNCTION: - if (!rb_obj_is_kind_of(rbType, rbffi_FunctionTypeClass)) { - VALUE typeName = rb_funcall2(rbType, rb_intern("inspect"), 0, NULL); - rb_raise(rb_eTypeError, "Incorrect parameter type (%s)", RSTRING_PTR(typeName)); - } - callbackParameters[callbackCount++] = rbType; - break; - - default: - break; - } - - - ffiParamTypes[i] = paramTypes[i]->ffiType; - if (ffiParamTypes[i] == NULL) { - rb_raise(rb_eArgError, "Invalid parameter type #%x", paramTypes[i]->nativeType); - } - argv[i] = rb_ary_entry(parameterValues, i); - } - - ffiReturnType = invoker->returnType->ffiType; - if (ffiReturnType == NULL) { - rb_raise(rb_eArgError, "Invalid return type"); - } - - /*Get the number of fixed args from @fixed array*/ - fixedCount = RARRAY_LEN(rb_iv_get(self, "@fixed")); - -#ifdef HAVE_FFI_PREP_CIF_VAR - ffiStatus = ffi_prep_cif_var(&cif, invoker->abi, fixedCount, paramCount, ffiReturnType, ffiParamTypes); -#else - ffiStatus = ffi_prep_cif(&cif, invoker->abi, paramCount, ffiReturnType, ffiParamTypes); -#endif - switch (ffiStatus) { - case FFI_BAD_ABI: - rb_raise(rb_eArgError, "Invalid ABI specified"); - case FFI_BAD_TYPEDEF: - rb_raise(rb_eArgError, "Invalid argument type specified"); - case FFI_OK: - break; - default: - rb_raise(rb_eArgError, "Unknown FFI error"); - } - - rbffi_SetupCallParams(paramCount, argv, -1, paramTypes, params, - ffiValues, callbackParameters, callbackCount, invoker->rbEnums); - - rbffi_frame_push(&frame); - - if(unlikely(invoker->blocking)) { - rbffi_blocking_call_t* bc; - bc = ALLOCA_N(rbffi_blocking_call_t, 1); - bc->retval = retval; - bc->function = invoker->function; - bc->ffiValues = ffiValues; - bc->params = params; - bc->frame = &frame; - bc->cif = cif; - - rb_rescue2(rbffi_do_blocking_call, (VALUE) bc, rbffi_save_frame_exception, (VALUE) &frame, rb_eException, (VALUE) 0); - } else { - ffi_call(&cif, FFI_FN(invoker->function), retval, ffiValues); - } - - rbffi_frame_pop(&frame); - - rbffi_save_errno(); - - if (RTEST(frame.exc) && frame.exc != Qnil) { - rb_exc_raise(frame.exc); - } - - return rbffi_NativeValue_ToRuby(invoker->returnType, invoker->rbReturnType, retval); -} - - -void -rbffi_Variadic_Init(VALUE moduleFFI) -{ - classVariadicInvoker = rb_define_class_under(moduleFFI, "VariadicInvoker", rb_cObject); - rb_global_variable(&classVariadicInvoker); - - rb_define_alloc_func(classVariadicInvoker, variadic_allocate); - - rb_define_method(classVariadicInvoker, "initialize", variadic_initialize, 4); - rb_define_method(classVariadicInvoker, "invoke", variadic_invoke, 2); -} - diff --git a/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Variadic.o b/example/vendor/bundle/ruby/2.7.0/gems/ffi-1.15.5/ext/ffi_c/Variadic.o deleted file mode 100644 index 3f405350ed4095b1cbfd0963691af64840a75453..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26920 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

    D1$}KwM!C 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

    lN#wx2IG2=v(k2N^nB=@8etxtCEN;n#s*R` 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⋙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 SH7Uu@g9?GtnVyZf+P_vOCat=)(1m!7Gv znd+{o`gK=N+nTxIAI_J0NUKOF!6>XtAX z8sy$e(gX~ASWVjgkOR5rpL%`!l~iI*alf!2=Js`|ZIl_3)VxTvaDGL@P*~l={t(w= zt2>nd>Sp0(_Z4>_{me@&0B@#>3idrVy2;ek%pV--Nk0GLeFqHFxnC1m9BmqXNkwMY zsuAQ=Q6>KDvnL3;M0=q*TQ3>Sh#b!OP(?Ng)sXpdtZ&0QKoAfi@UJO3jqOb`%JSVGdYfn z9$q4LXocyD469&(5BS^18+9t<<n3k4iW#DKp(Jk1|o;FKVIxX zKu{jPf`dslg3~={`v)uvCeko`w?`86)7M;vvcQ=_OW&yonin)aaGGq#78b?>Ha`h; zv&1;o8o~a=Xi$@{1iAaI=Jn|${8Ij9mHNAO*T1WqK{a|-X{xf>@Z79UZ8_#1Dkj;H z`rB(vF#GVEdg!?l^R$RV~1;n9fvt#<~|Bo(1Yb=9Xx23 z7_ef-+|EVL1;7XP-hMgu)|RLuEf^u1Dp=!8W(znxPTC5lIJqFDhBXBj)r71QX$}Uu zYUT@TD*?yQwzBp0boGv5isaM_ZOM5LCSL+Tz71N1QWNFx9LqzwqFIVs(MF2ksUHUc zf9047l)^)3*sB&bWGkgUPOA!6vzF zRD7XVR#lfH=SDRv4@IUhswCxtqtNjtUt9hp$-0%butnZgnLSSEk}2r zoXxS2oXAlR9`mMv2(EgkNjul;Q0Uf|G(sc|0kFH zU;Mx7wsgmpO2y*NyQdZ2tD?vc61-*)izaU%tBg`kE|*Z!)hz`mph_lcg8e;{5k!wJ zjvqCSU(LApz^!B5F@N&#w&$H~dc|{JM)K76*_rilk7j2DwK#VIYIAQ7i<%9^M&P1w z+HF1UkKCk8$9iAJyRG=2j6U670ISsPce~zL)!+1AU*4CqTK!Horn6S-^t*j8N3N|E zzTcr*`CqYJpUitg{TF>uP3KaQ4gmyHRGhcofVRB9{x1vnmZ^C7@+w8EDywyRUz$K~ zysGQ-{)&yZ=O$A2$RfjWlUTQ?zjkLFJBPGX5|< zyOb&$x9TBavOw62DKb%!g}YL$5^CCTe4II8d~tAGDtTC;t*($)-dhUdPDS8aHvHZK zRkpr+&;SUb8e3F&CL1vBAeB7yc~?A{M@A10g%&i(>~%RfN$So*^PsA5kAe2<(7eqS21H_pza{1d6VM)h3T;u|#d(5y05p!KVQT7Q4>LDCr7sqOb zJB!WUH(BGg$(Sbt-HKm~*?c))<=pyYBt`H2<+=_ugYs|f%kX!CnN7)sT&?H z_W#DeVkPp*;|q3*YIK3^_YTIG0XKHkHVT5a)gs+c!0^k>7yi&ZYeIV)yDPtWB_s|v zLgFbX5EofKz0IBNwigp;TWvnS#xD(guWb*w!9wrZZ8?T&tU8e!ck2j>d^j?QVRfx-*NDhEN! z(ibq?Ir?@wtXW7gqJ~G z>v8Lh=R>L21C}+pq?%5{9g2@>*VsX?IMsBy3c&?>{|#DZ=hRv$+-_@#XiRIxif4gr zCdQuK#s3;tpMu=007!a2iv^2=NZc4i_3q1ba!#}CN&hOdg2qE|Vs{V(>*~~8if5s! zZ!XR~npcdG4_K$dJ_2rFo};Iu0z|?s`2&Mp05TFFV6X7}p-|&O7^Y=IZF`oJPbzE# z;6vRxfYPEAeLoi2_l97o&x}?SsB@}8)N3}LgLAH2cqrLDL>8=!D1Gt4`+)Rjh_!5L zw?_JI(HJ&1ZP96vTn@x#>StU;FT<#)9QI>vl@_S$BN#U4%0fSVzCk_S!HGL&71 zQqj4=02(GweuJI&U-7RS02s(^UFC;V%L@qiT%3Mf0ZX_2QakW>ZQg3ug|Di9`xZYw z;>8ENXy%y{3b2xUZk&7>Bo4+ARd%TfYXqh(@|Pywle}d|@k$9ryiF|gAwm#9`=}0D z;E;~I)=n~eg9vm4LFnU4J5pi|Xx^x?c&c#M4v)LDdZ1WV8elq0iLbgl{5D`WAI