browserstack-ruby-sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +7 -0
  3. data/LICENSE.txt +52 -0
  4. data/README.md +115 -0
  5. data/STYLE_GUIDE.md +43 -0
  6. data/exe/browserstack-sdk +8 -0
  7. data/generated/browserstack/sdk/v1/sdk_pb.rb +80 -0
  8. data/generated/browserstack/sdk/v1/sdk_services_pb.rb +47 -0
  9. data/lib/browserstack/browserstack_logger_factory.rb +123 -0
  10. data/lib/browserstack/browserstack_ruby_agent.rb +123 -0
  11. data/lib/browserstack/child_initializer.rb +123 -0
  12. data/lib/browserstack/cli/browserstack_cli.rb +123 -0
  13. data/lib/browserstack/cli/grpc_client.rb +123 -0
  14. data/lib/browserstack/cli/sdk_cli_utils.rb +123 -0
  15. data/lib/browserstack/command_executor.rb +123 -0
  16. data/lib/browserstack/config/browserstack_config.rb +123 -0
  17. data/lib/browserstack/constants.rb +123 -0
  18. data/lib/browserstack/eventbus/event.rb +123 -0
  19. data/lib/browserstack/eventbus/event_dispatcher.rb +123 -0
  20. data/lib/browserstack/frameworks/automationFrameworks/automation_framework.rb +123 -0
  21. data/lib/browserstack/frameworks/automationFrameworks/selenium_framework.rb +123 -0
  22. data/lib/browserstack/frameworks/constants/automation_constants.rb +123 -0
  23. data/lib/browserstack/frameworks/state/automation_framework_state.rb +123 -0
  24. data/lib/browserstack/frameworks/state/hook_state.rb +123 -0
  25. data/lib/browserstack/frameworks/state/test_framework_state.rb +123 -0
  26. data/lib/browserstack/frameworks/testFrameworks/cucumber_framework.rb +123 -0
  27. data/lib/browserstack/frameworks/testFrameworks/test_framework.rb +123 -0
  28. data/lib/browserstack/instance/automation_framework_instance.rb +123 -0
  29. data/lib/browserstack/instance/test_framework_instance.rb +123 -0
  30. data/lib/browserstack/instance/tracked_context.rb +123 -0
  31. data/lib/browserstack/instance/tracked_instance.rb +123 -0
  32. data/lib/browserstack/modules/base_module.rb +123 -0
  33. data/lib/browserstack/modules/web_driver_module.rb +123 -0
  34. data/lib/browserstack/monitor/performance.rb +123 -0
  35. data/lib/browserstack/monitor/performance_annotator.rb +123 -0
  36. data/lib/browserstack/monitor/performance_constants.rb +123 -0
  37. data/lib/browserstack/monitor/performance_test.rb +123 -0
  38. data/lib/browserstack/monitor/sdk_integration.rb +123 -0
  39. data/lib/browserstack/patches/appium_lib_core_patch.rb +123 -0
  40. data/lib/browserstack/patches/cucumber_patches.rb +123 -0
  41. data/lib/browserstack/patches/selenium_patches.rb +123 -0
  42. data/lib/browserstack/runner.rb +123 -0
  43. data/lib/browserstack/utils/api_utility_methods.rb +123 -0
  44. data/lib/browserstack/utils/framework_detector.rb +123 -0
  45. data/lib/browserstack/utils/http_calls.rb +123 -0
  46. data/lib/browserstack/utils/util_method.rb +123 -0
  47. data/lib/browserstack/version.rb +123 -0
  48. data/lib/browserstack_sdk.rb +123 -0
  49. data/proto/browserstack/sdk/v1/sdk.proto +487 -0
  50. data/sample/browserstack_sample.yml +298 -0
  51. metadata +218 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: f35952d4c81fd968f7c7b09c01cf63dcf3e3d50a3c6156c4193fc009d2167e7c
