PageSourceSearch

https://unmslearns.net/apps-shared/js/mmapp/jquery.videoinitialize_20240814.js?v=20251202

js unmslearns.net collected 2026-10-08 03:29:20 UTC 20,610 bytes, 585 lines download raw bytes

1enJQ.fn.videoInitialize = function (options) {
2
3	var settings = {
4		'canPlayType': 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"',
5		'width': 640,
6		'height': 360,
7		'preferHTML5': true, /* changing this will mean try to use HTML5 before Flash */
8		'playHTML5': false,
9		'minimumFlashVersion': [9, 115], // minimum version for H264 flash playback
10		'videoElementId': 'video_element',
11		'mute': false,
12		'time': true,
13		'autoPlay': false,
14		'titleREC_ID': '',
15		'videoContainer': 'video_placeholder',
16		'flashplayer': '/apps/jwplayer/player.swf',
17		'expressInstall': '/apps/jwplayer/expressInstall.swf',
18		'file': '',
19		'image': '',
20		'autostart': false,
21		'plugins': '',
22		'skin': '/apps/jwplayer/hybrid-01282011.zip',
23		'volume': 83,
24		'controlbar': 'over',
25		'allowfullscreen': true,
26		'allowscriptaccess': "always",
27		'wmode': 'opaque',
28		'menu': false,
29		'playSettings': ""
30	};
31	var clip;
32	var currentClipID;
33	var playerTimerID = 0;
34	var self = this;
35	var inDebugMode = false;
36	var $videoContainer;
37	var playerTimers = {};
38
39	if (options) {
40		try {
41			enJQ.extend(settings, options);
42		} catch (expv) {
43			if (window.console && settings.debug)
44				console.log(expv);
45		}
46	}
47	this.settings = settings; // is this access only?
48	settings.autostart = settings.autoPlay;
49
50	$videoContainer = settings.$videoContainer;
51	this.$videoContainer = $videoContainer;
52	settings.$videoContainer = '';
53
54	if (!$videoContainer) {
55		if (enJQ('#video_page').width() < 828) {
56			enJQ('#video_page').addClass('below1 below-start');
57		}
58		initializationSettings.width = 640;
59		initializationSettings.height = 360;
60		var pageWidth = enJQ('#video_page').width() - (enJQ('#video-feature-area').outerWidth() - enJQ('#video-feature-area').width());
61		if (pageWidth < initializationSettings.width) {
62			initializationSettings.height = pageWidth * (initializationSettings.height / initializationSettings.width);
63			initializationSettings.width = pageWidth;
64			document.getElementById('hd-link').style.display = 'none';
65			document.getElementById('sd-link').style.display = 'none';
66		}
67		enJQ('#big-video').css({
68			'width': initializationSettings.width
69		});
70		enJQ('#video_player').css({
71			'width': initializationSettings.width,
72			'height': initializationSettings.height
73		});
74		$videoContainer = enJQ('#video_player');
75	}
76
77
78	var debug = function (msg) {
79		if (inDebugMode) {
80			try {
81				window.console.log(msg);
82			} catch (e) {
83			}
84		}
85	}
86
87
88	var jwplayerDefaults = {
89		id: 'jwplayer',
90		swf: '/apps/jwplayer/player.swf',
91		height: settings.height,
92		width: settings.width,
93		file: '/apps/video/videostreams_xml.jsp?v=' + settings.titleREC_ID,
94		plugins: 'qualitymonitor'
95	};
96
97	var getClipID = function () {
98		return clipID;
99	}
100
101	var getStartTime = function () {
102		return clipStartTime;
103	}
104
105	var insertVideo = function (video_url) {
106		updateAttrb(settings.uniquePlayerID, "settings", settings);
107		if (settings.fallbackURL.indexOf("mp4") == -1) {
108			if (window.console)
109				console.log("ATTENTION. FallbackURL = " + settings.fallbackURL);
110		}
111		if (settings.playHTML5) {
112
113			const mpdSrc = '/apps/video/videostreams_dash.mpd?v=' + settings.titleREC_ID + '&inc=image';
114			const m3u8Src = '/apps/video/videostreams_m3u8.m3u8?v=' + settings.titleREC_ID + '&inc=image';
115
116
117			var htmlStr = '<en-video data-mpd-src="' + mpdSrc + '" data-m3u8-src="' + m3u8Src + '" src="' + settings.fallbackURL + '" id="' + settings.videoContainer + '" controls poster="' + settings.clip.info.imgSrc720 + '"' + (settings.autostart ? " autoplay" : "") + " " + settings.playSettings + " " + ' preload="metadata">';
118			if (typeof settings.captionLanguageCodes !== "undefined" && settings.captionLanguageCodes != null && settings.captionLanguageCodes.length > 0) {
119				for (var i = 0; i < settings.captionLanguageCodes.length; i++) {
120					var caption_code = settings.captionLanguageCodes[i].split("|")[0];
121					var caption_label = settings.captionLanguageCodes[i].split("|")[1].split(" ")[0];
122					var caption_is_default = settings.captionLanguageCodes[i].split("|")[2];
123					htmlStr += '<track label="' + caption_label + '" kind="subtitles" srclang="' + caption_code + '" src="/apps/video/captions.jsp?videoREC_ID=' + settings.titleREC_ID + '&languageCode=' + caption_code + '" ' + ((caption_is_default > 0) ? "default" : "") + ' />';
124				}
125			}
126			htmlStr += '</en-video>';
127
128			$videoContainer.empty().append(htmlStr);
129			
130            const enVideo = document.getElementById(settings.videoContainer);
131            enVideo.addEventListener('play', function() {
132                var obj = {};
133                obj.id = settings.uniquePlayerID || "unique";
134                obj.oldstate = "IDLE";
135                obj.newstate = "BUFFERING";
136                videoInterface.onPlayerStateChange(obj);
137            });
138
139		} else {
140			if (getCookie("httpFallback") == null || getCookie("httpFallback") == "") {
141				settings.file = jwplayerDefaults.file + "&inc=image";
142				settings.provider = '';
143			} else {
144				if (settings.fallbackURL && settings.fallbackURL.indexOf("//") == 0) {
145					settings.file = window.location.protocol + settings.fallbackURL;
146				} else {
147					settings.file = settings.fallbackURL;
148				}
149				settings.provider = 'http';
150			}
151			if (settings.debug == true) {
152				settings.plugins = 'qualitymonitor';
153			}
154			if (settings.placeholder) {
155				settings.image = settings.placeholder;
156			}
157			if (settings.useSmallPlayer == true) {
158				settings.skin = '/apps/jwplayer/hybrid-small-01282011.zip';
159			}
160			if (settings.playerID != "") {
161				settings.id = settings.playerID;
162			}
163			//Just to trigger express install if necessary
164			//xi.embedSWF(settings.flashplayer, "noflash", "1", "1", "9.0.115", settings.expressInstall, {}, {}, {});
165
166			jwplayer(settings.videoContainer).setup(settings);
167		}
168	}
169
170	var configureVideoLinks = function (bitrates) {
171		var urls = {};
172		if ((bitrates.length == 1 || bitrates.length == 2) && bitrates[0].url.match(/small/)) {
173			urls.medium = bitrates[0].url.replace(/mp4:/, "");
174			return urls;
175		}
176		for (key in bitrates) {
177			if (typeof bitrates[key].url == 'undefined') {
178				continue;
179			}
180			if (bitrates[key].url.match(/small/)) {
181				urls.small = bitrates[key].url.replace(/mp4:/, "");
182			} else if (bitrates[key].url.match(/medium/)) {
183				urls.medium = bitrates[key].url.replace(/mp4:/, "");
184			} else if (bitrates[key].url.match(/large/)) {
185				urls.large = bitrates[key].url.replace(/mp4:/, "");
186			} else if (bitrates[key].url.match(/hd/)) {
187				urls.hd = bitrates[key].url.replace(/mp4:/, "");
188			}
189		}
190		if (bitrates.length != 0 && urls.small == null && urls.medium == null && urls.large == null && urls.hd == null) {
191			for (i = 0; i < bitrates.length; i++) {
192				if (bitrates[i].url.match(/\.mp4/)) {
193					urls.medium = bitrates[i].url.replace(/mp4:/, "");
194				}
195			}
196		}
197		if (bitrates.length != 0 && urls.small == null && urls.medium == null && urls.large == null && urls.hd == null) {
198			urls.medium = bitrates[0].url.replace(/mp4:/, "");
199		}
200		return urls;
201	}
202
203
204	this.switchTo = function (data) {
205		currentClipID = data.info.titleREC_ID;
206		if (data.bitrates)
207			settings.urls = configureVideoLinks(data.bitrates);
208		if (settings.playHTML5) {
209			settings.titleREC_ID = data.info.titleREC_ID;
210			settings.clip = { ...data };
211
212			insertVideo();
213
214			resetAttrb('unique');
215			updateAttrb('unique', "settings", settings);
216			updateAttrb('unique', "data", data);
217		} else {
218			jwplayer(settings.videoContainer).remove();
219
220			var tmp = document.getElementById("video_player");
221			if (tmp) {
222				tmp.innerHTML = "<div id='" + settings.videoContainer + "'></div>";
223			}
224
225			settings.start = '';
226			settings.provider = '';
227			settings.autostart = "true";
228
229			if (settings.urls.xsmall && settings.urls.xsmall.indexOf(".mp4") > 0) {
230				settings.fallbackURL = '//' + data.info.mmsUri + "/mmroot" + settings.urls.xsmall;
231			} else if (settings.urls.small && settings.urls.small.indexOf(".mp4") > 0) {
232				settings.fallbackURL = '//' + data.info.mmsUri + "/mmroot" + settings.urls.small;
233			} else if (settings.urls.medium && settings.urls.medium.indexOf(".mp4") > 0) {
234				settings.fallbackURL = '//' + data.info.mmsUri + "/mmroot" + settings.urls.medium;
235			} else if (settings.urls.large && settings.urls.large.indexOf(".mp4") > 0) {
236				settings.fallbackURL = '//' + data.info.mmsUri + "/mmroot" + settings.urls.large;
237			} else if (settings.urls.hd && settings.urls.hd.indexOf(".mp4") > 0) {
238				settings.fallbackURL = '//' + data.info.mmsUri + "/mmroot" + settings.urls.hd;
239			}
240
241			if (getCookie("httpFallback") == null || getCookie("httpFallback") == "" || settings.fallbackURL.indexOf(".mp4") == -1) {
242				settings.file = '/apps/video/videostreams_xml.jsp?v=' + data.info.titleREC_ID;
243				settings.provider = '';
244			} else {
245				settings.file = settings.fallbackURL;
246				settings.provider = 'http';
247			}
248
249			settings.image = data.info.imgSrc720;
250			if (settings.debug == true) {
251				settings.plugins = 'qualitymonitor';
252			}
253			if (settings.placeholder) {
254				settings.image = settings.placeholder;
255			}
256			if (settings.useSmallPlayer == true) {
257				settings.skin = '/apps/jwplayer/hybrid-small-01282011.zip';
258			}
259			settings.titleREC_ID = data.info.titleREC_ID;
260			//swfobject.embedSWF(settings.player, settings.videoContainer, "100%", "100%", "9.0.115", settings.expressInstall, settings.flashvars, settings.params, settings.attributes);
261			resetAttrb('unique');
262			updateAttrb('unique', "settings", settings);
263			updateAttrb('unique', "data", data);
264
265			//Just to trigger express install if necessary
266			//xi.embedSWF(settings.flashplayer, "noflash", "1", "1", "9.0.115", settings.expressInstall, {}, {}, {});
267
268			jwplayer(settings.videoContainer).setup(settings);
269		}
270	}
271
272	this.changeWidth = function (new_width, success) {
273		var $videoElement = enJQ('#' + settings.videoContainer);
274		var new_height = parseInt(new_width * (1 / ($videoContainer.width() / $videoContainer.height())));
275
276		if (false && settings.playHTML5) {
277			// can do below, works for html5 as well
278		} else {
279			var newDimensions = {width: new_width, height: new_height};
280			$videoElement.css(newDimensions);
281			$videoContainer.css(newDimensions);
282		}
283
284		if (enJQ.isFunction(success)) success();
285	}
286
287	var hasMP4Video = function () {
288		if (settings.urls.medium.match(/\.mp4/)) {
289			return true;
290		}
291		return false;
292	}
293
294	var supports_h264_baseline_video = function () {
295		var supports_video = function () {
296			return !!document.createElement('video').canPlayType;
297		}
298		if (!supports_video()) {
299			return false;
300		}
301		var v = document.createElement("video");
302		return v.canPlayType(settings.canPlayType);
303	}
304
305	this.onPlayerSeek = function (obj) {
306		var uniquePlayerID = obj.id.replace("video_placeholder", "");
307		if (uniquePlayerID == "" && obj.id == "video_placeholder") {
308			//pages except single.jsp. Because there can be only one player on the page.
309			uniquePlayerID = "unique";
310		}
311		updateAttrb(uniquePlayerID, "isSeeking", true);
312	}
313
314	this.onMeta = function (obj) {
315		if (obj && obj.code && obj.code == "NetConnection.Connect.Success" && obj.id) {
316			var uniquePlayerID = obj.id.replace("video_placeholder", "");
317			var isTunneledNow = (obj.connection === "tunneled");
318			if (!isTunneledNow && getAttrb(uniquePlayerID, "isTunneled") === true) {
319				updateAttrb(uniquePlayerID, "forceStopOnPlay", true);
320			}
321			updateAttrb(uniquePlayerID, "isTunneled", isTunneledNow);
322		}
323	}
324
325	this.onPlayerStateChange = function (obj) {
326		var uniquePlayerID = obj.id.replace("video_placeholder", "");
327		if (uniquePlayerID == "" && obj.id == "video_placeholder") {
328			//pages except single.jsp. Because there can be only one player on the page.
329			uniquePlayerID = "unique";
330		}
331
332		if (window.console && settings.debug) {
333			console.log("oldstate: " + obj.oldstate + ", newstate = " + obj.newstate + (getAttrb(uniquePlayerID, "isTunneled") ? ", isTunneled = " + getAttrb(uniquePlayerID, "isTunneled") : ""));
334			//console.log(obj);
335		}
336		try {
337			if ((obj.oldstate == "IDLE" && obj.newstate == "BUFFERING") || (obj.oldstate == "BUFFERING" && obj.newstate == "PLAYING")) {
338				if (!getAttrb(uniquePlayerID, "incremented") && getAttrb(uniquePlayerID, "incrementTimer") == "") {
339					updateAttrb(uniquePlayerID, "incrementTimer", setTimeout("window.videoInterface.incrementViewCount('" + uniquePlayerID + "')", 30000));
340					if (window.console && settings.debug) {
341						console.log("playerID: " + obj.id + ", playing title: " + uniquePlayerID + ", will increment in 30 sec");
342					}
343				}
344			}
345
346			if (obj.newstate == "COMPLETED") {
347				if (!getAttrb(uniquePlayerID, "incremented")) {
348					//Clear timer if any
349					clearTimeout(getAttrb(uniquePlayerID, "incrementTimer"));
350					window.videoInterface.incrementViewCount(uniquePlayerID);
351				}
352			}
353
354			if (obj.newstate == "PLAYING" && getAttrb(uniquePlayerID, "forceStopOnPlay") === true) {
355				updateAttrb(uniquePlayerID, "forceStopOnPlay", false);
356				jwplayer(obj.id).pause(true).stop();
357			}
358
359			if (obj.oldstate == "PLAYING" && obj.newstate == "BUFFERING" && !getAttrb(uniquePlayerID, "isSeeking")) {
360				//There are bandwidth issues, switch to pseudo-streaming
361
362				//check if it already happend
363				if (getAttrb(uniquePlayerID, "count") > 1) {
364					//Ignore for five times if RTMP is not serving the smallest version, as problem can be the video itself
365					try {
366						if (jwplayer(obj.id).getPlaylist()[0]['file'].indexOf('xsmall.mp4') == -1 && getAttrb(uniquePlayerID, "count") < 4) {
367							if (window.console)
368								console.log("RTMP is not playing the smallest version, should we we swtich? [count=" + getAttrb(uniquePlayerID, "count") + "]");
369							updateAttrb(uniquePlayerID, "isBuffering", true);
370							updateAttrb(uniquePlayerID, "lastBufferTime", new Date().getTime());
371							updateAttrb(uniquePlayerID, "count", getAttrb(uniquePlayerID, "count") + 1);
372							return;
373						}
374					} catch (e) {
375
376					}
377					if (window.console) {
378						console.log("Falling back to Pseudo-streaming. Starting the play from " + getAttrb(uniquePlayerID, "position"));
379					}
380					fallBack(uniquePlayerID);
381					return;
382				}
383
384				var timeDiff = -1;
385				if (getAttrb(uniquePlayerID, "lastBufferTime") != -1) {
386					timeDiff = Math.round((new Date().getTime() - getAttrb(uniquePlayerID, "lastBufferTime")) / 1000);
387				}
388				updateAttrb(uniquePlayerID, "isBuffering", true);
389				updateAttrb(uniquePlayerID, "lastBufferTime", new Date().getTime());
390				updateAttrb(uniquePlayerID, "count", getAttrb(uniquePlayerID, "count") + 1);
391				if (window.console) {
392					//console.log("Problemooooo!! BEFORE [isBuffering=" + getAttrb(uniquePlayerID, "isBuffering") + ", lastBufferTime=" + timeDiff + "]");
393				}
394			}
395
396			if (obj.oldstate == "BUFFERING" && obj.newstate == "PLAYING" && getAttrb(uniquePlayerID, "isSeeking")) {
397				if (window.console)
398					console.log("STARTED PLAYING AFTER SEEKING. SETTING SEEKING TO FALSE");
399				updateAttrb(uniquePlayerID, "isSeeking", false);
400			}
401
402		} catch (Excp) {
403			if (window.console && settings.debug) {
404				console.log(Excp);
405			}
406		}
407	}
408
409	this.onPlayerTimeChange = function (obj) {
410		try {
411			var uniquePlayerID = obj.id.replace("video_placeholder", "");
412			if (uniquePlayerID == "" && obj.id == "video_placeholder") {
413				//pages except single.jsp. Because there can be only one player on the page.
414				uniquePlayerID = "unique";
415			}
416			updateAttrb(uniquePlayerID, 'position', obj.position);
417			updateAttrb(uniquePlayerID, 'duration', obj.duration);
418		} catch (e) {
419			if (window.console)
420				console.log(e);
421		}
422	}
423
424	this.onPlayerPlaybackError = function (obj) {
425		if (window.console && settings.debug)
426			console.log("MODELEVENT.ERROR: " + obj.message);
427	}
428
429	this.incrementViewCount = function (uniquePlayerID) {
430		if (getAttrb(uniquePlayerID, "incrementTimer") != "") {
431			clearTimeout(getAttrb(uniquePlayerID, "incrementTimer"));
432			updateAttrb(uniquePlayerID, "incrementTimer", "");
433		}
434		var titleREC_ID = getAttrb(uniquePlayerID, "settings").titleREC_ID;
435		if (titleREC_ID == "") {
436			if (window.console) {
437				console.log("Could not increment");
438				console.log(uniquePlayerID);
439			}
440			return;
441		}
442		MMCheck.incrementCount(titleREC_ID);
443		updateAttrb(uniquePlayerID, "incremented", true);
444		playerTimerID = 0;
445		if (window.console && settings.debug)
446			console.log("TitleREC_ID: " + titleREC_ID + ", incremented");
447	}
448
449	var init = function () {
450		if (settings.debug == true && window.console) {
451			inDebugMode = true;
452		}
453		settings.width = $videoContainer.width();
454		settings.height = $videoContainer.height();
455		if (supports_h264_baseline_video()) {
456			enJQ('#video_problems').hide();
457			settings.urls = configureVideoLinks(settings.clip.bitrates);
458			settings.playHTML5 = true;
459			insertVideo(settings.initialVideo);
460		} else if (swfobject.hasFlashPlayerVersion("6.0.65")) {
461			insertVideo(settings.initialVideo);
462		} else {
463			$videoContainer.append('Sorry, videos require a browser that supports Flash or H.264 video playback.');
464		}
465	}
466
467	init();
468	return this;
469};
470
471enJQ.fn.supports_h264_baseline_video = function () {
472	var supports_video = function () {
473		return !!document.createElement('video').canPlayType;
474	}
475	if (!supports_video()) {
476		return false;
477	}
478	var v = document.createElement("video");
479	return v.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"');
480};
481
482function updateAttrb(uniquePlayerID, attrName, attrValue) {
483	try {
484		if (typeof document.playerAttrbs == "undefined") {
485			document.playerAttrbs = new Array();
486		}
487
488		if (typeof document.playerAttrbs[uniquePlayerID] == "undefined") {
489			document.playerAttrbs[uniquePlayerID] = {'settings': {}, 'lastBufferTime': -1, 'isBuffering': false, 'count': 0, 'position': 0, 'duration': -1, 'fallbackStatus': 0, "isSeeking" : false, "incrementTimer": '', "incremented" : false, 'data': {}, 'isTunneled': false, 'forceStopOnPlay': false }
490		}
491
492		document.playerAttrbs[uniquePlayerID][attrName] = attrValue;
493	} catch (e) {
494		if (window.console)
495			console.log(e);
496	}
497}
498
499function resetAttrb(uniquePlayerID) {
500	updateAttrb(uniquePlayerID, "lastBufferTime", -1);
501	updateAttrb(uniquePlayerID, "isBuffering", false);
502	updateAttrb(uniquePlayerID, "count", 0);
503	updateAttrb(uniquePlayerID, "position", 0);
504	updateAttrb(uniquePlayerID, "duration", -1);
505	updateAttrb(uniquePlayerID, "fallbackStatus", 0);
506	updateAttrb(uniquePlayerID, "isSeeking", false);
507	updateAttrb(uniquePlayerID, "incrementTimer", '');
508	updateAttrb(uniquePlayerID, "incremented", false);
509	updateAttrb(uniquePlayerID, "data", {});
510	updateAttrb(uniquePlayerID, "settings", {});
511	updateAttrb(uniquePlayerID, "isTunneled", false);
512	updateAttrb(uniquePlayerID, "forceStopOnPlay", false);
513}
514
515function getAttrb(uniquePlayerID, attrName) {
516	if (typeof document.playerAttrbs == "undefined" || typeof document.playerAttrbs[uniquePlayerID] == "undefined") {
517		return "";
518	}
519	return document.playerAttrbs[uniquePlayerID][attrName];
520}
521
522function fallBack(uniquePlayerID) {
523	if (getAttrb(uniquePlayerID, "fallbackStatus") == 2) {
524		return;
525	}
526	var newSettings = getAttrb(uniquePlayerID, "settings");
527	newSettings.start = getAttrb(uniquePlayerID, "position");
528	newSettings.file = newSettings.fallbackURL;
529	newSettings.autostart = true;
530	newSettings.provider = 'http';
531	if (newSettings.file.substr(-3) != "mp4") {
532		if (window.console) {
533			console.log("FALLBACK ERROR: FILE FOUND " + newSettings.file);
534			console.log(newSettings);
535		}
536		return;
537	}
538	if (document.getElementById(newSettings.videoContainer)) {
539		try {
540			jwplayer(newSettings.videoContainer).remove();
541		} catch (e) {
542			if (window.console) {
543				console.log("Could not be removed cleanly.");
544				console.log(e);
545			}
546		}
547		document.getElementById(newSettings.videoWrapper).innerHTML = "<div id='" + newSettings.videoContainer + "'></div>";
548		setCookie("httpFallback", "1", 1);
549	}
550	jwplayer(newSettings.videoContainer).setup(newSettings);
551	updateAttrb(uniquePlayerID, "fallbackStatus", "2");
552}
553
554function setCookie(sName, sValue, days) {
555	var expires = "";
556	if (days) {
557		var date = new Date();
558		date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
559		expires = date.toGMTString();
560	}
561	if (expires != null && expires != "")
562		document.cookie = sName + "=" + escape(sValue) + "; path=/; expires=" + expires;
563	else
564		document.cookie = sName + "=" + escape(sValue) + "; path=/;";
565}
566
567function getCookie(sName) {
568	var aCookie = document.cookie.split("; ");
569	for (var i = 0; i < aCookie.length; i++) {
570		var aCrumb = aCookie[i].split("=");
571		if (sName == aCrumb[0])
572			return unescape(aCrumb[1]);
573	}
574
575	return null;
576}
577
578function delCookie(sName) {
579	document.cookie = sName + "=x ; expires=Fri, 31 Dec 1999 23:59:59 GMT;";
580}
581
582
583function VideoInitIsLoaded() {
584	return true;
585}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.