diff --git a/app.ts b/app.ts index efaa2d9d..4c06207c 100644 --- a/app.ts +++ b/app.ts @@ -15,14 +15,23 @@ namespace microcode { basic.pause(500) const buf = this.load(SAVESLOT_AUTO) + let prog: ProgramDefn = undefined if (buf) { - const prog = ProgramDefn.fromBuffer(new BufferReader(buf)) - runProgram(prog) + try { + prog = ProgramDefn.fromBuffer(new BufferReader(buf)) + } catch (e) { + console.log("invalid auto-save, clearing") + this.save(SAVESLOT_AUTO, new ProgramDefn().toBuffer()) + } } - this.host_ = new AppHost(this) - - this.openHome() + if (!__screenhelpers.displayPresent()) { + if (prog) runProgram(prog) + } + else { + this.host_ = new AppHost(this) + this.openHome() + } } public save(slot: string, buf: Buffer) { @@ -70,8 +79,9 @@ namespace microcode { const wasRunning = isProgramRunning() if (wasRunning) stopProgram() settings.writeBuffer(SAVESLOT_AUTO, buf) - if (wasRunning) + if (wasRunning) { runProgram(ProgramDefn.fromBuffer(new BufferReader(buf))) + } } export function stopProgram() { diff --git a/apphost.ts b/apphost.ts index 25b90789..4bc71408 100644 --- a/apphost.ts +++ b/apphost.ts @@ -7,7 +7,6 @@ namespace microcode { id: string | number, nullIfMissing?: boolean, ): Bitmap | undefined { - if (id == "wordLogo") return wordLogo const bitmap = icons.get(id, !!nullIfMissing) if (bitmap) return bitmap if (nullIfMissing) return undefined diff --git a/assets.ts b/assets.ts index 8d6ef536..3890e9df 100644 --- a/assets.ts +++ b/assets.ts @@ -78,8 +78,9 @@ namespace microcode { return null } - // Not packable: apphost.ts returns this const directly for "wordLogo". - export const wordLogo = bmp` + //% packable + //% whenUsed + export const microcodeLogo = bmp` .111111.......111111...1111.......................................................1111111.................................1111.................. 11bbbbbb.....11bbbbbb.11bbbb....................................................111bbbbbbb1..............................11bbbb................. 1bbbbbbbb...11bbbbbbbf1bbbbbf..................................................11bbbbbbbbbbb.............................1bbbbbf................ @@ -216,7 +217,7 @@ namespace icondb { }) */ - // Not packable: carImages in robot.ts returns this const directly. + //% packable whenUsed export const arm_open = bmp` . . . . . . . . . . c c c . . . . . . . . . . . c c b b b c c . @@ -236,7 +237,7 @@ namespace icondb { . . . . . . . . . . c c c . . . ` - // Not packable: carImages in robot.ts returns this const directly. + //% packable whenUsed export const arm_close = bmp` . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . @@ -316,7 +317,7 @@ namespace icondb { //TODO: I think this is actually the Jacdac logo? // user-interface-base/coreAssets.ts has the real microbitLogo - // Use "microbitLogo" and at the end of this function it will check user-interface-base and fetch it. + // Use "cd" and at the end of this function it will check user-interface-base and fetch it. // Not packable: web-only art; whenUsed drops it from the device build. //% whenUsed diff --git a/docs.ts b/docs.ts index 42d4d909..c06cecc2 100644 --- a/docs.ts +++ b/docs.ts @@ -43,7 +43,7 @@ namespace docs { appendImage(images, "image", "home", screen()) renderIcons(images) const samples = renderSamples(images) - appendImage(images, "image", "microcode", microcode.wordLogo) + appendImage(images, "image", "microcode", microcode.microcodeLogo) appendImage(images, "image", "microbit", microcode.microbitLogo) appendImage( images, diff --git a/host.ts b/host.ts index d9d334a0..9651b2aa 100644 --- a/host.ts +++ b/host.ts @@ -46,9 +46,22 @@ namespace microcode { Tid.TID_FILTER_PIN_2, ] + const line2tids: IdMap = { + [robot.robots.RobotLineState.None]: Tid.TID_FILTER_LINE_NEITHER, + [robot.robots.RobotLineState.Left]: Tid.TID_FILTER_LINE_LEFT, + [robot.robots.RobotLineState.Right]: Tid.TID_FILTER_LINE_RIGHT, + [robot.robots.RobotLineState.Both]: Tid.TID_FILTER_LINE_BOTH, + [robot.robots.RobotLineState.LostLeft]: + Tid.TID_FILTER_LINE_NEITHER_LEFT, + [robot.robots.RobotLineState.LostRight]: + Tid.TID_FILTER_LINE_NEITHER_RIGHT, + } + export class MicrobitHost implements RuntimeHost { /** Monotonic token observed by cancellable LED display work. */ private displayVersion = 0 + private carWallValue = 0 + private carLineValue = 0 constructor() { this._handler = (s: number, f: number) => {} @@ -90,7 +103,7 @@ namespace microcode { //TODO: This is a hack to fix the onGesture events not working. // In GDB we see that the CPP functions onGesture, MicrobitAccelerometer constructor and the LSM303Accelerometer constructor are invoked. // In spite of this the __handler is not invoked. For some reason this basic.pause(0) fixes this issue (possibly because of it briefly yielding?) - basic.pause(0) + basic.pause(0) // this is due to the queueing problem in CODAL. see: https://github.com/microsoft/pxt-microbit/issues/7083 input.onGesture(g, () => { this._handler( Tid.TID_SENSOR_ACCELEROMETER, @@ -99,9 +112,8 @@ namespace microcode { }) }) - radio.onReceivedNumber(radioNum => { - this._handler(Tid.TID_SENSOR_RADIO_RECEIVE, radioNum) - }) + radio.setGroup(1) + radio.onReceivedNumber(radioNum => this.handleRadioNumber(radioNum)) input.onSound(DetectedSound.Loud, () => { this._handler(Tid.TID_SENSOR_MICROPHONE, Tid.TID_FILTER_LOUD) @@ -135,11 +147,31 @@ namespace microcode { value = input.soundLevel() max = 255 break + case Tid.TID_SENSOR_LINE: + value = this.carLineValue + break } if (!normalized) return value return Math.abs(value) / (Math.abs(min) + max) } + private handleRadioNumber(radioValue: number) { + const obstacleState = robot.robots.RobotCompactCommand.ObstacleState + const lineState = robot.robots.RobotCompactCommand.LineState + + if (radioValue > obstacleState && radioValue < lineState) { + this.carWallValue = radioValue - obstacleState + this._handler(Tid.TID_SENSOR_CAR_WALL, this.carWallValue) + } else if (radioValue >= lineState) { + this.carLineValue = radioValue - lineState + const lineTid = line2tids[this.carLineValue] + if (lineTid !== undefined) + this._handler(Tid.TID_SENSOR_LINE, lineTid) + } else { + this._handler(Tid.TID_SENSOR_RADIO_RECEIVE, radioValue) + } + } + private _handler: (sensorTid: number, filter: number) => void registerOnSensorEvent( handler: (sensorTid: number, filter: number) => void, @@ -220,6 +252,9 @@ namespace microcode { music.PlaybackMode.UntilDone, ) return + case Tid.TID_ACTUATOR_CAR: + if (param !== undefined) radio.sendNumber(param) + return case Tid.TID_ACTUATOR_MUSIC: music.stopAllSounds() music.play( @@ -290,35 +325,3 @@ namespace microcode { export const runtimeHost: RuntimeHost = new MicrobitHost() } - -/* - - // TODO: convert this to external sensor with events and values - // TODO: and lift out - const radioVal = this.getRadioVal() - if ( - sensor == Tid.TID_SENSOR_CAR_WALL || - sensor == Tid.TID_SENSOR_LINE - ) { - // this hack separates radio ranges used to communicate with robot car - if ( - robot.robots.RobotCompactCommand.ObstacleState < - radioVal - ) - if (sensor == Tid.TID_SENSOR_CAR_WALL) - return this.filterOnEvent( - radioVal - - robot.robots.RobotCompactCommand - .ObstacleState - ) - else if ( - robot.robots.RobotCompactCommand.LineState <= - radioVal - ) - return this.filterOnEvent(radioVal) - } else if ( - radioVal < robot.robots.RobotCompactCommand.ObstacleState - ) - return this.filterViaCompare() - -*/ diff --git a/img.g.ts b/img.g.ts index 06cf308d..54ac10bc 100644 --- a/img.g.ts +++ b/img.g.ts @@ -3,6 +3,7 @@ // Images are declared with //% img="name" in: // ui-core/icons.ts // app/assets.ts +// app/robot.ts // and keyed by the app's key table. Edit an image where it is declared, // then regenerate; the pixels here are a build product. namespace _img { @@ -15,221 +16,264 @@ namespace _img { f111f007f011f111f007f015f007f015f007f015f007f015f007f011f111f007f011f111f008f013f00af30f0f058704 1000100001c00f0f0b800d81d00b82d00a83d00984d00885d00786d006821380d0058210801082d004841380d0038ad0 04da0f0f0187041000100001c00f0f018a04801483d10380108010801082d1048110801082d10586d10685d10784d108 - 83d10982d10a81d10b80d10dd00f0f0b87041000100001c01f1f1f19e21b4120e115f0124320e016f0114320e012f510 - 4320e016f0114320e015f0124320e01a4120e11ad0e2d01bd21f1f1f1287041000100001c01f148222b0178323b01582 - b01222b01481b01421b01481b01421b01481b01421b01481b01421b014f1b014f1b014f1b014f1b012601c6016601060 - 15601160106014601060196017601360126018601a87041000100001c01f1f1f1f1af11cf021f013f723f011f0d327f0 - 12f723f01af021f01cf11f1f1f1f1f1287041000100001c01f1f108d118550815082f0118450815083f0118052825083 - 20f0115042508620f0115042508050805080508020f0115042508620f011805282508320f0118450815083f011855081 - 5082f0118d1f1f1f1087041000100001c017801d821b841a6180611c801df218806010f012f016816010f010f010f015 - 84f012f016816010f010f010f017806010f012f01bf28011601c8060801c60811b60821f1187042000210001c00068c0 - b119c0b1c063b00769c0b119c0b1c064b00669c0b119c0b1c064b00669c0b119c0b1c064b00669c0b119c0b1c064b006 - 69c0b119c0b1c064b00669c0b217c0b2c064b00669c0bec064b00669c0b217c0b2c064b00669c0b119c0b1c064b00669 - c0b119c0b1c064b00669c0b119c0b1c064b00669c0b111e412c0b1c064b00669c0b110e0d2e112c0b1c064b00669c0b1 - e010e0d2e012c0b1c064b00669c0b0e01051e0d1e012c0b1c064b00669c0e01051e040e0d0e012c0b1c064b00669e010 - 51e041e212c0b1c064b00668e01051e041e212c0b2c064b00667e01051e041e2b7c064b00666e01051e041e2b0c0b0c0 - b0c0b2c064b00665e01051e041e2b6c0b1c064b00664e01051e041e2bac064b00663e151e041e2b8c0b1c064b00662e0 - 41e141e2b410c0b5c064b00662e04120e040e2b0c0b212c0b1c0b1c064b00663e022e2b610c0b5c064b00664e020e2c0 - b1c0b8c0b1c064b00665e260c0bec064b00669c0b1c0b8c0b1c064b00669c0b2c0b0c0b0c0b0c0b0c0b2c064b00768c0 - bec063b00787042000200001c06f6f6ed26f6cd26f63d165d3c06f62d263d0b3c162d269d561d1b3c161d3c167d1b3c1 - d1b3c1d1b3c167d1b3c1d1b3c1d1b3c167d1bfb3c169bfb36cc0b1d1b1c3b1d1b1c06dc0b1d1b1c061c0b1d1b1c06ad3 - b3c163c1b3c367d3b3c065c0b3c366d0b5c167c1b5c064d1b5c069c0b5c163d1b5c069c0b5c164d0b5c167c1b5c066c3 - b3c066b3c367c3b3c164c0b3c36ad0b1d1b1c061c2d1b1c06dd0b1d1b1c3b1d1b1c06cd1bfb169d1bfb3c167d1b3c1d1 - b5c1b3c167d1b3c1d1b3c3b3c167d1c361d1b3c161c569c262d1b3c162c26bc165c46f6bc26f6cc26f6f6d8704200021 - 0001c0006f6db0076f6fb0066f6fb0066f6fb00663bfb763b00662b18f85b162b00662b08f87b062b00662b0c781311b - b062b00662b0d6c081311bb062b00662b0d6c0813111c010c010c014b062b00662b0d6c0813111c010c010c014b062b0 - 0662b0d6c0813111c010c010c014b062b00662b0d6c0813111c012c014b062b00662b0d6c0813111c012c014b062b006 - 62b0d6c0813115c014b062b00662b0d0c083d0c0813115c014b062b00662b0d084d0c081311bb062b00662b0d084d0c0 - 81311bb062b00662b0d6c081311bb062b00662b0d6c081311bb062b00662b086c081311bb062b00662b086c081311bb0 - 62b00662b086c081311bb062b00662b0c781311bb062b00662b08f87b062b00663b08f83f180b062b00664b08f85b062 - b00665bfb662b0066f6fb0066f6fb0066f6fb0076f6db00787041000100001c00f0f0f0f0f0f05430b4051400b405140 - 0b430f0f0f0f0f0f0587041000100001c00f0f0f05430b4051400b4051400b430f0f0b430b4051400b4051400b430f0f - 0f0587041000100001c00f05430b4051400b4051400b430f0b430b4051400b4051400b430f0b430b4051400b4051400b - 430f0587041000100001c00f0f0f0243014305405140014051400540514001405140054301430f0f0543014305405140 - 014051400540514001405140054301430f0f0f0287041000100001c00f07430b40514006430040514006405140004306 - 4051400b4300430b405140064300405140064051400043064051400b4300430b4051400b4051400b430f038704100010 - 0001c00f01cc02c07ac002c07ac003c078c004c078c005c076c006c076c006c174c008c074c009c072c00ac072c00bc0 - 70c00cc070c00dc00f0687041000100001c00f01cc02c0bac002c0bac003c0b8c004c0b8c005c0b6c006c0b6c006c1b4 - c008c0b4c009c0b2c00ac0b2c00bc0b0c00cc0b0c00dc00f0687041000100001c00f04d508d015d006d0102510d004d0 - 102710d002d01023112310d001d01023112310d001d01023112310d001d01023112310d001d01023112310d001d01023 - 112310d002d0102710d004d0102510d006d015d008d50f0487041000100001c00f04d508d0c5d006d0c0b5c0d004d0c0 - b7c0d002d0c0b3c1b3c0d001d0c0b3c1b3c0d001d0c0b3c1b3c0d001d0c0b3c1b3c0d001d0c0b3c1b3c0d001d0c0b3c1 - b3c0d002d0c0b7c0d004d0c0b5c0d006d0c5d008d50f0487041000100001c00f0f0f07f2d00bf050f0d00bf050f0d009 - f250f207f154f0d005f070f152f1d004f370f050f070f0d004f074f071f0d004f077f0d004f9d006d80f0f0187041000 - 100001c00f0f0f09e20b4120e104f0034320e003f0044320e002f5004320e003f0044320e004f0034320e00a4120e10a - d0e2d00bd20f0f0f0287041000100001c00f0f05b409b014b007b012d012c005b011d010d010d011c004b018c003f0b0 - 90b1902010d110c004b0932013c004b091b0902010d011c005b0922012c0d006c09211c0d008c4d00ad30f0f04870410 - 00100001c00f0f008d018550815082f0018450815083f001805282508320f0015042508620f001504250805080508050 - 8020f0015042508620f001805282508320f0018450815083f0018550815082f0018d0f0f0f0087041000100001c00f02 - 800f800c8001800c80018003400480018000800350400480008000800042514003800080008000554002800080008000 - 425140028001800080035040058001800340058001800d800d800f0f0b87041000100001c01f1f1f1f16f21ff012f012 - b4c111f011f012c710f313c610f313c511f011f01af012f017f21f1f1f1f1587041000100001c04050400c4050400c40 - 504002c70140504001c0f0c0d60040504000c040f1c01640504000c05041c0d64050425140c0d0f1d0f1d0004055c0d2 - f0d201425140c0d0f1d0f1d003c05041c0d603c040f1c0d604c0f0c0b606c70f0f0f0187041000100001c04050400c40 - 50400c40504002c70140504001c0f0c0d60040504000c040f1c01640504000c05041c0d64050425140c0d0f1d3004055 - c0d2f2d001425140c0d0f1d303c05041c0d603c040f1c0d604c0f0c0b606c70f0f0f0187041000100001c04050400c40 - 50400c40504002c70140504001c0f0c0d60040504000c040f1c01640504000c05041c0d64050425140c0d0f0d1f1d000 - 4055c0d0f0d0f0d0f0d001425140c0d0f1d1f0d003c05041c0d603c040f1c0d604c0f0c0b606c70f0f0f018704100010 - 0001c00f0f0f0f0f006d00669168f491f462f1c391c3f162f491f4689166006d0f0c52400b52400b5140008704100010 - 0001c00f0f03670662d3620462d0f3d0620361d0f5d0610361d0f5d0610361d012f2d0610361d0f5d0610361d0f5d061 - 0362d0f3d0620462d36206670f52400b52400b51400087041000100001c00f0ae0b00893e2b005931091e2b001809610 - 90e2b0028196e2b004819380e2b00683e3b00ae3b00793e2b005931091e1b00280961090e1b0038196e0b00681938052 - 4006830052400b51400087041000100001c00f03620b6012600320046011901160022103601092106025026011901160 - 022104601260032006620c620b6012600220056011901160002105601092106025026011901160002106601260022052 - 4003620452400b51400087041000100001c00f0f01fb03f272f503f272f503f272f503fb03db03d2f2d503d2f2d503d2 - f2d503db0f0d52400b52400b51400087041000100001c00f0f04f607f194f0d005f090f092f2d004f392f050f0d004f0 - 95f050f0d004f093f250f203f554f0d004d0f070f152f1d004f370f050f070f0d004f074f071f0d004f077f0d004f9d0 - 06d80f0087041000100001c00f05c0b0c10bc0b0c10ac0b0c308c0b0c506c0b0c70f0430012000400160019002300120 - 02400160082000400160082002400160062002400150006003500120024001600620024003600420015001400f068704 - 1000100001c00f0f0af10cf0c1b00bf0c1b006f0c5b106c0b606c1b00cc0b10bc1b003f106c0b102f0c1b004f0c0b003 - f0c1b004c8b105b80f0f0387041000100001c00f03200f2000f608f320f1b0022300f120f120f0b007f420f0b007f120 - f120f0b006d120f120f1b0052040d1f4b004204120d0b503204120e0b008204120e0b00120002003204120e0b0022001 - 20024120e0b003200620e0b004200f0487041000100001c00f03800d800d8001800a8001800440058000800180014050 - 058000800080014051430180008000800040560180008000800140514301800080018001405005800180044006800180 - 0c800f800f0f0a87041000100001c00f02800f8003600260038001800160906000609060038001800062006201800180 - 00800060906000609060028000800080016002600380008000800a800080008009800180008001600260048001800060 - 9060006090600280018001620062048002609060006090600380046002600f0f0187041000100001c003f6b005f241f0 - 21f2b002f051f041f021f061f0b001f051f661f0b000f405f3d0f041f006f081f0b0f041f006f081f0b0f306f3b0f091 - f006f0a1f0b0f091f006f0a1f0b0f405f3b000f0b1f6c1f0b0d000f0b1f071f0e1f0c1f0b0d001f271f0e1f1524002d0 - f6b0524003d751400087041000100001c00f0f05c706c0f0c0d604c0f2c01603c040f040c0d603c0504050c0d0f1d0f1 - d001425140c0d2f0d2004055c0d0f1d0f1d04050425140c0d640504000c05040f0c0d64050400140f0c0b60040504002 - c7014050400c4050400c4050400c87041000100001c00f0f05c706c0f0c0d604c0f2c01603c040f040c0d603c0504050 - c0d0f1d301425140c0d2f2d0004055c0d0f1d34050425140c0d640504000c05040f0c0d64050400140f0c0b600405040 - 02c7014050400c4050400c4050400c87041000100001c00f0f05c706c0f0c0d604c0f2c01603c040f040c0d603c05040 - 50c0d0f0d1f1d001425140c0d0f0d0f0d0f0d0004055c0d0f1d1f0d04050425140c0d640504000c05040f0c0d6405040 - 0140f0c0b60040504002c7014050400c4050400c4050400c87041000100001c00f03200f2000f608f221f1b0022300f1 - 20f020f1b007f020f120f1b0054000f024f0b0055040f320f1b002425140f5b0014055b6004050425140074050400150 - 400220002002405040014003200120014050400620044050400620044050400c87041000100001c00f0f018b0285b284 - 0185b0c1b0830185b1c0b0830285b1c0b0810bb0c0b00db0c0b008402002b0c0b001402103402002b0c003402603b007 - 40200c40200252400b52400b51400087041000100001c00f06900bf290f207f0b290b2f005f0b390b3f003f0b3908090 - b3f002f0b29080b5f002f0b19080b6f002f0b09080b7f002f0b080b8f002f0b3908090b3f003f0b390b3f005f0b290b2 - f007f290f200524006900352400b51400087041000100001c00f0f018b0285b2840185b0c1b0830185b1c0b0830285b1 - c0b0810bb0c0b00db0c0b00db0c0b0027200f203b0027300f3067300f3077200f20252400b52400b5140008704100010 - 0001c00f0f4c025c400142594001d2405740d0044052f25140054051f052f05040054052f25140054057400242594001 - 5c40014cd001dc0f0f0287041000100001c00f0f4c025c400142594001d2405740d0044052f051f05040054051f45040 - 054055f050400540574002425940015c40014cd001dc0f0f0287041000100001c00f0f4c025c400142594001d2405740 - d0044051f051f15040054051f050f050f05040054052f051f050400540574002425940015c40014cd001dc0f0f028704 - 1000100001c00f0f02690461c0f5c0610361f1c3f1610361f0c0f3c0f0610361f0c0f3c0f0610361f0c0f3c0f0610361 - f0c0f3c0f0610361f1c3f1610361c0f5c06104690f07f001f002524003f402524007f00251400087041000100001c00f - 0f02690461c0f5c0610361f1c3f1610361f0c0f3c0f0610361f0c0f3c0f0610361f0c0f3c0f0610361f0c0f3c0f06103 - 61f1c3f1610361c0f5c06104690f06f001f102524003f000f000f002524004f001f00251400087041000100001c00f0f - 05430a40d3400840d0004100d04007405000415000405006405000d15000405006405004405006405004405006405004 - 4050064050004101405006405000415000405006d04050d15040d008d043d00ad30f0587041000100001c00f0f02b904 - b019c003b01320102111c003b010211020112011c003b01320102210c003b019c003b019c003b014f011f010c003b013 - f010f010f010c003b013f011f011c003b019c004c9d006d70f0287041000100001c00f0f02b904b019c003b019c003b0 - 1220132010c003b0112610c003b0172010c003b019c003b014f011f010c003b013f010f010f010c003b013f011f011c0 - 03b019c004c9d006d70f0287041000100001c00f0f02b904b019c003b0122015c003b011201121102010c003b0112011 - 2013c003b0122114c003b019c003b014f011f010c003b013f010f010f010c003b013f011f011c003b019c004c9d006d7 - 0f0287041000100001c00f0f02b904b019c003b01122122010c003b011201020122010c003b011201020122010c003b0 - 1120112211c003b019c003b014f011f010c003b013f010f010f010c003b013f011f011c003b019c004c9d006d70f0287 - 041000100001c00f05c0b0c10bc0b0c10ac0b0c308c0b0c506c0b0c70f088001800c810f0f0f0f0f0f0f068704100010 - 0001c00f08820f80059400810790630280069060f40180059060f052f0089060f052f06090069060f052f0609008f052 - f06090058001f4609006800263900781009405800f820f0987041000100001c00f0f0596800795810794806080079380 - 61800380029280628003800292806280038002928062800380018092806280048000819180618090058300f050f00881 - 01f1098002f00f0f0587041000100001c00f08f00ef1098002f050f0088191f051f0068390f052f00480008191f052f0 - 0380018092f052f003800292f052f003800292f052f003800293f051f00794f050f00795f10796f00f0f018704100010 - 0001c00f0f0397079085900780658006f057f004f059f003fb04809705829604849506800e800f8002800b820f078704 - 1000100001c00f04820b80028009800e800c849505829606809705fb03f059f004f057f0068065800790859007970f0f - 0387041000100001c00f0f04c706c0f0c0d604c0f2c01603c0f140c0d603c0f04050c0d0f1d0f1d003c0f051c0d2f0d2 - 03c0f04050c0d0f1d0f1d003c0f140c0d603c0f2c0d604c0f0c0b606c70f0f0f0287041000100001c00f0f04c706c0f0 - c0d604c0f2c01603c0f140c0d603c0f04050c0d0f1d303c0f051c0d2f2d003c0f04050c0d0f1d303c0f140c0d603c0f2 - c0d604c0f0c0b606c70f0f0f0287041000100001c00f0f04c706c0f0c0d604c0f2c01603c0f140c0d603c0f04050c0d0 - f0d1f1d003c0f051c0d0f0d0f0d0f0d003c0f04050c0d0f1d1f0d003c0f140c0d603c0f2c0d604c0f0c0b606c70f0f0f - 0287041000100001c00f0f08900e910a95089607928191800791800190800891028009910d810f0f0f0f0f0987041000 - 100001c00f0f0f0f0f03810d910d9102800991800190800892819180089609950c910d900f0f0587041000100001c00f - 0f0f05f10cf020f00bf021f604f028f003f029f004f028f005f021f606f020f00df10f0f0f0f0787041000100001c00f - 0f0f07f10df090f006f691f005f098f004f099f003f098f004f691f00bf090f00cf10f0f0f0f0587041000100001c00b - f00df10cf050f00bf051f00af052f0058003f052f0048103f052f0038500f052f0048103f052f0058003f052f00af052 - f00bf051f00cf050f00df10ef00f0287041000100001c00f02f00ef10df050f00cf051f00bf052f00af052f0038005f0 - 52f0038104f052f0008503f052f0038104f052f0038005f052f00af051f00bf050f00cf10df00b87041000100001c00f - 0f0f04f805f196f004f090f096f003f396f003f093f092f090f003f093f490f003f097f090f003f099f003f099f003fb - 0f0f0f0187041000100001c00f0f0f04f805f156f004f050f056f003f351f051f050f003f053f051f150f003f053f050 - f050f050f003f054f051f050f003f059f003f059f003fb0f0f0f0187041000100001c00f0f0f04f805f146f004f040f0 - 46f003f346f003f043f042f040f003f043f040f040f040f003f044f040f041f003f049f003f049f003fb0f0f0f018704 - 1000100001c00f0f0f04f805f136f004f030f036f003f330f232f003f035f032f003f033f430f003f035f032f003f039 - f003f039f003fb0f0f0f0187041000100001c00f0f0f04f805f176f004f070f076f003f370f270f070f003f073f070f0 - 70f070f003f073f070f070f070f003f073f071f071f003f079f003f079f003fb0f0f0f0187041000100001c0f9e1fce0 - 21e0fbe021e0f6e1f3e1f0e1f3e021e0f4e021e0f2e021e0f4e021e0f3e1f6e1fce021e0fbe021e0f3e1f6e1f3e021e0 - f4e021e0f2e021e0f4e021e0f3e1f3e1f0e1f9e021e0fbe021e0fce1f387041000100001c00f0f044409405130514007 - 4051f0305240054051f051f15140044052f050f25040044054f0215040044052f050f0215040044051f051f020514005 - 4051f0305240d0064051305140d00844d00ad30f0f0587041000100001c00f0f04440940544007405640054051f150f0 - 5240044055f05140044055f05140044055f05140044051f150f0524005405640d006405440d00844d00ad30f0f058704 - 1000100001c00f0f0543028006405340008090054050f050f0514091054053f0504091054053f0504091054050f050f0 - 514091064053409207438092048002d081918103800140819280d10380004050809181d00580014082d1078001d20f06 - 87041000100001c00f0f03f1620960f2716007607010f17260066071f170f07160056075f07160046075f07160046071 - f170f07160d0046070f27260d0066010f17160d008f162d00ad30f0f0f0687041000100001c00f0f0444094054400740 - 5640054051f151f05140044054f05240044054f05240044054f05240044051f151f0514005405640d006405440d00844 - d00ad30f0f0587041000100001c00f0f0b200d210c220627e00527e0d00521e5d00620e0d507e905e0d0e0d0e0d0e0d0 - e0d005e906d80f0f0f0287041000100001c00f0660800c6090800a916050800290059011609080009001900390109160 - 50800190009003927060908100900090039170f06050810090009003917160908100900090039170f0605080d0009000 - 900491706090800090019005916050800290086090800cd060800dd10f0687041000100001c00f0321d00b20d140d009 - 20d00140d009d00140d00c40d00151d00740d00150d170d00640d00050d00170d006d051d00170d008d10170d00c70d0 - 0190d00970d00090d00ad091d00cd10f0f0587041000100001c00f0f0230023009305030013002300630013050300c30 - 50300a31523106315631063152310a3050300c3050300830033002300a3001305030073004300f0f0387041000100001 - c00f0f044409405440074050f05440054051f05540044053f25140044053f1205140044053f1205140044051f0554005 - 4050f05440d006405440d00844d00ad30f0f0587041000100001c00f02800f800c8001800c8001800980018000800242 - 048000800080014050105040038000800080014012400380008000800140501050400280018000800242058001800a80 - 01800d800d800f0f0b87041000100001c00f0f04b0c606b010b6c004b011b1c0b3c003b012b0c0b4c003b012b0c0b1c0 - b0c103b010b010b0c0b1c0b1c003b012b1c1b2c003b012b6c003b011b0d6b003b010b0d3b0d1b0d003b1d1b0d3b0d005 - b7d00cd10f0487041000100001c04e004e0048f0c010420041f0c01042f0c012410041f0c01041f0c014400041f0c010 - 43f0c010420041f0c010c041f0c011420042f011c211430043f01444004e004410421044004510401045004610460045 - 10401045004410421044004e0087041000100001c01df11cf0c11cf0c11f17f11cf0c11cf0c11f17f11cf0c11cf0c11f - 1f19f11cf0c11cf0c11f87041000100001c00f0414081124b1051028b0041028b003102ab002102ab002102ab002102a - b002102ab003b028b0d003b028b0d004b124b1d007b4d109d40f0487041000100001c00f0414081174b1051078b00410 - 78b003107ab002107ab002107ab002107ab002107ab003b078b0d003b078b0d004b174b1d007b4d109d40f0487041000 - 100001c00f0414081184b1051088b0041088b003108ab002108ab002108ab002108ab002108ab003b088b0d003b088b0 - d004b184b1d007b4d109d40f0487041000100001c00f04140811a4b10510a8b00410a8b00310aab00210aab00210aab0 - 0210aab00210aab003b0a8b0d003b0a8b0d004b1a4b1d007b4d109d40f0487041000100001c00f0414081154b1051058 - b0041058b003105ab002105ab002105ab002105ab002105ab003b058b0d003b058b0d004b154b1d007b4d109d40f0487 - 041000100001c00f04140811f4b10510f8b00410f8b00310fab00210fab00210fab00210fab00210fab003b0f8b0d003 - b0f8b0d004b1f4b1d007b4d109d40f0487041000100001c0022241517402224151750122415173820121415272830121 - 41517282c1012141517182c2012141517181c1a1012141517181c1a0022141517181c1a0022141517181c1a101214151 - 7182c2012141517282c1012141527283012241517382022241517503224152730087041000100001c0cfc1d0c3d0c8d0 - 10d0cdd0cad0cfcad0cdd010d0c7d0c4d0cfc9d0c210c9d010d0cdd0cfc6d0c3d0c8d010d0cdd0cfc187041000100001 - c000200a2002200a20022002f003f00120022001f60120022007f0012002200a20022001f001f30120022001f001f001 - f00120022001f301f0012002200a200220004006400020022000480020022000400640002002200a2002200a2002200a - 200187041000100001c00f0f05c00dc706c010c0b014c004c110c411c003c000c0d0c0b0d4c003f000f0d0f0c3d1f003 - f000f0d0f0b0d4f004f1b0f0c3b1f005f0b0f0c0b4f006f7d007f000d40f0f0f0287041000100001c00f0f0f05f30bf0 - 51f00bf051f008f351f305f057f005f057f005f351f308f051f00bf051f00bf30f0f0f0587041200120001c0dfd105d0 - c0d1c0d1c0d1c0d1c0d1c0d005dfd105dfd105d0c0ddc0d005dfd105dfd105d0c0ddc0d005dfd105dfd105d0c0ddc0d0 - 05dfd105dfd105d0c0ddc0d005dfd105dfd105d0c0d1c0d1c0d1c0d1c0d1c0d005dfd10587041200120001c0bfb105b0 - d0b1d0b1d0b1d0b1d0b1d0b005bfb105bfb105b0d0bdd0b005bfb105bfb105b0d0bdd0b005bfb105bfb105b0d0bdd0b0 - 05bfb105bfb105b0d0bdd0b005bfb105bfb105b0d0b1d0b1d0b1d0b1d0b1d0b005bfb10587040e00140001c0dfd303df - d303dfd304dfd106df08dd0adb0cd90ed70f00d50f02d30f04d10f0f0f0c87040900090001c000f607f016f006f016f0 - 06f016f006f016f006f016f006f016f006f016f007f60787042000210001c00017b00c17b00710b00f0c10b00610b00f - 0c10b00610b00f0c10b00610b00f0c10b00610b00f0c10b00610b00f0c10b00610b00f0c10b00610b00f0c10b00f0f0f - 0f0f0f0511b00f0f0411b00f0f0411b00f0f0411b00f0f0019b00f0c19b00f0f0011b00f0f0411b00f0f0411b00f0f04 - 11b00f0f0f0f0f0f0510b00f0c10b00610b00f0c10b00610b00f0c10b00610b00f0c10b00610b00f0c10b00610b00f0c - 10b00610b00f0c10b00610b00f0c10b00717b00c17b00787041000100001c00f0f008c02d38802d380301602d3803016 - 02d38030160282d08030160282d080301602d380301602d380301602843016038b048a07d60f0287041000100001c00f - 0f008c02d38802d380301602d380301602d38030160282d0803011f011f0100282d0803010f41002d3803014f01002d3 - 80301602843016038b048a06d70f0287041000100001c00f0f008c02d38802d380301602d380301602d38030160282d0 - 803010f011f1100282d0803010f010f010f01002d3803011f011f01002d380301602843016038b048a06d70f02870410 - 00100001c00f0f008c02d38802d380301602d380301602d38030160282d0803010f012f0100282d0803010f010f010f0 - 1002d3803011f21102d380301602843016038b048a06d70f0287041000100001c00f0f012b0221492101204b2001204b - 2001204b2001204b2001204b2001204b2001204b2001204b2001214921022b0f0f0187041000100001c00f0f01cb02cd - 01cd01cd01cd01cd01cd01cd01cd01cd01cd02cb0f0f0187041000100001c01f1f1f15c517c1f5c015c0f8c013c0fac0 - 11c0fbc011c0fbc011c0fbc011c0fac013c0f8c015c0f5c117c51f1f1587041000100001c01f1f1f1f1f1f1f1f17f01f - 1f1f1f1f1f1f1687042000210001c0001f1db0071f1fb0061f1fb0061f1fb00613bf1bb00612b01fb01ab00612b01fb0 - d019b00612b0154315b0d019b00612b01341534113b0d019b00612b01240574012b0d019b00612b01240574012b0d019 - b00612b0114051f151f0524012b1d017b00612b0114056f0514014b0d016b00612b0114056f0514015b0d015b00612b0 - 114051f151f0524012b110b0d015b00612b01240574012b0d1b1d015b00612b01240574012b0d000d116b00612b01341 - 534113b08415b00612b015431580638114b00612b01e80658113b00612b01d806113618112b00613bd80601060106381 - 12b00615db8060106010638112b0061f11806113618112b0061f12806581d012b0061f13806381d013b0061f1484d014 - b0061f15d315b0061f1fb0061f1fb0061f1fb0071f1db007 + 83d10982d10a81d10b80d10dd00f0f0b87041000100001c01f16c716c076c015c077c014c078c013c074c513c073c0d4 + 14c072c018c272c216c076c016c076c017c074c019c072c01bc070c01dc01f1987041000100001c016c716c076c015c0 + 77c014c078c013c074c512c074c0d314c073c217c072c171c016c072c172c015c078c015c078c015c076c0d016c272c0 + d019c071c0d01ac2d01cd11587041000100001c01f1f1f19e21b4120e115f0124320e016f0114320e012f5104320e016 + f0114320e015f0124320e01a4120e11ad0e2d01bd21f1f1f1287041000100001c01f148222b0178323b01582b01222b0 + 1481b01421b01481b01421b01481b01421b01481b01421b014f1b014f1b014f1b014f1b012601c601660106015601160 + 106014601060196017601360126018601a87041000100001c01f1f1f1f1af11cf021f013f723f011f0d327f012f723f0 + 1af021f01cf11f1f1f1f1f1287041000100001c01f1f108d118550815082f0118450815083f011805282508320f01150 + 42508620f0115042508050805080508020f0115042508620f011805282508320f0118450815083f0118550815082f011 + 8d1f1f1f1087041000100001c017801d821b841a6180611c801df218806010f012f016816010f010f010f01584f012f0 + 16816010f010f010f017806010f012f01bf28011601c8060801c60811b60821f1187042000210001c00068c0b119c0b1 + c063b00769c0b119c0b1c064b00669c0b119c0b1c064b00669c0b119c0b1c064b00669c0b119c0b1c064b00669c0b119 + c0b1c064b00669c0b217c0b2c064b00669c0bec064b00669c0b217c0b2c064b00669c0b119c0b1c064b00669c0b119c0 + b1c064b00669c0b119c0b1c064b00669c0b111e412c0b1c064b00669c0b110e0d2e112c0b1c064b00669c0b1e010e0d2 + e012c0b1c064b00669c0b0e01051e0d1e012c0b1c064b00669c0e01051e040e0d0e012c0b1c064b00669e01051e041e2 + 12c0b1c064b00668e01051e041e212c0b2c064b00667e01051e041e2b7c064b00666e01051e041e2b0c0b0c0b0c0b2c0 + 64b00665e01051e041e2b6c0b1c064b00664e01051e041e2bac064b00663e151e041e2b8c0b1c064b00662e041e141e2 + b410c0b5c064b00662e04120e040e2b0c0b212c0b1c0b1c064b00663e022e2b610c0b5c064b00664e020e2c0b1c0b8c0 + b1c064b00665e260c0bec064b00669c0b1c0b8c0b1c064b00669c0b2c0b0c0b0c0b0c0b0c0b2c064b00768c0bec063b0 + 0787042000200001c06f6f6ed26f6cd26f63d165d3c06f62d263d0b3c162d269d561d1b3c161d3c167d1b3c1d1b3c1d1 + b3c167d1b3c1d1b3c1d1b3c167d1bfb3c169bfb36cc0b1d1b1c3b1d1b1c06dc0b1d1b1c061c0b1d1b1c06ad3b3c163c1 + b3c367d3b3c065c0b3c366d0b5c167c1b5c064d1b5c069c0b5c163d1b5c069c0b5c164d0b5c167c1b5c066c3b3c066b3 + c367c3b3c164c0b3c36ad0b1d1b1c061c2d1b1c06dd0b1d1b1c3b1d1b1c06cd1bfb169d1bfb3c167d1b3c1d1b5c1b3c1 + 67d1b3c1d1b3c3b3c167d1c361d1b3c161c569c262d1b3c162c26bc165c46f6bc26f6cc26f6f6d87042000210001c000 + 6f6db0076f6fb0066f6fb0066f6fb00663bfb763b00662b18f85b162b00662b08f87b062b00662b0c781311bb062b006 + 62b0d6c081311bb062b00662b0d6c0813111c010c010c014b062b00662b0d6c0813111c010c010c014b062b00662b0d6 + c0813111c010c010c014b062b00662b0d6c0813111c012c014b062b00662b0d6c0813111c012c014b062b00662b0d6c0 + 813115c014b062b00662b0d0c083d0c0813115c014b062b00662b0d084d0c081311bb062b00662b0d084d0c081311bb0 + 62b00662b0d6c081311bb062b00662b0d6c081311bb062b00662b086c081311bb062b00662b086c081311bb062b00662 + b086c081311bb062b00662b0c781311bb062b00662b08f87b062b00663b08f83f180b062b00664b08f85b062b00665bf + b662b0066f6fb0066f6fb0066f6fb0076f6db00787049000160001c0001f120311bfb20210bfb3f00110bfb3f00110bf + b3f00110bfb3f00110bfb2f102b7fb04b70f00b70f00b6f00e11b5f00d11b5f10c11b5f10c11b7190310bfb30210bfb3 + f00110bfb3f00110bfb3f00110bfb3f002bfb2f103fff20313021b0311b30011bb0210b4f010bcf00110b4f010bcf001 + 10b4f010bcf002b3f100bbf103f302fb0c160e12b6100b11ba0a10bbf00811bc0810b4f2b5f00710b3f102b4f00710b3 + f00310b3f00710b3f00310b3f00710b40211b3f00710b50011b4f008b5f010b4f10810b4f010b4f00ab4f010b3f10bf0 + b1f100b1f20ef102f10c1c0911bc0810bdf00710bdf00710bdf008bcf109b2f90911b1f00f0111b2f00f0110b40f0110 + b4f00f01b4f00f02b2f10f03f20f05160e12b6100b11ba0a10bbf00811bc0810b4f2b5f00710b3f102b4f00710b3f003 + 10b3f00710b3f00310b3f00710b40211b3f00710b512b4f008bcf10810bbf00abaf10bf0b6f20ef60c160e12b6100b11 + ba0911bc0711be0511bfb00410bfb1f00211b6f2b80210b6f102b7f00110b5f104b6f00110b5f00510b5f00110b5f005 + 10b5f00110b60411b5f00110b70211b6f002b80011b6f10210b7f010b7f004b7f010b6f105b6f010b5f107b5f010b4f1 + 09f0b2f100b2f20cf202f20f01160e12b6100b11ba0a10bbf00811bc0810b4f2b5f00710b3f102b4f00710b3f00310b3 + f00710b3f00310b3f00710b40211b3f00710b512b4f008bcf10810bbf00abaf10bf0b6f20ef60f160e12b6100b11ba0a + 10bbf00811bc0810b4f2b5f00710b3f102b4f00710b3f00310b3f00710b3f00310b3f00215b414b3f00111bfb2f00110 + bfb3f00110bfb3f00110bfb3f002bfb2f103fff20c160e12b6100b11ba0a10bbf00811bc0810b3f0b2f0b4f00710b2f1 + 10b1f000b3f00710b2f00010b1f00010b2f00710b2f00010b1f00010b2f00710b30010b1f00010b2f00710b410b1f000 + 10b2f008b7f00010b2f00810b6f001b1f109b6f002f10bf0b3f10f02f30887041000100001c003c0b1c1b1c007c0b1f1 + b1c008c0b0f1b0c009c0b3c008c0b5c007b2c1b2c005c0b1c001c0b1c004c0b2c001c0b2c002c0b2c003c0b2c001c0b1 + c005c0b1c000c0b2c005c0b2c1b1c007c0b1c1b1c007c0b1c000c0b1c005c0b1c001c0b2c003c0b2c002c205c2018704 + 1000100001c004c0b0c1b0c009c0b0f1b0c009d0b0f1b0d009d0b3d008c0b5c005c1b2c1b2c103c0b1c101c1b1c003c0 + b1c003c0b1c003c0b1c003c0b1c003c0b1c003c0b1c003c0b1c003c0b1c003c0b1c003c0b1c003c0b1c003c0b1c003c0 + b1c003c0b1c004c0b1c001c0b1c006c103c10387041000100001c00f0f0f0f0f0f05430b4051400b4051400b430f0f0f + 0f0f0f0587041000100001c00f0f0f05430b4051400b4051400b430f0f0b430b4051400b4051400b430f0f0f05870410 + 00100001c00f05430b4051400b4051400b430f0b430b4051400b4051400b430f0b430b4051400b4051400b430f058704 + 1000100001c00f0f0f0243014305405140014051400540514001405140054301430f0f05430143054051400140514005 + 40514001405140054301430f0f0f0287041000100001c00f07430b405140064300405140064051400043064051400b43 + 00430b405140064300405140064051400043064051400b4300430b4051400b4051400b430f0387041000100001c00f01 + cc02c07ac002c07ac003c078c004c078c005c076c006c076c006c174c008c074c009c072c00ac072c00bc070c00cc070 + c00dc00f0687041000100001c00f01cc02c0bac002c0bac003c0b8c004c0b8c005c0b6c006c0b6c006c1b4c008c0b4c0 + 09c0b2c00ac0b2c00bc0b0c00cc0b0c00dc00f0687041000100001c00f04d508d015d006d0102510d004d0102710d002 + d01023112310d001d01023112310d001d01023112310d001d01023112310d001d01023112310d001d01023112310d002 + d0102710d004d0102510d006d015d008d50f0487041000100001c00f04d508d0c5d006d0c0b5c0d004d0c0b7c0d002d0 + c0b3c1b3c0d001d0c0b3c1b3c0d001d0c0b3c1b3c0d001d0c0b3c1b3c0d001d0c0b3c1b3c0d001d0c0b3c1b3c0d002d0 + c0b7c0d004d0c0b5c0d006d0c5d008d50f0487041000100001c00f0f0f07f2d00bf050f0d00bf050f0d009f250f207f1 + 54f0d005f070f152f1d004f370f050f070f0d004f074f071f0d004f077f0d004f9d006d80f0f0187041000100001c00f + 0f0f09e20b4120e104f0034320e003f0044320e002f5004320e003f0044320e004f0034320e00a4120e10ad0e2d00bd2 + 0f0f0f0287041000100001c00f0f05b409b014b007b012d012c005b011d010d010d011c004b018c003f0b090b1902010 + d110c004b0932013c004b091b0902010d011c005b0922012c0d006c09211c0d008c4d00ad30f0f0487041000100001c0 + 0f0f008d018550815082f0018450815083f001805282508320f0015042508620f0015042508050805080508020f00150 + 42508620f001805282508320f0018450815083f0018550815082f0018d0f0f0f0087041000100001c00f02800f800c80 + 01800c800180034004800180008003504004800080008000425140038000800080005540028000800080004251400280 + 01800080035040058001800340058001800d800d800f0f0b87041000100001c01f1f1f1f16f21ff012f012b4c111f011 + f012c710f313c610f313c511f011f01af012f017f21f1f1f1f1587041000100001c04050400c4050400c40504002c701 + 40504001c0f0c0d60040504000c040f1c01640504000c05041c0d64050425140c0d0f1d0f1d0004055c0d2f0d2014251 + 40c0d0f1d0f1d003c05041c0d603c040f1c0d604c0f0c0b606c70f0f0f0187041000100001c04050400c4050400c4050 + 4002c70140504001c0f0c0d60040504000c040f1c01640504000c05041c0d64050425140c0d0f1d3004055c0d2f2d001 + 425140c0d0f1d303c05041c0d603c040f1c0d604c0f0c0b606c70f0f0f0187041000100001c04050400c4050400c4050 + 4002c70140504001c0f0c0d60040504000c040f1c01640504000c05041c0d64050425140c0d0f0d1f1d0004055c0d0f0 + d0f0d0f0d001425140c0d0f1d1f0d003c05041c0d603c040f1c0d604c0f0c0b606c70f0f0f0187041000100001c00f0f + 0f0f0f006d00669168f491f462f1c391c3f162f491f4689166006d0f0c52400b52400b51400087041000100001c00f0f + 03670662d3620462d0f3d0620361d0f5d0610361d0f5d0610361d012f2d0610361d0f5d0610361d0f5d0610362d0f3d0 + 620462d36206670f52400b52400b51400087041000100001c00f0ae0b00893e2b005931091e2b00180961090e2b00281 + 96e2b004819380e2b00683e3b00ae3b00793e2b005931091e1b00280961090e1b0038196e0b006819380524006830052 + 400b51400087041000100001c00f03620b60126003200460119011600221036010921060250260119011600221046012 + 60032006620c620b60126002200560119011600021056010921060250260119011600021066012600220524003620452 + 400b51400087041000100001c00f0f01fb03f272f503f272f503f272f503fb03db03d2f2d503d2f2d503d2f2d503db0f + 0d52400b52400b51400087041000100001c00f0f04f607f194f0d005f090f092f2d004f392f050f0d004f095f050f0d0 + 04f093f250f203f554f0d004d0f070f152f1d004f370f050f070f0d004f074f071f0d004f077f0d004f9d006d80f0087 + 041000100001c00f05c0b0c10bc0b0c10ac0b0c308c0b0c506c0b0c70f04300120004001600190023001200240016008 + 2000400160082002400160062002400150006003500120024001600620024003600420015001400f0687041000100001 + c00f0f0af10cf0c1b00bf0c1b006f0c5b106c0b606c1b00cc0b10bc1b003f106c0b102f0c1b004f0c0b003f0c1b004c8 + b105b80f0f0387041000100001c00f03200f2000f608f320f1b0022300f120f120f0b007f420f0b007f120f120f0b006 + d120f120f1b0052040d1f4b004204120d0b503204120e0b008204120e0b00120002003204120e0b002200120024120e0 + b003200620e0b004200f0487041000100001c00f03800d800d8001800a80018004400580008001800140500580008000 + 800140514301800080008000405601800080008001405143018000800180014050058001800440068001800c800f800f + 0f0a87041000100001c00f02800f80036002600380018001609060006090600380018000620062018001800080006090 + 6000609060028000800080016002600380008000800a8000800080098001800080016002600480018000609060006090 + 600280018001620062048002609060006090600380046002600f0f0187041000100001c003f6b005f241f021f2b002f0 + 51f041f021f061f0b001f051f661f0b000f405f3d0f041f006f081f0b0f041f006f081f0b0f306f3b0f091f006f0a1f0 + b0f091f006f0a1f0b0f405f3b000f0b1f6c1f0b0d000f0b1f071f0e1f0c1f0b0d001f271f0e1f1524002d0f6b0524003 + d751400087041000100001c00f0f05c706c0f0c0d604c0f2c01603c040f040c0d603c0504050c0d0f1d0f1d001425140 + c0d2f0d2004055c0d0f1d0f1d04050425140c0d640504000c05040f0c0d64050400140f0c0b60040504002c701405040 + 0c4050400c4050400c87041000100001c00f0f05c706c0f0c0d604c0f2c01603c040f040c0d603c0504050c0d0f1d301 + 425140c0d2f2d0004055c0d0f1d34050425140c0d640504000c05040f0c0d64050400140f0c0b60040504002c7014050 + 400c4050400c4050400c87041000100001c00f0f05c706c0f0c0d604c0f2c01603c040f040c0d603c0504050c0d0f0d1 + f1d001425140c0d0f0d0f0d0f0d0004055c0d0f1d1f0d04050425140c0d640504000c05040f0c0d64050400140f0c0b6 + 0040504002c7014050400c4050400c4050400c87041000100001c00f03200f2000f608f221f1b0022300f120f020f1b0 + 07f020f120f1b0054000f024f0b0055040f320f1b002425140f5b0014055b60040504251400740504001504002200020 + 02405040014003200120014050400620044050400620044050400c87041000100001c00f0f018b0285b2840185b0c1b0 + 830185b1c0b0830285b1c0b0810bb0c0b00db0c0b008402002b0c0b001402103402002b0c003402603b00740200c4020 + 0252400b52400b51400087041000100001c00f06900bf290f207f0b290b2f005f0b390b3f003f0b3908090b3f002f0b2 + 9080b5f002f0b19080b6f002f0b09080b7f002f0b080b8f002f0b3908090b3f003f0b390b3f005f0b290b2f007f290f2 + 00524006900352400b51400087041000100001c00f0f018b0285b2840185b0c1b0830185b1c0b0830285b1c0b0810bb0 + c0b00db0c0b00db0c0b0027200f203b0027300f3067300f3077200f20252400b52400b51400087041000100001c00f0f + 4c025c400142594001d2405740d0044052f25140054051f052f05040054052f251400540574002425940015c40014cd0 + 01dc0f0f0287041000100001c00f0f4c025c400142594001d2405740d0044052f051f05040054051f45040054055f050 + 400540574002425940015c40014cd001dc0f0f0287041000100001c00f0f4c025c400142594001d2405740d0044051f0 + 51f15040054051f050f050f05040054052f051f050400540574002425940015c40014cd001dc0f0f0287041000100001 + c00f0f02690461c0f5c0610361f1c3f1610361f0c0f3c0f0610361f0c0f3c0f0610361f0c0f3c0f0610361f0c0f3c0f0 + 610361f1c3f1610361c0f5c06104690f07f001f002524003f402524007f00251400087041000100001c00f0f02690461 + c0f5c0610361f1c3f1610361f0c0f3c0f0610361f0c0f3c0f0610361f0c0f3c0f0610361f0c0f3c0f0610361f1c3f161 + 0361c0f5c06104690f06f001f102524003f000f000f002524004f001f00251400087041000100001c00f0f05430a40d3 + 400840d0004100d04007405000415000405006405000d150004050064050044050064050044050064050044050064050 + 004101405006405000415000405006d04050d15040d008d043d00ad30f0587041000100001c00f0f02b904b019c003b0 + 1320102111c003b010211020112011c003b01320102210c003b019c003b019c003b014f011f010c003b013f010f010f0 + 10c003b013f011f011c003b019c004c9d006d70f0287041000100001c00f0f02b904b019c003b019c003b01220132010 + c003b0112610c003b0172010c003b019c003b014f011f010c003b013f010f010f010c003b013f011f011c003b019c004 + c9d006d70f0287041000100001c00f0f02b904b019c003b0122015c003b011201121102010c003b01120112013c003b0 + 122114c003b019c003b014f011f010c003b013f010f010f010c003b013f011f011c003b019c004c9d006d70f02870410 + 00100001c00f0f02b904b019c003b01122122010c003b011201020122010c003b011201020122010c003b01120112211 + c003b019c003b014f011f010c003b013f010f010f010c003b013f011f011c003b019c004c9d006d70f02870410001000 + 01c00f05c0b0c10bc0b0c10ac0b0c308c0b0c506c0b0c70f088001800c810f0f0f0f0f0f0f0687041000100001c00f08 + 820f80059400810790630280069060f40180059060f052f0089060f052f06090069060f052f0609008f052f060900580 + 01f4609006800263900781009405800f820f0987041000100001c00f0f05968007958107948060800793806180038002 + 9280628003800292806280038002928062800380018092806280048000819180618090058300f050f0088101f1098002 + f00f0f0587041000100001c00f08f00ef1098002f050f0088191f051f0068390f052f00480008191f052f00380018092 + f052f003800292f052f003800292f052f003800293f051f00794f050f00795f10796f00f0f0187041000100001c00f0f + 0397079085900780658006f057f004f059f003fb04809705829604849506800e800f8002800b820f0787041000100001 + c00f04820b80028009800e800c849505829606809705fb03f059f004f057f0068065800790859007970f0f0387041000 + 100001c00f0f04c706c0f0c0d604c0f2c01603c0f140c0d603c0f04050c0d0f1d0f1d003c0f051c0d2f0d203c0f04050 + c0d0f1d0f1d003c0f140c0d603c0f2c0d604c0f0c0b606c70f0f0f0287041000100001c00f0f04c706c0f0c0d604c0f2 + c01603c0f140c0d603c0f04050c0d0f1d303c0f051c0d2f2d003c0f04050c0d0f1d303c0f140c0d603c0f2c0d604c0f0 + c0b606c70f0f0f0287041000100001c00f0f04c706c0f0c0d604c0f2c01603c0f140c0d603c0f04050c0d0f0d1f1d003 + c0f051c0d0f0d0f0d0f0d003c0f04050c0d0f1d1f0d003c0f140c0d603c0f2c0d604c0f0c0b606c70f0f0f0287041000 + 100001c00f0f08900e910a95089607928191800791800190800891028009910d810f0f0f0f0f0987041000100001c00f + 0f0f0f0f03810d910d9102800991800190800892819180089609950c910d900f0f0587041000100001c00f0f0f05f10c + f020f00bf021f604f028f003f029f004f028f005f021f606f020f00df10f0f0f0f0787041000100001c00f0f0f07f10d + f090f006f691f005f098f004f099f003f098f004f691f00bf090f00cf10f0f0f0f0587041000100001c00bf00df10cf0 + 50f00bf051f00af052f0058003f052f0048103f052f0038500f052f0048103f052f0058003f052f00af052f00bf051f0 + 0cf050f00df10ef00f0287041000100001c00f02f00ef10df050f00cf051f00bf052f00af052f0038005f052f0038104 + f052f0008503f052f0038104f052f0038005f052f00af051f00bf050f00cf10df00b87041000100001c00f0f0f04f805 + f196f004f090f096f003f396f003f093f092f090f003f093f490f003f097f090f003f099f003f099f003fb0f0f0f0187 + 041000100001c00f0f0f04f805f156f004f050f056f003f351f051f050f003f053f051f150f003f053f050f050f050f0 + 03f054f051f050f003f059f003f059f003fb0f0f0f0187041000100001c00f0f0f04f805f146f004f040f046f003f346 + f003f043f042f040f003f043f040f040f040f003f044f040f041f003f049f003f049f003fb0f0f0f0187041000100001 + c00f0f0f04f805f136f004f030f036f003f330f232f003f035f032f003f033f430f003f035f032f003f039f003f039f0 + 03fb0f0f0f0187041000100001c00f0f0f04f805f176f004f070f076f003f370f270f070f003f073f070f070f070f003 + f073f070f070f070f003f073f071f071f003f079f003f079f003fb0f0f0f0187041000100001c0f9e1fce021e0fbe021 + e0f6e1f3e1f0e1f3e021e0f4e021e0f2e021e0f4e021e0f3e1f6e1fce021e0fbe021e0f3e1f6e1f3e021e0f4e021e0f2 + e021e0f4e021e0f3e1f3e1f0e1f9e021e0fbe021e0fce1f387041000100001c00f0f0444094051305140074051f03052 + 40054051f051f15140044052f050f25040044054f0215040044052f050f0215040044051f051f0205140054051f03052 + 40d0064051305140d00844d00ad30f0f0587041000100001c00f0f04440940544007405640054051f150f05240044055 + f05140044055f05140044055f05140044051f150f0524005405640d006405440d00844d00ad30f0f0587041000100001 + c00f0f0543028006405340008090054050f050f0514091054053f0504091054053f0504091054050f050f05140910640 + 53409207438092048002d081918103800140819280d10380004050809181d00580014082d1078001d20f068704100010 + 0001c00f0f03f1620960f2716007607010f17260066071f170f07160056075f07160046075f07160046071f170f07160 + d0046070f27260d0066010f17160d008f162d00ad30f0f0f0687041000100001c00f0f04440940544007405640054051 + f151f05140044054f05240044054f05240044054f05240044051f151f0514005405640d006405440d00844d00ad30f0f + 0587041000100001c00f0f0b200d210c220627e00527e0d00521e5d00620e0d507e905e0d0e0d0e0d0e0d0e0d005e906 + d80f0f0f0287041000100001c00f0660800c6090800a9160508002900590116090800090019003901091605080019000 + 9003927060908100900090039170f06050810090009003917160908100900090039170f0605080d00090009004917060 + 90800090019005916050800290086090800cd060800dd10f0687041000100001c00f0321d00b20d140d00920d00140d0 + 09d00140d00c40d00151d00740d00150d170d00640d00050d00170d006d051d00170d008d10170d00c70d00190d00970 + d00090d00ad091d00cd10f0f0587041000100001c00f0f0230023009305030013002300630013050300c3050300a3152 + 3106315631063152310a3050300c3050300830033002300a3001305030073004300f0f0387041000100001c00f0f0444 + 09405440074050f05440054051f05540044053f25140044053f1205140044053f1205140044051f05540054050f05440 + d006405440d00844d00ad30f0f0587041000100001c00f02800f800c8001800c80018009800180008002420480008000 + 80014050105040038000800080014012400380008000800140501050400280018000800242058001800a8001800d800d + 800f0f0b87041000100001c00f0f04b0c606b010b6c004b011b1c0b3c003b012b0c0b4c003b012b0c0b1c0b0c103b010 + b010b0c0b1c0b1c003b012b1c1b2c003b012b6c003b011b0d6b003b010b0d3b0d1b0d003b1d1b0d3b0d005b7d00cd10f + 0487041000100001c04e004e0048f0c010420041f0c01042f0c012410041f0c01041f0c014400041f0c01043f0c01042 + 0041f0c010c041f0c011420042f011c211430043f01444004e0044104210440045104010450046104600451040104500 + 4410421044004e0087041000100001c01df11cf0c11cf0c11f17f11cf0c11cf0c11f17f11cf0c11cf0c11f1f19f11cf0 + c11cf0c11f87041000100001c00f0414081124b1051028b0041028b003102ab002102ab002102ab002102ab002102ab0 + 03b028b0d003b028b0d004b124b1d007b4d109d40f0487041000100001c00f0414081174b1051078b0041078b003107a + b002107ab002107ab002107ab002107ab003b078b0d003b078b0d004b174b1d007b4d109d40f0487041000100001c00f + 0414081184b1051088b0041088b003108ab002108ab002108ab002108ab002108ab003b088b0d003b088b0d004b184b1 + d007b4d109d40f0487041000100001c00f04140811a4b10510a8b00410a8b00310aab00210aab00210aab00210aab002 + 10aab003b0a8b0d003b0a8b0d004b1a4b1d007b4d109d40f0487041000100001c00f0414081154b1051058b0041058b0 + 03105ab002105ab002105ab002105ab002105ab003b058b0d003b058b0d004b154b1d007b4d109d40f04870410001000 + 01c00f04140811f4b10510f8b00410f8b00310fab00210fab00210fab00210fab00210fab003b0f8b0d003b0f8b0d004 + b1f4b1d007b4d109d40f0487041000100001c002224151740222415175012241517382012141527283012141517282c1 + 012141517182c2012141517181c1a1012141517181c1a0022141517181c1a0022141517181c1a1012141517182c20121 + 41517282c1012141527283012241517382022241517503224152730087041000100001c0cfc1d0c3d0c8d010d0cdd0ca + d0cfcad0cdd010d0c7d0c4d0cfc9d0c210c9d010d0cdd0cfc6d0c3d0c8d010d0cdd0cfc187041000100001c000200a20 + 02200a20022002f003f00120022001f60120022007f0012002200a20022001f001f30120022001f001f001f001200220 + 01f301f0012002200a200220004006400020022000480020022000400640002002200a2002200a2002200a2001870410 + 00100001c00f0f05c00dc706c010c0b014c004c110c411c003c000c0d0c0b0d4c003f000f0d0f0c3d1f003f000f0d0f0 + b0d4f004f1b0f0c3b1f005f0b0f0c0b4f006f7d007f000d40f0f0f0287041000100001c00f0f0f05f30bf051f00bf051 + f008f351f305f057f005f057f005f351f308f051f00bf051f00bf30f0f0f0587041200120001c0dfd105d0c0d1c0d1c0 + d1c0d1c0d1c0d005dfd105dfd105d0c0ddc0d005dfd105dfd105d0c0ddc0d005dfd105dfd105d0c0ddc0d005dfd105df + d105d0c0ddc0d005dfd105dfd105d0c0d1c0d1c0d1c0d1c0d1c0d005dfd10587041200120001c0bfb105b0d0b1d0b1d0 + b1d0b1d0b1d0b005bfb105bfb105b0d0bdd0b005bfb105bfb105b0d0bdd0b005bfb105bfb105b0d0bdd0b005bfb105bf + b105b0d0bdd0b005bfb105bfb105b0d0b1d0b1d0b1d0b1d0b1d0b005bfb10587040e00140001c0dfd303dfd303dfd304 + dfd106df08dd0adb0cd90ed70f00d50f02d30f04d10f0f0f0c87040900090001c000f607f016f006f016f006f016f006 + f016f006f016f006f016f006f016f007f60787042000210001c00017b00c17b00710b00f0c10b00610b00f0c10b00610 + b00f0c10b00610b00f0c10b00610b00f0c10b00610b00f0c10b00610b00f0c10b00610b00f0c10b00f0f0f0f0f0f0511 + b00f0f0411b00f0f0411b00f0f0411b00f0f0019b00f0c19b00f0f0011b00f0f0411b00f0f0411b00f0f0411b00f0f0f + 0f0f0f0510b00f0c10b00610b00f0c10b00610b00f0c10b00610b00f0c10b00610b00f0c10b00610b00f0c10b00610b0 + 0f0c10b00610b00f0c10b00717b00c17b00787041000100001c00f0f008c02d38802d380301602d380301602d3803016 + 0282d08030160282d080301602d380301602d380301602843016038b048a07d60f0287041000100001c00f0f008c02d3 + 8802d380301602d380301602d38030160282d0803011f011f0100282d0803010f41002d3803014f01002d38030160284 + 3016038b048a06d70f0287041000100001c00f0f008c02d38802d380301602d380301602d38030160282d0803010f011 + f1100282d0803010f010f010f01002d3803011f011f01002d380301602843016038b048a06d70f0287041000100001c0 + 0f0f008c02d38802d380301602d380301602d38030160282d0803010f012f0100282d0803010f010f010f01002d38030 + 11f21102d380301602843016038b048a06d70f0287041000100001c00f0f012b0221492101204b2001204b2001204b20 + 01204b2001204b2001204b2001204b2001204b2001214921022b0f0f0187041000100001c00f0f01cb02cd01cd01cd01 + cd01cd01cd01cd01cd01cd01cd02cb0f0f0187041000100001c01f1f1f15c517c1f5c015c0f8c013c0fac011c0fbc011 + c0fbc011c0fbc011c0fac013c0f8c015c0f5c117c51f1f1587041000100001c01f1f1f1f1f1f1f1f17f01f1f1f1f1f1f + 1f1687042000210001c0001f1db0071f1fb0061f1fb0061f1fb00613bf1bb00612b01fb01ab00612b01fb0d019b00612 + b0154315b0d019b00612b01341534113b0d019b00612b01240574012b0d019b00612b01240574012b0d019b00612b011 + 4051f151f0524012b1d017b00612b0114056f0514014b0d016b00612b0114056f0514015b0d015b00612b0114051f151 + f0524012b110b0d015b00612b01240574012b0d1b1d015b00612b01240574012b0d000d116b00612b01341534113b084 + 15b00612b015431580638114b00612b01e80658113b00612b01d806113618112b00613bd8060106010638112b00615db + 8060106010638112b0061f11806113618112b0061f12806581d012b0061f13806381d013b0061f1484d014b0061f15d3 + 15b0061f1fb0061f1fb0061f1fb0071f1db00787041000100001c00f06f407f490f403f4901090f302f112f190f1d103 + f012d0f405f012d0f405f012d0f405f012d0f405f012d0f405f012d0f405f110d1f190f106f4901090f304f490f407f4 + d10ad30287041000100001c00f0f0f04c20bc071c00ac072c603c079c002c07ac003c079c004c072c605c071c0d407c2 + d00dd10f0f0f0687041000100001c00f0f0f03c20bc071c00ac072c000c200c100c000c073c000c070c00070c00070c0 + 74c000c070c00070c0007000c073c000c070c00070c0007001c072c000c200c100c002c071c001d101d000d003c20ed0 + 0f0f0f0887041000100001c00f0f0f0f07c20cc071c005c672c004c079c003c07ac002c079c003c672c006d3c071c00b + c20f0f0f0487041000100001c00f04c00dc070c00bc072c009c074c007c076c006c076c006c272c208c072c0d009c073 + c009c074c504c078c005c077c006c076c007c709d40187041000100001c006c20cc071c009c272c007c076c005c078c0 + 03c078c004c072c172c0d004c072c171c0d005c073c2d006c074c0d008c074c504c078c005c077c006c076c007c709d4 + 018704100010000000d0222dd2222dd200d0222dd2222dd200d022dddd22dddd00d0222dd2222dd200d0dd2dd2dd2dd2 + 00d0222dd2222dd200d0222dd2222dd200d022dddd22dddd00d0222dd2222dff0fd0dd2dd2fdff19ffd0222dd2f2d1ff + 0fd0222dd2f2d1ff0fd022ddddf2d1ff0fd0222dd2f2d1ff0fd0dd2dd2fdff19ffd0222dd2222dff0f87041000100001 + c00f00b2d2b2d2b101dd01dd01dd01dd01cd01fac201f6c3f201c7f29010f100d7f010d0f201d7f010d0f201d7f010d0 + f201d7f010d0f201b2d2b1f29010f10bf20087041000100001c00f06d706d016d005d016d005d016d005d016d006d70f + 07d707d016d007d016d007d016d007d016d007d70f0f0087041000100001c00fc5b0d7b0f5d076d0f5d076d0f5d076d0 + f2c1b0d076d0b0c202d70f07d707d016d007d016d007d016d007d016d007d70f0f0087041000100001c00f06d706d016 + d005d016d005d016d005d016d006d70f07d704c1b0d076d0b0c2f3d076d0f7d076d0f7d076d0f0c5b0d7b00f0f870410 + 00100001c00f06d706d076d005d076d005d076d002c1b0d076d0b0c2f2d7fff7d7f4c1b0d076d0b0c203d076d007d076 + d007d076d007d70f0f0087041000100001c00fcfffffffcf0f0f06d706d016d005d016d005d016d005d016d006d70f07 + d70487041000100001c002d70f07d707d016d007d016d007d016d007d016d007d70f0f00cfffffffcf0f ` // u16le record offset per image index; identical images share an offset. const OFFSETS = hex` - 0000ad00ee00250160019d01f50120027902c50255043b0578069906c206f30634077b07ba07f9075808b708fc083909 - 8d09e6093d0a6f0ad30a330b9b0bcb0b160c6a0cca0cff0c540dae0deb0d500ea70e210f990ffe0f5f10c81030117f11 - e1112b126a12a912ee124713a61303145a14ab1402155f158b15d81529167b16ae16e11631177d17d117fc1727185718 - 8718cf18171954199b19de191b1a641abd1a161b5e1bc01b0e1c561c8a1cfe1c521d991de31d391e961efd1e2a1f6b1f - ac1fed1f2e206f20b02021215921c22111224422a42204232e235723172457249f24ed24392572259725cd25e725 + 0000ad00ee0025016001a001ec0129028102ac0205035103e104c7050407de094e0ac30ae40a0d0b3e0b7f0bc60b050c + 440ca30c020d470d840dd80d310e880eba0e1e0f7e0fe60f16106110b51015114a119f11f91136129b12f2126c13e413 + 4914aa1413157b15ca152c167616b516f41639179217f1174e18a518f6184d19aa19d619231a741ac61af91a2c1b7c1b + c81b1c1c471c721ca21cd21c1a1d621d9f1de61d291e661eaf1e081f611fa91f0b205920a120d52049219d21e4212e22 + 8422e12248237523b623f72338247924ba24fb246c25a4250d265c268f26ef264f277927a2276228a228ea2838298429 + bd29e229182a322a632bb42be72b442c752cb62c012d892dd22d072e422e7d2eba2ee22e ` const PACK = new ui.ImagePack(BLOB, OFFSETS) /** Number of image indices in the pack. */ - export const count = 119 + export const count = 138 /** The image at a pack index, decoded on first use and then cached. */ export function byIndex(index: number): Bitmap { @@ -237,8 +281,8 @@ namespace _img { } // String keys, and the pack index of each. - const KEYS = "blocks1,blocks2,blocks3,blocks4,blocks5,delete,disk,disk1,disk2,disk3,do_insertion_point,edit_program,largeDisk,largeSettingsGear,led_off,microbitLogo,microbitLogoBtn,microbit_logo,new_program,note_off,note_on,plus,rule_arrow,rule_down,rule_handle,rule_up,run,runDisabled,smiley_buttons,solid_red,stop,stopDisabled,when_insertion_point".split(",") - const KEY_INDEX = hex`0c0d0e0f10676e6f70716a090b0a730001366d7574686b476c4611127672131469` + const KEYS = "blocks1,blocks2,blocks3,blocks4,blocks5,delete,disk,disk1,disk2,disk3,do_insertion_point,edit_program,largeDisk,largeSettingsGear,led_off,microbitLogo,microbitLogoBtn,microbit_logo,microcodeLogo,new_program,note_off,note_on,plus,rule_arrow,rule_down,rule_handle,rule_up,run,runDisabled,smiley_buttons,solid_red,stop,stopDisabled,when_insertion_point".split(",") + const KEY_INDEX = hex`11121314156c737475766f0b0d0c7800013b0e727a796d704c714b16177b7718196e` /** Pack index for a string key, or -1 when no image has it. */ export function indexOfName(name: string): number { @@ -249,12 +293,12 @@ namespace _img { // Numeric key -> pack index + 1; 0 means the key names no image. const NUM_INDEX = hex` - 00000000000000000000160517091819071a1b1c1d1e061f20000008212223000000000000000000242500262728292a - 2b2c2d2e002f303100000000000000000000000000003233340304353637000000000038393a3b253c003d3e3f404142 - 434445464748000000000000494a60640000000000000000000000000000000000000000000000000000000000000000 - 0000000000004b4c4d4e4f00000000005000005152535455565758595a4243445b5c5d5e07005f606162636465660000 - 0000140000005f6061640000606419061b00000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000006767 + 000000000000000000001b071c0b1d1e091f2021222308242583840a262728000000000000000000292a002b2c2d2e2f + 303132337d343536000000000000000000000000000037383903043a3b3c00000000003d3e3f402a4100424344454647 + 48494a4b4c4d86878885898a4e4f65690000000000000000000000000000000000000000000000000000000000000000 + 00000000000050515253540000000000550000565758595a5b5c5d5e5f4748496061626309006465666768696a6b7e80 + 8105197f820664656669101100001e082000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000006c6c ` /** Pack index for a numeric key, or -1 when no image has it. */ diff --git a/img.keys.json b/img.keys.json index ecb8b661..c70d28ec 100644 --- a/img.keys.json +++ b/img.keys.json @@ -15,6 +15,8 @@ "22": "ui.magnet", "23": "kita_slider", "24": "kita_rotary", + "25": "car_wall", + "26": "line_sensor", "27": "ui.led_light_sensor", "28": "soil_moisture", "29": "distance_sensor", @@ -30,6 +32,7 @@ "49": "cupYassign", "50": "cupZassign", "51": "showNumber", + "52": "car", "53": "servo_set_angle", "54": "relay", "55": "servo_power", @@ -59,6 +62,12 @@ "99": "kita_rotary_right", "100": "temp_warmer", "101": "temp_colder", + "102": "line_left_on", + "103": "line_right_on", + "104": "line_both_on", + "105": "line_neither_on", + "106": "line_none_from_left", + "107": "line_none_from_right", "108": "moveFaceUp", "109": "moveFaceDown", "110": "tile_color_green", @@ -95,13 +104,20 @@ "187": "tile_color_black", "188": "tile_rainbow", "189": "tile_sparkle", + "190": "car_forward", + "191": "car_reverse", + "192": "car_left_turn", + "193": "car_right_turn", "194": "stop", + "195": "car_forward_fast", + "196": "car_left_spin", + "197": "car_right_spin", "198": "tile_color_red", "199": "tile_color_green", "200": "tile_color_blue", "201": "tile_color_black", - "204": "tile_color_green", - "205": "tile_color_black", + "202": "arm_open", + "203": "arm_close", "206": "light_sensor", "207": "ui.magnet", "208": "microphone", @@ -109,6 +125,7 @@ "255": "decimalEditor" }, "names": { + "microcodeLogo": "microcodeLogo", "blocks1": "blocks1", "blocks2": "blocks2", "blocks3": "blocks3", diff --git a/interpreter.ts b/interpreter.ts index e048f5a8..0d4f83b8 100644 --- a/interpreter.ts +++ b/interpreter.ts @@ -16,7 +16,9 @@ namespace microcode { LEDScreen = 1000, Speaker, RadioGroup, // well radio group affects subsequent radio.send + RadioSend, PageCounter, + Car, } function getOutputResource(action: Tid) { @@ -30,11 +32,15 @@ namespace microcode { return action case Tid.TID_ACTUATOR_RADIO_SET_GROUP: return OutputResource.RadioGroup + case Tid.TID_ACTUATOR_RADIO_SEND: + return OutputResource.RadioSend case Tid.TID_ACTUATOR_MUSIC: case Tid.TID_ACTUATOR_SPEAKER: return OutputResource.Speaker case Tid.TID_ACTUATOR_SWITCH_PAGE: return OutputResource.PageCounter + case Tid.TID_ACTUATOR_CAR: + return OutputResource.Car } return undefined } @@ -94,6 +100,12 @@ namespace microcode { if (resource == OutputResource.LEDScreen) { led.stopAnimation() } else if (resource == OutputResource.Speaker) music.stopAllSounds() + else if (resource == OutputResource.Car) + this.interp.runAction( + this.index, + Tid.TID_ACTUATOR_CAR, + robot.robots.RobotCompactCommand.MotorStop, + ) this.actionRunning = false // give the background fiber chance to finish unless it is waiting while (this.wakeTime == 0 && this.backgroundActive) { @@ -272,7 +284,8 @@ namespace microcode { case Tid.TID_ACTUATOR_SHOW_NUMBER: case Tid.TID_ACTUATOR_RADIO_SEND: case Tid.TID_ACTUATOR_RADIO_SET_GROUP: { - return this.interp.getValue(this.rule.modifiers, 0) + const ret = this.interp.getValue(this.rule.modifiers, 0) + return ret } case Tid.TID_ACTUATOR_SWITCH_PAGE: { let targetPage = 1 @@ -320,6 +333,11 @@ namespace microcode { param = this.rule.modifiers[this.modifierIndex] break } + case Tid.TID_ACTUATOR_CAR: { + const mod = this.rule.modifiers[this.modifierIndex] + param = getCarParam(mod) + break + } default: param = this.getParamInstant() } @@ -370,6 +388,7 @@ namespace microcode { | Tid.TID_SENSOR_PRESS | Tid.TID_SENSOR_RELEASE | Tid.TID_SENSOR_RADIO_RECEIVE + | Tid.TID_SENSOR_CAR_WALL export type ActionTid = | Tid.TID_ACTUATOR_PAINT @@ -378,6 +397,7 @@ namespace microcode { | Tid.TID_ACTUATOR_MUSIC | Tid.TID_ACTUATOR_RADIO_SEND | Tid.TID_ACTUATOR_RADIO_SET_GROUP + | Tid.TID_ACTUATOR_CAR export interface RuntimeHost { emitClearScreen(): void @@ -478,6 +498,7 @@ namespace microcode { this.sensors[tid] = undefined } this.sensors[Tid.TID_SENSOR_RADIO_RECEIVE] = 0 + this.sensors[Tid.TID_SENSOR_CAR_WALL] = 0 this.startSensors() this.running = true // get ready to receive events diff --git a/pxt.json b/pxt.json index bb1a9513..c0328488 100644 --- a/pxt.json +++ b/pxt.json @@ -16,6 +16,7 @@ "README.md", "img.g.ts", "assets.ts", + "robot.ts", "field-editor-model.ts", "language.ts", "tiles.ts", @@ -45,8 +46,6 @@ "target": "7.1.13", "targetId": "microbit" }, - "supportedTargets": [ - "microbit" - ], + "supportedTargets": ["microbit"], "preferredEditor": "tsprj" } diff --git a/robot.ts b/robot.ts index a8922d7b..03effb25 100644 --- a/robot.ts +++ b/robot.ts @@ -1,33 +1,5 @@ namespace microcode { - function carImages(name: string | number) { - if (name == Tid.TID_ACTUATOR_CAR) return icondb.car - if (name == Tid.TID_MODIFIER_CAR_FORWARD) return icondb.car_forward - if (name == Tid.TID_MODIFIER_CAR_REVERSE) return icondb.car_reverse - if (name == Tid.TID_MODIFIER_CAR_TURN_LEFT) return icondb.car_left_turn - if (name == Tid.TID_MODIFIER_CAR_TURN_RIGHT) - return icondb.car_right_turn - if (name == Tid.TID_MODIFIER_CAR_STOP) return icondb.stop - if (name == Tid.TID_MODIFIER_CAR_FORWARD_FAST) - return icondb.car_forward_fast - if (name == Tid.TID_MODIFIER_CAR_SPIN_LEFT) return icondb.car_left_spin - if (name == Tid.TID_MODIFIER_CAR_SPIN_RIGHT) - return icondb.car_right_spin - if (name == Tid.TID_MODIFIER_CAR_ARM_OPEN) return icondb.arm_open - if (name == Tid.TID_MODIFIER_CAR_ARM_CLOSE) return icondb.arm_close - if (name == Tid.TID_SENSOR_CAR_WALL) return icondb.car_wall - if (name == Tid.TID_SENSOR_LINE) return icondb.line_sensor - if (name == Tid.TID_FILTER_LINE_LEFT) return icondb.line_left_on - if (name == Tid.TID_FILTER_LINE_RIGHT) return icondb.line_right_on - if (name == Tid.TID_FILTER_LINE_BOTH) return icondb.line_both_on - if (name == Tid.TID_FILTER_LINE_NEITHER) return icondb.line_neither_on - if (name == Tid.TID_FILTER_LINE_NEITHER_LEFT) - return icondb.line_none_from_left - if (name == Tid.TID_FILTER_LINE_NEITHER_RIGHT) - return icondb.line_none_from_right - return null - } - - function getCarParam2(tile: Tile) { + export function getCarParam(tile: Tile) { const tid = getTid(tile) switch (tid) { case Tid.TID_MODIFIER_CAR_FORWARD: @@ -64,7 +36,7 @@ namespace microcode { } namespace icondb { - // Not packable: carImages returns this const directly. + //% packable whenUsed export const car = bmp` . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . @@ -84,7 +56,7 @@ namespace icondb { . . . . . . . . . . . . . . . . ` - // Not packable: carImages returns this const directly. + //% packable whenUsed export const car_forward = bmp` . . . . . . . . . . . . . . . . . . . . . . . c . . . . . . . . @@ -103,7 +75,7 @@ namespace icondb { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ` - // Not packable: carImages returns this const directly. + //% packable whenUsed export const car_forward_fast = bmp` . . . . . . . c . . . . . . . . . . . . . . c 7 c . . . . . . . @@ -123,7 +95,7 @@ namespace icondb { . . . . . c 7 7 7 c d . . . . . ` - // Not packable: carImages returns this const directly. + //% packable whenUsed export const car_reverse = bmp` . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . @@ -143,7 +115,7 @@ namespace icondb { . . . . . . . . . . . . . . . . ` - // Not packable: carImages returns this const directly. + //% packable whenUsed export const car_left_turn = bmp` . . . . . . . . . . . . . . . . . . . . . c c c . . . . . . . . @@ -163,7 +135,7 @@ namespace icondb { . . . . . . . . . . . . . . . . ` - // Not packable: carImages returns this const directly. + //% packable whenUsed export const car_left_spin = bmp` . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . @@ -183,7 +155,7 @@ namespace icondb { . . . . . . . . . . . . . . . . ` - // Not packable: carImages returns this const directly. + //% packable whenUsed export const car_wall = bmp` . . . . . . . . . . . . . . . . d d d d d d d d d d d d d d d d @@ -203,7 +175,7 @@ namespace icondb { . . . . . . . . . f . . . . f . ` - // Not packable: carImages returns this const directly. + //% packable whenUsed export const line_sensor = bmp` . . . . . . . . . . . . . . . . . b d d d d c f f c d d d d b . @@ -222,7 +194,7 @@ namespace icondb { . b d d d d c c f f f f f f f f . . . . . . . . . f . . . . f . ` - // Not packable: carImages returns this const directly. + //% packable whenUsed export const line_neither_on = bmp` . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . @@ -241,7 +213,7 @@ namespace icondb { . d d . . . . . . . . . d d . . . . . . . . . . . . . . . . . . ` - // Not packable: carImages returns this const directly. + //% packable whenUsed export const line_left_on = bmp` . c f f f c . . . . . . . . . . . c f f f c . . . . . . . . . . @@ -259,7 +231,7 @@ namespace icondb { . d 7 d f c . . . . . d 1 d . . . d d f f c . . . . . . d d . . . b f f f c . . . . . . . . . .` - // Not packable: carImages returns this const directly. + //% packable whenUsed export const line_right_on = bmp` . . . . . . . . . c f f f c . . . . . . . . . . . c f f f c . . @@ -278,7 +250,7 @@ namespace icondb { . d d . . . . . . c f f d d . . . . . . . . . . . c f f f b . . ` - // Not packable: carImages returns this const directly. + //% packable whenUsed export const line_both_on = bmp` . . . . . c f f f c . . . . . . . . . . . c f f f c . . . . . . @@ -298,7 +270,7 @@ namespace icondb { . . . . . c f f f c . . . . . . ` - // Not packable: carImages returns this const directly. + //% packable whenUsed export const line_none_from_left = bmp` . c f f f c . . . . . . . . . . . c f f f c . . . . . . . . . . @@ -318,7 +290,7 @@ namespace icondb { . c f f f c . . . . . . . . . . ` - // Not packable: carImages returns this const directly. + //% packable whenUsed export const line_none_from_right = bmp` . . . . . . . . . . c f f f c . . . . . . . . . . . c f f f c . diff --git a/screens/editor.ts b/screens/editor.ts index 84d99e10..aeb1b7ab 100644 --- a/screens/editor.ts +++ b/screens/editor.ts @@ -1507,7 +1507,7 @@ namespace microcode { const buffer = this.progdef_.toBuffer() this.queueAutosave(buffer) } - if (wasRunning) runProgram(this.progdef_) + // if (wasRunning) runProgram(this.progdef_) return changed } diff --git a/screens/home.ts b/screens/home.ts index f8df2e83..91c3a5ca 100644 --- a/screens/home.ts +++ b/screens/home.ts @@ -133,7 +133,7 @@ namespace microcode { this.logoOffset_ = Math.min(0, this.logoOffset_ + 2) const t = control.millis() const dy = this.logoOffset_ == 0 ? (Math.idiv(t, 800) & 1) - 1 : 0 - const word = this.assets.getBitmap("wordLogo") + const word = this.assets.getBitmap("microcodeLogo") const microbit = this.assets.getBitmap("microbitLogo") const offset = (UI_SCREEN_HEIGHT >> 1) - word.height - HOME_MARGIN const y = offset + dy diff --git a/scripts/README.md b/scripts/README.md deleted file mode 100644 index 8aeb67ab..00000000 --- a/scripts/README.md +++ /dev/null @@ -1,11 +0,0 @@ -Subject: jacscript(devicescript) commit for microcode - -git clone https://github.com/microsoft/devicescript/ -cd devicescript -git checkout jacs_for_microcode -cd compiler -npm install - -// IMPORTANT: we need to use devicescript/jacscript from this commit/branch -// commit 66237c5b09cb463ac5d93446d054c2dbcaa015da -// (HEAD -> jacs_for_microcode, origin / jacs_for_microcode) diff --git a/tiles.ts b/tiles.ts index 5269cc4e..d7e136a0 100644 --- a/tiles.ts +++ b/tiles.ts @@ -193,7 +193,8 @@ namespace microcode { TID_MODIFIER_LIGHT_READ = 206, TID_MODIFIER_MAGNET_READ = 207, TID_MODIFIER_MIC_READ = 208, - MODIFIER_END = 208, + TID_MODIFIER_CAR_WALL_READ = 209, + MODIFIER_END = 209, TID_OPERATOR_START = 210, TID_OPERATOR_PLUS = 210, @@ -411,10 +412,10 @@ namespace microcode { if ( tid == Tid.TID_ACTUATOR_MICROPHONE || tid == Tid.TID_FILTER_ACCEL || - // TODO: no car for now - tid == Tid.TID_SENSOR_CAR_WALL || - tid == Tid.TID_SENSOR_LINE || - tid == Tid.TID_ACTUATOR_CAR + (!CAR_TILES && + (tid == Tid.TID_SENSOR_CAR_WALL || + tid == Tid.TID_SENSOR_LINE || + tid == Tid.TID_ACTUATOR_CAR)) ) return false // TODO: no jacdac for now @@ -424,6 +425,8 @@ namespace microcode { export function defaultModifier(tid: Tid) { switch (tid) { + case Tid.TID_ACTUATOR_CAR: + return Tid.TID_MODIFIER_CAR_STOP case Tid.TID_ACTUATOR_RELAY: case Tid.TID_ACTUATOR_SERVO_POWER: return Tid.TID_MODIFIER_OFF @@ -448,6 +451,7 @@ namespace microcode { case Tid.TID_ACTUATOR_CUP_X_ASSIGN: case Tid.TID_ACTUATOR_CUP_Y_ASSIGN: case Tid.TID_ACTUATOR_CUP_Z_ASSIGN: + case Tid.TID_ACTUATOR_RADIO_SEND: return 0 default: return undefined @@ -764,6 +768,7 @@ namespace microcode { case Tid.TID_MODIFIER_MIC_READ: case Tid.TID_MODIFIER_LIGHT_READ: case Tid.TID_MODIFIER_MAGNET_READ: + case Tid.TID_MODIFIER_CAR_WALL_READ: return "variable" case Tid.TID_OPERATOR_DIVIDE: case Tid.TID_OPERATOR_MINUS: @@ -813,6 +818,12 @@ namespace microcode { case Tid.TID_FILTER_PIN_0: case Tid.TID_FILTER_PIN_1: case Tid.TID_FILTER_PIN_2: + case Tid.TID_FILTER_LINE_BOTH: + case Tid.TID_FILTER_LINE_LEFT: + case Tid.TID_FILTER_LINE_RIGHT: + case Tid.TID_FILTER_LINE_NEITHER: + case Tid.TID_FILTER_LINE_NEITHER_LEFT: + case Tid.TID_FILTER_LINE_NEITHER_RIGHT: return TileKind.EventCode case Tid.TID_SENSOR_LED_LIGHT: @@ -821,13 +832,12 @@ namespace microcode { case Tid.TID_SENSOR_TEMP: case Tid.TID_SENSOR_RADIO_RECEIVE: case Tid.TID_SENSOR_CAR_WALL: - case Tid.TID_SENSOR_LINE: - case Tid.TID_MODIFIER_RADIO_READ: case Tid.TID_MODIFIER_TEMP_READ: case Tid.TID_MODIFIER_LIGHT_READ: case Tid.TID_MODIFIER_MAGNET_READ: case Tid.TID_MODIFIER_MIC_READ: + case Tid.TID_MODIFIER_CAR_WALL_READ: return TileKind.Sensor case Tid.TID_SENSOR_CUP_X_WRITTEN: @@ -885,6 +895,8 @@ namespace microcode { return Tid.TID_SENSOR_MAGNET case Tid.TID_MODIFIER_MIC_READ: return Tid.TID_SENSOR_MICROPHONE + case Tid.TID_MODIFIER_CAR_WALL_READ: + return Tid.TID_SENSOR_CAR_WALL // case Tid.TID_FILTER_ROTARY_LEFT: case Tid.TID_FILTER_DOWN: @@ -900,20 +912,6 @@ namespace microcode { return SensorChange.Up case Tid.TID_MODIFIER_OFF: return SensorChange.Down - // - case Tid.TID_FILTER_LINE_BOTH: - return robot.robots.RobotCompactCommand.LineBoth - case Tid.TID_FILTER_LINE_LEFT: - return robot.robots.RobotCompactCommand.LineLeft - case Tid.TID_FILTER_LINE_RIGHT: - return robot.robots.RobotCompactCommand.LineRight - case Tid.TID_FILTER_LINE_NEITHER: - return robot.robots.RobotCompactCommand.LineNone - case Tid.TID_FILTER_LINE_NEITHER_LEFT: - return robot.robots.RobotCompactCommand.LineLostLeft - case Tid.TID_FILTER_LINE_NEITHER_RIGHT: - return robot.robots.RobotCompactCommand.LineLostRight - // case Tid.TID_FILTER_TIMESPAN_SHORT: return 250 case Tid.TID_FILTER_TIMESPAN_LONG: @@ -964,6 +962,7 @@ namespace microcode { case Tid.TID_SENSOR_PRESS: case Tid.TID_SENSOR_RELEASE: case Tid.TID_SENSOR_RADIO_RECEIVE: + case Tid.TID_SENSOR_CAR_WALL: return -1 // any default: return undefined