<commit_before>new Demo("Scene Graph", (group) => {
    const simulationGroup = new Scene.Group(group)
    simulationGroup.Move(ResolutionX / 2, ResolutionY / 2)

    const groupSize = 48

    const destinationGroup = new Scene.Group(simulationGroup)

    const destinationTopLeft = new Scene.Sprite(destinationGroup)
    destinationTopLeft.Loop(Content.Markers.AlternativeBounds.TopLeft)
    destinationTopLeft.Move(-groupSize, -groupSize)
    const destinationTopRight = new Scene.Sprite(destinationGroup)
    destinationTopRight.Loop(Content.Markers.AlternativeBounds.TopRight)
    destinationTopRight.Move(groupSize, -groupSize)
    const destinationBottomLeft = new Scene.Sprite(destinationGroup)
    destinationBottomLeft.Loop(Content.Markers.AlternativeBounds.BottomLeft)
    destinationBottomLeft.Move(-groupSize, groupSize)
    const destinationBottomRight = new Scene.Sprite(destinationGroup)
    destinationBottomRight.Loop(Content.Markers.AlternativeBounds.BottomRight)
    destinationBottomRight.Move(groupSize, groupSize)

    const wrappingGroup = new Scene.Group(simulationGroup)

    const topLeft = new Scene.Sprite(wrappingGroup)
    topLeft.Loop(Content.Markers.Bounds.TopLeft)
    topLeft.Move(-groupSize, -groupSize)
    const topRight = new Scene.Sprite(wrappingGroup)
    topRight.Loop(Content.Markers.Bounds.TopRight)
    topRight.Move(groupSize, -groupSize)
    const bottomLeft = new Scene.Sprite(wrappingGroup)
    bottomLeft.Loop(Content.Markers.Bounds.BottomLeft)
    bottomLeft.Move(-groupSize, groupSize)
    const bottomRight = new Scene.Sprite(wrappingGroup)
    bottomRight.Loop(Content.Markers.Bounds.BottomRight)
    bottomRight.Move(groupSize, groupSize)

    const destinationSprite = new Scene.Sprite(wrappingGroup)
    destinationSprite.Loop(Content.Markers.Anchor)

    const sprite = new Scene.Sprite(wrappingGroup)
    sprite.Loop(Content.Demos.SceneGraph.Sprite.Idle)

    const groupControlsViewport = new Scene.Viewport("Left", "Bottom")
    FontBig.Write(groupControlsViewport, "Containing group", "Middle", "Middle", Content.Buttons.Wide.Unpressed.WidthPixels / 2, ResolutionY - Content.Buttons.Wide.Unpressed.HeightPixels * 5.5)

    const randomSizeX = 144
    const randomSizeY = 48

    const groupPauseGroup = new Scene.Group(groupControlsViewport, () => {
        groupPauseSprite.Play(Content.Buttons.Wide.Pressed)
        simulationGroup.Pause()
    })
    groupPauseGroup.Move(Content.Buttons.Wide.Unpressed.WidthPixels / 2, ResolutionY - Content.Buttons.Wide.Unpressed.HeightPixels * 4.5)
    const groupPauseSprite = new Scene.Sprite(groupPauseGroup)
    groupPauseSprite.Loop(Content.Buttons.Wide.Unpressed)
    FontBig.Write(groupPauseGroup, "Pause", "Middle", "Middle")

    const groupResumeGroup = new Scene.Group(groupControlsViewport, () => {
        groupResumeSprite.Play(Content.Buttons.Wide.Pressed)
        simulationGroup.Resume()
    })
    groupResumeGroup.Move(Content.Buttons.Wide.Unpressed.WidthPixels / 2, ResolutionY - Content.Buttons.Wide.Unpressed.HeightPixels * 3.5)
    const groupResumeSprite = new Scene.Sprite(groupResumeGroup)
    groupResumeSprite.Loop(Content.Buttons.Wide.Unpressed)
    FontBig.Write(groupResumeGroup, "Resume", "Middle", "Middle")

    const groupMoveGroup = new Scene.Group(groupControlsViewport, () => {
        groupMoveSprite.Play(Content.Buttons.Wide.Pressed)
        const x = Math.random() * randomSizeX - randomSizeX / 2
        const y = Math.random() * randomSizeY - randomSizeY / 2
        wrappingGroup.Move(x, y)
        destinationGroup.Move(x, y)
        topLeft.Loop(Content.Markers.Bounds.TopLeft)
        topRight.Loop(Content.Markers.Bounds.TopRight)
        bottomLeft.Loop(Content.Markers.Bounds.BottomLeft)
        bottomRight.Loop(Content.Markers.Bounds.BottomRight)
    })
    groupMoveGroup.Move(Content.Buttons.Wide.Unpressed.WidthPixels / 2, ResolutionY - Content.Buttons.Wide.Unpressed.HeightPixels * 2.5)
    const groupMoveSprite = new Scene.Sprite(groupMoveGroup)
    groupMoveSprite.Loop(Content.Buttons.Wide.Unpressed)
    FontBig.Write(groupMoveGroup, "Move", "Middle", "Middle")

    const groupMoveAtGroup = new Scene.Group(groupControlsViewport, () => {
        groupMoveAtSprite.Play(Content.Buttons.Wide.Pressed)
        const x = Math.random() * randomSizeX - randomSizeX / 2
        const y = Math.random() * randomSizeY - randomSizeY / 2
        topLeft.Loop(Content.Markers.FlashingBounds.TopLeft)
        topRight.Loop(Content.Markers.FlashingBounds.TopRight)<commit_msg>Fixed the bounding group not strobing on arriving at its destination in the scene graph demonstration.<commit_after>new Demo("Scene Graph", (group) => {
    const simulationGroup = new Scene.Group(group)
    simulationGroup.Move(ResolutionX / 2, ResolutionY / 2)

    const groupSize = 48

    const destinationGroup = new Scene.Group(simulationGroup)

    const destinationTopLeft = new Scene.Sprite(destinationGroup)
    destinationTopLeft.Loop(Content.Markers.AlternativeBounds.TopLeft)
    destinationTopLeft.Move(-groupSize, -groupSize)
    const destinationTopRight = new Scene.Sprite(destinationGroup)
    destinationTopRight.Loop(Content.Markers.AlternativeBounds.TopRight)
    destinationTopRight.Move(groupSize, -groupSize)
    const destinationBottomLeft = new Scene.Sprite(destinationGroup)
    destinationBottomLeft.Loop(Content.Markers.AlternativeBounds.BottomLeft)
    destinationBottomLeft.Move(-groupSize, groupSize)
    const destinationBottomRight = new Scene.Sprite(destinationGroup)
    destinationBottomRight.Loop(Content.Markers.AlternativeBounds.BottomRight)
    destinationBottomRight.Move(groupSize, groupSize)

    const wrappingGroup = new Scene.Group(simulationGroup)

    const topLeft = new Scene.Sprite(wrappingGroup)
    topLeft.Loop(Content.Markers.Bounds.TopLeft)
    topLeft.Move(-groupSize, -groupSize)
    const topRight = new Scene.Sprite(wrappingGroup)
    topRight.Loop(Content.Markers.Bounds.TopRight)
    topRight.Move(groupSize, -groupSize)
    const bottomLeft = new Scene.Sprite(wrappingGroup)
    bottomLeft.Loop(Content.Markers.Bounds.BottomLeft)
    bottomLeft.Move(-groupSize, groupSize)
    const bottomRight = new Scene.Sprite(wrappingGroup)
    bottomRight.Loop(Content.Markers.Bounds.BottomRight)
    bottomRight.Move(groupSize, groupSize)

    const destinationSprite = new Scene.Sprite(wrappingGroup)
    destinationSprite.Loop(Content.Markers.Anchor)

    const sprite = new Scene.Sprite(wrappingGroup)
    sprite.Loop(Content.Demos.SceneGraph.Sprite.Idle)

    const groupControlsViewport = new Scene.Viewport("Left", "Bottom")
    FontBig.Write(groupControlsViewport, "Containing group", "Middle", "Middle", Content.Buttons.Wide.Unpressed.WidthPixels / 2, ResolutionY - Content.Buttons.Wide.Unpressed.HeightPixels * 5.5)

    const randomSizeX = 144
    const randomSizeY = 48

    const groupPauseGroup = new Scene.Group(groupControlsViewport, () => {
        groupPauseSprite.Play(Content.Buttons.Wide.Pressed)
        simulationGroup.Pause()
    })
    groupPauseGroup.Move(Content.Buttons.Wide.Unpressed.WidthPixels / 2, ResolutionY - Content.Buttons.Wide.Unpressed.HeightPixels * 4.5)
    const groupPauseSprite = new Scene.Sprite(groupPauseGroup)
    groupPauseSprite.Loop(Content.Buttons.Wide.Unpressed)
    FontBig.Write(groupPauseGroup, "Pause", "Middle", "Middle")

    const groupResumeGroup = new Scene.Group(groupControlsViewport, () => {
        groupResumeSprite.Play(Content.Buttons.Wide.Pressed)
        simulationGroup.Resume()
    })
    groupResumeGroup.Move(Content.Buttons.Wide.Unpressed.WidthPixels / 2, ResolutionY - Content.Buttons.Wide.Unpressed.HeightPixels * 3.5)
    const groupResumeSprite = new Scene.Sprite(groupResumeGroup)
    groupResumeSprite.Loop(Content.Buttons.Wide.Unpressed)
    FontBig.Write(groupResumeGroup, "Resume", "Middle", "Middle")

    const groupMoveGroup = new Scene.Group(groupControlsViewport, () => {
        groupMoveSprite.Play(Content.Buttons.Wide.Pressed)
        const x = Math.random() * randomSizeX - randomSizeX / 2
        const y = Math.random() * randomSizeY - randomSizeY / 2
        wrappingGroup.Move(x, y)
        destinationGroup.Move(x, y)
        topLeft.Play(Content.Markers.StrobeBounds.TopLeft)
        topRight.Play(Content.Markers.StrobeBounds.TopRight)
        bottomLeft.Play(Content.Markers.StrobeBounds.BottomLeft)
        bottomRight.Play(Content.Markers.StrobeBounds.BottomRight)
    })
    groupMoveGroup.Move(Content.Buttons.Wide.Unpressed.WidthPixels / 2, ResolutionY - Content.Buttons.Wide.Unpressed.HeightPixels * 2.5)
    const groupMoveSprite = new Scene.Sprite(groupMoveGroup)
    groupMoveSprite.Loop(Content.Buttons.Wide.Unpressed)
    FontBig.Write(groupMoveGroup, "Move", "Middle", "Middle")

    const groupMoveAtGroup = new Scene.Group(groupControlsViewport, () => {
        groupMoveAtSprite.Play(Content.Buttons.Wide.Pressed)
        const x = Math.random() * randomSizeX - randomSizeX / 2
        const y = Math.random() * randomSizeY - randomSizeY / 2
        topLeft.Loop(Content.Markers.FlashingBounds.TopLeft)
        topRight.Loop(Content.Markers.FlashingBounds.TopRight)
{'fraction_non_alphanumeric': 0.10184477677109485, 'fraction_numerical': 0.005457919441109049, 'mean_word_length': 4.286785920369302, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 13, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4089942', 'n_tokens_mistral': 2821, 'n_tokens_neox': 2771, 'n_words': 430}