/** * @fileoverview * The specMap below handles a few pieces of "translation" work between * the SB2 JSON format and the data we need to run a project * in the Scratch 3.0 VM. * Notably: * - Map 2.0 and 1.4 opcodes (forward:) into 3.0-format (motion_movesteps). * - Map ordered, unnamed args to unordered, named inputs and fields. * Keep this up-to-date as 3.0 blocks are renamed, changed, etc. * Originally this was generated largely by a hand-guided scripting process. * The relevant data lives here: * https://github.com/LLK/scratch-flash/blob/master/src/Specs.as * (for the old opcode and argument order). * and here: * https://github.com/LLK/scratch-blocks/tree/develop/blocks_vertical * (for the new opcodes and argument names). * and here: * https://github.com/LLK/scratch-blocks/blob/develop/tests/ * (for the shadow blocks created for each block). * I started with the `commands` array in Specs.as, and discarded irrelevant * properties. By hand, I matched the opcode name to the 3.0 opcode. * Finally, I filled in the expected arguments as below. */ var specMap = { 'forward:': { 'opcode': 'motion_movesteps', 'argMap': [ { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'STEPS' } ] }, 'turnRight:': { 'opcode': 'motion_turnright', 'argMap': [ { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'DEGREES' } ] }, 'turnLeft:': { 'opcode': 'motion_turnleft', 'argMap': [ { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'DEGREES' } ] }, 'heading:': { 'opcode': 'motion_pointindirection', 'argMap': [ { 'type': 'input', 'inputOp': 'math_angle', 'inputName': 'DIRECTION' } ] }, 'pointTowards:': { 'opcode': 'motion_pointtowards', 'argMap': [ { 'type': 'input', 'inputOp': 'motion_pointtowards_menu', 'inputName': 'TOWARDS' } ] }, 'gotoX:y:': { 'opcode': 'motion_gotoxy', 'argMap': [ { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'X' }, { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'Y' } ] }, 'gotoSpriteOrMouse:': { 'opcode': 'motion_goto', 'argMap': [ { 'type': 'input', 'inputOp': 'motion_goto_menu', 'inputName': 'TO' } ] }, 'glideSecs:toX:y:elapsed:from:': { 'opcode': 'motion_glidesecstoxy', 'argMap': [ { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'SECS' }, { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'X' }, { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'Y' } ] }, 'changeXposBy:': { 'opcode': 'motion_changexby', 'argMap': [ { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'DX' } ] }, 'xpos:': { 'opcode': 'motion_setx', 'argMap': [ { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'X' } ] }, 'changeYposBy:': { 'opcode': 'motion_changeyby', 'argMap': [ { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'DY' } ] }, 'ypos:': { 'opcode': 'motion_sety', 'argMap': [ { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'Y' } ] }, 'bounceOffEdge': { 'opcode': 'motion_ifonedgebounce', 'argMap': [ ] }, 'setRotationStyle': { 'opcode': 'motion_setrotationstyle', 'argMap': [ { 'type': 'input', 'inputOp': 'motion_setrotationstyle_menu', 'inputName': 'STYLE' } ] }, 'xpos': { 'opcode': 'motion_xposition', 'argMap': [ ] }, 'ypos': { 'opcode': 'motion_yposition', 'argMap': [ ] }, 'heading': { 'opcode': 'motion_direction', 'argMap': [ ] }, 'say:duration:elapsed:from:': { 'opcode': 'looks_sayforsecs', 'argMap': [ { 'type': 'input', 'inputOp': 'text', 'inputName': 'MESSAGE' }, { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'SECS' } ] }, 'say:': { 'opcode': 'looks_say', 'argMap': [ { 'type': 'input', 'inputOp': 'text', 'inputName': 'MESSAGE' } ] }, 'think:duration:elapsed:from:': { 'opcode': 'looks_thinkforsecs', 'argMap': [ { 'type': 'input', 'inputOp': 'text', 'inputName': 'MESSAGE' }, { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'SECS' } ] }, 'think:': { 'opcode': 'looks_think', 'argMap': [ { 'type': 'input', 'inputOp': 'text', 'inputName': 'MESSAGE' } ] }, 'show': { 'opcode': 'looks_show', 'argMap': [ ] }, 'hide': { 'opcode': 'looks_hide', 'argMap': [ ] }, 'lookLike:': { 'opcode': 'looks_switchcostumeto', 'argMap': [ { 'type': 'input', 'inputOp': 'looks_costume', 'inputName': 'COSTUME' } ] }, 'nextCostume': { 'opcode': 'looks_nextcostume', 'argMap': [ ] }, 'startScene': { 'opcode': 'looks_switchbackdropto', 'argMap': [ { 'type': 'input', 'inputOp': 'looks_backdrops', 'inputName': 'BACKDROP' } ] }, 'changeGraphicEffect:by:': { 'opcode': 'looks_changeeffectby', 'argMap': [ { 'type': 'input', 'inputOp': 'looks_effectmenu', 'inputName': 'EFFECT' }, { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'CHANGE' } ] }, 'setGraphicEffect:to:': { 'opcode': 'looks_seteffectto', 'argMap': [ { 'type': 'input', 'inputOp': 'looks_effectmenu', 'inputName': 'EFFECT' }, { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'VALUE' } ] }, 'filterReset': { 'opcode': 'looks_cleargraphiceffects', 'argMap': [ ] }, 'changeSizeBy:': { 'opcode': 'looks_changesizeby', 'argMap': [ { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'CHANGE' } ] }, 'setSizeTo:': { 'opcode': 'looks_setsizeto', 'argMap': [ { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'SIZE' } ] }, 'comeToFront': { 'opcode': 'looks_gotofront', 'argMap': [ ] }, 'goBackByLayers:': { 'opcode': 'looks_gobacklayers', 'argMap': [ { 'type': 'input', 'inputOp': 'math_integer', 'inputName': 'NUM' } ] }, 'costumeIndex': { 'opcode': 'looks_costumeorder', 'argMap': [ ] }, 'sceneName': { 'opcode': 'looks_backdropname', 'argMap': [ ] }, 'scale': { 'opcode': 'looks_size', 'argMap': [ ] }, 'startSceneAndWait': { 'opcode': 'looks_switchbackdroptoandwait', 'argMap': [ { 'type': 'input', 'inputOp': 'looks_backdrops', 'inputName': 'BACKDROP' } ] }, 'nextScene': { 'opcode': 'looks_nextbackdrop', 'argMap': [ ] }, 'backgroundIndex': { 'opcode': 'looks_backdroporder', 'argMap': [ ] }, 'playSound:': { 'opcode': 'sound_play', 'argMap': [ { 'type': 'input', 'inputOp': 'sound_sounds_option', 'inputName': 'SOUND_MENU' } ] }, 'doPlaySoundAndWait': { 'opcode': 'sound_playuntildone', 'argMap': [ { 'type': 'input', 'inputOp': 'sound_sounds_option', 'inputName': 'SOUND_MENU' } ] }, 'stopAllSounds': { 'opcode': 'sound_stopallsounds', 'argMap': [ ] }, 'playDrum': { 'opcode': 'sound_playdrumforbeats', 'argMap': [ { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'DRUMTYPE' }, { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'BEATS' } ] }, 'rest:elapsed:from:': { 'opcode': 'sound_restforbeats', 'argMap': [ { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'BEATS' } ] }, 'noteOn:duration:elapsed:from:': { 'opcode': 'sound_playnoteforbeats', 'argMap': [ { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'NOTE' }, { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'BEATS' } ] }, 'instrument:': { 'opcode': 'sound_setinstrumentto', 'argMap': [ { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'INSTRUMENT' } ] }, 'changeVolumeBy:': { 'opcode': 'sound_changevolumeby', 'argMap': [ { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'VOLUME' } ] }, 'setVolumeTo:': { 'opcode': 'sound_setvolumeto', 'argMap': [ { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'VOLUME' } ] }, 'volume': { 'opcode': 'sound_volume', 'argMap': [ ] }, 'changeTempoBy:': { 'opcode': 'sound_changetempoby', 'argMap': [ { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'TEMPO' } ] }, 'setTempoTo:': { 'opcode': 'sound_settempotobpm', 'argMap': [ { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'TEMPO' } ] }, 'tempo': { 'opcode': 'sound_tempo', 'argMap': [ ] }, 'clearPenTrails': { 'opcode': 'pen_clear', 'argMap': [ ] }, 'stampCostume': { 'opcode': 'pen_stamp', 'argMap': [ ] }, 'putPenDown': { 'opcode': 'pen_pendown', 'argMap': [ ] }, 'putPenUp': { 'opcode': 'pen_penup', 'argMap': [ ] }, 'penColor:': { 'opcode': 'pen_setpencolortocolor', 'argMap': [ { 'type': 'input', 'inputOp': 'colour_picker', 'inputName': 'COLOR' } ] }, 'changePenHueBy:': { 'opcode': 'pen_changepencolorby', 'argMap': [ { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'COLOR' } ] }, 'setPenHueTo:': { 'opcode': 'pen_setpencolortonum', 'argMap': [ { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'COLOR' } ] }, 'changePenShadeBy:': { 'opcode': 'pen_changepenshadeby', 'argMap': [ { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'SHADE' } ] }, 'setPenShadeTo:': { 'opcode': 'pen_changepenshadeby', 'argMap': [ { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'SHADE' } ] }, 'changePenSizeBy:': { 'opcode': 'pen_changepensizeby', 'argMap': [ { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'SIZE' } ] }, 'penSize:': { 'opcode': 'pen_setpensizeto', 'argMap': [ { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'SIZE' } ] }, 'whenGreenFlag': { 'opcode': 'event_whenflagclicked', 'argMap': [ ] }, 'whenKeyPressed': { 'opcode': 'event_whenkeypressed', 'argMap': [ { 'type': 'field', 'fieldName': 'KEY_OPTION' } ] }, 'whenClicked': { 'opcode': 'event_whenthisspriteclicked', 'argMap': [ ] }, 'whenSceneStarts': { 'opcode': 'event_whenbackdropswitchesto', 'argMap': [ { 'type': 'field', 'fieldName': 'BACKDROP' } ] }, 'whenSensorGreaterThan': { 'opcode': 'event_whengreaterthan', 'argMap': [ { 'type': 'field', 'fieldName': 'WHENGREATERTHANMENU' }, { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'VALUE' } ] }, 'whenIReceive': { 'opcode': 'event_whenbroadcastreceived', 'argMap': [ { 'type': 'field', 'fieldName': 'BROADCAST_OPTION' } ] }, 'broadcast:': { 'opcode': 'event_broadcast', 'argMap': [ { 'type': 'input', 'inputOp': 'event_broadcast_menu', 'inputName': 'BROADCAST_OPTION' } ] }, 'doBroadcastAndWait': { 'opcode': 'event_broadcastandwait', 'argMap': [ { 'type': 'input', 'inputOp': 'event_broadcast_menu', 'inputName': 'BROADCAST_OPTION' } ] }, 'wait:elapsed:from:': { 'opcode': 'control_wait', 'argMap': [ { 'type': 'input', 'inputOp': 'math_positive_number', 'inputName': 'DURATION' } ] }, 'doRepeat': { 'opcode': 'control_repeat', 'argMap': [ { 'type': 'input', 'inputOp': 'math_whole_number', 'inputName': 'TIMES' }, { 'type': 'input', 'inputName': 'SUBSTACK' } ] }, 'doForever': { 'opcode': 'control_forever', 'argMap': [ { 'type': 'input', 'inputName': 'SUBSTACK' } ] }, 'doIf': { 'opcode': 'control_if', 'argMap': [ { 'type': 'input', 'inputName': 'CONDITION' }, { 'type': 'input', 'inputName': 'SUBSTACK' } ] }, 'doIfElse': { 'opcode': 'control_if_else', 'argMap': [ { 'type': 'input', 'inputName': 'CONDITION' }, { 'type': 'input', 'inputName': 'SUBSTACK' }, { 'type': 'input', 'inputName': 'SUBSTACK2' } ] }, 'doWaitUntil': { 'opcode': 'control_wait_until', 'argMap': [ { 'type': 'input', 'inputName': 'CONDITION' } ] }, 'doUntil': { 'opcode': 'control_repeat_until', 'argMap': [ { 'type': 'input', 'inputName': 'CONDITION' }, { 'type': 'input', 'inputName': 'SUBSTACK' } ] }, 'stopScripts': { 'opcode': 'control_stop', 'argMap': [ { 'type': 'field', 'fieldName': 'STOP_OPTION' } ] }, 'whenCloned': { 'opcode': 'control_start_as_clone', 'argMap': [ ] }, 'createCloneOf': { 'opcode': 'control_create_clone_of', 'argMap': [ { 'type': 'input', 'inputOp': 'control_create_clone_of_menu', 'inputName': 'CLONE_OPTION' } ] }, 'deleteClone': { 'opcode': 'control_delete_this_clone', 'argMap': [ ] }, 'touching:': { 'opcode': 'sensing_touchingobject', 'argMap': [ { 'type': 'input', 'inputOp': 'sensing_touchingobjectmenu', 'inputName': 'TOUCHINGOBJECTMENU' } ] }, 'touchingColor:': { 'opcode': 'sensing_touchingcolor', 'argMap': [ { 'type': 'input', 'inputOp': 'colour_picker', 'inputName': 'COLOR' } ] }, 'color:sees:': { 'opcode': 'sensing_coloristouchingcolor', 'argMap': [ { 'type': 'input', 'inputOp': 'colour_picker', 'inputName': 'COLOR' }, { 'type': 'input', 'inputOp': 'colour_picker', 'inputName': 'COLOR2' } ] }, 'distanceTo:': { 'opcode': 'sensing_distanceto', 'argMap': [ { 'type': 'input', 'inputOp': 'sensing_distancetomenu', 'inputName': 'DISTANCETOMENU' } ] }, 'doAsk': { 'opcode': 'sensing_askandwait', 'argMap': [ { 'type': 'input', 'inputOp': 'text', 'inputName': 'QUESTION' } ] }, 'answer': { 'opcode': 'sensing_answer', 'argMap': [ ] }, 'keyPressed:': { 'opcode': 'sensing_keypressed', 'argMap': [ { 'type': 'input', 'inputOp': 'sensing_keyoptions', 'inputName': 'KEY_OPTION' } ] }, 'mousePressed': { 'opcode': 'sensing_mousedown', 'argMap': [ ] }, 'mouseX': { 'opcode': 'sensing_mousex', 'argMap': [ ] }, 'mouseY': { 'opcode': 'sensing_mousey', 'argMap': [ ] }, 'soundLevel': { 'opcode': 'sensing_loudness', 'argMap': [ ] }, 'senseVideoMotion': { 'opcode': 'sensing_videoon', 'argMap': [ { 'type': 'input', 'inputOp': 'sensing_videoonmenuone', 'inputName': 'VIDEOONMENU1' }, { 'type': 'input', 'inputOp': 'sensing_videoonmenutwo', 'inputName': 'VIDEOONMENU2' } ] }, 'setVideoState': { 'opcode': 'sensing_videotoggle', 'argMap': [ { 'type': 'input', 'inputOp': 'sensing_videotogglemenu', 'inputName': 'VIDEOTOGGLEMENU' } ] }, 'setVideoTransparency': { 'opcode': 'sensing_setvideotransparency', 'argMap': [ { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'TRANSPARENCY' } ] }, 'timer': { 'opcode': 'sensing_timer', 'argMap': [ ] }, 'timerReset': { 'opcode': 'sensing_resettimer', 'argMap': [ ] }, 'getAttribute:of:': { 'opcode': 'sensing_of', 'argMap': [ { 'type': 'input', 'inputOp': 'sensing_of_property_menu', 'inputName': 'PROPERTY' }, { 'type': 'input', 'inputOp': 'sensing_of_object_menu', 'inputName': 'OBJECT' } ] }, 'timeAndDate': { 'opcode': 'sensing_current', 'argMap': [ { 'type': 'input', 'inputOp': 'sensing_currentmenu', 'inputName': 'CURRENTMENU' } ] }, 'timestamp': { 'opcode': 'sensing_dayssince2000', 'argMap': [ ] }, 'getUserName': { 'opcode': 'sensing_username', 'argMap': [ ] }, '+': { 'opcode': 'operator_add', 'argMap': [ { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'NUM1' }, { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'NUM2' } ] }, '-': { 'opcode': 'operator_subtract', 'argMap': [ { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'NUM1' }, { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'NUM2' } ] }, '*': { 'opcode': 'operator_multiply', 'argMap': [ { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'NUM1' }, { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'NUM2' } ] }, '/': { 'opcode': 'operator_divide', 'argMap': [ { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'NUM1' }, { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'NUM2' } ] }, 'randomFrom:to:': { 'opcode': 'operator_random', 'argMap': [ { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'FROM' }, { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'TO' } ] }, '<': { 'opcode': 'operator_lt', 'argMap': [ { 'type': 'input', 'inputOp': 'text', 'inputName': 'OPERAND1' }, { 'type': 'input', 'inputOp': 'text', 'inputName': 'OPERAND2' } ] }, '=': { 'opcode': 'operator_equals', 'argMap': [ { 'type': 'input', 'inputOp': 'text', 'inputName': 'OPERAND1' }, { 'type': 'input', 'inputOp': 'text', 'inputName': 'OPERAND2' } ] }, '>': { 'opcode': 'operator_gt', 'argMap': [ { 'type': 'input', 'inputOp': 'text', 'inputName': 'OPERAND1' }, { 'type': 'input', 'inputOp': 'text', 'inputName': 'OPERAND2' } ] }, '&': { 'opcode': 'operator_and', 'argMap': [ { 'type': 'input', 'inputName': 'OPERAND1' }, { 'type': 'input', 'inputName': 'OPERAND2' } ] }, '|': { 'opcode': 'operator_or', 'argMap': [ { 'type': 'input', 'inputName': 'OPERAND1' }, { 'type': 'input', 'inputName': 'OPERAND2' } ] }, 'not': { 'opcode': 'operator_not', 'argMap': [ { 'type': 'input', 'inputName': 'OPERAND' } ] }, 'concatenate:with:': { 'opcode': 'operator_join', 'argMap': [ { 'type': 'input', 'inputOp': 'text', 'inputName': 'STRING1' }, { 'type': 'input', 'inputOp': 'text', 'inputName': 'STRING2' } ] }, 'letter:of:': { 'opcode': 'operator_letter_of', 'argMap': [ { 'type': 'input', 'inputOp': 'math_whole_number', 'inputName': 'LETTER' }, { 'type': 'input', 'inputOp': 'text', 'inputName': 'STRING' } ] }, 'stringLength:': { 'opcode': 'operator_length', 'argMap': [ { 'type': 'input', 'inputOp': 'text', 'inputName': 'STRING' } ] }, '%': { 'opcode': 'operator_mod', 'argMap': [ { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'NUM1' }, { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'NUM2' } ] }, 'rounded': { 'opcode': 'operator_round', 'argMap': [ { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'NUM' } ] }, 'computeFunction:of:': { 'opcode': 'operator_mathop', 'argMap': [ { 'type': 'input', 'inputOp': 'operator_mathop_menu', 'inputName': 'OPERATOR' }, { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'NUM' } ] }, 'readVariable': { 'opcode': 'data_variable', 'argMap': [ { 'type': 'input', 'inputOp': 'data_variablemenu', 'inputName': 'VARIABLE' } ] }, 'setVar:to:': { 'opcode': 'data_setvariableto', 'argMap': [ { 'type': 'input', 'inputOp': 'data_variablemenu', 'inputName': 'VARIABLE' }, { 'type': 'input', 'inputOp': 'text', 'inputName': 'VALUE' } ] }, 'changeVar:by:': { 'opcode': 'data_changevariableby', 'argMap': [ { 'type': 'input', 'inputOp': 'data_variablemenu', 'inputName': 'VARIABLE' }, { 'type': 'input', 'inputOp': 'math_number', 'inputName': 'VALUE' } ] }, 'showVariable:': { 'opcode': 'data_showvariable', 'argMap': [ { 'type': 'input', 'inputOp': 'data_variablemenu', 'inputName': 'VARIABLE' } ] }, 'hideVariable:': { 'opcode': 'data_hidevariable', 'argMap': [ { 'type': 'input', 'inputOp': 'data_variablemenu', 'inputName': 'VARIABLE' } ] }, 'contentsOfList:': { 'opcode': 'data_list', 'argMap': [ { 'type': 'field', 'fieldName': 'LIST' } ] }, 'append:toList:': { 'opcode': 'data_addtolist', 'argMap': [ { 'type': 'input', 'inputOp': 'text', 'inputName': 'ITEM' }, { 'type': 'field', 'fieldName': 'LIST' } ] }, 'deleteLine:ofList:': { 'opcode': 'data_deleteoflist', 'argMap': [ { 'type': 'input', 'inputOp': 'math_integer', 'inputName': 'INDEX' }, { 'type': 'field', 'fieldName': 'LIST' } ] }, 'insert:at:ofList:': { 'opcode': 'data_insertatlist', 'argMap': [ { 'type': 'input', 'inputOp': 'text', 'inputName': 'ITEM' }, { 'type': 'input', 'inputOp': 'math_integer', 'inputName': 'INDEX' }, { 'type': 'field', 'fieldName': 'LIST' } ] }, 'setLine:ofList:to:': { 'opcode': 'data_replaceitemoflist', 'argMap': [ { 'type': 'input', 'inputOp': 'math_integer', 'inputName': 'INDEX' }, { 'type': 'field', 'fieldName': 'LIST' }, { 'type': 'input', 'inputOp': 'text', 'inputName': 'ITEM' } ] }, 'getLine:ofList:': { 'opcode': 'data_itemoflist', 'argMap': [ { 'type': 'input', 'inputOp': 'math_integer', 'inputName': 'INDEX' }, { 'type': 'field', 'fieldName': 'LIST' } ] }, 'lineCountOfList:': { 'opcode': 'data_lengthoflist', 'argMap': [ { 'type': 'field', 'fieldName': 'LIST' } ] }, 'list:contains:': { 'opcode': 'data_listcontainsitem', 'argMap': [ { 'type': 'field', 'fieldName': 'LIST' }, { 'type': 'input', 'inputOp': 'text', 'inputName': 'ITEM' } ] }, 'showList:': { 'opcode': 'data_showlist', 'argMap': [ { 'type': 'field', 'fieldName': 'LIST' } ] }, 'hideList:': { 'opcode': 'data_hidelist', 'argMap': [ { 'type': 'field', 'fieldName': 'LIST' } ] }, 'procDef': { 'opcode': 'procedures_defnoreturn', 'argMap': [] }, 'getParam': { 'opcode': 'procedures_param', 'argMap': [] }, 'call': { 'opcode': 'procedures_callnoreturn', 'argMap': [] } }; module.exports = specMap;