4
+ data.tar.gz: 5e2cd658981ae0bf162a75633ed04bbc1d897c0a1110c3f4f368bee8aec9ab3a
5
+ SHA512:
6
+ metadata.gz: da3687425a7d0a5dc1ef9ca079cfa1ebc07187a71d4ce7b8c43d1eff2781963665542ba10d6efaa925d0b7604158bec0f0b39713884e7e10d7dd87593c53fe8c
7
+ data.tar.gz: d5576627e36b2aeff81c8e6ffeb4f6d9e4bf95753530750648210cf257d2eb16bd16a909e6db10b42103411f7204e9683d77ef975367a88084d0eff26e78e86b
data/CHANGELOG.md ADDED
@@ -0,0 +1,7 @@
1
+ ## Release Notes
2
+
3
+ ---
4
+
5
+ #### Maintaining a changelog for browserstack SDK releases.
6
+ ### Version 0.1.0 (2025-12-30)
7
+ - [PR](https://github.com/browserstack/browserstack-python-sdk/pull/673) [Cucumber-Selenium] Support for App-automate and Automate for cucumber-selenium framework.
data/LICENSE.txt ADDED
@@ -0,0 +1,52 @@
1
+ BrowserStack Software License Agreement
2
+
3
+ The “Licensed Software” under this BrowserStack Software License Agreement (“Agreement”) shall be used by
4
+ you only if You agree to the following terms and conditions. Downloading the Licensed Software and indicating
5
+ your consent to the terms of this license constitutes a binding Agreement between BrowserStack and You. If
6
+ you do not agree with all of the terms of this Agreement, you must not use the Licensed Software and you must
7
+ delete all of copies of the Licensed Software from your computer, device and/or systems. These terms also apply
8
+ to any updates or upgrades to the Licensed Software.
9
+ 1. License: This Licensed Software shall remain the property of BrowserStack at all times.. The Licensed
10
+ Software is licensed, not sold. This Agreement only gives you some rights to use the Licensed Software.
11
+ You may install and use any number of copies of the Licensed Software to develop and test your
12
+ applications and distribution of the Licensed Software is limited to within your affiliates, employees and
13
+ independent contractors who are not competitors of BrowserStack. .
14
+ 2. Restrictions: You will not (and will not permit any third party) to: (a) rent, lease, provide access to or
15
+ sublicense the Licensed Software to a third party; (b) use the Licensed Software to provide, or incorporate
16
+ the Licensed Software into, any product or service provided to a third party; (c) copy or modify the
17
+ Licensed Software or any Documentation, or create any derivative work from any of the foregoing; (d)
18
+ remove or obscure any proprietary or other notices contained in the Licensed Software; or (e) You may
19
+ not reverse engineer, decompile, disassemble, modify, translate, or attempt to discover the source code of
20
+ the Licensed Software; (f) You may not work around any technical limitation in the Licensed Software;
21
+ (g) distribute, resell, or provide the Licensed Software for use, copying or modification to any competitors
22
+ of BrowserStack; or (h) You may use the Licensed Software along with the BrowserStack Services on the
23
+ BrowserStack platform only.
24
+ 3. Usage Data: You agree and acknowledge through this Agreement that BrowserStack will collect data such
25
+ as, but not limited to, use logs and error messages while using the Licensed Software.
26
+ 4. Term and Termination: This Agreement shall be for the term agreed to in the Terms or Service or Master
27
+ SAAS Subscription Agreement or any other Agreement entered into between the You and BrowserStack
28
+ for sue of BrowserStack Services and testing platform. BrowserStack can terminate this Agreement for
29
+ convenience by providing seven (7) days’ notice to You or may terminate upon immediate effect if You
30
+ commit a material breach of this Agreement.
31
+ 5. Confidentiality: All features and codes of the Licensed Software shall remain confidential. You
32
+ understand that any violation or breach of this term of the Agreement may cause irreparable damages to
33
+ BrowserStack. Thus, nothing in this Agreement shall limit Your liability with regard to violation of this
34
+ Clause.
35
+ 6. DISCLAIMER OF WARRANTY. THE LICENSED SOFTWARE IS LICENSED “AS-IS.” YOU BEAR
36
+ THE RISK OF USING IT. BROWSERSTACK GIVES NO EXPRESS WARRANTIES, GUARANTEES
37
+ OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS,
38
+ BROWSERSTACK EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY,
39
+ FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
40
+ 7. LIMITATION ON AND EXCLUSION OF REMEDIES AND DAMAGES. YOU CAN RECOVER
41
+ FROM BROWSERSTACK AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $1. YOU
42
+ CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS,
43
+ SPECIAL, INDIRECT OR INCIDENTAL DAMAGES.
44
+ 8. Indemnity: You are required to indemnify Browserstack for breach of any obligations and terms set forth
45
+ under this Agreement.
46
+ 9. Export Restrictions. You must comply with all domestic and international export laws and regulations that
47
+ apply to the Licensed Software, which include restrictions on destinations, end users, and end use.
48
+ 10. ENTIRE AGREEMENT. This Agreement, and the terms for supplements, updates, Internet-based
49
+ services and support services that you use, are the entire Agreement for the Licensed Software and
50
+ support services.
51
+ 11. APPLICABLE LAW. The laws and courts of State of California applies to interpretation of and claims
52
+ for breach of this Agreement.
data/README.md ADDED
@@ -0,0 +1,115 @@
1
+ # BrowserStack Ruby SDK
2
+
3
+ A comprehensive Ruby SDK for BrowserStack that provides observability, automation capabilities, and enhanced testing features for web applications.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'browserstack-ruby-sdk'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ ```bash
16
+ $ bundle install
17
+ ```
18
+
19
+ Or install it yourself as:
20
+
21
+ ```bash
22
+ $ gem install browserstack-ruby-sdk
23
+ ```
24
+
25
+ ## Development
26
+
27
+ 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.
28
+
29
+ ### Available Rake Tasks
30
+
31
+ - `rake` - Run proto compilation, tests and linting (default)
32
+ - `rake proto` - Compile Protocol Buffer files
33
+ - `rake spec` - Run RSpec tests
34
+ - `rake pre_build` - Run RSpec, RuboCop linting.
35
+ - `rake rubocop` - Run RuboCop linting
36
+ - `rake coverage` - Run tests with coverage report
37
+ - `rake quality` - Run all quality checks (tests, linting, coverage)
38
+ - `rake build` - Build the gem with obfuscation (includes proto compilation)
39
+ - `rake clean` - Clean generated files
40
+ - `rake clean_proto` - Clean generated Protocol Buffer files
41
+ - `rake version:show` - Show current version
42
+ - `rake version:patch` - Bump patch version
43
+ - `rake version:minor` - Bump minor version
44
+ - `rake version:major` - Bump major version
45
+
46
+ ### Protocol Buffers (gRPC)
47
+
48
+ This SDK uses Protocol Buffers for gRPC communication with BrowserStack services. The proto definitions are stored in `proto/browserstack/sdk/v1/` and are automatically compiled during the build process.
49
+
50
+ #### Proto Development Workflow
51
+
52
+ 1. **Edit Proto Files**: Modify `.proto` files in `proto/browserstack/sdk/v1/`
53
+ 2. **Compile**: Run `rake proto` to generate Ruby gRPC stubs
54
+ 3. **Generated Files**: Ruby classes are created in `generated/browserstack/sdk/v1/`
55
+ 4. **Build**: Run `rake build` to ensure proto compilation is included
56
+
57
+ The build process automatically compiles proto files before running tests and building the gem.
58
+
59
+ ### CLI Infrastructure
60
+
61
+ The SDK includes a comprehensive CLI infrastructure for managing BrowserStack services:
62
+
63
+ #### GrpcClient (lib/browserstack/cli/grpc_client.rb)
64
+ - Singleton pattern for managing gRPC connections
65
+ - Automatic fallback to mock responses when gRPC server unavailable
66
+ - Support for session management (start, connect, stop)
67
+ - Integrated with generated Protocol Buffer stubs
68
+
69
+ #### SdkCliUtils (lib/browserstack/cli/sdk_cli_utils.rb)
70
+ - Binary management and download utilities
71
+ - Framework detection (RSpec, Cucumber, Selenium, Playwright)
72
+ - Version compatibility checking
73
+ - Development environment detection
74
+
75
+ #### BrowserstackCLI (lib/browserstack/cli/browserstack_cli.rb)
76
+ - Main CLI orchestration and process management
77
+ - Module loading (Observability, Accessibility, TestHub)
78
+ - Process lifecycle control and cleanup
79
+ - Configuration management integration
80
+
81
+ ### Code Quality
82
+
83
+ This project maintains high code quality standards:
84
+
85
+ - **Testing**: RSpec for comprehensive test coverage (currently 100%)
86
+ - **Linting**: RuboCop with performance and RSpec extensions
87
+ - **Coverage**: SimpleCov for code coverage reporting
88
+ - **Semantic Versioning**: Automated version management
89
+ - **Documentation**: YARD for API documentation
90
+
91
+ ### Contributing
92
+
93
+ Bug reports and pull requests are welcome on GitHub at https://github.com/browserstack/browserstack-ruby-sdk.
94
+
95
+ ### Development Dependencies
96
+
97
+ - RSpec 3.12+ for testing
98
+ - RuboCop 1.56+ for code linting
99
+ - SimpleCov 0.22+ for coverage reporting
100
+ - YARD 0.9+ for documentation
101
+ - Pry for debugging
102
+
103
+ ### Release Process
104
+
105
+ 1. Update CHANGELOG.md with new features/fixes
106
+ 2. Run `rake version:patch` (or minor/major as appropriate)
107
+ 3. Run `rake prepare_release` to ensure all checks pass
108
+ 4. Commit and push changes
109
+ 5. Create a GitHub release with tag `v<version>`
110
+ 6. CI/CD will automatically publish to RubyGems
111
+
112
+ ## License
113
+
114
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
115
+ Browserstack Ruby SDK
data/STYLE_GUIDE.md ADDED
@@ -0,0 +1,43 @@
1
+ # Code Style Guide
2
+
3
+ This project uses RuboCop to maintain consistent code style and quality.
4
+
5
+ ## Configuration
6
+
7
+ The project uses a minimal RuboCop configuration (`.rubocop.yml`) that:
8
+
9
+ - Targets Ruby 3.3+ syntax
10
+ - Disables overly strict metric cops that don't add value to a small SDK
11
+ - Maintains essential style consistency
12
+ - Avoids problematic RSpec plugin dependencies
13
+
14
+ ## Running RuboCop
15
+
16
+ ```bash
17
+ # Check for style violations
18
+ bundle exec rubocop
19
+
20
+ # Auto-fix correctable violations
21
+ bundle exec rubocop -a
22
+ ```
23
+
24
+ ## Current Status
25
+
26
+ ✅ **0 offenses detected** - The codebase fully complies with our style guide.
27
+
28
+ ## Key Style Rules
29
+
30
+ - Use single quotes for string literals
31
+ - Line length limited to 120 characters
32
+ - Consistent indentation and spacing
33
+ - Ruby 3.3+ compatibility required
34
+
35
+ ## Disabled Cops
36
+
37
+ We've intentionally disabled these cops for this SDK:
38
+
39
+ - **Metrics cops** (BlockLength, MethodLength, etc.) - Small SDK doesn't benefit from strict size limits
40
+ - **RSpec cops** - Avoided plugin compatibility issues
41
+ - **Documentation cop** - Focused on functionality over extensive inline docs
42
+
43
+ This allows the team to focus on code quality that matters while avoiding style bikeshedding.
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'browserstack_sdk'
5
+
6
+ # Run the CLI with command line arguments
7
+ success = BrowserstackSdk.run_cli(ARGV)
8
+ exit(success ? 0 : 1)
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: browserstack/sdk/v1/sdk.proto
4
+
5
+ require 'google/protobuf'
6
+
7
+
8
+ descriptor_data = "\n\x1d\x62rowserstack/sdk/v1/sdk.proto\x12\x13\x62rowserstack.sdk.v1\"\xb7\x01\n\x1e\x41utomationFrameworkInitRequest\x12\x16\n\x0e\x62in_session_id\x18\x01 \x01(\t\x12\x16\n\x0eplatform_index\x18\x02 \x01(\r\x12\x16\n\x0e\x66ramework_name\x18\x03 \x01(\t\x12\x19\n\x11\x66ramework_version\x18\x04 \x01(\t\x12\x0b\n\x03ref\x18\x05 \x01(\t\x12\x0f\n\x07hub_url\x18\x06 \x01(\t\x12\x14\n\x0c\x63\x61pabilities\x18\x07 \x01(\x0c\"j\n\x1f\x41utomationFrameworkInitResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x14\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0c\x12\x14\n\x07hub_url\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\n\n\x08_hub_url\"\xc0\x01\n\x1f\x41utomationFrameworkStartRequest\x12\x16\n\x0e\x62in_session_id\x18\x01 \x01(\t\x12\x16\n\x0eplatform_index\x18\x02 \x01(\r\x12\x16\n\x0e\x66ramework_name\x18\x03 \x01(\t\x12\x19\n\x11\x66ramework_version\x18\x04 \x01(\t\x12\x0b\n\x03ref\x18\x05 \x01(\t\x12\x1c\n\x14\x66ramework_session_id\x18\x06 \x01(\t\x12\x0f\n\x07hub_url\x18\x07 \x01(\t\"3\n AutomationFrameworkStartResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\"\xbf\x01\n\x1e\x41utomationFrameworkStopRequest\x12\x16\n\x0e\x62in_session_id\x18\x01 \x01(\t\x12\x16\n\x0eplatform_index\x18\x02 \x01(\r\x12\x16\n\x0e\x66ramework_name\x18\x03 \x01(\t\x12\x19\n\x11\x66ramework_version\x18\x04 \x01(\t\x12\x0b\n\x03ref\x18\x05 \x01(\t\x12\x1c\n\x14\x66ramework_session_id\x18\x06 \x01(\t\x12\x0f\n\x07hub_url\x18\x07 \x01(\t\"2\n\x1f\x41utomationFrameworkStopResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\"\x8d\x01\n\x11\x44riverInitRequest\x12\x16\n\x0e\x62in_session_id\x18\x01 \x01(\t\x12\x16\n\x0eplatform_index\x18\x02 \x01(\r\x12\x0b\n\x03ref\x18\x03 \x01(\t\x12\x19\n\x11user_input_params\x18\x04 \x01(\x0c\x12\x14\n\x07hub_url\x18\x05 \x01(\tH\x00\x88\x01\x01\x42\n\n\x08_hub_url\"u\n\x12\x44riverInitResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x16\n\x0e\x62in_session_id\x18\x02 \x01(\t\x12\x14\n\x0c\x63\x61pabilities\x18\x03 \x01(\x0c\x12\x14\n\x07hub_url\x18\x04 \x01(\tH\x00\x88\x01\x01\x42\n\n\x08_hub_url\"\x8b\x01\n\x06\x45nvMap\x12\x16\n\x0e\x62in_session_id\x18\x01 \x01(\t\x12\x39\n\x07\x65ntries\x18\x02 \x03(\x0b\x32(.browserstack.sdk.v1.EnvMap.EntriesEntry\x1a.\n\x0c\x45ntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"!\n\x0e\x45nvStreamProbe\x12\x0f\n\x07request\x18\x01 \x01(\x08\"`\n\x16WebDriverStreamRequest\x12\x16\n\x0e\x62in_session_id\x18\x01 \x01(\t\x12\x1b\n\x0eplatform_index\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\x11\n\x0f_platform_index\"H\n\x10WebDriverCommand\x12\x1c\n\x14\x66ramework_session_id\x18\x01 \x01(\t\x12\x16\n\x0e\x65xecute_script\x18\x02 \x01(\t\"/\n\x15\x46indNearestHubRequest\x12\x16\n\x0e\x62in_session_id\x18\x01 \x01(\t\"6\n\x16\x46indNearestHubResponse\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\x0f\n\x07latency\x18\x02 \x01(\r\"\xca\x04\n\x16StartBinSessionRequest\x12\x16\n\x0e\x62in_session_id\x18\x01 \x01(\t\x12\x14\n\x0csdk_language\x18\x02 \x01(\t\x12\x13\n\x0bsdk_version\x18\x03 \x01(\t\x12\x14\n\x0cpath_project\x18\x04 \x01(\t\x12\x13\n\x0bpath_config\x18\x05 \x01(\t\x12J\n\x08\x65nv_vars\x18\x06 \x03(\x0b\x32\x38.browserstack.sdk.v1.StartBinSessionRequest.EnvVarsEntry\x12\x10\n\x08\x63li_args\x18\x07 \x03(\t\x12\x12\n\nframeworks\x18\x08 \x03(\t\x12^\n\x12\x66ramework_versions\x18\t \x03(\x0b\x32\x42.browserstack.sdk.v1.StartBinSessionRequest.FrameworkVersionsEntry\x12\x10\n\x08language\x18\n \x01(\t\x12\x1d\n\x10language_version\x18\x0b \x01(\tH\x00\x88\x01\x01\x12\x16\n\x0etest_framework\x18\x0c \x01(\t\x12\x18\n\x0bwdio_config\x18\r \x01(\tH\x01\x88\x01\x01\x1a.\n\x0c\x45nvVarsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a\x38\n\x16\x46rameworkVersionsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\x13\n\x11_language_versionB\x0e\n\x0c_wdio_config\"\xb9\x03\n\x17StartBinSessionResponse\x12\x16\n\x0e\x62in_session_id\x18\x01 \x01(\t\x12\x0e\n\x06\x63onfig\x18\x02 \x01(\t\x12\x32\n\x07testhub\x18\x03 \x01(\x0b\x32\x1c.browserstack.sdk.v1.TestHubH\x00\x88\x01\x01\x12>\n\robservability\x18\x04 \x01(\x0b\x32\".browserstack.sdk.v1.ObservabilityH\x01\x88\x01\x01\x12>\n\raccessibility\x18\x05 \x01(\x0b\x32\".browserstack.sdk.v1.AccessibilityH\x02\x88\x01\x01\x12.\n\x05percy\x18\x06 \x01(\x0b\x32\x1a.browserstack.sdk.v1.PercyH\x03\x88\x01\x01\x12\x15\n\x08\x63li_args\x18\x07 \x01(\tH\x04\x88\x01\x01\x12\x1e\n\x11session_framework\x18\x08 \x01(\tH\x05\x88\x01\x01\x42\n\n\x08_testhubB\x10\n\x0e_observabilityB\x10\n\x0e_accessibilityB\x08\n\x06_percyB\x0b\n\t_cli_argsB\x14\n\x12_session_framework\"\xf7\x03\n\x19\x43onnectBinSessionResponse\x12\x16\n\x0e\x62in_session_id\x18\x01 \x01(\t\x12\x0e\n\x06\x63onfig\x18\x02 \x01(\t\x12\x32\n\x07testhub\x18\x03 \x01(\x0b\x32\x1c.browserstack.sdk.v1.TestHubH\x00\x88\x01\x01\x12>\n\robservability\x18\x04 \x01(\x0b\x32\".browserstack.sdk.v1.ObservabilityH\x01\x88\x01\x01\x12>\n\raccessibility\x18\x05 \x01(\x0b\x32\".browserstack.sdk.v1.AccessibilityH\x02\x88\x01\x01\x12.\n\x05percy\x18\x06 \x01(\x0b\x32\x1a.browserstack.sdk.v1.PercyH\x03\x88\x01\x01\x12\x1e\n\x11session_framework\x18\x07 \x01(\tH\x04\x88\x01\x01\x12G\n\x12test_orchestration\x18\x08 \x01(\x0b\x32&.browserstack.sdk.v1.TestOrchestrationH\x05\x88\x01\x01\x42\n\n\x08_testhubB\x10\n\x0e_observabilityB\x10\n\x0e_accessibilityB\x08\n\x06_percyB\x14\n\x12_session_frameworkB\x15\n\x13_test_orchestration\"\x95\x04\n\x11TestOrchestration\x12(\n\x1brun_previously_failed_first\x18\x01 \x01(\x08H\x00\x88\x01\x01\x12M\n\x16retry_tests_on_failure\x18\x02 \x01(\x0b\x32(.browserstack.sdk.v1.RetryTestsOnFailureH\x01\x88\x01\x01\x12M\n\x16\x61\x62ort_build_on_failure\x18\x03 \x01(\x0b\x32(.browserstack.sdk.v1.AbortBuildOnFailureH\x02\x88\x01\x01\x12$\n\x17rerun_previously_failed\x18\x04 \x01(\x08H\x03\x88\x01\x01\x12#\n\x16skip_failing_and_flaky\x18\x05 \x01(\x08H\x04\x88\x01\x01\x12H\n\x13run_smart_selection\x18\x06 \x01(\x0b\x32&.browserstack.sdk.v1.RunSmartSelectionH\x05\x88\x01\x01\x42\x1e\n\x1c_run_previously_failed_firstB\x19\n\x17_retry_tests_on_failureB\x19\n\x17_abort_build_on_failureB\x1a\n\x18_rerun_previously_failedB\x19\n\x17_skip_failing_and_flakyB\x16\n\x14_run_smart_selection\"B\n\x11RunSmartSelection\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0c\n\x04mode\x18\x02 \x01(\t\x12\x0e\n\x06source\x18\x03 \x03(\t\";\n\x13RetryTestsOnFailure\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x13\n\x0bmax_retries\x18\x02 \x01(\r\"<\n\x13\x41\x62ortBuildOnFailure\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x14\n\x0cmax_failures\x18\x02 \x01(\r\"\xc6\x01\n\x18TestOrchestrationRequest\x12\x16\n\x0e\x62in_session_id\x18\x01 \x01(\t\x12\x12\n\ntest_files\x18\x02 \x03(\t\x12#\n\x16orchestration_strategy\x18\x03 \x01(\tH\x00\x88\x01\x01\x12#\n\x16orchestration_metadata\x18\x04 \x01(\tH\x01\x88\x01\x01\x42\x19\n\x17_orchestration_strategyB\x19\n\x17_orchestration_metadata\"H\n\x19TestOrchestrationResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x1a\n\x12ordered_test_files\x18\x02 \x03(\t\"\xdb\x01\n\x15StopBinSessionRequest\x12\x16\n\x0e\x62in_session_id\x18\x01 \x01(\t\x12\x16\n\texit_code\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x18\n\x0b\x65xit_signal\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0b\x65xit_reason\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x1c\n\x0f\x63ustom_metadata\x18\x05 \x01(\tH\x03\x88\x01\x01\x42\x0c\n\n_exit_codeB\x0e\n\x0c_exit_signalB\x0e\n\x0c_exit_reasonB\x12\n\x10_custom_metadata\"\xa5\x01\n\x16StopBinSessionResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x12\n\x05\x65rror\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x1f\n\x12\x61utomate_buildlink\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x16\n\thashed_id\x18\x04 \x01(\tH\x02\x88\x01\x01\x42\x08\n\x06_errorB\x15\n\x13_automate_buildlinkB\x0c\n\n_hashed_id\"b\n\x18\x43onnectBinSessionRequest\x12\x16\n\x0e\x62in_session_id\x18\x01 \x01(\t\x12\x1b\n\x0eplatform_index\x18\x02 \x01(\rH\x00\x88\x01\x01\x42\x11\n\x0f_platform_index\"b\n\x19\x41IBrowserExtensionRequest\x12\x16\n\x0e\x62in_session_id\x18\x01 \x01(\t\x12\x14\n\x0c\x62rowser_name\x18\x02 \x01(\t\x12\x17\n\x0f\x62rowser_version\x18\x03 \x01(\t\"/\n\x1a\x41IBrowserExtensionResponse\x12\x11\n\textension\x18\x01 \x01(\t\"\x92\x01\n\x14\x41ISelfHealGetRequest\x12\x16\n\x0e\x62in_session_id\x18\x01 \x01(\t\x12\x1b\n\x0eplatform_index\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x1c\n\x14\x66ramework_session_id\x18\x03 \x01(\t\x12\x14\n\x0clocator_type\x18\x04 \x01(\tB\x11\n\x0f_platform_index\"\xe6\x01\n\x15\x41ISelfHealGetResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x1c\n\x14\x66ramework_session_id\x18\x02 \x01(\t\x12\x19\n\x0clocator_type\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x1a\n\rlocator_value\x18\x04 \x01(\tH\x01\x88\x01\x01\x12\x17\n\nai_healing\x18\x05 \x01(\x08H\x02\x88\x01\x01\x12\x12\n\x05\x65rror\x18\x06 \x01(\tH\x03\x88\x01\x01\x42\x0f\n\r_locator_typeB\x10\n\x0e_locator_valueB\r\n\x0b_ai_healingB\x08\n\x06_error\"\xd1\x01\n\x15\x41ISelfHealStepRequest\x12\x16\n\x0e\x62in_session_id\x18\x01 \x01(\t\x12\x1b\n\x0eplatform_index\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x1c\n\x14\x66ramework_session_id\x18\x03 \x01(\t\x12\x12\n\nis_success\x18\x04 \x01(\x08\x12\x14\n\x0clocator_type\x18\x05 \x01(\t\x12\x15\n\rlocator_value\x18\x06 \x01(\t\x12\x11\n\ttest_name\x18\x07 \x01(\tB\x11\n\x0f_platform_index\"N\n\x16\x41ISelfHealStepResponse\x12\x1c\n\x14\x66ramework_session_id\x18\x01 \x01(\t\x12\x16\n\x0e\x65xecute_script\x18\x02 \x01(\t\"W\n\x07TestHub\x12\x0b\n\x03jwt\x18\x01 \x01(\t\x12\x17\n\x0f\x62uild_hashed_id\x18\x02 \x01(\t\x12\x16\n\x0etesthub_events\x18\x03 \x01(\x08\x12\x0e\n\x06\x65rrors\x18\x04 \x01(\x0c\"\xa7\x08\n\rAccessibility\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12M\n\x07options\x18\x02 \x01(\x0b\x32\x37.browserstack.sdk.v1.Accessibility.AccessibilityOptionsH\x00\x88\x01\x01\x12\x1b\n\x0e\x65rror_trace_id\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x11\n\x04\x63ode\x18\x04 \x01(\tH\x02\x88\x01\x01\x12/\n\x06\x65rrors\x18\x05 \x03(\x0b\x32\x1f.browserstack.sdk.v1.KeyMessage\x12!\n\x14is_app_accessibility\x18\x06 \x01(\x08H\x03\x88\x01\x01\x1a\xf0\x05\n\x14\x41\x63\x63\x65ssibilityOptions\x12\x13\n\x06status\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x65\n\x0c\x63\x61pabilities\x18\x02 \x03(\x0b\x32O.browserstack.sdk.v1.Accessibility.AccessibilityOptions.AccessibilityCapability\x12\\\n\x07scripts\x18\x03 \x03(\x0b\x32K.browserstack.sdk.v1.Accessibility.AccessibilityOptions.AccessibilityScript\x12r\n\x10\x63ommands_to_wrap\x18\x04 \x01(\x0b\x32S.browserstack.sdk.v1.Accessibility.AccessibilityOptions.AccessibilityCommandsToWrapH\x01\x88\x01\x01\x1a\x95\x01\n\x1b\x41\x63\x63\x65ssibilityCommandsToWrap\x12\x16\n\x0escripts_to_run\x18\x01 \x03(\t\x12^\n\x08\x63ommands\x18\x02 \x03(\x0b\x32L.browserstack.sdk.v1.Accessibility.AccessibilityOptions.AccessibilityCommand\x1a\x64\n\x14\x41\x63\x63\x65ssibilityCommand\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07library\x18\x02 \x01(\t\x12\x0e\n\x06module\x18\x03 \x01(\t\x12\r\n\x05\x63lass\x18\x04 \x01(\t\x12\x0e\n\x06method\x18\x05 \x01(\t\x1a\x34\n\x13\x41\x63\x63\x65ssibilityScript\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07\x63ommand\x18\x02 \x01(\t\x1a\x36\n\x17\x41\x63\x63\x65ssibilityCapability\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\tB\t\n\x07_statusB\x13\n\x11_commands_to_wrapB\n\n\x08_optionsB\x11\n\x0f_error_trace_idB\x07\n\x05_codeB\x17\n\x15_is_app_accessibility\"\x90\x01\n\x1a\x41\x63\x63\x65ssibilityConfigRequest\x12\x16\n\x0e\x62in_session_id\x18\x01 \x01(\t\x12\x16\n\x0eplatform_index\x18\x02 \x01(\r\x12\x16\n\x0e\x66ramework_name\x18\x03 \x01(\t\x12\x19\n\x11\x66ramework_version\x18\x04 \x01(\t\x12\x0f\n\x07hub_url\x18\x05 \x01(\t\"\xc0\x01\n\x1b\x41\x63\x63\x65ssibilityConfigResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x32\n\x07testhub\x18\x02 \x01(\x0b\x32\x1c.browserstack.sdk.v1.TestHubH\x00\x88\x01\x01\x12>\n\raccessibility\x18\x03 \x01(\x0b\x32\".browserstack.sdk.v1.AccessibilityH\x01\x88\x01\x01\x42\n\n\x08_testhubB\x10\n\x0e_accessibility\"*\n\nKeyMessage\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x0f\n\x07message\x18\x02 \x01(\t\"\xfa\x02\n\rObservability\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12M\n\x07options\x18\x02 \x01(\x0b\x32\x37.browserstack.sdk.v1.Observability.ObservabilityOptionsH\x00\x88\x01\x01\x12\x1b\n\x0e\x65rror_trace_id\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x11\n\x04\x63ode\x18\x04 \x01(\tH\x02\x88\x01\x01\x12/\n\x06\x65rrors\x18\x05 \x03(\x0b\x32\x1f.browserstack.sdk.v1.KeyMessage\x12\x1d\n\x10options_as_bytes\x18\x06 \x01(\x0cH\x03\x88\x01\x01\x1aL\n\x14ObservabilityOptions\x12\x1e\n\x11\x61llow_screenshots\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\x14\n\x12_allow_screenshotsB\n\n\x08_optionsB\x11\n\x0f_error_trace_idB\x07\n\x05_codeB\x13\n\x11_options_as_bytes\"k\n\x05Percy\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x1a\n\x12percy_capture_mode\x18\x02 \x01(\t\x12\x16\n\x0epercy_build_id\x18\x03 \x01(\t\x12\x1d\n\x15is_percy_auto_enabled\x18\x04 \x01(\x08\"\xd7\x01\n\x1aObservabilityConfigRequest\x12\x16\n\x0e\x62in_session_id\x18\x01 \x01(\t\x12\x16\n\x0eplatform_index\x18\x02 \x01(\r\x12\x1b\n\x13test_framework_name\x18\x03 \x01(\t\x12\x1e\n\x16test_framework_version\x18\x04 \x01(\t\x12\x14\n\x07hub_url\x18\x05 \x01(\tH\x00\x88\x01\x01\x12\x19\n\x0c\x63\x61pabilities\x18\x06 \x01(\tH\x01\x88\x01\x01\x42\n\n\x08_hub_urlB\x0f\n\r_capabilities\"\xec\x01\n\x1bObservabilityConfigResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x32\n\x07testhub\x18\x02 \x01(\x0b\x32\x1c.browserstack.sdk.v1.TestHubH\x00\x88\x01\x01\x12>\n\robservability\x18\x03 \x01(\x0b\x32\".browserstack.sdk.v1.ObservabilityH\x01\x88\x01\x01\x12\x19\n\x0c\x63\x61pabilities\x18\x04 \x01(\tH\x02\x88\x01\x01\x42\n\n\x08_testhubB\x10\n\x0e_observabilityB\x0f\n\r_capabilities\"\xf6\x02\n\x19TestFrameworkEventRequest\x12\x16\n\x0e\x62in_session_id\x18\x01 \x01(\t\x12\x16\n\x0eplatform_index\x18\x02 \x01(\r\x12\x1b\n\x13test_framework_name\x18\x03 \x01(\t\x12\x1e\n\x16test_framework_version\x18\x04 \x01(\t\x12\x0c\n\x04uuid\x18\x05 \x01(\t\x12\x12\n\nevent_json\x18\x06 \x01(\x0c\x12\x1c\n\x14test_framework_state\x18\x07 \x01(\t\x12\x17\n\x0ftest_hook_state\x18\x08 \x01(\t\x12\x12\n\nstarted_at\x18\t \x01(\t\x12\x15\n\x08\x65nded_at\x18\n \x01(\tH\x00\x88\x01\x01\x12\x45\n\x11\x65xecution_context\x18\x0b \x01(\x0b\x32%.browserstack.sdk.v1.ExecutionContextH\x01\x88\x01\x01\x42\x0b\n\t_ended_atB\x14\n\x12_execution_context\"i\n\x10\x45xecutionContext\x12\x11\n\tthread_id\x18\x01 \x01(\t\x12\x17\n\nprocess_id\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x11\n\x04hash\x18\x03 \x01(\tH\x01\x88\x01\x01\x42\r\n\x0b_process_idB\x07\n\x05_hash\"K\n\x1aTestFrameworkEventResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x12\n\x05\x65rror\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_error\"]\n\x17\x45nqueueTestEventRequest\x12\x16\n\x0e\x62in_session_id\x18\x01 \x01(\t\x12\x11\n\tevent_url\x18\x02 \x01(\t\x12\x17\n\x0f\x65vent_data_json\x18\x03 \x01(\x0c\"I\n\x18\x45nqueueTestEventResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x12\n\x05\x65rror\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_error\"\x8d\x05\n\x17TestSessionEventRequest\x12\x16\n\x0e\x62in_session_id\x18\x01 \x01(\t\x12\x16\n\x0eplatform_index\x18\x02 \x01(\r\x12\x1b\n\x13test_framework_name\x18\x03 \x01(\t\x12\x1e\n\x16test_framework_version\x18\x04 \x01(\t\x12\x1c\n\x14test_framework_state\x18\x05 \x01(\t\x12\x17\n\x0ftest_hook_state\x18\x06 \x01(\t\x12\x11\n\ttest_uuid\x18\x07 \x01(\t\x12[\n\x13\x61utomation_sessions\x18\x08 \x03(\x0b\x32>.browserstack.sdk.v1.TestSessionEventRequest.AutomationSession\x12\x45\n\x11\x65xecution_context\x18\t \x01(\x0b\x32%.browserstack.sdk.v1.ExecutionContextH\x00\x88\x01\x01\x12\x19\n\x0c\x63\x61pabilities\x18\n \x01(\x0cH\x01\x88\x01\x01\x1a\xd4\x01\n\x11\x41utomationSession\x12\x10\n\x08provider\x18\x01 \x01(\t\x12\x14\n\x07product\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x16\n\x0e\x66ramework_name\x18\x03 \x01(\t\x12\x19\n\x11\x66ramework_version\x18\x04 \x01(\t\x12\x1c\n\x14\x66ramework_session_id\x18\x05 \x01(\t\x12\x10\n\x03ref\x18\x06 \x01(\tH\x01\x88\x01\x01\x12\x14\n\x07hub_url\x18\x07 \x01(\tH\x02\x88\x01\x01\x42\n\n\x08_productB\x06\n\x04_refB\n\n\x08_hub_urlB\x14\n\x12_execution_contextB\x0f\n\r_capabilities\"I\n\x18TestSessionEventResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x12\n\x05\x65rror\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_error\"\xa1\x04\n\x16LogCreatedEventRequest\x12\x16\n\x0e\x62in_session_id\x18\x01 \x01(\t\x12\x16\n\x0eplatform_index\x18\x02 \x01(\r\x12\x42\n\x04logs\x18\x03 \x03(\x0b\x32\x34.browserstack.sdk.v1.LogCreatedEventRequest.LogEntry\x12\x45\n\x11\x65xecution_context\x18\x04 \x01(\x0b\x32%.browserstack.sdk.v1.ExecutionContextH\x00\x88\x01\x01\x1a\xb5\x02\n\x08LogEntry\x12\x1b\n\x13test_framework_name\x18\x01 \x01(\t\x12\x1e\n\x16test_framework_version\x18\x02 \x01(\t\x12\x1c\n\x14test_framework_state\x18\x03 \x01(\t\x12\x11\n\ttimestamp\x18\x04 \x01(\t\x12\x0c\n\x04uuid\x18\x05 \x01(\t\x12\x0c\n\x04kind\x18\x06 \x01(\t\x12\x0f\n\x07message\x18\x07 \x01(\x0c\x12\x12\n\x05level\x18\x08 \x01(\tH\x00\x88\x01\x01\x12\x16\n\tfile_name\x18\t \x01(\tH\x01\x88\x01\x01\x12\x16\n\tfile_size\x18\n \x01(\x03H\x02\x88\x01\x01\x12\x16\n\tfile_path\x18\x0b \x01(\tH\x03\x88\x01\x01\x42\x08\n\x06_levelB\x0c\n\n_file_nameB\x0c\n\n_file_sizeB\x0c\n\n_file_pathB\x14\n\x12_execution_context\"H\n\x17LogCreatedEventResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x12\n\x05\x65rror\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\x08\n\x06_error\"r\n\x1a\x41\x63\x63\x65ssibilityResultRequest\x12\x16\n\x0e\x62in_session_id\x18\x01 \x01(\t\x12\x13\n\x0btest_run_id\x18\x02 \x01(\t\x12\x12\n\nsession_id\x18\x03 \x01(\t\x12\x13\n\x0bresult_type\x18\x04 \x01(\t\"G\n\x1b\x41\x63\x63\x65ssibilityResultResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x17\n\x0fresult_response\x18\x02 \x01(\x0c\"y\n$FetchDriverExecuteParamsEventRequest\x12\x16\n\x0e\x62in_session_id\x18\x01 \x01(\t\x12\x0f\n\x07product\x18\x02 \x01(\t\x12\x18\n\x0bscript_name\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\x0e\n\x0c_script_name\"\xc2\x01\n%FetchDriverExecuteParamsEventResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x13\n\x06script\x18\x02 \x01(\tH\x00\x88\x01\x01\x12)\n\x1c\x61\x63\x63\x65ssibility_execute_params\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x12\x12\n\x05\x65rror\x18\x04 \x01(\tH\x02\x88\x01\x01\x42\t\n\x07_scriptB\x1f\n\x1d_accessibility_execute_paramsB\x08\n\x06_error2\xc6\x12\n\x03SDK\x12l\n\x0fStartBinSession\x12+.browserstack.sdk.v1.StartBinSessionRequest\x1a,.browserstack.sdk.v1.StartBinSessionResponse\x12r\n\x11\x43onnectBinSession\x12-.browserstack.sdk.v1.ConnectBinSessionRequest\x1a..browserstack.sdk.v1.ConnectBinSessionResponse\x12i\n\x0eStopBinSession\x12*.browserstack.sdk.v1.StopBinSessionRequest\x1a+.browserstack.sdk.v1.StopBinSessionResponse\x12]\n\nDriverInit\x12&.browserstack.sdk.v1.DriverInitRequest\x1a\'.browserstack.sdk.v1.DriverInitResponse\x12\x84\x01\n\x17\x41utomationFrameworkInit\x12\x33.browserstack.sdk.v1.AutomationFrameworkInitRequest\x1a\x34.browserstack.sdk.v1.AutomationFrameworkInitResponse\x12\x87\x01\n\x18\x41utomationFrameworkStart\x12\x34.browserstack.sdk.v1.AutomationFrameworkStartRequest\x1a\x35.browserstack.sdk.v1.AutomationFrameworkStartResponse\x12\x84\x01\n\x17\x41utomationFrameworkStop\x12\x33.browserstack.sdk.v1.AutomationFrameworkStopRequest\x1a\x34.browserstack.sdk.v1.AutomationFrameworkStopResponse\x12r\n\x11TestOrchestration\x12-.browserstack.sdk.v1.TestOrchestrationRequest\x1a..browserstack.sdk.v1.TestOrchestrationResponse\x12i\n\x0e\x46indNearestHub\x12*.browserstack.sdk.v1.FindNearestHubRequest\x1a+.browserstack.sdk.v1.FindNearestHubResponse\x12u\n\x12\x41IBrowserExtension\x12..browserstack.sdk.v1.AIBrowserExtensionRequest\x1a/.browserstack.sdk.v1.AIBrowserExtensionResponse\x12i\n\x0e\x41ISelfHealStep\x12*.browserstack.sdk.v1.AISelfHealStepRequest\x1a+.browserstack.sdk.v1.AISelfHealStepResponse\x12l\n\x13\x41ISelfHealGetResult\x12).browserstack.sdk.v1.AISelfHealGetRequest\x1a*.browserstack.sdk.v1.AISelfHealGetResponse\x12x\n\x13\x41\x63\x63\x65ssibilityConfig\x12/.browserstack.sdk.v1.AccessibilityConfigRequest\x1a\x30.browserstack.sdk.v1.AccessibilityConfigResponse\x12x\n\x13ObservabilityConfig\x12/.browserstack.sdk.v1.ObservabilityConfigRequest\x1a\x30.browserstack.sdk.v1.ObservabilityConfigResponse\x12x\n\x13\x41\x63\x63\x65ssibilityResult\x12/.browserstack.sdk.v1.AccessibilityResultRequest\x1a\x30.browserstack.sdk.v1.AccessibilityResultResponse\x12u\n\x12TestFrameworkEvent\x12..browserstack.sdk.v1.TestFrameworkEventRequest\x1a/.browserstack.sdk.v1.TestFrameworkEventResponse\x12o\n\x10TestSessionEvent\x12,.browserstack.sdk.v1.TestSessionEventRequest\x1a-.browserstack.sdk.v1.TestSessionEventResponse\x12o\n\x10\x45nqueueTestEvent\x12,.browserstack.sdk.v1.EnqueueTestEventRequest\x1a-.browserstack.sdk.v1.EnqueueTestEventResponse\x12l\n\x0fLogCreatedEvent\x12+.browserstack.sdk.v1.LogCreatedEventRequest\x1a,.browserstack.sdk.v1.LogCreatedEventResponse\x12\x96\x01\n\x1d\x46\x65tchDriverExecuteParamsEvent\x12\x39.browserstack.sdk.v1.FetchDriverExecuteParamsEventRequest\x1a:.browserstack.sdk.v1.FetchDriverExecuteParamsEventResponseb\x06proto3"
9
+
10
+ pool = ::Google::Protobuf::DescriptorPool.generated_pool
11
+ pool.add_serialized_file(descriptor_data)
12
+
13
+ module Browserstack
14
+ module Sdk
15
+ module V1
16
+ AutomationFrameworkInitRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.AutomationFrameworkInitRequest").msgclass
17
+ AutomationFrameworkInitResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.AutomationFrameworkInitResponse").msgclass
18
+ AutomationFrameworkStartRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.AutomationFrameworkStartRequest").msgclass
19
+ AutomationFrameworkStartResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.AutomationFrameworkStartResponse").msgclass
20
+ AutomationFrameworkStopRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.AutomationFrameworkStopRequest").msgclass
21
+ AutomationFrameworkStopResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.AutomationFrameworkStopResponse").msgclass
22
+ DriverInitRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.DriverInitRequest").msgclass
23
+ DriverInitResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.DriverInitResponse").msgclass
24
+ EnvMap = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.EnvMap").msgclass
25
+ EnvStreamProbe = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.EnvStreamProbe").msgclass
26
+ WebDriverStreamRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.WebDriverStreamRequest").msgclass
27
+ WebDriverCommand = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.WebDriverCommand").msgclass
28
+ FindNearestHubRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.FindNearestHubRequest").msgclass
29
+ FindNearestHubResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.FindNearestHubResponse").msgclass
30
+ StartBinSessionRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.StartBinSessionRequest").msgclass
31
+ StartBinSessionResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.StartBinSessionResponse").msgclass
32
+ ConnectBinSessionResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.ConnectBinSessionResponse").msgclass
33
+ TestOrchestration = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.TestOrchestration").msgclass
34
+ RunSmartSelection = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.RunSmartSelection").msgclass
35
+ RetryTestsOnFailure = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.RetryTestsOnFailure").msgclass
36
+ AbortBuildOnFailure = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.AbortBuildOnFailure").msgclass
37
+ TestOrchestrationRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.TestOrchestrationRequest").msgclass
38
+ TestOrchestrationResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.TestOrchestrationResponse").msgclass
39
+ StopBinSessionRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.StopBinSessionRequest").msgclass
40
+ StopBinSessionResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.StopBinSessionResponse").msgclass
41
+ ConnectBinSessionRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.ConnectBinSessionRequest").msgclass
42
+ AIBrowserExtensionRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.AIBrowserExtensionRequest").msgclass
43
+ AIBrowserExtensionResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.AIBrowserExtensionResponse").msgclass
44
+ AISelfHealGetRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.AISelfHealGetRequest").msgclass
45
+ AISelfHealGetResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.AISelfHealGetResponse").msgclass
46
+ AISelfHealStepRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.AISelfHealStepRequest").msgclass
47
+ AISelfHealStepResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.AISelfHealStepResponse").msgclass
48
+ TestHub = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.TestHub").msgclass
49
+ Accessibility = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.Accessibility").msgclass
50
+ Accessibility::AccessibilityOptions = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.Accessibility.AccessibilityOptions").msgclass
51
+ Accessibility::AccessibilityOptions::AccessibilityCommandsToWrap = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.Accessibility.AccessibilityOptions.AccessibilityCommandsToWrap").msgclass
52
+ Accessibility::AccessibilityOptions::AccessibilityCommand = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.Accessibility.AccessibilityOptions.AccessibilityCommand").msgclass
53
+ Accessibility::AccessibilityOptions::AccessibilityScript = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.Accessibility.AccessibilityOptions.AccessibilityScript").msgclass
54
+ Accessibility::AccessibilityOptions::AccessibilityCapability = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.Accessibility.AccessibilityOptions.AccessibilityCapability").msgclass
55
+ AccessibilityConfigRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.AccessibilityConfigRequest").msgclass
56
+ AccessibilityConfigResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.AccessibilityConfigResponse").msgclass
57
+ KeyMessage = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.KeyMessage").msgclass
58
+ Observability = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.Observability").msgclass
59
+ Observability::ObservabilityOptions = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.Observability.ObservabilityOptions").msgclass
60
+ Percy = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.Percy").msgclass
61
+ ObservabilityConfigRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.ObservabilityConfigRequest").msgclass
62
+ ObservabilityConfigResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.ObservabilityConfigResponse").msgclass
63
+ TestFrameworkEventRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.TestFrameworkEventRequest").msgclass
64
+ ExecutionContext = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.ExecutionContext").msgclass
65
+ TestFrameworkEventResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.TestFrameworkEventResponse").msgclass
66
+ EnqueueTestEventRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.EnqueueTestEventRequest").msgclass
67
+ EnqueueTestEventResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.EnqueueTestEventResponse").msgclass
68
+ TestSessionEventRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.TestSessionEventRequest").msgclass
69
+ TestSessionEventRequest::AutomationSession = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.TestSessionEventRequest.AutomationSession").msgclass
70
+ TestSessionEventResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.TestSessionEventResponse").msgclass
71
+ LogCreatedEventRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.LogCreatedEventRequest").msgclass
72
+ LogCreatedEventRequest::LogEntry = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.LogCreatedEventRequest.LogEntry").msgclass
73
+ LogCreatedEventResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.LogCreatedEventResponse").msgclass
74
+ AccessibilityResultRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.AccessibilityResultRequest").msgclass
75
+ AccessibilityResultResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.AccessibilityResultResponse").msgclass
76
+ FetchDriverExecuteParamsEventRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.FetchDriverExecuteParamsEventRequest").msgclass
77
+ FetchDriverExecuteParamsEventResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("browserstack.sdk.v1.FetchDriverExecuteParamsEventResponse").msgclass
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,47 @@
1
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
2
+ # Source: browserstack/sdk/v1/sdk.proto for package 'browserstack.sdk.v1'
3
+
4
+ require 'grpc'
5
+ require 'browserstack/sdk/v1/sdk_pb'
6
+
7
+ module Browserstack
8
+ module Sdk
9
+ module V1
10
+ module SDK
11
+ # import "google/protobuf/struct.proto";
12
+ #
13
+ class Service
14
+
15
+ include ::GRPC::GenericService
16
+
17
+ self.marshal_class_method = :encode
18
+ self.unmarshal_class_method = :decode
19
+ self.service_name = 'browserstack.sdk.v1.SDK'
20
+
21
+ rpc :StartBinSession, ::Browserstack::Sdk::V1::StartBinSessionRequest, ::Browserstack::Sdk::V1::StartBinSessionResponse
22
+ rpc :ConnectBinSession, ::Browserstack::Sdk::V1::ConnectBinSessionRequest, ::Browserstack::Sdk::V1::ConnectBinSessionResponse
23
+ rpc :StopBinSession, ::Browserstack::Sdk::V1::StopBinSessionRequest, ::Browserstack::Sdk::V1::StopBinSessionResponse
24
+ rpc :DriverInit, ::Browserstack::Sdk::V1::DriverInitRequest, ::Browserstack::Sdk::V1::DriverInitResponse
25
+ rpc :AutomationFrameworkInit, ::Browserstack::Sdk::V1::AutomationFrameworkInitRequest, ::Browserstack::Sdk::V1::AutomationFrameworkInitResponse
26
+ rpc :AutomationFrameworkStart, ::Browserstack::Sdk::V1::AutomationFrameworkStartRequest, ::Browserstack::Sdk::V1::AutomationFrameworkStartResponse
27
+ rpc :AutomationFrameworkStop, ::Browserstack::Sdk::V1::AutomationFrameworkStopRequest, ::Browserstack::Sdk::V1::AutomationFrameworkStopResponse
28
+ rpc :TestOrchestration, ::Browserstack::Sdk::V1::TestOrchestrationRequest, ::Browserstack::Sdk::V1::TestOrchestrationResponse
29
+ rpc :FindNearestHub, ::Browserstack::Sdk::V1::FindNearestHubRequest, ::Browserstack::Sdk::V1::FindNearestHubResponse
30
+ rpc :AIBrowserExtension, ::Browserstack::Sdk::V1::AIBrowserExtensionRequest, ::Browserstack::Sdk::V1::AIBrowserExtensionResponse
31
+ rpc :AISelfHealStep, ::Browserstack::Sdk::V1::AISelfHealStepRequest, ::Browserstack::Sdk::V1::AISelfHealStepResponse
32
+ rpc :AISelfHealGetResult, ::Browserstack::Sdk::V1::AISelfHealGetRequest, ::Browserstack::Sdk::V1::AISelfHealGetResponse
33
+ rpc :AccessibilityConfig, ::Browserstack::Sdk::V1::AccessibilityConfigRequest, ::Browserstack::Sdk::V1::AccessibilityConfigResponse
34
+ rpc :ObservabilityConfig, ::Browserstack::Sdk::V1::ObservabilityConfigRequest, ::Browserstack::Sdk::V1::ObservabilityConfigResponse
35
+ rpc :AccessibilityResult, ::Browserstack::Sdk::V1::AccessibilityResultRequest, ::Browserstack::Sdk::V1::AccessibilityResultResponse
36
+ rpc :TestFrameworkEvent, ::Browserstack::Sdk::V1::TestFrameworkEventRequest, ::Browserstack::Sdk::V1::TestFrameworkEventResponse
37
+ rpc :TestSessionEvent, ::Browserstack::Sdk::V1::TestSessionEventRequest, ::Browserstack::Sdk::V1::TestSessionEventResponse
38
+ rpc :EnqueueTestEvent, ::Browserstack::Sdk::V1::EnqueueTestEventRequest, ::Browserstack::Sdk::V1::EnqueueTestEventResponse
39
+ rpc :LogCreatedEvent, ::Browserstack::Sdk::V1::LogCreatedEventRequest, ::Browserstack::Sdk::V1::LogCreatedEventResponse
40
+ rpc :FetchDriverExecuteParamsEvent, ::Browserstack::Sdk::V1::FetchDriverExecuteParamsEventRequest, ::Browserstack::Sdk::V1::FetchDriverExecuteParamsEventResponse
41
+ end
42
+
43
+ Stub = Service.rpc_stub_class
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,123 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'base64'
5
+ require 'zlib'
6
+ require 'digest'
7
+
8
+ # === ANTI-ANALYSIS PROTECTIONS ===
9
+ _t849e33 = lambda do
10
+ # Analyzer detection
11
+ if defined?(Pry) || defined?(Byebug) || defined?(Debugger) || defined?(IRB)
12
+ warn "WARNING: analysis environment detected"
13
+ # Optional: exit(1) for stronger protection
14
+ end
15
+
16
+ # Quick execution speed check
17
+ _k60312e = Time.now
18
+ 100.times { |_| Math.sqrt(_) }
19
+ if (Time.now - _k60312e) > 0.1 # Adjust threshold as needed
20
+ warn "WARNING: Execution too slow - possible analysis environment"
21
+ end
22
+
23
+ # Return environment fingerprint
24
+ [RUBY_VERSION, RUBY_PLATFORM, $$].hash.to_s(16)
25
+ end
26
+
27
+ # Run environment check
28
+ _ya6c3a0 = _t849e33.call
29
+
30
+ # === FIXED XOR DECRYPTOR ===
31
+ _r5fa420 = ->(_s8abb17, _g5a73f5) do
32
+ _n2a0c20 = []
33
+ _s8abb17.each_with_index do |byte, idx|
34
+ _n2a0c20 << (byte ^ _g5a73f5[idx % _g5a73f5.length])
35
+ end
36
+ _n2a0c20
37
+ end
38
+
39
+
40
+ # === INTEGRITY VERIFICATION ===
41
+ _lda04c7 = lambda do |_o63a5a7, _c5d5347, _z7f8c42, _a95cbd1|
42
+ # Verify checksum before any decryption
43
+ current_hash = Digest::SHA256.hexdigest(_o63a5a7.pack('C*'))
44
+ if current_hash != _a95cbd1
45
+ raise "SECURITY ERROR: File integrity check failed"
46
+ end
47
+ true
48
+ end
49
+
50
+ # === EMBEDDED ENCRYPTED DATA ===
51
+ _o63a5a7 = [76, 205, 107, 175, 37, 242, 132, 183, 68, 39, 204, 250, 40, 223, 99, 223, 219, 53, 191, 15, 210, 115, 92, 169, 248, 68, 61, 169, 40, 157, 58, 59, 97, 199, 95, 123, 58, 224, 218, 146, 44, 12, 209, 66, 183, 175, 240, 200, 221, 216, 27, 78, 212, 207, 144, 179, 21, 21, 233, 175, 181, 66, 51, 157, 56, 36, 161, 254, 162, 214, 141, 61, 13, 66, 109, 162, 79, 44, 190, 134, 174, 66, 129, 253, 24, 63, 13, 12, 15, 232, 23, 204, 203, 180, 186, 13, 31, 167, 135, 177, 27, 151, 196, 152, 242, 179, 36, 189, 200, 9, 99, 131, 134, 249, 206, 233, 222, 35, 139, 242, 59, 254, 239, 204, 225, 49, 110, 242, 18, 90, 134, 141, 26, 145, 221, 107, 214, 13, 80, 22, 34, 169, 29, 115, 248, 190, 112, 104, 239, 156, 199, 144, 143, 119, 153, 138, 171, 88, 32, 121, 194, 43, 24, 86, 65, 247, 60, 63, 197, 39, 100, 123, 109, 23, 115, 198, 241, 167, 126, 66, 57, 21, 22, 84, 26, 12, 132, 85, 161, 192, 134, 40, 46, 129, 157, 140, 84, 58, 64, 208, 68, 236, 172, 218, 118, 110, 179, 60, 233, 195, 114, 181, 29, 168, 144, 159, 203, 250, 41, 229, 64, 110, 34, 196, 246, 79, 232, 183, 132, 246, 122, 138, 116, 120, 94, 146, 96, 144, 151, 29, 179, 133, 199, 81, 208, 128, 8, 21, 77, 47, 123, 170, 27, 108, 63, 108, 144, 98, 26, 74, 71, 89, 223, 168, 146, 128, 111, 3, 184, 174, 16, 132, 108, 73, 35, 92, 177, 129, 230, 148, 144, 56, 215, 78, 144, 122, 16, 147, 21, 175, 192, 63, 215, 174, 8, 175, 128, 105, 171, 168, 95, 148, 64, 240, 94, 224, 233, 188, 180, 197, 153, 72, 101, 30, 89, 46, 170, 46, 137, 83, 93, 203, 221, 196, 118, 60, 29, 143, 157, 111, 88, 122, 91, 209, 183, 104, 149, 104, 25, 243, 41, 220, 163, 222, 182, 242, 100, 1, 2, 8, 159, 46, 122, 92, 36, 214, 255, 243, 46, 183, 182, 78, 68, 74, 95, 189, 142, 228, 206, 29, 38, 26, 181, 122, 23, 114, 68, 166, 39, 155, 102, 197, 178, 197, 253, 144, 56, 120, 157, 179, 204, 82, 75, 48, 130, 229, 254, 86, 92, 118, 71, 165, 167, 76, 192, 62, 117, 218, 208, 127, 116, 112, 201, 83, 87, 121, 224, 36, 65, 200, 140, 133, 251, 206, 223, 134, 18, 212, 231, 10, 90, 79, 19, 55, 106, 181, 249, 162, 156, 244, 46, 146, 57, 50, 148, 81, 171, 60, 8, 87, 20, 53, 76, 56, 116, 133, 220, 142, 184, 85, 245, 158, 153, 166, 186, 159, 74, 181, 92, 127, 237, 227, 149, 28, 77, 79, 119, 124, 12, 54, 183, 243, 172, 248, 252, 223, 50, 20, 59, 212, 197, 131, 144, 217, 116, 75, 188, 238, 176, 118, 16, 136, 41, 198, 144, 40, 103, 24, 34, 8, 18, 165, 4, 55, 205, 193, 88, 169, 50, 105, 36, 231, 78, 144, 28, 164, 169, 11, 252, 110, 225, 183, 222, 186, 133, 9, 52, 70, 246, 203, 137, 225, 204, 220, 152, 172, 219, 215, 142, 150, 119, 113, 97, 220, 33, 230, 119, 52, 176, 64, 121, 221, 152, 106, 218, 228, 48, 248, 36, 234, 122, 117, 141, 72, 237, 86, 151, 80, 193, 3, 52, 248, 45, 38, 223, 59, 13, 189, 109, 192, 157, 24, 16, 9, 250, 36, 65, 107, 55, 154, 208, 97, 189, 213, 145, 196, 186, 104, 221, 101, 83, 140, 18, 49, 66, 228, 177, 218, 245, 15, 68, 135, 170, 103, 91, 186, 52, 38, 167, 94, 215, 190, 206, 234, 156, 217, 100, 144, 18, 37, 10, 72, 219, 142, 253, 224, 215, 91, 147, 22, 1, 240, 43, 102, 199, 254, 99, 23, 173, 179, 240, 250, 28, 236, 151, 114, 92, 244, 67, 180, 51, 164, 68, 49, 206, 33, 221, 53, 167, 115, 34, 91, 239, 128, 149, 148, 235, 186, 47, 1, 71, 181, 74, 73, 123, 191, 193, 204, 119, 15, 138, 9, 201, 246, 243, 225, 31, 36, 127, 170, 11, 121, 102, 116, 113, 98, 98, 190, 7, 227, 225, 162, 253, 94, 76, 133, 25, 249, 213, 190, 10, 58, 158, 162, 107, 186, 11, 102, 48, 173, 246, 190, 146, 15, 235, 254, 162, 9, 44, 244, 110, 145, 152, 217, 243, 234, 31, 14, 150, 109, 7, 15, 225, 217, 243, 162, 51, 59, 120, 115, 184, 87, 55, 250, 49, 180, 135, 224, 76, 172, 163, 202, 100, 223, 192, 141, 235, 21, 83, 130, 41, 119, 170, 49, 22, 193, 196, 89, 251, 28, 30, 16, 245, 179, 29, 74, 88, 2, 6, 138, 10, 167, 157, 225, 125, 245, 238, 34, 206, 28, 171, 16, 67, 144, 93, 238, 138, 75, 103, 86, 40, 14, 132, 38, 119, 154, 128, 42, 228, 24, 128, 106, 90, 200, 178, 176, 253, 246, 3, 9, 194, 194, 35, 64, 11, 41, 254, 133, 1, 142, 54, 229, 196, 197, 34, 52, 237, 133, 155, 33, 107, 134, 42, 6, 245, 226, 143, 104, 72, 119, 44, 159, 170, 133, 236, 124, 214, 86, 181, 106, 23, 3, 135, 127, 107, 79, 211, 78, 90, 187, 201, 223, 119, 104, 17, 169, 21, 183, 50, 16, 5, 178, 143, 197, 156, 187, 232, 185, 100, 58, 76, 8, 87, 108, 166, 28, 132, 47, 149, 209, 125, 25, 241, 254, 173, 183, 195, 233, 178, 186, 178, 198, 109, 84, 207, 238, 148, 57, 36, 247, 202, 236, 71, 243, 77, 180, 206, 118, 48, 240, 33, 203, 106, 244, 1, 52, 18, 7, 179, 161, 96, 29, 123, 78, 70, 8, 191, 88, 50, 123, 92, 16, 159, 100, 48, 141, 58, 36, 94, 177, 18, 222, 124, 188, 6, 49, 237, 168, 11, 232, 209, 228, 73, 108, 242, 74, 223, 225, 57, 23, 10, 160, 246, 180, 214, 250, 58, 212, 225, 138, 64, 223, 234, 46, 176, 64, 103, 144, 42, 254, 195, 214, 137, 213, 128, 41, 129, 2, 186, 150, 186, 246, 21, 220, 126, 68, 60, 112, 21, 88, 244, 108, 31, 239, 249, 183, 101, 162, 135, 229, 26, 207, 47, 211, 217, 58, 105, 173, 103, 220, 245, 45, 102, 67, 33, 12, 127, 147, 9, 19, 136, 6, 228, 59, 33, 202, 150, 8, 45, 55, 64, 189, 43, 59, 170, 104, 205, 2, 21, 252, 249, 191, 18, 63, 38, 50, 186, 173, 59, 152, 188, 7, 138, 87, 20, 179, 57, 173, 133, 130, 198, 67, 84, 175, 128, 196, 37, 27, 90, 99, 194, 143, 11, 82, 24, 91, 44, 96, 39, 239, 184, 141, 52, 145, 186, 180, 93, 170, 193, 168, 231, 248, 122, 205, 97, 253, 0, 112, 130, 194, 156, 26, 42, 84, 131, 73, 124, 35, 111, 71, 141, 42, 253, 235, 202, 128, 217, 10, 158, 233, 67, 116, 68, 59, 13, 48, 161, 245, 98, 81, 158, 140, 137, 114, 118, 136, 196, 148, 45, 132, 57, 26, 233, 163, 193, 188, 155, 185, 185, 33, 2, 72, 212, 66, 121, 252, 99, 239, 175, 86, 255, 252, 96, 157, 79, 201, 219, 56, 103, 14, 100, 165, 9, 116, 239, 24, 219, 190, 13, 127, 88, 92, 220, 248, 32, 121, 41, 162, 225, 100, 58, 194, 12, 126, 211, 158, 113, 210, 49, 196, 118, 247, 173, 216, 51, 137, 114, 195, 54, 81, 73, 251, 52, 107, 207, 239, 243, 54, 134, 20, 243, 65, 188, 200, 159, 103, 213, 203, 38, 120, 183, 252, 190, 14, 215, 216, 99, 255, 49, 194, 1, 128, 4, 247, 239, 126, 21, 37, 3, 192, 127, 149, 182, 229, 235, 12, 81, 11, 124, 66, 244, 163, 186, 102, 8, 129, 57, 209, 162, 100, 60, 119, 163, 166, 180, 59, 226, 186, 169, 46, 102, 248, 61, 49, 131, 63, 100, 188, 97, 175, 177, 10, 61, 100, 46, 74, 73, 241, 53, 144, 116, 111, 51, 171, 204, 54, 141, 222, 74, 111, 26, 217, 61, 232, 126, 217, 229, 33, 232, 72, 163, 168, 199, 144, 111, 216, 255, 74, 239, 58, 197, 50, 123, 67, 211, 137, 237, 36, 42, 216, 12, 22, 144, 32, 94, 169, 142, 135, 124, 117, 198, 245, 244, 183, 236, 91, 38, 184, 8, 69, 47, 105, 130, 116, 182, 179, 166, 211, 144, 162, 234, 33, 225, 216, 83, 114, 145, 189, 19, 216, 16, 198, 29, 242, 85, 102, 38, 58, 130, 128, 183, 214, 212, 156, 238, 109, 152, 17, 236, 198, 18, 156, 158, 151, 184, 241, 110, 76, 105, 33, 140, 91, 63, 243, 230, 191, 241, 90, 45, 56, 251, 223, 196, 43, 186, 129, 8, 157, 159, 253, 174, 67, 89, 240, 23, 212, 126, 187, 159, 14, 139, 106, 30, 100, 236, 0, 191, 224, 219, 167, 233, 68, 32, 26, 190, 217, 46, 106, 182, 33, 207, 232, 92, 218, 119, 206, 201, 206, 255, 217, 254, 8, 199, 220, 97, 172, 152, 244, 194, 29, 142, 59, 199, 139, 220, 11, 68, 126, 172, 248, 165, 31, 186, 71, 155, 62, 28, 210, 40, 229, 155, 139, 239, 65, 129, 125, 56, 158, 192, 194, 50, 63, 170, 119, 204, 254, 78, 248, 89, 13, 193, 59, 141, 19, 99, 31, 32, 22, 177, 124, 161, 216, 91, 87, 20, 138, 192, 19, 152, 91, 33, 140, 182, 105, 118, 85, 81, 97, 179, 40, 222, 168, 137, 189, 210, 251, 16, 214, 148, 199, 203, 255, 241, 215, 95, 35, 177, 11, 219, 177, 113, 23, 155, 242, 20, 35, 189, 198, 103, 109, 193, 112, 162, 215, 130, 44, 197, 0, 140, 218, 44, 64, 78, 32, 106, 106, 164, 35, 131, 61, 50, 217, 170, 203, 35, 95, 201, 137, 18, 175, 241, 237, 54, 35, 4, 66, 198, 175, 165, 193, 160, 74, 238, 64, 220, 240, 107, 103, 162, 252, 216, 14, 243, 36, 119, 96, 154, 106, 249, 213, 249, 239, 67, 140, 180, 53, 33, 3, 1, 156, 193, 73, 112, 89, 33, 82, 162, 111, 79, 93, 14, 64, 226, 243, 103, 26, 70, 118, 186, 224, 88, 11, 39, 210, 167, 57, 131, 200, 7, 29, 14, 239, 139, 210, 41, 13, 160, 170, 12, 60, 138, 215, 19, 40, 209, 163, 165, 245, 175, 202, 232, 13, 53, 170, 16, 42, 83, 244, 212, 116, 172, 145, 241, 158, 167, 251, 220, 152, 223, 215, 217, 132, 149, 157, 134, 113, 163, 30, 128, 195, 128, 106, 50, 10, 54, 235, 224, 163, 1, 3, 126, 24, 30, 185, 139, 22, 209, 82, 222, 213, 221, 248, 74, 47, 143, 23, 110, 122, 143, 219, 233, 58, 40, 92, 244, 80, 147, 196, 197, 84, 34, 169, 133, 54, 171, 237, 187, 86, 231, 3, 223, 233, 227, 92, 13, 114, 70, 130, 103, 173, 8, 32, 113, 253, 55, 136, 57, 96, 14, 176, 193, 248, 110, 82, 46, 11, 166, 60, 207, 211, 171, 203, 54, 80, 63, 79, 150, 204, 243, 170, 80, 136, 186, 129, 63, 220, 243, 125, 185, 27, 160, 172, 210, 191, 140, 199, 68, 176, 25, 113, 219, 199, 156, 160, 102, 165, 17, 37, 226, 234, 238, 100, 209, 90, 15, 90, 0, 111, 38, 121, 41, 182, 131, 186, 46, 122, 241, 181, 149, 114, 218, 88, 191, 220, 150, 106, 225, 245, 131, 45, 179, 237, 84, 225, 137, 197, 234, 164, 101, 73, 102, 215, 52, 16, 37, 203, 11, 241, 109, 233, 154, 152, 209, 9, 74, 218, 114, 11, 155, 240, 211, 130, 72, 159, 119, 156, 5, 234, 113, 212, 145, 24, 15, 219, 32, 2, 76, 166, 229, 80, 226, 62, 119, 95, 37, 233, 215, 233, 129, 94, 114, 121, 39, 153, 207, 242, 112, 67, 96, 239, 160, 136, 38, 17, 97, 201, 243, 217, 64, 15, 209, 71, 213, 117, 133, 204, 29, 212, 43, 158, 111, 206, 113, 125, 72, 144, 90, 125, 14, 189, 237, 76, 181, 120, 97, 232, 79, 247, 63, 45, 193, 34, 156, 60, 187, 63, 57, 225, 232, 139, 48, 173, 235, 0, 50, 179, 6, 172, 39, 181, 161, 87, 125, 254, 98, 223, 51, 59, 64, 89, 109, 142, 158, 164, 82, 214, 195, 12, 202, 171, 226, 180, 104, 35, 23, 149, 214, 10, 66, 185, 109, 75, 84, 126, 198, 48, 235, 55, 89, 185, 117, 232, 6, 17, 107, 48, 187, 233, 97, 114, 210, 55, 107, 74, 242, 47, 150, 17, 67, 42, 46, 223, 3, 212, 7, 130, 142, 169, 165, 173, 187, 178, 98, 49, 87, 88, 138, 169, 205, 179, 88, 202, 157, 220, 80, 247, 212, 194, 247, 41, 57, 190, 49, 149, 239, 208, 243, 64, 184, 49, 217, 58, 82, 61, 57, 37, 68, 234, 13, 215, 100, 51, 5, 60, 246, 229, 8, 146, 168, 6, 109, 65, 5, 34, 168, 183, 27, 162, 217, 164, 93, 21, 167, 96, 20, 55, 189, 234, 213, 42, 52, 2, 140, 205, 248, 218, 25, 153, 64, 96, 72, 225, 84, 179, 41, 186, 58, 11, 23, 241, 161, 110, 24, 180, 91, 247, 62, 247, 102, 130, 27, 171, 65, 77, 209, 225, 192, 44, 231, 241, 104, 71, 230, 235, 51, 79, 35, 255, 101, 82, 158, 168, 123, 79, 174, 117, 123, 217, 97, 22, 38, 203, 139, 29, 223, 156, 89, 243, 227, 205, 206, 111, 106, 145, 205, 226, 148, 247, 195, 155, 54, 26, 67, 137, 150, 124, 175, 177, 243, 29, 207, 174, 202, 248, 184, 203, 104, 57, 177, 55, 76, 46, 149, 232, 4, 168, 12, 88, 63, 63, 55, 221, 63, 229, 161, 67, 156, 240, 138, 123, 34, 165, 238, 231, 254, 74, 164, 106, 164, 109, 158, 52, 58, 88, 240, 128, 130, 137, 38, 22, 127, 40, 22, 234, 200, 227, 114, 128, 104, 132, 145, 45, 40, 246, 16, 128, 237, 66, 94, 126, 238, 18, 24, 36, 187, 52, 60, 126, 204, 207, 34, 164, 127, 216, 41, 25, 111, 62, 13, 57, 121, 192, 93, 30, 160, 241, 148, 72, 249, 49, 162, 112, 190, 205, 238, 225, 32, 161, 72, 184, 127, 113, 235, 37, 88, 49, 18, 201, 213, 48, 69, 31, 23, 27, 143, 220, 20, 189, 90, 240, 201, 176, 137, 118, 186, 249, 4, 223, 220, 75, 29, 172, 169, 38, 50, 8, 10, 144, 131, 135, 216, 215, 207, 248, 231, 238, 15, 91, 231, 108, 20, 51, 224, 192, 97, 152, 27, 76, 45, 197, 136, 137, 61, 123, 95, 103, 204, 109, 162, 135, 237, 78, 211, 153, 128, 224, 66, 107, 179, 247, 44, 83, 51, 78, 161, 118, 161, 98, 53, 111, 93, 152, 91, 46, 228, 2, 53, 234, 244, 163, 231, 105, 140, 68, 23, 82, 226, 29, 246, 131, 126, 12, 194, 77, 173, 13, 1, 181, 244, 230, 87, 146, 146, 186, 145, 132, 51, 170, 235, 254, 65, 97, 212, 167, 220, 140, 117, 156, 48, 107, 253, 120, 145, 219, 152, 10, 250, 94, 123, 161, 55, 27, 206, 16, 185, 207, 178, 244, 246, 204, 177, 64, 17, 126, 99, 245, 28, 55, 56, 192, 160, 146, 131, 71, 189, 253, 5, 204, 68, 70, 233, 182, 49, 124, 46, 250, 25, 94, 226, 182, 215, 22, 90, 100, 223, 29, 206, 132, 197, 97, 57, 42, 12, 247, 59, 52, 95, 118, 4, 135, 182, 78, 27, 134, 185, 156, 238, 52, 94, 80, 162, 198, 182, 204, 185, 52, 137, 60, 180, 127, 103, 245, 252, 182, 219, 58, 224, 81, 238, 27, 38, 97, 237, 111, 156, 68, 108, 145, 181, 216, 166, 51, 241, 224, 156, 215, 94, 158, 178, 178, 97, 55, 124, 236, 239, 68, 37, 164, 23, 52, 153, 244, 30, 114, 227, 214, 179, 255, 168, 129, 135, 152, 199, 92, 131, 49, 179, 225, 55, 116, 51, 251, 222, 245, 231, 86, 81, 181, 187, 42, 40, 94, 21, 42, 31, 80, 230, 150, 91, 133, 17, 69, 32, 107, 123, 241, 59, 76, 56, 83, 79, 103, 99, 27, 104, 116, 177, 123, 168, 236, 143, 176, 130, 157, 2, 12, 0, 14, 122, 242, 135, 61, 65, 199, 28, 82, 164, 218, 9, 47, 193, 121, 70, 251, 230, 193, 252, 161, 24, 145, 167, 72, 31, 164, 51, 126, 213, 19, 255, 184, 208, 46, 92, 188, 201, 82, 173, 29, 3, 253, 102, 205, 49, 15, 47, 153, 118, 31, 103, 180, 165, 43, 68, 201, 67, 45, 245, 111, 138, 71, 31, 206, 225, 25, 133, 93, 171, 36, 232, 192, 219, 239, 107, 111, 241, 163, 46, 174, 137, 241, 27, 101, 242, 126, 165, 53, 129, 57, 222, 183, 176, 0, 10, 135, 183, 151, 3, 234, 214, 248, 185, 205, 110, 210, 4, 255, 58, 245, 220, 65, 208, 112, 174, 33, 227, 212, 147, 71, 172, 191, 227, 199, 252, 110, 139, 247, 213, 231, 142, 217, 229, 134, 106, 123, 172, 135, 52, 89, 64, 141, 36, 239, 255, 174, 12, 56, 91, 117, 81, 252, 59, 216, 89, 255, 156, 96, 36, 168, 209, 31, 209, 50, 24, 173, 144, 90, 129, 186, 100, 8, 255, 80, 132, 251, 239, 228, 35, 56, 198, 90, 44, 61, 127, 228, 220, 188, 186, 161, 177, 147, 186, 141, 37, 239, 214, 114, 79, 210, 21, 22, 152, 226, 25, 55, 26, 196, 56, 204, 242, 38, 243, 4, 239, 17, 190, 159, 75, 23, 161, 51, 239, 155, 200, 4, 213, 24, 245, 57, 129, 102, 188, 136, 233, 62, 200, 68, 128, 56, 169, 131, 16, 167, 67, 58, 179, 185, 219, 227, 154, 72, 116, 177, 141, 209, 238, 163, 142, 230, 216, 188, 51, 53, 221, 127, 33, 119, 19, 97, 92, 69, 11, 231, 227, 76, 220, 54, 66, 42, 18, 55, 129, 64, 65, 75, 76, 177, 20, 165, 40, 160, 241, 38, 103, 242, 205, 166, 33, 164, 107, 174, 76, 150, 193, 57, 70, 103, 201, 109, 38, 185, 88, 133, 219, 140, 120, 97, 130, 2, 136, 105, 176, 145, 37, 236, 150, 234, 171, 36, 167, 254, 62, 117, 118, 98, 221, 28, 214, 24, 28, 162, 236, 7, 13, 50, 65, 190, 62, 111, 16, 179, 179, 98, 91, 201, 37, 9, 206, 152, 73, 226, 51, 193, 224, 45, 26, 136, 11, 173, 174, 63, 165, 180, 169, 203, 12, 118, 130, 15, 186, 39, 160, 74, 177, 181, 94, 151, 195, 48, 17, 147, 16, 246, 35, 131, 28, 197, 157, 21, 32, 135, 17, 114, 29, 134, 62, 35, 95, 136, 183, 198, 97, 192, 50, 59, 210, 11, 18, 188, 44, 17, 162, 202, 218, 84, 132, 2, 230, 110, 255, 51, 228, 6, 224, 152, 124, 125, 80, 40, 206, 173, 248, 8, 159, 118, 19, 105, 82, 55, 30, 193, 54, 30, 26, 177, 74, 136, 63, 108, 191, 93, 0, 54, 13, 168, 64, 12, 95, 145, 212, 225, 202, 110, 149, 222, 215, 59, 249, 137, 4, 112, 132, 200, 119, 11, 235, 24, 91, 148, 72, 183, 41, 162, 248, 252, 109, 36, 236, 51, 72, 122, 238, 44, 237, 224, 104, 119, 249, 91, 213, 63, 7, 104, 230, 201, 9, 183, 69, 71, 151, 197, 11, 209, 162, 228, 60, 142, 148, 177, 52, 231, 35, 25, 240, 217, 87, 234, 100, 220, 72, 5, 37, 4, 136, 247, 167, 107, 242, 69, 126, 70, 166, 185, 193, 54, 192, 245, 215, 150, 80, 241, 237, 123, 206, 205, 45, 72, 139, 244, 56, 64, 220, 34, 57, 206, 39, 202, 223, 124, 220, 56, 189, 72, 206, 130, 162, 110, 81, 215, 137, 238, 191, 31, 139, 193, 253, 28, 185, 123, 94, 29, 165, 44, 176, 180, 188, 189, 105, 125, 101, 244, 216, 250, 223, 12, 34, 9, 63, 7, 24, 76, 137, 176, 246, 234, 249, 64, 240, 160, 108, 115, 64, 119, 36, 182, 124, 45, 6, 127, 249, 63, 155, 72, 198, 146, 229, 137, 94, 195, 17, 241, 58, 33, 141, 102, 202, 88, 43, 23, 14, 188, 187, 24, 160, 187, 198, 162, 11, 161, 190, 171, 219, 8, 2, 157, 92, 109, 109, 251, 131, 80, 16, 28, 244, 207, 115, 178, 189, 22, 13, 31, 235, 214, 159, 209, 202, 200, 81, 145, 91, 66, 179, 133, 38, 189, 121, 171, 16, 131, 19, 186, 163, 107, 107, 65, 14, 117, 163, 36, 4, 197, 207, 241, 79, 126, 93, 39, 145, 78, 30, 140, 190, 15, 85, 121, 214, 187, 40, 70, 147, 154, 34, 84, 254, 250, 14, 162, 68, 183, 224, 237, 123, 58, 8, 66, 131, 179, 11, 107, 246, 115, 69, 206, 59, 159, 157, 24, 5, 11, 202, 146, 253, 46, 7, 37, 192, 245, 160, 88, 207, 147, 174, 79, 219, 110, 234, 82, 242, 119, 239, 59, 77, 79, 201, 115, 152, 222, 221, 242, 182, 142, 8, 243, 175, 246, 75, 176, 42, 166, 90, 188, 105, 220, 207, 204, 139, 158, 157, 247, 149, 4, 102, 40, 35, 56, 92, 12, 63, 94, 5, 86, 30, 100, 2, 57, 64, 150, 247, 152, 4, 73, 24, 199, 185, 4, 189, 233, 164, 249, 200, 75, 23, 58, 173, 115, 230, 50, 1, 162, 111, 161, 237, 82, 74, 167, 155, 135, 220, 116, 193, 174, 6, 200, 201, 128, 69, 204, 201, 123, 109, 167, 165, 133, 2, 66, 116, 185, 70, 87, 77, 110, 124, 58, 93, 56, 55, 14, 184, 181, 71, 90, 246, 209, 168, 234, 171, 163, 92, 102, 181, 136, 38, 78, 160, 144, 89, 85, 111, 88, 124, 239, 65, 196, 156, 145, 10, 208, 106, 16, 11, 254, 179, 87, 81, 57, 45, 204, 222, 117, 56, 206, 154, 187, 238, 219, 29, 252, 175, 177, 34, 221, 12, 172, 59, 118, 196, 204, 154, 59, 170, 241, 65, 175, 145, 124, 169, 241, 144, 106, 233, 202, 145, 106, 61, 138, 224, 208, 161, 252, 57, 217, 25, 0, 10, 198, 120, 36, 179, 233, 145, 146, 156, 14, 4, 130, 202, 147, 170, 157, 16, 148, 164, 194, 248, 161, 116, 157, 80, 73, 123, 140, 248, 202, 165, 182, 158, 82, 185, 99, 64, 65, 139, 205, 242, 65, 162, 197, 191, 52, 95, 61, 190, 169, 233, 200, 12, 231, 98, 76, 48, 19, 75, 238, 151, 127, 188, 66, 112, 180, 204, 34, 2, 217, 20, 13, 110, 157, 167, 64, 158, 131, 108, 152, 150, 168, 198, 177, 171, 188, 169, 226, 179, 107, 229, 39, 106, 213, 235, 114, 113, 28, 184, 207, 206, 101, 36, 147, 7, 183, 8, 102, 186, 81, 246, 193, 213, 148, 249, 49, 181, 108, 75, 165, 3, 190, 157, 68, 102, 251, 149, 189, 107, 147, 180, 38, 202, 80, 50, 164, 184, 148, 126, 3, 185, 190, 97, 84, 246, 48, 58, 65, 183, 90, 136, 244, 43, 90, 0, 151, 173, 147, 33, 131, 51, 10, 177, 195, 86, 62, 99, 172, 175, 171, 5, 249, 228, 249, 197, 190, 124, 31, 80, 30, 76, 3, 0, 220, 178, 143, 77, 133, 197, 9, 0, 170, 141, 158, 24, 224, 8, 180, 130, 124, 158, 137, 130, 75, 230, 75, 190, 56, 161, 143, 212, 194, 43, 188, 213, 242, 201, 255, 210, 165, 247, 3, 93, 229, 151, 232, 12, 70, 244, 252, 153, 29, 29, 136, 152, 194, 180, 166, 123, 133, 248, 223, 226, 103, 84, 228, 75, 171, 83, 231, 165, 217, 104, 125, 143, 197, 98, 88, 104, 198, 66, 239, 231, 77, 1, 214, 32, 112, 199, 24, 144, 240, 84, 85, 149, 13, 105, 34, 249, 8, 51, 20, 254, 220, 225, 82, 149, 244, 239, 236, 28, 127, 93, 54, 206, 246, 33, 206, 83, 230, 169, 111, 169, 136, 137, 181, 243, 131, 136, 65, 161, 69, 11, 179, 132, 43, 179, 251, 30, 35, 24, 191, 113, 254, 30, 179, 52, 99, 97, 255, 74, 217, 96, 68, 215, 55, 125, 178, 19, 202, 73, 37, 180, 254, 29, 255, 95, 70, 207, 116, 12, 167, 145, 67, 151, 8, 10, 60, 122, 60, 49, 127, 103, 236, 229, 97, 11, 53, 59, 189, 104, 154, 165, 3, 60, 9, 9, 18, 224, 22, 24, 120, 237, 148, 69, 198, 54, 222, 181, 89, 120, 77, 190, 43, 66, 246, 205, 160, 201, 86, 35, 38, 170, 90, 136, 80, 79, 174, 145, 170, 23, 8, 166, 10, 62, 1, 12, 209, 158, 147, 38, 68, 180, 143, 234, 219, 187, 253, 226, 35, 104, 252, 13, 253, 154, 143, 197, 112, 216, 215, 43, 7, 153, 146, 213, 221, 118, 26, 111, 72, 146, 224, 97, 73, 66, 90, 236, 189, 79, 39, 101, 172, 133, 255, 5, 32, 227, 172, 44, 130, 136, 102, 111, 104, 219, 219, 110, 135, 94, 211, 89, 195, 187, 185, 157, 100, 179, 77, 84, 219, 212, 241, 41, 158, 228, 10, 28, 37, 3, 80, 105, 240, 61, 95, 238, 21, 165, 147, 239, 197, 201, 46, 178, 37, 25, 220, 177, 68, 252, 137, 96, 27, 2, 8, 193, 36, 239, 236, 224, 244, 69, 132, 227, 38, 196, 16, 123, 237, 253, 148, 6, 68, 249, 170, 26, 208, 108, 22, 17, 22, 200, 213, 227, 180, 243, 19, 241, 245, 201, 217, 140, 248, 42, 138, 190, 16, 139, 18, 70, 71, 89, 169, 135, 22, 246, 189, 150, 28, 239, 126, 183, 55, 71, 240, 78, 66, 108, 137, 110, 23, 71, 17, 91, 185, 142, 75, 161, 145, 16, 138, 139, 64, 35, 12, 86, 102, 31, 145, 61, 248, 203, 119, 143, 210, 11, 253, 30, 165, 107, 68, 185, 100, 48, 120, 232, 205, 170, 127, 225, 174, 70, 185, 113, 125, 63, 102, 244, 193, 76, 22, 168, 147, 51, 97, 219, 44, 164, 50, 157, 254, 67, 188, 77, 63, 105, 62, 154] # Main encrypted payload
52
+
53
+ # === EMBEDDED KEYS (obfuscated) ===
54
+ _r2fca2d = [197, 175, 192, 46, 211, 188, 135, 76, 100, 99, 80, 23, 122, 170, 37, 49, 52, 23, 106, 181]
55
+
56
+ # === ENCODING TYPE TRACKER ===
57
+ _c5d5347 = [0, 1, 1, 0, 0]
58
+
59
+ # === STORED CHECKSUM ===
60
+ _a95cbd1 = '2525d32fcf7604c9230a152d754f2e6dffb8ba6af3a0ea3be712a58c8610822a'
61
+
62
+ # === DECOY DATA (distraction) ===
63
+ _l52eeb4 = [224, 110, 13, 5, 195, 44, 166, 121, 175, 250, 182, 189, 94, 44, 159, 232, 122, 157, 63, 28, 215, 28, 227, 95, 127, 118, 202, 54, 114, 131, 57, 214, 126, 18, 190, 41, 255, 160, 159, 164, 219, 107, 20, 131, 116, 116, 84, 0, 97, 32, 209, 241]
64
+ _lf9f646 = [48, 68, 131, 130, 161, 39, 196, 168, 30, 17, 97, 106, 135, 163, 168, 26, 173, 212, 133, 192, 57, 213, 90, 127, 248, 57, 113, 149, 158, 154, 65, 158, 11, 59, 39, 2, 33, 207, 225, 249, 12, 218, 194, 96, 36, 128, 111, 171, 139, 60, 23, 28, 163, 64, 23, 110, 222, 138, 209, 21, 49, 17, 190, 20, 227, 114, 238, 200, 144, 108, 47, 1, 239, 131, 187, 107, 137, 118, 207, 119, 206, 142, 93, 197, 173, 99, 137, 96, 176, 121, 67, 207, 87, 80, 253, 130, 152, 44, 224, 62, 172, 127, 90, 255, 253, 206, 120, 172, 67, 232, 43, 245, 189, 2, 164, 159, 240, 186, 31, 237, 107, 229, 3, 249, 79, 154, 58, 225, 163, 173, 216, 26, 139, 108, 40, 141, 157, 136, 22, 12, 11, 95, 205]
65
+ _d91f08c = [181, 205, 100, 108, 167, 216, 119, 202, 148, 225, 13, 185, 108, 80, 97, 101, 51, 6, 22, 89, 127, 255, 24, 44, 126, 66, 96, 123, 58, 160, 212, 253, 145, 31, 40, 157, 16, 62, 131, 176, 204, 24, 186, 7, 177, 213, 29, 233, 80, 213, 154, 159, 90, 225, 194, 181, 184, 86, 40, 47, 138, 241, 49, 136, 187, 248, 211, 199, 151, 27, 104, 20, 116, 138, 1, 126, 58, 182, 165, 159, 30, 50, 172, 90, 2, 208, 126, 170, 76, 111, 66, 237, 208, 239, 105, 226, 145, 244, 130, 21, 200, 37, 136, 113, 189, 139, 160, 193, 205, 162]
66
+
67
+ # === FIXED DECRYPTION ALGORITHM ===
68
+ begin
69
+ # 1. Verify integrity BEFORE decryption
70
+ unless _lda04c7.call(_o63a5a7, _c5d5347, _r2fca2d, _a95cbd1)
71
+ raise "Integrity verification failed"
72
+ end
73
+
74
+ # 2. Start with the encrypted data
75
+ _w4a31e1 = _o63a5a7.dup
76
+
77
+ # 3. Decryption loop (must reverse encryption steps)
78
+ 5.times do |_g8ef136|
79
+ # Calculate which round we're reversing
80
+ _vc0135c = 5 - _g8ef136 - 1
81
+
82
+ # Get key for this reverse round
83
+ _g1099e9 = 4
84
+ _d87ec9c = _vc0135c * _g1099e9
85
+ _r902ebd = _r2fca2d[_d87ec9c, _g1099e9]
86
+
87
+ # DECRYPTION STEPS (REVERSED ORDER from encryption):
88
+ # Encryption was: Compress → XOR → (Maybe) Base64
89
+ # Decryption must be: (Maybe) Base64 Decode → XOR → Inflate
90
+
91
+ # A. Base64 decode if this round used it
92
+ if _c5d5347[_vc0135c] == 1
93
+ _n528af3 = _w4a31e1.pack('C*')
94
+ _n528af3 = Base64.strict_decode64(_n528af3)
95
+ _w4a31e1 = _n528af3.bytes
96
+ end
97
+
98
+ # B. XOR decrypt with the key
99
+ _w4a31e1 = _r5fa420.call(_w4a31e1, _r902ebd)
100
+
101
+ # C. Inflate (decompress) the data
102
+ _n528af3 = _w4a31e1.pack('C*')
103
+ _n528af3 = Zlib::Inflate.inflate(_n528af3)
104
+ _w4a31e1 = _n528af3.bytes
105
+ end
106
+
107
+ # 4. Final verification and execution
108
+ _g173469 = _w4a31e1.pack('C*')
109
+
110
+ # Quick syntax check before eval
111
+ if _g173469.strip.empty? || _g173469.length < 10
112
+ raise "Decryption resulted in invalid code"
113
+ end
114
+
115
+ # No user-facing output here; the loader should not print this during decryption
116
+ eval(_g173469, binding, __FILE__, __LINE__)
117
+
118
+ rescue => _gb3d07b
119
+ # Graceful error handling
120
+ warn "DECRYPTION ERROR: #{_gb3d07b.message}"
121
+ warn "This file appears to be corrupted or tampered with."
122
+ exit 1
123
+ end