Compare commits

...

22 Commits

Author SHA1 Message Date
Will Scullin 6e49066162
Merge pull request #42 from whscullin/whscullin/typescript
Typescript
2023-08-19 15:22:58 -07:00
Will Scullin f7ba798bba
Prettier 2023-08-19 15:07:00 -07:00
Will Scullin 0216e75e7f Enable strict 2023-08-06 12:47:43 -07:00
Will Scullin 88bd7836bc JS stays a 4 2023-08-06 07:44:12 -07:00
Will Scullin ca3f255a87 Lint, other build fixes 2023-08-06 07:34:07 -07:00
Will Scullin 3f6cfd67b7 Convert tests to Typescript 2023-08-06 06:20:11 -07:00
Will Scullin f2dd9b96a3 Update node 2023-08-06 06:04:16 -07:00
Will Scullin 59b40b3ac8 Convert apple1 to Typescript 2023-08-05 21:01:40 -07:00
Will Scullin 107d8d7409 Convert roms to Typescript 2023-08-05 19:55:03 -07:00
Will Scullin 6ed509209b Convert keyboard to Typescript 2023-08-05 19:44:04 -07:00
Will Scullin 62718d187d Convert aci to Typescript 2023-08-05 19:43:42 -07:00
Will Scullin fc536fdb20 Convert cpu6502 to Typescript 2023-08-05 19:43:03 -07:00
Will Scullin 23a1cb83a8 Convert apple1io to Typescript 2023-08-05 19:09:12 -07:00
Will Scullin 970f838132 Convert base64 to Typescript 2023-08-05 19:08:59 -07:00
Will Scullin f611c09428 Convert canvas to Typescript 2023-08-05 18:55:45 -07:00
Will Scullin afe03b4057 Convert copyright to Typescript 2023-08-05 18:41:13 -07:00
Will Scullin c5a0f236ee Convert prefs to Typescript 2023-08-05 18:40:42 -07:00
Will Scullin 3dd4c61bc9 Convert utils to Typescript 2023-08-05 18:38:41 -07:00
Will Scullin e9084acf8c Convert symbols to Typescript 2023-08-05 18:33:29 -07:00
Will Scullin ab4e611e8e Ignore .DS_Store 2023-08-05 18:32:40 -07:00
Will Scullin 418c714c45 Convert RAM to Typescript 2023-08-05 18:31:27 -07:00
Will Scullin d7ced8c03d Add Typescript 2023-08-05 18:27:00 -07:00
59 changed files with 14983 additions and 38368 deletions

View File

@ -10,6 +10,10 @@ trim_trailing_whitespace = true
[*.js]
indent_size = 4
[*.ts]
indent_size = 2
quote_type = single
[*.html]
indent_size = 2

View File

@ -1,20 +1,53 @@
{
// Global
"root": true,
"plugins": [
"prettier"
],
"parser": "@typescript-eslint/parser",
"extends": [
"eslint:recommended",
"plugin:prettier/recommended",
"plugin:jest/recommended"
],
"globals": {
"tapes": "writable"
},
"rules": {
"indent": [
2,
4
],
"quotes": [
2,
"single"
],
"linebreak-style": [
2,
"error",
"unix"
],
"semi": [
2,
"always"
"eqeqeq": [
"error",
"smart"
],
"prefer-const": [
"error"
],
"no-var": "error",
"no-use-before-define": "off",
"no-console": [
"error",
{
"allow": [
"info",
"warn",
"error"
]
}
],
"prettier/prettier": "error",
// Jest configuration
"jest/expect-expect": [
"error",
{
"assertFunctionNames": [
"expect*",
"checkImageData",
"testCode"
]
}
]
},
"env": {
@ -22,16 +55,109 @@
"browser": true,
"es6": true
},
"globals": {
"tapes": true
},
"parserOptions": {
"sourceType": "module"
},
"extends": "eslint:recommended",
"overrides": [
// All overrides matching a file are applied in-order, with the last
// taking precedence.
//
// TypeScript/TSX-specific configuration
{
"files": [ "bin/*", "babel.config.js", "webpack.config.js" ],
"files": [
"*.ts",
"*.tsx"
],
"plugins": [
"@typescript-eslint/eslint-plugin"
],
"extends": [
"plugin:@typescript-eslint/recommended",
"plugin:@typescript-eslint/recommended-requiring-type-checking"
],
"rules": {
"indent": [
"error",
2,
{
"SwitchCase": 1
}
],
// recommended is just "warn"
"@typescript-eslint/no-explicit-any": "error",
// enforce semicolons at ends of statements
"semi": "off",
"@typescript-eslint/semi": [
"error",
"always"
],
// enforce semicolons to separate members
"@typescript-eslint/member-delimiter-style": [
"error",
{
"multiline": {
"delimiter": "semi",
"requireLast": true
},
"singleline": {
"delimiter": "semi",
"requireLast": false
}
}
],
// definitions must come before uses for variables
"@typescript-eslint/no-use-before-define": [
"error",
{
"functions": false,
"classes": false
}
],
// no used variables
"no-unused-vars": "off",
"@typescript-eslint/no-unused-vars": [
"error",
{
"argsIgnorePattern": "^_"
}
],
// no redeclaration of classes, members or variables
"no-redeclare": "off",
"@typescript-eslint/no-redeclare": [
"error"
],
// allow empty interface definitions and empty extends
"@typescript-eslint/no-empty-interface": "off",
// allow explicit type declaration
"@typescript-eslint/no-inferrable-types": "off",
// allow some non-string types in templates
"@typescript-eslint/restrict-template-expressions": [
"error",
{
"allowNumber": true,
"allowBoolean": true
}
]
},
"parserOptions": {
"sourceType": "module",
"project": "./tsconfig.json"
}
},
// UI elements
{
"files": [
"js/ui/**.ts"
],
"rules": {
// allow non-null assertions since these classes reference the DOM
"@typescript-eslint/no-non-null-assertion": "off"
}
},
// JS Node configuration
{
"files": [
"bin/*",
"babel.config.js",
"webpack.config.js"
],
"rules": {
"no-console": 0
},
@ -40,17 +166,49 @@
"jquery": false,
"browser": false
}
}, {
"files": [ "test/*"],
},
// Test configuration
{
"files": [
"test/**/*"
],
"env": {
"node": true,
"jest": true
"jest": true,
"jasmine": true,
"node": true
},
"rules": {
"no-console": 0
}
}, {
"files": [ "js/entry1.js"],
},
// Entry point configuration
{
"files": [
"js/entry2.ts",
"js/entry2e.ts",
"jest.config.js"
],
"env": {
"commonjs": true
}
},
// Worker configuration
{
"files": [
"workers/*"
],
"parserOptions": {
"project": "workers/tsconfig.json"
}
}
]
],
"ignorePatterns": [
"coverage/**/*"
],
"settings": {
"react": {
"pragma": "h",
"version": "16"
}
}
}

View File

@ -4,23 +4,22 @@ on: [push]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [12.x]
node-version: [16.x, 18.x]
steps:
- uses: actions/checkout@v1
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
- name: npm install, build, and test
run: |
npm ci
npm run build --if-present
npm test
env:
CI: true
- uses: actions/checkout@v1
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
- name: npm install, build, and test
run: |
npm ci
npm run build --if-present
npm test
env:
CI: true

1
.gitignore vendored
View File

@ -1,4 +1,5 @@
.*~
.vscode
.DS_Store
/dist
/node_modules

View File

@ -10,4 +10,15 @@ module.exports = {
},
],
],
rules: [
{
test: /\.ts?$/i,
use: [
{
loader: 'ts-loader'
},
],
exclude: /node_modules/,
}
]
};

29
jest.config.js Normal file
View File

@ -0,0 +1,29 @@
module.exports = {
'moduleNameMapper': {
'^js/(.*)': '<rootDir>/js/$1',
'^test/(.*)': '<rootDir>/test/$1',
'\\.css$': 'identity-obj-proxy',
'\\.scss$': 'identity-obj-proxy',
},
'roots': [
'js/',
'test/',
],
'testMatch': [
'**/?(*.)+(spec|test).+(ts|js|tsx)'
],
'transform': {
'^.+\\.js$': 'babel-jest',
'^.+\\.ts$': 'ts-jest',
'^.*\\.tsx$': 'ts-jest',
},
'transformIgnorePatterns': [
'/node_modules/(?!(@testing-library/preact/dist/esm)/)',
],
'coveragePathIgnorePatterns': [
'/node_modules/',
'/js/roms/',
'/test/',
],
'preset': 'ts-jest',
};

View File

@ -1,498 +0,0 @@
import MicroModal from 'micromodal';
import Apple1IO from './apple1io';
import CPU6502 from './cpu6502';
import Prefs from './prefs';
import RAM from './ram';
import { TextPage } from './canvas1';
import { debug, hup } from './util';
import Basic from './roms/basic';
import Bios from './roms/bios';
import Krusader from './roms/krusader';
import ACI from './cards/aci';
import { mapKeyEvent, KeyBoard } from './ui/keyboard';
var DEBUG=false;
var TRACE=true;
var skidmarks = [];
var focused = false;
var startTime = Date.now();
var lastCycles = 0;
var renderedFrames = 0, lastFrames = 0;
var paused = false;
var hashtag;
var prefs = new Prefs();
var runTimer = null;
var cpu = new CPU6502();
var krusader = window.location.hash == '#krusader';
var raml, ramh, rom, aci, io, text, keyboard;
// 32K base memory. Should be 0x0f for 4K, 0x1f for 8K, 0x3f for 16K
raml = new RAM(0x00, 0x7f);
text = new TextPage();
text.init();
aci = new ACI(cpu, { progress: function(val) {
document.querySelector('#tape').style.width = val * 100 + 'px';
}});
io = new Apple1IO(text);
if (krusader) {
ramh = null;
rom = new Krusader();
} else {
// ramh = new RAM(0xe0, 0xef); // 4K ACI memory.
ramh = new Basic();
rom = new Bios();
}
keyboard = new KeyBoard('#keyboard', cpu, io, text);
cpu.addPageHandler(raml);
if (ramh) {
cpu.addPageHandler(ramh);
}
cpu.addPageHandler(rom);
cpu.addPageHandler(aci);
cpu.addPageHandler(io);
var showFPS = false;
//aci.setData([0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88])
//aci.setData([0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07])
//aci.setData([0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef])
//aci.setData(tapes['BASIC']);
aci.setData(window.tapes['Microchess'].tracks);
// Audio Buffer Source
var context;
if (typeof window.webkitAudioContext !== 'undefined') {
context = new window.webkitAudioContext();
} else if (typeof window.AudioContext !== 'undefined') {
context = new window.AudioContext();
}
export function doLoadLocal(files) {
context.resume();
files = files || document.querySelector('#local_file').files;
if (files.length == 1) {
var file = files[0];
var fileReader = new FileReader();
fileReader.onload = function(ev) {
context.decodeAudioData(
ev.target.result,
function(buffer) {
var buf = [];
var data = buffer.getChannelData(0);
var old = (data[0] > 0.25);
var last = 0;
for (var idx = 1; idx < data.length; idx++) {
var current = (data[idx] > 0.25);
if (current != old) {
var delta = idx - last;
buf.push(parseInt(delta / buffer.sampleRate * 1023000));
old = current;
last = idx;
}
}
aci.buffer = buf;
MicroModal.close('local-modal');
},
function() {
window.alert('Unable to read tape file: ' + file.name);
}
);
};
fileReader.readAsArrayBuffer(file);
}
}
function updateKHz() {
var now = Date.now();
var ms = now - startTime;
var cycles = cpu.cycles();
var delta;
if (showFPS) {
delta = renderedFrames - lastFrames;
var fps = parseInt(delta/(ms/1000));
document.querySelector('#khz').innerHTML = fps + 'fps';
} else {
delta = cycles - lastCycles;
var khz = parseInt(delta/ms);
document.querySelector('#khz').innerHTML = khz + 'KHz';
}
startTime = now;
lastCycles = cycles;
lastFrames = renderedFrames;
}
var loading = false;
var throttling = true;
var turbotape = false;
export function toggleFPS() {
showFPS = !showFPS;
}
export function toggleSpeed()
{
throttling = document.querySelector('#speed_toggle').checked;
if (runTimer) {
run();
}
}
export function setKeyBuffer(text) {
io.paste(text);
}
export function setTurboTape(val) {
turbotape = val;
}
var _requestAnimationFrame =
window.requestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.msRequestAnimationFrame;
function run(pc) {
if (runTimer) {
clearInterval(runTimer);
}
if (pc) {
cpu.setPC(pc);
}
var ival = 30, step = 1023 * ival, stepMax = step;
if (!throttling) {
ival = 1;
}
var now, last = Date.now();
var runFn = function() {
now = Date.now();
renderedFrames++;
if (_requestAnimationFrame) {
step = (now - last) * 1023;
last = now;
if (step > stepMax) {
step = stepMax;
}
}
if (document.location.hash != hashtag) {
hashtag = document.location.hash;
}
if (!loading) {
if (DEBUG) {
cpu.stepCyclesDebug(TRACE ? 1 : step, function() {
var line = cpu.dumpRegisters() + ' ' + cpu.dumpPC();
if (TRACE) {
debug(line);
} else {
skidmarks.push();
if (skidmarks.length > 256) {
skidmarks.shift();
}
}
});
} else {
cpu.stepCycles(step);
}
text.blit();
}
if (!paused && _requestAnimationFrame) {
_requestAnimationFrame(runFn);
}
};
if (_requestAnimationFrame) {
_requestAnimationFrame(runFn);
} else {
runTimer = setInterval(runFn, ival);
}
}
function stop() {
if (runTimer) {
clearInterval(runTimer);
}
runTimer = null;
}
function reset()
{
cpu.reset();
}
export function loadBinary(bin) {
stop();
for (var idx = 0; idx < bin.length; idx++) {
var pos = bin.start + idx;
cpu.write(pos >> 8, pos & 0xff, bin.data[idx]);
}
run(bin.start);
}
var _key;
function _keydown(evt) {
if (evt.keyCode === 112) {
cpu.reset();
} else if (evt.keyCode === 113) {
if (document.webkitIsFullScreen) {
document.webkitCancelFullScreen();
} else {
var elem = document.getElementById('display');
elem.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT);
}
} else if (evt.key === 'Shift') {
keyboard.shiftKey(true);
} else if (evt.key == 'Control') {
keyboard.controlKey(true);
} else if (!focused && (!evt.metaKey || evt.ctrlKey)) {
evt.preventDefault();
var key = mapKeyEvent(evt);
if (key != 0xff) {
if (_key != 0xff) io.keyUp();
io.keyDown(key);
_key = key;
}
}
}
function _keyup(evt) {
_key = 0xff;
if (evt.key === 'Shift') {
keyboard.shiftKey(false);
} else if (evt.key === 'Control') {
keyboard.controlKey(false);
} else {
if (!focused) {
io.keyUp();
}
}
}
var _updateScreenTimer = null;
export function updateScreen() {
var green = document.querySelector('#green_screen').checked;
var scanlines = document.querySelector('#show_scanlines').checked;
text.green(green);
text.scanlines(scanlines);
if (!_updateScreenTimer)
_updateScreenTimer =
setInterval(function() {
text.refresh();
clearInterval(_updateScreenTimer);
_updateScreenTimer = null;
}, 100);
}
paused = false;
export function pauseRun(b) {
if (paused) {
run();
b.value = 'Pause';
} else {
stop();
b.value = 'Run';
}
paused = !paused;
}
export function openOptions() {
MicroModal.show('options-modal');
}
export function openLoadText(event) {
if (event && event.altKey) {
MicroModal.show('local-modal');
} else {
MicroModal.show('input-modal');
}
}
export function doLoadText() {
var text = document.querySelector('#text_input').value;
if (!text.indexOf('//Binary')) {
var lines = text.split('\n');
lines.forEach(function(line) {
var parts = line.split(': ');
if (parts.length == 2) {
var addr;
if (parts[0].length > 0) {
addr = parseInt(parts[0], 16);
}
var data = parts[1].split(' ');
for (var idx = 0; idx < data.length; idx++) {
cpu.write(addr >> 8, addr & 0xff, parseInt(data[idx], 16));
addr++;
}
}
});
} else {
io.paste(text);
}
MicroModal.close('input-modal');
}
export function handleDragOver(event) {
event.preventDefault();
event.dataTransfer.dropEffect = 'copy';
}
export function handleDrop(event) {
event.preventDefault();
event.stopPropagation();
var dt = event.dataTransfer;
if (dt.files.length > 0) {
doLoadLocal(dt.files);
}
}
export function handleDragEnd(event) {
var dt = event.dataTransfer;
if (dt.items) {
for (var i = 0; i < dt.items.length; i++) {
dt.items.remove(i);
}
} else {
event.dataTransfer.clearData();
}
}
MicroModal.init();
document.addEventListener('DOMContentLoaded', function() {
hashtag = document.location.hash;
/*
* Input Handling
*/
var canvas = document.getElementById('text');
var context = canvas.getContext('2d');
text.setContext(context);
window.addEventListener('keydown', _keydown);
window.addEventListener('keyup', _keyup);
window.addEventListener('paste', (event) => {
var paste = (event.clipboardData || window.clipboardData).getData('text');
setKeyBuffer(paste);
event.preventDefault();
});
window.addEventListener('copy', (event) => {
event.clipboardData.setData('text/plain', text.getText());
event.preventDefault();
});
document.querySelector('.overscan').addEventListener('paste', function(event) {
io.paste(event.originalEvent.clipboardData().getData('text/plain'));
event.preventDefault();
});
document.querySelectorAll('input,textarea').forEach(function(el) {
el.addEventListener('focus', function() { focused = true; });
});
document.querySelectorAll('input,textarea').forEach(function(el) {
el.addEventListener('blur', function() { focused = false; });
});
keyboard.create();
if (prefs.havePrefs()) {
document.querySelectorAll('input[type=checkbox]').forEach(function(el) {
var val = prefs.readPref(el.id);
if (val != null)
el.checked = JSON.parse(val);
});
document.querySelectorAll('input[type=checkbox]').forEach(function(el) {
el.addEventListener('change', function() {
prefs.writePref(el.id, JSON.stringify(el.checked));
});
});
}
turbotape = document.querySelector('#turbo_tape').checked;
Object.keys(window.tapes).sort().forEach(function(key) {
var option = document.createElement('option');
option.value = key;
option.text = key;
document.querySelector('#tape_select').append(option);
});
function doTapeSelect() {
var tapeId = document.querySelector('#tape_select').value;
var tape = window.tapes[tapeId];
if (!tape) {
document.querySelector('#text_input').value = '';
return;
}
debug('Loading', tapeId);
window.location.hash = tapeId;
reset();
if (turbotape) {
var trackIdx = 0, script = '';
var parts = tape.script.split('\n');
// Ignore part 0 (C100R)
// Split part 1 into ranges
var ranges = parts[1].split(' ');
var idx;
for (idx = 0; idx < ranges.length; idx++) {
var range = ranges[idx].split('.');
var start = parseInt(range[0], 16);
var end = parseInt(range[1], 16);
var track = tape.tracks[trackIdx];
var kdx = 0;
for (var jdx = start; jdx <= end; jdx++) {
cpu.write(jdx >> 8, jdx & 0xff, track[kdx++]);
}
trackIdx++;
}
// Execute parts 2-n
for (idx = 2; idx < parts.length; idx++) {
if (parts[idx]) {
script += parts[idx] + '\n';
}
}
document.querySelector('#text_input').value = script;
} else {
aci.setData(tape.tracks);
document.querySelector('#text_input').value = tape.script;
}
doLoadText();
}
document.querySelector('#tape_select').addEventListener('change', doTapeSelect);
run();
setInterval(updateKHz, 1000);
updateScreen();
var tape = hup();
if (tape) {
openLoadText();
document.querySelector('#tape_select').value = tape;
doTapeSelect();
}
});

536
js/apple1.ts Normal file
View File

@ -0,0 +1,536 @@
/* Copyright 2010-2023 Will Scullin <scullin@scullinsteel.com>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation. No representations are made about the suitability of this
* software for any purpose. It is provided 'as is' without express or
* implied warranty.
*/
import MicroModal from 'micromodal';
import Apple1IO from './apple1io';
import CPU6502 from './cpu6502';
import Prefs from './prefs';
import RAM from './ram';
import { TextPage } from './canvas1';
import { debug, hup } from './util';
import Basic from './roms/basic';
import Bios from './roms/bios';
import Krusader from './roms/krusader';
import ACI from './cards/aci';
import { mapKeyEvent, KeyBoard } from './ui/keyboard';
import { address, byte } from './types';
// eslint-disable-next-line prefer-const
let DEBUG = false;
// eslint-disable-next-line prefer-const
let TRACE = true;
const skidmarks: string[] = [];
let focused = false;
let startTime = Date.now();
let lastCycles = 0;
let renderedFrames = 0,
lastFrames = 0;
let paused = false;
let hashtag: string | undefined;
const prefs = new Prefs();
let runTimer: ReturnType<typeof setInterval> | null = null;
const cpu = new CPU6502();
const krusader = window.location.hash === '#krusader';
let ramh, rom;
// 32K base memory. Should be 0x0f for 4K, 0x1f for 8K, 0x3f for 16K
const raml = new RAM(0x00, 0x7f);
const text = new TextPage();
text.init();
const aci = new ACI(cpu, {
progress: function (val) {
document.querySelector<HTMLElement>('#tape')!.style.width =
val * 100 + 'px';
},
});
const io = new Apple1IO(text);
if (krusader) {
ramh = null;
rom = new Krusader();
} else {
// ramh = new RAM(0xe0, 0xef); // 4K ACI memory.
ramh = new Basic();
rom = new Bios();
}
const keyboard = new KeyBoard('#keyboard', cpu, io, text);
cpu.addPageHandler(raml);
if (ramh) {
cpu.addPageHandler(ramh);
}
cpu.addPageHandler(rom);
cpu.addPageHandler(aci);
cpu.addPageHandler(io);
let showFPS = false;
interface Tape {
script: string;
tracks: number[][];
}
declare global {
interface Window {
tapes: Record<string, Tape>;
}
}
//aci.setData([0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88])
//aci.setData([0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07])
//aci.setData([0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef])
//aci.setData(tapes['BASIC']);
aci.setData(window.tapes['Microchess'].tracks);
// Audio Buffer Source
declare global {
interface Window {
webkitAudioContext: AudioContext;
}
}
const AudioContext = window.AudioContext || window.webkitAudioContext;
const context = new AudioContext();
export function doLoadLocal(files: FileList) {
context
.resume()
.then(() => {
files =
files || document.querySelector<HTMLInputElement>('#local_file')!.files;
if (files.length === 1) {
const file = files[0];
const fileReader = new FileReader();
fileReader.onload = function (ev) {
context
.decodeAudioData(
ev.target!.result as ArrayBuffer,
function (buffer) {
const buf = [];
const data = buffer.getChannelData(0);
let old = data[0] > 0.25;
let last = 0;
for (let idx = 1; idx < data.length; idx++) {
const current = data[idx] > 0.25;
if (current !== old) {
const delta = idx - last;
buf.push(Math.floor((delta / buffer.sampleRate) * 1023000));
old = current;
last = idx;
}
}
aci.buffer = buf;
MicroModal.close('local-modal');
},
function () {
window.alert('Unable to read tape file: ' + file.name);
},
)
.catch(console.error);
};
fileReader.readAsArrayBuffer(file);
}
})
.catch(console.error);
}
function updateKHz() {
const now = Date.now();
const ms = now - startTime;
const cycles = cpu.getCycles();
let delta: number;
if (showFPS) {
delta = renderedFrames - lastFrames;
const fps = Math.floor(delta / (ms / 1000));
document.querySelector('#khz')!.innerHTML = fps + 'fps';
} else {
delta = cycles - lastCycles;
const khz = Math.floor(delta / ms);
document.querySelector('#khz')!.innerHTML = khz + 'KHz';
}
startTime = now;
lastCycles = cycles;
lastFrames = renderedFrames;
}
let throttling = true;
let turbotape = false;
export function toggleFPS() {
showFPS = !showFPS;
}
export function toggleSpeed() {
throttling =
document.querySelector<HTMLInputElement>('#speed_toggle')!.checked;
if (runTimer) {
run();
}
}
export function setKeyBuffer(text: string) {
io.paste(text);
}
export function setTurboTape(val: boolean) {
turbotape = val;
}
function run(pc?: address) {
if (runTimer) {
clearInterval(runTimer);
}
if (pc) {
cpu.setPC(pc);
}
let ival = 30;
let step = 1023 * ival;
const stepMax = step;
if (!throttling) {
ival = 1;
}
let now;
let last = Date.now();
const runFn = function () {
now = Date.now();
renderedFrames++;
step = (now - last) * 1023;
last = now;
if (step > stepMax) {
step = stepMax;
}
if (document.location.hash !== hashtag) {
hashtag = document.location.hash;
}
if (DEBUG) {
cpu.stepCyclesDebug(TRACE ? 1 : step, function () {
const line = JSON.stringify(cpu.getState());
if (TRACE) {
debug(line);
} else {
skidmarks.push(line);
if (skidmarks.length > 256) {
skidmarks.shift();
}
}
});
} else {
cpu.stepCycles(step);
}
text.blit();
if (!paused) {
requestAnimationFrame(runFn);
}
};
requestAnimationFrame(runFn);
}
function stop() {
if (runTimer) {
clearInterval(runTimer);
}
runTimer = null;
}
function reset() {
cpu.reset();
}
declare global {
interface Document {
webkitCancelFullScreen: () => void;
webkitIsFullScreen: boolean;
}
interface Element {
webkitRequestFullScreen: (options?: unknown) => void;
}
}
let _key: byte;
function _keydown(evt: KeyboardEvent) {
if (evt.keyCode === 112) {
cpu.reset();
} else if (evt.keyCode === 113) {
if (document.webkitIsFullScreen) {
document.webkitCancelFullScreen();
} else {
const elem = document.getElementById('display');
elem!.webkitRequestFullScreen();
}
} else if (evt.key === 'Shift') {
keyboard.shiftKey(true);
} else if (evt.key === 'Control') {
keyboard.controlKey(true);
} else if (!focused && (!evt.metaKey || evt.ctrlKey)) {
evt.preventDefault();
const key = mapKeyEvent(evt);
if (key !== 0xff) {
if (_key !== 0xff) io.keyUp();
io.keyDown(key);
_key = key;
}
}
}
function _keyup(evt: KeyboardEvent) {
_key = 0xff;
if (evt.key === 'Shift') {
keyboard.shiftKey(false);
} else if (evt.key === 'Control') {
keyboard.controlKey(false);
} else {
if (!focused) {
io.keyUp();
}
}
}
let _updateScreenTimer: ReturnType<typeof setInterval> | null = null;
export function updateScreen() {
const green =
document.querySelector<HTMLInputElement>('#green_screen')!.checked;
const scanlines =
document.querySelector<HTMLInputElement>('#show_scanlines')!.checked;
text.green(green);
text.scanlines(scanlines);
if (!_updateScreenTimer)
_updateScreenTimer = setInterval(function () {
text.refresh();
if (_updateScreenTimer) {
clearInterval(_updateScreenTimer);
}
_updateScreenTimer = null;
}, 100);
}
paused = false;
export function pauseRun(b: HTMLButtonElement) {
if (paused) {
run();
b.value = 'Pause';
} else {
stop();
b.value = 'Run';
}
paused = !paused;
}
export function openOptions() {
MicroModal.show('options-modal');
}
export function openLoadText(event?: MouseEvent) {
if (event && event.altKey) {
MicroModal.show('local-modal');
} else {
MicroModal.show('input-modal');
}
}
export function doLoadText() {
const text = document.querySelector<HTMLInputElement>('#text_input')!.value;
if (!text.indexOf('//Binary')) {
const lines = text.split('\n');
lines.forEach(function (line) {
const parts = line.split(': ');
if (parts.length === 2) {
let addr: address = 0;
if (parts[0].length > 0) {
addr = parseInt(parts[0], 16);
}
const data = parts[1].split(' ');
for (let idx = 0; idx < data.length; idx++) {
cpu.write(addr >> 8, addr & 0xff, parseInt(data[idx], 16));
addr++;
}
}
});
} else {
io.paste(text);
}
MicroModal.close('input-modal');
}
export function handleDragOver(event: DragEvent) {
event.preventDefault();
event.dataTransfer!.dropEffect = 'copy';
}
export function handleDrop(event: DragEvent) {
event.preventDefault();
event.stopPropagation();
const dt = event.dataTransfer;
if (dt?.files && dt.files.length > 0) {
doLoadLocal(dt.files);
}
}
export function handleDragEnd(event: DragEvent) {
const dt = event.dataTransfer;
if (dt?.items) {
for (let i = 0; i < dt.items.length; i++) {
dt.items.remove(i);
}
} else {
event.dataTransfer?.clearData();
}
}
MicroModal.init();
document.addEventListener('DOMContentLoaded', function () {
hashtag = document.location.hash;
/*
* Input Handling
*/
const canvas = document.querySelector<HTMLCanvasElement>('#text')!;
const context = canvas.getContext('2d')!;
text.setContext(context);
window.addEventListener('keydown', _keydown);
window.addEventListener('keyup', _keyup);
window.addEventListener('paste', (event) => {
const paste = event.clipboardData!.getData('text/plain');
setKeyBuffer(paste);
event.preventDefault();
});
window.addEventListener('copy', (event) => {
event.clipboardData?.setData('text/plain', text.getText());
event.preventDefault();
});
document.querySelectorAll('input,textarea').forEach(function (el) {
el.addEventListener('focus', function () {
focused = true;
});
});
document.querySelectorAll('input,textarea').forEach(function (el) {
el.addEventListener('blur', function () {
focused = false;
});
});
keyboard.create();
if (prefs.havePrefs()) {
document
.querySelectorAll<HTMLInputElement>('input[type=checkbox]')
.forEach(function (el) {
const val = prefs.readPref(el.id);
if (val != null) el.checked = !!JSON.parse(val);
});
document
.querySelectorAll<HTMLInputElement>('input[type=checkbox]')
.forEach(function (el) {
el.addEventListener('change', function () {
prefs.writePref(el.id, JSON.stringify(el.checked));
});
});
}
turbotape = document.querySelector<HTMLInputElement>('#turbo_tape')!.checked;
Object.keys(window.tapes)
.sort()
.forEach(function (key) {
const option = document.createElement('option');
option.value = key;
option.text = key;
document.querySelector('#tape_select')!.append(option);
});
function doTapeSelect() {
const tapeId =
document.querySelector<HTMLInputElement>('#tape_select')!.value;
const tape = window.tapes[tapeId];
if (!tape) {
document.querySelector<HTMLInputElement>('#text_input')!.value = '';
return;
}
debug('Loading', tapeId);
window.location.hash = tapeId;
reset();
if (turbotape) {
let trackIdx = 0,
script = '';
const parts = tape.script.split('\n');
// Ignore part 0 (C100R)
// Split part 1 into ranges
const ranges = parts[1].split(' ');
let idx;
for (idx = 0; idx < ranges.length; idx++) {
const range = ranges[idx].split('.');
const start = parseInt(range[0], 16);
const end = parseInt(range[1], 16);
const track = tape.tracks[trackIdx];
let kdx = 0;
for (let jdx = start; jdx <= end; jdx++) {
cpu.write(jdx >> 8, jdx & 0xff, track[kdx++]);
}
trackIdx++;
}
// Execute parts 2-n
for (idx = 2; idx < parts.length; idx++) {
if (parts[idx]) {
script += parts[idx] + '\n';
}
}
document.querySelector<HTMLInputElement>('#text_input')!.value = script;
} else {
aci.setData(tape.tracks);
document.querySelector<HTMLInputElement>('#text_input')!.value =
tape.script;
}
doLoadText();
}
document
.querySelector('#tape_select')!
.addEventListener('change', doTapeSelect);
run();
setInterval(updateKHz, 1000);
updateScreen();
const tape = hup();
if (tape) {
openLoadText();
document.querySelector<HTMLInputElement>('#tape_select')!.value = tape;
doTapeSelect();
}
});

View File

@ -1,97 +0,0 @@
/* Copyright 2010-2019 Will Scullin <scullin@scullinsteel.com>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation. No representations are made about the suitability of this
* software for any purpose. It is provided "as is" without express or
* implied warranty.
*/
export default function Apple1IO(text) {
var _key = 0;
var _keyReady = false;
var _displayReady = false;
var _nextDSP = 0;
var _buffer = [];
var LOC = {
KBD: 0x10,
KBDRDY: 0x011,
DSP: 0x12,
DSPCTL: 0x13
};
return {
start: function() { return 0xd0; },
end: function() { return 0xd0; },
read: function(page, off) {
var result = 0;
off &= 0x13;
switch (off) {
case LOC.KBD:
// Keyboard
if (_buffer.length) {
result = _buffer.shift().toUpperCase().charCodeAt(0) & 0x7f;
_keyReady = (_buffer.length > 0);
} else {
result = _key;
_keyReady = false;
}
result |= 0x80;
break;
case LOC.KBDRDY:
result = _keyReady ? 0x80 : 0x00;
break;
case LOC.DSP:
// Display
// result = (Math.random() > 0.5) ? 0x80 : 0x00;
result = (Date.now() > _nextDSP) ? 0x00 : 0x80;
break;
case LOC.DSPCTL:
break;
}
return result;
},
write: function(page, off, val) {
off &= 0x13;
switch (off) {
case LOC.KBD:
break;
case LOC.KBDRDY:
break;
case LOC.DSP:
// Display
if (_displayReady) {
text.write(val);
}
_nextDSP = Date.now() + ((_buffer.length > 0) ? 0 : 17);
break;
case LOC.DSPCTL:
// Don't pretend we care what the value was...
_displayReady = true;
break;
}
},
reset: function apple1io_reset() {
text.clear();
_buffer = [];
_keyReady = false;
_displayReady = false;
},
keyUp: function apple1io_keyUp() {
},
keyDown: function apple1io_keyDown(key) {
_key = key;
_keyReady = true;
},
paste: function apple1io_paste(buffer) {
buffer = buffer.replace(/\/\/.*\n/g, '');
buffer = buffer.replace(/\n/g, '\r');
_buffer = buffer.split('');
_keyReady = true;
}
};
}

106
js/apple1io.ts Normal file
View File

@ -0,0 +1,106 @@
/* Copyright 2010-2023 Will Scullin <scullin@scullinsteel.com>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation. No representations are made about the suitability of this
* software for any purpose. It is provided "as is" without express or
* implied warranty.
*/
import { TextPage } from './canvas1';
import type { byte } from './types';
const LOC = {
KBD: 0x10,
KBDRDY: 0x011,
DSP: 0x12,
DSPCTL: 0x13,
} as const;
export default class Apple1IO {
_key = 0;
_keyReady = false;
_displayReady = false;
_nextDSP = 0;
_buffer: string[] = [];
constructor(private text: TextPage) {}
start() {
return 0xd0;
}
end() {
return 0xd0;
}
read(_page: byte, off: byte): byte {
let result = 0;
off &= 0x13;
switch (off) {
case LOC.KBD:
{
// Keyboard
const key = this._buffer.shift();
if (key != null) {
result = key.toUpperCase().charCodeAt(0) & 0x7f;
this._keyReady = this._buffer.length > 0;
} else {
result = this._key;
this._keyReady = false;
}
result |= 0x80;
}
break;
case LOC.KBDRDY:
result = this._keyReady ? 0x80 : 0x00;
break;
case LOC.DSP:
// Display
// result = (Math.random() > 0.5) ? 0x80 : 0x00;
result = Date.now() > this._nextDSP ? 0x00 : 0x80;
break;
case LOC.DSPCTL:
break;
}
return result;
}
write(_page: byte, off: byte, val: byte): void {
off &= 0x13;
switch (off) {
case LOC.KBD:
break;
case LOC.KBDRDY:
break;
case LOC.DSP:
// Display
if (this._displayReady) {
this.text.write(val);
}
this._nextDSP = Date.now() + (this._buffer.length > 0 ? 0 : 17);
break;
case LOC.DSPCTL:
// Don't pretend we care what the value was...
this._displayReady = true;
break;
}
}
reset() {
this.text.clear();
this._buffer = [];
this._keyReady = false;
this._displayReady = false;
}
keyUp() {}
keyDown(key: byte) {
this._key = key;
this._keyReady = true;
}
paste(buffer: string) {
buffer = buffer.replace(/\/\/.*\n/g, '');
buffer = buffer.replace(/\n/g, '\r');
this._buffer = buffer.split('');
this._keyReady = true;
}
}

View File

@ -1,110 +0,0 @@
export function base64_encode (data) {
// Twacked by Will Scullin to handle arrays of "bytes"
// http://kevin.vanzonneveld.net
// + original by: Tyler Akins (http://rumkin.com)
// + improved by: Bayron Guevara
// + improved by: Thunder.m
// + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// + bugfixed by: Pellentesque Malesuada
// + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// - depends on: utf8_encode
// * example 1: base64_encode('Kevin van Zonneveld');
// * returns 1: 'S2V2aW4gdmFuIFpvbm5ldmVsZA=='
// mozilla has this native
// - but breaks in 2.0.0.12!
//if (typeof this.window['atob'] == 'function') {
// return atob(data);
//}
var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, ac = 0, enc='', tmp_arr = [];
if (!data) {
return data;
}
do { // pack three octets into four hexets
o1 = data[i++];
o2 = data[i++];
o3 = data[i++];
bits = o1<<16 | o2<<8 | o3;
h1 = bits>>18 & 0x3f;
h2 = bits>>12 & 0x3f;
h3 = bits>>6 & 0x3f;
h4 = bits & 0x3f;
// use hexets to index into b64, and append result to encoded string
tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
} while (i < data.length);
enc = tmp_arr.join('');
switch (data.length % 3) {
case 1:
enc = enc.slice(0, -2) + '==';
break;
case 2:
enc = enc.slice(0, -1) + '=';
break;
}
return enc;
}
export function base64_decode(data) {
// Twacked by Will Scullin to handle arrays of "bytes"
// http://kevin.vanzonneveld.net
// + original by: Tyler Akins (http://rumkin.com)
// + improved by: Thunder.m
// + input by: Aman Gupta
// + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// + bugfixed by: Onno Marsman
// + bugfixed by: Pellentesque Malesuada
// + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// + input by: Brett Zamir (http://brett-zamir.me)
// + bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// - depends on: utf8_decode
// * example 1: base64_decode('S2V2aW4gdmFuIFpvbm5ldmVsZA==');
// * returns 1: 'Kevin van Zonneveld'
// mozilla has this native
// - but breaks in 2.0.0.12!
//if (typeof this.window['btoa'] == 'function') {
// return btoa(data);
//}
var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, ac = 0, tmp_arr = [];
if (!data) {
return data;
}
do { // unpack four hexets into three octets using index points in b64
h1 = b64.indexOf(data.charAt(i++));
h2 = b64.indexOf(data.charAt(i++));
h3 = b64.indexOf(data.charAt(i++));
h4 = b64.indexOf(data.charAt(i++));
bits = h1<<18 | h2<<12 | h3<<6 | h4;
o1 = bits>>16 & 0xff;
o2 = bits>>8 & 0xff;
o3 = bits & 0xff;
tmp_arr[ac++] = o1;
if (h3 != 64) {
tmp_arr[ac++] = o2;
}
if (h4 != 64) {
tmp_arr[ac++] = o3;
}
} while (i < data.length);
return tmp_arr;
}

172
js/base64.ts Normal file
View File

@ -0,0 +1,172 @@
import { memory } from './types';
const B64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
/** Encode an array of bytes in base64. */
export function base64_encode(data: null | undefined): undefined;
export function base64_encode(data: memory): string;
export function base64_encode(
data: memory | null | undefined,
): string | undefined {
// Twacked by Will Scullin to handle arrays of 'bytes'
// http://kevin.vanzonneveld.net
// + original by: Tyler Akins (http://rumkin.com)
// + improved by: Bayron Guevara
// + improved by: Thunder.m
// + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// + bugfixed by: Pellentesque Malesuada
// + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// - depends on: utf8_encode
// * example 1: base64_encode('Kevin van Zonneveld');
// * returns 1: 'S2V2aW4gdmFuIFpvbm5ldmVsZA=='
// mozilla has this native
// - but breaks in 2.0.0.12!
//if (typeof this.window['atob'] == 'function') {
// return atob(data);
//}
let o1,
o2,
o3,
h1,
h2,
h3,
h4,
bits,
i = 0,
ac = 0,
enc = '';
const tmp_arr = [];
if (!data) {
return undefined;
}
do {
// pack three octets into four hexets
o1 = data[i++];
o2 = data[i++];
o3 = data[i++];
bits = (o1 << 16) | (o2 << 8) | o3;
h1 = (bits >> 18) & 0x3f;
h2 = (bits >> 12) & 0x3f;
h3 = (bits >> 6) & 0x3f;
h4 = bits & 0x3f;
// use hexets to index into b64, and append result to encoded string
tmp_arr[ac++] =
B64.charAt(h1) + B64.charAt(h2) + B64.charAt(h3) + B64.charAt(h4);
} while (i < data.length);
enc = tmp_arr.join('');
switch (data.length % 3) {
case 1:
enc = enc.slice(0, -2) + '==';
break;
case 2:
enc = enc.slice(0, -1) + '=';
break;
}
return enc;
}
/** Returns undefined if the input is null or undefined. */
export function base64_decode(data: null | undefined): undefined;
/** Returns an array of bytes from the given base64-encoded string. */
export function base64_decode(data: string): memory;
/** Returns an array of bytes from the given base64-encoded string. */
export function base64_decode(
data: string | null | undefined,
): memory | undefined {
// Twacked by Will Scullin to handle arrays of 'bytes'
// http://kevin.vanzonneveld.net
// + original by: Tyler Akins (http://rumkin.com)
// + improved by: Thunder.m
// + input by: Aman Gupta
// + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// + bugfixed by: Onno Marsman
// + bugfixed by: Pellentesque Malesuada
// + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// + input by: Brett Zamir (http://brett-zamir.me)
// + bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// - depends on: utf8_decode
// * example 1: base64_decode('S2V2aW4gdmFuIFpvbm5ldmVsZA==');
// * returns 1: 'Kevin van Zonneveld'
// mozilla has this native
// - but breaks in 2.0.0.12!
//if (typeof this.window['btoa'] == 'function') {
// return btoa(data);
//}
let o1,
o2,
o3,
h1,
h2,
h3,
h4,
bits,
i = 0,
ac = 0;
const tmp_arr = [];
if (!data) {
return undefined;
}
do {
// unpack four hexets into three octets using index points in B64
h1 = B64.indexOf(data.charAt(i++));
h2 = B64.indexOf(data.charAt(i++));
h3 = B64.indexOf(data.charAt(i++));
h4 = B64.indexOf(data.charAt(i++));
bits = (h1 << 18) | (h2 << 12) | (h3 << 6) | h4;
o1 = (bits >> 16) & 0xff;
o2 = (bits >> 8) & 0xff;
o3 = bits & 0xff;
tmp_arr[ac++] = o1;
if (h3 !== 64) {
tmp_arr[ac++] = o2;
}
if (h4 !== 64) {
tmp_arr[ac++] = o3;
}
} while (i < data.length);
return new Uint8Array(tmp_arr);
}
const DATA_URL_PREFIX = 'data:application/octet-stream;base64,';
export function base64_json_parse(json: string): unknown {
const reviver = (_key: string, value: unknown) => {
if (typeof value === 'string' && value.startsWith(DATA_URL_PREFIX)) {
return base64_decode(value.slice(DATA_URL_PREFIX.length));
}
return value;
};
return JSON.parse(json, reviver);
}
export function base64_json_stringify(json: unknown) {
const replacer = (_key: string, value: unknown) => {
if (value instanceof Uint8Array) {
return DATA_URL_PREFIX + base64_encode(value);
}
return value;
};
return JSON.stringify(json, replacer);
}

View File

@ -1,221 +0,0 @@
/* Copyright 2010-2019Will Scullin <scullin@scullinsteel.com>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation. No representations are made about the suitability of this
* software for any purpose. It is provided "as is" without express or
* implied warranty.
*/
import { charset } from './roms/apple1char';
/*
0: A9 9 AA 20 EF FF E8 8A 4C 2 0
0R
*/
/*
* Text Page Drawing
*/
export function TextPage()
{
var _page;
var _context;
var _buffer = [];
var _greenMode = false;
var _scanlines = false;
var _black = [0x00,0x00,0x00];
var _white = [0xee,0xff,0xff];
var _green = [0x00,0xff,0x80];
var _blinking = 0;
var _row = 0;
var _col = 0;
var _dirty = false;
function _init() {
_buffer = [];
for (var row = 0; row < 24; row++) {
_buffer[row] = [];
for (var col = 0; col < 40; col++) {
_buffer[row][col] = col % 2 ? 0x00 : 0xff;
}
}
_dirty = true;
}
_init();
return {
init: function() {
var self = this;
window.setInterval(function() {
_blinking = (_blinking + 1) % 3;
self._blink();
_dirty = true;
}, 333);
},
write: function(val) {
var col;
val &= 0x7f;
if (this.transcript) {
if (val == 0xd) {
this.transcript += '\n';
} else if (val >= 0x20) {
if (val >= 0x60) {
val &= 0x5f;
}
this.transcript += String.fromCharCode(val);
}
}
if (val == 0x0d) {
for (col = _col; col < 40; col++) {
_buffer[_row][col] = 0x20;
}
_col = 0;
_row++;
} else {
_buffer[_row][_col] = val;
_col++;
if (_col > 39) {
_col = 0;
_row++;
}
}
if (_row > 23) {
_row = 23;
_buffer.shift();
_buffer.push([]);
for (col = 0; col < 40; col++) {
_buffer[_row][col] = 0x20;
}
}
_buffer[_row][_col] = 0x00;
this.refresh();
},
writeAt: function(row, col, val) {
_buffer[row][col] = val;
var data = _page.data, fore, back, color;
var off = (col * 14 + row * 560 * 8 * 2) * 4;
fore = _greenMode ? _green : _white;
back = _black;
var char = 0;
if (!val) {
if (_blinking) {
fore = _black;
}
} else {
char = val & 0x1f;
char |= val & 0x40 ? 0 : 0x20;
}
for (var jdx = 0; jdx < 8; jdx++) {
var b = charset[char * 8 + jdx];
for (var idx = 0; idx < 7; idx += 1) {
b <<= 1;
color = (b & 0x80) ? fore : back;
var c0 = color[0], c1 = color[1], c2 = color[2];
data[off + 0] = data[off + 4] = c0;
data[off + 1] = data[off + 5] = c1;
data[off + 2] = data[off + 6] = c2;
if (!_scanlines) {
data[off + 560 * 4] = data[off + 560 * 4 + 4] = c0;
data[off + 560 * 4 + 1] = data[off + 560 * 4 + 5] = c1;
data[off + 560 * 4 + 2] = data[off + 560 * 4 + 6] = c2;
} else {
data[off + 560 * 4] = data[off + 560 * 4 + 4] = c0 >> 1;
data[off + 560 * 4 + 1] = data[off + 560 * 4 + 5] = c1 >> 1;
data[off + 560 * 4 + 2] = data[off + 560 * 4 + 6] = c2 >> 1;
}
off += 8;
}
off += 546 * 4 + 560 * 4;
}
},
_blink: function() {
for (var row = 0; row < 24; row++) {
for (var col = 0; col < 40; col++) {
var val = _buffer[row][col];
if (!val) {
this.writeAt(row, col, val);
}
}
}
_dirty = true;
},
refresh: function() {
for (var row = 0; row < 24; row++) {
for (var col = 0; col < 40; col++) {
this.writeAt(row, col, _buffer[row][col]);
}
}
_dirty = true;
},
green: function(on) {
_greenMode = on;
this.refresh();
},
scanlines: function(on) {
_scanlines = on;
this.refresh();
},
blit: function() {
if (_dirty) {
_context.putImageData(_page, 0, 0, 0, 0, 7 * 40 * 2, 8 * 24 * 2);
}
},
setContext: function(context) {
_context = context;
_page = context.createImageData(560, 384);
for (var idx = 0; idx < 560 * 384 * 4; idx++) {
_page.data[idx] = 0xff;
}
},
getText: function() {
function mapCharCode(charCode) {
charCode &= 0x7F;
if (charCode < 0x20) {
charCode += 0x40;
}
if (charCode >= 0x60) {
charCode -= 0x40;
}
return charCode;
}
var buffer = '', line, charCode;
var row, col;
for (row = 0; row < 24; row++) {
line = '';
for (col = 0; col < 40; col++) {
charCode = mapCharCode(_buffer[row][col]);
line += String.fromCharCode(charCode);
}
line = line.trimRight();
buffer += line + '\n';
}
return buffer;
},
clear: function canvas_clearScreen() {
for (var row = 0; row < 24; row++) {
for (var col = 0; col < 40; col++) {
_buffer[row][col] = 0x20;
}
}
_col = 0;
_row = 0;
this.refresh();
},
transcript: ''
};
}

236
js/canvas1.ts Normal file
View File

@ -0,0 +1,236 @@
/* Copyright 2010-2023 Will Scullin <scullin@scullinsteel.com>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation. No representations are made about the suitability of this
* software for any purpose. It is provided "as is" without express or
* implied warranty.
*/
import { charset } from './roms/apple1char';
import type { byte } from './types';
/*
0: A9 9 AA 20 EF FF E8 8A 4C 2 0
0R
*/
/*
* Text Page Drawing
*/
export class TextPage {
_page: ImageData | undefined;
_context: CanvasRenderingContext2D | undefined;
_buffer: byte[][] = [];
_greenMode = false;
_scanlines = false;
_black = [0x00, 0x00, 0x00];
_white = [0xee, 0xff, 0xff];
_green = [0x00, 0xff, 0x80];
_blinking = 0;
_row = 0;
_col = 0;
_dirty = false;
constructor() {
this._buffer = [];
for (let row = 0; row < 24; row++) {
this._buffer[row] = [];
for (let col = 0; col < 40; col++) {
this._buffer[row][col] = col % 2 ? 0x00 : 0xff;
}
}
this._dirty = true;
}
init() {
window.setInterval(() => {
this._blinking = (this._blinking + 1) % 3;
this._blink();
this._dirty = true;
}, 333);
}
write(val: byte): void {
let col;
val &= 0x7f;
if (this.transcript) {
if (val === 0xd) {
this.transcript += '\n';
} else if (val >= 0x20) {
if (val >= 0x60) {
val &= 0x5f;
}
this.transcript += String.fromCharCode(val);
}
}
if (val === 0x0d) {
for (col = this._col; col < 40; col++) {
this._buffer[this._row][col] = 0x20;
}
this._col = 0;
this._row++;
} else {
this._buffer[this._row][this._col] = val;
this._col++;
if (this._col > 39) {
this._col = 0;
this._row++;
}
}
if (this._row > 23) {
this._row = 23;
this._buffer.shift();
this._buffer.push([]);
for (col = 0; col < 40; col++) {
this._buffer[this._row][col] = 0x20;
}
}
this._buffer[this._row][this._col] = 0x00;
this.refresh();
}
writeAt(row: byte, col: byte, val: byte): void {
if (!this._page) {
return;
}
this._buffer[row][col] = val;
const data = this._page.data;
let color;
let off = (col * 14 + row * 560 * 8 * 2) * 4;
let fore = this._greenMode ? this._green : this._white;
const back = this._black;
let char = 0;
if (!val) {
if (this._blinking) {
fore = this._black;
}
} else {
char = val & 0x1f;
char |= val & 0x40 ? 0 : 0x20;
}
for (let jdx = 0; jdx < 8; jdx++) {
let b = charset[char * 8 + jdx];
for (let idx = 0; idx < 7; idx += 1) {
b <<= 1;
color = b & 0x80 ? fore : back;
const c0 = color[0],
c1 = color[1],
c2 = color[2];
data[off + 0] = data[off + 4] = c0;
data[off + 1] = data[off + 5] = c1;
data[off + 2] = data[off + 6] = c2;
if (!this._scanlines) {
data[off + 560 * 4] = data[off + 560 * 4 + 4] = c0;
data[off + 560 * 4 + 1] = data[off + 560 * 4 + 5] = c1;
data[off + 560 * 4 + 2] = data[off + 560 * 4 + 6] = c2;
} else {
data[off + 560 * 4] = data[off + 560 * 4 + 4] = c0 >> 1;
data[off + 560 * 4 + 1] = data[off + 560 * 4 + 5] = c1 >> 1;
data[off + 560 * 4 + 2] = data[off + 560 * 4 + 6] = c2 >> 1;
}
off += 8;
}
off += 546 * 4 + 560 * 4;
}
}
_blink() {
for (let row = 0; row < 24; row++) {
for (let col = 0; col < 40; col++) {
const val = this._buffer[row][col];
if (!val) {
this.writeAt(row, col, val);
}
}
}
this._dirty = true;
}
refresh() {
for (let row = 0; row < 24; row++) {
for (let col = 0; col < 40; col++) {
this.writeAt(row, col, this._buffer[row][col]);
}
}
this._dirty = true;
}
green(on: boolean) {
this._greenMode = on;
this.refresh();
}
scanlines(on: boolean) {
this._scanlines = on;
this.refresh();
}
blit() {
if (!this._page || !this._context) {
return;
}
if (this._dirty) {
this._context.putImageData(
this._page,
0,
0,
0,
0,
7 * 40 * 2,
8 * 24 * 2,
);
}
}
setContext(context: CanvasRenderingContext2D) {
this._context = context;
this._page = context.createImageData(560, 384);
for (let idx = 0; idx < 560 * 384 * 4; idx++) {
this._page.data[idx] = 0xff;
}
}
getText() {
function mapCharCode(charCode: byte) {
charCode &= 0x7f;
if (charCode < 0x20) {
charCode += 0x40;
}
if (charCode >= 0x60) {
charCode -= 0x40;
}
return charCode;
}
let buffer = '',
line,
charCode;
let row, col;
for (row = 0; row < 24; row++) {
line = '';
for (col = 0; col < 40; col++) {
charCode = mapCharCode(this._buffer[row][col]);
line += String.fromCharCode(charCode);
}
line = line.trimRight();
buffer += line + '\n';
}
return buffer;
}
clear() {
for (let row = 0; row < 24; row++) {
for (let col = 0; col < 40; col++) {
this._buffer[row][col] = 0x20;
}
}
this._col = 0;
this._row = 0;
this.refresh();
}
transcript = '';
}

View File

@ -1,160 +0,0 @@
import { debug } from '../util';
export default function ACI(cpu, cb) {
var _last = cpu.cycles();
var _next = _last;
var _recording = false;
var _readOffset = 0;
var _flip = false;
var _beKind = false;
var _progress = 0;
var rom = [
0xA9,0xAA,0x20,0xEF,0xFF,0xA9,0x8D,0x20,
0xEF,0xFF,0xA0,0xFF,0xC8,0xAD,0x11,0xD0,
0x10,0xFB,0xAD,0x10,0xD0,0x99,0x00,0x02,
0x20,0xEF,0xFF,0xC9,0x9B,0xF0,0xE1,0xC9,
0x8D,0xD0,0xE9,0xA2,0xFF,0xA9,0x00,0x85,
0x24,0x85,0x25,0x85,0x26,0x85,0x27,0xE8,
0xBD,0x00,0x02,0xC9,0xD2,0xF0,0x56,0xC9,
0xD7,0xF0,0x35,0xC9,0xAE,0xF0,0x27,0xC9,
0x8D,0xF0,0x20,0xC9,0xA0,0xF0,0xE8,0x49,
0xB0,0xC9,0x0A,0x90,0x06,0x69,0x88,0xC9,
0xFA,0x90,0xAD,0x0A,0x0A,0x0A,0x0A,0xA0,
0x04,0x0A,0x26,0x24,0x26,0x25,0x88,0xD0,
0xF8,0xF0,0xCC,0x4C,0x1A,0xFF,0xA5,0x24,
0x85,0x26,0xA5,0x25,0x85,0x27,0xB0,0xBF,
0xA9,0x40,0x20,0xCC,0xC1,0x88,0xA2,0x00,
0xA1,0x26,0xA2,0x10,0x0A,0x20,0xDB,0xC1,
0xD0,0xFA,0x20,0xF1,0xC1,0xA0,0x1E,0x90,
0xEC,0xA6,0x28,0xB0,0x98,0x20,0xBC,0xC1,
0xA9,0x16,0x20,0xCC,0xC1,0x20,0xBC,0xC1,
0xA0,0x1F,0x20,0xBF,0xC1,0xB0,0xF9,0x20,
0xBF,0xC1,0xA0,0x3A,0xA2,0x08,0x48,0x20,
0xBC,0xC1,0x68,0x2A,0xA0,0x39,0xCA,0xD0,
0xF5,0x81,0x26,0x20,0xF1,0xC1,0xA0,0x35,
0x90,0xEA,0xB0,0xCD,0x20,0xBF,0xC1,0x88,
0xAD,0x81,0xC0,0xC5,0x29,0xF0,0xF8,0x85,
0x29,0xC0,0x80,0x60,0x86,0x28,0xA0,0x42,
0x20,0xE0,0xC1,0xD0,0xF9,0x69,0xFE,0xB0,
0xF5,0xA0,0x1E,0x20,0xE0,0xC1,0xA0,0x2C,
0x88,0xD0,0xFD,0x90,0x05,0xA0,0x2F,0x88,
0xD0,0xFD,0xBC,0x00,0xC0,0xA0,0x29,0xCA,
0x60,0xA5,0x26,0xC5,0x24,0xA5,0x27,0xE5,
0x25,0xE6,0x26,0xD0,0x02,0xE6,0x27,0x60
];
return {
start: function aci_start() {
return 0xc0;
},
end: function aci_end() {
return 0xc1;
},
read: function aci_read(page, off) {
var now = cpu.cycles();
var result = rom[off];
if (page == 0xc0) {
if (_recording) {
var delta = now - _last;
this.buffer.push(delta);
_last = now;
} else {
var progress;
if (_readOffset < this.buffer.length) {
if (now > _next) {
if ((_readOffset % 1000) == 0) {
debug('Read ' + (_readOffset / 1000));
}
_flip = !_flip;
_next = now + this.buffer[_readOffset++];
}
}
result = _flip ? rom[off | 0x01] : rom[off & 0xfe];
progress = Math.round(_readOffset / this.buffer.length * 100) / 100;
if (_progress != progress) {
_progress = progress;
cb.progress(_progress);
}
}
} else {
if (cpu.sync()) {
switch (off) {
case 0x00:
_recording = false;
_beKind = true;
debug('Entering ACI CLI');
break;
case 0x63:
if (_recording) {
this.buffer.push(5000000);
_recording = false;
}
debug('Exiting ACI CLI');
break;
case 0x70: // WRITE
_recording = true;
if (_beKind) {
_beKind = false;
this.buffer = [];
}
debug('Start write');
_last = now;
break;
//case 0x7c: // WBITLOOP:
// _debug = true;
// debug("Write bit loop");
// break;
case 0x8d: // READ
_recording = false;
debug('Start read');
if (_beKind) {
_readOffset = 0;
_next = now + 5000000;
_beKind = false;
cb.progress(0);
}
break;
default:
break;
}
}
}
return result;
},
write: function aci_write() {},
getState: function aci_getState() { return {}; },
setState: function aci_setState() {},
setData: function aci_setData(data) {
var seg, idx, jdx, d, b;
this.buffer = [];
for (seg = 0; seg < data.length; seg++) {
for (idx = 0; idx < 16384; idx++) {
this.buffer.push(592);
}
this.buffer.push(180);
this.buffer.push(238);
d = data[seg];
for (idx = 0; idx < d.length; idx++) {
b = d[idx];
for (jdx = 0; jdx < 8; jdx++) {
if (b & 0x80) {
this.buffer.push(473);
this.buffer.push(473);
} else {
this.buffer.push(238);
this.buffer.push(238);
}
b <<= 1;
}
}
this.buffer.push(5000000);
}
},
buffer: []
};
}

162
js/cards/aci.ts Normal file
View File

@ -0,0 +1,162 @@
import CPU6502 from '../cpu6502';
import { debug } from '../util';
import { byte } from '../types';
const rom = [
0xa9, 0xaa, 0x20, 0xef, 0xff, 0xa9, 0x8d, 0x20, 0xef, 0xff, 0xa0, 0xff, 0xc8,
0xad, 0x11, 0xd0, 0x10, 0xfb, 0xad, 0x10, 0xd0, 0x99, 0x00, 0x02, 0x20, 0xef,
0xff, 0xc9, 0x9b, 0xf0, 0xe1, 0xc9, 0x8d, 0xd0, 0xe9, 0xa2, 0xff, 0xa9, 0x00,
0x85, 0x24, 0x85, 0x25, 0x85, 0x26, 0x85, 0x27, 0xe8, 0xbd, 0x00, 0x02, 0xc9,
0xd2, 0xf0, 0x56, 0xc9, 0xd7, 0xf0, 0x35, 0xc9, 0xae, 0xf0, 0x27, 0xc9, 0x8d,
0xf0, 0x20, 0xc9, 0xa0, 0xf0, 0xe8, 0x49, 0xb0, 0xc9, 0x0a, 0x90, 0x06, 0x69,
0x88, 0xc9, 0xfa, 0x90, 0xad, 0x0a, 0x0a, 0x0a, 0x0a, 0xa0, 0x04, 0x0a, 0x26,
0x24, 0x26, 0x25, 0x88, 0xd0, 0xf8, 0xf0, 0xcc, 0x4c, 0x1a, 0xff, 0xa5, 0x24,
0x85, 0x26, 0xa5, 0x25, 0x85, 0x27, 0xb0, 0xbf, 0xa9, 0x40, 0x20, 0xcc, 0xc1,
0x88, 0xa2, 0x00, 0xa1, 0x26, 0xa2, 0x10, 0x0a, 0x20, 0xdb, 0xc1, 0xd0, 0xfa,
0x20, 0xf1, 0xc1, 0xa0, 0x1e, 0x90, 0xec, 0xa6, 0x28, 0xb0, 0x98, 0x20, 0xbc,
0xc1, 0xa9, 0x16, 0x20, 0xcc, 0xc1, 0x20, 0xbc, 0xc1, 0xa0, 0x1f, 0x20, 0xbf,
0xc1, 0xb0, 0xf9, 0x20, 0xbf, 0xc1, 0xa0, 0x3a, 0xa2, 0x08, 0x48, 0x20, 0xbc,
0xc1, 0x68, 0x2a, 0xa0, 0x39, 0xca, 0xd0, 0xf5, 0x81, 0x26, 0x20, 0xf1, 0xc1,
0xa0, 0x35, 0x90, 0xea, 0xb0, 0xcd, 0x20, 0xbf, 0xc1, 0x88, 0xad, 0x81, 0xc0,
0xc5, 0x29, 0xf0, 0xf8, 0x85, 0x29, 0xc0, 0x80, 0x60, 0x86, 0x28, 0xa0, 0x42,
0x20, 0xe0, 0xc1, 0xd0, 0xf9, 0x69, 0xfe, 0xb0, 0xf5, 0xa0, 0x1e, 0x20, 0xe0,
0xc1, 0xa0, 0x2c, 0x88, 0xd0, 0xfd, 0x90, 0x05, 0xa0, 0x2f, 0x88, 0xd0, 0xfd,
0xbc, 0x00, 0xc0, 0xa0, 0x29, 0xca, 0x60, 0xa5, 0x26, 0xc5, 0x24, 0xa5, 0x27,
0xe5, 0x25, 0xe6, 0x26, 0xd0, 0x02, 0xe6, 0x27, 0x60,
] as const;
export interface ACICallback {
progress: (value: number) => void;
}
export default class ACI {
_last: number;
_next: number;
_recording = false;
_readOffset = 0;
_flip = false;
_beKind = false;
_progress = 0;
constructor(
private cpu: CPU6502,
private cb: ACICallback,
) {
this._last = cpu.getCycles();
this._next = this._last;
}
start() {
return 0xc0;
}
end() {
return 0xc1;
}
read(page: byte, off: byte) {
const now = this.cpu.getCycles();
let result = rom[off];
if (page === 0xc0) {
if (this._recording) {
const delta = now - this._last;
this.buffer.push(delta);
this._last = now;
} else {
if (this._readOffset < this.buffer.length) {
if (now > this._next) {
if (this._readOffset % 1000 === 0) {
debug('Read ' + this._readOffset / 1000);
}
this._flip = !this._flip;
this._next = now + this.buffer[this._readOffset++];
}
}
result = this._flip ? rom[off | 0x01] : rom[off & 0xfe];
const progress =
Math.round((this._readOffset / this.buffer.length) * 100) / 100;
if (this._progress !== progress) {
this._progress = progress;
this.cb.progress(this._progress);
}
}
} else {
if (this.cpu.getSync()) {
switch (off) {
case 0x00:
this._recording = false;
this._beKind = true;
debug('Entering ACI CLI');
break;
case 0x63:
if (this._recording) {
this.buffer.push(5000000);
this._recording = false;
}
debug('Exiting ACI CLI');
break;
case 0x70: // WRITE
this._recording = true;
if (this._beKind) {
this._beKind = false;
this.buffer = [];
}
debug('Start write');
this._last = now;
break;
//case 0x7c: // WBITLOOP:
// _debug = true;
// debug("Write bit loop");
// break;
case 0x8d: // READ
this._recording = false;
debug('Start read');
if (this._beKind) {
this._readOffset = 0;
this._next = now + 5000000;
this._beKind = false;
this.cb.progress(0);
}
break;
default:
break;
}
}
}
return result;
}
write() {}
getState() {
return {};
}
setState() {}
setData(data: number[][]) {
let seg, idx, jdx, d, b;
this.buffer = [];
for (seg = 0; seg < data.length; seg++) {
for (idx = 0; idx < 16384; idx++) {
this.buffer.push(592);
}
this.buffer.push(180);
this.buffer.push(238);
d = data[seg];
for (idx = 0; idx < d.length; idx++) {
b = d[idx];
for (jdx = 0; jdx < 8; jdx++) {
if (b & 0x80) {
this.buffer.push(473);
this.buffer.push(473);
} else {
this.buffer.push(238);
this.buffer.push(238);
}
b <<= 1;
}
}
this.buffer.push(5000000);
}
}
buffer: byte[] = [];
}

View File

@ -1,5 +1,5 @@
/*!
* Copyright 2010-2018 Will Scullin <scullin@scullinsteel.com>
* Copyright 2010-2023 Will Scullin <scullin@scullinsteel.com>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that

File diff suppressed because it is too large Load Diff

3265
js/cpu6502.ts Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,3 +1,3 @@
var Apple1 = require('./apple1');
import * as Apple1 from "./apple1";
module.exports = { Apple1: Apple1 };
window.Apple1 = Apple1;

View File

@ -1,30 +0,0 @@
/* Copyright 2010-2019 Will Scullin <scullin@scullinsteel.com>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation. No representations are made about the suitability of this
* software for any purpose. It is provided "as is" without express or
* implied warranty.
*/
/*exported Prefs */
export default function Prefs()
{
return {
havePrefs: function() {
return typeof(localStorage) !== 'undefined';
},
readPref: function(name) {
if (localStorage)
return localStorage.getItem(name);
return null;
},
writePref: function(name, value) {
if (localStorage)
localStorage.setItem(name, value);
}
};
}

23
js/prefs.ts Normal file
View File

@ -0,0 +1,23 @@
/* Copyright 2010-2023 Will Scullin <scullin@scullinsteel.com>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation. No representations are made about the suitability of this
* software for any purpose. It is provided "as is" without express or
* implied warranty.
*/
export default class Prefs {
havePrefs() {
return typeof localStorage !== 'undefined';
}
readPref(name: string) {
if (localStorage) return localStorage.getItem(name);
return null;
}
writePref(name: string, value: string) {
if (localStorage) localStorage.setItem(name, value);
}
}

View File

@ -1,57 +0,0 @@
/* -*- mode: JavaScript; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* Copyright 2010-2019Will Scullin <scullin@scullinsteel.com>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation. No representations are made about the suitability of this
* software for any purpose. It is provided "as is" without express or
* implied warranty.
*/
import { base64_decode, base64_encode } from './base64';
import { allocMemPages } from './util';
export default function RAM(sp, ep) {
var mem;
var start_page = sp;
var end_page = ep;
mem = allocMemPages(ep - sp + 1);
for (var page = 0; page <= ep; page++) {
for (var off = 0; off < 0x100; off++) {
mem[page * 0x100 + off] = 0; // Math.floor(Math.random()*256);
}
}
return {
start: function() {
return start_page;
},
end: function() {
return end_page;
},
read: function(page, off) {
return mem[(page - start_page) * 0x100 + off];
},
write: function(page, off, val) {
mem[(page - start_page) * 0x100 + off] = val;
},
getState: function() {
return {
start: start_page,
end: end_page,
mem: base64_encode(mem)
};
},
setState: function(state) {
start_page = state.start;
end_page = state.end;
mem = base64_decode(state.mem);
}
};
}

64
js/ram.ts Normal file
View File

@ -0,0 +1,64 @@
/* Copyright 2010-2023 Will Scullin <scullin@scullinsteel.com>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation. No representations are made about the suitability of this
* software for any purpose. It is provided "as is" without express or
* implied warranty.
*/
import { base64_decode, base64_encode } from './base64';
import { allocMemPages } from './util';
import type { byte } from './types';
export interface RAMState {
start: byte;
end: byte;
mem: string;
}
export default class RAM {
mem: Uint8Array | byte[];
constructor(
private start_page: byte,
private end_page: byte,
) {
this.mem = allocMemPages(end_page - start_page + 1);
for (let page = 0; page <= end_page; page++) {
for (let off = 0; off < 0x100; off++) {
this.mem[page * 0x100 + off] = 0; // Math.floor(Math.random()*256);
}
}
}
start() {
return this.start_page;
}
end() {
return this.end_page;
}
read(page: byte, off: byte) {
return this.mem[(page - this.start_page) * 0x100 + off];
}
write(page: byte, off: byte, val: byte) {
this.mem[(page - this.start_page) * 0x100 + off] = val;
}
getState(): RAMState {
return {
start: this.start_page,
end: this.end_page,
mem: base64_encode(this.mem),
};
}
setState(state: RAMState) {
this.start_page = state.start;
this.end_page = state.end;
this.mem = base64_decode(state.mem);
}
}

View File

@ -1,66 +0,0 @@
export var charset = [
0x00,0x1c,0x22,0x2a,0x2e,0x2c,0x20,0x1e,
0x00,0x08,0x14,0x22,0x22,0x3e,0x22,0x22,
0x00,0x3c,0x22,0x22,0x3c,0x22,0x22,0x3c,
0x00,0x1c,0x22,0x20,0x20,0x20,0x22,0x1c,
0x00,0x3c,0x22,0x22,0x22,0x22,0x22,0x3c,
0x00,0x3e,0x20,0x20,0x3c,0x20,0x20,0x3e,
0x00,0x3e,0x20,0x20,0x3c,0x20,0x20,0x20,
0x00,0x1e,0x20,0x20,0x20,0x26,0x22,0x1e,
0x00,0x22,0x22,0x22,0x3e,0x22,0x22,0x22,
0x00,0x1c,0x08,0x08,0x08,0x08,0x08,0x1c,
0x00,0x02,0x02,0x02,0x02,0x02,0x22,0x1c,
0x00,0x22,0x24,0x28,0x30,0x28,0x24,0x22,
0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x3e,
0x00,0x22,0x36,0x2a,0x2a,0x22,0x22,0x22,
0x00,0x22,0x22,0x32,0x2a,0x26,0x22,0x22,
0x00,0x1c,0x22,0x22,0x22,0x22,0x22,0x1c,
0x00,0x3c,0x22,0x22,0x3c,0x20,0x20,0x20,
0x00,0x1c,0x22,0x22,0x22,0x2a,0x24,0x1a,
0x00,0x3c,0x22,0x22,0x3c,0x28,0x24,0x22,
0x00,0x1c,0x22,0x20,0x1c,0x02,0x22,0x1c,
0x00,0x3e,0x08,0x08,0x08,0x08,0x08,0x08,
0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x1c,
0x00,0x22,0x22,0x22,0x22,0x22,0x14,0x08,
0x00,0x22,0x22,0x22,0x2a,0x2a,0x36,0x22,
0x00,0x22,0x22,0x14,0x08,0x14,0x22,0x22,
0x00,0x22,0x22,0x14,0x08,0x08,0x08,0x08,
0x00,0x3e,0x02,0x04,0x08,0x10,0x20,0x3e,
0x00,0x3e,0x30,0x30,0x30,0x30,0x30,0x3e,
0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x00,
0x00,0x3e,0x06,0x06,0x06,0x06,0x06,0x3e,
0x00,0x00,0x00,0x08,0x14,0x22,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x08,0x08,0x08,0x08,0x08,0x00,0x08,
0x00,0x14,0x14,0x14,0x00,0x00,0x00,0x00,
0x00,0x14,0x14,0x3e,0x14,0x3e,0x14,0x14,
0x00,0x08,0x1e,0x28,0x1c,0x0a,0x3c,0x08,
0x00,0x30,0x32,0x04,0x08,0x10,0x26,0x06,
0x00,0x10,0x28,0x28,0x10,0x2a,0x24,0x1a,
0x00,0x08,0x08,0x08,0x00,0x00,0x00,0x00,
0x00,0x08,0x10,0x20,0x20,0x20,0x10,0x08,
0x00,0x08,0x04,0x02,0x02,0x02,0x04,0x08,
0x00,0x08,0x2a,0x1c,0x08,0x1c,0x2a,0x08,
0x00,0x00,0x08,0x08,0x3e,0x08,0x08,0x00,
0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x10,
0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,
0x00,0x00,0x02,0x04,0x08,0x10,0x20,0x00,
0x00,0x1c,0x22,0x26,0x2a,0x32,0x22,0x1c,
0x00,0x08,0x18,0x08,0x08,0x08,0x08,0x1c,
0x00,0x1c,0x22,0x02,0x0c,0x10,0x20,0x3e,
0x00,0x3e,0x02,0x04,0x0c,0x02,0x22,0x1c,
0x00,0x04,0x0c,0x14,0x24,0x3e,0x04,0x04,
0x00,0x3e,0x20,0x3c,0x02,0x02,0x22,0x1c,
0x00,0x0e,0x10,0x20,0x3c,0x22,0x22,0x1c,
0x00,0x3e,0x02,0x04,0x08,0x10,0x10,0x10,
0x00,0x1c,0x22,0x22,0x1c,0x22,0x22,0x1c,
0x00,0x1c,0x22,0x22,0x1e,0x02,0x04,0x38,
0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x00,
0x00,0x00,0x00,0x08,0x00,0x08,0x08,0x10,
0x00,0x04,0x08,0x10,0x20,0x10,0x08,0x04,
0x00,0x00,0x00,0x3e,0x00,0x3e,0x00,0x00,
0x00,0x10,0x08,0x04,0x02,0x04,0x08,0x10,
0x00,0x1c,0x22,0x04,0x08,0x08,0x00,0x08
];

42
js/roms/apple1char.ts Normal file
View File

@ -0,0 +1,42 @@
export const charset = [
0x00, 0x1c, 0x22, 0x2a, 0x2e, 0x2c, 0x20, 0x1e, 0x00, 0x08, 0x14, 0x22, 0x22,
0x3e, 0x22, 0x22, 0x00, 0x3c, 0x22, 0x22, 0x3c, 0x22, 0x22, 0x3c, 0x00, 0x1c,
0x22, 0x20, 0x20, 0x20, 0x22, 0x1c, 0x00, 0x3c, 0x22, 0x22, 0x22, 0x22, 0x22,
0x3c, 0x00, 0x3e, 0x20, 0x20, 0x3c, 0x20, 0x20, 0x3e, 0x00, 0x3e, 0x20, 0x20,
0x3c, 0x20, 0x20, 0x20, 0x00, 0x1e, 0x20, 0x20, 0x20, 0x26, 0x22, 0x1e, 0x00,
0x22, 0x22, 0x22, 0x3e, 0x22, 0x22, 0x22, 0x00, 0x1c, 0x08, 0x08, 0x08, 0x08,
0x08, 0x1c, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x22, 0x1c, 0x00, 0x22, 0x24,
0x28, 0x30, 0x28, 0x24, 0x22, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3e,
0x00, 0x22, 0x36, 0x2a, 0x2a, 0x22, 0x22, 0x22, 0x00, 0x22, 0x22, 0x32, 0x2a,
0x26, 0x22, 0x22, 0x00, 0x1c, 0x22, 0x22, 0x22, 0x22, 0x22, 0x1c, 0x00, 0x3c,
0x22, 0x22, 0x3c, 0x20, 0x20, 0x20, 0x00, 0x1c, 0x22, 0x22, 0x22, 0x2a, 0x24,
0x1a, 0x00, 0x3c, 0x22, 0x22, 0x3c, 0x28, 0x24, 0x22, 0x00, 0x1c, 0x22, 0x20,
0x1c, 0x02, 0x22, 0x1c, 0x00, 0x3e, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00,
0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x1c, 0x00, 0x22, 0x22, 0x22, 0x22, 0x22,
0x14, 0x08, 0x00, 0x22, 0x22, 0x22, 0x2a, 0x2a, 0x36, 0x22, 0x00, 0x22, 0x22,
0x14, 0x08, 0x14, 0x22, 0x22, 0x00, 0x22, 0x22, 0x14, 0x08, 0x08, 0x08, 0x08,
0x00, 0x3e, 0x02, 0x04, 0x08, 0x10, 0x20, 0x3e, 0x00, 0x3e, 0x30, 0x30, 0x30,
0x30, 0x30, 0x3e, 0x00, 0x00, 0x20, 0x10, 0x08, 0x04, 0x02, 0x00, 0x00, 0x3e,
0x06, 0x06, 0x06, 0x06, 0x06, 0x3e, 0x00, 0x00, 0x00, 0x08, 0x14, 0x22, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x08, 0x00,
0x14, 0x14, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x14, 0x3e, 0x14, 0x3e,
0x14, 0x14, 0x00, 0x08, 0x1e, 0x28, 0x1c, 0x0a, 0x3c, 0x08, 0x00, 0x30, 0x32,
0x04, 0x08, 0x10, 0x26, 0x06, 0x00, 0x10, 0x28, 0x28, 0x10, 0x2a, 0x24, 0x1a,
0x00, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x20, 0x20,
0x20, 0x10, 0x08, 0x00, 0x08, 0x04, 0x02, 0x02, 0x02, 0x04, 0x08, 0x00, 0x08,
0x2a, 0x1c, 0x08, 0x1c, 0x2a, 0x08, 0x00, 0x00, 0x08, 0x08, 0x3e, 0x08, 0x08,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00,
0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
0x00, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, 0x00, 0x1c, 0x22, 0x26, 0x2a, 0x32,
0x22, 0x1c, 0x00, 0x08, 0x18, 0x08, 0x08, 0x08, 0x08, 0x1c, 0x00, 0x1c, 0x22,
0x02, 0x0c, 0x10, 0x20, 0x3e, 0x00, 0x3e, 0x02, 0x04, 0x0c, 0x02, 0x22, 0x1c,
0x00, 0x04, 0x0c, 0x14, 0x24, 0x3e, 0x04, 0x04, 0x00, 0x3e, 0x20, 0x3c, 0x02,
0x02, 0x22, 0x1c, 0x00, 0x0e, 0x10, 0x20, 0x3c, 0x22, 0x22, 0x1c, 0x00, 0x3e,
0x02, 0x04, 0x08, 0x10, 0x10, 0x10, 0x00, 0x1c, 0x22, 0x22, 0x1c, 0x22, 0x22,
0x1c, 0x00, 0x1c, 0x22, 0x22, 0x1e, 0x02, 0x04, 0x38, 0x00, 0x00, 0x00, 0x08,
0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x08, 0x10, 0x00,
0x04, 0x08, 0x10, 0x20, 0x10, 0x08, 0x04, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x3e,
0x00, 0x00, 0x00, 0x10, 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x00, 0x1c, 0x22,
0x04, 0x08, 0x08, 0x00, 0x08,
] as const;

View File

@ -1,537 +0,0 @@
export default function Basic() {
var ram = [
0x4c,0xb0,0xe2,0xad,0x11,0xd0,0x10,0xfb,
0xad,0x10,0xd0,0x60,0x8a,0x29,0x20,0xf0,
0x23,0xa9,0xa0,0x85,0xe4,0x4c,0xc9,0xe3,
0xa9,0x20,0xc5,0x24,0xb0,0x0c,0xa9,0x8d,
0xa0,0x07,0x20,0xc9,0xe3,0xa9,0xa0,0x88,
0xd0,0xf8,0xa0,0x00,0xb1,0xe2,0xe6,0xe2,
0xd0,0x02,0xe6,0xe3,0x60,0x20,0x15,0xe7,
0x20,0x76,0xe5,0xa5,0xe2,0xc5,0xe6,0xa5,
0xe3,0xe5,0xe7,0xb0,0xef,0x20,0x6d,0xe0,
0x4c,0x3b,0xe0,0xa5,0xca,0x85,0xe2,0xa5,
0xcb,0x85,0xe3,0xa5,0x4c,0x85,0xe6,0xa5,
0x4d,0x85,0xe7,0xd0,0xde,0x20,0x15,0xe7,
0x20,0x6d,0xe5,0xa5,0xe4,0x85,0xe2,0xa5,
0xe5,0x85,0xe3,0xb0,0xc7,0x86,0xd8,0xa9,
0xa0,0x85,0xfa,0x20,0x2a,0xe0,0x98,0x85,
0xe4,0x20,0x2a,0xe0,0xaa,0x20,0x2a,0xe0,
0x20,0x1b,0xe5,0x20,0x18,0xe0,0x84,0xfa,
0xaa,0x10,0x18,0x0a,0x10,0xe9,0xa5,0xe4,
0xd0,0x03,0x20,0x11,0xe0,0x8a,0x20,0xc9,
0xe3,0xa9,0x25,0x20,0x1a,0xe0,0xaa,0x30,
0xf5,0x85,0xe4,0xc9,0x01,0xd0,0x05,0xa6,
0xd8,0x4c,0xcd,0xe3,0x48,0x84,0xce,0xa2,
0xed,0x86,0xcf,0xc9,0x51,0x90,0x04,0xc6,
0xcf,0xe9,0x50,0x48,0xb1,0xce,0xaa,0x88,
0xb1,0xce,0x10,0xfa,0xe0,0xc0,0xb0,0x04,
0xe0,0x00,0x30,0xf2,0xaa,0x68,0xe9,0x01,
0xd0,0xe9,0x24,0xe4,0x30,0x03,0x20,0xf8,
0xef,0xb1,0xce,0x10,0x10,0xaa,0x29,0x3f,
0x85,0xe4,0x18,0x69,0xa0,0x20,0xc9,0xe3,
0x88,0xe0,0xc0,0x90,0xec,0x20,0x0c,0xe0,
0x68,0xc9,0x5d,0xf0,0xa4,0xc9,0x28,0xd0,
0x8a,0xf0,0x9e,0x20,0x18,0xe1,0x95,0x50,
0xd5,0x78,0x90,0x11,0xa0,0x2b,0x4c,0xe0,
0xe3,0x20,0x34,0xee,0xd5,0x50,0x90,0xf4,
0x20,0xe4,0xef,0x95,0x78,0x4c,0x23,0xe8,
0x20,0x34,0xee,0xf0,0xe7,0x38,0xe9,0x01,
0x60,0x20,0x18,0xe1,0x95,0x50,0x18,0xf5,
0x78,0x4c,0x02,0xe1,0xa0,0x14,0xd0,0xd6,
0x20,0x18,0xe1,0xe8,0xb5,0x50,0x85,0xda,
0x65,0xce,0x48,0xa8,0xb5,0x78,0x85,0xdb,
0x65,0xcf,0x48,0xc4,0xca,0xe5,0xcb,0xb0,
0xe3,0xa5,0xda,0x69,0xfe,0x85,0xda,0xa9,
0xff,0xa8,0x65,0xdb,0x85,0xdb,0xc8,0xb1,
0xda,0xd9,0xcc,0x00,0xd0,0x0f,0x98,0xf0,
0xf5,0x68,0x91,0xda,0x99,0xcc,0x00,0x88,
0x10,0xf7,0xe8,0x60,0xea,0xa0,0x80,0xd0,
0x95,0xa9,0x00,0x20,0x0a,0xe7,0xa0,0x02,
0x94,0x78,0x20,0x0a,0xe7,0xa9,0xbf,0x20,
0xc9,0xe3,0xa0,0x00,0x20,0x9e,0xe2,0x94,
0x78,0xea,0xea,0xea,0xb5,0x51,0x85,0xce,
0xb5,0x79,0x85,0xcf,0xe8,0xe8,0x20,0xbc,
0xe1,0xb5,0x4e,0xd5,0x76,0xb0,0x15,0xf6,
0x4e,0xa8,0xb1,0xce,0xb4,0x50,0xc4,0xe4,
0x90,0x04,0xa0,0x83,0xd0,0xc1,0x91,0xda,
0xf6,0x50,0x90,0xe5,0xb4,0x50,0x8a,0x91,
0xda,0xe8,0xe8,0x60,0xb5,0x51,0x85,0xda,
0x38,0xe9,0x02,0x85,0xe4,0xb5,0x79,0x85,
0xdb,0xe9,0x00,0x85,0xe5,0xa0,0x00,0xb1,
0xe4,0x18,0xe5,0xda,0x85,0xe4,0x60,0xb5,
0x53,0x85,0xce,0xb5,0x7b,0x85,0xcf,0xb5,
0x51,0x85,0xda,0xb5,0x79,0x85,0xdb,0xe8,
0xe8,0xe8,0xa0,0x00,0x94,0x78,0x94,0xa0,
0xc8,0x94,0x50,0xb5,0x4d,0xd5,0x75,0x08,
0x48,0xb5,0x4f,0xd5,0x77,0x90,0x07,0x68,
0x28,0xb0,0x02,0x56,0x50,0x60,0xa8,0xb1,
0xce,0x85,0xe4,0x68,0xa8,0x28,0xb0,0xf3,
0xb1,0xda,0xc5,0xe4,0xd0,0xed,0xf6,0x4f,
0xf6,0x4d,0xb0,0xd7,0x20,0xd7,0xe1,0x4c,
0x36,0xe7,0x20,0x54,0xe2,0x06,0xce,0x26,
0xcf,0x90,0x0d,0x18,0xa5,0xe6,0x65,0xda,
0x85,0xe6,0xa5,0xe7,0x65,0xdb,0x85,0xe7,
0x88,0xf0,0x09,0x06,0xe6,0x26,0xe7,0x10,
0xe4,0x4c,0x7e,0xe7,0xa5,0xe6,0x20,0x08,
0xe7,0xa5,0xe7,0x95,0xa0,0x06,0xe5,0x90,
0x28,0x4c,0x6f,0xe7,0xa9,0x55,0x85,0xe5,
0x20,0x5b,0xe2,0xa5,0xce,0x85,0xda,0xa5,
0xcf,0x85,0xdb,0x20,0x15,0xe7,0x84,0xe6,
0x84,0xe7,0xa5,0xcf,0x10,0x09,0xca,0x06,
0xe5,0x20,0x6f,0xe7,0x20,0x15,0xe7,0xa0,
0x10,0x60,0x20,0x6c,0xee,0xf0,0xc5,0xff,
0xc9,0x84,0xd0,0x02,0x46,0xf8,0xc9,0xdf,
0xf0,0x11,0xc9,0x9b,0xf0,0x06,0x99,0x00,
0x02,0xc8,0x10,0x0a,0xa0,0x8b,0x20,0xc4,
0xe3,0xa0,0x01,0x88,0x30,0xf6,0x20,0x03,
0xe0,0xea,0xea,0x20,0xc9,0xe3,0xc9,0x8d,
0xd0,0xd6,0xa9,0xdf,0x99,0x00,0x02,0x60,
0x20,0xd3,0xef,0x20,0xcd,0xe3,0x46,0xd9,
0xa9,0xbe,0x20,0xc9,0xe3,0xa0,0x00,0x84,
0xfa,0x24,0xf8,0x10,0x0c,0xa6,0xf6,0xa5,
0xf7,0x20,0x1b,0xe5,0xa9,0xa0,0x20,0xc9,
0xe3,0xa2,0xff,0x9a,0x20,0x9e,0xe2,0x84,
0xf1,0x8a,0x85,0xc8,0xa2,0x20,0x20,0x91,
0xe4,0xa5,0xc8,0x69,0x00,0x85,0xe0,0xa9,
0x00,0xaa,0x69,0x02,0x85,0xe1,0xa1,0xe0,
0x29,0xf0,0xc9,0xb0,0xf0,0x03,0x4c,0x83,
0xe8,0xa0,0x02,0xb1,0xe0,0x99,0xcd,0x00,
0x88,0xd0,0xf8,0x20,0x8a,0xe3,0xa5,0xf1,
0xe5,0xc8,0xc9,0x04,0xf0,0xa8,0x91,0xe0,
0xa5,0xca,0xf1,0xe0,0x85,0xe4,0xa5,0xcb,
0xe9,0x00,0x85,0xe5,0xa5,0xe4,0xc5,0xcc,
0xa5,0xe5,0xe5,0xcd,0x90,0x45,0xa5,0xca,
0xf1,0xe0,0x85,0xe6,0xa5,0xcb,0xe9,0x00,
0x85,0xe7,0xb1,0xca,0x91,0xe6,0xe6,0xca,
0xd0,0x02,0xe6,0xcb,0xa5,0xe2,0xc5,0xca,
0xa5,0xe3,0xe5,0xcb,0xb0,0xe0,0xb5,0xe4,
0x95,0xca,0xca,0x10,0xf9,0xb1,0xe0,0xa8,
0x88,0xb1,0xe0,0x91,0xe6,0x98,0xd0,0xf8,
0x24,0xf8,0x10,0x09,0xb5,0xf7,0x75,0xf5,
0x95,0xf7,0xe8,0xf0,0xf7,0x10,0x7e,0x00,
0x00,0x00,0x00,0xa0,0x14,0xd0,0x71,0x20,
0x15,0xe7,0xa5,0xe2,0x85,0xe6,0xa5,0xe3,
0x85,0xe7,0x20,0x75,0xe5,0xa5,0xe2,0x85,
0xe4,0xa5,0xe3,0x85,0xe5,0xd0,0x0e,0x20,
0x15,0xe7,0x20,0x6d,0xe5,0xa5,0xe6,0x85,
0xe2,0xa5,0xe7,0x85,0xe3,0xa0,0x00,0xa5,
0xca,0xc5,0xe4,0xa5,0xcb,0xe5,0xe5,0xb0,
0x16,0xa5,0xe4,0xd0,0x02,0xc6,0xe5,0xc6,
0xe4,0xa5,0xe6,0xd0,0x02,0xc6,0xe7,0xc6,
0xe6,0xb1,0xe4,0x91,0xe6,0x90,0xe0,0xa5,
0xe6,0x85,0xca,0xa5,0xe7,0x85,0xcb,0x60,
0x20,0xc9,0xe3,0xc8,0xb9,0x00,0xeb,0x30,
0xf7,0xc9,0x8d,0xd0,0x06,0xa9,0x00,0x85,
0x24,0xa9,0x8d,0xe6,0x24,0x2c,0xf2,0xd0,
0x30,0xfb,0x8d,0xf2,0xd0,0x60,0xa0,0x06,
0x20,0xd3,0xee,0x24,0xd9,0x30,0x03,0x4c,
0xb6,0xe2,0x4c,0x9a,0xeb,0x2a,0x69,0xa0,
0xdd,0x00,0x02,0xd0,0x53,0xb1,0xfe,0x0a,
0x30,0x06,0x88,0xb1,0xfe,0x30,0x29,0xc8,
0x86,0xc8,0x98,0x48,0xa2,0x00,0xa1,0xfe,
0xaa,0x4a,0x49,0x48,0x11,0xfe,0xc9,0xc0,
0x90,0x01,0xe8,0xc8,0xd0,0xf3,0x68,0xa8,
0x8a,0x4c,0xc0,0xe4,0xe6,0xf1,0xa6,0xf1,
0xf0,0xbc,0x9d,0x00,0x02,0x60,0xa6,0xc8,
0xa9,0xa0,0xe8,0xdd,0x00,0x02,0xb0,0xfa,
0xb1,0xfe,0x29,0x3f,0x4a,0xd0,0xb6,0xbd,
0x00,0x02,0xb0,0x06,0x69,0x3f,0xc9,0x1a,
0x90,0x6f,0x69,0x4f,0xc9,0x0a,0x90,0x69,
0xa6,0xfd,0xc8,0xb1,0xfe,0x29,0xe0,0xc9,
0x20,0xf0,0x7a,0xb5,0xa8,0x85,0xc8,0xb5,
0xd1,0x85,0xf1,0x88,0xb1,0xfe,0x0a,0x10,
0xfa,0x88,0xb0,0x38,0x0a,0x30,0x35,0xb4,
0x58,0x84,0xff,0xb4,0x80,0xe8,0x10,0xda,
0xf0,0xb3,0xc9,0x7e,0xb0,0x22,0xca,0x10,
0x04,0xa0,0x06,0x10,0x29,0x94,0x80,0xa4,
0xff,0x94,0x58,0xa4,0xc8,0x94,0xa8,0xa4,
0xf1,0x94,0xd1,0x29,0x1f,0xa8,0xb9,0x20,
0xec,0x0a,0xa8,0xa9,0x76,0x2a,0x85,0xff,
0xd0,0x01,0xc8,0xc8,0x86,0xfd,0xb1,0xfe,
0x30,0x84,0xd0,0x05,0xa0,0x0e,0x4c,0xe0,
0xe3,0xc9,0x03,0xb0,0xc3,0x4a,0xa6,0xc8,
0xe8,0xbd,0x00,0x02,0x90,0x04,0xc9,0xa2,
0xf0,0x0a,0xc9,0xdf,0xf0,0x06,0x86,0xc8,
0x20,0x1c,0xe4,0xc8,0x88,0xa6,0xfd,0xb1,
0xfe,0x88,0x0a,0x10,0xcf,0xb4,0x58,0x84,
0xff,0xb4,0x80,0xe8,0xb1,0xfe,0x29,0x9f,
0xd0,0xed,0x85,0xf2,0x85,0xf3,0x98,0x48,
0x86,0xfd,0xb4,0xd0,0x84,0xc9,0x18,0xa9,
0x0a,0x85,0xf9,0xa2,0x00,0xc8,0xb9,0x00,
0x02,0x29,0x0f,0x65,0xf2,0x48,0x8a,0x65,
0xf3,0x30,0x1c,0xaa,0x68,0xc6,0xf9,0xd0,
0xf2,0x85,0xf2,0x86,0xf3,0xc4,0xf1,0xd0,
0xde,0xa4,0xc9,0xc8,0x84,0xf1,0x20,0x1c,
0xe4,0x68,0xa8,0xa5,0xf3,0xb0,0xa9,0xa0,
0x00,0x10,0x8b,0x85,0xf3,0x86,0xf2,0xa2,
0x04,0x86,0xc9,0xa9,0xb0,0x85,0xf9,0xa5,
0xf2,0xdd,0x63,0xe5,0xa5,0xf3,0xfd,0x68,
0xe5,0x90,0x0d,0x85,0xf3,0xa5,0xf2,0xfd,
0x63,0xe5,0x85,0xf2,0xe6,0xf9,0xd0,0xe7,
0xa5,0xf9,0xe8,0xca,0xf0,0x0e,0xc9,0xb0,
0xf0,0x02,0x85,0xc9,0x24,0xc9,0x30,0x04,
0xa5,0xfa,0xf0,0x0b,0x20,0xc9,0xe3,0x24,
0xf8,0x10,0x04,0x99,0x00,0x02,0xc8,0xca,
0x10,0xc1,0x60,0x01,0x0a,0x64,0xe8,0x10,
0x00,0x00,0x00,0x03,0x27,0xa5,0xca,0x85,
0xe6,0xa5,0xcb,0x85,0xe7,0xe8,0xa5,0xe7,
0x85,0xe5,0xa5,0xe6,0x85,0xe4,0xc5,0x4c,
0xa5,0xe5,0xe5,0x4d,0xb0,0x26,0xa0,0x01,
0xb1,0xe4,0xe5,0xce,0xc8,0xb1,0xe4,0xe5,
0xcf,0xb0,0x19,0xa0,0x00,0xa5,0xe6,0x71,
0xe4,0x85,0xe6,0x90,0x03,0xe6,0xe7,0x18,
0xc8,0xa5,0xce,0xf1,0xe4,0xc8,0xa5,0xcf,
0xf1,0xe4,0xb0,0xca,0x60,0x46,0xf8,0xa5,
0x4c,0x85,0xca,0xa5,0x4d,0x85,0xcb,0xa5,
0x4a,0x85,0xcc,0xa5,0x4b,0x85,0xcd,0xa9,
0x00,0x85,0xfb,0x85,0xfc,0x85,0xfe,0xa9,
0x00,0x85,0x1d,0x60,0xa5,0xd0,0x69,0x05,
0x85,0xd2,0xa5,0xd1,0x69,0x00,0x85,0xd3,
0xa5,0xd2,0xc5,0xca,0xa5,0xd3,0xe5,0xcb,
0x90,0x03,0x4c,0x6b,0xe3,0xa5,0xce,0x91,
0xd0,0xa5,0xcf,0xc8,0x91,0xd0,0xa5,0xd2,
0xc8,0x91,0xd0,0xa5,0xd3,0xc8,0x91,0xd0,
0xa9,0x00,0xc8,0x91,0xd0,0xc8,0x91,0xd0,
0xa5,0xd2,0x85,0xcc,0xa5,0xd3,0x85,0xcd,
0xa5,0xd0,0x90,0x43,0x85,0xce,0x84,0xcf,
0x20,0xff,0xe6,0x30,0x0e,0xc9,0x40,0xf0,
0x0a,0x4c,0x28,0xe6,0x06,0xc9,0x49,0xd0,
0x07,0xa9,0x49,0x85,0xcf,0x20,0xff,0xe6,
0xa5,0x4b,0x85,0xd1,0xa5,0x4a,0x85,0xd0,
0xc5,0xcc,0xa5,0xd1,0xe5,0xcd,0xb0,0x94,
0xb1,0xd0,0xc8,0xc5,0xce,0xd0,0x06,0xb1,
0xd0,0xc5,0xcf,0xf0,0x0e,0xc8,0xb1,0xd0,
0x48,0xc8,0xb1,0xd0,0x85,0xd1,0x68,0xa0,
0x00,0xf0,0xdb,0xa5,0xd0,0x69,0x03,0x20,
0x0a,0xe7,0xa5,0xd1,0x69,0x00,0x95,0x78,
0xa5,0xcf,0xc9,0x40,0xd0,0x1c,0x88,0x98,
0x20,0x0a,0xe7,0x88,0x94,0x78,0xa0,0x03,
0xf6,0x78,0xc8,0xb1,0xd0,0x30,0xf9,0x10,
0x09,0xa9,0x00,0x85,0xd4,0x85,0xd5,0xa2,
0x20,0x48,0xa0,0x00,0xb1,0xe0,0x10,0x18,
0x0a,0x30,0x81,0x20,0xff,0xe6,0x20,0x08,
0xe7,0x20,0xff,0xe6,0x95,0xa0,0x24,0xd4,
0x10,0x01,0xca,0x20,0xff,0xe6,0xb0,0xe6,
0xc9,0x28,0xd0,0x1f,0xa5,0xe0,0x20,0x0a,
0xe7,0xa5,0xe1,0x95,0x78,0x24,0xd4,0x30,
0x0b,0xa9,0x01,0x20,0x0a,0xe7,0xa9,0x00,
0x95,0x78,0xf6,0x78,0x20,0xff,0xe6,0x30,
0xf9,0xb0,0xd3,0x24,0xd4,0x10,0x06,0xc9,
0x04,0xb0,0xd0,0x46,0xd4,0xa8,0x85,0xd6,
0xb9,0x98,0xe9,0x29,0x55,0x0a,0x85,0xd7,
0x68,0xa8,0xb9,0x98,0xe9,0x29,0xaa,0xc5,
0xd7,0xb0,0x09,0x98,0x48,0x20,0xff,0xe6,
0xa5,0xd6,0x90,0x95,0xb9,0x10,0xea,0x85,
0xce,0xb9,0x88,0xea,0x85,0xcf,0x20,0xfc,
0xe6,0x4c,0xd8,0xe6,0x6c,0xce,0x00,0xe6,
0xe0,0xd0,0x02,0xe6,0xe1,0xb1,0xe0,0x60,
0x94,0x77,0xca,0x30,0x03,0x95,0x50,0x60,
0xa0,0x66,0x4c,0xe0,0xe3,0xa0,0x00,0xb5,
0x50,0x85,0xce,0xb5,0xa0,0x85,0xcf,0xb5,
0x78,0xf0,0x0e,0x85,0xcf,0xb1,0xce,0x48,
0xc8,0xb1,0xce,0x85,0xcf,0x68,0x85,0xce,
0x88,0xe8,0x60,0x20,0x4a,0xe7,0x20,0x15,
0xe7,0x98,0x20,0x08,0xe7,0x95,0xa0,0xc5,
0xce,0xd0,0x06,0xc5,0xcf,0xd0,0x02,0xf6,
0x50,0x60,0x20,0x82,0xe7,0x20,0x59,0xe7,
0x20,0x15,0xe7,0x24,0xcf,0x30,0x1b,0xca,
0x60,0x20,0x15,0xe7,0xa5,0xcf,0xd0,0x04,
0xa5,0xce,0xf0,0xf3,0xa9,0xff,0x20,0x08,
0xe7,0x95,0xa0,0x24,0xcf,0x30,0xe9,0x20,
0x15,0xe7,0x98,0x38,0xe5,0xce,0x20,0x08,
0xe7,0x98,0xe5,0xcf,0x50,0x23,0xa0,0x00,
0x10,0x90,0x20,0x6f,0xe7,0x20,0x15,0xe7,
0xa5,0xce,0x85,0xda,0xa5,0xcf,0x85,0xdb,
0x20,0x15,0xe7,0x18,0xa5,0xce,0x65,0xda,
0x20,0x08,0xe7,0xa5,0xcf,0x65,0xdb,0x70,
0xdd,0x95,0xa0,0x60,0x20,0x15,0xe7,0xa4,
0xce,0xf0,0x05,0x88,0xa5,0xcf,0xf0,0x0c,
0x60,0xa5,0x24,0x09,0x07,0xa8,0xc8,0xa9,
0xa0,0x20,0xc9,0xe3,0xc4,0x24,0xb0,0xf7,
0x60,0x20,0xb1,0xe7,0x20,0x15,0xe7,0xa5,
0xcf,0x10,0x0a,0xa9,0xad,0x20,0xc9,0xe3,
0x20,0x72,0xe7,0x50,0xef,0x88,0x84,0xd5,
0x86,0xcf,0xa6,0xce,0x20,0x1b,0xe5,0xa6,
0xcf,0x60,0x20,0x15,0xe7,0xa5,0xce,0x85,
0xf6,0xa5,0xcf,0x85,0xf7,0x88,0x84,0xf8,
0xc8,0xa9,0x0a,0x85,0xf4,0x84,0xf5,0x60,
0x20,0x15,0xe7,0xa5,0xce,0xa4,0xcf,0x10,
0xf2,0x20,0x15,0xe7,0xb5,0x50,0x85,0xda,
0xb5,0x78,0x85,0xdb,0xa5,0xce,0x91,0xda,
0xc8,0xa5,0xcf,0x91,0xda,0xe8,0x60,0x68,
0x68,0x24,0xd5,0x10,0x05,0x20,0xcd,0xe3,
0x46,0xd5,0x60,0xa0,0xff,0x84,0xd7,0x60,
0x20,0xcd,0xef,0xf0,0x07,0xa9,0x25,0x85,
0xd6,0x88,0x84,0xd4,0xe8,0x60,0xa5,0xca,
0xa4,0xcb,0xd0,0x5a,0xa0,0x41,0xa5,0xfc,
0xc9,0x08,0xb0,0x5e,0xa8,0xe6,0xfc,0xa5,
0xe0,0x99,0x00,0x01,0xa5,0xe1,0x99,0x08,
0x01,0xa5,0xdc,0x99,0x10,0x01,0xa5,0xdd,
0x99,0x18,0x01,0x20,0x15,0xe7,0x20,0x6d,
0xe5,0x90,0x04,0xa0,0x37,0xd0,0x3b,0xa5,
0xe4,0xa4,0xe5,0x85,0xdc,0x84,0xdd,0x2c,
0x11,0xd0,0x30,0x4f,0x18,0x69,0x03,0x90,
0x01,0xc8,0xa2,0xff,0x86,0xd9,0x9a,0x85,
0xe0,0x84,0xe1,0x20,0x79,0xe6,0x24,0xd9,
0x10,0x49,0x18,0xa0,0x00,0xa5,0xdc,0x71,
0xdc,0xa4,0xdd,0x90,0x01,0xc8,0xc5,0x4c,
0xd0,0xd1,0xc4,0x4d,0xd0,0xcd,0xa0,0x34,
0x46,0xd9,0x4c,0xe0,0xe3,0xa0,0x4a,0xa5,
0xfc,0xf0,0xf7,0xc6,0xfc,0xa8,0xb9,0x0f,
0x01,0x85,0xdc,0xb9,0x17,0x01,0x85,0xdd,
0xbe,0xff,0x00,0xb9,0x07,0x01,0xa8,0x8a,
0x4c,0x7a,0xe8,0xa0,0x63,0x20,0xc4,0xe3,
0xa0,0x01,0xb1,0xdc,0xaa,0xc8,0xb1,0xdc,
0x20,0x1b,0xe5,0x4c,0xb3,0xe2,0xc6,0xfb,
0xa0,0x5b,0xa5,0xfb,0xf0,0xc4,0xa8,0xb5,
0x50,0xd9,0x1f,0x01,0xd0,0xf0,0xb5,0x78,
0xd9,0x27,0x01,0xd0,0xe9,0xb9,0x2f,0x01,
0x85,0xda,0xb9,0x37,0x01,0x85,0xdb,0x20,
0x15,0xe7,0xca,0x20,0x93,0xe7,0x20,0x01,
0xe8,0xca,0xa4,0xfb,0xb9,0x67,0x01,0x95,
0x9f,0xb9,0x5f,0x01,0xa0,0x00,0x20,0x08,
0xe7,0x20,0x82,0xe7,0x20,0x59,0xe7,0x20,
0x15,0xe7,0xa4,0xfb,0xa5,0xce,0xf0,0x05,
0x59,0x37,0x01,0x10,0x12,0xb9,0x3f,0x01,
0x85,0xdc,0xb9,0x47,0x01,0x85,0xdd,0xbe,
0x4f,0x01,0xb9,0x57,0x01,0xd0,0x87,0xc6,
0xfb,0x60,0xa0,0x54,0xa5,0xfb,0xc9,0x08,
0xf0,0x9a,0xe6,0xfb,0xa8,0xb5,0x50,0x99,
0x20,0x01,0xb5,0x78,0x99,0x28,0x01,0x60,
0x20,0x15,0xe7,0xa4,0xfb,0xa5,0xce,0x99,
0x5f,0x01,0xa5,0xcf,0x99,0x67,0x01,0xa9,
0x01,0x99,0x2f,0x01,0xa9,0x00,0x99,0x37,
0x01,0xa5,0xdc,0x99,0x3f,0x01,0xa5,0xdd,
0x99,0x47,0x01,0xa5,0xe0,0x99,0x4f,0x01,
0xa5,0xe1,0x99,0x57,0x01,0x60,0x20,0x15,
0xe7,0xa4,0xfb,0xa5,0xce,0x99,0x2f,0x01,
0xa5,0xcf,0x4c,0x66,0xe9,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xab,0x03,0x03,0x03,0x03,
0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,
0x03,0x03,0x3f,0x3f,0xc0,0xc0,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x30,0x0f,0xc0,
0xcc,0xff,0x55,0x00,0xab,0xab,0x03,0x03,
0xff,0xff,0x55,0xff,0xff,0x55,0xcf,0xcf,
0xcf,0xcf,0xcf,0xff,0x55,0xc3,0xc3,0xc3,
0x55,0xf0,0xf0,0xcf,0x56,0x56,0x56,0x55,
0xff,0xff,0x55,0x03,0x03,0x03,0x03,0x03,
0x03,0x03,0xff,0xff,0xff,0x03,0x03,0x03,
0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,
0x03,0x03,0x03,0x03,0x03,0x00,0xab,0x03,
0x57,0x03,0x03,0x03,0x03,0x07,0x03,0x03,
0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,
0x03,0x03,0xaa,0xff,0xff,0xff,0xff,0xff,
0x17,0xff,0xff,0x19,0x5d,0x35,0x4b,0xf2,
0xec,0x87,0x6f,0xad,0xb7,0xe2,0xf8,0x54,
0x80,0x96,0x85,0x82,0x22,0x10,0x33,0x4a,
0x13,0x06,0x0b,0x4a,0x01,0x40,0x47,0x7a,
0x00,0xff,0x23,0x09,0x5b,0x16,0xb6,0xcb,
0xff,0xff,0xfb,0xff,0xff,0x24,0xf6,0x4e,
0x59,0x50,0x00,0xff,0x23,0xa3,0x6f,0x36,
0x23,0xd7,0x1c,0x22,0xc2,0xae,0xba,0x23,
0xff,0xff,0x21,0x30,0x1e,0x03,0xc4,0x20,
0x00,0xc1,0xff,0xff,0xff,0xa0,0x30,0x1e,
0xa4,0xd3,0xb6,0xbc,0xaa,0x3a,0x01,0x50,
0x7e,0xd8,0xd8,0xa5,0x3c,0xff,0x16,0x5b,
0x28,0x03,0xc4,0x1d,0x00,0x0c,0x4e,0x00,
0x3e,0x00,0xa6,0xb0,0x00,0xbc,0xc6,0x57,
0x8c,0x01,0x27,0xff,0xff,0xff,0xff,0xff,
0xe8,0xff,0xff,0xe8,0xe0,0xe0,0xe0,0xef,
0xef,0xe3,0xe3,0xe5,0xe5,0xe7,0xe7,0xee,
0xef,0xef,0xe7,0xe7,0xe2,0xef,0xe7,0xe7,
0xec,0xec,0xec,0xe7,0xec,0xec,0xec,0xe2,
0x00,0xff,0xe8,0xe1,0xe8,0xe8,0xef,0xeb,
0xff,0xff,0xe0,0xff,0xff,0xef,0xee,0xef,
0xe7,0xe7,0x00,0xff,0xe8,0xe7,0xe7,0xe7,
0xe8,0xe1,0xe2,0xee,0xee,0xee,0xee,0xe8,
0xff,0xff,0xe1,0xe1,0xef,0xee,0xe7,0xe8,
0xee,0xe7,0xff,0xff,0xff,0xee,0xe1,0xef,
0xe7,0xe8,0xef,0xef,0xeb,0xe9,0xe8,0xe9,
0xe9,0xe8,0xe8,0xe8,0xe8,0xff,0xe8,0xe8,
0xe8,0xee,0xe7,0xe8,0xef,0xef,0xee,0xef,
0xee,0xef,0xee,0xee,0xef,0xee,0xee,0xee,
0xe1,0xe8,0xe8,0xff,0xff,0xff,0xff,0xff,
0xbe,0xb3,0xb2,0xb7,0xb6,0x37,0xd4,0xcf,
0xcf,0xa0,0xcc,0xcf,0xce,0x47,0xd3,0xd9,
0xce,0xd4,0xc1,0x58,0xcd,0xc5,0xcd,0xa0,
0xc6,0xd5,0xcc,0x4c,0xd4,0xcf,0xcf,0xa0,
0xcd,0xc1,0xce,0xd9,0xa0,0xd0,0xc1,0xd2,
0xc5,0xce,0x53,0xd3,0xd4,0xd2,0xc9,0xce,
0x47,0xce,0xcf,0xa0,0xc5,0xce,0x44,0xc2,
0xc1,0xc4,0xa0,0xc2,0xd2,0xc1,0xce,0xc3,
0x48,0xbe,0xb8,0xa0,0xc7,0xcf,0xd3,0xd5,
0xc2,0x53,0xc2,0xc1,0xc4,0xa0,0xd2,0xc5,
0xd4,0xd5,0xd2,0x4e,0xbe,0xb8,0xa0,0xc6,
0xcf,0xd2,0x53,0xc2,0xc1,0xc4,0xa0,0xce,
0xc5,0xd8,0x54,0xd3,0xd4,0xcf,0xd0,0xd0,
0xc5,0xc4,0xa0,0xc1,0xd4,0x20,0xaa,0xaa,
0xaa,0x20,0xa0,0xc5,0xd2,0xd2,0x0d,0xbe,
0xb2,0xb5,0x35,0xd2,0xc1,0xce,0xc7,0x45,
0xc4,0xc9,0x4d,0xd3,0xd4,0xd2,0xa0,0xcf,
0xd6,0xc6,0x4c,0xdc,0x0d,0xd2,0xc5,0xd4,
0xd9,0xd0,0xc5,0xa0,0xcc,0xc9,0xce,0xc5,
0x8d,0x3f,0x46,0xd9,0x90,0x03,0x4c,0xc3,
0xe8,0xa6,0xcf,0x9a,0xa6,0xce,0xa0,0x8d,
0xd0,0x02,0xa0,0x99,0x20,0xc4,0xe3,0x86,
0xce,0xba,0x86,0xcf,0xa0,0xfe,0x84,0xd9,
0xc8,0x84,0xc8,0x20,0x99,0xe2,0x84,0xf1,
0xa2,0x20,0xa9,0x30,0x20,0x91,0xe4,0xe6,
0xd9,0xa6,0xce,0xa4,0xc8,0x0a,0x85,0xce,
0xc8,0xb9,0x00,0x02,0xc9,0x74,0xf0,0xd2,
0x49,0xb0,0xc9,0x0a,0xb0,0xf0,0xc8,0xc8,
0x84,0xc8,0xb9,0x00,0x02,0x48,0xb9,0xff,
0x01,0xa0,0x00,0x20,0x08,0xe7,0x68,0x95,
0xa0,0xa5,0xce,0xc9,0xc7,0xd0,0x03,0x20,
0x6f,0xe7,0x4c,0x01,0xe8,0xff,0xff,0xff,
0x50,0x20,0x13,0xec,0xd0,0x15,0x20,0x0b,
0xec,0xd0,0x10,0x20,0x82,0xe7,0x20,0x6f,
0xe7,0x50,0x03,0x20,0x82,0xe7,0x20,0x59,
0xe7,0x56,0x50,0x4c,0x36,0xe7,0xff,0xff,
0xc1,0xff,0x7f,0xd1,0xcc,0xc7,0xcf,0xce,
0xc5,0x9a,0x98,0x8b,0x96,0x95,0x93,0xbf,
0xb2,0x32,0x2d,0x2b,0xbc,0xb0,0xac,0xbe,
0x35,0x8e,0x61,0xff,0xff,0xff,0xdd,0xfb,
0x20,0xc9,0xef,0x15,0x4f,0x10,0x05,0x20,
0xc9,0xef,0x35,0x4f,0x95,0x50,0x10,0xcb,
0x4c,0xc9,0xef,0x40,0x60,0x8d,0x60,0x8b,
0x00,0x7e,0x8c,0x33,0x00,0x00,0x60,0x03,
0xbf,0x12,0x00,0x40,0x89,0xc9,0x47,0x9d,
0x17,0x68,0x9d,0x0a,0x00,0x40,0x60,0x8d,
0x60,0x8b,0x00,0x7e,0x8c,0x3c,0x00,0x00,
0x60,0x03,0xbf,0x1b,0x4b,0x67,0xb4,0xa1,
0x07,0x8c,0x07,0xae,0xa9,0xac,0xa8,0x67,
0x8c,0x07,0xb4,0xaf,0xac,0xb0,0x67,0x9d,
0xb2,0xaf,0xac,0xaf,0xa3,0x67,0x8c,0x07,
0xa5,0xab,0xaf,0xb0,0xf4,0xae,0xa9,0xb2,
0xb0,0x7f,0x0e,0x27,0xb4,0xae,0xa9,0xb2,
0xb0,0x7f,0x0e,0x28,0xb4,0xae,0xa9,0xb2,
0xb0,0x64,0x07,0xa6,0xa9,0x67,0xaf,0xb4,
0xaf,0xa7,0x78,0xb4,0xa5,0xac,0x78,0x7f,
0x02,0xad,0xa5,0xb2,0x67,0xa2,0xb5,0xb3,
0xaf,0xa7,0xee,0xb2,0xb5,0xb4,0xa5,0xb2,
0x7e,0x8c,0x39,0xb4,0xb8,0xa5,0xae,0x67,
0xb0,0xa5,0xb4,0xb3,0x27,0xaf,0xb4,0x07,
0x9d,0x19,0xb2,0xaf,0xa6,0x7f,0x05,0x37,
0xb4,0xb5,0xb0,0xae,0xa9,0x7f,0x05,0x28,
0xb4,0xb5,0xb0,0xae,0xa9,0x7f,0x05,0x2a,
0xb4,0xb5,0xb0,0xae,0xa9,0xe4,0xae,0xa5,
0x00,0xff,0xff,0x47,0xa2,0xa1,0xb4,0x7f,
0x0d,0x30,0xad,0xa9,0xa4,0x7f,0x0d,0x23,
0xad,0xa9,0xa4,0x67,0xac,0xac,0xa1,0xa3,
0x00,0x40,0x80,0xc0,0xc1,0x80,0x00,0x47,
0x8c,0x68,0x8c,0xdb,0x67,0x9b,0x68,0x9b,
0x50,0x8c,0x63,0x8c,0x7f,0x01,0x51,0x07,
0x88,0x29,0x84,0x80,0xc4,0x80,0x57,0x71,
0x07,0x88,0x14,0xed,0xa5,0xad,0xaf,0xac,
0xed,0xa5,0xad,0xa9,0xa8,0xf2,0xaf,0xac,
0xaf,0xa3,0x71,0x08,0x88,0xae,0xa5,0xac,
0x68,0x83,0x08,0x68,0x9d,0x08,0x71,0x07,
0x88,0x60,0x76,0xb4,0xaf,0xae,0x76,0x8d,
0x76,0x8b,0x51,0x07,0x88,0x19,0xb8,0xa4,
0xae,0xb2,0xf2,0xb3,0xb5,0xf3,0xa2,0xa1,
0xee,0xa7,0xb3,0xe4,0xae,0xb2,0xeb,0xa5,
0xa5,0xb0,0x51,0x07,0x88,0x39,0x81,0xc1,
0x4f,0x7f,0x0f,0x2f,0x00,0x51,0x06,0x88,
0x29,0xc2,0x0c,0x82,0x57,0x8c,0x6a,0x8c,
0x42,0xae,0xa5,0xa8,0xb4,0x60,0xae,0xa5,
0xa8,0xb4,0x4f,0x7e,0x1e,0x35,0x8c,0x27,
0x51,0x07,0x88,0x09,0x8b,0xfe,0xe4,0xaf,
0xad,0xf2,0xaf,0xe4,0xae,0xa1,0xdc,0xde,
0x9c,0xdd,0x9c,0xde,0xdd,0x9e,0xc3,0xdd,
0xcf,0xca,0xcd,0xcb,0x00,0x47,0x9d,0xad,
0xa5,0xad,0xaf,0xac,0x76,0x9d,0xad,0xa5,
0xad,0xa9,0xa8,0xe6,0xa6,0xaf,0x60,0x8c,
0x20,0xaf,0xb4,0xb5,0xa1,0xf2,0xac,0xa3,
0xf2,0xa3,0xb3,0x60,0x8c,0x20,0xac,0xa5,
0xa4,0xee,0xb5,0xb2,0x60,0xae,0xb5,0xb2,
0xf4,0xb3,0xa9,0xac,0x60,0x8c,0x20,0xb4,
0xb3,0xa9,0xac,0x7a,0x7e,0x9a,0x22,0x20,
0x00,0x60,0x03,0xbf,0x60,0x03,0xbf,0x1f,
0x20,0xb1,0xe7,0xe8,0xe8,0xb5,0x4f,0x85,
0xda,0xb5,0x77,0x85,0xdb,0xb4,0x4e,0x98,
0xd5,0x76,0xb0,0x09,0xb1,0xda,0x20,0xc9,
0xe3,0xc8,0x4c,0x0f,0xee,0xa9,0xff,0x85,
0xd5,0x60,0xe8,0xa9,0x00,0x95,0x78,0x95,
0xa0,0xb5,0x77,0x38,0xf5,0x4f,0x95,0x50,
0x4c,0x23,0xe8,0xff,0x20,0x15,0xe7,0xa5,
0xcf,0xd0,0x28,0xa5,0xce,0x60,0x20,0x34,
0xee,0xa4,0xc8,0xc9,0x30,0xb0,0x21,0xc0,
0x28,0xb0,0x1d,0x60,0xea,0xea,0x20,0x34,
0xee,0x60,0xea,0x8a,0xa2,0x01,0xb4,0xce,
0x94,0x4c,0xb4,0x48,0x94,0xca,0xca,0xf0,
0xf5,0xaa,0x60,0xa0,0x77,0x4c,0xe0,0xe3,
0xa0,0x7b,0xd0,0xf9,0x20,0x54,0xe2,0xa5,
0xda,0xd0,0x07,0xa5,0xdb,0xd0,0x03,0x4c,
0x7e,0xe7,0x06,0xce,0x26,0xcf,0x26,0xe6,
0x26,0xe7,0xa5,0xe6,0xc5,0xda,0xa5,0xe7,
0xe5,0xdb,0x90,0x0a,0x85,0xe7,0xa5,0xe6,
0xe5,0xda,0x85,0xe6,0xe6,0xce,0x88,0xd0,
0xe1,0x60,0xff,0xff,0xff,0xff,0xff,0xff,
0x20,0x15,0xe7,0x6c,0xce,0x00,0xa5,0x4c,
0xd0,0x02,0xc6,0x4d,0xc6,0x4c,0xa5,0x48,
0xd0,0x02,0xc6,0x49,0xc6,0x48,0xa0,0x00,
0xb1,0x4c,0x91,0x48,0xa5,0xca,0xc5,0x4c,
0xa5,0xcb,0xe5,0x4d,0x90,0xe0,0x4c,0x53,
0xee,0xc9,0x28,0xb0,0x9b,0xa8,0xa5,0xc8,
0x60,0xea,0xea,0x98,0xaa,0xa0,0x6e,0x20,
0xc4,0xe3,0x8a,0xa8,0x20,0xc4,0xe3,0xa0,
0x72,0x4c,0xc4,0xe3,0x20,0x15,0xe7,0x06,
0xce,0x26,0xcf,0x30,0xfa,0xb0,0xdc,0xd0,
0x04,0xc5,0xce,0xb0,0xd6,0x60,0x20,0x15,
0xe7,0xb1,0xce,0x94,0x9f,0x4c,0x08,0xe7,
0x20,0x34,0xee,0xa5,0xce,0x48,0x20,0x15,
0xe7,0x68,0x91,0xce,0x60,0xff,0xff,0xff,
0x20,0x6c,0xee,0xa5,0xce,0x85,0xe6,0xa5,
0xcf,0x85,0xe7,0x4c,0x44,0xe2,0x20,0xe4,
0xee,0x4c,0x34,0xe1,0x20,0xe4,0xee,0xb4,
0x78,0xb5,0x50,0x69,0xfe,0xb0,0x01,0x88,
0x85,0xda,0x84,0xdb,0x18,0x65,0xce,0x95,
0x50,0x98,0x65,0xcf,0x95,0x78,0xa0,0x00,
0xb5,0x50,0xd1,0xda,0xc8,0xb5,0x78,0xf1,
0xda,0xb0,0x80,0x4c,0x23,0xe8,0x20,0x15,
0xe7,0xa5,0x4e,0x20,0x08,0xe7,0xa5,0x4f,
0xd0,0x04,0xc5,0x4e,0x69,0x00,0x29,0x7f,
0x85,0x4f,0x95,0xa0,0xa0,0x11,0xa5,0x4f,
0x0a,0x18,0x69,0x40,0x0a,0x26,0x4e,0x26,
0x4f,0x88,0xd0,0xf2,0xa5,0xce,0x20,0x08,
0xe7,0xa5,0xcf,0x95,0xa0,0x4c,0x7a,0xe2,
0x20,0x15,0xe7,0xa4,0xce,0xc4,0x4c,0xa5,
0xcf,0xe5,0x4d,0x90,0x1f,0x84,0x48,0xa5,
0xcf,0x85,0x49,0x4c,0xb6,0xee,0x20,0x15,
0xe7,0xa4,0xce,0xc4,0xca,0xa5,0xcf,0xe5,
0xcb,0xb0,0x09,0x84,0x4a,0xa5,0xcf,0x85,
0x4b,0x4c,0xb7,0xe5,0x4c,0xcb,0xee,0xea,
0xea,0xea,0xea,0x20,0xc9,0xef,0x20,0x71,
0xe1,0x4c,0xbf,0xef,0x20,0x03,0xee,0xa9,
0xff,0x85,0xc8,0xa9,0x74,0x8d,0x00,0x02,
0x60,0x20,0x36,0xe7,0xe8,0x20,0x36,0xe7,
0xb5,0x50,0x60,0xa9,0x00,0x85,0x4a,0x85,
0x4c,0xa9,0x08,0x85,0x4b,0xa9,0x10,0x85,
0x4d,0x4c,0xad,0xe5,0xd5,0x78,0xd0,0x01,
0x18,0x4c,0x02,0xe1,0x20,0xb7,0xe5,0x4c,
0x36,0xe8,0x20,0xb7,0xe5,0x4c,0x5b,0xe8,
0xe0,0x80,0xd0,0x01,0x88,0x4c,0x0c,0xe0
];
return {
start: function basic_start() {
return 0xe0;
},
end: function basic_end() {
return 0xef;
},
read: function basic_read(page, off) {
return ram[(page - 0xe0) << 8 | off];
},
write: function basic_write(page, off, val) {
ram[(page - 0xe0) << 8 | off] = val;
},
getState: function() {
return {};
},
setState: function() {
}
};
}

367
js/roms/basic.ts Normal file
View File

@ -0,0 +1,367 @@
import { byte } from 'js/types';
export default class Basic {
ram = [
0x4c, 0xb0, 0xe2, 0xad, 0x11, 0xd0, 0x10, 0xfb, 0xad, 0x10, 0xd0, 0x60,
0x8a, 0x29, 0x20, 0xf0, 0x23, 0xa9, 0xa0, 0x85, 0xe4, 0x4c, 0xc9, 0xe3,
0xa9, 0x20, 0xc5, 0x24, 0xb0, 0x0c, 0xa9, 0x8d, 0xa0, 0x07, 0x20, 0xc9,
0xe3, 0xa9, 0xa0, 0x88, 0xd0, 0xf8, 0xa0, 0x00, 0xb1, 0xe2, 0xe6, 0xe2,
0xd0, 0x02, 0xe6, 0xe3, 0x60, 0x20, 0x15, 0xe7, 0x20, 0x76, 0xe5, 0xa5,
0xe2, 0xc5, 0xe6, 0xa5, 0xe3, 0xe5, 0xe7, 0xb0, 0xef, 0x20, 0x6d, 0xe0,
0x4c, 0x3b, 0xe0, 0xa5, 0xca, 0x85, 0xe2, 0xa5, 0xcb, 0x85, 0xe3, 0xa5,
0x4c, 0x85, 0xe6, 0xa5, 0x4d, 0x85, 0xe7, 0xd0, 0xde, 0x20, 0x15, 0xe7,
0x20, 0x6d, 0xe5, 0xa5, 0xe4, 0x85, 0xe2, 0xa5, 0xe5, 0x85, 0xe3, 0xb0,
0xc7, 0x86, 0xd8, 0xa9, 0xa0, 0x85, 0xfa, 0x20, 0x2a, 0xe0, 0x98, 0x85,
0xe4, 0x20, 0x2a, 0xe0, 0xaa, 0x20, 0x2a, 0xe0, 0x20, 0x1b, 0xe5, 0x20,
0x18, 0xe0, 0x84, 0xfa, 0xaa, 0x10, 0x18, 0x0a, 0x10, 0xe9, 0xa5, 0xe4,
0xd0, 0x03, 0x20, 0x11, 0xe0, 0x8a, 0x20, 0xc9, 0xe3, 0xa9, 0x25, 0x20,
0x1a, 0xe0, 0xaa, 0x30, 0xf5, 0x85, 0xe4, 0xc9, 0x01, 0xd0, 0x05, 0xa6,
0xd8, 0x4c, 0xcd, 0xe3, 0x48, 0x84, 0xce, 0xa2, 0xed, 0x86, 0xcf, 0xc9,
0x51, 0x90, 0x04, 0xc6, 0xcf, 0xe9, 0x50, 0x48, 0xb1, 0xce, 0xaa, 0x88,
0xb1, 0xce, 0x10, 0xfa, 0xe0, 0xc0, 0xb0, 0x04, 0xe0, 0x00, 0x30, 0xf2,
0xaa, 0x68, 0xe9, 0x01, 0xd0, 0xe9, 0x24, 0xe4, 0x30, 0x03, 0x20, 0xf8,
0xef, 0xb1, 0xce, 0x10, 0x10, 0xaa, 0x29, 0x3f, 0x85, 0xe4, 0x18, 0x69,
0xa0, 0x20, 0xc9, 0xe3, 0x88, 0xe0, 0xc0, 0x90, 0xec, 0x20, 0x0c, 0xe0,
0x68, 0xc9, 0x5d, 0xf0, 0xa4, 0xc9, 0x28, 0xd0, 0x8a, 0xf0, 0x9e, 0x20,
0x18, 0xe1, 0x95, 0x50, 0xd5, 0x78, 0x90, 0x11, 0xa0, 0x2b, 0x4c, 0xe0,
0xe3, 0x20, 0x34, 0xee, 0xd5, 0x50, 0x90, 0xf4, 0x20, 0xe4, 0xef, 0x95,
0x78, 0x4c, 0x23, 0xe8, 0x20, 0x34, 0xee, 0xf0, 0xe7, 0x38, 0xe9, 0x01,
0x60, 0x20, 0x18, 0xe1, 0x95, 0x50, 0x18, 0xf5, 0x78, 0x4c, 0x02, 0xe1,
0xa0, 0x14, 0xd0, 0xd6, 0x20, 0x18, 0xe1, 0xe8, 0xb5, 0x50, 0x85, 0xda,
0x65, 0xce, 0x48, 0xa8, 0xb5, 0x78, 0x85, 0xdb, 0x65, 0xcf, 0x48, 0xc4,
0xca, 0xe5, 0xcb, 0xb0, 0xe3, 0xa5, 0xda, 0x69, 0xfe, 0x85, 0xda, 0xa9,
0xff, 0xa8, 0x65, 0xdb, 0x85, 0xdb, 0xc8, 0xb1, 0xda, 0xd9, 0xcc, 0x00,
0xd0, 0x0f, 0x98, 0xf0, 0xf5, 0x68, 0x91, 0xda, 0x99, 0xcc, 0x00, 0x88,
0x10, 0xf7, 0xe8, 0x60, 0xea, 0xa0, 0x80, 0xd0, 0x95, 0xa9, 0x00, 0x20,
0x0a, 0xe7, 0xa0, 0x02, 0x94, 0x78, 0x20, 0x0a, 0xe7, 0xa9, 0xbf, 0x20,
0xc9, 0xe3, 0xa0, 0x00, 0x20, 0x9e, 0xe2, 0x94, 0x78, 0xea, 0xea, 0xea,
0xb5, 0x51, 0x85, 0xce, 0xb5, 0x79, 0x85, 0xcf, 0xe8, 0xe8, 0x20, 0xbc,
0xe1, 0xb5, 0x4e, 0xd5, 0x76, 0xb0, 0x15, 0xf6, 0x4e, 0xa8, 0xb1, 0xce,
0xb4, 0x50, 0xc4, 0xe4, 0x90, 0x04, 0xa0, 0x83, 0xd0, 0xc1, 0x91, 0xda,
0xf6, 0x50, 0x90, 0xe5, 0xb4, 0x50, 0x8a, 0x91, 0xda, 0xe8, 0xe8, 0x60,
0xb5, 0x51, 0x85, 0xda, 0x38, 0xe9, 0x02, 0x85, 0xe4, 0xb5, 0x79, 0x85,
0xdb, 0xe9, 0x00, 0x85, 0xe5, 0xa0, 0x00, 0xb1, 0xe4, 0x18, 0xe5, 0xda,
0x85, 0xe4, 0x60, 0xb5, 0x53, 0x85, 0xce, 0xb5, 0x7b, 0x85, 0xcf, 0xb5,
0x51, 0x85, 0xda, 0xb5, 0x79, 0x85, 0xdb, 0xe8, 0xe8, 0xe8, 0xa0, 0x00,
0x94, 0x78, 0x94, 0xa0, 0xc8, 0x94, 0x50, 0xb5, 0x4d, 0xd5, 0x75, 0x08,
0x48, 0xb5, 0x4f, 0xd5, 0x77, 0x90, 0x07, 0x68, 0x28, 0xb0, 0x02, 0x56,
0x50, 0x60, 0xa8, 0xb1, 0xce, 0x85, 0xe4, 0x68, 0xa8, 0x28, 0xb0, 0xf3,
0xb1, 0xda, 0xc5, 0xe4, 0xd0, 0xed, 0xf6, 0x4f, 0xf6, 0x4d, 0xb0, 0xd7,
0x20, 0xd7, 0xe1, 0x4c, 0x36, 0xe7, 0x20, 0x54, 0xe2, 0x06, 0xce, 0x26,
0xcf, 0x90, 0x0d, 0x18, 0xa5, 0xe6, 0x65, 0xda, 0x85, 0xe6, 0xa5, 0xe7,
0x65, 0xdb, 0x85, 0xe7, 0x88, 0xf0, 0x09, 0x06, 0xe6, 0x26, 0xe7, 0x10,
0xe4, 0x4c, 0x7e, 0xe7, 0xa5, 0xe6, 0x20, 0x08, 0xe7, 0xa5, 0xe7, 0x95,
0xa0, 0x06, 0xe5, 0x90, 0x28, 0x4c, 0x6f, 0xe7, 0xa9, 0x55, 0x85, 0xe5,
0x20, 0x5b, 0xe2, 0xa5, 0xce, 0x85, 0xda, 0xa5, 0xcf, 0x85, 0xdb, 0x20,
0x15, 0xe7, 0x84, 0xe6, 0x84, 0xe7, 0xa5, 0xcf, 0x10, 0x09, 0xca, 0x06,
0xe5, 0x20, 0x6f, 0xe7, 0x20, 0x15, 0xe7, 0xa0, 0x10, 0x60, 0x20, 0x6c,
0xee, 0xf0, 0xc5, 0xff, 0xc9, 0x84, 0xd0, 0x02, 0x46, 0xf8, 0xc9, 0xdf,
0xf0, 0x11, 0xc9, 0x9b, 0xf0, 0x06, 0x99, 0x00, 0x02, 0xc8, 0x10, 0x0a,
0xa0, 0x8b, 0x20, 0xc4, 0xe3, 0xa0, 0x01, 0x88, 0x30, 0xf6, 0x20, 0x03,
0xe0, 0xea, 0xea, 0x20, 0xc9, 0xe3, 0xc9, 0x8d, 0xd0, 0xd6, 0xa9, 0xdf,
0x99, 0x00, 0x02, 0x60, 0x20, 0xd3, 0xef, 0x20, 0xcd, 0xe3, 0x46, 0xd9,
0xa9, 0xbe, 0x20, 0xc9, 0xe3, 0xa0, 0x00, 0x84, 0xfa, 0x24, 0xf8, 0x10,
0x0c, 0xa6, 0xf6, 0xa5, 0xf7, 0x20, 0x1b, 0xe5, 0xa9, 0xa0, 0x20, 0xc9,
0xe3, 0xa2, 0xff, 0x9a, 0x20, 0x9e, 0xe2, 0x84, 0xf1, 0x8a, 0x85, 0xc8,
0xa2, 0x20, 0x20, 0x91, 0xe4, 0xa5, 0xc8, 0x69, 0x00, 0x85, 0xe0, 0xa9,
0x00, 0xaa, 0x69, 0x02, 0x85, 0xe1, 0xa1, 0xe0, 0x29, 0xf0, 0xc9, 0xb0,
0xf0, 0x03, 0x4c, 0x83, 0xe8, 0xa0, 0x02, 0xb1, 0xe0, 0x99, 0xcd, 0x00,
0x88, 0xd0, 0xf8, 0x20, 0x8a, 0xe3, 0xa5, 0xf1, 0xe5, 0xc8, 0xc9, 0x04,
0xf0, 0xa8, 0x91, 0xe0, 0xa5, 0xca, 0xf1, 0xe0, 0x85, 0xe4, 0xa5, 0xcb,
0xe9, 0x00, 0x85, 0xe5, 0xa5, 0xe4, 0xc5, 0xcc, 0xa5, 0xe5, 0xe5, 0xcd,
0x90, 0x45, 0xa5, 0xca, 0xf1, 0xe0, 0x85, 0xe6, 0xa5, 0xcb, 0xe9, 0x00,
0x85, 0xe7, 0xb1, 0xca, 0x91, 0xe6, 0xe6, 0xca, 0xd0, 0x02, 0xe6, 0xcb,
0xa5, 0xe2, 0xc5, 0xca, 0xa5, 0xe3, 0xe5, 0xcb, 0xb0, 0xe0, 0xb5, 0xe4,
0x95, 0xca, 0xca, 0x10, 0xf9, 0xb1, 0xe0, 0xa8, 0x88, 0xb1, 0xe0, 0x91,
0xe6, 0x98, 0xd0, 0xf8, 0x24, 0xf8, 0x10, 0x09, 0xb5, 0xf7, 0x75, 0xf5,
0x95, 0xf7, 0xe8, 0xf0, 0xf7, 0x10, 0x7e, 0x00, 0x00, 0x00, 0x00, 0xa0,
0x14, 0xd0, 0x71, 0x20, 0x15, 0xe7, 0xa5, 0xe2, 0x85, 0xe6, 0xa5, 0xe3,
0x85, 0xe7, 0x20, 0x75, 0xe5, 0xa5, 0xe2, 0x85, 0xe4, 0xa5, 0xe3, 0x85,
0xe5, 0xd0, 0x0e, 0x20, 0x15, 0xe7, 0x20, 0x6d, 0xe5, 0xa5, 0xe6, 0x85,
0xe2, 0xa5, 0xe7, 0x85, 0xe3, 0xa0, 0x00, 0xa5, 0xca, 0xc5, 0xe4, 0xa5,
0xcb, 0xe5, 0xe5, 0xb0, 0x16, 0xa5, 0xe4, 0xd0, 0x02, 0xc6, 0xe5, 0xc6,
0xe4, 0xa5, 0xe6, 0xd0, 0x02, 0xc6, 0xe7, 0xc6, 0xe6, 0xb1, 0xe4, 0x91,
0xe6, 0x90, 0xe0, 0xa5, 0xe6, 0x85, 0xca, 0xa5, 0xe7, 0x85, 0xcb, 0x60,
0x20, 0xc9, 0xe3, 0xc8, 0xb9, 0x00, 0xeb, 0x30, 0xf7, 0xc9, 0x8d, 0xd0,
0x06, 0xa9, 0x00, 0x85, 0x24, 0xa9, 0x8d, 0xe6, 0x24, 0x2c, 0xf2, 0xd0,
0x30, 0xfb, 0x8d, 0xf2, 0xd0, 0x60, 0xa0, 0x06, 0x20, 0xd3, 0xee, 0x24,
0xd9, 0x30, 0x03, 0x4c, 0xb6, 0xe2, 0x4c, 0x9a, 0xeb, 0x2a, 0x69, 0xa0,
0xdd, 0x00, 0x02, 0xd0, 0x53, 0xb1, 0xfe, 0x0a, 0x30, 0x06, 0x88, 0xb1,
0xfe, 0x30, 0x29, 0xc8, 0x86, 0xc8, 0x98, 0x48, 0xa2, 0x00, 0xa1, 0xfe,
0xaa, 0x4a, 0x49, 0x48, 0x11, 0xfe, 0xc9, 0xc0, 0x90, 0x01, 0xe8, 0xc8,
0xd0, 0xf3, 0x68, 0xa8, 0x8a, 0x4c, 0xc0, 0xe4, 0xe6, 0xf1, 0xa6, 0xf1,
0xf0, 0xbc, 0x9d, 0x00, 0x02, 0x60, 0xa6, 0xc8, 0xa9, 0xa0, 0xe8, 0xdd,
0x00, 0x02, 0xb0, 0xfa, 0xb1, 0xfe, 0x29, 0x3f, 0x4a, 0xd0, 0xb6, 0xbd,
0x00, 0x02, 0xb0, 0x06, 0x69, 0x3f, 0xc9, 0x1a, 0x90, 0x6f, 0x69, 0x4f,
0xc9, 0x0a, 0x90, 0x69, 0xa6, 0xfd, 0xc8, 0xb1, 0xfe, 0x29, 0xe0, 0xc9,
0x20, 0xf0, 0x7a, 0xb5, 0xa8, 0x85, 0xc8, 0xb5, 0xd1, 0x85, 0xf1, 0x88,
0xb1, 0xfe, 0x0a, 0x10, 0xfa, 0x88, 0xb0, 0x38, 0x0a, 0x30, 0x35, 0xb4,
0x58, 0x84, 0xff, 0xb4, 0x80, 0xe8, 0x10, 0xda, 0xf0, 0xb3, 0xc9, 0x7e,
0xb0, 0x22, 0xca, 0x10, 0x04, 0xa0, 0x06, 0x10, 0x29, 0x94, 0x80, 0xa4,
0xff, 0x94, 0x58, 0xa4, 0xc8, 0x94, 0xa8, 0xa4, 0xf1, 0x94, 0xd1, 0x29,
0x1f, 0xa8, 0xb9, 0x20, 0xec, 0x0a, 0xa8, 0xa9, 0x76, 0x2a, 0x85, 0xff,
0xd0, 0x01, 0xc8, 0xc8, 0x86, 0xfd, 0xb1, 0xfe, 0x30, 0x84, 0xd0, 0x05,
0xa0, 0x0e, 0x4c, 0xe0, 0xe3, 0xc9, 0x03, 0xb0, 0xc3, 0x4a, 0xa6, 0xc8,
0xe8, 0xbd, 0x00, 0x02, 0x90, 0x04, 0xc9, 0xa2, 0xf0, 0x0a, 0xc9, 0xdf,
0xf0, 0x06, 0x86, 0xc8, 0x20, 0x1c, 0xe4, 0xc8, 0x88, 0xa6, 0xfd, 0xb1,
0xfe, 0x88, 0x0a, 0x10, 0xcf, 0xb4, 0x58, 0x84, 0xff, 0xb4, 0x80, 0xe8,
0xb1, 0xfe, 0x29, 0x9f, 0xd0, 0xed, 0x85, 0xf2, 0x85, 0xf3, 0x98, 0x48,
0x86, 0xfd, 0xb4, 0xd0, 0x84, 0xc9, 0x18, 0xa9, 0x0a, 0x85, 0xf9, 0xa2,
0x00, 0xc8, 0xb9, 0x00, 0x02, 0x29, 0x0f, 0x65, 0xf2, 0x48, 0x8a, 0x65,
0xf3, 0x30, 0x1c, 0xaa, 0x68, 0xc6, 0xf9, 0xd0, 0xf2, 0x85, 0xf2, 0x86,
0xf3, 0xc4, 0xf1, 0xd0, 0xde, 0xa4, 0xc9, 0xc8, 0x84, 0xf1, 0x20, 0x1c,
0xe4, 0x68, 0xa8, 0xa5, 0xf3, 0xb0, 0xa9, 0xa0, 0x00, 0x10, 0x8b, 0x85,
0xf3, 0x86, 0xf2, 0xa2, 0x04, 0x86, 0xc9, 0xa9, 0xb0, 0x85, 0xf9, 0xa5,
0xf2, 0xdd, 0x63, 0xe5, 0xa5, 0xf3, 0xfd, 0x68, 0xe5, 0x90, 0x0d, 0x85,
0xf3, 0xa5, 0xf2, 0xfd, 0x63, 0xe5, 0x85, 0xf2, 0xe6, 0xf9, 0xd0, 0xe7,
0xa5, 0xf9, 0xe8, 0xca, 0xf0, 0x0e, 0xc9, 0xb0, 0xf0, 0x02, 0x85, 0xc9,
0x24, 0xc9, 0x30, 0x04, 0xa5, 0xfa, 0xf0, 0x0b, 0x20, 0xc9, 0xe3, 0x24,
0xf8, 0x10, 0x04, 0x99, 0x00, 0x02, 0xc8, 0xca, 0x10, 0xc1, 0x60, 0x01,
0x0a, 0x64, 0xe8, 0x10, 0x00, 0x00, 0x00, 0x03, 0x27, 0xa5, 0xca, 0x85,
0xe6, 0xa5, 0xcb, 0x85, 0xe7, 0xe8, 0xa5, 0xe7, 0x85, 0xe5, 0xa5, 0xe6,
0x85, 0xe4, 0xc5, 0x4c, 0xa5, 0xe5, 0xe5, 0x4d, 0xb0, 0x26, 0xa0, 0x01,
0xb1, 0xe4, 0xe5, 0xce, 0xc8, 0xb1, 0xe4, 0xe5, 0xcf, 0xb0, 0x19, 0xa0,
0x00, 0xa5, 0xe6, 0x71, 0xe4, 0x85, 0xe6, 0x90, 0x03, 0xe6, 0xe7, 0x18,
0xc8, 0xa5, 0xce, 0xf1, 0xe4, 0xc8, 0xa5, 0xcf, 0xf1, 0xe4, 0xb0, 0xca,
0x60, 0x46, 0xf8, 0xa5, 0x4c, 0x85, 0xca, 0xa5, 0x4d, 0x85, 0xcb, 0xa5,
0x4a, 0x85, 0xcc, 0xa5, 0x4b, 0x85, 0xcd, 0xa9, 0x00, 0x85, 0xfb, 0x85,
0xfc, 0x85, 0xfe, 0xa9, 0x00, 0x85, 0x1d, 0x60, 0xa5, 0xd0, 0x69, 0x05,
0x85, 0xd2, 0xa5, 0xd1, 0x69, 0x00, 0x85, 0xd3, 0xa5, 0xd2, 0xc5, 0xca,
0xa5, 0xd3, 0xe5, 0xcb, 0x90, 0x03, 0x4c, 0x6b, 0xe3, 0xa5, 0xce, 0x91,
0xd0, 0xa5, 0xcf, 0xc8, 0x91, 0xd0, 0xa5, 0xd2, 0xc8, 0x91, 0xd0, 0xa5,
0xd3, 0xc8, 0x91, 0xd0, 0xa9, 0x00, 0xc8, 0x91, 0xd0, 0xc8, 0x91, 0xd0,
0xa5, 0xd2, 0x85, 0xcc, 0xa5, 0xd3, 0x85, 0xcd, 0xa5, 0xd0, 0x90, 0x43,
0x85, 0xce, 0x84, 0xcf, 0x20, 0xff, 0xe6, 0x30, 0x0e, 0xc9, 0x40, 0xf0,
0x0a, 0x4c, 0x28, 0xe6, 0x06, 0xc9, 0x49, 0xd0, 0x07, 0xa9, 0x49, 0x85,
0xcf, 0x20, 0xff, 0xe6, 0xa5, 0x4b, 0x85, 0xd1, 0xa5, 0x4a, 0x85, 0xd0,
0xc5, 0xcc, 0xa5, 0xd1, 0xe5, 0xcd, 0xb0, 0x94, 0xb1, 0xd0, 0xc8, 0xc5,
0xce, 0xd0, 0x06, 0xb1, 0xd0, 0xc5, 0xcf, 0xf0, 0x0e, 0xc8, 0xb1, 0xd0,
0x48, 0xc8, 0xb1, 0xd0, 0x85, 0xd1, 0x68, 0xa0, 0x00, 0xf0, 0xdb, 0xa5,
0xd0, 0x69, 0x03, 0x20, 0x0a, 0xe7, 0xa5, 0xd1, 0x69, 0x00, 0x95, 0x78,
0xa5, 0xcf, 0xc9, 0x40, 0xd0, 0x1c, 0x88, 0x98, 0x20, 0x0a, 0xe7, 0x88,
0x94, 0x78, 0xa0, 0x03, 0xf6, 0x78, 0xc8, 0xb1, 0xd0, 0x30, 0xf9, 0x10,
0x09, 0xa9, 0x00, 0x85, 0xd4, 0x85, 0xd5, 0xa2, 0x20, 0x48, 0xa0, 0x00,
0xb1, 0xe0, 0x10, 0x18, 0x0a, 0x30, 0x81, 0x20, 0xff, 0xe6, 0x20, 0x08,
0xe7, 0x20, 0xff, 0xe6, 0x95, 0xa0, 0x24, 0xd4, 0x10, 0x01, 0xca, 0x20,
0xff, 0xe6, 0xb0, 0xe6, 0xc9, 0x28, 0xd0, 0x1f, 0xa5, 0xe0, 0x20, 0x0a,
0xe7, 0xa5, 0xe1, 0x95, 0x78, 0x24, 0xd4, 0x30, 0x0b, 0xa9, 0x01, 0x20,
0x0a, 0xe7, 0xa9, 0x00, 0x95, 0x78, 0xf6, 0x78, 0x20, 0xff, 0xe6, 0x30,
0xf9, 0xb0, 0xd3, 0x24, 0xd4, 0x10, 0x06, 0xc9, 0x04, 0xb0, 0xd0, 0x46,
0xd4, 0xa8, 0x85, 0xd6, 0xb9, 0x98, 0xe9, 0x29, 0x55, 0x0a, 0x85, 0xd7,
0x68, 0xa8, 0xb9, 0x98, 0xe9, 0x29, 0xaa, 0xc5, 0xd7, 0xb0, 0x09, 0x98,
0x48, 0x20, 0xff, 0xe6, 0xa5, 0xd6, 0x90, 0x95, 0xb9, 0x10, 0xea, 0x85,
0xce, 0xb9, 0x88, 0xea, 0x85, 0xcf, 0x20, 0xfc, 0xe6, 0x4c, 0xd8, 0xe6,
0x6c, 0xce, 0x00, 0xe6, 0xe0, 0xd0, 0x02, 0xe6, 0xe1, 0xb1, 0xe0, 0x60,
0x94, 0x77, 0xca, 0x30, 0x03, 0x95, 0x50, 0x60, 0xa0, 0x66, 0x4c, 0xe0,
0xe3, 0xa0, 0x00, 0xb5, 0x50, 0x85, 0xce, 0xb5, 0xa0, 0x85, 0xcf, 0xb5,
0x78, 0xf0, 0x0e, 0x85, 0xcf, 0xb1, 0xce, 0x48, 0xc8, 0xb1, 0xce, 0x85,
0xcf, 0x68, 0x85, 0xce, 0x88, 0xe8, 0x60, 0x20, 0x4a, 0xe7, 0x20, 0x15,
0xe7, 0x98, 0x20, 0x08, 0xe7, 0x95, 0xa0, 0xc5, 0xce, 0xd0, 0x06, 0xc5,
0xcf, 0xd0, 0x02, 0xf6, 0x50, 0x60, 0x20, 0x82, 0xe7, 0x20, 0x59, 0xe7,
0x20, 0x15, 0xe7, 0x24, 0xcf, 0x30, 0x1b, 0xca, 0x60, 0x20, 0x15, 0xe7,
0xa5, 0xcf, 0xd0, 0x04, 0xa5, 0xce, 0xf0, 0xf3, 0xa9, 0xff, 0x20, 0x08,
0xe7, 0x95, 0xa0, 0x24, 0xcf, 0x30, 0xe9, 0x20, 0x15, 0xe7, 0x98, 0x38,
0xe5, 0xce, 0x20, 0x08, 0xe7, 0x98, 0xe5, 0xcf, 0x50, 0x23, 0xa0, 0x00,
0x10, 0x90, 0x20, 0x6f, 0xe7, 0x20, 0x15, 0xe7, 0xa5, 0xce, 0x85, 0xda,
0xa5, 0xcf, 0x85, 0xdb, 0x20, 0x15, 0xe7, 0x18, 0xa5, 0xce, 0x65, 0xda,
0x20, 0x08, 0xe7, 0xa5, 0xcf, 0x65, 0xdb, 0x70, 0xdd, 0x95, 0xa0, 0x60,
0x20, 0x15, 0xe7, 0xa4, 0xce, 0xf0, 0x05, 0x88, 0xa5, 0xcf, 0xf0, 0x0c,
0x60, 0xa5, 0x24, 0x09, 0x07, 0xa8, 0xc8, 0xa9, 0xa0, 0x20, 0xc9, 0xe3,
0xc4, 0x24, 0xb0, 0xf7, 0x60, 0x20, 0xb1, 0xe7, 0x20, 0x15, 0xe7, 0xa5,
0xcf, 0x10, 0x0a, 0xa9, 0xad, 0x20, 0xc9, 0xe3, 0x20, 0x72, 0xe7, 0x50,
0xef, 0x88, 0x84, 0xd5, 0x86, 0xcf, 0xa6, 0xce, 0x20, 0x1b, 0xe5, 0xa6,
0xcf, 0x60, 0x20, 0x15, 0xe7, 0xa5, 0xce, 0x85, 0xf6, 0xa5, 0xcf, 0x85,
0xf7, 0x88, 0x84, 0xf8, 0xc8, 0xa9, 0x0a, 0x85, 0xf4, 0x84, 0xf5, 0x60,
0x20, 0x15, 0xe7, 0xa5, 0xce, 0xa4, 0xcf, 0x10, 0xf2, 0x20, 0x15, 0xe7,
0xb5, 0x50, 0x85, 0xda, 0xb5, 0x78, 0x85, 0xdb, 0xa5, 0xce, 0x91, 0xda,
0xc8, 0xa5, 0xcf, 0x91, 0xda, 0xe8, 0x60, 0x68, 0x68, 0x24, 0xd5, 0x10,
0x05, 0x20, 0xcd, 0xe3, 0x46, 0xd5, 0x60, 0xa0, 0xff, 0x84, 0xd7, 0x60,
0x20, 0xcd, 0xef, 0xf0, 0x07, 0xa9, 0x25, 0x85, 0xd6, 0x88, 0x84, 0xd4,
0xe8, 0x60, 0xa5, 0xca, 0xa4, 0xcb, 0xd0, 0x5a, 0xa0, 0x41, 0xa5, 0xfc,
0xc9, 0x08, 0xb0, 0x5e, 0xa8, 0xe6, 0xfc, 0xa5, 0xe0, 0x99, 0x00, 0x01,
0xa5, 0xe1, 0x99, 0x08, 0x01, 0xa5, 0xdc, 0x99, 0x10, 0x01, 0xa5, 0xdd,
0x99, 0x18, 0x01, 0x20, 0x15, 0xe7, 0x20, 0x6d, 0xe5, 0x90, 0x04, 0xa0,
0x37, 0xd0, 0x3b, 0xa5, 0xe4, 0xa4, 0xe5, 0x85, 0xdc, 0x84, 0xdd, 0x2c,
0x11, 0xd0, 0x30, 0x4f, 0x18, 0x69, 0x03, 0x90, 0x01, 0xc8, 0xa2, 0xff,
0x86, 0xd9, 0x9a, 0x85, 0xe0, 0x84, 0xe1, 0x20, 0x79, 0xe6, 0x24, 0xd9,
0x10, 0x49, 0x18, 0xa0, 0x00, 0xa5, 0xdc, 0x71, 0xdc, 0xa4, 0xdd, 0x90,
0x01, 0xc8, 0xc5, 0x4c, 0xd0, 0xd1, 0xc4, 0x4d, 0xd0, 0xcd, 0xa0, 0x34,
0x46, 0xd9, 0x4c, 0xe0, 0xe3, 0xa0, 0x4a, 0xa5, 0xfc, 0xf0, 0xf7, 0xc6,
0xfc, 0xa8, 0xb9, 0x0f, 0x01, 0x85, 0xdc, 0xb9, 0x17, 0x01, 0x85, 0xdd,
0xbe, 0xff, 0x00, 0xb9, 0x07, 0x01, 0xa8, 0x8a, 0x4c, 0x7a, 0xe8, 0xa0,
0x63, 0x20, 0xc4, 0xe3, 0xa0, 0x01, 0xb1, 0xdc, 0xaa, 0xc8, 0xb1, 0xdc,
0x20, 0x1b, 0xe5, 0x4c, 0xb3, 0xe2, 0xc6, 0xfb, 0xa0, 0x5b, 0xa5, 0xfb,
0xf0, 0xc4, 0xa8, 0xb5, 0x50, 0xd9, 0x1f, 0x01, 0xd0, 0xf0, 0xb5, 0x78,
0xd9, 0x27, 0x01, 0xd0, 0xe9, 0xb9, 0x2f, 0x01, 0x85, 0xda, 0xb9, 0x37,
0x01, 0x85, 0xdb, 0x20, 0x15, 0xe7, 0xca, 0x20, 0x93, 0xe7, 0x20, 0x01,
0xe8, 0xca, 0xa4, 0xfb, 0xb9, 0x67, 0x01, 0x95, 0x9f, 0xb9, 0x5f, 0x01,
0xa0, 0x00, 0x20, 0x08, 0xe7, 0x20, 0x82, 0xe7, 0x20, 0x59, 0xe7, 0x20,
0x15, 0xe7, 0xa4, 0xfb, 0xa5, 0xce, 0xf0, 0x05, 0x59, 0x37, 0x01, 0x10,
0x12, 0xb9, 0x3f, 0x01, 0x85, 0xdc, 0xb9, 0x47, 0x01, 0x85, 0xdd, 0xbe,
0x4f, 0x01, 0xb9, 0x57, 0x01, 0xd0, 0x87, 0xc6, 0xfb, 0x60, 0xa0, 0x54,
0xa5, 0xfb, 0xc9, 0x08, 0xf0, 0x9a, 0xe6, 0xfb, 0xa8, 0xb5, 0x50, 0x99,
0x20, 0x01, 0xb5, 0x78, 0x99, 0x28, 0x01, 0x60, 0x20, 0x15, 0xe7, 0xa4,
0xfb, 0xa5, 0xce, 0x99, 0x5f, 0x01, 0xa5, 0xcf, 0x99, 0x67, 0x01, 0xa9,
0x01, 0x99, 0x2f, 0x01, 0xa9, 0x00, 0x99, 0x37, 0x01, 0xa5, 0xdc, 0x99,
0x3f, 0x01, 0xa5, 0xdd, 0x99, 0x47, 0x01, 0xa5, 0xe0, 0x99, 0x4f, 0x01,
0xa5, 0xe1, 0x99, 0x57, 0x01, 0x60, 0x20, 0x15, 0xe7, 0xa4, 0xfb, 0xa5,
0xce, 0x99, 0x2f, 0x01, 0xa5, 0xcf, 0x4c, 0x66, 0xe9, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab,
0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x3f, 0x3f, 0xc0, 0xc0, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c,
0x3c, 0x30, 0x0f, 0xc0, 0xcc, 0xff, 0x55, 0x00, 0xab, 0xab, 0x03, 0x03,
0xff, 0xff, 0x55, 0xff, 0xff, 0x55, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xff,
0x55, 0xc3, 0xc3, 0xc3, 0x55, 0xf0, 0xf0, 0xcf, 0x56, 0x56, 0x56, 0x55,
0xff, 0xff, 0x55, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff,
0xff, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0xab, 0x03, 0x57, 0x03, 0x03, 0x03,
0x03, 0x07, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x17, 0xff, 0xff, 0x19,
0x5d, 0x35, 0x4b, 0xf2, 0xec, 0x87, 0x6f, 0xad, 0xb7, 0xe2, 0xf8, 0x54,
0x80, 0x96, 0x85, 0x82, 0x22, 0x10, 0x33, 0x4a, 0x13, 0x06, 0x0b, 0x4a,
0x01, 0x40, 0x47, 0x7a, 0x00, 0xff, 0x23, 0x09, 0x5b, 0x16, 0xb6, 0xcb,
0xff, 0xff, 0xfb, 0xff, 0xff, 0x24, 0xf6, 0x4e, 0x59, 0x50, 0x00, 0xff,
0x23, 0xa3, 0x6f, 0x36, 0x23, 0xd7, 0x1c, 0x22, 0xc2, 0xae, 0xba, 0x23,
0xff, 0xff, 0x21, 0x30, 0x1e, 0x03, 0xc4, 0x20, 0x00, 0xc1, 0xff, 0xff,
0xff, 0xa0, 0x30, 0x1e, 0xa4, 0xd3, 0xb6, 0xbc, 0xaa, 0x3a, 0x01, 0x50,
0x7e, 0xd8, 0xd8, 0xa5, 0x3c, 0xff, 0x16, 0x5b, 0x28, 0x03, 0xc4, 0x1d,
0x00, 0x0c, 0x4e, 0x00, 0x3e, 0x00, 0xa6, 0xb0, 0x00, 0xbc, 0xc6, 0x57,
0x8c, 0x01, 0x27, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0xff, 0xff, 0xe8,
0xe0, 0xe0, 0xe0, 0xef, 0xef, 0xe3, 0xe3, 0xe5, 0xe5, 0xe7, 0xe7, 0xee,
0xef, 0xef, 0xe7, 0xe7, 0xe2, 0xef, 0xe7, 0xe7, 0xec, 0xec, 0xec, 0xe7,
0xec, 0xec, 0xec, 0xe2, 0x00, 0xff, 0xe8, 0xe1, 0xe8, 0xe8, 0xef, 0xeb,
0xff, 0xff, 0xe0, 0xff, 0xff, 0xef, 0xee, 0xef, 0xe7, 0xe7, 0x00, 0xff,
0xe8, 0xe7, 0xe7, 0xe7, 0xe8, 0xe1, 0xe2, 0xee, 0xee, 0xee, 0xee, 0xe8,
0xff, 0xff, 0xe1, 0xe1, 0xef, 0xee, 0xe7, 0xe8, 0xee, 0xe7, 0xff, 0xff,
0xff, 0xee, 0xe1, 0xef, 0xe7, 0xe8, 0xef, 0xef, 0xeb, 0xe9, 0xe8, 0xe9,
0xe9, 0xe8, 0xe8, 0xe8, 0xe8, 0xff, 0xe8, 0xe8, 0xe8, 0xee, 0xe7, 0xe8,
0xef, 0xef, 0xee, 0xef, 0xee, 0xef, 0xee, 0xee, 0xef, 0xee, 0xee, 0xee,
0xe1, 0xe8, 0xe8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbe, 0xb3, 0xb2, 0xb7,
0xb6, 0x37, 0xd4, 0xcf, 0xcf, 0xa0, 0xcc, 0xcf, 0xce, 0x47, 0xd3, 0xd9,
0xce, 0xd4, 0xc1, 0x58, 0xcd, 0xc5, 0xcd, 0xa0, 0xc6, 0xd5, 0xcc, 0x4c,
0xd4, 0xcf, 0xcf, 0xa0, 0xcd, 0xc1, 0xce, 0xd9, 0xa0, 0xd0, 0xc1, 0xd2,
0xc5, 0xce, 0x53, 0xd3, 0xd4, 0xd2, 0xc9, 0xce, 0x47, 0xce, 0xcf, 0xa0,
0xc5, 0xce, 0x44, 0xc2, 0xc1, 0xc4, 0xa0, 0xc2, 0xd2, 0xc1, 0xce, 0xc3,
0x48, 0xbe, 0xb8, 0xa0, 0xc7, 0xcf, 0xd3, 0xd5, 0xc2, 0x53, 0xc2, 0xc1,
0xc4, 0xa0, 0xd2, 0xc5, 0xd4, 0xd5, 0xd2, 0x4e, 0xbe, 0xb8, 0xa0, 0xc6,
0xcf, 0xd2, 0x53, 0xc2, 0xc1, 0xc4, 0xa0, 0xce, 0xc5, 0xd8, 0x54, 0xd3,
0xd4, 0xcf, 0xd0, 0xd0, 0xc5, 0xc4, 0xa0, 0xc1, 0xd4, 0x20, 0xaa, 0xaa,
0xaa, 0x20, 0xa0, 0xc5, 0xd2, 0xd2, 0x0d, 0xbe, 0xb2, 0xb5, 0x35, 0xd2,
0xc1, 0xce, 0xc7, 0x45, 0xc4, 0xc9, 0x4d, 0xd3, 0xd4, 0xd2, 0xa0, 0xcf,
0xd6, 0xc6, 0x4c, 0xdc, 0x0d, 0xd2, 0xc5, 0xd4, 0xd9, 0xd0, 0xc5, 0xa0,
0xcc, 0xc9, 0xce, 0xc5, 0x8d, 0x3f, 0x46, 0xd9, 0x90, 0x03, 0x4c, 0xc3,
0xe8, 0xa6, 0xcf, 0x9a, 0xa6, 0xce, 0xa0, 0x8d, 0xd0, 0x02, 0xa0, 0x99,
0x20, 0xc4, 0xe3, 0x86, 0xce, 0xba, 0x86, 0xcf, 0xa0, 0xfe, 0x84, 0xd9,
0xc8, 0x84, 0xc8, 0x20, 0x99, 0xe2, 0x84, 0xf1, 0xa2, 0x20, 0xa9, 0x30,
0x20, 0x91, 0xe4, 0xe6, 0xd9, 0xa6, 0xce, 0xa4, 0xc8, 0x0a, 0x85, 0xce,
0xc8, 0xb9, 0x00, 0x02, 0xc9, 0x74, 0xf0, 0xd2, 0x49, 0xb0, 0xc9, 0x0a,
0xb0, 0xf0, 0xc8, 0xc8, 0x84, 0xc8, 0xb9, 0x00, 0x02, 0x48, 0xb9, 0xff,
0x01, 0xa0, 0x00, 0x20, 0x08, 0xe7, 0x68, 0x95, 0xa0, 0xa5, 0xce, 0xc9,
0xc7, 0xd0, 0x03, 0x20, 0x6f, 0xe7, 0x4c, 0x01, 0xe8, 0xff, 0xff, 0xff,
0x50, 0x20, 0x13, 0xec, 0xd0, 0x15, 0x20, 0x0b, 0xec, 0xd0, 0x10, 0x20,
0x82, 0xe7, 0x20, 0x6f, 0xe7, 0x50, 0x03, 0x20, 0x82, 0xe7, 0x20, 0x59,
0xe7, 0x56, 0x50, 0x4c, 0x36, 0xe7, 0xff, 0xff, 0xc1, 0xff, 0x7f, 0xd1,
0xcc, 0xc7, 0xcf, 0xce, 0xc5, 0x9a, 0x98, 0x8b, 0x96, 0x95, 0x93, 0xbf,
0xb2, 0x32, 0x2d, 0x2b, 0xbc, 0xb0, 0xac, 0xbe, 0x35, 0x8e, 0x61, 0xff,
0xff, 0xff, 0xdd, 0xfb, 0x20, 0xc9, 0xef, 0x15, 0x4f, 0x10, 0x05, 0x20,
0xc9, 0xef, 0x35, 0x4f, 0x95, 0x50, 0x10, 0xcb, 0x4c, 0xc9, 0xef, 0x40,
0x60, 0x8d, 0x60, 0x8b, 0x00, 0x7e, 0x8c, 0x33, 0x00, 0x00, 0x60, 0x03,
0xbf, 0x12, 0x00, 0x40, 0x89, 0xc9, 0x47, 0x9d, 0x17, 0x68, 0x9d, 0x0a,
0x00, 0x40, 0x60, 0x8d, 0x60, 0x8b, 0x00, 0x7e, 0x8c, 0x3c, 0x00, 0x00,
0x60, 0x03, 0xbf, 0x1b, 0x4b, 0x67, 0xb4, 0xa1, 0x07, 0x8c, 0x07, 0xae,
0xa9, 0xac, 0xa8, 0x67, 0x8c, 0x07, 0xb4, 0xaf, 0xac, 0xb0, 0x67, 0x9d,
0xb2, 0xaf, 0xac, 0xaf, 0xa3, 0x67, 0x8c, 0x07, 0xa5, 0xab, 0xaf, 0xb0,
0xf4, 0xae, 0xa9, 0xb2, 0xb0, 0x7f, 0x0e, 0x27, 0xb4, 0xae, 0xa9, 0xb2,
0xb0, 0x7f, 0x0e, 0x28, 0xb4, 0xae, 0xa9, 0xb2, 0xb0, 0x64, 0x07, 0xa6,
0xa9, 0x67, 0xaf, 0xb4, 0xaf, 0xa7, 0x78, 0xb4, 0xa5, 0xac, 0x78, 0x7f,
0x02, 0xad, 0xa5, 0xb2, 0x67, 0xa2, 0xb5, 0xb3, 0xaf, 0xa7, 0xee, 0xb2,
0xb5, 0xb4, 0xa5, 0xb2, 0x7e, 0x8c, 0x39, 0xb4, 0xb8, 0xa5, 0xae, 0x67,
0xb0, 0xa5, 0xb4, 0xb3, 0x27, 0xaf, 0xb4, 0x07, 0x9d, 0x19, 0xb2, 0xaf,
0xa6, 0x7f, 0x05, 0x37, 0xb4, 0xb5, 0xb0, 0xae, 0xa9, 0x7f, 0x05, 0x28,
0xb4, 0xb5, 0xb0, 0xae, 0xa9, 0x7f, 0x05, 0x2a, 0xb4, 0xb5, 0xb0, 0xae,
0xa9, 0xe4, 0xae, 0xa5, 0x00, 0xff, 0xff, 0x47, 0xa2, 0xa1, 0xb4, 0x7f,
0x0d, 0x30, 0xad, 0xa9, 0xa4, 0x7f, 0x0d, 0x23, 0xad, 0xa9, 0xa4, 0x67,
0xac, 0xac, 0xa1, 0xa3, 0x00, 0x40, 0x80, 0xc0, 0xc1, 0x80, 0x00, 0x47,
0x8c, 0x68, 0x8c, 0xdb, 0x67, 0x9b, 0x68, 0x9b, 0x50, 0x8c, 0x63, 0x8c,
0x7f, 0x01, 0x51, 0x07, 0x88, 0x29, 0x84, 0x80, 0xc4, 0x80, 0x57, 0x71,
0x07, 0x88, 0x14, 0xed, 0xa5, 0xad, 0xaf, 0xac, 0xed, 0xa5, 0xad, 0xa9,
0xa8, 0xf2, 0xaf, 0xac, 0xaf, 0xa3, 0x71, 0x08, 0x88, 0xae, 0xa5, 0xac,
0x68, 0x83, 0x08, 0x68, 0x9d, 0x08, 0x71, 0x07, 0x88, 0x60, 0x76, 0xb4,
0xaf, 0xae, 0x76, 0x8d, 0x76, 0x8b, 0x51, 0x07, 0x88, 0x19, 0xb8, 0xa4,
0xae, 0xb2, 0xf2, 0xb3, 0xb5, 0xf3, 0xa2, 0xa1, 0xee, 0xa7, 0xb3, 0xe4,
0xae, 0xb2, 0xeb, 0xa5, 0xa5, 0xb0, 0x51, 0x07, 0x88, 0x39, 0x81, 0xc1,
0x4f, 0x7f, 0x0f, 0x2f, 0x00, 0x51, 0x06, 0x88, 0x29, 0xc2, 0x0c, 0x82,
0x57, 0x8c, 0x6a, 0x8c, 0x42, 0xae, 0xa5, 0xa8, 0xb4, 0x60, 0xae, 0xa5,
0xa8, 0xb4, 0x4f, 0x7e, 0x1e, 0x35, 0x8c, 0x27, 0x51, 0x07, 0x88, 0x09,
0x8b, 0xfe, 0xe4, 0xaf, 0xad, 0xf2, 0xaf, 0xe4, 0xae, 0xa1, 0xdc, 0xde,
0x9c, 0xdd, 0x9c, 0xde, 0xdd, 0x9e, 0xc3, 0xdd, 0xcf, 0xca, 0xcd, 0xcb,
0x00, 0x47, 0x9d, 0xad, 0xa5, 0xad, 0xaf, 0xac, 0x76, 0x9d, 0xad, 0xa5,
0xad, 0xa9, 0xa8, 0xe6, 0xa6, 0xaf, 0x60, 0x8c, 0x20, 0xaf, 0xb4, 0xb5,
0xa1, 0xf2, 0xac, 0xa3, 0xf2, 0xa3, 0xb3, 0x60, 0x8c, 0x20, 0xac, 0xa5,
0xa4, 0xee, 0xb5, 0xb2, 0x60, 0xae, 0xb5, 0xb2, 0xf4, 0xb3, 0xa9, 0xac,
0x60, 0x8c, 0x20, 0xb4, 0xb3, 0xa9, 0xac, 0x7a, 0x7e, 0x9a, 0x22, 0x20,
0x00, 0x60, 0x03, 0xbf, 0x60, 0x03, 0xbf, 0x1f, 0x20, 0xb1, 0xe7, 0xe8,
0xe8, 0xb5, 0x4f, 0x85, 0xda, 0xb5, 0x77, 0x85, 0xdb, 0xb4, 0x4e, 0x98,
0xd5, 0x76, 0xb0, 0x09, 0xb1, 0xda, 0x20, 0xc9, 0xe3, 0xc8, 0x4c, 0x0f,
0xee, 0xa9, 0xff, 0x85, 0xd5, 0x60, 0xe8, 0xa9, 0x00, 0x95, 0x78, 0x95,
0xa0, 0xb5, 0x77, 0x38, 0xf5, 0x4f, 0x95, 0x50, 0x4c, 0x23, 0xe8, 0xff,
0x20, 0x15, 0xe7, 0xa5, 0xcf, 0xd0, 0x28, 0xa5, 0xce, 0x60, 0x20, 0x34,
0xee, 0xa4, 0xc8, 0xc9, 0x30, 0xb0, 0x21, 0xc0, 0x28, 0xb0, 0x1d, 0x60,
0xea, 0xea, 0x20, 0x34, 0xee, 0x60, 0xea, 0x8a, 0xa2, 0x01, 0xb4, 0xce,
0x94, 0x4c, 0xb4, 0x48, 0x94, 0xca, 0xca, 0xf0, 0xf5, 0xaa, 0x60, 0xa0,
0x77, 0x4c, 0xe0, 0xe3, 0xa0, 0x7b, 0xd0, 0xf9, 0x20, 0x54, 0xe2, 0xa5,
0xda, 0xd0, 0x07, 0xa5, 0xdb, 0xd0, 0x03, 0x4c, 0x7e, 0xe7, 0x06, 0xce,
0x26, 0xcf, 0x26, 0xe6, 0x26, 0xe7, 0xa5, 0xe6, 0xc5, 0xda, 0xa5, 0xe7,
0xe5, 0xdb, 0x90, 0x0a, 0x85, 0xe7, 0xa5, 0xe6, 0xe5, 0xda, 0x85, 0xe6,
0xe6, 0xce, 0x88, 0xd0, 0xe1, 0x60, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x20, 0x15, 0xe7, 0x6c, 0xce, 0x00, 0xa5, 0x4c, 0xd0, 0x02, 0xc6, 0x4d,
0xc6, 0x4c, 0xa5, 0x48, 0xd0, 0x02, 0xc6, 0x49, 0xc6, 0x48, 0xa0, 0x00,
0xb1, 0x4c, 0x91, 0x48, 0xa5, 0xca, 0xc5, 0x4c, 0xa5, 0xcb, 0xe5, 0x4d,
0x90, 0xe0, 0x4c, 0x53, 0xee, 0xc9, 0x28, 0xb0, 0x9b, 0xa8, 0xa5, 0xc8,
0x60, 0xea, 0xea, 0x98, 0xaa, 0xa0, 0x6e, 0x20, 0xc4, 0xe3, 0x8a, 0xa8,
0x20, 0xc4, 0xe3, 0xa0, 0x72, 0x4c, 0xc4, 0xe3, 0x20, 0x15, 0xe7, 0x06,
0xce, 0x26, 0xcf, 0x30, 0xfa, 0xb0, 0xdc, 0xd0, 0x04, 0xc5, 0xce, 0xb0,
0xd6, 0x60, 0x20, 0x15, 0xe7, 0xb1, 0xce, 0x94, 0x9f, 0x4c, 0x08, 0xe7,
0x20, 0x34, 0xee, 0xa5, 0xce, 0x48, 0x20, 0x15, 0xe7, 0x68, 0x91, 0xce,
0x60, 0xff, 0xff, 0xff, 0x20, 0x6c, 0xee, 0xa5, 0xce, 0x85, 0xe6, 0xa5,
0xcf, 0x85, 0xe7, 0x4c, 0x44, 0xe2, 0x20, 0xe4, 0xee, 0x4c, 0x34, 0xe1,
0x20, 0xe4, 0xee, 0xb4, 0x78, 0xb5, 0x50, 0x69, 0xfe, 0xb0, 0x01, 0x88,
0x85, 0xda, 0x84, 0xdb, 0x18, 0x65, 0xce, 0x95, 0x50, 0x98, 0x65, 0xcf,
0x95, 0x78, 0xa0, 0x00, 0xb5, 0x50, 0xd1, 0xda, 0xc8, 0xb5, 0x78, 0xf1,
0xda, 0xb0, 0x80, 0x4c, 0x23, 0xe8, 0x20, 0x15, 0xe7, 0xa5, 0x4e, 0x20,
0x08, 0xe7, 0xa5, 0x4f, 0xd0, 0x04, 0xc5, 0x4e, 0x69, 0x00, 0x29, 0x7f,
0x85, 0x4f, 0x95, 0xa0, 0xa0, 0x11, 0xa5, 0x4f, 0x0a, 0x18, 0x69, 0x40,
0x0a, 0x26, 0x4e, 0x26, 0x4f, 0x88, 0xd0, 0xf2, 0xa5, 0xce, 0x20, 0x08,
0xe7, 0xa5, 0xcf, 0x95, 0xa0, 0x4c, 0x7a, 0xe2, 0x20, 0x15, 0xe7, 0xa4,
0xce, 0xc4, 0x4c, 0xa5, 0xcf, 0xe5, 0x4d, 0x90, 0x1f, 0x84, 0x48, 0xa5,
0xcf, 0x85, 0x49, 0x4c, 0xb6, 0xee, 0x20, 0x15, 0xe7, 0xa4, 0xce, 0xc4,
0xca, 0xa5, 0xcf, 0xe5, 0xcb, 0xb0, 0x09, 0x84, 0x4a, 0xa5, 0xcf, 0x85,
0x4b, 0x4c, 0xb7, 0xe5, 0x4c, 0xcb, 0xee, 0xea, 0xea, 0xea, 0xea, 0x20,
0xc9, 0xef, 0x20, 0x71, 0xe1, 0x4c, 0xbf, 0xef, 0x20, 0x03, 0xee, 0xa9,
0xff, 0x85, 0xc8, 0xa9, 0x74, 0x8d, 0x00, 0x02, 0x60, 0x20, 0x36, 0xe7,
0xe8, 0x20, 0x36, 0xe7, 0xb5, 0x50, 0x60, 0xa9, 0x00, 0x85, 0x4a, 0x85,
0x4c, 0xa9, 0x08, 0x85, 0x4b, 0xa9, 0x10, 0x85, 0x4d, 0x4c, 0xad, 0xe5,
0xd5, 0x78, 0xd0, 0x01, 0x18, 0x4c, 0x02, 0xe1, 0x20, 0xb7, 0xe5, 0x4c,
0x36, 0xe8, 0x20, 0xb7, 0xe5, 0x4c, 0x5b, 0xe8, 0xe0, 0x80, 0xd0, 0x01,
0x88, 0x4c, 0x0c, 0xe0,
];
start() {
return 0xe0;
}
end() {
return 0xef;
}
read(page: byte, off: byte) {
return this.ram[((page - 0xe0) << 8) | off];
}
write(page: byte, off: byte, val: byte) {
this.ram[((page - 0xe0) << 8) | off] = val;
}
getState() {
return {};
}
setState() {}
}

View File

@ -1,52 +0,0 @@
export default function Bios() {
var rom = [
0xd8,0x58,0xa0,0x7f,0x8c,0x12,0xd0,0xa9,
0xa7,0x8d,0x11,0xd0,0x8d,0x13,0xd0,0xc9,
0xdf,0xf0,0x13,0xc9,0x9b,0xf0,0x03,0xc8,
0x10,0x0f,0xa9,0xdc,0x20,0xef,0xff,0xa9,
0x8d,0x20,0xef,0xff,0xa0,0x01,0x88,0x30,
0xf6,0xad,0x11,0xd0,0x10,0xfb,0xad,0x10,
0xd0,0x99,0x00,0x02,0x20,0xef,0xff,0xc9,
0x8d,0xd0,0xd4,0xa0,0xff,0xa9,0x00,0xaa,
0x0a,0x85,0x2b,0xc8,0xb9,0x00,0x02,0xc9,
0x8d,0xf0,0xd4,0xc9,0xae,0x90,0xf4,0xf0,
0xf0,0xc9,0xba,0xf0,0xeb,0xc9,0xd2,0xf0,
0x3b,0x86,0x28,0x86,0x29,0x84,0x2a,0xb9,
0x00,0x02,0x49,0xb0,0xc9,0x0a,0x90,0x06,
0x69,0x88,0xc9,0xfa,0x90,0x11,0x0a,0x0a,
0x0a,0x0a,0xa2,0x04,0x0a,0x26,0x28,0x26,
0x29,0xca,0xd0,0xf8,0xc8,0xd0,0xe0,0xc4,
0x2a,0xf0,0x97,0x24,0x2b,0x50,0x10,0xa5,
0x28,0x81,0x26,0xe6,0x26,0xd0,0xb5,0xe6,
0x27,0x4c,0x44,0xff,0x6c,0x24,0x00,0x30,
0x2b,0xa2,0x02,0xb5,0x27,0x95,0x25,0x95,
0x23,0xca,0xd0,0xf7,0xd0,0x14,0xa9,0x8d,
0x20,0xef,0xff,0xa5,0x25,0x20,0xdc,0xff,
0xa5,0x24,0x20,0xdc,0xff,0xa9,0xba,0x20,
0xef,0xff,0xa9,0xa0,0x20,0xef,0xff,0xa1,
0x24,0x20,0xdc,0xff,0x86,0x2b,0xa5,0x24,
0xc5,0x28,0xa5,0x25,0xe5,0x29,0xb0,0xc1,
0xe6,0x24,0xd0,0x02,0xe6,0x25,0xa5,0x24,
0x29,0x07,0x10,0xc8,0x48,0x4a,0x4a,0x4a,
0x4a,0x20,0xe5,0xff,0x68,0x29,0x0f,0x09,
0xb0,0xc9,0xba,0x90,0x02,0x69,0x06,0x2c,
0x12,0xd0,0x30,0xfb,0x8d,0x12,0xd0,0x60,
0x00,0x00,0x00,0x0f,0x00,0xff,0x00,0x00
];
return {
start: function bios_start() {
return 0xff;
},
end: function bios_end() {
return 0xff;
},
read: function bios_read(page, off) {
return rom[off];
},
write: function bios_write() {},
getState: function bios_getState() { return {}; },
setState: function bios_setState() {}
};
}

44
js/roms/bios.ts Normal file
View File

@ -0,0 +1,44 @@
import { byte } from 'js/types';
export default class Bios {
rom = [
0xd8, 0x58, 0xa0, 0x7f, 0x8c, 0x12, 0xd0, 0xa9, 0xa7, 0x8d, 0x11, 0xd0,
0x8d, 0x13, 0xd0, 0xc9, 0xdf, 0xf0, 0x13, 0xc9, 0x9b, 0xf0, 0x03, 0xc8,
0x10, 0x0f, 0xa9, 0xdc, 0x20, 0xef, 0xff, 0xa9, 0x8d, 0x20, 0xef, 0xff,
0xa0, 0x01, 0x88, 0x30, 0xf6, 0xad, 0x11, 0xd0, 0x10, 0xfb, 0xad, 0x10,
0xd0, 0x99, 0x00, 0x02, 0x20, 0xef, 0xff, 0xc9, 0x8d, 0xd0, 0xd4, 0xa0,
0xff, 0xa9, 0x00, 0xaa, 0x0a, 0x85, 0x2b, 0xc8, 0xb9, 0x00, 0x02, 0xc9,
0x8d, 0xf0, 0xd4, 0xc9, 0xae, 0x90, 0xf4, 0xf0, 0xf0, 0xc9, 0xba, 0xf0,
0xeb, 0xc9, 0xd2, 0xf0, 0x3b, 0x86, 0x28, 0x86, 0x29, 0x84, 0x2a, 0xb9,
0x00, 0x02, 0x49, 0xb0, 0xc9, 0x0a, 0x90, 0x06, 0x69, 0x88, 0xc9, 0xfa,
0x90, 0x11, 0x0a, 0x0a, 0x0a, 0x0a, 0xa2, 0x04, 0x0a, 0x26, 0x28, 0x26,
0x29, 0xca, 0xd0, 0xf8, 0xc8, 0xd0, 0xe0, 0xc4, 0x2a, 0xf0, 0x97, 0x24,
0x2b, 0x50, 0x10, 0xa5, 0x28, 0x81, 0x26, 0xe6, 0x26, 0xd0, 0xb5, 0xe6,
0x27, 0x4c, 0x44, 0xff, 0x6c, 0x24, 0x00, 0x30, 0x2b, 0xa2, 0x02, 0xb5,
0x27, 0x95, 0x25, 0x95, 0x23, 0xca, 0xd0, 0xf7, 0xd0, 0x14, 0xa9, 0x8d,
0x20, 0xef, 0xff, 0xa5, 0x25, 0x20, 0xdc, 0xff, 0xa5, 0x24, 0x20, 0xdc,
0xff, 0xa9, 0xba, 0x20, 0xef, 0xff, 0xa9, 0xa0, 0x20, 0xef, 0xff, 0xa1,
0x24, 0x20, 0xdc, 0xff, 0x86, 0x2b, 0xa5, 0x24, 0xc5, 0x28, 0xa5, 0x25,
0xe5, 0x29, 0xb0, 0xc1, 0xe6, 0x24, 0xd0, 0x02, 0xe6, 0x25, 0xa5, 0x24,
0x29, 0x07, 0x10, 0xc8, 0x48, 0x4a, 0x4a, 0x4a, 0x4a, 0x20, 0xe5, 0xff,
0x68, 0x29, 0x0f, 0x09, 0xb0, 0xc9, 0xba, 0x90, 0x02, 0x69, 0x06, 0x2c,
0x12, 0xd0, 0x30, 0xfb, 0x8d, 0x12, 0xd0, 0x60, 0x00, 0x00, 0x00, 0x0f,
0x00, 0xff, 0x00, 0x00,
] as const;
start() {
return 0xff;
}
end() {
return 0xff;
}
read(_page: byte, off: byte) {
return this.rom[off];
}
write() {}
getState() {
return {};
}
setState() {}
}

File diff suppressed because it is too large Load Diff

871
js/roms/enhanced-basic.ts Normal file
View File

@ -0,0 +1,871 @@
import { byte } from 'js/types';
export default class EnhancedBasic {
rom = [
0xa0, 0x08, 0xb9, 0xbd, 0x78, 0x99, 0xc8, 0x02, 0x88, 0x10, 0xf7, 0xa2,
0xff, 0x86, 0x88, 0x9a, 0xa9, 0x4c, 0x85, 0xa1, 0xa2, 0x18, 0xbd, 0xc5,
0x78, 0x95, 0xbb, 0xca, 0xd0, 0xf8, 0xa2, 0x12, 0xbd, 0xde, 0x78, 0x95,
0x00, 0xca, 0x10, 0xf8, 0xa9, 0x00, 0x85, 0xd8, 0x85, 0xdb, 0x85, 0xb2,
0x85, 0x67, 0xa9, 0x08, 0x85, 0x64, 0xa9, 0x03, 0x85, 0xa0, 0xa2, 0x68,
0x86, 0x65, 0x20, 0x61, 0x60, 0xa9, 0xf1, 0xa0, 0x78, 0x20, 0x9c, 0x60,
0x20, 0x45, 0x5a, 0x86, 0xc3, 0x84, 0xc4, 0x20, 0xbc, 0x00, 0xd0, 0x1f,
0xa0, 0x00, 0xe6, 0x11, 0xd0, 0x08, 0xe6, 0x12, 0xa5, 0x12, 0xc9, 0x58,
0xf0, 0x1d, 0xa9, 0x55, 0x91, 0x11, 0xd1, 0x11, 0xd0, 0x15, 0x0a, 0x91,
0x11, 0xd1, 0x11, 0xf0, 0xe5, 0xd0, 0x0c, 0x20, 0x6a, 0x71, 0xa5, 0xac,
0xc9, 0x98, 0xb0, 0xa2, 0x20, 0xb5, 0x6c, 0xa5, 0x11, 0xa4, 0x12, 0xc0,
0x04, 0x90, 0x97, 0x85, 0x85, 0x84, 0x86, 0x85, 0x81, 0x84, 0x82, 0xa0,
0x00, 0xa2, 0x03, 0x84, 0x79, 0x86, 0x7a, 0x98, 0x91, 0x79, 0xe6, 0x79,
0x20, 0x61, 0x60, 0x20, 0x57, 0x5b, 0xa5, 0x85, 0x38, 0xe5, 0x79, 0xaa,
0xa5, 0x86, 0xe5, 0x7a, 0x20, 0x45, 0x72, 0xa9, 0xff, 0xa0, 0x78, 0x20,
0x9c, 0x60, 0xa9, 0x59, 0xa0, 0x59, 0x85, 0x01, 0x84, 0x02, 0x6c, 0x01,
0x00, 0x20, 0x0c, 0x59, 0x85, 0x7f, 0x84, 0x80, 0x38, 0xa5, 0xa6, 0xe5,
0xaa, 0x85, 0x71, 0xa8, 0xa5, 0xa7, 0xe5, 0xab, 0xaa, 0xe8, 0x98, 0xf0,
0x23, 0xa5, 0xa6, 0x38, 0xe5, 0x71, 0x85, 0xa6, 0xb0, 0x03, 0xc6, 0xa7,
0x38, 0xa5, 0xa4, 0xe5, 0x71, 0x85, 0xa4, 0xb0, 0x08, 0xc6, 0xa5, 0x90,
0x04, 0xb1, 0xa6, 0x91, 0xa4, 0x88, 0xd0, 0xf9, 0xb1, 0xa6, 0x91, 0xa4,
0xc6, 0xa7, 0xc6, 0xa5, 0xca, 0xd0, 0xf2, 0x60, 0x85, 0x78, 0xba, 0xe4,
0x78, 0x90, 0x2e, 0x60, 0xc4, 0x82, 0x90, 0x28, 0xd0, 0x04, 0xc5, 0x81,
0x90, 0x22, 0x48, 0xa2, 0x08, 0x98, 0x48, 0xb5, 0xa3, 0xca, 0x10, 0xfa,
0x20, 0xae, 0x69, 0xa2, 0xf8, 0x68, 0x95, 0xac, 0xe8, 0x30, 0xfa, 0x68,
0xa8, 0x68, 0xc4, 0x82, 0x90, 0x06, 0xd0, 0x05, 0xc5, 0x81, 0xb0, 0x01,
0x60, 0xa2, 0x0c, 0x20, 0x61, 0x60, 0xbd, 0xfd, 0x7d, 0xbc, 0xfe, 0x7d,
0x20, 0x9c, 0x60, 0x20, 0x90, 0x5b, 0xa9, 0x38, 0xa0, 0x7f, 0x20, 0x9c,
0x60, 0xa4, 0x88, 0xc8, 0xf0, 0x03, 0x20, 0x3a, 0x72, 0xa9, 0x00, 0x85,
0xdb, 0x85, 0xd8, 0xa9, 0x48, 0xa0, 0x7f, 0x20, 0x9c, 0x60, 0x20, 0x52,
0x5a, 0x86, 0xc3, 0x84, 0xc4, 0x20, 0xbc, 0x00, 0xf0, 0xf4, 0xa2, 0xff,
0x86, 0x88, 0x90, 0x06, 0x20, 0x83, 0x5a, 0x4c, 0xfa, 0x5c, 0x20, 0x19,
0x5f, 0x20, 0x83, 0x5a, 0x84, 0x5d, 0x20, 0x29, 0x5b, 0x90, 0x44, 0xa0,
0x01, 0xb1, 0xaa, 0x85, 0x72, 0xa5, 0x7b, 0x85, 0x71, 0xa5, 0xab, 0x85,
0x74, 0xa5, 0xaa, 0x88, 0xf1, 0xaa, 0x18, 0x65, 0x7b, 0x85, 0x7b, 0x85,
0x73, 0xa5, 0x7c, 0x69, 0xff, 0x85, 0x7c, 0xe5, 0xab, 0xaa, 0x38, 0xa5,
0xaa, 0xe5, 0x7b, 0xa8, 0xb0, 0x03, 0xe8, 0xc6, 0x74, 0x18, 0x65, 0x71,
0x90, 0x03, 0xc6, 0x72, 0x18, 0xb1, 0x71, 0x91, 0x73, 0xc8, 0xd0, 0xf9,
0xe6, 0x72, 0xe6, 0x74, 0xca, 0xd0, 0xf2, 0xad, 0x80, 0x02, 0xf0, 0x3f,
0xa5, 0x85, 0xa4, 0x86, 0x85, 0x81, 0x84, 0x82, 0xa5, 0x7b, 0x85, 0xa6,
0xa4, 0x7c, 0x84, 0xa7, 0x65, 0x5d, 0x90, 0x01, 0xc8, 0x85, 0xa4, 0x84,
0xa5, 0x20, 0xc1, 0x58, 0xa5, 0x7f, 0xa4, 0x80, 0x85, 0x7b, 0x84, 0x7c,
0xa4, 0x5d, 0x88, 0xb9, 0x7c, 0x02, 0x91, 0xaa, 0x88, 0xc0, 0x03, 0xd0,
0xf6, 0xa5, 0x12, 0x91, 0xaa, 0x88, 0xa5, 0x11, 0x91, 0xaa, 0x88, 0xa9,
0xff, 0x91, 0xaa, 0x20, 0x6c, 0x5b, 0xa5, 0x79, 0xa4, 0x7a, 0x85, 0x71,
0x84, 0x72, 0x18, 0xa0, 0x01, 0xb1, 0x71, 0xd0, 0x03, 0x4c, 0x66, 0x59,
0xa0, 0x04, 0xc8, 0xb1, 0x71, 0xd0, 0xfb, 0xc8, 0x98, 0x65, 0x71, 0xaa,
0xa0, 0x00, 0x91, 0x71, 0xa5, 0x72, 0x69, 0x00, 0xc8, 0x91, 0x71, 0x86,
0x71, 0x85, 0x72, 0x90, 0xda, 0x20, 0xb4, 0x60, 0x20, 0xb1, 0x60, 0xd0,
0x05, 0x20, 0xb6, 0x60, 0xca, 0x2c, 0xa2, 0x00, 0x20, 0xb1, 0x78, 0x90,
0xfb, 0xf0, 0xf9, 0xc9, 0x07, 0xf0, 0x10, 0xc9, 0x0d, 0xf0, 0x19, 0xe0,
0x00, 0xd0, 0x04, 0xc9, 0x21, 0x90, 0xe9, 0xc9, 0x08, 0xf0, 0xde, 0xe0,
0x47, 0xb0, 0x0c, 0x9d, 0x80, 0x02, 0xe8, 0x20, 0xb6, 0x60, 0xd0, 0xd8,
0x4c, 0x58, 0x60, 0xa9, 0x07, 0xd0, 0xf4, 0xa0, 0xff, 0x38, 0xa5, 0xc3,
0xe9, 0x80, 0xaa, 0x86, 0x60, 0xbd, 0x80, 0x02, 0xf0, 0x51, 0xc9, 0x5f,
0xb0, 0x4d, 0xc9, 0x3c, 0xb0, 0x0e, 0xc9, 0x30, 0xb0, 0x45, 0x85, 0x5c,
0xc9, 0x22, 0xf0, 0x61, 0xc9, 0x2a, 0x90, 0x3b, 0x24, 0x60, 0x70, 0x37,
0x86, 0x78, 0x84, 0xba, 0xa0, 0x8d, 0x84, 0x73, 0xa0, 0x7a, 0x84, 0x74,
0xa0, 0x00, 0xd1, 0x73, 0xf0, 0x05, 0x90, 0x21, 0xc8, 0xd0, 0xf7, 0x98,
0x0a, 0xaa, 0xbd, 0xab, 0x7a, 0x85, 0x73, 0xbd, 0xac, 0x7a, 0x85, 0x74,
0xa0, 0xff, 0xa6, 0x78, 0xc8, 0xb1, 0x73, 0x30, 0x08, 0xe8, 0xdd, 0x80,
0x02, 0xf0, 0xf5, 0xd0, 0x2b, 0xa4, 0xba, 0xe8, 0xc8, 0x99, 0x80, 0x02,
0xc9, 0x00, 0xf0, 0x32, 0xe9, 0x3a, 0xf0, 0x04, 0xc9, 0x49, 0xd0, 0x02,
0x85, 0x60, 0x49, 0x57, 0xd0, 0x93, 0x85, 0x5c, 0xbd, 0x80, 0x02, 0xf0,
0xe2, 0xc5, 0x5c, 0xf0, 0xde, 0xc8, 0x99, 0x80, 0x02, 0xe8, 0xd0, 0xf0,
0xa6, 0x78, 0xb1, 0x73, 0x08, 0xc8, 0x28, 0x10, 0xf9, 0xb1, 0x73, 0xd0,
0xbe, 0xbd, 0x80, 0x02, 0x10, 0xc3, 0xc8, 0xc8, 0x99, 0x80, 0x02, 0xc8,
0xc8, 0xc8, 0xc6, 0xc3, 0x60, 0xa5, 0x79, 0xa6, 0x7a, 0xa0, 0x01, 0x85,
0xaa, 0x86, 0xab, 0xb1, 0xaa, 0xf0, 0x1c, 0xc8, 0xc8, 0xb1, 0xaa, 0x88,
0xc5, 0x12, 0xf0, 0x0b, 0xb0, 0x11, 0x88, 0xb1, 0xaa, 0xaa, 0x88, 0xb1,
0xaa, 0x90, 0xe2, 0xb1, 0xaa, 0xc5, 0x11, 0x90, 0xf1, 0xf0, 0x01, 0x18,
0x60, 0xd0, 0xfd, 0xa9, 0x00, 0xa8, 0x91, 0x79, 0xc8, 0x91, 0x79, 0x18,
0xa5, 0x79, 0x69, 0x02, 0x85, 0x7b, 0xa5, 0x7a, 0x69, 0x00, 0x85, 0x7c,
0x18, 0xa5, 0x79, 0x69, 0xff, 0x85, 0xc3, 0xa5, 0x7a, 0x69, 0xff, 0x85,
0xc4, 0xa5, 0x85, 0xa4, 0x86, 0x85, 0x81, 0x84, 0x82, 0xa5, 0x7b, 0xa4,
0x7c, 0x85, 0x7d, 0x84, 0x7e, 0x85, 0x7f, 0x84, 0x80, 0x20, 0x4d, 0x5d,
0xa2, 0x68, 0x86, 0x65, 0x68, 0xaa, 0x68, 0x8e, 0xfe, 0x01, 0x8d, 0xff,
0x01, 0xa2, 0xfd, 0x9a, 0xa9, 0x00, 0x85, 0x8c, 0x85, 0x61, 0x60, 0xf0,
0xd0, 0x60, 0x90, 0x06, 0xf0, 0x04, 0xc9, 0xb6, 0xd0, 0xf4, 0x20, 0x19,
0x5f, 0x20, 0x29, 0x5b, 0x20, 0xc2, 0x00, 0xf0, 0x0c, 0xc9, 0xb6, 0xd0,
0x93, 0x20, 0xbc, 0x00, 0x20, 0x19, 0x5f, 0xd0, 0x8b, 0xa5, 0x11, 0x05,
0x12, 0xd0, 0x06, 0xa9, 0xff, 0x85, 0x11, 0x85, 0x12, 0xa0, 0x01, 0x84,
0x60, 0x20, 0x61, 0x60, 0xb1, 0xaa, 0xf0, 0x3e, 0x20, 0x1d, 0x5d, 0xc8,
0xb1, 0xaa, 0xaa, 0xc8, 0xb1, 0xaa, 0xc5, 0x12, 0xd0, 0x04, 0xe4, 0x11,
0xf0, 0x02, 0xb0, 0x2a, 0x84, 0x97, 0x20, 0x45, 0x72, 0xa9, 0x20, 0xa4,
0x97, 0x29, 0x7f, 0x20, 0xb6, 0x60, 0xc9, 0x22, 0xd0, 0x06, 0xa5, 0x60,
0x49, 0xff, 0x85, 0x60, 0xc8, 0xb1, 0xaa, 0xd0, 0x0e, 0xa8, 0xb1, 0xaa,
0xaa, 0xc8, 0xb1, 0xaa, 0x86, 0xaa, 0x85, 0xab, 0xd0, 0xb7, 0x60, 0x10,
0xde, 0x24, 0x60, 0x30, 0xda, 0xa2, 0x7c, 0x0a, 0x0a, 0x90, 0x02, 0xe8,
0x18, 0x69, 0x69, 0x90, 0x01, 0xe8, 0x85, 0x73, 0x86, 0x74, 0x84, 0x97,
0xa0, 0x00, 0xb1, 0x73, 0xaa, 0xc8, 0xb1, 0x73, 0xca, 0xf0, 0xb8, 0x20,
0xb6, 0x60, 0xc8, 0xb1, 0x73, 0x48, 0xc8, 0xb1, 0x73, 0xa0, 0x00, 0x85,
0x74, 0x68, 0x85, 0x73, 0xb1, 0x73, 0xca, 0xf0, 0xa2, 0x20, 0xb6, 0x60,
0xc8, 0xd0, 0xf5, 0xa9, 0x80, 0x85, 0x61, 0x20, 0x81, 0x5f, 0x68, 0x68,
0xa9, 0x10, 0x20, 0x04, 0x59, 0x20, 0xa6, 0x5e, 0x18, 0x98, 0x65, 0xc3,
0x48, 0xa5, 0xc4, 0x69, 0x00, 0x48, 0xa5, 0x88, 0x48, 0xa5, 0x87, 0x48,
0xa9, 0xac, 0x20, 0xea, 0x63, 0x20, 0x94, 0x62, 0x20, 0x91, 0x62, 0xa5,
0xb0, 0x09, 0x7f, 0x25, 0xad, 0x85, 0xad, 0xa9, 0x9e, 0xa0, 0x5c, 0x85,
0x71, 0x84, 0x72, 0x4c, 0x46, 0x63, 0xa9, 0xa3, 0xa0, 0x79, 0x20, 0x3e,
0x70, 0x20, 0xc2, 0x00, 0xc9, 0xb1, 0xd0, 0x06, 0x20, 0xbc, 0x00, 0x20,
0x91, 0x62, 0x20, 0xad, 0x70, 0x85, 0xb0, 0x20, 0x3b, 0x63, 0xa5, 0x98,
0x48, 0xa5, 0x97, 0x48, 0xa9, 0x81, 0x48, 0x20, 0x1d, 0x5d, 0xa5, 0xc3,
0xa4, 0xc4, 0xa6, 0x88, 0xe8, 0xf0, 0x04, 0x85, 0x8b, 0x84, 0x8c, 0xa0,
0x00, 0xb1, 0xc3, 0xf0, 0x07, 0xc9, 0x3a, 0xf0, 0x1d, 0x4c, 0xf3, 0x63,
0xa0, 0x02, 0xb1, 0xc3, 0x18, 0xf0, 0x58, 0xc8, 0xb1, 0xc3, 0x85, 0x87,
0xc8, 0xb1, 0xc3, 0x85, 0x88, 0x98, 0x65, 0xc3, 0x85, 0xc3, 0x90, 0x02,
0xe6, 0xc4, 0x20, 0xbc, 0x00, 0x20, 0x03, 0x5d, 0x4c, 0xc3, 0x5c, 0xf0,
0x56, 0x49, 0x80, 0x10, 0x03, 0x4c, 0x81, 0x5f, 0xc9, 0x2b, 0xb0, 0xcd,
0x0a, 0xa8, 0xb9, 0xcb, 0x79, 0x48, 0xb9, 0xca, 0x79, 0x48, 0x4c, 0xbc,
0x00, 0x6c, 0xcb, 0x02, 0xc9, 0x03, 0xb0, 0x01, 0x18, 0xd0, 0x67, 0xa5,
0xc4, 0x49, 0x02, 0xf0, 0x10, 0x49, 0x02, 0xa4, 0xc3, 0x84, 0x8b, 0x85,
0x8c, 0xa5, 0x87, 0xa4, 0x88, 0x85, 0x89, 0x84, 0x8a, 0x68, 0x68, 0x90,
0x07, 0xa9, 0x31, 0xa0, 0x7f, 0x4c, 0x4e, 0x59, 0x4c, 0x59, 0x59, 0xd0,
0x0f, 0x38, 0xa5, 0x79, 0xe9, 0x01, 0xa4, 0x7a, 0xb0, 0x01, 0x88, 0x85,
0x8f, 0x84, 0x90, 0x60, 0x20, 0x19, 0x5f, 0x20, 0xa9, 0x5e, 0xa5, 0x88,
0xc5, 0x12, 0xb0, 0x0b, 0x98, 0x38, 0x65, 0xc3, 0xa6, 0xc4, 0x90, 0x07,
0xe8, 0xb0, 0x04, 0xa5, 0x79, 0xa6, 0x7a, 0x20, 0x2d, 0x5b, 0xb0, 0x03,
0x4c, 0x7b, 0x5e, 0xa5, 0xaa, 0xe9, 0x01, 0xa4, 0xab, 0xb0, 0xd0, 0x90,
0xcd, 0x20, 0x4a, 0x6c, 0x86, 0x0d, 0x60, 0xd0, 0xfd, 0xa4, 0x8c, 0xd0,
0x05, 0xa2, 0x1e, 0x4c, 0x3b, 0x59, 0xa9, 0x93, 0x20, 0xd0, 0x76, 0xa9,
0x93, 0x20, 0xd3, 0x76, 0x84, 0xc4, 0xa5, 0x8b, 0x85, 0xc3, 0xa5, 0x89,
0xa4, 0x8a, 0x85, 0x87, 0x84, 0x88, 0x60, 0xd0, 0x03, 0x4c, 0x6c, 0x5b,
0x20, 0x79, 0x5b, 0xf0, 0x2e, 0xa9, 0x05, 0x20, 0x04, 0x59, 0xa5, 0xc4,
0x48, 0xa5, 0xc3, 0x48, 0xa5, 0x88, 0x48, 0xa5, 0x87, 0x48, 0xa9, 0x9d,
0x48, 0x20, 0xc2, 0x00, 0x4c, 0xc3, 0x5c, 0xa9, 0x05, 0x20, 0x04, 0x59,
0xa5, 0xc4, 0x48, 0xa5, 0xc3, 0x48, 0xa5, 0x88, 0x48, 0xa5, 0x87, 0x48,
0xa9, 0x8d, 0x48, 0x20, 0xc2, 0x00, 0x20, 0xf4, 0x5d, 0x4c, 0xc3, 0x5c,
0x20, 0x19, 0x5f, 0x20, 0xa9, 0x5e, 0xa5, 0x88, 0xc5, 0x12, 0xb0, 0x0b,
0x98, 0x38, 0x65, 0xc3, 0xa6, 0xc4, 0x90, 0x07, 0xe8, 0xb0, 0x04, 0xa5,
0x79, 0xa6, 0x7a, 0x20, 0x2d, 0x5b, 0x90, 0x67, 0xa5, 0xaa, 0xe9, 0x01,
0x85, 0xc3, 0xa5, 0xab, 0xe9, 0x00, 0x85, 0xc4, 0x60, 0xa2, 0x22, 0x4c,
0x3b, 0x59, 0xa8, 0xba, 0xbd, 0x03, 0x01, 0xc9, 0x9d, 0xd0, 0xf2, 0xe8,
0xe8, 0x9a, 0x98, 0xf0, 0x20, 0xc9, 0x3a, 0xf0, 0x1c, 0xe9, 0xb2, 0xaa,
0xf0, 0x04, 0xca, 0xd0, 0x62, 0xca, 0x86, 0x98, 0x20, 0xbc, 0x00, 0x20,
0xa5, 0x62, 0xa5, 0xac, 0xf0, 0x02, 0xa9, 0xff, 0xba, 0x45, 0x98, 0xd0,
0x1a, 0xbd, 0x02, 0x01, 0x85, 0x87, 0xbd, 0x03, 0x01, 0x85, 0x88, 0xbd,
0x04, 0x01, 0x85, 0xc3, 0xbd, 0x05, 0x01, 0x85, 0xc4, 0x20, 0xc2, 0x00,
0x4c, 0xc3, 0x5c, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0x9a, 0x4c, 0x95, 0x5e,
0xa2, 0x04, 0x2c, 0xa2, 0x0e, 0x4c, 0x3b, 0x59, 0xd0, 0x9e, 0x68, 0x68,
0x68, 0xc9, 0x8d, 0xd0, 0xef, 0x68, 0x85, 0x87, 0x68, 0x85, 0x88, 0x68,
0x85, 0xc3, 0x68, 0x85, 0xc4, 0x20, 0xa6, 0x5e, 0x98, 0x18, 0x65, 0xc3,
0x85, 0xc3, 0x90, 0x02, 0xe6, 0xc4, 0x60, 0x4c, 0xf3, 0x63, 0xa2, 0x3a,
0x2c, 0xa2, 0x00, 0x86, 0x5b, 0xa0, 0x00, 0x84, 0x5c, 0xa5, 0x5c, 0xa6,
0x5b, 0x85, 0x5b, 0x86, 0x5c, 0xb1, 0xc3, 0xf0, 0xe5, 0xc5, 0x5c, 0xf0,
0xe1, 0xc8, 0xc9, 0x22, 0xf0, 0xeb, 0xd0, 0xf1, 0x20, 0xa5, 0x62, 0x20,
0xc2, 0x00, 0xc9, 0x89, 0xf0, 0x05, 0xa9, 0xaf, 0x20, 0xea, 0x63, 0xa5,
0xac, 0xd0, 0x05, 0x20, 0xa9, 0x5e, 0xf0, 0xb8, 0x20, 0xc2, 0x00, 0xb0,
0x03, 0x4c, 0xf4, 0x5d, 0x4c, 0x03, 0x5d, 0xc9, 0xa9, 0xd0, 0x03, 0x4c,
0xf5, 0x76, 0xc9, 0xaa, 0xd0, 0x03, 0x4c, 0xf9, 0x76, 0x20, 0x4a, 0x6c,
0x48, 0xc9, 0x8d, 0xf0, 0x04, 0xc9, 0x89, 0xd0, 0x9e, 0xc6, 0xaf, 0xd0,
0x04, 0x68, 0x4c, 0x05, 0x5d, 0x20, 0xbc, 0x00, 0x20, 0x19, 0x5f, 0xc9,
0x2c, 0xf0, 0xee, 0x68, 0x60, 0xa2, 0x00, 0x86, 0x11, 0x86, 0x12, 0xb0,
0xf7, 0xe9, 0x2f, 0x85, 0x5b, 0xa5, 0x12, 0x85, 0x71, 0xc9, 0x19, 0xb0,
0xd4, 0xa5, 0x11, 0x0a, 0x26, 0x71, 0x0a, 0x26, 0x71, 0x65, 0x11, 0x85,
0x11, 0xa5, 0x71, 0x65, 0x12, 0x85, 0x12, 0x06, 0x11, 0x26, 0x12, 0xa5,
0x11, 0x65, 0x5b, 0x85, 0x11, 0x90, 0x02, 0xe6, 0x12, 0x20, 0xbc, 0x00,
0x4c, 0x1f, 0x5f, 0xa9, 0xa7, 0x2c, 0xa9, 0xa3, 0x48, 0x20, 0x76, 0x65,
0xa6, 0x5f, 0x30, 0x1e, 0x85, 0x97, 0x84, 0x98, 0x20, 0x3e, 0x70, 0x68,
0x48, 0xa0, 0x79, 0x20, 0x7c, 0x6d, 0x20, 0x67, 0x70, 0x20, 0xc2, 0x00,
0xc9, 0x2c, 0xd0, 0x9f, 0x20, 0xbc, 0x00, 0x4c, 0x59, 0x5f, 0x4c, 0xa0,
0x62, 0x20, 0x76, 0x65, 0x85, 0x97, 0x84, 0x98, 0xa9, 0xc0, 0x20, 0xea,
0x63, 0xa5, 0x5f, 0x48, 0x20, 0xa5, 0x62, 0x68, 0x2a, 0x20, 0x97, 0x62,
0xd0, 0x03, 0x4c, 0x67, 0x70, 0xa0, 0x02, 0xb1, 0xae, 0xc5, 0x82, 0x90,
0x17, 0xd0, 0x07, 0x88, 0xb1, 0xae, 0xc5, 0x81, 0x90, 0x0e, 0xa4, 0xaf,
0xc4, 0x7c, 0x90, 0x08, 0xd0, 0x0d, 0xa5, 0xae, 0xc5, 0x7b, 0xb0, 0x07,
0xa5, 0xae, 0xa4, 0xaf, 0x4c, 0xd9, 0x5f, 0xa0, 0x00, 0xb1, 0xae, 0x20,
0x01, 0x69, 0xa5, 0x9e, 0xa4, 0x9f, 0x85, 0xb8, 0x84, 0xb9, 0x20, 0xe0,
0x6a, 0xa9, 0xac, 0xa0, 0x00, 0x85, 0x9e, 0x84, 0x9f, 0x20, 0x42, 0x6b,
0xa0, 0x00, 0xb1, 0x9e, 0x91, 0x97, 0xc8, 0xb1, 0x9e, 0x91, 0x97, 0xc8,
0xb1, 0x9e, 0x91, 0x97, 0x60, 0x20, 0x76, 0x65, 0x85, 0x97, 0x84, 0x98,
0x20, 0xbc, 0x76, 0xa6, 0x5f, 0x30, 0x07, 0xa8, 0x20, 0x32, 0x68, 0x4c,
0x67, 0x70, 0x48, 0xa9, 0x01, 0xb0, 0x01, 0x68, 0x20, 0x09, 0x69, 0xf0,
0x05, 0x68, 0xa0, 0x00, 0x91, 0xad, 0x20, 0x54, 0x69, 0x4c, 0x9d, 0x5f,
0x20, 0x9f, 0x60, 0x20, 0xc2, 0x00, 0xf0, 0x3d, 0xf0, 0xca, 0xc9, 0xab,
0xf0, 0x51, 0xc9, 0xae, 0xf0, 0x4d, 0xc9, 0x2c, 0xf0, 0x33, 0xc9, 0x3b,
0xf0, 0x60, 0x20, 0xa5, 0x62, 0x24, 0x5f, 0x30, 0xdf, 0x20, 0x55, 0x72,
0x20, 0x13, 0x69, 0xa0, 0x00, 0xa5, 0x0f, 0xf0, 0x0a, 0x38, 0xe5, 0x0e,
0xf1, 0xae, 0xb0, 0x03, 0x20, 0x61, 0x60, 0x20, 0x9f, 0x60, 0xf0, 0xc7,
0xa9, 0x00, 0x9d, 0x80, 0x02, 0xa2, 0x7f, 0xa0, 0x02, 0xa9, 0x0d, 0xd0,
0x51, 0xa5, 0x0e, 0xc5, 0x10, 0x90, 0x05, 0x20, 0x61, 0x60, 0xd0, 0x26,
0x38, 0xe5, 0x64, 0xb0, 0xfc, 0x49, 0xff, 0x69, 0x01, 0xd0, 0x14, 0x48,
0x20, 0x47, 0x6c, 0xc9, 0x29, 0xd0, 0x7b, 0x68, 0xc9, 0xab, 0xd0, 0x08,
0x8a, 0xe5, 0x0e, 0x90, 0x09, 0xf0, 0x07, 0xaa, 0x20, 0xb1, 0x60, 0xca,
0xd0, 0xfa, 0x20, 0xbc, 0x00, 0x4c, 0x24, 0x60, 0x20, 0x13, 0x69, 0x20,
0x0d, 0x6b, 0xa0, 0x00, 0xaa, 0xf0, 0x4a, 0xb1, 0x71, 0x20, 0xb6, 0x60,
0xc8, 0xca, 0xd0, 0xf7, 0x60, 0xa9, 0x20, 0x2c, 0xa9, 0x3f, 0xc9, 0x20,
0x90, 0x1a, 0x48, 0xa5, 0x0f, 0xd0, 0x0b, 0x38, 0xa5, 0x0e, 0xe5, 0x64,
0xd0, 0x0b, 0x85, 0x0e, 0xf0, 0x07, 0xc5, 0x0e, 0xd0, 0x03, 0x20, 0x61,
0x60, 0xe6, 0x0e, 0x68, 0x20, 0xb4, 0x78, 0xc9, 0x0d, 0xd0, 0x14, 0x86,
0x78, 0xa6, 0x0d, 0xf0, 0x0a, 0xa9, 0x00, 0x20, 0xb6, 0x60, 0xca, 0xd0,
0xfa, 0xa9, 0x0d, 0x86, 0x0e, 0xa6, 0x78, 0x29, 0xff, 0x60, 0xa5, 0x62,
0x10, 0x0b, 0xa5, 0x8d, 0xa4, 0x8e, 0x85, 0x87, 0x84, 0x88, 0x4c, 0xf3,
0x63, 0xa9, 0x60, 0xa0, 0x7f, 0x20, 0x9c, 0x60, 0xa5, 0x8b, 0xa4, 0x8c,
0x85, 0xc3, 0x84, 0xc4, 0x60, 0xc9, 0x22, 0xd0, 0x0b, 0x20, 0xa9, 0x63,
0xa9, 0x3b, 0x20, 0xea, 0x63, 0x20, 0x9f, 0x60, 0x20, 0x36, 0x68, 0x20,
0x45, 0x5a, 0xad, 0x80, 0x02, 0xd0, 0x09, 0x18, 0x4c, 0x35, 0x5d, 0xa6,
0x8f, 0xa4, 0x90, 0xa9, 0x98, 0x85, 0x62, 0x86, 0x91, 0x84, 0x92, 0x20,
0x76, 0x65, 0x85, 0x97, 0x84, 0x98, 0xa5, 0xc3, 0xa4, 0xc4, 0x85, 0x11,
0x84, 0x12, 0xa6, 0x91, 0xa4, 0x92, 0x86, 0xc3, 0x84, 0xc4, 0x20, 0xc2,
0x00, 0xd0, 0x0e, 0x24, 0x62, 0x30, 0x62, 0x20, 0xb4, 0x60, 0x20, 0x45,
0x5a, 0x86, 0xc3, 0x84, 0xc4, 0x20, 0xbc, 0x00, 0x24, 0x5f, 0x10, 0x24,
0x85, 0x5b, 0xc9, 0x22, 0xf0, 0x07, 0xa9, 0x3a, 0x85, 0x5b, 0xa9, 0x2c,
0x18, 0x85, 0x5c, 0xa5, 0xc3, 0xa4, 0xc4, 0x69, 0x00, 0x90, 0x01, 0xc8,
0x20, 0x19, 0x69, 0x20, 0x8d, 0x6c, 0x20, 0x9d, 0x5f, 0x4c, 0x96, 0x61,
0x20, 0x6a, 0x71, 0x20, 0x67, 0x70, 0x20, 0xc2, 0x00, 0xf0, 0x07, 0xc9,
0x2c, 0xf0, 0x03, 0x4c, 0xf2, 0x60, 0xa5, 0xc3, 0xa4, 0xc4, 0x85, 0x91,
0x84, 0x92, 0xa5, 0x11, 0xa4, 0x12, 0x85, 0xc3, 0x84, 0xc4, 0x20, 0xc2,
0x00, 0xf0, 0x2b, 0x20, 0xe8, 0x63, 0x4c, 0x3b, 0x61, 0x20, 0xa6, 0x5e,
0xc8, 0xaa, 0xd0, 0x12, 0xa2, 0x06, 0xc8, 0xb1, 0xc3, 0xf0, 0x72, 0xc8,
0xb1, 0xc3, 0x85, 0x8d, 0xc8, 0xb1, 0xc3, 0xc8, 0x85, 0x8e, 0xb1, 0xc3,
0xaa, 0x20, 0x98, 0x5e, 0xe0, 0x83, 0xf0, 0x85, 0xd0, 0xdb, 0xa5, 0x91,
0xa4, 0x92, 0xa6, 0x62, 0x10, 0x03, 0x4c, 0x57, 0x5d, 0xa0, 0x00, 0xb1,
0x91, 0xd0, 0x01, 0x60, 0xa9, 0x50, 0xa0, 0x7f, 0x4c, 0x9c, 0x60, 0xba,
0xe8, 0xe8, 0xe8, 0xe8, 0xbd, 0x01, 0x01, 0xc9, 0x81, 0xd0, 0x21, 0xa5,
0x98, 0xd0, 0x0a, 0xbd, 0x02, 0x01, 0x85, 0x97, 0xbd, 0x03, 0x01, 0x85,
0x98, 0xdd, 0x03, 0x01, 0xd0, 0x07, 0xa5, 0x97, 0xdd, 0x02, 0x01, 0xf0,
0x07, 0x8a, 0x18, 0x69, 0x10, 0xaa, 0xd0, 0xd8, 0x60, 0xd0, 0x04, 0xa0,
0x00, 0xf0, 0x03, 0x20, 0x76, 0x65, 0x85, 0x97, 0x84, 0x98, 0x20, 0xfb,
0x61, 0xf0, 0x04, 0xa2, 0x00, 0xf0, 0x63, 0x9a, 0x8a, 0x38, 0xe9, 0xf7,
0x85, 0x73, 0x69, 0xfb, 0xa0, 0x01, 0x20, 0x3e, 0x70, 0xba, 0xbd, 0x08,
0x01, 0x85, 0xb0, 0xa5, 0x97, 0xa4, 0x98, 0x20, 0x7c, 0x6d, 0x20, 0x67,
0x70, 0xa0, 0x01, 0x20, 0xdd, 0x70, 0xba, 0xdd, 0x08, 0x01, 0xf0, 0x17,
0xbd, 0x0d, 0x01, 0x85, 0x87, 0xbd, 0x0e, 0x01, 0x85, 0x88, 0xbd, 0x10,
0x01, 0x85, 0xc3, 0xbd, 0x0f, 0x01, 0x85, 0xc4, 0x4c, 0xc3, 0x5c, 0x8a,
0x69, 0x0f, 0xaa, 0x9a, 0x20, 0xc2, 0x00, 0xc9, 0x2c, 0xd0, 0xf1, 0x20,
0xbc, 0x00, 0x20, 0x2f, 0x62, 0x20, 0xa5, 0x62, 0x18, 0x24, 0x38, 0x24,
0x5f, 0x30, 0x03, 0xb0, 0x03, 0x60, 0xb0, 0xfd, 0xa2, 0x18, 0x4c, 0x3b,
0x59, 0xa6, 0xc3, 0xd0, 0x02, 0xc6, 0xc4, 0xc6, 0xc3, 0xa9, 0x00, 0x48,
0xa9, 0x02, 0x20, 0x04, 0x59, 0x20, 0x80, 0x63, 0xa9, 0x00, 0x85, 0x9b,
0x20, 0xc2, 0x00, 0x38, 0xe9, 0xbf, 0x90, 0x17, 0xc9, 0x03, 0xb0, 0x13,
0xc9, 0x01, 0x2a, 0x49, 0x01, 0x45, 0x9b, 0xc5, 0x9b, 0x90, 0x65, 0x85,
0x9b, 0x20, 0xbc, 0x00, 0x4c, 0xbf, 0x62, 0xa6, 0x9b, 0xd0, 0x2c, 0xb0,
0x77, 0x69, 0x0a, 0x90, 0x73, 0x65, 0x5f, 0xd0, 0x03, 0x4c, 0xa3, 0x6a,
0x69, 0xff, 0x85, 0x71, 0x0a, 0x65, 0x71, 0xa8, 0x68, 0xd9, 0x66, 0x7a,
0xb0, 0x63, 0x20, 0x94, 0x62, 0x48, 0x20, 0x24, 0x63, 0x68, 0xa4, 0x99,
0x10, 0x17, 0xaa, 0xf0, 0x74, 0xd0, 0x5b, 0x46, 0x5f, 0x8a, 0x2a, 0xa6,
0xc3, 0xd0, 0x02, 0xc6, 0xc4, 0xc6, 0xc3, 0xa0, 0x24, 0x85, 0x9b, 0xd0,
0xd7, 0xd9, 0x66, 0x7a, 0xb0, 0x44, 0x90, 0xd9, 0xb9, 0x68, 0x7a, 0x48,
0xb9, 0x67, 0x7a, 0x48, 0x20, 0x3b, 0x63, 0xa5, 0x9b, 0x48, 0xb9, 0x66,
0x7a, 0x4c, 0xaf, 0x62, 0x4c, 0xf3, 0x63, 0x68, 0x85, 0x71, 0xe6, 0x71,
0x68, 0x85, 0x72, 0xa5, 0xb0, 0x48, 0x20, 0x9d, 0x70, 0xa5, 0xaf, 0x48,
0xa5, 0xae, 0x48, 0xa5, 0xad, 0x48, 0xa5, 0xac, 0x48, 0x6c, 0x71, 0x00,
0xa0, 0xff, 0x68, 0xf0, 0x20, 0xc9, 0x64, 0xf0, 0x03, 0x20, 0x94, 0x62,
0x84, 0x99, 0x68, 0x4a, 0x85, 0x63, 0x68, 0x85, 0xb3, 0x68, 0x85, 0xb4,
0x68, 0x85, 0xb5, 0x68, 0x85, 0xb6, 0x68, 0x85, 0xb7, 0x45, 0xb0, 0x85,
0xb8, 0xa5, 0xac, 0x60, 0xa9, 0x00, 0x85, 0x5f, 0x20, 0xbc, 0x00, 0xb0,
0x03, 0x4c, 0x6a, 0x71, 0xc9, 0x24, 0xf0, 0xf9, 0xc9, 0x25, 0xf0, 0xf5,
0x20, 0xe8, 0x65, 0xb0, 0x66, 0xc9, 0x2e, 0xf0, 0xec, 0xc9, 0xb6, 0xf0,
0x57, 0xc9, 0xb5, 0xf0, 0xdf, 0xc9, 0x22, 0xd0, 0x0f, 0xa5, 0xc3, 0xa4,
0xc4, 0x69, 0x00, 0x90, 0x01, 0xc8, 0x20, 0x13, 0x69, 0x4c, 0x8d, 0x6c,
0xc9, 0xb0, 0xd0, 0x13, 0xa0, 0x21, 0xd0, 0x3a, 0x20, 0x70, 0x66, 0xa5,
0xaf, 0x49, 0xff, 0xa8, 0xa5, 0xae, 0x49, 0xff, 0x4c, 0x23, 0x68, 0xc9,
0xad, 0xd0, 0x03, 0x4c, 0x82, 0x68, 0xc9, 0xc2, 0x90, 0x02, 0xb0, 0x32,
0x20, 0xe5, 0x63, 0x20, 0xa5, 0x62, 0xa9, 0x29, 0x2c, 0xa9, 0x28, 0x2c,
0xa9, 0x2c, 0xa0, 0x00, 0xd1, 0xc3, 0xd0, 0x03, 0x4c, 0xbc, 0x00, 0xa2,
0x02, 0x4c, 0x3b, 0x59, 0xa0, 0x1e, 0x68, 0x68, 0x4c, 0xfe, 0x62, 0x20,
0x76, 0x65, 0x85, 0xae, 0x84, 0xaf, 0xa6, 0x5f, 0xd0, 0x03, 0x4c, 0x3e,
0x70, 0x60, 0x0a, 0x48, 0xaa, 0x20, 0xbc, 0x00, 0xe0, 0xb3, 0x90, 0x56,
0xe0, 0xb7, 0x90, 0x24, 0xe0, 0xc3, 0x90, 0x51, 0x20, 0xe5, 0x63, 0x20,
0xa5, 0x62, 0x20, 0xe8, 0x63, 0x20, 0x96, 0x62, 0x68, 0xaa, 0xa5, 0xaf,
0x48, 0xa5, 0xae, 0x48, 0x8a, 0x48, 0x20, 0x4a, 0x6c, 0x68, 0xa8, 0x8a,
0x48, 0x4c, 0x73, 0x64, 0x20, 0xe5, 0x63, 0x20, 0x91, 0x62, 0xa5, 0xac,
0xc9, 0x98, 0xb0, 0x1f, 0x20, 0x14, 0x71, 0xa2, 0x02, 0xb5, 0xad, 0x95,
0x11, 0xca, 0x10, 0xf9, 0x20, 0xc2, 0x00, 0xa2, 0x00, 0xc9, 0x29, 0xf0,
0x10, 0x20, 0x9c, 0x6c, 0x20, 0xc2, 0x00, 0xc9, 0x29, 0xf0, 0x06, 0x4c,
0xf3, 0x66, 0x20, 0xdc, 0x63, 0x68, 0xa8, 0xb9, 0x9c, 0x79, 0x85, 0xa2,
0xb9, 0x9d, 0x79, 0x85, 0xa3, 0x20, 0xa1, 0x00, 0x4c, 0x94, 0x62, 0x20,
0xaa, 0x64, 0x45, 0x5b, 0xa8, 0xa5, 0xae, 0x45, 0x5c, 0x4c, 0x23, 0x68,
0x20, 0xaa, 0x64, 0x05, 0x5b, 0xa8, 0xa5, 0xae, 0x05, 0x5c, 0x4c, 0x23,
0x68, 0x20, 0xaa, 0x64, 0x25, 0x5b, 0xa8, 0xa5, 0xae, 0x25, 0x5c, 0x4c,
0x23, 0x68, 0x20, 0x70, 0x66, 0xa5, 0xae, 0x85, 0x5c, 0xa5, 0xaf, 0x85,
0x5b, 0x20, 0x81, 0x6d, 0x20, 0x70, 0x66, 0xa5, 0xaf, 0x60, 0x20, 0x97,
0x62, 0xb0, 0x13, 0xa5, 0xb7, 0x09, 0x7f, 0x25, 0xb4, 0x85, 0xb4, 0xa9,
0xb3, 0xa0, 0x00, 0x20, 0xdb, 0x70, 0xaa, 0x4c, 0x09, 0x65, 0xa9, 0x00,
0x85, 0x5f, 0xc6, 0x9b, 0x20, 0x0d, 0x6b, 0x85, 0xac, 0x86, 0xad, 0x84,
0xae, 0xa5, 0xb5, 0xa4, 0xb6, 0x20, 0x11, 0x6b, 0x86, 0xb5, 0x84, 0xb6,
0xaa, 0x38, 0xe5, 0xac, 0xf0, 0x08, 0xa9, 0x01, 0x90, 0x04, 0xa6, 0xac,
0xa9, 0xff, 0x85, 0xb0, 0xa0, 0xff, 0xe8, 0xc8, 0xca, 0xd0, 0x07, 0xa6,
0xb0, 0x30, 0x0f, 0x18, 0x90, 0x0c, 0xb1, 0xb5, 0xd1, 0xad, 0xf0, 0xef,
0xa2, 0xff, 0xb0, 0x02, 0xa2, 0x01, 0xe8, 0x8a, 0x2a, 0x25, 0x63, 0xf0,
0x02, 0xa9, 0xff, 0x4c, 0xbe, 0x70, 0x20, 0xe8, 0x63, 0xaa, 0x20, 0x7b,
0x65, 0x20, 0xc2, 0x00, 0xd0, 0xf4, 0x60, 0x20, 0x6b, 0x65, 0xa5, 0xae,
0xa6, 0x78, 0xf0, 0x24, 0xe0, 0x10, 0xb0, 0x25, 0x06, 0xaf, 0x26, 0x00,
0xca, 0xd0, 0xf9, 0xa4, 0xaf, 0x4c, 0x23, 0x68, 0x20, 0x6b, 0x65, 0xa5,
0xae, 0xa6, 0x78, 0xf0, 0x0b, 0xe0, 0x10, 0xb0, 0x0c, 0x46, 0x00, 0x66,
0xaf, 0xca, 0xd0, 0xf9, 0xa4, 0xaf, 0x4c, 0x23, 0x68, 0xa9, 0x00, 0xa8,
0x4c, 0x23, 0x68, 0x20, 0x4d, 0x6c, 0x86, 0x78, 0x20, 0x81, 0x6d, 0x4c,
0x70, 0x66, 0xa2, 0x00, 0x20, 0xc2, 0x00, 0x86, 0x5e, 0x85, 0x93, 0x20,
0xe8, 0x65, 0xb0, 0x03, 0x4c, 0xf3, 0x63, 0xa2, 0x00, 0x86, 0x5f, 0x20,
0xbc, 0x00, 0x90, 0x05, 0x20, 0xe8, 0x65, 0x90, 0x0b, 0xaa, 0x20, 0xbc,
0x00, 0x90, 0xfb, 0x20, 0xe8, 0x65, 0xb0, 0xf6, 0xc9, 0x24, 0xd0, 0x0b,
0xa9, 0xff, 0x85, 0x5f, 0x8a, 0x09, 0x80, 0xaa, 0x20, 0xbc, 0x00, 0x86,
0x94, 0x05, 0x61, 0xc9, 0x28, 0xd0, 0x03, 0x4c, 0x82, 0x66, 0xa9, 0x00,
0x85, 0x61, 0xa5, 0x7b, 0xa6, 0x7c, 0xa0, 0x00, 0x86, 0xab, 0x85, 0xaa,
0xe4, 0x7e, 0xd0, 0x04, 0xc5, 0x7d, 0xf0, 0x2c, 0xa5, 0x93, 0xd1, 0xaa,
0xd0, 0x08, 0xa5, 0x94, 0xc8, 0xd1, 0xaa, 0xf0, 0x69, 0x88, 0x18, 0xa5,
0xaa, 0x69, 0x06, 0x90, 0xe1, 0xe8, 0xd0, 0xdc, 0xc9, 0x61, 0xb0, 0x0a,
0xc9, 0x41, 0x90, 0x05, 0xe9, 0x5b, 0x38, 0xe9, 0xa5, 0x60, 0xe9, 0x7b,
0x38, 0xe9, 0x85, 0x60, 0x68, 0x48, 0xc9, 0x01, 0xd0, 0x05, 0xa9, 0xa4,
0xa0, 0x79, 0x60, 0xa5, 0x7d, 0xa4, 0x7e, 0x85, 0xaa, 0x84, 0xab, 0xa5,
0x7f, 0xa4, 0x80, 0x85, 0xa6, 0x84, 0xa7, 0x18, 0x69, 0x06, 0x90, 0x01,
0xc8, 0x85, 0xa4, 0x84, 0xa5, 0x20, 0xc1, 0x58, 0xa5, 0xa4, 0xa4, 0xa5,
0xc8, 0x85, 0x7d, 0x84, 0x7e, 0xa0, 0x00, 0xa5, 0x93, 0x91, 0xaa, 0xc8,
0xa5, 0x94, 0x91, 0xaa, 0xa9, 0x00, 0xc8, 0x91, 0xaa, 0xc8, 0x91, 0xaa,
0xc8, 0x91, 0xaa, 0xc8, 0x91, 0xaa, 0xa5, 0xaa, 0x18, 0x69, 0x02, 0xa4,
0xab, 0x90, 0x01, 0xc8, 0x85, 0x95, 0x84, 0x96, 0x60, 0xa5, 0x5d, 0x0a,
0x69, 0x05, 0x65, 0xaa, 0xa4, 0xab, 0x90, 0x01, 0xc8, 0x85, 0xa4, 0x84,
0xa5, 0x60, 0x20, 0xbc, 0x00, 0x20, 0x91, 0x62, 0xa5, 0xb0, 0x30, 0x0d,
0xa5, 0xac, 0xc9, 0x90, 0x90, 0x09, 0xa9, 0xab, 0xa0, 0x79, 0x20, 0xdb,
0x70, 0xd0, 0x74, 0x4c, 0x14, 0x71, 0xa5, 0x5e, 0x48, 0xa5, 0x5f, 0x48,
0xa0, 0x00, 0x98, 0x48, 0xa5, 0x94, 0x48, 0xa5, 0x93, 0x48, 0x20, 0x66,
0x66, 0x68, 0x85, 0x93, 0x68, 0x85, 0x94, 0x68, 0xa8, 0xba, 0xbd, 0x02,
0x01, 0x48, 0xbd, 0x01, 0x01, 0x48, 0xa5, 0xae, 0x9d, 0x02, 0x01, 0xa5,
0xaf, 0x9d, 0x01, 0x01, 0xc8, 0x20, 0xc2, 0x00, 0xc9, 0x2c, 0xf0, 0xd2,
0x84, 0x5d, 0x20, 0xe2, 0x63, 0x68, 0x85, 0x5f, 0x68, 0x85, 0x5e, 0xa6,
0x7d, 0xa5, 0x7e, 0x86, 0xaa, 0x85, 0xab, 0xc5, 0x80, 0xd0, 0x04, 0xe4,
0x7f, 0xf0, 0x39, 0xa0, 0x00, 0xb1, 0xaa, 0xc8, 0xc5, 0x93, 0xd0, 0x06,
0xa5, 0x94, 0xd1, 0xaa, 0xf0, 0x16, 0xc8, 0xb1, 0xaa, 0x18, 0x65, 0xaa,
0xaa, 0xc8, 0xb1, 0xaa, 0x65, 0xab, 0x90, 0xd7, 0xa2, 0x10, 0x2c, 0xa2,
0x08, 0x4c, 0x3b, 0x59, 0xa2, 0x12, 0xa5, 0x5e, 0xd0, 0xf7, 0x20, 0x55,
0x66, 0xa5, 0x5d, 0xa0, 0x04, 0xd1, 0xaa, 0xd0, 0xe7, 0x4c, 0x8f, 0x67,
0x20, 0x55, 0x66, 0x20, 0x0c, 0x59, 0xa0, 0x00, 0x84, 0xbb, 0xa5, 0x93,
0x91, 0xaa, 0xc8, 0xa5, 0x94, 0x91, 0xaa, 0xa5, 0x5d, 0xa0, 0x04, 0x84,
0xba, 0x91, 0xaa, 0x18, 0xa2, 0x0b, 0xa9, 0x00, 0x24, 0x5e, 0x50, 0x07,
0x68, 0x69, 0x01, 0xaa, 0x68, 0x69, 0x00, 0xc8, 0x91, 0xaa, 0xc8, 0x8a,
0x91, 0xaa, 0x20, 0xde, 0x67, 0x86, 0xba, 0x85, 0xbb, 0xa4, 0x71, 0xc6,
0x5d, 0xd0, 0xdd, 0x65, 0xa5, 0xb0, 0x5d, 0x85, 0xa5, 0xa8, 0x8a, 0x65,
0xa4, 0x90, 0x03, 0xc8, 0xf0, 0x52, 0x20, 0x0c, 0x59, 0x85, 0x7f, 0x84,
0x80, 0xa9, 0x00, 0xe6, 0xbb, 0xa4, 0xba, 0xf0, 0x05, 0x88, 0x91, 0xa4,
0xd0, 0xfb, 0xc6, 0xa5, 0xc6, 0xbb, 0xd0, 0xf5, 0xe6, 0xa5, 0x38, 0xa0,
0x02, 0xa5, 0x7f, 0xe5, 0xaa, 0x91, 0xaa, 0xc8, 0xa5, 0x80, 0xe5, 0xab,
0x91, 0xaa, 0xa5, 0x5e, 0xd0, 0x53, 0xc8, 0xb1, 0xaa, 0x85, 0x5d, 0xa9,
0x00, 0x85, 0xba, 0x85, 0xbb, 0xc8, 0x68, 0xaa, 0x85, 0xae, 0x68, 0x85,
0xaf, 0xd1, 0xaa, 0x90, 0x0e, 0xd0, 0x06, 0xc8, 0x8a, 0xd1, 0xaa, 0x90,
0x07, 0x4c, 0xf0, 0x66, 0x4c, 0x39, 0x59, 0xc8, 0xa5, 0xbb, 0x05, 0xba,
0xf0, 0x0a, 0x20, 0xde, 0x67, 0x8a, 0x65, 0xae, 0xaa, 0x98, 0xa4, 0x71,
0x65, 0xaf, 0x86, 0xba, 0xc6, 0x5d, 0xd0, 0xcb, 0x06, 0xba, 0x2a, 0x06,
0xba, 0x2a, 0xa8, 0xa5, 0xba, 0x65, 0xa4, 0x85, 0x95, 0x98, 0x65, 0xa5,
0x85, 0x96, 0xa8, 0xa5, 0x95, 0x60, 0x84, 0x71, 0xb1, 0xaa, 0x85, 0x76,
0x88, 0xb1, 0xaa, 0x85, 0x77, 0xa9, 0x10, 0x85, 0xa8, 0xa2, 0x00, 0xa0,
0x00, 0x8a, 0x0a, 0xaa, 0x98, 0x2a, 0xa8, 0xb0, 0xb3, 0x06, 0xba, 0x26,
0xbb, 0x90, 0x0b, 0x18, 0x8a, 0x65, 0x76, 0xaa, 0x98, 0x65, 0x77, 0xa8,
0xb0, 0xa2, 0xc6, 0xa8, 0xd0, 0xe3, 0x60, 0xa5, 0x5f, 0xf0, 0x03, 0x20,
0x0d, 0x6b, 0x20, 0xae, 0x69, 0x38, 0xa5, 0x81, 0xe5, 0x7f, 0xa8, 0xa5,
0x82, 0xe5, 0x80, 0xa2, 0x00, 0x86, 0x5f, 0x85, 0xad, 0x84, 0xae, 0xa2,
0x90, 0x4c, 0xc6, 0x70, 0xa4, 0x0e, 0xa9, 0x00, 0xf0, 0xed, 0xa6, 0x88,
0xe8, 0xd0, 0xa2, 0xa2, 0x16, 0x4c, 0x3b, 0x59, 0x20, 0x6d, 0x68, 0x20,
0x36, 0x68, 0x20, 0xe5, 0x63, 0xa9, 0x80, 0x85, 0x61, 0x20, 0x76, 0x65,
0x20, 0x94, 0x62, 0x20, 0xe2, 0x63, 0xa9, 0xc0, 0x20, 0xea, 0x63, 0xa5,
0x96, 0x48, 0xa5, 0x95, 0x48, 0xa5, 0xc4, 0x48, 0xa5, 0xc3, 0x48, 0x20,
0x95, 0x5e, 0x4c, 0xdf, 0x68, 0xa9, 0xad, 0x20, 0xea, 0x63, 0x09, 0x80,
0x85, 0x61, 0x29, 0x7f, 0x20, 0x7d, 0x65, 0x85, 0x9c, 0x84, 0x9d, 0x4c,
0x94, 0x62, 0x20, 0x6d, 0x68, 0xa5, 0x9d, 0x48, 0xa5, 0x9c, 0x48, 0x20,
0xdc, 0x63, 0x20, 0x94, 0x62, 0x68, 0x85, 0x9c, 0x68, 0x85, 0x9d, 0xa2,
0x20, 0xa0, 0x03, 0xb1, 0x9c, 0xf0, 0x9e, 0x85, 0x96, 0x88, 0xb1, 0x9c,
0x85, 0x95, 0xaa, 0xc8, 0xb1, 0x95, 0x48, 0x88, 0x10, 0xfa, 0xa4, 0x96,
0x20, 0x6b, 0x70, 0xa5, 0xc4, 0x48, 0xa5, 0xc3, 0x48, 0xb1, 0x9c, 0x85,
0xc3, 0xc8, 0xb1, 0x9c, 0x85, 0xc4, 0xa5, 0x96, 0x48, 0xa5, 0x95, 0x48,
0x20, 0x91, 0x62, 0x68, 0x85, 0x9c, 0x68, 0x85, 0x9d, 0x20, 0xc2, 0x00,
0xf0, 0x03, 0x4c, 0xf3, 0x63, 0x68, 0x85, 0xc3, 0x68, 0x85, 0xc4, 0xa0,
0x00, 0x68, 0x91, 0x9c, 0xc8, 0x68, 0x91, 0x9c, 0xc8, 0x68, 0x91, 0x9c,
0xc8, 0x68, 0x91, 0x9c, 0x60, 0x20, 0x94, 0x62, 0xa0, 0x00, 0x20, 0x57,
0x72, 0x68, 0x68, 0xa9, 0xf0, 0xa0, 0x00, 0xf0, 0x12, 0xa6, 0xae, 0xa4,
0xaf, 0x86, 0x9e, 0x84, 0x9f, 0x20, 0x7c, 0x69, 0x86, 0xad, 0x84, 0xae,
0x85, 0xac, 0x60, 0xa2, 0x22, 0x86, 0x5b, 0x86, 0x5c, 0x85, 0xb8, 0x84,
0xb9, 0x85, 0xad, 0x84, 0xae, 0xa0, 0xff, 0xc8, 0xb1, 0xb8, 0xf0, 0x0c,
0xc5, 0x5b, 0xf0, 0x04, 0xc5, 0x5c, 0xd0, 0xf3, 0xc9, 0x22, 0xf0, 0x01,
0x18, 0x84, 0xac, 0x98, 0x65, 0xb8, 0x85, 0xba, 0xa6, 0xb9, 0x90, 0x01,
0xe8, 0x86, 0xbb, 0xa5, 0xb9, 0xc9, 0x03, 0xb0, 0x0b, 0x98, 0x20, 0x01,
0x69, 0xa6, 0xb8, 0xa4, 0xb9, 0x20, 0xee, 0x6a, 0xa6, 0x65, 0xe0, 0x71,
0xd0, 0x05, 0xa2, 0x1c, 0x4c, 0x3b, 0x59, 0xa5, 0xac, 0x95, 0x00, 0xa5,
0xad, 0x95, 0x01, 0xa5, 0xae, 0x95, 0x02, 0xa0, 0x00, 0x86, 0xae, 0x84,
0xaf, 0x88, 0x84, 0x5f, 0x86, 0x66, 0xe8, 0xe8, 0xe8, 0x86, 0x65, 0x60,
0x46, 0x60, 0x48, 0x49, 0xff, 0x38, 0x65, 0x81, 0xa4, 0x82, 0xb0, 0x01,
0x88, 0xc4, 0x80, 0x90, 0x11, 0xd0, 0x04, 0xc5, 0x7f, 0x90, 0x0b, 0x85,
0x81, 0x84, 0x82, 0x85, 0x83, 0x84, 0x84, 0xaa, 0x68, 0x60, 0xa2, 0x0c,
0xa5, 0x60, 0x30, 0xb8, 0x20, 0xae, 0x69, 0xa9, 0x80, 0x85, 0x60, 0x68,
0xd0, 0xd0, 0xa6, 0x85, 0xa5, 0x86, 0x86, 0x81, 0x85, 0x82, 0xa0, 0x00,
0x84, 0x9d, 0xa5, 0x7f, 0xa6, 0x80, 0x85, 0xaa, 0x86, 0xab, 0xa9, 0x68,
0x85, 0x71, 0x84, 0x72, 0xc5, 0x65, 0xf0, 0x05, 0x20, 0x32, 0x6a, 0xf0,
0xf7, 0x06, 0xa0, 0xa5, 0x7b, 0xa6, 0x7c, 0x85, 0x71, 0x86, 0x72, 0xe4,
0x7e, 0xd0, 0x04, 0xc5, 0x7d, 0xf0, 0x05, 0x20, 0x2c, 0x6a, 0xf0, 0xf3,
0x85, 0xa4, 0x86, 0xa5, 0xa9, 0x04, 0x85, 0xa0, 0xa5, 0xa4, 0xa6, 0xa5,
0xe4, 0x80, 0xd0, 0x04, 0xc5, 0x7f, 0xf0, 0x75, 0x85, 0x71, 0x86, 0x72,
0xa0, 0x02, 0xb1, 0x71, 0x65, 0xa4, 0x85, 0xa4, 0xc8, 0xb1, 0x71, 0x65,
0xa5, 0x85, 0xa5, 0xa0, 0x01, 0xb1, 0x71, 0x10, 0xdb, 0xa0, 0x04, 0xb1,
0x71, 0x0a, 0x69, 0x05, 0x20, 0x64, 0x6a, 0xe4, 0xa5, 0xd0, 0x04, 0xc5,
0xa4, 0xf0, 0xcd, 0x20, 0x32, 0x6a, 0xf0, 0xf3, 0xc8, 0xb1, 0x71, 0x10,
0x30, 0xc8, 0xb1, 0x71, 0xf0, 0x2b, 0xc8, 0xb1, 0x71, 0xaa, 0xc8, 0xb1,
0x71, 0xc5, 0x82, 0x90, 0x06, 0xd0, 0x1e, 0xe4, 0x81, 0xb0, 0x1a, 0xc5,
0xab, 0x90, 0x17, 0xd0, 0x04, 0xe4, 0xaa, 0x90, 0x11, 0x86, 0xaa, 0x85,
0xab, 0xa5, 0x71, 0xa6, 0x72, 0x85, 0x9c, 0x86, 0x9d, 0x88, 0x88, 0x84,
0xa2, 0x18, 0xa5, 0xa0, 0x65, 0x71, 0x85, 0x71, 0x90, 0x02, 0xe6, 0x72,
0xa6, 0x72, 0xa0, 0x00, 0x60, 0xc6, 0xa0, 0xa6, 0x9d, 0xf0, 0xf5, 0xa4,
0xa2, 0x18, 0xb1, 0x9c, 0x65, 0xaa, 0x85, 0xa6, 0xa5, 0xab, 0x69, 0x00,
0x85, 0xa7, 0xa5, 0x81, 0xa6, 0x82, 0x85, 0xa4, 0x86, 0xa5, 0x20, 0xc8,
0x58, 0xa4, 0xa2, 0xc8, 0xa5, 0xa4, 0x91, 0x9c, 0xaa, 0xe6, 0xa5, 0xa5,
0xa5, 0xc8, 0x91, 0x9c, 0x4c, 0xb2, 0x69, 0xa5, 0xaf, 0x48, 0xa5, 0xae,
0x48, 0x20, 0x80, 0x63, 0x20, 0x96, 0x62, 0x68, 0x85, 0xb8, 0x68, 0x85,
0xb9, 0xa0, 0x00, 0xb1, 0xb8, 0x18, 0x71, 0xae, 0x90, 0x05, 0xa2, 0x1a,
0x4c, 0x3b, 0x59, 0x20, 0x01, 0x69, 0x20, 0xe0, 0x6a, 0xa5, 0x9e, 0xa4,
0x9f, 0x20, 0x11, 0x6b, 0x20, 0xf2, 0x6a, 0xa5, 0xb8, 0xa4, 0xb9, 0x20,
0x11, 0x6b, 0x20, 0x54, 0x69, 0x4c, 0xbc, 0x62, 0xa0, 0x00, 0xb1, 0xb8,
0x48, 0xc8, 0xb1, 0xb8, 0xaa, 0xc8, 0xb1, 0xb8, 0xa8, 0x68, 0x86, 0x71,
0x84, 0x72, 0xaa, 0xf0, 0x14, 0xa0, 0x00, 0xb1, 0x71, 0x91, 0x83, 0xc8,
0xca, 0xd0, 0xf8, 0x98, 0x18, 0x65, 0x83, 0x85, 0x83, 0x90, 0x02, 0xe6,
0x84, 0x60, 0x20, 0x96, 0x62, 0xa5, 0xae, 0xa4, 0xaf, 0x85, 0x71, 0x84,
0x72, 0x20, 0x42, 0x6b, 0x08, 0xa0, 0x00, 0xb1, 0x71, 0x48, 0xc8, 0xb1,
0x71, 0xaa, 0xc8, 0xb1, 0x71, 0xa8, 0x68, 0x28, 0xd0, 0x13, 0xc4, 0x82,
0xd0, 0x0f, 0xe4, 0x81, 0xd0, 0x0b, 0x48, 0x18, 0x65, 0x81, 0x85, 0x81,
0x90, 0x02, 0xe6, 0x82, 0x68, 0x86, 0x71, 0x84, 0x72, 0x60, 0xc4, 0x67,
0xd0, 0x0c, 0xc5, 0x66, 0xd0, 0x08, 0x85, 0x65, 0xe9, 0x03, 0x85, 0x66,
0xa0, 0x00, 0x60, 0x20, 0x4d, 0x6c, 0x8a, 0x48, 0xa9, 0x01, 0x20, 0x09,
0x69, 0x68, 0xa0, 0x00, 0x91, 0xad, 0x68, 0x68, 0x4c, 0x54, 0x69, 0x20,
0xc5, 0x6b, 0xd1, 0x9e, 0x98, 0xf0, 0x08, 0x20, 0xc5, 0x6b, 0x18, 0xf1,
0x9e, 0x49, 0xff, 0x90, 0x04, 0xb1, 0x9e, 0xaa, 0x98, 0x48, 0x8a, 0x48,
0x20, 0x09, 0x69, 0xa5, 0x9e, 0xa4, 0x9f, 0x20, 0x11, 0x6b, 0x68, 0xa8,
0x68, 0x18, 0x65, 0x71, 0x85, 0x71, 0x90, 0x02, 0xe6, 0x72, 0x98, 0x20,
0xf2, 0x6a, 0x4c, 0x54, 0x69, 0xa9, 0xff, 0x85, 0xaf, 0x20, 0xc2, 0x00,
0xc9, 0x29, 0xf0, 0x06, 0x20, 0xe8, 0x63, 0x20, 0x4a, 0x6c, 0x20, 0xc5,
0x6b, 0xca, 0x8a, 0x48, 0x18, 0xa2, 0x00, 0xf1, 0x9e, 0xb0, 0xc3, 0x49,
0xff, 0xc5, 0xaf, 0x90, 0xbe, 0xa5, 0xaf, 0xb0, 0xba, 0x20, 0xe2, 0x63,
0x68, 0x85, 0xa2, 0x68, 0x85, 0xa3, 0x68, 0x68, 0x68, 0xaa, 0x68, 0x85,
0x9e, 0x68, 0x85, 0x9f, 0xa0, 0x00, 0x8a, 0xf0, 0x67, 0xe6, 0xa2, 0x6c,
0xa2, 0x00, 0x20, 0x0a, 0x6b, 0x85, 0xac, 0x86, 0xad, 0x84, 0xae, 0xa8,
0xf0, 0x2c, 0x88, 0xb1, 0x71, 0x20, 0xec, 0x65, 0x90, 0x04, 0x09, 0x20,
0x91, 0x71, 0x98, 0xd0, 0xf1, 0xf0, 0x1b, 0x20, 0x0a, 0x6b, 0x85, 0xac,
0x86, 0xad, 0x84, 0xae, 0xa8, 0xf0, 0x0f, 0x88, 0xb1, 0x71, 0x20, 0xe8,
0x65, 0x90, 0x04, 0x29, 0xdf, 0x91, 0x71, 0x98, 0xd0, 0xf1, 0x68, 0x68,
0x4c, 0x54, 0x69, 0x20, 0x0a, 0x6b, 0x98, 0xa4, 0x71, 0x4c, 0x23, 0x68,
0x20, 0x2e, 0x6c, 0x4c, 0x32, 0x68, 0x20, 0x0a, 0x6b, 0xa2, 0x00, 0x86,
0x5f, 0xa8, 0x60, 0x20, 0x2e, 0x6c, 0xf0, 0x08, 0xa0, 0x00, 0xb1, 0x71,
0xa8, 0x4c, 0x32, 0x68, 0x4c, 0xf3, 0x66, 0x20, 0xbc, 0x00, 0x20, 0x91,
0x62, 0x20, 0x6c, 0x66, 0xa4, 0xae, 0xd0, 0xf0, 0xa6, 0xaf, 0x4c, 0xc2,
0x00, 0x20, 0x2e, 0x6c, 0xd0, 0x03, 0x4c, 0x0e, 0x6e, 0xa6, 0xc3, 0xa4,
0xc4, 0x86, 0xba, 0x84, 0xbb, 0xa6, 0x71, 0x86, 0xc3, 0x18, 0x65, 0x71,
0x85, 0x73, 0xa5, 0x72, 0x85, 0xc4, 0x69, 0x00, 0x85, 0x74, 0xa0, 0x00,
0xb1, 0x73, 0x48, 0x98, 0x91, 0x73, 0x20, 0xc2, 0x00, 0x20, 0x6a, 0x71,
0x68, 0xa0, 0x00, 0x91, 0x73, 0xa6, 0xba, 0xa4, 0xbb, 0x86, 0xc3, 0x84,
0xc4, 0x60, 0x20, 0x91, 0x62, 0x20, 0xaf, 0x6c, 0x20, 0xe8, 0x63, 0xa5,
0x12, 0x48, 0xa5, 0x11, 0x48, 0x20, 0x4a, 0x6c, 0x68, 0x85, 0x11, 0x68,
0x85, 0x12, 0x60, 0xa5, 0xac, 0xc9, 0x98, 0xb0, 0x8f, 0x20, 0x14, 0x71,
0xa5, 0xae, 0xa4, 0xaf, 0x84, 0x11, 0x85, 0x12, 0x60, 0x20, 0xaf, 0x6c,
0xa2, 0x00, 0xa1, 0x11, 0xa8, 0x4c, 0x32, 0x68, 0x20, 0x96, 0x6c, 0x8a,
0xa2, 0x00, 0x81, 0x11, 0x60, 0x20, 0xaf, 0x6c, 0xa2, 0x00, 0xa1, 0x11,
0xa8, 0xe6, 0x11, 0xd0, 0x02, 0xe6, 0x12, 0xa1, 0x11, 0x4c, 0x23, 0x68,
0x20, 0x91, 0x62, 0x20, 0xaf, 0x6c, 0x84, 0x97, 0x85, 0x98, 0x20, 0xe8,
0x63, 0x20, 0x91, 0x62, 0x20, 0xaf, 0x6c, 0x98, 0xa2, 0x00, 0x81, 0x97,
0xe6, 0x97, 0xd0, 0x02, 0xe6, 0x98, 0xa5, 0x12, 0x81, 0x97, 0x4c, 0xc2,
0x00, 0x20, 0x76, 0x65, 0x85, 0x97, 0x84, 0x98, 0xa5, 0x5f, 0x48, 0x20,
0xe8, 0x63, 0x20, 0x76, 0x65, 0x68, 0xc5, 0x5f, 0xd0, 0x10, 0xa0, 0x03,
0xb1, 0x97, 0x48, 0xb1, 0x95, 0x91, 0x97, 0x68, 0x91, 0x95, 0x88, 0x10,
0xf3, 0x60, 0x4c, 0xa0, 0x62, 0x20, 0x91, 0x62, 0x20, 0xaf, 0x6c, 0xa9,
0x6d, 0x48, 0xa9, 0x43, 0x48, 0x6c, 0x11, 0x00, 0x4c, 0xc2, 0x00, 0x20,
0x96, 0x6c, 0x86, 0x97, 0xa2, 0x00, 0x20, 0xc2, 0x00, 0xf0, 0x03, 0x20,
0x9c, 0x6c, 0x86, 0x98, 0xb1, 0x11, 0x45, 0x98, 0x25, 0x97, 0xf0, 0xf8,
0x60, 0x20, 0x49, 0x6f, 0xa5, 0xb0, 0x49, 0xff, 0x85, 0xb0, 0x45, 0xb7,
0x85, 0xb8, 0xa5, 0xac, 0x4c, 0x7f, 0x6d, 0x20, 0x98, 0x6e, 0x90, 0x4d,
0xa9, 0xac, 0xa0, 0x79, 0x20, 0x49, 0x6f, 0xd0, 0x10, 0xa5, 0xb7, 0x85,
0xb0, 0xa2, 0x04, 0xb5, 0xb2, 0x95, 0xab, 0xca, 0xd0, 0xf9, 0x86, 0xb9,
0x60, 0xa6, 0xb9, 0x86, 0xa3, 0xa2, 0xb3, 0xa5, 0xb3, 0xa8, 0xf0, 0xc4,
0x38, 0xe5, 0xac, 0xf0, 0x24, 0x90, 0x12, 0x84, 0xac, 0xa4, 0xb7, 0x84,
0xb0, 0x49, 0xff, 0x69, 0x00, 0xa0, 0x00, 0x84, 0xa3, 0xa2, 0xac, 0xd0,
0x04, 0xa0, 0x00, 0x84, 0xb9, 0xc9, 0xf9, 0x30, 0xb6, 0xa8, 0xa5, 0xb9,
0x56, 0x01, 0x20, 0xaf, 0x6e, 0x24, 0xb8, 0x10, 0x4c, 0xa0, 0xac, 0xe0,
0xb3, 0xf0, 0x02, 0xa0, 0xb3, 0x38, 0x49, 0xff, 0x65, 0xa3, 0x85, 0xb9,
0xb9, 0x03, 0x00, 0xf5, 0x03, 0x85, 0xaf, 0xb9, 0x02, 0x00, 0xf5, 0x02,
0x85, 0xae, 0xb9, 0x01, 0x00, 0xf5, 0x01, 0x85, 0xad, 0xb0, 0x03, 0x20,
0x54, 0x6e, 0xa0, 0x00, 0x98, 0x18, 0xa6, 0xad, 0xd0, 0x3e, 0xa6, 0xae,
0x86, 0xad, 0xa6, 0xaf, 0x86, 0xae, 0xa6, 0xb9, 0x86, 0xaf, 0x84, 0xb9,
0x69, 0x08, 0xc9, 0x18, 0xd0, 0xe8, 0xa9, 0x00, 0x85, 0xac, 0x85, 0xb0,
0x60, 0x65, 0xa3, 0x85, 0xb9, 0xa5, 0xaf, 0x65, 0xb6, 0x85, 0xaf, 0xa5,
0xae, 0x65, 0xb5, 0x85, 0xae, 0xa5, 0xad, 0x65, 0xb4, 0x85, 0xad, 0xb0,
0x1a, 0x60, 0x69, 0x01, 0x06, 0xb9, 0x26, 0xaf, 0x26, 0xae, 0x26, 0xad,
0x10, 0xf4, 0x38, 0xe5, 0xac, 0xb0, 0xcf, 0x49, 0xff, 0x69, 0x01, 0x85,
0xac, 0x90, 0x0c, 0xe6, 0xac, 0xf0, 0x36, 0x66, 0xad, 0x66, 0xae, 0x66,
0xaf, 0x66, 0xb9, 0x60, 0xa5, 0xb0, 0x49, 0xff, 0x85, 0xb0, 0xa5, 0xad,
0x49, 0xff, 0x85, 0xad, 0xa5, 0xae, 0x49, 0xff, 0x85, 0xae, 0xa5, 0xaf,
0x49, 0xff, 0x85, 0xaf, 0xa5, 0xb9, 0x49, 0xff, 0x85, 0xb9, 0xe6, 0xb9,
0xd0, 0x0a, 0xe6, 0xaf, 0xd0, 0x06, 0xe6, 0xae, 0xd0, 0x02, 0xe6, 0xad,
0x60, 0xa2, 0x0a, 0x4c, 0x3b, 0x59, 0xa2, 0x74, 0xb4, 0x03, 0x84, 0xb9,
0xb4, 0x02, 0x94, 0x03, 0xb4, 0x01, 0x94, 0x02, 0xa4, 0xb2, 0x94, 0x01,
0x69, 0x08, 0x30, 0xec, 0xf0, 0xea, 0xe9, 0x08, 0xa8, 0xa5, 0xb9, 0xb0,
0x12, 0x16, 0x01, 0x90, 0x02, 0xf6, 0x01, 0x76, 0x01, 0x76, 0x01, 0x76,
0x02, 0x76, 0x03, 0x6a, 0xc8, 0xd0, 0xee, 0x18, 0x60, 0x20, 0xad, 0x70,
0xf0, 0x02, 0x10, 0x03, 0x4c, 0xf3, 0x66, 0xa5, 0xac, 0xe9, 0x7f, 0x48,
0xa9, 0x80, 0x85, 0xac, 0xa9, 0x2c, 0xa0, 0x79, 0x20, 0x7c, 0x6d, 0xa9,
0x30, 0xa0, 0x79, 0x20, 0xbf, 0x6f, 0xa9, 0xa3, 0xa0, 0x79, 0x20, 0x61,
0x6d, 0xa9, 0x1f, 0xa0, 0x79, 0x20, 0x11, 0x74, 0xa9, 0x34, 0xa0, 0x79,
0x20, 0x7c, 0x6d, 0x68, 0x20, 0x08, 0x72, 0xa9, 0x38, 0xa0, 0x79, 0x20,
0x49, 0x6f, 0xf0, 0x4c, 0x20, 0x6f, 0x6f, 0xa9, 0x00, 0x85, 0x75, 0x85,
0x76, 0x85, 0x77, 0xa5, 0xb9, 0x20, 0x1e, 0x6f, 0xa5, 0xaf, 0x20, 0x1e,
0x6f, 0xa5, 0xae, 0x20, 0x1e, 0x6f, 0xa5, 0xad, 0x20, 0x23, 0x6f, 0x4c,
0x2f, 0x70, 0xd0, 0x03, 0x4c, 0x86, 0x6e, 0x4a, 0x09, 0x80, 0xa8, 0x90,
0x13, 0x18, 0xa5, 0x77, 0x65, 0xb6, 0x85, 0x77, 0xa5, 0x76, 0x65, 0xb5,
0x85, 0x76, 0xa5, 0x75, 0x65, 0xb4, 0x85, 0x75, 0x66, 0x75, 0x66, 0x76,
0x66, 0x77, 0x66, 0xb9, 0x98, 0x4a, 0xd0, 0xde, 0x60, 0x85, 0x71, 0x84,
0x72, 0xa0, 0x03, 0xb1, 0x71, 0x85, 0xb6, 0x88, 0xb1, 0x71, 0x85, 0xb5,
0x88, 0xb1, 0x71, 0x85, 0xb7, 0x45, 0xb0, 0x85, 0xb8, 0xa5, 0xb7, 0x09,
0x80, 0x85, 0xb4, 0x88, 0xb1, 0x71, 0x85, 0xb3, 0xa5, 0xac, 0x60, 0xa5,
0xb3, 0xf0, 0x1d, 0x18, 0x65, 0xac, 0x90, 0x04, 0x30, 0x31, 0x18, 0x2c,
0x10, 0x12, 0x69, 0x80, 0x85, 0xac, 0xd0, 0x03, 0x4c, 0x12, 0x6e, 0xa5,
0xb8, 0x85, 0xb0, 0x60, 0xa5, 0xb0, 0x10, 0x1b, 0x68, 0x68, 0x4c, 0x0e,
0x6e, 0x20, 0x8e, 0x70, 0xaa, 0xf0, 0xf0, 0x18, 0x69, 0x02, 0xb0, 0x0b,
0xa2, 0x00, 0x86, 0xb8, 0x20, 0x99, 0x6d, 0xe6, 0xac, 0xd0, 0xe0, 0x4c,
0x81, 0x6e, 0x20, 0x8e, 0x70, 0xa9, 0xb4, 0xa0, 0x79, 0xa2, 0x00, 0x86,
0xb8, 0x20, 0x3e, 0x70, 0x4c, 0xc2, 0x6f, 0x20, 0x49, 0x6f, 0xf0, 0x66,
0x20, 0x9d, 0x70, 0xa9, 0x00, 0x38, 0xe5, 0xac, 0x85, 0xac, 0x20, 0x6f,
0x6f, 0xe6, 0xac, 0xf0, 0xd6, 0xa2, 0xfd, 0xa9, 0x01, 0xa4, 0xb4, 0xc4,
0xad, 0xd0, 0x0a, 0xa4, 0xb5, 0xc4, 0xae, 0xd0, 0x04, 0xa4, 0xb6, 0xc4,
0xaf, 0x08, 0x2a, 0x90, 0x0a, 0xe8, 0xf0, 0x2a, 0x10, 0x2c, 0xa0, 0x01,
0x95, 0x77, 0x98, 0x28, 0x90, 0x14, 0xa8, 0xa5, 0xb6, 0xe5, 0xaf, 0x85,
0xb6, 0xa5, 0xb5, 0xe5, 0xae, 0x85, 0xb5, 0xa5, 0xb4, 0xe5, 0xad, 0x85,
0xb4, 0x98, 0x06, 0xb6, 0x26, 0xb5, 0x26, 0xb4, 0xb0, 0xd3, 0x30, 0xc1,
0x10, 0xcf, 0xa0, 0x40, 0xd0, 0xd6, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
0x85, 0xb9, 0x28, 0x4c, 0x2f, 0x70, 0xa2, 0x14, 0x4c, 0x3b, 0x59, 0xa5,
0x75, 0x85, 0xad, 0xa5, 0x76, 0x85, 0xae, 0xa5, 0x77, 0x85, 0xaf, 0x4c,
0xf2, 0x6d, 0x85, 0x71, 0x84, 0x72, 0xa0, 0x03, 0xb1, 0x71, 0x85, 0xaf,
0x88, 0xb1, 0x71, 0x85, 0xae, 0x88, 0xb1, 0x71, 0x85, 0xb0, 0x09, 0x80,
0x85, 0xad, 0x88, 0xb1, 0x71, 0x85, 0xac, 0x84, 0xb9, 0x60, 0xa2, 0xa8,
0x2c, 0xa2, 0xa4, 0xa0, 0x00, 0xf0, 0x04, 0xa6, 0x97, 0xa4, 0x98, 0x20,
0x9d, 0x70, 0x86, 0x71, 0x84, 0x72, 0xa0, 0x03, 0xa5, 0xaf, 0x91, 0x71,
0x88, 0xa5, 0xae, 0x91, 0x71, 0x88, 0xa5, 0xb0, 0x09, 0x7f, 0x25, 0xad,
0x91, 0x71, 0x88, 0xa5, 0xac, 0x91, 0x71, 0x84, 0xb9, 0x60, 0x20, 0x9d,
0x70, 0xa2, 0x05, 0xb5, 0xab, 0x95, 0xb2, 0xca, 0xd0, 0xf9, 0x86, 0xb9,
0x60, 0xa5, 0xac, 0xf0, 0xfb, 0x06, 0xb9, 0x90, 0xf7, 0x20, 0x76, 0x6e,
0xd0, 0xf2, 0x4c, 0x47, 0x6e, 0xa5, 0xac, 0xf0, 0x09, 0xa5, 0xb0, 0x2a,
0xa9, 0xff, 0xb0, 0x02, 0xa9, 0x01, 0x60, 0x20, 0xad, 0x70, 0x85, 0xad,
0xa9, 0x00, 0x85, 0xae, 0xa2, 0x88, 0xa5, 0xad, 0x49, 0xff, 0x2a, 0xa9,
0x00, 0x85, 0xaf, 0x86, 0xac, 0x85, 0xb9, 0x85, 0xb0, 0x4c, 0xed, 0x6d,
0x46, 0xb0, 0x60, 0x85, 0x73, 0x84, 0x74, 0xa0, 0x00, 0xb1, 0x73, 0xc8,
0xaa, 0xf0, 0xc6, 0xb1, 0x73, 0x45, 0xb0, 0x30, 0xc4, 0xe4, 0xac, 0xd0,
0x1a, 0xb1, 0x73, 0x09, 0x80, 0xc5, 0xad, 0xd0, 0x12, 0xc8, 0xb1, 0x73,
0xc5, 0xae, 0xd0, 0x0b, 0xc8, 0xa9, 0x7f, 0xc5, 0xb9, 0xb1, 0x73, 0xe5,
0xaf, 0xf0, 0x28, 0xa5, 0xb0, 0x90, 0x02, 0x49, 0xff, 0x4c, 0xb3, 0x70,
0xa5, 0xac, 0xf0, 0x4a, 0x38, 0xe9, 0x98, 0x24, 0xb0, 0x10, 0x09, 0xaa,
0xa9, 0xff, 0x85, 0xb2, 0x20, 0x5a, 0x6e, 0x8a, 0xa2, 0xac, 0xc9, 0xf9,
0x10, 0x06, 0x20, 0x98, 0x6e, 0x84, 0xb2, 0x60, 0xa8, 0xa5, 0xb0, 0x29,
0x80, 0x46, 0xad, 0x05, 0xad, 0x85, 0xad, 0x20, 0xaf, 0x6e, 0x84, 0xb2,
0x60, 0xa5, 0xac, 0xc9, 0x98, 0xb0, 0x1e, 0x20, 0x14, 0x71, 0x84, 0xb9,
0xa5, 0xb0, 0x84, 0xb0, 0x49, 0x80, 0x2a, 0xa9, 0x98, 0x85, 0xac, 0xa5,
0xaf, 0x85, 0x5b, 0x4c, 0xed, 0x6d, 0x85, 0xad, 0x85, 0xae, 0x85, 0xaf,
0xa8, 0x60, 0xa0, 0x00, 0xa2, 0x09, 0x94, 0xa8, 0xca, 0x10, 0xfb, 0x90,
0x7f, 0xc9, 0x2d, 0xd0, 0x04, 0x86, 0xb1, 0xf0, 0x04, 0xc9, 0x2b, 0xd0,
0x05, 0x20, 0xbc, 0x00, 0x90, 0x6e, 0xc9, 0x24, 0xd0, 0x03, 0x4c, 0x2a,
0x76, 0xc9, 0x25, 0xd0, 0x08, 0x4c, 0x58, 0x76, 0x20, 0xbc, 0x00, 0x90,
0x5b, 0xc9, 0x2e, 0xf0, 0x2e, 0xc9, 0x45, 0xd0, 0x30, 0x20, 0xbc, 0x00,
0x90, 0x17, 0xc9, 0xb6, 0xf0, 0x0e, 0xc9, 0x2d, 0xf0, 0x0a, 0xc9, 0xb5,
0xf0, 0x08, 0xc9, 0x2b, 0xf0, 0x04, 0xd0, 0x07, 0x66, 0xab, 0x20, 0xbc,
0x00, 0x90, 0x5c, 0x24, 0xab, 0x10, 0x0e, 0xa9, 0x00, 0x38, 0xe5, 0xa9,
0x4c, 0xd3, 0x71, 0x66, 0xaa, 0x24, 0xaa, 0x50, 0xc3, 0xa5, 0xa9, 0x38,
0xe5, 0xa8, 0x85, 0xa9, 0xf0, 0x12, 0x10, 0x09, 0x20, 0xae, 0x6f, 0xe6,
0xa9, 0xd0, 0xf9, 0xf0, 0x07, 0x20, 0x95, 0x6f, 0xc6, 0xa9, 0xd0, 0xf9,
0xa5, 0xb1, 0x30, 0x01, 0x60, 0x4c, 0xb4, 0x73, 0x48, 0x24, 0xaa, 0x10,
0x02, 0xe6, 0xa8, 0x20, 0x95, 0x6f, 0x68, 0x38, 0xe9, 0x30, 0x20, 0x08,
0x72, 0x4c, 0x94, 0x71, 0x48, 0x20, 0x8e, 0x70, 0x68, 0x20, 0xbe, 0x70,
0xa5, 0xb7, 0x45, 0xb0, 0x85, 0xb8, 0xa6, 0xac, 0x4c, 0x7f, 0x6d, 0xa5,
0xa9, 0xc9, 0x0a, 0x90, 0x09, 0xa9, 0x64, 0x24, 0xab, 0x30, 0x0e, 0x4c,
0x81, 0x6e, 0x0a, 0x0a, 0x65, 0xa9, 0x0a, 0xa0, 0x00, 0x71, 0xc3, 0xe9,
0x2f, 0x85, 0xa9, 0x4c, 0xba, 0x71, 0xa9, 0x3f, 0xa0, 0x7f, 0x20, 0x52,
0x72, 0xa5, 0x88, 0xa6, 0x87, 0x85, 0xad, 0x86, 0xae, 0xa2, 0x90, 0x38,
0x20, 0xcb, 0x70, 0x20, 0x55, 0x72, 0x4c, 0x9c, 0x60, 0xa0, 0x01, 0xa9,
0x20, 0x24, 0xb0, 0x10, 0x02, 0xa9, 0x2d, 0x99, 0xef, 0x00, 0x85, 0xb0,
0x84, 0xba, 0xc8, 0xa6, 0xac, 0xd0, 0x05, 0xa9, 0x30, 0x4c, 0x6e, 0x73,
0xa9, 0x00, 0xe0, 0x81, 0xb0, 0x09, 0xa9, 0x44, 0xa0, 0x79, 0x20, 0xf7,
0x6e, 0xa9, 0xfa, 0x85, 0xa8, 0xa9, 0x40, 0xa0, 0x79, 0x20, 0xdb, 0x70,
0xf0, 0x1e, 0x10, 0x12, 0xa9, 0x3c, 0xa0, 0x79, 0x20, 0xdb, 0x70, 0xf0,
0x02, 0x10, 0x0e, 0x20, 0x95, 0x6f, 0xc6, 0xa8, 0xd0, 0xee, 0x20, 0xae,
0x6f, 0xe6, 0xa8, 0xd0, 0xdc, 0x20, 0x78, 0x6d, 0x20, 0x14, 0x71, 0xa2,
0x01, 0xa5, 0xa8, 0x18, 0x69, 0x07, 0x30, 0x09, 0xc9, 0x08, 0xb0, 0x06,
0x69, 0xff, 0xaa, 0xa9, 0x02, 0x38, 0xe9, 0x02, 0x85, 0xa9, 0x86, 0xa8,
0x8a, 0xf0, 0x02, 0x10, 0x13, 0xa4, 0xba, 0xa9, 0x2e, 0xc8, 0x99, 0xef,
0x00, 0x8a, 0xf0, 0x06, 0xa9, 0x30, 0xc8, 0x99, 0xef, 0x00, 0x84, 0xba,
0xa0, 0x00, 0xa2, 0x80, 0xa5, 0xaf, 0x18, 0x79, 0xba, 0x79, 0x85, 0xaf,
0xa5, 0xae, 0x79, 0xb9, 0x79, 0x85, 0xae, 0xa5, 0xad, 0x79, 0xb8, 0x79,
0x85, 0xad, 0xe8, 0xb0, 0x04, 0x10, 0xe5, 0x30, 0x02, 0x30, 0xe1, 0x8a,
0x90, 0x04, 0x49, 0xff, 0x69, 0x0a, 0x69, 0x2f, 0xc8, 0xc8, 0xc8, 0x84,
0x95, 0xa4, 0xba, 0xc8, 0xaa, 0x29, 0x7f, 0x99, 0xef, 0x00, 0xc6, 0xa8,
0xd0, 0x06, 0xa9, 0x2e, 0xc8, 0x99, 0xef, 0x00, 0x84, 0xba, 0xa4, 0x95,
0x8a, 0x49, 0xff, 0x29, 0x80, 0xaa, 0xc0, 0x12, 0xd0, 0xb2, 0xa4, 0xba,
0xb9, 0xef, 0x00, 0x88, 0xc9, 0x30, 0xf0, 0xf8, 0xc9, 0x2e, 0xf0, 0x01,
0xc8, 0xa9, 0x2b, 0xa6, 0xa9, 0xf0, 0x2e, 0x10, 0x08, 0xa9, 0x00, 0x38,
0xe5, 0xa9, 0xaa, 0xa9, 0x2d, 0x99, 0xf1, 0x00, 0xa9, 0x45, 0x99, 0xf0,
0x00, 0x8a, 0xa2, 0x2f, 0x38, 0xe8, 0xe9, 0x0a, 0xb0, 0xfb, 0x69, 0x3a,
0x99, 0xf3, 0x00, 0x8a, 0x99, 0xf2, 0x00, 0xa9, 0x00, 0x99, 0xf4, 0x00,
0xf0, 0x08, 0x99, 0xef, 0x00, 0xa9, 0x00, 0x99, 0xf0, 0x00, 0xa9, 0xf0,
0xa0, 0x00, 0x60, 0xf0, 0x42, 0xa5, 0xb3, 0xd0, 0x03, 0x4c, 0x10, 0x6e,
0xa2, 0x9c, 0xa0, 0x00, 0x20, 0x6b, 0x70, 0xa5, 0xb7, 0x10, 0x0f, 0x20,
0x45, 0x71, 0xa9, 0x9c, 0xa0, 0x00, 0x20, 0xdb, 0x70, 0xd0, 0x03, 0x98,
0xa4, 0x5b, 0x20, 0x83, 0x6d, 0x98, 0x48, 0x20, 0xb9, 0x6e, 0xa9, 0x9c,
0xa0, 0x00, 0x20, 0xf7, 0x6e, 0x20, 0xbf, 0x73, 0x68, 0x4a, 0x90, 0x0a,
0xa5, 0xac, 0xf0, 0x06, 0xa5, 0xb0, 0x49, 0xff, 0x85, 0xb0, 0x60, 0xa9,
0x48, 0xa0, 0x79, 0x20, 0xf7, 0x6e, 0xa5, 0xb9, 0x69, 0x50, 0x90, 0x03,
0x20, 0xa5, 0x70, 0x85, 0xa3, 0x20, 0x91, 0x70, 0xa5, 0xac, 0xc9, 0x88,
0x90, 0x03, 0x20, 0x8c, 0x6f, 0x20, 0x45, 0x71, 0xa5, 0x5b, 0x18, 0x69,
0x81, 0xf0, 0xf3, 0x38, 0xe9, 0x01, 0x48, 0xa2, 0x04, 0xb5, 0xb3, 0xb4,
0xac, 0x95, 0xac, 0x94, 0xb3, 0xca, 0x10, 0xf5, 0xa5, 0xa3, 0x85, 0xb9,
0x20, 0x64, 0x6d, 0x20, 0xb4, 0x73, 0xa9, 0x4c, 0xa0, 0x79, 0x20, 0x27,
0x74, 0xa9, 0x00, 0x85, 0xb8, 0x68, 0x4c, 0x71, 0x6f, 0x85, 0xba, 0x84,
0xbb, 0x20, 0x61, 0x70, 0xa9, 0xa4, 0x20, 0xf7, 0x6e, 0x20, 0x2b, 0x74,
0xa9, 0xa4, 0xa0, 0x00, 0x4c, 0xf7, 0x6e, 0x85, 0xba, 0x84, 0xbb, 0x20,
0x5e, 0x70, 0xb1, 0xba, 0x85, 0xb1, 0xa4, 0xba, 0xc8, 0x98, 0xd0, 0x02,
0xe6, 0xbb, 0x85, 0xba, 0xa4, 0xbb, 0x20, 0xf7, 0x6e, 0xa5, 0xba, 0xa4,
0xbb, 0x18, 0x69, 0x04, 0x90, 0x01, 0xc8, 0x85, 0xba, 0x84, 0xbb, 0x20,
0x7c, 0x6d, 0xa9, 0xa8, 0xa0, 0x00, 0xc6, 0xb1, 0xd0, 0xe4, 0x60, 0xa5,
0xac, 0xf0, 0x07, 0xa2, 0xd4, 0xa0, 0x00, 0x20, 0x6b, 0x70, 0xa2, 0x00,
0xa5, 0xd4, 0x6a, 0x6a, 0x90, 0x01, 0xe8, 0x29, 0x08, 0xf0, 0x01, 0xe8,
0x8a, 0x4a, 0x66, 0xd5, 0x66, 0xd7, 0x66, 0xd6, 0x66, 0xd4, 0xa2, 0x02,
0xb5, 0xd5, 0x95, 0xad, 0xca, 0x10, 0xf9, 0xa9, 0x80, 0x85, 0xac, 0x0a,
0x85, 0xb0, 0x4c, 0xf2, 0x6d, 0xa9, 0x69, 0xa0, 0x79, 0x20, 0x7c, 0x6d,
0x20, 0x8e, 0x70, 0xa9, 0x7e, 0xa0, 0x79, 0xa6, 0xb7, 0x20, 0xb7, 0x6f,
0x20, 0x8e, 0x70, 0x20, 0x45, 0x71, 0xa9, 0x00, 0x85, 0xb8, 0x20, 0x64,
0x6d, 0xa9, 0xb0, 0xa0, 0x79, 0x20, 0x61, 0x6d, 0xa5, 0xb0, 0x48, 0x10,
0x0d, 0x20, 0x78, 0x6d, 0xa5, 0xb0, 0x30, 0x09, 0xa5, 0x63, 0x49, 0xff,
0x85, 0x63, 0x20, 0xb4, 0x73, 0xa9, 0xb0, 0xa0, 0x79, 0x20, 0x7c, 0x6d,
0x68, 0x10, 0x03, 0x20, 0xb4, 0x73, 0xa9, 0x6d, 0xa0, 0x79, 0x4c, 0x11,
0x74, 0x20, 0x61, 0x70, 0xa9, 0x00, 0x85, 0x63, 0x20, 0x98, 0x74, 0xa2,
0x9c, 0xa0, 0x00, 0x20, 0x6b, 0x70, 0xa9, 0xa4, 0xa0, 0x00, 0x20, 0x3e,
0x70, 0xa9, 0x00, 0x85, 0xb0, 0xa5, 0x63, 0x20, 0x09, 0x75, 0xa9, 0x9c,
0xa0, 0x00, 0x4c, 0xbf, 0x6f, 0x48, 0x4c, 0xca, 0x74, 0xa5, 0xb0, 0x48,
0x10, 0x03, 0x20, 0xb4, 0x73, 0xa5, 0xac, 0x48, 0xc9, 0x81, 0x90, 0x07,
0xa9, 0xa3, 0xa0, 0x79, 0x20, 0xbf, 0x6f, 0xa9, 0x82, 0xa0, 0x79, 0x20,
0x11, 0x74, 0x68, 0xc9, 0x81, 0x90, 0x07, 0xa9, 0x69, 0xa0, 0x79, 0x20,
0x61, 0x6d, 0x68, 0x10, 0x16, 0x4c, 0xb4, 0x73, 0x20, 0x96, 0x6c, 0xe0,
0x08, 0xb0, 0x20, 0xa9, 0x00, 0x38, 0x2a, 0xca, 0x10, 0xfc, 0xe8, 0x01,
0x11, 0x81, 0x11, 0x60, 0x20, 0x96, 0x6c, 0xe0, 0x08, 0xb0, 0x0c, 0xa9,
0xff, 0x2a, 0xca, 0x10, 0xfc, 0xe8, 0x21, 0x11, 0x81, 0x11, 0x60, 0x4c,
0xf3, 0x66, 0x20, 0xe5, 0x63, 0x20, 0x96, 0x6c, 0xe0, 0x08, 0xb0, 0xf3,
0x20, 0xc2, 0x00, 0xc9, 0x29, 0xf0, 0x03, 0x4c, 0xf3, 0x63, 0x20, 0xbc,
0x00, 0xa9, 0x00, 0x38, 0x2a, 0xca, 0x10, 0xfc, 0xe8, 0x21, 0x11, 0xf0,
0x02, 0xa9, 0xff, 0x4c, 0xbe, 0x70, 0xe0, 0x19, 0xb0, 0x4a, 0x86, 0x78,
0xa9, 0x18, 0x20, 0x09, 0x69, 0xa0, 0x17, 0xa2, 0x18, 0x46, 0x11, 0x66,
0x12, 0x66, 0x13, 0x8a, 0x2a, 0x91, 0xad, 0x88, 0x10, 0xf3, 0xa5, 0x78,
0xf0, 0x0a, 0xaa, 0x38, 0x49, 0xff, 0x69, 0x18, 0xf0, 0x1c, 0xd0, 0x0f,
0xa8, 0xb1, 0xad, 0xc9, 0x30, 0xd0, 0x07, 0xca, 0xf0, 0x03, 0xc8, 0x10,
0xf4, 0xe8, 0x98, 0x18, 0x65, 0xad, 0x85, 0xad, 0xa9, 0x00, 0x65, 0xae,
0x85, 0xae, 0x68, 0x68, 0x86, 0xac, 0x20, 0xbc, 0x00, 0x4c, 0x54, 0x69,
0x4c, 0xf3, 0x66, 0xe0, 0x07, 0xb0, 0xf9, 0x86, 0x78, 0xa9, 0x06, 0x20,
0x09, 0x69, 0xa0, 0x05, 0xf8, 0xa5, 0x13, 0x20, 0x0d, 0x76, 0xa5, 0x12,
0x20, 0x0d, 0x76, 0xa5, 0x11, 0x20, 0x0d, 0x76, 0xd8, 0xa2, 0x06, 0xa5,
0x78, 0xf0, 0xb5, 0xaa, 0x38, 0x49, 0xff, 0x69, 0x06, 0xf0, 0xc7, 0xd0,
0xba, 0xaa, 0x29, 0x0f, 0x20, 0x18, 0x76, 0x8a, 0x4a, 0x4a, 0x4a, 0x4a,
0xc9, 0x0a, 0x69, 0x30, 0x91, 0xad, 0x88, 0x60, 0x85, 0xac, 0xa9, 0x00,
0x85, 0xb8, 0x8a, 0x20, 0x08, 0x72, 0x20, 0xbc, 0x00, 0x90, 0x0a, 0x09,
0x20, 0xe9, 0x61, 0xc9, 0x06, 0xb0, 0x2a, 0x69, 0x0a, 0x29, 0x0f, 0xaa,
0xa5, 0xac, 0xf0, 0xe4, 0x69, 0x04, 0x90, 0xdc, 0x4c, 0x81, 0x6e, 0xaa,
0xa5, 0xac, 0xf0, 0x06, 0xe6, 0xac, 0xf0, 0xf4, 0xa9, 0x00, 0x85, 0xb8,
0x8a, 0x20, 0x08, 0x72, 0x20, 0xbc, 0x00, 0x49, 0x30, 0xc9, 0x02, 0x90,
0xe6, 0x4c, 0xec, 0x71, 0xad, 0xc8, 0x02, 0xd0, 0x18, 0x20, 0xb1, 0x78,
0x90, 0x0b, 0x8d, 0xc9, 0x02, 0xa2, 0x20, 0x8e, 0xca, 0x02, 0x4c, 0x20,
0x5d, 0xae, 0xca, 0x02, 0xf0, 0x03, 0xce, 0xca, 0x02, 0xa2, 0xd8, 0x20,
0x8c, 0x76, 0xa2, 0xdb, 0x20, 0x8c, 0x76, 0x60, 0xb5, 0x00, 0x10, 0xfb,
0x0a, 0x29, 0x40, 0xf0, 0xf6, 0x95, 0x00, 0x8a, 0xa8, 0x68, 0x68, 0xa9,
0x05, 0x20, 0x04, 0x59, 0xa5, 0xc4, 0x48, 0xa5, 0xc3, 0x48, 0xa5, 0x88,
0x48, 0xa5, 0x87, 0x48, 0xa9, 0x8d, 0x48, 0xb9, 0x01, 0x00, 0x85, 0xc3,
0xb9, 0x02, 0x00, 0x85, 0xc4, 0x4c, 0xc3, 0x5c, 0x20, 0xb1, 0x78, 0xb0,
0x09, 0xad, 0xca, 0x02, 0xf0, 0x09, 0xad, 0xc9, 0x02, 0x38, 0xa2, 0x00,
0x8e, 0xca, 0x02, 0x60, 0xa2, 0xdb, 0x2c, 0xa2, 0xd8, 0xc9, 0x93, 0xf0,
0x12, 0xc9, 0xb4, 0xf0, 0x08, 0x38, 0xe9, 0xa2, 0xf0, 0x0e, 0x4c, 0xf3,
0x63, 0xa9, 0x7f, 0x35, 0x00, 0x10, 0x05, 0xb5, 0x00, 0x0a, 0x15, 0x00,
0x95, 0x00, 0x4c, 0xbc, 0x00, 0x58, 0xa2, 0xdb, 0x2c, 0xa2, 0xd8, 0x86,
0x78, 0x20, 0xbc, 0x00, 0x20, 0x19, 0x5f, 0xa5, 0x79, 0xa6, 0x7a, 0x20,
0x2d, 0x5b, 0xb0, 0x03, 0x4c, 0x7b, 0x5e, 0xa6, 0x78, 0xa5, 0xaa, 0xe9,
0x01, 0x95, 0x01, 0xa5, 0xab, 0xe9, 0x00, 0x95, 0x02, 0xa9, 0xc0, 0x95,
0x00, 0x60, 0xd0, 0xfd, 0xa5, 0xdb, 0x0a, 0x05, 0xdb, 0x85, 0xdb, 0x4c,
0x82, 0x5e, 0xd0, 0xf1, 0xa5, 0xd8, 0x0a, 0x05, 0xd8, 0x85, 0xd8, 0x4c,
0x82, 0x5e, 0x20, 0xe5, 0x63, 0x20, 0x91, 0x62, 0x20, 0x74, 0x77, 0x10,
0xfb, 0xa5, 0xb4, 0x09, 0x80, 0x85, 0xb4, 0x20, 0x81, 0x6d, 0xf0, 0xf0,
0x20, 0xe5, 0x63, 0x20, 0x91, 0x62, 0x20, 0x74, 0x77, 0x30, 0xfb, 0xf0,
0xf9, 0xa5, 0xb4, 0x09, 0x80, 0x85, 0xb4, 0x20, 0x81, 0x6d, 0xf0, 0xee,
0xc9, 0x29, 0xd0, 0x05, 0x68, 0x68, 0x4c, 0xbc, 0x00, 0x4c, 0xf3, 0x63,
0x20, 0xc2, 0x00, 0xc9, 0x2c, 0xd0, 0xed, 0x20, 0x9d, 0x70, 0xa5, 0xb0,
0x09, 0x7f, 0x25, 0xad, 0x48, 0xa5, 0xae, 0x48, 0xa5, 0xaf, 0x48, 0xa5,
0xac, 0x48, 0x20, 0xbc, 0x00, 0x20, 0x91, 0x62, 0x68, 0x85, 0xb3, 0x68,
0x85, 0xb6, 0x68, 0x85, 0xb5, 0x68, 0x85, 0xb4, 0x85, 0xb7, 0xa9, 0xb3,
0xa0, 0x00, 0x4c, 0xdb, 0x70, 0xc9, 0x2c, 0xf0, 0x1b, 0x20, 0x4a, 0x6c,
0x8a, 0xf0, 0x0a, 0xe0, 0x10, 0x90, 0x45, 0xe4, 0x64, 0xb0, 0x02, 0x86,
0x64, 0x86, 0x0f, 0x20, 0xc2, 0x00, 0xf0, 0x1a, 0xc9, 0x2c, 0xd0, 0xa9,
0x20, 0x47, 0x6c, 0x8a, 0x30, 0x2e, 0xe0, 0x01, 0x90, 0x2a, 0xa5, 0x0f,
0xf0, 0x06, 0xe4, 0x0f, 0xf0, 0x02, 0xb0, 0x20, 0x86, 0x64, 0xa5, 0x0f,
0xf0, 0x06, 0xc5, 0x64, 0xb0, 0x03, 0x85, 0x64, 0x38, 0xe5, 0x64, 0xb0,
0xfc, 0x65, 0x64, 0x18, 0x65, 0x64, 0x85, 0x10, 0xa5, 0x0f, 0x38, 0xe5,
0x10, 0x85, 0x10, 0x60, 0x4c, 0xf3, 0x66, 0xa5, 0xb0, 0x30, 0xf9, 0xa5,
0xac, 0xf0, 0xf4, 0x20, 0x8e, 0x70, 0xa9, 0x00, 0x85, 0x77, 0x85, 0x76,
0x85, 0x75, 0x85, 0x78, 0x85, 0xaf, 0x85, 0xae, 0x85, 0xad, 0xa2, 0x18,
0xa5, 0xb3, 0x4a, 0xb0, 0x0e, 0x06, 0xb6, 0x26, 0xb5, 0x26, 0xb4, 0x26,
0x77, 0x26, 0x76, 0x26, 0x75, 0x26, 0x78, 0x06, 0xb6, 0x26, 0xb5, 0x26,
0xb4, 0x26, 0x77, 0x26, 0x76, 0x26, 0x75, 0x26, 0x78, 0x06, 0xaf, 0x26,
0xae, 0x26, 0xad, 0xa5, 0xaf, 0x2a, 0x85, 0x5b, 0xa5, 0xae, 0x2a, 0x85,
0x5c, 0xa5, 0xad, 0x2a, 0x85, 0x5d, 0xa9, 0x00, 0x2a, 0x85, 0x5e, 0xa5,
0x77, 0xe5, 0x5b, 0x85, 0x5b, 0xa5, 0x76, 0xe5, 0x5c, 0x85, 0x5c, 0xa5,
0x75, 0xe5, 0x5d, 0xa8, 0xa5, 0x78, 0xe5, 0x5e, 0x90, 0x0e, 0x85, 0x78,
0x84, 0x75, 0xa5, 0x5c, 0x85, 0x76, 0xa5, 0x5b, 0x85, 0x77, 0xe6, 0xaf,
0xca, 0xd0, 0xa2, 0x38, 0xa5, 0xb3, 0xe9, 0x80, 0x6a, 0x69, 0x00, 0x85,
0xac, 0x4c, 0xf2, 0x6d, 0x20, 0xe5, 0x63, 0x20, 0x76, 0x65, 0x20, 0xe2,
0x63, 0xa4, 0x95, 0xa5, 0x96, 0x4c, 0x23, 0x68, 0x46, 0x5f, 0xa9, 0x7e,
0xa0, 0x79, 0x20, 0x3e, 0x70, 0xc6, 0xac, 0x60, 0x46, 0x5f, 0xa9, 0x7e,
0xa0, 0x79, 0x4c, 0x3e, 0x70, 0x6c, 0xcd, 0x02, 0x6c, 0xcf, 0x02, 0x6c,
0xd1, 0x02, 0x6c, 0xd3, 0x02, 0x00, 0x00, 0x00, 0x64, 0x76, 0x72, 0x7f,
0xef, 0xff, 0xe6, 0xc3, 0xd0, 0x02, 0xe6, 0xc4, 0xad, 0xff, 0xff, 0xc9,
0x3a, 0xb0, 0x0a, 0xc9, 0x20, 0xf0, 0xef, 0x38, 0xe9, 0x30, 0x38, 0xe9,
0xd0, 0x60, 0x4c, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x4c, 0xf3, 0x66, 0x00, 0x00, 0x00, 0xf2, 0x00, 0x03, 0x0d, 0x4d, 0x65,
0x6d, 0x6f, 0x72, 0x79, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x00, 0x20,
0x42, 0x79, 0x74, 0x65, 0x73, 0x20, 0x66, 0x72, 0x65, 0x65, 0x0d, 0x45,
0x6e, 0x68, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x20, 0x42, 0x41, 0x53, 0x49,
0x43, 0x20, 0x31, 0x2e, 0x31, 0x30, 0x00, 0x02, 0x80, 0x19, 0x56, 0x62,
0x80, 0x76, 0x22, 0xf3, 0x82, 0x38, 0xaa, 0x40, 0x80, 0x35, 0x04, 0xf3,
0x81, 0x35, 0x04, 0xf3, 0x80, 0x80, 0x00, 0x00, 0x80, 0x31, 0x72, 0x18,
0x91, 0x43, 0x4f, 0xf8, 0x94, 0x74, 0x23, 0xf7, 0x94, 0x74, 0x24, 0x00,
0x81, 0x38, 0xaa, 0x3b, 0x06, 0x74, 0x63, 0x90, 0x8c, 0x77, 0x23, 0x0c,
0xab, 0x7a, 0x1e, 0x94, 0x00, 0x7c, 0x63, 0x42, 0x80, 0x7e, 0x75, 0xfe,
0xd0, 0x80, 0x31, 0x72, 0x15, 0x81, 0x00, 0x00, 0x00, 0x81, 0x49, 0x0f,
0xdb, 0x04, 0x86, 0x1e, 0xd7, 0xfb, 0x87, 0x99, 0x26, 0x65, 0x87, 0x23,
0x34, 0x58, 0x86, 0xa5, 0x5d, 0xe1, 0x83, 0x49, 0x0f, 0xdb, 0x08, 0x78,
0x3a, 0xc5, 0x37, 0x7b, 0x83, 0xa2, 0x5c, 0x7c, 0x2e, 0xdd, 0x4d, 0x7d,
0x99, 0xb0, 0x1e, 0x7d, 0x59, 0xed, 0x24, 0x7e, 0x91, 0x72, 0x00, 0x7e,
0x4c, 0xb9, 0x73, 0x7f, 0xaa, 0xaa, 0x53, 0x81, 0x00, 0x00, 0x00, 0x81,
0x80, 0x00, 0x00, 0x90, 0x80, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00,
0x84, 0x20, 0x00, 0x00, 0xfe, 0x79, 0x60, 0x00, 0x27, 0x10, 0xff, 0xfc,
0x18, 0x00, 0x00, 0x64, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x01, 0x23, 0x5d,
0x5e, 0x5c, 0x28, 0x62, 0x94, 0x5e, 0x10, 0x61, 0x28, 0x65, 0x2e, 0x61,
0x80, 0x5f, 0x52, 0x5f, 0xf3, 0x5d, 0xb2, 0x5d, 0xc7, 0x5e, 0x4a, 0x5d,
0xd6, 0x5d, 0x21, 0x77, 0x2d, 0x77, 0x7f, 0x5e, 0xda, 0x5e, 0x21, 0x5d,
0xea, 0x5e, 0x88, 0x5d, 0x55, 0x5f, 0x46, 0x6d, 0xb6, 0x78, 0xb9, 0x78,
0x3f, 0x68, 0xcb, 0x6c, 0xe7, 0x6c, 0x34, 0x6d, 0xbc, 0x5d, 0x25, 0x5e,
0x21, 0x60, 0x8e, 0x5d, 0xa9, 0x5b, 0xa6, 0x5b, 0x54, 0x5b, 0xa8, 0x77,
0xf0, 0x5f, 0x0c, 0x6d, 0x3b, 0x75, 0x4f, 0x75, 0xcf, 0x76, 0xd2, 0x76,
0xbb, 0x70, 0x45, 0x71, 0xd8, 0x70, 0x0a, 0x00, 0x0f, 0x68, 0x30, 0x68,
0xff, 0x77, 0x5b, 0x74, 0xb9, 0x6e, 0xbf, 0x73, 0x91, 0x74, 0x98, 0x74,
0xe1, 0x74, 0x0d, 0x75, 0xc1, 0x6c, 0xd5, 0x6c, 0x1f, 0x6c, 0x28, 0x6c,
0xf1, 0x68, 0x59, 0x6c, 0x37, 0x6c, 0xff, 0x6b, 0xe2, 0x6b, 0x53, 0x6b,
0xdf, 0x75, 0x8e, 0x75, 0x66, 0x75, 0x3a, 0x77, 0x50, 0x77, 0x9c, 0x78,
0xa8, 0x78, 0x8c, 0x78, 0x67, 0x6b, 0x6f, 0x6b, 0x9d, 0x6b, 0x79, 0x7e,
0x6d, 0x79, 0x63, 0x6d, 0x7b, 0xf9, 0x6e, 0x7b, 0xc1, 0x6f, 0x7f, 0x7a,
0x73, 0x50, 0x9c, 0x64, 0x46, 0x82, 0x64, 0x46, 0x8f, 0x64, 0x56, 0x4b,
0x65, 0x56, 0x32, 0x65, 0x7d, 0xb3, 0x73, 0x5a, 0xbf, 0x63, 0x64, 0xbd,
0x64, 0x2a, 0x2b, 0x2d, 0x2f, 0x3c, 0x3d, 0x3e, 0x3f, 0x41, 0x42, 0x43,
0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x52,
0x53, 0x54, 0x55, 0x56, 0x57, 0x5e, 0x00, 0xe5, 0x7a, 0xe7, 0x7a, 0xe9,
0x7a, 0xeb, 0x7a, 0xed, 0x7a, 0xf1, 0x7a, 0xf3, 0x7a, 0xf7, 0x7a, 0xf9,
0x7a, 0x06, 0x7b, 0x1d, 0x7b, 0x32, 0x7b, 0x4a, 0x7b, 0x54, 0x7b, 0x5d,
0x7b, 0x6a, 0x7b, 0x6f, 0x7b, 0x80, 0x7b, 0xa1, 0x7b, 0xac, 0x7b, 0xbe,
0x7b, 0xc6, 0x7b, 0xd9, 0x7b, 0x06, 0x7c, 0x2c, 0x7c, 0x3f, 0x7c, 0x4e,
0x7c, 0x58, 0x7c, 0x67, 0x7c, 0xb7, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0xb8,
0x00, 0x3c, 0xbe, 0xc1, 0x00, 0xc0, 0x00, 0x3e, 0xbd, 0xbf, 0x00, 0x9f,
0x00, 0x42, 0x53, 0xc4, 0x4e, 0x44, 0xba, 0x53, 0x43, 0xd6, 0x54, 0x4e,
0xcf, 0x00, 0x49, 0x4e, 0x24, 0xdb, 0x49, 0x54, 0x43, 0x4c, 0x52, 0xa8,
0x49, 0x54, 0x53, 0x45, 0x54, 0xa7, 0x49, 0x54, 0x54, 0x53, 0x54, 0xdc,
0x00, 0x41, 0x4c, 0x4c, 0x9c, 0x48, 0x52, 0x24, 0xd9, 0x4c, 0x45, 0x41,
0x52, 0xa2, 0x4f, 0x4e, 0x54, 0xa0, 0x4f, 0x53, 0xcc, 0x00, 0x41, 0x54,
0x41, 0x83, 0x45, 0x43, 0x88, 0x45, 0x45, 0x4b, 0xd1, 0x45, 0x46, 0x99,
0x49, 0x4d, 0x85, 0x4f, 0x4b, 0x45, 0x9b, 0x4f, 0x9d, 0x00, 0x4e, 0x44,
0x80, 0x4f, 0x52, 0xbb, 0x58, 0x50, 0xcb, 0x00, 0x4e, 0xad, 0x4f, 0x52,
0x81, 0x52, 0x45, 0xc6, 0x00, 0x45, 0x54, 0xa5, 0x4f, 0x53, 0x55, 0x42,
0x8d, 0x4f, 0x54, 0x4f, 0x89, 0x00, 0x45, 0x58, 0x24, 0xda, 0x00, 0x46,
0x8b, 0x4e, 0x43, 0x95, 0x4e, 0x50, 0x55, 0x54, 0x84, 0x4e, 0x54, 0xc3,
0x52, 0x51, 0xa9, 0x00, 0x43, 0x41, 0x53, 0x45, 0x24, 0xd8, 0x45, 0x46,
0x54, 0x24, 0xe2, 0x45, 0x4e, 0xd3, 0x45, 0x54, 0x87, 0x49, 0x53, 0x54,
0xa1, 0x4f, 0x41, 0x44, 0x97, 0x4f, 0x47, 0xca, 0x4f, 0x4f, 0x50, 0x9e,
0x00, 0x41, 0x58, 0xdd, 0x49, 0x44, 0x24, 0xe4, 0x49, 0x4e, 0xde, 0x00,
0x45, 0x57, 0xa3, 0x45, 0x58, 0x54, 0x82, 0x4d, 0x49, 0xaa, 0x4f, 0x54,
0xb0, 0x55, 0x4c, 0x4c, 0x94, 0x00, 0x46, 0x46, 0xb4, 0x4e, 0x93, 0x52,
0xbc, 0x00, 0x45, 0x45, 0x4b, 0xd0, 0x49, 0xdf, 0x4f, 0x4b, 0x45, 0x9a,
0x4f, 0x53, 0xc7, 0x52, 0x49, 0x4e, 0x54, 0x9f, 0x00, 0x45, 0x41, 0x44,
0x86, 0x45, 0x4d, 0x91, 0x45, 0x53, 0x54, 0x4f, 0x52, 0x45, 0x8c, 0x45,
0x54, 0x49, 0x52, 0x51, 0x8e, 0x45, 0x54, 0x4e, 0x4d, 0x49, 0x8f, 0x45,
0x54, 0x55, 0x52, 0x4e, 0x90, 0x49, 0x47, 0x48, 0x54, 0x24, 0xe3, 0x4e,
0x44, 0xc9, 0x55, 0x4e, 0x8a, 0x00, 0x41, 0x44, 0x44, 0xd2, 0x41, 0x56,
0x45, 0x98, 0x47, 0x4e, 0xc2, 0x49, 0x4e, 0xcd, 0x50, 0x43, 0x28, 0xae,
0x51, 0x52, 0xc8, 0x54, 0x45, 0x50, 0xb1, 0x54, 0x4f, 0x50, 0x92, 0x54,
0x52, 0x24, 0xd4, 0x57, 0x41, 0x50, 0xa6, 0x00, 0x41, 0x42, 0x28, 0xab,
0x41, 0x4e, 0xce, 0x48, 0x45, 0x4e, 0xaf, 0x4f, 0xac, 0x57, 0x4f, 0x50,
0x49, 0xe0, 0x00, 0x43, 0x41, 0x53, 0x45, 0x24, 0xd7, 0x4e, 0x54, 0x49,
0x4c, 0xb2, 0x53, 0x52, 0xc5, 0x00, 0x41, 0x4c, 0xd5, 0x41, 0x52, 0x50,
0x54, 0x52, 0xe1, 0x00, 0x41, 0x49, 0x54, 0x96, 0x48, 0x49, 0x4c, 0x45,
0xb3, 0x49, 0x44, 0x54, 0x48, 0xa4, 0x00, 0xb9, 0x00, 0x03, 0x45, 0x4a,
0x7b, 0x03, 0x46, 0x56, 0x7b, 0x04, 0x4e, 0xaf, 0x7b, 0x04, 0x44, 0x32,
0x7b, 0x05, 0x49, 0x74, 0x7b, 0x03, 0x44, 0x40, 0x7b, 0x04, 0x52, 0xd9,
0x7b, 0x03, 0x4c, 0x8e, 0x7b, 0x03, 0x44, 0x36, 0x7b, 0x04, 0x47, 0x65,
0x7b, 0x03, 0x52, 0x02, 0x7c, 0x02, 0x49, 0x6f, 0x7b, 0x07, 0x52, 0xe0,
0x7b, 0x05, 0x47, 0x60, 0x7b, 0x06, 0x52, 0xe7, 0x7b, 0x06, 0x52, 0xed,
0x7b, 0x06, 0x52, 0xf3, 0x7b, 0x03, 0x52, 0xdd, 0x7b, 0x04, 0x53, 0x1f,
0x7c, 0x02, 0x4f, 0xc1, 0x7b, 0x04, 0x4e, 0xb9, 0x7b, 0x03, 0x49, 0x71,
0x7b, 0x04, 0x57, 0x58, 0x7c, 0x04, 0x4c, 0x95, 0x7b, 0x04, 0x53, 0x0a,
0x7c, 0x03, 0x44, 0x3d, 0x7b, 0x04, 0x50, 0xcc, 0x7b, 0x04, 0x44, 0x43,
0x7b, 0x04, 0x43, 0x1d, 0x7b, 0x02, 0x44, 0x47, 0x7b, 0x04, 0x4c, 0x9c,
0x7b, 0x05, 0x50, 0xd3, 0x7b, 0x04, 0x43, 0x2a, 0x7b, 0x04, 0x4c, 0x91,
0x7b, 0x05, 0x43, 0x25, 0x7b, 0x03, 0x4e, 0xac, 0x7b, 0x05, 0x57, 0x61,
0x7c, 0x03, 0x47, 0x5d, 0x7b, 0x04, 0x53, 0x27, 0x7c, 0x06, 0x42, 0x10,
0x7b, 0x06, 0x42, 0x0a, 0x7b, 0x03, 0x49, 0x7c, 0x7b, 0x03, 0x4e, 0xb3,
0x7b, 0x04, 0x54, 0x2c, 0x7c, 0x02, 0x54, 0x37, 0x7c, 0x02, 0x46, 0x54,
0x7b, 0x04, 0x53, 0x14, 0x7c, 0x04, 0x54, 0x33, 0x7c, 0x03, 0x4e, 0xb6,
0x7b, 0x04, 0x53, 0x1b, 0x7c, 0x05, 0x55, 0x45, 0x7c, 0x05, 0x57, 0x5c,
0x7c, 0x03, 0x4f, 0xbe, 0x7b, 0x01, 0x2b, 0x00, 0x00, 0x01, 0x2d, 0x00,
0x00, 0x01, 0x2a, 0x00, 0x00, 0x01, 0x2f, 0x00, 0x00, 0x01, 0x5e, 0x00,
0x00, 0x03, 0x41, 0xfc, 0x7a, 0x03, 0x45, 0x4d, 0x7b, 0x02, 0x4f, 0xc3,
0x7b, 0x02, 0x3e, 0xf3, 0x7a, 0x02, 0x3c, 0xed, 0x7a, 0x01, 0x3e, 0x00,
0x00, 0x01, 0x3d, 0x00, 0x00, 0x01, 0x3c, 0x00, 0x00, 0x03, 0x53, 0x0e,
0x7c, 0x03, 0x49, 0x79, 0x7b, 0x03, 0x41, 0xf9, 0x7a, 0x03, 0x55, 0x4a,
0x7c, 0x03, 0x46, 0x59, 0x7b, 0x03, 0x50, 0xd0, 0x7b, 0x03, 0x53, 0x18,
0x7c, 0x03, 0x52, 0xff, 0x7b, 0x03, 0x4c, 0x99, 0x7b, 0x03, 0x45, 0x50,
0x7b, 0x03, 0x43, 0x2e, 0x7b, 0x03, 0x53, 0x11, 0x7c, 0x03, 0x54, 0x30,
0x7c, 0x03, 0x41, 0x02, 0x7b, 0x04, 0x50, 0xc6, 0x7b, 0x04, 0x44, 0x39,
0x7b, 0x04, 0x53, 0x06, 0x7c, 0x03, 0x4c, 0x8b, 0x7b, 0x04, 0x53, 0x23,
0x7c, 0x03, 0x56, 0x4e, 0x7c, 0x03, 0x41, 0xff, 0x7a, 0x06, 0x55, 0x3f,
0x7c, 0x06, 0x4c, 0x80, 0x7b, 0x04, 0x43, 0x21, 0x7b, 0x04, 0x48, 0x6a,
0x7b, 0x04, 0x42, 0x06, 0x7b, 0x06, 0x42, 0x16, 0x7b, 0x03, 0x4d, 0xa1,
0x7b, 0x03, 0x4d, 0xa8, 0x7b, 0x02, 0x50, 0xca, 0x7b, 0x05, 0x54, 0x39,
0x7c, 0x06, 0x56, 0x51, 0x7c, 0x05, 0x4c, 0x86, 0x7b, 0x06, 0x52, 0xf9,
0x7b, 0x04, 0x4d, 0xa4, 0x7b, 0x21, 0x7e, 0x32, 0x7e, 0x39, 0x7e, 0x4e,
0x7e, 0x5a, 0x7e, 0x68, 0x7e, 0x71, 0x7e, 0x7f, 0x7e, 0x93, 0x7e, 0xa0,
0x7e, 0xb1, 0x7e, 0xc0, 0x7e, 0xcf, 0x7e, 0xdd, 0x7e, 0xed, 0x7e, 0x00,
0x7f, 0x0e, 0x7f, 0x21, 0x7f, 0x4e, 0x45, 0x58, 0x54, 0x20, 0x77, 0x69,
0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x46, 0x4f, 0x52, 0x00, 0x53, 0x79,
0x6e, 0x74, 0x61, 0x78, 0x00, 0x52, 0x45, 0x54, 0x55, 0x52, 0x4e, 0x20,
0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x47, 0x4f, 0x53, 0x55,
0x42, 0x00, 0x4f, 0x75, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x44, 0x41, 0x54,
0x41, 0x00, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63,
0x61, 0x6c, 0x6c, 0x00, 0x4f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77,
0x00, 0x4f, 0x75, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x65, 0x6d, 0x6f,
0x72, 0x79, 0x00, 0x55, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64,
0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x41,
0x72, 0x72, 0x61, 0x79, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x00,
0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x64, 0x69, 0x6d, 0x65, 0x6e,
0x73, 0x69, 0x6f, 0x6e, 0x00, 0x44, 0x69, 0x76, 0x69, 0x64, 0x65, 0x20,
0x62, 0x79, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x00, 0x49, 0x6c, 0x6c, 0x65,
0x67, 0x61, 0x6c, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x00, 0x54,
0x79, 0x70, 0x65, 0x20, 0x6d, 0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, 0x68,
0x00, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x6f, 0x20,
0x6c, 0x6f, 0x6e, 0x67, 0x00, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20,
0x74, 0x6f, 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x00,
0x43, 0x61, 0x6e, 0x27, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e,
0x75, 0x65, 0x55, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20,
0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x4c, 0x4f, 0x4f,
0x50, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x44, 0x4f,
0x00, 0x0d, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x00, 0x20, 0x45, 0x72, 0x72,
0x6f, 0x72, 0x00, 0x20, 0x69, 0x6e, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x00,
0x0d, 0x52, 0x65, 0x61, 0x64, 0x79, 0x0d, 0x00, 0x20, 0x45, 0x78, 0x74,
0x72, 0x61, 0x20, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x0d, 0x00,
0x20, 0x52, 0x65, 0x64, 0x6f, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x73,
0x74, 0x61, 0x72, 0x74, 0x0d, 0x00, 0xad, 0x11, 0xd0, 0x10, 0x07, 0xad,
0x10, 0xd0, 0x29, 0x7f, 0x38, 0x60, 0xa9, 0x00, 0x18, 0x60, 0x46, 0x4c,
0x4f, 0x41, 0x54, 0x49, 0x4e, 0x47, 0x20, 0x50, 0x4f, 0x49, 0x4e, 0x54,
0x20, 0x42, 0x41, 0x53, 0x49, 0x43, 0x20, 0x46, 0x4f, 0x52, 0x20, 0x54,
0x48, 0x45, 0x20, 0x52, 0x45, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x20, 0x49,
0x20, 0x62, 0x79, 0x20, 0x4c, 0x61, 0x72, 0x72, 0x79, 0x20, 0x4e, 0x65,
0x6c, 0x73, 0x6f, 0x6e, 0x2e, 0x20, 0x44, 0x65, 0x72, 0x69, 0x76, 0x65,
0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x45, 0x68, 0x42, 0x41, 0x53,
0x49, 0x43, 0x2e,
] as const;
start() {
return 0x58;
}
end() {
return 0x60;
}
read(page: byte, off: byte) {
return this.rom[((page - 0xe0) << 8) | off];
}
write() {}
getState() {
return {};
}
setState() {}
}

File diff suppressed because it is too large Load Diff

706
js/roms/krusader.ts Normal file
View File

@ -0,0 +1,706 @@
import { byte } from 'js/types';
export default class Krusader {
rom = [
0x4c, 0xb0, 0xe2, 0xad, 0x11, 0xd0, 0x10, 0xfb, 0xad, 0x10, 0xd0, 0x60,
0x8a, 0x29, 0x20, 0xf0, 0x23, 0xa9, 0xa0, 0x85, 0xe4, 0x4c, 0xc9, 0xe3,
0xa9, 0x20, 0xc5, 0x24, 0xb0, 0x0c, 0xa9, 0x8d, 0xa0, 0x07, 0x20, 0xc9,
0xe3, 0xa9, 0xa0, 0x88, 0xd0, 0xf8, 0xa0, 0x00, 0xb1, 0xe2, 0xe6, 0xe2,
0xd0, 0x02, 0xe6, 0xe3, 0x60, 0x20, 0x15, 0xe7, 0x20, 0x76, 0xe5, 0xa5,
0xe2, 0xc5, 0xe6, 0xa5, 0xe3, 0xe5, 0xe7, 0xb0, 0xef, 0x20, 0x6d, 0xe0,
0x4c, 0x3b, 0xe0, 0xa5, 0xca, 0x85, 0xe2, 0xa5, 0xcb, 0x85, 0xe3, 0xa5,
0x4c, 0x85, 0xe6, 0xa5, 0x4d, 0x85, 0xe7, 0xd0, 0xde, 0x20, 0x15, 0xe7,
0x20, 0x6d, 0xe5, 0xa5, 0xe4, 0x85, 0xe2, 0xa5, 0xe5, 0x85, 0xe3, 0xb0,
0xc7, 0x86, 0xd8, 0xa9, 0xa0, 0x85, 0xfa, 0x20, 0x2a, 0xe0, 0x98, 0x85,
0xe4, 0x20, 0x2a, 0xe0, 0xaa, 0x20, 0x2a, 0xe0, 0x20, 0x1b, 0xe5, 0x20,
0x18, 0xe0, 0x84, 0xfa, 0xaa, 0x10, 0x18, 0x0a, 0x10, 0xe9, 0xa5, 0xe4,
0xd0, 0x03, 0x20, 0x11, 0xe0, 0x8a, 0x20, 0xc9, 0xe3, 0xa9, 0x25, 0x20,
0x1a, 0xe0, 0xaa, 0x30, 0xf5, 0x85, 0xe4, 0xc9, 0x01, 0xd0, 0x05, 0xa6,
0xd8, 0x4c, 0xcd, 0xe3, 0x48, 0x84, 0xce, 0xa2, 0xed, 0x86, 0xcf, 0xc9,
0x51, 0x90, 0x04, 0xc6, 0xcf, 0xe9, 0x50, 0x48, 0xb1, 0xce, 0xaa, 0x88,
0xb1, 0xce, 0x10, 0xfa, 0xe0, 0xc0, 0xb0, 0x04, 0xe0, 0x00, 0x30, 0xf2,
0xaa, 0x68, 0xe9, 0x01, 0xd0, 0xe9, 0x24, 0xe4, 0x30, 0x03, 0x20, 0xf8,
0xef, 0xb1, 0xce, 0x10, 0x10, 0xaa, 0x29, 0x3f, 0x85, 0xe4, 0x18, 0x69,
0xa0, 0x20, 0xc9, 0xe3, 0x88, 0xe0, 0xc0, 0x90, 0xec, 0x20, 0x0c, 0xe0,
0x68, 0xc9, 0x5d, 0xf0, 0xa4, 0xc9, 0x28, 0xd0, 0x8a, 0xf0, 0x9e, 0x20,
0x18, 0xe1, 0x95, 0x50, 0xd5, 0x78, 0x90, 0x11, 0xa0, 0x2b, 0x4c, 0xe0,
0xe3, 0x20, 0x34, 0xee, 0xd5, 0x50, 0x90, 0xf4, 0x20, 0xe4, 0xef, 0x95,
0x78, 0x4c, 0x23, 0xe8, 0x20, 0x34, 0xee, 0xf0, 0xe7, 0x38, 0xe9, 0x01,
0x60, 0x20, 0x18, 0xe1, 0x95, 0x50, 0x18, 0xf5, 0x78, 0x4c, 0x02, 0xe1,
0xa0, 0x14, 0xd0, 0xd6, 0x20, 0x18, 0xe1, 0xe8, 0xb5, 0x50, 0x85, 0xda,
0x65, 0xce, 0x48, 0xa8, 0xb5, 0x78, 0x85, 0xdb, 0x65, 0xcf, 0x48, 0xc4,
0xca, 0xe5, 0xcb, 0xb0, 0xe3, 0xa5, 0xda, 0x69, 0xfe, 0x85, 0xda, 0xa9,
0xff, 0xa8, 0x65, 0xdb, 0x85, 0xdb, 0xc8, 0xb1, 0xda, 0xd9, 0xcc, 0x00,
0xd0, 0x0f, 0x98, 0xf0, 0xf5, 0x68, 0x91, 0xda, 0x99, 0xcc, 0x00, 0x88,
0x10, 0xf7, 0xe8, 0x60, 0xea, 0xa0, 0x80, 0xd0, 0x95, 0xa9, 0x00, 0x20,
0x0a, 0xe7, 0xa0, 0x02, 0x94, 0x78, 0x20, 0x0a, 0xe7, 0xa9, 0xbf, 0x20,
0xc9, 0xe3, 0xa0, 0x00, 0x20, 0x9e, 0xe2, 0x94, 0x78, 0xea, 0xea, 0xea,
0xb5, 0x51, 0x85, 0xce, 0xb5, 0x79, 0x85, 0xcf, 0xe8, 0xe8, 0x20, 0xbc,
0xe1, 0xb5, 0x4e, 0xd5, 0x76, 0xb0, 0x15, 0xf6, 0x4e, 0xa8, 0xb1, 0xce,
0xb4, 0x50, 0xc4, 0xe4, 0x90, 0x04, 0xa0, 0x83, 0xd0, 0xc1, 0x91, 0xda,
0xf6, 0x50, 0x90, 0xe5, 0xb4, 0x50, 0x8a, 0x91, 0xda, 0xe8, 0xe8, 0x60,
0xb5, 0x51, 0x85, 0xda, 0x38, 0xe9, 0x02, 0x85, 0xe4, 0xb5, 0x79, 0x85,
0xdb, 0xe9, 0x00, 0x85, 0xe5, 0xa0, 0x00, 0xb1, 0xe4, 0x18, 0xe5, 0xda,
0x85, 0xe4, 0x60, 0xb5, 0x53, 0x85, 0xce, 0xb5, 0x7b, 0x85, 0xcf, 0xb5,
0x51, 0x85, 0xda, 0xb5, 0x79, 0x85, 0xdb, 0xe8, 0xe8, 0xe8, 0xa0, 0x00,
0x94, 0x78, 0x94, 0xa0, 0xc8, 0x94, 0x50, 0xb5, 0x4d, 0xd5, 0x75, 0x08,
0x48, 0xb5, 0x4f, 0xd5, 0x77, 0x90, 0x07, 0x68, 0x28, 0xb0, 0x02, 0x56,
0x50, 0x60, 0xa8, 0xb1, 0xce, 0x85, 0xe4, 0x68, 0xa8, 0x28, 0xb0, 0xf3,
0xb1, 0xda, 0xc5, 0xe4, 0xd0, 0xed, 0xf6, 0x4f, 0xf6, 0x4d, 0xb0, 0xd7,
0x20, 0xd7, 0xe1, 0x4c, 0x36, 0xe7, 0x20, 0x54, 0xe2, 0x06, 0xce, 0x26,
0xcf, 0x90, 0x0d, 0x18, 0xa5, 0xe6, 0x65, 0xda, 0x85, 0xe6, 0xa5, 0xe7,
0x65, 0xdb, 0x85, 0xe7, 0x88, 0xf0, 0x09, 0x06, 0xe6, 0x26, 0xe7, 0x10,
0xe4, 0x4c, 0x7e, 0xe7, 0xa5, 0xe6, 0x20, 0x08, 0xe7, 0xa5, 0xe7, 0x95,
0xa0, 0x06, 0xe5, 0x90, 0x28, 0x4c, 0x6f, 0xe7, 0xa9, 0x55, 0x85, 0xe5,
0x20, 0x5b, 0xe2, 0xa5, 0xce, 0x85, 0xda, 0xa5, 0xcf, 0x85, 0xdb, 0x20,
0x15, 0xe7, 0x84, 0xe6, 0x84, 0xe7, 0xa5, 0xcf, 0x10, 0x09, 0xca, 0x06,
0xe5, 0x20, 0x6f, 0xe7, 0x20, 0x15, 0xe7, 0xa0, 0x10, 0x60, 0x20, 0x6c,
0xee, 0xf0, 0xc5, 0xff, 0xc9, 0x84, 0xd0, 0x02, 0x46, 0xf8, 0xc9, 0xdf,
0xf0, 0x11, 0xc9, 0x9b, 0xf0, 0x06, 0x99, 0x00, 0x02, 0xc8, 0x10, 0x0a,
0xa0, 0x8b, 0x20, 0xc4, 0xe3, 0xa0, 0x01, 0x88, 0x30, 0xf6, 0x20, 0x03,
0xe0, 0xea, 0xea, 0x20, 0xc9, 0xe3, 0xc9, 0x8d, 0xd0, 0xd6, 0xa9, 0xdf,
0x99, 0x00, 0x02, 0x60, 0x20, 0xd3, 0xef, 0x20, 0xcd, 0xe3, 0x46, 0xd9,
0xa9, 0xbe, 0x20, 0xc9, 0xe3, 0xa0, 0x00, 0x84, 0xfa, 0x24, 0xf8, 0x10,
0x0c, 0xa6, 0xf6, 0xa5, 0xf7, 0x20, 0x1b, 0xe5, 0xa9, 0xa0, 0x20, 0xc9,
0xe3, 0xa2, 0xff, 0x9a, 0x20, 0x9e, 0xe2, 0x84, 0xf1, 0x8a, 0x85, 0xc8,
0xa2, 0x20, 0x20, 0x91, 0xe4, 0xa5, 0xc8, 0x69, 0x00, 0x85, 0xe0, 0xa9,
0x00, 0xaa, 0x69, 0x02, 0x85, 0xe1, 0xa1, 0xe0, 0x29, 0xf0, 0xc9, 0xb0,
0xf0, 0x03, 0x4c, 0x83, 0xe8, 0xa0, 0x02, 0xb1, 0xe0, 0x99, 0xcd, 0x00,
0x88, 0xd0, 0xf8, 0x20, 0x8a, 0xe3, 0xa5, 0xf1, 0xe5, 0xc8, 0xc9, 0x04,
0xf0, 0xa8, 0x91, 0xe0, 0xa5, 0xca, 0xf1, 0xe0, 0x85, 0xe4, 0xa5, 0xcb,
0xe9, 0x00, 0x85, 0xe5, 0xa5, 0xe4, 0xc5, 0xcc, 0xa5, 0xe5, 0xe5, 0xcd,
0x90, 0x45, 0xa5, 0xca, 0xf1, 0xe0, 0x85, 0xe6, 0xa5, 0xcb, 0xe9, 0x00,
0x85, 0xe7, 0xb1, 0xca, 0x91, 0xe6, 0xe6, 0xca, 0xd0, 0x02, 0xe6, 0xcb,
0xa5, 0xe2, 0xc5, 0xca, 0xa5, 0xe3, 0xe5, 0xcb, 0xb0, 0xe0, 0xb5, 0xe4,
0x95, 0xca, 0xca, 0x10, 0xf9, 0xb1, 0xe0, 0xa8, 0x88, 0xb1, 0xe0, 0x91,
0xe6, 0x98, 0xd0, 0xf8, 0x24, 0xf8, 0x10, 0x09, 0xb5, 0xf7, 0x75, 0xf5,
0x95, 0xf7, 0xe8, 0xf0, 0xf7, 0x10, 0x7e, 0x00, 0x00, 0x00, 0x00, 0xa0,
0x14, 0xd0, 0x71, 0x20, 0x15, 0xe7, 0xa5, 0xe2, 0x85, 0xe6, 0xa5, 0xe3,
0x85, 0xe7, 0x20, 0x75, 0xe5, 0xa5, 0xe2, 0x85, 0xe4, 0xa5, 0xe3, 0x85,
0xe5, 0xd0, 0x0e, 0x20, 0x15, 0xe7, 0x20, 0x6d, 0xe5, 0xa5, 0xe6, 0x85,
0xe2, 0xa5, 0xe7, 0x85, 0xe3, 0xa0, 0x00, 0xa5, 0xca, 0xc5, 0xe4, 0xa5,
0xcb, 0xe5, 0xe5, 0xb0, 0x16, 0xa5, 0xe4, 0xd0, 0x02, 0xc6, 0xe5, 0xc6,
0xe4, 0xa5, 0xe6, 0xd0, 0x02, 0xc6, 0xe7, 0xc6, 0xe6, 0xb1, 0xe4, 0x91,
0xe6, 0x90, 0xe0, 0xa5, 0xe6, 0x85, 0xca, 0xa5, 0xe7, 0x85, 0xcb, 0x60,
0x20, 0xc9, 0xe3, 0xc8, 0xb9, 0x00, 0xeb, 0x30, 0xf7, 0xc9, 0x8d, 0xd0,
0x06, 0xa9, 0x00, 0x85, 0x24, 0xa9, 0x8d, 0xe6, 0x24, 0x2c, 0x12, 0xd0,
0x30, 0xfb, 0x8d, 0x12, 0xd0, 0x60, 0xa0, 0x06, 0x20, 0xd3, 0xee, 0x24,
0xd9, 0x30, 0x03, 0x4c, 0xb6, 0xe2, 0x4c, 0x9a, 0xeb, 0x2a, 0x69, 0xa0,
0xdd, 0x00, 0x02, 0xd0, 0x53, 0xb1, 0xfe, 0x0a, 0x30, 0x06, 0x88, 0xb1,
0xfe, 0x30, 0x29, 0xc8, 0x86, 0xc8, 0x98, 0x48, 0xa2, 0x00, 0xa1, 0xfe,
0xaa, 0x4a, 0x49, 0x48, 0x11, 0xfe, 0xc9, 0xc0, 0x90, 0x01, 0xe8, 0xc8,
0xd0, 0xf3, 0x68, 0xa8, 0x8a, 0x4c, 0xc0, 0xe4, 0xe6, 0xf1, 0xa6, 0xf1,
0xf0, 0xbc, 0x9d, 0x00, 0x02, 0x60, 0xa6, 0xc8, 0xa9, 0xa0, 0xe8, 0xdd,
0x00, 0x02, 0xb0, 0xfa, 0xb1, 0xfe, 0x29, 0x3f, 0x4a, 0xd0, 0xb6, 0xbd,
0x00, 0x02, 0xb0, 0x06, 0x69, 0x3f, 0xc9, 0x1a, 0x90, 0x6f, 0x69, 0x4f,
0xc9, 0x0a, 0x90, 0x69, 0xa6, 0xfd, 0xc8, 0xb1, 0xfe, 0x29, 0xe0, 0xc9,
0x20, 0xf0, 0x7a, 0xb5, 0xa8, 0x85, 0xc8, 0xb5, 0xd1, 0x85, 0xf1, 0x88,
0xb1, 0xfe, 0x0a, 0x10, 0xfa, 0x88, 0xb0, 0x38, 0x0a, 0x30, 0x35, 0xb4,
0x58, 0x84, 0xff, 0xb4, 0x80, 0xe8, 0x10, 0xda, 0xf0, 0xb3, 0xc9, 0x7e,
0xb0, 0x22, 0xca, 0x10, 0x04, 0xa0, 0x06, 0x10, 0x29, 0x94, 0x80, 0xa4,
0xff, 0x94, 0x58, 0xa4, 0xc8, 0x94, 0xa8, 0xa4, 0xf1, 0x94, 0xd1, 0x29,
0x1f, 0xa8, 0xb9, 0x20, 0xec, 0x0a, 0xa8, 0xa9, 0x76, 0x2a, 0x85, 0xff,
0xd0, 0x01, 0xc8, 0xc8, 0x86, 0xfd, 0xb1, 0xfe, 0x30, 0x84, 0xd0, 0x05,
0xa0, 0x0e, 0x4c, 0xe0, 0xe3, 0xc9, 0x03, 0xb0, 0xc3, 0x4a, 0xa6, 0xc8,
0xe8, 0xbd, 0x00, 0x02, 0x90, 0x04, 0xc9, 0xa2, 0xf0, 0x0a, 0xc9, 0xdf,
0xf0, 0x06, 0x86, 0xc8, 0x20, 0x1c, 0xe4, 0xc8, 0x88, 0xa6, 0xfd, 0xb1,
0xfe, 0x88, 0x0a, 0x10, 0xcf, 0xb4, 0x58, 0x84, 0xff, 0xb4, 0x80, 0xe8,
0xb1, 0xfe, 0x29, 0x9f, 0xd0, 0xed, 0x85, 0xf2, 0x85, 0xf3, 0x98, 0x48,
0x86, 0xfd, 0xb4, 0xd0, 0x84, 0xc9, 0x18, 0xa9, 0x0a, 0x85, 0xf9, 0xa2,
0x00, 0xc8, 0xb9, 0x00, 0x02, 0x29, 0x0f, 0x65, 0xf2, 0x48, 0x8a, 0x65,
0xf3, 0x30, 0x1c, 0xaa, 0x68, 0xc6, 0xf9, 0xd0, 0xf2, 0x85, 0xf2, 0x86,
0xf3, 0xc4, 0xf1, 0xd0, 0xde, 0xa4, 0xc9, 0xc8, 0x84, 0xf1, 0x20, 0x1c,
0xe4, 0x68, 0xa8, 0xa5, 0xf3, 0xb0, 0xa9, 0xa0, 0x00, 0x10, 0x8b, 0x85,
0xf3, 0x86, 0xf2, 0xa2, 0x04, 0x86, 0xc9, 0xa9, 0xb0, 0x85, 0xf9, 0xa5,
0xf2, 0xdd, 0x63, 0xe5, 0xa5, 0xf3, 0xfd, 0x68, 0xe5, 0x90, 0x0d, 0x85,
0xf3, 0xa5, 0xf2, 0xfd, 0x63, 0xe5, 0x85, 0xf2, 0xe6, 0xf9, 0xd0, 0xe7,
0xa5, 0xf9, 0xe8, 0xca, 0xf0, 0x0e, 0xc9, 0xb0, 0xf0, 0x02, 0x85, 0xc9,
0x24, 0xc9, 0x30, 0x04, 0xa5, 0xfa, 0xf0, 0x0b, 0x20, 0xc9, 0xe3, 0x24,
0xf8, 0x10, 0x04, 0x99, 0x00, 0x02, 0xc8, 0xca, 0x10, 0xc1, 0x60, 0x01,
0x0a, 0x64, 0xe8, 0x10, 0x00, 0x00, 0x00, 0x03, 0x27, 0xa5, 0xca, 0x85,
0xe6, 0xa5, 0xcb, 0x85, 0xe7, 0xe8, 0xa5, 0xe7, 0x85, 0xe5, 0xa5, 0xe6,
0x85, 0xe4, 0xc5, 0x4c, 0xa5, 0xe5, 0xe5, 0x4d, 0xb0, 0x26, 0xa0, 0x01,
0xb1, 0xe4, 0xe5, 0xce, 0xc8, 0xb1, 0xe4, 0xe5, 0xcf, 0xb0, 0x19, 0xa0,
0x00, 0xa5, 0xe6, 0x71, 0xe4, 0x85, 0xe6, 0x90, 0x03, 0xe6, 0xe7, 0x18,
0xc8, 0xa5, 0xce, 0xf1, 0xe4, 0xc8, 0xa5, 0xcf, 0xf1, 0xe4, 0xb0, 0xca,
0x60, 0x46, 0xf8, 0xa5, 0x4c, 0x85, 0xca, 0xa5, 0x4d, 0x85, 0xcb, 0xa5,
0x4a, 0x85, 0xcc, 0xa5, 0x4b, 0x85, 0xcd, 0xa9, 0x00, 0x85, 0xfb, 0x85,
0xfc, 0x85, 0xfe, 0xa9, 0x00, 0x85, 0x1d, 0x60, 0xa5, 0xd0, 0x69, 0x05,
0x85, 0xd2, 0xa5, 0xd1, 0x69, 0x00, 0x85, 0xd3, 0xa5, 0xd2, 0xc5, 0xca,
0xa5, 0xd3, 0xe5, 0xcb, 0x90, 0x03, 0x4c, 0x6b, 0xe3, 0xa5, 0xce, 0x91,
0xd0, 0xa5, 0xcf, 0xc8, 0x91, 0xd0, 0xa5, 0xd2, 0xc8, 0x91, 0xd0, 0xa5,
0xd3, 0xc8, 0x91, 0xd0, 0xa9, 0x00, 0xc8, 0x91, 0xd0, 0xc8, 0x91, 0xd0,
0xa5, 0xd2, 0x85, 0xcc, 0xa5, 0xd3, 0x85, 0xcd, 0xa5, 0xd0, 0x90, 0x43,
0x85, 0xce, 0x84, 0xcf, 0x20, 0xff, 0xe6, 0x30, 0x0e, 0xc9, 0x40, 0xf0,
0x0a, 0x4c, 0x28, 0xe6, 0x06, 0xc9, 0x49, 0xd0, 0x07, 0xa9, 0x49, 0x85,
0xcf, 0x20, 0xff, 0xe6, 0xa5, 0x4b, 0x85, 0xd1, 0xa5, 0x4a, 0x85, 0xd0,
0xc5, 0xcc, 0xa5, 0xd1, 0xe5, 0xcd, 0xb0, 0x94, 0xb1, 0xd0, 0xc8, 0xc5,
0xce, 0xd0, 0x06, 0xb1, 0xd0, 0xc5, 0xcf, 0xf0, 0x0e, 0xc8, 0xb1, 0xd0,
0x48, 0xc8, 0xb1, 0xd0, 0x85, 0xd1, 0x68, 0xa0, 0x00, 0xf0, 0xdb, 0xa5,
0xd0, 0x69, 0x03, 0x20, 0x0a, 0xe7, 0xa5, 0xd1, 0x69, 0x00, 0x95, 0x78,
0xa5, 0xcf, 0xc9, 0x40, 0xd0, 0x1c, 0x88, 0x98, 0x20, 0x0a, 0xe7, 0x88,
0x94, 0x78, 0xa0, 0x03, 0xf6, 0x78, 0xc8, 0xb1, 0xd0, 0x30, 0xf9, 0x10,
0x09, 0xa9, 0x00, 0x85, 0xd4, 0x85, 0xd5, 0xa2, 0x20, 0x48, 0xa0, 0x00,
0xb1, 0xe0, 0x10, 0x18, 0x0a, 0x30, 0x81, 0x20, 0xff, 0xe6, 0x20, 0x08,
0xe7, 0x20, 0xff, 0xe6, 0x95, 0xa0, 0x24, 0xd4, 0x10, 0x01, 0xca, 0x20,
0xff, 0xe6, 0xb0, 0xe6, 0xc9, 0x28, 0xd0, 0x1f, 0xa5, 0xe0, 0x20, 0x0a,
0xe7, 0xa5, 0xe1, 0x95, 0x78, 0x24, 0xd4, 0x30, 0x0b, 0xa9, 0x01, 0x20,
0x0a, 0xe7, 0xa9, 0x00, 0x95, 0x78, 0xf6, 0x78, 0x20, 0xff, 0xe6, 0x30,
0xf9, 0xb0, 0xd3, 0x24, 0xd4, 0x10, 0x06, 0xc9, 0x04, 0xb0, 0xd0, 0x46,
0xd4, 0xa8, 0x85, 0xd6, 0xb9, 0x98, 0xe9, 0x29, 0x55, 0x0a, 0x85, 0xd7,
0x68, 0xa8, 0xb9, 0x98, 0xe9, 0x29, 0xaa, 0xc5, 0xd7, 0xb0, 0x09, 0x98,
0x48, 0x20, 0xff, 0xe6, 0xa5, 0xd6, 0x90, 0x95, 0xb9, 0x10, 0xea, 0x85,
0xce, 0xb9, 0x88, 0xea, 0x85, 0xcf, 0x20, 0xfc, 0xe6, 0x4c, 0xd8, 0xe6,
0x6c, 0xce, 0x00, 0xe6, 0xe0, 0xd0, 0x02, 0xe6, 0xe1, 0xb1, 0xe0, 0x60,
0x94, 0x77, 0xca, 0x30, 0x03, 0x95, 0x50, 0x60, 0xa0, 0x66, 0x4c, 0xe0,
0xe3, 0xa0, 0x00, 0xb5, 0x50, 0x85, 0xce, 0xb5, 0xa0, 0x85, 0xcf, 0xb5,
0x78, 0xf0, 0x0e, 0x85, 0xcf, 0xb1, 0xce, 0x48, 0xc8, 0xb1, 0xce, 0x85,
0xcf, 0x68, 0x85, 0xce, 0x88, 0xe8, 0x60, 0x20, 0x4a, 0xe7, 0x20, 0x15,
0xe7, 0x98, 0x20, 0x08, 0xe7, 0x95, 0xa0, 0xc5, 0xce, 0xd0, 0x06, 0xc5,
0xcf, 0xd0, 0x02, 0xf6, 0x50, 0x60, 0x20, 0x82, 0xe7, 0x20, 0x59, 0xe7,
0x20, 0x15, 0xe7, 0x24, 0xcf, 0x30, 0x1b, 0xca, 0x60, 0x20, 0x15, 0xe7,
0xa5, 0xcf, 0xd0, 0x04, 0xa5, 0xce, 0xf0, 0xf3, 0xa9, 0xff, 0x20, 0x08,
0xe7, 0x95, 0xa0, 0x24, 0xcf, 0x30, 0xe9, 0x20, 0x15, 0xe7, 0x98, 0x38,
0xe5, 0xce, 0x20, 0x08, 0xe7, 0x98, 0xe5, 0xcf, 0x50, 0x23, 0xa0, 0x00,
0x10, 0x90, 0x20, 0x6f, 0xe7, 0x20, 0x15, 0xe7, 0xa5, 0xce, 0x85, 0xda,
0xa5, 0xcf, 0x85, 0xdb, 0x20, 0x15, 0xe7, 0x18, 0xa5, 0xce, 0x65, 0xda,
0x20, 0x08, 0xe7, 0xa5, 0xcf, 0x65, 0xdb, 0x70, 0xdd, 0x95, 0xa0, 0x60,
0x20, 0x15, 0xe7, 0xa4, 0xce, 0xf0, 0x05, 0x88, 0xa5, 0xcf, 0xf0, 0x0c,
0x60, 0xa5, 0x24, 0x09, 0x07, 0xa8, 0xc8, 0xa9, 0xa0, 0x20, 0xc9, 0xe3,
0xc4, 0x24, 0xb0, 0xf7, 0x60, 0x20, 0xb1, 0xe7, 0x20, 0x15, 0xe7, 0xa5,
0xcf, 0x10, 0x0a, 0xa9, 0xad, 0x20, 0xc9, 0xe3, 0x20, 0x72, 0xe7, 0x50,
0xef, 0x88, 0x84, 0xd5, 0x86, 0xcf, 0xa6, 0xce, 0x20, 0x1b, 0xe5, 0xa6,
0xcf, 0x60, 0x20, 0x15, 0xe7, 0xa5, 0xce, 0x85, 0xf6, 0xa5, 0xcf, 0x85,
0xf7, 0x88, 0x84, 0xf8, 0xc8, 0xa9, 0x0a, 0x85, 0xf4, 0x84, 0xf5, 0x60,
0x20, 0x15, 0xe7, 0xa5, 0xce, 0xa4, 0xcf, 0x10, 0xf2, 0x20, 0x15, 0xe7,
0xb5, 0x50, 0x85, 0xda, 0xb5, 0x78, 0x85, 0xdb, 0xa5, 0xce, 0x91, 0xda,
0xc8, 0xa5, 0xcf, 0x91, 0xda, 0xe8, 0x60, 0x68, 0x68, 0x24, 0xd5, 0x10,
0x05, 0x20, 0xcd, 0xe3, 0x46, 0xd5, 0x60, 0xa0, 0xff, 0x84, 0xd7, 0x60,
0x20, 0xcd, 0xef, 0xf0, 0x07, 0xa9, 0x25, 0x85, 0xd6, 0x88, 0x84, 0xd4,
0xe8, 0x60, 0xa5, 0xca, 0xa4, 0xcb, 0xd0, 0x5a, 0xa0, 0x41, 0xa5, 0xfc,
0xc9, 0x08, 0xb0, 0x5e, 0xa8, 0xe6, 0xfc, 0xa5, 0xe0, 0x99, 0x00, 0x01,
0xa5, 0xe1, 0x99, 0x08, 0x01, 0xa5, 0xdc, 0x99, 0x10, 0x01, 0xa5, 0xdd,
0x99, 0x18, 0x01, 0x20, 0x15, 0xe7, 0x20, 0x6d, 0xe5, 0x90, 0x04, 0xa0,
0x37, 0xd0, 0x3b, 0xa5, 0xe4, 0xa4, 0xe5, 0x85, 0xdc, 0x84, 0xdd, 0x2c,
0x11, 0xd0, 0x30, 0x4f, 0x18, 0x69, 0x03, 0x90, 0x01, 0xc8, 0xa2, 0xff,
0x86, 0xd9, 0x9a, 0x85, 0xe0, 0x84, 0xe1, 0x20, 0x79, 0xe6, 0x24, 0xd9,
0x10, 0x49, 0x18, 0xa0, 0x00, 0xa5, 0xdc, 0x71, 0xdc, 0xa4, 0xdd, 0x90,
0x01, 0xc8, 0xc5, 0x4c, 0xd0, 0xd1, 0xc4, 0x4d, 0xd0, 0xcd, 0xa0, 0x34,
0x46, 0xd9, 0x4c, 0xe0, 0xe3, 0xa0, 0x4a, 0xa5, 0xfc, 0xf0, 0xf7, 0xc6,
0xfc, 0xa8, 0xb9, 0x0f, 0x01, 0x85, 0xdc, 0xb9, 0x17, 0x01, 0x85, 0xdd,
0xbe, 0xff, 0x00, 0xb9, 0x07, 0x01, 0xa8, 0x8a, 0x4c, 0x7a, 0xe8, 0xa0,
0x63, 0x20, 0xc4, 0xe3, 0xa0, 0x01, 0xb1, 0xdc, 0xaa, 0xc8, 0xb1, 0xdc,
0x20, 0x1b, 0xe5, 0x4c, 0xb3, 0xe2, 0xc6, 0xfb, 0xa0, 0x5b, 0xa5, 0xfb,
0xf0, 0xc4, 0xa8, 0xb5, 0x50, 0xd9, 0x1f, 0x01, 0xd0, 0xf0, 0xb5, 0x78,
0xd9, 0x27, 0x01, 0xd0, 0xe9, 0xb9, 0x2f, 0x01, 0x85, 0xda, 0xb9, 0x37,
0x01, 0x85, 0xdb, 0x20, 0x15, 0xe7, 0xca, 0x20, 0x93, 0xe7, 0x20, 0x01,
0xe8, 0xca, 0xa4, 0xfb, 0xb9, 0x67, 0x01, 0x95, 0x9f, 0xb9, 0x5f, 0x01,
0xa0, 0x00, 0x20, 0x08, 0xe7, 0x20, 0x82, 0xe7, 0x20, 0x59, 0xe7, 0x20,
0x15, 0xe7, 0xa4, 0xfb, 0xa5, 0xce, 0xf0, 0x05, 0x59, 0x37, 0x01, 0x10,
0x12, 0xb9, 0x3f, 0x01, 0x85, 0xdc, 0xb9, 0x47, 0x01, 0x85, 0xdd, 0xbe,
0x4f, 0x01, 0xb9, 0x57, 0x01, 0xd0, 0x87, 0xc6, 0xfb, 0x60, 0xa0, 0x54,
0xa5, 0xfb, 0xc9, 0x08, 0xf0, 0x9a, 0xe6, 0xfb, 0xa8, 0xb5, 0x50, 0x99,
0x20, 0x01, 0xb5, 0x78, 0x99, 0x28, 0x01, 0x60, 0x20, 0x15, 0xe7, 0xa4,
0xfb, 0xa5, 0xce, 0x99, 0x5f, 0x01, 0xa5, 0xcf, 0x99, 0x67, 0x01, 0xa9,
0x01, 0x99, 0x2f, 0x01, 0xa9, 0x00, 0x99, 0x37, 0x01, 0xa5, 0xdc, 0x99,
0x3f, 0x01, 0xa5, 0xdd, 0x99, 0x47, 0x01, 0xa5, 0xe0, 0x99, 0x4f, 0x01,
0xa5, 0xe1, 0x99, 0x57, 0x01, 0x60, 0x20, 0x15, 0xe7, 0xa4, 0xfb, 0xa5,
0xce, 0x99, 0x2f, 0x01, 0xa5, 0xcf, 0x4c, 0x66, 0xe9, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab,
0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x3f, 0x3f, 0xc0, 0xc0, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c,
0x3c, 0x30, 0x0f, 0xc0, 0xcc, 0xff, 0x55, 0x00, 0xab, 0xab, 0x03, 0x03,
0xff, 0xff, 0x55, 0xff, 0xff, 0x55, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xff,
0x55, 0xc3, 0xc3, 0xc3, 0x55, 0xf0, 0xf0, 0xcf, 0x56, 0x56, 0x56, 0x55,
0xff, 0xff, 0x55, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff,
0xff, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0xab, 0x03, 0x57, 0x03, 0x03, 0x03,
0x03, 0x07, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x17, 0xff, 0xff, 0x19,
0x5d, 0x35, 0x4b, 0xf2, 0xec, 0x87, 0x6f, 0xad, 0xb7, 0xe2, 0xf8, 0x54,
0x80, 0x96, 0x85, 0x82, 0x22, 0x10, 0x33, 0x4a, 0x13, 0x06, 0x0b, 0x4a,
0x01, 0x40, 0x47, 0x7a, 0x00, 0xff, 0x23, 0x09, 0x5b, 0x16, 0xb6, 0xcb,
0xff, 0xff, 0xfb, 0xff, 0xff, 0x24, 0xf6, 0x4e, 0x59, 0x50, 0x00, 0xff,
0x23, 0xa3, 0x6f, 0x36, 0x23, 0xd7, 0x1c, 0x22, 0xc2, 0xae, 0xba, 0x23,
0xff, 0xff, 0x21, 0x30, 0x1e, 0x03, 0xc4, 0x20, 0x00, 0xc1, 0xff, 0xff,
0xff, 0xa0, 0x30, 0x1e, 0xa4, 0xd3, 0xb6, 0xbc, 0xaa, 0x3a, 0x01, 0x50,
0x7e, 0xd8, 0xd8, 0xa5, 0x3c, 0xff, 0x16, 0x5b, 0x28, 0x03, 0xc4, 0x1d,
0x00, 0x0c, 0x4e, 0x00, 0x3e, 0x00, 0xa6, 0xb0, 0x00, 0xbc, 0xc6, 0x57,
0x8c, 0x01, 0x27, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0xff, 0xff, 0xe8,
0xe0, 0xe0, 0xe0, 0xef, 0xef, 0xe3, 0xe3, 0xe5, 0xe5, 0xe7, 0xe7, 0xee,
0xef, 0xef, 0xe7, 0xe7, 0xe2, 0xef, 0xe7, 0xe7, 0xec, 0xec, 0xec, 0xe7,
0xec, 0xec, 0xec, 0xe2, 0x00, 0xff, 0xe8, 0xe1, 0xe8, 0xe8, 0xef, 0xeb,
0xff, 0xff, 0xe0, 0xff, 0xff, 0xef, 0xee, 0xef, 0xe7, 0xe7, 0x00, 0xff,
0xe8, 0xe7, 0xe7, 0xe7, 0xe8, 0xe1, 0xe2, 0xee, 0xee, 0xee, 0xee, 0xe8,
0xff, 0xff, 0xe1, 0xe1, 0xef, 0xee, 0xe7, 0xe8, 0xee, 0xe7, 0xff, 0xff,
0xff, 0xee, 0xe1, 0xef, 0xe7, 0xe8, 0xef, 0xef, 0xeb, 0xe9, 0xe8, 0xe9,
0xe9, 0xe8, 0xe8, 0xe8, 0xe8, 0xff, 0xe8, 0xe8, 0xe8, 0xee, 0xe7, 0xe8,
0xef, 0xef, 0xee, 0xef, 0xee, 0xef, 0xee, 0xee, 0xef, 0xee, 0xee, 0xee,
0xe1, 0xe8, 0xe8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbe, 0xb3, 0xb2, 0xb7,
0xb6, 0x37, 0xd4, 0xcf, 0xcf, 0xa0, 0xcc, 0xcf, 0xce, 0x47, 0xd3, 0xd9,
0xce, 0xd4, 0xc1, 0x58, 0xcd, 0xc5, 0xcd, 0xa0, 0xc6, 0xd5, 0xcc, 0x4c,
0xd4, 0xcf, 0xcf, 0xa0, 0xcd, 0xc1, 0xce, 0xd9, 0xa0, 0xd0, 0xc1, 0xd2,
0xc5, 0xce, 0x53, 0xd3, 0xd4, 0xd2, 0xc9, 0xce, 0x47, 0xce, 0xcf, 0xa0,
0xc5, 0xce, 0x44, 0xc2, 0xc1, 0xc4, 0xa0, 0xc2, 0xd2, 0xc1, 0xce, 0xc3,
0x48, 0xbe, 0xb8, 0xa0, 0xc7, 0xcf, 0xd3, 0xd5, 0xc2, 0x53, 0xc2, 0xc1,
0xc4, 0xa0, 0xd2, 0xc5, 0xd4, 0xd5, 0xd2, 0x4e, 0xbe, 0xb8, 0xa0, 0xc6,
0xcf, 0xd2, 0x53, 0xc2, 0xc1, 0xc4, 0xa0, 0xce, 0xc5, 0xd8, 0x54, 0xd3,
0xd4, 0xcf, 0xd0, 0xd0, 0xc5, 0xc4, 0xa0, 0xc1, 0xd4, 0x20, 0xaa, 0xaa,
0xaa, 0x20, 0xa0, 0xc5, 0xd2, 0xd2, 0x0d, 0xbe, 0xb2, 0xb5, 0x35, 0xd2,
0xc1, 0xce, 0xc7, 0x45, 0xc4, 0xc9, 0x4d, 0xd3, 0xd4, 0xd2, 0xa0, 0xcf,
0xd6, 0xc6, 0x4c, 0xdc, 0x0d, 0xd2, 0xc5, 0xd4, 0xd9, 0xd0, 0xc5, 0xa0,
0xcc, 0xc9, 0xce, 0xc5, 0x8d, 0x3f, 0x46, 0xd9, 0x90, 0x03, 0x4c, 0xc3,
0xe8, 0xa6, 0xcf, 0x9a, 0xa6, 0xce, 0xa0, 0x8d, 0xd0, 0x02, 0xa0, 0x99,
0x20, 0xc4, 0xe3, 0x86, 0xce, 0xba, 0x86, 0xcf, 0xa0, 0xfe, 0x84, 0xd9,
0xc8, 0x84, 0xc8, 0x20, 0x99, 0xe2, 0x84, 0xf1, 0xa2, 0x20, 0xa9, 0x30,
0x20, 0x91, 0xe4, 0xe6, 0xd9, 0xa6, 0xce, 0xa4, 0xc8, 0x0a, 0x85, 0xce,
0xc8, 0xb9, 0x00, 0x02, 0xc9, 0x74, 0xf0, 0xd2, 0x49, 0xb0, 0xc9, 0x0a,
0xb0, 0xf0, 0xc8, 0xc8, 0x84, 0xc8, 0xb9, 0x00, 0x02, 0x48, 0xb9, 0xff,
0x01, 0xa0, 0x00, 0x20, 0x08, 0xe7, 0x68, 0x95, 0xa0, 0xa5, 0xce, 0xc9,
0xc7, 0xd0, 0x03, 0x20, 0x6f, 0xe7, 0x4c, 0x01, 0xe8, 0xff, 0xff, 0xff,
0x50, 0x20, 0x13, 0xec, 0xd0, 0x15, 0x20, 0x0b, 0xec, 0xd0, 0x10, 0x20,
0x82, 0xe7, 0x20, 0x6f, 0xe7, 0x50, 0x03, 0x20, 0x82, 0xe7, 0x20, 0x59,
0xe7, 0x56, 0x50, 0x4c, 0x36, 0xe7, 0xff, 0xff, 0xc1, 0xff, 0x7f, 0xd1,
0xcc, 0xc7, 0xcf, 0xce, 0xc5, 0x9a, 0x98, 0x8b, 0x96, 0x95, 0x93, 0xbf,
0xb2, 0x32, 0x2d, 0x2b, 0xbc, 0xb0, 0xac, 0xbe, 0x35, 0x8e, 0x61, 0xff,
0xff, 0xff, 0xdd, 0xfb, 0x20, 0xc9, 0xef, 0x15, 0x4f, 0x10, 0x05, 0x20,
0xc9, 0xef, 0x35, 0x4f, 0x95, 0x50, 0x10, 0xcb, 0x4c, 0xc9, 0xef, 0x40,
0x60, 0x8d, 0x60, 0x8b, 0x00, 0x7e, 0x8c, 0x33, 0x00, 0x00, 0x60, 0x03,
0xbf, 0x12, 0x00, 0x40, 0x89, 0xc9, 0x47, 0x9d, 0x17, 0x68, 0x9d, 0x0a,
0x00, 0x40, 0x60, 0x8d, 0x60, 0x8b, 0x00, 0x7e, 0x8c, 0x3c, 0x00, 0x00,
0x60, 0x03, 0xbf, 0x1b, 0x4b, 0x67, 0xb4, 0xa1, 0x07, 0x8c, 0x07, 0xae,
0xa9, 0xac, 0xa8, 0x67, 0x8c, 0x07, 0xb4, 0xaf, 0xac, 0xb0, 0x67, 0x9d,
0xb2, 0xaf, 0xac, 0xaf, 0xa3, 0x67, 0x8c, 0x07, 0xa5, 0xab, 0xaf, 0xb0,
0xf4, 0xae, 0xa9, 0xb2, 0xb0, 0x7f, 0x0e, 0x27, 0xb4, 0xae, 0xa9, 0xb2,
0xb0, 0x7f, 0x0e, 0x28, 0xb4, 0xae, 0xa9, 0xb2, 0xb0, 0x64, 0x07, 0xa6,
0xa9, 0x67, 0xaf, 0xb4, 0xaf, 0xa7, 0x78, 0xb4, 0xa5, 0xac, 0x78, 0x7f,
0x02, 0xad, 0xa5, 0xb2, 0x67, 0xa2, 0xb5, 0xb3, 0xaf, 0xa7, 0xee, 0xb2,
0xb5, 0xb4, 0xa5, 0xb2, 0x7e, 0x8c, 0x39, 0xb4, 0xb8, 0xa5, 0xae, 0x67,
0xb0, 0xa5, 0xb4, 0xb3, 0x27, 0xaf, 0xb4, 0x07, 0x9d, 0x19, 0xb2, 0xaf,
0xa6, 0x7f, 0x05, 0x37, 0xb4, 0xb5, 0xb0, 0xae, 0xa9, 0x7f, 0x05, 0x28,
0xb4, 0xb5, 0xb0, 0xae, 0xa9, 0x7f, 0x05, 0x2a, 0xb4, 0xb5, 0xb0, 0xae,
0xa9, 0xe4, 0xae, 0xa5, 0x00, 0xff, 0xff, 0x47, 0xa2, 0xa1, 0xb4, 0x7f,
0x0d, 0x30, 0xad, 0xa9, 0xa4, 0x7f, 0x0d, 0x23, 0xad, 0xa9, 0xa4, 0x67,
0xac, 0xac, 0xa1, 0xa3, 0x00, 0x40, 0x80, 0xc0, 0xc1, 0x80, 0x00, 0x47,
0x8c, 0x68, 0x8c, 0xdb, 0x67, 0x9b, 0x68, 0x9b, 0x50, 0x8c, 0x63, 0x8c,
0x7f, 0x01, 0x51, 0x07, 0x88, 0x29, 0x84, 0x80, 0xc4, 0x80, 0x57, 0x71,
0x07, 0x88, 0x14, 0xed, 0xa5, 0xad, 0xaf, 0xac, 0xed, 0xa5, 0xad, 0xa9,
0xa8, 0xf2, 0xaf, 0xac, 0xaf, 0xa3, 0x71, 0x08, 0x88, 0xae, 0xa5, 0xac,
0x68, 0x83, 0x08, 0x68, 0x9d, 0x08, 0x71, 0x07, 0x88, 0x60, 0x76, 0xb4,
0xaf, 0xae, 0x76, 0x8d, 0x76, 0x8b, 0x51, 0x07, 0x88, 0x19, 0xb8, 0xa4,
0xae, 0xb2, 0xf2, 0xb3, 0xb5, 0xf3, 0xa2, 0xa1, 0xee, 0xa7, 0xb3, 0xe4,
0xae, 0xb2, 0xeb, 0xa5, 0xa5, 0xb0, 0x51, 0x07, 0x88, 0x39, 0x81, 0xc1,
0x4f, 0x7f, 0x0f, 0x2f, 0x00, 0x51, 0x06, 0x88, 0x29, 0xc2, 0x0c, 0x82,
0x57, 0x8c, 0x6a, 0x8c, 0x42, 0xae, 0xa5, 0xa8, 0xb4, 0x60, 0xae, 0xa5,
0xa8, 0xb4, 0x4f, 0x7e, 0x1e, 0x35, 0x8c, 0x27, 0x51, 0x07, 0x88, 0x09,
0x8b, 0xfe, 0xe4, 0xaf, 0xad, 0xf2, 0xaf, 0xe4, 0xae, 0xa1, 0xdc, 0xde,
0x9c, 0xdd, 0x9c, 0xde, 0xdd, 0x9e, 0xc3, 0xdd, 0xcf, 0xca, 0xcd, 0xcb,
0x00, 0x47, 0x9d, 0xad, 0xa5, 0xad, 0xaf, 0xac, 0x76, 0x9d, 0xad, 0xa5,
0xad, 0xa9, 0xa8, 0xe6, 0xa6, 0xaf, 0x60, 0x8c, 0x20, 0xaf, 0xb4, 0xb5,
0xa1, 0xf2, 0xac, 0xa3, 0xf2, 0xa3, 0xb3, 0x60, 0x8c, 0x20, 0xac, 0xa5,
0xa4, 0xee, 0xb5, 0xb2, 0x60, 0xae, 0xb5, 0xb2, 0xf4, 0xb3, 0xa9, 0xac,
0x60, 0x8c, 0x20, 0xb4, 0xb3, 0xa9, 0xac, 0x7a, 0x7e, 0x9a, 0x22, 0x20,
0x00, 0x60, 0x03, 0xbf, 0x60, 0x03, 0xbf, 0x1f, 0x20, 0xb1, 0xe7, 0xe8,
0xe8, 0xb5, 0x4f, 0x85, 0xda, 0xb5, 0x77, 0x85, 0xdb, 0xb4, 0x4e, 0x98,
0xd5, 0x76, 0xb0, 0x09, 0xb1, 0xda, 0x20, 0xc9, 0xe3, 0xc8, 0x4c, 0x0f,
0xee, 0xa9, 0xff, 0x85, 0xd5, 0x60, 0xe8, 0xa9, 0x00, 0x95, 0x78, 0x95,
0xa0, 0xb5, 0x77, 0x38, 0xf5, 0x4f, 0x95, 0x50, 0x4c, 0x23, 0xe8, 0xff,
0x20, 0x15, 0xe7, 0xa5, 0xcf, 0xd0, 0x28, 0xa5, 0xce, 0x60, 0x20, 0x34,
0xee, 0xa4, 0xc8, 0xc9, 0x30, 0xb0, 0x21, 0xc0, 0x28, 0xb0, 0x1d, 0x60,
0xea, 0xea, 0x20, 0x34, 0xee, 0x60, 0xea, 0x8a, 0xa2, 0x01, 0xb4, 0xce,
0x94, 0x4c, 0xb4, 0x48, 0x94, 0xca, 0xca, 0xf0, 0xf5, 0xaa, 0x60, 0xa0,
0x77, 0x4c, 0xe0, 0xe3, 0xa0, 0x7b, 0xd0, 0xf9, 0x20, 0x54, 0xe2, 0xa5,
0xda, 0xd0, 0x07, 0xa5, 0xdb, 0xd0, 0x03, 0x4c, 0x7e, 0xe7, 0x06, 0xce,
0x26, 0xcf, 0x26, 0xe6, 0x26, 0xe7, 0xa5, 0xe6, 0xc5, 0xda, 0xa5, 0xe7,
0xe5, 0xdb, 0x90, 0x0a, 0x85, 0xe7, 0xa5, 0xe6, 0xe5, 0xda, 0x85, 0xe6,
0xe6, 0xce, 0x88, 0xd0, 0xe1, 0x60, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x20, 0x15, 0xe7, 0x6c, 0xce, 0x00, 0xa5, 0x4c, 0xd0, 0x02, 0xc6, 0x4d,
0xc6, 0x4c, 0xa5, 0x48, 0xd0, 0x02, 0xc6, 0x49, 0xc6, 0x48, 0xa0, 0x00,
0xb1, 0x4c, 0x91, 0x48, 0xa5, 0xca, 0xc5, 0x4c, 0xa5, 0xcb, 0xe5, 0x4d,
0x90, 0xe0, 0x4c, 0x53, 0xee, 0xc9, 0x28, 0xb0, 0x9b, 0xa8, 0xa5, 0xc8,
0x60, 0xea, 0xea, 0x98, 0xaa, 0xa0, 0x6e, 0x20, 0xc4, 0xe3, 0x8a, 0xa8,
0x20, 0xc4, 0xe3, 0xa0, 0x72, 0x4c, 0xc4, 0xe3, 0x20, 0x15, 0xe7, 0x06,
0xce, 0x26, 0xcf, 0x30, 0xfa, 0xb0, 0xdc, 0xd0, 0x04, 0xc5, 0xce, 0xb0,
0xd6, 0x60, 0x20, 0x15, 0xe7, 0xb1, 0xce, 0x94, 0x9f, 0x4c, 0x08, 0xe7,
0x20, 0x34, 0xee, 0xa5, 0xce, 0x48, 0x20, 0x15, 0xe7, 0x68, 0x91, 0xce,
0x60, 0xff, 0xff, 0xff, 0x20, 0x6c, 0xee, 0xa5, 0xce, 0x85, 0xe6, 0xa5,
0xcf, 0x85, 0xe7, 0x4c, 0x44, 0xe2, 0x20, 0xe4, 0xee, 0x4c, 0x34, 0xe1,
0x20, 0xe4, 0xee, 0xb4, 0x78, 0xb5, 0x50, 0x69, 0xfe, 0xb0, 0x01, 0x88,
0x85, 0xda, 0x84, 0xdb, 0x18, 0x65, 0xce, 0x95, 0x50, 0x98, 0x65, 0xcf,
0x95, 0x78, 0xa0, 0x00, 0xb5, 0x50, 0xd1, 0xda, 0xc8, 0xb5, 0x78, 0xf1,
0xda, 0xb0, 0x80, 0x4c, 0x23, 0xe8, 0x20, 0x15, 0xe7, 0xa5, 0x4e, 0x20,
0x08, 0xe7, 0xa5, 0x4f, 0xd0, 0x04, 0xc5, 0x4e, 0x69, 0x00, 0x29, 0x7f,
0x85, 0x4f, 0x95, 0xa0, 0xa0, 0x11, 0xa5, 0x4f, 0x0a, 0x18, 0x69, 0x40,
0x0a, 0x26, 0x4e, 0x26, 0x4f, 0x88, 0xd0, 0xf2, 0xa5, 0xce, 0x20, 0x08,
0xe7, 0xa5, 0xcf, 0x95, 0xa0, 0x4c, 0x7a, 0xe2, 0x20, 0x15, 0xe7, 0xa4,
0xce, 0xc4, 0x4c, 0xa5, 0xcf, 0xe5, 0x4d, 0x90, 0x1f, 0x84, 0x48, 0xa5,
0xcf, 0x85, 0x49, 0x4c, 0xb6, 0xee, 0x20, 0x15, 0xe7, 0xa4, 0xce, 0xc4,
0xca, 0xa5, 0xcf, 0xe5, 0xcb, 0xb0, 0x09, 0x84, 0x4a, 0xa5, 0xcf, 0x85,
0x4b, 0x4c, 0xb7, 0xe5, 0x4c, 0xcb, 0xee, 0xea, 0xea, 0xea, 0xea, 0x20,
0xc9, 0xef, 0x20, 0x71, 0xe1, 0x4c, 0xbf, 0xef, 0x20, 0x03, 0xee, 0xa9,
0xff, 0x85, 0xc8, 0xa9, 0x74, 0x8d, 0x00, 0x02, 0x60, 0x20, 0x36, 0xe7,
0xe8, 0x20, 0x36, 0xe7, 0xb5, 0x50, 0x60, 0xa9, 0x00, 0x85, 0x4a, 0x85,
0x4c, 0xa9, 0x08, 0x85, 0x4b, 0xa9, 0x10, 0x85, 0x4d, 0x4c, 0xad, 0xe5,
0xd5, 0x78, 0xd0, 0x01, 0x18, 0x4c, 0x02, 0xe1, 0x20, 0xb7, 0xe5, 0x4c,
0x36, 0xe8, 0x20, 0xb7, 0xe5, 0x4c, 0x5b, 0xe8, 0xe0, 0x80, 0xd0, 0x01,
0x88, 0x4c, 0x0c, 0xe0, 0xa9, 0x03, 0x85, 0xf8, 0xa9, 0x20, 0x85, 0xff,
0xa9, 0x7c, 0x85, 0xf9, 0xa2, 0x1b, 0xbd, 0x67, 0xfd, 0x20, 0xef, 0xff,
0xca, 0xd0, 0xf7, 0xca, 0x9a, 0x20, 0x71, 0xf0, 0xd8, 0xa9, 0x00, 0x85,
0x5b, 0x20, 0xce, 0xf0, 0xa2, 0x0f, 0x86, 0x58, 0x86, 0x59, 0x20, 0xe5,
0xfe, 0xa9, 0x3f, 0x20, 0xef, 0xff, 0x20, 0xe0, 0xfe, 0x20, 0xea, 0xfe,
0xc9, 0x08, 0xf0, 0xe0, 0xc9, 0x0d, 0xf0, 0x08, 0x20, 0xef, 0xff, 0x95,
0x00, 0xe8, 0xd0, 0xed, 0xa5, 0x0f, 0xf0, 0xd0, 0xa5, 0x10, 0xf0, 0x04,
0xc9, 0x20, 0xd0, 0x0c, 0xa2, 0x0d, 0xbd, 0x27, 0xfd, 0xc5, 0x0f, 0xf0,
0x0e, 0xca, 0xd0, 0xf6, 0x48, 0x48, 0xa0, 0x03, 0x68, 0x68, 0x20, 0x69,
0xf4, 0xd0, 0xb1, 0x20, 0xd6, 0xf0, 0x4c, 0x1c, 0xf0, 0xa9, 0x00, 0xa8,
0x85, 0xfe, 0x91, 0xfe, 0xa5, 0xff, 0x85, 0xfd, 0xa9, 0x00, 0x85, 0xfa,
0x85, 0xfb, 0x85, 0xfc, 0x60, 0x20, 0x71, 0xf0, 0xa5, 0x11, 0xd0, 0x02,
0xa9, 0x01, 0x91, 0xfe, 0x60, 0x20, 0xab, 0xf0, 0xf0, 0xcc, 0x20, 0xe5,
0xfe, 0xa5, 0x3f, 0xa6, 0x3e, 0x4c, 0x67, 0xfb, 0x20, 0xab, 0xf0, 0xf0,
0xbd, 0x20, 0xe5, 0xfe, 0x6c, 0x3e, 0x00, 0xa2, 0x02, 0xb5, 0x0f, 0xf0,
0x08, 0x48, 0x20, 0xd3, 0xf7, 0x68, 0xe8, 0xf0, 0xab, 0x60, 0xa5, 0xf5,
0x85, 0x3e, 0xa5, 0xf6, 0x85, 0x3f, 0x60, 0xa5, 0x3e, 0x85, 0xf5, 0xa5,
0x3f, 0x85, 0xf6, 0x60, 0xa9, 0x20, 0xa2, 0x27, 0x95, 0xff, 0xca, 0xd0,
0xfb, 0x60, 0xbd, 0x34, 0xfd, 0x48, 0xbd, 0x41, 0xfd, 0x48, 0x60, 0x20,
0x71, 0xf0, 0x4c, 0x58, 0xf1, 0x20, 0x78, 0xf0, 0x20, 0x1d, 0xf1, 0xf0,
0x03, 0x20, 0x53, 0xf2, 0xa0, 0x00, 0xb1, 0xfc, 0xf0, 0x0e, 0x20, 0x72,
0xf2, 0x20, 0xdc, 0xf4, 0xad, 0x11, 0xd0, 0x10, 0xef, 0xad, 0x10, 0xd0,
0x60, 0x20, 0x4f, 0xf2, 0x20, 0xe5, 0xfe, 0xa2, 0x04, 0xb5, 0xfb, 0x20,
0xdc, 0xff, 0xe0, 0x03, 0xd0, 0x03, 0x20, 0xb9, 0xfe, 0xca, 0xd0, 0xf1,
0x60, 0xa0, 0x00, 0x84, 0x30, 0xa2, 0x01, 0xb5, 0x0f, 0xf0, 0x25, 0xc9,
0x20, 0xf0, 0x07, 0xc9, 0x24, 0xf0, 0x03, 0xe8, 0xd0, 0xf1, 0xe6, 0x30,
0xa9, 0x24, 0x95, 0x0f, 0x20, 0x5b, 0xf9, 0xe8, 0xf0, 0x5f, 0xa5, 0x3e,
0x99, 0x54, 0x00, 0xc8, 0xa5, 0x3f, 0x99, 0x54, 0x00, 0xc8, 0xd0, 0xd7,
0xa4, 0x30, 0x60, 0x20, 0x1d, 0xf1, 0x88, 0xd0, 0x48, 0x20, 0xc7, 0xf1,
0x20, 0x1d, 0xf1, 0xe8, 0xf0, 0x3f, 0x98, 0xd0, 0x06, 0x20, 0x4f, 0xf2,
0x18, 0x90, 0x03, 0x20, 0x53, 0xf2, 0x20, 0xde, 0xf2, 0xe0, 0xff, 0xf0,
0xab, 0x86, 0x2f, 0xa5, 0xfd, 0x85, 0x51, 0x85, 0x53, 0xa5, 0xfc, 0x85,
0x50, 0x18, 0x65, 0x2f, 0x85, 0x52, 0x90, 0x02, 0xe6, 0x53, 0x20, 0xa0,
0xf1, 0x20, 0x25, 0xf2, 0xa0, 0x00, 0xb9, 0x00, 0x00, 0x91, 0xfc, 0xc8,
0xc4, 0x2f, 0xd0, 0xf6, 0x20, 0xdc, 0xf4, 0xd0, 0xcd, 0x4c, 0x62, 0xf0,
0xa2, 0xfc, 0xb5, 0xfe, 0x48, 0xe8, 0xd0, 0xfa, 0x20, 0x4f, 0xf2, 0x38,
0xa5, 0xfc, 0xe5, 0x50, 0x85, 0x54, 0xa5, 0xfd, 0xe5, 0x51, 0x85, 0x55,
0xe6, 0x54, 0xd0, 0x02, 0xe6, 0x55, 0xa2, 0x04, 0x68, 0x95, 0xf9, 0xca,
0xd0, 0xfa, 0x60, 0x20, 0x1d, 0xf1, 0xf0, 0xd1, 0x84, 0x30, 0x20, 0x53,
0xf2, 0xe0, 0xff, 0xf0, 0xc8, 0xa5, 0xfc, 0x85, 0x52, 0xa5, 0xfd, 0x85,
0x53, 0xa5, 0x30, 0x4a, 0xf0, 0x0c, 0xa6, 0x57, 0xa4, 0x56, 0xe4, 0x55,
0xd0, 0x02, 0xc4, 0x54, 0x90, 0xaf, 0xc8, 0xd0, 0x01, 0xe8, 0x86, 0x55,
0x84, 0x54, 0x20, 0x53, 0xf2, 0xa5, 0xfc, 0x85, 0x50, 0xa5, 0xfd, 0x85,
0x51, 0x20, 0xa0, 0xf1, 0xa0, 0x00, 0xa6, 0x55, 0xf0, 0x0e, 0xb1, 0x50,
0x91, 0x52, 0xc8, 0xd0, 0xf9, 0xe6, 0x51, 0xe6, 0x53, 0xca, 0xd0, 0xf2,
0xa6, 0x54, 0xf0, 0x08, 0xb1, 0x50, 0x91, 0x52, 0xc8, 0xca, 0xd0, 0xf8,
0x60, 0xa6, 0x55, 0x18, 0x8a, 0x65, 0x51, 0x85, 0x51, 0x18, 0x8a, 0x65,
0x53, 0x85, 0x53, 0xe8, 0xa4, 0x54, 0xf0, 0x0e, 0x88, 0xf0, 0x07, 0xb1,
0x50, 0x91, 0x52, 0x88, 0xd0, 0xf9, 0xb1, 0x50, 0x91, 0x52, 0x88, 0xc6,
0x51, 0xc6, 0x53, 0xca, 0xd0, 0xed, 0x60, 0xa9, 0xff, 0x85, 0x55, 0x20,
0x78, 0xf0, 0xa4, 0x54, 0xc4, 0xfa, 0xd0, 0x06, 0xa6, 0x55, 0xe4, 0xfb,
0xf0, 0x51, 0xa0, 0xff, 0xc8, 0xb1, 0xfc, 0xd0, 0xfb, 0x98, 0xf0, 0x45,
0xc8, 0x20, 0xdc, 0xf4, 0xd0, 0xe4, 0x20, 0xe5, 0xfe, 0x86, 0x2f, 0x20,
0xee, 0xf3, 0xc8, 0x20, 0xd6, 0xfe, 0xa2, 0x00, 0xb5, 0x04, 0xf0, 0x06,
0x20, 0xef, 0xff, 0xe8, 0xd0, 0xf6, 0xa6, 0x2f, 0x60, 0x20, 0xea, 0xfe,
0xc9, 0x09, 0xd0, 0x02, 0xa9, 0x20, 0xc9, 0x20, 0x10, 0x1a, 0xa8, 0x68,
0x68, 0x68, 0x68, 0xc0, 0x08, 0xf0, 0x3b, 0xc0, 0x0d, 0xd0, 0x0a, 0xe0,
0x04, 0xf0, 0x29, 0xa9, 0x00, 0x95, 0x00, 0xf0, 0x5c, 0xa2, 0xff, 0x60,
0xe0, 0x27, 0x10, 0x1a, 0xc9, 0x5e, 0x10, 0x16, 0x38, 0x60, 0xc9, 0x2e,
0xf0, 0xfa, 0xc9, 0x30, 0x30, 0x0c, 0xc9, 0x3a, 0x30, 0xf2, 0xc9, 0x41,
0x30, 0x04, 0xc9, 0x5b, 0x30, 0xea, 0x18, 0x60, 0xa9, 0x02, 0xaa, 0x85,
0x00, 0xa9, 0x00, 0x85, 0x01, 0x60, 0x20, 0xcc, 0xf0, 0xa9, 0x00, 0x85,
0x1d, 0x20, 0xe5, 0xfe, 0x20, 0xd6, 0xfe, 0xa2, 0x04, 0xa9, 0x0a, 0x20,
0x9c, 0xf3, 0x20, 0xc4, 0xf3, 0xa5, 0x04, 0xc9, 0x3b, 0xf0, 0x0d, 0xa9,
0x0e, 0x20, 0x9c, 0xf3, 0x20, 0xc4, 0xf3, 0xa9, 0x1d, 0x20, 0x9c, 0xf3,
0xa9, 0x00, 0x20, 0x9c, 0xf3, 0xa2, 0x00, 0x86, 0x51, 0xa9, 0x20, 0x85,
0x55, 0xa9, 0x04, 0x85, 0x50, 0xa9, 0x01, 0x85, 0x54, 0x20, 0xd7, 0xf3,
0xa4, 0x04, 0xc0, 0x3b, 0xd0, 0x04, 0xa9, 0x0b, 0xd0, 0x5f, 0x8a, 0x48,
0x18, 0x66, 0x56, 0xa2, 0x03, 0x38, 0xb5, 0x0a, 0xe9, 0x40, 0xa0, 0x05,
0x4a, 0x66, 0x56, 0x66, 0x57, 0x88, 0xd0, 0xf8, 0xca, 0xd0, 0xee, 0xa2,
0x38, 0xbd, 0xe8, 0xfb, 0xc5, 0x56, 0xd0, 0x07, 0xbd, 0x20, 0xfc, 0xc5,
0x57, 0xf0, 0x03, 0xca, 0xd0, 0xef, 0xca, 0x8a, 0xc9, 0xff, 0xd0, 0x19,
0xa5, 0x0b, 0xc9, 0x2e, 0xd0, 0x0c, 0xa2, 0x05, 0xa5, 0x0c, 0xdd, 0x4e,
0xfd, 0xf0, 0x09, 0xca, 0xd0, 0xf8, 0x68, 0xa0, 0x01, 0x4c, 0x69, 0xf4,
0xca, 0xa8, 0xc8, 0x68, 0xaa, 0x94, 0x00, 0xe8, 0xa9, 0x0f, 0x85, 0x50,
0x20, 0xd7, 0xf3, 0x86, 0x2f, 0xe6, 0x2f, 0xa9, 0x1d, 0x85, 0x50, 0xa9,
0x00, 0x85, 0x54, 0x85, 0x55, 0x20, 0xd7, 0xf3, 0xe4, 0x2f, 0xd0, 0x03,
0xca, 0x95, 0xff, 0x60, 0x85, 0x54, 0x20, 0x8d, 0xf2, 0x90, 0xfb, 0x20,
0xef, 0xff, 0x95, 0x00, 0xe8, 0xc9, 0x20, 0xf0, 0x05, 0xe4, 0x54, 0xd0,
0xed, 0x60, 0xa5, 0x54, 0xf0, 0xe8, 0xe4, 0x54, 0xf0, 0xf7, 0xa9, 0x20,
0x95, 0x00, 0x20, 0xef, 0xff, 0xe8, 0xd0, 0xee, 0xb5, 0xff, 0xc9, 0x20,
0xf0, 0x07, 0x20, 0x8d, 0xf2, 0xc9, 0x20, 0xd0, 0xf9, 0x95, 0x00, 0xe8,
0x4c, 0xef, 0xff, 0xa0, 0x00, 0xb1, 0x50, 0xf0, 0x0b, 0xc5, 0x55, 0xf0,
0x07, 0x95, 0x00, 0xe8, 0xe6, 0x50, 0xd0, 0xf1, 0xa5, 0x54, 0x95, 0x00,
0xe8, 0x60, 0x20, 0xcc, 0xf0, 0xa0, 0x00, 0xa2, 0x04, 0xb1, 0xfc, 0xf0,
0x4d, 0xc9, 0x02, 0xd0, 0x05, 0xc8, 0xa9, 0x00, 0xf0, 0x46, 0xc9, 0x01,
0xf0, 0x06, 0x95, 0x00, 0xe8, 0xc8, 0xd0, 0xe9, 0xa5, 0x04, 0xc9, 0x3b,
0xd0, 0x04, 0xa2, 0x0b, 0xd0, 0x2d, 0xc8, 0xb1, 0xfc, 0xaa, 0xca, 0x86,
0x3c, 0xe0, 0x38, 0x10, 0x09, 0x98, 0x48, 0x20, 0x99, 0xfa, 0x68, 0xa8,
0xd0, 0x06, 0x86, 0x0c, 0xa9, 0x2e, 0x85, 0x0b, 0xc8, 0xa2, 0x0f, 0xb1,
0xfc, 0xf0, 0x11, 0xc9, 0x01, 0xd0, 0x05, 0xc8, 0xa2, 0x1d, 0xd0, 0xf3,
0x95, 0x00, 0xe8, 0xc8, 0xd0, 0xed, 0xa2, 0xfe, 0x95, 0x00, 0x60, 0x20,
0x94, 0xf4, 0x20, 0xe5, 0xfe, 0x20, 0xf8, 0xf5, 0x20, 0xb8, 0xf4, 0xe8,
0xf0, 0x0f, 0xe0, 0xff, 0xd0, 0xf6, 0xe6, 0x58, 0x20, 0x10, 0xf6, 0xe8,
0xf0, 0x03, 0x4c, 0xf8, 0xf5, 0x20, 0xe5, 0xfe, 0xa2, 0x05, 0xbd, 0x53,
0xfd, 0x20, 0xef, 0xff, 0xca, 0xd0, 0xf7, 0x98, 0x18, 0x8a, 0x69, 0x03,
0x88, 0xd0, 0xfb, 0xa8, 0xa2, 0x03, 0xb9, 0x56, 0xfd, 0x20, 0xef, 0xff,
0xc8, 0xca, 0xd0, 0xf6, 0xca, 0xa5, 0x59, 0xd0, 0x26, 0x4c, 0x72, 0xf2,
0x20, 0x78, 0xf0, 0x85, 0x58, 0x85, 0xeb, 0x85, 0xe9, 0x85, 0xf5, 0xa5,
0xf8, 0x85, 0xf6, 0x20, 0xeb, 0xf5, 0x86, 0xea, 0xa9, 0x00, 0x85, 0x2b,
0x85, 0x29, 0x85, 0x46, 0xa4, 0xf9, 0xc8, 0x84, 0x2a, 0x84, 0x47, 0x60,
0x20, 0xee, 0xf3, 0xe0, 0xfe, 0xf0, 0x1d, 0xe0, 0x04, 0xf0, 0x18, 0xa9,
0x00, 0x85, 0x59, 0x85, 0x58, 0x85, 0x5a, 0x20, 0x44, 0xf5, 0xe0, 0xff,
0xf0, 0x1d, 0xa0, 0x00, 0xb1, 0xfc, 0xf0, 0x03, 0xc8, 0xd0, 0xf9, 0xc8,
0xa5, 0xfc, 0x84, 0x44, 0x18, 0x65, 0x44, 0x85, 0xfc, 0x90, 0x02, 0xe6,
0xfd, 0xe6, 0xfa, 0xd0, 0x02, 0xe6, 0xfb, 0x60, 0xa4, 0x3c, 0xb9, 0x73,
0xfc, 0xa6, 0x3d, 0x18, 0x7d, 0xab, 0xfc, 0xe0, 0x0b, 0xf0, 0x0e, 0xe0,
0x02, 0xd0, 0x11, 0xc0, 0x28, 0x30, 0x0d, 0xc0, 0x30, 0xb0, 0x09, 0x69,
0x08, 0xc0, 0x35, 0xd0, 0x03, 0x18, 0x69, 0x04, 0x20, 0x2f, 0xf5, 0xc9,
0x00, 0xd0, 0x03, 0x20, 0x2f, 0xf5, 0x8a, 0xf0, 0xce, 0xca, 0xf0, 0xcb,
0xa5, 0x3e, 0xe0, 0x08, 0x30, 0x05, 0x20, 0x2f, 0xf5, 0xa5, 0x3f, 0xa0,
0x00, 0x91, 0xf5, 0xe6, 0xf5, 0xd0, 0x02, 0xe6, 0xf6, 0x60, 0x20, 0xa9,
0xf6, 0xe0, 0xff, 0xd0, 0xaf, 0xa0, 0x02, 0x60, 0xa5, 0x04, 0xc9, 0x3b,
0xf0, 0xa5, 0xa6, 0x0b, 0xe0, 0x2e, 0xd0, 0x0d, 0xa6, 0x0c, 0xe0, 0x4d,
0xd0, 0x03, 0x4c, 0xb6, 0xf5, 0xe0, 0x3d, 0xf0, 0x47, 0xc9, 0x20, 0xf0,
0x03, 0x20, 0xdf, 0xf8, 0xa5, 0x0b, 0xc9, 0x2e, 0xd0, 0xd0, 0xa2, 0x00,
0xa5, 0x0c, 0xc9, 0x53, 0xf0, 0x19, 0x85, 0x58, 0x20, 0x7a, 0xf7, 0xe8,
0xf0, 0x0c, 0xa5, 0x3e, 0xa6, 0x0c, 0xe0, 0x57, 0xf0, 0xa8, 0xa6, 0x3f,
0xf0, 0xa9, 0xa0, 0x03, 0xa2, 0xff, 0x60, 0xb5, 0x0f, 0xc9, 0x27, 0xd0,
0xf5, 0xe8, 0xb5, 0x0f, 0xf0, 0xf0, 0xc9, 0x27, 0xf0, 0x09, 0x20, 0x2f,
0xf5, 0xe0, 0x0e, 0xd0, 0xf0, 0xf0, 0xe3, 0x60, 0x85, 0x58, 0x20, 0xc2,
0xf2, 0x90, 0xdb, 0xa2, 0x00, 0x20, 0x7a, 0xf7, 0xe8, 0xf0, 0xd3, 0x4c,
0xe2, 0xf8, 0x20, 0xc2, 0xf2, 0x90, 0xcb, 0xa0, 0x00, 0xa5, 0x0f, 0xf0,
0x14, 0xc9, 0x20, 0xf0, 0x10, 0x20, 0xf6, 0xf5, 0xa2, 0x00, 0xa5, 0x0f,
0x20, 0x5b, 0xf9, 0xe8, 0xf0, 0xb4, 0x20, 0xc3, 0xf0, 0x20, 0xdf, 0xf8,
0xe0, 0xff, 0xf0, 0xc7, 0x20, 0x10, 0xf6, 0xe0, 0xff, 0xf0, 0xc0, 0x20,
0xc4, 0xfe, 0xa9, 0x00, 0x20, 0xf6, 0xf5, 0xa2, 0x00, 0x86, 0xee, 0x86,
0xec, 0xa6, 0xf9, 0x86, 0xed, 0x60, 0x85, 0x58, 0xa5, 0xf6, 0xa6, 0xf5,
0xa4, 0x58, 0xf0, 0x0d, 0x48, 0x20, 0xb9, 0xfe, 0x68, 0xe0, 0x00, 0xd0,
0x03, 0x38, 0xe9, 0x01, 0xca, 0x4c, 0x67, 0xfb, 0xa6, 0x2b, 0xf0, 0x72,
0x86, 0x59, 0x86, 0x45, 0xa5, 0xf5, 0x48, 0xa5, 0xf6, 0x48, 0x20, 0xa8,
0xf4, 0xa0, 0x00, 0xa5, 0x58, 0x85, 0x48, 0x84, 0x5a, 0xb1, 0x46, 0xc9,
0x2e, 0xd0, 0x02, 0x85, 0x58, 0xb1, 0x46, 0x99, 0x1d, 0x00, 0xc8, 0xc0,
0x06, 0xd0, 0xf6, 0xb1, 0x46, 0x85, 0xf5, 0xc8, 0xb1, 0x46, 0x85, 0xf6,
0xc8, 0xb1, 0x46, 0x85, 0x54, 0x20, 0x7e, 0xf8, 0xe0, 0xff, 0xf0, 0x47,
0xa5, 0x5a, 0xf0, 0x04, 0xa5, 0x54, 0x91, 0x50, 0x20, 0xc3, 0xf7, 0xa0,
0x00, 0xb1, 0xf5, 0x29, 0x1f, 0xc9, 0x10, 0xf0, 0x22, 0x20, 0x33, 0xf5,
0xa5, 0x3e, 0x20, 0x2a, 0xf5, 0x18, 0xa5, 0x46, 0x69, 0x09, 0x85, 0x46,
0x90, 0x02, 0xe6, 0x47, 0xa5, 0x48, 0x85, 0x58, 0xc6, 0x45, 0xd0, 0xa1,
0x68, 0x85, 0xf6, 0x68, 0x85, 0xf5, 0x60, 0x20, 0x62, 0xf7, 0xe0, 0xff,
0xf0, 0x09, 0xa0, 0x01, 0xa5, 0x3e, 0x91, 0xf5, 0x4c, 0x6d, 0xf6, 0xa0,
0x00, 0x20, 0xe0, 0xfe, 0xb1, 0x46, 0x20, 0xef, 0xff, 0xc8, 0xc0, 0x06,
0xd0, 0xf6, 0x88, 0xd0, 0xd7, 0xa2, 0xff, 0x86, 0x3d, 0xa5, 0x3c, 0xa6,
0x0f, 0xf0, 0x04, 0xe0, 0x20, 0xd0, 0x0e, 0xa2, 0x00, 0x20, 0x3d, 0xf7,
0xe0, 0xff, 0xd0, 0x35, 0xa2, 0x01, 0x4c, 0x3d, 0xf7, 0xe0, 0x23, 0xf0,
0x0e, 0xa2, 0x03, 0x20, 0x3d, 0xf7, 0xe0, 0xff, 0xf0, 0x24, 0xa5, 0x0f,
0x4c, 0x4f, 0xf7, 0xc9, 0x2c, 0xf0, 0x71, 0xa2, 0x02, 0xc9, 0x35, 0xf0,
0x07, 0x20, 0x3d, 0xf7, 0xe0, 0xff, 0xf0, 0x0d, 0x86, 0x3d, 0xca, 0x20,
0x7a, 0xf7, 0xe8, 0xf0, 0x5b, 0xa5, 0x3f, 0xd0, 0x57, 0x60, 0xa2, 0x00,
0xa5, 0x0f, 0xc9, 0x28, 0xd0, 0x01, 0xe8, 0x20, 0xd3, 0xf7, 0xe0, 0xff,
0xf0, 0xef, 0x20, 0x9c, 0xf9, 0xe0, 0xff, 0xf0, 0xe8, 0x86, 0x3d, 0xe0,
0x06, 0xd0, 0x0e, 0xa5, 0x3c, 0xc9, 0x28, 0x90, 0x08, 0xc9, 0x30, 0xb0,
0x04, 0xa2, 0x0b, 0xd0, 0x28, 0xa0, 0x06, 0xb9, 0x15, 0xfd, 0xc5, 0x3c,
0xd0, 0x0e, 0xbe, 0x1b, 0xfd, 0xe4, 0x3d, 0xf0, 0x18, 0xbe, 0x21, 0xfd,
0xe4, 0x3d, 0xf0, 0x11, 0x88, 0xd0, 0xe8, 0xa6, 0x3d, 0xa5, 0x3c, 0xdd,
0x59, 0xfc, 0x90, 0x08, 0xdd, 0x66, 0xfc, 0xb0, 0x03, 0x86, 0x3d, 0x60,
0xa2, 0xff, 0x60, 0xa2, 0x00, 0x86, 0x3e, 0x86, 0x3f, 0xc9, 0x2a, 0xd0,
0x06, 0x20, 0xba, 0xf0, 0x20, 0xfd, 0xf7, 0x20, 0xd3, 0xf7, 0x38, 0xa5,
0x3e, 0xe5, 0xf5, 0x85, 0x3e, 0xa5, 0x3f, 0xe5, 0xf6, 0x85, 0x3f, 0xf0,
0x04, 0xe6, 0x3f, 0xd0, 0xd7, 0xc6, 0x3e, 0xc6, 0x3e, 0x60, 0xb5, 0x0f,
0xf0, 0xce, 0xc9, 0x27, 0xf0, 0x03, 0x4c, 0xd3, 0xf7, 0xe8, 0xa9, 0x00,
0x85, 0x3f, 0xb5, 0x0f, 0x85, 0x3e, 0xe8, 0xb5, 0x0f, 0xc9, 0x27, 0xd0,
0xb7, 0xe8, 0xb5, 0x0f, 0xf0, 0x7c, 0xc9, 0x20, 0xf0, 0x78, 0x48, 0xe8,
0xb5, 0x0f, 0x20, 0x51, 0xfa, 0xe0, 0xff, 0xd0, 0x02, 0x68, 0x60, 0x85,
0x54, 0x68, 0xc9, 0x2b, 0xf0, 0x09, 0xa5, 0x54, 0x18, 0x49, 0xff, 0x69,
0x01, 0x85, 0x54, 0xa5, 0x5a, 0xf0, 0x04, 0xa5, 0x54, 0x91, 0x50, 0xa5,
0x54, 0x10, 0x02, 0xc6, 0x3f, 0x18, 0x65, 0x3e, 0x85, 0x3e, 0x90, 0x02,
0xe6, 0x3f, 0x60, 0x86, 0x56, 0xb5, 0x0f, 0xc9, 0x3c, 0xf0, 0x04, 0xc9,
0x3e, 0xd0, 0x05, 0x85, 0x58, 0xe8, 0xb5, 0x0f, 0x20, 0xbe, 0xf2, 0xb0,
0x09, 0x20, 0x5b, 0xf9, 0xe0, 0xff, 0xf0, 0x24, 0xd0, 0x0b, 0x86, 0x2f,
0x20, 0x60, 0xf8, 0xe0, 0xff, 0xf0, 0x1b, 0xa6, 0x2f, 0xe8, 0xb5, 0x0f,
0x20, 0xbe, 0xf2, 0xb0, 0xf8, 0xc9, 0x2b, 0xf0, 0x04, 0xc9, 0x2d, 0xd0,
0x0a, 0x20, 0x9e, 0xf7, 0xe0, 0xff, 0xd0, 0xe9, 0xa0, 0x03, 0x60, 0xa0,
0x00, 0xa5, 0x58, 0xc9, 0x3c, 0xf0, 0x08, 0xc9, 0x3e, 0xd0, 0x06, 0xa5,
0x3f, 0x85, 0x3e, 0x84, 0x3f, 0xb5, 0x0f, 0x99, 0x1d, 0x00, 0xf0, 0x0a,
0xc9, 0x20, 0xf0, 0x06, 0xe8, 0xc8, 0xe0, 0x0e, 0xd0, 0xef, 0xa9, 0x00,
0x99, 0x1d, 0x00, 0xa4, 0x56, 0xa9, 0x24, 0x99, 0x0f, 0x00, 0xc8, 0xa5,
0x3f, 0xf0, 0x03, 0x20, 0x82, 0xfa, 0xa5, 0x3e, 0x20, 0x82, 0xfa, 0xa2,
0x00, 0xb5, 0x1d, 0x99, 0x0f, 0x00, 0xf0, 0xba, 0xe8, 0xc8, 0xd0, 0xf5,
0xa0, 0x00, 0xc0, 0x06, 0xf0, 0x18, 0x20, 0xbe, 0xf2, 0x90, 0x09, 0x99,
0x1d, 0x00, 0xe8, 0xb5, 0x0f, 0xc8, 0xd0, 0xee, 0xa9, 0x20, 0x99, 0x1d,
0x00, 0xc8, 0xc0, 0x06, 0xd0, 0xf8, 0xa9, 0x1d, 0x85, 0x42, 0xa2, 0x00,
0x86, 0x43, 0xa9, 0x06, 0x85, 0x2e, 0xa9, 0x08, 0x85, 0x2d, 0xa5, 0x1d,
0xc9, 0x2e, 0xf0, 0x11, 0x20, 0x8a, 0xf9, 0xf0, 0x13, 0xa0, 0x06, 0xb1,
0x40, 0x85, 0x3e, 0xc8, 0xb1, 0x40, 0x85, 0x3f, 0x60, 0xa2, 0x03, 0x20,
0x8a, 0xf9, 0xd0, 0xed, 0xa5, 0x58, 0xd0, 0x4f, 0x20, 0xba, 0xf0, 0xa5,
0x2a, 0x85, 0x51, 0xa5, 0x29, 0xa6, 0x2b, 0xf0, 0x0a, 0x18, 0x69, 0x09,
0x90, 0x02, 0xe6, 0x51, 0xca, 0xd0, 0xf6, 0x85, 0x50, 0xe6, 0x2b, 0xa5,
0x2b, 0xc9, 0x55, 0x10, 0x32, 0xa9, 0x1d, 0x85, 0x5a, 0x85, 0x52, 0x20,
0x43, 0xf9, 0xc8, 0x8a, 0x91, 0x50, 0x60, 0x20, 0xba, 0xf0, 0xa9, 0x04,
0x85, 0x52, 0x85, 0x42, 0xa2, 0x00, 0x86, 0x43, 0xa9, 0x06, 0x85, 0x2e,
0xa5, 0x04, 0xc9, 0x2e, 0xd0, 0x02, 0xa2, 0x03, 0x20, 0x8a, 0xf9, 0xf0,
0x0b, 0x68, 0x68, 0xa0, 0x05, 0xd0, 0x02, 0xa0, 0x04, 0xa2, 0xff, 0x60,
0xa6, 0x04, 0xe0, 0x2e, 0xf0, 0x17, 0x38, 0xa5, 0xe9, 0xe9, 0x08, 0xb0,
0x02, 0xc6, 0xea, 0x85, 0xe9, 0xe6, 0xeb, 0xf0, 0xe6, 0x85, 0x50, 0xa5,
0xea, 0x85, 0x51, 0xd0, 0x1e, 0xa5, 0xed, 0x85, 0x51, 0xa5, 0xec, 0xa6,
0xee, 0xf0, 0x0a, 0x18, 0x69, 0x08, 0x90, 0x02, 0xe6, 0x51, 0xca, 0xd0,
0xf6, 0x85, 0x50, 0xe6, 0xee, 0xa5, 0xee, 0xc9, 0x20, 0x10, 0xc0, 0xa0,
0x00, 0x84, 0x53, 0xa2, 0x06, 0xb1, 0x52, 0x91, 0x50, 0xc8, 0xca, 0xd0,
0xf8, 0xa5, 0x3e, 0x91, 0x50, 0xc8, 0xa5, 0x3f, 0x91, 0x50, 0x60, 0xc9,
0x24, 0xd0, 0xa6, 0x84, 0x1e, 0x20, 0x18, 0xfa, 0xe0, 0xff, 0xf0, 0x9d,
0x85, 0x1d, 0xa0, 0x00, 0x84, 0x3f, 0xca, 0xca, 0xb5, 0x0f, 0xc9, 0x24,
0xf0, 0x06, 0x20, 0x51, 0xfa, 0x38, 0xb0, 0x03, 0x20, 0x6d, 0xfa, 0x99,
0x3e, 0x00, 0xc8, 0xc4, 0x1d, 0xd0, 0xe7, 0xa4, 0x1e, 0x60, 0xb5, 0xe9,
0x85, 0x40, 0xb5, 0xea, 0x85, 0x41, 0xb5, 0xeb, 0x85, 0x2c, 0x20, 0x2c,
0xfa, 0xe0, 0xff, 0x60, 0xa2, 0x00, 0xa9, 0x04, 0xb4, 0x0f, 0xc0, 0x28,
0xd0, 0x04, 0x18, 0x69, 0x03, 0xe8, 0x48, 0x20, 0x18, 0xfa, 0xa8, 0xca,
0xa5, 0x3c, 0xc9, 0x21, 0xf0, 0x04, 0xc9, 0x23, 0xd0, 0x01, 0xc8, 0x68,
0xe8, 0xf0, 0x56, 0x88, 0xf0, 0x03, 0x18, 0x69, 0x06, 0xa8, 0xb5, 0x0f,
0xf0, 0x04, 0xc9, 0x20, 0xd0, 0x14, 0xa5, 0x0f, 0xc9, 0x28, 0xf0, 0x41,
0xc0, 0x0f, 0x10, 0x3d, 0xc0, 0x07, 0xf0, 0x39, 0x30, 0x01, 0x88, 0x98,
0xaa, 0x60, 0xc9, 0x29, 0xd0, 0x0b, 0xa9, 0x20, 0x85, 0x0f, 0xe8, 0xb5,
0x0f, 0xc9, 0x2c, 0xd0, 0xd5, 0xb5, 0x0f, 0xc9, 0x2c, 0xd0, 0x1e, 0xe8,
0xb5, 0x0f, 0xc9, 0x58, 0xf0, 0x0d, 0xc9, 0x59, 0xd0, 0x13, 0xa5, 0x0f,
0xc9, 0x28, 0xf0, 0x0d, 0x95, 0x0d, 0xc8, 0xc8, 0xb5, 0x0d, 0xc9, 0x29,
0xf0, 0x03, 0xe8, 0xd0, 0xb1, 0xa2, 0xff, 0x60, 0xa0, 0x00, 0xe8, 0xc8,
0x20, 0x6e, 0xfa, 0xc9, 0xff, 0xd0, 0xf7, 0x98, 0x4a, 0xf0, 0xee, 0xc9,
0x03, 0xb0, 0xea, 0x60, 0xa5, 0x2c, 0xf0, 0xe5, 0xa2, 0x00, 0xa0, 0xff,
0xc8, 0xc4, 0x2e, 0xf0, 0xde, 0xb1, 0x40, 0xd1, 0x42, 0xf0, 0xf5, 0xe8,
0xe4, 0x2c, 0xf0, 0xd1, 0xa5, 0x40, 0x18, 0x65, 0x2d, 0x85, 0x40, 0x90,
0xe5, 0xe6, 0x41, 0xb0, 0xe1, 0x20, 0x6e, 0xfa, 0xc9, 0xff, 0xf0, 0xbd,
0x48, 0x20, 0x6d, 0xfa, 0xca, 0xc9, 0xff, 0xd0, 0x02, 0x68, 0x60, 0x85,
0x44, 0x68, 0x0a, 0x0a, 0x0a, 0x0a, 0x65, 0x44, 0x60, 0xe8, 0xb5, 0x0f,
0x49, 0x30, 0xc9, 0x0a, 0x90, 0x08, 0x69, 0x88, 0xc9, 0xfa, 0x90, 0x03,
0x29, 0x0f, 0x60, 0xa9, 0xff, 0x60, 0x48, 0x20, 0xd6, 0xfb, 0x20, 0x8a,
0xfa, 0x68, 0x29, 0x0f, 0x09, 0x30, 0xc9, 0x3a, 0x90, 0x02, 0x69, 0x06,
0x99, 0x0f, 0x00, 0xc8, 0x60, 0xbd, 0xe9, 0xfb, 0x85, 0x56, 0xbd, 0x21,
0xfc, 0x85, 0x57, 0xa2, 0x00, 0xa9, 0x00, 0xa0, 0x05, 0x06, 0x57, 0x26,
0x56, 0x2a, 0x88, 0xd0, 0xf8, 0x69, 0x40, 0x95, 0x0b, 0xa4, 0x5b, 0xf0,
0x03, 0x20, 0xef, 0xff, 0xe8, 0xe0, 0x03, 0xd0, 0xe4, 0x60, 0x20, 0xab,
0xf0, 0xf0, 0x03, 0x20, 0xc3, 0xf0, 0x20, 0xdc, 0xfa, 0x20, 0x81, 0xfb,
0x85, 0xf5, 0x84, 0xf6, 0xad, 0x11, 0xd0, 0x10, 0xf1, 0xad, 0x10, 0xd0,
0x20, 0x6e, 0xfb, 0xa1, 0xf5, 0xa8, 0x4a, 0x90, 0x09, 0x6a, 0xb0, 0x14,
0xc9, 0xa2, 0xf0, 0x10, 0x29, 0x87, 0x4a, 0xaa, 0xbd, 0xb8, 0xfc, 0x90,
0x03, 0x20, 0xd6, 0xfb, 0x29, 0x0f, 0xd0, 0x04, 0xa0, 0x80, 0xa9, 0x00,
0xaa, 0xbd, 0xfc, 0xfc, 0x85, 0x29, 0x29, 0x03, 0x85, 0x2a, 0x98, 0x20,
0x90, 0xfb, 0xa0, 0x00, 0x48, 0xb1, 0xf5, 0x20, 0xdc, 0xff, 0xa2, 0x01,
0x20, 0x7a, 0xfb, 0xc4, 0x2a, 0xc8, 0x90, 0xf1, 0xa2, 0x03, 0x86, 0x5b,
0xc0, 0x04, 0x90, 0xf0, 0x68, 0xaa, 0x20, 0x99, 0xfa, 0x20, 0x78, 0xfb,
0xa4, 0x2a, 0xa2, 0x06, 0xe0, 0x03, 0xf0, 0x1e, 0x06, 0x29, 0x90, 0x0e,
0xbd, 0x09, 0xfd, 0x20, 0xef, 0xff, 0xbd, 0x0f, 0xfd, 0xf0, 0x03, 0x20,
0xef, 0xff, 0xca, 0xd0, 0xe7, 0x86, 0x5b, 0x60, 0x88, 0x30, 0xe5, 0x20,
0xdc, 0xff, 0xa5, 0x29, 0xc9, 0xe8, 0xb1, 0xf5, 0x90, 0xf2, 0x20, 0x84,
0xfb, 0xaa, 0xe8, 0xd0, 0x01, 0xc8, 0x98, 0x20, 0xdc, 0xff, 0x8a, 0x4c,
0xdc, 0xff, 0x20, 0xe5, 0xfe, 0xa5, 0xf6, 0xa6, 0xf5, 0x20, 0x67, 0xfb,
0xa2, 0x03, 0x20, 0xe0, 0xfe, 0xca, 0xd0, 0xfa, 0x60, 0x38, 0xa5, 0x2a,
0xa4, 0xf6, 0xaa, 0x10, 0x01, 0x88, 0x65, 0xf5, 0x90, 0x01, 0xc8, 0x60,
0x85, 0x54, 0x29, 0x8f, 0xc9, 0x8a, 0xf0, 0x43, 0x0a, 0xc9, 0x10, 0xf0,
0x37, 0xa5, 0x54, 0x0a, 0x69, 0x80, 0x2a, 0x0a, 0x29, 0x1f, 0x69, 0x20,
0x48, 0xa5, 0x54, 0x29, 0x9f, 0xf0, 0x1b, 0x0a, 0xc9, 0x20, 0xf0, 0x10,
0x29, 0x06, 0xd0, 0x2f, 0x68, 0x29, 0x07, 0xc9, 0x03, 0x10, 0x02, 0x69,
0x02, 0x69, 0x1f, 0x60, 0x68, 0x29, 0x07, 0x69, 0x18, 0x60, 0x68, 0xaa,
0xbd, 0xb0, 0xfb, 0x60, 0x16, 0x21, 0x17, 0x18, 0xa5, 0x54, 0x4a, 0x4a,
0x4a, 0x4a, 0x60, 0x20, 0xd4, 0xfb, 0xc9, 0x0e, 0xd0, 0x02, 0x69, 0xfd,
0x69, 0x08, 0x60, 0x68, 0x60, 0x82, 0x1b, 0x83, 0x99, 0x82, 0x1b, 0x83,
0x99, 0x21, 0xa6, 0xa0, 0x1b, 0x4b, 0x1b, 0x4b, 0x99, 0xa6, 0xa6, 0xa0,
0xa4, 0x21, 0x73, 0x14, 0x95, 0x95, 0x14, 0x13, 0x15, 0x15, 0x10, 0x10,
0x13, 0x11, 0x54, 0x12, 0x53, 0x9d, 0x61, 0x1c, 0x1c, 0x7c, 0x0b, 0x2b,
0x09, 0x9d, 0x61, 0x1b, 0x98, 0x0c, 0x93, 0x64, 0x93, 0x9d, 0x61, 0x21,
0x4b, 0x20, 0x06, 0x20, 0x46, 0x02, 0x12, 0x02, 0x52, 0x72, 0x42, 0x72,
0x2c, 0xb2, 0x08, 0xb0, 0x48, 0x02, 0x26, 0x70, 0xf0, 0x70, 0xe0, 0x96,
0x12, 0x26, 0x18, 0x52, 0x86, 0xa6, 0xc6, 0xe6, 0x8a, 0x62, 0xe4, 0x68,
0x60, 0x32, 0x32, 0x32, 0x30, 0x82, 0x88, 0xe4, 0x06, 0x02, 0x02, 0x60,
0x86, 0xd8, 0xd8, 0xe4, 0xe4, 0x30, 0x30, 0x46, 0x86, 0x00, 0x30, 0x25,
0x19, 0x24, 0x28, 0x34, 0x28, 0x28, 0x21, 0x28, 0x28, 0x23, 0x19, 0x34,
0x30, 0x21, 0x38, 0x34, 0x36, 0x30, 0x30, 0x38, 0x34, 0x30, 0x24, 0x08,
0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78, 0x88, 0x98, 0xa8, 0xb8, 0xc8,
0xd8, 0xe8, 0xf8, 0x8a, 0x9a, 0xaa, 0xba, 0xca, 0xea, 0x00, 0x40, 0x60,
0x10, 0x30, 0x50, 0x70, 0x90, 0xb0, 0xd0, 0xf0, 0x14, 0x20, 0x40, 0x80,
0xa0, 0xc0, 0xe0, 0x01, 0x21, 0x41, 0x61, 0x81, 0xa1, 0xc1, 0xe1, 0x02,
0x22, 0x42, 0x62, 0x82, 0xa2, 0xc2, 0xe2, 0x00, 0x08, 0x00, 0x00, 0x04,
0x14, 0x14, 0x00, 0x10, 0x0c, 0x1c, 0x18, 0x2c, 0x04, 0x20, 0x54, 0x30,
0x0d, 0x80, 0x04, 0x90, 0x03, 0x22, 0x54, 0x33, 0x0d, 0x80, 0x04, 0x90,
0x04, 0x20, 0x54, 0x33, 0x0d, 0x80, 0x04, 0x90, 0x04, 0x20, 0x54, 0x3b,
0x0d, 0x80, 0x04, 0x90, 0x00, 0x22, 0x44, 0x33, 0x0d, 0xc8, 0x44, 0x00,
0x11, 0x22, 0x44, 0x33, 0x0d, 0xc8, 0x44, 0xa9, 0x01, 0x22, 0x44, 0x33,
0x0d, 0x80, 0x04, 0x90, 0x01, 0x22, 0x44, 0x33, 0x0d, 0x80, 0x04, 0x90,
0x26, 0x31, 0x87, 0x9a, 0x00, 0x21, 0x81, 0x82, 0x00, 0x00, 0x59, 0x4d,
0x91, 0x92, 0x86, 0x4a, 0x85, 0x9d, 0x2c, 0x29, 0x2c, 0x23, 0x28, 0x24,
0x59, 0x00, 0x58, 0x24, 0x24, 0x00, 0x22, 0x24, 0x25, 0x35, 0x36, 0x37,
0x04, 0x05, 0x05, 0x02, 0x05, 0x05, 0x04, 0x05, 0x0a, 0x0b, 0x0a, 0x0a,
0x4e, 0x4c, 0x58, 0x45, 0x4d, 0x52, 0x44, 0x49, 0x21, 0x24, 0x41, 0x56,
0x50, 0xf0, 0xf0, 0xf1, 0xf1, 0xf1, 0xf0, 0xfa, 0xf1, 0xff, 0xff, 0xf4,
0xf0, 0xf0, 0xde, 0xe4, 0xc6, 0x4e, 0x04, 0x9f, 0xc1, 0x57, 0x1a, 0x0e,
0x4a, 0x90, 0x84, 0x42, 0x57, 0x53, 0x3d, 0x4d, 0x20, 0x3a, 0x52, 0x52,
0x45, 0x4d, 0x4e, 0x45, 0x41, 0x44, 0x44, 0x53, 0x59, 0x4e, 0x4f, 0x56,
0x46, 0x53, 0x59, 0x4d, 0x4e, 0x45, 0x53, 0x53, 0x45, 0x57, 0x20, 0x4e,
0x45, 0x4b, 0x20, 0x59, 0x42, 0x20, 0x33, 0x2e, 0x31, 0x20, 0x52, 0x45,
0x44, 0x41, 0x53, 0x55, 0x52, 0x4b, 0x0d, 0x50, 0x53, 0x59, 0x58, 0x41,
0x4c, 0x48, 0x43, 0x5a, 0x49, 0x44, 0x42, 0x00, 0x56, 0x4e, 0x20, 0xe5,
0xfe, 0x20, 0xb9, 0xfe, 0x20, 0xbe, 0xfe, 0xa0, 0x07, 0xd9, 0x82, 0xfd,
0xf0, 0x5c, 0x88, 0xd0, 0xf8, 0xc9, 0x52, 0xd0, 0x06, 0x20, 0x9f, 0xfe,
0x6c, 0xf5, 0x00, 0xc9, 0x54, 0xd0, 0x3a, 0xa2, 0x08, 0xbd, 0x96, 0xfe,
0x95, 0xe0, 0xca, 0xd0, 0xf8, 0xa1, 0xf5, 0xf0, 0x5d, 0xa4, 0x2a, 0xc9,
0x20, 0xf0, 0x75, 0xc9, 0x60, 0xf0, 0x63, 0xc9, 0x4c, 0xf0, 0x78, 0xc9,
0x6c, 0xf0, 0x75, 0xc9, 0x40, 0xf0, 0x53, 0x29, 0x1f, 0x49, 0x14, 0xc9,
0x04, 0xf0, 0x02, 0xb1, 0xf5, 0x99, 0xe0, 0x00, 0x88, 0x10, 0xf8, 0x20,
0x9f, 0xfe, 0x4c, 0xe0, 0x00, 0xc9, 0x21, 0xd0, 0x06, 0x20, 0x1b, 0xff,
0x4c, 0x1e, 0xfe, 0xc9, 0x24, 0xd0, 0x97, 0x4c, 0x0f, 0xff, 0xa2, 0xfe,
0x20, 0xbe, 0xfe, 0x95, 0x11, 0xe8, 0xd0, 0xf8, 0x20, 0x51, 0xfa, 0x99,
0xef, 0x00, 0xa6, 0xf1, 0x9a, 0x4c, 0x1e, 0xfe, 0x28, 0x20, 0xaa, 0xfe,
0x68, 0x85, 0xf5, 0x68, 0x85, 0xf6, 0xba, 0x86, 0xf1, 0x20, 0x57, 0xfe,
0x20, 0xdc, 0xfa, 0x4c, 0x92, 0xfd, 0x18, 0x68, 0x85, 0xf0, 0x68, 0x85,
0xf5, 0x68, 0x85, 0xf6, 0x20, 0x82, 0xfb, 0x84, 0xf6, 0x18, 0x90, 0x14,
0x18, 0x20, 0x82, 0xfb, 0xaa, 0x98, 0x48, 0x8a, 0x48, 0xa0, 0x02, 0x18,
0xb1, 0xf5, 0xaa, 0x88, 0xb1, 0xf5, 0x86, 0xf6, 0x85, 0xf5, 0xb0, 0xf3,
0x4c, 0x1e, 0xfe, 0x20, 0xe5, 0xfe, 0xa2, 0x05, 0xbd, 0x82, 0xfd, 0x20,
0xef, 0xff, 0x20, 0xb9, 0xfe, 0xb5, 0xef, 0x20, 0xdc, 0xff, 0x20, 0xe0,
0xfe, 0xca, 0xd0, 0xec, 0xa5, 0xf0, 0xa2, 0x08, 0x0a, 0x90, 0x08, 0x48,
0xbd, 0x89, 0xfd, 0x20, 0xef, 0xff, 0x68, 0xca, 0xd0, 0xf2, 0x60, 0x18,
0xa0, 0x01, 0xb1, 0xf5, 0x20, 0x84, 0xfb, 0x85, 0xf5, 0x98, 0x38, 0xb0,
0xa1, 0x20, 0xaa, 0xfe, 0x38, 0xb0, 0x9d, 0xea, 0xea, 0x4c, 0x91, 0xfe,
0x4c, 0x83, 0xfe, 0xa5, 0xf0, 0x48, 0xa5, 0xf4, 0xa6, 0xf3, 0xa4, 0xf2,
0x28, 0x60, 0x85, 0xf4, 0x86, 0xf3, 0x84, 0xf2, 0x08, 0x68, 0x85, 0xf0,
0xba, 0x86, 0xf1, 0xd8, 0x60, 0xa9, 0x2d, 0x4c, 0xef, 0xff, 0x20, 0xea,
0xfe, 0x4c, 0xef, 0xff, 0x20, 0xe5, 0xfe, 0xa2, 0x00, 0xb5, 0x04, 0x20,
0xef, 0xff, 0xe8, 0xe0, 0x06, 0xd0, 0xf6, 0x20, 0xe0, 0xfe, 0xa5, 0xfb,
0x20, 0xe5, 0xff, 0xa5, 0xfa, 0x20, 0xdc, 0xff, 0xa9, 0x20, 0x4c, 0xef,
0xff, 0xa9, 0x0d, 0x4c, 0xef, 0xff, 0xad, 0x11, 0xd0, 0x10, 0xfb, 0xad,
0x10, 0xd0, 0x29, 0x7f, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xd8, 0x58, 0xa0, 0x7f, 0x8c, 0x12, 0xd0, 0xa9,
0xa7, 0x8d, 0x11, 0xd0, 0x8d, 0x13, 0xd0, 0xa9, 0x5c, 0x20, 0xef, 0xff,
0x20, 0x1b, 0xff, 0x90, 0xf6, 0xb0, 0xf9, 0x20, 0xe5, 0xfe, 0xa0, 0x01,
0x88, 0x30, 0xf8, 0x20, 0xbe, 0xfe, 0x99, 0x00, 0x02, 0xc9, 0x0d, 0xf0,
0x0b, 0xc9, 0x5f, 0xf0, 0xef, 0xc9, 0x1b, 0xf0, 0xda, 0xc8, 0x10, 0xeb,
0xa0, 0xff, 0xa9, 0x00, 0xaa, 0x0a, 0x85, 0x2b, 0xc8, 0xb9, 0x00, 0x02,
0xc9, 0x0d, 0xd0, 0x02, 0x38, 0x60, 0x09, 0x80, 0xc9, 0xae, 0x90, 0xf0,
0xf0, 0xec, 0xc9, 0xba, 0xf0, 0xe7, 0xc9, 0xd2, 0xf0, 0x3d, 0x86, 0x28,
0x86, 0x29, 0x84, 0x2a, 0xb9, 0x00, 0x02, 0x49, 0x30, 0xc9, 0x0a, 0x90,
0x06, 0x69, 0x88, 0xc9, 0xfa, 0x90, 0x11, 0x0a, 0x0a, 0x0a, 0x0a, 0xa2,
0x04, 0x0a, 0x26, 0x28, 0x26, 0x29, 0xca, 0xd0, 0xf8, 0xc8, 0xd0, 0xe0,
0xc4, 0x2a, 0xd0, 0x02, 0x18, 0x60, 0x24, 0x2b, 0x50, 0x10, 0xa5, 0x28,
0x81, 0x26, 0xe6, 0x26, 0xd0, 0xaf, 0xe6, 0x27, 0x4c, 0x41, 0xff, 0x6c,
0x24, 0x00, 0x30, 0x27, 0xa2, 0x02, 0xb5, 0x27, 0x95, 0x25, 0x95, 0x23,
0xca, 0xd0, 0xf7, 0xd0, 0x12, 0x20, 0xe5, 0xfe, 0xa5, 0x25, 0x20, 0xdc,
0xff, 0xa5, 0x24, 0x20, 0xdc, 0xff, 0xa9, 0x3a, 0x20, 0xef, 0xff, 0x20,
0xe0, 0xfe, 0xa1, 0x24, 0x20, 0xdc, 0xff, 0x86, 0x2b, 0xa5, 0x24, 0xc5,
0x28, 0xa5, 0x25, 0xe5, 0x29, 0xb0, 0xc5, 0xe6, 0x24, 0xd0, 0x02, 0xe6,
0x25, 0xa5, 0x24, 0x29, 0x07, 0x10, 0xcc, 0x00, 0x48, 0x4a, 0x4a, 0x4a,
0x4a, 0x20, 0xe5, 0xff, 0x68, 0x29, 0x0f, 0x09, 0x30, 0xc9, 0x3a, 0x90,
0x02, 0x69, 0x06, 0x2c, 0x12, 0xd0, 0x30, 0xfb, 0x8d, 0x12, 0xd0, 0x60,
0x00, 0x00, 0x00, 0x0f, 0x00, 0xff, 0x14, 0xfe,
];
start() {
return 0xe0;
}
end() {
return 0xff;
}
read(page: byte, off: byte): byte {
return this.rom[((page - 0xe0) << 8) | off];
}
write(page: byte, off: byte, val: byte) {
this.rom[((page - 0xe0) << 8) | off] = val;
}
getState() {
return {};
}
setState() {}
}

View File

@ -1,11 +0,0 @@
export var SYMBOLS = {
0xD010: 'KBD',
0xD011: 'KBDCR',
0xD012: 'DSP',
0xD013: 'DSPCR',
0xFF1F: 'GETLINE',
0xFFEF: 'ECHO',
0xFFDC: 'PRBYTE',
0xFFE5: 'PRHEX'
};

24
js/symbols.ts Normal file
View File

@ -0,0 +1,24 @@
/* Copyright 2010-2023 Will Scullin <scullin@scullinsteel.com>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation. No representations are made about the suitability of this
* software for any purpose. It is provided "as is" without express or
* implied warranty.
*/
import type { address } from './types';
export const SYMBOLS: Record<address, string> = {
0xd010: 'KBD',
0xd011: 'KBDCR',
0xd012: 'DSP',
0xd013: 'DSPCR',
0xff1f: 'GETLINE',
0xffef: 'ECHO',
0xffdc: 'PRBYTE',
0xffe5: 'PRHEX',
};

43
js/types.ts Normal file
View File

@ -0,0 +1,43 @@
/* Copyright 2023 Will Scullin <scullin@scullinsteel.com>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation. No representations are made about the suitability of this
* software for any purpose. It is provided "as is" without express or
* implied warranty.
*/
export type byte = number;
export type word = number;
export type address = word;
export type memory = Uint8Array | byte[];
export interface Memory {
/** Read a byte. */
read(page: byte, offset: byte): byte;
/** Write a byte. */
write(page: byte, offset: byte, value: byte): void;
}
/** A mapped region of memory. */
export interface MemoryPages extends Memory {
/** Start page. */
start(): byte;
/** End page, inclusive. */
end(): byte;
}
/**
* Extracts the members of a constant array as a type. Used as:
*
* @example
* const SOME_VALUES = ['a', 'b', 1, 2] as const;
* type SomeValues = MemberOf<typeof SOME_VALUES>; // 'a' | 'b' | 1 | 2
*/
export type MemberOf<T extends ReadonlyArray<unknown>> =
T extends ReadonlyArray<infer E> ? E : never;

View File

@ -1,311 +0,0 @@
/* Copyright 2010-2019 Will Scullin <scullin@scullinstekb.com>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation. No representations are made about the suitability of this
* software for any purpose. It is provided "as is" without express or
* implied warranty.
*/
import { debug, toHex } from '../util';
// keycode: [plain, cntl, shift]
var keymap = {
// Most of these won't happen
0x00: [0x00, 0x00, 0x00], //
0x01: [0x01, 0x01, 0x01], //
0x02: [0x02, 0x02, 0x02], //
0x03: [0x03, 0x03, 0x03], //
0x04: [0x04, 0x04, 0x04], //
0x05: [0x05, 0x05, 0x05], //
0x06: [0x06, 0x06, 0x06], //
0x07: [0x07, 0x07, 0x07], //
0x08: [0x5f, 0x5f, 0x5f], // BS
0x09: [0x09, 0x09, 0x09], // TAB
0x0A: [0x0A, 0x0A, 0x0A], //
0x0B: [0x0B, 0x0B, 0x0B], //
0x0C: [0x0C, 0x0C, 0x0C], //
0x0D: [0x0D, 0x0D, 0x0D], // CR
0x0E: [0x0E, 0x0E, 0x0E], //
0x0F: [0x0F, 0x0F, 0x0F], //
0x10: [0xff, 0xff, 0xff], // SHIFT
0x11: [0xff, 0xff, 0xff], // CTRL
0x12: [0xff, 0xff, 0xff], // OPTION
0x13: [0x13, 0x13, 0x13], //
0x14: [0x14, 0x14, 0x14], //
0x15: [0x15, 0x15, 0x15], //
0x16: [0x16, 0x16, 0x16], //
0x17: [0x17, 0x17, 0x18], //
0x18: [0x18, 0x18, 0x18], //
0x19: [0x19, 0x19, 0x19], //
0x1A: [0x1A, 0x1A, 0x1A], //
0x1B: [0x1B, 0x1B, 0x1B], // ESC
0x1C: [0x1C, 0x1C, 0x1C], //
0x1D: [0x1D, 0x1D, 0x1D], //
0x1E: [0x1E, 0x1E, 0x1E], //
0x1F: [0x1F, 0x1F, 0x1F], //
// Most of these besides space won't happen
0x20: [0x20, 0x20, 0x20], //
0x21: [0x21, 0x21, 0x21], //
0x22: [0x22, 0x22, 0x22], //
0x23: [0x23, 0x23, 0x23], //
0x24: [0x24, 0x24, 0x24], //
0x25: [0x5f, 0x5f, 0x5f], // <- left
0x26: [0x0B, 0x0B, 0x0B], // ^ up
0x27: [0x15, 0x15, 0x15], // -> right
0x28: [0x0A, 0x0A, 0x0A], // v down
0x29: [0x29, 0x29, 0x29], // )
0x2A: [0x2A, 0x2A, 0x2A], // *
0x2B: [0x2B, 0x2B, 0x2B], // +
0x2C: [0x2C, 0x2C, 0x3C], // , - <
0x2D: [0x2D, 0x2D, 0x5F], // - - _
0x2E: [0x2E, 0x2E, 0x3E], // . - >
0x2F: [0x2F, 0x2F, 0x3F], // / - ?
0x30: [0x30, 0x30, 0x29], // 0 - )
0x31: [0x31, 0x31, 0x21], // 1 - !
0x32: [0x32, 0x00, 0x40], // 2 - @
0x33: [0x33, 0x33, 0x23], // 3 - #
0x34: [0x34, 0x34, 0x24], // 4 - $
0x35: [0x35, 0x35, 0x25], // 5 - %
0x36: [0x36, 0x36, 0x5E], // 6 - ^
0x37: [0x37, 0x37, 0x26], // 7 - &
0x38: [0x38, 0x38, 0x2A], // 8 - *
0x39: [0x39, 0x39, 0x28], // 9 - (
0x3A: [0x3A, 0x3A, 0x3A], // :
0x3B: [0x3B, 0x3B, 0x3A], // ; - :
0x3C: [0x3C, 0x3C, 0x3C], // <
0x3D: [0x3D, 0x3D, 0x2B], // = - +
0x3E: [0x3E, 0x3E, 0x3E], // >
0x3F: [0x3F, 0x3F, 0x3F], // ?
// Alpha and control
0x40: [0x40, 0x00, 0x40], // @
0x41: [0x41, 0x01, 0x41], // A
0x42: [0x42, 0x02, 0x42], // B
0x43: [0x43, 0x03, 0x43], // C - BRK
0x44: [0x44, 0x04, 0x44], // D
0x45: [0x45, 0x05, 0x45], // E
0x46: [0x46, 0x06, 0x46], // F
0x47: [0x47, 0x07, 0x47], // G - BELL
0x48: [0x48, 0x08, 0x48], // H
0x49: [0x49, 0x09, 0x49], // I - TAB
0x4A: [0x4A, 0x0A, 0x4A], // J - NL
0x4B: [0x4B, 0x0B, 0x4B], // K - VT
0x4C: [0x4C, 0x0C, 0x4C], // L
0x4D: [0x4D, 0x0D, 0x4D], // M - CR
0x4E: [0x4E, 0x0E, 0x4E], // N
0x4F: [0x4F, 0x0F, 0x4F], // O
0x50: [0x50, 0x10, 0x50], // P
0x51: [0x51, 0x11, 0x51], // Q
0x52: [0x52, 0x12, 0x52], // R
0x53: [0x53, 0x13, 0x53], // S
0x54: [0x54, 0x14, 0x54], // T
0x55: [0x55, 0x15, 0x55], // U
0x56: [0x56, 0x16, 0x56], // V
0x57: [0x57, 0x17, 0x57], // W
0x58: [0x58, 0x18, 0x58], // X
0x59: [0x59, 0x19, 0x59], // Y
0x5A: [0x5A, 0x1A, 0x5A], // Z
// 0x5B: [0x5B, 0x1B, 0x5B], // [ - ESC
// 0x5C: [0x5C, 0x1C, 0x5C], // \
// 0x5D: [0x5D, 0x1D, 0x5D], // ]
0x5E: [0x5E, 0x1E, 0x5E], // ^
0x5F: [0x5F, 0x1F, 0x5F], // _
// Stray keys
0xBA: [0x3B, 0x3B, 0x3A], // ; - :
0xBB: [0x3D, 0x3D, 0x2B], // = - +
0xBC: [0x2C, 0x2C, 0x3C], // , - <
0xBD: [0x2D, 0x2D, 0x5F], // - - _
0xBE: [0x2E, 0x2E, 0x3E], // . - >
0xBF: [0x2F, 0x2F, 0x3F], // / - ?
0xDB: [0x5B, 0x5B, 0x5B], // [
0xDC: [0x5C, 0x5C, 0x5C], // \
0xDD: [0x5D, 0x5D, 0x5D], // ]
0xDE: [0x27, 0x27, 0x22], // ' - "
0xFF: [0xFF, 0xFF, 0xFF] // No comma line
};
export function mapKeyEvent(evt) {
var code = evt.keyCode;
if (code in keymap) {
return keymap[code][evt.shiftKey ? 2 : (evt.ctrlKey ? 1 : 0)];
}
debug('Unhandled key = ' + toHex(code));
return 0xFF;
}
export function KeyBoard(id, cpu, io, text) {
var keys =
[[['1','2','3','4','5','6','7','8','9','0',':','-','RESET'],
['ESC','Q','W','E','R','T','Y','U','I','O','P','FEED','RETURN'],
['CTRL','A','S','D','F','G','H','J','K','L',';','OUT','CLS'],
['SHIFT','Z','X','C','V','B','N','M',',','.','/','SHIFT'],
['&nbsp;']],
[['!','"','#','$','%','&','\'','(',')','0','*','=','RESET'],
['ESC','Q','W','E','R','T','Y','U','I','O','@','LINE','RETURN'],
['CTRL','A','S','D','F','BELL','H','J','K','L','+','RUB','CLS'],
['SHIFT','Z','X','C','V','B','^','M','<','>','?','SHIFT'],
['&nbsp;']]];
var shifted = false;
var controlled = false;
var kb = document.querySelector(id);
return {
shiftKey: function keyboard_shiftKey(down) {
shifted = down;
kb.querySelectorAll('.key-SHIFT').forEach(function(el) {
if (down) {
el.classList.add('active');
} else {
el.classList.remove('active');
}
});
},
controlKey: function keyboard_controlKey(down) {
controlled = down;
kb.querySelectorAll('.key-CTRL').forEach(function(el) {
if (down) {
el.classList.add('active');
} else {
el.classList.remove('active');
}
});
},
create: function keyboard_create() {
var x, y, row, key, key1, key2, label, label1, label2;
function buildLabel(k) {
var span = document.createElement('span');
span.innerHTML = k;
if (k.length > 1 && k.substr(0,1) != '&') {
span.classList.add('small');
}
return span;
}
function _mouseup(event) {
event.currentTarget.classList.remove('pressed');
}
function _mousedown(event) {
event.currentTarget.classList.add('pressed');
var key = event.currentTarget.dataSet[shifted ? 'key2' : 'key1'];
switch (key) {
case 'BELL':
key = 'G';
break;
case 'RETURN':
key = '\r';
break;
case 'LINE':
case 'FEED':
key = '\n';
break;
case 'RUB':
case 'OUT':
key = '_'; // 0x5f
break;
case '&nbsp;':
key = ' ';
break;
case 'ESC':
key = '\0x1b';
break;
default:
break;
}
if (key.length > 1) {
switch (key) {
case 'SHIFT':
shifted = !shifted;
kb.querySelectorAll('.key-SHIFT').forEach(function(el) {
el.classList.toggle('active');
});
break;
case 'CTRL':
controlled = !controlled;
kb.querySelectorAll('.key-CTRL').forEach(function(el) {
el.classList.toggle('active');
});
break;
case 'RESET':
cpu.reset();
break;
case 'CLS':
text.clear();
break;
default:
break;
}
} else {
if (controlled && key >= '@' && key <= '_') {
io.keyDown(key.charCodeAt(0) - 0x40);
} else {
io.keyDown(key.charCodeAt(0));
}
}
}
for (y = 0; y < 5; y++) {
row = document.createElement('div');
row.classList.add('row', 'row' + y);
kb.append(row);
for (x = 0; x < keys[0][y].length; x++) {
key1 = keys[0][y][x];
key2 = keys[1][y][x];
label = document.createElement('div');
label1 = buildLabel(key1);
label2 = buildLabel(key2);
key = document.createElement('div');
key.classList.add('key', 'key-' + key1.replace(/[&;]/g,''));
if (key1.length > 1) {
if (key1 != key2) {
key.classList.add('vcenter2');
} else {
key.classList.add('vcenter');
}
}
if (key1 != key2) {
key.classList.add('key-' + key2.replace(/[&;]/g,''));
label.append(label2);
label.append(document.createElement('br'));
}
label.append(label1);
key.append(label);
key.dataSet = {'key1': key1, 'key2': key2};
if (window.ontouchstart === undefined) {
key.addEventListener('mousedown', _mousedown);
key.addEventListener('mouseup', _mouseup);
key.addEventListener('mouseout', _mouseup);
} else {
key.addEventListener('touchstart', _mousedown);
key.addEventListener('touchend', _mouseup);
key.addEventListener('touchleave', _mouseup);
}
row.append(key);
}
}
}
};
}

339
js/ui/keyboard.ts Normal file
View File

@ -0,0 +1,339 @@
/* Copyright 2010-2019 Will Scullin <scullin@scullinstekb.com>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation. No representations are made about the suitability of this
* software for any purpose. It is provided "as is" without express or
* implied warranty.
*/
import CPU6502 from 'js/cpu6502';
import { debug, toHex } from '../util';
import Apple1IO from 'js/apple1io';
import { TextPage } from 'js/canvas1';
import { byte } from 'js/types';
// keycode: [plain, cntl, shift]
const keymap: Record<byte, readonly byte[]> = {
// Most of these won't happen
0x00: [0x00, 0x00, 0x00], //
0x01: [0x01, 0x01, 0x01], //
0x02: [0x02, 0x02, 0x02], //
0x03: [0x03, 0x03, 0x03], //
0x04: [0x04, 0x04, 0x04], //
0x05: [0x05, 0x05, 0x05], //
0x06: [0x06, 0x06, 0x06], //
0x07: [0x07, 0x07, 0x07], //
0x08: [0x5f, 0x5f, 0x5f], // BS
0x09: [0x09, 0x09, 0x09], // TAB
0x0a: [0x0a, 0x0a, 0x0a], //
0x0b: [0x0b, 0x0b, 0x0b], //
0x0c: [0x0c, 0x0c, 0x0c], //
0x0d: [0x0d, 0x0d, 0x0d], // CR
0x0e: [0x0e, 0x0e, 0x0e], //
0x0f: [0x0f, 0x0f, 0x0f], //
0x10: [0xff, 0xff, 0xff], // SHIFT
0x11: [0xff, 0xff, 0xff], // CTRL
0x12: [0xff, 0xff, 0xff], // OPTION
0x13: [0x13, 0x13, 0x13], //
0x14: [0x14, 0x14, 0x14], //
0x15: [0x15, 0x15, 0x15], //
0x16: [0x16, 0x16, 0x16], //
0x17: [0x17, 0x17, 0x18], //
0x18: [0x18, 0x18, 0x18], //
0x19: [0x19, 0x19, 0x19], //
0x1a: [0x1a, 0x1a, 0x1a], //
0x1b: [0x1b, 0x1b, 0x1b], // ESC
0x1c: [0x1c, 0x1c, 0x1c], //
0x1d: [0x1d, 0x1d, 0x1d], //
0x1e: [0x1e, 0x1e, 0x1e], //
0x1f: [0x1f, 0x1f, 0x1f], //
// Most of these besides space won't happen
0x20: [0x20, 0x20, 0x20], //
0x21: [0x21, 0x21, 0x21], //
0x22: [0x22, 0x22, 0x22], //
0x23: [0x23, 0x23, 0x23], //
0x24: [0x24, 0x24, 0x24], //
0x25: [0x5f, 0x5f, 0x5f], // <- left
0x26: [0x0b, 0x0b, 0x0b], // ^ up
0x27: [0x15, 0x15, 0x15], // -> right
0x28: [0x0a, 0x0a, 0x0a], // v down
0x29: [0x29, 0x29, 0x29], // )
0x2a: [0x2a, 0x2a, 0x2a], // *
0x2b: [0x2b, 0x2b, 0x2b], // +
0x2c: [0x2c, 0x2c, 0x3c], // , - <
0x2d: [0x2d, 0x2d, 0x5f], // - - _
0x2e: [0x2e, 0x2e, 0x3e], // . - >
0x2f: [0x2f, 0x2f, 0x3f], // / - ?
0x30: [0x30, 0x30, 0x29], // 0 - )
0x31: [0x31, 0x31, 0x21], // 1 - !
0x32: [0x32, 0x00, 0x40], // 2 - @
0x33: [0x33, 0x33, 0x23], // 3 - #
0x34: [0x34, 0x34, 0x24], // 4 - $
0x35: [0x35, 0x35, 0x25], // 5 - %
0x36: [0x36, 0x36, 0x5e], // 6 - ^
0x37: [0x37, 0x37, 0x26], // 7 - &
0x38: [0x38, 0x38, 0x2a], // 8 - *
0x39: [0x39, 0x39, 0x28], // 9 - (
0x3a: [0x3a, 0x3a, 0x3a], // :
0x3b: [0x3b, 0x3b, 0x3a], // ; - :
0x3c: [0x3c, 0x3c, 0x3c], // <
0x3d: [0x3d, 0x3d, 0x2b], // = - +
0x3e: [0x3e, 0x3e, 0x3e], // >
0x3f: [0x3f, 0x3f, 0x3f], // ?
// Alpha and control
0x40: [0x40, 0x00, 0x40], // @
0x41: [0x41, 0x01, 0x41], // A
0x42: [0x42, 0x02, 0x42], // B
0x43: [0x43, 0x03, 0x43], // C - BRK
0x44: [0x44, 0x04, 0x44], // D
0x45: [0x45, 0x05, 0x45], // E
0x46: [0x46, 0x06, 0x46], // F
0x47: [0x47, 0x07, 0x47], // G - BELL
0x48: [0x48, 0x08, 0x48], // H
0x49: [0x49, 0x09, 0x49], // I - TAB
0x4a: [0x4a, 0x0a, 0x4a], // J - NL
0x4b: [0x4b, 0x0b, 0x4b], // K - VT
0x4c: [0x4c, 0x0c, 0x4c], // L
0x4d: [0x4d, 0x0d, 0x4d], // M - CR
0x4e: [0x4e, 0x0e, 0x4e], // N
0x4f: [0x4f, 0x0f, 0x4f], // O
0x50: [0x50, 0x10, 0x50], // P
0x51: [0x51, 0x11, 0x51], // Q
0x52: [0x52, 0x12, 0x52], // R
0x53: [0x53, 0x13, 0x53], // S
0x54: [0x54, 0x14, 0x54], // T
0x55: [0x55, 0x15, 0x55], // U
0x56: [0x56, 0x16, 0x56], // V
0x57: [0x57, 0x17, 0x57], // W
0x58: [0x58, 0x18, 0x58], // X
0x59: [0x59, 0x19, 0x59], // Y
0x5a: [0x5a, 0x1a, 0x5a], // Z
// 0x5B: [0x5B, 0x1B, 0x5B], // [ - ESC
// 0x5C: [0x5C, 0x1C, 0x5C], // \
// 0x5D: [0x5D, 0x1D, 0x5D], // ]
0x5e: [0x5e, 0x1e, 0x5e], // ^
0x5f: [0x5f, 0x1f, 0x5f], // _
// Stray keys
0xba: [0x3b, 0x3b, 0x3a], // ; - :
0xbb: [0x3d, 0x3d, 0x2b], // = - +
0xbc: [0x2c, 0x2c, 0x3c], // , - <
0xbd: [0x2d, 0x2d, 0x5f], // - - _
0xbe: [0x2e, 0x2e, 0x3e], // . - >
0xbf: [0x2f, 0x2f, 0x3f], // / - ?
0xdb: [0x5b, 0x5b, 0x5b], // [
0xdc: [0x5c, 0x5c, 0x5c], // \
0xdd: [0x5d, 0x5d, 0x5d], // ]
0xde: [0x27, 0x27, 0x22], // ' - "
0xff: [0xff, 0xff, 0xff], // No comma line
} as const;
const keys = [
[
['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', ':', '-', 'RESET'],
['ESC', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', 'FEED', 'RETURN'],
['CTRL', 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ';', 'OUT', 'CLS'],
['SHIFT', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', ',', '.', '/', 'SHIFT'],
['&nbsp;'],
],
[
['!', '"', '#', '$', '%', '&', "'", '(', ')', '0', '*', '=', 'RESET'],
['ESC', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', '@', 'LINE', 'RETURN'],
['CTRL', 'A', 'S', 'D', 'F', 'BELL', 'H', 'J', 'K', 'L', '+', 'RUB', 'CLS'],
['SHIFT', 'Z', 'X', 'C', 'V', 'B', '^', 'M', '<', '>', '?', 'SHIFT'],
['&nbsp;'],
],
] as const;
export function mapKeyEvent(evt: KeyboardEvent) {
const code = evt.keyCode;
if (code in keymap) {
return keymap[code][evt.shiftKey ? 2 : evt.ctrlKey ? 1 : 0];
}
debug('Unhandled key = ' + toHex(code));
return 0xff;
}
export class KeyBoard {
shifted = false;
controlled = false;
kb: HTMLDivElement;
constructor(
id: string,
private cpu: CPU6502,
private io: Apple1IO,
private text: TextPage,
) {
this.kb = document.querySelector<HTMLDivElement>(id)!;
}
shiftKey(down: boolean) {
this.shifted = down;
this.kb.querySelectorAll('.key-SHIFT').forEach(function (el) {
if (down) {
el.classList.add('active');
} else {
el.classList.remove('active');
}
});
}
controlKey(down: boolean) {
this.controlled = down;
this.kb.querySelectorAll('.key-CTRL').forEach(function (el) {
if (down) {
el.classList.add('active');
} else {
el.classList.remove('active');
}
});
}
create() {
let x, y, row, key, key1, key2, label, label1, label2;
function buildLabel(k: string) {
const span = document.createElement('span');
span.innerHTML = k;
if (k.length > 1 && !k.startsWith('&')) {
span.classList.add('small');
}
return span;
}
const _mouseup = (event: Event) => {
if (!(event.currentTarget instanceof HTMLElement)) {
return;
}
event.currentTarget.classList.remove('pressed');
};
const _mousedown = (event: Event) => {
if (!(event.currentTarget instanceof HTMLElement)) {
return;
}
event.currentTarget.classList.add('pressed');
let key = event.currentTarget.dataset[this.shifted ? 'key2' : 'key1'];
if (!key) {
return;
}
switch (key) {
case 'BELL':
key = 'G';
break;
case 'RETURN':
key = '\r';
break;
case 'LINE':
case 'FEED':
key = '\n';
break;
case 'RUB':
case 'OUT':
key = '_'; // 0x5f
break;
case '&nbsp;':
key = ' ';
break;
case 'ESC':
key = '\0x1b';
break;
default:
break;
}
if (key.length > 1) {
switch (key) {
case 'SHIFT':
this.shifted = !this.shifted;
this.kb
.querySelectorAll<HTMLElement>('.key-SHIFT')
.forEach(function (el: HTMLElement) {
el.classList.toggle('active');
});
break;
case 'CTRL':
this.controlled = !this.controlled;
this.kb.querySelectorAll('.key-CTRL').forEach(function (el) {
el.classList.toggle('active');
});
break;
case 'RESET':
this.cpu.reset();
break;
case 'CLS':
this.text.clear();
break;
default:
break;
}
} else {
if (this.controlled && key >= '@' && key <= '_') {
this.io.keyDown(key.charCodeAt(0) - 0x40);
} else {
this.io.keyDown(key.charCodeAt(0));
}
}
};
for (y = 0; y < 5; y++) {
row = document.createElement('div');
row.classList.add('row', 'row' + y);
this.kb.append(row);
for (x = 0; x < keys[0][y].length; x++) {
key1 = keys[0][y][x];
key2 = keys[1][y][x];
label = document.createElement('div');
label1 = buildLabel(key1);
label2 = buildLabel(key2);
key = document.createElement('div');
key.classList.add('key', 'key-' + key1.replace(/[&;]/g, ''));
if (key1.length > 1) {
if (key1 !== key2) {
key.classList.add('vcenter2');
} else {
key.classList.add('vcenter');
}
}
if (key1 !== key2) {
key.classList.add('key-' + key2.replace(/[&;]/g, ''));
label.append(label2);
label.append(document.createElement('br'));
}
label.append(label1);
key.append(label);
key.dataset['key1'] = key1;
key.dataset['key2'] = key2;
if (window.ontouchstart === undefined) {
key.addEventListener('mousedown', _mousedown);
key.addEventListener('mouseup', _mouseup);
key.addEventListener('mouseout', _mouseup);
} else {
key.addEventListener('touchstart', _mousedown);
key.addEventListener('touchend', _mouseup);
key.addEventListener('touchleave', _mouseup);
}
row.append(key);
}
}
}
}

View File

@ -1,79 +0,0 @@
/* Copyright 2010-2019 Will Scullin <scullin@scullinsteel.com>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation. No representations are made about the suitability of this
* software for any purpose. It is provided "as is" without express or
* implied warranty.
*/
var hex_digits = '0123456789ABCDEF';
var bin_digits = '01';
export function allocMem(size) {
var result;
if (window.Uint8Array) {
result = new Uint8Array(size);
} else {
result = new Array(size);
}
return result;
}
export function allocMemPages(pages) {
return allocMem(pages * 0x100);
}
export function debug(msg) {
/*eslint no-console: 0 */
if (typeof(console) != 'undefined' && 'log' in console) {
console.log(msg);
} else if (typeof(environment) == 'object') { // rhino shell
print(msg);
}
}
export function toHex(v, n) {
if (!n) {
n = v < 256 ? 2 : 4;
}
var result = '';
for (var idx = 0; idx < n; idx++) {
result = hex_digits[v & 0x0f] + result;
v >>= 4;
}
return result;
}
export function toBinary(v) {
var result = '';
for (var idx = 0; idx < 8; idx++) {
result = bin_digits[v & 0x01] + result;
v >>= 1;
}
return result;
}
// From http://www.netlobo.com/url_query_string_javascript.html
export function gup( name )
{
name = name.replace(/[[]/,'\\[').replace(/[\]]/,'\\]');
var regexS = '[\\?&]'+name+'=([^&#]*)';
var regex = new RegExp( regexS );
var results = regex.exec( window.location.href );
if( !results )
return '';
else
return results[1];
}
export function hup() {
var regex = new RegExp('#(.*)');
var results = regex.exec(window.location.hash);
if ( !results )
return '';
else
return decodeURIComponent(results[1]);
}

67
js/util.ts Normal file
View File

@ -0,0 +1,67 @@
/* Copyright 2010-2023 Will Scullin <scullin@scullinsteel.com>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation. No representations are made about the suitability of this
* software for any purpose. It is provided "as is" without express or
* implied warranty.
*/
import { byte, word } from './types';
const hex_digits = '0123456789ABCDEF';
const bin_digits = '01';
export function allocMem(size: word) {
let result;
if (window.Uint8Array) {
result = new Uint8Array(size);
} else {
result = new Array(size);
}
return result;
}
export function allocMemPages(pages: byte) {
return allocMem(pages * 0x100);
}
export function debug(...msg: unknown[]) {
/*eslint no-console: 0 */
console.log(...msg);
}
export function toHex(v: byte, n?: 2 | 4) {
if (!n) {
n = v < 256 ? 2 : 4;
}
let result = '';
for (let idx = 0; idx < n; idx++) {
result = hex_digits[v & 0x0f] + result;
v >>= 4;
}
return result;
}
export function toBinary(v: byte) {
let result = '';
for (let idx = 0; idx < 8; idx++) {
result = bin_digits[v & 0x01] + result;
v >>= 1;
}
return result;
}
export function gup(name: string) {
const params = new URLSearchParams(window.location.search);
return params.get(name);
}
export function hup() {
const regex = new RegExp('#(.*)');
const results = regex.exec(window.location.hash);
if (!results) return '';
else return decodeURIComponent(results[1]);
}

17495
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -28,11 +28,20 @@
"devDependencies": {
"@babel/core": "^7.4.0",
"@babel/preset-env": "^7.4.2",
"@types/micromodal": "^0.3.3",
"@typescript-eslint/eslint-plugin": "^6.2.1",
"@types/jest": "^29.5.3",
"ajv": "^6.9.2",
"babel-jest": "^26.3.0",
"babel-jest": "^29.5.0",
"eslint": "^8.3.0",
"jest": "^27.3.1",
"eslint-config-prettier": "^9.0.0",
"eslint-plugin-jest": "^27.2.3",
"eslint-plugin-prettier": "^5.0.0",
"jest": "^29.5.0",
"node-forge": "^1.3.0",
"ts-jest": "^29.1.1",
"ts-loader": "^9.4.4",
"typescript": "^5.1.6",
"webpack": "^5.64.4",
"webpack-cli": "^4.9.1",
"webpack-dev-server": "^4.6.0"

View File

@ -1,48 +0,0 @@
import CPU6502 from '../js/cpu6502';
import Test6502 from './roms/6502test';
import Test65C02 from './roms/65C02test';
import { toHex } from '../js/util';
describe.skip('CPU', function () {
var cpu;
var lastPC = 0;
var done = false;
function traceCB() {
var pc = cpu.getPC();
done = lastPC == pc;
lastPC = pc;
}
describe('6502', function () {
it('completes the test ROM', function () {
cpu = new CPU6502();
var test = new Test6502();
cpu.addPageHandler(test);
cpu.setPC(0x400);
do {
cpu.stepCyclesDebug(1000, traceCB);
} while (!done);
expect(toHex(lastPC)).toEqual(toHex(0x3469));
});
});
describe('65C02', function () {
it('completes the test ROM', function () {
cpu = new CPU6502({'65C02': true});
var test = new Test65C02();
cpu.addPageHandler(test);
cpu.setPC(0x400);
do {
cpu.stepCyclesDebug(1000, traceCB);
} while (!done);
expect(toHex(lastPC)).toEqual(toHex(0x24f1));
});
});
});

48
test/cpu.spec.ts Normal file
View File

@ -0,0 +1,48 @@
import CPU6502, { FLAVOR_ROCKWELL_65C02 } from '../js/cpu6502';
// From https://github.com/Klaus2m5/6502_65C02_functional_tests
import Test6502 from './roms/6502test';
import Test65C02 from './roms/65C02test';
import { toHex } from '../js/util';
describe('CPU', function () {
let cpu: CPU6502;
let lastPC = 0;
let done = false;
function traceCB() {
const pc = cpu.getPC();
done = lastPC === pc;
lastPC = pc;
}
describe('6502', function () {
it('completes the test ROM', function () {
cpu = new CPU6502();
const test = new Test6502();
cpu.addPageHandler(test);
cpu.setPC(0x400);
do {
cpu.stepCyclesDebug(1000, traceCB);
} while (!done);
expect(toHex(lastPC)).toEqual(toHex(0x3469));
});
});
describe('65C02', function () {
it('completes the test ROM', function () {
cpu = new CPU6502({ flavor: FLAVOR_ROCKWELL_65C02 });
const test = new Test65C02();
cpu.addPageHandler(test);
cpu.setPC(0x400);
do {
cpu.stepCyclesDebug(1000, traceCB);
} while (!done);
expect(toHex(lastPC)).toEqual(toHex(0x24f1));
});
});
});

File diff suppressed because it is too large Load Diff

3254
test/cpu6502.spec.ts Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

29
test/roms/6502test.ts Normal file
View File

@ -0,0 +1,29 @@
// From https://github.com/Klaus2m5/6502_65C02_functional_tests
import fs from 'fs';
import path from 'path';
import { MemoryPages, byte } from '../../js/types';
export default class Test6502 implements MemoryPages {
private data: Buffer;
constructor() {
this.data = fs.readFileSync(path.join(__dirname, '6502_functional_test.bin'));
}
start = () => {
return 0x00;
};
end = () => {
return 0xff;
};
read = (page: byte, off: byte) => {
return this.data[page << 8 | off];
};
write = (page: byte, off: byte, val: byte) => {
this.data[page << 8 | off] = val;
};
}

Binary file not shown.

File diff suppressed because it is too large Load Diff

29
test/roms/65C02test.ts Normal file
View File

@ -0,0 +1,29 @@
// From https://github.com/Klaus2m5/6502_65C02_functional_tests
import fs from 'fs';
import path from 'path';
import { MemoryPages, byte } from '../../js/types';
export default class Test65C02 implements MemoryPages {
private data: Buffer;
constructor() {
this.data = fs.readFileSync(path.join(__dirname, '65C02_extended_opcodes_test.bin'));
}
start = () => {
return 0x00;
};
end = () => {
return 0xff;
};
read = (page: byte, off: byte) => {
return this.data[page << 8 | off];
};
write = (page: byte, off: byte, val: byte) => {
this.data[page << 8 | off] = val;
};
}

6
test/util/asserts.ts Normal file
View File

@ -0,0 +1,6 @@
import { byte } from "../../js/types";
export const assertByte = (b: byte) => {
expect(b <= 0xff).toEqual(true);
expect(b >= 0x00).toEqual(true);
};

56
test/util/bios.ts Normal file
View File

@ -0,0 +1,56 @@
import { MemoryPages, byte } from "../../js/types";
import { assertByte } from "./asserts";
export class Program implements MemoryPages {
private data: Buffer;
constructor(private page: byte, code: byte[]) {
this.data = Buffer.from(code);
}
start() {
return this.page;
}
end() {
return this.page;
}
read(page: byte, off: byte) {
assertByte(page);
assertByte(off);
return this.data[off];
}
write(_page: byte, _off: byte, _val: byte) {
// do nothing
}
}
export const bios = new Program(
0xff,
[
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x45, 0x4c, 0x4c,
0x4f, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
0x00, 0x04, 0x00, 0xff,
]
);

34
test/util/cpu.ts Normal file
View File

@ -0,0 +1,34 @@
import { flags, CpuState } from "js/cpu6502";
import { byte } from "js/types";
import { toHex } from "js/util";
export const dumpStatusRegister = (sr: byte) =>
[
sr & flags.N ? "N" : "-",
sr & flags.V ? "V" : "-",
sr & flags.X ? "X" : "-",
sr & flags.B ? "B" : "-",
sr & flags.D ? "D" : "-",
sr & flags.I ? "I" : "-",
sr & flags.Z ? "Z" : "-",
sr & flags.C ? "C" : "-",
].join("");
const detail = !!process.env.JEST_DETAIL;
export function toReadableState(state: CpuState) {
if (detail) {
const { pc, sp, a, x, y, s } = state;
return {
pc: toHex(pc, 4),
sp: toHex(sp),
a: toHex(a),
x: toHex(x),
y: toHex(y),
s: dumpStatusRegister(s),
};
} else {
return state;
}
}

60
test/util/memory.ts Normal file
View File

@ -0,0 +1,60 @@
import { MemoryPages, byte, word } from "js/types";
import { assertByte } from "./asserts";
export type Log = [address: word, value: byte, types: "read" | "write"];
export class TestMemory implements MemoryPages {
private data: Buffer;
private logging: boolean = false;
private log: Log[] = [];
constructor(private size: number) {
this.data = Buffer.alloc(size << 8);
}
start() {
return 0;
}
end() {
return this.size - 1;
}
read(page: byte, off: byte) {
assertByte(page);
assertByte(off);
const val = this.data[(page << 8) | off];
if (this.logging) {
this.log.push([(page << 8) | off, val, "read"]);
}
return val;
}
write(page: byte, off: byte, val: byte) {
assertByte(page);
assertByte(off);
assertByte(val);
if (this.logging) {
this.log.push([(page << 8) | off, val, "write"]);
}
this.data[(page << 8) | off] = val;
}
reset() {
this.log = [];
}
logStart() {
this.log = [];
this.logging = true;
}
logStop() {
this.logging = false;
}
getLog() {
return this.log;
}
}

43
tsconfig.json Normal file
View File

@ -0,0 +1,43 @@
{
"compilerOptions": {
"jsx": "react",
"jsxFactory": "h",
"jsxFragmentFactory": "Fragment",
"module": "esnext",
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"target": "es6",
"lib": ["DOM", "ES6"],
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"exactOptionalPropertyTypes": true,
"moduleResolution": "node",
"resolveJsonModule": true,
"sourceMap": true,
"outDir": "dist",
"baseUrl": ".",
"allowJs": true,
"paths": {
"*": [
"node_modules/*",
"types/*"
],
"js/*": [
"js/*"
],
"json/*": [
"json/*"
],
"test/*": [
"test/*"
]
}
},
"include": [
"js/**/*",
"test/**/*",
"types/**/*",
"*.config.js"
]
}

View File

@ -9,9 +9,25 @@ module.exports =
},
output: {
path: path.resolve('dist/'),
library: 'Apple1',
libraryExport: 'Apple1',
libraryTarget: 'var'
},
module: {
rules: [
{
test: /\.ts$/i,
use: [
{
loader: 'ts-loader'
},
],
exclude: /node_modules/,
}
]
},
resolve: {
extensions: ['.ts', '.js'],
alias: {
js: path.resolve(__dirname, 'js/')
}
},
devServer: {
compress: true,