diff --git a/CardListing/ab800371-b455-4a23-85f4-42fd0b786abb.json b/CardListing/ab800371-b455-4a23-85f4-42fd0b786abb.json new file mode 100644 index 0000000..311e92a --- /dev/null +++ b/CardListing/ab800371-b455-4a23-85f4-42fd0b786abb.json @@ -0,0 +1,96 @@ +{ + "data": { + "meta": { + "adoptsFrom": { + "name": "CardListing", + "module": "../catalog-app/listing/listing" + } + }, + "type": "card", + "attributes": { + "name": "Beat Maker Studio", + "images": [ + "https://boxel-images.boxel.ai/app-assets/catalog/beat-maker-listing/screenshot_01.png" + ], + "summary": "Professional beat maker and rhythm sequencer for creating music beats, patterns, and drum sequences with customizable instruments and sound kits.", + "cardInfo": { + "notes": "Includes multiple instrument kits, pattern sequencing, and real-time beat creation capabilities", + "title": "Beat Maker Studio", + "description": "A comprehensive beat making application that allows users to create custom drum patterns, sequence beats, and mix audio with various instrument kits. Features include BPM control, swing settings, pattern management, and multiple sound libraries for professional music production.", + "thumbnailURL": "https://boxel-images.boxel.ai/app-assets/catalog/beat-maker-listing/thumbnail.png" + } + }, + "relationships": { + "tags": { + "links": { + "self": null + } + }, + "skills": { + "links": { + "self": null + } + }, + "license": { + "links": { + "self": null + } + }, + "specs.0": { + "links": { + "self": "../Spec/5ae71ae1-9cab-4003-b1b4-550a2305f442" + } + }, + "specs.1": { + "links": { + "self": "../Spec/1ae19cab-8003-41b4-950a-2305f442fd0b" + } + }, + "specs.2": { + "links": { + "self": "../Spec/e71ae19c-ab80-4371-b455-0a2305f442fd" + } + }, + "specs.3": { + "links": { + "self": "../Spec/e19cab80-0371-4455-8a23-05f442fd0b78" + } + }, + "specs.4": { + "links": { + "self": "../Spec/9cab8003-71b4-450a-a305-f442fd0b786a" + } + }, + "publisher": { + "links": { + "self": null + } + }, + "examples.0": { + "links": { + "self": "../beat-maker/BeatMakerCard/rhythm-studio" + } + }, + "categories.0": { + "links": { + "self": "../Category/entertainment-media" + } + }, + "categories.1": { + "links": { + "self": "../Category/creative-projects" + } + }, + "categories.2": { + "links": { + "self": "../Category/content-creation" + } + }, + "cardInfo.theme": { + "links": { + "self": null + } + } + } + } +} \ No newline at end of file diff --git a/Spec/1ae19cab-8003-41b4-950a-2305f442fd0b.json b/Spec/1ae19cab-8003-41b4-950a-2305f442fd0b.json new file mode 100644 index 0000000..0cd9a82 --- /dev/null +++ b/Spec/1ae19cab-8003-41b4-950a-2305f442fd0b.json @@ -0,0 +1,35 @@ +{ + "data": { + "type": "card", + "attributes": { + "readMe": null, + "ref": { + "module": "../beat-maker/beat-maker", + "name": "BeatPatternField" + }, + "specType": "field", + "containedExamples": [], + "title": "BeatPatternField", + "description": null, + "cardInfo": { + "title": null, + "description": null, + "thumbnailURL": null, + "notes": null + } + }, + "relationships": { + "linkedExamples": { + "links": { + "self": null + } + } + }, + "meta": { + "adoptsFrom": { + "module": "https://cardstack.com/base/spec", + "name": "Spec" + } + } + } +} \ No newline at end of file diff --git a/Spec/5ae71ae1-9cab-4003-b1b4-550a2305f442.json b/Spec/5ae71ae1-9cab-4003-b1b4-550a2305f442.json new file mode 100644 index 0000000..22d3a32 --- /dev/null +++ b/Spec/5ae71ae1-9cab-4003-b1b4-550a2305f442.json @@ -0,0 +1,35 @@ +{ + "data": { + "type": "card", + "attributes": { + "readMe": null, + "ref": { + "module": "../beat-maker/beat-maker", + "name": "DrumKitField" + }, + "specType": "field", + "containedExamples": [], + "title": "DrumKitField", + "description": null, + "cardInfo": { + "title": null, + "description": null, + "thumbnailURL": null, + "notes": null + } + }, + "relationships": { + "linkedExamples": { + "links": { + "self": null + } + } + }, + "meta": { + "adoptsFrom": { + "module": "https://cardstack.com/base/spec", + "name": "Spec" + } + } + } +} \ No newline at end of file diff --git a/Spec/9cab8003-71b4-450a-a305-f442fd0b786a.json b/Spec/9cab8003-71b4-450a-a305-f442fd0b786a.json new file mode 100644 index 0000000..dceb92b --- /dev/null +++ b/Spec/9cab8003-71b4-450a-a305-f442fd0b786a.json @@ -0,0 +1,35 @@ +{ + "data": { + "type": "card", + "attributes": { + "readMe": null, + "ref": { + "module": "../beat-maker/beat-maker", + "name": "BeatMakerCard" + }, + "specType": "card", + "containedExamples": [], + "title": "BeatMakerCard", + "description": null, + "cardInfo": { + "title": null, + "description": null, + "thumbnailURL": null, + "notes": null + } + }, + "relationships": { + "linkedExamples": { + "links": { + "self": null + } + } + }, + "meta": { + "adoptsFrom": { + "module": "https://cardstack.com/base/spec", + "name": "Spec" + } + } + } +} \ No newline at end of file diff --git a/Spec/e19cab80-0371-4455-8a23-05f442fd0b78.json b/Spec/e19cab80-0371-4455-8a23-05f442fd0b78.json new file mode 100644 index 0000000..54a8883 --- /dev/null +++ b/Spec/e19cab80-0371-4455-8a23-05f442fd0b78.json @@ -0,0 +1,35 @@ +{ + "data": { + "type": "card", + "attributes": { + "readMe": null, + "ref": { + "module": "../beat-maker/beat-maker", + "name": "BeatPatternCard" + }, + "specType": "card", + "containedExamples": [], + "title": "BeatPatternCard", + "description": null, + "cardInfo": { + "title": null, + "description": null, + "thumbnailURL": null, + "notes": null + } + }, + "relationships": { + "linkedExamples": { + "links": { + "self": null + } + } + }, + "meta": { + "adoptsFrom": { + "module": "https://cardstack.com/base/spec", + "name": "Spec" + } + } + } +} \ No newline at end of file diff --git a/Spec/e71ae19c-ab80-4371-b455-0a2305f442fd.json b/Spec/e71ae19c-ab80-4371-b455-0a2305f442fd.json new file mode 100644 index 0000000..712927f --- /dev/null +++ b/Spec/e71ae19c-ab80-4371-b455-0a2305f442fd.json @@ -0,0 +1,35 @@ +{ + "data": { + "type": "card", + "attributes": { + "readMe": null, + "ref": { + "module": "../beat-maker/beat-maker", + "name": "DrumKitCard" + }, + "specType": "card", + "containedExamples": [], + "title": "DrumKitCard", + "description": null, + "cardInfo": { + "title": null, + "description": null, + "thumbnailURL": null, + "notes": null + } + }, + "relationships": { + "linkedExamples": { + "links": { + "self": null + } + } + }, + "meta": { + "adoptsFrom": { + "module": "https://cardstack.com/base/spec", + "name": "Spec" + } + } + } +} \ No newline at end of file diff --git a/beat-maker/BeatMakerCard/rhythm-studio.json b/beat-maker/BeatMakerCard/rhythm-studio.json new file mode 100644 index 0000000..2a32da9 --- /dev/null +++ b/beat-maker/BeatMakerCard/rhythm-studio.json @@ -0,0 +1,101 @@ +{ + "data": { + "meta": { + "adoptsFrom": { + "name": "BeatMakerCard", + "module": "../beat-maker" + } + }, + "type": "card", + "attributes": { + "bpm": 110, + "swing": 0, + "pattern": "House-Standard", + "cardInfo": { + "notes": null, + "title": null, + "description": null, + "thumbnailURL": null + }, + "masterVolume": 75, + "instrumentKit": "Rock Kit" + }, + "relationships": { + "currentKit": { + "links": { + "self": "../DrumKitCard/rock-kit" + } + }, + "cardInfo.theme": { + "links": { + "self": null + } + }, + "currentPattern": { + "links": { + "self": "../BeatPatternCard/jazz-swing" + } + }, + "availableKits.0": { + "links": { + "self": "../DrumKitCard/808-analog-kit" + } + }, + "availableKits.1": { + "links": { + "self": "../DrumKitCard/trap-kit" + } + }, + "availableKits.2": { + "links": { + "self": "../DrumKitCard/house-kit" + } + }, + "availableKits.3": { + "links": { + "self": "../DrumKitCard/techno-kit" + } + }, + "availableKits.4": { + "links": { + "self": "../DrumKitCard/jazz-kit" + } + }, + "availableKits.5": { + "links": { + "self": "../DrumKitCard/rock-kit" + } + }, + "availablePatterns.0": { + "links": { + "self": "../BeatPatternCard/basic-4-4-beat" + } + }, + "availablePatterns.1": { + "links": { + "self": "../BeatPatternCard/trap-pattern" + } + }, + "availablePatterns.2": { + "links": { + "self": "../BeatPatternCard/house-groove" + } + }, + "availablePatterns.3": { + "links": { + "self": "../BeatPatternCard/breakbeat" + } + }, + "availablePatterns.4": { + "links": { + "self": "../BeatPatternCard/jazz-swing" + } + }, + "availablePatterns.5": { + "links": { + "self": "../BeatPatternCard/rock-beat" + } + } + } + } +} \ No newline at end of file diff --git a/beat-maker/BeatPatternCard/basic-4-4-beat.json b/beat-maker/BeatPatternCard/basic-4-4-beat.json new file mode 100644 index 0000000..446b6e9 --- /dev/null +++ b/beat-maker/BeatPatternCard/basic-4-4-beat.json @@ -0,0 +1,29 @@ +{ + "data": { + "type": "card", + "attributes": { + "patternName": "Basic 4/4 Beat", + "description": "Classic four-on-the-floor pattern with kick on every beat and snare on 2 and 4", + "bpm": 120, + "genre": "Basic", + "creator": "Beat Maker Studio", + "pattern": { + "name": "Basic 4/4 Beat", + "kick": "[true,false,false,false,true,false,false,false,true,false,false,false,true,false,false,false]", + "snare": "[false,false,false,false,true,false,false,false,false,false,false,false,true,false,false,false]", + "hihat": "[true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true]", + "openhat": "[false,false,false,true,false,false,false,true,false,false,false,true,false,false,false,true]", + "clap": "[false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false]", + "crash": "[true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false]" + }, + "title": "Basic 4/4 Beat" + }, + "relationships": {}, + "meta": { + "adoptsFrom": { + "module": "../beat-maker", + "name": "BeatPatternCard" + } + } + } +} diff --git a/beat-maker/BeatPatternCard/breakbeat.json b/beat-maker/BeatPatternCard/breakbeat.json new file mode 100644 index 0000000..54e29ef --- /dev/null +++ b/beat-maker/BeatPatternCard/breakbeat.json @@ -0,0 +1,29 @@ +{ + "data": { + "type": "card", + "attributes": { + "patternName": "Breakbeat", + "description": "Classic breakbeat pattern with syncopated kick and snare placement", + "bpm": 130, + "genre": "Breakbeat", + "creator": "Beat Maker Studio", + "pattern": { + "name": "Breakbeat", + "kick": "[true,false,false,false,false,false,true,false,false,true,false,false,false,false,false,false]", + "snare": "[false,false,false,false,true,false,false,false,false,false,true,false,false,false,false,false]", + "hihat": "[false,true,false,true,false,true,false,true,false,true,false,true,false,true,false,true]", + "openhat": "[false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false]", + "clap": "[false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false]", + "crash": "[true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false]" + }, + "title": "Breakbeat" + }, + "relationships": {}, + "meta": { + "adoptsFrom": { + "module": "../beat-maker", + "name": "BeatPatternCard" + } + } + } +} diff --git a/beat-maker/BeatPatternCard/house-groove.json b/beat-maker/BeatPatternCard/house-groove.json new file mode 100644 index 0000000..1551722 --- /dev/null +++ b/beat-maker/BeatPatternCard/house-groove.json @@ -0,0 +1,29 @@ +{ + "data": { + "type": "card", + "attributes": { + "patternName": "House Groove", + "description": "Steady four-on-the-floor house pattern with off-beat hi-hats", + "bpm": 125, + "genre": "House", + "creator": "Beat Maker Studio", + "pattern": { + "name": "House Groove", + "kick": "[true,false,false,false,true,false,false,false,true,false,false,false,true,false,false,false]", + "snare": "[false,false,false,false,true,false,false,false,false,false,false,false,true,false,false,false]", + "hihat": "[false,false,true,false,false,false,true,false,false,false,true,false,false,false,true,false]", + "openhat": "[false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true]", + "clap": "[false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false]", + "crash": "[true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false]" + }, + "title": "House Groove" + }, + "relationships": {}, + "meta": { + "adoptsFrom": { + "module": "../beat-maker", + "name": "BeatPatternCard" + } + } + } +} diff --git a/beat-maker/BeatPatternCard/jazz-swing.json b/beat-maker/BeatPatternCard/jazz-swing.json new file mode 100644 index 0000000..f7370e0 --- /dev/null +++ b/beat-maker/BeatPatternCard/jazz-swing.json @@ -0,0 +1,29 @@ +{ + "data": { + "type": "card", + "attributes": { + "patternName": "Jazz Swing", + "description": "Laid-back jazz pattern with subtle kick and brushed snare feel", + "bpm": 110, + "genre": "Jazz", + "creator": "Beat Maker Studio", + "pattern": { + "name": "Jazz Swing", + "kick": "[true,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false]", + "snare": "[false,false,false,false,false,false,true,false,false,false,false,false,false,false,true,false]", + "hihat": "[true,false,true,false,true,false,true,false,true,false,true,false,true,false,true,false]", + "openhat": "[false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true]", + "clap": "[false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false]", + "crash": "[true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false]" + }, + "title": "Jazz Swing" + }, + "relationships": {}, + "meta": { + "adoptsFrom": { + "module": "../beat-maker", + "name": "BeatPatternCard" + } + } + } +} diff --git a/beat-maker/BeatPatternCard/rock-beat.json b/beat-maker/BeatPatternCard/rock-beat.json new file mode 100644 index 0000000..76d85a4 --- /dev/null +++ b/beat-maker/BeatPatternCard/rock-beat.json @@ -0,0 +1,29 @@ +{ + "data": { + "type": "card", + "attributes": { + "patternName": "Rock Beat", + "description": "Driving rock pattern with steady kick and punchy snare backbeat", + "bpm": 115, + "genre": "Rock", + "creator": "Beat Maker Studio", + "pattern": { + "name": "Rock Beat", + "kick": "[true,false,false,false,true,false,true,false,true,false,false,false,true,false,true,false]", + "snare": "[false,false,false,false,true,false,false,false,false,false,false,false,true,false,false,false]", + "hihat": "[true,false,true,false,true,false,true,false,true,false,true,false,true,false,true,false]", + "openhat": "[false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false]", + "clap": "[false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false]", + "crash": "[true,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false]" + }, + "title": "Rock Beat" + }, + "relationships": {}, + "meta": { + "adoptsFrom": { + "module": "../beat-maker", + "name": "BeatPatternCard" + } + } + } +} diff --git a/beat-maker/BeatPatternCard/trap-pattern.json b/beat-maker/BeatPatternCard/trap-pattern.json new file mode 100644 index 0000000..f395b7a --- /dev/null +++ b/beat-maker/BeatPatternCard/trap-pattern.json @@ -0,0 +1,29 @@ +{ + "data": { + "type": "card", + "attributes": { + "patternName": "Trap Pattern", + "description": "Modern trap beat with syncopated kicks and rapid hi-hat rolls", + "bpm": 140, + "genre": "Trap", + "creator": "Beat Maker Studio", + "pattern": { + "name": "Trap Pattern", + "kick": "[true,false,false,true,false,false,true,false,false,false,true,false,false,true,false,false]", + "snare": "[false,false,false,false,true,false,false,false,false,false,false,false,true,false,false,false]", + "hihat": "[true,false,true,true,false,true,true,false,true,false,true,true,false,true,true,false]", + "openhat": "[false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,true]", + "clap": "[false,false,false,false,true,false,false,false,false,false,false,false,true,false,false,false]", + "crash": "[true,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false]" + }, + "title": "Trap Pattern" + }, + "relationships": {}, + "meta": { + "adoptsFrom": { + "module": "../beat-maker", + "name": "BeatPatternCard" + } + } + } +} diff --git a/beat-maker/DrumKitCard/808-analog-kit.json b/beat-maker/DrumKitCard/808-analog-kit.json new file mode 100644 index 0000000..854a2c8 --- /dev/null +++ b/beat-maker/DrumKitCard/808-analog-kit.json @@ -0,0 +1,28 @@ +{ + "data": { + "type": "card", + "attributes": { + "kitName": "808 Analog", + "description": "Classic analog drum machine sounds with deep kicks and crisp hi-hats", + "category": "Analog", + "creator": "Beat Maker Studio", + "kit": { + "kitName": "808 Analog", + "kickParams": "{\"type\": \"808\", \"frequency\": 60, \"decay\": 0.3, \"amplitude\": 1.0, \"shape\": 2}", + "snareParams": "{\"type\": \"808\", \"frequency\": 200, \"decay\": 0.1, \"amplitude\": 0.8, \"shape\": 1.5, \"resonance\": 5}", + "hihatParams": "{\"type\": \"808\", \"frequency\": 8000, \"decay\": 0.05, \"amplitude\": 0.6, \"shape\": 4, \"resonance\": 2}", + "openhatParams": "{\"type\": \"808\", \"frequency\": 6000, \"decay\": 0.3, \"amplitude\": 0.8, \"shape\": 1.5, \"resonance\": 2}", + "clapParams": "{\"type\": \"808\", \"frequency\": 2000, \"decay\": 0.1, \"amplitude\": 0.6, \"shape\": 2, \"resonance\": 5}", + "crashParams": "{\"type\": \"808\", \"frequency\": 3000, \"decay\": 1.0, \"amplitude\": 0.5, \"shape\": 0.5, \"resonance\": 1}" + }, + "title": "808 Analog" + }, + "relationships": {}, + "meta": { + "adoptsFrom": { + "module": "../beat-maker", + "name": "DrumKitCard" + } + } + } +} diff --git a/beat-maker/DrumKitCard/house-kit.json b/beat-maker/DrumKitCard/house-kit.json new file mode 100644 index 0000000..67c692f --- /dev/null +++ b/beat-maker/DrumKitCard/house-kit.json @@ -0,0 +1,28 @@ +{ + "data": { + "type": "card", + "attributes": { + "kitName": "House Kit", + "description": "Punchy four-on-the-floor kicks with clean snares and smooth hi-hats", + "category": "House", + "creator": "Beat Maker Studio", + "kit": { + "kitName": "House Kit", + "kickParams": "{\"type\": \"house\", \"frequency\": 65, \"decay\": 0.25, \"amplitude\": 1.0, \"shape\": 1.5, \"resonance\": 1}", + "snareParams": "{\"type\": \"house\", \"frequency\": 180, \"decay\": 0.2, \"amplitude\": 0.8, \"shape\": 2, \"resonance\": 0.5}", + "hihatParams": "{\"type\": \"house\", \"frequency\": 7000, \"decay\": 0.08, \"amplitude\": 0.5, \"shape\": 2, \"resonance\": 1}", + "openhatParams": "{\"type\": \"house\", \"frequency\": 6500, \"decay\": 0.25, \"amplitude\": 0.6, \"shape\": 1.5, \"resonance\": 1}", + "clapParams": "{\"type\": \"house\", \"frequency\": 1800, \"decay\": 0.15, \"amplitude\": 0.7, \"shape\": 2, \"resonance\": 3}", + "crashParams": "{\"type\": \"house\", \"frequency\": 3500, \"decay\": 0.8, \"amplitude\": 0.4, \"shape\": 1, \"resonance\": 1}" + }, + "title": "House Kit" + }, + "relationships": {}, + "meta": { + "adoptsFrom": { + "module": "../beat-maker", + "name": "DrumKitCard" + } + } + } +} diff --git a/beat-maker/DrumKitCard/jazz-kit.json b/beat-maker/DrumKitCard/jazz-kit.json new file mode 100644 index 0000000..a162db7 --- /dev/null +++ b/beat-maker/DrumKitCard/jazz-kit.json @@ -0,0 +1,28 @@ +{ + "data": { + "type": "card", + "attributes": { + "kitName": "Jazz Kit", + "description": "Warm acoustic simulation with natural textures and gentle filtering", + "category": "Jazz", + "creator": "Beat Maker Studio", + "kit": { + "kitName": "Jazz Kit", + "kickParams": "{\"type\": \"jazz\", \"frequency\": 70, \"decay\": 0.2, \"amplitude\": 0.8, \"shape\": 1.5, \"resonance\": 1}", + "snareParams": "{\"type\": \"jazz\", \"frequency\": 150, \"decay\": 0.25, \"amplitude\": 0.6, \"shape\": 1.5, \"resonance\": 0.5}", + "hihatParams": "{\"type\": \"jazz\", \"frequency\": 5000, \"decay\": 0.12, \"amplitude\": 0.4, \"shape\": 1.5, \"resonance\": 0.3}", + "openhatParams": "{\"type\": \"jazz\", \"frequency\": 4500, \"decay\": 0.35, \"amplitude\": 0.5, \"shape\": 1.2, \"resonance\": 0.5}", + "clapParams": "{\"type\": \"jazz\", \"frequency\": 1600, \"decay\": 0.18, \"amplitude\": 0.5, \"shape\": 1.8, \"resonance\": 2}", + "crashParams": "{\"type\": \"jazz\", \"frequency\": 3200, \"decay\": 1.2, \"amplitude\": 0.3, \"shape\": 0.8, \"resonance\": 0.5}" + }, + "title": "Jazz Kit" + }, + "relationships": {}, + "meta": { + "adoptsFrom": { + "module": "../beat-maker", + "name": "DrumKitCard" + } + } + } +} diff --git a/beat-maker/DrumKitCard/rock-kit.json b/beat-maker/DrumKitCard/rock-kit.json new file mode 100644 index 0000000..4cfe029 --- /dev/null +++ b/beat-maker/DrumKitCard/rock-kit.json @@ -0,0 +1,28 @@ +{ + "data": { + "type": "card", + "attributes": { + "kitName": "Rock Kit", + "description": "Aggressive punchy drums with heavy compression and beater clicks", + "category": "Rock", + "creator": "Beat Maker Studio", + "kit": { + "kitName": "Rock Kit", + "kickParams": "{\"type\": \"rock\", \"frequency\": 58, \"decay\": 0.25, \"amplitude\": 1.1, \"shape\": 0.7, \"resonance\": 1}", + "snareParams": "{\"type\": \"rock\", \"frequency\": 220, \"decay\": 0.18, \"amplitude\": 1.0, \"shape\": 2, \"resonance\": 3}", + "hihatParams": "{\"type\": \"rock\", \"frequency\": 7500, \"decay\": 0.07, \"amplitude\": 0.8, \"shape\": 3, \"resonance\": 3}", + "openhatParams": "{\"type\": \"rock\", \"frequency\": 7000, \"decay\": 0.3, \"amplitude\": 0.7, \"shape\": 2, \"resonance\": 2}", + "clapParams": "{\"type\": \"rock\", \"frequency\": 2100, \"decay\": 0.12, \"amplitude\": 0.9, \"shape\": 2.5, \"resonance\": 4}", + "crashParams": "{\"type\": \"rock\", \"frequency\": 3800, \"decay\": 0.9, \"amplitude\": 0.6, \"shape\": 1, \"resonance\": 2}" + }, + "title": "Rock Kit" + }, + "relationships": {}, + "meta": { + "adoptsFrom": { + "module": "../beat-maker", + "name": "DrumKitCard" + } + } + } +} diff --git a/beat-maker/DrumKitCard/techno-kit.json b/beat-maker/DrumKitCard/techno-kit.json new file mode 100644 index 0000000..523bf61 --- /dev/null +++ b/beat-maker/DrumKitCard/techno-kit.json @@ -0,0 +1,28 @@ +{ + "data": { + "type": "card", + "attributes": { + "kitName": "Techno Kit", + "description": "Industrial driving sounds with hard distortion and aggressive filtering", + "category": "Techno", + "creator": "Beat Maker Studio", + "kit": { + "kitName": "Techno Kit", + "kickParams": "{\"type\": \"techno\", \"frequency\": 55, \"decay\": 0.3, \"amplitude\": 1.3, \"shape\": 0.7, \"resonance\": 1}", + "snareParams": "{\"type\": \"techno\", \"frequency\": 1500, \"decay\": 0.15, \"amplitude\": 1.1, \"shape\": 1.5, \"resonance\": 8}", + "hihatParams": "{\"type\": \"techno\", \"frequency\": 9000, \"decay\": 0.06, \"amplitude\": 0.7, \"shape\": 4, \"resonance\": 5}", + "openhatParams": "{\"type\": \"techno\", \"frequency\": 8500, \"decay\": 0.2, \"amplitude\": 0.6, \"shape\": 2, \"resonance\": 4}", + "clapParams": "{\"type\": \"techno\", \"frequency\": 2200, \"decay\": 0.1, \"amplitude\": 0.8, \"shape\": 3, \"resonance\": 6}", + "crashParams": "{\"type\": \"techno\", \"frequency\": 4500, \"decay\": 0.7, \"amplitude\": 0.5, \"shape\": 1, \"resonance\": 3}" + }, + "title": "Techno Kit" + }, + "relationships": {}, + "meta": { + "adoptsFrom": { + "module": "../beat-maker", + "name": "DrumKitCard" + } + } + } +} diff --git a/beat-maker/DrumKitCard/trap-kit.json b/beat-maker/DrumKitCard/trap-kit.json new file mode 100644 index 0000000..ff64f6e --- /dev/null +++ b/beat-maker/DrumKitCard/trap-kit.json @@ -0,0 +1,28 @@ +{ + "data": { + "type": "card", + "attributes": { + "kitName": "Trap Kit", + "description": "Sub-heavy kicks with snappy snares and metallic hi-hats for modern trap production", + "category": "Trap", + "creator": "Beat Maker Studio", + "kit": { + "kitName": "Trap Kit", + "kickParams": "{\"type\": \"trap\", \"frequency\": 50, \"decay\": 0.8, \"amplitude\": 1.5, \"shape\": 1, \"resonance\": 1}", + "snareParams": "{\"type\": \"trap\", \"frequency\": 2000, \"decay\": 0.08, \"amplitude\": 1.2, \"shape\": 3, \"resonance\": 10}", + "hihatParams": "{\"type\": \"trap\", \"frequency\": 10000, \"decay\": 0.03, \"amplitude\": 0.8, \"shape\": 5, \"resonance\": 2}", + "openhatParams": "{\"type\": \"trap\", \"frequency\": 9000, \"decay\": 0.2, \"amplitude\": 0.7, \"shape\": 2, \"resonance\": 3}", + "clapParams": "{\"type\": \"trap\", \"frequency\": 2500, \"decay\": 0.12, \"amplitude\": 0.8, \"shape\": 2.5, \"resonance\": 8}", + "crashParams": "{\"type\": \"trap\", \"frequency\": 4000, \"decay\": 0.6, \"amplitude\": 0.4, \"shape\": 1, \"resonance\": 2}" + }, + "title": "Trap Kit" + }, + "relationships": {}, + "meta": { + "adoptsFrom": { + "module": "../beat-maker", + "name": "DrumKitCard" + } + } + } +} diff --git a/beat-maker/beat-maker.gts b/beat-maker/beat-maker.gts new file mode 100644 index 0000000..1d598e8 --- /dev/null +++ b/beat-maker/beat-maker.gts @@ -0,0 +1,3192 @@ +import { CardDef, FieldDef, field, contains, linksTo, linksToMany, Component } from 'https://cardstack.com/base/card-api'; +import StringField from 'https://cardstack.com/base/string'; +import NumberField from 'https://cardstack.com/base/number'; +import MusicIcon from '@cardstack/boxel-icons/music'; +import { Button } from '@cardstack/boxel-ui/components'; +import { tracked } from '@glimmer/tracking'; +import { action } from '@ember/object'; +import { on } from '@ember/modifier'; +import { fn, get, array, concat } from '@ember/helper'; +import { eq, gt, or } from '@cardstack/boxel-ui/helpers'; +// ⁸⁹ Drum Kit Definition - stores sound parameters for each kit +import "./beat-maker.gts.CiAgICAgICAgLmRydW0ta2l0LWZpZWxkW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItNDdlYjE2N2MwMl0gewogICAgICAgICAgcGFkZGluZzogMC41cmVtOwogICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM3NDE1MTsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cywgdmFyKC0tYm94ZWwtYm9yZGVyLXJhZGl1cykpOwogICAgICAgICAgYmFja2dyb3VuZDogIzFlMjkzYjsKICAgICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICB9CgogICAgICAgIC5raXQtbmFtZVtkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTQ3ZWIxNjdjMDJdIHsKICAgICAgICAgIGZvbnQtc2l6ZTogMC43NXJlbTsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgICBjb2xvcjogI2U1ZTdlYjsKICAgICAgICAgIG1hcmdpbi1ib3R0b206IDAuMjVyZW07CiAgICAgICAgfQoKICAgICAgICAua2l0LXR5cGVbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi00N2ViMTY3YzAyXSB7CiAgICAgICAgICBmb250LXNpemU6IDAuNjI1cmVtOwogICAgICAgICAgY29sb3I6ICM5Y2EzYWY7CiAgICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIH0KICAgICAg.glimmer-scoped.css"; +import { setComponentTemplate } from "@ember/component"; +import { createTemplateFactory } from "@ember/template-factory"; +import "./beat-maker.gts.CiAgICAgICAgLmRydW0ta2l0LWNhcmRbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0xYzJiYmVhZjNmXSB7CiAgICAgICAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjMWUyOTNiIDAlLCAjMzc0MTUxIDEwMCUpOwogICAgICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXhsLCB2YXIoLS1ib3hlbC1ib3JkZXItcmFkaXVzLXhsKSk7CiAgICAgICAgICBwYWRkaW5nOiAxcmVtOwogICAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgIzRiNTU2MzsKICAgICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7CiAgICAgICAgfQoKICAgICAgICAuZHJ1bS1raXQtY2FyZFtkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTFjMmJiZWFmM2ZdOmhvdmVyIHsKICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTsKICAgICAgICAgIGJveC1zaGFkb3c6IDAgOHB4IDI0cHggcmdiYSgwLCAwLCAwLCAwLjIpOwogICAgICAgICAgYm9yZGVyLWNvbG9yOiAjMTBiOTgxOwogICAgICAgIH0KCiAgICAgICAgLmtpdC1oZWFkZXJbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0xYzJiYmVhZjNmXSB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAwLjc1cmVtOwogICAgICAgIH0KCiAgICAgICAgLmtpdC10aXRsZVtkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTFjMmJiZWFmM2ZdIHsKICAgICAgICAgIGZvbnQtc2l6ZTogMXJlbTsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjMTBiOTgxLCAjMzRkMzk5KTsKICAgICAgICAgIC13ZWJraXQtYmFja2dyb3VuZC1jbGlwOiB0ZXh0OwogICAgICAgICAgLXdlYmtpdC10ZXh0LWZpbGwtY29sb3I6IHRyYW5zcGFyZW50OwogICAgICAgICAgYmFja2dyb3VuZC1jbGlwOiB0ZXh0OwogICAgICAgIH0KCiAgICAgICAgLmNhdGVnb3J5LXRhZ1tkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTFjMmJiZWFmM2ZdIHsKICAgICAgICAgIGJhY2tncm91bmQ6ICMxMGI5ODE7CiAgICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgICAgICBwYWRkaW5nOiAwLjI1cmVtIDAuNXJlbTsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy14bCwgdmFyKC0tYm94ZWwtYm9yZGVyLXJhZGl1cy14bCkpOwogICAgICAgICAgZm9udC1zaXplOiAwLjYyNXJlbTsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIH0KCiAgICAgICAgLmtpdC1kZXNjcmlwdGlvbltkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTFjMmJiZWFmM2ZdIHsKICAgICAgICAgIGZvbnQtc2l6ZTogMC43NXJlbTsKICAgICAgICAgIGNvbG9yOiAjY2JkNWUxOwogICAgICAgICAgbWFyZ2luOiAwIDAgMC43NXJlbSAwOwogICAgICAgICAgbGluZS1oZWlnaHQ6IDEuNDsKICAgICAgICB9CgogICAgICAgIC5raXQtZm9vdGVyW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMWMyYmJlYWYzZl0gewogICAgICAgICAgcGFkZGluZy10b3A6IDAuNXJlbTsKICAgICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjNGI1NTYzOwogICAgICAgIH0KCiAgICAgICAgLmNyZWF0b3JbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0xYzJiYmVhZjNmXSB7CiAgICAgICAgICBmb250LXNpemU6IDAuNjI1cmVtOwogICAgICAgICAgY29sb3I6ICM5Y2EzYWY7CiAgICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICAgICAgfQogICAgICA%3D.glimmer-scoped.css"; +import "./beat-maker.gts.CiAgICAgICAgLmJlYXQtcGF0dGVybi1jYXJkW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMTc4MzIwMDQwZl0gewogICAgICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgIzBmMTcyYSAwJSwgIzFlMjkzYiAxMDAlKTsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy14bCwgdmFyKC0tYm94ZWwtYm9yZGVyLXJhZGl1cy14bCkpOwogICAgICAgICAgcGFkZGluZzogMXJlbTsKICAgICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICMzNzQxNTE7CiAgICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlOwogICAgICAgIH0KCiAgICAgICAgLmJlYXQtcGF0dGVybi1jYXJkW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMTc4MzIwMDQwZl06aG92ZXIgewogICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpOwogICAgICAgICAgYm94LXNoYWRvdzogMCA4cHggMjRweCByZ2JhKDAsIDAsIDAsIDAuMik7CiAgICAgICAgICBib3JkZXItY29sb3I6ICM2MGE1ZmE7CiAgICAgICAgfQoKICAgICAgICAucGF0dGVybi1oZWFkZXJbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0xNzgzMjAwNDBmXSB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAwLjc1cmVtOwogICAgICAgIH0KCiAgICAgICAgLnBhdHRlcm4tdGl0bGVbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0xNzgzMjAwNDBmXSB7CiAgICAgICAgICBmb250LXNpemU6IDFyZW07CiAgICAgICAgICBmb250LXdlaWdodDogNzAwOwogICAgICAgICAgbWFyZ2luOiAwOwogICAgICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgIzYwYTVmYSwgI2E3OGJmYSk7CiAgICAgICAgICAtd2Via2l0LWJhY2tncm91bmQtY2xpcDogdGV4dDsKICAgICAgICAgIC13ZWJraXQtdGV4dC1maWxsLWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgICAgIGJhY2tncm91bmQtY2xpcDogdGV4dDsKICAgICAgICB9CgogICAgICAgIC5wYXR0ZXJuLW1ldGFbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0xNzgzMjAwNDBmXSB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZ2FwOiAwLjVyZW07CiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIH0KCiAgICAgICAgLmdlbnJlLXRhZ1tkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTE3ODMyMDA0MGZdIHsKICAgICAgICAgIGJhY2tncm91bmQ6ICMzNzQxNTE7CiAgICAgICAgICBjb2xvcjogI2U1ZTdlYjsKICAgICAgICAgIHBhZGRpbmc6IDAuMjVyZW0gMC41cmVtOwogICAgICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXhsLCB2YXIoLS1ib3hlbC1ib3JkZXItcmFkaXVzLXhsKSk7CiAgICAgICAgICBmb250LXNpemU6IDAuNjI1cmVtOwogICAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgICAgfQoKICAgICAgICAuYnBtLWluZGljYXRvcltkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTE3ODMyMDA0MGZdIHsKICAgICAgICAgIGJhY2tncm91bmQ6ICMxMGI5ODE7CiAgICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgICAgICBwYWRkaW5nOiAwLjI1cmVtIDAuNXJlbTsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cywgdmFyKC0tYm94ZWwtYm9yZGVyLXJhZGl1cykpOwogICAgICAgICAgZm9udC1zaXplOiAwLjYyNXJlbTsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICAgICAgICBmb250LWZhbWlseTogJ0pldEJyYWlucyBNb25vJywgbW9ub3NwYWNlOwogICAgICAgIH0KCiAgICAgICAgLnBhdHRlcm4tZGVzY3JpcHRpb25bZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0xNzgzMjAwNDBmXSB7CiAgICAgICAgICBmb250LXNpemU6IDAuNzVyZW07CiAgICAgICAgICBjb2xvcjogI2NiZDVlMTsKICAgICAgICAgIG1hcmdpbjogMCAwIDAuNzVyZW0gMDsKICAgICAgICAgIGxpbmUtaGVpZ2h0OiAxLjQ7CiAgICAgICAgfQoKICAgICAgICAucGF0dGVybi1wcmV2aWV3W2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMTc4MzIwMDQwZl0gewogICAgICAgICAgbWFyZ2luLWJvdHRvbTogMC43NXJlbTsKICAgICAgICB9CgogICAgICAgIC5wYXR0ZXJuLWZvb3RlcltkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTE3ODMyMDA0MGZdIHsKICAgICAgICAgIHBhZGRpbmctdG9wOiAwLjVyZW07CiAgICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgIzM3NDE1MTsKICAgICAgICB9CgogICAgICAgIC5jcmVhdG9yW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMTc4MzIwMDQwZl0gewogICAgICAgICAgZm9udC1zaXplOiAwLjYyNXJlbTsKICAgICAgICAgIGNvbG9yOiAjOWNhM2FmOwogICAgICAgICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgICAgIH0KICAgICAg.glimmer-scoped.css"; +import "./beat-maker.gts.CiAgICAgICAgLmJlYXQtcGF0dGVybi1maWVsZFtkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTIyZmUxODk0ZGFdIHsKICAgICAgICAgIHBhZGRpbmc6IDAuNXJlbTsKICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNlNWU3ZWI7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMsIHZhcigtLWJveGVsLWJvcmRlci1yYWRpdXMpKTsKICAgICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgICAgIH0KCiAgICAgICAgLnBhdHRlcm4tbmFtZVtkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTIyZmUxODk0ZGFdIHsKICAgICAgICAgIGZvbnQtc2l6ZTogMC43NXJlbTsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgICBjb2xvcjogIzM3NDE1MTsKICAgICAgICAgIG1hcmdpbi1ib3R0b206IDAuMzc1cmVtOwogICAgICAgIH0KCiAgICAgICAgLnBhdHRlcm4tYmFyc1tkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTIyZmUxODk0ZGFdIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBnYXA6IDFweDsKICAgICAgICB9CgogICAgICAgIC5wYXR0ZXJuLXN0ZXBbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0yMmZlMTg5NGRhXSB7CiAgICAgICAgICB3aWR0aDogMTJweDsKICAgICAgICAgIGhlaWdodDogOHB4OwogICAgICAgICAgYmFja2dyb3VuZDogI2YzZjRmNjsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy14eHMsIHZhcigtLWJveGVsLWJvcmRlci1yYWRpdXMteHhzKSk7CiAgICAgICAgfQoKICAgICAgICAucGF0dGVybi1zdGVwLmhhcy1raWNrW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMjJmZTE4OTRkYV0gewogICAgICAgICAgYmFja2dyb3VuZDogI2Y1OWUwYjsKICAgICAgICB9CiAgICAgIA%3D%3D.glimmer-scoped.css"; +import "./beat-maker.gts.CiAgICAgIC8qIMKywrIgRW5oYW5jZWQgQmVhdCBtYWtlciBzdHlsZXMgd2l0aCBDbGF5bW9ycGhpYyB0aGVtZSAqLwogICAgICAuYmVhdC1tYWtlci1jYXJkW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMjVlZDUxZTA5MV0gewogICAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxNDVkZWcsICMwYTBlMWEsICMxYTFmMmUpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy14bCwgdmFyKC0tYm94ZWwtYm9yZGVyLXJhZGl1cy14bCkpOwogICAgICAgIHBhZGRpbmc6IDEuNXJlbTsKICAgICAgICBjb2xvcjogdmFyKC0tZm9yZWdyb3VuZCwgI2ZmZmZmZik7CiAgICAgICAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtbW9ubyk7CiAgICAgICAgbWluLWhlaWdodDogNTAwcHg7CgogICAgICAgIGJveC1zaGFkb3c6CiAgICAgICAgICBpbnNldCAwIDAgMzBweCByZ2JhKDAsIDAsIDAsIDAuNSksCiAgICAgICAgICAwIDEwcHggNDBweCByZ2JhKDAsIDAsIDAsIDAuNyksCiAgICAgICAgICAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjkpOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICMxYTFmMmU7CiAgICAgIH0KCiAgICAgIC8qIEVuaGFuY2VkIEhlYWRlciAqLwogICAgICAuYmVhdC1tYWtlci1oZWFkZXJbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0yNWVkNTFlMDkxXSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMS41cmVtOwogICAgICAgIGdhcDogMXJlbTsKICAgICAgfQoKICAgICAgLmhlYWRlci1sZWZ0W2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMjVlZDUxZTA5MV0gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBnYXA6IDAuNXJlbTsKICAgICAgfQoKICAgICAgLmJlYXQtbWFrZXItaGVhZGVyIGgzW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMjVlZDUxZTA5MV0gewogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBmb250LXNpemU6IDEuMjVyZW07CiAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgICAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgICAxMzVkZWcsCiAgICAgICAgICB2YXIoLS1wcmltYXJ5LCAjNjBhNWZhKSwKICAgICAgICAgIHZhcigtLWFjY2VudCwgI2E3OGJmYSkKICAgICAgICApOwogICAgICAgIC13ZWJraXQtYmFja2dyb3VuZC1jbGlwOiB0ZXh0OwogICAgICAgIC13ZWJraXQtdGV4dC1maWxsLWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgICBiYWNrZ3JvdW5kLWNsaXA6IHRleHQ7CiAgICAgIH0KCiAgICAgIC5raXQtc2VsZWN0b3IgLmtpdC1kcm9wZG93bltkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTI1ZWQ1MWUwOTFdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLCAjMzc0MTUxKTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIsICM0YjU1NjMpOwogICAgICAgIGNvbG9yOiB2YXIoLS1jYXJkLWZvcmVncm91bmQsICNmZmZmZmYpOwogICAgICAgIHBhZGRpbmc6IHZhcigtLXNwYWNpbmcsIDAuMzc1cmVtKSBjYWxjKHZhcigtLXNwYWNpbmcsIDAuMjVyZW0pICogMyk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLCB2YXIoLS1ib3hlbC1ib3JkZXItcmFkaXVzKSk7CiAgICAgICAgZm9udC1zaXplOiAwLjc1cmVtOwogICAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LW1vbm8sICdKZXRCcmFpbnMgTW9ubycsICdGaXJhIENvZGUnLCBtb25vc3BhY2UpOwogICAgICB9CgogICAgICAuaGVhZGVyLWNvbnRyb2xzW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMjVlZDUxZTA5MV0gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDFyZW07CiAgICAgIH0KCiAgICAgIC5jb250cm9sLWdyb3VwW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMjVlZDUxZTA5MV0gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogMC4yNXJlbTsKICAgICAgICBtaW4td2lkdGg6IDgwcHg7CiAgICAgIH0KCiAgICAgIC5jb250cm9sLWxhYmVsW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMjVlZDUxZTA5MV0gewogICAgICAgIGZvbnQtc2l6ZTogMC42MjVyZW07CiAgICAgICAgY29sb3I6IHZhcigtLW11dGVkLWZvcmVncm91bmQsICM5Y2EzYWYpOwogICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICB9CgogICAgICAuY29udHJvbC12YWx1ZVtkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTI1ZWQ1MWUwOTFdIHsKICAgICAgICBmb250LXNpemU6IDAuNzVyZW07CiAgICAgICAgY29sb3I6IHZhcigtLWZvcmVncm91bmQsICNlNWU3ZWIpOwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgbWluLXdpZHRoOiA0MHB4OwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgfQoKICAgICAgLnNsaWRlcltkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTI1ZWQ1MWUwOTFdIHsKICAgICAgICB3aWR0aDogNjBweDsKICAgICAgICBoZWlnaHQ6IDRweDsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1pbnB1dCwgIzM3NDE1MSk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXhzLCB2YXIoLS1ib3hlbC1ib3JkZXItcmFkaXVzLXhzKSk7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5zbGlkZXJbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0yNWVkNTFlMDkxXTo6LXdlYmtpdC1zbGlkZXItdGh1bWIgewogICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgICAgICB3aWR0aDogMTZweDsKICAgICAgICBoZWlnaHQ6IDE2cHg7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcHJpbWFyeSwgIzYwYTVmYSk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBib3gtc2hhZG93OiB2YXIoLS1zaGFkb3cteHMsIDAgMXB4IDJweCByZ2JhKDE1LCAyMywgNDIsIDAuMykpOwogICAgICB9CgogICAgICAuc2xpZGVyW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMjVlZDUxZTA5MV06Oi1tb3otcmFuZ2UtdGh1bWIgewogICAgICAgIHdpZHRoOiAxNnB4OwogICAgICAgIGhlaWdodDogMTZweDsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wcmltYXJ5LCAjNjBhNWZhKTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICBib3gtc2hhZG93OiB2YXIoLS1zaGFkb3cteHMsIDAgMXB4IDJweCByZ2JhKDE1LCAyMywgNDIsIDAuMykpOwogICAgICB9CgogICAgICAucGxheS1idXR0b25bZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0yNWVkNTFlMDkxXSB7CiAgICAgICAgd2lkdGg6IDQ4cHg7CiAgICAgICAgaGVpZ2h0OiA0OHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wcmltYXJ5LCAjMTBiOTgxKTsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgY29sb3I6IHZhcigtLXByaW1hcnktZm9yZWdyb3VuZCwgI2ZmZmZmZik7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlOwogICAgICAgIGJveC1zaGFkb3c6IHZhcigtLXNoYWRvdy1tZCwgMCA0cHggMTJweCByZ2JhKDE2LCAxODUsIDEyOSwgMC4zKSk7CiAgICAgIH0KCiAgICAgIC5wbGF5LWJ1dHRvbltkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTI1ZWQ1MWUwOTFdOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wcmltYXJ5LCAjMDU5NjY5KTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMDUpOwogICAgICAgIGJveC1zaGFkb3c6IHZhcigtLXNoYWRvdy1sZywgMCA2cHggMTZweCByZ2JhKDE2LCAxODUsIDEyOSwgMC40KSk7CiAgICAgICAgZmlsdGVyOiBicmlnaHRuZXNzKDEuMSk7CiAgICAgIH0KCiAgICAgIC5wbGF5LWJ1dHRvbi5wbGF5aW5nW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMjVlZDUxZTA5MV0gewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWRlc3RydWN0aXZlLCAjZWY0NDQ0KTsKICAgICAgICBib3gtc2hhZG93OiB2YXIoLS1zaGFkb3ctbWQsIDAgNHB4IDEycHggcmdiYSgyMzksIDY4LCA2OCwgMC4zKSk7CiAgICAgIH0KCiAgICAgIC5wbGF5LWJ1dHRvbi5wbGF5aW5nW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMjVlZDUxZTA5MV06aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWRlc3RydWN0aXZlLCAjZGMyNjI2KTsKICAgICAgICBib3gtc2hhZG93OiB2YXIoLS1zaGFkb3ctbGcsIDAgNnB4IDE2cHggcmdiYSgyMzksIDY4LCA2OCwgMC40KSk7CiAgICAgICAgZmlsdGVyOiBicmlnaHRuZXNzKDEuMSk7CiAgICAgIH0KCiAgICAgIC5wbGF5LWJ1dHRvbiBzdmdbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0yNWVkNTFlMDkxXSB7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgICAgaGVpZ2h0OiAyMHB4OwogICAgICB9CgogICAgICAvKiBDb21wYWN0IFBhdHRlcm4gTGlicmFyeSAqLwogICAgICAucHJlc2V0cy1zZWN0aW9uW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMjVlZDUxZTA5MV0gewogICAgICAgIG1hcmdpbi1ib3R0b206IDFyZW07CiAgICAgICAgcGFkZGluZzogY2FsYyh2YXIoLS1zcGFjaW5nLCAwLjI1cmVtKSAqIDMpOwogICAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxNDVkZWcsICMwZDExMTcsICMxYzIxMjgpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cywgdmFyKC0tYm94ZWwtYm9yZGVyLXJhZGl1cykpOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICMyYTM0NDE7CiAgICAgICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDhweCk7CiAgICAgICAgYm94LXNoYWRvdzoKICAgICAgICAgIGluc2V0IDAgMCAxNXB4IHJnYmEoMCwgMCwgMCwgMC40KSwKICAgICAgICAgIDAgMnB4IDEwcHggcmdiYSgwLCAwLCAwLCAwLjMpOwogICAgICB9CgogICAgICAucHJlc2V0cy1oZWFkZXJbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0yNWVkNTFlMDkxXSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBtYXJnaW4tYm90dG9tOiAwLjVyZW07CiAgICAgIH0KCiAgICAgIC5wcmVzZXRzLWxhYmVsW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMjVlZDUxZTA5MV0gewogICAgICAgIGZvbnQtc2l6ZTogMC43NXJlbTsKICAgICAgICBjb2xvcjogdmFyKC0tZm9yZWdyb3VuZCwgI2U1ZTdlYik7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07CiAgICAgIH0KCiAgICAgIC5wYXR0ZXJucy1jb3VudFtkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTI1ZWQ1MWUwOTFdIHsKICAgICAgICBmb250LXNpemU6IDAuNjI1cmVtOwogICAgICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQtZm9yZWdyb3VuZCwgI2Y1OWUwYik7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBmb250LWZhbWlseTogdmFyKC0tZm9udC1tb25vLCAnSmV0QnJhaW5zIE1vbm8nLCAnRmlyYSBDb2RlJywgbW9ub3NwYWNlKTsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQsIHJnYmEoMjQ1LCAxNTgsIDExLCAwLjEpKTsKICAgICAgICBwYWRkaW5nOiB2YXIoLS1zcGFjaW5nLCAwLjEyNXJlbSkgY2FsYyh2YXIoLS1zcGFjaW5nLCAwLjI1cmVtKSAqIDEuNSk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXNtLCB2YXIoLS1ib3hlbC1ib3JkZXItcmFkaXVzLXNtKSk7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLCByZ2JhKDI0NSwgMTU4LCAxMSwgMC4yKSk7CiAgICAgIH0KCiAgICAgIC5wcmVzZXQtYnV0dG9uc1tkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTI1ZWQ1MWUwOTFdIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGdhcDogMC41cmVtOwogICAgICAgIG92ZXJmbG93LXg6IGF1dG87CiAgICAgICAgcGFkZGluZy1ib3R0b206IDAuMjVyZW07CiAgICAgICAgbWF4LWhlaWdodDogNjBweDsKICAgICAgfQoKICAgICAgLyogSG9yaXpvbnRhbCBzY3JvbGwgZm9yIHBhdHRlcm4gbGlzdCAqLwogICAgICAucHJlc2V0LWJ1dHRvbnNbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0yNWVkNTFlMDkxXTo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgICAgIGhlaWdodDogM3B4OwogICAgICB9CgogICAgICAucHJlc2V0LWJ1dHRvbnNbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0yNWVkNTFlMDkxXTo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoNTUsIDY1LCA4MSwgMC4zKTsKICAgICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMteHMsIHZhcigtLWJveGVsLWJvcmRlci1yYWRpdXMteHMpKTsKICAgICAgfQoKICAgICAgLnByZXNldC1idXR0b25zW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMjVlZDUxZTA5MV06Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI0NSwgMTU4LCAxMSwgMC41KTsKICAgICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMteHMsIHZhcigtLWJveGVsLWJvcmRlci1yYWRpdXMteHMpKTsKICAgICAgfQoKICAgICAgLnByZXNldC1idXR0b25zW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMjVlZDUxZTA5MV06Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI0NSwgMTU4LCAxMSwgMC43KTsKICAgICAgfQoKICAgICAgLnByZXNldC1idXR0b25bZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0yNWVkNTFlMDkxXSB7CiAgICAgICAgZmxleDogMCAwIGF1dG87CiAgICAgICAgbWluLXdpZHRoOiAxMjBweDsKICAgICAgICBwYWRkaW5nOiBjYWxjKHZhcigtLXNwYWNpbmcsIDAuMjVyZW0pICogMikKICAgICAgICAgIGNhbGModmFyKC0tc3BhY2luZywgMC4yNXJlbSkgKiAzKTsKICAgICAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTQ1ZGVnLCAjMWUyNTMwLCAjMmEzNDQxKTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjM2E0NDUxOwogICAgICAgIGNvbG9yOiB2YXIoLS1zZWNvbmRhcnktZm9yZWdyb3VuZCwgI2ZmZmZmZik7CiAgICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLCB2YXIoLS1ib3hlbC1ib3JkZXItcmFkaXVzKSk7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgYm94LXNoYWRvdzoKICAgICAgICAgIGluc2V0IDAgMCA4cHggcmdiYSgwLCAwLCAwLCAwLjMpLAogICAgICAgICAgMCAycHggNnB4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgfQoKICAgICAgLnByZXNldC1idXR0b25bZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0yNWVkNTFlMDkxXTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKAogICAgICAgICAgLS1zZWNvbmRhcnksCiAgICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjNGI1NTYzIDAlLCAjMzc0MTUxIDEwMCUpCiAgICAgICAgKTsKICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXJpbmcsICNmNTllMGIpOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTsKICAgICAgICBib3gtc2hhZG93OiB2YXIoLS1zaGFkb3ctbWQsIDAgMnB4IDhweCByZ2JhKDI0NSwgMTU4LCAxMSwgMC4yKSk7CiAgICAgICAgZmlsdGVyOiBicmlnaHRuZXNzKDEuMDUpOwogICAgICB9CgogICAgICAucHJlc2V0LWJ1dHRvbi5hY3RpdmUtcGF0dGVybltkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTI1ZWQ1MWUwOTFdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoCiAgICAgICAgICAtLXByaW1hcnksCiAgICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjZjU5ZTBiIDAlLCAjZjk3MzE2IDEwMCUpCiAgICAgICAgKTsKICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXByaW1hcnksICNmNTllMGIpOwogICAgICAgIGNvbG9yOiB2YXIoLS1wcmltYXJ5LWZvcmVncm91bmQsICNmZmZmZmYpOwogICAgICAgIGJveC1zaGFkb3c6IHZhcigtLXNoYWRvdy1sZywgMCAycHggOHB4IHJnYmEoMjQ1LCAxNTgsIDExLCAwLjMpKTsKICAgICAgfQoKICAgICAgLnByZXNldC1idXR0b24uYWN0aXZlLXBhdHRlcm5bZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0yNWVkNTFlMDkxXTo6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAnJzsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwLjI1cmVtOwogICAgICAgIHJpZ2h0OiAwLjI1cmVtOwogICAgICAgIHdpZHRoOiA2cHg7CiAgICAgICAgaGVpZ2h0OiA2cHg7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICBhbmltYXRpb246IGFjdGl2ZS1wdWxzZS1kYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTI1ZWQ1MWUwOTEgMnMgZWFzZS1pbi1vdXQgaW5maW5pdGU7CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgYWN0aXZlLXB1bHNlLWRhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMjVlZDUxZTA5MSB7CiAgICAgICAgMCUsCiAgICAgICAgMTAwJSB7CiAgICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsKICAgICAgICB9CiAgICAgICAgNTAlIHsKICAgICAgICAgIG9wYWNpdHk6IDAuNzsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4yKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC5wcmVzZXQtY29udGVudFtkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTI1ZWQ1MWUwOTFdIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZ2FwOiAwLjI1cmVtOwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KCiAgICAgIC5wcmVzZXQtbmFtZVtkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTI1ZWQ1MWUwOTFdIHsKICAgICAgICBmb250LXNpemU6IDAuNzVyZW07CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBsaW5lLWhlaWdodDogMS4yOwogICAgICAgIGNvbG9yOiBpbmhlcml0OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgIH0KCiAgICAgIC5wcmVzZXQtbWV0YVtkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTI1ZWQ1MWUwOTFdIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGdhcDogMC4yNXJlbTsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIH0KCiAgICAgIC5wcmVzZXQtZ2VucmVbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0yNWVkNTFlMDkxXSB7CiAgICAgICAgZm9udC1zaXplOiAwLjVyZW07CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgxNTYsIDE2MywgMTc1LCAwLjIpOwogICAgICAgIGNvbG9yOiAjZDFkNWRiOwogICAgICAgIHBhZGRpbmc6IDAuMDYyNXJlbSAwLjI1cmVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy14cywgdmFyKC0tYm94ZWwtYm9yZGVyLXJhZGl1cy14cykpOwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogMC4wMjVlbTsKICAgICAgfQoKICAgICAgLnByZXNldC1icG1bZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0yNWVkNTFlMDkxXSB7CiAgICAgICAgZm9udC1zaXplOiAwLjVyZW07CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgzNCwgMjExLCAyMzgsIDAuMik7CiAgICAgICAgY29sb3I6ICMyMmQzZWU7CiAgICAgICAgcGFkZGluZzogMC4wNjI1cmVtIDAuMjVyZW07CiAgICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXhzLCB2YXIoLS1ib3hlbC1ib3JkZXItcmFkaXVzLXhzKSk7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBmb250LWZhbWlseTogJ0pldEJyYWlucyBNb25vJywgbW9ub3NwYWNlOwogICAgICB9CgogICAgICAucHJlc2V0LWJ1dHRvbi5hY3RpdmUtcGF0dGVybiAucHJlc2V0LWdlbnJlW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMjVlZDUxZTA5MV0gewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTsKICAgICAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwogICAgICB9CgogICAgICAucHJlc2V0LWJ1dHRvbi5hY3RpdmUtcGF0dGVybiAucHJlc2V0LWJwbVtkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTI1ZWQ1MWUwOTFdIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7CiAgICAgICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKICAgICAgfQoKICAgICAgLmtpdC1mYWxsYmFja1tkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTI1ZWQ1MWUwOTFdIHsKICAgICAgICBjb2xvcjogIzljYTNhZjsKICAgICAgICBmb250LXNpemU6IDAuNzVyZW07CiAgICAgICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgICB9CgogICAgICAvKiBFbmhhbmNlZCBCZWF0IEdyaWQgKi8KICAgICAgLmJlYXQtZ3JpZFtkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTI1ZWQ1MWUwOTFdIHsKICAgICAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTQ1ZGVnLCAjMGYxNDE5LCAjMWUyNTMwKTsKICAgICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMteGwsIHZhcigtLWJveGVsLWJvcmRlci1yYWRpdXMteGwpKTsKICAgICAgICBwYWRkaW5nOiBjYWxjKHZhcigtLXNwYWNpbmcsIDAuMjVyZW0pICogNCk7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMS41cmVtOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICMyYTM0NDE7CiAgICAgICAgYm94LXNoYWRvdzoKICAgICAgICAgIGluc2V0IDAgMCAyMHB4IHJnYmEoMCwgMCwgMCwgMC42KSwKICAgICAgICAgIDAgNHB4IDIwcHggcmdiYSgwLCAwLCAwLCAwLjUpOwogICAgICB9CgogICAgICAuc3RlcC1udW1iZXJzW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMjVlZDUxZTA5MV0gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBtYXJnaW4tYm90dG9tOiAwLjc1cmVtOwogICAgICAgIGdhcDogMC4yNXJlbTsKICAgICAgfQoKICAgICAgLmluc3RydW1lbnQtY29udHJvbHNbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0yNWVkNTFlMDkxXSB7CiAgICAgICAgd2lkdGg6IDE4MHB4OwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICB9CgogICAgICAuc3RlcC1udW1iZXJbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0yNWVkNTFlMDkxXSB7CiAgICAgICAgd2lkdGg6IDI4cHg7CiAgICAgICAgaGVpZ2h0OiAyMHB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBmb250LXNpemU6IDAuNjI1cmVtOwogICAgICAgIGNvbG9yOiB2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kLCAjNjQ3NDhiKTsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICB9CgogICAgICAuc3RlcC1udW1iZXIuYmVhdC1tYXJrZXJbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0yNWVkNTFlMDkxXSB7CiAgICAgICAgY29sb3I6IHZhcigtLXJpbmcsICNmNTllMGIpOwogICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICAgIH0KCiAgICAgIC5pbnN0cnVtZW50LXJvd1tkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTI1ZWQ1MWUwOTFdIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiAwLjI1cmVtOwogICAgICAgIG1hcmdpbi1ib3R0b206IDAuNzVyZW07CiAgICAgIH0KCiAgICAgIC5pbnN0cnVtZW50LWxhYmVsW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMjVlZDUxZTA5MV0gewogICAgICAgIGZvbnQtc2l6ZTogMC43NXJlbTsKICAgICAgICBmb250LXdlaWdodDogNzAwOwogICAgICAgIGNvbG9yOiB2YXIoLS1mb3JlZ3JvdW5kLCAjZTVlN2ViKTsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07CiAgICAgICAgbWluLXdpZHRoOiA1MHB4OwogICAgICB9CgogICAgICAuaW5zdHJ1bWVudC12b2x1bWVbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0yNWVkNTFlMDkxXSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogMC4yNXJlbTsKICAgICAgICBtYXJnaW4tdG9wOiAwLjI1cmVtOwogICAgICB9CgogICAgICAudm9sdW1lLXNsaWRlci1zbWFsbFtkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTI1ZWQ1MWUwOTFdIHsKICAgICAgICB3aWR0aDogNDBweDsKICAgICAgICBoZWlnaHQ6IDNweDsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1pbnB1dCwgIzM3NDE1MSk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXhzLCB2YXIoLS1ib3hlbC1ib3JkZXItcmFkaXVzLXhzKSk7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICAgIH0KCiAgICAgIC52b2x1bWUtc2xpZGVyLXNtYWxsW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMjVlZDUxZTA5MV06Oi13ZWJraXQtc2xpZGVyLXRodW1iIHsKICAgICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICAgICAgd2lkdGg6IDEycHg7CiAgICAgICAgaGVpZ2h0OiAxMnB4OwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWNoYXJ0LTIsICMzNGQzOTkpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgYm94LXNoYWRvdzogdmFyKC0tc2hhZG93LXhzLCAwIDFweCAycHggcmdiYSgxNSwgMjMsIDQyLCAwLjI1KSk7CiAgICAgIH0KCiAgICAgIC52b2x1bWUtc2xpZGVyLXNtYWxsW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMjVlZDUxZTA5MV06Oi1tb3otcmFuZ2UtdGh1bWIgewogICAgICAgIHdpZHRoOiAxMnB4OwogICAgICAgIGhlaWdodDogMTJweDsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jaGFydC0yLCAjMzRkMzk5KTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICBib3gtc2hhZG93OiB2YXIoLS1zaGFkb3cteHMsIDAgMXB4IDJweCByZ2JhKDE1LCAyMywgNDIsIDAuMjUpKTsKICAgICAgfQoKICAgICAgLnZvbHVtZS12YWx1ZVtkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTI1ZWQ1MWUwOTFdIHsKICAgICAgICBmb250LXNpemU6IDAuNjI1cmVtOwogICAgICAgIGNvbG9yOiB2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kLCAjOWNhM2FmKTsKICAgICAgICBtaW4td2lkdGg6IDI0cHg7CiAgICAgIH0KCiAgICAgIC5pbnN0cnVtZW50LWFjdGlvbnNbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0yNWVkNTFlMDkxXSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBnYXA6IDAuMjVyZW07CiAgICAgICAgbWFyZ2luLXRvcDogMC4yNXJlbTsKICAgICAgfQoKICAgICAgLmFjdGlvbi1idXR0b25bZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0yNWVkNTFlMDkxXSB7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgICAgaGVpZ2h0OiAyMHB4OwogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlciwgIzRiNTU2Myk7CiAgICAgICAgY29sb3I6IHZhcigtLW11dGVkLWZvcmVncm91bmQsICM5Y2EzYWYpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1zbSwgdmFyKC0tYm94ZWwtYm9yZGVyLXJhZGl1cy1zbSkpOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTsKICAgICAgfQoKICAgICAgLmFjdGlvbi1idXR0b25bZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0yNWVkNTFlMDkxXTpob3ZlciB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1yaW5nLCAjNjBhNWZhKTsKICAgICAgICBjb2xvcjogdmFyKC0tcmluZywgIzYwYTVmYSk7CiAgICAgICAgYm94LXNoYWRvdzogdmFyKC0tc2hhZG93LXhzLCAwIDFweCAycHggcmdiYSg5NiwgMTY1LCAyNTAsIDAuMikpOwogICAgICB9CgogICAgICAuYWN0aW9uLWJ1dHRvbiBzdmdbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0yNWVkNTFlMDkxXSB7CiAgICAgICAgd2lkdGg6IDEwcHg7CiAgICAgICAgaGVpZ2h0OiAxMHB4OwogICAgICB9CgogICAgICAuc3RlcC1idXR0b25zW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMjVlZDUxZTA5MV0gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZ2FwOiAwLjI1cmVtOwogICAgICAgIGZsZXg6IDE7CiAgICAgIH0KCiAgICAgIC5zdGVwLWJ1dHRvbltkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTI1ZWQ1MWUwOTFdIHsKICAgICAgICB3aWR0aDogMjhweDsKICAgICAgICBoZWlnaHQ6IDI0cHg7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxNDVkZWcsICMyYTM0NDEsICMxZTI1MzApOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMXMgZWFzZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgYm94LXNoYWRvdzoKICAgICAgICAgIGluc2V0IDAgMCA4cHggcmdiYSgwLCAwLCAwLCAwLjQpLAogICAgICAgICAgMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC42KSwKICAgICAgICAgIDAgMXB4IDJweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7CiAgICAgIH0KCiAgICAgIC5zdGVwLWJ1dHRvbltkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTI1ZWQ1MWUwOTFdOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTQ1ZGVnLCAjM2E0NDUxLCAjMmUzNTQwKTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7CiAgICAgICAgYm94LXNoYWRvdzoKICAgICAgICAgIGluc2V0IDAgMCAxMnB4IHJnYmEoMCwgMCwgMCwgMC4zKSwKICAgICAgICAgIDAgM3B4IDZweCByZ2JhKDAsIDAsIDAsIDAuNyksCiAgICAgICAgICAwIDFweCAzcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KTsKICAgICAgfQoKICAgICAgLyogSW5zdHJ1bWVudC1zcGVjaWZpYyBjb2xvcnMgZm9yIGFjdGl2ZSBzdGVwcyB1c2luZyB0aGVtZSB2YXJpYWJsZXMgKi8KICAgICAgLmJlYXQtZ3JpZCAuaW5zdHJ1bWVudC1yb3c6bnRoLWNoaWxkKDIpIC5zdGVwLWJ1dHRvbi5hY3RpdmVbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0yNWVkNTFlMDkxXSB7CiAgICAgICAgYmFja2dyb3VuZDogcmFkaWFsLWdyYWRpZW50KAogICAgICAgICAgY2lyY2xlLAogICAgICAgICAgdmFyKC0tZGVzdHJ1Y3RpdmUsICNlZjQ0NDQpLAogICAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWRlc3RydWN0aXZlLCAjZWY0NDQ0KSA3MCUsIGJsYWNrKQogICAgICAgICk7CiAgICAgICAgYm94LXNoYWRvdzoKICAgICAgICAgIGluc2V0IDAgMCAxNXB4IHJnYmEoMCwgMCwgMCwgMC4zKSwKICAgICAgICAgIDAgMCAyMHB4CiAgICAgICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1kZXN0cnVjdGl2ZSwgI2VmNDQ0NCkgNDAlLCB0cmFuc3BhcmVudCksCiAgICAgICAgICAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjgpOwogICAgICB9CgogICAgICAuYmVhdC1ncmlkIC5pbnN0cnVtZW50LXJvdzpudGgtY2hpbGQoMykgLnN0ZXAtYnV0dG9uLmFjdGl2ZVtkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTI1ZWQ1MWUwOTFdIHsKICAgICAgICBiYWNrZ3JvdW5kOiByYWRpYWwtZ3JhZGllbnQoCiAgICAgICAgICBjaXJjbGUsCiAgICAgICAgICB2YXIoLS1jaGFydC0xLCAjM2I4MmY2KSwKICAgICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jaGFydC0xLCAjM2I4MmY2KSA3MCUsIGJsYWNrKQogICAgICAgICk7CiAgICAgICAgYm94LXNoYWRvdzoKICAgICAgICAgIGluc2V0IDAgMCAxNXB4IHJnYmEoMCwgMCwgMCwgMC4zKSwKICAgICAgICAgIDAgMCAyMHB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jaGFydC0xLCAjM2I4MmY2KSA0MCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAgIDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuOCk7CiAgICAgIH0KCiAgICAgIC5iZWF0LWdyaWQgLmluc3RydW1lbnQtcm93Om50aC1jaGlsZCg0KSAuc3RlcC1idXR0b24uYWN0aXZlW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMjVlZDUxZTA5MV0gewogICAgICAgIGJhY2tncm91bmQ6IHJhZGlhbC1ncmFkaWVudCgKICAgICAgICAgIGNpcmNsZSwKICAgICAgICAgIHZhcigtLWNoYXJ0LTIsICMxMGI5ODEpLAogICAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNoYXJ0LTIsICMxMGI5ODEpIDcwJSwgYmxhY2spCiAgICAgICAgKTsKICAgICAgICBib3gtc2hhZG93OgogICAgICAgICAgaW5zZXQgMCAwIDE1cHggcmdiYSgwLCAwLCAwLCAwLjMpLAogICAgICAgICAgMCAwIDIwcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNoYXJ0LTIsICMxMGI5ODEpIDQwJSwgdHJhbnNwYXJlbnQpLAogICAgICAgICAgMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC44KTsKICAgICAgfQoKICAgICAgLmJlYXQtZ3JpZCAuaW5zdHJ1bWVudC1yb3c6bnRoLWNoaWxkKDUpIC5zdGVwLWJ1dHRvbi5hY3RpdmVbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0yNWVkNTFlMDkxXSB7CiAgICAgICAgYmFja2dyb3VuZDogcmFkaWFsLWdyYWRpZW50KAogICAgICAgICAgY2lyY2xlLAogICAgICAgICAgdmFyKC0tY2hhcnQtMywgI2Y1OWUwYiksCiAgICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY2hhcnQtMywgI2Y1OWUwYikgNzAlLCBibGFjaykKICAgICAgICApOwogICAgICAgIGJveC1zaGFkb3c6CiAgICAgICAgICBpbnNldCAwIDAgMTVweCByZ2JhKDAsIDAsIDAsIDAuMyksCiAgICAgICAgICAwIDAgMjBweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY2hhcnQtMywgI2Y1OWUwYikgNDAlLCB0cmFuc3BhcmVudCksCiAgICAgICAgICAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjgpOwogICAgICB9CgogICAgICAuYmVhdC1ncmlkIC5pbnN0cnVtZW50LXJvdzpudGgtY2hpbGQoNikgLnN0ZXAtYnV0dG9uLmFjdGl2ZVtkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTI1ZWQ1MWUwOTFdIHsKICAgICAgICBiYWNrZ3JvdW5kOiByYWRpYWwtZ3JhZGllbnQoCiAgICAgICAgICBjaXJjbGUsCiAgICAgICAgICB2YXIoLS1jaGFydC00LCAjOGI1Y2Y2KSwKICAgICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jaGFydC00LCAjOGI1Y2Y2KSA3MCUsIGJsYWNrKQogICAgICAgICk7CiAgICAgICAgYm94LXNoYWRvdzoKICAgICAgICAgIGluc2V0IDAgMCAxNXB4IHJnYmEoMCwgMCwgMCwgMC4zKSwKICAgICAgICAgIDAgMCAyMHB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jaGFydC00LCAjOGI1Y2Y2KSA0MCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAgIDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuOCk7CiAgICAgIH0KCiAgICAgIC5iZWF0LWdyaWQgLmluc3RydW1lbnQtcm93Om50aC1jaGlsZCg3KSAuc3RlcC1idXR0b24uYWN0aXZlW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMjVlZDUxZTA5MV0gewogICAgICAgIGJhY2tncm91bmQ6IHJhZGlhbC1ncmFkaWVudCgKICAgICAgICAgIGNpcmNsZSwKICAgICAgICAgIHZhcigtLWNoYXJ0LTUsICNlYzQ4OTkpLAogICAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNoYXJ0LTUsICNlYzQ4OTkpIDcwJSwgYmxhY2spCiAgICAgICAgKTsKICAgICAgICBib3gtc2hhZG93OgogICAgICAgICAgaW5zZXQgMCAwIDE1cHggcmdiYSgwLCAwLCAwLCAwLjMpLAogICAgICAgICAgMCAwIDIwcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNoYXJ0LTUsICNlYzQ4OTkpIDQwJSwgdHJhbnNwYXJlbnQpLAogICAgICAgICAgMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC44KTsKICAgICAgfQoKICAgICAgLyogRW5oYW5jZWQgY3VycmVudCBzdGVwIHdpdGggaW5zdHJ1bWVudCBjb2xvcnMgKi8KICAgICAgLmluc3RydW1lbnQtcm93IC5zdGVwLWJ1dHRvbi5hY3RpdmUuY3VycmVudFtkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTI1ZWQ1MWUwOTFdIHsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMTUpOwogICAgICB9CgogICAgICAuaW5zdHJ1bWVudC1yb3c6bnRoLWNoaWxkKDEpIC5zdGVwLWJ1dHRvbi5hY3RpdmUuY3VycmVudFtkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTI1ZWQ1MWUwOTFdIHsKICAgICAgICBib3gtc2hhZG93OgogICAgICAgICAgaW5zZXQgMHB4IDBweCAxNnB4IDFweCByZ2IoMjU1IDI1NSAyNTUpLAogICAgICAgICAgMCAwIDE2cHggcmdiYSgyMzksIDY4LCA2OCwgMC44KTsKICAgICAgICBtaXgtYmxlbmQtbW9kZTogc2NyZWVuOwogICAgICB9CgogICAgICAuaW5zdHJ1bWVudC1yb3c6bnRoLWNoaWxkKDIpIC5zdGVwLWJ1dHRvbi5hY3RpdmUuY3VycmVudFtkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTI1ZWQ1MWUwOTFdIHsKICAgICAgICBib3gtc2hhZG93OgogICAgICAgICAgaW5zZXQgMHB4IDBweCAxNnB4IDFweCByZ2IoMjU1IDI1NSAyNTUpLAogICAgICAgICAgMCAwIDE2cHggcmdiYSg1OSwgMTMwLCAyNDYsIDAuOCk7CiAgICAgICAgbWl4LWJsZW5kLW1vZGU6IHNjcmVlbjsKICAgICAgfQoKICAgICAgLmluc3RydW1lbnQtcm93Om50aC1jaGlsZCgzKSAuc3RlcC1idXR0b24uYWN0aXZlLmN1cnJlbnRbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0yNWVkNTFlMDkxXSB7CiAgICAgICAgYm94LXNoYWRvdzoKICAgICAgICAgIGluc2V0IDBweCAwcHggMTZweCAxcHggcmdiKDI1NSAyNTUgMjU1KSwKICAgICAgICAgIDAgMCAxNnB4IHJnYmEoMTYsIDE4NSwgMTI5LCAwLjgpOwogICAgICAgIG1peC1ibGVuZC1tb2RlOiBzY3JlZW47CiAgICAgIH0KCiAgICAgIC5pbnN0cnVtZW50LXJvdzpudGgtY2hpbGQoNCkgLnN0ZXAtYnV0dG9uLmFjdGl2ZS5jdXJyZW50W2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMjVlZDUxZTA5MV0gewogICAgICAgIGJveC1zaGFkb3c6CiAgICAgICAgICBpbnNldCAwcHggMHB4IDE2cHggMXB4IHJnYigyNTUgMjU1IDI1NSksCiAgICAgICAgICAwIDAgMTZweCByZ2JhKDI0NSwgMTU4LCAxMSwgMC44KTsKICAgICAgICBtaXgtYmxlbmQtbW9kZTogc2NyZWVuOwogICAgICB9CgogICAgICAuaW5zdHJ1bWVudC1yb3c6bnRoLWNoaWxkKDUpIC5zdGVwLWJ1dHRvbi5hY3RpdmUuY3VycmVudFtkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTI1ZWQ1MWUwOTFdIHsKICAgICAgICBib3gtc2hhZG93OgogICAgICAgICAgaW5zZXQgMHB4IDBweCAxNnB4IDFweCByZ2IoMjU1IDI1NSAyNTUpLAogICAgICAgICAgMCAwIDE2cHggcmdiYSgxMzksIDkyLCAyNDYsIDAuOCk7CiAgICAgICAgbWl4LWJsZW5kLW1vZGU6IHNjcmVlbjsKICAgICAgfQoKICAgICAgLmluc3RydW1lbnQtcm93Om50aC1jaGlsZCg2KSAuc3RlcC1idXR0b24uYWN0aXZlLmN1cnJlbnRbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0yNWVkNTFlMDkxXSB7CiAgICAgICAgYm94LXNoYWRvdzoKICAgICAgICAgIGluc2V0IDBweCAwcHggMTZweCAxcHggcmdiKDI1NSAyNTUgMjU1KSwKICAgICAgICAgIDAgMCAxNnB4IHJnYmEoMjM2LCA3MiwgMTUzLCAwLjgpOwogICAgICAgIG1peC1ibGVuZC1tb2RlOiBzY3JlZW47CiAgICAgIH0KCiAgICAgIC5zdGVwLWJ1dHRvbi5jdXJyZW50W2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMjVlZDUxZTA5MV0gewogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4xKTsKICAgICAgICBib3gtc2hhZG93OgogICAgICAgICAgaW5zZXQgMCAwIDEycHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLAogICAgICAgICAgMCAwIDI1cHggdmFyKC0tcmluZywgIzYwYTVmYSksCiAgICAgICAgICAwIDRweCAxMnB4IHJnYmEoMCwgMCwgMCwgMC45KTsKICAgICAgfQoKICAgICAgLnN0ZXAtYnV0dG9uLmJlYXQtbWFya2VyW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMjVlZDUxZTA5MV0gewogICAgICAgIGJvcmRlci10b3A6IDJweCBzb2xpZCB2YXIoLS1yaW5nLCAjZjU5ZTBiKTsKICAgICAgfQoKICAgICAgLnN0ZXAtYnV0dG9uLmFjdGl2ZS5jdXJyZW50W2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMjVlZDUxZTA5MV0gewogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4xNSk7CiAgICAgICAgYm94LXNoYWRvdzoKICAgICAgICAgIGluc2V0IDAgMCAyMHB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zKSwKICAgICAgICAgIDAgMCAzMHB4IGN1cnJlbnRDb2xvciwKICAgICAgICAgIDAgNHB4IDE1cHggcmdiYSgwLCAwLCAwLCAwLjkpOwogICAgICAgIGFuaW1hdGlvbjogY3VycmVudC1wdWxzZS1kYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTI1ZWQ1MWUwOTEgMC44cyBlYXNlLWluLW91dCBpbmZpbml0ZSBhbHRlcm5hdGU7CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgY3VycmVudC1wdWxzZS1kYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTI1ZWQ1MWUwOTEgewogICAgICAgIDAlIHsKICAgICAgICAgIGZpbHRlcjogYnJpZ2h0bmVzcygxKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICBmaWx0ZXI6IGJyaWdodG5lc3MoMS4zKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qIEVuaGFuY2VkIEZvb3RlciAqLwogICAgICAuYmVhdC1tYWtlci1mb290ZXJbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0yNWVkNTFlMDkxXSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgfQoKICAgICAgLmZvb3Rlci1pbmZvW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMjVlZDUxZTA5MV0gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDFyZW07CiAgICAgICAgZm9udC1zaXplOiAwLjc1cmVtOwogICAgICB9CgogICAgICAua2l0LWluZm9bZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0yNWVkNTFlMDkxXSwKICAgICAgLnBhdHRlcm4taW5mb1tkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTI1ZWQ1MWUwOTFdIHsKICAgICAgICBjb2xvcjogdmFyKC0tbXV0ZWQtZm9yZWdyb3VuZCwgIzljYTNhZik7CiAgICAgIH0KCiAgICAgIC5zdGF0dXMtcGxheWluZ1tkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTI1ZWQ1MWUwOTFdIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiAwLjM3NXJlbTsKICAgICAgICBjb2xvcjogdmFyKC0tY2hhcnQtMiwgIzEwYjk4MSk7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgfQoKICAgICAgLnN0YXR1cy1zdG9wcGVkW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMjVlZDUxZTA5MV0gewogICAgICAgIGNvbG9yOiB2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kLCAjNjQ3NDhiKTsKICAgICAgfQoKICAgICAgLnB1bHNlLWRvdFtkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTI1ZWQ1MWUwOTFdIHsKICAgICAgICB3aWR0aDogOHB4OwogICAgICAgIGhlaWdodDogOHB4OwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWNoYXJ0LTIsICMxMGI5ODEpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICBhbmltYXRpb246IHB1bHNlLWRhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMjVlZDUxZTA5MSAxLjVzIGVhc2UtaW4tb3V0IGluZmluaXRlOwogICAgICB9CgogICAgICAuc3Itb25seVtkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTI1ZWQ1MWUwOTFdIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgd2lkdGg6IDFweDsKICAgICAgICBoZWlnaHQ6IDFweDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIG1hcmdpbjogLTFweDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGNsaXA6IHJlY3QoMCwgMCwgMCwgMCk7CiAgICAgICAgYm9yZGVyOiAwOwogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIHB1bHNlLWRhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMjVlZDUxZTA5MSB7CiAgICAgICAgMCUsCiAgICAgICAgMTAwJSB7CiAgICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsKICAgICAgICB9CiAgICAgICAgNTAlIHsKICAgICAgICAgIG9wYWNpdHk6IDAuNTsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4yKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qIFJlc3BvbnNpdmUgRGVzaWduICovCiAgICAgIEBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkgewogICAgICAgIC5iZWF0LW1ha2VyLWNhcmRbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0yNWVkNTFlMDkxXSB7CiAgICAgICAgICBwYWRkaW5nOiAxcmVtOwogICAgICAgIH0KCiAgICAgICAgLmJlYXQtbWFrZXItaGVhZGVyW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMjVlZDUxZTA5MV0gewogICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoOwogICAgICAgICAgZ2FwOiAxcmVtOwogICAgICAgIH0KCiAgICAgICAgLmhlYWRlci1jb250cm9sc1tkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTI1ZWQ1MWUwOTFdIHsKICAgICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICB9CgogICAgICAgIC5jb250cm9sLWdyb3VwW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMjVlZDUxZTA5MV0gewogICAgICAgICAgbWluLXdpZHRoOiA2MHB4OwogICAgICAgIH0KCiAgICAgICAgLnNsaWRlcltkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTI1ZWQ1MWUwOTFdIHsKICAgICAgICAgIHdpZHRoOiA1MHB4OwogICAgICAgIH0KCiAgICAgICAgLmluc3RydW1lbnQtY29udHJvbHNbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0yNWVkNTFlMDkxXSB7CiAgICAgICAgICB3aWR0aDogMTQwcHg7CiAgICAgICAgfQoKICAgICAgICAuc3RlcC1idXR0b25bZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0yNWVkNTFlMDkxXSB7CiAgICAgICAgICB3aWR0aDogMjRweDsKICAgICAgICAgIGhlaWdodDogMjBweDsKICAgICAgICB9CgogICAgICAgIC8qIE1vYmlsZSBQYXR0ZXJuIExpYnJhcnkgKi8KICAgICAgICAucHJlc2V0cy1zZWN0aW9uW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMjVlZDUxZTA5MV0gewogICAgICAgICAgcGFkZGluZzogMC41cmVtOwogICAgICAgICAgbWFyZ2luLWJvdHRvbTogMC43NXJlbTsKICAgICAgICB9CgogICAgICAgIC5wcmVzZXRzLWhlYWRlcltkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTI1ZWQ1MWUwOTFdIHsKICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgbWFyZ2luLWJvdHRvbTogMC4zNzVyZW07CiAgICAgICAgfQoKICAgICAgICAucHJlc2V0cy1sYWJlbFtkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTI1ZWQ1MWUwOTFdIHsKICAgICAgICAgIGZvbnQtc2l6ZTogMC42MjVyZW07CiAgICAgICAgfQoKICAgICAgICAucGF0dGVybnMtY291bnRbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0yNWVkNTFlMDkxXSB7CiAgICAgICAgICBmb250LXNpemU6IDAuNXJlbTsKICAgICAgICAgIHBhZGRpbmc6IDAuMDYyNXJlbSAwLjI1cmVtOwogICAgICAgIH0KCiAgICAgICAgLnByZXNldC1idXR0b25zW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMjVlZDUxZTA5MV0gewogICAgICAgICAgZ2FwOiAwLjM3NXJlbTsKICAgICAgICAgIG1heC1oZWlnaHQ6IDUwcHg7CiAgICAgICAgfQoKICAgICAgICAucHJlc2V0LWJ1dHRvbltkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTI1ZWQ1MWUwOTFdIHsKICAgICAgICAgIG1pbi13aWR0aDogMTAwcHg7CiAgICAgICAgICBwYWRkaW5nOiAwLjM3NXJlbSAwLjVyZW07CiAgICAgICAgfQoKICAgICAgICAucHJlc2V0LW5hbWVbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0yNWVkNTFlMDkxXSB7CiAgICAgICAgICBmb250LXNpemU6IDAuNjI1cmVtOwogICAgICAgIH0KCiAgICAgICAgLnByZXNldC1nZW5yZVtkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTI1ZWQ1MWUwOTFdLAogICAgICAgIC5wcmVzZXQtYnBtW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMjVlZDUxZTA5MV0gewogICAgICAgICAgZm9udC1zaXplOiAwLjQzNzVyZW07CiAgICAgICAgICBwYWRkaW5nOiAwLjA2MjVyZW0gMC4xODc1cmVtOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQG1lZGlhIChtYXgtd2lkdGg6IDQ4MHB4KSB7CiAgICAgICAgLnByZXNldC1idXR0b25bZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0yNWVkNTFlMDkxXSB7CiAgICAgICAgICBtaW4td2lkdGg6IDkwcHg7CiAgICAgICAgICBwYWRkaW5nOiAwLjI1cmVtIDAuMzc1cmVtOwogICAgICAgIH0KCiAgICAgICAgLnByZXNldC1uYW1lW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMjVlZDUxZTA5MV0gewogICAgICAgICAgZm9udC1zaXplOiAwLjU2MjVyZW07CiAgICAgICAgfQoKICAgICAgICAucGF0dGVybnMtY291bnRbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0yNWVkNTFlMDkxXSB7CiAgICAgICAgICBmb250LXNpemU6IDAuNDM3NXJlbTsKICAgICAgICAgIHBhZGRpbmc6IDAuMDYyNXJlbSAwLjE4NzVyZW07CiAgICAgICAgfQogICAgICB9CgogICAgICAvKiBMYXJnZSBzY3JlZW4gb3B0aW1pemF0aW9ucyAqLwogICAgICBAbWVkaWEgKG1pbi13aWR0aDogMTIwMHB4KSB7CiAgICAgICAgLnByZXNldC1idXR0b25zW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMjVlZDUxZTA5MV0gewogICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgyMDBweCwgMWZyKSk7CiAgICAgICAgICBtYXgtaGVpZ2h0OiAyMjBweDsKICAgICAgICB9CiAgICAgIH0KICAgIA%3D%3D.glimmer-scoped.css"; +import "./beat-maker.gts.CiAgICAgICAgLmZpdHRlZC1jb250YWluZXJbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0xZGJiNzg0NjExXSB7CiAgICAgICAgICBjb250YWluZXItdHlwZTogc2l6ZTsKICAgICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgICAgZm9udC1mYW1pbHk6ICdKZXRCcmFpbnMgTW9ubycsICdGaXJhIENvZGUnLCBtb25vc3BhY2U7CiAgICAgICAgfQoKICAgICAgICAvKiBIaWRlIGFsbCBieSBkZWZhdWx0ICovCiAgICAgICAgLmJhZGdlLWZvcm1hdFtkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTFkYmI3ODQ2MTFdLAogICAgICAgIC5zdHJpcC1mb3JtYXRbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0xZGJiNzg0NjExXSwKICAgICAgICAudGlsZS1mb3JtYXRbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0xZGJiNzg0NjExXSwKICAgICAgICAuY2FyZC1mb3JtYXRbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0xZGJiNzg0NjExXSB7CiAgICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgICBwYWRkaW5nOiBjbGFtcCgwLjE4NzVyZW0sIDIlLCAwLjYyNXJlbSk7CiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgIzBmMTcyYSAwJSwgIzFlMjkzYiAxMDAlKTsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy14bCwgdmFyKC0tYm94ZWwtYm9yZGVyLXJhZGl1cy14bCkpOwogICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB9CgogICAgICAgIC8qIEJhZGdlIEZvcm1hdCAo4omkMTUwcHggd2lkdGgsIOKJpDE2OXB4IGhlaWdodCkgKi8KICAgICAgICBAY29udGFpbmVyIChtYXgtd2lkdGg6IDE1MHB4KSBhbmQgKG1heC1oZWlnaHQ6IDE2OXB4KSB7CiAgICAgICAgICAuYmFkZ2UtZm9ybWF0W2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMWRiYjc4NDYxMV0gewogICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLmJhZGdlLWNvbnRlbnRbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0xZGJiNzg0NjExXSB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgIGdhcDogMC41cmVtOwogICAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgfQoKICAgICAgICAuYmFkZ2UtaWNvbltkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTFkYmI3ODQ2MTFdIHsKICAgICAgICAgIHdpZHRoOiAyNHB4OwogICAgICAgICAgaGVpZ2h0OiAyNHB4OwogICAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgfQoKICAgICAgICAuYmVhdC1ncmlkLW1pbmlbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0xZGJiNzg0NjExXSB7CiAgICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMiwgOHB4KTsKICAgICAgICAgIGdyaWQtdGVtcGxhdGUtcm93czogcmVwZWF0KDIsIDhweCk7CiAgICAgICAgICBnYXA6IDJweDsKICAgICAgICB9CgogICAgICAgIC5iZWF0LWRvdFtkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTFkYmI3ODQ2MTFdIHsKICAgICAgICAgIHdpZHRoOiA4cHg7CiAgICAgICAgICBoZWlnaHQ6IDhweDsKICAgICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjQ1LCAxNTgsIDExLCAwLjMpOwogICAgICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXhzLCB2YXIoLS1ib3hlbC1ib3JkZXItcmFkaXVzLXhzKSk7CiAgICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlOwogICAgICAgIH0KCiAgICAgICAgLmJlYXQtZG90LmFjdGl2ZVtkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTFkYmI3ODQ2MTFdIHsKICAgICAgICAgIGJhY2tncm91bmQ6ICNmNTllMGI7CiAgICAgICAgICBib3gtc2hhZG93OiAwIDAgNnB4IHJnYmEoMjQ1LCAxNTgsIDExLCAwLjYpOwogICAgICAgICAgYW5pbWF0aW9uOiBiZWF0LXB1bHNlLWRhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMWRiYjc4NDYxMSAxLjVzIGVhc2UtaW4tb3V0IGluZmluaXRlOwogICAgICAgIH0KCiAgICAgICAgQGtleWZyYW1lcyBiZWF0LXB1bHNlLWRhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMWRiYjc4NDYxMSB7CiAgICAgICAgICAwJSwKICAgICAgICAgIDEwMCUgewogICAgICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgICAgfQogICAgICAgICAgNTAlIHsKICAgICAgICAgICAgb3BhY2l0eTogMC42OwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLmJhZGdlLWluZm9bZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0xZGJiNzg0NjExXSB7CiAgICAgICAgICBmbGV4OiAxOwogICAgICAgICAgbWluLXdpZHRoOiAwOwogICAgICAgIH0KCiAgICAgICAgLmJhZGdlLXRpdGxlW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMWRiYjc4NDYxMV0gewogICAgICAgICAgZm9udC1zaXplOiAwLjc1cmVtOwogICAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgICAgICAgIGNvbG9yOiAjZjU5ZTBiOwogICAgICAgICAgbGluZS1oZWlnaHQ6IDEuMjsKICAgICAgICAgIG1hcmdpbi1ib3R0b206IDAuMTI1cmVtOwogICAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICB9CgogICAgICAgIC5iYWRnZS1zdGF0c1tkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTFkYmI3ODQ2MTFdIHsKICAgICAgICAgIGZvbnQtc2l6ZTogMC42MjVyZW07CiAgICAgICAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpOwogICAgICAgICAgZm9udC1mYW1pbHk6ICdKZXRCcmFpbnMgTW9ubycsIG1vbm9zcGFjZTsKICAgICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgfQoKICAgICAgICAvKiBTdHJpcCBGb3JtYXQgKDE1MXB4LTM5OXB4IHdpZHRoLCDiiaQxNjlweCBoZWlnaHQpICovCiAgICAgICAgQGNvbnRhaW5lciAobWluLXdpZHRoOiAxNTFweCkgYW5kIChtYXgtaGVpZ2h0OiAxNjlweCkgewogICAgICAgICAgLnN0cmlwLWZvcm1hdFtkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTFkYmI3ODQ2MTFdIHsKICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC5zdHJpcC1jb250ZW50W2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMWRiYjc4NDYxMV0gewogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICBnYXA6IDFyZW07CiAgICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB9CgogICAgICAgIC5zdHJpcC12aXN1YWxbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0xZGJiNzg0NjExXSB7CiAgICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICB9CgogICAgICAgIC5iZWF0LXZpc3VhbGl6ZXJbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0xZGJiNzg0NjExXSB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtZW5kOwogICAgICAgICAgZ2FwOiAycHg7CiAgICAgICAgICBoZWlnaHQ6IDI0cHg7CiAgICAgICAgICB3aWR0aDogMzJweDsKICAgICAgICB9CgogICAgICAgIC5iZWF0LWJhcltkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTFkYmI3ODQ2MTFdIHsKICAgICAgICAgIHdpZHRoOiA0cHg7CiAgICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI0NSwgMTU4LCAxMSwgMC4zKTsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy14cywgdmFyKC0tYm94ZWwtYm9yZGVyLXJhZGl1cy14cykpOwogICAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTsKICAgICAgICB9CgogICAgICAgIC5iZWF0LWJhcltkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTFkYmI3ODQ2MTFdOm50aC1jaGlsZCgxKSB7CiAgICAgICAgICBoZWlnaHQ6IDYwJTsKICAgICAgICB9CiAgICAgICAgLmJlYXQtYmFyW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMWRiYjc4NDYxMV06bnRoLWNoaWxkKDIpIHsKICAgICAgICAgIGhlaWdodDogMzAlOwogICAgICAgIH0KICAgICAgICAuYmVhdC1iYXJbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0xZGJiNzg0NjExXTpudGgtY2hpbGQoMykgewogICAgICAgICAgaGVpZ2h0OiA4MCU7CiAgICAgICAgfQogICAgICAgIC5iZWF0LWJhcltkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTFkYmI3ODQ2MTFdOm50aC1jaGlsZCg0KSB7CiAgICAgICAgICBoZWlnaHQ6IDQwJTsKICAgICAgICB9CiAgICAgICAgLmJlYXQtYmFyW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMWRiYjc4NDYxMV06bnRoLWNoaWxkKDUpIHsKICAgICAgICAgIGhlaWdodDogNzAlOwogICAgICAgIH0KCiAgICAgICAgLmJlYXQtYmFyLmFjdGl2ZVtkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTFkYmI3ODQ2MTFdIHsKICAgICAgICAgIGJhY2tncm91bmQ6ICNmNTllMGI7CiAgICAgICAgICBhbmltYXRpb246IGJhci1wdWxzZS1kYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTFkYmI3ODQ2MTEgMS4ycyBlYXNlLWluLW91dCBpbmZpbml0ZTsKICAgICAgICB9CgogICAgICAgIEBrZXlmcmFtZXMgYmFyLXB1bHNlLWRhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMWRiYjc4NDYxMSB7CiAgICAgICAgICAwJSwKICAgICAgICAgIDEwMCUgewogICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWSgxKTsKICAgICAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICAgIH0KICAgICAgICAgIDUwJSB7CiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVZKDEuNCk7CiAgICAgICAgICAgIG9wYWNpdHk6IDAuODsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC5zdHJpcC1pbmZvW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMWRiYjc4NDYxMV0gewogICAgICAgICAgZmxleDogMTsKICAgICAgICAgIG1pbi13aWR0aDogMDsKICAgICAgICB9CgogICAgICAgIC5zdHJpcC10aXRsZVtkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTFkYmI3ODQ2MTFdIHsKICAgICAgICAgIGZvbnQtc2l6ZTogMC44NzVyZW07CiAgICAgICAgICBmb250LXdlaWdodDogNzAwOwogICAgICAgICAgY29sb3I6ICNmNTllMGI7CiAgICAgICAgICBsaW5lLWhlaWdodDogMS4yOwogICAgICAgICAgbWFyZ2luLWJvdHRvbTogMC4yNXJlbTsKICAgICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgfQoKICAgICAgICAuc3RyaXAtZGVzY3JpcHRpb25bZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0xZGJiNzg0NjExXSB7CiAgICAgICAgICBmb250LXNpemU6IDAuNzVyZW07CiAgICAgICAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpOwogICAgICAgICAgZm9udC1mYW1pbHk6ICdKZXRCcmFpbnMgTW9ubycsIG1vbm9zcGFjZTsKICAgICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgfQoKICAgICAgICAuc3RyaXAtYmFkZ2VbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0xZGJiNzg0NjExXSB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgIGdhcDogMC4yNXJlbTsKICAgICAgICAgIHBhZGRpbmc6IDAuMjVyZW0gMC41cmVtOwogICAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyMzksIDY4LCA2OCwgMC4yKTsKICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNlZjQ0NDQ7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMsIHZhcigtLWJveGVsLWJvcmRlci1yYWRpdXMpKTsKICAgICAgICAgIGZvbnQtc2l6ZTogMC42MjVyZW07CiAgICAgICAgICBmb250LXdlaWdodDogNzAwOwogICAgICAgICAgY29sb3I6ICNlZjQ0NDQ7CiAgICAgICAgICBmb250LWZhbWlseTogJ0pldEJyYWlucyBNb25vJywgbW9ub3NwYWNlOwogICAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgfQoKICAgICAgICAucmVjLWluZGljYXRvcltkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTFkYmI3ODQ2MTFdIHsKICAgICAgICAgIHdpZHRoOiA2cHg7CiAgICAgICAgICBoZWlnaHQ6IDZweDsKICAgICAgICAgIGJhY2tncm91bmQ6ICNlZjQ0NDQ7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgICBhbmltYXRpb246IHJlYy1wdWxzZS1kYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTFkYmI3ODQ2MTEgMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7CiAgICAgICAgfQoKICAgICAgICBAa2V5ZnJhbWVzIHJlYy1wdWxzZS1kYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTFkYmI3ODQ2MTEgewogICAgICAgICAgMCUsCiAgICAgICAgICAxMDAlIHsKICAgICAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsKICAgICAgICAgIH0KICAgICAgICAgIDUwJSB7CiAgICAgICAgICAgIG9wYWNpdHk6IDAuNDsKICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjIpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyogVGlsZSBGb3JtYXQgKOKJpDM5OXB4IHdpZHRoLCDiiaUxNzBweCBoZWlnaHQpICovCiAgICAgICAgQGNvbnRhaW5lciAobWF4LXdpZHRoOiAzOTlweCkgYW5kIChtaW4taGVpZ2h0OiAxNzBweCkgewogICAgICAgICAgLnRpbGUtZm9ybWF0W2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMWRiYjc4NDYxMV0gewogICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLnRpbGUtaGVhZGVyW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMWRiYjc4NDYxMV0gewogICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgaGVpZ2h0OiA3MHB4OwogICAgICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgI2Y1OWUwYiAwJSwgI2Y5NzMxNiAxMDAlKTsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxcmVtOwogICAgICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWxnLCB2YXIoLS1ib3hlbC1ib3JkZXItcmFkaXVzLWxnKSk7CiAgICAgICAgfQoKICAgICAgICAuc2VxdWVuY2VyLWdyaWRbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0xZGJiNzg0NjExXSB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgIGdhcDogM3B4OwogICAgICAgIH0KCiAgICAgICAgLnNlcS1yb3dbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0xZGJiNzg0NjExXSB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZ2FwOiAzcHg7CiAgICAgICAgfQoKICAgICAgICAuc2VxLXN0ZXBbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0xZGJiNzg0NjExXSB7CiAgICAgICAgICB3aWR0aDogOHB4OwogICAgICAgICAgaGVpZ2h0OiA4cHg7CiAgICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyk7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMteHMsIHZhcigtLWJveGVsLWJvcmRlci1yYWRpdXMteHMpKTsKICAgICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7CiAgICAgICAgfQoKICAgICAgICAuc2VxLXN0ZXAuYWN0aXZlW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMWRiYjc4NDYxMV0gewogICAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwogICAgICAgICAgYm94LXNoYWRvdzogMCAwIDRweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOCk7CiAgICAgICAgfQoKICAgICAgICAudGlsZS1iYWRnZVtkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTFkYmI3ODQ2MTFdIHsKICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgIHRvcDogMC41cmVtOwogICAgICAgICAgcmlnaHQ6IDAuNXJlbTsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgZ2FwOiAwLjI1cmVtOwogICAgICAgICAgcGFkZGluZzogMC4yNXJlbSAwLjVyZW07CiAgICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7CiAgICAgICAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoOHB4KTsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cywgdmFyKC0tYm94ZWwtYm9yZGVyLXJhZGl1cykpOwogICAgICAgICAgZm9udC1zaXplOiAwLjYyNXJlbTsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgICAgICBmb250LWZhbWlseTogJ0pldEJyYWlucyBNb25vJywgbW9ub3NwYWNlOwogICAgICAgIH0KCiAgICAgICAgLmxpdmUtZG90W2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMWRiYjc4NDYxMV0gewogICAgICAgICAgd2lkdGg6IDZweDsKICAgICAgICAgIGhlaWdodDogNnB4OwogICAgICAgICAgYmFja2dyb3VuZDogIzIyZDNlZTsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICAgIGFuaW1hdGlvbjogbGl2ZS1wdWxzZS1kYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTFkYmI3ODQ2MTEgMnMgZWFzZS1pbi1vdXQgaW5maW5pdGU7CiAgICAgICAgfQoKICAgICAgICBAa2V5ZnJhbWVzIGxpdmUtcHVsc2UtZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0xZGJiNzg0NjExIHsKICAgICAgICAgIDAlLAogICAgICAgICAgMTAwJSB7CiAgICAgICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7CiAgICAgICAgICB9CiAgICAgICAgICA1MCUgewogICAgICAgICAgICBvcGFjaXR5OiAwLjY7CiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4yKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC50aWxlLWNvbnRlbnRbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0xZGJiNzg0NjExXSB7CiAgICAgICAgICBmbGV4OiAxOwogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgICBnYXA6IDFyZW07CiAgICAgICAgfQoKICAgICAgICAudGlsZS10aXRsZVtkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTFkYmI3ODQ2MTFdIHsKICAgICAgICAgIGZvbnQtc2l6ZTogMXJlbTsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICAgICAgICBjb2xvcjogI2Y1OWUwYjsKICAgICAgICAgIG1hcmdpbjogMDsKICAgICAgICAgIGxpbmUtaGVpZ2h0OiAxLjI7CiAgICAgICAgfQoKICAgICAgICAudGlsZS1zcGVjc1tkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTFkYmI3ODQ2MTFdIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgZ2FwOiAwLjVyZW07CiAgICAgICAgfQoKICAgICAgICAuc3BlYy1yb3dbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0xZGJiNzg0NjExXSB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICB9CgogICAgICAgIC5zcGVjLWxhYmVsW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMWRiYjc4NDYxMV0gewogICAgICAgICAgZm9udC1zaXplOiAwLjc1cmVtOwogICAgICAgICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KTsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgfQoKICAgICAgICAuc3BlYy12YWx1ZVtkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTFkYmI3ODQ2MTFdIHsKICAgICAgICAgIGZvbnQtc2l6ZTogMC44NzVyZW07CiAgICAgICAgICBjb2xvcjogI2Y1OWUwYjsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgICBmb250LWZhbWlseTogJ0pldEJyYWlucyBNb25vJywgbW9ub3NwYWNlOwogICAgICAgIH0KCiAgICAgICAgLnRpbGUtZmVhdHVyZXNbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0xZGJiNzg0NjExXSB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgICAgZ2FwOiAwLjM3NXJlbTsKICAgICAgICAgIG1hcmdpbi10b3A6IGF1dG87CiAgICAgICAgfQoKICAgICAgICAuZmVhdHVyZS10YWdbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0xZGJiNzg0NjExXSB7CiAgICAgICAgICBwYWRkaW5nOiAwLjI1cmVtIDAuNXJlbTsKICAgICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjQ1LCAxNTgsIDExLCAwLjIpOwogICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2Y1OWUwYjsKICAgICAgICAgIGNvbG9yOiAjZjU5ZTBiOwogICAgICAgICAgZm9udC1zaXplOiAwLjYyNXJlbTsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtc20sIHZhcigtLWJveGVsLWJvcmRlci1yYWRpdXMtc20pKTsKICAgICAgICAgIGZvbnQtZmFtaWx5OiAnSmV0QnJhaW5zIE1vbm8nLCBtb25vc3BhY2U7CiAgICAgICAgfQoKICAgICAgICAvKiBDYXJkIEZvcm1hdCAo4omlNDAwcHggd2lkdGgsIOKJpTE3MHB4IGhlaWdodCkgKi8KICAgICAgICBAY29udGFpbmVyIChtaW4td2lkdGg6IDQwMHB4KSBhbmQgKG1pbi1oZWlnaHQ6IDE3MHB4KSB7CiAgICAgICAgICAuY2FyZC1mb3JtYXRbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0xZGJiNzg0NjExXSB7CiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAuY2FyZC1oZWFkZXJbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0xZGJiNzg0NjExXSB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsICNmNTllMGIgMCUsICNmOTczMTYgMTAwJSk7CiAgICAgICAgICBwYWRkaW5nOiAxcmVtOwogICAgICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWxnLCB2YXIoLS1ib3hlbC1ib3JkZXItcmFkaXVzLWxnKSk7CiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxcmVtOwogICAgICAgIH0KCiAgICAgICAgLmNhcmQtaW5mb1tkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTFkYmI3ODQ2MTFdIHsKICAgICAgICAgIGZsZXg6IDE7CiAgICAgICAgfQoKICAgICAgICAuY2FyZC10aXRsZVtkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTFkYmI3ODQ2MTFdIHsKICAgICAgICAgIGZvbnQtc2l6ZTogMS4yNXJlbTsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgICAgICBtYXJnaW46IDAgMCAwLjVyZW0gMDsKICAgICAgICAgIGxpbmUtaGVpZ2h0OiAxLjI7CiAgICAgICAgfQoKICAgICAgICAuY2FyZC1kZXNjcmlwdGlvbltkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTFkYmI3ODQ2MTFdIHsKICAgICAgICAgIGZvbnQtc2l6ZTogMC44NzVyZW07CiAgICAgICAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwogICAgICAgICAgbWFyZ2luOiAwOwogICAgICAgICAgbGluZS1oZWlnaHQ6IDEuNDsKICAgICAgICB9CgogICAgICAgIC5kcnVtLW1hY2hpbmVbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0xZGJiNzg0NjExXSB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgIGdhcDogMC41cmVtOwogICAgICAgICAgcGFkZGluZzogMC43NXJlbTsKICAgICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMTUsIDIzLCA0MiwgMC43KTsKICAgICAgICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig4cHgpOwogICAgICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWxnLCB2YXIoLS1ib3hlbC1ib3JkZXItcmFkaXVzLWxnKSk7CiAgICAgICAgICBtaW4td2lkdGg6IDEyMHB4OwogICAgICAgIH0KCiAgICAgICAgLm1hY2hpbmUtZGlzcGxheVtkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTFkYmI3ODQ2MTFdIHsKICAgICAgICAgIGJhY2tncm91bmQ6ICMwZjE3MmE7CiAgICAgICAgICBwYWRkaW5nOiAwLjVyZW07CiAgICAgICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtc20sIHZhcigtLWJveGVsLWJvcmRlci1yYWRpdXMtc20pKTsKICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjQ1LCAxNTgsIDExLCAwLjMpOwogICAgICAgIH0KCiAgICAgICAgLmRpc3BsYXktbGluZVtkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTFkYmI3ODQ2MTFdIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgbWFyZ2luLWJvdHRvbTogMC4yNXJlbTsKICAgICAgICB9CgogICAgICAgIC5kaXNwbGF5LWxpbmVbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0xZGJiNzg0NjExXTpsYXN0LWNoaWxkIHsKICAgICAgICAgIG1hcmdpbi1ib3R0b206IDA7CiAgICAgICAgfQoKICAgICAgICAucGFyYW0tbGFiZWxbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0xZGJiNzg0NjExXSB7CiAgICAgICAgICBmb250LXNpemU6IDAuNjI1cmVtOwogICAgICAgICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42KTsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgfQoKICAgICAgICAucGFyYW0tdmFsdWVbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0xZGJiNzg0NjExXSB7CiAgICAgICAgICBmb250LXNpemU6IDAuNzVyZW07CiAgICAgICAgICBjb2xvcjogI2Y1OWUwYjsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICAgICAgICBmb250LWZhbWlseTogJ0pldEJyYWlucyBNb25vJywgbW9ub3NwYWNlOwogICAgICAgIH0KCiAgICAgICAgLm1hY2hpbmUtY29udHJvbHNbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0xZGJiNzg0NjExXSB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgICAgZ2FwOiAwLjI1cmVtOwogICAgICAgIH0KCiAgICAgICAgLmNvbnRyb2wta25vYltkYXRhLXNjb3BlZGNzcy01OGRjMmUzOTdiLTFkYmI3ODQ2MTFdIHsKICAgICAgICAgIHdpZHRoOiAxNnB4OwogICAgICAgICAgaGVpZ2h0OiAxNnB4OwogICAgICAgICAgYmFja2dyb3VuZDogIzM3NDE1MTsKICAgICAgICAgIGJvcmRlcjogMnB4IHNvbGlkICNmNTllMGI7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgfQoKICAgICAgICAuY29udHJvbC1rbm9iW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMWRiYjc4NDYxMV06OmFmdGVyIHsKICAgICAgICAgIGNvbnRlbnQ6ICcnOwogICAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgICAgdG9wOiAycHg7CiAgICAgICAgICBsZWZ0OiA1MCU7CiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICAgICAgICB3aWR0aDogMnB4OwogICAgICAgICAgaGVpZ2h0OiA2cHg7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAjZjU5ZTBiOwogICAgICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXh4cywgdmFyKC0tYm94ZWwtYm9yZGVyLXJhZGl1cy14eHMpKTsKICAgICAgICB9CgogICAgICAgIC5jYXJkLWdyaWRbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0xZGJiNzg0NjExXSB7CiAgICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMywgMWZyKTsKICAgICAgICAgIGdhcDogMXJlbTsKICAgICAgICAgIG1hcmdpbi1ib3R0b206IDFyZW07CiAgICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI0OCwgMjUwLCAyNTIsIDAuMSk7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbGcsIHZhcigtLWJveGVsLWJvcmRlci1yYWRpdXMtbGcpKTsKICAgICAgICAgIHBhZGRpbmc6IDFyZW07CiAgICAgICAgfQoKICAgICAgICAuZ3JpZC1zZWN0aW9uW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMWRiYjc4NDYxMV0gewogICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIH0KCiAgICAgICAgLnNlY3Rpb24tdGl0bGVbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0xZGJiNzg0NjExXSB7CiAgICAgICAgICBmb250LXNpemU6IDAuNzVyZW07CiAgICAgICAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpOwogICAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICAgIG1hcmdpbi1ib3R0b206IDAuNXJlbTsKICAgICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgICAgICBsZXR0ZXItc3BhY2luZzogMC4wNWVtOwogICAgICAgIH0KCiAgICAgICAgLnBhdHRlcm4tY291bnRbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0xZGJiNzg0NjExXSB7CiAgICAgICAgICBmb250LXNpemU6IDFyZW07CiAgICAgICAgICBjb2xvcjogI2Y1OWUwYjsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICAgICAgICBmb250LWZhbWlseTogJ0pldEJyYWlucyBNb25vJywgbW9ub3NwYWNlOwogICAgICAgIH0KCiAgICAgICAgLmNhcmQtZmVhdHVyZXNbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0xZGJiNzg0NjExXSB7CiAgICAgICAgICBtYXJnaW4tdG9wOiBhdXRvOwogICAgICAgIH0KCiAgICAgICAgLmZlYXR1cmVzLWxhYmVsW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMWRiYjc4NDYxMV0gewogICAgICAgICAgZm9udC1zaXplOiAwLjc1cmVtOwogICAgICAgICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KTsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAwLjVyZW07CiAgICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTsKICAgICAgICB9CgogICAgICAgIC5mZWF0dXJlLWxpc3RbZGF0YS1zY29wZWRjc3MtNThkYzJlMzk3Yi0xZGJiNzg0NjExXSB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgICAgZ2FwOiAwLjVyZW07CiAgICAgICAgfQoKICAgICAgICAuZmVhdHVyZS1waWxsW2RhdGEtc2NvcGVkY3NzLTU4ZGMyZTM5N2ItMWRiYjc4NDYxMV0gewogICAgICAgICAgcGFkZGluZzogMC4zNzVyZW0gMC43NXJlbTsKICAgICAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsICNmNTllMGIgMCUsICNmOTczMTYgMTAwJSk7CiAgICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgICAgICBmb250LXNpemU6IDAuNzVyZW07CiAgICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLCB2YXIoLS1ib3hlbC1ib3JkZXItcmFkaXVzKSk7CiAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7CiAgICAgICAgfQogICAgICA%3D.glimmer-scoped.css"; +export class DrumKitField extends FieldDef { + static displayName = 'Drum Kit'; + static icon = MusicIcon; + static { + dt7948.g(this.prototype, "kitName", [field], function () { + return contains(StringField); + }); + } + #kitName = (dt7948.i(this, "kitName"), void 0); + static { + dt7948.g(this.prototype, "kickParams", [field], function () { + return contains(StringField); + }); + } + #kickParams = (dt7948.i(this, "kickParams"), void 0); + static { + dt7948.g(this.prototype, "snareParams", [field], function () { + return contains(StringField); + }); + } + #snareParams = (dt7948.i(this, "snareParams"), void 0); + static { + dt7948.g(this.prototype, "hihatParams", [field], function () { + return contains(StringField); + }); + } + #hihatParams = (dt7948.i(this, "hihatParams"), void 0); + static { + dt7948.g(this.prototype, "openhatParams", [field], function () { + return contains(StringField); + }); + } + #openhatParams = (dt7948.i(this, "openhatParams"), void 0); + static { + dt7948.g(this.prototype, "clapParams", [field], function () { + return contains(StringField); + }); + } + #clapParams = (dt7948.i(this, "clapParams"), void 0); + static { + dt7948.g(this.prototype, "crashParams", [field], function () { + return contains(StringField); + }); + } + #crashParams = (dt7948.i(this, "crashParams"), void 0); + // ⁹⁰ Parse sound parameters from JSON strings + get soundParams() { + try { + return { + kick: JSON.parse(this.kickParams || '{"type": "808", "frequency": 60, "decay": 0.3}'), + snare: JSON.parse(this.snareParams || '{"type": "808", "frequency": 200, "decay": 0.1}'), + hihat: JSON.parse(this.hihatParams || '{"type": "808", "frequency": 8000, "decay": 0.05}'), + openhat: JSON.parse(this.openhatParams || '{"type": "808", "frequency": 6000, "decay": 0.3}'), + clap: JSON.parse(this.clapParams || '{"type": "808", "frequency": 2000, "decay": 0.1}'), + crash: JSON.parse(this.crashParams || '{"type": "808", "frequency": 3000, "decay": 1.0}') + }; + } catch (e) { + console.error('Error parsing sound parameters:', e); + return { + kick: { + type: '808', + frequency: 60, + decay: 0.3 + }, + snare: { + type: '808', + frequency: 200, + decay: 0.1 + }, + hihat: { + type: '808', + frequency: 8000, + decay: 0.05 + }, + openhat: { + type: '808', + frequency: 6000, + decay: 0.3 + }, + clap: { + type: '808', + frequency: 2000, + decay: 0.1 + }, + crash: { + type: '808', + frequency: 3000, + decay: 1.0 + } + }; + } + } + static embedded = class Embedded extends Component { + static { + setComponentTemplate(createTemplateFactory( + /* + +
+
{{if + @model.kitName + @model.kitName + 'Unnamed Kit' + }}
+
+ {{@model.soundParams.kick.type}} Style +
+
+ + + + */ + { + "id": "7n2Kw0b+", + "block": "[[[1,\"\\n \"],[10,0],[14,0,\"drum-kit-field\"],[14,\"data-scopedcss-58dc2e397b-47eb167c02\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"kit-name\"],[14,\"data-scopedcss-58dc2e397b-47eb167c02\",\"\"],[12],[1,[52,[30,1,[\"kitName\"]],[30,1,[\"kitName\"]],\"Unnamed Kit\"]],[13],[1,\"\\n \"],[10,0],[14,0,\"kit-preview\"],[14,\"data-scopedcss-58dc2e397b-47eb167c02\",\"\"],[12],[1,\"\\n \"],[10,1],[14,0,\"kit-type\"],[14,\"data-scopedcss-58dc2e397b-47eb167c02\",\"\"],[12],[1,[30,1,[\"soundParams\",\"kick\",\"type\"]]],[1,\" Style\"],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[13],[1,\"\\n\\n \"],[1,\"\\n \"]],[\"@model\"],false,[\"if\"]]", + "moduleName": "/Users/richardtan/Desktop/boxel/packages/realm-server/beat-maker/beat-maker.gts", + "isStrictMode": true + }), this); + } + }; +} +// ⁹¹ Drum Kit Card Definition - stores complete drum kits as cards +export class DrumKitCard extends CardDef { + static displayName = 'Drum Kit'; + static icon = MusicIcon; + static { + dt7948.g(this.prototype, "kitName", [field], function () { + return contains(StringField); + }); + } + #kitName = (dt7948.i(this, "kitName"), void 0); + static { + dt7948.g(this.prototype, "description", [field], function () { + return contains(StringField); + }); + } + #description = (dt7948.i(this, "description"), void 0); + static { + dt7948.g(this.prototype, "category", [field], function () { + return contains(StringField); + }); + } + #category = (dt7948.i(this, "category"), void 0); + static { + dt7948.g(this.prototype, "creator", [field], function () { + return contains(StringField); + }); + } + #creator = (dt7948.i(this, "creator"), void 0); + static { + dt7948.g(this.prototype, "kit", [field], function () { + return contains(DrumKitField); + }); + } + #kit = (dt7948.i(this, "kit"), void 0); + static { + dt7948.g(this.prototype, "title", [field], function () { + return contains(StringField, { + computeVia: function () { + try { + return this.kitName ?? 'Untitled Kit'; + } catch (e) { + console.error('DrumKitCard: Error computing title', e); + return 'Untitled Kit'; + } + } + }); + }); + } + #title = (dt7948.i(this, "title"), void 0); + static embedded = class Embedded extends Component { + static { + setComponentTemplate(createTemplateFactory( + /* + +
+
+

