{"version":3,"sources":["blocks/variables_dynamic.ts","blocks/variables.ts","blocks/text.ts","blocks/procedures.ts","blocks/math.ts","blocks/loops.ts","blocks/logic.ts","blocks/lists.ts","blocks/blocks.ts"],"names":["blocks","createBlockDefinitionsFromJsonArray","CUSTOM_CONTEXT_MENU_VARIABLE_GETTER_SETTER_MIXIN","customContextMenu","options","isInFlyout","type","oppositeType","contextMenuMsg","Msg","varField","getField","newVarBlockState","fields","VAR","saveState","push","enabled","workspace","remainingCapacity","text","replace","getText","callback","callbackFactory","renameOption","renameOptionCallbackFactory","name","deleteOption","deleteOptionCallbackFactory","unshift","onchange","_e","id","getFieldValue","variableModel","getVariable","outputConnection","setCheck","getType","getInput","connection","block","variable","variableField","renameVariable","deleteVariable","getWorkspace","registerMixin","defineBlocks","$jscomp$tmp$exports$module$name","GET_SUBSTRING_BLOCK","init","setHelpUrl","setStyle","appendValueInput","appendField","createMenu","n","menu","fromJson","setValidator","value","oldValue","getValue","newAt","getSourceBlock","updateAt_","appendDummyInput","setInputsInline","setOutput","setTooltip","mutationToDom","container","createElement","isAt1","ValueInput","setAttribute","isAt2","domToMutation","xmlElement","getAttribute","isAt","removeInput","moveInputBefore","OPERATORS","jsonInit","PROMPT_COMMON","updateType_","newOp","TYPES","dropdown","mixin","QUOTE_IMAGE_MIXIN","newQuote_","QUOTE_IMAGE_LEFT_DATAURI","QUOTE_IMAGE_RIGHT_DATAURI","QUOTE_IMAGE_WIDTH","QUOTE_IMAGE_HEIGHT","quoteField_","fieldName","i","input","inputList","j","field","fieldRow","insertFieldAt","console","warn","toDevString","open","isLeft","RTL","src","dataUri","width","height","alt","QUOTES_EXTENSION","JOIN_MUTATOR_MIXIN","itemCount_","parseInt","updateShape_","saveExtraState","loadExtraState","state","decompose","containerBlock","newBlock","initSvg","itemBlock","connect","previousConnection","nextConnection","compose","getInputTargetBlock","connections","isInsertionMarker","valueConnection_","getNextBlock","targetConnection","includes","disconnect","length","reconnect","saveConnections","setAlign","Align","RIGHT","JOIN_EXTENSION","setMutator","MutatorIcon","register","buildTooltipWithFieldText","INDEXOF_TOOLTIP_EXTENSION","oneBasedIndex","CHARAT_MUTATOR_MIXIN","isAt_","CHARAT_EXTENSION","where","tooltip","msg","registerMutator","PROCEDURE_DEF_COMMON","setStatements_","hasStatements","hasStatements_","appendStatementInput","updateParams_","paramString","arguments_","join","disable","setFieldValue","enable","opt_paramIds","argumentVarModels_","parameter","argModel","getName","getId","paramIds_","appendChild","childNode","childNodes","nodeName","toLowerCase","childElement","varName","varId","getOrCreateVariablePackage","log","mutateCallers","Object","create","param","containerBlockNode","statementNode","argBlockNode","fieldNode","argumentName","createTextNode","nextNode","node","domToBlock","paramBlock","targetBlock","statementConnection_","stackConnection","stackBlock","unplug","bumpNeighbours","getVars","getVarModels","renameVarById","oldId","newId","oldVariable","getVariableById","oldName","newVar","change","displayRenamedVar_","updateVarName","newName","mutator","getIcon","Mutator","TYPE","bubbleIsVisible","getAllBlocks","Names","equals","callProcedureBlockState","callType_","extraState","params","isCollapsed","argVar","getVarBlockState","initName","findLegalName","nameField","rename","setSpellcheck","comments","parentWorkspace","setCommentText","getProcedureDef","PROCEDURES_MUTATORCONTAINER","checked","contextMenu","ProcedureArgumentField","FieldTextInput","constructor","arguments","editingInteractively","showEditor_","e","editingVariable","undefined","onFinishEditing_","PROCEDURES_MUTATORARGUMENT","DEFAULT_ARG","validator_","setPreviousStatement","setNextStatement","sourceBlock","outerWs","getRootWorkspace","targetWorkspace","caselessName","otherVar","model","renameVariableById","createVariable","DISABLED_PROCEDURE_DEFINITION_DISABLED_REASON","PROCEDURE_CALL_COMMON","getProcedureCall","renameProcedure","baseMsg","setProcedureParameters_","paramNames","paramIds","defBlock","getDefinition","mutatorOpen","mutatorIcon","setCollapsed","quarkConnections_","quarkIds_","RangeError","concat","quarkId","argField","setValue","newField","topRow","removeField","args","ids","fill","event","isFlyout","recordUndo","BLOCK_CREATE","def","defType_","JSON","stringify","isEnabled","setDisabledReason","setWarningText","setGroup","group","xml","xy","getRelativeToSurfaceXY","y","config","snapRadius","x","mutation","callName","domToWorkspace","BLOCK_DELETE","dispose","BLOCK_CHANGE","element","blockId","oldGroup","getGroup","valid","isMovable","centerOnBlock","getFocusManager","focusNode","UNPARENTED_IFRETURN_DISABLED_REASON","PROCEDURES_IFRETURN","hasReturnValue_","String","Number","isDragging","BLOCK_MOVE","legal","FUNCTION_TYPES","getSurroundParent","setRecordUndo","TOOLTIPS_BY_OP","buildTooltipForDropdown","IS_DIVISIBLEBY_MUTATOR_MIXIN","divisorInput","inputExists","IS_DIVISIBLE_MUTATOR_EXTENSION","option","LIST_MODES_MUTATOR_MIXIN","op","TypeError","LIST_MODES_MUTATOR_EXTENSION","bind","WHILE_UNTIL_TOOLTIPS","BREAK_CONTINUE_TOOLTIPS","CUSTOM_CONTEXT_MENU_CREATE_VARIABLES_GET_MIXIN","loopTypes","Set","CONTROL_FLOW_NOT_IN_LOOP_DISABLED_REASON","CONTROL_FLOW_IN_LOOP_CHECK_MIXIN","getSurroundLoop","has","ws","CONTROLS_IF_MUTATOR_MIXIN","elseifCount_","elseCount_","rebuildShape_","elseifBlock","elseBlock","clauseBlock","valueConnections","statementConnections","elseStatementConnection","reconnectChildBlocks_","inputIf","inputDo","CONTROLS_IF_TOOLTIP_EXTENSION","LOGIC_COMPARE_ONCHANGE_MIXIN","prevBlocks_","blockA","blockB","connectionChecker","doTypeChecks","prevA","isDisposed","isShadow","prevB","LOGIC_COMPARE_EXTENSION","LOGIC_TERNARY_ONCHANGE_MIXIN","prevParentConnection_","parentConnection","LISTS_CREATE_WITH","items","Error","LISTS_CREATE_WITH_CONTAINER","LISTS_CREATE_WITH_ITEM","LISTS_INDEXOF","operatorsDropdown","LISTS_GETINDEX","MODE","WHERE_OPTIONS","modeMenu","isStatement","updateStatement_","mode","textToDom","newStatement","oldStatement","LISTS_SETINDEX","operationDropdown","LISTS_GETSUBLIST","newMode","inputConnection","setShadowDom","inputBlock","assign","lists","logic","loops","math","procedures","texts","variables","variablesDynamic"],"mappings":"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","file":"blocks_compressed.js","sourcesContent":["/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// Former goog.module ID: Blockly.libraryBlocks.variablesDynamic\n\nimport type {Block} from '../core/block.js';\nimport {\n  createBlockDefinitionsFromJsonArray,\n  defineBlocks,\n} from '../core/common.js';\nimport * as ContextMenu from '../core/contextmenu.js';\nimport type {\n  ContextMenuOption,\n  LegacyContextMenuOption,\n} from '../core/contextmenu_registry.js';\nimport {Abstract as AbstractEvent} from '../core/events/events_abstract.js';\nimport * as Extensions from '../core/extensions.js';\nimport '../core/field_label.js';\nimport {FieldVariable} from '../core/field_variable.js';\nimport {Msg} from '../core/msg.js';\nimport * as Variables from '../core/variables.js';\n\n/**\n * A dictionary of the block definitions provided by this module.\n */\nexport const blocks = createBlockDefinitionsFromJsonArray([\n  // Block for variable getter.\n  {\n    'type': 'variables_get_dynamic',\n    'message0': '%1',\n    'args0': [\n      {\n        'type': 'field_variable',\n        'name': 'VAR',\n        'variable': '%{BKY_VARIABLES_DEFAULT_NAME}',\n      },\n    ],\n    'output': null,\n    'style': 'variable_dynamic_blocks',\n    'helpUrl': '%{BKY_VARIABLES_GET_HELPURL}',\n    'tooltip': '%{BKY_VARIABLES_GET_TOOLTIP}',\n    'extensions': ['contextMenu_variableDynamicSetterGetter'],\n  },\n  // Block for variable setter.\n  {\n    'type': 'variables_set_dynamic',\n    'message0': '%{BKY_VARIABLES_SET}',\n    'args0': [\n      {\n        'type': 'field_variable',\n        'name': 'VAR',\n        'variable': '%{BKY_VARIABLES_DEFAULT_NAME}',\n      },\n      {\n        'type': 'input_value',\n        'name': 'VALUE',\n      },\n    ],\n    'previousStatement': null,\n    'nextStatement': null,\n    'style': 'variable_dynamic_blocks',\n    'tooltip': '%{BKY_VARIABLES_SET_TOOLTIP}',\n    'helpUrl': '%{BKY_VARIABLES_SET_HELPURL}',\n    'extensions': ['contextMenu_variableDynamicSetterGetter'],\n  },\n]);\n\n/** Type of a block that has CUSTOM_CONTEXT_MENU_VARIABLE_GETTER_SETTER_MIXIN */\ntype VariableBlock = Block & VariableMixin;\ninterface VariableMixin extends VariableMixinType {}\ntype VariableMixinType =\n  typeof CUSTOM_CONTEXT_MENU_VARIABLE_GETTER_SETTER_MIXIN;\n\n/**\n * Mixin to add context menu items to create getter/setter blocks for this\n * setter/getter.\n * Used by blocks 'variables_set_dynamic' and 'variables_get_dynamic'.\n */\nconst CUSTOM_CONTEXT_MENU_VARIABLE_GETTER_SETTER_MIXIN = {\n  /**\n   * Add menu option to create getter/setter block for this setter/getter.\n   *\n   * @param options List of menu options to add to.\n   */\n  customContextMenu: function (\n    this: VariableBlock,\n    options: Array<ContextMenuOption | LegacyContextMenuOption>,\n  ) {\n    // Getter blocks have the option to create a setter block, and vice versa.\n    if (!this.isInFlyout) {\n      let oppositeType;\n      let contextMenuMsg;\n      if (this.type === 'variables_get_dynamic') {\n        oppositeType = 'variables_set_dynamic';\n        contextMenuMsg = Msg['VARIABLES_GET_CREATE_SET'];\n      } else {\n        oppositeType = 'variables_get_dynamic';\n        contextMenuMsg = Msg['VARIABLES_SET_CREATE_GET'];\n      }\n\n      const varField = this.getField('VAR')!;\n      const newVarBlockState = {\n        type: oppositeType,\n        fields: {VAR: varField.saveState(true)},\n      };\n\n      options.push({\n        enabled: this.workspace.remainingCapacity() > 0,\n        text: contextMenuMsg.replace('%1', varField.getText()),\n        callback: ContextMenu.callbackFactory(this, newVarBlockState),\n      });\n    } else {\n      if (\n        this.type === 'variables_get_dynamic' ||\n        this.type === 'variables_get_reporter_dynamic'\n      ) {\n        const renameOption = {\n          text: Msg['RENAME_VARIABLE'],\n          enabled: true,\n          callback: renameOptionCallbackFactory(this),\n        };\n        const name = this.getField('VAR')!.getText();\n        const deleteOption = {\n          text: Msg['DELETE_VARIABLE'].replace('%1', name),\n          enabled: true,\n          callback: deleteOptionCallbackFactory(this),\n        };\n        options.unshift(renameOption);\n        options.unshift(deleteOption);\n      }\n    }\n  },\n  /**\n   * Called whenever anything on the workspace changes.\n   * Set the connection type for this block.\n   *\n   * @param _e Change event.\n   */\n  onchange: function (this: VariableBlock, _e: AbstractEvent) {\n    const id = this.getFieldValue('VAR');\n    const variableModel = Variables.getVariable(this.workspace, id)!;\n    if (this.type === 'variables_get_dynamic') {\n      this.outputConnection!.setCheck(variableModel.getType());\n    } else {\n      this.getInput('VALUE')!.connection!.setCheck(variableModel.getType());\n    }\n  },\n};\n\n/**\n * Factory for callbacks for rename variable dropdown menu option\n * associated with a variable getter block.\n *\n * @param block The block with the variable to rename.\n * @returns A function that renames the variable.\n */\nconst renameOptionCallbackFactory = function (block: VariableBlock) {\n  return function () {\n    const workspace = block.workspace;\n    const variableField = block.getField('VAR') as FieldVariable;\n    const variable = variableField.getVariable()!;\n    Variables.renameVariable(workspace, variable);\n  };\n};\n\n/**\n * Factory for callbacks for delete variable dropdown menu option\n * associated with a variable getter block.\n *\n * @param block The block with the variable to delete.\n * @returns A function that deletes the variable.\n */\nconst deleteOptionCallbackFactory = function (block: VariableBlock) {\n  return function () {\n    const variableField = block.getField('VAR') as FieldVariable;\n    const variable = variableField.getVariable();\n    if (variable) {\n      Variables.deleteVariable(variable.getWorkspace(), variable, block);\n    }\n  };\n};\n\nExtensions.registerMixin(\n  'contextMenu_variableDynamicSetterGetter',\n  CUSTOM_CONTEXT_MENU_VARIABLE_GETTER_SETTER_MIXIN,\n);\n\n// Register provided blocks.\ndefineBlocks(blocks);\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// Former goog.module ID: Blockly.libraryBlocks.variables\n\nimport type {Block} from '../core/block.js';\nimport {\n  createBlockDefinitionsFromJsonArray,\n  defineBlocks,\n} from '../core/common.js';\nimport * as ContextMenu from '../core/contextmenu.js';\nimport type {\n  ContextMenuOption,\n  LegacyContextMenuOption,\n} from '../core/contextmenu_registry.js';\nimport * as Extensions from '../core/extensions.js';\nimport '../core/field_label.js';\nimport {FieldVariable} from '../core/field_variable.js';\nimport {Msg} from '../core/msg.js';\nimport * as Variables from '../core/variables.js';\n\n/**\n * A dictionary of the block definitions provided by this module.\n */\nexport const blocks = createBlockDefinitionsFromJsonArray([\n  // Block for variable getter.\n  {\n    'type': 'variables_get',\n    'message0': '%1',\n    'args0': [\n      {\n        'type': 'field_variable',\n        'name': 'VAR',\n        'variable': '%{BKY_VARIABLES_DEFAULT_NAME}',\n      },\n    ],\n    'output': null,\n    'style': 'variable_blocks',\n    'helpUrl': '%{BKY_VARIABLES_GET_HELPURL}',\n    'tooltip': '%{BKY_VARIABLES_GET_TOOLTIP}',\n    'extensions': ['contextMenu_variableSetterGetter'],\n  },\n  // Block for variable setter.\n  {\n    'type': 'variables_set',\n    'message0': '%{BKY_VARIABLES_SET}',\n    'args0': [\n      {\n        'type': 'field_variable',\n        'name': 'VAR',\n        'variable': '%{BKY_VARIABLES_DEFAULT_NAME}',\n      },\n      {\n        'type': 'input_value',\n        'name': 'VALUE',\n      },\n    ],\n    'previousStatement': null,\n    'nextStatement': null,\n    'style': 'variable_blocks',\n    'tooltip': '%{BKY_VARIABLES_SET_TOOLTIP}',\n    'helpUrl': '%{BKY_VARIABLES_SET_HELPURL}',\n    'extensions': ['contextMenu_variableSetterGetter'],\n  },\n]);\n\n/** Type of a block that has CUSTOM_CONTEXT_MENU_VARIABLE_GETTER_SETTER_MIXIN */\ntype VariableBlock = Block & VariableMixin;\ninterface VariableMixin extends VariableMixinType {}\ntype VariableMixinType =\n  typeof CUSTOM_CONTEXT_MENU_VARIABLE_GETTER_SETTER_MIXIN;\n\n/**\n * Mixin to add context menu items to create getter/setter blocks for this\n * setter/getter.\n * Used by blocks 'variables_set' and 'variables_get'.\n */\nconst CUSTOM_CONTEXT_MENU_VARIABLE_GETTER_SETTER_MIXIN = {\n  /**\n   * Add menu option to create getter/setter block for this setter/getter.\n   *\n   * @param options List of menu options to add to.\n   */\n  customContextMenu: function (\n    this: VariableBlock,\n    options: Array<ContextMenuOption | LegacyContextMenuOption>,\n  ) {\n    if (!this.isInFlyout) {\n      let oppositeType;\n      let contextMenuMsg;\n      // Getter blocks have the option to create a setter block, and vice versa.\n      if (this.type === 'variables_get') {\n        oppositeType = 'variables_set';\n        contextMenuMsg = Msg['VARIABLES_GET_CREATE_SET'];\n      } else {\n        oppositeType = 'variables_get';\n        contextMenuMsg = Msg['VARIABLES_SET_CREATE_GET'];\n      }\n\n      const varField = this.getField('VAR')!;\n      const newVarBlockState = {\n        type: oppositeType,\n        fields: {VAR: varField.saveState(true)},\n      };\n\n      options.push({\n        enabled: this.workspace.remainingCapacity() > 0,\n        text: contextMenuMsg.replace('%1', varField.getText()),\n        callback: ContextMenu.callbackFactory(this, newVarBlockState),\n      });\n      // Getter blocks have the option to rename or delete that variable.\n    } else {\n      if (\n        this.type === 'variables_get' ||\n        this.type === 'variables_get_reporter'\n      ) {\n        const renameOption = {\n          text: Msg['RENAME_VARIABLE'],\n          enabled: true,\n          callback: renameOptionCallbackFactory(this),\n        };\n        const name = this.getField('VAR')!.getText();\n        const deleteOption = {\n          text: Msg['DELETE_VARIABLE'].replace('%1', name),\n          enabled: true,\n          callback: deleteOptionCallbackFactory(this),\n        };\n        options.unshift(renameOption);\n        options.unshift(deleteOption);\n      }\n    }\n  },\n};\n\n/**\n * Factory for callbacks for rename variable dropdown menu option\n * associated with a variable getter block.\n *\n * @param block The block with the variable to rename.\n * @returns A function that renames the variable.\n */\nconst renameOptionCallbackFactory = function (\n  block: VariableBlock,\n): () => void {\n  return function () {\n    const workspace = block.workspace;\n    const variableField = block.getField('VAR') as FieldVariable;\n    const variable = variableField.getVariable()!;\n    Variables.renameVariable(workspace, variable);\n  };\n};\n\n/**\n * Factory for callbacks for delete variable dropdown menu option\n * associated with a variable getter block.\n *\n * @param block The block with the variable to delete.\n * @returns A function that deletes the variable.\n */\nconst deleteOptionCallbackFactory = function (\n  block: VariableBlock,\n): () => void {\n  return function () {\n    const variableField = block.getField('VAR') as FieldVariable;\n    const variable = variableField.getVariable();\n    if (variable) {\n      Variables.deleteVariable(variable.getWorkspace(), variable, block);\n    }\n  };\n};\n\nExtensions.registerMixin(\n  'contextMenu_variableSetterGetter',\n  CUSTOM_CONTEXT_MENU_VARIABLE_GETTER_SETTER_MIXIN,\n);\n\n// Register provided blocks.\ndefineBlocks(blocks);\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// Former goog.module ID: Blockly.libraryBlocks.texts\n\nimport type {Block} from '../core/block.js';\nimport type {BlockSvg} from '../core/block_svg.js';\nimport {\n  createBlockDefinitionsFromJsonArray,\n  defineBlocks,\n} from '../core/common.js';\nimport {Connection} from '../core/connection.js';\nimport * as Extensions from '../core/extensions.js';\nimport {FieldDropdown} from '../core/field_dropdown.js';\nimport {FieldImage} from '../core/field_image.js';\nimport * as fieldRegistry from '../core/field_registry.js';\nimport {FieldTextInput} from '../core/field_textinput.js';\nimport '../core/field_variable.js';\nimport {MutatorIcon} from '../core/icons/mutator_icon.js';\nimport {Align} from '../core/inputs/align.js';\nimport {ValueInput} from '../core/inputs/value_input.js';\nimport {Msg} from '../core/msg.js';\nimport * as xmlUtils from '../core/utils/xml.js';\nimport type {Workspace} from '../core/workspace.js';\n\n/**\n * A dictionary of the block definitions provided by this module.\n */\nexport const blocks = createBlockDefinitionsFromJsonArray([\n  // Block for text value\n  {\n    'type': 'text',\n    'message0': '%1',\n    'args0': [\n      {\n        'type': 'field_input',\n        'name': 'TEXT',\n        'text': '',\n      },\n    ],\n    'output': 'String',\n    'style': 'text_blocks',\n    'helpUrl': '%{BKY_TEXT_TEXT_HELPURL}',\n    'tooltip': '%{BKY_TEXT_TEXT_TOOLTIP}',\n    'extensions': ['text_quotes', 'parent_tooltip_when_inline'],\n  },\n  {\n    'type': 'text_join',\n    'message0': '',\n    'output': 'String',\n    'style': 'text_blocks',\n    'helpUrl': '%{BKY_TEXT_JOIN_HELPURL}',\n    'tooltip': '%{BKY_TEXT_JOIN_TOOLTIP}',\n    'mutator': 'text_join_mutator',\n  },\n  {\n    'type': 'text_create_join_container',\n    'message0': '%{BKY_TEXT_CREATE_JOIN_TITLE_JOIN} %1 %2',\n    'args0': [\n      {\n        'type': 'input_dummy',\n      },\n      {\n        'type': 'input_statement',\n        'name': 'STACK',\n      },\n    ],\n    'style': 'text_blocks',\n    'tooltip': '%{BKY_TEXT_CREATE_JOIN_TOOLTIP}',\n    'enableContextMenu': false,\n  },\n  {\n    'type': 'text_create_join_item',\n    'message0': '%{BKY_TEXT_CREATE_JOIN_ITEM_TITLE_ITEM}',\n    'previousStatement': null,\n    'nextStatement': null,\n    'style': 'text_blocks',\n    'tooltip': '%{BKY_TEXT_CREATE_JOIN_ITEM_TOOLTIP}',\n    'enableContextMenu': false,\n  },\n  {\n    'type': 'text_append',\n    'message0': '%{BKY_TEXT_APPEND_TITLE}',\n    'args0': [\n      {\n        'type': 'field_variable',\n        'name': 'VAR',\n        'variable': '%{BKY_TEXT_APPEND_VARIABLE}',\n      },\n      {\n        'type': 'input_value',\n        'name': 'TEXT',\n      },\n    ],\n    'previousStatement': null,\n    'nextStatement': null,\n    'style': 'text_blocks',\n    'extensions': ['text_append_tooltip'],\n  },\n  {\n    'type': 'text_length',\n    'message0': '%{BKY_TEXT_LENGTH_TITLE}',\n    'args0': [\n      {\n        'type': 'input_value',\n        'name': 'VALUE',\n        'check': ['String', 'Array'],\n      },\n    ],\n    'output': 'Number',\n    'style': 'text_blocks',\n    'tooltip': '%{BKY_TEXT_LENGTH_TOOLTIP}',\n    'helpUrl': '%{BKY_TEXT_LENGTH_HELPURL}',\n  },\n  {\n    'type': 'text_isEmpty',\n    'message0': '%{BKY_TEXT_ISEMPTY_TITLE}',\n    'args0': [\n      {\n        'type': 'input_value',\n        'name': 'VALUE',\n        'check': ['String', 'Array'],\n      },\n    ],\n    'output': 'Boolean',\n    'style': 'text_blocks',\n    'tooltip': '%{BKY_TEXT_ISEMPTY_TOOLTIP}',\n    'helpUrl': '%{BKY_TEXT_ISEMPTY_HELPURL}',\n  },\n  {\n    'type': 'text_indexOf',\n    'message0': '%{BKY_TEXT_INDEXOF_TITLE}',\n    'args0': [\n      {\n        'type': 'input_value',\n        'name': 'VALUE',\n        'check': 'String',\n      },\n      {\n        'type': 'field_dropdown',\n        'name': 'END',\n        'options': [\n          ['%{BKY_TEXT_INDEXOF_OPERATOR_FIRST}', 'FIRST'],\n          ['%{BKY_TEXT_INDEXOF_OPERATOR_LAST}', 'LAST'],\n        ],\n      },\n      {\n        'type': 'input_value',\n        'name': 'FIND',\n        'check': 'String',\n      },\n    ],\n    'output': 'Number',\n    'style': 'text_blocks',\n    'helpUrl': '%{BKY_TEXT_INDEXOF_HELPURL}',\n    'inputsInline': true,\n    'extensions': ['text_indexOf_tooltip'],\n  },\n  {\n    'type': 'text_charAt',\n    'message0': '%{BKY_TEXT_CHARAT_TITLE}', // \"in text %1 %2\"\n    'args0': [\n      {\n        'type': 'input_value',\n        'name': 'VALUE',\n        'check': 'String',\n      },\n      {\n        'type': 'field_dropdown',\n        'name': 'WHERE',\n        'options': [\n          ['%{BKY_TEXT_CHARAT_FROM_START}', 'FROM_START'],\n          ['%{BKY_TEXT_CHARAT_FROM_END}', 'FROM_END'],\n          ['%{BKY_TEXT_CHARAT_FIRST}', 'FIRST'],\n          ['%{BKY_TEXT_CHARAT_LAST}', 'LAST'],\n          ['%{BKY_TEXT_CHARAT_RANDOM}', 'RANDOM'],\n        ],\n      },\n    ],\n    'output': 'String',\n    'style': 'text_blocks',\n    'helpUrl': '%{BKY_TEXT_CHARAT_HELPURL}',\n    'inputsInline': true,\n    'mutator': 'text_charAt_mutator',\n  },\n]);\n\n/** Type of a 'text_get_substring' block. */\ntype GetSubstringBlock = Block & GetSubstringMixin;\ninterface GetSubstringMixin extends GetSubstringType {\n  WHERE_OPTIONS_1: Array<[string, string]>;\n  WHERE_OPTIONS_2: Array<[string, string]>;\n}\ntype GetSubstringType = typeof GET_SUBSTRING_BLOCK;\n\nconst GET_SUBSTRING_BLOCK = {\n  /**\n   * Block for getting substring.\n   */\n  init: function (this: GetSubstringBlock) {\n    this['WHERE_OPTIONS_1'] = [\n      [Msg['TEXT_GET_SUBSTRING_START_FROM_START'], 'FROM_START'],\n      [Msg['TEXT_GET_SUBSTRING_START_FROM_END'], 'FROM_END'],\n      [Msg['TEXT_GET_SUBSTRING_START_FIRST'], 'FIRST'],\n    ];\n    this['WHERE_OPTIONS_2'] = [\n      [Msg['TEXT_GET_SUBSTRING_END_FROM_START'], 'FROM_START'],\n      [Msg['TEXT_GET_SUBSTRING_END_FROM_END'], 'FROM_END'],\n      [Msg['TEXT_GET_SUBSTRING_END_LAST'], 'LAST'],\n    ];\n    this.setHelpUrl(Msg['TEXT_GET_SUBSTRING_HELPURL']);\n    this.setStyle('text_blocks');\n    this.appendValueInput('STRING')\n      .setCheck('String')\n      .appendField(Msg['TEXT_GET_SUBSTRING_INPUT_IN_TEXT']);\n    const createMenu = (n: 1 | 2): FieldDropdown => {\n      const menu = fieldRegistry.fromJson({\n        type: 'field_dropdown',\n        options:\n          this[('WHERE_OPTIONS_' + n) as 'WHERE_OPTIONS_1' | 'WHERE_OPTIONS_2'],\n      }) as FieldDropdown;\n      menu.setValidator(\n        /** @param value The input value. */\n        function (this: FieldDropdown, value: any): null | undefined {\n          const oldValue: string | null = this.getValue();\n          const oldAt = oldValue === 'FROM_START' || oldValue === 'FROM_END';\n          const newAt = value === 'FROM_START' || value === 'FROM_END';\n          if (newAt !== oldAt) {\n            const block = this.getSourceBlock() as GetSubstringBlock;\n            block.updateAt_(n, newAt);\n          }\n          return undefined;\n        },\n      );\n      return menu;\n    };\n    this.appendDummyInput('WHERE1_INPUT').appendField(createMenu(1), 'WHERE1');\n    this.appendDummyInput('AT1');\n    this.appendDummyInput('WHERE2_INPUT').appendField(createMenu(2), 'WHERE2');\n    this.appendDummyInput('AT2');\n    if (Msg['TEXT_GET_SUBSTRING_TAIL']) {\n      this.appendDummyInput('TAIL').appendField(Msg['TEXT_GET_SUBSTRING_TAIL']);\n    }\n    this.setInputsInline(true);\n    this.setOutput(true, 'String');\n    this.updateAt_(1, true);\n    this.updateAt_(2, true);\n    this.setTooltip(Msg['TEXT_GET_SUBSTRING_TOOLTIP']);\n  },\n  /**\n   * Create XML to represent whether there are 'AT' inputs.\n   * Backwards compatible serialization implementation.\n   *\n   * @returns XML storage element.\n   */\n  mutationToDom: function (this: GetSubstringBlock): Element {\n    const container = xmlUtils.createElement('mutation');\n    const isAt1 = this.getInput('AT1') instanceof ValueInput;\n    container.setAttribute('at1', `${isAt1}`);\n    const isAt2 = this.getInput('AT2') instanceof ValueInput;\n    container.setAttribute('at2', `${isAt2}`);\n    return container;\n  },\n  /**\n   * Parse XML to restore the 'AT' inputs.\n   * Backwards compatible serialization implementation.\n   *\n   * @param xmlElement XML storage element.\n   */\n  domToMutation: function (this: GetSubstringBlock, xmlElement: Element) {\n    const isAt1 = xmlElement.getAttribute('at1') === 'true';\n    const isAt2 = xmlElement.getAttribute('at2') === 'true';\n    this.updateAt_(1, isAt1);\n    this.updateAt_(2, isAt2);\n  },\n\n  // This block does not need JSO serialization hooks (saveExtraState and\n  // loadExtraState) because the state of this object is already encoded in the\n  // dropdown values.\n  // XML hooks are kept for backwards compatibility.\n\n  /**\n   * Create or delete an input for a numeric index.\n   * This block has two such inputs, independent of each other.\n   *\n   * @internal\n   * @param n Which input to modify (either 1 or 2).\n   * @param isAt True if the input includes a value connection, false otherwise.\n   */\n  updateAt_: function (this: GetSubstringBlock, n: 1 | 2, isAt: boolean) {\n    // Create or delete an input for the numeric index.\n    // Destroy old 'AT' and 'ORDINAL' inputs.\n    this.removeInput('AT' + n);\n    this.removeInput('ORDINAL' + n, true);\n    // Create either a value 'AT' input or a dummy input.\n    if (isAt) {\n      this.appendValueInput('AT' + n).setCheck('Number');\n      if (Msg['ORDINAL_NUMBER_SUFFIX']) {\n        this.appendDummyInput('ORDINAL' + n).appendField(\n          Msg['ORDINAL_NUMBER_SUFFIX'],\n        );\n      }\n    } else {\n      this.appendDummyInput('AT' + n);\n    }\n    // Move tail, if present, to end of block.\n    if (n === 2 && Msg['TEXT_GET_SUBSTRING_TAIL']) {\n      this.removeInput('TAIL', true);\n      this.appendDummyInput('TAIL').appendField(Msg['TEXT_GET_SUBSTRING_TAIL']);\n    }\n    if (n === 1) {\n      this.moveInputBefore('AT1', 'WHERE2_INPUT');\n      if (this.getInput('ORDINAL1')) {\n        this.moveInputBefore('ORDINAL1', 'WHERE2_INPUT');\n      }\n    }\n  },\n};\n\nblocks['text_getSubstring'] = GET_SUBSTRING_BLOCK;\n\nblocks['text_changeCase'] = {\n  /**\n   * Block for changing capitalization.\n   */\n  init: function (this: Block) {\n    const OPERATORS = [\n      [Msg['TEXT_CHANGECASE_OPERATOR_UPPERCASE'], 'UPPERCASE'],\n      [Msg['TEXT_CHANGECASE_OPERATOR_LOWERCASE'], 'LOWERCASE'],\n      [Msg['TEXT_CHANGECASE_OPERATOR_TITLECASE'], 'TITLECASE'],\n    ];\n    this.setHelpUrl(Msg['TEXT_CHANGECASE_HELPURL']);\n    this.setStyle('text_blocks');\n    this.appendValueInput('TEXT')\n      .setCheck('String')\n      .appendField(\n        fieldRegistry.fromJson({\n          type: 'field_dropdown',\n          options: OPERATORS,\n        }) as FieldDropdown,\n        'CASE',\n      );\n    this.setOutput(true, 'String');\n    this.setTooltip(Msg['TEXT_CHANGECASE_TOOLTIP']);\n  },\n};\n\nblocks['text_trim'] = {\n  /**\n   * Block for trimming spaces.\n   */\n  init: function (this: Block) {\n    const OPERATORS = [\n      [Msg['TEXT_TRIM_OPERATOR_BOTH'], 'BOTH'],\n      [Msg['TEXT_TRIM_OPERATOR_LEFT'], 'LEFT'],\n      [Msg['TEXT_TRIM_OPERATOR_RIGHT'], 'RIGHT'],\n    ];\n    this.setHelpUrl(Msg['TEXT_TRIM_HELPURL']);\n    this.setStyle('text_blocks');\n    this.appendValueInput('TEXT')\n      .setCheck('String')\n      .appendField(\n        fieldRegistry.fromJson({\n          type: 'field_dropdown',\n          options: OPERATORS,\n        }) as FieldDropdown,\n        'MODE',\n      );\n    this.setOutput(true, 'String');\n    this.setTooltip(Msg['TEXT_TRIM_TOOLTIP']);\n  },\n};\n\nblocks['text_print'] = {\n  /**\n   * Block for print statement.\n   */\n  init: function (this: Block) {\n    this.jsonInit({\n      'message0': Msg['TEXT_PRINT_TITLE'],\n      'args0': [\n        {\n          'type': 'input_value',\n          'name': 'TEXT',\n        },\n      ],\n      'previousStatement': null,\n      'nextStatement': null,\n      'style': 'text_blocks',\n      'tooltip': Msg['TEXT_PRINT_TOOLTIP'],\n      'helpUrl': Msg['TEXT_PRINT_HELPURL'],\n    });\n  },\n};\n\ntype PromptCommonBlock = Block & PromptCommonMixin;\ninterface PromptCommonMixin extends PromptCommonType {}\ntype PromptCommonType = typeof PROMPT_COMMON;\n\n/**\n * Common properties for the text_prompt_ext and text_prompt blocks\n * definitions.\n */\nconst PROMPT_COMMON = {\n  /**\n   * Modify this block to have the correct output type.\n   *\n   * @internal\n   * @param newOp The new output type. Should be either 'TEXT' or 'NUMBER'.\n   */\n  updateType_: function (this: PromptCommonBlock, newOp: string) {\n    this.outputConnection!.setCheck(newOp === 'NUMBER' ? 'Number' : 'String');\n  },\n  /**\n   * Create XML to represent the output type.\n   * Backwards compatible serialization implementation.\n   *\n   * @returns XML storage element.\n   */\n  mutationToDom: function (this: PromptCommonBlock): Element {\n    const container = xmlUtils.createElement('mutation');\n    container.setAttribute('type', this.getFieldValue('TYPE'));\n    return container;\n  },\n  /**\n   * Parse XML to restore the output type.\n   * Backwards compatible serialization implementation.\n   *\n   * @param xmlElement XML storage element.\n   */\n  domToMutation: function (this: PromptCommonBlock, xmlElement: Element) {\n    this.updateType_(xmlElement.getAttribute('type')!);\n  },\n\n  // These blocks do not need JSO serialization hooks (saveExtraState\n  // and loadExtraState) because the state of this object is already\n  // encoded in the dropdown values.\n  // XML hooks are kept for backwards compatibility.\n};\n\nblocks['text_prompt_ext'] = {\n  ...PROMPT_COMMON,\n  /**\n   * Block for prompt function (external message).\n   */\n  init: function (this: PromptCommonBlock) {\n    const TYPES = [\n      [Msg['TEXT_PROMPT_TYPE_TEXT'], 'TEXT'],\n      [Msg['TEXT_PROMPT_TYPE_NUMBER'], 'NUMBER'],\n    ];\n    this.setHelpUrl(Msg['TEXT_PROMPT_HELPURL']);\n    this.setStyle('text_blocks');\n    const dropdown = fieldRegistry.fromJson({\n      type: 'field_dropdown',\n      options: TYPES,\n    }) as FieldDropdown;\n    dropdown.setValidator((newOp: string) => {\n      this.updateType_(newOp);\n      return undefined; // FieldValidators can't be void.  Use option as-is.\n    });\n    this.appendValueInput('TEXT').appendField(dropdown, 'TYPE');\n    this.setOutput(true, 'String');\n    this.setTooltip(() => {\n      return this.getFieldValue('TYPE') === 'TEXT'\n        ? Msg['TEXT_PROMPT_TOOLTIP_TEXT']\n        : Msg['TEXT_PROMPT_TOOLTIP_NUMBER'];\n    });\n  },\n};\n\ntype PromptBlock = Block & PromptCommonMixin & QuoteImageMixin;\n\nblocks['text_prompt'] = {\n  ...PROMPT_COMMON,\n  /**\n   * Block for prompt function (internal message).\n   * The 'text_prompt_ext' block is preferred as it is more flexible.\n   */\n  init: function (this: PromptBlock) {\n    this.mixin(QUOTE_IMAGE_MIXIN);\n    const TYPES = [\n      [Msg['TEXT_PROMPT_TYPE_TEXT'], 'TEXT'],\n      [Msg['TEXT_PROMPT_TYPE_NUMBER'], 'NUMBER'],\n    ];\n\n    this.setHelpUrl(Msg['TEXT_PROMPT_HELPURL']);\n    this.setStyle('text_blocks');\n    const dropdown = fieldRegistry.fromJson({\n      type: 'field_dropdown',\n      options: TYPES,\n    }) as FieldDropdown;\n    dropdown.setValidator((newOp: string) => {\n      this.updateType_(newOp);\n      return undefined; // FieldValidators can't be void.  Use option as-is.\n    });\n    this.appendDummyInput()\n      .appendField(dropdown, 'TYPE')\n      .appendField(this.newQuote_(true))\n      .appendField(\n        fieldRegistry.fromJson({\n          type: 'field_input',\n          text: '',\n        }) as FieldTextInput,\n        'TEXT',\n      )\n      .appendField(this.newQuote_(false));\n    this.setOutput(true, 'String');\n    this.setTooltip(() => {\n      return this.getFieldValue('TYPE') === 'TEXT'\n        ? Msg['TEXT_PROMPT_TOOLTIP_TEXT']\n        : Msg['TEXT_PROMPT_TOOLTIP_NUMBER'];\n    });\n  },\n};\n\nblocks['text_count'] = {\n  /**\n   * Block for counting how many times one string appears within another string.\n   */\n  init: function (this: Block) {\n    this.jsonInit({\n      'message0': Msg['TEXT_COUNT_MESSAGE0'],\n      'args0': [\n        {\n          'type': 'input_value',\n          'name': 'SUB',\n          'check': 'String',\n        },\n        {\n          'type': 'input_value',\n          'name': 'TEXT',\n          'check': 'String',\n        },\n      ],\n      'output': 'Number',\n      'inputsInline': true,\n      'style': 'text_blocks',\n      'tooltip': Msg['TEXT_COUNT_TOOLTIP'],\n      'helpUrl': Msg['TEXT_COUNT_HELPURL'],\n    });\n  },\n};\n\nblocks['text_replace'] = {\n  /**\n   * Block for replacing one string with another in the text.\n   */\n  init: function (this: Block) {\n    this.jsonInit({\n      'message0': Msg['TEXT_REPLACE_MESSAGE0'],\n      'args0': [\n        {\n          'type': 'input_value',\n          'name': 'FROM',\n          'check': 'String',\n        },\n        {\n          'type': 'input_value',\n          'name': 'TO',\n          'check': 'String',\n        },\n        {\n          'type': 'input_value',\n          'name': 'TEXT',\n          'check': 'String',\n        },\n      ],\n      'output': 'String',\n      'inputsInline': true,\n      'style': 'text_blocks',\n      'tooltip': Msg['TEXT_REPLACE_TOOLTIP'],\n      'helpUrl': Msg['TEXT_REPLACE_HELPURL'],\n    });\n  },\n};\n\nblocks['text_reverse'] = {\n  /**\n   * Block for reversing a string.\n   */\n  init: function (this: Block) {\n    this.jsonInit({\n      'message0': Msg['TEXT_REVERSE_MESSAGE0'],\n      'args0': [\n        {\n          'type': 'input_value',\n          'name': 'TEXT',\n          'check': 'String',\n        },\n      ],\n      'output': 'String',\n      'inputsInline': true,\n      'style': 'text_blocks',\n      'tooltip': Msg['TEXT_REVERSE_TOOLTIP'],\n      'helpUrl': Msg['TEXT_REVERSE_HELPURL'],\n    });\n  },\n};\n\n/** Type of a block that has QUOTE_IMAGE_MIXIN */\ntype QuoteImageBlock = Block & QuoteImageMixin;\ninterface QuoteImageMixin extends QuoteImageMixinType {}\ntype QuoteImageMixinType = typeof QUOTE_IMAGE_MIXIN;\n\nconst QUOTE_IMAGE_MIXIN = {\n  /**\n   * Image data URI of an LTR opening double quote (same as RTL closing double\n   * quote).\n   */\n  QUOTE_IMAGE_LEFT_DATAURI:\n    'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAA' +\n    'n0lEQVQI1z3OMa5BURSF4f/cQhAKjUQhuQmFNwGJEUi0RKN5rU7FHKhpjEH3TEMtkdBSCY' +\n    '1EIv8r7nFX9e29V7EBAOvu7RPjwmWGH/VuF8CyN9/OAdvqIXYLvtRaNjx9mMTDyo+NjAN1' +\n    'HNcl9ZQ5oQMM3dgDUqDo1l8DzvwmtZN7mnD+PkmLa+4mhrxVA9fRowBWmVBhFy5gYEjKMf' +\n    'z9AylsaRRgGzvZAAAAAElFTkSuQmCC',\n  /**\n   * Image data URI of an LTR closing double quote (same as RTL opening double\n   * quote).\n   */\n  QUOTE_IMAGE_RIGHT_DATAURI:\n    'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAA' +\n    'qUlEQVQI1z3KvUpCcRiA8ef9E4JNHhI0aFEacm1o0BsI0Slx8wa8gLauoDnoBhq7DcfWhg' +\n    'gONDmJJgqCPA7neJ7p934EOOKOnM8Q7PDElo/4x4lFb2DmuUjcUzS3URnGib9qaPNbuXvB' +\n    'O3sGPHJDRG6fGVdMSeWDP2q99FQdFrz26Gu5Tq7dFMzUvbXy8KXeAj57cOklgA+u1B5Aos' +\n    'lLtGIHQMaCVnwDnADZIFIrXsoXrgAAAABJRU5ErkJggg==',\n  /**\n   * Pixel width of QUOTE_IMAGE_LEFT_DATAURI and QUOTE_IMAGE_RIGHT_DATAURI.\n   */\n  QUOTE_IMAGE_WIDTH: 12,\n  /**\n   * Pixel height of QUOTE_IMAGE_LEFT_DATAURI and QUOTE_IMAGE_RIGHT_DATAURI.\n   */\n  QUOTE_IMAGE_HEIGHT: 12,\n\n  /**\n   * Inserts appropriate quote images before and after the named field.\n   *\n   * @param fieldName The name of the field to wrap with quotes.\n   */\n  quoteField_: function (this: QuoteImageBlock, fieldName: string) {\n    for (let i = 0, input; (input = this.inputList[i]); i++) {\n      for (let j = 0, field; (field = input.fieldRow[j]); j++) {\n        if (fieldName === field.name) {\n          input.insertFieldAt(j, this.newQuote_(true));\n          input.insertFieldAt(j + 2, this.newQuote_(false));\n          return;\n        }\n      }\n    }\n    console.warn(\n      'field named \"' + fieldName + '\" not found in ' + this.toDevString(),\n    );\n  },\n\n  /**\n   * A helper function that generates a FieldImage of an opening or\n   * closing double quote. The selected quote will be adapted for RTL blocks.\n   *\n   * @param open If the image should be open quote (“ in LTR).\n   *     Otherwise, a closing quote is used (” in LTR).\n   * @returns The new field.\n   */\n  newQuote_: function (this: QuoteImageBlock, open: boolean): FieldImage {\n    const isLeft = this.RTL ? !open : open;\n    const dataUri = isLeft\n      ? this.QUOTE_IMAGE_LEFT_DATAURI\n      : this.QUOTE_IMAGE_RIGHT_DATAURI;\n    return fieldRegistry.fromJson({\n      type: 'field_image',\n      src: dataUri,\n      width: this.QUOTE_IMAGE_WIDTH,\n      height: this.QUOTE_IMAGE_HEIGHT,\n      alt: isLeft ? '\\u201C' : '\\u201D',\n    }) as FieldImage;\n  },\n};\n\n/**\n * Wraps TEXT field with images of double quote characters.\n */\nconst QUOTES_EXTENSION = function (this: QuoteImageBlock) {\n  this.mixin(QUOTE_IMAGE_MIXIN);\n  this.quoteField_('TEXT');\n};\n\n/**\n * Type of a block that has TEXT_JOIN_MUTATOR_MIXIN\n *\n * @internal\n */\nexport type JoinMutatorBlock = BlockSvg & JoinMutatorMixin & QuoteImageMixin;\ninterface JoinMutatorMixin extends JoinMutatorMixinType {}\ntype JoinMutatorMixinType = typeof JOIN_MUTATOR_MIXIN;\n\n/** Type of a item block in the text_join_mutator bubble. */\ntype JoinItemBlock = BlockSvg & JoinItemMixin;\ninterface JoinItemMixin {\n  valueConnection_: Connection | null;\n}\n\n/**\n * Mixin for mutator functions in the 'text_join_mutator' extension.\n */\nconst JOIN_MUTATOR_MIXIN = {\n  itemCount_: 0,\n  /**\n   * Create XML to represent number of text inputs.\n   * Backwards compatible serialization implementation.\n   *\n   * @returns XML storage element.\n   */\n  mutationToDom: function (this: JoinMutatorBlock): Element {\n    const container = xmlUtils.createElement('mutation');\n    container.setAttribute('items', `${this.itemCount_}`);\n    return container;\n  },\n  /**\n   * Parse XML to restore the text inputs.\n   * Backwards compatible serialization implementation.\n   *\n   * @param xmlElement XML storage element.\n   */\n  domToMutation: function (this: JoinMutatorBlock, xmlElement: Element) {\n    this.itemCount_ = parseInt(xmlElement.getAttribute('items')!, 10);\n    this.updateShape_();\n  },\n  /**\n   * Returns the state of this block as a JSON serializable object.\n   *\n   * @returns The state of this block, ie the item count.\n   */\n  saveExtraState: function (this: JoinMutatorBlock): {itemCount: number} {\n    return {\n      'itemCount': this.itemCount_,\n    };\n  },\n  /**\n   * Applies the given state to this block.\n   *\n   * @param state The state to apply to this block, ie the item count.\n   */\n  loadExtraState: function (this: JoinMutatorBlock, state: {[x: string]: any}) {\n    this.itemCount_ = state['itemCount'];\n    this.updateShape_();\n  },\n  /**\n   * Populate the mutator's dialog with this block's components.\n   *\n   * @param workspace Mutator's workspace.\n   * @returns Root block in mutator.\n   */\n  decompose: function (this: JoinMutatorBlock, workspace: Workspace): Block {\n    const containerBlock = workspace.newBlock(\n      'text_create_join_container',\n    ) as BlockSvg;\n    containerBlock.initSvg();\n    let connection = containerBlock.getInput('STACK')!.connection!;\n    for (let i = 0; i < this.itemCount_; i++) {\n      const itemBlock = workspace.newBlock(\n        'text_create_join_item',\n      ) as JoinItemBlock;\n      itemBlock.initSvg();\n      connection.connect(itemBlock.previousConnection);\n      connection = itemBlock.nextConnection;\n    }\n    return containerBlock;\n  },\n  /**\n   * Reconfigure this block based on the mutator dialog's components.\n   *\n   * @param containerBlock Root block in mutator.\n   */\n  compose: function (this: JoinMutatorBlock, containerBlock: Block) {\n    let itemBlock = containerBlock.getInputTargetBlock(\n      'STACK',\n    ) as JoinItemBlock;\n    // Count number of inputs.\n    const connections = [];\n    while (itemBlock) {\n      if (itemBlock.isInsertionMarker()) {\n        itemBlock = itemBlock.getNextBlock() as JoinItemBlock;\n        continue;\n      }\n      connections.push(itemBlock.valueConnection_);\n      itemBlock = itemBlock.getNextBlock() as JoinItemBlock;\n    }\n    // Disconnect any children that don't belong.\n    for (let i = 0; i < this.itemCount_; i++) {\n      const connection = this.getInput('ADD' + i)!.connection!.targetConnection;\n      if (connection && !connections.includes(connection)) {\n        connection.disconnect();\n      }\n    }\n    this.itemCount_ = connections.length;\n    this.updateShape_();\n    // Reconnect any child blocks.\n    for (let i = 0; i < this.itemCount_; i++) {\n      connections[i]?.reconnect(this, 'ADD' + i);\n    }\n  },\n  /**\n   * Store pointers to any connected child blocks.\n   *\n   * @param containerBlock Root block in mutator.\n   */\n  saveConnections: function (this: JoinMutatorBlock, containerBlock: Block) {\n    let itemBlock = containerBlock.getInputTargetBlock('STACK');\n    let i = 0;\n    while (itemBlock) {\n      if (itemBlock.isInsertionMarker()) {\n        itemBlock = itemBlock.getNextBlock();\n        continue;\n      }\n      const input = this.getInput('ADD' + i);\n      (itemBlock as JoinItemBlock).valueConnection_ =\n        input && input.connection!.targetConnection;\n      itemBlock = itemBlock.getNextBlock();\n      i++;\n    }\n  },\n  /**\n   * Modify this block to have the correct number of inputs.\n   *\n   */\n  updateShape_: function (this: JoinMutatorBlock) {\n    if (this.itemCount_ && this.getInput('EMPTY')) {\n      this.removeInput('EMPTY');\n    } else if (!this.itemCount_ && !this.getInput('EMPTY')) {\n      this.appendDummyInput('EMPTY')\n        .appendField(this.newQuote_(true))\n        .appendField(this.newQuote_(false));\n    }\n    // Add new inputs.\n    for (let i = 0; i < this.itemCount_; i++) {\n      if (!this.getInput('ADD' + i)) {\n        const input = this.appendValueInput('ADD' + i).setAlign(Align.RIGHT);\n        if (i === 0) {\n          input.appendField(Msg['TEXT_JOIN_TITLE_CREATEWITH']);\n        }\n      }\n    }\n    // Remove deleted inputs.\n    for (let i = this.itemCount_; this.getInput('ADD' + i); i++) {\n      this.removeInput('ADD' + i);\n    }\n  },\n};\n\n/**\n * Performs final setup of a text_join block.\n */\nconst JOIN_EXTENSION = function (this: JoinMutatorBlock) {\n  // Add the quote mixin for the itemCount_ = 0 case.\n  this.mixin(QUOTE_IMAGE_MIXIN);\n  // Initialize the mutator values.\n  this.itemCount_ = 2;\n  this.updateShape_();\n  // Configure the mutator UI.\n  this.setMutator(new MutatorIcon(['text_create_join_item'], this));\n};\n\n// Update the tooltip of 'text_append' block to reference the variable.\nExtensions.register(\n  'text_append_tooltip',\n  Extensions.buildTooltipWithFieldText('%{BKY_TEXT_APPEND_TOOLTIP}', 'VAR'),\n);\n\n/**\n * Update the tooltip of 'text_append' block to reference the variable.\n */\nconst INDEXOF_TOOLTIP_EXTENSION = function (this: Block) {\n  this.setTooltip(() => {\n    return Msg['TEXT_INDEXOF_TOOLTIP'].replace(\n      '%1',\n      this.workspace.options.oneBasedIndex ? '0' : '-1',\n    );\n  });\n};\n\n/** Type of a block that has TEXT_CHARAT_MUTATOR_MIXIN */\ntype CharAtBlock = Block & CharAtMixin;\ninterface CharAtMixin extends CharAtMixinType {}\ntype CharAtMixinType = typeof CHARAT_MUTATOR_MIXIN;\n\n/**\n * Mixin for mutator functions in the 'text_charAt_mutator' extension.\n */\nconst CHARAT_MUTATOR_MIXIN = {\n  isAt_: false,\n  /**\n   * Create XML to represent whether there is an 'AT' input.\n   * Backwards compatible serialization implementation.\n   *\n   * @returns XML storage element.\n   */\n  mutationToDom: function (this: CharAtBlock): Element {\n    const container = xmlUtils.createElement('mutation');\n    container.setAttribute('at', `${this.isAt_}`);\n    return container;\n  },\n  /**\n   * Parse XML to restore the 'AT' input.\n   * Backwards compatible serialization implementation.\n   *\n   * @param xmlElement XML storage element.\n   */\n  domToMutation: function (this: CharAtBlock, xmlElement: Element) {\n    // Note: Until January 2013 this block did not have mutations,\n    // so 'at' defaults to true.\n    const isAt = xmlElement.getAttribute('at') !== 'false';\n    this.updateAt_(isAt);\n  },\n\n  // This block does not need JSO serialization hooks (saveExtraState and\n  // loadExtraState) because the state of this object is already encoded in the\n  // dropdown values.\n  // XML hooks are kept for backwards compatibility.\n\n  /**\n   * Create or delete an input for the numeric index.\n   *\n   * @internal\n   * @param isAt True if the input should exist.\n   */\n  updateAt_: function (this: CharAtBlock, isAt: boolean) {\n    // Destroy old 'AT' and 'ORDINAL' inputs.\n    this.removeInput('AT', true);\n    this.removeInput('ORDINAL', true);\n    // Create either a value 'AT' input or a dummy input.\n    if (isAt) {\n      this.appendValueInput('AT').setCheck('Number');\n      if (Msg['ORDINAL_NUMBER_SUFFIX']) {\n        this.appendDummyInput('ORDINAL').appendField(\n          Msg['ORDINAL_NUMBER_SUFFIX'],\n        );\n      }\n    }\n    if (Msg['TEXT_CHARAT_TAIL']) {\n      this.removeInput('TAIL', true);\n      this.appendDummyInput('TAIL').appendField(Msg['TEXT_CHARAT_TAIL']);\n    }\n\n    this.isAt_ = isAt;\n  },\n};\n\n/**\n * Does the initial mutator update of text_charAt and adds the tooltip\n */\nconst CHARAT_EXTENSION = function (this: CharAtBlock) {\n  const dropdown = this.getField('WHERE') as FieldDropdown;\n  dropdown.setValidator(function (this: FieldDropdown, value: any) {\n    const newAt = value === 'FROM_START' || value === 'FROM_END';\n    const block = this.getSourceBlock() as CharAtBlock;\n    if (newAt !== block.isAt_) {\n      block.updateAt_(newAt);\n    }\n    return undefined; // FieldValidators can't be void.  Use option as-is.\n  });\n  this.updateAt_(true);\n  this.setTooltip(() => {\n    const where = this.getFieldValue('WHERE');\n    let tooltip = Msg['TEXT_CHARAT_TOOLTIP'];\n    if (where === 'FROM_START' || where === 'FROM_END') {\n      const msg =\n        where === 'FROM_START'\n          ? Msg['LISTS_INDEX_FROM_START_TOOLTIP']\n          : Msg['LISTS_INDEX_FROM_END_TOOLTIP'];\n      if (msg) {\n        tooltip +=\n          '  ' +\n          msg.replace('%1', this.workspace.options.oneBasedIndex ? '#1' : '#0');\n      }\n    }\n    return tooltip;\n  });\n};\n\nExtensions.register('text_indexOf_tooltip', INDEXOF_TOOLTIP_EXTENSION);\n\nExtensions.register('text_quotes', QUOTES_EXTENSION);\n\nExtensions.registerMixin('quote_image_mixin', QUOTE_IMAGE_MIXIN);\n\nExtensions.registerMutator(\n  'text_join_mutator',\n  JOIN_MUTATOR_MIXIN,\n  JOIN_EXTENSION,\n);\n\nExtensions.registerMutator(\n  'text_charAt_mutator',\n  CHARAT_MUTATOR_MIXIN,\n  CHARAT_EXTENSION,\n);\n\n// Register provided blocks.\ndefineBlocks(blocks);\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// Former goog.module ID: Blockly.libraryBlocks.procedures\n\nimport type {Block} from '../core/block.js';\nimport type {BlockSvg} from '../core/block_svg.js';\nimport type {BlockDefinition} from '../core/blocks.js';\nimport {defineBlocks} from '../core/common.js';\nimport {config} from '../core/config.js';\nimport type {Connection} from '../core/connection.js';\nimport * as ContextMenu from '../core/contextmenu.js';\nimport type {\n  ContextMenuOption,\n  LegacyContextMenuOption,\n} from '../core/contextmenu_registry.js';\nimport * as Events from '../core/events/events.js';\nimport type {Abstract as AbstractEvent} from '../core/events/events_abstract.js';\nimport type {BlockChange} from '../core/events/events_block_change.js';\nimport type {BlockCreate} from '../core/events/events_block_create.js';\nimport * as eventUtils from '../core/events/utils.js';\nimport {FieldCheckbox} from '../core/field_checkbox.js';\nimport {FieldLabel} from '../core/field_label.js';\nimport * as fieldRegistry from '../core/field_registry.js';\nimport {FieldTextInput} from '../core/field_textinput.js';\nimport {getFocusManager} from '../core/focus_manager.js';\nimport '../core/icons/comment_icon.js';\nimport {MutatorIcon as Mutator} from '../core/icons/mutator_icon.js';\nimport '../core/icons/warning_icon.js';\nimport {Align} from '../core/inputs/align.js';\nimport type {\n  IVariableModel,\n  IVariableState,\n} from '../core/interfaces/i_variable_model.js';\nimport {Msg} from '../core/msg.js';\nimport {Names} from '../core/names.js';\nimport * as Procedures from '../core/procedures.js';\nimport * as xmlUtils from '../core/utils/xml.js';\nimport * as Variables from '../core/variables.js';\nimport type {Workspace} from '../core/workspace.js';\nimport type {WorkspaceSvg} from '../core/workspace_svg.js';\nimport * as Xml from '../core/xml.js';\n\n/** A dictionary of the block definitions provided by this module. */\nexport const blocks: {[key: string]: BlockDefinition} = {};\n\n/** Type of a block using the PROCEDURE_DEF_COMMON mixin. */\ntype ProcedureBlock = Block & ProcedureMixin;\ninterface ProcedureMixin extends ProcedureMixinType {\n  arguments_: string[];\n  argumentVarModels_: IVariableModel<IVariableState>[];\n  callType_: string;\n  paramIds_: string[];\n  hasStatements_: boolean;\n  statementConnection_: Connection | null;\n}\ntype ProcedureMixinType = typeof PROCEDURE_DEF_COMMON;\n\n/** Extra state for serialising procedure blocks. */\ntype ProcedureExtraState = {\n  params?: Array<{name: string; id: string}>;\n  hasStatements: boolean;\n};\n\n/**\n * Common properties for the procedure_defnoreturn and\n * procedure_defreturn blocks.\n */\nconst PROCEDURE_DEF_COMMON = {\n  /**\n   * Add or remove the statement block from this function definition.\n   *\n   * @param hasStatements True if a statement block is needed.\n   */\n  setStatements_: function (this: ProcedureBlock, hasStatements: boolean) {\n    if (this.hasStatements_ === hasStatements) {\n      return;\n    }\n    if (hasStatements) {\n      this.appendStatementInput('STACK').appendField(\n        Msg['PROCEDURES_DEFNORETURN_DO'],\n      );\n      if (this.getInput('RETURN')) {\n        this.moveInputBefore('STACK', 'RETURN');\n      }\n    } else {\n      this.removeInput('STACK', true);\n    }\n    this.hasStatements_ = hasStatements;\n  },\n  /**\n   * Update the display of parameters for this procedure definition block.\n   *\n   * @internal\n   */\n  updateParams_: function (this: ProcedureBlock) {\n    // Merge the arguments into a human-readable list.\n    let paramString = '';\n    if (this.arguments_.length) {\n      paramString =\n        Msg['PROCEDURES_BEFORE_PARAMS'] + ' ' + this.arguments_.join(', ');\n    }\n    // The params field is deterministic based on the mutation,\n    // no need to fire a change event.\n    Events.disable();\n    try {\n      this.setFieldValue(paramString, 'PARAMS');\n    } finally {\n      Events.enable();\n    }\n  },\n  /**\n   * Create XML to represent the argument inputs.\n   * Backwards compatible serialization implementation.\n   *\n   * @param opt_paramIds If true include the IDs of the parameter\n   *     quarks.  Used by Procedures.mutateCallers for reconnection.\n   * @returns  XML storage element.\n   */\n  mutationToDom: function (\n    this: ProcedureBlock,\n    opt_paramIds: boolean,\n  ): Element {\n    const container = xmlUtils.createElement('mutation');\n    if (opt_paramIds) {\n      container.setAttribute('name', this.getFieldValue('NAME'));\n    }\n    for (let i = 0; i < this.argumentVarModels_.length; i++) {\n      const parameter = xmlUtils.createElement('arg');\n      const argModel = this.argumentVarModels_[i];\n      parameter.setAttribute('name', argModel.getName());\n      parameter.setAttribute('varid', argModel.getId());\n      if (opt_paramIds && this.paramIds_) {\n        parameter.setAttribute('paramId', this.paramIds_[i]);\n      }\n      container.appendChild(parameter);\n    }\n\n    // Save whether the statement input is visible.\n    if (!this.hasStatements_) {\n      container.setAttribute('statements', 'false');\n    }\n    return container;\n  },\n  /**\n   * Parse XML to restore the argument inputs.\n   * Backwards compatible serialization implementation.\n   *\n   * @param xmlElement XML storage element.\n   */\n  domToMutation: function (this: ProcedureBlock, xmlElement: Element) {\n    this.arguments_ = [];\n    this.argumentVarModels_ = [];\n    for (let i = 0, childNode; (childNode = xmlElement.childNodes[i]); i++) {\n      if (childNode.nodeName.toLowerCase() === 'arg') {\n        const childElement = childNode as Element;\n        const varName = childElement.getAttribute('name')!;\n        const varId =\n          childElement.getAttribute('varid') ||\n          childElement.getAttribute('varId');\n        this.arguments_.push(varName);\n        const variable = Variables.getOrCreateVariablePackage(\n          this.workspace,\n          varId,\n          varName,\n          '',\n        );\n        if (variable !== null) {\n          this.argumentVarModels_.push(variable);\n        } else {\n          console.log(\n            `Failed to create a variable named \"${varName}\", ignoring.`,\n          );\n        }\n      }\n    }\n    this.updateParams_();\n    Procedures.mutateCallers(this);\n\n    // Show or hide the statement input.\n    this.setStatements_(xmlElement.getAttribute('statements') !== 'false');\n  },\n  /**\n   * Returns the state of this block as a JSON serializable object.\n   *\n   * @returns The state of this block, eg the parameters and statements.\n   */\n  saveExtraState: function (this: ProcedureBlock): ProcedureExtraState | null {\n    if (!this.argumentVarModels_.length && this.hasStatements_) {\n      return null;\n    }\n    const state = Object.create(null);\n    if (this.argumentVarModels_.length) {\n      state['params'] = [];\n      for (let i = 0; i < this.argumentVarModels_.length; i++) {\n        state['params'].push({\n          // We don't need to serialize the name, but just in case we decide\n          // to separate params from variables.\n          'name': this.argumentVarModels_[i].getName(),\n          'id': this.argumentVarModels_[i].getId(),\n        });\n      }\n    }\n    if (!this.hasStatements_) {\n      state['hasStatements'] = false;\n    }\n    return state;\n  },\n  /**\n   * Applies the given state to this block.\n   *\n   * @param state The state to apply to this block, eg the parameters\n   *     and statements.\n   */\n  loadExtraState: function (this: ProcedureBlock, state: ProcedureExtraState) {\n    this.arguments_ = [];\n    this.argumentVarModels_ = [];\n    if (state['params']) {\n      for (let i = 0; i < state['params'].length; i++) {\n        const param = state['params'][i];\n        const variable = Variables.getOrCreateVariablePackage(\n          this.workspace,\n          param['id'],\n          param['name'],\n          '',\n        );\n        this.arguments_.push(variable.getName());\n        this.argumentVarModels_.push(variable);\n      }\n    }\n    this.updateParams_();\n    Procedures.mutateCallers(this);\n    this.setStatements_(state['hasStatements'] === false ? false : true);\n  },\n  /**\n   * Populate the mutator's dialog with this block's components.\n   *\n   * @param  workspace Mutator's workspace.\n   * @returns Root block in mutator.\n   */\n  decompose: function (\n    this: ProcedureBlock,\n    workspace: Workspace,\n  ): ContainerBlock {\n    /*\n     * Creates the following XML:\n     * <block type=\"procedures_mutatorcontainer\">\n     *   <statement name=\"STACK\">\n     *     <block type=\"procedures_mutatorarg\">\n     *       <field name=\"NAME\">arg1_name</field>\n     *       <next>etc...</next>\n     *     </block>\n     *   </statement>\n     * </block>\n     */\n\n    const containerBlockNode = xmlUtils.createElement('block');\n    containerBlockNode.setAttribute('type', 'procedures_mutatorcontainer');\n    const statementNode = xmlUtils.createElement('statement');\n    statementNode.setAttribute('name', 'STACK');\n    containerBlockNode.appendChild(statementNode);\n\n    let node = statementNode;\n    for (let i = 0; i < this.arguments_.length; i++) {\n      const argBlockNode = xmlUtils.createElement('block');\n      argBlockNode.setAttribute('type', 'procedures_mutatorarg');\n      const fieldNode = xmlUtils.createElement('field');\n      fieldNode.setAttribute('name', 'NAME');\n      const argumentName = xmlUtils.createTextNode(this.arguments_[i]);\n      fieldNode.appendChild(argumentName);\n      argBlockNode.appendChild(fieldNode);\n      const nextNode = xmlUtils.createElement('next');\n      argBlockNode.appendChild(nextNode);\n\n      node.appendChild(argBlockNode);\n      node = nextNode;\n    }\n\n    const containerBlock = Xml.domToBlock(\n      containerBlockNode,\n      workspace,\n    ) as ContainerBlock;\n\n    if (this.type === 'procedures_defreturn') {\n      containerBlock.setFieldValue(this.hasStatements_, 'STATEMENTS');\n    } else {\n      containerBlock.removeInput('STATEMENT_INPUT');\n    }\n\n    // Initialize procedure's callers with blank IDs.\n    Procedures.mutateCallers(this);\n    return containerBlock;\n  },\n  /**\n   * Reconfigure this block based on the mutator dialog's components.\n   *\n   * @param containerBlock Root block in mutator.\n   */\n  compose: function (this: ProcedureBlock, containerBlock: ContainerBlock) {\n    // Parameter list.\n    this.arguments_ = [];\n    this.paramIds_ = [];\n    this.argumentVarModels_ = [];\n    let paramBlock = containerBlock.getInputTargetBlock('STACK');\n    while (paramBlock && !paramBlock.isInsertionMarker()) {\n      const varName = paramBlock.getFieldValue('NAME');\n      this.arguments_.push(varName);\n      const variable = this.workspace.getVariable(varName, '')!;\n      this.argumentVarModels_.push(variable);\n\n      this.paramIds_.push(paramBlock.id);\n      paramBlock =\n        paramBlock.nextConnection && paramBlock.nextConnection.targetBlock();\n    }\n    this.updateParams_();\n    Procedures.mutateCallers(this);\n\n    // Show/hide the statement input.\n    let hasStatements = containerBlock.getFieldValue('STATEMENTS');\n    if (hasStatements !== null) {\n      hasStatements = hasStatements === 'TRUE';\n      if (this.hasStatements_ !== hasStatements) {\n        if (hasStatements) {\n          this.setStatements_(true);\n          // Restore the stack, if one was saved.\n          this.statementConnection_?.reconnect(this, 'STACK');\n          this.statementConnection_ = null;\n        } else {\n          // Save the stack, then disconnect it.\n          const stackConnection = this.getInput('STACK')!.connection;\n          this.statementConnection_ = stackConnection!.targetConnection;\n          if (this.statementConnection_) {\n            const stackBlock = stackConnection!.targetBlock()!;\n            stackBlock.unplug();\n            stackBlock.bumpNeighbours();\n          }\n          this.setStatements_(false);\n        }\n      }\n    }\n  },\n  /**\n   * Return all variables referenced by this block.\n   *\n   * @returns List of variable names.\n   */\n  getVars: function (this: ProcedureBlock): string[] {\n    return this.arguments_;\n  },\n  /**\n   * Return all variables referenced by this block.\n   *\n   * @returns List of variable models.\n   */\n  getVarModels: function (\n    this: ProcedureBlock,\n  ): IVariableModel<IVariableState>[] {\n    return this.argumentVarModels_;\n  },\n  /**\n   * Notification that a variable is renaming.\n   * If the ID matches one of this block's variables, rename it.\n   *\n   * @param oldId ID of variable to rename.\n   * @param newId ID of new variable.  May be the same as oldId, but\n   *     with an updated name.  Guaranteed to be the same type as the\n   *     old variable.\n   */\n  renameVarById: function (\n    this: ProcedureBlock & BlockSvg,\n    oldId: string,\n    newId: string,\n  ) {\n    const oldVariable = this.workspace.getVariableById(oldId)!;\n    if (oldVariable.getType() !== '') {\n      // Procedure arguments always have the empty type.\n      return;\n    }\n    const oldName = oldVariable.getName();\n    const newVar = this.workspace.getVariableById(newId)!;\n\n    let change = false;\n    for (let i = 0; i < this.argumentVarModels_.length; i++) {\n      if (this.argumentVarModels_[i].getId() === oldId) {\n        this.arguments_[i] = newVar.getName();\n        this.argumentVarModels_[i] = newVar;\n        change = true;\n      }\n    }\n    if (change) {\n      this.displayRenamedVar_(oldName, newVar.getName());\n      Procedures.mutateCallers(this);\n    }\n  },\n  /**\n   * Notification that a variable is renaming but keeping the same ID.  If the\n   * variable is in use on this block, rerender to show the new name.\n   *\n   * @param variable The variable being renamed.\n   */\n  updateVarName: function (\n    this: ProcedureBlock & BlockSvg,\n    variable: IVariableModel<IVariableState>,\n  ) {\n    const newName = variable.getName();\n    let change = false;\n    let oldName;\n    for (let i = 0; i < this.argumentVarModels_.length; i++) {\n      if (this.argumentVarModels_[i].getId() === variable.getId()) {\n        oldName = this.arguments_[i];\n        this.arguments_[i] = newName;\n        change = true;\n      }\n    }\n    if (change) {\n      this.displayRenamedVar_(oldName as string, newName);\n      Procedures.mutateCallers(this);\n    }\n  },\n  /**\n   * Update the display to reflect a newly renamed argument.\n   *\n   * @internal\n   * @param oldName The old display name of the argument.\n   * @param newName The new display name of the argument.\n   */\n  displayRenamedVar_: function (\n    this: ProcedureBlock & BlockSvg,\n    oldName: string,\n    newName: string,\n  ) {\n    this.updateParams_();\n    // Update the mutator's variables if the mutator is open.\n    const mutator = this.getIcon(Mutator.TYPE);\n    if (mutator && mutator.bubbleIsVisible()) {\n      const blocks = mutator.getWorkspace()!.getAllBlocks(false);\n      for (let i = 0, block; (block = blocks[i]); i++) {\n        if (\n          block.type === 'procedures_mutatorarg' &&\n          Names.equals(oldName, block.getFieldValue('NAME'))\n        ) {\n          block.setFieldValue(newName, 'NAME');\n        }\n      }\n    }\n  },\n  /**\n   * Add custom menu options to this block's context menu.\n   *\n   * @param options List of menu options to add to.\n   */\n  customContextMenu: function (\n    this: ProcedureBlock,\n    options: Array<ContextMenuOption | LegacyContextMenuOption>,\n  ) {\n    if (this.isInFlyout) {\n      return;\n    }\n    // Add option to create caller.\n    const name = this.getFieldValue('NAME');\n    const callProcedureBlockState = {\n      type: (this as AnyDuringMigration).callType_,\n      extraState: {name: name, params: this.arguments_},\n    };\n    options.push({\n      enabled: true,\n      text: Msg['PROCEDURES_CREATE_DO'].replace('%1', name),\n      callback: ContextMenu.callbackFactory(this, callProcedureBlockState),\n    });\n\n    // Add options to create getters for each parameter.\n    if (!this.isCollapsed()) {\n      for (let i = 0; i < this.argumentVarModels_.length; i++) {\n        const argVar = this.argumentVarModels_[i];\n        const getVarBlockState = {\n          type: 'variables_get',\n          fields: {\n            VAR: {\n              name: argVar.getName(),\n              id: argVar.getId(),\n              type: argVar.getType(),\n            },\n          },\n        };\n        options.push({\n          enabled: true,\n          text: Msg['VARIABLES_SET_CREATE_GET'].replace('%1', argVar.getName()),\n          callback: ContextMenu.callbackFactory(this, getVarBlockState),\n        });\n      }\n    }\n  },\n};\n\nblocks['procedures_defnoreturn'] = {\n  ...PROCEDURE_DEF_COMMON,\n  /**\n   * Block for defining a procedure with no return value.\n   */\n  init: function (this: ProcedureBlock & BlockSvg) {\n    const initName = Procedures.findLegalName('', this);\n    const nameField = fieldRegistry.fromJson({\n      type: 'field_input',\n      text: initName,\n    }) as FieldTextInput;\n    nameField!.setValidator(Procedures.rename);\n    nameField.setSpellcheck(false);\n    this.appendDummyInput()\n      .appendField(Msg['PROCEDURES_DEFNORETURN_TITLE'])\n      .appendField(nameField, 'NAME')\n      .appendField('', 'PARAMS');\n    this.setMutator(new Mutator(['procedures_mutatorarg'], this));\n    if (\n      (this.workspace.options.comments ||\n        (this.workspace.options.parentWorkspace &&\n          this.workspace.options.parentWorkspace.options.comments)) &&\n      Msg['PROCEDURES_DEFNORETURN_COMMENT']\n    ) {\n      this.setCommentText(Msg['PROCEDURES_DEFNORETURN_COMMENT']);\n    }\n    this.setStyle('procedure_blocks');\n    this.setTooltip(Msg['PROCEDURES_DEFNORETURN_TOOLTIP']);\n    this.setHelpUrl(Msg['PROCEDURES_DEFNORETURN_HELPURL']);\n    this.arguments_ = [];\n    this.argumentVarModels_ = [];\n    this.setStatements_(true);\n    this.statementConnection_ = null;\n  },\n  /**\n   * Return the signature of this procedure definition.\n   *\n   * @returns Tuple containing three elements:\n   *     - the name of the defined procedure,\n   *     - a list of all its arguments,\n   *     - that it DOES NOT have a return value.\n   */\n  getProcedureDef: function (this: ProcedureBlock): [string, string[], false] {\n    return [this.getFieldValue('NAME'), this.arguments_, false];\n  },\n  callType_: 'procedures_callnoreturn',\n};\n\nblocks['procedures_defreturn'] = {\n  ...PROCEDURE_DEF_COMMON,\n  /**\n   * Block for defining a procedure with a return value.\n   */\n  init: function (this: ProcedureBlock & BlockSvg) {\n    const initName = Procedures.findLegalName('', this);\n    const nameField = fieldRegistry.fromJson({\n      type: 'field_input',\n      text: initName,\n    }) as FieldTextInput;\n    nameField.setValidator(Procedures.rename);\n    nameField.setSpellcheck(false);\n    this.appendDummyInput()\n      .appendField(Msg['PROCEDURES_DEFRETURN_TITLE'])\n      .appendField(nameField, 'NAME')\n      .appendField('', 'PARAMS');\n    this.appendValueInput('RETURN')\n      .setAlign(Align.RIGHT)\n      .appendField(Msg['PROCEDURES_DEFRETURN_RETURN']);\n    this.setMutator(new Mutator(['procedures_mutatorarg'], this));\n    if (\n      (this.workspace.options.comments ||\n        (this.workspace.options.parentWorkspace &&\n          this.workspace.options.parentWorkspace.options.comments)) &&\n      Msg['PROCEDURES_DEFRETURN_COMMENT']\n    ) {\n      this.setCommentText(Msg['PROCEDURES_DEFRETURN_COMMENT']);\n    }\n    this.setStyle('procedure_blocks');\n    this.setTooltip(Msg['PROCEDURES_DEFRETURN_TOOLTIP']);\n    this.setHelpUrl(Msg['PROCEDURES_DEFRETURN_HELPURL']);\n    this.arguments_ = [];\n    this.argumentVarModels_ = [];\n    this.setStatements_(true);\n    this.statementConnection_ = null;\n  },\n  /**\n   * Return the signature of this procedure definition.\n   *\n   * @returns Tuple containing three elements:\n   *     - the name of the defined procedure,\n   *     - a list of all its arguments,\n   *     - that it DOES have a return value.\n   */\n  getProcedureDef: function (this: ProcedureBlock): [string, string[], true] {\n    return [this.getFieldValue('NAME'), this.arguments_, true];\n  },\n  callType_: 'procedures_callreturn',\n};\n\n/** Type of a procedures_mutatorcontainer block. */\ntype ContainerBlock = Block & ContainerMixin;\ninterface ContainerMixin extends ContainerMixinType {}\ntype ContainerMixinType = typeof PROCEDURES_MUTATORCONTAINER;\n\nconst PROCEDURES_MUTATORCONTAINER = {\n  /**\n   * Mutator block for procedure container.\n   */\n  init: function (this: ContainerBlock) {\n    this.appendDummyInput().appendField(\n      Msg['PROCEDURES_MUTATORCONTAINER_TITLE'],\n    );\n    this.appendStatementInput('STACK');\n    this.appendDummyInput('STATEMENT_INPUT')\n      .appendField(Msg['PROCEDURES_ALLOW_STATEMENTS'])\n      .appendField(\n        fieldRegistry.fromJson({\n          type: 'field_checkbox',\n          checked: true,\n        }) as FieldCheckbox,\n        'STATEMENTS',\n      );\n    this.setStyle('procedure_blocks');\n    this.setTooltip(Msg['PROCEDURES_MUTATORCONTAINER_TOOLTIP']);\n    this.contextMenu = false;\n  },\n};\nblocks['procedures_mutatorcontainer'] = PROCEDURES_MUTATORCONTAINER;\n\n/** Type of a procedures_mutatorarg block. */\ntype ArgumentBlock = Block & ArgumentMixin;\ninterface ArgumentMixin extends ArgumentMixinType {}\ntype ArgumentMixinType = typeof PROCEDURES_MUTATORARGUMENT;\n\n/**\n * Field responsible for editing procedure argument names.\n */\nclass ProcedureArgumentField extends FieldTextInput {\n  /**\n   * Whether or not this field is currently being edited interactively.\n   */\n  editingInteractively = false;\n\n  /**\n   * The procedure argument variable whose name is being interactively edited.\n   */\n  editingVariable?: IVariableModel<IVariableState>;\n\n  /**\n   * Displays the field editor.\n   *\n   * @param e The event that triggered display of the field editor.\n   */\n  protected override showEditor_(e?: Event) {\n    super.showEditor_(e);\n    this.editingInteractively = true;\n    this.editingVariable = undefined;\n  }\n\n  /**\n   * Handles cleanup when the field editor is dismissed.\n   */\n  override onFinishEditing_(value: string) {\n    super.onFinishEditing_(value);\n    this.editingInteractively = false;\n  }\n}\n\nconst PROCEDURES_MUTATORARGUMENT = {\n  /**\n   * Mutator block for procedure argument.\n   */\n  init: function (this: ArgumentBlock) {\n    const field = new ProcedureArgumentField(\n      Procedures.DEFAULT_ARG,\n      this.validator_,\n    );\n\n    this.appendDummyInput()\n      .appendField(Msg['PROCEDURES_MUTATORARG_TITLE'])\n      .appendField(field, 'NAME');\n    this.setPreviousStatement(true);\n    this.setNextStatement(true);\n    this.setStyle('procedure_blocks');\n    this.setTooltip(Msg['PROCEDURES_MUTATORARG_TOOLTIP']);\n    this.contextMenu = false;\n  },\n\n  /**\n   * Obtain a valid name for the procedure argument. Create a variable if\n   * necessary.\n   * Merge runs of whitespace.  Strip leading and trailing whitespace.\n   * Beyond this, all names are legal.\n   *\n   * @internal\n   * @param varName User-supplied name.\n   * @returns Valid name, or null if a name was not specified.\n   */\n  validator_: function (\n    this: ProcedureArgumentField,\n    varName: string,\n  ): string | null {\n    const sourceBlock = this.getSourceBlock()!;\n    const outerWs = sourceBlock.workspace.getRootWorkspace()!;\n    varName = varName.replace(/[\\s\\xa0]+/g, ' ').replace(/^ | $/g, '');\n    if (!varName) {\n      return null;\n    }\n\n    // Prevents duplicate parameter names in functions\n    const workspace =\n      (sourceBlock.workspace as WorkspaceSvg).targetWorkspace ||\n      sourceBlock.workspace;\n    const blocks = workspace.getAllBlocks(false);\n    const caselessName = varName.toLowerCase();\n    for (let i = 0; i < blocks.length; i++) {\n      if (blocks[i].id === this.getSourceBlock()!.id) {\n        continue;\n      }\n      // Other blocks values may not be set yet when this is loaded.\n      const otherVar = blocks[i].getFieldValue('NAME');\n      if (otherVar && otherVar.toLowerCase() === caselessName) {\n        return null;\n      }\n    }\n\n    // Don't create variables for arg blocks that\n    // only exist in the mutator's flyout.\n    if (sourceBlock.isInFlyout) {\n      return varName;\n    }\n\n    const model = outerWs.getVariable(varName, '');\n    if (model && model.getName() !== varName) {\n      // Rename the variable (case change)\n      outerWs.renameVariableById(model.getId(), varName);\n    }\n    if (!model) {\n      if (this.editingInteractively) {\n        if (!this.editingVariable) {\n          this.editingVariable = outerWs.createVariable(varName, '');\n        } else {\n          outerWs.renameVariableById(this.editingVariable.getId(), varName);\n        }\n      } else {\n        outerWs.createVariable(varName, '');\n      }\n    }\n    return varName;\n  },\n};\nblocks['procedures_mutatorarg'] = PROCEDURES_MUTATORARGUMENT;\n\n/** Type of a block using the PROCEDURE_CALL_COMMON mixin. */\ntype CallBlock = Block & CallMixin;\ninterface CallMixin extends CallMixinType {\n  argumentVarModels_: IVariableModel<IVariableState>[];\n  arguments_: string[];\n  defType_: string;\n  quarkIds_: string[] | null;\n  quarkConnections_: {[id: string]: Connection};\n}\ntype CallMixinType = typeof PROCEDURE_CALL_COMMON;\n\n/** Extra state for serialising call blocks. */\ntype CallExtraState = {\n  name: string;\n  params?: string[];\n};\n\n/**\n * The language-neutral ID for when the reason why a block is disabled is\n * because the block's corresponding procedure definition is disabled.\n */\nconst DISABLED_PROCEDURE_DEFINITION_DISABLED_REASON =\n  'DISABLED_PROCEDURE_DEFINITION';\n\n/**\n * Common properties for the procedure_callnoreturn and\n * procedure_callreturn blocks.\n */\nconst PROCEDURE_CALL_COMMON = {\n  /**\n   * Returns the name of the procedure this block calls.\n   *\n   * @returns Procedure name.\n   */\n  getProcedureCall: function (this: CallBlock): string {\n    // The NAME field is guaranteed to exist, null will never be returned.\n    return this.getFieldValue('NAME');\n  },\n  /**\n   * Notification that a procedure is renaming.\n   * If the name matches this block's procedure, rename it.\n   *\n   * @param oldName Previous name of procedure.\n   * @param newName Renamed procedure.\n   */\n  renameProcedure: function (\n    this: CallBlock,\n    oldName: string,\n    newName: string,\n  ) {\n    if (Names.equals(oldName, this.getProcedureCall())) {\n      this.setFieldValue(newName, 'NAME');\n      const baseMsg = this.outputConnection\n        ? Msg['PROCEDURES_CALLRETURN_TOOLTIP']\n        : Msg['PROCEDURES_CALLNORETURN_TOOLTIP'];\n      this.setTooltip(baseMsg.replace('%1', newName));\n    }\n  },\n  /**\n   * Notification that the procedure's parameters have changed.\n   *\n   * @internal\n   * @param paramNames New param names, e.g. ['x', 'y', 'z'].\n   * @param paramIds IDs of params (consistent for each parameter\n   *     through the life of a mutator, regardless of param renaming),\n   *     e.g. ['piua', 'f8b_', 'oi.o'].\n   */\n  setProcedureParameters_: function (\n    this: CallBlock,\n    paramNames: string[],\n    paramIds: string[],\n  ) {\n    // Data structures:\n    // this.arguments = ['x', 'y']\n    //     Existing param names.\n    // this.quarkConnections_ {piua: null, f8b_: Connection}\n    //     Look-up of paramIds to connections plugged into the call block.\n    // this.quarkIds_ = ['piua', 'f8b_']\n    //     Existing param IDs.\n    // Note that quarkConnections_ may include IDs that no longer exist, but\n    // which might reappear if a param is reattached in the mutator.\n    const defBlock = Procedures.getDefinition(\n      this.getProcedureCall(),\n      this.workspace,\n    );\n    const mutatorIcon = defBlock && defBlock.getIcon(Mutator.TYPE);\n    const mutatorOpen = mutatorIcon && mutatorIcon.bubbleIsVisible();\n    if (!mutatorOpen) {\n      this.quarkConnections_ = {};\n      this.quarkIds_ = null;\n    } else {\n      // fix #6091 - this call could cause an error when outside if-else\n      // expanding block while mutating prevents another error (ancient fix)\n      this.setCollapsed(false);\n    }\n    // Test arguments (arrays of strings) for changes. '\\n' is not a valid\n    // argument name character, so it is a valid delimiter here.\n    if (paramNames.join('\\n') === this.arguments_.join('\\n')) {\n      // No change.\n      this.quarkIds_ = paramIds;\n      return;\n    }\n    if (paramIds.length !== paramNames.length) {\n      throw RangeError('paramNames and paramIds must be the same length.');\n    }\n    if (!this.quarkIds_) {\n      // Initialize tracking for this block.\n      this.quarkConnections_ = {};\n      this.quarkIds_ = [];\n    }\n    // Update the quarkConnections_ with existing connections.\n    for (let i = 0; i < this.arguments_.length; i++) {\n      const input = this.getInput('ARG' + i);\n      if (input) {\n        const connection = input.connection!.targetConnection!;\n        this.quarkConnections_[this.quarkIds_[i]] = connection;\n        if (\n          mutatorOpen &&\n          connection &&\n          !paramIds.includes(this.quarkIds_[i])\n        ) {\n          // This connection should no longer be attached to this block.\n          connection.disconnect();\n          connection.getSourceBlock().bumpNeighbours();\n        }\n      }\n    }\n    // Rebuild the block's arguments.\n    this.arguments_ = ([] as string[]).concat(paramNames);\n    // And rebuild the argument model list.\n    this.argumentVarModels_ = [];\n    for (let i = 0; i < this.arguments_.length; i++) {\n      const variable = Variables.getOrCreateVariablePackage(\n        this.workspace,\n        null,\n        this.arguments_[i],\n        '',\n      );\n      this.argumentVarModels_.push(variable);\n    }\n\n    this.updateShape_();\n    this.quarkIds_ = paramIds;\n    // Reconnect any child blocks.\n    if (this.quarkIds_) {\n      for (let i = 0; i < this.arguments_.length; i++) {\n        const quarkId: string = this.quarkIds_[i]; // TODO(#6920)\n        if (quarkId in this.quarkConnections_) {\n          // TODO(#6920): investigate claimed circular initialisers.\n          const connection: Connection = this.quarkConnections_[quarkId];\n          if (!connection?.reconnect(this, 'ARG' + i)) {\n            // Block no longer exists or has been attached elsewhere.\n            delete this.quarkConnections_[quarkId];\n          }\n        }\n      }\n    }\n  },\n  /**\n   * Modify this block to have the correct number of arguments.\n   *\n   * @internal\n   */\n  updateShape_: function (this: CallBlock) {\n    for (let i = 0; i < this.arguments_.length; i++) {\n      const argField = this.getField('ARGNAME' + i);\n      if (argField) {\n        // Ensure argument name is up to date.\n        // The argument name field is deterministic based on the mutation,\n        // no need to fire a change event.\n        Events.disable();\n        try {\n          argField.setValue(this.arguments_[i]);\n        } finally {\n          Events.enable();\n        }\n      } else {\n        // Add new input.\n        const newField = fieldRegistry.fromJson({\n          type: 'field_label',\n          text: this.arguments_[i],\n        }) as FieldLabel;\n        this.appendValueInput('ARG' + i)\n          .setAlign(Align.RIGHT)\n          .appendField(newField, 'ARGNAME' + i);\n      }\n    }\n    // Remove deleted inputs.\n    for (let i = this.arguments_.length; this.getInput('ARG' + i); i++) {\n      this.removeInput('ARG' + i);\n    }\n    // Add 'with:' if there are parameters, remove otherwise.\n    const topRow = this.getInput('TOPROW');\n    if (topRow) {\n      if (this.arguments_.length) {\n        if (!this.getField('WITH')) {\n          topRow.appendField(Msg['PROCEDURES_CALL_BEFORE_PARAMS'], 'WITH');\n        }\n      } else {\n        if (this.getField('WITH')) {\n          topRow.removeField('WITH');\n        }\n      }\n    }\n  },\n  /**\n   * Create XML to represent the (non-editable) name and arguments.\n   * Backwards compatible serialization implementation.\n   *\n   * @returns XML storage element.\n   */\n  mutationToDom: function (this: CallBlock): Element {\n    const container = xmlUtils.createElement('mutation');\n    container.setAttribute('name', this.getProcedureCall());\n    for (let i = 0; i < this.arguments_.length; i++) {\n      const parameter = xmlUtils.createElement('arg');\n      parameter.setAttribute('name', this.arguments_[i]);\n      container.appendChild(parameter);\n    }\n    return container;\n  },\n  /**\n   * Parse XML to restore the (non-editable) name and parameters.\n   * Backwards compatible serialization implementation.\n   *\n   * @param xmlElement XML storage element.\n   */\n  domToMutation: function (this: CallBlock, xmlElement: Element) {\n    const name = xmlElement.getAttribute('name')!;\n    this.renameProcedure(this.getProcedureCall(), name);\n    const args: string[] = [];\n    const paramIds = [];\n    for (let i = 0, childNode; (childNode = xmlElement.childNodes[i]); i++) {\n      if (childNode.nodeName.toLowerCase() === 'arg') {\n        args.push((childNode as Element).getAttribute('name')!);\n        paramIds.push((childNode as Element).getAttribute('paramId')!);\n      }\n    }\n    this.setProcedureParameters_(args, paramIds);\n  },\n  /**\n   * Returns the state of this block as a JSON serializable object.\n   *\n   * @returns The state of this block, ie the params and procedure name.\n   */\n  saveExtraState: function (this: CallBlock): CallExtraState {\n    const state = Object.create(null);\n    state['name'] = this.getProcedureCall();\n    if (this.arguments_.length) {\n      state['params'] = this.arguments_;\n    }\n    return state;\n  },\n  /**\n   * Applies the given state to this block.\n   *\n   * @param state The state to apply to this block, ie the params and\n   *     procedure name.\n   */\n  loadExtraState: function (this: CallBlock, state: CallExtraState) {\n    this.renameProcedure(this.getProcedureCall(), state['name']);\n    const params = state['params'];\n    if (params) {\n      const ids: string[] = [];\n      ids.length = params.length;\n      ids.fill(null as unknown as string); // TODO(#6920)\n      this.setProcedureParameters_(params, ids);\n    }\n  },\n  /**\n   * Return all variables referenced by this block.\n   *\n   * @returns List of variable names.\n   */\n  getVars: function (this: CallBlock): string[] {\n    return this.arguments_;\n  },\n  /**\n   * Return all variables referenced by this block.\n   *\n   * @returns List of variable models.\n   */\n  getVarModels: function (this: CallBlock): IVariableModel<IVariableState>[] {\n    return this.argumentVarModels_;\n  },\n  /**\n   * Procedure calls cannot exist without the corresponding procedure\n   * definition.  Enforce this link whenever an event is fired.\n   *\n   * @param event Change event.\n   */\n  onchange: function (this: CallBlock, event: AbstractEvent) {\n    if (!this.workspace || this.workspace.isFlyout) {\n      // Block is deleted or is in a flyout.\n      return;\n    }\n    if (!event.recordUndo) {\n      // Events not generated by user. Skip handling.\n      return;\n    }\n    if (\n      event.type === Events.BLOCK_CREATE &&\n      (event as BlockCreate).ids!.includes(this.id)\n    ) {\n      // Look for the case where a procedure call was created (usually through\n      // paste) and there is no matching definition.  In this case, create\n      // an empty definition block with the correct signature.\n      const name = this.getProcedureCall();\n      let def = Procedures.getDefinition(name, this.workspace);\n      if (\n        def &&\n        (def.type !== this.defType_ ||\n          JSON.stringify(def.getVars()) !== JSON.stringify(this.arguments_))\n      ) {\n        // The signatures don't match.\n        def = null;\n      }\n      if (!def) {\n        Events.setGroup(event.group);\n        /**\n         * Create matching definition block.\n         * <xml xmlns=\"https://developers.google.com/blockly/xml\">\n         *   <block type=\"procedures_defreturn\" x=\"10\" y=\"20\">\n         *     <mutation name=\"test\">\n         *       <arg name=\"x\"></arg>\n         *     </mutation>\n         *     <field name=\"NAME\">test</field>\n         *   </block>\n         * </xml>\n         */\n        const xml = xmlUtils.createElement('xml');\n        const block = xmlUtils.createElement('block');\n        block.setAttribute('type', this.defType_);\n        const xy = this.getRelativeToSurfaceXY();\n        const x = xy.x + config.snapRadius * (this.RTL ? -1 : 1);\n        const y = xy.y + config.snapRadius * 2;\n        block.setAttribute('x', `${x}`);\n        block.setAttribute('y', `${y}`);\n        const mutation = this.mutationToDom();\n        block.appendChild(mutation);\n        const field = xmlUtils.createElement('field');\n        field.setAttribute('name', 'NAME');\n        const callName = this.getProcedureCall();\n        const newName = Procedures.findLegalName(callName, this);\n        if (callName !== newName) {\n          this.renameProcedure(callName, newName);\n        }\n        field.appendChild(xmlUtils.createTextNode(callName));\n        block.appendChild(field);\n        xml.appendChild(block);\n        Xml.domToWorkspace(xml, this.workspace);\n        Events.setGroup(false);\n      } else if (!def.isEnabled()) {\n        this.setDisabledReason(\n          true,\n          DISABLED_PROCEDURE_DEFINITION_DISABLED_REASON,\n        );\n        this.setWarningText(\n          Msg['PROCEDURES_CALL_DISABLED_DEF_WARNING'].replace('%1', name),\n        );\n      }\n    } else if (event.type === Events.BLOCK_DELETE) {\n      // Look for the case where a procedure definition has been deleted,\n      // leaving this block (a procedure call) orphaned.  In this case, delete\n      // the orphan.\n      const name = this.getProcedureCall();\n      const def = Procedures.getDefinition(name, this.workspace);\n      if (!def) {\n        Events.setGroup(event.group);\n        this.dispose(true);\n        Events.setGroup(false);\n      }\n    } else if (\n      event.type === Events.BLOCK_CHANGE &&\n      (event as BlockChange).element === 'disabled'\n    ) {\n      const blockChangeEvent = event as BlockChange;\n      const name = this.getProcedureCall();\n      const def = Procedures.getDefinition(name, this.workspace);\n      if (def && def.id === blockChangeEvent.blockId) {\n        // in most cases the old group should be ''\n        const oldGroup = Events.getGroup();\n        if (oldGroup) {\n          // This should only be possible programmatically and may indicate a\n          // problem with event grouping. If you see this message please\n          // investigate. If the use ends up being valid we may need to reorder\n          // events in the undo stack.\n          console.log(\n            'Saw an existing group while responding to a definition change',\n          );\n        }\n        Events.setGroup(event.group);\n        const valid = def.isEnabled();\n        this.setDisabledReason(\n          !valid,\n          DISABLED_PROCEDURE_DEFINITION_DISABLED_REASON,\n        );\n        this.setWarningText(\n          valid\n            ? null\n            : Msg['PROCEDURES_CALL_DISABLED_DEF_WARNING'].replace('%1', name),\n        );\n        Events.setGroup(oldGroup);\n      }\n    }\n  },\n  /**\n   * Add menu option to find the definition block for this call.\n   *\n   * @param options List of menu options to add to.\n   */\n  customContextMenu: function (\n    this: CallBlock,\n    options: Array<ContextMenuOption | LegacyContextMenuOption>,\n  ) {\n    if (!(this.workspace as WorkspaceSvg).isMovable()) {\n      // If we center on the block and the workspace isn't movable we could\n      // loose blocks at the edges of the workspace.\n      return;\n    }\n\n    const name = this.getProcedureCall();\n    const workspace = this.workspace;\n    options.push({\n      enabled: true,\n      text: Msg['PROCEDURES_HIGHLIGHT_DEF'],\n      callback: function () {\n        const def = Procedures.getDefinition(name, workspace);\n        if (def) {\n          (workspace as WorkspaceSvg).centerOnBlock(def.id);\n          getFocusManager().focusNode(def as BlockSvg);\n        }\n      },\n    });\n  },\n};\n\nblocks['procedures_callnoreturn'] = {\n  ...PROCEDURE_CALL_COMMON,\n  /**\n   * Block for calling a procedure with no return value.\n   */\n  init: function (this: CallBlock) {\n    this.appendDummyInput('TOPROW').appendField('', 'NAME');\n    this.setPreviousStatement(true);\n    this.setNextStatement(true);\n    this.setStyle('procedure_blocks');\n    // Tooltip is set in renameProcedure.\n    this.setHelpUrl(Msg['PROCEDURES_CALLNORETURN_HELPURL']);\n    this.arguments_ = [];\n    this.argumentVarModels_ = [];\n    this.quarkConnections_ = {};\n    this.quarkIds_ = null;\n  },\n\n  defType_: 'procedures_defnoreturn',\n};\n\nblocks['procedures_callreturn'] = {\n  ...PROCEDURE_CALL_COMMON,\n  /**\n   * Block for calling a procedure with a return value.\n   */\n  init: function (this: CallBlock) {\n    this.appendDummyInput('TOPROW').appendField('', 'NAME');\n    this.setOutput(true);\n    this.setStyle('procedure_blocks');\n    // Tooltip is set in renameProcedure.\n    this.setHelpUrl(Msg['PROCEDURES_CALLRETURN_HELPURL']);\n    this.arguments_ = [];\n    this.argumentVarModels_ = [];\n    this.quarkConnections_ = {};\n    this.quarkIds_ = null;\n  },\n\n  defType_: 'procedures_defreturn',\n};\n\n/**\n * Type of a procedures_ifreturn block.\n *\n * @internal\n */\nexport type IfReturnBlock = Block & IfReturnMixin;\ninterface IfReturnMixin extends IfReturnMixinType {\n  hasReturnValue_: boolean;\n}\ntype IfReturnMixinType = typeof PROCEDURES_IFRETURN;\n\n/**\n * The language-neutral ID for when the reason why a block is disabled is\n * because the block is only valid inside of a procedure body.\n */\nconst UNPARENTED_IFRETURN_DISABLED_REASON = 'UNPARENTED_IFRETURN';\n\nconst PROCEDURES_IFRETURN = {\n  /**\n   * Block for conditionally returning a value from a procedure.\n   */\n  init: function (this: IfReturnBlock) {\n    this.appendValueInput('CONDITION')\n      .setCheck('Boolean')\n      .appendField(Msg['CONTROLS_IF_MSG_IF']);\n    this.appendValueInput('VALUE').appendField(\n      Msg['PROCEDURES_DEFRETURN_RETURN'],\n    );\n    this.setInputsInline(true);\n    this.setPreviousStatement(true);\n    this.setNextStatement(true);\n    this.setStyle('procedure_blocks');\n    this.setTooltip(Msg['PROCEDURES_IFRETURN_TOOLTIP']);\n    this.setHelpUrl(Msg['PROCEDURES_IFRETURN_HELPURL']);\n    this.hasReturnValue_ = true;\n  },\n  /**\n   * Create XML to represent whether this block has a return value.\n   *\n   * @returns XML storage element.\n   */\n  mutationToDom: function (this: IfReturnBlock): Element {\n    const container = xmlUtils.createElement('mutation');\n    container.setAttribute('value', String(Number(this.hasReturnValue_)));\n    return container;\n  },\n  /**\n   * Parse XML to restore whether this block has a return value.\n   *\n   * @param xmlElement XML storage element.\n   */\n  domToMutation: function (this: IfReturnBlock, xmlElement: Element) {\n    const value = xmlElement.getAttribute('value');\n    this.hasReturnValue_ = value === '1';\n    if (!this.hasReturnValue_) {\n      this.removeInput('VALUE');\n      this.appendDummyInput('VALUE').appendField(\n        Msg['PROCEDURES_DEFRETURN_RETURN'],\n      );\n    }\n  },\n\n  // This block does not need JSO serialization hooks (saveExtraState and\n  // loadExtraState) because the state of this block is already encoded in the\n  // block's position in the workspace.\n  // XML hooks are kept for backwards compatibility.\n\n  /**\n   * Called whenever anything on the workspace changes.\n   * Add warning if this flow block is not nested inside a loop.\n   *\n   * @param e Move event.\n   */\n  onchange: function (this: IfReturnBlock, e: AbstractEvent) {\n    if (\n      ((this.workspace as WorkspaceSvg).isDragging &&\n        (this.workspace as WorkspaceSvg).isDragging()) ||\n      (e.type !== Events.BLOCK_MOVE && e.type !== Events.BLOCK_CREATE)\n    ) {\n      return; // Don't change state at the start of a drag.\n    }\n    let legal = false;\n    // Is the block nested in a procedure?\n    let block = this; // eslint-disable-line @typescript-eslint/no-this-alias\n    do {\n      if (this.FUNCTION_TYPES.includes(block.type)) {\n        legal = true;\n        break;\n      }\n      block = block.getSurroundParent()!;\n    } while (block);\n    if (legal) {\n      // If needed, toggle whether this block has a return value.\n      if (block.type === 'procedures_defnoreturn' && this.hasReturnValue_) {\n        this.removeInput('VALUE');\n        this.appendDummyInput('VALUE').appendField(\n          Msg['PROCEDURES_DEFRETURN_RETURN'],\n        );\n        this.hasReturnValue_ = false;\n      } else if (\n        block.type === 'procedures_defreturn' &&\n        !this.hasReturnValue_\n      ) {\n        this.removeInput('VALUE');\n        this.appendValueInput('VALUE').appendField(\n          Msg['PROCEDURES_DEFRETURN_RETURN'],\n        );\n        this.hasReturnValue_ = true;\n      }\n      this.setWarningText(null);\n    } else {\n      this.setWarningText(Msg['PROCEDURES_IFRETURN_WARNING']);\n    }\n\n    if (!this.isInFlyout) {\n      try {\n        // There is no need to record the enable/disable change on the undo/redo\n        // list since the change will be automatically recreated when replayed.\n        eventUtils.setRecordUndo(false);\n        this.setDisabledReason(!legal, UNPARENTED_IFRETURN_DISABLED_REASON);\n      } finally {\n        eventUtils.setRecordUndo(true);\n      }\n    }\n  },\n  /**\n   * List of block types that are functions and thus do not need warnings.\n   * To add a new function type add this to your code:\n   * Blocks['procedures_ifreturn'].FUNCTION_TYPES.push('custom_func');\n   */\n  FUNCTION_TYPES: ['procedures_defnoreturn', 'procedures_defreturn'],\n};\nblocks['procedures_ifreturn'] = PROCEDURES_IFRETURN;\n\n// Register provided blocks.\ndefineBlocks(blocks);\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// Former goog.module ID: Blockly.libraryBlocks.math\n\nimport type {Block} from '../core/block.js';\nimport {\n  createBlockDefinitionsFromJsonArray,\n  defineBlocks,\n} from '../core/common.js';\nimport * as Extensions from '../core/extensions.js';\nimport '../core/field_dropdown.js';\nimport type {FieldDropdown} from '../core/field_dropdown.js';\nimport '../core/field_label.js';\nimport '../core/field_number.js';\nimport '../core/field_variable.js';\nimport * as xmlUtils from '../core/utils/xml.js';\n\n/**\n * A dictionary of the block definitions provided by this module.\n */\nexport const blocks = createBlockDefinitionsFromJsonArray([\n  // Block for numeric value.\n  {\n    'type': 'math_number',\n    'message0': '%1',\n    'args0': [\n      {\n        'type': 'field_number',\n        'name': 'NUM',\n        'value': 0,\n      },\n    ],\n    'output': 'Number',\n    'helpUrl': '%{BKY_MATH_NUMBER_HELPURL}',\n    'style': 'math_blocks',\n    'tooltip': '%{BKY_MATH_NUMBER_TOOLTIP}',\n    'extensions': ['parent_tooltip_when_inline'],\n  },\n\n  // Block for basic arithmetic operator.\n  {\n    'type': 'math_arithmetic',\n    'message0': '%1 %2 %3',\n    'args0': [\n      {\n        'type': 'input_value',\n        'name': 'A',\n        'check': 'Number',\n      },\n      {\n        'type': 'field_dropdown',\n        'name': 'OP',\n        'options': [\n          ['%{BKY_MATH_ADDITION_SYMBOL}', 'ADD'],\n          ['%{BKY_MATH_SUBTRACTION_SYMBOL}', 'MINUS'],\n          ['%{BKY_MATH_MULTIPLICATION_SYMBOL}', 'MULTIPLY'],\n          ['%{BKY_MATH_DIVISION_SYMBOL}', 'DIVIDE'],\n          ['%{BKY_MATH_POWER_SYMBOL}', 'POWER'],\n        ],\n      },\n      {\n        'type': 'input_value',\n        'name': 'B',\n        'check': 'Number',\n      },\n    ],\n    'inputsInline': true,\n    'output': 'Number',\n    'style': 'math_blocks',\n    'helpUrl': '%{BKY_MATH_ARITHMETIC_HELPURL}',\n    'extensions': ['math_op_tooltip'],\n  },\n\n  // Block for advanced math operators with single operand.\n  {\n    'type': 'math_single',\n    'message0': '%1 %2',\n    'args0': [\n      {\n        'type': 'field_dropdown',\n        'name': 'OP',\n        'options': [\n          ['%{BKY_MATH_SINGLE_OP_ROOT}', 'ROOT'],\n          ['%{BKY_MATH_SINGLE_OP_ABSOLUTE}', 'ABS'],\n          ['-', 'NEG'],\n          ['ln', 'LN'],\n          ['log10', 'LOG10'],\n          ['e^', 'EXP'],\n          ['10^', 'POW10'],\n        ],\n      },\n      {\n        'type': 'input_value',\n        'name': 'NUM',\n        'check': 'Number',\n      },\n    ],\n    'output': 'Number',\n    'style': 'math_blocks',\n    'helpUrl': '%{BKY_MATH_SINGLE_HELPURL}',\n    'extensions': ['math_op_tooltip'],\n  },\n\n  // Block for trigonometry operators.\n  {\n    'type': 'math_trig',\n    'message0': '%1 %2',\n    'args0': [\n      {\n        'type': 'field_dropdown',\n        'name': 'OP',\n        'options': [\n          ['%{BKY_MATH_TRIG_SIN}', 'SIN'],\n          ['%{BKY_MATH_TRIG_COS}', 'COS'],\n          ['%{BKY_MATH_TRIG_TAN}', 'TAN'],\n          ['%{BKY_MATH_TRIG_ASIN}', 'ASIN'],\n          ['%{BKY_MATH_TRIG_ACOS}', 'ACOS'],\n          ['%{BKY_MATH_TRIG_ATAN}', 'ATAN'],\n        ],\n      },\n      {\n        'type': 'input_value',\n        'name': 'NUM',\n        'check': 'Number',\n      },\n    ],\n    'output': 'Number',\n    'style': 'math_blocks',\n    'helpUrl': '%{BKY_MATH_TRIG_HELPURL}',\n    'extensions': ['math_op_tooltip'],\n  },\n\n  // Block for constants: PI, E, the Golden Ratio, sqrt(2), 1/sqrt(2), INFINITY.\n  {\n    'type': 'math_constant',\n    'message0': '%1',\n    'args0': [\n      {\n        'type': 'field_dropdown',\n        'name': 'CONSTANT',\n        'options': [\n          ['\\u03c0', 'PI'],\n          ['e', 'E'],\n          ['\\u03c6', 'GOLDEN_RATIO'],\n          ['sqrt(2)', 'SQRT2'],\n          ['sqrt(\\u00bd)', 'SQRT1_2'],\n          ['\\u221e', 'INFINITY'],\n        ],\n      },\n    ],\n    'output': 'Number',\n    'style': 'math_blocks',\n    'tooltip': '%{BKY_MATH_CONSTANT_TOOLTIP}',\n    'helpUrl': '%{BKY_MATH_CONSTANT_HELPURL}',\n  },\n\n  // Block for checking if a number is even, odd, prime, whole, positive,\n  // negative or if it is divisible by certain number.\n  {\n    'type': 'math_number_property',\n    'message0': '%1 %2',\n    'args0': [\n      {\n        'type': 'input_value',\n        'name': 'NUMBER_TO_CHECK',\n        'check': 'Number',\n      },\n      {\n        'type': 'field_dropdown',\n        'name': 'PROPERTY',\n        'options': [\n          ['%{BKY_MATH_IS_EVEN}', 'EVEN'],\n          ['%{BKY_MATH_IS_ODD}', 'ODD'],\n          ['%{BKY_MATH_IS_PRIME}', 'PRIME'],\n          ['%{BKY_MATH_IS_WHOLE}', 'WHOLE'],\n          ['%{BKY_MATH_IS_POSITIVE}', 'POSITIVE'],\n          ['%{BKY_MATH_IS_NEGATIVE}', 'NEGATIVE'],\n          ['%{BKY_MATH_IS_DIVISIBLE_BY}', 'DIVISIBLE_BY'],\n        ],\n      },\n    ],\n    'inputsInline': true,\n    'output': 'Boolean',\n    'style': 'math_blocks',\n    'tooltip': '%{BKY_MATH_IS_TOOLTIP}',\n    'mutator': 'math_is_divisibleby_mutator',\n  },\n\n  // Block for adding to a variable in place.\n  {\n    'type': 'math_change',\n    'message0': '%{BKY_MATH_CHANGE_TITLE}',\n    'args0': [\n      {\n        'type': 'field_variable',\n        'name': 'VAR',\n        'variable': '%{BKY_MATH_CHANGE_TITLE_ITEM}',\n      },\n      {\n        'type': 'input_value',\n        'name': 'DELTA',\n        'check': 'Number',\n      },\n    ],\n    'previousStatement': null,\n    'nextStatement': null,\n    'style': 'variable_blocks',\n    'helpUrl': '%{BKY_MATH_CHANGE_HELPURL}',\n    'extensions': ['math_change_tooltip'],\n  },\n\n  // Block for rounding functions.\n  {\n    'type': 'math_round',\n    'message0': '%1 %2',\n    'args0': [\n      {\n        'type': 'field_dropdown',\n        'name': 'OP',\n        'options': [\n          ['%{BKY_MATH_ROUND_OPERATOR_ROUND}', 'ROUND'],\n          ['%{BKY_MATH_ROUND_OPERATOR_ROUNDUP}', 'ROUNDUP'],\n          ['%{BKY_MATH_ROUND_OPERATOR_ROUNDDOWN}', 'ROUNDDOWN'],\n        ],\n      },\n      {\n        'type': 'input_value',\n        'name': 'NUM',\n        'check': 'Number',\n      },\n    ],\n    'output': 'Number',\n    'style': 'math_blocks',\n    'helpUrl': '%{BKY_MATH_ROUND_HELPURL}',\n    'tooltip': '%{BKY_MATH_ROUND_TOOLTIP}',\n  },\n\n  // Block for evaluating a list of numbers to return sum, average, min, max,\n  // etc.  Some functions also work on text (min, max, mode, median).\n  {\n    'type': 'math_on_list',\n    'message0': '%1 %2',\n    'args0': [\n      {\n        'type': 'field_dropdown',\n        'name': 'OP',\n        'options': [\n          ['%{BKY_MATH_ONLIST_OPERATOR_SUM}', 'SUM'],\n          ['%{BKY_MATH_ONLIST_OPERATOR_MIN}', 'MIN'],\n          ['%{BKY_MATH_ONLIST_OPERATOR_MAX}', 'MAX'],\n          ['%{BKY_MATH_ONLIST_OPERATOR_AVERAGE}', 'AVERAGE'],\n          ['%{BKY_MATH_ONLIST_OPERATOR_MEDIAN}', 'MEDIAN'],\n          ['%{BKY_MATH_ONLIST_OPERATOR_MODE}', 'MODE'],\n          ['%{BKY_MATH_ONLIST_OPERATOR_STD_DEV}', 'STD_DEV'],\n          ['%{BKY_MATH_ONLIST_OPERATOR_RANDOM}', 'RANDOM'],\n        ],\n      },\n      {\n        'type': 'input_value',\n        'name': 'LIST',\n        'check': 'Array',\n      },\n    ],\n    'output': 'Number',\n    'style': 'math_blocks',\n    'helpUrl': '%{BKY_MATH_ONLIST_HELPURL}',\n    'mutator': 'math_modes_of_list_mutator',\n    'extensions': ['math_op_tooltip'],\n  },\n\n  // Block for remainder of a division.\n  {\n    'type': 'math_modulo',\n    'message0': '%{BKY_MATH_MODULO_TITLE}',\n    'args0': [\n      {\n        'type': 'input_value',\n        'name': 'DIVIDEND',\n        'check': 'Number',\n      },\n      {\n        'type': 'input_value',\n        'name': 'DIVISOR',\n        'check': 'Number',\n      },\n    ],\n    'inputsInline': true,\n    'output': 'Number',\n    'style': 'math_blocks',\n    'tooltip': '%{BKY_MATH_MODULO_TOOLTIP}',\n    'helpUrl': '%{BKY_MATH_MODULO_HELPURL}',\n  },\n\n  // Block for constraining a number between two limits.\n  {\n    'type': 'math_constrain',\n    'message0': '%{BKY_MATH_CONSTRAIN_TITLE}',\n    'args0': [\n      {\n        'type': 'input_value',\n        'name': 'VALUE',\n        'check': 'Number',\n      },\n      {\n        'type': 'input_value',\n        'name': 'LOW',\n        'check': 'Number',\n      },\n      {\n        'type': 'input_value',\n        'name': 'HIGH',\n        'check': 'Number',\n      },\n    ],\n    'inputsInline': true,\n    'output': 'Number',\n    'style': 'math_blocks',\n    'tooltip': '%{BKY_MATH_CONSTRAIN_TOOLTIP}',\n    'helpUrl': '%{BKY_MATH_CONSTRAIN_HELPURL}',\n  },\n\n  // Block for random integer between [X] and [Y].\n  {\n    'type': 'math_random_int',\n    'message0': '%{BKY_MATH_RANDOM_INT_TITLE}',\n    'args0': [\n      {\n        'type': 'input_value',\n        'name': 'FROM',\n        'check': 'Number',\n      },\n      {\n        'type': 'input_value',\n        'name': 'TO',\n        'check': 'Number',\n      },\n    ],\n    'inputsInline': true,\n    'output': 'Number',\n    'style': 'math_blocks',\n    'tooltip': '%{BKY_MATH_RANDOM_INT_TOOLTIP}',\n    'helpUrl': '%{BKY_MATH_RANDOM_INT_HELPURL}',\n  },\n\n  // Block for random integer between [X] and [Y].\n  {\n    'type': 'math_random_float',\n    'message0': '%{BKY_MATH_RANDOM_FLOAT_TITLE_RANDOM}',\n    'output': 'Number',\n    'style': 'math_blocks',\n    'tooltip': '%{BKY_MATH_RANDOM_FLOAT_TOOLTIP}',\n    'helpUrl': '%{BKY_MATH_RANDOM_FLOAT_HELPURL}',\n  },\n\n  // Block for calculating atan2 of [X] and [Y].\n  {\n    'type': 'math_atan2',\n    'message0': '%{BKY_MATH_ATAN2_TITLE}',\n    'args0': [\n      {\n        'type': 'input_value',\n        'name': 'X',\n        'check': 'Number',\n      },\n      {\n        'type': 'input_value',\n        'name': 'Y',\n        'check': 'Number',\n      },\n    ],\n    'inputsInline': true,\n    'output': 'Number',\n    'style': 'math_blocks',\n    'tooltip': '%{BKY_MATH_ATAN2_TOOLTIP}',\n    'helpUrl': '%{BKY_MATH_ATAN2_HELPURL}',\n  },\n]);\n\n/**\n * Mapping of math block OP value to tooltip message for blocks\n * math_arithmetic, math_simple, math_trig, and math_on_lists.\n *\n * @see {Extensions#buildTooltipForDropdown}\n * @package\n * @readonly\n */\nconst TOOLTIPS_BY_OP = {\n  // math_arithmetic\n  'ADD': '%{BKY_MATH_ARITHMETIC_TOOLTIP_ADD}',\n  'MINUS': '%{BKY_MATH_ARITHMETIC_TOOLTIP_MINUS}',\n  'MULTIPLY': '%{BKY_MATH_ARITHMETIC_TOOLTIP_MULTIPLY}',\n  'DIVIDE': '%{BKY_MATH_ARITHMETIC_TOOLTIP_DIVIDE}',\n  'POWER': '%{BKY_MATH_ARITHMETIC_TOOLTIP_POWER}',\n\n  // math_simple\n  'ROOT': '%{BKY_MATH_SINGLE_TOOLTIP_ROOT}',\n  'ABS': '%{BKY_MATH_SINGLE_TOOLTIP_ABS}',\n  'NEG': '%{BKY_MATH_SINGLE_TOOLTIP_NEG}',\n  'LN': '%{BKY_MATH_SINGLE_TOOLTIP_LN}',\n  'LOG10': '%{BKY_MATH_SINGLE_TOOLTIP_LOG10}',\n  'EXP': '%{BKY_MATH_SINGLE_TOOLTIP_EXP}',\n  'POW10': '%{BKY_MATH_SINGLE_TOOLTIP_POW10}',\n\n  // math_trig\n  'SIN': '%{BKY_MATH_TRIG_TOOLTIP_SIN}',\n  'COS': '%{BKY_MATH_TRIG_TOOLTIP_COS}',\n  'TAN': '%{BKY_MATH_TRIG_TOOLTIP_TAN}',\n  'ASIN': '%{BKY_MATH_TRIG_TOOLTIP_ASIN}',\n  'ACOS': '%{BKY_MATH_TRIG_TOOLTIP_ACOS}',\n  'ATAN': '%{BKY_MATH_TRIG_TOOLTIP_ATAN}',\n\n  // math_on_lists\n  'SUM': '%{BKY_MATH_ONLIST_TOOLTIP_SUM}',\n  'MIN': '%{BKY_MATH_ONLIST_TOOLTIP_MIN}',\n  'MAX': '%{BKY_MATH_ONLIST_TOOLTIP_MAX}',\n  'AVERAGE': '%{BKY_MATH_ONLIST_TOOLTIP_AVERAGE}',\n  'MEDIAN': '%{BKY_MATH_ONLIST_TOOLTIP_MEDIAN}',\n  'MODE': '%{BKY_MATH_ONLIST_TOOLTIP_MODE}',\n  'STD_DEV': '%{BKY_MATH_ONLIST_TOOLTIP_STD_DEV}',\n  'RANDOM': '%{BKY_MATH_ONLIST_TOOLTIP_RANDOM}',\n};\n\nExtensions.register(\n  'math_op_tooltip',\n  Extensions.buildTooltipForDropdown('OP', TOOLTIPS_BY_OP),\n);\n\n/** Type of a block that has IS_DIVISBLEBY_MUTATOR_MIXIN */\ntype DivisiblebyBlock = Block & DivisiblebyMixin;\ninterface DivisiblebyMixin extends DivisiblebyMixinType {}\ntype DivisiblebyMixinType = typeof IS_DIVISIBLEBY_MUTATOR_MIXIN;\n\n/**\n * Mixin for mutator functions in the 'math_is_divisibleby_mutator'\n * extension.\n *\n * @mixin\n * @augments Block\n * @package\n */\nconst IS_DIVISIBLEBY_MUTATOR_MIXIN = {\n  /**\n   * Create XML to represent whether the 'divisorInput' should be present.\n   * Backwards compatible serialization implementation.\n   *\n   * @returns XML storage element.\n   */\n  mutationToDom: function (this: DivisiblebyBlock): Element {\n    const container = xmlUtils.createElement('mutation');\n    const divisorInput = this.getFieldValue('PROPERTY') === 'DIVISIBLE_BY';\n    container.setAttribute('divisor_input', String(divisorInput));\n    return container;\n  },\n  /**\n   * Parse XML to restore the 'divisorInput'.\n   * Backwards compatible serialization implementation.\n   *\n   * @param xmlElement XML storage element.\n   */\n  domToMutation: function (this: DivisiblebyBlock, xmlElement: Element) {\n    const divisorInput = xmlElement.getAttribute('divisor_input') === 'true';\n    this.updateShape_(divisorInput);\n  },\n\n  // This block does not need JSO serialization hooks (saveExtraState and\n  // loadExtraState) because the state of this object is already encoded in the\n  // dropdown values.\n  // XML hooks are kept for backwards compatibility.\n\n  /**\n   * Modify this block to have (or not have) an input for 'is divisible by'.\n   *\n   * @param divisorInput True if this block has a divisor input.\n   */\n  updateShape_: function (this: DivisiblebyBlock, divisorInput: boolean) {\n    // Add or remove a Value Input.\n    const inputExists = this.getInput('DIVISOR');\n    if (divisorInput) {\n      if (!inputExists) {\n        this.appendValueInput('DIVISOR').setCheck('Number');\n      }\n    } else if (inputExists) {\n      this.removeInput('DIVISOR');\n    }\n  },\n};\n\n/**\n * 'math_is_divisibleby_mutator' extension to the 'math_property' block that\n * can update the block shape (add/remove divisor input) based on whether\n * property is \"divisible by\".\n */\nconst IS_DIVISIBLE_MUTATOR_EXTENSION = function (this: DivisiblebyBlock) {\n  this.getField('PROPERTY')!.setValidator(\n    /** @param option The selected dropdown option. */\n    function (this: FieldDropdown, option: string) {\n      const divisorInput = option === 'DIVISIBLE_BY';\n      (this.getSourceBlock() as DivisiblebyBlock).updateShape_(divisorInput);\n      return undefined; // FieldValidators can't be void.  Use option as-is.\n    },\n  );\n};\n\nExtensions.registerMutator(\n  'math_is_divisibleby_mutator',\n  IS_DIVISIBLEBY_MUTATOR_MIXIN,\n  IS_DIVISIBLE_MUTATOR_EXTENSION,\n);\n\n// Update the tooltip of 'math_change' block to reference the variable.\nExtensions.register(\n  'math_change_tooltip',\n  Extensions.buildTooltipWithFieldText('%{BKY_MATH_CHANGE_TOOLTIP}', 'VAR'),\n);\n\n/** Type of a block that has LIST_MODES_MUTATOR_MIXIN */\ntype ListModesBlock = Block & ListModesMixin;\ninterface ListModesMixin extends ListModesMixinType {}\ntype ListModesMixinType = typeof LIST_MODES_MUTATOR_MIXIN;\n\n/**\n * Mixin with mutator methods to support alternate output based if the\n * 'math_on_list' block uses the 'MODE' operation.\n */\nconst LIST_MODES_MUTATOR_MIXIN = {\n  /**\n   * Modify this block to have the correct output type.\n   *\n   * @param newOp Either 'MODE' or some op than returns a number.\n   */\n  updateType_: function (this: ListModesBlock, newOp: string) {\n    if (newOp === 'MODE') {\n      this.outputConnection!.setCheck('Array');\n    } else {\n      this.outputConnection!.setCheck('Number');\n    }\n  },\n  /**\n   * Create XML to represent the output type.\n   * Backwards compatible serialization implementation.\n   *\n   * @returns XML storage element.\n   */\n  mutationToDom: function (this: ListModesBlock): Element {\n    const container = xmlUtils.createElement('mutation');\n    container.setAttribute('op', this.getFieldValue('OP'));\n    return container;\n  },\n  /**\n   * Parse XML to restore the output type.\n   * Backwards compatible serialization implementation.\n   *\n   * @param xmlElement XML storage element.\n   */\n  domToMutation: function (this: ListModesBlock, xmlElement: Element) {\n    const op = xmlElement.getAttribute('op');\n    if (op === null) throw new TypeError('xmlElement had no op attribute');\n    this.updateType_(op);\n  },\n\n  // This block does not need JSO serialization hooks (saveExtraState and\n  // loadExtraState) because the state of this object is already encoded in the\n  // dropdown values.\n  // XML hooks are kept for backwards compatibility.\n};\n\n/**\n * Extension to 'math_on_list' blocks that allows support of\n * modes operation (outputs a list of numbers).\n */\nconst LIST_MODES_MUTATOR_EXTENSION = function (this: ListModesBlock) {\n  this.getField('OP')!.setValidator(\n    function (this: ListModesBlock, newOp: string) {\n      this.updateType_(newOp);\n      return undefined;\n    }.bind(this),\n  );\n};\n\nExtensions.registerMutator(\n  'math_modes_of_list_mutator',\n  LIST_MODES_MUTATOR_MIXIN,\n  LIST_MODES_MUTATOR_EXTENSION,\n);\n\n// Register provided blocks.\ndefineBlocks(blocks);\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// Former goog.module ID: Blockly.libraryBlocks.loops\n\nimport type {Block} from '../core/block.js';\nimport {\n  createBlockDefinitionsFromJsonArray,\n  defineBlocks,\n} from '../core/common.js';\nimport * as ContextMenu from '../core/contextmenu.js';\nimport type {\n  ContextMenuOption,\n  LegacyContextMenuOption,\n} from '../core/contextmenu_registry.js';\nimport * as Events from '../core/events/events.js';\nimport type {Abstract as AbstractEvent} from '../core/events/events_abstract.js';\nimport * as eventUtils from '../core/events/utils.js';\nimport * as Extensions from '../core/extensions.js';\nimport '../core/field_dropdown.js';\nimport '../core/field_label.js';\nimport '../core/field_number.js';\nimport '../core/field_variable.js';\nimport {FieldVariable} from '../core/field_variable.js';\nimport '../core/icons/warning_icon.js';\nimport {Msg} from '../core/msg.js';\nimport {WorkspaceSvg} from '../core/workspace_svg.js';\n\n/**\n * A dictionary of the block definitions provided by this module.\n */\nexport const blocks = createBlockDefinitionsFromJsonArray([\n  // Block for repeat n times (external number).\n  {\n    'type': 'controls_repeat_ext',\n    'message0': '%{BKY_CONTROLS_REPEAT_TITLE}',\n    'args0': [\n      {\n        'type': 'input_value',\n        'name': 'TIMES',\n        'check': 'Number',\n      },\n    ],\n    'message1': '%{BKY_CONTROLS_REPEAT_INPUT_DO} %1',\n    'args1': [\n      {\n        'type': 'input_statement',\n        'name': 'DO',\n      },\n    ],\n    'previousStatement': null,\n    'nextStatement': null,\n    'style': 'loop_blocks',\n    'tooltip': '%{BKY_CONTROLS_REPEAT_TOOLTIP}',\n    'helpUrl': '%{BKY_CONTROLS_REPEAT_HELPURL}',\n  },\n  // Block for repeat n times (internal number).\n  // The 'controls_repeat_ext' block is preferred as it is more flexible.\n  {\n    'type': 'controls_repeat',\n    'message0': '%{BKY_CONTROLS_REPEAT_TITLE}',\n    'args0': [\n      {\n        'type': 'field_number',\n        'name': 'TIMES',\n        'value': 10,\n        'min': 0,\n        'precision': 1,\n      },\n    ],\n    'message1': '%{BKY_CONTROLS_REPEAT_INPUT_DO} %1',\n    'args1': [\n      {\n        'type': 'input_statement',\n        'name': 'DO',\n      },\n    ],\n    'previousStatement': null,\n    'nextStatement': null,\n    'style': 'loop_blocks',\n    'tooltip': '%{BKY_CONTROLS_REPEAT_TOOLTIP}',\n    'helpUrl': '%{BKY_CONTROLS_REPEAT_HELPURL}',\n  },\n  // Block for 'do while/until' loop.\n  {\n    'type': 'controls_whileUntil',\n    'message0': '%1 %2',\n    'args0': [\n      {\n        'type': 'field_dropdown',\n        'name': 'MODE',\n        'options': [\n          ['%{BKY_CONTROLS_WHILEUNTIL_OPERATOR_WHILE}', 'WHILE'],\n          ['%{BKY_CONTROLS_WHILEUNTIL_OPERATOR_UNTIL}', 'UNTIL'],\n        ],\n      },\n      {\n        'type': 'input_value',\n        'name': 'BOOL',\n        'check': 'Boolean',\n      },\n    ],\n    'message1': '%{BKY_CONTROLS_REPEAT_INPUT_DO} %1',\n    'args1': [\n      {\n        'type': 'input_statement',\n        'name': 'DO',\n      },\n    ],\n    'previousStatement': null,\n    'nextStatement': null,\n    'style': 'loop_blocks',\n    'helpUrl': '%{BKY_CONTROLS_WHILEUNTIL_HELPURL}',\n    'extensions': ['controls_whileUntil_tooltip'],\n  },\n  // Block for 'for' loop.\n  {\n    'type': 'controls_for',\n    'message0': '%{BKY_CONTROLS_FOR_TITLE}',\n    'args0': [\n      {\n        'type': 'field_variable',\n        'name': 'VAR',\n        'variable': null,\n      },\n      {\n        'type': 'input_value',\n        'name': 'FROM',\n        'check': 'Number',\n        'align': 'RIGHT',\n      },\n      {\n        'type': 'input_value',\n        'name': 'TO',\n        'check': 'Number',\n        'align': 'RIGHT',\n      },\n      {\n        'type': 'input_value',\n        'name': 'BY',\n        'check': 'Number',\n        'align': 'RIGHT',\n      },\n    ],\n    'message1': '%{BKY_CONTROLS_REPEAT_INPUT_DO} %1',\n    'args1': [\n      {\n        'type': 'input_statement',\n        'name': 'DO',\n      },\n    ],\n    'inputsInline': true,\n    'previousStatement': null,\n    'nextStatement': null,\n    'style': 'loop_blocks',\n    'helpUrl': '%{BKY_CONTROLS_FOR_HELPURL}',\n    'extensions': ['contextMenu_newGetVariableBlock', 'controls_for_tooltip'],\n  },\n  // Block for 'for each' loop.\n  {\n    'type': 'controls_forEach',\n    'message0': '%{BKY_CONTROLS_FOREACH_TITLE}',\n    'args0': [\n      {\n        'type': 'field_variable',\n        'name': 'VAR',\n        'variable': null,\n      },\n      {\n        'type': 'input_value',\n        'name': 'LIST',\n        'check': 'Array',\n      },\n    ],\n    'message1': '%{BKY_CONTROLS_REPEAT_INPUT_DO} %1',\n    'args1': [\n      {\n        'type': 'input_statement',\n        'name': 'DO',\n      },\n    ],\n    'previousStatement': null,\n    'nextStatement': null,\n    'style': 'loop_blocks',\n    'helpUrl': '%{BKY_CONTROLS_FOREACH_HELPURL}',\n    'extensions': [\n      'contextMenu_newGetVariableBlock',\n      'controls_forEach_tooltip',\n    ],\n  },\n  // Block for flow statements: continue, break.\n  {\n    'type': 'controls_flow_statements',\n    'message0': '%1',\n    'args0': [\n      {\n        'type': 'field_dropdown',\n        'name': 'FLOW',\n        'options': [\n          ['%{BKY_CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK}', 'BREAK'],\n          ['%{BKY_CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE}', 'CONTINUE'],\n        ],\n      },\n    ],\n    'previousStatement': null,\n    'style': 'loop_blocks',\n    'helpUrl': '%{BKY_CONTROLS_FLOW_STATEMENTS_HELPURL}',\n    'suppressPrefixSuffix': true,\n    'extensions': ['controls_flow_tooltip', 'controls_flow_in_loop_check'],\n  },\n]);\n\n/**\n * Tooltips for the 'controls_whileUntil' block, keyed by MODE value.\n *\n * @see {Extensions#buildTooltipForDropdown}\n */\nconst WHILE_UNTIL_TOOLTIPS = {\n  'WHILE': '%{BKY_CONTROLS_WHILEUNTIL_TOOLTIP_WHILE}',\n  'UNTIL': '%{BKY_CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL}',\n};\n\nExtensions.register(\n  'controls_whileUntil_tooltip',\n  Extensions.buildTooltipForDropdown('MODE', WHILE_UNTIL_TOOLTIPS),\n);\n\n/**\n * Tooltips for the 'controls_flow_statements' block, keyed by FLOW value.\n *\n * @see {Extensions#buildTooltipForDropdown}\n */\nconst BREAK_CONTINUE_TOOLTIPS = {\n  'BREAK': '%{BKY_CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK}',\n  'CONTINUE': '%{BKY_CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE}',\n};\n\nExtensions.register(\n  'controls_flow_tooltip',\n  Extensions.buildTooltipForDropdown('FLOW', BREAK_CONTINUE_TOOLTIPS),\n);\n\n/** Type of a block that has CUSTOM_CONTEXT_MENU_CREATE_VARIABLES_GET_MIXIN */\ntype CustomContextMenuBlock = Block & CustomContextMenuMixin;\ninterface CustomContextMenuMixin extends CustomContextMenuMixinType {}\ntype CustomContextMenuMixinType =\n  typeof CUSTOM_CONTEXT_MENU_CREATE_VARIABLES_GET_MIXIN;\n\n/**\n * Mixin to add a context menu item to create a 'variables_get' block.\n * Used by blocks 'controls_for' and 'controls_forEach'.\n */\nconst CUSTOM_CONTEXT_MENU_CREATE_VARIABLES_GET_MIXIN = {\n  /**\n   * Add context menu option to create getter block for the loop's variable.\n   * (customContextMenu support limited to web BlockSvg.)\n   *\n   * @param options List of menu options to add to.\n   */\n  customContextMenu: function (\n    this: CustomContextMenuBlock,\n    options: Array<ContextMenuOption | LegacyContextMenuOption>,\n  ) {\n    if (this.isInFlyout) {\n      return;\n    }\n    const varField = this.getField('VAR') as FieldVariable;\n    const variable = varField.getVariable()!;\n    const varName = variable.getName();\n    if (!this.isCollapsed() && varName !== null) {\n      const getVarBlockState = {\n        type: 'variables_get',\n        fields: {VAR: varField.saveState(true)},\n      };\n\n      options.push({\n        enabled: true,\n        text: Msg['VARIABLES_SET_CREATE_GET'].replace('%1', varName),\n        callback: ContextMenu.callbackFactory(this, getVarBlockState),\n      });\n    }\n  },\n};\n\nExtensions.registerMixin(\n  'contextMenu_newGetVariableBlock',\n  CUSTOM_CONTEXT_MENU_CREATE_VARIABLES_GET_MIXIN,\n);\n\nExtensions.register(\n  'controls_for_tooltip',\n  Extensions.buildTooltipWithFieldText('%{BKY_CONTROLS_FOR_TOOLTIP}', 'VAR'),\n);\n\nExtensions.register(\n  'controls_forEach_tooltip',\n  Extensions.buildTooltipWithFieldText(\n    '%{BKY_CONTROLS_FOREACH_TOOLTIP}',\n    'VAR',\n  ),\n);\n\n/**\n * List of block types that are loops and thus do not need warnings.\n * To add a new loop type add this to your code:\n *\n * // If using the Blockly npm package and es6 import syntax:\n * import {loops} from 'blockly/blocks';\n * loops.loopTypes.add('custom_loop');\n *\n * // Else if using Closure Compiler and goog.modules:\n * const {loopTypes} = goog.require('Blockly.libraryBlocks.loops');\n * loopTypes.add('custom_loop');\n *\n * // Else if using blockly_compressed + blockss_compressed.js in browser:\n * Blockly.libraryBlocks.loopTypes.add('custom_loop');\n */\nexport const loopTypes: Set<string> = new Set([\n  'controls_repeat',\n  'controls_repeat_ext',\n  'controls_forEach',\n  'controls_for',\n  'controls_whileUntil',\n]);\n\n/**\n * Type of a block that has CONTROL_FLOW_IN_LOOP_CHECK_MIXIN\n *\n * @internal\n */\nexport type ControlFlowInLoopBlock = Block & ControlFlowInLoopMixin;\ninterface ControlFlowInLoopMixin extends ControlFlowInLoopMixinType {}\ntype ControlFlowInLoopMixinType = typeof CONTROL_FLOW_IN_LOOP_CHECK_MIXIN;\n\n/**\n * The language-neutral ID for when the reason why a block is disabled is\n * because the block is only valid inside of a loop.\n */\nconst CONTROL_FLOW_NOT_IN_LOOP_DISABLED_REASON = 'CONTROL_FLOW_NOT_IN_LOOP';\n/**\n * This mixin adds a check to make sure the 'controls_flow_statements' block\n * is contained in a loop. Otherwise a warning is added to the block.\n */\nconst CONTROL_FLOW_IN_LOOP_CHECK_MIXIN = {\n  /**\n   * Is this block enclosed (at any level) by a loop?\n   *\n   * @returns The nearest surrounding loop, or null if none.\n   */\n  getSurroundLoop: function (this: ControlFlowInLoopBlock): Block | null {\n    // eslint-disable-next-line @typescript-eslint/no-this-alias\n    let block: Block | null = this;\n    do {\n      if (loopTypes.has(block.type)) {\n        return block;\n      }\n      block = block.getSurroundParent();\n    } while (block);\n    return null;\n  },\n\n  /**\n   * Called whenever anything on the workspace changes.\n   * Add warning if this flow block is not nested inside a loop.\n   */\n  onchange: function (this: ControlFlowInLoopBlock, e: AbstractEvent) {\n    const ws = this.workspace as WorkspaceSvg;\n    // Don't change state if:\n    //   * It's at the start of a drag.\n    //   * It's not a move event.\n    if (\n      !ws.isDragging ||\n      ws.isDragging() ||\n      (e.type !== Events.BLOCK_MOVE && e.type !== Events.BLOCK_CREATE)\n    ) {\n      return;\n    }\n    const enabled = !!this.getSurroundLoop();\n    this.setWarningText(\n      enabled ? null : Msg['CONTROLS_FLOW_STATEMENTS_WARNING'],\n    );\n\n    if (!this.isInFlyout) {\n      try {\n        // There is no need to record the enable/disable change on the undo/redo\n        // list since the change will be automatically recreated when replayed.\n        eventUtils.setRecordUndo(false);\n        this.setDisabledReason(\n          !enabled,\n          CONTROL_FLOW_NOT_IN_LOOP_DISABLED_REASON,\n        );\n      } finally {\n        eventUtils.setRecordUndo(true);\n      }\n    }\n  },\n};\n\nExtensions.registerMixin(\n  'controls_flow_in_loop_check',\n  CONTROL_FLOW_IN_LOOP_CHECK_MIXIN,\n);\n\n// Register provided blocks.\ndefineBlocks(blocks);\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// Former goog.module ID: Blockly.libraryBlocks.logic\n\nimport type {Block} from '../core/block.js';\nimport type {BlockSvg} from '../core/block_svg.js';\nimport {\n  createBlockDefinitionsFromJsonArray,\n  defineBlocks,\n} from '../core/common.js';\nimport type {Connection} from '../core/connection.js';\nimport * as Events from '../core/events/events.js';\nimport type {Abstract as AbstractEvent} from '../core/events/events_abstract.js';\nimport * as Extensions from '../core/extensions.js';\nimport '../core/field_dropdown.js';\nimport '../core/field_label.js';\nimport '../core/icons/mutator_icon.js';\nimport {Msg} from '../core/msg.js';\nimport * as xmlUtils from '../core/utils/xml.js';\nimport type {Workspace} from '../core/workspace.js';\n\n/**\n * A dictionary of the block definitions provided by this module.\n */\nexport const blocks = createBlockDefinitionsFromJsonArray([\n  // Block for boolean data type: true and false.\n  {\n    'type': 'logic_boolean',\n    'message0': '%1',\n    'args0': [\n      {\n        'type': 'field_dropdown',\n        'name': 'BOOL',\n        'options': [\n          ['%{BKY_LOGIC_BOOLEAN_TRUE}', 'TRUE'],\n          ['%{BKY_LOGIC_BOOLEAN_FALSE}', 'FALSE'],\n        ],\n      },\n    ],\n    'output': 'Boolean',\n    'style': 'logic_blocks',\n    'tooltip': '%{BKY_LOGIC_BOOLEAN_TOOLTIP}',\n    'helpUrl': '%{BKY_LOGIC_BOOLEAN_HELPURL}',\n  },\n  // Block for if/elseif/else condition.\n  {\n    'type': 'controls_if',\n    'message0': '%{BKY_CONTROLS_IF_MSG_IF} %1',\n    'args0': [\n      {\n        'type': 'input_value',\n        'name': 'IF0',\n        'check': 'Boolean',\n      },\n    ],\n    'message1': '%{BKY_CONTROLS_IF_MSG_THEN} %1',\n    'args1': [\n      {\n        'type': 'input_statement',\n        'name': 'DO0',\n      },\n    ],\n    'previousStatement': null,\n    'nextStatement': null,\n    'style': 'logic_blocks',\n    'helpUrl': '%{BKY_CONTROLS_IF_HELPURL}',\n    'suppressPrefixSuffix': true,\n    'mutator': 'controls_if_mutator',\n    'extensions': ['controls_if_tooltip'],\n  },\n  // If/else block that does not use a mutator.\n  {\n    'type': 'controls_ifelse',\n    'message0': '%{BKY_CONTROLS_IF_MSG_IF} %1',\n    'args0': [\n      {\n        'type': 'input_value',\n        'name': 'IF0',\n        'check': 'Boolean',\n      },\n    ],\n    'message1': '%{BKY_CONTROLS_IF_MSG_THEN} %1',\n    'args1': [\n      {\n        'type': 'input_statement',\n        'name': 'DO0',\n      },\n    ],\n    'message2': '%{BKY_CONTROLS_IF_MSG_ELSE} %1',\n    'args2': [\n      {\n        'type': 'input_statement',\n        'name': 'ELSE',\n      },\n    ],\n    'previousStatement': null,\n    'nextStatement': null,\n    'style': 'logic_blocks',\n    'tooltip': '%{BKYCONTROLS_IF_TOOLTIP_2}',\n    'helpUrl': '%{BKY_CONTROLS_IF_HELPURL}',\n    'suppressPrefixSuffix': true,\n    'extensions': ['controls_if_tooltip'],\n  },\n  // Block for comparison operator.\n  {\n    'type': 'logic_compare',\n    'message0': '%1 %2 %3',\n    'args0': [\n      {\n        'type': 'input_value',\n        'name': 'A',\n      },\n      {\n        'type': 'field_dropdown',\n        'name': 'OP',\n        'options': [\n          ['=', 'EQ'],\n          ['\\u2260', 'NEQ'],\n          ['\\u200F<', 'LT'],\n          ['\\u200F\\u2264', 'LTE'],\n          ['\\u200F>', 'GT'],\n          ['\\u200F\\u2265', 'GTE'],\n        ],\n      },\n      {\n        'type': 'input_value',\n        'name': 'B',\n      },\n    ],\n    'inputsInline': true,\n    'output': 'Boolean',\n    'style': 'logic_blocks',\n    'helpUrl': '%{BKY_LOGIC_COMPARE_HELPURL}',\n    'extensions': ['logic_compare', 'logic_op_tooltip'],\n  },\n  // Block for logical operations: 'and', 'or'.\n  {\n    'type': 'logic_operation',\n    'message0': '%1 %2 %3',\n    'args0': [\n      {\n        'type': 'input_value',\n        'name': 'A',\n        'check': 'Boolean',\n      },\n      {\n        'type': 'field_dropdown',\n        'name': 'OP',\n        'options': [\n          ['%{BKY_LOGIC_OPERATION_AND}', 'AND'],\n          ['%{BKY_LOGIC_OPERATION_OR}', 'OR'],\n        ],\n      },\n      {\n        'type': 'input_value',\n        'name': 'B',\n        'check': 'Boolean',\n      },\n    ],\n    'inputsInline': true,\n    'output': 'Boolean',\n    'style': 'logic_blocks',\n    'helpUrl': '%{BKY_LOGIC_OPERATION_HELPURL}',\n    'extensions': ['logic_op_tooltip'],\n  },\n  // Block for negation.\n  {\n    'type': 'logic_negate',\n    'message0': '%{BKY_LOGIC_NEGATE_TITLE}',\n    'args0': [\n      {\n        'type': 'input_value',\n        'name': 'BOOL',\n        'check': 'Boolean',\n      },\n    ],\n    'output': 'Boolean',\n    'style': 'logic_blocks',\n    'tooltip': '%{BKY_LOGIC_NEGATE_TOOLTIP}',\n    'helpUrl': '%{BKY_LOGIC_NEGATE_HELPURL}',\n  },\n  // Block for null data type.\n  {\n    'type': 'logic_null',\n    'message0': '%{BKY_LOGIC_NULL}',\n    'output': null,\n    'style': 'logic_blocks',\n    'tooltip': '%{BKY_LOGIC_NULL_TOOLTIP}',\n    'helpUrl': '%{BKY_LOGIC_NULL_HELPURL}',\n  },\n  // Block for ternary operator.\n  {\n    'type': 'logic_ternary',\n    'message0': '%{BKY_LOGIC_TERNARY_CONDITION} %1',\n    'args0': [\n      {\n        'type': 'input_value',\n        'name': 'IF',\n        'check': 'Boolean',\n      },\n    ],\n    'message1': '%{BKY_LOGIC_TERNARY_IF_TRUE} %1',\n    'args1': [\n      {\n        'type': 'input_value',\n        'name': 'THEN',\n      },\n    ],\n    'message2': '%{BKY_LOGIC_TERNARY_IF_FALSE} %1',\n    'args2': [\n      {\n        'type': 'input_value',\n        'name': 'ELSE',\n      },\n    ],\n    'output': null,\n    'style': 'logic_blocks',\n    'tooltip': '%{BKY_LOGIC_TERNARY_TOOLTIP}',\n    'helpUrl': '%{BKY_LOGIC_TERNARY_HELPURL}',\n    'extensions': ['logic_ternary'],\n  },\n  // Block representing the if statement in the controls_if mutator.\n  {\n    'type': 'controls_if_if',\n    'message0': '%{BKY_CONTROLS_IF_IF_TITLE_IF}',\n    'nextStatement': null,\n    'enableContextMenu': false,\n    'style': 'logic_blocks',\n    'tooltip': '%{BKY_CONTROLS_IF_IF_TOOLTIP}',\n  },\n  // Block representing the else-if statement in the controls_if mutator.\n  {\n    'type': 'controls_if_elseif',\n    'message0': '%{BKY_CONTROLS_IF_ELSEIF_TITLE_ELSEIF}',\n    'previousStatement': null,\n    'nextStatement': null,\n    'enableContextMenu': false,\n    'style': 'logic_blocks',\n    'tooltip': '%{BKY_CONTROLS_IF_ELSEIF_TOOLTIP}',\n  },\n  // Block representing the else statement in the controls_if mutator.\n  {\n    'type': 'controls_if_else',\n    'message0': '%{BKY_CONTROLS_IF_ELSE_TITLE_ELSE}',\n    'previousStatement': null,\n    'enableContextMenu': false,\n    'style': 'logic_blocks',\n    'tooltip': '%{BKY_CONTROLS_IF_ELSE_TOOLTIP}',\n  },\n]);\n\n/**\n * Tooltip text, keyed by block OP value. Used by logic_compare and\n * logic_operation blocks.\n *\n * @see {Extensions#buildTooltipForDropdown}\n */\nconst TOOLTIPS_BY_OP = {\n  // logic_compare\n  'EQ': '%{BKY_LOGIC_COMPARE_TOOLTIP_EQ}',\n  'NEQ': '%{BKY_LOGIC_COMPARE_TOOLTIP_NEQ}',\n  'LT': '%{BKY_LOGIC_COMPARE_TOOLTIP_LT}',\n  'LTE': '%{BKY_LOGIC_COMPARE_TOOLTIP_LTE}',\n  'GT': '%{BKY_LOGIC_COMPARE_TOOLTIP_GT}',\n  'GTE': '%{BKY_LOGIC_COMPARE_TOOLTIP_GTE}',\n\n  // logic_operation\n  'AND': '%{BKY_LOGIC_OPERATION_TOOLTIP_AND}',\n  'OR': '%{BKY_LOGIC_OPERATION_TOOLTIP_OR}',\n};\n\nExtensions.register(\n  'logic_op_tooltip',\n  Extensions.buildTooltipForDropdown('OP', TOOLTIPS_BY_OP),\n);\n\n/** Type of a block that has CONTROLS_IF_MUTATOR_MIXIN */\ntype IfBlock = Block & IfMixin;\ninterface IfMixin extends IfMixinType {}\ntype IfMixinType = typeof CONTROLS_IF_MUTATOR_MIXIN;\n\n// Types for quarks defined in JSON.\n/** Type of a controls_if_if (if mutator container) block. */\ninterface ContainerBlock extends Block {}\n\n/** Type of a controls_if_elseif or controls_if_else block. */\ninterface ClauseBlock extends Block {\n  valueConnection_?: Connection | null;\n  statementConnection_?: Connection | null;\n}\n\n/** Extra state for serialising controls_if blocks. */\ntype IfExtraState = {\n  elseIfCount?: number;\n  hasElse?: boolean;\n};\n\n/**\n * Mutator methods added to controls_if blocks.\n */\nconst CONTROLS_IF_MUTATOR_MIXIN = {\n  elseifCount_: 0,\n  elseCount_: 0,\n\n  /**\n   * Create XML to represent the number of else-if and else inputs.\n   * Backwards compatible serialization implementation.\n   *\n   * @returns XML storage element.\n   */\n  mutationToDom: function (this: IfBlock): Element | null {\n    if (!this.elseifCount_ && !this.elseCount_) {\n      return null;\n    }\n    const container = xmlUtils.createElement('mutation');\n    if (this.elseifCount_) {\n      container.setAttribute('elseif', String(this.elseifCount_));\n    }\n    if (this.elseCount_) {\n      container.setAttribute('else', '1');\n    }\n    return container;\n  },\n  /**\n   * Parse XML to restore the else-if and else inputs.\n   * Backwards compatible serialization implementation.\n   *\n   * @param xmlElement XML storage element.\n   */\n  domToMutation: function (this: IfBlock, xmlElement: Element) {\n    this.elseifCount_ = parseInt(xmlElement.getAttribute('elseif')!, 10) || 0;\n    this.elseCount_ = parseInt(xmlElement.getAttribute('else')!, 10) || 0;\n    this.rebuildShape_();\n  },\n  /**\n   * Returns the state of this block as a JSON serializable object.\n   *\n   * @returns The state of this block, ie the else if count and else state.\n   */\n  saveExtraState: function (this: IfBlock): IfExtraState | null {\n    if (!this.elseifCount_ && !this.elseCount_) {\n      return null;\n    }\n    const state = Object.create(null);\n    if (this.elseifCount_) {\n      state['elseIfCount'] = this.elseifCount_;\n    }\n    if (this.elseCount_) {\n      state['hasElse'] = true;\n    }\n    return state;\n  },\n  /**\n   * Applies the given state to this block.\n   *\n   * @param state The state to apply to this block, ie the else if count\n   and\n   *     else state.\n   */\n  loadExtraState: function (this: IfBlock, state: IfExtraState) {\n    this.elseifCount_ = state['elseIfCount'] || 0;\n    this.elseCount_ = state['hasElse'] ? 1 : 0;\n    this.updateShape_();\n  },\n  /**\n   * Populate the mutator's dialog with this block's components.\n   *\n   * @param workspace MutatorIcon's workspace.\n   * @returns Root block in mutator.\n   */\n  decompose: function (this: IfBlock, workspace: Workspace): ContainerBlock {\n    const containerBlock = workspace.newBlock('controls_if_if');\n    (containerBlock as BlockSvg).initSvg();\n    let connection = containerBlock.nextConnection!;\n    for (let i = 1; i <= this.elseifCount_; i++) {\n      const elseifBlock = workspace.newBlock('controls_if_elseif');\n      (elseifBlock as BlockSvg).initSvg();\n      connection.connect(elseifBlock.previousConnection!);\n      connection = elseifBlock.nextConnection!;\n    }\n    if (this.elseCount_) {\n      const elseBlock = workspace.newBlock('controls_if_else');\n      (elseBlock as BlockSvg).initSvg();\n      connection.connect(elseBlock.previousConnection!);\n    }\n    return containerBlock;\n  },\n  /**\n   * Reconfigure this block based on the mutator dialog's components.\n   *\n   * @param containerBlock Root block in mutator.\n   */\n  compose: function (this: IfBlock, containerBlock: ContainerBlock) {\n    let clauseBlock =\n      containerBlock.nextConnection!.targetBlock() as ClauseBlock | null;\n    // Count number of inputs.\n    this.elseifCount_ = 0;\n    this.elseCount_ = 0;\n    // Connections arrays are passed to .reconnectChildBlocks_() which\n    // takes 1-based arrays, so are initialised with a dummy value at\n    // index 0 for convenience.\n    const valueConnections: Array<Connection | null> = [null];\n    const statementConnections: Array<Connection | null> = [null];\n    let elseStatementConnection: Connection | null = null;\n    while (clauseBlock) {\n      if (clauseBlock.isInsertionMarker()) {\n        clauseBlock = clauseBlock.getNextBlock() as ClauseBlock | null;\n        continue;\n      }\n      switch (clauseBlock.type) {\n        case 'controls_if_elseif':\n          this.elseifCount_++;\n          // TODO(#6920): null valid, undefined not.\n          valueConnections.push(\n            clauseBlock.valueConnection_ as Connection | null,\n          );\n          statementConnections.push(\n            clauseBlock.statementConnection_ as Connection | null,\n          );\n          break;\n        case 'controls_if_else':\n          this.elseCount_++;\n          elseStatementConnection =\n            clauseBlock.statementConnection_ as Connection | null;\n          break;\n        default:\n          throw TypeError('Unknown block type: ' + clauseBlock.type);\n      }\n      clauseBlock = clauseBlock.getNextBlock() as ClauseBlock | null;\n    }\n    this.updateShape_();\n    // Reconnect any child blocks.\n    this.reconnectChildBlocks_(\n      valueConnections,\n      statementConnections,\n      elseStatementConnection,\n    );\n  },\n  /**\n   * Store pointers to any connected child blocks.\n   *\n   * @param containerBlock Root block in mutator.\n   */\n  saveConnections: function (this: IfBlock, containerBlock: ContainerBlock) {\n    let clauseBlock =\n      containerBlock!.nextConnection!.targetBlock() as ClauseBlock | null;\n    let i = 1;\n    while (clauseBlock) {\n      if (clauseBlock.isInsertionMarker()) {\n        clauseBlock = clauseBlock.getNextBlock() as ClauseBlock | null;\n        continue;\n      }\n      switch (clauseBlock.type) {\n        case 'controls_if_elseif': {\n          const inputIf = this.getInput('IF' + i);\n          const inputDo = this.getInput('DO' + i);\n          clauseBlock.valueConnection_ =\n            inputIf && inputIf.connection!.targetConnection;\n          clauseBlock.statementConnection_ =\n            inputDo && inputDo.connection!.targetConnection;\n          i++;\n          break;\n        }\n        case 'controls_if_else': {\n          const inputDo = this.getInput('ELSE');\n          clauseBlock.statementConnection_ =\n            inputDo && inputDo.connection!.targetConnection;\n          break;\n        }\n        default:\n          throw TypeError('Unknown block type: ' + clauseBlock.type);\n      }\n      clauseBlock = clauseBlock.getNextBlock() as ClauseBlock | null;\n    }\n  },\n  /**\n   * Reconstructs the block with all child blocks attached.\n   */\n  rebuildShape_: function (this: IfBlock) {\n    const valueConnections: Array<Connection | null> = [null];\n    const statementConnections: Array<Connection | null> = [null];\n    let elseStatementConnection: Connection | null = null;\n\n    if (this.getInput('ELSE')) {\n      elseStatementConnection =\n        this.getInput('ELSE')!.connection!.targetConnection;\n    }\n    for (let i = 1; this.getInput('IF' + i); i++) {\n      const inputIf = this.getInput('IF' + i);\n      const inputDo = this.getInput('DO' + i);\n      valueConnections.push(inputIf!.connection!.targetConnection);\n      statementConnections.push(inputDo!.connection!.targetConnection);\n    }\n    this.updateShape_();\n    this.reconnectChildBlocks_(\n      valueConnections,\n      statementConnections,\n      elseStatementConnection,\n    );\n  },\n  /**\n   * Modify this block to have the correct number of inputs.\n   *\n   * @internal\n   */\n  updateShape_: function (this: IfBlock) {\n    // Delete everything.\n    if (this.getInput('ELSE')) {\n      this.removeInput('ELSE');\n    }\n    for (let i = 1; this.getInput('IF' + i); i++) {\n      this.removeInput('IF' + i);\n      this.removeInput('DO' + i);\n    }\n    // Rebuild block.\n    for (let i = 1; i <= this.elseifCount_; i++) {\n      this.appendValueInput('IF' + i)\n        .setCheck('Boolean')\n        .appendField(Msg['CONTROLS_IF_MSG_ELSEIF']);\n      this.appendStatementInput('DO' + i).appendField(\n        Msg['CONTROLS_IF_MSG_THEN'],\n      );\n    }\n    if (this.elseCount_) {\n      this.appendStatementInput('ELSE').appendField(\n        Msg['CONTROLS_IF_MSG_ELSE'],\n      );\n    }\n  },\n  /**\n   * Reconnects child blocks.\n   *\n   * @param valueConnections 1-based array of value connections for\n   *     'if' input.  Value at index [0] ignored.\n   * @param statementConnections 1-based array of statement\n   *     connections for 'do' input.  Value at index [0] ignored.\n   * @param elseStatementConnection Statement connection for else input.\n   */\n  reconnectChildBlocks_: function (\n    this: IfBlock,\n    valueConnections: Array<Connection | null>,\n    statementConnections: Array<Connection | null>,\n    elseStatementConnection: Connection | null,\n  ) {\n    for (let i = 1; i <= this.elseifCount_; i++) {\n      valueConnections[i]?.reconnect(this, 'IF' + i);\n      statementConnections[i]?.reconnect(this, 'DO' + i);\n    }\n    elseStatementConnection?.reconnect(this, 'ELSE');\n  },\n};\n\nExtensions.registerMutator(\n  'controls_if_mutator',\n  CONTROLS_IF_MUTATOR_MIXIN,\n  null as unknown as undefined, // TODO(#6920)\n  ['controls_if_elseif', 'controls_if_else'],\n);\n\n/**\n * \"controls_if\" extension function. Adds mutator, shape updating methods,\n * and dynamic tooltip to \"controls_if\" blocks.\n */\nconst CONTROLS_IF_TOOLTIP_EXTENSION = function (this: IfBlock) {\n  this.setTooltip(\n    function (this: IfBlock) {\n      if (!this.elseifCount_ && !this.elseCount_) {\n        return Msg['CONTROLS_IF_TOOLTIP_1'];\n      } else if (!this.elseifCount_ && this.elseCount_) {\n        return Msg['CONTROLS_IF_TOOLTIP_2'];\n      } else if (this.elseifCount_ && !this.elseCount_) {\n        return Msg['CONTROLS_IF_TOOLTIP_3'];\n      } else if (this.elseifCount_ && this.elseCount_) {\n        return Msg['CONTROLS_IF_TOOLTIP_4'];\n      }\n      return '';\n    }.bind(this),\n  );\n};\n\nExtensions.register('controls_if_tooltip', CONTROLS_IF_TOOLTIP_EXTENSION);\n\n/** Type of a block that has LOGIC_COMPARE_ONCHANGE_MIXIN */\ntype CompareBlock = Block & CompareMixin;\ninterface CompareMixin extends CompareMixinType {\n  prevBlocks_?: Array<Block | null>;\n}\ntype CompareMixinType = typeof LOGIC_COMPARE_ONCHANGE_MIXIN;\n\n/**\n * Adds dynamic type validation for the left and right sides of a\n * logic_compare block.\n */\nconst LOGIC_COMPARE_ONCHANGE_MIXIN = {\n  /**\n   * Called whenever anything on the workspace changes.\n   * Prevent mismatched types from being compared.\n   *\n   * @param e Change event.\n   */\n  onchange: function (this: CompareBlock, e: AbstractEvent) {\n    if (!this.prevBlocks_) {\n      this.prevBlocks_ = [null, null];\n    }\n\n    const blockA = this.getInputTargetBlock('A');\n    const blockB = this.getInputTargetBlock('B');\n    // Disconnect blocks that existed prior to this change if they don't\n    // match.\n    if (\n      blockA &&\n      blockB &&\n      !this.workspace.connectionChecker.doTypeChecks(\n        blockA.outputConnection!,\n        blockB.outputConnection!,\n      )\n    ) {\n      // Mismatch between two inputs.  Revert the block connections,\n      // bumping away the newly connected block(s).\n      Events.setGroup(e.group);\n      const prevA = this.prevBlocks_[0];\n      if (prevA !== blockA) {\n        blockA.unplug();\n        if (prevA && !prevA.isDisposed() && !prevA.isShadow()) {\n          // The shadow block is automatically replaced during unplug().\n          this.getInput('A')!.connection!.connect(prevA.outputConnection!);\n        }\n      }\n      const prevB = this.prevBlocks_[1];\n      if (prevB !== blockB) {\n        blockB.unplug();\n        if (prevB && !prevB.isDisposed() && !prevB.isShadow()) {\n          // The shadow block is automatically replaced during unplug().\n          this.getInput('B')!.connection!.connect(prevB.outputConnection!);\n        }\n      }\n      this.bumpNeighbours();\n      Events.setGroup(false);\n    }\n    this.prevBlocks_[0] = this.getInputTargetBlock('A');\n    this.prevBlocks_[1] = this.getInputTargetBlock('B');\n  },\n};\n\n/**\n * \"logic_compare\" extension function. Adds type left and right side type\n * checking to \"logic_compare\" blocks.\n */\nconst LOGIC_COMPARE_EXTENSION = function (this: CompareBlock) {\n  // Add onchange handler to ensure types are compatible.\n  this.mixin(LOGIC_COMPARE_ONCHANGE_MIXIN);\n};\n\nExtensions.register('logic_compare', LOGIC_COMPARE_EXTENSION);\n\n/** Type of a block that has LOGIC_TERNARY_ONCHANGE_MIXIN */\ntype TernaryBlock = Block & TernaryMixin;\ninterface TernaryMixin extends TernaryMixinType {}\ntype TernaryMixinType = typeof LOGIC_TERNARY_ONCHANGE_MIXIN;\n\n/**\n * Adds type coordination between inputs and output.\n */\nconst LOGIC_TERNARY_ONCHANGE_MIXIN = {\n  prevParentConnection_: null as Connection | null,\n\n  /**\n   * Called whenever anything on the workspace changes.\n   * Prevent mismatched types.\n   */\n  onchange: function (this: TernaryBlock, e: AbstractEvent) {\n    const blockA = this.getInputTargetBlock('THEN');\n    const blockB = this.getInputTargetBlock('ELSE');\n    const parentConnection = this.outputConnection!.targetConnection;\n    // Disconnect blocks that existed prior to this change if they don't\n    // match.\n    if ((blockA || blockB) && parentConnection) {\n      for (let i = 0; i < 2; i++) {\n        const block = i === 1 ? blockA : blockB;\n        if (\n          block &&\n          !block.workspace.connectionChecker.doTypeChecks(\n            block.outputConnection!,\n            parentConnection,\n          )\n        ) {\n          // Ensure that any disconnections are grouped with the causing\n          // event.\n          Events.setGroup(e.group);\n          if (parentConnection === this.prevParentConnection_) {\n            this.unplug();\n            parentConnection.getSourceBlock().bumpNeighbours();\n          } else {\n            block.unplug();\n            block.bumpNeighbours();\n          }\n          Events.setGroup(false);\n        }\n      }\n    }\n    this.prevParentConnection_ = parentConnection;\n  },\n};\n\nExtensions.registerMixin('logic_ternary', LOGIC_TERNARY_ONCHANGE_MIXIN);\n\n// Register provided blocks.\ndefineBlocks(blocks);\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// Former goog.module ID: Blockly.libraryBlocks.lists\n\nimport type {Block} from '../core/block.js';\nimport type {BlockSvg} from '../core/block_svg.js';\nimport {\n  createBlockDefinitionsFromJsonArray,\n  defineBlocks,\n} from '../core/common.js';\nimport type {Connection} from '../core/connection.js';\nimport '../core/field_dropdown.js';\nimport type {FieldDropdown} from '../core/field_dropdown.js';\nimport * as fieldRegistry from '../core/field_registry.js';\nimport {MutatorIcon} from '../core/icons/mutator_icon.js';\nimport {Align} from '../core/inputs/align.js';\nimport {ValueInput} from '../core/inputs/value_input.js';\nimport {Msg} from '../core/msg.js';\nimport * as xmlUtils from '../core/utils/xml.js';\nimport type {Workspace} from '../core/workspace.js';\n\n/**\n * A dictionary of the block definitions provided by this module.\n */\nexport const blocks = createBlockDefinitionsFromJsonArray([\n  // Block for creating an empty list\n  // The 'list_create_with' block is preferred as it is more flexible.\n  // <block type=\"lists_create_with\">\n  //   <mutation items=\"0\"></mutation>\n  // </block>\n  {\n    'type': 'lists_create_empty',\n    'message0': '%{BKY_LISTS_CREATE_EMPTY_TITLE}',\n    'output': 'Array',\n    'style': 'list_blocks',\n    'tooltip': '%{BKY_LISTS_CREATE_EMPTY_TOOLTIP}',\n    'helpUrl': '%{BKY_LISTS_CREATE_EMPTY_HELPURL}',\n  },\n  // Block for creating a list with one element repeated.\n  {\n    'type': 'lists_repeat',\n    'message0': '%{BKY_LISTS_REPEAT_TITLE}',\n    'args0': [\n      {\n        'type': 'input_value',\n        'name': 'ITEM',\n      },\n      {\n        'type': 'input_value',\n        'name': 'NUM',\n        'check': 'Number',\n      },\n    ],\n    'output': 'Array',\n    'style': 'list_blocks',\n    'tooltip': '%{BKY_LISTS_REPEAT_TOOLTIP}',\n    'helpUrl': '%{BKY_LISTS_REPEAT_HELPURL}',\n  },\n  // Block for reversing a list.\n  {\n    'type': 'lists_reverse',\n    'message0': '%{BKY_LISTS_REVERSE_MESSAGE0}',\n    'args0': [\n      {\n        'type': 'input_value',\n        'name': 'LIST',\n        'check': 'Array',\n      },\n    ],\n    'output': 'Array',\n    'inputsInline': true,\n    'style': 'list_blocks',\n    'tooltip': '%{BKY_LISTS_REVERSE_TOOLTIP}',\n    'helpUrl': '%{BKY_LISTS_REVERSE_HELPURL}',\n  },\n  // Block for checking if a list is empty\n  {\n    'type': 'lists_isEmpty',\n    'message0': '%{BKY_LISTS_ISEMPTY_TITLE}',\n    'args0': [\n      {\n        'type': 'input_value',\n        'name': 'VALUE',\n        'check': ['String', 'Array'],\n      },\n    ],\n    'output': 'Boolean',\n    'style': 'list_blocks',\n    'tooltip': '%{BKY_LISTS_ISEMPTY_TOOLTIP}',\n    'helpUrl': '%{BKY_LISTS_ISEMPTY_HELPURL}',\n  },\n  // Block for getting the list length\n  {\n    'type': 'lists_length',\n    'message0': '%{BKY_LISTS_LENGTH_TITLE}',\n    'args0': [\n      {\n        'type': 'input_value',\n        'name': 'VALUE',\n        'check': ['String', 'Array'],\n      },\n    ],\n    'output': 'Number',\n    'style': 'list_blocks',\n    'tooltip': '%{BKY_LISTS_LENGTH_TOOLTIP}',\n    'helpUrl': '%{BKY_LISTS_LENGTH_HELPURL}',\n  },\n]);\n\n/**\n * Type of a 'lists_create_with' block.\n *\n * @internal\n */\nexport type CreateWithBlock = Block & ListCreateWithMixin;\ninterface ListCreateWithMixin extends ListCreateWithMixinType {\n  itemCount_: number;\n}\ntype ListCreateWithMixinType = typeof LISTS_CREATE_WITH;\n\nconst LISTS_CREATE_WITH = {\n  /**\n   * Block for creating a list with any number of elements of any type.\n   */\n  init: function (this: CreateWithBlock) {\n    this.setHelpUrl(Msg['LISTS_CREATE_WITH_HELPURL']);\n    this.setStyle('list_blocks');\n    this.itemCount_ = 3;\n    this.updateShape_();\n    this.setOutput(true, 'Array');\n    this.setMutator(\n      new MutatorIcon(['lists_create_with_item'], this as unknown as BlockSvg),\n    ); // BUG(#6905)\n    this.setTooltip(Msg['LISTS_CREATE_WITH_TOOLTIP']);\n  },\n  /**\n   * Create XML to represent list inputs.\n   * Backwards compatible serialization implementation.\n   */\n  mutationToDom: function (this: CreateWithBlock): Element {\n    const container = xmlUtils.createElement('mutation');\n    container.setAttribute('items', String(this.itemCount_));\n    return container;\n  },\n  /**\n   * Parse XML to restore the list inputs.\n   * Backwards compatible serialization implementation.\n   *\n   * @param xmlElement XML storage element.\n   */\n  domToMutation: function (this: CreateWithBlock, xmlElement: Element) {\n    const items = xmlElement.getAttribute('items');\n    if (!items) throw new TypeError('element did not have items');\n    this.itemCount_ = parseInt(items, 10);\n    this.updateShape_();\n  },\n  /**\n   * Returns the state of this block as a JSON serializable object.\n   *\n   * @returns The state of this block, ie the item count.\n   */\n  saveExtraState: function (this: CreateWithBlock): {itemCount: number} {\n    return {\n      'itemCount': this.itemCount_,\n    };\n  },\n  /**\n   * Applies the given state to this block.\n   *\n   * @param state The state to apply to this block, ie the item count.\n   */\n  loadExtraState: function (this: CreateWithBlock, state: AnyDuringMigration) {\n    this.itemCount_ = state['itemCount'];\n    this.updateShape_();\n  },\n  /**\n   * Populate the mutator's dialog with this block's components.\n   *\n   * @param workspace Mutator's workspace.\n   * @returns Root block in mutator.\n   */\n  decompose: function (\n    this: CreateWithBlock,\n    workspace: Workspace,\n  ): ContainerBlock {\n    const containerBlock = workspace.newBlock(\n      'lists_create_with_container',\n    ) as ContainerBlock;\n    (containerBlock as BlockSvg).initSvg();\n    let connection = containerBlock.getInput('STACK')!.connection;\n    for (let i = 0; i < this.itemCount_; i++) {\n      const itemBlock = workspace.newBlock(\n        'lists_create_with_item',\n      ) as ItemBlock;\n      (itemBlock as BlockSvg).initSvg();\n      if (!itemBlock.previousConnection) {\n        throw new Error('itemBlock has no previousConnection');\n      }\n      connection!.connect(itemBlock.previousConnection);\n      connection = itemBlock.nextConnection;\n    }\n    return containerBlock;\n  },\n  /**\n   * Reconfigure this block based on the mutator dialog's components.\n   *\n   * @param containerBlock Root block in mutator.\n   */\n  compose: function (this: CreateWithBlock, containerBlock: Block) {\n    let itemBlock: ItemBlock | null = containerBlock.getInputTargetBlock(\n      'STACK',\n    ) as ItemBlock;\n    // Count number of inputs.\n    const connections: Connection[] = [];\n    while (itemBlock) {\n      if (itemBlock.isInsertionMarker()) {\n        itemBlock = itemBlock.getNextBlock() as ItemBlock | null;\n        continue;\n      }\n      connections.push(itemBlock.valueConnection_ as Connection);\n      itemBlock = itemBlock.getNextBlock() as ItemBlock | null;\n    }\n    // Disconnect any children that don't belong.\n    for (let i = 0; i < this.itemCount_; i++) {\n      const connection = this.getInput('ADD' + i)!.connection!.targetConnection;\n      if (connection && !connections.includes(connection)) {\n        connection.disconnect();\n      }\n    }\n    this.itemCount_ = connections.length;\n    this.updateShape_();\n    // Reconnect any child blocks.\n    for (let i = 0; i < this.itemCount_; i++) {\n      connections[i]?.reconnect(this, 'ADD' + i);\n    }\n  },\n  /**\n   * Store pointers to any connected child blocks.\n   *\n   * @param containerBlock Root block in mutator.\n   */\n  saveConnections: function (this: CreateWithBlock, containerBlock: Block) {\n    let itemBlock: ItemBlock | null = containerBlock.getInputTargetBlock(\n      'STACK',\n    ) as ItemBlock;\n    let i = 0;\n    while (itemBlock) {\n      if (itemBlock.isInsertionMarker()) {\n        itemBlock = itemBlock.getNextBlock() as ItemBlock | null;\n        continue;\n      }\n      const input = this.getInput('ADD' + i);\n      itemBlock.valueConnection_ = input?.connection!\n        .targetConnection as Connection;\n      itemBlock = itemBlock.getNextBlock() as ItemBlock | null;\n      i++;\n    }\n  },\n  /**\n   * Modify this block to have the correct number of inputs.\n   */\n  updateShape_: function (this: CreateWithBlock) {\n    if (this.itemCount_ && this.getInput('EMPTY')) {\n      this.removeInput('EMPTY');\n    } else if (!this.itemCount_ && !this.getInput('EMPTY')) {\n      this.appendDummyInput('EMPTY').appendField(\n        Msg['LISTS_CREATE_EMPTY_TITLE'],\n      );\n    }\n    // Add new inputs.\n    for (let i = 0; i < this.itemCount_; i++) {\n      if (!this.getInput('ADD' + i)) {\n        const input = this.appendValueInput('ADD' + i).setAlign(Align.RIGHT);\n        if (i === 0) {\n          input.appendField(Msg['LISTS_CREATE_WITH_INPUT_WITH']);\n        }\n      }\n    }\n    // Remove deleted inputs.\n    for (let i = this.itemCount_; this.getInput('ADD' + i); i++) {\n      this.removeInput('ADD' + i);\n    }\n  },\n};\nblocks['lists_create_with'] = LISTS_CREATE_WITH;\n\n/** Type for a 'lists_create_with_container' block. */\ntype ContainerBlock = Block & ContainerMutator;\ninterface ContainerMutator extends ContainerMutatorType {}\ntype ContainerMutatorType = typeof LISTS_CREATE_WITH_CONTAINER;\n\nconst LISTS_CREATE_WITH_CONTAINER = {\n  /**\n   * Mutator block for list container.\n   */\n  init: function (this: ContainerBlock) {\n    this.setStyle('list_blocks');\n    this.appendDummyInput().appendField(\n      Msg['LISTS_CREATE_WITH_CONTAINER_TITLE_ADD'],\n    );\n    this.appendStatementInput('STACK');\n    this.setTooltip(Msg['LISTS_CREATE_WITH_CONTAINER_TOOLTIP']);\n    this.contextMenu = false;\n  },\n};\nblocks['lists_create_with_container'] = LISTS_CREATE_WITH_CONTAINER;\n\n/** Type for a 'lists_create_with_item' block. */\ntype ItemBlock = Block & ItemMutator;\ninterface ItemMutator extends ItemMutatorType {\n  valueConnection_?: Connection;\n}\ntype ItemMutatorType = typeof LISTS_CREATE_WITH_ITEM;\n\nconst LISTS_CREATE_WITH_ITEM = {\n  /**\n   * Mutator block for adding items.\n   */\n  init: function (this: ItemBlock) {\n    this.setStyle('list_blocks');\n    this.appendDummyInput().appendField(Msg['LISTS_CREATE_WITH_ITEM_TITLE']);\n    this.setPreviousStatement(true);\n    this.setNextStatement(true);\n    this.setTooltip(Msg['LISTS_CREATE_WITH_ITEM_TOOLTIP']);\n    this.contextMenu = false;\n  },\n};\nblocks['lists_create_with_item'] = LISTS_CREATE_WITH_ITEM;\n\n/** Type for a 'lists_indexOf' block. */\ntype IndexOfBlock = Block & IndexOfMutator;\ninterface IndexOfMutator extends IndexOfMutatorType {}\ntype IndexOfMutatorType = typeof LISTS_INDEXOF;\n\nconst LISTS_INDEXOF = {\n  /**\n   * Block for finding an item in the list.\n   */\n  init: function (this: IndexOfBlock) {\n    const OPERATORS = [\n      [Msg['LISTS_INDEX_OF_FIRST'], 'FIRST'],\n      [Msg['LISTS_INDEX_OF_LAST'], 'LAST'],\n    ];\n    this.setHelpUrl(Msg['LISTS_INDEX_OF_HELPURL']);\n    this.setStyle('list_blocks');\n    this.setOutput(true, 'Number');\n    this.appendValueInput('VALUE')\n      .setCheck('Array')\n      .appendField(Msg['LISTS_INDEX_OF_INPUT_IN_LIST']);\n    const operatorsDropdown = fieldRegistry.fromJson({\n      type: 'field_dropdown',\n      options: OPERATORS,\n    });\n    if (!operatorsDropdown) throw new Error('field_dropdown not found');\n    this.appendValueInput('FIND').appendField(operatorsDropdown, 'END');\n    this.setInputsInline(true);\n    this.setTooltip(() => {\n      return Msg['LISTS_INDEX_OF_TOOLTIP'].replace(\n        '%1',\n        this.workspace.options.oneBasedIndex ? '0' : '-1',\n      );\n    });\n  },\n};\nblocks['lists_indexOf'] = LISTS_INDEXOF;\n\n/** Type for a 'lists_getIndex' block. */\ntype GetIndexBlock = Block & GetIndexMutator;\ninterface GetIndexMutator extends GetIndexMutatorType {\n  WHERE_OPTIONS: Array<[string, string]>;\n}\ntype GetIndexMutatorType = typeof LISTS_GETINDEX;\n\nconst LISTS_GETINDEX = {\n  /**\n   * Block for getting element at index.\n   */\n  init: function (this: GetIndexBlock) {\n    const MODE = [\n      [Msg['LISTS_GET_INDEX_GET'], 'GET'],\n      [Msg['LISTS_GET_INDEX_GET_REMOVE'], 'GET_REMOVE'],\n      [Msg['LISTS_GET_INDEX_REMOVE'], 'REMOVE'],\n    ];\n    this.WHERE_OPTIONS = [\n      [Msg['LISTS_GET_INDEX_FROM_START'], 'FROM_START'],\n      [Msg['LISTS_GET_INDEX_FROM_END'], 'FROM_END'],\n      [Msg['LISTS_GET_INDEX_FIRST'], 'FIRST'],\n      [Msg['LISTS_GET_INDEX_LAST'], 'LAST'],\n      [Msg['LISTS_GET_INDEX_RANDOM'], 'RANDOM'],\n    ];\n    this.setHelpUrl(Msg['LISTS_GET_INDEX_HELPURL']);\n    this.setStyle('list_blocks');\n    const modeMenu = fieldRegistry.fromJson({\n      type: 'field_dropdown',\n      options: MODE,\n    }) as FieldDropdown;\n    modeMenu.setValidator(\n      /** @param value The input value. */\n      function (this: FieldDropdown, value: string) {\n        const isStatement = value === 'REMOVE';\n        (this.getSourceBlock() as GetIndexBlock).updateStatement_(isStatement);\n        return undefined;\n      },\n    );\n    this.appendValueInput('VALUE')\n      .setCheck('Array')\n      .appendField(Msg['LISTS_GET_INDEX_INPUT_IN_LIST']);\n    this.appendDummyInput()\n      .appendField(modeMenu, 'MODE')\n      .appendField('', 'SPACE');\n    const menu = fieldRegistry.fromJson({\n      type: 'field_dropdown',\n      options: this.WHERE_OPTIONS,\n    }) as FieldDropdown;\n    menu.setValidator(\n      /** @param value The input value. */\n      function (this: FieldDropdown, value: string) {\n        const oldValue: string | null = this.getValue();\n        const oldAt = oldValue === 'FROM_START' || oldValue === 'FROM_END';\n        const newAt = value === 'FROM_START' || value === 'FROM_END';\n        if (newAt !== oldAt) {\n          const block = this.getSourceBlock() as GetIndexBlock;\n          block.updateAt_(newAt);\n        }\n        return undefined;\n      },\n    );\n    this.appendDummyInput().appendField(menu, 'WHERE');\n    this.appendDummyInput('AT');\n    if (Msg['LISTS_GET_INDEX_TAIL']) {\n      this.appendDummyInput('TAIL').appendField(Msg['LISTS_GET_INDEX_TAIL']);\n    }\n    this.setInputsInline(true);\n    this.setOutput(true);\n    this.updateAt_(true);\n    this.setTooltip(() => {\n      const mode = this.getFieldValue('MODE');\n      const where = this.getFieldValue('WHERE');\n      let tooltip = '';\n      switch (mode + ' ' + where) {\n        case 'GET FROM_START':\n        case 'GET FROM_END':\n          tooltip = Msg['LISTS_GET_INDEX_TOOLTIP_GET_FROM'];\n          break;\n        case 'GET FIRST':\n          tooltip = Msg['LISTS_GET_INDEX_TOOLTIP_GET_FIRST'];\n          break;\n        case 'GET LAST':\n          tooltip = Msg['LISTS_GET_INDEX_TOOLTIP_GET_LAST'];\n          break;\n        case 'GET RANDOM':\n          tooltip = Msg['LISTS_GET_INDEX_TOOLTIP_GET_RANDOM'];\n          break;\n        case 'GET_REMOVE FROM_START':\n        case 'GET_REMOVE FROM_END':\n          tooltip = Msg['LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM'];\n          break;\n        case 'GET_REMOVE FIRST':\n          tooltip = Msg['LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST'];\n          break;\n        case 'GET_REMOVE LAST':\n          tooltip = Msg['LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST'];\n          break;\n        case 'GET_REMOVE RANDOM':\n          tooltip = Msg['LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM'];\n          break;\n        case 'REMOVE FROM_START':\n        case 'REMOVE FROM_END':\n          tooltip = Msg['LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM'];\n          break;\n        case 'REMOVE FIRST':\n          tooltip = Msg['LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST'];\n          break;\n        case 'REMOVE LAST':\n          tooltip = Msg['LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST'];\n          break;\n        case 'REMOVE RANDOM':\n          tooltip = Msg['LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM'];\n          break;\n      }\n      if (where === 'FROM_START' || where === 'FROM_END') {\n        const msg =\n          where === 'FROM_START'\n            ? Msg['LISTS_INDEX_FROM_START_TOOLTIP']\n            : Msg['LISTS_INDEX_FROM_END_TOOLTIP'];\n        tooltip +=\n          '  ' +\n          msg.replace('%1', this.workspace.options.oneBasedIndex ? '#1' : '#0');\n      }\n      return tooltip;\n    });\n  },\n  /**\n   * Create XML to represent whether the block is a statement or a value.\n   * Also represent whether there is an 'AT' input.\n   *\n   * @returns XML storage element.\n   */\n  mutationToDom: function (this: GetIndexBlock): Element {\n    const container = xmlUtils.createElement('mutation');\n    const isStatement = !this.outputConnection;\n    container.setAttribute('statement', String(isStatement));\n    const isAt = this.getInput('AT') instanceof ValueInput;\n    container.setAttribute('at', String(isAt));\n    return container;\n  },\n  /**\n   * Parse XML to restore the 'AT' input.\n   *\n   * @param xmlElement XML storage element.\n   */\n  domToMutation: function (this: GetIndexBlock, xmlElement: Element) {\n    // Note: Until January 2013 this block did not have mutations,\n    // so 'statement' defaults to false and 'at' defaults to true.\n    const isStatement = xmlElement.getAttribute('statement') === 'true';\n    this.updateStatement_(isStatement);\n    const isAt = xmlElement.getAttribute('at') !== 'false';\n    this.updateAt_(isAt);\n  },\n  /**\n   * Returns the state of this block as a JSON serializable object.\n   * Returns null for efficiency if no state is needed (not a statement)\n   *\n   * @returns The state of this block, ie whether it's a statement.\n   */\n  saveExtraState: function (this: GetIndexBlock): {\n    isStatement: boolean;\n  } | null {\n    if (!this.outputConnection) {\n      return {\n        isStatement: true,\n      };\n    }\n    return null;\n  },\n\n  /**\n   * Applies the given state to this block.\n   *\n   * @param state The state to apply to this block, ie whether it's a\n   *     statement.\n   */\n  loadExtraState: function (this: GetIndexBlock, state: AnyDuringMigration) {\n    if (state['isStatement']) {\n      this.updateStatement_(true);\n    } else if (typeof state === 'string') {\n      // backward compatible for json serialised mutations\n      this.domToMutation(xmlUtils.textToDom(state));\n    }\n  },\n\n  /**\n   * Switch between a value block and a statement block.\n   *\n   * @param newStatement True if the block should be a statement.\n   *     False if the block should be a value.\n   */\n  updateStatement_: function (this: GetIndexBlock, newStatement: boolean) {\n    const oldStatement = !this.outputConnection;\n    if (newStatement !== oldStatement) {\n      // TODO(#6920): The .unplug only has one parameter.\n      (this.unplug as (arg0?: boolean, arg1?: boolean) => void)(true, true);\n      if (newStatement) {\n        this.setOutput(false);\n        this.setPreviousStatement(true);\n        this.setNextStatement(true);\n      } else {\n        this.setPreviousStatement(false);\n        this.setNextStatement(false);\n        this.setOutput(true);\n      }\n    }\n  },\n  /**\n   * Create or delete an input for the numeric index.\n   *\n   * @param isAt True if the input should exist.\n   */\n  updateAt_: function (this: GetIndexBlock, isAt: boolean) {\n    // Destroy old 'AT' and 'ORDINAL' inputs.\n    this.removeInput('AT');\n    this.removeInput('ORDINAL', true);\n    // Create either a value 'AT' input or a dummy input.\n    if (isAt) {\n      this.appendValueInput('AT').setCheck('Number');\n      if (Msg['ORDINAL_NUMBER_SUFFIX']) {\n        this.appendDummyInput('ORDINAL').appendField(\n          Msg['ORDINAL_NUMBER_SUFFIX'],\n        );\n      }\n    } else {\n      this.appendDummyInput('AT');\n    }\n    if (Msg['LISTS_GET_INDEX_TAIL']) {\n      this.moveInputBefore('TAIL', null);\n    }\n  },\n};\nblocks['lists_getIndex'] = LISTS_GETINDEX;\n\n/** Type for a 'lists_setIndex' block. */\ntype SetIndexBlock = Block & SetIndexMutator;\ninterface SetIndexMutator extends SetIndexMutatorType {\n  WHERE_OPTIONS: Array<[string, string]>;\n}\ntype SetIndexMutatorType = typeof LISTS_SETINDEX;\n\nconst LISTS_SETINDEX = {\n  /**\n   * Block for setting the element at index.\n   */\n  init: function (this: SetIndexBlock) {\n    const MODE = [\n      [Msg['LISTS_SET_INDEX_SET'], 'SET'],\n      [Msg['LISTS_SET_INDEX_INSERT'], 'INSERT'],\n    ];\n    this.WHERE_OPTIONS = [\n      [Msg['LISTS_GET_INDEX_FROM_START'], 'FROM_START'],\n      [Msg['LISTS_GET_INDEX_FROM_END'], 'FROM_END'],\n      [Msg['LISTS_GET_INDEX_FIRST'], 'FIRST'],\n      [Msg['LISTS_GET_INDEX_LAST'], 'LAST'],\n      [Msg['LISTS_GET_INDEX_RANDOM'], 'RANDOM'],\n    ];\n    this.setHelpUrl(Msg['LISTS_SET_INDEX_HELPURL']);\n    this.setStyle('list_blocks');\n    this.appendValueInput('LIST')\n      .setCheck('Array')\n      .appendField(Msg['LISTS_SET_INDEX_INPUT_IN_LIST']);\n    const operationDropdown = fieldRegistry.fromJson({\n      type: 'field_dropdown',\n      options: MODE,\n    }) as FieldDropdown;\n    this.appendDummyInput()\n      .appendField(operationDropdown, 'MODE')\n      .appendField('', 'SPACE');\n    const menu = fieldRegistry.fromJson({\n      type: 'field_dropdown',\n      options: this.WHERE_OPTIONS,\n    }) as FieldDropdown;\n    menu.setValidator(\n      /** @param value The input value. */\n      function (this: FieldDropdown, value: string) {\n        const oldValue: string | null = this.getValue();\n        const oldAt = oldValue === 'FROM_START' || oldValue === 'FROM_END';\n        const newAt = value === 'FROM_START' || value === 'FROM_END';\n        if (newAt !== oldAt) {\n          const block = this.getSourceBlock() as SetIndexBlock;\n          block.updateAt_(newAt);\n        }\n        return undefined;\n      },\n    );\n    this.appendDummyInput().appendField(menu, 'WHERE');\n    this.appendDummyInput('AT');\n    this.appendValueInput('TO').appendField(Msg['LISTS_SET_INDEX_INPUT_TO']);\n    this.setInputsInline(true);\n    this.setPreviousStatement(true);\n    this.setNextStatement(true);\n    this.setTooltip(Msg['LISTS_SET_INDEX_TOOLTIP']);\n    this.updateAt_(true);\n    this.setTooltip(() => {\n      const mode = this.getFieldValue('MODE');\n      const where = this.getFieldValue('WHERE');\n      let tooltip = '';\n      switch (mode + ' ' + where) {\n        case 'SET FROM_START':\n        case 'SET FROM_END':\n          tooltip = Msg['LISTS_SET_INDEX_TOOLTIP_SET_FROM'];\n          break;\n        case 'SET FIRST':\n          tooltip = Msg['LISTS_SET_INDEX_TOOLTIP_SET_FIRST'];\n          break;\n        case 'SET LAST':\n          tooltip = Msg['LISTS_SET_INDEX_TOOLTIP_SET_LAST'];\n          break;\n        case 'SET RANDOM':\n          tooltip = Msg['LISTS_SET_INDEX_TOOLTIP_SET_RANDOM'];\n          break;\n        case 'INSERT FROM_START':\n        case 'INSERT FROM_END':\n          tooltip = Msg['LISTS_SET_INDEX_TOOLTIP_INSERT_FROM'];\n          break;\n        case 'INSERT FIRST':\n          tooltip = Msg['LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST'];\n          break;\n        case 'INSERT LAST':\n          tooltip = Msg['LISTS_SET_INDEX_TOOLTIP_INSERT_LAST'];\n          break;\n        case 'INSERT RANDOM':\n          tooltip = Msg['LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM'];\n          break;\n      }\n      if (where === 'FROM_START' || where === 'FROM_END') {\n        tooltip +=\n          '  ' +\n          Msg['LISTS_INDEX_FROM_START_TOOLTIP'].replace(\n            '%1',\n            this.workspace.options.oneBasedIndex ? '#1' : '#0',\n          );\n      }\n      return tooltip;\n    });\n  },\n  /**\n   * Create XML to represent whether there is an 'AT' input.\n   *\n   * @returns XML storage element.\n   */\n  mutationToDom: function (this: SetIndexBlock): Element {\n    const container = xmlUtils.createElement('mutation');\n    const isAt = this.getInput('AT') instanceof ValueInput;\n    container.setAttribute('at', String(isAt));\n    return container;\n  },\n  /**\n   * Parse XML to restore the 'AT' input.\n   *\n   * @param xmlElement XML storage element.\n   */\n  domToMutation: function (this: SetIndexBlock, xmlElement: Element) {\n    // Note: Until January 2013 this block did not have mutations,\n    // so 'at' defaults to true.\n    const isAt = xmlElement.getAttribute('at') !== 'false';\n    this.updateAt_(isAt);\n  },\n\n  /**\n   * Returns the state of this block as a JSON serializable object.\n   * This block does not need to serialize any specific state as it is already\n   * encoded in the dropdown values, but must have an implementation to avoid\n   * the backward compatible XML mutations being serialized.\n   *\n   * @returns The state of this block.\n   */\n  saveExtraState: function (this: SetIndexBlock): null {\n    return null;\n  },\n\n  /**\n   * Applies the given state to this block.\n   * No extra state is needed or expected as it is already encoded in the\n   * dropdown values.\n   */\n  loadExtraState: function (this: SetIndexBlock) {},\n\n  /**\n   * Create or delete an input for the numeric index.\n   *\n   * @param isAt True if the input should exist.\n   */\n  updateAt_: function (this: SetIndexBlock, isAt: boolean) {\n    // Destroy old 'AT' and 'ORDINAL' input.\n    this.removeInput('AT');\n    this.removeInput('ORDINAL', true);\n    // Create either a value 'AT' input or a dummy input.\n    if (isAt) {\n      this.appendValueInput('AT').setCheck('Number');\n      if (Msg['ORDINAL_NUMBER_SUFFIX']) {\n        this.appendDummyInput('ORDINAL').appendField(\n          Msg['ORDINAL_NUMBER_SUFFIX'],\n        );\n      }\n    } else {\n      this.appendDummyInput('AT');\n    }\n    this.moveInputBefore('AT', 'TO');\n    if (this.getInput('ORDINAL')) {\n      this.moveInputBefore('ORDINAL', 'TO');\n    }\n  },\n};\nblocks['lists_setIndex'] = LISTS_SETINDEX;\n\n/** Type for a 'lists_getSublist' block. */\ntype GetSublistBlock = Block & GetSublistMutator;\ninterface GetSublistMutator extends GetSublistMutatorType {\n  WHERE_OPTIONS_1: Array<[string, string]>;\n  WHERE_OPTIONS_2: Array<[string, string]>;\n}\ntype GetSublistMutatorType = typeof LISTS_GETSUBLIST;\n\nconst LISTS_GETSUBLIST = {\n  /**\n   * Block for getting sublist.\n   */\n  init: function (this: GetSublistBlock) {\n    this['WHERE_OPTIONS_1'] = [\n      [Msg['LISTS_GET_SUBLIST_START_FROM_START'], 'FROM_START'],\n      [Msg['LISTS_GET_SUBLIST_START_FROM_END'], 'FROM_END'],\n      [Msg['LISTS_GET_SUBLIST_START_FIRST'], 'FIRST'],\n    ];\n    this['WHERE_OPTIONS_2'] = [\n      [Msg['LISTS_GET_SUBLIST_END_FROM_START'], 'FROM_START'],\n      [Msg['LISTS_GET_SUBLIST_END_FROM_END'], 'FROM_END'],\n      [Msg['LISTS_GET_SUBLIST_END_LAST'], 'LAST'],\n    ];\n    this.setHelpUrl(Msg['LISTS_GET_SUBLIST_HELPURL']);\n    this.setStyle('list_blocks');\n    this.appendValueInput('LIST')\n      .setCheck('Array')\n      .appendField(Msg['LISTS_GET_SUBLIST_INPUT_IN_LIST']);\n    const createMenu = (n: 1 | 2): FieldDropdown => {\n      const menu = fieldRegistry.fromJson({\n        type: 'field_dropdown',\n        options:\n          this[('WHERE_OPTIONS_' + n) as 'WHERE_OPTIONS_1' | 'WHERE_OPTIONS_2'],\n      }) as FieldDropdown;\n      menu.setValidator(\n        /** @param value The input value. */\n        function (this: FieldDropdown, value: string) {\n          const oldValue: string | null = this.getValue();\n          const oldAt = oldValue === 'FROM_START' || oldValue === 'FROM_END';\n          const newAt = value === 'FROM_START' || value === 'FROM_END';\n          if (newAt !== oldAt) {\n            const block = this.getSourceBlock() as GetSublistBlock;\n            block.updateAt_(n, newAt);\n          }\n          return undefined;\n        },\n      );\n      return menu;\n    };\n    this.appendDummyInput('WHERE1_INPUT').appendField(createMenu(1), 'WHERE1');\n    this.appendDummyInput('AT1');\n    this.appendDummyInput('WHERE2_INPUT').appendField(createMenu(2), 'WHERE2');\n    this.appendDummyInput('AT2');\n    if (Msg['LISTS_GET_SUBLIST_TAIL']) {\n      this.appendDummyInput('TAIL').appendField(Msg['LISTS_GET_SUBLIST_TAIL']);\n    }\n    this.setInputsInline(true);\n    this.setOutput(true, 'Array');\n    this.updateAt_(1, true);\n    this.updateAt_(2, true);\n    this.setTooltip(Msg['LISTS_GET_SUBLIST_TOOLTIP']);\n  },\n  /**\n   * Create XML to represent whether there are 'AT' inputs.\n   *\n   * @returns XML storage element.\n   */\n  mutationToDom: function (this: GetSublistBlock): Element {\n    const container = xmlUtils.createElement('mutation');\n    const isAt1 = this.getInput('AT1') instanceof ValueInput;\n    container.setAttribute('at1', String(isAt1));\n    const isAt2 = this.getInput('AT2') instanceof ValueInput;\n    container.setAttribute('at2', String(isAt2));\n    return container;\n  },\n  /**\n   * Parse XML to restore the 'AT' inputs.\n   *\n   * @param xmlElement XML storage element.\n   */\n  domToMutation: function (this: GetSublistBlock, xmlElement: Element) {\n    const isAt1 = xmlElement.getAttribute('at1') === 'true';\n    const isAt2 = xmlElement.getAttribute('at2') === 'true';\n    this.updateAt_(1, isAt1);\n    this.updateAt_(2, isAt2);\n  },\n\n  /**\n   * Returns the state of this block as a JSON serializable object.\n   * This block does not need to serialize any specific state as it is already\n   * encoded in the dropdown values, but must have an implementation to avoid\n   * the backward compatible XML mutations being serialized.\n   *\n   * @returns The state of this block.\n   */\n  saveExtraState: function (this: GetSublistBlock): null {\n    return null;\n  },\n\n  /**\n   * Applies the given state to this block.\n   * No extra state is needed or expected as it is already encoded in the\n   * dropdown values.\n   */\n  loadExtraState: function (this: GetSublistBlock) {},\n\n  /**\n   * Create or delete an input for a numeric index.\n   * This block has two such inputs, independent of each other.\n   *\n   * @param n Specify first or second input (1 or 2).\n   * @param isAt True if the input should exist.\n   */\n  updateAt_: function (this: GetSublistBlock, n: 1 | 2, isAt: boolean) {\n    // Create or delete an input for the numeric index.\n    // Destroy old 'AT' and 'ORDINAL' inputs.\n    this.removeInput('AT' + n);\n    this.removeInput('ORDINAL' + n, true);\n    // Create either a value 'AT' input or a dummy input.\n    if (isAt) {\n      this.appendValueInput('AT' + n).setCheck('Number');\n      if (Msg['ORDINAL_NUMBER_SUFFIX']) {\n        this.appendDummyInput('ORDINAL' + n).appendField(\n          Msg['ORDINAL_NUMBER_SUFFIX'],\n        );\n      }\n    } else {\n      this.appendDummyInput('AT' + n);\n    }\n    if (n === 1) {\n      this.moveInputBefore('AT1', 'WHERE2_INPUT');\n      if (this.getInput('ORDINAL1')) {\n        this.moveInputBefore('ORDINAL1', 'WHERE2_INPUT');\n      }\n    }\n    if (Msg['LISTS_GET_SUBLIST_TAIL']) {\n      this.moveInputBefore('TAIL', null);\n    }\n  },\n};\nblocks['lists_getSublist'] = LISTS_GETSUBLIST;\n\ntype SortBlock = Block | (typeof blocks)['lists_sort'];\n\nblocks['lists_sort'] = {\n  /**\n   * Block for sorting a list.\n   */\n  init: function (this: SortBlock) {\n    this.jsonInit({\n      'message0': '%{BKY_LISTS_SORT_TITLE}',\n      'args0': [\n        {\n          'type': 'field_dropdown',\n          'name': 'TYPE',\n          'options': [\n            ['%{BKY_LISTS_SORT_TYPE_NUMERIC}', 'NUMERIC'],\n            ['%{BKY_LISTS_SORT_TYPE_TEXT}', 'TEXT'],\n            ['%{BKY_LISTS_SORT_TYPE_IGNORECASE}', 'IGNORE_CASE'],\n          ],\n        },\n        {\n          'type': 'field_dropdown',\n          'name': 'DIRECTION',\n          'options': [\n            ['%{BKY_LISTS_SORT_ORDER_ASCENDING}', '1'],\n            ['%{BKY_LISTS_SORT_ORDER_DESCENDING}', '-1'],\n          ],\n        },\n        {\n          'type': 'input_value',\n          'name': 'LIST',\n          'check': 'Array',\n        },\n      ],\n      'output': 'Array',\n      'style': 'list_blocks',\n      'tooltip': '%{BKY_LISTS_SORT_TOOLTIP}',\n      'helpUrl': '%{BKY_LISTS_SORT_HELPURL}',\n    });\n  },\n};\n\ntype SplitBlock = Block | (typeof blocks)['lists_split'];\n\nblocks['lists_split'] = {\n  /**\n   * Block for splitting text into a list, or joining a list into text.\n   */\n  init: function (this: SplitBlock) {\n    const dropdown = fieldRegistry.fromJson({\n      type: 'field_dropdown',\n      options: [\n        [Msg['LISTS_SPLIT_LIST_FROM_TEXT'], 'SPLIT'],\n        [Msg['LISTS_SPLIT_TEXT_FROM_LIST'], 'JOIN'],\n      ],\n    });\n    if (!dropdown) throw new Error('field_dropdown not found');\n    dropdown.setValidator((newMode) => {\n      this.updateType_(newMode);\n    });\n    this.setHelpUrl(Msg['LISTS_SPLIT_HELPURL']);\n    this.setStyle('list_blocks');\n    this.appendValueInput('INPUT')\n      .setCheck('String')\n      .appendField(dropdown, 'MODE');\n    this.appendValueInput('DELIM')\n      .setCheck('String')\n      .appendField(Msg['LISTS_SPLIT_WITH_DELIMITER']);\n    this.setInputsInline(true);\n    this.setOutput(true, 'Array');\n    this.setTooltip(() => {\n      const mode = this.getFieldValue('MODE');\n      if (mode === 'SPLIT') {\n        return Msg['LISTS_SPLIT_TOOLTIP_SPLIT'];\n      } else if (mode === 'JOIN') {\n        return Msg['LISTS_SPLIT_TOOLTIP_JOIN'];\n      }\n      throw Error('Unknown mode: ' + mode);\n    });\n  },\n  /**\n   * Modify this block to have the correct input and output types.\n   *\n   * @param newMode Either 'SPLIT' or 'JOIN'.\n   */\n  updateType_: function (this: SplitBlock, newMode: string) {\n    const mode = this.getFieldValue('MODE');\n    if (mode !== newMode) {\n      const inputConnection = this.getInput('INPUT')!.connection;\n      inputConnection!.setShadowDom(null);\n      const inputBlock = inputConnection!.targetBlock();\n      // TODO(#6920): This is probably not needed; see details in bug.\n      if (inputBlock) {\n        inputConnection!.disconnect();\n        if (inputBlock.isShadow()) {\n          inputBlock.dispose(false);\n        } else {\n          this.bumpNeighbours();\n        }\n      }\n    }\n    if (newMode === 'SPLIT') {\n      this.outputConnection!.setCheck('Array');\n      this.getInput('INPUT')!.setCheck('String');\n    } else {\n      this.outputConnection!.setCheck('String');\n      this.getInput('INPUT')!.setCheck('Array');\n    }\n  },\n  /**\n   * Create XML to represent the input and output types.\n   *\n   * @returns XML storage element.\n   */\n  mutationToDom: function (this: SplitBlock): Element {\n    const container = xmlUtils.createElement('mutation');\n    container.setAttribute('mode', this.getFieldValue('MODE'));\n    return container;\n  },\n  /**\n   * Parse XML to restore the input and output types.\n   *\n   * @param xmlElement XML storage element.\n   */\n  domToMutation: function (this: SplitBlock, xmlElement: Element) {\n    this.updateType_(xmlElement.getAttribute('mode'));\n  },\n\n  /**\n   * Returns the state of this block as a JSON serializable object.\n   *\n   * @returns The state of this block.\n   */\n  saveExtraState: function (this: SplitBlock): {mode: string} {\n    return {'mode': this.getFieldValue('MODE')};\n  },\n\n  /**\n   * Applies the given state to this block.\n   */\n  loadExtraState: function (this: SplitBlock, state: {mode: string}) {\n    this.updateType_(state['mode']);\n  },\n};\n\n// Register provided blocks.\ndefineBlocks(blocks);\n","/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// Former goog.module ID: Blockly.libraryBlocks\n\nimport type {BlockDefinition} from '../core/blocks.js';\nimport * as lists from './lists.js';\nimport * as logic from './logic.js';\nimport * as loops from './loops.js';\nimport * as math from './math.js';\nimport * as procedures from './procedures.js';\nimport * as texts from './text.js';\nimport * as variables from './variables.js';\nimport * as variablesDynamic from './variables_dynamic.js';\n\nexport {\n  lists,\n  logic,\n  loops,\n  math,\n  procedures,\n  texts,\n  variables,\n  variablesDynamic,\n};\n\n/**\n * A dictionary of the block definitions provided by all the\n * Blockly.libraryBlocks.* modules.\n */\nexport const blocks: {[key: string]: BlockDefinition} = Object.assign(\n  {},\n  lists.blocks,\n  logic.blocks,\n  loops.blocks,\n  math.blocks,\n  procedures.blocks,\n  texts.blocks,\n  variables.blocks,\n  variablesDynamic.blocks,\n);\n"]}