Files
2026-07-28 01:06:53 +03:00

1180 lines
64 KiB
TypeScript

/* Metro module 12402; source: lib/VoiceQuality.tsx; dependencies: [57, 6, 7, 15, 17, 18, 7131, 4303, 22, 12403, 7137, 4406, 4479, 2] */
import ClassCallCheck from '../by-id/module-00006-ClassCallCheck.js'; /* Metro dependency 6 */
import CreateClass from '../by-id/module-00007-CreateClass.js'; /* Metro dependency 7 */
import PossibleConstructorReturn from '../by-id/module-00015-PossibleConstructorReturn.js'; /* Metro dependency 15 */
import Module00017 from '../by-id/module-00017.js'; /* Metro dependency 17 */
import Inherits from '../by-id/module-00018-Inherits.js'; /* Metro dependency 18 */
import Module00022 from '../by-id/module-00022.js'; /* Metro dependency 22 */
import Module00057 from '../by-id/module-00057.js'; /* Metro dependency 57 */
import TypedEventEmitter from '../external/discord_common/js/shared/utils/TypedEventEmitter.tsx'; /* Metro dependency 4479 */
import SystemResources from './SystemResources.tsx'; /* Metro dependency 7137 */
import NetworkQuality from './NetworkQuality.tsx'; /* Metro dependency 12403 */
import * as FileImportTrackerModule from '../by-id/module-00002-FileImportTracker.js'; /* Metro dependency 2 */
import * as HistogramModule from './Histogram.tsx'; /* Metro dependency 7131 */
function _fun94518(global, require, importDefault, importAll, module, exports, dependencyMap) { // fn#94518, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12588:6, offset: 0x0211af88, size: 272 bytes, params: 8, frame: 19
const env0_0 = require;
const handleCounter = function(a0, a1) {
var r0;
r0 = a1 ?? ({'accumulated': 0, 'lastValue': 0});
var accumulated = r0.accumulated;
var lastValue = r0.lastValue;
return {accumulated: lastValue > a0 ? accumulated + a0 : accumulated + (a0 - lastValue), lastValue: a0};
};
const Object = global.Object;
Object.defineProperty(exports, '__esModule', {value: true});
let value = TypedEventEmitter;
value = _fun94524(value);
(FileImportTrackerModule).fileFinishedImporting('lib/VoiceQuality.tsx');
exports.default = value;
exports.VoiceQualityEvent = {InputDeviceSampleRateChanged: 'input-device-sample-rate-changed'};
function _isNativeReflectConstruct_94519() { // fn#94519, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12588:172, offset: 0x0211b098, size: 98 bytes, params: 1, frame: 18
var Boolean;
var prototype;
var valueOf;
var call;
var Reflect;
var construct;
var closure;
var value;
var error;
try {
Boolean = global.Boolean;
prototype = Boolean.prototype;
valueOf = prototype.valueOf;
call = valueOf.call;
Reflect = global.Reflect;
construct = Reflect.construct;
Boolean = global.Boolean;
closure = function() {
};
value = Reflect.apply(construct, Reflect, [Boolean, [], closure]);
value = Reflect.apply(call, valueOf, [value]);
var result = !value;
} catch (error) {
}
return (_isNativeReflectConstruct_94519_isNativeReflectConstruct = function() {
return !!result;
})();
}
function explodePlayoutMetrics(a0) { // fn#94522, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12588:365, offset: 0x0211b0fa, size: 425 bytes, params: 2, frame: 35
var r17;
var mean;
var p75;
var p95;
var p99;
var max;
var propertyName;
var propertyName2;
var property;
var Histogram;
var value2;
var value3;
var value4;
var value5;
var value6;
var value7;
var report;
var value9;
var Math;
var round;
var value10;
var percentiles;
var value11;
var value12;
var value13;
const object = {};
for (propertyName in a0) {
property = a0[propertyName];
Histogram = (require(7131) /* metro dependency 7131: Histogram */).Histogram;
if (property instanceof Histogram) {
report = property.getReport([75, 95, 99]);
value9 = propertyName + '_mean';
Math = global.Math;
round = Math.round;
mean = report.mean;
object[value9] = Reflect.apply(round, Math, [mean]);
value10 = propertyName + '_p75';
Math = global.Math;
round = Math.round;
percentiles = report.percentiles;
object[value10] = Reflect.apply(round, Math, [percentiles[75]]);
value11 = propertyName + '_p95';
Math = global.Math;
round = Math.round;
percentiles = report.percentiles;
object[value11] = Reflect.apply(round, Math, [percentiles[95]]);
value12 = propertyName + '_p99';
Math = global.Math;
round = Math.round;
percentiles = report.percentiles;
object[value12] = Reflect.apply(round, Math, [percentiles[99]]);
value13 = propertyName + '_max';
Math = global.Math;
round = Math.round;
max = report.max;
object[value13] = Reflect.apply(round, Math, [max]);
r17 = propertyName2;
} else {
value2 = propertyName + '_mean';
value3 = 0;
if (property == null) {
mean = value3;
continue;
}
mean = property.mean;
object[value2] = mean;
value4 = propertyName + '_p75';
if (property == null) {
p75 = value3;
continue;
}
p75 = property.p75;
object[value4] = p75;
value5 = propertyName + '_p95';
if (property == null) {
p95 = value3;
continue;
}
p95 = property.p95;
object[value5] = p95;
value6 = propertyName + '_p99';
if (property == null) {
p99 = value3;
continue;
}
p99 = property.p99;
object[value6] = p99;
value7 = propertyName + '_max';
if (property == null) {
max = value3;
continue;
}
max = property.max;
object[value7] = max;
r17 = propertyName2;
}
}
return object;
}
function _fun94524(a0) { // fn#94524, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12588:944, offset: 0x0211b2e9, size: 494 bytes, params: 2, frame: 16
const VoiceQuality2 = VoiceQuality;
Inherits(VoiceQuality2, a0);
return CreateClass(VoiceQuality2, [{key: 'start', value: function() {
var connection = this.connection;
var Stats = require(dependencyMap[11]).BaseConnectionEvent.Stats;
connection.on(Stats, this.sampleStats);
}}, {key: 'stop', value: function() {
var connection = this.connection;
var Stats = require(dependencyMap[11]).BaseConnectionEvent.Stats;
connection.off(Stats, this.sampleStats);
}}, {key: 'getMosStats', value: value_94536}, {key: 'getPacketStats', value: value_94538}, {key: 'getBytesStats',
value: value_94540}, {key: 'getNetworkStats', value: function() {
return this.networkQuality.getStats();
}}, {key: 'getSystemResourceStats', value: function() {
return this.systemResources.getStats();
}}, {key: 'getBufferStats', value: value_94544}, {key: 'getFrameOpStats', value: value_94546},
{key: 'getDurationStats', value: function() {
return {duration_listening: this.duration.listening, duration_speaking: this.duration.speaking,
duration_participation: this.duration.participation, duration_connected: this.duration.connected};
}}, {key: 'getTransportStats', value: function() {
return {decryption_failures: this.decryptionFailures, routing_failures: this.routingFailures};
}}, {key: 'getE2EEStats', value: value_94550}, {key: 'getAudioDeviceStats', value: value_94552},
{key: 'getAudioLevelStats', value: value_94553}, {key: 'getPeriodicStats', value: value_94554},
{key: 'calculateMos', value: function(a0, a1) {
var r1;
var r0;
var value4;
var value5;
var value6;
var value = this.calculateR(a0, a1);
var value2 = 1;
if (value < 0) {
r0 = value2;
} else {
if (value > 100) {
r1 = 4.5;
} else {
value4 = 0.035 * value;
value5 = 0.0000071 * value;
value6 = value - 60;
value = 100 - value;
value = value2 + value4 + value5 * value6 * value;
r1 = value;
}
r0 = r1;
}
return r0;
}}, {key: 'calculateR', value: function(a0, a1) {
var r1;
var value = 0.024 * a0;
r1 = a0 > 177.3 ? 0.11 * (a0 - 177.3) : 0;
var value4 = 122 * a1;
var value5 = a1 + 10;
value = 93.4 - (value + r1);
return value - (10 + value4 / value5);
}}]);
function VoiceQuality(a0) { // fn#94525, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12588:956, offset: 0x0211b4d7, size: 365 bytes, params: 2, frame: 21
var environment;
const value = environment.__proto__;
env1_4(this, VoiceQuality);
const value3 = env1_7(VoiceQuality);
const value6 = env1_6(this, _isNativeReflectConstruct_94519() ? global.Reflect.construct(value3, [],
env1_7(this).constructor) : value3.apply(this, undefined));
value6.connection = a0;
value6.sampleAudioDevice = sampleAudioDevice;
value6.appendTargetRates = appendTargetRates;
value6.sampleStats = sampleStats;
const defaultImport = NetworkQuality;
const value7 = Object.create(defaultImport.prototype, {constructor: {value: defaultImport}});
const defaultImport3 = new defaultImport();
value6.networkQuality = defaultImport3 instanceof Object ? defaultImport3 : value7;
const defaultImport2 = SystemResources;
const value10 = Object.create(defaultImport2.prototype, {constructor: {value: defaultImport2}});
const defaultImport22 = new defaultImport2();
value6.systemResources = defaultImport22 instanceof Object ? defaultImport22 : value10;
value6.inboundStats = {};
const Histogram = (HistogramModule).Histogram;
value6.outboundStats = {'packetsSent': 0, 'bytesSent': 0, 'packetsLost': 0, 'passthroughCount': 0,
'encryptSuccessCount': 0, 'encryptFailureCount': 0, 'encryptDuration': 0, 'encryptAttempts': 0,
'encryptMaxAttempts': 0, 'encryptMissingKeyCount': 0, 'bytesAvailable': 0, 'bytesTarget': 0,
'previousTimestampMs': 0, 'aggregationDurationMs': 0, speakingAudioLevel: new Histogram()};
value6.duration = {'listening': 0, 'speaking': 0, 'participation': 0, 'connected': 0};
value6.periodicInboundStats = {};
value6.inputDeviceStats = {};
value6.outputDeviceStats = {};
return value6;
function sampleAudioDevice(a0, a1) { // fn#94526, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12588:1203, owner: VoiceQuality.sampleAudioDevice, offset: 0x0211b644, size: 291 bytes, params: 3, frame: 18
var r3;
var value;
var timeToFirstCallbackMs;
var sessionSampleRate;
var binding;
var emit;
var value5;
if (a0 !== undefined) {
if (a0.restartCount !== undefined) {
value = environment.__proto__.__proto__;
a1.restartCount = handleCounter(a0.restartCount, a1.restartCount);
}
if (a0.bufferViolations !== undefined) {
value = environment.__proto__.__proto__;
a1.bufferViolations = handleCounter(a0.bufferViolations, a1.bufferViolations);
}
timeToFirstCallbackMs = a0.timeToFirstCallbackMs;
value = 0;
r3 = timeToFirstCallbackMs ?? value;
r3 = value !== r3 && a1.timeToFirstCallbackMs === undefined;
if (r3) {
a1.timeToFirstCallbackMs = a0.timeToFirstCallbackMs;
}
sessionSampleRate = a0.sessionSampleRate;
r3 = sessionSampleRate ?? value;
if (value !== r3) {
sessionSampleRate = a1.sessionSampleRate;
if (sessionSampleRate !== a0.sessionSampleRate) {
binding = env0_0;
emit = binding.emit;
value5 = environment.__proto__.__proto__;
Reflect.apply(emit, binding, [env2_9.InputDeviceSampleRateChanged, a0.sessionSampleRate ?? value]);
}
sessionSampleRate = a0.sessionSampleRate;
a1.sessionSampleRate = sessionSampleRate;
}
value = a0.timeFromConnectToFirstCallbackMs !== undefined;
r3 = value && a1.timeFromConnectToFirstCallbackMs === undefined;
if (r3) {
a1.timeFromConnectToFirstCallbackMs = a0.timeFromConnectToFirstCallbackMs;
}
}
}
function VoiceQualitySampleStats(a0) { // fn#94528, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12588:2227, owner: VoiceQuality.sampleStats, offset: 0x0211b81d, size: 591 bytes, params: 2, frame: 26
var environment;
var r1;
var r2;
var binding;
var networkQuality;
var incrementNetworkStats;
var value2;
var moduleValue;
var duration;
var connected;
var outboundStats;
var packetsSent;
var defaultImport;
var reduce;
var inboundStats;
var value3;
var defaultImport2;
var forEach;
var rtp;
var transport;
var appendTargetRates;
var defaultImport3;
var audioDevice;
var sampleAudioDevice;
var packetsSent2;
var value4;
var speaking;
var defaultImport4;
var listening;
var participation;
const env0_0 = a0;
if (a0 != null) {
binding = env0_0;
networkQuality = binding.networkQuality;
incrementNetworkStats = networkQuality.incrementNetworkStats;
value2 = environment.__proto__.__proto__;
moduleValue = require(4303) /* metro dependency 4303: TimeUtils */;
Reflect.apply(incrementNetworkStats, networkQuality, [moduleValue.now()]);
binding.systemResources.takeSample();
duration = binding.duration;
connected = duration.connected;
duration.connected = typeof connected === 'bigint' ? connected + 1n : +connected + 1;
outboundStats = binding.outboundStats;
packetsSent = outboundStats.packetsSent;
defaultImport = importDefault(22) /* metro dependency 22 */;
reduce = defaultImport.reduce;
inboundStats = binding.inboundStats;
value3 = Reflect.apply(reduce, defaultImport, [inboundStats, function(a0, a1) {
a0.packetsReceived = a0.packetsReceived + a1.packetsReceived;
return a0;
}, {packetsReceived: 0}]);
var env0_1 = 0;
defaultImport2 = importDefault(22) /* metro dependency 22 */;
forEach = defaultImport2.forEach;
rtp = a0.rtp;
Reflect.apply(forEach, defaultImport2, [rtp.outbound, _fun94530]);
transport = a0.transport;
binding.decryptionFailures = transport.decryptionFailures;
transport = a0.transport;
binding.routingFailures = transport.routingFailures;
appendTargetRates = binding.appendTargetRates;
outboundStats = binding.outboundStats;
transport = a0.transport;
Reflect.apply(appendTargetRates, binding, [outboundStats, transport.availableOutgoingBitrate, env0_1]);
defaultImport3 = importDefault(22) /* metro dependency 22 */;
forEach = defaultImport3.forEach;
rtp = a0.rtp;
Reflect.apply(forEach, defaultImport3, [rtp.inbound, _fun94531]);
audioDevice = a0.audioDevice;
if (audioDevice !== undefined) {
binding = env0_0;
sampleAudioDevice = binding.sampleAudioDevice;
audioDevice = a0.audioDevice;
Reflect.apply(sampleAudioDevice, binding, [audioDevice.input, binding.inputDeviceStats]);
sampleAudioDevice = binding.sampleAudioDevice;
audioDevice = a0.audioDevice;
Reflect.apply(sampleAudioDevice, binding, [audioDevice.output, binding.outputDeviceStats]);
}
outboundStats = env0_0.outboundStats;
packetsSent2 = outboundStats.packetsSent;
value4 = false;
if (packetsSent2 > packetsSent) {
duration = env0_0.duration;
speaking = duration.speaking;
duration.speaking = typeof speaking === 'bigint' ? speaking + 1n : +speaking + 1;
r1 = true;
} else {
r1 = value4;
}
defaultImport4 = importDefault(22) /* metro dependency 22 */;
reduce = defaultImport4.reduce;
inboundStats = env0_0.inboundStats;
if (Reflect.apply(reduce, defaultImport4, [inboundStats, _fun94533,
{packetsReceived: 0}]).packetsReceived > value3.packetsReceived) {
duration = env0_0.duration;
listening = duration.listening;
duration.listening = typeof listening === 'bigint' ? listening + 1n : +listening + 1;
r2 = true;
} else {
r2 = value4;
}
r1 = !r1 ? r2 : r1;
if (r1) {
duration = env0_0.duration;
participation = duration.participation;
duration.participation = typeof participation === 'bigint' ? participation + 1n : +participation + 1;
}
}
function _fun94530(a0) { // fn#94530, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12588:2528, offset: 0x0211ba8a, size: 424 bytes, params: 2, frame: 18
var r2;
var r7;
var bitrateTarget;
var value;
var value3;
var binding;
var object;
var speakingAudioLevel;
var addSample;
var Math;
if (a0.type === 'audio') {
bitrateTarget = a0.bitrateTarget;
value = 0;
r2 = bitrateTarget ?? value;
value3 = environment.__proto__;
binding = env1_0;
object = {};
copyDataProperties(object, binding.outboundStats, undefined);
object['packetsSent'] = a0.packetsSent;
object['bytesSent'] = a0.bytesSent;
r7 = a0.packetsLost ?? value;
object['packetsLost'] = r7;
r7 = a0.passthroughCount ?? value;
object['passthroughCount'] = r7;
r7 = a0.encryptSuccessCount ?? value;
object['encryptSuccessCount'] = r7;
r7 = a0.encryptFailureCount ?? value;
object['encryptFailureCount'] = r7;
r7 = a0.encryptDuration ?? value;
object['encryptDuration'] = r7;
r7 = a0.encryptAttempts ?? value;
object['encryptAttempts'] = r7;
r7 = a0.encryptMaxAttempts ?? value;
object['encryptMaxAttempts'] = r7;
object['encryptMissingKeyCount'] = a0.encryptMissingKeyCount ?? value;
binding.outboundStats = object;
value = global.Boolean(a0.audioDetected);
value = value === true;
r2 = value && a0.audioLevel != null;
if (r2) {
speakingAudioLevel = env1_0.outboundStats.speakingAudioLevel;
addSample = speakingAudioLevel.addSample;
Math = global.Math;
Reflect.apply(addSample, speakingAudioLevel, [20 * Math.log(a0.audioLevel)]);
}
}
}
function _fun94531(a0, a1) { // fn#94531, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12588:3438, offset: 0x0211bc32, size: 57 bytes, params: 3, frame: 14
var environment;
const env0_0 = a1;
const value = environment.__proto__.__proto__.__proto__;
(Module00022).forEach(a0, _fun94532);
function _fun94532(a0) { // fn#94532, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12588:3467, offset: 0x0211bc6b, size: 1721 bytes, params: 2, frame: 37
var r23;
var r16;
var r15;
var r1;
var audioJitterBufferHistogram;
var r0;
var audioJitterTargetHistogram;
var audioJitterDelayHistogram;
var r12;
var r10;
var r13;
var r6;
var value;
var inboundStats;
var property;
var value3;
var ping;
var value4;
var packetsReceived;
var packetsLost;
var bytesReceived;
var nackCount;
var object;
var value5;
var value6;
const Histogram = (HistogramModule).Histogram;
var histogram;
var value9;
var value12;
var addSamples;
var object2;
var object3;
var object4;
var periodicInboundStats;
var performance;
var value15;
var value16;
var mosBuckets;
var binding;
var calculateMos;
var value19;
var value20;
var defaultImport;
var value21;
var value22;
var property2;
var object5;
var mosCount;
var accelerateRateSum;
var expandRateSum;
var preemptiveExpandRateSum;
if (a0.type === 'audio') {
value = environment.__proto__.__proto__;
inboundStats = env2_0.inboundStats;
property = inboundStats[require];
value3 = environment.__proto__;
ping = env1_0.transport.ping;
value4 = 0;
r23 = ping ?? value4;
packetsReceived = a0.packetsReceived;
packetsLost = a0.packetsLost;
bytesReceived = a0.bytesReceived;
nackCount = a0.nackCount;
r16 = a0.fecPacketsReceived ?? value4;
r15 = a0.fecPacketsDiscarded ?? value4;
r1 = a0.jitterBuffer ?? value4;
object = {};
object.audioJitterBuffer = a0.audioJitterBuffer;
value5 = undefined;
audioJitterBufferHistogram = property == null ? value5 : property.bufferStats.audioJitterBufferHistogram;
if (audioJitterBufferHistogram != null) {
r0 = audioJitterBufferHistogram;
} else {
value6 = environment.__proto__.__proto__.__proto__.__proto__;
histogram = new Histogram();
}
object.audioJitterBufferHistogram = r0;
object.audioJitterTarget = a0.audioJitterTarget;
audioJitterTargetHistogram = property == null ? value5 : property.bufferStats.audioJitterTargetHistogram;
if (audioJitterTargetHistogram != null) {
r0 = audioJitterTargetHistogram;
} else {
value9 = environment.__proto__.__proto__.__proto__.__proto__;
histogram = new Histogram();
}
object.audioJitterTargetHistogram = r0;
object.audioJitterDelay = a0.audioJitterDelay;
audioJitterDelayHistogram = property == null ? value5 : property.bufferStats.audioJitterDelayHistogram;
if (audioJitterDelayHistogram != null) {
r0 = audioJitterDelayHistogram;
} else {
value12 = environment.__proto__.__proto__.__proto__.__proto__;
histogram = new Histogram();
}
object.audioJitterDelayHistogram = r0;
object.relativeReceptionDelay = a0.relativeReceptionDelay;
object.relativePlayoutDelay = a0.relativePlayoutDelay;
audioJitterBufferHistogram = object.audioJitterBufferHistogram;
addSamples = audioJitterBufferHistogram.addSamples;
r0 = a0.audioJitterBufferSamples ?? [];
Reflect.apply(addSamples, audioJitterBufferHistogram, [r0]);
audioJitterDelayHistogram = object.audioJitterDelayHistogram;
addSamples = audioJitterDelayHistogram.addSamples;
r0 = a0.audioJitterDelaySamples ?? [];
Reflect.apply(addSamples, audioJitterDelayHistogram, [r0]);
audioJitterTargetHistogram = object.audioJitterTargetHistogram;
addSamples = audioJitterTargetHistogram.addSamples;
r0 = a0.audioJitterTargetSamples ?? [];
Reflect.apply(addSamples, audioJitterTargetHistogram, [r0]);
object2 = {};
object2.silent = a0.opSilence;
object2.normal = a0.opNormal;
object2.merged = a0.opMerge;
object2.expanded = a0.opExpand;
object2.accelerated = a0.opAccelerate;
object2.preemptiveExpanded = a0.opPreemptiveExpand;
object2.cng = a0.opCNG;
object3 = {};
r0 = a0.passthroughCount ?? value4;
object3.passthroughCount = r0;
r0 = a0.decryptSuccessCount ?? value4;
object3.decryptSuccessCount = r0;
r0 = a0.decryptFailureCount ?? value4;
object3.decryptFailureCount = r0;
r0 = a0.decryptDuration ?? value4;
object3.decryptDuration = r0;
r0 = a0.decryptAttempts ?? value4;
object3.decryptAttempts = r0;
r0 = a0.decryptMissingKeyCount ?? value4;
object3.decryptMissingKeyCount = r0;
r0 = a0.decryptInvalidNonceCount ?? value4;
object3.decryptInvalidNonceCount = r0;
if (property != null) {
value15 = packetsReceived - property.packetsReceived;
value16 = packetsLost - property.packetsLost;
mosBuckets = property.mosBuckets;
r10 = property.decryptFailureBeforeSuccessCount ?? (object3.decryptSuccessCount > value4 ? object3.decryptFailureCount : value5);
if (value15 > value4 && value16 >= value4) {
binding = env2_0;
calculateMos = binding.calculateMos;
value19 = r23 + r1;
value20 = environment.__proto__.__proto__.__proto__.__proto__;
defaultImport = importDefault(22) /* metro dependency 22 */;
value21 = Reflect.apply(calculateMos, binding, [value19,
defaultImport.clamp(value16 / (value15 + value16), value4, 1)]);
value22 = global.Math.floor(value21);
property2 = mosBuckets[value22];
mosBuckets[value22] = typeof property2 === 'bigint' ? property2 + 1n : +property2 + 1;
r13 = value21;
} else {
r13 = value4;
}
inboundStats = env2_0.inboundStats;
object5 = {packetsReceived: packetsReceived, bytesReceived: bytesReceived, packetsLost: packetsLost};
object5.nackCount = nackCount ?? value4;
object5.fecPacketsReceived = r16;
object5.fecPacketsDiscarded = r15;
object5.mos = r13;
object5.mosSum = property.mosSum + r13;
mosCount = property.mosCount;
r13 = r13 > value4 ? 1 : value4;
object5.mosCount = mosCount + r13;
object5.mosBuckets = mosBuckets;
object5.bufferStats = object;
object5.frameOpStats = object2;
object5.decryptFailureBeforeSuccessCount = r10;
copyDataProperties(object5, object3, undefined);
inboundStats[require] = object5;
binding = env2_0;
periodicInboundStats = binding.periodicInboundStats;
object = {};
object.previousTimestampMs = binding.periodicInboundStats[require].previousTimestampMs;
object.previous = binding.periodicInboundStats[require].previous;
object.currentTimestampMs = global.performance.now();
object.current = object2;
accelerateRateSum = binding.periodicInboundStats[require].accelerateRateSum;
r6 = a0.accelerateRate ?? value4;
object.accelerateRateSum = accelerateRateSum + r6;
expandRateSum = env2_0.periodicInboundStats[require].expandRateSum;
r6 = a0.expandRate ?? value4;
object.expandRateSum = expandRateSum + r6;
preemptiveExpandRateSum = env2_0.periodicInboundStats[require].preemptiveExpandRateSum;
r6 = a0.preemptiveExpandRate ?? value4;
object.preemptiveExpandRateSum = preemptiveExpandRateSum + r6;
object.speechExpandRateSum = env2_0.periodicInboundStats[require].speechExpandRateSum + (a0.speechExpandRate ?? value4);
object.numRateSamples = env2_0.periodicInboundStats[require].numRateSamples + 1;
periodicInboundStats[require] = object;
} else {
inboundStats = env2_0.inboundStats;
object4 = {packetsReceived: packetsReceived, bytesReceived: bytesReceived, packetsLost: packetsLost};
r12 = nackCount ?? value4;
object4.nackCount = r12;
object4.fecPacketsReceived = r16;
object4.fecPacketsDiscarded = r15;
object4.mos = value4;
object4.mosSum = value4;
object4.mosCount = value4;
object4.mosBuckets = [0, 0, 0, 0, 0];
object4.bufferStats = object;
object4.frameOpStats = object2;
copyDataProperties(object4, object3, undefined);
inboundStats[require] = object4;
periodicInboundStats = env2_0.periodicInboundStats;
object = {};
performance = global.performance;
object.previousTimestampMs = performance.now();
object.previous = object2;
performance = global.performance;
object.currentTimestampMs = performance.now();
object.current = object2;
r12 = a0.accelerateRate ?? value4;
object.accelerateRateSum = r12;
r12 = a0.expandRate ?? value4;
object.expandRateSum = r12;
r12 = a0.preemptiveExpandRate ?? value4;
object.preemptiveExpandRateSum = r12;
r12 = a0.speechExpandRate ?? value4;
object.speechExpandRateSum = r12;
object.numRateSamples = 1;
periodicInboundStats[require] = object;
}
}
}
}
}
}
function value_94536() { // fn#94536, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12588:8127, offset: 0x0211c3a8, size: 205 bytes, params: 1, frame: 16
var environment;
let value = environment.__proto__;
const reduce = (Module00022).reduce;
const inboundStats = this.inboundStats;
const value2 = 0;
value = Reflect.apply(reduce, value, [inboundStats, function(a0, a1) {
var property2;
var property = a0.mosSum;
a0.mosSum = property + a1.mosSum;
a0.mosCount = a0.mosCount + a1.mosCount;
var value = 0;
var r2 = value;
reducibleLoop1: while (true) {
property = a0.mosBuckets;
property2 = property[r2];
property[r2] = property2 + a1.mosBuckets[r2];
value = typeof r2 === 'bigint' ? r2 + 1n : +r2 + 1;
if (value < 5) {
r2 = value;
continue reducibleLoop1;
}
break reducibleLoop1;
}
return a0;
}, {'mosSum': 0, 'mosCount': 0, mosBuckets: [0, 0, 0, 0, 0]}]);
return {mos_mean: value.mosCount > value2 ? value.mosSum / value.mosCount : value2, mos_1: value.mosBuckets[1], mos_2: value.mosBuckets[2], mos_3: value.mosBuckets[3], mos_4: value.mosBuckets[4]};
}
function value_94538() { // fn#94538, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12588:8510, offset: 0x0211c4d1, size: 177 bytes, params: 1, frame: 16
var environment;
let value = environment.__proto__;
value = Reflect.apply((importDefault(22) /* metro dependency 22 */).reduce, value, [this.inboundStats, function(a0,
a1) {
a0.packetsReceived = a0.packetsReceived + a1.packetsReceived;
a0.packetsReceivedLost = a0.packetsReceivedLost + a1.packetsLost;
a0.nackCount = a0.nackCount + a1.nackCount;
a0.fecPacketsReceived = a0.fecPacketsReceived + a1.fecPacketsReceived;
a0.fecPacketsDiscarded = a0.fecPacketsDiscarded + a1.fecPacketsDiscarded;
return a0;
}, {'packetsReceived': 0, 'packetsReceivedLost': 0, 'nackCount': 0, 'fecPacketsReceived': 0,
'fecPacketsDiscarded': 0}]);
return {packets_sent: this.outboundStats.packetsSent, packets_sent_lost: this.outboundStats.packetsLost,
packets_received: value.packetsReceived, packets_received_lost: value.packetsReceivedLost,
num_nacks_sent: value.nackCount, fec_packets_received: value.fecPacketsReceived,
fec_packets_discarded: value.fecPacketsDiscarded};
}
function value_94540() { // fn#94540, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12588:9182, offset: 0x0211c5f8, size: 212 bytes, params: 1, frame: 20
var environment;
let value = environment.__proto__;
const reduce = (Module00022).reduce;
const inboundStats = this.inboundStats;
const value2 = 0;
value = Reflect.apply(reduce, value, [inboundStats, function(a0, a1) {
return a0 + a1.bytesReceived;
}, value2]);
const value3 = this.outboundStats.aggregationDurationMs / 1000;
const object = {};
object.bytes_sent = this.outboundStats.bytesSent;
object.bytes_received = value;
value = value3 > value2;
object.outbound_bandwidth_estimate = value ? global.Math.round(8 * this.outboundStats.bytesAvailable / value3) : value2;
object.audio_target_bitrate = value ? global.Math.round(8 * this.outboundStats.bytesTarget / value3) : value2;
return object;
}
function value_94544() { // fn#94544, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12588:9732, offset: 0x0211c708, size: 358 bytes, params: 1, frame: 19
var audioJitterBuffer;
var r0;
var r8;
var audioJitterTarget;
var r7;
var audioJitterDelay;
var r5;
const value2 = undefined;
const defaultImport = Module00022;
const reduce = defaultImport.reduce;
const inboundStats = this.inboundStats;
const value3 = null;
const value4 = Reflect.apply(reduce, defaultImport, [inboundStats, _fun94545, value3]);
if (value3 != value4) {
if (value4.audioJitterBufferHistogram.getSamples() > 0) {
r0 = value4.audioJitterBufferHistogram;
} else {
audioJitterBuffer = value4.audioJitterBuffer;
audioJitterBuffer = value3 != audioJitterBuffer ? value4.audioJitterBuffer : value3;
r0 = audioJitterBuffer;
}
r8 = r0;
} else {
r8 = value3;
}
if (value3 != value4) {
if (value4.audioJitterTargetHistogram.getSamples() > 0) {
r0 = value4.audioJitterTargetHistogram;
} else {
audioJitterTarget = value4.audioJitterTarget;
audioJitterTarget = value3 != audioJitterTarget ? value4.audioJitterTarget : value3;
r0 = audioJitterTarget;
}
r7 = r0;
} else {
r7 = value3;
}
if (value3 != value4) {
if (value4.audioJitterDelayHistogram.getSamples() > 0) {
r0 = value4.audioJitterDelayHistogram;
} else {
audioJitterDelay = value4.audioJitterDelay;
audioJitterDelay = value3 != audioJitterDelay ? value4.audioJitterDelay : value3;
r0 = audioJitterDelay;
}
r5 = r0;
} else {
r5 = value3;
}
const object = {};
const explodePlayoutMetricsBinding = explodePlayoutMetrics;
const relativeReceptionDelay = value3 == value4 ? value2 : value4.relativeReceptionDelay;
const relativePlayoutDelay = value3 == value4 ? value2 : value4.relativePlayoutDelay;
copyDataProperties(object, explodePlayoutMetricsBinding({audio_jitter_buffer: r8, audio_jitter_target: r7,
audio_jitter_delay: r5,
relative_reception_delay: value3 != relativeReceptionDelay ? relativeReceptionDelay : value3,
relative_playout_delay: value3 != relativePlayoutDelay ? relativePlayoutDelay : value3}), undefined);
return object;
}
function value_94546() { // fn#94546, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12588:10976, offset: 0x0211c94a, size: 165 bytes, params: 1, frame: 15
var environment;
let value = environment.__proto__;
value = Reflect.apply((importDefault(22) /* metro dependency 22 */).reduce, value, [this.inboundStats, _fun94547,
{'silent': 0, 'normal': 0, 'merged': 0, 'expanded': 0, 'accelerated': 0, 'preemptiveExpanded': 0, 'cng': 0}]);
return {frame_op_silent: value.silent, frame_op_normal: value.normal, frame_op_merged: value.merged,
frame_op_expanded: value.expanded, frame_op_accelerated: value.accelerated,
frame_op_preemptive_expanded: value.preemptiveExpanded, frame_op_cng: value.cng};
}
function value_94550() { // fn#94550, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12588:12219, offset: 0x0211cb9d, size: 311 bytes, params: 1, frame: 16
var environment;
let value = environment.__proto__;
value = Reflect.apply((importDefault(22) /* metro dependency 22 */).reduce, value, [this.inboundStats, _fun94551,
{'passthroughCount': 0, 'decryptSuccessCount': 0, 'decryptFailureCount': 0, 'decryptDuration': 0,
'decryptAttempts': 0, 'decryptMissingKeyCount': 0, 'decryptInvalidNonceCount': 0,
'decryptFailureAfterSuccessCount': 0}]);
return {decrypt_passthrough_count: value.passthroughCount, decrypt_success_count: value.decryptSuccessCount,
decrypt_failure_count: value.decryptFailureCount, decrypt_duration: value.decryptDuration,
decrypt_attempts: value.decryptAttempts, decrypt_missing_key_count: value.decryptMissingKeyCount,
decrypt_invalid_nonce_count: value.decryptInvalidNonceCount,
decrypt_failure_after_success_count: value.decryptFailureAfterSuccessCount,
encrypt_passthrough_count: this.outboundStats.passthroughCount,
encrypt_success_count: this.outboundStats.encryptSuccessCount,
encrypt_failure_count: this.outboundStats.encryptFailureCount,
encrypt_duration: this.outboundStats.encryptDuration, encrypt_attempts: this.outboundStats.encryptAttempts,
encrypt_max_attempts: this.outboundStats.encryptMaxAttempts,
encrypt_missing_key_count: this.outboundStats.encryptMissingKeyCount};
}
function value_94554() { // fn#94554, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12588:15461, offset: 0x0211cff8, size: 966 bytes, params: 1, frame: 69
var r18;
var r48;
var r47;
var r56;
var r57;
var property;
var value4;
var property2;
var previous;
var current;
var currentTimestampMs;
var previousTimestampMs;
var numRateSamples;
var value5;
var object;
var silent;
var value6;
var normal;
var value7;
var merged;
var value8;
var expanded;
var value9;
var accelerated;
var value10;
var preemptiveExpanded;
var value11;
var cng;
var value12;
var accelerateRateSum;
var expandRateSum;
var preemptiveExpandRateSum;
var speechExpandRateSum;
var value13;
var value14;
var value15;
var value16;
const items2 = [];
const Object = global.Object;
const entries = Object.entries;
let periodicInboundStats = this.periodicInboundStats;
const value = Reflect.apply(entries, Object, [periodicInboundStats]);
let length = value.length;
const value2 = 0;
if (value2 < length) {
r18 = value2;
while (true) {
property = value[r18];
value4 = env1_3(property, 2);
property = value4[value2];
property2 = value4[1];
previous = property2.previous;
current = property2.current;
currentTimestampMs = property2.currentTimestampMs;
previousTimestampMs = property2.previousTimestampMs;
numRateSamples = property2.numRateSamples;
if (previousTimestampMs !== undefined) {
if (currentTimestampMs > previousTimestampMs) {
value5 = currentTimestampMs - previousTimestampMs;
object = {userId: property};
silent = current.silent;
if (silent != null) {
r47 = silent;
continue;
}
silent = previous.silent;
if (silent != null) {
r48 = silent;
continue;
}
r48 = value2;
continue;
value6 = value2 - r48;
r47 = value6;
object.silent = r47;
normal = current.normal;
if (normal != null) {
r47 = normal;
continue;
}
normal = previous.normal;
if (normal != null) {
r48 = normal;
continue;
}
r48 = value2;
continue;
value7 = value2 - r48;
r47 = value7;
object.normal = r47;
merged = current.merged;
if (merged != null) {
r47 = merged;
continue;
}
merged = previous.merged;
if (merged != null) {
r48 = merged;
continue;
}
r48 = value2;
continue;
value8 = value2 - r48;
r47 = value8;
object.merged = r47;
expanded = current.expanded;
if (expanded != null) {
r47 = expanded;
continue;
}
expanded = previous.expanded;
if (expanded != null) {
r48 = expanded;
continue;
}
r48 = value2;
continue;
value9 = value2 - r48;
r47 = value9;
object.expanded = r47;
accelerated = current.accelerated;
if (accelerated != null) {
r47 = accelerated;
continue;
}
accelerated = previous.accelerated;
if (accelerated != null) {
r48 = accelerated;
continue;
}
r48 = value2;
continue;
value10 = value2 - r48;
r47 = value10;
object.accelerated = r47;
preemptiveExpanded = current.preemptiveExpanded;
if (preemptiveExpanded != null) {
r47 = preemptiveExpanded;
continue;
}
preemptiveExpanded = previous.preemptiveExpanded;
if (preemptiveExpanded != null) {
r56 = preemptiveExpanded;
continue;
}
r56 = value2;
continue;
value11 = value2 - r56;
r47 = value11;
object.preemptiveExpanded = r47;
cng = current.cng;
if (cng != null) {
r56 = cng;
continue;
}
cng = previous.cng;
if (cng != null) {
r57 = cng;
continue;
}
r57 = value2;
continue;
value12 = value2 - r57;
r56 = value12;
object.cng = r56;
accelerateRateSum = property2.accelerateRateSum;
object.accelerateRate = accelerateRateSum / numRateSamples;
expandRateSum = property2.expandRateSum;
object.expandRate = expandRateSum / numRateSamples;
preemptiveExpandRateSum = property2.preemptiveExpandRateSum;
object.preemptiveExpandRate = preemptiveExpandRateSum / numRateSamples;
speechExpandRateSum = property2.speechExpandRateSum;
object.speechExpandRate = speechExpandRateSum / numRateSamples;
object.durationMs = value5;
normal = object.normal;
merged = object.merged;
value13 = normal + merged;
expanded = object.expanded;
value14 = value13 + expanded;
accelerated = object.accelerated;
value15 = value14 + accelerated;
preemptiveExpanded = object.preemptiveExpanded;
if (value15 + preemptiveExpanded > value2) {
items2.push(object);
break;
}
break;
}
break;
}
periodicInboundStats = this.periodicInboundStats;
periodicInboundStats[property].accelerateRateSum = value2;
periodicInboundStats = this.periodicInboundStats;
periodicInboundStats[property].expandRateSum = value2;
periodicInboundStats = this.periodicInboundStats;
periodicInboundStats[property].preemptiveExpandRateSum = value2;
periodicInboundStats = this.periodicInboundStats;
periodicInboundStats[property].speechExpandRateSum = value2;
periodicInboundStats = this.periodicInboundStats;
periodicInboundStats[property].numRateSamples = value2;
periodicInboundStats = this.periodicInboundStats;
periodicInboundStats[property].previous = current;
periodicInboundStats = this.periodicInboundStats;
periodicInboundStats[property].previousTimestampMs = currentTimestampMs;
value16 = typeof r18 === 'bigint' ? r18 + 1n : +r18 + 1;
length = value.length;
if (value16 < length) {
r18 = value16;
continue;
}
break;
}
}
return items2;
}
}
}
function appendTargetRates(a0) { // fn#94527, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12588:1945, owner: VoiceQuality.appendTargetRates, offset: 0x0211b767, size: 182 bytes, params: 2, frame: 15
var performance;
var aggregationDurationMs;
var value3;
let value = a1;
const value2 = a2;
const r4 = value !== undefined ? value : 0;
const r6 = value2 !== undefined ? value2 : 0;
let previousTimestampMs = a0.previousTimestampMs;
if (previousTimestampMs !== 0) {
value = global.performance.now();
aggregationDurationMs = a0.aggregationDurationMs;
previousTimestampMs = a0.previousTimestampMs;
a0.aggregationDurationMs = aggregationDurationMs + (value - previousTimestampMs);
previousTimestampMs = a0.previousTimestampMs;
value3 = (value - previousTimestampMs) / 1000;
a0.bytesAvailable = a0.bytesAvailable + r4 / 8 * value3;
a0.bytesTarget = a0.bytesTarget + r6 / 8 * value3;
a0.previousTimestampMs = value;
} else {
performance = global.performance;
a0.previousTimestampMs = performance.now();
}
}
function _fun94533(a0, {packetsReceived}) { // fn#94533, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12588:7136, offset: 0x0211ba6c, size: 30 bytes, params: 3, frame: 3
const packetsReceived = a0.packetsReceived;
a0.packetsReceived = packetsReceived + packetsReceived;
return a0;
}
function _fun94545(a0, a1) { // fn#94545, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12588:9789, offset: 0x0211c86e, size: 220 bytes, params: 3, frame: 16
const value = a0;
const r5 = a1.bufferStats.audioJitterBufferHistogram.getSamples() > 0 ? a1.bufferStats.audioJitterBufferHistogram.getPercentile(75) : a1.bufferStats.audioJitterBuffer != null ? a1.bufferStats.audioJitterBuffer.p75 : null;
const value5 = null;
const r4 = value5 == value ? value5 : value.audioJitterBufferHistogram.getSamples() > 0 ? value.audioJitterBufferHistogram.getPercentile(75) : value5 != value.audioJitterBuffer ? value.audioJitterBuffer.p75 : value5;
let r2 = value5 == value || value5 == r4;
r2 = !r2 ? value5 != r5 && r5 > r4 : r2;
return r2 ? a1.bufferStats : value;
}
function _fun94547(a0, a1) { // fn#94547, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12588:11029, offset: 0x0211c9ef, size: 318 bytes, params: 3, frame: 5
if (a1.frameOpStats.silent != null) {
a0.silent = a0.silent + a1.frameOpStats.silent;
}
if (a1.frameOpStats.normal != null) {
a0.normal = a0.normal + a1.frameOpStats.normal;
}
if (a1.frameOpStats.merged != null) {
a0.merged = a0.merged + a1.frameOpStats.merged;
}
if (a1.frameOpStats.expanded != null) {
a0.expanded = a0.expanded + a1.frameOpStats.expanded;
}
if (a1.frameOpStats.accelerated != null) {
a0.accelerated = a0.accelerated + a1.frameOpStats.accelerated;
}
if (a1.frameOpStats.preemptiveExpanded != null) {
a0.preemptiveExpanded = a0.preemptiveExpanded + a1.frameOpStats.preemptiveExpanded;
}
if (a1.frameOpStats.cng != null) {
a0.cng = a0.cng + a1.frameOpStats.cng;
}
return a0;
}
function _fun94551(a0, a1) { // fn#94551, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12588:12272, offset: 0x0211ccd4, size: 304 bytes, params: 3, frame: 8
const passthroughCount = a0.passthroughCount;
const passthroughCount2 = a1.passthroughCount;
const value = 0;
a0.passthroughCount = passthroughCount + (passthroughCount2 ?? value);
a0.decryptSuccessCount = a0.decryptSuccessCount + (a1.decryptSuccessCount ?? value);
a0.decryptFailureCount = a0.decryptFailureCount + (a1.decryptFailureCount ?? value);
a0.decryptDuration = a0.decryptDuration + (a1.decryptDuration ?? value);
a0.decryptAttempts = a0.decryptAttempts + (a1.decryptAttempts ?? value);
a0.decryptMissingKeyCount = a0.decryptMissingKeyCount + (a1.decryptMissingKeyCount ?? value);
a0.decryptInvalidNonceCount = a0.decryptInvalidNonceCount + (a1.decryptInvalidNonceCount ?? value);
a0.decryptFailureAfterSuccessCount = a0.decryptFailureAfterSuccessCount + ((a1.decryptFailureCount ?? value) - (a1.decryptFailureBeforeSuccessCount ?? value));
return a0;
}
function value_94552() { // fn#94552, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12588:13869, offset: 0x0211ce04, size: 257 bytes, params: 1, frame: 7
const object = {};
let restartCount = this.inputDeviceStats.restartCount;
const value = undefined;
object.input_device_restart_count = restartCount == null ? value : restartCount.accumulated;
restartCount = this.outputDeviceStats.restartCount;
object.output_device_restart_count = restartCount == null ? value : restartCount.accumulated;
object.input_device_time_to_first_audio = this.inputDeviceStats.timeToFirstCallbackMs;
object.output_device_time_to_first_audio = this.outputDeviceStats.timeToFirstCallbackMs;
let bufferViolations = this.inputDeviceStats.bufferViolations;
object.input_device_buffer_overfull_count = bufferViolations == null ? value : bufferViolations.accumulated;
bufferViolations = this.outputDeviceStats.bufferViolations;
object.output_device_buffer_underrun_count = bufferViolations == null ? value : bufferViolations.accumulated;
object.input_device_session_sample_rate = this.inputDeviceStats.sessionSampleRate;
object.output_device_session_sample_rate = this.outputDeviceStats.sessionSampleRate;
object.input_device_time_from_connect_to_first_audio_ms = this.inputDeviceStats.timeFromConnectToFirstCallbackMs;
object.output_device_time_from_connect_to_first_audio_ms = this.outputDeviceStats.timeFromConnectToFirstCallbackMs;
return object;
}
function value_94553() { // fn#94553, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12588:14848, offset: 0x0211cf05, size: 243 bytes, params: 1, frame: 12
const report = this.outboundStats.speakingAudioLevel.getReport([1, 5, 10, 25, 50, 75, 90, 95, 99]);
return {outbound_audio_level_db_p1: report.percentiles[1], outbound_audio_level_db_p5: report.percentiles[5],
outbound_audio_level_db_p10: report.percentiles[10], outbound_audio_level_db_p25: report.percentiles[25],
outbound_audio_level_db_p50: report.percentiles[50], outbound_audio_level_db_p75: report.percentiles[75],
outbound_audio_level_db_p90: report.percentiles[90], outbound_audio_level_db_p95: report.percentiles[95],
outbound_audio_level_db_p99: report.percentiles[99], outbound_audio_level_db_max: report.max,
outbound_audio_level_db_mean: report.mean};
}
global.__d(_fun94518, 12402, [57, 6, 7, 15, 17, 18, 7131, 4303, 22, 12403, 7137, 4406, 4479,
2]) /* metro module 12402, dependencies: [57, 6, 7, 15, 17, 18, 7131, 4303, 22, 12403, 7137, 4406, 4479, 2] */;