{{if + @model.kitName + @model.kitName + 'Untitled Kit' + }}

+ {{#if @model.category}} + {{@model.category}} + {{/if}} +
+ + {{#if @model.description}} +

{{@model.description}}

+ {{/if}} + + {{#if @fields.kit}} +
+ <@fields.kit @format='embedded' /> +
+ {{/if}} + + {{#if @model.creator}} + + {{/if}} +
+ + + + */ + { + "id": "a7qLbXmZ", + "block": "[[[1,\"\\n \"],[10,0],[14,0,\"drum-kit-card\"],[14,\"data-scopedcss-58dc2e397b-1c2bbeaf3f\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"kit-header\"],[14,\"data-scopedcss-58dc2e397b-1c2bbeaf3f\",\"\"],[12],[1,\"\\n \"],[10,\"h3\"],[14,0,\"kit-title\"],[14,\"data-scopedcss-58dc2e397b-1c2bbeaf3f\",\"\"],[12],[1,[52,[30,1,[\"kitName\"]],[30,1,[\"kitName\"]],\"Untitled Kit\"]],[13],[1,\"\\n\"],[41,[30,1,[\"category\"]],[[[1,\" \"],[10,1],[14,0,\"category-tag\"],[14,\"data-scopedcss-58dc2e397b-1c2bbeaf3f\",\"\"],[12],[1,[30,1,[\"category\"]]],[13],[1,\"\\n\"]],[]],null],[1,\" \"],[13],[1,\"\\n\\n\"],[41,[30,1,[\"description\"]],[[[1,\" \"],[10,2],[14,0,\"kit-description\"],[14,\"data-scopedcss-58dc2e397b-1c2bbeaf3f\",\"\"],[12],[1,[30,1,[\"description\"]]],[13],[1,\"\\n\"]],[]],null],[1,\"\\n\"],[41,[30,2,[\"kit\"]],[[[1,\" \"],[10,0],[14,0,\"kit-preview\"],[14,\"data-scopedcss-58dc2e397b-1c2bbeaf3f\",\"\"],[12],[1,\"\\n \"],[8,[30,2,[\"kit\"]],[[24,\"data-scopedcss-58dc2e397b-1c2bbeaf3f\",\"\"]],[[\"@format\"],[\"embedded\"]],null],[1,\"\\n \"],[13],[1,\"\\n\"]],[]],null],[1,\"\\n\"],[41,[30,1,[\"creator\"]],[[[1,\" \"],[10,0],[14,0,\"kit-footer\"],[14,\"data-scopedcss-58dc2e397b-1c2bbeaf3f\",\"\"],[12],[1,\"\\n \"],[10,1],[14,0,\"creator\"],[14,\"data-scopedcss-58dc2e397b-1c2bbeaf3f\",\"\"],[12],[1,\"by \"],[1,[30,1,[\"creator\"]]],[13],[1,\"\\n \"],[13],[1,\"\\n\"]],[]],null],[1,\" \"],[13],[1,\"\\n\\n \"],[1,\"\\n \"]],[\"@model\",\"@fields\"],false,[\"if\"]]", + "moduleName": "/Users/richardtan/Desktop/boxel/packages/realm-server/beat-maker/beat-maker.gts", + "isStrictMode": true + }), this); + } + }; + static isolated = class Isolated extends Component { + static { + setComponentTemplate(createTemplateFactory( + /* + +
+
+

{{if + @model.kitName + @model.kitName + 'Untitled Kit' + }}

+
+ {{#if @model.category}} + {{@model.category}} + {{/if}} +
+
+ + {{#if @model.description}} +

{{@model.description}}

+ {{/if}} + + {{#if @fields.kit}} +
+ <@fields.kit @format='embedded' /> +
+ {{/if}} + + {{#if @model.creator}} + + {{/if}} +
+ + + + */ + { + "id": "Wc12NlLJ", + "block": "[[[1,\"\\n \"],[10,0],[14,0,\"beat-pattern-card\"],[14,\"data-scopedcss-58dc2e397b-178320040f\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"pattern-header\"],[14,\"data-scopedcss-58dc2e397b-178320040f\",\"\"],[12],[1,\"\\n \"],[10,\"h3\"],[14,0,\"pattern-title\"],[14,\"data-scopedcss-58dc2e397b-178320040f\",\"\"],[12],[1,[52,[30,1,[\"kitName\"]],[30,1,[\"kitName\"]],\"Untitled Kit\"]],[13],[1,\"\\n \"],[10,0],[14,0,\"pattern-meta\"],[14,\"data-scopedcss-58dc2e397b-178320040f\",\"\"],[12],[1,\"\\n\"],[41,[30,1,[\"category\"]],[[[1,\" \"],[10,1],[14,0,\"genre-tag\"],[14,\"data-scopedcss-58dc2e397b-178320040f\",\"\"],[12],[1,[30,1,[\"category\"]]],[13],[1,\"\\n\"]],[]],null],[1,\" \"],[13],[1,\"\\n \"],[13],[1,\"\\n\\n\"],[41,[30,1,[\"description\"]],[[[1,\" \"],[10,2],[14,0,\"pattern-description\"],[14,\"data-scopedcss-58dc2e397b-178320040f\",\"\"],[12],[1,[30,1,[\"description\"]]],[13],[1,\"\\n\"]],[]],null],[1,\"\\n\"],[41,[30,2,[\"kit\"]],[[[1,\" \"],[10,0],[14,0,\"pattern-preview\"],[14,\"data-scopedcss-58dc2e397b-178320040f\",\"\"],[12],[1,\"\\n \"],[8,[30,2,[\"kit\"]],[[24,\"data-scopedcss-58dc2e397b-178320040f\",\"\"]],[[\"@format\"],[\"embedded\"]],null],[1,\"\\n \"],[13],[1,\"\\n\"]],[]],null],[1,\"\\n\"],[41,[30,1,[\"creator\"]],[[[1,\" \"],[10,0],[14,0,\"pattern-footer\"],[14,\"data-scopedcss-58dc2e397b-178320040f\",\"\"],[12],[1,\"\\n \"],[10,1],[14,0,\"creator\"],[14,\"data-scopedcss-58dc2e397b-178320040f\",\"\"],[12],[1,\"by \"],[1,[30,1,[\"creator\"]]],[13],[1,\"\\n \"],[13],[1,\"\\n\"]],[]],null],[1,\" \"],[13],[1,\"\\n\\n \"],[1,\"\\n \"]],[\"@model\",\"@fields\"],false,[\"if\"]]", + "moduleName": "/Users/richardtan/Desktop/boxel/packages/realm-server/beat-maker/beat-maker.gts", + "isStrictMode": true + }), this); + } + }; +} +export class BeatPatternField extends FieldDef { + static displayName = 'Beat Pattern'; + static icon = MusicIcon; + static { + dt7948.g(this.prototype, "name", [field], function () { + return contains(StringField); + }); + } + #name = (dt7948.i(this, "name"), void 0); + static { + dt7948.g(this.prototype, "kick", [field], function () { + return contains(StringField); + }); + } + #kick = (dt7948.i(this, "kick"), void 0); + static { + dt7948.g(this.prototype, "snare", [field], function () { + return contains(StringField); + }); + } + #snare = (dt7948.i(this, "snare"), void 0); + static { + dt7948.g(this.prototype, "hihat", [field], function () { + return contains(StringField); + }); + } + #hihat = (dt7948.i(this, "hihat"), void 0); + static { + dt7948.g(this.prototype, "openhat", [field], function () { + return contains(StringField); + }); + } + #openhat = (dt7948.i(this, "openhat"), void 0); + static { + dt7948.g(this.prototype, "clap", [field], function () { + return contains(StringField); + }); + } + #clap = (dt7948.i(this, "clap"), void 0); + static { + dt7948.g(this.prototype, "crash", [field], function () { + return contains(StringField); + }); + } + #crash = (dt7948.i(this, "crash"), void 0); + get patternData() { + try { + return { + kick: JSON.parse(this.kick || '[false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false]'), + snare: JSON.parse(this.snare || '[false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false]'), + hihat: JSON.parse(this.hihat || '[false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false]'), + openhat: JSON.parse(this.openhat || '[false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false]'), + clap: JSON.parse(this.clap || '[false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false]'), + crash: JSON.parse(this.crash || '[false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false]') + }; + } catch (e) { + console.error('Error parsing pattern data:', e); + return { + kick: new Array(16).fill(false), + snare: new Array(16).fill(false), + hihat: new Array(16).fill(false), + openhat: new Array(16).fill(false), + clap: new Array(16).fill(false), + crash: new Array(16).fill(false) + }; + } + } + static embedded = class Embedded extends Component { + static { + setComponentTemplate(createTemplateFactory( + /* + +
+
{{if + @model.name + @model.name + 'Unnamed Pattern' + }}
+
+
+ {{#each + (array 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15) + as |stepIndex| + }} +
+ {{/each}} +
+
+
+ + + + */ + { + "id": "EPrjVLzx", + "block": "[[[1,\"\\n \"],[10,0],[14,0,\"beat-pattern-field\"],[14,\"data-scopedcss-58dc2e397b-22fe1894da\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"pattern-name\"],[14,\"data-scopedcss-58dc2e397b-22fe1894da\",\"\"],[12],[1,[52,[30,1,[\"name\"]],[30,1,[\"name\"]],\"Unnamed Pattern\"]],[13],[1,\"\\n \"],[10,0],[14,0,\"pattern-preview\"],[14,\"data-scopedcss-58dc2e397b-22fe1894da\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"pattern-bars\"],[14,\"data-scopedcss-58dc2e397b-22fe1894da\",\"\"],[12],[1,\"\\n\"],[42,[28,[31,2],[[28,[31,2],[[28,[32,0],[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],null]],null]],null],null,[[[1,\" \"],[10,0],[15,0,[29,[\"pattern-step\\n \",[52,[28,[32,1],[[30,1,[\"patternData\",\"kick\"]],[30,2]],null],\"has-kick\",\"\"]]]],[14,\"data-scopedcss-58dc2e397b-22fe1894da\",\"\"],[12],[13],[1,\"\\n\"]],[2]],null],[1,\" \"],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[13],[1,\"\\n\\n \"],[1,\"\\n \"]],[\"@model\",\"stepIndex\"],false,[\"if\",\"each\",\"-track-array\"]]", + "moduleName": "/Users/richardtan/Desktop/boxel/packages/realm-server/beat-maker/beat-maker.gts", + "scope": () => [array, get], + "isStrictMode": true + }), this); + } + }; +} +export class BeatPatternCard extends CardDef { + static displayName = 'Beat Pattern'; + static icon = MusicIcon; + static { + dt7948.g(this.prototype, "patternName", [field], function () { + return contains(StringField); + }); + } + #patternName = (dt7948.i(this, "patternName"), void 0); + static { + dt7948.g(this.prototype, "description", [field], function () { + return contains(StringField); + }); + } + #description = (dt7948.i(this, "description"), void 0); + static { + dt7948.g(this.prototype, "bpm", [field], function () { + return contains(NumberField); + }); + } + #bpm = (dt7948.i(this, "bpm"), void 0); + static { + dt7948.g(this.prototype, "genre", [field], function () { + return contains(StringField); + }); + } + #genre = (dt7948.i(this, "genre"), void 0); + static { + dt7948.g(this.prototype, "creator", [field], function () { + return contains(StringField); + }); + } + #creator = (dt7948.i(this, "creator"), void 0); + static { + dt7948.g(this.prototype, "pattern", [field], function () { + return contains(BeatPatternField); + }); + } + #pattern = (dt7948.i(this, "pattern"), void 0); + static { + dt7948.g(this.prototype, "title", [field], function () { + return contains(StringField, { + computeVia: function () { + try { + return this.patternName ?? 'Untitled Beat'; + } catch (e) { + console.error('BeatPatternCard: Error computing title', e); + return 'Untitled Beat'; + } + } + }); + }); + } + #title = (dt7948.i(this, "title"), void 0); + static embedded = class Embedded extends Component { + static { + setComponentTemplate(createTemplateFactory( + /* + +
+
+

{{if + @model.patternName + @model.patternName + 'Untitled Beat' + }}

+
+ {{#if @model.genre}} + {{@model.genre}} + {{/if}} + {{#if @model.bpm}} + {{@model.bpm}} BPM + {{/if}} +
+
+ + {{#if @model.description}} +

{{@model.description}}

+ {{/if}} + + {{#if @fields.pattern}} +
+ <@fields.pattern @format='embedded' /> +
+ {{/if}} + + {{#if @model.creator}} + + {{/if}} +
+ + + + */ + { + "id": "GnQDnTpK", + "block": "[[[1,\"\\n \"],[10,0],[14,0,\"beat-pattern-card\"],[14,\"data-scopedcss-58dc2e397b-178320040f\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"pattern-header\"],[14,\"data-scopedcss-58dc2e397b-178320040f\",\"\"],[12],[1,\"\\n \"],[10,\"h3\"],[14,0,\"pattern-title\"],[14,\"data-scopedcss-58dc2e397b-178320040f\",\"\"],[12],[1,[52,[30,1,[\"patternName\"]],[30,1,[\"patternName\"]],\"Untitled Beat\"]],[13],[1,\"\\n \"],[10,0],[14,0,\"pattern-meta\"],[14,\"data-scopedcss-58dc2e397b-178320040f\",\"\"],[12],[1,\"\\n\"],[41,[30,1,[\"genre\"]],[[[1,\" \"],[10,1],[14,0,\"genre-tag\"],[14,\"data-scopedcss-58dc2e397b-178320040f\",\"\"],[12],[1,[30,1,[\"genre\"]]],[13],[1,\"\\n\"]],[]],null],[41,[30,1,[\"bpm\"]],[[[1,\" \"],[10,1],[14,0,\"preset-bpm\"],[14,\"data-scopedcss-58dc2e397b-178320040f\",\"\"],[12],[1,[30,1,[\"bpm\"]]],[1,\" BPM\"],[13],[1,\"\\n\"]],[]],null],[1,\" \"],[13],[1,\"\\n \"],[13],[1,\"\\n\\n\"],[41,[30,1,[\"description\"]],[[[1,\" \"],[10,2],[14,0,\"pattern-description\"],[14,\"data-scopedcss-58dc2e397b-178320040f\",\"\"],[12],[1,[30,1,[\"description\"]]],[13],[1,\"\\n\"]],[]],null],[1,\"\\n\"],[41,[30,2,[\"pattern\"]],[[[1,\" \"],[10,0],[14,0,\"pattern-preview\"],[14,\"data-scopedcss-58dc2e397b-178320040f\",\"\"],[12],[1,\"\\n \"],[8,[30,2,[\"pattern\"]],[[24,\"data-scopedcss-58dc2e397b-178320040f\",\"\"]],[[\"@format\"],[\"embedded\"]],null],[1,\"\\n \"],[13],[1,\"\\n\"]],[]],null],[1,\"\\n\"],[41,[30,1,[\"creator\"]],[[[1,\" \"],[10,0],[14,0,\"pattern-footer\"],[14,\"data-scopedcss-58dc2e397b-178320040f\",\"\"],[12],[1,\"\\n \"],[10,1],[14,0,\"creator\"],[14,\"data-scopedcss-58dc2e397b-178320040f\",\"\"],[12],[1,\"by \"],[1,[30,1,[\"creator\"]]],[13],[1,\"\\n \"],[13],[1,\"\\n\"]],[]],null],[1,\" \"],[13],[1,\"\\n\\n \"],[1,\"\\n \"]],[\"@model\",\"@fields\"],false,[\"if\"]]", + "moduleName": "/Users/richardtan/Desktop/boxel/packages/realm-server/beat-maker/beat-maker.gts", + "isStrictMode": true + }), this); + } + }; +} +class BeatMakerIsolated extends Component { + static { + dt7948.g(this.prototype, "isPlaying", [tracked], function () { + return false; + }); + } + #isPlaying = (dt7948.i(this, "isPlaying"), void 0); // ²¹ Beat maker embedded format - ⁷⁴ Now uses model values directly + static { + dt7948.g(this.prototype, "currentStep", [tracked], function () { + return 0; + }); + } + #currentStep = (dt7948.i(this, "currentStep"), void 0); + static { + dt7948.g(this.prototype, "volumes", [tracked], function () { + return { + kick: 85, + snare: 75, + hihat: 60, + openhat: 50, + clap: 70, + crash: 40 + }; + }); + } + #volumes = (dt7948.i(this, "volumes"), void 0); + // ⁷⁵ Use model values directly instead of separate tracked properties + get bpm() { + return this.args.model?.bpm || 120; + } + get swing() { + return this.args.model?.swing || 0; + } + get masterVolume() { + return this.args.model?.masterVolume || 75; + } + // ⁹⁵ Get current kit name from loaded kit card or fallback to string + get selectedKit() { + return this.args.model?.currentKit?.kitName || this.args.model?.instrumentKit || '808 Analog'; + } + getInstrumentVolume = instrument => { + return this.volumes[instrument] || 0; + }; + // ¹⁰⁶ Get current kit sound parameters from loaded kit card - properly parse JSON strings + get currentKitParams() { + try { + const kit = this.args.model?.currentKit?.kit; + if (kit) { + return { + kick: JSON.parse(kit.kickParams || '{"type": "808", "frequency": 60, "decay": 0.3}'), + snare: JSON.parse(kit.snareParams || '{"type": "808", "frequency": 200, "decay": 0.1}'), + hihat: JSON.parse(kit.hihatParams || '{"type": "808", "frequency": 8000, "decay": 0.05}'), + openhat: JSON.parse(kit.openhatParams || '{"type": "808", "frequency": 6000, "decay": 0.3}'), + clap: JSON.parse(kit.clapParams || '{"type": "808", "frequency": 2000, "decay": 0.1}'), + crash: JSON.parse(kit.crashParams || '{"type": "808", "frequency": 3000, "decay": 1.0}') + }; + } + // Fallback to default 808 parameters + return { + kick: { + type: '808', + frequency: 60, + decay: 0.3 + }, + snare: { + type: '808', + frequency: 200, + decay: 0.1 + }, + hihat: { + type: '808', + frequency: 8000, + decay: 0.05 + }, + openhat: { + type: '808', + frequency: 6000, + decay: 0.3 + }, + clap: { + type: '808', + frequency: 2000, + decay: 0.1 + }, + crash: { + type: '808', + frequency: 3000, + decay: 1.0 + } + }; + } catch (e) { + console.error('Error accessing kit parameters:', e); + return { + kick: { + type: '808', + frequency: 60, + decay: 0.3 + }, + snare: { + type: '808', + frequency: 200, + decay: 0.1 + }, + hihat: { + type: '808', + frequency: 8000, + decay: 0.05 + }, + openhat: { + type: '808', + frequency: 6000, + decay: 0.3 + }, + clap: { + type: '808', + frequency: 2000, + decay: 0.1 + }, + crash: { + type: '808', + frequency: 3000, + decay: 1.0 + } + }; + } + } + // ⁹⁷ Get available drum kits from the model + get availableKits() { + try { + if (this.args.model?.availableKits && this.args.model.availableKits.length > 0) { + return this.args.model.availableKits; + } + // Return empty array if no kits available + return []; + } catch (e) { + console.error('Error accessing available kits:', e); + return []; + } + } + // ⁹⁸ Get available patterns from the model + get availablePatterns() { + try { + if (this.args.model?.availablePatterns && this.args.model.availablePatterns.length > 0) { + return this.args.model.availablePatterns; + } + return []; + } catch (e) { + console.error('Error accessing available patterns:', e); + return []; + } + } + // ⁸⁵ Get patterns from current pattern card or use default + get patterns() { + try { + if (this.args.model?.currentPattern?.pattern?.patternData) { + return this.args.model.currentPattern.pattern.patternData; + } + // Default patterns if no pattern card is loaded + return { + kick: [true, false, false, false, true, false, false, false, true, false, false, false, true, false, false], + snare: [false, false, false, false, true, false, false, false, false, false, false, false, true, false, false], + hihat: [true, true, true, true, true, true, true, true, true, true, true, true, true, true, true], + openhat: [false, false, false, true, false, false, false, true, false, false, false, true, false, false, false], + clap: [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false], + crash: [true, false, false, false, false, false, false, false, false, false, false, false, false, false, false] + }; + } catch (e) { + console.error('Error getting patterns:', e); + return { + kick: new Array(16).fill(false), + snare: new Array(16).fill(false), + hihat: new Array(16).fill(false), + openhat: new Array(16).fill(false), + clap: new Array(16).fill(false), + crash: new Array(16).fill(false) + }; + } + } + // Visual current step that's one behind the internal current step for proper highlighting + get visualCurrentStep() { + return this.currentStep === 0 ? 15 : this.currentStep - 1; + } + // Computed getter that creates a flattened step-state structure for easier template access + get stepStates() { + try { + const patterns = this.patterns; + const states = {}; + Object.keys(patterns).forEach(instrument => { + const instrumentPattern = patterns[instrument]; + if (instrumentPattern) { + for (let step = 0; step < 16; step++) { + states[`${instrument}-${step}`] = instrumentPattern[step] || false; + } + } + }); + return states; + } catch (e) { + console.error('Error creating step states:', e); + return {}; + } + } + // ⁸⁶ Update patterns in the current pattern card + updatePatterns(newPatterns) { + try { + if (this.args.model?.currentPattern?.pattern) { + // Update the pattern field data + this.args.model.currentPattern.pattern.kick = JSON.stringify(newPatterns.kick); + this.args.model.currentPattern.pattern.snare = JSON.stringify(newPatterns.snare); + this.args.model.currentPattern.pattern.hihat = JSON.stringify(newPatterns.hihat); + this.args.model.currentPattern.pattern.openhat = JSON.stringify(newPatterns.openhat); + this.args.model.currentPattern.pattern.clap = JSON.stringify(newPatterns.clap); + this.args.model.currentPattern.pattern.crash = JSON.stringify(newPatterns.crash); + } + } catch (e) { + console.error('Error updating patterns:', e); + } + } + // ⁴⁸ Audio context and sound generation + audioContext = null; + sequenceTimer = null; + nextStepTime = 0; + lookahead = 25.0; + scheduleAheadTime = 0.1; + constructor(owner, args) { + super(owner, args); + // Initialize audio context on first user interaction + this.initializeAudio(); + } + initializeAudio() { + try { + this.audioContext = new (window.AudioContext || window.webkitAudioContext)(); + } catch (e) { + console.warn('Web Audio API not supported'); + } + } + // Ensure audio stops when this instance is torn down (e.g., switching cards) + willDestroy() { + this.stop(); + if (this.audioContext) { + // Close without awaiting to avoid blocking teardown + this.audioContext.close().catch(() => undefined); + } + this.audioContext = null; + } + // ⁴⁹ Dynamic sound synthesis using kit parameters + playKick(time, volume) { + if (!this.audioContext) return; + const kickParams = this.currentKitParams.kick; + this.playDynamicKick(time, volume, kickParams); + } + // ⁹⁹ Universal kick synthesis using dynamic parameters + playDynamicKick(time, volume, params) { + const osc = this.audioContext.createOscillator(); + const gain = this.audioContext.createGain(); + osc.type = 'sine'; + osc.frequency.setValueAtTime(params.frequency || 60, time); + osc.frequency.exponentialRampToValueAtTime((params.frequency || 60) * 0.5, time + 0.05); + osc.frequency.exponentialRampToValueAtTime(0.01, time + (params.decay || 0.3)); + gain.gain.setValueAtTime(0, time); + gain.gain.linearRampToValueAtTime(volume * (params.amplitude || 1.0), time + 0.01); + gain.gain.exponentialRampToValueAtTime(0.01, time + (params.decay || 0.3)); + osc.connect(gain); + gain.connect(this.audioContext.destination); + osc.start(time); + osc.stop(time + (params.decay || 0.3)); + } + playSnare(time, volume) { + if (!this.audioContext) return; + const snareParams = this.currentKitParams.snare; + this.playDynamicSnare(time, volume, snareParams); + } + playHihat(time, volume) { + if (!this.audioContext) return; + const hihatParams = this.currentKitParams.hihat; + this.playDynamicHihat(time, volume, hihatParams); + } + playOpenhat(time, volume) { + if (!this.audioContext) return; + const openhatParams = this.currentKitParams.openhat; + this.playDynamicHihat(time, volume, openhatParams); // ¹⁰⁷ Use dynamic parameters for open hat too + } + playClap(time, volume) { + if (!this.audioContext) return; + const clapParams = this.currentKitParams.clap; + this.playDynamicSnare(time, volume, clapParams); // ¹⁰⁸ Use dynamic parameters for clap + } + playCrash(time, volume) { + if (!this.audioContext) return; + const crashParams = this.currentKitParams.crash; + this.playDynamicHihat(time, volume, crashParams); // ¹⁰⁹ Use dynamic parameters for crash + } + // ¹⁰⁰ Universal snare synthesis using dynamic parameters + playDynamicSnare(time, volume, params) { + const noise = this.audioContext.createBufferSource(); + const gain = this.audioContext.createGain(); + const filter = this.audioContext.createBiquadFilter(); + // Create noise buffer + const bufferSize = this.audioContext.sampleRate * (params.decay || 0.1); + const buffer = this.audioContext.createBuffer(1, bufferSize, this.audioContext.sampleRate); + const output = buffer.getChannelData(0); + for (let i = 0; i < bufferSize; i++) { + output[i] = (Math.random() * 2 - 1) * Math.pow(1 - i / bufferSize, params.shape || 2); + } + noise.buffer = buffer; + filter.type = 'highpass'; + filter.frequency.value = params.frequency || 200; + filter.Q.value = params.resonance || 5; + gain.gain.setValueAtTime(volume * (params.amplitude || 0.8), time); + gain.gain.exponentialRampToValueAtTime(0.01, time + (params.decay || 0.1)); + noise.connect(filter); + filter.connect(gain); + gain.connect(this.audioContext.destination); + noise.start(time); + noise.stop(time + (params.decay || 0.1)); + } + // ¹⁰¹ Universal hihat synthesis using dynamic parameters + playDynamicHihat(time, volume, params) { + const noise = this.audioContext.createBufferSource(); + const gain = this.audioContext.createGain(); + const filter = this.audioContext.createBiquadFilter(); + const bufferSize = this.audioContext.sampleRate * (params.decay || 0.05); + const buffer = this.audioContext.createBuffer(1, bufferSize, this.audioContext.sampleRate); + const output = buffer.getChannelData(0); + for (let i = 0; i < bufferSize; i++) { + output[i] = (Math.random() * 2 - 1) * Math.pow(1 - i / bufferSize, params.shape || 4); + } + noise.buffer = buffer; + filter.type = 'highpass'; + filter.frequency.value = params.frequency || 8000; + filter.Q.value = params.resonance || 2; + gain.gain.setValueAtTime(volume * (params.amplitude || 0.6), time); + gain.gain.exponentialRampToValueAtTime(0.01, time + (params.decay || 0.05)); + noise.connect(filter); + filter.connect(gain); + gain.connect(this.audioContext.destination); + noise.start(time); + noise.stop(time + (params.decay || 0.05)); + } + // ¹¹⁰ All instruments now use universal dynamic sound generation + // ⁵⁰ Sequencer timing and playback + scheduler() { + while (this.nextStepTime < this.audioContext.currentTime + this.scheduleAheadTime) { + this.scheduleStep(this.currentStep, this.nextStepTime); + this.nextStep(); + } + } + scheduleStep(stepNumber, time) { + const masterVol = this.masterVolume / 100 * 0.3; // Scale down for comfortable listening + Object.keys(this.patterns).forEach(instrument => { + if (this.patterns[instrument][stepNumber]) { + const volume = this.volumes[instrument] / 100 * masterVol; + switch (instrument) { + case 'kick': + this.playKick(time, volume); + break; + case 'snare': + this.playSnare(time, volume); + break; + case 'hihat': + this.playHihat(time, volume); + break; + case 'openhat': + this.playOpenhat(time, volume); + break; + case 'clap': + this.playClap(time, volume); + break; + case 'crash': + this.playCrash(time, volume); + break; + } + } + }); + } + nextStep() { + const baseStepLength = 60.0 / this.bpm / 4; // 16th note length ⁸⁰ Uses model bpm value + // Apply swing timing - affects every other beat (8th note pairs) + const swingAmount = this.swing / 100; // Convert to 0-1 range + let stepLength = baseStepLength; + // Apply swing to off-beats (steps 1, 3, 5, 7, 9, 11, 13, 15) + if (this.currentStep % 2 === 1) { + // Delay off-beats based on swing amount (max 67% swing = triplet feel) + stepLength = baseStepLength * (1 + swingAmount * 0.67); + } else if (this.currentStep % 2 === 0 && this.currentStep > 0) { + // Compensate on-beats to maintain overall timing + stepLength = baseStepLength * (1 - swingAmount * 0.33); + } + this.nextStepTime += stepLength; + this.currentStep = (this.currentStep + 1) % 16; + } + start() { + if (!this.audioContext) { + this.initializeAudio(); + } + if (this.audioContext?.state === 'suspended') { + this.audioContext.resume(); + } + this.isPlaying = true; + this.currentStep = 0; + this.nextStepTime = this.audioContext.currentTime; + this.sequenceTimer = window.setInterval(() => this.scheduler(), this.lookahead); + } + stop() { + this.isPlaying = false; + this.currentStep = 0; + if (this.sequenceTimer) { + clearInterval(this.sequenceTimer); + this.sequenceTimer = null; + } + } + // ¹⁰² No more hardcoded arrays - all dynamic from card data + togglePlay() { + if (this.isPlaying) { + this.stop(); + } else { + this.start(); + } + } + static { + dt7948.n(this.prototype, "togglePlay", [action]); + } + toggleStep(instrument, step) { + const currentPatterns = this.patterns; + const newPatterns = { + ...currentPatterns + }; + newPatterns[instrument] = [...newPatterns[instrument]]; + newPatterns[instrument][step] = !newPatterns[instrument][step]; + this.updatePatterns(newPatterns); + } + static { + dt7948.n(this.prototype, "toggleStep", [action]); + } + clearPattern(instrument) { + const currentPatterns = this.patterns; + const newPatterns = { + ...currentPatterns + }; + newPatterns[instrument] = new Array(16).fill(false); + this.updatePatterns(newPatterns); + } + static { + dt7948.n(this.prototype, "clearPattern", [action]); + } + fillPattern(instrument) { + const currentPatterns = this.patterns; + const newPatterns = { + ...currentPatterns + }; + newPatterns[instrument] = new Array(16).fill(true); + this.updatePatterns(newPatterns); + } + static { + dt7948.n(this.prototype, "fillPattern", [action]); + } + loadPreset(patternCard) { + // ¹⁰³ Load pattern from a pattern card instead of hardcoded presets + if (this.args.model && patternCard) { + this.args.model.currentPattern = patternCard; + // Also sync BPM if the pattern has one + if (patternCard.bpm && this.args.model.bpm !== patternCard.bpm) { + this.args.model.bpm = patternCard.bpm; + } + } + } + static { + dt7948.n(this.prototype, "loadPreset", [action]); + } + randomizePattern(instrument) { + const currentPatterns = this.patterns; + const newPatterns = { + ...currentPatterns + }; + newPatterns[instrument] = new Array(16).fill(false).map(() => Math.random() > 0.7); + this.updatePatterns(newPatterns); + } + // ⁸⁷ Action to save current patterns as a new pattern card + static { + dt7948.n(this.prototype, "randomizePattern", [action]); + } + saveCurrentPattern() { + // This would create a new BeatPatternCard instance with current patterns + // Implementation would depend on card creation workflow + console.log('Save current pattern functionality would be implemented here'); + } + // ⁸⁸ Action to load a different pattern card + static { + dt7948.n(this.prototype, "saveCurrentPattern", [action]); + } + loadPatternCard(patternCard) { + if (this.args.model) { + this.args.model.currentPattern = patternCard; + // Also sync BPM if the pattern has one + if (patternCard.bpm && this.args.model.bpm !== patternCard.bpm) { + this.args.model.bpm = patternCard.bpm; + } + } + } + static { + dt7948.n(this.prototype, "loadPatternCard", [action]); + } + updateBpm(event) { + const target = event.target; + const value = parseInt(target.value); + // ⁷⁶ Update the model's BPM value + if (this.args.model) { + this.args.model.bpm = value; + } + } + static { + dt7948.n(this.prototype, "updateBpm", [action]); + } + updateSwing(event) { + const target = event.target; + const value = parseInt(target.value); + // ⁷⁷ Update the model's swing value + if (this.args.model) { + this.args.model.swing = value; + } + } + static { + dt7948.n(this.prototype, "updateSwing", [action]); + } + updateMasterVolume(event) { + const target = event.target; + const value = parseInt(target.value); + // ⁷⁸ Update the model's master volume value + if (this.args.model) { + this.args.model.masterVolume = value; + } + } + static { + dt7948.n(this.prototype, "updateMasterVolume", [action]); + } + updateVolume(instrument, event) { + const target = event.target; + this.volumes = { + ...this.volumes, + [instrument]: parseInt(target.value) + }; + } + static { + dt7948.n(this.prototype, "updateVolume", [action]); + } + handleKitSelection(event) { + // ¹⁰⁵ Handle kit selection from dropdown + const target = event.target; + const selectedKitId = target.value; + // Find the kit card by ID + const selectedKit = this.availableKits.find(kit => kit.id === selectedKitId); + if (this.args.model && selectedKit) { + this.args.model.currentKit = selectedKit; + this.args.model.instrumentKit = selectedKit.kitName; // Keep for backward compatibility + console.log('Kit switched to:', selectedKit.kitName); + } + } + static { + dt7948.n(this.prototype, "handleKitSelection", [action]); + } + selectKit(kitCard) { + // ¹⁰⁴ Load kit from a kit card instead of hardcoded string - kept for pattern loading + if (this.args.model && kitCard) { + this.args.model.currentKit = kitCard; + this.args.model.instrumentKit = kitCard.kitName; // Keep for backward compatibility + } + } + static { + dt7948.n(this.prototype, "selectKit", [action]); + } + static { + setComponentTemplate(createTemplateFactory( + /* + +
+
+
+

Beat Maker Studio

+
+ {{#if (gt this.availableKits.length 0)}} + + + {{else}} + {{this.selectedKit}} + {{/if}} +
+
+ +
+
+ + + {{this.bpm}} +
+ +
+ + + {{this.swing}}% +
+ +
+ + + {{this.masterVolume}} +
+ + +
+
+ + {{#if (gt this.availablePatterns.length 0)}} +
+
+ +
{{this.availablePatterns.length}} + patterns
+
+
+ {{#each this.availablePatterns as |patternCard|}} + + {{/each}} +
+
+ {{/if}} + +
+
+
+ {{#each (array 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16) as |stepNum|}} +
{{stepNum}}
+ {{/each}} +
+ + {{#each + (array 'kick' 'snare' 'hihat' 'openhat' 'clap' 'crash') + as |instrument| + }} +
+
+
{{instrument}}
+
+ + + {{this.getInstrumentVolume + instrument + }} +
+
+ + + +
+
+ +
+ {{#each (array 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15) as |step|}} + + {{/each}} +
+
+ {{/each}} +
+ + +
+ + + + */ + { + "id": "hk7iaLDu", + "block": "[[[1,\"\\n \"],[10,0],[14,0,\"beat-maker-card\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"beat-maker-header\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"header-left\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,\"\\n \"],[10,\"h3\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,\"Beat Maker Studio\"],[13],[1,\"\\n \"],[10,0],[14,0,\"kit-selector\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,\"\\n\"],[41,[28,[32,0],[[30,0,[\"availableKits\",\"length\"]],0],null],[[[1,\" \"],[10,\"label\"],[14,\"for\",\"kit-selector\"],[14,0,\"sr-only\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,\"Select drum kit\"],[13],[1,\"\\n \"],[11,\"select\"],[24,1,\"kit-selector\"],[24,0,\"kit-dropdown\"],[24,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[4,[32,1],[\"change\",[30,0,[\"handleKitSelection\"]]],null],[12],[1,\"\\n\"],[42,[28,[31,2],[[28,[31,2],[[30,0,[\"availableKits\"]]],null]],null],null,[[[1,\" \"],[10,\"option\"],[15,2,[30,1,[\"id\"]]],[15,\"selected\",[28,[32,2],[[30,1,[\"kitName\"]],[30,0,[\"selectedKit\"]]],null]],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,[30,1,[\"kitName\"]]],[13],[1,\"\\n\"]],[1]],null],[1,\" \"],[13],[1,\"\\n\"]],[]],[[[1,\" \"],[10,1],[14,0,\"kit-fallback\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,[30,0,[\"selectedKit\"]]],[13],[1,\"\\n\"]],[]]],[1,\" \"],[13],[1,\"\\n \"],[13],[1,\"\\n\\n \"],[10,0],[14,0,\"header-controls\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"control-group\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,\"\\n \"],[10,\"label\"],[14,0,\"control-label\"],[14,\"for\",\"bpm-slider\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,\"BPM\"],[13],[1,\"\\n \"],[11,\"input\"],[24,1,\"bpm-slider\"],[24,\"min\",\"60\"],[24,\"max\",\"200\"],[16,2,[30,0,[\"bpm\"]]],[24,0,\"slider bpm-slider\"],[24,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[24,4,\"range\"],[4,[32,1],[\"input\",[30,0,[\"updateBpm\"]]],null],[12],[13],[1,\"\\n \"],[10,1],[14,0,\"control-value\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,[30,0,[\"bpm\"]]],[13],[1,\"\\n \"],[13],[1,\"\\n\\n \"],[10,0],[14,0,\"control-group\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,\"\\n \"],[10,\"label\"],[14,0,\"control-label\"],[14,\"for\",\"swing-slider\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,\"Swing\"],[13],[1,\"\\n \"],[11,\"input\"],[24,1,\"swing-slider\"],[24,\"min\",\"0\"],[24,\"max\",\"100\"],[16,2,[30,0,[\"swing\"]]],[24,0,\"slider swing-slider\"],[24,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[24,4,\"range\"],[4,[32,1],[\"input\",[30,0,[\"updateSwing\"]]],null],[12],[13],[1,\"\\n \"],[10,1],[14,0,\"control-value\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,[30,0,[\"swing\"]]],[1,\"%\"],[13],[1,\"\\n \"],[13],[1,\"\\n\\n \"],[10,0],[14,0,\"control-group\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,\"\\n \"],[10,\"label\"],[14,0,\"control-label\"],[14,\"for\",\"master-volume\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,\"Master\"],[13],[1,\"\\n \"],[11,\"input\"],[24,1,\"master-volume\"],[24,\"min\",\"0\"],[24,\"max\",\"100\"],[16,2,[30,0,[\"masterVolume\"]]],[24,0,\"slider volume-slider\"],[24,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[24,4,\"range\"],[4,[32,1],[\"input\",[30,0,[\"updateMasterVolume\"]]],null],[12],[13],[1,\"\\n \"],[10,1],[14,0,\"control-value\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,[30,0,[\"masterVolume\"]]],[13],[1,\"\\n \"],[13],[1,\"\\n\\n \"],[8,[32,3],[[16,0,[29,[\"play-button \",[52,[30,0,[\"isPlaying\"]],\"playing\",\"\"]]]],[24,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[4,[32,1],[\"click\",[30,0,[\"togglePlay\"]]],null]],null,[[\"default\"],[[[[1,\"\\n\"],[41,[30,0,[\"isPlaying\"]],[[[1,\" \"],[10,\"svg\"],[14,\"viewBox\",\"0 0 24 24\"],[14,\"fill\",\"currentColor\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,\"\\n \"],[10,\"rect\"],[14,\"x\",\"6\"],[14,\"y\",\"4\"],[14,\"width\",\"4\"],[14,\"height\",\"16\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[13],[1,\"\\n \"],[10,\"rect\"],[14,\"x\",\"14\"],[14,\"y\",\"4\"],[14,\"width\",\"4\"],[14,\"height\",\"16\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[13],[1,\"\\n \"],[13],[1,\"\\n\"]],[]],[[[1,\" \"],[10,\"svg\"],[14,\"viewBox\",\"0 0 24 24\"],[14,\"fill\",\"currentColor\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,\"\\n \"],[10,\"path\"],[14,\"d\",\"M8 5v14l11-7z\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[13],[1,\"\\n \"],[13],[1,\"\\n\"]],[]]],[1,\" \"]],[]]]]],[1,\"\\n \"],[13],[1,\"\\n \"],[13],[1,\"\\n\\n\"],[41,[28,[32,0],[[30,0,[\"availablePatterns\",\"length\"]],0],null],[[[1,\" \"],[10,0],[14,0,\"presets-section\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"presets-header\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,\"\\n \"],[10,\"label\"],[14,0,\"presets-label\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,\"Pattern Library\"],[13],[1,\"\\n \"],[10,0],[14,0,\"patterns-count\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,[30,0,[\"availablePatterns\",\"length\"]]],[1,\"\\n patterns\"],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[10,0],[14,0,\"preset-buttons\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,\"\\n\"],[42,[28,[31,2],[[28,[31,2],[[30,0,[\"availablePatterns\"]]],null]],null],null,[[[1,\" \"],[8,[32,3],[[16,0,[29,[\"preset-button\\n \",[52,[28,[32,2],[[30,2,[\"id\"]],[30,3,[\"currentPattern\",\"id\"]]],null],\"active-pattern\",\"\"]]]],[24,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[4,[32,1],[\"click\",[28,[32,4],[[30,0,[\"loadPreset\"]],[30,2]],null]],null]],null,[[\"default\"],[[[[1,\"\\n \"],[10,0],[14,0,\"preset-content\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,\"\\n \"],[10,1],[14,0,\"preset-name\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,[30,2,[\"patternName\"]]],[13],[1,\"\\n \"],[10,0],[14,0,\"preset-meta\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,\"\\n\"],[41,[30,2,[\"genre\"]],[[[1,\" \"],[10,1],[14,0,\"preset-genre\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,[30,2,[\"genre\"]]],[13],[1,\"\\n\"]],[]],null],[41,[30,2,[\"bpm\"]],[[[1,\" \"],[10,1],[14,0,\"preset-bpm\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,[30,2,[\"bpm\"]]],[1,\" BPM\"],[13],[1,\"\\n\"]],[]],null],[1,\" \"],[13],[1,\"\\n \"],[13],[1,\"\\n \"]],[]]]]],[1,\"\\n\"]],[2]],null],[1,\" \"],[13],[1,\"\\n \"],[13],[1,\"\\n\"]],[]],null],[1,\"\\n \"],[10,0],[14,0,\"beat-grid\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"step-numbers\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"instrument-controls\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[13],[1,\"\\n\"],[42,[28,[31,2],[[28,[31,2],[[28,[32,5],[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],null]],null]],null],null,[[[1,\" \"],[10,0],[15,0,[29,[\"step-number\\n \",[52,[28,[32,6],[[28,[32,2],[[30,4],1],null],[28,[32,2],[[30,4],5],null],[28,[32,2],[[30,4],9],null],[28,[32,2],[[30,4],13],null]],null],\"beat-marker\",\"\"]]]],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,[30,4]],[13],[1,\"\\n\"]],[4]],null],[1,\" \"],[13],[1,\"\\n\\n\"],[42,[28,[31,2],[[28,[31,2],[[28,[32,5],[\"kick\",\"snare\",\"hihat\",\"openhat\",\"clap\",\"crash\"],null]],null]],null],null,[[[1,\" \"],[10,0],[14,0,\"instrument-row\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"instrument-controls\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"instrument-label\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,[30,5]],[13],[1,\"\\n \"],[10,0],[14,0,\"instrument-volume\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,\"\\n \"],[10,\"label\"],[14,0,\"sr-only\"],[14,\"for\",\"volume-slider\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,\"Volume\"],[13],[1,\"\\n \"],[11,\"input\"],[24,1,\"volume-slider\"],[24,\"min\",\"0\"],[24,\"max\",\"100\"],[16,2,[29,[[28,[30,0,[\"getInstrumentVolume\"]],[[30,5]],null]]]],[24,0,\"volume-slider-small\"],[24,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[24,4,\"range\"],[4,[32,1],[\"input\",[28,[32,4],[[30,0,[\"updateVolume\"]],[30,5]],null]],null],[12],[13],[1,\"\\n \"],[10,1],[14,0,\"volume-value\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,[28,[30,0,[\"getInstrumentVolume\"]],[[30,5]],null]],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[10,0],[14,0,\"instrument-actions\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,\"\\n \"],[11,\"button\"],[24,0,\"action-button clear-button\"],[24,\"title\",\"Clear pattern\"],[24,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[4,[32,1],[\"click\",[28,[32,4],[[30,0,[\"clearPattern\"]],[30,5]],null]],null],[12],[1,\"\\n \"],[10,\"svg\"],[14,\"viewBox\",\"0 0 24 24\"],[14,\"fill\",\"none\"],[14,\"stroke\",\"currentColor\"],[14,\"stroke-width\",\"2\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,\"\\n \"],[10,\"line\"],[14,\"x1\",\"18\"],[14,\"y1\",\"6\"],[14,\"x2\",\"6\"],[14,\"y2\",\"18\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[13],[1,\"\\n \"],[10,\"line\"],[14,\"x1\",\"6\"],[14,\"y1\",\"6\"],[14,\"x2\",\"18\"],[14,\"y2\",\"18\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[11,\"button\"],[24,0,\"action-button fill-button\"],[24,\"title\",\"Fill pattern\"],[24,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[4,[32,1],[\"click\",[28,[32,4],[[30,0,[\"fillPattern\"]],[30,5]],null]],null],[12],[1,\"\\n \"],[10,\"svg\"],[14,\"viewBox\",\"0 0 24 24\"],[14,\"fill\",\"none\"],[14,\"stroke\",\"currentColor\"],[14,\"stroke-width\",\"2\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,\"\\n \"],[10,\"rect\"],[14,\"x\",\"3\"],[14,\"y\",\"3\"],[14,\"width\",\"18\"],[14,\"height\",\"18\"],[14,\"rx\",\"2\"],[14,\"ry\",\"2\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[11,\"button\"],[24,0,\"action-button random-button\"],[24,\"title\",\"Randomize pattern\"],[24,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[4,[32,1],[\"click\",[28,[32,4],[[30,0,[\"randomizePattern\"]],[30,5]],null]],null],[12],[1,\"\\n \"],[10,\"svg\"],[14,\"viewBox\",\"0 0 24 24\"],[14,\"fill\",\"none\"],[14,\"stroke\",\"currentColor\"],[14,\"stroke-width\",\"2\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,\"\\n \"],[10,\"polyline\"],[14,\"points\",\"16 3 21 3 21 8\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[13],[1,\"\\n \"],[10,\"line\"],[14,\"x1\",\"4\"],[14,\"y1\",\"20\"],[14,\"x2\",\"21\"],[14,\"y2\",\"3\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[13],[1,\"\\n \"],[10,\"polyline\"],[14,\"points\",\"21 16 21 21 16 21\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[13],[1,\"\\n \"],[10,\"line\"],[14,\"x1\",\"15\"],[14,\"y1\",\"15\"],[14,\"x2\",\"21\"],[14,\"y2\",\"21\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[13],[1,\"\\n \"],[10,\"line\"],[14,\"x1\",\"4\"],[14,\"y1\",\"4\"],[14,\"x2\",\"9\"],[14,\"y2\",\"9\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[13],[1,\"\\n\\n \"],[10,0],[14,0,\"step-buttons\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,\"\\n\"],[42,[28,[31,2],[[28,[31,2],[[28,[32,5],[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],null]],null]],null],null,[[[1,\" \"],[11,\"button\"],[16,0,[29,[\"step-button\\n \",[52,[28,[32,7],[[30,0,[\"stepStates\"]],[28,[32,8],[[30,5],\"-\",[30,6]],null]],null],\"active\",\"\"],\"\\n \",[52,[28,[32,2],[[30,0,[\"visualCurrentStep\"]],[30,6]],null],\"current\",\"\"],\"\\n \",[52,[28,[32,6],[[28,[32,2],[[30,6],0],null],[28,[32,2],[[30,6],4],null],[28,[32,2],[[30,6],8],null],[28,[32,2],[[30,6],12],null]],null],\"beat-marker\",\"\"]]]],[24,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[4,[32,1],[\"click\",[28,[32,4],[[30,0,[\"toggleStep\"]],[30,5],[30,6]],null]],null],[12],[13],[1,\"\\n\"]],[6]],null],[1,\" \"],[13],[1,\"\\n \"],[13],[1,\"\\n\"]],[5]],null],[1,\" \"],[13],[1,\"\\n\\n \"],[10,0],[14,0,\"beat-maker-footer\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"footer-info\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,\"\\n \"],[10,1],[14,0,\"kit-info\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,[30,0,[\"selectedKit\"]]],[13],[1,\"\\n \"],[10,1],[14,0,\"pattern-info\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,\"16-Step Sequencer\"],[13],[1,\"\\n\"],[41,[30,0,[\"isPlaying\"]],[[[1,\" \"],[10,1],[14,0,\"status-playing\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"pulse-dot\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[13],[1,\"\\n Playing\\n \"],[13],[1,\"\\n\"]],[]],[[[1,\" \"],[10,1],[14,0,\"status-stopped\"],[14,\"data-scopedcss-58dc2e397b-25ed51e091\",\"\"],[12],[1,\"Ready\"],[13],[1,\"\\n\"]],[]]],[1,\" \"],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[13],[1,\"\\n\\n \"],[1,\"\\n \"]],[\"kitCard\",\"patternCard\",\"@model\",\"stepNum\",\"instrument\",\"step\"],false,[\"if\",\"each\",\"-track-array\"]]", + "moduleName": "/Users/richardtan/Desktop/boxel/packages/realm-server/beat-maker/beat-maker.gts", + "scope": () => [gt, on, eq, Button, fn, array, or, get, concat], + "isStrictMode": true + }), this); + } +} +export class BeatMakerCard extends CardDef { + static displayName = 'Beat Maker'; + static icon = MusicIcon; + static { + dt7948.g(this.prototype, "bpm", [field], function () { + return contains(NumberField); + }); + } + #bpm = (dt7948.i(this, "bpm"), void 0); + static { + dt7948.g(this.prototype, "pattern", [field], function () { + return contains(StringField); + }); + } + #pattern = (dt7948.i(this, "pattern"), void 0); + static { + dt7948.g(this.prototype, "instrumentKit", [field], function () { + return contains(StringField); + }); + } + #instrumentKit = (dt7948.i(this, "instrumentKit"), void 0); + static { + dt7948.g(this.prototype, "swing", [field], function () { + return contains(NumberField); + }); + } + #swing = (dt7948.i(this, "swing"), void 0); + static { + dt7948.g(this.prototype, "masterVolume", [field], function () { + return contains(NumberField); + }); + } + #masterVolume = (dt7948.i(this, "masterVolume"), void 0); + static { + dt7948.g(this.prototype, "currentPattern", [field], function () { + return linksTo(() => BeatPatternCard); + }); + } + #currentPattern = (dt7948.i(this, "currentPattern"), void 0); + static { + dt7948.g(this.prototype, "currentKit", [field], function () { + return linksTo(() => DrumKitCard); + }); + } + #currentKit = (dt7948.i(this, "currentKit"), void 0); + static { + dt7948.g(this.prototype, "availableKits", [field], function () { + return linksToMany(() => DrumKitCard); + }); + } + #availableKits = (dt7948.i(this, "availableKits"), void 0); + static { + dt7948.g(this.prototype, "availablePatterns", [field], function () { + return linksToMany(() => BeatPatternCard); + }); + } + #availablePatterns = (dt7948.i(this, "availablePatterns"), void 0); + static { + dt7948.g(this.prototype, "title", [field], function () { + return contains(StringField, { + computeVia: function () { + return 'Beat Maker'; + } + }); + }); + } + #title = (dt7948.i(this, "title"), void 0); + static isolated = BeatMakerIsolated; + static fitted = class Fitted extends Component { + static { + setComponentTemplate(createTemplateFactory( + /* + +
+
+
+
+
+
+
+
+
+
+
+
+
Beat Maker
+
{{if @model.bpm @model.bpm 120}} + BPM
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
Beat Maker Studio
+
{{if @model.bpm @model.bpm 120}} + BPM • + {{if + @model.currentKit.kitName + @model.currentKit.kitName + (if @model.instrumentKit @model.instrumentKit '808 Analog') + }}
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

Beat Maker

+
+
+ BPM: + {{if @model.bpm @model.bpm 120}} +
+
+ Kit: + {{if + @model.currentKit.kitName + @model.currentKit.kitName + (if @model.instrumentKit @model.instrumentKit '808') + }} +
+
+ Patterns: + {{@model.availablePatterns.length}} +
+
+
+
16-Step
+
Synth
+
Swing
+
+
+
+ +
+
+
+

Beat Maker Studio

+

Professional drum machine with dynamic + synthesis and pattern sequencing

+
+
+
+
+
+ BPM + {{if + @model.bpm + @model.bpm + 120 + }} +
+
+ KIT + {{if + @model.currentKit.kitName + @model.currentKit.kitName + (if @model.instrumentKit @model.instrumentKit '808') + }} +
+
+
+
+
+
+
+
+
+
+
+
+
Patterns
+
{{if + @model.availablePatterns.length + @model.availablePatterns.length + 8 + }} + Available
+
+
+
Drum Kits
+
{{if + @model.availableKits.length + @model.availableKits.length + 6 + }} + Loaded
+
+
+
Sequencer
+
16-Step Grid
+
+
+
+
Features:
+
+
Dynamic Synthesis
+
Pattern Library
+
Real-time Control
+
Kit Management
+
+
+
+
+ + + + */ + { + "id": "22PT2fp7", + "block": "[[[1,\"\\n \"],[10,0],[14,0,\"fitted-container\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"badge-format\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"badge-content\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"badge-icon\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"beat-grid-mini\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"beat-dot active\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[13],[1,\"\\n \"],[10,0],[14,0,\"beat-dot\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[13],[1,\"\\n \"],[10,0],[14,0,\"beat-dot active\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[13],[1,\"\\n \"],[10,0],[14,0,\"beat-dot\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[10,0],[14,0,\"badge-info\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"badge-title\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"Beat Maker\"],[13],[1,\"\\n \"],[10,0],[14,0,\"badge-stats\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,[52,[30,1,[\"bpm\"]],[30,1,[\"bpm\"]],120]],[1,\"\\n BPM\"],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[13],[1,\"\\n\\n \"],[10,0],[14,0,\"strip-format\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"strip-content\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"strip-visual\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"beat-visualizer\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"beat-bar active\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[13],[1,\"\\n \"],[10,0],[14,0,\"beat-bar\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[13],[1,\"\\n \"],[10,0],[14,0,\"beat-bar active\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[13],[1,\"\\n \"],[10,0],[14,0,\"beat-bar\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[13],[1,\"\\n \"],[10,0],[14,0,\"beat-bar active\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[10,0],[14,0,\"strip-info\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"strip-title\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"Beat Maker Studio\"],[13],[1,\"\\n \"],[10,0],[14,0,\"strip-description\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,[52,[30,1,[\"bpm\"]],[30,1,[\"bpm\"]],120]],[1,\"\\n BPM •\\n \"],[1,[52,[30,1,[\"currentKit\",\"kitName\"]],[30,1,[\"currentKit\",\"kitName\"]],[52,[30,1,[\"instrumentKit\"]],[30,1,[\"instrumentKit\"]],\"808 Analog\"]]],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[13],[1,\"\\n\\n \"],[10,0],[14,0,\"tile-format\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"tile-header\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"tile-visual\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"sequencer-grid\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"seq-row\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"seq-step active\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[13],[1,\"\\n \"],[10,0],[14,0,\"seq-step\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[13],[1,\"\\n \"],[10,0],[14,0,\"seq-step\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[13],[1,\"\\n \"],[10,0],[14,0,\"seq-step active\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[10,0],[14,0,\"seq-row\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"seq-step\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[13],[1,\"\\n \"],[10,0],[14,0,\"seq-step active\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[13],[1,\"\\n \"],[10,0],[14,0,\"seq-step\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[13],[1,\"\\n \"],[10,0],[14,0,\"seq-step\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[10,0],[14,0,\"seq-row\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"seq-step active\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[13],[1,\"\\n \"],[10,0],[14,0,\"seq-step active\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[13],[1,\"\\n \"],[10,0],[14,0,\"seq-step active\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[13],[1,\"\\n \"],[10,0],[14,0,\"seq-step active\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[10,0],[14,0,\"tile-content\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"\\n \"],[10,\"h3\"],[14,0,\"tile-title\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"Beat Maker\"],[13],[1,\"\\n \"],[10,0],[14,0,\"tile-specs\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"spec-row\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"\\n \"],[10,1],[14,0,\"spec-label\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"BPM:\"],[13],[1,\"\\n \"],[10,1],[14,0,\"spec-value\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,[52,[30,1,[\"bpm\"]],[30,1,[\"bpm\"]],120]],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[10,0],[14,0,\"spec-row\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"\\n \"],[10,1],[14,0,\"spec-label\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"Kit:\"],[13],[1,\"\\n \"],[10,1],[14,0,\"spec-value\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,[52,[30,1,[\"currentKit\",\"kitName\"]],[30,1,[\"currentKit\",\"kitName\"]],[52,[30,1,[\"instrumentKit\"]],[30,1,[\"instrumentKit\"]],\"808\"]]],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[10,0],[14,0,\"spec-row\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"\\n \"],[10,1],[14,0,\"spec-label\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"Patterns:\"],[13],[1,\"\\n \"],[10,1],[14,0,\"spec-value\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,[30,1,[\"availablePatterns\",\"length\"]]],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[10,0],[14,0,\"tile-features\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"feature-tag\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"16-Step\"],[13],[1,\"\\n \"],[10,0],[14,0,\"feature-tag\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"Synth\"],[13],[1,\"\\n \"],[10,0],[14,0,\"feature-tag\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"Swing\"],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[13],[1,\"\\n\\n \"],[10,0],[14,0,\"card-format\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"card-header\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"card-info\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"\\n \"],[10,\"h3\"],[14,0,\"card-title\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"Beat Maker Studio\"],[13],[1,\"\\n \"],[10,2],[14,0,\"card-description\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"Professional drum machine with dynamic\\n synthesis and pattern sequencing\"],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[10,0],[14,0,\"card-visual\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"drum-machine\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"machine-display\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"display-line\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"\\n \"],[10,1],[14,0,\"param-label\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"BPM\"],[13],[1,\"\\n \"],[10,1],[14,0,\"param-value\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,[52,[30,1,[\"bpm\"]],[30,1,[\"bpm\"]],120]],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[10,0],[14,0,\"display-line\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"\\n \"],[10,1],[14,0,\"param-label\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"KIT\"],[13],[1,\"\\n \"],[10,1],[14,0,\"param-value\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,[52,[30,1,[\"currentKit\",\"kitName\"]],[30,1,[\"currentKit\",\"kitName\"]],[52,[30,1,[\"instrumentKit\"]],[30,1,[\"instrumentKit\"]],\"808\"]]],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[10,0],[14,0,\"machine-controls\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"control-knob\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[13],[1,\"\\n \"],[10,0],[14,0,\"control-knob\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[13],[1,\"\\n \"],[10,0],[14,0,\"control-knob\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[10,0],[14,0,\"card-grid\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"grid-section\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"section-title\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"Patterns\"],[13],[1,\"\\n \"],[10,0],[14,0,\"pattern-count\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,[52,[30,1,[\"availablePatterns\",\"length\"]],[30,1,[\"availablePatterns\",\"length\"]],8]],[1,\"\\n Available\"],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[10,0],[14,0,\"grid-section\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"section-title\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"Drum Kits\"],[13],[1,\"\\n \"],[10,0],[14,0,\"pattern-count\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,[52,[30,1,[\"availableKits\",\"length\"]],[30,1,[\"availableKits\",\"length\"]],6]],[1,\"\\n Loaded\"],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[10,0],[14,0,\"grid-section\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"section-title\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"Sequencer\"],[13],[1,\"\\n \"],[10,0],[14,0,\"pattern-count\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"16-Step Grid\"],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[10,0],[14,0,\"card-features\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"features-label\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"Features:\"],[13],[1,\"\\n \"],[10,0],[14,0,\"feature-list\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"\\n \"],[10,0],[14,0,\"feature-pill\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"Dynamic Synthesis\"],[13],[1,\"\\n \"],[10,0],[14,0,\"feature-pill\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"Pattern Library\"],[13],[1,\"\\n \"],[10,0],[14,0,\"feature-pill\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"Real-time Control\"],[13],[1,\"\\n \"],[10,0],[14,0,\"feature-pill\"],[14,\"data-scopedcss-58dc2e397b-1dbb784611\",\"\"],[12],[1,\"Kit Management\"],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[13],[1,\"\\n \"],[13],[1,\"\\n\\n \"],[1,\"\\n \"]],[\"@model\"],false,[\"if\"]]", + "moduleName": "/Users/richardtan/Desktop/boxel/packages/realm-server/beat-maker/beat-maker.gts", + "isStrictMode": true + }), this); + } + }; +} \ No newline at end of file